Source code for autowire.resource

"""
autowire.resource
=================

Resource implementations.

"""
from autowire import impl
from autowire.base import BaseResource

from .plain import Resource
from .function import FunctionResource


def implement(*, name=None, namespace=None):
    """
    Create a resource with implementation. ::

        @resource.implement()
        @contextlib.contextmanager
        def some_resource(context: Context):
            with open('output.log', 'w') as output:
                yield output

        with context.resolve(some_resource) as f:
            f.write('...')

    The default name and namespace will be resolved from decorated function.

    """
    def decorator(fn):
        resource = FunctionResource(fn, name=name, namespace=namespace)
        impl.implement(resource)(fn)
        return resource
    return decorator


[docs]def contextual(*dependencies: BaseResource, decorators=(), name=None, namespace=None): """ Create a resource with contextual function implementation. :: @resource.contextual(dependency1, dependency2) @contextlib.contextmanager def contextual_resource(dependency1, dependency2): yield dependency1.make_resource(dependency2) with context.resolve(contextual_resource) as value: print(value) # ... The default name and namespace will be resolved from decorated function. """ def decorator(fn): resource = FunctionResource(fn, name=name, namespace=namespace) impl.contextual(resource, *dependencies, decorators=decorators)(fn) return resource return decorator
[docs]def plain(*dependencies: BaseResource, decorators=(), name=None, namespace=None): """ Create a resource with plain function implementation. :: @resource.plain(dependency) def resource_path(dependency): return os.path.join(dependency, 'resource.json') with context.resolve(resource_path) as path: with open(path) as f: # ... The default name and namespace will be resolved from decorated function. """ def decorator(fn): resource = FunctionResource(fn, name=name, namespace=namespace) impl.plain(resource, *dependencies, decorators=decorators)(fn) return resource return decorator
[docs]def partial(*positionals, decorators=(), name=None, namespace=None, **keywords): """ Create a partial resource which is a partial function of decorated function. Arguments will be partially filled with resolved resources. :: @resource.partial(user_repository=user_repository): def find_user_by_id(user_id, user_repository): return user_repository.find_by_id(user_id) with context.resolve(find_user_by_id) as func: user = func(100001) # user_repository will be resolved partially. # ... The default name and namespace will be resolved from decorated function. """ def decorator(fn): resource = FunctionResource(fn, name=name, namespace=namespace) impl.partial(resource, decorators=decorators, *positionals, **keywords)(fn) return resource return decorator
__all__ = [ 'Resource', 'FunctionResource', 'implementation', 'contextual', 'plain', 'partial', ]