Skip to content

Commit 50af250

Browse files
committed
Add factory patterns
1 parent 875dcbf commit 50af250

File tree

3 files changed

+169
-0
lines changed

3 files changed

+169
-0
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
"""`Chained Factories` pattern."""
2+
3+
from dependency_injector import providers
4+
5+
from data import (
6+
id_generator,
7+
session,
8+
SqlAlchemyDatabaseService,
9+
TokensService,
10+
Token,
11+
UsersService,
12+
User,
13+
)
14+
15+
16+
# "Chained Factories" pattern
17+
18+
database = providers.Factory(SqlAlchemyDatabaseService, session=session)
19+
20+
tokens = providers.Factory(
21+
TokensService,
22+
id_generator=id_generator,
23+
database=providers.Factory(database, base_class=Token),
24+
)
25+
26+
users = providers.Factory(
27+
UsersService,
28+
id_generator=id_generator,
29+
database=providers.Factory(database, base_class=User),
30+
)
31+
32+
tokens_service = tokens()
33+
assert tokens_service.database.base_class is Token
34+
35+
users_service = users()
36+
assert users_service.database.base_class is User
37+
38+
# Explanation & some more examples
39+
40+
# 1. Keyword arguments of upper level factory are added to lower level factory
41+
chained_dict_factory = providers.Factory(
42+
providers.Factory(dict, arg1=1),
43+
arg2=2,
44+
)
45+
print(chained_dict_factory()) # prints: {'arg1': 1, 'arg2': 2}
46+
47+
# 2. Keyword arguments of upper level factory have priority
48+
chained_dict_factory = providers.Factory(
49+
providers.Factory(dict, arg1=1),
50+
arg1=2,
51+
)
52+
print(chained_dict_factory()) # prints: {'arg1': 2}
53+
54+
# 3. Keyword arguments provided from context have most priority
55+
chained_dict_factory = providers.Factory(
56+
providers.Factory(dict, arg1=1),
57+
arg1=2,
58+
)
59+
print(chained_dict_factory(arg1=3)) # prints: {'arg1': 3}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
"""Sample data classes."""
2+
3+
4+
class SqlAlchemyDatabaseService:
5+
"""Database service of an entity."""
6+
7+
def __init__(self, session, base_class):
8+
"""Initialize object."""
9+
self.session = session
10+
self.base_class = base_class
11+
12+
13+
class TokensService:
14+
"""Tokens service."""
15+
16+
def __init__(self, id_generator, database):
17+
"""Initialize object."""
18+
self.id_generator = id_generator
19+
self.database = database
20+
21+
22+
class Token:
23+
"""Token entity."""
24+
25+
26+
class UsersService:
27+
"""Users service."""
28+
29+
def __init__(self, id_generator, database):
30+
"""Initialize object."""
31+
self.id_generator = id_generator
32+
self.database = database
33+
34+
35+
class User:
36+
"""User entity."""
37+
38+
39+
# Sample objects
40+
session = object()
41+
id_generator = object()
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
"""`Factory of Factories` pattern."""
2+
3+
from dependency_injector import providers
4+
5+
from data import (
6+
id_generator,
7+
session,
8+
SqlAlchemyDatabaseService,
9+
TokensService,
10+
Token,
11+
UsersService,
12+
User,
13+
)
14+
15+
16+
# "Factory of Factories" pattern
17+
18+
database_factory = providers.Factory(
19+
providers.Factory,
20+
SqlAlchemyDatabaseService,
21+
session=session,
22+
)
23+
24+
tokens = providers.Factory(
25+
TokensService,
26+
id_generator=id_generator,
27+
database=database_factory(base_class=Token),
28+
)
29+
30+
users = providers.Factory(
31+
UsersService,
32+
id_generator=id_generator,
33+
database=database_factory(base_class=User),
34+
)
35+
36+
tokens_service = tokens()
37+
assert tokens_service.database.base_class is Token
38+
39+
users_service = users()
40+
assert users_service.database.base_class is User
41+
42+
# Explanation & some more examples
43+
44+
# 1. Keyword arguments of upper level factory are added to lower level factory
45+
factory_of_dict_factories = providers.Factory(
46+
providers.Factory,
47+
dict,
48+
arg1=1,
49+
)
50+
dict_factory = factory_of_dict_factories(arg2=2)
51+
print(dict_factory()) # prints: {'arg1': 1, 'arg2': 2}
52+
53+
# 2. Keyword arguments of upper level factory have priority
54+
factory_of_dict_factories = providers.Factory(
55+
providers.Factory,
56+
dict,
57+
arg1=1,
58+
)
59+
dict_factory = factory_of_dict_factories(arg1=2)
60+
print(dict_factory()) # prints: {'arg1': 2}
61+
62+
# 3. Keyword arguments provided from context have most priority
63+
factory_of_dict_factories = providers.Factory(
64+
providers.Factory,
65+
dict,
66+
arg1=1,
67+
)
68+
dict_factory = factory_of_dict_factories(arg1=2)
69+
print(dict_factory(arg1=3)) # prints: {'arg1': 3}

0 commit comments

Comments
 (0)