mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-10-31 16:07:51 +03:00 
			
		
		
		
	making pep257 and flake8 happy
This commit is contained in:
		
							parent
							
								
									36b1413868
								
							
						
					
					
						commit
						e1f2d5e3b8
					
				|  | @ -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') | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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.""" | ||||
|  |  | |||
|  | @ -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)]) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user