Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 0 additions & 12 deletions src/pypendency/builder.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from typing import Optional, List

from pypendency import exceptions
from pypendency.container import Container
from pypendency.definition import Definition

Expand All @@ -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()
11 changes: 11 additions & 0 deletions src/pypendency/container.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand Down
59 changes: 0 additions & 59 deletions tests/test_builder.py
Original file line number Diff line number Diff line change
@@ -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)
36 changes: 31 additions & 5 deletions tests/test_container.py
Original file line number Diff line number Diff line change
Expand Up @@ -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),
},
)

Expand Down Expand Up @@ -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),
},
)
])
Expand All @@ -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,
},
]

Expand All @@ -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)