Thinking about how some UI for configuration would look like, namely command line syntax, I have some rough sketch. I wrote this "as if" the configuration interface I sketched earlier would actually exist. Note that the next UI to come would force a refactoring to "general config ui utility functions" and ui-specific functionality. I hope this will concretize the discussion First, some general words on how the ui will look like to the user: the commands will be
get <pickle file> <path> set <pickle file> <path> <string representation> array_add <pickle file> <path> <string representation> dict_add <pickle file> <path> <name> <string representation>
Wherever a parameter called "root" is mentioned, it will probably be the pickle file. Note also that this is far for complete. And last but not least, I didn't do the boring part of parsing the options and dispatching to the functions -- fill this in from imagination. Oh, and I obviously didn't test this wishful thinking code. #command line configuration def stringifyParameter(param): if isinstance(param, ArrayParameter): return "array of "+stringifyParameter(param.param)+'s' elif isinstance(param, DictParameter): return "folder of "+stringifyParameter(param.param)+'s' elif isinstance(param, StringParameter): return "string" elif isinstance(param, IntParameter): return "int" elif isinstance(param, InterfaceParameter): return param.interface.__name__ def convertString(type, s): if isinstance(type, ArrayParameter) or isinstance(type, DictParameter): raise ValueError("cannot set %s" % type.__class__.__name__) if isinstance(type, InterfaceParameter): obj = load(open(s)) if type.interface not in obj.__implements__: raise ValueError(obj.__class__.__name__+" does not implement "+ type.__class__.__name__) return obj if isinstance(type, StringParameter): return s if isinstance(type, IntParameter): return int(s) raise ValueError("unrecognized type" % type.__class__.__name__) def traverseObject(root, path): path = string.split(path, '.') name = path[-1] obj = root for part in path[:-1]: if isinstance(obj, ArrayParameter): obj = obj.getValue()[int(part)] elif isinstance(obj, DictParameter): obj = obj.getValue()[part] elif isinstance(obj, InterfaceParameter): obj = obj.getValue().getParameters()[part] param = obj.getParameters()[name] return param def setOption(root, path, value): param = traverseObject(root, path) value = convertString(param, value) obj.setAnswer(name, value) if hasattr(obj, 'endAnswer'): obj.endAnswer() def getOption(root, path): param = traverseObject(root, path) print stringifyParameter(param), param.getValue() def appendToArray(root, path, value): param = traverseObject(root, path) assert isinstance(param, ArrayParameter) value = convertString(param.param, value) param.getValue().append(value) def addToDict(root, path, name, value): param = traverseObject(root, path) assert isinstance(param, DictParameter) value = convertString(param.param, value) param.getValue()[name] = value -- "I'll be ex-DPL soon anyway so I'm |LUKE: Is Perl better than Python? looking for someplace else to grab power."|YODA: No...no... no. Quicker, -- Wichert Akkerman (on debian-private)| easier, more seductive. For public key, finger moshez@debian.org |http://www.{python,debian,gnu}.org