-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathfactory_and_value.py
43 lines (25 loc) · 919 Bytes
/
factory_and_value.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import abc
import typing
import cargo
DatabaseURL = typing.NewType("DatabaseURL", str)
class DatabaseClient(abc.ABC):
pass
class MysqlClient(DatabaseClient):
def __init__(self, db_url: DatabaseURL):
pass
class PostgresClient(DatabaseClient):
def __init__(self, db_url: DatabaseURL):
pass
def database_client_factory(db_url: DatabaseURL) -> DatabaseClient:
if db_url.startswith("mysql://"):
return MysqlClient(db_url)
if db_url.startswith("postgres://"):
return PostgresClient(db_url)
raise Exception(f"Invalid database url: {db_url}")
container = cargo.containers.Standard()
# Registers a factory
container[DatabaseClient] = database_client_factory
# Registers a value
container[DatabaseURL] = "mysql://user:password@host:3306/db"
db_client = container[DatabaseClient]
print(db_client) # Prints: <__main__.MysqlClient object at 0x7f681975b390>