Skip to content

Commit a48ed44

Browse files
committed
relink and rimport now share a logger.
1 parent 5b283d0 commit a48ed44

4 files changed

Lines changed: 26 additions & 25 deletions

File tree

relink.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,9 @@
2020
validate_paths,
2121
validate_directory,
2222
configure_logging,
23+
logger
2324
)
2425

25-
# Set up logger
26-
logger = logging.getLogger(__name__)
27-
2826
# Define a custom log level that always prints
2927
ALWAYS = logging.CRITICAL * 2
3028
logging.addLevelName(ALWAYS, "ALWAYS")
@@ -389,7 +387,7 @@ def main():
389387

390388
args = parse_arguments()
391389

392-
configure_logging(logger, args.log_level)
390+
configure_logging(args.log_level)
393391

394392
my_username = os.environ["USER"]
395393

rimport

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ INDENT = " "
2828
INPUTDATA_URL = "https://osdf-data.gdex.ucar.edu/ncar/gdex/d651077/cesmdata/inputdata"
2929

3030
# Configure logging
31-
logger = logging.getLogger(__name__)
31+
logger = shared.logger
3232

3333

3434
def build_parser() -> argparse.ArgumentParser:
@@ -330,7 +330,7 @@ def main(argv: List[str] | None = None) -> int:
330330

331331
# Configure logging based on verbosity flags
332332
log_level = shared.get_log_level(quiet=args.quiet, verbose=args.verbose)
333-
shared.configure_logging(logger, log_level)
333+
shared.configure_logging(log_level)
334334

335335
# Ensure we are running as the STAGE_OWNER account before touching the tree
336336
# Set env var RIMPORT_SKIP_USER_CHECK=1 if you prefer to run `sudox -u STAGE_OWNER rimport …`

shared.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
"/glade/campaign/collections/gdex/data/d651077/cesmdata/inputdata/"
1313
)
1414

15+
logger = logging.getLogger("rimport_relink")
16+
1517

