Skip to content

Commit bb29e37

Browse files
committed
Tentative rework for raw logger
1 parent e6f746a commit bb29e37

File tree

8 files changed

+95
-43
lines changed

8 files changed

+95
-43
lines changed

Sources/toolkit/bhamon_development_toolkit/automation/automation_helpers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ def configure_logging(arguments: argparse.Namespace):
4646
logging.addLevelName(logging.ERROR, "Error")
4747
logging.addLevelName(logging.CRITICAL, "Critical")
4848

49-
logging_helpers.configure_log_stream(sys.stdout, log_stream_verbosity, message_format, date_format)
49+
logging_helpers.configure_log_stream(logging.root, sys.stdout, log_stream_verbosity, message_format, date_format)
5050
if log_file_path is not None:
51-
logging_helpers.configure_log_file(log_file_path, log_file_verbosity, message_format, date_format, mode = "w", encoding = "utf-8")
51+
logging_helpers.configure_log_file(logging.root, log_file_path, log_file_verbosity, message_format, date_format, mode = "w", encoding = "utf-8")
5252

5353

5454
def create_argument_parser() -> argparse.ArgumentParser:

Sources/toolkit/bhamon_development_toolkit/logging/logging_helpers.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55

66
all_log_levels = [ "debug", "info", "warning", "error", "critical" ]
7+
date_format_iso = "%Y-%m-%dT%H:%M:%S"
78

89

910
def get_level_as_integer(level_as_string: str) -> int:
@@ -21,18 +22,18 @@ def get_level_as_integer(level_as_string: str) -> int:
2122
raise ValueError("Unknown logging level '%s'" % level_as_string)
2223

2324

24-
def configure_log_stream(stream: TextIO, level: str, message_format: str, date_format: str) -> None:
25+
def configure_log_stream(logger: logging.Logger, stream: TextIO, level: str, message_format: str, date_format: str) -> None:
2526
formatter = logging.Formatter(fmt = message_format, datefmt = date_format, style = "{")
2627

2728
stream_handler = logging.StreamHandler(stream)
2829
stream_handler.setLevel(get_level_as_integer(level))
2930
stream_handler.formatter = formatter
3031

31-
logging.root.addHandler(stream_handler)
32+
logger.addHandler(stream_handler)
3233

3334

3435
def configure_log_file( # pylint: disable = too-many-arguments
35-
file_path: str, level: str, message_format: str, date_format: str, mode: str, encoding: str) -> None:
36+
logger: logging.Logger, file_path: str, level: str, message_format: str, date_format: str, mode: str, encoding: str) -> None:
3637

