mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-10-31 16:07:51 +03:00 
			
		
		
		
	Renaming InitArg to KwArg, adding @inject decorator
This commit is contained in:
		
							parent
							
								
									6bbf7e3526
								
							
						
					
					
						commit
						1032143f5b
					
				
							
								
								
									
										27
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								README.md
									
									
									
									
									
								
							|  | @ -12,15 +12,16 @@ Python catalogs of objects providers | ||||||
| Example: | Example: | ||||||
| 
 | 
 | ||||||
| ```python | ```python | ||||||
| """Concept example of Objects.""" | """Concept example of `Objects`.""" | ||||||
| 
 | 
 | ||||||
| from objects import AbstractCatalog | from objects.catalog import AbstractCatalog | ||||||
| 
 | 
 | ||||||
| from objects.providers import Singleton | from objects.providers import Singleton | ||||||
| from objects.providers import NewInstance | from objects.providers import NewInstance | ||||||
| 
 | 
 | ||||||
| from objects.injections import InitArg | from objects.injections import KwArg | ||||||
| from objects.injections import Attribute | from objects.injections import Attribute | ||||||
|  | from objects.injections import inject | ||||||
| 
 | 
 | ||||||
| import sqlite3 | import sqlite3 | ||||||
| 
 | 
 | ||||||
|  | @ -49,17 +50,17 @@ class Catalog(AbstractCatalog): | ||||||
|     """Catalog of objects providers.""" |     """Catalog of objects providers.""" | ||||||
| 
 | 
 | ||||||
|     database = Singleton(sqlite3.Connection, |     database = Singleton(sqlite3.Connection, | ||||||
|                          InitArg('database', ':memory:'), |                          KwArg('database', ':memory:'), | ||||||
|                          Attribute('row_factory', sqlite3.Row)) |                          Attribute('row_factory', sqlite3.Row)) | ||||||
|     """:type: (objects.Provider) -> sqlite3.Connection""" |     """:type: (objects.Provider) -> sqlite3.Connection""" | ||||||
| 
 | 
 | ||||||
|     object_a = NewInstance(ObjectA, |     object_a = NewInstance(ObjectA, | ||||||
|                            InitArg('db', database)) |                            KwArg('db', database)) | ||||||
|     """:type: (objects.Provider) -> ObjectA""" |     """:type: (objects.Provider) -> ObjectA""" | ||||||
| 
 | 
 | ||||||
|     object_b = NewInstance(ObjectB, |     object_b = NewInstance(ObjectB, | ||||||
|                            InitArg('a', object_a), |                            KwArg('a', object_a), | ||||||
|                            InitArg('db', database)) |                            KwArg('db', database)) | ||||||
|     """:type: (objects.Provider) -> ObjectB""" |     """:type: (objects.Provider) -> ObjectB""" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -67,8 +68,18 @@ class Catalog(AbstractCatalog): | ||||||
| a1, a2 = Catalog.object_a(), Catalog.object_a() | a1, a2 = Catalog.object_a(), Catalog.object_a() | ||||||
| b1, b2 = Catalog.object_b(), Catalog.object_b() | b1, b2 = Catalog.object_b(), Catalog.object_b() | ||||||
| 
 | 
 | ||||||
| # Some asserts. |  | ||||||
| assert a1 is not a2 | assert a1 is not a2 | ||||||
| assert b1 is not b2 | assert b1 is not b2 | ||||||
| assert a1.db is a2.db is b1.db is b2.db is Catalog.database() | assert a1.db is a2.db is b1.db is b2.db is Catalog.database() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Example of inline injections. | ||||||
|  | @inject(KwArg('a', Catalog.object_a)) | ||||||
|  | @inject(KwArg('b', Catalog.object_b)) | ||||||
|  | @inject(KwArg('database', Catalog.database)) | ||||||
|  | def example(a, b, database): | ||||||
|  |     assert a.db is b.db is database is Catalog.database() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | example() | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
|  | @ -1,13 +1,12 @@ | ||||||
| """Callable provider examples.""" | """Callable provider examples.""" | ||||||
| 
 | 
 | ||||||
| from objects import AbstractCatalog | from objects.catalog import AbstractCatalog | ||||||
| 
 | 
 | ||||||
| from objects.providers import Singleton | from objects.providers import Singleton | ||||||
| from objects.providers import Callable | from objects.providers import Callable | ||||||
| 
 | 
 | ||||||
| from objects.injections import InitArg | from objects.injections import KwArg | ||||||
| from objects.injections import Attribute | from objects.injections import Attribute | ||||||
| from objects.injections import Injection |  | ||||||
| 
 | 
 | ||||||
| import sqlite3 | import sqlite3 | ||||||
| 
 | 
 | ||||||
|  | @ -22,12 +21,12 @@ class Catalog(AbstractCatalog): | ||||||
|     """Catalog of objects providers.""" |     """Catalog of objects providers.""" | ||||||
| 
 | 
 | ||||||
