making pep257 and flake8 happy

This commit is contained in:
Roman Mogilatov 2015-03-09 00:01:39 +02:00
parent 36b1413868
commit e1f2d5e3b8
4 changed files with 124 additions and 216 deletions

View File

@ -1,6 +1,4 @@
"""
`Objects` library.
"""
"""Objects."""
from .catalog import AbstractCatalog, overrides
from .providers import (Provider, NewInstance, Singleton, Class, Object,
@ -8,11 +6,11 @@ from .providers import (Provider, NewInstance, Singleton, Class, Object,
from .injections import InitArg, Attribute, Method
__all__ = ['AbstractCatalog', 'overrides',
__all__ = ('AbstractCatalog', 'overrides',
# Providers
'Provider', 'NewInstance', 'Singleton', 'Class',
'Object', 'Function', 'Value',
# Injections
'InitArg', 'Attribute', 'Method']
'InitArg', 'Attribute', 'Method')

View File

@ -1,28 +1,18 @@
"""
Catalog module.
"""
"""Catalog module."""
from .providers import Provider
class AbstractCatalog(object):
"""
Abstract object provides catalog.
"""
"""Abstract object provides catalog."""
def __init__(self, *used_providers):
"""
Initializer.
"""
"""Initializer."""
self.__used_providers__ = set(used_providers)
def __getattribute__(self, item):
"""
Returns providers.
:param item:
:return:
"""
"""Return providers."""
attribute = super(AbstractCatalog, self).__getattribute__(item)
if item in ('__used_providers__',):
return attribute
@ -34,9 +24,7 @@ class AbstractCatalog(object):
@classmethod
def __all_providers__(cls, provider_type=Provider):
"""
Returns set of all class providers.
"""
"""Return set of all class providers."""
providers = set()
for attr_name in set(dir(cls)) - set(dir(AbstractCatalog)):
provider = getattr(cls, attr_name)
@ -48,23 +36,18 @@ class AbstractCatalog(object):
@classmethod
def __override___(cls, overriding):
"""
Overrides current catalog providers by overriding catalog providers.
Override current catalog providers by overriding catalog providers.
:param overriding: AbstractCatalog
"""
overriden = overriding.__all_providers__() - cls.__all_providers__()
for name, provider in overriden:
overridden = overriding.__all_providers__() - cls.__all_providers__()
for name, provider in overridden:
overridden_provider = getattr(cls, name)
overridden_provider.__override__(provider)
def overrides(catalog):
"""
Catalog overriding decorator.
:param catalog:
:return:
"""
"""Catalog overriding decorator."""
def decorator(overriding_catalog):
catalog.__override___(overriding_catalog)
return overriding_catalog

View File

@ -1,43 +1,33 @@
"""
Injections module.
"""
"""Injections module."""
class Injection(object):
"""
Base injection class.
"""
"""Base injection class."""
def __init__(self, name, injectable):
"""
Initializer.
"""
"""Initializer."""
self.name = name
self.injectable = injectable
@property
def value(self):
"""
Returns injectable value.
"""
"""Return injectable value."""
if hasattr(self.injectable, '__is_objects_provider__'):
return self.injectable()
return self.injectable
class InitArg(Injection):
"""
Init argument injection.
"""
"""Init argument injection."""
class Attribute(Injection):
"""
Attribute injection.
"""
"""Attribute injection."""
class Method(Injection):
"""
Method injection.
"""
"""Method injection."""

View File

@ -1,6 +1,4 @@
"""
Standard providers.
"""
"""Standard providers."""
from collections import Iterable
from .injections import (
@ -12,46 +10,35 @@ from .injections import (
class Provider(object):
"""
Base provider class.
"""
"""Base provider class."""
__is_objects_provider__ = True
__overridden_by__ = list()
def __init__(self):
"""
Initializer.
"""
"""Initializer."""
self.__overridden_by__ = list()
def __call__(self, *args, **kwargs):
"""
Returns provided instance.
"""
"""Return provided instance."""
raise NotImplementedError()
def __override__(self, provider):
"""
Overrides provider with another provider.
"""
"""Override provider with another provider."""
self.__overridden_by__.append(provider)
def delegate(self):
"""
Returns provider delegate.
"""
"""Return provider delegate."""
return ProviderDelegate(self)
class ProviderDelegate(Provider):
"""
Provider's delegate.
"""
"""Provider's delegate."""
def __init__(self, delegated):
"""
Initializer.
"""Initializer.
:type delegated: Provider
"""
@ -59,153 +46,116 @@ class ProviderDelegate(Provider):
super(ProviderDelegate, self).__init__()
def __call__(self):
"""
Returns provided instance.
"""
"""Return provided instance."""
return self.delegated.__call__
def prepare_injections(injections):
"""
Prepares injections list to injection.
"""
return [(injection.name, injection.value) for injection in injections]
def fetch_injections(injections, injection_type):
"""
Fetches injections of injection type from list.
"""
return tuple([injection
for injection in injections
if isinstance(injection, injection_type)])
class NewInstance(Provider):
"""
"""New instance provider.
New instance providers will create and return new instance on every call.
"""
def __init__(self, provides, *injections):
"""
Initializer.
"""
"""Initializer."""
self.provides = provides
self.init_injections = fetch_injections(injections, InitArg)
self.attribute_injections = fetch_injections(injections, Attribute)
self.method_injections = fetch_injections(injections, Method)
self.init_injections = _fetch_injections(injections, InitArg)
self.attribute_injections = _fetch_injections(injections, Attribute)
self.method_injections = _fetch_injections(injections, Method)
super(NewInstance, self).__init__()
def __call__(self, *args, **kwargs):
"""
Returns provided instance.
"""
"""Return provided instance."""
if self.__overridden_by__:
return self.__overridden_by__[-1].__call__(*args, **kwargs)
init_injections = prepare_injections(self.init_injections)
init_injections = dict(init_injections)
init_injections = dict(((injection.name, injection.value)
for injection in self.init_injections))
init_injections.update(kwargs)
provided = self.provides(*args, **init_injections)
instance = self.provides(*args, **init_injections)
attribute_injections = prepare_injections(self.attribute_injections)
for name, injectable in attribute_injections:
setattr(provided, name, injectable)
if not self.attribute_injections:
for injection in self.attribute_injections:
setattr(instance, injection.name, injection.value)
method_injections = prepare_injections(self.method_injections)
for name, injectable in method_injections:
getattr(provided, name)(injectable)
if not self.method_injections:
for injection in self.method_injections:
getattr(instance, injection.name)(injection.value)
return provided
return instance
class Singleton(NewInstance):
"""
"""Singleton provider.
Singleton provider will create instance once and return it on every call.
"""
def __init__(self, *args, **kwargs):
"""
Initializer.
"""
"""Initializer."""
self.instance = None
super(Singleton, self).__init__(*args, **kwargs)
def __call__(self, *args, **kwargs):
"""
Returns provided instance.
"""
"""Return provided instance."""
if not self.instance:
self.instance = super(Singleton, self).__call__(*args, **kwargs)
return self.instance
def _reset_instance(self):
"""
Resets instance.
"""
"""Reset instance."""
self.instance = None
class Scoped(Singleton):
"""
Scoped provider will create instance once for every scope and return it on every call.
"""Scoped provider.
Scoped provider will create instance once for every scope and return it
on every call.
"""
def __init__(self, *args, **kwargs):
"""
Initializer.
"""
"""Initializer."""
self.is_in_scope = None
super(Scoped, self).__init__(*args, **kwargs)
def in_scope(self):
"""
Sets provider in "in scope" state.
"""
"""Set provider in "in scope" state."""
self.is_in_scope = True
self._reset_instance()
def out_of_scope(self):
"""
Sets provider in "out of scope" state.
"""
"""Set provider in "out of scope" state."""
self.is_in_scope = False
self._reset_instance()
def __call__(self, *args, **kwargs):
"""
Returns provided instance.
"""
"""Return provided instance."""
if not self.is_in_scope:
raise RuntimeError('Trying to provide {} while provider is not in scope'.format(self.provides))
raise RuntimeError('Trying to provide {} '.format(self.provides) +
'while provider is not in scope')
return super(Scoped, self).__call__(*args, **kwargs)
def __enter__(self):
"""
With __enter__() implementation. Makes provider to be in scope.
"""
"""Make provider to be in scope."""
self.in_scope()
return self
def __exit__(self, *_):
"""
With __exit__() implementation. Makes provider to be out of scope.
"""
"""Make provider to be out of scope."""
self.out_of_scope()
class ExternalDependency(Provider):
"""
External dependency provider.
"""
"""External dependency provider."""
def __init__(self, instance_of):
"""
Initializer
:param instance_of: type
"""
"""Initializer."""
if not isinstance(instance_of, Iterable):
instance_of = (instance_of,)
self.instance_of = instance_of
@ -213,163 +163,150 @@ class ExternalDependency(Provider):
super(ExternalDependency, self).__init__()
def satisfy(self, provider):
"""
Satisfies an external dependency.
:param provider: Provider
"""
"""Satisfy an external dependency."""
self.dependency = provider
def __call__(self, *args, **kwargs):
"""
Returns provided instance.
"""
"""Return provided instance."""
if not self.dependency:
raise ValueError('Dependency is not satisfied')
result = self.dependency.__call__(*args, **kwargs)
if not any((isinstance(result, possible_type) for possible_type in self.instance_of)):
raise TypeError('{} is not an instance of {}'.format(result, self.instance_of))
is_instance = any((isinstance(result, possible_type)
for possible_type in self.instance_of))
if not is_instance:
raise TypeError('{} is not an '.format(result) +
'instance of {}'.format(self.instance_of))
return result
class _StaticProvider(Provider):
"""
"""Static provider.
Static provider is base implementation that provides exactly the same as
it got on input.
"""
def __init__(self, provides):
"""
Initializer.
"""
"""Initializer."""
self.provides = provides
super(_StaticProvider, self).__init__()
def __call__(self):
"""
Returns provided instance.
"""
"""Return provided instance."""
if self.__overridden_by__:
return self.__overridden_by__[-1].__call__()
return self.provides
class Class(_StaticProvider):
"""
Class provider provides class.
"""
"""Class provider provides class."""
class Object(_StaticProvider):
"""
Object provider provides object.
"""
"""Object provider provides object."""
class Function(_StaticProvider):
"""
Function provider provides function.
"""
"""Function provider provides function."""
class Value(_StaticProvider):
"""
Value provider provides value.
"""
"""Value provider provides value."""
class Callable(Provider):
"""
"""Callable provider.
Callable provider will provide callable calls with some predefined
dependencies injections.
"""
def __init__(self, calls, *injections):
"""
Initializer.
"""
"""Initializer."""
self.calls = calls
self.injections = fetch_injections(injections, Injection)
self.injections = _fetch_injections(injections, Injection)
super(Callable, self).__init__()
def __call__(self, *args, **kwargs):
"""
Returns provided instance.
"""
"""Return provided instance."""
if self.__overridden_by__:
return self.__overridden_by__[-1].__call__(*args, **kwargs)
injections = prepare_injections(self.injections)
injections = dict(injections)
injections = dict(((injection.name, injection.value)
for injection in self.injections))
injections.update(kwargs)
return self.calls(*args, **injections)
class _DeferredConfig(Provider):
"""
"""Deferred config provider.
Deferred config providers provide an value from the root config object.
"""
def __init__(self, paths, root_config):
"""
Initializer.
"""
"""Initializer."""
self.paths = paths
self.root_config = root_config
super(_DeferredConfig, self).__init__()
def __getattr__(self, item):
"""
Returns instance of deferred config.
"""
"""Return instance of deferred config."""
return _DeferredConfig(paths=self.paths + (item,),
root_config=self.root_config)
def __call__(self, *args, **kwargs):
"""
Returns provided instance.
"""
"""Return provided instance."""
return self.root_config(self.paths)
class Config(Provider):
"""
"""Config provider.
Config provider provides dict values. Also config provider creates
deferred config objects for all undefined attribute calls.
"""
def __init__(self, value=None):
"""
Initializer.
"""
"""Initializer."""
if not value:
value = dict()
self.value = value
super(Config, self).__init__()
def update_from(self, value):
"""
Updates current value from another one.
"""
"""Update current value from another one."""
self.value.update(value)
def __getattr__(self, item):
"""
Returns instance of deferred config.
"""
"""Return instance of deferred config."""
return _DeferredConfig(paths=(item,),
root_config=self)
def __call__(self, paths=None):
"""
Returns provided instance.
"""
"""Return provided instance."""
value = self.value
if paths:
for path in paths:
value = value[path]
return value
def _fetch_injections(injections, injection_type):
"""Fetch injections of injection type from list."""
return tuple([injection
for injection in injections
if isinstance(injection, injection_type)])