3738
if os.path.dirname(file_path):
3839
os.makedirs(os.path.dirname(file_path), exist_ok = True)
@@ -43,4 +44,4 @@ def configure_log_file( # pylint: disable = too-many-arguments
4344
file_handler.setLevel(get_level_as_integer(level))
4445
file_handler.formatter = formatter
4546

46-
logging.root.addHandler(file_handler)
47+
logger.addHandler(file_handler)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import logging
2+
from typing import Optional, TextIO
3+
4+
from bhamon_development_toolkit.logging import logging_helpers
5+
6+
7+
class RawLogger:
8+
9+
10+
def __init__(self, name: Optional[str] = None) -> None:
11+
if name is None:
12+
name = "raw"
13+
14+
self._logger = logging.Logger(name, logging.DEBUG)
15+
16+
17+
def get_actual_logger(self) -> logging.Logger:
18+
return self._logger
19+
20+
21+
def __enter__(self) -> "RawLogger":
22+
return self
23+
24+
25+
def __exit__(self, exc_type, exc_value, traceback) -> None:
26+
self.dispose()
27+
28+
29+
def configure_log_stream(self, stream: TextIO, level: str) -> None:
30+
logging_helpers.configure_log_stream(self._logger, stream, level, "{message}", logging_helpers.date_format_iso)
31+
32+
33+
def configure_log_file(self, file_path: str, level: str, mode: str, encoding: str) -> None:
34+
logging_helpers.configure_log_file(self._logger, file_path, level, "{message}", logging_helpers.date_format_iso, mode, encoding)
35+
36+
37+
def dispose(self) -> None:
38+
for handler in list(self._logger.handlers):
39+
self._logger.removeHandler(handler)
40+
handler.close()
Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import logging
2-
import os
31
import shlex
42
from typing import List, Optional, TextIO
53

4+
from bhamon_development_toolkit.logging.raw_logger import RawLogger
5+
66

77
def format_executable_command(command: List[str]):
88
return " ".join(format_executable_command_element(element) for element in command)
@@ -12,24 +12,13 @@ def format_executable_command_element(element: str) -> str:
1212
return shlex.quote(element)
1313

1414

15-
def create_raw_logger(stream: Optional[TextIO] = None, log_file_path: Optional[str] = None) -> logging.Logger:
16-
logger = logging.Logger("raw")
17-
logger.setLevel(logging.DEBUG)
18-
19-
formatter = logging.Formatter("{message}", style = "{")
15+
def create_raw_logger(stream: Optional[TextIO] = None, log_file_path: Optional[str] = None) -> RawLogger:
16+
raw_logger = RawLogger()
2017

2118
if stream is not None:
22-
stream_handler = logging.StreamHandler(stream)
23-
stream_handler.setLevel(logging.INFO)
24-
stream_handler.formatter = formatter
25-
logger.addHandler(stream_handler)
19+
raw_logger.configure_log_stream(stream, "info")
2620

2721
if log_file_path is not None:
28-
if os.path.dirname(log_file_path):
29-
os.makedirs(os.path.dirname(log_file_path), exist_ok = True)
30-
file_handler = logging.FileHandler(log_file_path, mode = "w", encoding = "utf-8")
31-
file_handler.setLevel(logging.DEBUG)
32-
file_handler.formatter = formatter
33-
logger.addHandler(file_handler)
34-
35-
return logger
22+
raw_logger.configure_log_file(log_file_path, "debug", mode = "w", encoding = "utf-8")
23+
24+
return raw_logger

Sources/toolkit/bhamon_development_toolkit/processes/process_output_logger.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,20 @@
66
class ProcessOutputLogger(ProcessOutputHandler):
77

88

9-
def __init__(self, logger: logging.Logger) -> None:
9+
def __init__(self, logger: logging.Logger,
10+
stdout_logging_level: int = logging.INFO, stderr_logging_level: int = logging.ERROR) -> None:
11+
1012
self._logger = logger
13+
self._stdout_logging_level = stdout_logging_level
14+
self._stderr_logging_level = stderr_logging_level
1115

1216

1317
def process_stdout_line(self, line: str) -> None:
14-
self._logger.debug(line.rstrip())
18+
self._logger.log(self._stdout_logging_level, line.rstrip())
1519

1620

1721
def process_stderr_line(self, line: str) -> None:
18-
self._logger.debug(line.rstrip())
22+
self._logger.log(self._stderr_logging_level, line.rstrip())
1923

2024

2125
def process_stdout_end(self) -> None:

Sources/toolkit/bhamon_development_toolkit/python/pylint_runner.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from bhamon_development_toolkit.processes.executable_command import ExecutableCommand
88
from bhamon_development_toolkit.processes.process_options import ProcessOptions
99
from bhamon_development_toolkit.processes.process_output_logger import ProcessOutputLogger
10+
from bhamon_development_toolkit.processes.process_result import ProcessResult
1011
from bhamon_development_toolkit.processes.process_runner import ProcessRunner
1112
from bhamon_development_toolkit.python.pylint_output_handler import PylintOutputHandler
1213
from bhamon_development_toolkit.python.pylint_scope import PylintScope
@@ -66,7 +67,8 @@ async def _run_with_scope(self,
6667
command.add_internal_arguments([ "--output-format=text,json:%s" % os.path.abspath(json_report_file_path) ], [])
6768

6869
process_options = ProcessOptions(working_directory = working_directory)
69-
raw_output_logger = ProcessOutputLogger(process_helpers.create_raw_logger(log_file_path = log_file_path))
70+
raw_logger = process_helpers.create_raw_logger(log_file_path = log_file_path)
71+
process_output_logger = ProcessOutputLogger(raw_logger.get_actual_logger())
7072
pylint_output_handler = PylintOutputHandler()
7173

7274
command.add_internal_arguments([ "--msg-template", pylint_output_handler.get_message_template() ], [])
@@ -75,11 +77,16 @@ async def _run_with_scope(self,
7577

7678
success = True
7779

78-
if not simulate:
79-
result = await self._process_runner.run(command, process_options, [ raw_output_logger, pylint_output_handler ], check_exit_code = False)
80+
try:
81+
if not simulate:
82+
result = await self._process_runner.run(command, process_options, [ process_output_logger, pylint_output_handler ], check_exit_code = False)
83+
else:
84+
result = ProcessResult(executable = self._python_executable, exit_code = 0)
85+
finally:
86+
raw_logger.dispose()
8087

81-
self._check_exit_code(result.exit_code)
82-
success = self._get_success_from_exit_code(result.exit_code)
88+
self._check_exit_code(result.exit_code)
89+
success = self._get_success_from_exit_code(result.exit_code)
8390

8491
return success
8592

Sources/toolkit/bhamon_development_toolkit/python/pytest_runner.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from bhamon_development_toolkit.processes.executable_command import ExecutableCommand
1111
from bhamon_development_toolkit.processes.process_options import ProcessOptions
1212
from bhamon_development_toolkit.processes.process_output_logger import ProcessOutputLogger
13+
from bhamon_development_toolkit.processes.process_result import ProcessResult
1314
from bhamon_development_toolkit.processes.process_runner import ProcessRunner
1415
from bhamon_development_toolkit.python.pytest_output_handler import PytestOutputHandler
1516
from bhamon_development_toolkit.python.pytest_scope import PytestScope
@@ -57,7 +58,7 @@ async def run(self, # pylint: disable = too-many-arguments
5758
raise RuntimeError("Pytest session completed with failures")
5859

5960

60-
async def _run_with_scope(self,
61+
async def _run_with_scope(self, # pylint: disable = too-many-locals
6162
scope: PytestScope, result_directory: str, working_directory: Optional[str] = None, simulate: bool = False) -> bool:
6263

6364
log_file_path = os.path.join(result_directory, scope.identifier + ".log")
@@ -72,19 +73,26 @@ async def _run_with_scope(self,
7273
command.add_internal_arguments([ "--json", os.path.abspath(json_report_file_path) ] if not simulate else [], [])
7374

7475
process_options = ProcessOptions(working_directory = working_directory)
75-
raw_output_logger = ProcessOutputLogger(process_helpers.create_raw_logger(log_file_path = log_file_path))
76+
raw_logger = process_helpers.create_raw_logger(log_file_path = log_file_path)
77+
process_output_logger = ProcessOutputLogger(raw_logger.get_actual_logger())
7678
pytest_output_handler = PytestOutputHandler(scope)
7779

7880
logger.info("+ %s", process_helpers.format_executable_command(command.get_command_for_logging()))
7981

8082
success = True
8183

82-
if not simulate:
83-
result = await self._process_runner.run(command, process_options, [ raw_output_logger, pytest_output_handler ], check_exit_code = False)
84+
try:
85+
if not simulate:
86+
result = await self._process_runner.run(command, process_options, [ process_output_logger, pytest_output_handler ], check_exit_code = False)
87+
else:
88+
result = ProcessResult(executable = self._python_executable, exit_code = 0)
89+
finally:
90+
raw_logger.dispose()
8491

85-
self._check_exit_code(result.exit_code)
86-
success = self._get_success_from_exit_code(result.exit_code)
92+
self._check_exit_code(result.exit_code)
93+
success = self._get_success_from_exit_code(result.exit_code)
8794

95+
if not simulate:
8896
with open(json_report_file_path, mode = "r", encoding = "utf-8") as json_report_file:
8997
json_report = json.load(json_report_file)
9098
with open(json_report_file_path + ".tmp", mode = "w", encoding = "utf-8") as json_report_file:

Sources/toolkit/bhamon_development_toolkit/python/python_package_builder.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,16 @@ async def build_distribution_package(self, # pylint: disable = too-many-argument
4949
setup_command.add_arguments([ "setup.py", "bdist_wheel" ])
5050

5151
process_options = ProcessOptions(working_directory = python_package.path_to_sources)
52-
raw_logger = process_helpers.create_raw_logger(sys.stdout, log_file_path)
53-
process_output_logger = ProcessOutputLogger(raw_logger)
52+
raw_logger = process_helpers.create_raw_logger(stream = sys.stdout, log_file_path = log_file_path)
53+
process_output_logger = ProcessOutputLogger(raw_logger.get_actual_logger())
5454

5555
logger.info("+ %s", process_helpers.format_executable_command(setup_command.get_command_for_logging()))
5656

57-
if not simulate:
58-
await self._process_runner.run(setup_command, process_options, [ process_output_logger ])
57+
try:
58+
if not simulate:
59+
await self._process_runner.run(setup_command, process_options, [ process_output_logger ])
60+
finally:
61+
raw_logger.dispose()
5962

6063
archive_name = python_package.name_for_file_system + "-" + version
6164
source_path = os.path.join(python_package.path_to_sources, "dist", archive_name + "-py3-none-any.whl")

0 commit comments

Comments
 (0)