mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2025-02-11 17:10:57 +03:00
Update tests to match latest schemas
This commit is contained in:
parent
8cac34b1c0
commit
2a3b670d1d
|
@ -6,28 +6,36 @@ from typing import Dict, Any, Type, Optional
|
||||||
from . import containers, providers
|
from . import containers, providers
|
||||||
|
|
||||||
|
|
||||||
Schema = Dict[Any, Any]
|
ContainerSchema = Dict[Any, Any]
|
||||||
|
ProviderSchema = Dict[Any, Any]
|
||||||
|
|
||||||
|
|
||||||
class SchemaProcessorV1:
|
class SchemaProcessorV1:
|
||||||
|
|
||||||
def __init__(self, schema: Schema) -> None:
|
def __init__(self, schema: ContainerSchema) -> None:
|
||||||
self._schema = schema
|
self._schema = schema
|
||||||
self._container = containers.DynamicContainer()
|
self._container = containers.DynamicContainer()
|
||||||
|
|
||||||
def process(self):
|
def process(self):
|
||||||
"""Process schema."""
|
"""Process schema."""
|
||||||
self._create_providers(self._schema)
|
self._create_providers(self._schema['container'])
|
||||||
self._setup_injections(self._schema)
|
self._setup_injections(self._schema['container'])
|
||||||
|
|
||||||
def get_providers(self):
|
def get_providers(self):
|
||||||
"""Return providers."""
|
"""Return providers."""
|
||||||
return self._container.providers
|
return self._container.providers
|
||||||
|
|
||||||
def _create_providers(self, schema: Schema, container: Optional[containers.Container] = None) -> None:
|
def _create_providers(
|
||||||
|
self,
|
||||||
|
provider_schema: ProviderSchema,
|
||||||
|
container: Optional[containers.Container] = None,
|
||||||
|
) -> None:
|
||||||
if container is None:
|
if container is None:
|
||||||
container = self._container
|
container = self._container
|
||||||
for provider_name, data in schema['providers'].items():
|
for provider_name, data in provider_schema.items():
|
||||||
|
provider = None
|
||||||
|
|
||||||
|
if 'provider' in data:
|
||||||
provider_type = _get_provider_cls(data['provider'])
|
provider_type = _get_provider_cls(data['provider'])
|
||||||
args = []
|
args = []
|
||||||
|
|
||||||
|
@ -37,21 +45,25 @@ class SchemaProcessorV1:
|
||||||
if provides:
|
if provides:
|
||||||
args.append(provides)
|
args.append(provides)
|
||||||
|
|
||||||
if provider_type is providers.Container:
|
|
||||||
provides = containers.DynamicContainer
|
|
||||||
args.append(provides)
|
|
||||||
|
|
||||||
provider = provider_type(*args)
|
provider = provider_type(*args)
|
||||||
|
|
||||||
|
if provider is None:
|
||||||
|
provider = providers.Container(containers.DynamicContainer)
|
||||||
|
|
||||||
container.set_provider(provider_name, provider)
|
container.set_provider(provider_name, provider)
|
||||||
|
|
||||||
if isinstance(provider, providers.Container):
|
if isinstance(provider, providers.Container):
|
||||||
self._create_providers(schema=data, container=provider)
|
self._create_providers(provider_schema=data, container=provider)
|
||||||
|
|
||||||
def _setup_injections(self, schema: Schema, container: Optional[containers.Container] = None) -> None:
|
def _setup_injections(
|
||||||
|
self,
|
||||||
|
provider_schema: ProviderSchema,
|
||||||
|
container: Optional[containers.Container] = None,
|
||||||
|
) -> None:
|
||||||
if container is None:
|
if container is None:
|
||||||
container = self._container
|
container = self._container
|
||||||
|
|
||||||
for provider_name, data in schema['providers'].items():
|
for provider_name, data in provider_schema.items():
|
||||||
provider = getattr(container, provider_name)
|
provider = getattr(container, provider_name)
|
||||||
args = []
|
args = []
|
||||||
kwargs = {}
|
kwargs = {}
|
||||||
|
@ -61,10 +73,22 @@ class SchemaProcessorV1:
|
||||||
for arg in arg_injections:
|
for arg in arg_injections:
|
||||||
injection = None
|
injection = None
|
||||||
|
|
||||||
if isinstance(arg, str):
|
if isinstance(arg, str) and arg.startswith('container.'):
|
||||||
injection = self._resolve_provider(arg)
|
injection = self._resolve_provider(arg[len('container.'):])
|
||||||
|
|
||||||
# TODO: add inline injections
|
# TODO: refactoring
|
||||||
|
if isinstance(arg, dict):
|
||||||
|
provider_args = []
|
||||||
|
provider_type = _get_provider_cls(arg.get('provider'))
|
||||||
|
provides = arg.get('provides')
|
||||||
|
if provides:
|
||||||
|
provides = _import_string(provides)
|
||||||
|
if provides:
|
||||||
|
provider_args.append(provides)
|
||||||
|
for provider_arg in arg.get('args', []):
|
||||||
|
if isinstance(provider_arg, str) and provider_arg.startswith('container.'):
|
||||||
|
provider_args.append(self._resolve_provider(provider_arg[len('container.'):]))
|
||||||
|
injection = provider_type(*provider_args)
|
||||||
|
|
||||||
if not injection:
|
if not injection:
|
||||||
injection = arg
|
injection = arg
|
||||||
|
@ -78,8 +102,8 @@ class SchemaProcessorV1:
|
||||||
for name, arg in kwarg_injections.items():
|
for name, arg in kwarg_injections.items():
|
||||||
injection = None
|
injection = None
|
||||||
|
|
||||||
if isinstance(arg, str):
|
if isinstance(arg, str) and arg.startswith('container.'):
|
||||||
injection = self._resolve_provider(arg)
|
injection = self._resolve_provider(arg[len('container.'):])
|
||||||
|
|
||||||
# TODO: refactoring
|
# TODO: refactoring
|
||||||
if isinstance(arg, dict):
|
if isinstance(arg, dict):
|
||||||
|
@ -91,7 +115,8 @@ class SchemaProcessorV1:
|
||||||
if provides:
|
if provides:
|
||||||
provider_args.append(provides)
|
provider_args.append(provides)
|
||||||
for provider_arg in arg.get('args', []):
|
for provider_arg in arg.get('args', []):
|
||||||
provider_args.append(self._resolve_provider(provider_arg))
|
if isinstance(provider_arg, str) and provider_arg.startswith('container.'):
|
||||||
|
provider_args.append(self._resolve_provider(provider_arg[len('container.'):]))
|
||||||
injection = provider_type(*provider_args)
|
injection = provider_type(*provider_args)
|
||||||
|
|
||||||
if not injection:
|
if not injection:
|
||||||
|
@ -102,7 +127,7 @@ class SchemaProcessorV1:
|
||||||
provider.add_kwargs(**kwargs)
|
provider.add_kwargs(**kwargs)
|
||||||
|
|
||||||
if isinstance(provider, providers.Container):
|
if isinstance(provider, providers.Container):
|
||||||
self._setup_injections(schema=data, container=provider)
|
self._setup_injections(provider_schema=data, container=provider)
|
||||||
|
|
||||||
def _resolve_provider(self, name: str) -> Optional[providers.Provider]:
|
def _resolve_provider(self, name: str) -> Optional[providers.Provider]:
|
||||||
segments = name.split('.')
|
segments = name.split('.')
|
||||||
|
@ -127,7 +152,7 @@ class SchemaProcessorV1:
|
||||||
return provider
|
return provider
|
||||||
|
|
||||||
|
|
||||||
def build_schema(schema: Schema) -> Dict[str, providers.Provider]:
|
def build_schema(schema: ContainerSchema) -> Dict[str, providers.Provider]:
|
||||||
"""Build provider schema."""
|
"""Build provider schema."""
|
||||||
schema_processor = SchemaProcessorV1(schema)
|
schema_processor = SchemaProcessorV1(schema)
|
||||||
schema_processor.process()
|
schema_processor.process()
|
||||||
|
|
|
@ -1,33 +1,30 @@
|
||||||
version: "1"
|
version: "1"
|
||||||
|
|
||||||
providers:
|
container:
|
||||||
|
|
||||||
core:
|
core:
|
||||||
provider: Container
|
|
||||||
providers:
|
|
||||||
config:
|
config:
|
||||||
provider: Configuration
|
provider: Configuration
|
||||||
|
|
||||||
gateways:
|
gateways:
|
||||||
provider: Container
|
|
||||||
providers:
|
|
||||||
database_client:
|
database_client:
|
||||||
provider: Singleton
|
provider: Singleton
|
||||||
provides: sqlite3.connect
|
provides: sqlite3.connect
|
||||||
args:
|
args:
|
||||||
- core.config.database.dsn
|
- provider: Callable
|
||||||
|
provides: schemasample.utils.return_
|
||||||
|
args:
|
||||||
|
- container.core.config.database.dsn
|
||||||
|
|
||||||
s3_client:
|
s3_client:
|
||||||
provider: Singleton
|
provider: Singleton
|
||||||
provides: boto3.client
|
provides: boto3.client
|
||||||
kwargs:
|
kwargs:
|
||||||
service_name: s3
|
service_name: s3
|
||||||
aws_access_key_id: core.config.aws.access_key_id
|
aws_access_key_id: container.core.config.aws.access_key_id
|
||||||
aws_secret_access_key: core.config.aws.secret_access_key
|
aws_secret_access_key: container.core.config.aws.secret_access_key
|
||||||
|
|
||||||
services:
|
services:
|
||||||
provider: Container
|
|
||||||
providers:
|
|
||||||
user:
|
user:
|
||||||
provider: Factory
|
provider: Factory
|
||||||
provides: schemasample.services.UserService
|
provides: schemasample.services.UserService
|
||||||
|
@ -36,7 +33,7 @@ providers:
|
||||||
provider: Callable
|
provider: Callable
|
||||||
provides: schemasample.utils.return_
|
provides: schemasample.utils.return_
|
||||||
args:
|
args:
|
||||||
- gateways.database_client
|
- container.gateways.database_client
|
||||||
|
|
||||||
auth:
|
auth:
|
||||||
provider: Factory
|
provider: Factory
|
||||||
|
@ -46,8 +43,8 @@ providers:
|
||||||
provider: Callable
|
provider: Callable
|
||||||
provides: schemasample.utils.return_
|
provides: schemasample.utils.return_
|
||||||
args:
|
args:
|
||||||
- gateways.database_client
|
- container.gateways.database_client
|
||||||
token_ttl: core.config.auth.token_ttl.as_int()
|
token_ttl: container.core.config.auth.token_ttl.as_int()
|
||||||
|
|
||||||
photo:
|
photo:
|
||||||
provider: Factory
|
provider: Factory
|
||||||
|
@ -57,5 +54,5 @@ providers:
|
||||||
provider: Callable
|
provider: Callable
|
||||||
provides: schemasample.utils.return_
|
provides: schemasample.utils.return_
|
||||||
args:
|
args:
|
||||||
- gateways.database_client
|
- container.gateways.database_client
|
||||||
s3: gateways.s3_client
|
s3: container.gateways.s3_client
|
||||||
|
|
|
@ -1,38 +1,34 @@
|
||||||
version: "1"
|
version: "1"
|
||||||
|
|
||||||
providers:
|
container:
|
||||||
|
|
||||||
services:
|
services:
|
||||||
provider: Container
|
|
||||||
providers:
|
|
||||||
user:
|
user:
|
||||||
provider: Factory
|
provider: Factory
|
||||||
provides: schemasample.services.UserService
|
provides: schemasample.services.UserService
|
||||||
kwargs:
|
kwargs:
|
||||||
db: gateways.database_client
|
db: container.gateways.database_client
|
||||||
|
|
||||||
auth:
|
auth:
|
||||||
provider: Factory
|
provider: Factory
|
||||||
provides: schemasample.services.AuthService
|
provides: schemasample.services.AuthService
|
||||||
kwargs:
|
kwargs:
|
||||||
db: gateways.database_client
|
db: container.gateways.database_client
|
||||||
token_ttl: core.config.auth.token_ttl.as_int()
|
token_ttl: container.core.config.auth.token_ttl.as_int()
|
||||||
|
|
||||||
photo:
|
photo:
|
||||||
provider: Factory
|
provider: Factory
|
||||||
provides: schemasample.services.PhotoService
|
provides: schemasample.services.PhotoService
|
||||||
kwargs:
|
kwargs:
|
||||||
db: gateways.database_client
|
db: container.gateways.database_client
|
||||||
s3: gateways.s3_client
|
s3: container.gateways.s3_client
|
||||||
|
|
||||||
gateways:
|
gateways:
|
||||||
provider: Container
|
|
||||||
providers:
|
|
||||||
database_client:
|
database_client:
|
||||||
provider: Singleton
|
provider: Singleton
|
||||||
provides: sqlite3.connect
|
provides: sqlite3.connect
|
||||||
args:
|
args:
|
||||||
- core.config.database.dsn
|
- container.core.config.database.dsn
|
||||||
|
|
||||||
s3_client:
|
s3_client:
|
||||||
provider: Singleton
|
provider: Singleton
|
||||||
|
@ -43,7 +39,5 @@ providers:
|
||||||
aws_secret_access_key: core.config.aws.secret_access_key
|
aws_secret_access_key: core.config.aws.secret_access_key
|
||||||
|
|
||||||
core:
|
core:
|
||||||
provider: Container
|
|
||||||
providers:
|
|
||||||
config:
|
config:
|
||||||
provider: Configuration
|
provider: Configuration
|
||||||
|
|
|
@ -1,49 +1,43 @@
|
||||||
version: "1"
|
version: "1"
|
||||||
|
|
||||||
providers:
|
container:
|
||||||
|
|
||||||
core:
|
core:
|
||||||
provider: Container
|
|
||||||
providers:
|
|
||||||
config:
|
config:
|
||||||
provider: Configuration
|
provider: Configuration
|
||||||
|
|
||||||
gateways:
|
gateways:
|
||||||
provider: Container
|
|
||||||
providers:
|
|
||||||
database_client:
|
database_client:
|
||||||
provider: Singleton
|
provider: Singleton
|
||||||
provides: sqlite3.connect
|
provides: sqlite3.connect
|
||||||
args:
|
args:
|
||||||
- core.config.database.dsn
|
- container.core.config.database.dsn
|
||||||
|
|
||||||
s3_client:
|
s3_client:
|
||||||
provider: Singleton
|
provider: Singleton
|
||||||
provides: boto3.client
|
provides: boto3.client
|
||||||
kwargs:
|
kwargs:
|
||||||
service_name: s3
|
service_name: s3
|
||||||
aws_access_key_id: core.config.aws.access_key_id
|
aws_access_key_id: container.core.config.aws.access_key_id
|
||||||
aws_secret_access_key: core.config.aws.secret_access_key
|
aws_secret_access_key: container.core.config.aws.secret_access_key
|
||||||
|
|
||||||
services:
|
services:
|
||||||
provider: Container
|
|
||||||
providers:
|
|
||||||
user:
|
user:
|
||||||
provider: Factory
|
provider: Factory
|
||||||
provides: schemasample.services.UserService
|
provides: schemasample.services.UserService
|
||||||
kwargs:
|
kwargs:
|
||||||
db: gateways.database_client
|
db: container.gateways.database_client
|
||||||
|
|
||||||
auth:
|
auth:
|
||||||
provider: Factory
|
provider: Factory
|
||||||
provides: schemasample.services.AuthService
|
provides: schemasample.services.AuthService
|
||||||
kwargs:
|
kwargs:
|
||||||
db: gateways.database_client
|
db: container.gateways.database_client
|
||||||
token_ttl: core.config.auth.token_ttl.as_int()
|
token_ttl: container.core.config.auth.token_ttl.as_int()
|
||||||
|
|
||||||
photo:
|
photo:
|
||||||
provider: Factory
|
provider: Factory
|
||||||
provides: schemasample.services.PhotoService
|
provides: schemasample.services.PhotoService
|
||||||
kwargs:
|
kwargs:
|
||||||
db: gateways.database_client
|
db: container.gateways.database_client
|
||||||
s3: gateways.s3_client
|
s3: container.gateways.s3_client
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
version: "1"
|
version: "1"
|
||||||
|
|
||||||
providers:
|
container:
|
||||||
config:
|
config:
|
||||||
provider: Configuration
|
provider: Configuration
|
||||||
|
|
||||||
|
@ -8,32 +8,32 @@ providers:
|
||||||
provider: Singleton
|
provider: Singleton
|
||||||
provides: sqlite3.connect
|
provides: sqlite3.connect
|
||||||
args:
|
args:
|
||||||
- config.database.dsn
|
- container.config.database.dsn
|
||||||
|
|
||||||
s3_client:
|
s3_client:
|
||||||
provider: Singleton
|
provider: Singleton
|
||||||
provides: boto3.client
|
provides: boto3.client
|
||||||
kwargs:
|
kwargs:
|
||||||
service_name: s3
|
service_name: s3
|
||||||
aws_access_key_id: config.aws.access_key_id
|
aws_access_key_id: container.config.aws.access_key_id
|
||||||
aws_secret_access_key: config.aws.secret_access_key
|
aws_secret_access_key: container.config.aws.secret_access_key
|
||||||
|
|
||||||
user_service:
|
user_service:
|
||||||
provider: Factory
|
provider: Factory
|
||||||
provides: schemasample.services.UserService
|
provides: schemasample.services.UserService
|
||||||
kwargs:
|
kwargs:
|
||||||
db: database_client
|
db: container.database_client
|
||||||
|
|
||||||
auth_service:
|
auth_service:
|
||||||
provider: Factory
|
provider: Factory
|
||||||
provides: schemasample.services.AuthService
|
provides: schemasample.services.AuthService
|
||||||
kwargs:
|
kwargs:
|
||||||
db: database_client
|
db: container.database_client
|
||||||
token_ttl: config.auth.token_ttl.as_int()
|
token_ttl: container.config.auth.token_ttl.as_int()
|
||||||
|
|
||||||
photo_service:
|
photo_service:
|
||||||
provider: Factory
|
provider: Factory
|
||||||
provides: schemasample.services.PhotoService
|
provides: schemasample.services.PhotoService
|
||||||
kwargs:
|
kwargs:
|
||||||
db: database_client
|
db: container.database_client
|
||||||
s3: s3_client
|
s3: container.s3_client
|
||||||
|
|
|
@ -15,7 +15,7 @@ class FromSchemaTests(unittest.TestCase):
|
||||||
container.from_schema(
|
container.from_schema(
|
||||||
{
|
{
|
||||||
'version': '1',
|
'version': '1',
|
||||||
'providers': {
|
'container': {
|
||||||
'provider1': {
|
'provider1': {
|
||||||
'provider': 'Factory',
|
'provider': 'Factory',
|
||||||
'provides': 'list',
|
'provides': 'list',
|
||||||
|
@ -25,7 +25,7 @@ class FromSchemaTests(unittest.TestCase):
|
||||||
'provider': 'Factory',
|
'provider': 'Factory',
|
||||||
'provides': 'dict',
|
'provides': 'dict',
|
||||||
'kwargs': {
|
'kwargs': {
|
||||||
'one': 'provider1',
|
'one': 'container.provider1',
|
||||||
'two': 2,
|
'two': 2,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -52,7 +52,7 @@ class FromYamlSchemaTests(unittest.TestCase):
|
||||||
with open(schema_path, 'w') as file:
|
with open(schema_path, 'w') as file:
|
||||||
file.write("""
|
file.write("""
|
||||||
version: "1"
|
version: "1"
|
||||||
providers:
|
container:
|
||||||
provider1:
|
provider1:
|
||||||
provider: Factory
|
provider: Factory
|
||||||
provides: list
|
provides: list
|
||||||
|
@ -64,7 +64,7 @@ class FromYamlSchemaTests(unittest.TestCase):
|
||||||
provider: Factory
|
provider: Factory
|
||||||
provides: dict
|
provides: dict
|
||||||
kwargs:
|
kwargs:
|
||||||
one: provider1
|
one: container.provider1
|
||||||
two: 2
|
two: 2
|
||||||
""")
|
""")
|
||||||
|
|
||||||
|
@ -86,7 +86,7 @@ class FromYamlSchemaTests(unittest.TestCase):
|
||||||
with open(schema_path, 'w') as file:
|
with open(schema_path, 'w') as file:
|
||||||
file.write("""
|
file.write("""
|
||||||
version: "1"
|
version: "1"
|
||||||
providers:
|
container:
|
||||||
provider:
|
provider:
|
||||||
provider: Factory
|
provider: Factory
|
||||||
provides: list
|
provides: list
|
||||||
|
@ -131,7 +131,7 @@ class FromJsonSchemaTests(unittest.TestCase):
|
||||||
json.dumps(
|
json.dumps(
|
||||||
{
|
{
|
||||||
'version': '1',
|
'version': '1',
|
||||||
'providers': {
|
'container': {
|
||||||
'provider1': {
|
'provider1': {
|
||||||
'provider': 'Factory',
|
'provider': 'Factory',
|
||||||
'provides': 'list',
|
'provides': 'list',
|
||||||
|
@ -141,7 +141,7 @@ class FromJsonSchemaTests(unittest.TestCase):
|
||||||
'provider': 'Factory',
|
'provider': 'Factory',
|
||||||
'provides': 'dict',
|
'provides': 'dict',
|
||||||
'kwargs': {
|
'kwargs': {
|
||||||
'one': 'provider1',
|
'one': 'container.provider1',
|
||||||
'two': 2,
|
'two': 2,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue
Block a user