import contextlib import json import os.path import tempfile import unittest import yaml from dependency_injector import containers, providers, errors class FromSchemaTests(unittest.TestCase): def test(self): 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, }, }, }, }, ) self.assertIsInstance(container.provider1, providers.Factory) self.assertIs(container.provider1.provides, list) self.assertEqual(container.provider1.args, (1, 2, 3)) self.assertIsInstance(container.provider2, providers.Factory) self.assertIs(container.provider2.provides, dict) self.assertEqual(container.provider2.kwargs, {"one": container.provider1, "two": 2}) class FromYamlSchemaTests(unittest.TestCase): def test(self): container = containers.DynamicContainer() with tempfile.TemporaryDirectory() as tmp_dir: schema_path = os.path.join(tmp_dir, "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) self.assertIsInstance(container.provider1, providers.Factory) self.assertIs(container.provider1.provides, list) self.assertEqual(container.provider1.args, (1, 2, 3)) self.assertIsInstance(container.provider2, providers.Factory) self.assertIs(container.provider2.provides, dict) self.assertEqual(container.provider2.kwargs, {"one": container.provider1, "two": 2}) def test_with_loader(self): container = containers.DynamicContainer() with tempfile.TemporaryDirectory() as tmp_dir: schema_path = os.path.join(tmp_dir, "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) self.assertIsInstance(container.provider, providers.Factory) self.assertIs(container.provider.provides, list) self.assertEqual(container.provider.args, (1, 2, 3)) def test_no_yaml_installed(self): @contextlib.contextmanager def no_yaml_module(): containers.yaml = None yield containers.yaml = yaml container = containers.DynamicContainer() with no_yaml_module(): with self.assertRaises(errors.Error) as error: container.from_yaml_schema("./no-yaml-installed.yml") self.assertEqual( error.exception.args[0], "Unable to load yaml schema - PyYAML is not installed. " "Install PyYAML or install Dependency Injector with yaml extras: " "\"pip install dependency-injector[yaml]\"", ) class FromJsonSchemaTests(unittest.TestCase): def test(self): container = containers.DynamicContainer() with tempfile.TemporaryDirectory() as tmp_dir: schema_path = os.path.join(tmp_dir, "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) self.assertIsInstance(container.provider1, providers.Factory) self.assertIs(container.provider1.provides, list) self.assertEqual(container.provider1.args, (1, 2, 3)) self.assertIsInstance(container.provider2, providers.Factory) self.assertIs(container.provider2.provides, dict) self.assertEqual(container.provider2.kwargs, {"one": container.provider1, "two": 2})