Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Handle case where setting metadata is None #6938

Merged
merged 5 commits into from Nov 1, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions .flake8
Expand Up @@ -41,6 +41,8 @@ ignore =
# pycodestyle
# Allow for line breaks where Black decides are valid
W503
# Let Black put whitespace before :
E203
# Allow for long lines since we delegate to Black for enforcement
E501
# Allow custom exceptions whose name ends with "Exception"
Expand Down
17 changes: 12 additions & 5 deletions src/meltano/cli/interactive/config.py
Expand Up @@ -16,7 +16,13 @@
from meltano.cli.interactive.utils import InteractionStatus
from meltano.cli.utils import CliError
from meltano.core.environment_service import EnvironmentService
from meltano.core.settings_service import REDACTED_VALUE, SettingKind, SettingValueStore
from meltano.core.project import Project
from meltano.core.settings_service import (
REDACTED_VALUE,
SettingKind,
SettingsService,
SettingValueStore,
)
from meltano.core.settings_store import StoreNotSupportedError
from meltano.core.tracking import CliEvent

Expand Down Expand Up @@ -60,8 +66,8 @@ def __init__(self, ctx, store, extras=False, max_width=None):
self.ctx = ctx
self.store = store
self.extras = extras
self.project = self.ctx.obj["project"]
self.settings = self.ctx.obj["settings"]
self.project: Project = self.ctx.obj["project"]
self.settings: SettingsService = self.ctx.obj["settings"]
self.session = self.ctx.obj["session"]
self.tracker = self.ctx.obj["tracker"]
self.environment_service = EnvironmentService(self.project)
Expand Down Expand Up @@ -382,7 +388,8 @@ def set_value(self, setting_name, value, store, interactive=False):

name = metadata["name"]
store = metadata["store"]
if metadata["setting"].is_redacted:
is_redacted = metadata["setting"] and metadata["setting"].is_redacted
if is_redacted:
value = REDACTED_VALUE
click.secho(
f"{settings.label.capitalize()} setting '{name}' was set in {store.label}: {value!r}",
Expand All @@ -391,7 +398,7 @@ def set_value(self, setting_name, value, store, interactive=False):

current_value, source = settings.get_with_source(name, session=self.session)
if source != store:
if metadata["setting"].is_redacted:
if is_redacted:
current_value = REDACTED_VALUE
click.secho(
f"Current value is still: {current_value!r} (from {source.label})",
Expand Down
44 changes: 23 additions & 21 deletions src/meltano/core/settings_service.py
Expand Up @@ -141,7 +141,7 @@ def db_namespace(self) -> str:
def setting_definitions(self) -> list[SettingDefinition]:
"""Return definitions of supported settings."""

@property
@property # noqa: B027
def inherited_settings_service(self):
"""Return settings service to inherit configuration from."""

Expand Down Expand Up @@ -231,11 +231,10 @@ def config_with_metadata(
**kwargs,
)

name = setting_def.name
if prefix:
name = name[len(prefix) :] # noqa: E203

config[name] = {**metadata, "value": value}
config[setting_def.name[len(prefix) :] if prefix else setting_def.name] = {
**metadata,
"value": value,
}

return config

Expand Down Expand Up @@ -275,10 +274,8 @@ def as_env(self, *args, **kwargs) -> dict[str, str]:
Returns:
settings as environment variables
"""
full_config = self.config_with_metadata(*args, **kwargs)

env = {}
for _, config in full_config.items():
for _, config in self.config_with_metadata(*args, **kwargs).items():
value = config["value"]
if value is None:
continue
Expand Down Expand Up @@ -442,8 +439,8 @@ def get(self, *args, **kwargs):
value, _ = self.get_with_source(*args, **kwargs)
return value

def set_with_metadata( # noqa: WPS615
self, path: list[str], value, store=SettingValueStore.AUTO, **kwargs
def set_with_metadata( # noqa: WPS615, WPS210
self, path: str | list[str], value, store=SettingValueStore.AUTO, **kwargs
):
"""Set the value and metadata for a setting.

Expand All @@ -466,6 +463,7 @@ def set_with_metadata( # noqa: WPS615
try:
setting_def = self.find_setting(name)
except SettingMissingError:
warnings.warn(f"Unknown setting {name!r}", RuntimeWarning)
setting_def = None

metadata = {"name": name, "path": path, "store": store, "setting": setting_def}
Expand All @@ -480,11 +478,13 @@ def set_with_metadata( # noqa: WPS615
metadata["uncast_value"] = value
value = cast_value

manager = store.manager(self, **kwargs)
set_metadata = manager.set(name, path, value, setting_def=setting_def)
metadata.update(set_metadata)
metadata.update(
store.manager(self, **kwargs).set(
name, path, value, setting_def=setting_def
)
)

self.log(f"Set setting '{name}' with metadata: {metadata}")
self.log(f"Set setting {name!r} with metadata: {metadata}")
return value, metadata

def set(self, *args, **kwargs):
Expand Down Expand Up @@ -523,13 +523,15 @@ def unset(self, path: list[str], store=SettingValueStore.AUTO, **kwargs):
except SettingMissingError:
setting_def = None

metadata = {"name": name, "path": path, "store": store, "setting": setting_def}

manager = store.manager(self, **kwargs)
unset_metadata = manager.unset(name, path, setting_def=setting_def)
metadata.update(unset_metadata)
metadata = {
"name": name,
"path": path,
"store": store,
"setting": setting_def,
**store.manager(self, **kwargs).unset(name, path, setting_def=setting_def),
}

self.log(f"Unset setting '{name}' with metadata: {metadata}")
self.log(f"Unset setting {name!r} with metadata: {metadata}")
return metadata

def reset(self, store=SettingValueStore.AUTO, **kwargs):
Expand Down