|     database = Singleton(sqlite3.Connection, |     database = Singleton(sqlite3.Connection, | ||||||
|                          InitArg('database', ':memory:'), |                          KwArg('database', ':memory:'), | ||||||
|                          Attribute('row_factory', sqlite3.Row)) |                          Attribute('row_factory', sqlite3.Row)) | ||||||
|     """:type: (objects.Provider) -> sqlite3.Connection""" |     """:type: (objects.Provider) -> sqlite3.Connection""" | ||||||
| 
 | 
 | ||||||
|     consuming_function = Callable(consuming_function, |     consuming_function = Callable(consuming_function, | ||||||
|                                   Injection('db', database)) |                                   KwArg('db', database)) | ||||||
|     """:type: (objects.Provider) -> consuming_function""" |     """:type: (objects.Provider) -> consuming_function""" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,12 +1,13 @@ | ||||||
| """Concept example of `Objects`.""" | """Concept example of `Objects`.""" | ||||||
| 
 | 
 | ||||||
| from objects import AbstractCatalog | from objects.catalog import AbstractCatalog | ||||||
| 
 | 
 | ||||||
| from objects.providers import Singleton | from objects.providers import Singleton | ||||||
| from objects.providers import NewInstance | from objects.providers import NewInstance | ||||||
| 
 | 
 | ||||||
| from objects.injections import InitArg | from objects.injections import KwArg | ||||||
| from objects.injections import Attribute | from objects.injections import Attribute | ||||||
|  | from objects.injections import inject | ||||||
| 
 | 
 | ||||||
| import sqlite3 | import sqlite3 | ||||||
| 
 | 
 | ||||||
|  | @ -35,17 +36,17 @@ class Catalog(AbstractCatalog): | ||||||
|     """Catalog of objects providers.""" |     """Catalog of objects providers.""" | ||||||
| 
 | 
 | ||||||
|     database = Singleton(sqlite3.Connection, |     database = Singleton(sqlite3.Connection, | ||||||
|                          InitArg('database', ':memory:'), |                          KwArg('database', ':memory:'), | ||||||
|                          Attribute('row_factory', sqlite3.Row)) |                          Attribute('row_factory', sqlite3.Row)) | ||||||
|     """:type: (objects.Provider) -> sqlite3.Connection""" |     """:type: (objects.Provider) -> sqlite3.Connection""" | ||||||
| 
 | 
 | ||||||
|     object_a = NewInstance(ObjectA, |     object_a = NewInstance(ObjectA, | ||||||
|                            InitArg('db', database)) |                            KwArg('db', database)) | ||||||
|     """:type: (objects.Provider) -> ObjectA""" |     """:type: (objects.Provider) -> ObjectA""" | ||||||
| 
 | 
 | ||||||
|     object_b = NewInstance(ObjectB, |     object_b = NewInstance(ObjectB, | ||||||
|                            InitArg('a', object_a), |                            KwArg('a', object_a), | ||||||
|                            InitArg('db', database)) |                            KwArg('db', database)) | ||||||
|     """:type: (objects.Provider) -> ObjectB""" |     """:type: (objects.Provider) -> ObjectB""" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -53,7 +54,17 @@ class Catalog(AbstractCatalog): | ||||||
| a1, a2 = Catalog.object_a(), Catalog.object_a() | a1, a2 = Catalog.object_a(), Catalog.object_a() | ||||||
| b1, b2 = Catalog.object_b(), Catalog.object_b() | b1, b2 = Catalog.object_b(), Catalog.object_b() | ||||||
| 
 | 
 | ||||||
| # Some asserts. |  | ||||||
| assert a1 is not a2 | assert a1 is not a2 | ||||||
| assert b1 is not b2 | assert b1 is not b2 | ||||||
| assert a1.db is a2.db is b1.db is b2.db is Catalog.database() | assert a1.db is a2.db is b1.db is b2.db is Catalog.database() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Example of inline injections. | ||||||
|  | @inject(KwArg('a', Catalog.object_a)) | ||||||
|  | @inject(KwArg('b', Catalog.object_b)) | ||||||
|  | @inject(KwArg('database', Catalog.database)) | ||||||
|  | def example(a, b, database): | ||||||
|  |     assert a.db is b.db is database is Catalog.database() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | example() | ||||||
|  |  | ||||||
|  | @ -1,11 +1,11 @@ | ||||||
| """Config provider examples.""" | """Config provider examples.""" | ||||||
| 
 | 
 | ||||||
| from objects import AbstractCatalog | from objects.catalog import AbstractCatalog | ||||||
| 
 | 
 | ||||||
| from objects.providers import Config | from objects.providers import Config | ||||||
| from objects.providers import NewInstance | from objects.providers import NewInstance | ||||||
| 
 | 
 | ||||||
| from objects.injections import InitArg | from objects.injections import KwArg | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class ObjectA(object): | class ObjectA(object): | ||||||
|  | @ -27,9 +27,9 @@ class Catalog(AbstractCatalog): | ||||||
|     """:type: (objects.Config)""" |     """:type: (objects.Config)""" | ||||||
| 
 | 
 | ||||||
