Update tests to match latest schemas

This commit is contained in:
Roman Mogylatov 2021-02-26 12:44:53 -05:00
parent 8cac34b1c0
commit 2a3b670d1d
6 changed files with 179 additions and 169 deletions

View File

@ -6,52 +6,64 @@ from typing import Dict, Any, Type, Optional
from . import containers, providers
Schema = Dict[Any, Any]
ContainerSchema = Dict[Any, Any]
ProviderSchema = Dict[Any, Any]
class SchemaProcessorV1:
def __init__(self, schema: Schema) -> None:
def __init__(self, schema: ContainerSchema) -> None:
self._schema = schema
self._container = containers.DynamicContainer()
def process(self):
"""Process schema."""
self._create_providers(self._schema)
self._setup_injections(self._schema)
self._create_providers(self._schema['container'])
self._setup_injections(self._schema['container'])
def get_providers(self):
"""Return 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:
container = self._container
for provider_name, data in schema['providers'].items():
provider_type = _get_provider_cls(data['provider'])
args = []
for provider_name, data in provider_schema.items():
provider = None
provides = data.get('provides')
if provides:
provides = _import_string(provides)
if 'provider' in data:
provider_type = _get_provider_cls(data['provider'])
args = []
provides = data.get('provides')
if provides:
args.append(provides)
provides = _import_string(provides)
if provides:
args.append(provides)
if provider_type is providers.Container:
provides = containers.DynamicContainer
args.append(provides)
provider = provider_type(*args)
if provider is None:
provider = providers.Container(containers.DynamicContainer)
provider = provider_type(*args)
container.set_provider(provider_name, provider)
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:
container = self._container
for provider_name, data in schema['providers'].items():
for provider_name, data in provider_schema.items():
provider = getattr(container, provider_name)
args = []
kwargs = {}
@ -61,10 +73,22 @@ class SchemaProcessorV1:
for arg in arg_injections:
injection = None
if isinstance(arg, str):
injection = self._resolve_provider(arg)
if isinstance(arg, str) and arg.startswith('container.'):
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:
injection = arg
@ -78,8 +102,8 @@ class SchemaProcessorV1:
for name, arg in kwarg_injections.items():
injection = None
if isinstance(arg, str):
injection = self._resolve_provider(arg)
if isinstance(arg, str) and arg.startswith('container.'):
injection = self._resolve_provider(arg[len('container.'):])
# TODO: refactoring
if isinstance(arg, dict):
@ -91,7 +115,8 @@ class SchemaProcessorV1:
if provides:
provider_args.append(provides)
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)
if not injection:
@ -102,7 +127,7 @@ class SchemaProcessorV1:
provider.add_kwargs(**kwargs)
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]:
segments = name.split('.')
@ -127,7 +152,7 @@ class SchemaProcessorV1:
return provider
def build_schema(schema: Schema) -> Dict[str, providers.Provider]:
def build_schema(schema: ContainerSchema) -> Dict[str, providers.Provider]:
"""Build provider schema."""
schema_processor = SchemaProcessorV1(schema)
schema_processor.process()

View File

@ -1,61 +1,58 @@
version: "1"
providers:
container:
core:
provider: Container
providers:
config:
provider: Configuration
config:
provider: Configuration
gateways:
provider: Container
providers:
database_client:
provider: Singleton
provides: sqlite3.connect
args:
- core.config.database.dsn
database_client:
provider: Singleton
provides: sqlite3.connect
args:
- provider: Callable
provides: schemasample.utils.return_
args:
- container.core.config.database.dsn
s3_client:
provider: Singleton
provides: boto3.client
kwargs:
service_name: s3
aws_access_key_id: core.config.aws.access_key_id
aws_secret_access_key: core.config.aws.secret_access_key
s3_client:
provider: Singleton
provides: boto3.client
kwargs:
service_name: s3
aws_access_key_id: container.core.config.aws.access_key_id
aws_secret_access_key: container.core.config.aws.secret_access_key
services:
provider: Container
providers:
user:
provider: Factory
provides: schemasample.services.UserService
kwargs:
db:
provider: Callable
provides: schemasample.utils.return_
args:
- gateways.database_client
user:
provider: Factory
provides: schemasample.services.UserService
kwargs:
db:
provider: Callable
provides: schemasample.utils.return_
args:
- container.gateways.database_client
auth:
provider: Factory
provides: schemasample.services.AuthService
kwargs:
db:
provider: Callable
provides: schemasample.utils.return_
args:
- gateways.database_client
token_ttl: core.config.auth.token_ttl.as_int()
auth:
provider: Factory
provides: schemasample.services.AuthService
kwargs:
db:
provider: Callable
provides: schemasample.utils.return_
args:
- container.gateways.database_client
token_ttl: container.core.config.auth.token_ttl.as_int()
photo:
provider: Factory
provides: schemasample.services.PhotoService
kwargs:
db:
provider: Callable
provides: schemasample.utils.return_
args:
- gateways.database_client
s3: gateways.s3_client
photo:
provider: Factory
provides: schemasample.services.PhotoService
kwargs:
db:
provider: Callable
provides: schemasample.utils.return_
args:
- container.gateways.database_client
s3: container.gateways.s3_client

View File

@ -1,49 +1,43 @@
version: "1"
providers:
container:
services:
provider: Container
providers:
user:
provider: Factory
provides: schemasample.services.UserService
kwargs:
db: gateways.database_client
user:
provider: Factory
provides: schemasample.services.UserService
kwargs:
db: container.gateways.database_client
auth:
provider: Factory
provides: schemasample.services.AuthService
kwargs:
db: gateways.database_client
token_ttl: core.config.auth.token_ttl.as_int()
auth:
provider: Factory
provides: schemasample.services.AuthService
kwargs:
db: container.gateways.database_client
token_ttl: container.core.config.auth.token_ttl.as_int()
photo:
provider: Factory
provides: schemasample.services.PhotoService
kwargs:
db: gateways.database_client
s3: gateways.s3_client
photo:
provider: Factory
provides: schemasample.services.PhotoService
kwargs:
db: container.gateways.database_client
s3: container.gateways.s3_client
gateways:
provider: Container
providers:
database_client:
provider: Singleton
provides: sqlite3.connect
args:
- core.config.database.dsn
database_client:
provider: Singleton
provides: sqlite3.connect
args:
- container.core.config.database.dsn
s3_client:
provider: Singleton
provides: boto3.client
kwargs:
service_name: s3
aws_access_key_id: core.config.aws.access_key_id
aws_secret_access_key: core.config.aws.secret_access_key
s3_client:
provider: Singleton
provides: boto3.client
kwargs:
service_name: s3
aws_access_key_id: core.config.aws.access_key_id
aws_secret_access_key: core.config.aws.secret_access_key
core:
provider: Container
providers:
config:
provider: Configuration
config:
provider: Configuration

View File

@ -1,49 +1,43 @@
version: "1"
providers:
container:
core:
provider: Container
providers:
config:
provider: Configuration
config:
provider: Configuration
gateways:
provider: Container
providers:
database_client:
provider: Singleton
provides: sqlite3.connect
args:
- core.config.database.dsn
database_client:
provider: Singleton
provides: sqlite3.connect
args:
- container.core.config.database.dsn
s3_client:
provider: Singleton
provides: boto3.client
kwargs:
service_name: s3
aws_access_key_id: core.config.aws.access_key_id
aws_secret_access_key: core.config.aws.secret_access_key
s3_client:
provider: Singleton
provides: boto3.client
kwargs:
service_name: s3
aws_access_key_id: container.core.config.aws.access_key_id
aws_secret_access_key: container.core.config.aws.secret_access_key
services:
provider: Container
providers:
user:
provider: Factory
provides: schemasample.services.UserService
kwargs:
db: gateways.database_client
user:
provider: Factory
provides: schemasample.services.UserService
kwargs:
db: container.gateways.database_client
auth:
provider: Factory
provides: schemasample.services.AuthService
kwargs:
db: gateways.database_client
token_ttl: core.config.auth.token_ttl.as_int()
auth:
provider: Factory
provides: schemasample.services.AuthService
kwargs:
db: container.gateways.database_client
token_ttl: container.core.config.auth.token_ttl.as_int()
photo:
provider: Factory
provides: schemasample.services.PhotoService
kwargs:
db: gateways.database_client
s3: gateways.s3_client
photo:
provider: Factory
provides: schemasample.services.PhotoService
kwargs:
db: container.gateways.database_client
s3: container.gateways.s3_client

View File

@ -1,6 +1,6 @@
version: "1"
providers:
container:
config:
provider: Configuration
@ -8,32 +8,32 @@ providers:
provider: Singleton
provides: sqlite3.connect
args:
- config.database.dsn
- container.config.database.dsn
s3_client:
provider: Singleton
provides: boto3.client
kwargs:
service_name: s3
aws_access_key_id: config.aws.access_key_id
aws_secret_access_key: config.aws.secret_access_key
aws_access_key_id: container.config.aws.access_key_id
aws_secret_access_key: container.config.aws.secret_access_key
user_service:
provider: Factory
provides: schemasample.services.UserService
kwargs:
db: database_client
db: container.database_client
auth_service:
provider: Factory
provides: schemasample.services.AuthService
kwargs:
db: database_client
token_ttl: config.auth.token_ttl.as_int()
db: container.database_client
token_ttl: container.config.auth.token_ttl.as_int()
photo_service:
provider: Factory
provides: schemasample.services.PhotoService
kwargs:
db: database_client
s3: s3_client
db: container.database_client
s3: container.s3_client

View File

@ -15,7 +15,7 @@ class FromSchemaTests(unittest.TestCase):
container.from_schema(
{
'version': '1',
'providers': {
'container': {
'provider1': {
'provider': 'Factory',
'provides': 'list',
@ -25,7 +25,7 @@ class FromSchemaTests(unittest.TestCase):
'provider': 'Factory',
'provides': 'dict',
'kwargs': {
'one': 'provider1',
'one': 'container.provider1',
'two': 2,
},
},
@ -52,7 +52,7 @@ class FromYamlSchemaTests(unittest.TestCase):
with open(schema_path, 'w') as file:
file.write("""
version: "1"
providers:
container:
provider1:
provider: Factory
provides: list
@ -64,7 +64,7 @@ class FromYamlSchemaTests(unittest.TestCase):
provider: Factory
provides: dict
kwargs:
one: provider1
one: container.provider1
two: 2
""")
@ -86,7 +86,7 @@ class FromYamlSchemaTests(unittest.TestCase):
with open(schema_path, 'w') as file:
file.write("""
version: "1"
providers:
container:
provider:
provider: Factory
provides: list
@ -131,7 +131,7 @@ class FromJsonSchemaTests(unittest.TestCase):
json.dumps(
{
'version': '1',
'providers': {
'container': {
'provider1': {
'provider': 'Factory',
'provides': 'list',
@ -141,7 +141,7 @@ class FromJsonSchemaTests(unittest.TestCase):
'provider': 'Factory',
'provides': 'dict',
'kwargs': {
'one': 'provider1',
'one': 'container.provider1',
'two': 2,
},
},