Skip to content

Decorators

def_task(require=(), provide=(), remove=(), **kwargs)

Decorator to convert a function to a Task instance.

Parameters:

Name Type Description Default
require List[str]

required

()
provide List[str] ()
remove List[str] ()
**kwargs {}
Source code in tasker/decorator.py
def def_task(require: List[Text] = (), provide: List[Text] = (), remove: List[Text] = (), **kwargs):
    """
    Decorator to convert a function to a `Task` instance.

    Args:
        require: required
        provide:
        remove:
        **kwargs:

    Returns:

    """
    def name_mapping(name):
        return ''.join(map(lambda it: it.capitalize(), name.split('_'))) + 'Task'

    def wrapper(func):
        parameter_names = tuple(signature(func).parameters)
        assert 'ctx' in parameter_names or 'context' in parameter_names

        def new_invoke(self, profile: Profile, shared: Storage, logger: Logger):
            return func(Context(
                logger=logger,
                shared=shared,
                environ=environ,
            ), **profile)

        def new_require(self):
            return require

        def new_provide(self):
            return provide

        def new_remove(self):
            return remove

        def new_define():
            annotation_map = defaultdict()
            annotation_map.default_factory = lambda: str
            for key, _value in {
                str: str,
                int: int,
                float: float,
                bool: bool,
                List[Text]: list,
                List[int]: list,
                List[float]: list,
                List[str]: list,
                List[bool]: list,
            }.items():
                annotation_map[key] = _value

            return tuple(map(
                lambda it: value(it.name, annotation_map[it.annotation]),
                filter(
                    lambda it: (
                                       it.kind == Parameter.POSITIONAL_OR_KEYWORD or it.kind == Parameter.KEYWORD_ONLY) and it.name not in (
                                   'ctx', 'context'
                               ),
                    signature(func).parameters.values()
                )
            ))

        task_cls = type('.'.join((func.__module__, name_mapping(func.__name__))), (Task, ProfileMixin), {
            'invoke': new_invoke,
            'require': new_require,
            'provide': new_provide,
            'remove': new_remove,
            'define': new_define,
        })
        return task_cls

    return wrapper