|     object_a = NewInstance(ObjectA, |     object_a = NewInstance(ObjectA, | ||||||
|                            InitArg('fee', config.FEE), |                            KwArg('fee', config.FEE), | ||||||
|                            InitArg('price', config.PRICE), |                            KwArg('price', config.PRICE), | ||||||
|                            InitArg('timezone', config.GLOBAL.TIMEZONE)) |                            KwArg('timezone', config.GLOBAL.TIMEZONE)) | ||||||
|     """:type: (objects.Provider) -> ObjectA""" |     """:type: (objects.Provider) -> ObjectA""" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,11 +1,11 @@ | ||||||
| """Provider delegation example.""" | """Provider delegation example.""" | ||||||
| 
 | 
 | ||||||
| from objects import AbstractCatalog | from objects.catalog import AbstractCatalog | ||||||
| 
 | 
 | ||||||
| from objects.providers import Singleton | from objects.providers import Singleton | ||||||
| from objects.providers import NewInstance | from objects.providers import NewInstance | ||||||
| 
 | 
 | ||||||
| from objects.injections import InitArg | from objects.injections import KwArg | ||||||
| from objects.injections import Attribute | from objects.injections import Attribute | ||||||
| 
 | 
 | ||||||
| import sqlite3 | import sqlite3 | ||||||
|  | @ -34,16 +34,16 @@ class Catalog(AbstractCatalog): | ||||||
|     """Catalog of objects providers.""" |     """Catalog of objects providers.""" | ||||||
| 
 | 
 | ||||||
|     database = Singleton(sqlite3.Connection, |     database = Singleton(sqlite3.Connection, | ||||||
|                          InitArg('database', ':memory:'), |                          KwArg('database', ':memory:'), | ||||||
|                          Attribute('row_factory', sqlite3.Row)) |                          Attribute('row_factory', sqlite3.Row)) | ||||||
|     """:type: (objects.Provider) -> sqlite3.Connection""" |     """:type: (objects.Provider) -> sqlite3.Connection""" | ||||||
| 
 | 
 | ||||||
|     object_a = NewInstance(ObjectA, |     object_a = NewInstance(ObjectA, | ||||||
|                            InitArg('db', database)) |                            KwArg('db', database)) | ||||||
|     """:type: (objects.Provider) -> ObjectA""" |     """:type: (objects.Provider) -> ObjectA""" | ||||||
| 
 | 
 | ||||||
|     object_b = Singleton(ObjectB, |     object_b = Singleton(ObjectB, | ||||||
|                          InitArg('a_provider', object_a.delegate())) |                          KwArg('a_provider', object_a.delegate())) | ||||||
|     """:type: (objects.Provider) -> ObjectB""" |     """:type: (objects.Provider) -> ObjectB""" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,12 +1,12 @@ | ||||||
| """External dependency example.""" | """External dependency example.""" | ||||||
| 
 | 
 | ||||||
| from objects import AbstractCatalog | from objects.catalog import AbstractCatalog | ||||||
| 
 | 
 | ||||||
| from objects.providers import Singleton | from objects.providers import Singleton | ||||||
| from objects.providers import NewInstance | from objects.providers import NewInstance | ||||||
| from objects.providers import ExternalDependency | from objects.providers import ExternalDependency | ||||||
| 
 | 
 | ||||||
| from objects.injections import InitArg | from objects.injections import KwArg | ||||||
| from objects.injections import Attribute | from objects.injections import Attribute | ||||||
| 
 | 
 | ||||||
| import sqlite3 | import sqlite3 | ||||||
|  | @ -39,18 +39,18 @@ class Catalog(AbstractCatalog): | ||||||
|     """:type: (objects.Provider) -> sqlite3.Connection""" |     """:type: (objects.Provider) -> sqlite3.Connection""" | ||||||
| 
 | 
 | ||||||
|     object_a = NewInstance(ObjectA, |     object_a = NewInstance(ObjectA, | ||||||
|                            InitArg('db', database)) |                            KwArg('db', database)) | ||||||
|     """:type: (objects.Provider) -> ObjectA""" |     """:type: (objects.Provider) -> ObjectA""" | ||||||
| 
 | 
 | ||||||
|     object_b = NewInstance(ObjectB, |     object_b = NewInstance(ObjectB, | ||||||
|                            InitArg('a', object_a), |                            KwArg('a', object_a), | ||||||
|                            InitArg('db', database)) |                            KwArg('db', database)) | ||||||
|     """:type: (objects.Provider) -> ObjectB""" |     """:type: (objects.Provider) -> ObjectB""" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # Satisfaction of external dependency. | # Satisfaction of external dependency. | ||||||
| Catalog.database.override(Singleton(sqlite3.Connection, | Catalog.database.override(Singleton(sqlite3.Connection, | ||||||
|                                     InitArg('database', ':memory:'), |                                     KwArg('database', ':memory:'), | ||||||
|                                     Attribute('row_factory', sqlite3.Row))) |                                     Attribute('row_factory', sqlite3.Row))) | ||||||
| 
 | 
 | ||||||
