Skip to content

Commit 5709c6f

Browse files
committed
fix: centralize configured runtime settings
1 parent 0494f92 commit 5709c6f

3 files changed

Lines changed: 28 additions & 15 deletions

File tree

‎lib/python/base_cli/_app_core.py‎

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
LifecycleOptions,
4343
LifecycleValues,
4444
)
45-
from .logging import configure_logger, log_invocation
45+
from .logging import _CONFIGURED_LOG_LEVELS, configure_logger, log_invocation
4646
from .paths import (
4747
current_working_dir,
4848
normalize_cli_name,
@@ -279,7 +279,7 @@ def _default_log_file(layout: Any, configured_log_file: Path | None) -> Path:
279279
def _parameter_source_was_supplied(source: Any) -> bool:
280280
"""Return whether Click resolved an option from an explicit input source."""
281281

282-
return getattr(source, "name", None) in {"COMMANDLINE", "PROMPT", "ENVIRONMENT", "DEFAULT_MAP"}
282+
return _parameter_source_rank(source) >= 2
283283

284284

285285
def _configured_stream_level(
@@ -299,14 +299,7 @@ def _configured_stream_level(
299299
elif level == "debug":
300300
level = "info"
301301
if _parameter_source_was_supplied(quiet_source) and quiet:
302-
rank = {
303-
"debug": logging.DEBUG,
304-
"info": logging.INFO,
305-
"warning": logging.WARNING,
306-
"error": logging.ERROR,
307-
"critical": logging.CRITICAL,
308-
}
309-
if level is None or rank.get(level, logging.INFO) < logging.WARNING:
302+
if level is None or _CONFIGURED_LOG_LEVELS.get(level, logging.INFO) < logging.WARNING:
310303
level = "warning"
311304
return level
312305

@@ -1146,7 +1139,8 @@ def _create_context(
11461139
self,
11471140
standard: dict[str, Any],
11481141
dry_run: bool = False,
1149-
option_sources: Mapping[str, Any] | None = None,
1142+
*,
1143+
option_sources: Mapping[str, Any],
11501144
) -> Context[dict[str, Any], Any, Any]:
11511145
project = self.profile.discover_project(current_working_dir())
11521146
manifest_path = project.manifest if project is not None else None
@@ -1178,7 +1172,7 @@ def _create_context(
11781172
or "dev"
11791173
)
11801174
log_level = framework_config.log_level if framework_config is not None else None
1181-
sources = option_sources or {}
1175+
sources = option_sources
11821176
debug_source = sources.get("debug")
11831177
quiet_source = sources.get("quiet")
11841178
keep_temp_source = sources.get("keep_temp")
@@ -1190,7 +1184,7 @@ def _create_context(
11901184
quiet = bool(standard.get("quiet"))
11911185
if framework_config is None or _parameter_source_was_supplied(keep_temp_source):
11921186
keep_temp = bool(standard.get("keep_temp"))
1193-
elif "keep_temp" in config_provenance or framework_config.keep_temp:
1187+
elif "keep_temp" in config_provenance:
11941188
keep_temp = framework_config.keep_temp
11951189
else:
11961190
keep_temp = bool(standard.get("keep_temp"))

‎lib/python/base_cli/logging.py‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,15 @@ def configure_logger(
6262
INFO, WARNING, ERROR, or CRITICAL. The persistent file handler remains at
6363
DEBUG. When omitted, the existing ``debug`` and ``quiet`` policy applies.
6464
"""
65-
if log_level is not None and log_level not in _CONFIGURED_LOG_LEVELS:
65+
normalized_log_level = log_level.lower() if log_level is not None else None
66+
if normalized_log_level is not None and normalized_log_level not in _CONFIGURED_LOG_LEVELS:
6667
supported = ", ".join(_CONFIGURED_LOG_LEVELS)
6768
raise ValueError(f"log_level must be one of: {supported}.")
68-
stream_level = _user_stream_level(debug, quiet) if log_level is None else _CONFIGURED_LOG_LEVELS[log_level]
69+
stream_level = (
70+
_user_stream_level(debug, quiet)
71+
if normalized_log_level is None
72+
else _CONFIGURED_LOG_LEVELS[normalized_log_level]
73+
)
6974
logger = logging.getLogger(f"base_cli.{cli_name}")
7075
logger.setLevel(logging.DEBUG)
7176
logger.propagate = False

‎tests/test_logging.py‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,20 @@ def test_configure_logger_accepts_and_validates_explicit_stream_threshold(self)
7272
with self.assertRaisesRegex(ValueError, "log_level must be one of"):
7373
base_cli.configure_logger("configured-level-invalid", None, debug=False, log_level="verbose")
7474

75+
def test_configure_logger_accepts_uppercase_stream_threshold(self) -> None:
76+
stream = io.StringIO()
77+
logger = base_cli.configure_logger(
78+
"configured-level-uppercase",
79+
None,
80+
debug=False,
81+
stream=stream,
82+
log_level="WARNING",
83+
)
84+
logger.info("hidden")
85+
logger.warning("visible")
86+
self.assertNotIn("hidden", stream.getvalue())
87+
self.assertIn("visible", stream.getvalue())
88+
7589
def test_base_formatter_includes_exception_tracebacks(self) -> None:
7690
stream = io.StringIO()
7791
logger = base_cli.configure_logger("exception-traceback", None, debug=True, stream=stream)

0 commit comments

Comments
 (0)