diff --git a/src/pypendency/builder.py b/src/pypendency/builder.py index 7c1ca60..4f8803d 100644 --- a/src/pypendency/builder.py +++ b/src/pypendency/builder.py @@ -1,6 +1,5 @@ from typing import Optional, List -from pypendency import exceptions from pypendency.container import Container from pypendency.definition import Definition @@ -19,16 +18,5 @@ def get_container_instance(cls): return cls._instance - def set_definition(self, definition: Definition) -> None: - if self.is_resolved(): - raise exceptions.ForbiddenChangeOnResolvedContainer() - - if self.has(definition.identifier): - raise exceptions.ServiceAlreadyDefined(definition.identifier) - - self._service_mapping.update({ - definition.identifier: definition - }) - container_builder = ContainerBuilder.get_container_instance() diff --git a/src/pypendency/container.py b/src/pypendency/container.py index a392b39..d87c57e 100644 --- a/src/pypendency/container.py +++ b/src/pypendency/container.py @@ -82,6 +82,17 @@ def get(self, identifier: str) -> Optional[object]: return self._do_get(identifier) + def set_definition(self, definition: Definition) -> None: + if self.is_resolved(): + raise exceptions.ForbiddenChangeOnResolvedContainer() + + if self.has(definition.identifier): + raise exceptions.ServiceAlreadyDefined(definition.identifier) + + self._service_mapping.update({ + definition.identifier: definition + }) + def _do_get(self, identifier: str) -> Optional[object]: empty = object() diff --git a/tests/test_builder.py b/tests/test_builder.py index 7b2b5a9..6c62a5e 100644 --- a/tests/test_builder.py +++ b/tests/test_builder.py @@ -1,72 +1,13 @@ from unittest import TestCase -from unittest.mock import sentinel -from pypendency import exceptions -from pypendency.argument import Argument from pypendency.builder import ContainerBuilder -from pypendency.definition import Definition -from pypendency.tag import Tag -from tests.resources.class_c import C - class TestContainerBuilder(TestCase): def setUp(self) -> None: self.container_builder = ContainerBuilder([]) - self.definition_a = Definition( - "example.A", - "tests.resources.class_a.A" - ) - self.definition_b = Definition( - "example.B", - "tests.resources.class_b.B", - [Argument.no_kw_argument("@example.A")], - ) - self.definition_c = Definition( - "example.C", - "tests.resources.class_c.C", - [ - Argument.no_kw_argument("@example.A"), - Argument("kw_arg", "test_param"), - Argument("b", "@example.B"), - ], - ) - self.definition_d = Definition( - "example.D", - "tests.resources.class_c.C", - [ - Argument.no_kw_argument("@example.A"), - Argument("kw_arg", "test_param"), - Argument("b", "@example.B"), - ], - { - Tag(identifier="test_tag_A", value=sentinel.test_tag_A_value), - }, - ) - self.definition_e = Definition( - "example.E", - "tests.resources.class_a.A", - tags={ - Tag(identifier="test_tag_A", value=sentinel.test_tag_A_value), - Tag(identifier="test_tag_B", value=sentinel.test_tag_B_value), - }, - ) def test_get_container_instance_retrieves_the_same_object(self): self.assertIs( ContainerBuilder.get_container_instance(), ContainerBuilder.get_container_instance() ) - - def test_set_definition_fails_if_resolved(self): - self.container_builder.resolve() - - with self.assertRaises(exceptions.ForbiddenChangeOnResolvedContainer): - self.container_builder.set_definition(self.definition_a) - - def test_set_definitions_sets_properly_so_services_can_be_retrieved(self): - self.container_builder.set_definition(self.definition_b) - self.container_builder.set_definition(self.definition_a) - self.container_builder.set_definition(self.definition_c) - self.container_builder.set_definition(self.definition_d) - self.container_builder.set_definition(self.definition_e) - self.assertIsInstance(self.container_builder.get("example.C"), C) diff --git a/tests/test_container.py b/tests/test_container.py index 1a52a93..1388963 100644 --- a/tests/test_container.py +++ b/tests/test_container.py @@ -36,8 +36,20 @@ def setUp(self) -> None: "example.D", "tests.resources.class_a.A", tags={ - Tag(identifier="test_tag_A", value=sentinel.test_tag_A), - Tag(identifier="test_tag_B", value=sentinel.test_tag_B), + Tag(identifier="test_tag_A", value=sentinel.test_tag_A_value), + Tag(identifier="test_tag_B", value=sentinel.test_tag_B_value), + }, + ) + self.definition_e = Definition( + "example.E", + "tests.resources.class_c.C", + [ + Argument.no_kw_argument("@example.A"), + Argument("kw_arg", "test_param"), + Argument("b", "@example.B"), + ], + { + Tag(identifier="test_tag_A", value=sentinel.test_tag_A_value), }, ) @@ -265,7 +277,7 @@ def test_get_services_identifiers_by_tag_name(self): "example.E", "tests.resources.class_a.A", tags={ - Tag(identifier="test_tag_A", value=sentinel.test_tag_A), + Tag(identifier="test_tag_A", value=sentinel.test_tag_A_value), }, ) ]) @@ -279,7 +291,7 @@ def test_get_services_identifiers_by_tag_name(self): { "msg": "With value", "tag_identifier": "test_tag_A", - "tag_value": sentinel.test_tag_A, + "tag_value": sentinel.test_tag_A_value, }, ] @@ -298,10 +310,24 @@ def test_get_services_identifiers_by_tag_name_raises_when_tag_doesnt_exist(self) "example.E", "tests.resources.class_a.A", tags={ - Tag(identifier="test_tag_A", value=sentinel.test_tag_A), + Tag(identifier="test_tag_A", value=sentinel.test_tag_A_value), }, ) ]) with self.assertRaises(exceptions.TagNotFoundInContainer): container.get_services_identifiers_by_tag_name("this_tag_shouldn't_exist", None) + + def test_set_definition_fails_if_resolved(self): + self.container.resolve() + + with self.assertRaises(exceptions.ForbiddenChangeOnResolvedContainer): + self.container.set_definition(self.definition_a) + + def test_set_definitions_sets_properly_so_services_can_be_retrieved(self): + self.container.set_definition(self.definition_b) + self.container.set_definition(self.definition_a) + self.container.set_definition(self.definition_c) + self.container.set_definition(self.definition_d) + self.container.set_definition(self.definition_e) + self.assertIsInstance(self.container.get("example.C"), C)