diff --git a/donfig/config_obj.py b/donfig/config_obj.py index a6b84f6..7ae34c4 100644 --- a/donfig/config_obj.py +++ b/donfig/config_obj.py @@ -398,7 +398,7 @@ class Config: def __init__( self, name: str, - defaults: list[Mapping[str, Any]] | None = None, + defaults: Sequence[Mapping[str, Any]] | None = None, paths: list[str] | None = None, env: Mapping[str, str] | None = None, env_var: str | None = None, @@ -438,7 +438,7 @@ def __init__( self.env = env self.main_path = main_path self.paths = paths - self.defaults = defaults or [] + self.defaults: list[Mapping[str, Any]] = list(defaults) if defaults is not None else [] self.deprecations = deprecations self.config: MutableMapping[str, Any] = {} diff --git a/donfig/tests/test_config.py b/donfig/tests/test_config.py index da9be48..c5148bd 100644 --- a/donfig/tests/test_config.py +++ b/donfig/tests/test_config.py @@ -78,14 +78,26 @@ def test_update_defaults(): new = {"a": 0, "b": {"c": 0, "d": 0}, "new-extra": 0} config.update_defaults(new) - assert defaults == [ + assert config.defaults == [ {"a": 1, "b": {"c": 1}}, {"a": 2, "b": {"d": 2}}, {"a": 0, "b": {"c": 0, "d": 0}, "new-extra": 0}, ] + # the caller's list is copied on init, not aliased + assert defaults == [ + {"a": 1, "b": {"c": 1}}, + {"a": 2, "b": {"d": 2}}, + ] assert config.to_dict() == {"a": 0, "b": {"c": 0, "d": 3}, "extra": 0, "new-extra": 0} +def test_defaults_accepts_any_sequence(): + config = Config(CONFIG_NAME, defaults=({"a": 1}, {"b": 2})) + assert config.to_dict() == {"a": 1, "b": 2} + config.update_defaults({"c": 3}) + assert config.get("c") == 3 + + def test_merge(): a = {"x": 1, "y": {"a": 1}} b = {"x": 2, "z": 3, "y": {"b": 2}}