| # Catalog static provides. | # Catalog static provides. | ||||||
|  |  | ||||||
|  | @ -1,12 +1,12 @@ | ||||||
| """Override example.""" | """Override example.""" | ||||||
| 
 | 
 | ||||||
| from objects import AbstractCatalog | from objects.catalog import AbstractCatalog | ||||||
| from objects import overrides | from objects.catalog import override | ||||||
| 
 | 
 | ||||||
| from objects.providers import Singleton | from objects.providers import Singleton | ||||||
| from objects.providers import NewInstance | from objects.providers import NewInstance | ||||||
| 
 | 
 | ||||||
| from objects.injections import InitArg | from objects.injections import KwArg | ||||||
| from objects.injections import Attribute | from objects.injections import Attribute | ||||||
| 
 | 
 | ||||||
| import sqlite3 | import sqlite3 | ||||||
|  | @ -31,22 +31,22 @@ class Catalog(AbstractCatalog): | ||||||
|     """Catalog of objects providers.""" |     """Catalog of objects providers.""" | ||||||
| 
 | 
 | ||||||
|     database = Singleton(sqlite3.Connection, |     database = Singleton(sqlite3.Connection, | ||||||
|                          InitArg('database', ':memory:'), |                          KwArg('database', ':memory:'), | ||||||
|                          Attribute('row_factory', sqlite3.Row)) |                          Attribute('row_factory', sqlite3.Row)) | ||||||
|     """:type: (objects.Provider) -> sqlite3.Connection""" |     """:type: (objects.Provider) -> sqlite3.Connection""" | ||||||
| 
 | 
 | ||||||
|     object_a = NewInstance(ObjectA, |     object_a = NewInstance(ObjectA, | ||||||
|                            InitArg('db', database)) |                            KwArg('db', database)) | ||||||
|     """:type: (objects.Provider) -> ObjectA""" |     """:type: (objects.Provider) -> ObjectA""" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @overrides(Catalog) | @override(Catalog) | ||||||
| class SandboxCatalog(Catalog): | class SandboxCatalog(Catalog): | ||||||
| 
 | 
 | ||||||
|     """Sandbox objects catalog with some mocks that overrides Catalog.""" |     """Sandbox objects catalog with some mocks that overrides Catalog.""" | ||||||
| 
 | 
 | ||||||
|     object_a = NewInstance(ObjectAMock, |     object_a = NewInstance(ObjectAMock, | ||||||
|                            InitArg('db', Catalog.database)) |                            KwArg('db', Catalog.database)) | ||||||
|     """:type: (objects.Provider) -> ObjectA""" |     """:type: (objects.Provider) -> ObjectA""" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -1,11 +1,11 @@ | ||||||
| """Concept example of objects catalogs.""" | """Concept example of objects catalogs.""" | ||||||
| 
 | 
 | ||||||
| from objects import AbstractCatalog | from objects.catalog import AbstractCatalog | ||||||
| 
 | 
 | ||||||
| from objects.providers import Singleton | from objects.providers import Singleton | ||||||
| from objects.providers import NewInstance | from objects.providers import NewInstance | ||||||
| 
 | 
 | ||||||
| from objects.injections import InitArg | from objects.injections import KwArg | ||||||
| from objects.injections import Attribute | from objects.injections import Attribute | ||||||
| 
 | 
 | ||||||
| from objects.errors import Error | from objects.errors import Error | ||||||
|  | @ -37,17 +37,17 @@ class Catalog(AbstractCatalog): | ||||||
|     """Catalog of objects providers.""" |     """Catalog of objects providers.""" | ||||||
| 
 | 
 | ||||||
|     database = Singleton(sqlite3.Connection, |     database = Singleton(sqlite3.Connection, | ||||||
|                          InitArg('database', ':memory:'), |                          KwArg('database', ':memory:'), | ||||||
|                          Attribute('row_factory', sqlite3.Row)) |                          Attribute('row_factory', sqlite3.Row)) | ||||||
|     """:type: (objects.Provider) -> sqlite3.Connection""" |     """:type: (objects.Provider) -> sqlite3.Connection""" | ||||||
| 
 | 
 | ||||||
|     object_a = NewInstance(ObjectA, |     object_a = NewInstance(ObjectA, | ||||||
|                            InitArg('db', database)) |                            KwArg('db', database)) | ||||||
|     """:type: (objects.Provider) -> ObjectA""" |     """:type: (objects.Provider) -> ObjectA""" | ||||||
| 
 | 
 | ||||||
|     object_b = NewInstance(ObjectB, |     object_b = NewInstance(ObjectB, | ||||||
|                            InitArg('a', object_a), |                            KwArg('a', object_a), | ||||||
|                            InitArg('db', database)) |                            KwArg('db', database)) | ||||||
|     """:type: (objects.Provider) -> ObjectB""" |     """:type: (objects.Provider) -> ObjectB""" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,6 +1,7 @@ | ||||||
| """Objects.""" | """Objects.""" | ||||||
| 
 | 
 | ||||||
| from .catalog import AbstractCatalog, overrides | from .catalog import AbstractCatalog | ||||||
|  | from .catalog import override | ||||||
| 
 | 
 | ||||||
