def test_from_method(self): class TestClass(object): def test_method(self, a, b): """Test""" signature = Signature.from_method(TestClass.test_method) self.assert_equal(signature.positional_arguments, ["a", "b"]) self.assert_equal(signature.documentation, "Test") signature = Signature.from_method(TestClass.test_method, documentation="Foo") self.assert_equal(signature.documentation, "Foo") signature = Signature.from_method(TestClass().test_method) self.assert_equal(signature.positional_arguments, ["a", "b"])
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)
def decorate(method): signature = Signature.from_method(method) if not signature.annotations: method.__annotations__ = dict(zip(signature.names, positionals)) command = type( method.__name__, (cls, ), { "__module__": method.__module__, "__doc__": method.__doc__, "main": staticmethod(method) } )() return command