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,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()

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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,
}, },
}, },