def test_from_yaml_schema(container: containers.DynamicContainer, tmp_path: pathlib.Path): schema_path = tmp_path / "schema.yml" with open(schema_path, "w") as file: file.write(""" version: "1" container: provider1: provider: Factory provides: list args: - 1 - 2 - 3 provider2: provider: Factory provides: dict kwargs: one: container.provider1 two: 2 """) container.from_yaml_schema(schema_path) assert isinstance(container.provider1, providers.Factory) assert container.provider1.provides == list assert container.provider1.args == (1, 2, 3) assert isinstance(container.provider2, providers.Factory) assert container.provider2.provides is dict assert container.provider2.kwargs == {"one": container.provider1, "two": 2}
def test_from_schema(container: containers.DynamicContainer): container.from_schema( { "version": "1", "container": { "provider1": { "provider": "Factory", "provides": "list", "args": [1, 2, 3], }, "provider2": { "provider": "Factory", "provides": "dict", "kwargs": { "one": "container.provider1", "two": 2, }, }, }, }, ) assert isinstance(container.provider1, providers.Factory) assert container.provider1.provides is list assert container.provider1.args == (1, 2, 3) assert isinstance(container.provider2, providers.Factory) assert container.provider2.provides is dict assert container.provider2.kwargs == {"one": container.provider1, "two": 2}
def test_from_json_schema(container: containers.DynamicContainer, tmp_path: pathlib.Path): schema_path = tmp_path / "schema.json" with open(schema_path, "w") as file: file.write( json.dumps( { "version": "1", "container": { "provider1": { "provider": "Factory", "provides": "list", "args": [1, 2, 3], }, "provider2": { "provider": "Factory", "provides": "dict", "kwargs": { "one": "container.provider1", "two": 2, }, }, }, }, indent=4, ), ) container.from_json_schema(schema_path) assert isinstance(container.provider1, providers.Factory) assert container.provider1.provides is list assert container.provider1.args == (1, 2, 3) assert isinstance(container.provider2, providers.Factory) assert container.provider2.provides is dict assert container.provider2.kwargs == {"one": container.provider1, "two": 2}
def test_multiple_containers_with_inline_providers_schema( container: containers.DynamicContainer): container.from_yaml_schema( f"{SAMPLES_DIR}/schema/container-multiple-inline.yml") container.core.config.from_dict({ "database": { "dsn": ":memory:", }, "aws": { "access_key_id": "KEY", "secret_access_key": "SECRET", }, "auth": { "token_ttl": 3600, }, }) # User service user_service1 = container.services.user() user_service2 = container.services.user() assert isinstance(user_service1, UserService) assert isinstance(user_service2, UserService) assert user_service1 is not user_service2 assert isinstance(user_service1.db, sqlite3.Connection) assert isinstance(user_service2.db, sqlite3.Connection) assert user_service1.db is user_service2.db # Auth service auth_service1 = container.services.auth() auth_service2 = container.services.auth() assert isinstance(auth_service1, AuthService) assert isinstance(auth_service2, AuthService) assert auth_service1 is not auth_service2 assert isinstance(auth_service1.db, sqlite3.Connection) assert isinstance(auth_service2.db, sqlite3.Connection) assert auth_service1.db is auth_service2.db assert auth_service1.db is container.gateways.database_client() assert auth_service2.db is container.gateways.database_client() assert auth_service1.token_ttl == 3600 assert auth_service2.token_ttl == 3600 # Photo service photo_service1 = container.services.photo() photo_service2 = container.services.photo() assert isinstance(photo_service1, PhotoService) assert isinstance(photo_service2, PhotoService) assert photo_service1 is not photo_service2 assert isinstance(photo_service1.db, sqlite3.Connection) assert isinstance(photo_service2.db, sqlite3.Connection) assert photo_service1.db is photo_service2.db assert photo_service1.db is container.gateways.database_client() assert photo_service2.db is container.gateways.database_client() assert photo_service1.s3 is photo_service2.s3 assert photo_service1.s3 is container.gateways.s3_client() assert photo_service2.s3 is container.gateways.s3_client()
def test_schema_with_boto3_session(container: containers.DynamicContainer): container.from_yaml_schema( f"{SAMPLES_DIR}/schema/container-boto3-session.yml") container.config.from_dict( { "aws_access_key_id": "key", "aws_secret_access_key": "secret", "aws_session_token": "token", "aws_region_name": "us-east-1", }, ) assert container.s3_client().__class__.__name__ == "S3" assert container.sqs_client().__class__.__name__ == "SQS"
def test_from_yaml_schema_no_yaml_installed(container: containers.DynamicContainer): @contextlib.contextmanager def no_yaml_module(): containers.yaml = None yield containers.yaml = yaml error_message = re.escape( "Unable to load yaml schema - PyYAML is not installed. " "Install PyYAML or install Dependency Injector with yaml extras: " "\"pip install dependency-injector[yaml]\"" ) with no_yaml_module(): with raises(errors.Error, match=error_message): container.from_yaml_schema("./no-yaml-installed.yml")
def test_from_yaml_schema_with_loader(container: containers.DynamicContainer, tmp_path: pathlib.Path): schema_path = tmp_path / "schema.yml" with open(schema_path, "w") as file: file.write(""" version: "1" container: provider: provider: Factory provides: list args: [1, 2, 3] """) container.from_yaml_schema(schema_path, loader=yaml.Loader) assert isinstance(container.provider, providers.Factory) assert container.provider.provides is list assert container.provider.args == (1, 2, 3)
def construct_device_container(dev_definitions): devices = DynamicContainer() for definition in dev_definitions: provider = _providers[definition['strategy']]( get_class(definition['class']), ) setattr(devices, definition['name'],) return devices