107 lines
3.6 KiB
Python
107 lines
3.6 KiB
Python
import optparse
|
|
import sys
|
|
import os.path
|
|
import logging
|
|
|
|
import settingsDefinition
|
|
|
|
class MultiWorldParser(object):
|
|
"""A class that is used to parse a settings.py file. It should replace
|
|
ConfigOptionParser class above."""
|
|
|
|
def __init__(self, settings):
|
|
"""Settings is a path to a settings.py file"""
|
|
if not os.path.exists(settings) and not os.path.isfile(settings):
|
|
raise ValueError("bad settings file")
|
|
|
|
self.settings_file = settings
|
|
|
|
def parse(self):
|
|
# settingsDefinition.py defines what types of things you can put in a configfile
|
|
# anything in settingsDefinitino that is a dict with a "type" key is a definiton
|
|
defDicts = [x for x in dir(settingsDefinition) if type(getattr(settingsDefinition,x)) == dict and getattr(settingsDefinition,x).has_key("type") and x != "__builtins__"]
|
|
|
|
glob = dict()
|
|
for name in defDicts:
|
|
d = getattr(settingsDefinition, name)
|
|
glob[name] = d['type']()
|
|
|
|
import rendermodes
|
|
loc=dict()
|
|
for thing in dir(rendermodes):
|
|
thething = getattr(rendermodes, thing)
|
|
if isinstance(thething, type) and issubclass(thething, rendermodes.RenderPrimitive):
|
|
loc[thing] = thething
|
|
|
|
try:
|
|
execfile(self.settings_file, glob, loc)
|
|
# delete the builtins, we don't need it
|
|
del glob['__builtins__']
|
|
|
|
except NameError, ex:
|
|
import traceback
|
|
traceback.print_exc()
|
|
logging.error("Error parsing %s. Please check the trackback above" % self.settings_file)
|
|
sys.exit(1)
|
|
except SyntaxError, ex:
|
|
import traceback
|
|
traceback.print_exc()
|
|
tb = sys.exc_info()[2]
|
|
#print tb.tb_frame.f_code.co_filename
|
|
logging.error("Error parsing %s. Please check the trackback above" % self.settings_file)
|
|
sys.exit(1)
|
|
|
|
|
|
for name in defDicts:
|
|
setattr(self, name, glob[name])
|
|
del glob[name]
|
|
|
|
|
|
# seed with the Overviewer defaults, then update with the user defaults
|
|
self.defaults = dict()
|
|
for name in defDicts:
|
|
d = getattr(settingsDefinition, name)
|
|
if d['type'] == dict and d['valuetype'] == dict:
|
|
for key in d['values']:
|
|
option = d['values'][key]
|
|
if option.has_key("default"):
|
|
self.defaults[key] = option["default"]
|
|
|
|
|
|
self.defaults.update(glob)
|
|
|
|
|
|
def validate(self):
|
|
|
|
|
|
origs = dict()
|
|
|
|
for worldname in self.render:
|
|
world = dict()
|
|
world.update(self.defaults)
|
|
world.update(self.render[worldname])
|
|
|
|
for key in world:
|
|
if key not in settingsDefinition.render['values']:
|
|
logging.warning("%r is not a known setting", key)
|
|
continue
|
|
|
|
definition = settingsDefinition.render['values'][key]
|
|
try:
|
|
val = definition['validator'](world[key], world = self.world)
|
|
if definition.get('save_orig', False):
|
|
origs[key + "_orig"] = world[key]
|
|
world[key] = val
|
|
except Exception as e:
|
|
logging.error("Error validating '%s' option in render definition for '%s':", key, worldname)
|
|
logging.error(e)
|
|
raise e
|
|
world['name'] = worldname
|
|
world.update(origs)
|
|
self.render[worldname] = world
|
|
|
|
|
|
|
|
def get_render_things(self):
|
|
return self.render
|