Source code for jasy.core.Options

#
# Jasy - Web Tooling Framework
# Copyright 2012 Zynga Inc.
# Copyright 2013-2014 Sebastian Werner
#

import sys
import jasy.core.Console as Console


[docs]class Options(object): """More flexible alternative to the standard python option parser module which solves the requirements to have arbirary tasks and custom parameters for each task.""" __slots__ = ["__tasks", "__options", "__defaults", "__types", "__shortcuts", "__help"] def __init__(self): self.__tasks = [] self.__options = {} self.__help = {} self.__defaults = {} self.__types = {} self.__shortcuts = {}
[docs] def parse(self, args): current = { "task" : None, "params": {} } inTaskMode = False index = 0 length = len(args) while index < length: name = args[index] if name.startswith("--"): name = name[2:] if "=" in name: pos = name.find("=") value = name[pos + 1:] name = name[0:pos] if not inTaskMode and self.__types[name] is bool: raise Exception("Invalid argument: %s. Boolean flag!" % name) elif (not name in self.__types or not self.__types[name] is bool) and (index + 1) < length and not args[index + 1].startswith("-"): index += 1 value = args[index] elif inTaskMode: raise Exception("Invalid argument: %s. In task mode every arguments needs to have a value!" % name) else: value = True current["params"][name] = value elif name.startswith("-"): if inTaskMode: raise Exception("Invalid argument: %s. Flags are not supported for tasks!" % name) name = name[1:] for partname in name: current["params"][partname] = True else: if current: self.__tasks.append(current) current = {} current["task"] = name current["params"] = {} inTaskMode = True index += 1 if current: self.__tasks.append(current) if self.__tasks and self.__tasks[0]["task"] is None: self.__options = self.__tasks.pop(0)["params"] for name in list(self.__options): if name in self.__shortcuts: self.__options[self.__shortcuts[name]] = self.__options[name] del self.__options[name] elif len(name) == 1: raise Exception("Invalid argument: %s" % name)
[docs] def printOptions(self, indent=16): for name in sorted(self.__defaults): col = len(name) msg = " --%s" % name for shortcut in self.__shortcuts: if self.__shortcuts[shortcut] == name: col += len(" [-%s]" % shortcut) msg += Console.colorize(" [-%s]" % shortcut, "grey") if name in self.__help: msg += ": " diff = indent - col if diff > 0: msg += " " * diff msg += Console.colorize(self.__help[name], "magenta") print(msg)
[docs] def add(self, name, accept=bool, value=None, short=None, help=""): self.__defaults[name] = value if accept is not None: self.__types[name] = accept if short is not None: self.__shortcuts[short] = name if help: self.__help[name] = help
def __str__(self): return str(self.__tasks) def __getattr__(self, name): if name in self.__options: return self.__options[name] elif name in self.__defaults: return self.__defaults[name] else: raise Exception("Unknown option: %s!" % name)
[docs] def getTasks(self): return self.__tasks