| from .providers import Provider | from .providers import Provider | ||||||
| from .providers import Delegate | from .providers import Delegate | ||||||
|  | @ -14,7 +15,7 @@ from .providers import Value | ||||||
| from .providers import Callable | from .providers import Callable | ||||||
| from .providers import Config | from .providers import Config | ||||||
| 
 | 
 | ||||||
| from .injections import InitArg | from .injections import KwArg | ||||||
| from .injections import Attribute | from .injections import Attribute | ||||||
| from .injections import Method | from .injections import Method | ||||||
| 
 | 
 | ||||||
|  | @ -22,7 +23,7 @@ from .errors import Error | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| __all__ = ('AbstractCatalog', | __all__ = ('AbstractCatalog', | ||||||
|            'overrides', |            'override', | ||||||
| 
 | 
 | ||||||
|            # Providers |            # Providers | ||||||
|            'Provider', |            'Provider', | ||||||
|  | @ -38,7 +39,7 @@ __all__ = ('AbstractCatalog', | ||||||
|            'Config', |            'Config', | ||||||
| 
 | 
 | ||||||
|            # Injections |            # Injections | ||||||
|            'InitArg', |            'KwArg', | ||||||
|            'Attribute', |            'Attribute', | ||||||
|            'Method', |            'Method', | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -49,7 +49,7 @@ class AbstractCatalog(object): | ||||||
|             overridden_provider.override(provider) |             overridden_provider.override(provider) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def overrides(catalog): | def override(catalog): | ||||||
|     """Catalog overriding decorator.""" |     """Catalog overriding decorator.""" | ||||||
|     def decorator(overriding_catalog): |     def decorator(overriding_catalog): | ||||||
|         """Overriding decorator.""" |         """Overriding decorator.""" | ||||||
|  |  | ||||||
|  | @ -1,6 +1,7 @@ | ||||||
| """Injections module.""" | """Injections module.""" | ||||||
| 
 | 
 | ||||||
| from .utils import is_provider | from .utils import is_provider | ||||||
|  | from .utils import ensure_is_injection | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class Injection(object): | class Injection(object): | ||||||
|  | @ -23,12 +24,12 @@ class Injection(object): | ||||||
|         return self.injectable |         return self.injectable | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class InitArg(Injection): | class KwArg(Injection): | ||||||
| 
 | 
 | ||||||
|     """Init argument injection.""" |     """Keyword argument injection.""" | ||||||
| 
 | 
 | ||||||
|     __IS_OBJECTS_INIT_ARG_INJECTION__ = True |     __IS_OBJECTS_KWARG_INJECTION__ = True | ||||||
|     __slots__ = ('__IS_OBJECTS_INIT_ARG_INJECTION__',) |     __slots__ = ('__IS_OBJECTS_KWARG_INJECTION__',) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class Attribute(Injection): | class Attribute(Injection): | ||||||
|  | @ -45,3 +46,22 @@ class Method(Injection): | ||||||
| 
 | 
 | ||||||
|     __IS_OBJECTS_METHOD_INJECTION__ = True |     __IS_OBJECTS_METHOD_INJECTION__ = True | ||||||
|     __slots__ = ('__IS_OBJECTS_METHOD_INJECTION__',) |     __slots__ = ('__IS_OBJECTS_METHOD_INJECTION__',) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def inject(injection): | ||||||
|  |     """Inject decorator. | ||||||
|  | 
 | ||||||
|  |     :type injection: Injection | ||||||
|  |     :return: (callable) -> (callable) | ||||||
|  |     """ | ||||||
|  |     injection = ensure_is_injection(injection) | ||||||
|  | 
 | ||||||
|  |     def decorator(callback): | ||||||
|  |         """Decorator.""" | ||||||
|  |         def decorated(*args, **kwargs): | ||||||
|  |             """Decorated.""" | ||||||
|  |             if injection.name not in kwargs: | ||||||
|  |                 kwargs[injection.name] = injection.value | ||||||
|  |             return callback(*args, **kwargs) | ||||||
|  |         return decorated | ||||||
|  |     return decorator | ||||||
|  |  | ||||||
|  | @ -3,8 +3,7 @@ | ||||||
| from inspect import isclass | from inspect import isclass | ||||||
| 
 | 
 | ||||||
| from .utils import ensure_is_provider | from .utils import ensure_is_provider | ||||||
| from .utils import is_injection | from .utils import is_kwarg_injection | ||||||
| from .utils import is_init_arg_injection |  | ||||||
| from .utils import is_attribute_injection | from .utils import is_attribute_injection | ||||||
| from .utils import is_method_injection | from .utils import is_method_injection | ||||||
| 
 | 
 | ||||||
|  | @ -77,7 +76,7 @@ class NewInstance(Provider): | ||||||
|     New instance providers will create and return new instance on every call. |     New instance providers will create and return new instance on every call. | ||||||
|     """ |     """ | ||||||
| 
 | 
 | ||||||
|     __slots__ = ('provides', 'init_args', 'attributes', 'methods') |     __slots__ = ('provides', 'kwargs', 'attributes', 'methods') | ||||||
| 
 | 
 | ||||||
|     def __init__(self, provides, *injections): |     def __init__(self, provides, *injections): | ||||||
|         """Initializer.""" |         """Initializer.""" | ||||||
|  | @ -85,9 +84,9 @@ class NewInstance(Provider): | ||||||
|             raise Error('NewInstance provider expects to get class, ' + |             raise Error('NewInstance provider expects to get class, ' + | ||||||
|                         'got {0} instead'.format(str(provides))) |                         'got {0} instead'.format(str(provides))) | ||||||
|         self.provides = provides |         self.provides = provides | ||||||
|         self.init_args = tuple((injection |         self.kwargs = tuple((injection | ||||||
|                              for injection in injections |                              for injection in injections | ||||||
|                                 if is_init_arg_injection(injection))) |                              if is_kwarg_injection(injection))) | ||||||
|         self.attributes = tuple((injection |         self.attributes = tuple((injection | ||||||
|                                  for injection in injections |                                  for injection in injections | ||||||
|                                  if is_attribute_injection(injection))) |                                  if is_attribute_injection(injection))) | ||||||
|  | @ -102,7 +101,7 @@ class NewInstance(Provider): | ||||||
|             return self.last_overriding(*args, **kwargs) |             return self.last_overriding(*args, **kwargs) | ||||||
| 
 | 
 | ||||||
|         init_kwargs = dict(((injection.name, injection.value) |         init_kwargs = dict(((injection.name, injection.value) | ||||||
|                             for injection in self.init_args)) |                             for injection in self.kwargs)) | ||||||
|         init_kwargs.update(kwargs) |         init_kwargs.update(kwargs) | ||||||
| 
 | 
 | ||||||
|         instance = self.provides(*args, **init_kwargs) |         instance = self.provides(*args, **init_kwargs) | ||||||
|  | @ -228,7 +227,7 @@ class Callable(Provider): | ||||||
|         self.callback = callback |         self.callback = callback | ||||||
|         self.injections = tuple((injection |         self.injections = tuple((injection | ||||||
|                                  for injection in injections |                                  for injection in injections | ||||||
|                                  if is_injection(injection))) |                                  if is_kwarg_injection(injection))) | ||||||
|         super(Callable, self).__init__() |         super(Callable, self).__init__() | ||||||
| 
 | 
 | ||||||
|     def __call__(self, *args, **kwargs): |     def __call__(self, *args, **kwargs): | ||||||
|  |  | ||||||
|  | @ -25,10 +25,18 @@ def is_injection(instance): | ||||||
|             hasattr(instance, '__IS_OBJECTS_INJECTION__')) |             hasattr(instance, '__IS_OBJECTS_INJECTION__')) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def is_init_arg_injection(instance): | def ensure_is_injection(instance): | ||||||
|     """Check if instance is init arg injection instance.""" |     """Check if instance is injection instance, otherwise raise and error.""" | ||||||
|  |     if not is_injection(instance): | ||||||
|  |         raise Error('Expected injection instance, ' | ||||||
|  |                     'got {0}'.format(str(instance))) | ||||||
|  |     return instance | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def is_kwarg_injection(instance): | ||||||
|  |     """Check if instance is keyword argument injection instance.""" | ||||||
|     return (not isinstance(instance, class_types) and |     return (not isinstance(instance, class_types) and | ||||||
|             hasattr(instance, '__IS_OBJECTS_INIT_ARG_INJECTION__')) |             hasattr(instance, '__IS_OBJECTS_KWARG_INJECTION__')) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def is_attribute_injection(instance): | def is_attribute_injection(instance): | ||||||
|  |  | ||||||
|  | @ -3,7 +3,7 @@ | ||||||
| import unittest2 as unittest | import unittest2 as unittest | ||||||
| 
 | 
 | ||||||
| from objects.catalog import AbstractCatalog | from objects.catalog import AbstractCatalog | ||||||
| from objects.catalog import overrides | from objects.catalog import override | ||||||
| 
 | 
 | ||||||
| from objects.providers import Object | from objects.providers import Object | ||||||
| from objects.providers import Value | from objects.providers import Value | ||||||
|  | @ -53,7 +53,7 @@ class CatalogTests(unittest.TestCase): | ||||||
| 
 | 
 | ||||||
|     def test_overriding(self): |     def test_overriding(self): | ||||||
|         """Test catalog overriding with another catalog.""" |         """Test catalog overriding with another catalog.""" | ||||||
|         @overrides(self.Catalog) |         @override(self.Catalog) | ||||||
|         class OverridingCatalog(self.Catalog): |         class OverridingCatalog(self.Catalog): | ||||||
| 
 | 
 | ||||||
|             """Overriding catalog.""" |             """Overriding catalog.""" | ||||||
|  |  | ||||||
|  | @ -3,7 +3,7 @@ | ||||||
| import unittest2 as unittest | import unittest2 as unittest | ||||||
| 
 | 
 | ||||||
| from objects.injections import Injection | from objects.injections import Injection | ||||||
| from objects.injections import InitArg | from objects.injections import KwArg | ||||||
| from objects.injections import Attribute | from objects.injections import Attribute | ||||||
| from objects.injections import Method | from objects.injections import Method | ||||||
| 
 | 
 | ||||||
|  | @ -36,8 +36,8 @@ class InitArgTests(unittest.TestCase): | ||||||
|     """Init arg injection test cases.""" |     """Init arg injection test cases.""" | ||||||
| 
 | 
 | ||||||
|     def test_init(self): |     def test_init(self): | ||||||
|         """Test InitArg creation and initialization.""" |         """Test KwArg creation and initialization.""" | ||||||
|         injection = InitArg('some_arg_name', 'some_value') |         injection = KwArg('some_arg_name', 'some_value') | ||||||
|         self.assertEqual(injection.name, 'some_arg_name') |         self.assertEqual(injection.name, 'some_arg_name') | ||||||
|         self.assertEqual(injection.injectable, 'some_value') |         self.assertEqual(injection.injectable, 'some_value') | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -14,8 +14,7 @@ from objects.providers import Value | ||||||
| from objects.providers import Callable | from objects.providers import Callable | ||||||
| from objects.providers import Config | from objects.providers import Config | ||||||
| 
 | 
 | ||||||
| from objects.injections import Injection | from objects.injections import KwArg | ||||||
| from objects.injections import InitArg |  | ||||||
| from objects.injections import Attribute | from objects.injections import Attribute | ||||||
| from objects.injections import Method | from objects.injections import Method | ||||||
| 
 | 
 | ||||||
|  | @ -184,8 +183,8 @@ class NewInstanceTests(unittest.TestCase): | ||||||
|     def test_call_with_init_args(self): |     def test_call_with_init_args(self): | ||||||
|         """Test creation of new instances with init args injections.""" |         """Test creation of new instances with init args injections.""" | ||||||
|         provider = NewInstance(self.Example, |         provider = NewInstance(self.Example, | ||||||
|                                InitArg('init_arg1', 'i1'), |                                KwArg('init_arg1', 'i1'), | ||||||
|                                InitArg('init_arg2', 'i2')) |                                KwArg('init_arg2', 'i2')) | ||||||
| 
 | 
 | ||||||
|         instance1 = provider() |         instance1 = provider() | ||||||
|         instance2 = provider() |         instance2 = provider() | ||||||
|  | @ -249,7 +248,7 @@ class NewInstanceTests(unittest.TestCase): | ||||||
|     def test_call_with_context_kwargs(self): |     def test_call_with_context_kwargs(self): | ||||||
|         """Test creation of new instances with context kwargs.""" |         """Test creation of new instances with context kwargs.""" | ||||||
|         provider = NewInstance(self.Example, |         provider = NewInstance(self.Example, | ||||||
|                                InitArg('init_arg1', 1)) |                                KwArg('init_arg1', 1)) | ||||||
| 
 | 
 | ||||||
|         instance1 = provider(init_arg2=22) |         instance1 = provider(init_arg2=22) | ||||||
|         self.assertEqual(instance1.init_arg1, 1) |         self.assertEqual(instance1.init_arg1, 1) | ||||||
|  | @ -399,9 +398,9 @@ class CallableTests(unittest.TestCase): | ||||||
|     def setUp(self): |     def setUp(self): | ||||||
|         """Set test cases environment up.""" |         """Set test cases environment up.""" | ||||||
|         self.provider = Callable(self.example, |         self.provider = Callable(self.example, | ||||||
|                                  Injection('arg1', 'a1'), |                                  KwArg('arg1', 'a1'), | ||||||
|                                  Injection('arg2', 'a2'), |                                  KwArg('arg2', 'a2'), | ||||||
|                                  Injection('arg3', 'a3')) |                                  KwArg('arg3', 'a3')) | ||||||
| 
 | 
 | ||||||
|     def test_init_with_not_callable(self): |     def test_init_with_not_callable(self): | ||||||
|         """Test creation of provider with not callable.""" |         """Test creation of provider with not callable.""" | ||||||
|  | @ -418,7 +417,7 @@ class CallableTests(unittest.TestCase): | ||||||
|     def test_call_with_args(self): |     def test_call_with_args(self): | ||||||
|         """Test provider call with kwargs priority.""" |         """Test provider call with kwargs priority.""" | ||||||
|         provider = Callable(self.example, |         provider = Callable(self.example, | ||||||
|                             Injection('arg3', 'a3')) |                             KwArg('arg3', 'a3')) | ||||||
|         self.assertEqual(provider(1, 2), (1, 2, 'a3')) |         self.assertEqual(provider(1, 2), (1, 2, 'a3')) | ||||||
| 
 | 
 | ||||||
|     def test_call_with_kwargs_priority(self): |     def test_call_with_kwargs_priority(self): | ||||||
|  |  | ||||||
|  | @ -5,14 +5,15 @@ import unittest2 as unittest | ||||||
| from objects.utils import is_provider | from objects.utils import is_provider | ||||||
| from objects.utils import ensure_is_provider | from objects.utils import ensure_is_provider | ||||||
| from objects.utils import is_injection | from objects.utils import is_injection | ||||||
| from objects.utils import is_init_arg_injection | from objects.utils import ensure_is_injection | ||||||
|  | from objects.utils import is_kwarg_injection | ||||||
| from objects.utils import is_attribute_injection | from objects.utils import is_attribute_injection | ||||||
| from objects.utils import is_method_injection | from objects.utils import is_method_injection | ||||||
| 
 | 
 | ||||||
| from objects.providers import Provider | from objects.providers import Provider | ||||||
| 
 | 
 | ||||||
| from objects.injections import Injection | from objects.injections import Injection | ||||||
| from objects.injections import InitArg | from objects.injections import KwArg | ||||||
| from objects.injections import Attribute | from objects.injections import Attribute | ||||||
| from objects.injections import Method | from objects.injections import Method | ||||||
| 
 | 
 | ||||||
|  | @ -72,7 +73,7 @@ class IsInjectionTests(unittest.TestCase): | ||||||
| 
 | 
 | ||||||
|     def test_with_subclass_instances(self): |     def test_with_subclass_instances(self): | ||||||
|         """Test with subclass instances.""" |         """Test with subclass instances.""" | ||||||
|         self.assertTrue(is_injection(InitArg('name', 'value'))) |         self.assertTrue(is_injection(KwArg('name', 'value'))) | ||||||
|         self.assertTrue(is_injection(Attribute('name', 'value'))) |         self.assertTrue(is_injection(Attribute('name', 'value'))) | ||||||
|         self.assertTrue(is_injection(Method('name', 'value'))) |         self.assertTrue(is_injection(Method('name', 'value'))) | ||||||
| 
 | 
 | ||||||
|  | @ -89,29 +90,51 @@ class IsInjectionTests(unittest.TestCase): | ||||||
|         self.assertFalse(is_injection(object())) |         self.assertFalse(is_injection(object())) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class IsInitArgInjectionTests(unittest.TestCase): | class EnsureIsInjectionTests(unittest.TestCase): | ||||||
| 
 | 
 | ||||||
|     """`is_init_arg_injection()` test cases.""" |     """`ensure_is_injection` test cases.""" | ||||||
| 
 | 
 | ||||||
|     def test_with_instance(self): |     def test_with_instance(self): | ||||||
|         """Test with instance.""" |         """Test with instance.""" | ||||||
|         self.assertTrue(is_init_arg_injection(InitArg('name', 'value'))) |         injection = Injection('name', 'value') | ||||||
|  |         self.assertIs(ensure_is_injection(injection), injection) | ||||||
| 
 | 
 | ||||||
|     def test_with_class(self): |     def test_with_class(self): | ||||||
|         """Test with class.""" |         """Test with class.""" | ||||||
|         self.assertFalse(is_init_arg_injection(InitArg)) |         self.assertRaises(Error, ensure_is_injection, Injection) | ||||||
| 
 |  | ||||||
|     def test_with_parent_class(self): |  | ||||||
|         """Test with parent class.""" |  | ||||||
|         self.assertFalse(is_init_arg_injection(Injection)) |  | ||||||
| 
 | 
 | ||||||
|     def test_with_string(self): |     def test_with_string(self): | ||||||
|         """Test with string.""" |         """Test with string.""" | ||||||
|         self.assertFalse(is_init_arg_injection('some_string')) |         self.assertRaises(Error, ensure_is_injection, 'some_string') | ||||||
| 
 | 
 | ||||||
|     def test_with_object(self): |     def test_with_object(self): | ||||||
|         """Test with object.""" |         """Test with object.""" | ||||||
|         self.assertFalse(is_init_arg_injection(object())) |         self.assertRaises(Error, ensure_is_injection, object()) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class IsKwArgInjectionTests(unittest.TestCase): | ||||||
|  | 
 | ||||||
|  |     """`is_kwarg_injection()` test cases.""" | ||||||
|  | 
 | ||||||
|  |     def test_with_instance(self): | ||||||
|  |         """Test with instance.""" | ||||||
|  |         self.assertTrue(is_kwarg_injection(KwArg('name', 'value'))) | ||||||
|  | 
 | ||||||
|  |     def test_with_class(self): | ||||||
|  |         """Test with class.""" | ||||||
|  |         self.assertFalse(is_kwarg_injection(KwArg)) | ||||||
|  | 
 | ||||||
|  |     def test_with_parent_class(self): | ||||||
|  |         """Test with parent class.""" | ||||||
|  |         self.assertFalse(is_kwarg_injection(Injection)) | ||||||
|  | 
 | ||||||
|  |     def test_with_string(self): | ||||||
|  |         """Test with string.""" | ||||||
|  |         self.assertFalse(is_kwarg_injection('some_string')) | ||||||
|  | 
 | ||||||
|  |     def test_with_object(self): | ||||||
|  |         """Test with object.""" | ||||||
|  |         self.assertFalse(is_kwarg_injection(object())) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class IsAttributeInjectionTests(unittest.TestCase): | class IsAttributeInjectionTests(unittest.TestCase): | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user