Config file handling

This commit is contained in:
Sebastian Lohff 2013-12-02 01:06:46 +01:00
parent 645745ed7c
commit d7ca903f01
4 changed files with 86 additions and 16 deletions

1
.gitignore vendored
View File

@ -4,3 +4,4 @@
*.pyo *.pyo
*~ *~
*.o *.o
seopardy.conf

36
config.py Normal file
View File

@ -0,0 +1,36 @@
from __future__ import print_function
import sys
def _config_error(msg):
print("Configuration error: %s" % (msg,), file=sys.stderr)
sys.exit(1)
def _check_missing_keys(conf, sec, mandatory, users_choice=[]):
#d = conf[sec] if sec is not None else conf
#if sec is None:
# sec = "main"
d = conf
allowed = mandatory + users_choice
for key in d.iterkeys():
if key not in allowed:
_config_error("Key %s is not an allowed config key in section %s (allowed are %s)" % (key, sec, ", ".join(allowed)))
for key in mandatory:
if key not in d.iterkeys():
_config_error("Key %s is not present in section %s but mandatory" % (key, sec,))
def check_config(conf):
main_keys = ["music", "savedir", "playerInput"]
music_keys = ["startSong", "questionSong"]
_check_missing_keys(conf, "main", main_keys)
_check_missing_keys(conf["music"], "music", music_keys)
if conf["playerInput"]:
for i, inp in enumerate(conf["playerInput"], 1):
_check_missing_keys(inp, "playerInput %d" % i, ["Type"], ["Args"])

27
seopardy.conf.dist Normal file
View File

@ -0,0 +1,27 @@
# _
# ___ ___ ___ _ __ __ _ _ __ __| |_ _
# / __|/ _ \/ _ \| '_ \ / _` | '__/ _` | | | |
# \__ \ __/ (_) | |_) | (_| | | | (_| | |_| |
# |___/\___|\___/| .__/ \__,_|_| \__,_|\__, |
# |_| |___/
# Configuration
#
# Basicly you can configure here:
# - player inputs
# - pathes to theme songs
# - path to savedir (gamestate backups while game is running)
# Note that this is a yamlfile (no tabs -.-)
# path to music, set to null if you don't have the song
music:
startSong: path/to/theme_song.mp3
questionSong: path/to/question_song.mp3
# change to path, default is /tmp/seopardy/
savedir: /tmp/seopardy/
# player inputs. look in buttonreader.py for available types
playerInput:
# - Type: Fifo
# Args:
# - /tmp/seopardy_fifo

View File

@ -2,21 +2,20 @@
from __future__ import print_function from __future__ import print_function
import argparse import argparse
import os import yaml
import sys import sys
#from PySide import QtCore, QtGui
from PySide import QtGui from PySide import QtGui
from music import MusicBox from music import MusicBox
from question import Questions from question import Questions
from gamestate import GameState from gamestate import GameState
from game import SeopardyGame from game import SeopardyGame
from config import check_config
def _parser(): def _parser():
parser = argparse.ArgumentParser(description="Sebas jeopardy/beopardy clone") parser = argparse.ArgumentParser(description="Sebas jeopardy/beopardy clone")
parser.add_argument("--fifo", action="store", default="/tmp/seopardy-fifo", help="Name of the fifo to create")
parser.add_argument("--gamestate", action="store", default=None, help="Gamestate to load to recover a crashed game") parser.add_argument("--gamestate", action="store", default=None, help="Gamestate to load to recover a crashed game")
parser.add_argument("--savedir", action="store", default="/tmp/seopardy/", help="Directory where to save the temporary gamestates to, in case of game-crash") parser.add_argument("--conf", action="store", default="seopardy.conf", help="Path to config file")
parser.add_argument("questions", action="store", help="Path to questionfile") parser.add_argument("questions", action="store", help="Path to questionfile")
return parser return parser
@ -25,19 +24,23 @@ if __name__ == '__main__':
parser = _parser() parser = _parser()
args = parser.parse_args() args = parser.parse_args()
fifo = None
try:
if os.path.exists(args.fifo):
os.unlink(args.fifo)
os.mkfifo(args.fifo)
except OSError as e:
print("Error: Could not create fifo: %s" % (str(e),), file=sys.stderr)
sys.exit(1)
questions = Questions(args.questions) questions = Questions(args.questions)
# start gui # start gui
app = QtGui.QApplication([]) app = QtGui.QApplication([sys.argv[0]])
# check and load config file
config = None
try:
config = yaml.load(open(args.conf))
except IOError as e:
print("Error: Could not load config: %s" % (str(e),), file=sys.stderr)
sys.exit(1)
except yaml.scanner.ScannerError as e:
print("Error: Could not parse config file: %s" % (str(e),), file=sys.stderr)
sys.exit(1)
check_config(config)
# create or load gamestate # create or load gamestate
gamestate = None gamestate = None
@ -48,12 +51,15 @@ if __name__ == '__main__':
except IOError as e: except IOError as e:
print("Error: Could not load gamestate: %s" % (str(e),), file=sys.stderr) print("Error: Could not load gamestate: %s" % (str(e),), file=sys.stderr)
sys.exit(1) sys.exit(1)
gamestate = GameState.load(sstream, args.savedir) gamestate = GameState.load(sstream, config["savedir"])
else: else:
gamestate = GameState(args.savedir) gamestate = GameState(config["savedir"])
# init music box # init music box
MusicBox.init() MusicBox.init()
for name, path in config["music"].iteritems():
if path:
MusicBox.add_music(name, path)
# create board # create board
board = SeopardyGame(questions, gamestate) board = SeopardyGame(questions, gamestate)