def test_parse_positional_signature(self): optionals = partial(map, lambda positional: positional.optional) self.assert_true(all(not optional for optional in optionals( parse_positional_signature((Bytes(), Bytes(), Bytes())) ))) self.assert_true(all(optionals( parse_positional_signature([[Bytes(), [Bytes(), [Bytes()]]]]) ))) positionals = parse_positional_signature((Bytes(), [Bytes(), Bytes()])) self.assert_true(not positionals[0].optional) self.assert_true(positionals[1].optional) self.assert_true(not positionals[2].optional)
def _parse_signature(self, signature): if len(signature) < 2: raise TypeError( "expected at least 2 positional arguments" ", got {0}".format(len(signature)) ) short = long = None if isinstance(signature[0], str) and isinstance(signature[1], str): short = signature[0] long = signature[1] positionals = signature[2:] elif isinstance(signature[0], str): if len(signature[0]) == 2: short = signature[0] else: long = signature[0] positionals = signature[1:] else: raise TypeError( "expected short or long as first argument," "got {0!r}".format( signature[0] ) ) positionals = parse_positional_signature(positionals) if positionals[0].optional: raise ValueError( "first positional must not be optional: {0!r}".format( positionals[0] ) ) return short, long, positionals
def __init__(self, options=None, commands=None, positionals=None): self.options = OrderedDict() self.add_option("__awwparse_help", HelpOption()) self.add_options(self.__class__.options) if options is not None: self.add_options(options) self.commands = OrderedDict() self.add_commands(self.__class__.commands) if commands is not None: self.add_commands(commands) self.positionals = parse_positional_signature( force_list(self.__class__.positionals), require_metavar=True ) if positionals is not None: self.add_positionals(positionals) self.parent = None signature = Signature.from_method(self.main) if signature.annotations: self._populate_from_signature(self, signature) for name in dir(self): try: attribute = getattr(self, name) except AttributeError: # maybe raised by properties; can be safely ignored continue if isinstance(attribute, Command): if not isinstance(attribute.main, MethodType): attribute.main = partial(attribute.main, self) self.add_command(name, attribute)