1618
def get_log_level(quiet: bool = False, verbose: bool = False) -> int:
1719
"""Determine logging level based on quiet and verbose flags.
@@ -33,7 +35,7 @@ def get_log_level(quiet: bool = False, verbose: bool = False) -> int:
3335
return logging.INFO
3436

3537

36-
def configure_logging(logger, log_level: int) -> None:
38+
def configure_logging(log_level: int, logger_in: logging.Logger = logger) -> None:
3739
"""Configure logging to send INFO/WARNING to stdout and ERROR/CRITICAL to stderr.
3840
3941
Sets up two handlers:
@@ -44,8 +46,9 @@ def configure_logging(logger, log_level: int) -> None:
4446
4547
Args:
4648
log_level: Minimum logging level (DEBUG, INFO, or WARNING).
49+
logger_in: Logger to operate on. Should only be used in testing.
4750
"""
48-
logger.setLevel(log_level)
51+
logger_in.setLevel(log_level)
4952

5053
# Handler for INFO, WARNING, and DEBUG level messages -> stdout
5154
info_handler = logging.StreamHandler(sys.stdout)
@@ -59,9 +62,9 @@ def configure_logging(logger, log_level: int) -> None:
5962
error_handler.setFormatter(logging.Formatter("%(message)s"))
6063

6164
# Clear any existing handlers and add our custom ones
62-
logger.handlers.clear()
63-
logger.addHandler(info_handler)
64-
logger.addHandler(error_handler)
65+
logger_in.handlers.clear()
66+
logger_in.addHandler(info_handler)
67+
logger_in.addHandler(error_handler)
6568

6669

6770
def add_inputdata_root(parser: argparse.ArgumentParser):

tests/shared/test_configure_logging.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,17 @@ def cleanup_logger(self):
2323

2424
def test_sets_logger_level_to_info(self):
2525
"""Test that configure_logging sets the logger level to INFO."""
26-
shared.configure_logging(logger, logging.INFO)
26+
shared.configure_logging(logging.INFO, logger)
2727
assert logger.level == logging.INFO
2828

2929
def test_creates_two_handlers(self):
3030
"""Test that configure_logging creates exactly two handlers."""
31-
shared.configure_logging(logger, logging.INFO)
31+
shared.configure_logging(logging.INFO, logger)
3232
assert len(logger.handlers) == 2
3333

3434
def test_info_handler_goes_to_stdout(self, capsys):
3535
"""Test that INFO level messages go to stdout."""
36-
shared.configure_logging(logger, logging.INFO)
36+
shared.configure_logging(logging.INFO, logger)
3737
logger.info("Test info message")
3838

3939
captured = capsys.readouterr()
@@ -42,7 +42,7 @@ def test_info_handler_goes_to_stdout(self, capsys):
4242

4343
def test_warning_handler_goes_to_stdout(self, capsys):
4444
"""Test that WARNING level messages go to stdout."""
45-
shared.configure_logging(logger, logging.INFO)
45+
shared.configure_logging(logging.INFO, logger)
4646
logger.warning("Test warning message")
4747

4848
captured = capsys.readouterr()
@@ -51,7 +51,7 @@ def test_warning_handler_goes_to_stdout(self, capsys):
5151

5252
def test_error_handler_goes_to_stderr(self, capsys):
5353
"""Test that ERROR level messages go to stderr."""
54-
shared.configure_logging(logger, logging.INFO)
54+
shared.configure_logging(logging.INFO, logger)
5555
logger.error("Test error message")
5656

5757
captured = capsys.readouterr()
@@ -60,7 +60,7 @@ def test_error_handler_goes_to_stderr(self, capsys):
6060

6161
def test_critical_handler_goes_to_stderr(self, capsys):
6262
"""Test that CRITICAL level messages go to stderr."""
63-
shared.configure_logging(logger, logging.INFO)
63+
shared.configure_logging(logging.INFO, logger)
6464
logger.critical("Test critical message")
6565

6666
captured = capsys.readouterr()
@@ -76,15 +76,15 @@ def test_clears_existing_handlers(self):
7676
assert len(logger.handlers) >= 1
7777

7878
# Configure logging
79-
shared.configure_logging(logger, logging.INFO)
79+
shared.configure_logging(logging.INFO, logger)
8080

8181
# Verify old handlers were cleared and new ones added
8282
assert len(logger.handlers) == 2
8383
assert dummy_handler not in logger.handlers
8484

8585
def test_formatter_uses_message_only(self, capsys):
8686
"""Test that the formatter outputs only the message without level/timestamp."""
87-
shared.configure_logging(logger, logging.INFO)
87+
shared.configure_logging(logging.INFO, logger)
8888
logger.info("Simple message")
8989

9090
captured = capsys.readouterr()
@@ -94,18 +94,18 @@ def test_formatter_uses_message_only(self, capsys):
9494

9595
def test_multiple_calls_dont_duplicate_handlers(self):
9696
"""Test that calling configure_logging multiple times doesn't duplicate handlers."""
97-
shared.configure_logging(logger, logging.INFO)
97+
shared.configure_logging(logging.INFO, logger)
9898
assert len(logger.handlers) == 2
9999

100-
shared.configure_logging(logger, logging.INFO)
100+
shared.configure_logging(logging.INFO, logger)
101101
assert len(logger.handlers) == 2 # Still 2, not 4
102102

103-
shared.configure_logging(logger, logging.INFO)
103+
shared.configure_logging(logging.INFO, logger)
104104
assert len(logger.handlers) == 2 # Still 2, not 6
105105

106106
def test_configure_with_debug_level(self, capsys):
107107
"""Test that configure_logging accepts DEBUG level."""
108-
shared.configure_logging(logger, logging.DEBUG)
108+
shared.configure_logging(logging.DEBUG, logger)
109109

110110
# DEBUG messages should now be logged
111111
logger.debug("Debug message")
@@ -116,7 +116,7 @@ def test_configure_with_debug_level(self, capsys):
116116

117117
def test_configure_with_warning_level(self, capsys):
118118
"""Test that configure_logging accepts WARNING level."""
119-
shared.configure_logging(logger, logging.WARNING)
119+
shared.configure_logging(logging.WARNING, logger)
120120

121121
# INFO messages should be suppressed
122122
logger.info("Info message")
@@ -130,7 +130,7 @@ def test_configure_with_warning_level(self, capsys):
130130

131131
def test_configure_with_info_level_suppresses_debug(self, capsys):
132132
"""Test that INFO level suppresses DEBUG messages."""
133-
shared.configure_logging(logger, logging.INFO)
133+
shared.configure_logging(logging.INFO, logger)
134134

135135
logger.debug("Debug message")
136136
logger.info("Info message")

0 commit comments

Comments
 (0)