8000 Add container usage for all factory provider examples · bimec/python-dependency-injector@a7afa66 · GitHub
[go: up one dir, main page]

Skip to content

Commit a7afa66

Browse files
committed
Add container usage for all factory provider examples
1 parent 33b4416 commit a7afa66

File tree

8 files changed

+91
-61
lines changed

8 files changed

+91
-61
lines changed

docs/providers/factory.rst

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ all the classes and use special double-underscore ``__`` syntax for passing the
7373
.. literalinclude:: ../../examples/providers/factory_init_injections_underlying.py
7474
:language: python
7575
:lines: 3-
76-
:emphasize-lines: 24-35,39,42,45
76+
:emphasize-lines: 44,49
7777

7878
When you use ``__`` separator in the name of the keyword argument the ``Factory`` looks for
7979
the dependency with the same name as the left part of the ``__`` expression.
@@ -98,7 +98,7 @@ attribute of the provider that you're going to inject.
9898
.. literalinclude:: ../../examples/providers/factory_delegation.py
9999
:language: python
100100
:lines: 3-
101-
:emphasize-lines: 25
101+
:emphasize-lines: 28
102102

103103
.. note:: Any provider has a ``.provider`` attribute.
104104

@@ -135,7 +135,7 @@ provider with two peculiarities:
135135
.. literalinclude:: ../../examples/providers/abstract_factory.py
136136
:language: python
137137
:lines: 3-
138-
:emphasize-lines: 32
138+
:emphasize-lines: 34
139139

140140
Factory aggregate
141141
-----------------
@@ -155,7 +155,7 @@ rest of the arguments are passed to the delegated ``Factory``.
155155
.. literalinclude:: ../../examples/providers/factory_aggregate.py
156156
:language: python
157157
:lines: 3-
158-
:emphasize-lines: 31-35,43
158+
:emphasize-lines: 33-37,47
159159

160160
You can get a dictionary of the aggregated factories using the ``.factories`` attribute of the
161161
``FactoryAggregate``. To get a game factories dictionary from the previous example you can use

examples/providers/abstract_factory.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import random
66
from typing import List
77

8-
from dependency_injector import providers
8+
from dependency_injector import containers, providers
99

1010

1111
class AbstractCacheClient(metaclass=abc.ABCMeta):
@@ -31,18 +31,22 @@ class Service:
3131
cache: AbstractCacheClient
3232

3333

34-
cache_client_factory = providers.AbstractFactory(AbstractCacheClient)
35-
service_factory = providers.Factory(
36-
Service,
37-
cache=cache_client_factory,
38-
)
34+
class Container(containers.DeclarativeContainer):
35+
36+
cache_client_factory = providers.AbstractFactory(AbstractCacheClient)
37+
38+
service_factory = providers.Factory(
39+
Service,
40+
cache=cache_client_factory,
41+
)
3942

4043

4144
if __name__ == '__main__':
42-
cache_type = random.choice(['redis', 'memcached', None])
45+
container = Container()
4346

