Skip to content

Commit

Permalink
change: Use deterministic default store location when calling `meltan…
Browse files Browse the repository at this point in the history
…o config set` with `--store=auto` (meltano#6185)

Co-authored-by: Edgar R. M <edgarrm358@gmail.com>
  • Loading branch information
Ken Payne and edgarrmondragon committed Sep 7, 2022
1 parent a9dc3da commit 9dce062
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 38 deletions.
2 changes: 2 additions & 0 deletions docs/example-library/meltano-basics/ending-meltano.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ plugins:
- name: target-jsonl
variant: andyh1203
pip_url: target-jsonl
config:
do_timestamp_file: false
environments:
- name: dev
- name: staging
Expand Down
18 changes: 0 additions & 18 deletions src/meltano/core/settings_store.py
Original file line number Diff line number Diff line change
Expand Up @@ -1280,32 +1280,14 @@ def set(self, name: str, path: list[str], value, setting_def=None) -> dict:
StoreNotSupportedError: exception encountered when attempting to write to store.
"""
setting_def = setting_def or self.find_setting(name)

current_value, metadata = self.get(name, setting_def=setting_def)

if setting_def:
if value == setting_def.value:
# Unset everything so we fall down on default
self.unset(name, path, setting_def=setting_def)
return {"store": SettingValueStore.DEFAULT}

store = self.auto_store(name, setting_def=setting_def)
logger.debug(f"AutoStoreManager returned store '{store}'")
if store is None:
raise StoreNotSupportedError("No storage method available")

# May raise StoreNotSupportedError, but that's good.
manager = self.manager_for(store)

# Even if the global current value isn't equal,
# the value in this store might be
current_value, _ = manager.get(name, setting_def=setting_def)
if value == current_value:
# No need to do anything
return {"store": store}

metadata = manager.set(name, path, value, setting_def=setting_def)

metadata["store"] = store
return metadata

Expand Down
27 changes: 7 additions & 20 deletions tests/meltano/core/test_settings_store.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
InheritedStoreManager,
MeltanoEnvStoreManager,
MeltanoYmlStoreManager,
SettingsStoreManager,
SettingValueStore,
StoreNotSupportedError,
)
Expand Down Expand Up @@ -283,7 +284,7 @@ def test_get( # noqa: WPS213

def test_set(
self,
subject,
subject: SettingsStoreManager,
project,
unsupported,
set_value_store,
Expand All @@ -294,38 +295,24 @@ def test_set(
def set_value(value):
return subject.set("regular", ["regular"], value)

# Returns silently when new value matches current value,
# even if source is not writable
# Allow setting to a default value
assert_value_source("from_default", Store.DEFAULT)
metadata = set_value("from_default")
assert metadata["store"] == Store.DEFAULT
assert_value_source("from_default", Store.DEFAULT)

set_value_store("from_db", Store.DB)
with mock.patch.object(
Store.DB.manager, "set", side_effect=StoreNotSupportedError
):
metadata = set_value("from_db")
assert metadata["store"] == Store.MELTANO_YML
assert_value_source("from_db", Store.MELTANO_YML)
assert metadata["store"] == Store.MELTANO_YML
assert_value_source("from_default", Store.MELTANO_YML)

# Falls back on `meltano.yml` when current source is not writable
with unsupported(Store.DB):
metadata = set_value("from_meltano_yml")
assert metadata["store"] == Store.MELTANO_YML
assert_value_source("from_meltano_yml", Store.MELTANO_YML)

# Unsets in all writable stores when new value matches default value
metadata = set_value("from_default")
assert metadata["store"] == Store.DEFAULT
assert_value_source("from_default", Store.DEFAULT)

# Stores in Meltano Environment if active
with monkeypatch.context() as mpc:
mpc.setattr(project, "active_environment", environment)
metadata = set_value("from_meltano_env_new")
metadata = set_value("from_meltano_env")
assert metadata["store"] == Store.MELTANO_ENV
assert_value_source("from_meltano_env_new", Store.MELTANO_ENV)
assert_value_source("from_meltano_env", Store.MELTANO_ENV)

# Stores in `meltano.yml` by default
metadata = set_value("from_meltano_yml")
Expand Down

0 comments on commit 9dce062

Please sign in to comment.