Example #1
0
    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"])
Example #2
0
    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)
Example #3
0
 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