Skip to content

Commit c258418

Browse files
author
Austin Varga
committed
fix: replace mutable default arguments in Config.__init__ with None sentinels
Fixes #130 — default provider instances (StorageDefault, NotifyDefault, etc.) were evaluated once at class definition time and shared across all Config() calls. Any mutation to a default provider on one instance would bleed into every subsequent Config() that relied on the default. Replace each default with None and instantiate fresh providers inside __init__, matching the standard Python pattern for mutable defaults.
1 parent 5417318 commit c258418

2 files changed

Lines changed: 27 additions & 10 deletions

File tree

dotflow/core/config.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,17 +61,19 @@ class Config:
6161

6262
def __init__(
6363
self,
64-
storage: Storage | None = StorageDefault(),
65-
notify: Notify | None = NotifyDefault(),
66-
log: Log | None = LogDefault(),
67-
api: Api | None = ApiDefault(),
68-
scheduler: Scheduler | None = SchedulerDefault(),
64+
storage: Storage | None = None,
65+
notify: Notify | None = None,
66+
log: Log | None = None,
67+
api: Api | None = None,
68+
scheduler: Scheduler | None = None,
6969
) -> None:
70-
self.storage = storage
71-
self.notify = notify
72-
self.log = log
73-
self.api = api
74-
self.scheduler = scheduler
70+
self.storage = storage if storage is not None else StorageDefault()
71+
self.notify = notify if notify is not None else NotifyDefault()
72+
self.log = log if log is not None else LogDefault()
73+
self.api = api if api is not None else ApiDefault()
74+
self.scheduler = (
75+
scheduler if scheduler is not None else SchedulerDefault()
76+
)
7577

7678
self._validate()
7779

tests/core/test_config.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,18 @@ def test_custom_scheduler(self):
6868
config = Config(scheduler=scheduler)
6969

7070
self.assertIs(config.scheduler, scheduler)
71+
72+
def test_default_providers_are_not_shared_between_instances(self):
73+
config_a = Config()
74+
config_b = Config()
75+
76+
self.assertIsNot(
77+
config_a.storage,
78+
config_b.storage,
79+
"Each Config() call must produce a fresh StorageDefault instance",
80+
)
81+
self.assertIsNot(
82+
config_a.notify,
83+
config_b.notify,
84+
"Each Config() call must produce a fresh NotifyDefault instance",
85+
)

0 commit comments

Comments
 (0)