added incomplete question2json.py helper tool
- Since CVS is not much liked here is a YAML to JSON converter - have a look at 2011-28c2/questions.yaml - so far it generates JSON - only tested with Python 2.7 (should work in 2.6 but you will need to install json) - Warning: Currently, media files are ignored. It's not implemented yet. - more to come...
This commit is contained in:
parent
636bbb5db0
commit
6f9b4678e4
|
@ -0,0 +1,41 @@
|
|||
#--- !Question
|
||||
#question: What is the question?
|
||||
#answers:
|
||||
# - Answer 1
|
||||
# - Answer 2
|
||||
# - Answer 3
|
||||
# - Answer 4
|
||||
#tier: 1
|
||||
#game_round: 1
|
||||
#media:
|
||||
# - aaa
|
||||
# - bbb
|
||||
# - ccc
|
||||
|
||||
!!python/object:__main__.Question
|
||||
question: What is the question?
|
||||
answers:
|
||||
- true: Answer 1
|
||||
- false: Answer 2
|
||||
- false: Answer 3
|
||||
- false: Answer 4
|
||||
tier: 1
|
||||
game_round: 1
|
||||
media:
|
||||
- aaa
|
||||
- bbb
|
||||
- ccc
|
||||
|
||||
--- !Question
|
||||
question: What are users in Facebook called?
|
||||
answers:
|
||||
- false: Hostage
|
||||
- false: Victims
|
||||
- true: Target
|
||||
- false: Product
|
||||
tier: 2
|
||||
game_round: 1
|
||||
media:
|
||||
- aaa
|
||||
- bbb
|
||||
- ccc
|
|
@ -0,0 +1,187 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Convert questions for the famous Penta News Game Show from
|
||||
some yaml format to json.
|
||||
|
||||
It's just a helper to write the questions in a more human
|
||||
readeable format assuming yaml is more human readable
|
||||
|
||||
|
||||
TODO:
|
||||
* Add own constructor to Question() / nice to have
|
||||
* Deal with media files
|
||||
"""
|
||||
|
||||
__author__ = "Frank Becker <fb@alien8.de>"
|
||||
__version__ = "0.0.1"
|
||||
__date__ = "Fri 18 Nov 2011 18:10:44 CET"
|
||||
__copyright__ = "Copyright (c) 2011 Frank Becker"
|
||||
__license__ = "Python"
|
||||
|
||||
import sys
|
||||
import json
|
||||
from optparse import OptionParser
|
||||
|
||||
try:
|
||||
import yaml
|
||||
except ImportError:
|
||||
print 'You need to install PyYAML first. E. g. "pip install pyyaml"'
|
||||
|
||||
|
||||
class Question(yaml.YAMLObject):
|
||||
"""Represents a question
|
||||
"""
|
||||
yaml_tag = u"!Question"
|
||||
|
||||
# {round_no1: [tier1, tier2, ...], round_no2: [tier1, ...]}
|
||||
registered_questions = {}
|
||||
points = {
|
||||
1: 100,
|
||||
2: 150,
|
||||
3: 225,
|
||||
4: 337,
|
||||
5: 506,
|
||||
6: 759,
|
||||
7: 1139,
|
||||
8: 1709,
|
||||
9: 2563,
|
||||
10: 3844,
|
||||
11: 5555,
|
||||
12: 7531,
|
||||
}
|
||||
|
||||
def __init__(self, question=u"", tier=0, answers=[], game_round=0,
|
||||
media=("", "", "")):
|
||||
"""docstring for __init__
|
||||
@question - the Question
|
||||
@rank - number of the question in the game
|
||||
@game_round - number of the round in the game
|
||||
@answers - list of answers, assumed are 4
|
||||
@media - (media show at question time, media shown at answer time,
|
||||
media shown at resolution time)
|
||||
"""
|
||||
self.question = question
|
||||
self.answers = answers
|
||||
self.tier = tier
|
||||
self.game_round = game_round
|
||||
self.media = media
|
||||
|
||||
def __repr__(self):
|
||||
"""docstring for __repr__"""
|
||||
return "%s(%r)" % (self.__class__.__name__, self.question)
|
||||
|
||||
@property
|
||||
def as_dict(self):
|
||||
"""dump data suiteable for json conversion"""
|
||||
|
||||
data = {}
|
||||
data['text'] = self.question
|
||||
data['tier'] = self.points.get(int(self.tier), 0)
|
||||
data['answers'] = [
|
||||
{'text': answer[False]} if answer.has_key(False) \
|
||||
else {'text': answer[True], 'right': True} \
|
||||
for answer in self.answers
|
||||
]
|
||||
return data
|
||||
|
||||
@classmethod
|
||||
def get_points(cls):
|
||||
"""docstring for get_points"""
|
||||
for key in sorted(cls.points.keys()):
|
||||
yield cls.points[key]
|
||||
|
||||
@staticmethod
|
||||
def register_question(obj):
|
||||
"""register object in class so no question with the
|
||||
same tier/round combo can exist"""
|
||||
if Question.registered_questions.has_key(obj.game_round) and \
|
||||
obj.tier in Question.registered_questions[obj.game_round]:
|
||||
raise IndexError("Slot for Question {0} is alredy taken".format(
|
||||
obj.question,))
|
||||
elif Question.registered_questions.has_key(obj.game_round):
|
||||
Question.registered_questions[obj.game_round].append(obj.tier)
|
||||
else:
|
||||
Question.registered_questions[obj.game_round] = [obj.tier]
|
||||
|
||||
# if os.path.isfile("pix/{0}_expl.jpg".format(arg[7])):
|
||||
# data['explanation'] = {
|
||||
# 'image': "pix/{0}_expl.jpg".format(arg[7])}
|
||||
# if os.path.isfile("pix/{0}_expl.gif".format(arg[7])):
|
||||
# data['explanation'] = {
|
||||
# 'image': "pix/{0}_expl.gif".format(arg[7])}
|
||||
# if os.path.isfile("pix/{0}.jpg".format(arg[7])):
|
||||
# data['image'] = "pix/{0}.jpg".format(arg[7])
|
||||
# if os.path.isfile("video/{0}.webm".format(arg[7])):
|
||||
# data['video'] = "video/{0}.webm".format(arg[7])
|
||||
# if os.path.isfile("video/{0}_expl.webm".format(arg[7])):
|
||||
# data['explanation'] = {
|
||||
# 'video': "video/{0}_expl.webm".format(arg[7])}
|
||||
#
|
||||
|
||||
def init_parser():
|
||||
"""Read command line options
|
||||
|
||||
returns:
|
||||
options:dict -- config options
|
||||
"""
|
||||
parser = OptionParser()
|
||||
|
||||
parser.add_option(
|
||||
"-d",
|
||||
"--debug",
|
||||
dest="debug",
|
||||
help="Toggle debugging",
|
||||
action="store_true",
|
||||
default=False,
|
||||
)
|
||||
|
||||
parser.add_option(
|
||||
"-f",
|
||||
"--questions-file",
|
||||
dest="file",
|
||||
help=("Use this file instead of the default "
|
||||
"questions.yaml"),
|
||||
metavar="FILE",
|
||||
)
|
||||
|
||||
parser.add_option(
|
||||
"-v",
|
||||
"--version",
|
||||
dest="version",
|
||||
help="Show program version",
|
||||
action="store_true",
|
||||
default=False,
|
||||
)
|
||||
|
||||
options = parser.parse_args()[0]
|
||||
return options
|
||||
|
||||
def main():
|
||||
"""docstring for main"""
|
||||
|
||||
options = init_parser()
|
||||
if options.version:
|
||||
print "Version: {0}".format(__version__,)
|
||||
sys.exit()
|
||||
|
||||
if options.file:
|
||||
questions_fh = open(options.file)
|
||||
else:
|
||||
questions_fh = open('questions.yaml')
|
||||
|
||||
questions = []
|
||||
for q in yaml.load_all(questions_fh.read()):
|
||||
#FIXME (fb@alien8.de) 11-11-18 23:16:34 use yaml constructor
|
||||
# yaml.add_constructor
|
||||
Question.register_question(q)
|
||||
questions.append(q)
|
||||
print json.dumps([q.as_dict for q in questions], indent=2)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 fileencoding=utf-8 :
|
||||
|
Loading…
Reference in New Issue