47+
cache_type = random.choice(['redis', 'memcached'])
4448
if cache_type == 'redis':
45-
cache_client_factory.override(
49+
container.cache_client_factory.override(
4650
providers.Factory(
4751
RedisCacheClient,
4852
host='localhost',
@@ -51,7 +55,7 @@ class Service:
5155
),
5256
)
5357
elif cache_type == 'memcached':
54-
cache_client_factory.override(
58+
container.cache_client_factory.override(
5559
providers.Factory(
5660
MemcachedCacheClient,
5761
hosts=['10.0.1.1'],
@@ -60,7 +64,7 @@ class Service:
6064
),
6165
)
6266

63-
service = service_factory()
67+
service = container.service_factory()
6468
print(service.cache)
6569
# The output depends on cache_type variable value.
6670
#

examples/providers/factory.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
"""`Factory` provider example."""
22

3-
from dependency_injector import providers
3+
from dependency_injector import containers, providers
44

55

66
class User:
77
...
88

99

10-
users_factory = providers.Factory(User)
10+
class Container(containers.DeclarativeContainer):
11+
12+
user_factory = providers.Factory(User)
1113

1214

1315
if __name__ == '__main__':
14-
user1 = users_factory()
15-
user2 = users_factory()
16+
container = Container()
17+
18+
user1 = container.user_factory()
19+
user2 = container.user_factory()

examples/providers/factory_aggregate.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import dataclasses
44
import sys
55

6-
from dependency_injector import providers
6+
from dependency_injector import containers, providers
77

88

99
@dataclasses.dataclass
@@ -30,19 +30,23 @@ class Ludo(Game):
3030
...
3131

3232

33-
game_factory = providers.FactoryAggregate(
34-
chess=providers.Factory(Chess),
35-
checkers=providers.Factory(Checkers),
36-
ludo=providers.Factory(Ludo),
37-
)
33+
class Container(containers.DeclarativeContainer):
34+
35+
game_factory = providers.FactoryAggregate(
36+
chess=providers.Factory(Chess),
37+
checkers=providers.Factory(Checkers),
38+
ludo=providers.Factory(Ludo),
39+
)
3840

3941

4042
if __name__ == '__main__':
4143
game_type = sys.argv< EF5E /span>[1].lower()
4244
player1 = sys.argv[2].capitalize()
4345
player2 = sys.argv[3].capitalize()
4446

45-
selected_game = game_factory(game_type, player1, player2)
47+
container = Container()
48+
49+
selected_game = container.game_factory(game_type, player1, player2)
4650
selected_game.play()
4751

4852
# $ python factory_aggregate.py chess John Jane

examples/providers/factory_delegation.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from typing import Callable, List
44

5-
from dependency_injector import providers
5+
from dependency_injector import containers, providers
66

77

88
class User:
@@ -21,15 +21,20 @@ def get_all(self) -> List[User]:
2121
]
2222

2323

24-
user_factory = providers.Factory(User)
25-
user_repository_factory = providers.Factory(
26-
UserRepository,
27-
user_factory=user_factory.provider,
28-
)
24+
class Container(containers.DeclarativeContainer):
25+
26+
user_factory = providers.Factory(User)
27+
28+
user_repository_factory = providers.Factory(
29+
UserRepository,
30+
user_factory=user_factory.provider,
31+
)
2932

3033

3134
if __name__ == '__main__':
32-
user_repository = user_repository_factory()
35+
container = Container()
36+
37+
user_repository = container.user_repository_factory()
3338

3439
user1, user2 = user_repository.get_all()
3540

examples/providers/factory_init_injections.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""`Factory` provider init injections example."""
22

3-
from dependency_injector import providers
3+
from dependency_injector import containers, providers
44

55

66
class Photo:
@@ -13,23 +13,27 @@ def __init__(self, uid: int, main_photo: Photo) -> None:
1313
self.main_photo = main_photo
1414

1515

16-
photo_factory = providers.Factory(Photo)
17-
user_factory = providers.Factory(
18-
User,
19-
main_photo=photo_factory,
20-
)
16+
class Container(containers.DeclarativeContainer):
17+
18+
photo_factory = providers.Factory(Photo)
19+
20+
user_factory = providers.Factory(
21+
User,
22+
main_photo=photo_factory,
23+
)
2124

2225

2326
if __name__ == '__main__':
24-
user1 = user_factory(1)
27+
container = Container()
28+
29+
user1 = container.user_factory(1)
2530
# Same as: # user1 = User(1, main_photo=Photo())
2631

27-
user2 = user_factory(2)
32+
user2 = container.user_factory(2)
2833
# Same as: # user2 = User(2, main_photo=Photo())
2934

30-
# Context keyword arguments have a priority:
3135
another_photo = Photo()
32-
user3 = user_factory(
36+
user3 = container.user_factory(
3337
uid=3,
3438
main_photo=another_photo,
3539
)

examples/providers/factory_init_injections_underlying.py

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""`Factory` provider - passing injections to the underlying providers example."""
22

3-
from dependency_injector import providers
3+
from dependency_injector import containers, providers
44

55

66
class Regularizer:
@@ -23,26 +23,31 @@ def __init__(self, task: ClassificationTask) -> None:
2323
self.task = task
2424

2525

26-
algorithm_factory = providers.Factory(
27-
Algorithm,
28-
task=providers.Factory(
29-
ClassificationTask,
30-
loss=providers.Factory(
31-
Loss,
32-
regularizer=providers.Factory(
33-
Regularizer,
26+
class Container(containers.DeclarativeContainer):
27+
28+
algorithm_factory = providers.Factory(
29+
Algorithm,
30+
task=providers.Factory(
31+
ClassificationTask,
32+
loss=providers.Factory(
33+
Loss,
34+
regularizer=providers.Factory(
35+
Regularizer,
36+
),
3437
),
3538
),
36-
),
37-
)
39+
)
3840

3941

4042
if __name__ == '__main__':
41-
algorithm_1 = algorithm_factory(task__loss__regularizer__alpha=0.5)
43+
container = Container()
44+
45+
algorithm_1 = container.algorithm_factory(
46+
task__loss__regularizer__alpha=0.5,
47+
)
4248
assert algorithm_1.task.loss.regularizer.alpha == 0.5
4349

44-
algorithm_2 = algorithm_factory(task__loss__regularizer__alpha=0.7)
50+
algorithm_2 = container.algorithm_factory(
51+
task__loss__regularizer__alpha=0.7,
52+
)
4553
assert algorithm_2.task.loss.regularizer.alpha == 0.7
46-
47-
algorithm_3 = algorithm_factory(task__loss__regularizer=Regularizer(alpha=0.8))
48-
assert algorithm_3.task.loss.regularizer.alpha == 0.8

examples/providers/factory_provided_type.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""`Factory` specialization with limitation to provided type example."""
22

3-
from dependency_injector import providers, errors
3+
from dependency_injector import containers, providers, errors
44

55

66
class BaseService:
@@ -17,11 +17,15 @@ class ServiceProvider(providers.Factory):
1717

1818

1919
# Creating service provider with a correct provided type:
20-
some_service_provider = ServiceProvider(SomeService)
20+
class Container(containers.DeclarativeContainer):
21+
22+
some_service_provider = ServiceProvider(SomeService)
23+
2124

2225
# Trying to create service provider an incorrect provided type:
2326
try:
24-
some_service_provider = ServiceProvider(object)
27+
class Container(containers.DeclarativeContainer):
28+
some_service_provider = ServiceProvider(object)
2529
except errors.Error as exception:
2630
print(exception)
2731
# The output is:

0 commit comments

Comments
 (0)
0