[rtems-central commit] util: Add argparse and logging helpers

Sebastian Huber sebh at rtems.org
Mon Jul 24 06:36:18 UTC 2023


Module:    rtems-central
Branch:    master
Commit:    9fa010e375224b6ecca46d2826af113d3c6c913e
Changeset: http://git.rtems.org/rtems-central/commit/?id=9fa010e375224b6ecca46d2826af113d3c6c913e

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Thu May 11 16:09:07 2023 +0200

util: Add argparse and logging helpers

---

 generate_membench.py         | 18 +++---------------
 rtemsspec/tests/test_util.py | 16 +++++++++++++++-
 rtemsspec/util.py            | 29 +++++++++++++++++++++++++++++
 3 files changed, 47 insertions(+), 16 deletions(-)

diff --git a/generate_membench.py b/generate_membench.py
index 737f2aa2..90c2e6e8 100755
--- a/generate_membench.py
+++ b/generate_membench.py
@@ -25,8 +25,6 @@
 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 # POSSIBILITY OF SUCH DAMAGE.
 
-import argparse
-import logging
 import os
 import sys
 import textwrap
@@ -35,7 +33,7 @@ from typing import NamedTuple, List, Optional
 from rtemsspec.items import ItemCache
 from rtemsspec.membench import generate
 from rtemsspec.sphinxcontent import SphinxContent, SphinxMapper
-from rtemsspec.util import load_config
+from rtemsspec.util import create_argument_parser, init_logging, load_config
 
 
 class _Test(NamedTuple):
@@ -833,20 +831,10 @@ def _post_process(path: str) -> None:
 
 def main() -> None:
     """ Generates memory benchmarks. """
-    parser = argparse.ArgumentParser()
-    parser.add_argument(
-        '--log-level',
-        choices=["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"],
-        type=str.upper,
-        default="ERROR",
-        help="log level")
-    parser.add_argument('--log-file',
-                        type=str,
-                        default=None,
-                        help="log to this file")
+    parser = create_argument_parser()
     parser.add_argument('--post-process', help="post-process the ELF files")
     args = parser.parse_args(sys.argv[1:])
-    logging.basicConfig(filename=args.log_file, level=args.log_level)
+    init_logging(args)
     if args.post_process:
         _post_process(args.post_process)
     else:
diff --git a/rtemsspec/tests/test_util.py b/rtemsspec/tests/test_util.py
index bd5fe22f..0873dc5e 100644
--- a/rtemsspec/tests/test_util.py
+++ b/rtemsspec/tests/test_util.py
@@ -27,7 +27,8 @@
 import os
 import logging
 
-from rtemsspec.util import copy_files, load_config, run_command
+from rtemsspec.util import copy_files, create_argument_parser, init_logging, \
+    load_config, run_command
 from rtemsspec.tests.util import get_and_clear_log
 
 
@@ -59,3 +60,16 @@ DEBUG A"""
     assert stdout[0].strip() == "A"
     status = run_command(["sleep", "0.1"])
     assert status == 0
+
+
+def test_args():
+    parser = create_argument_parser()
+    args = parser.parse_args([])
+    init_logging(args)
+    assert args.log_level == "INFO"
+    assert args.log_file is None
+    log_file = "log.txt"
+    args = parser.parse_args(["--log-level=DEBUG", f"--log-file={log_file}"])
+    assert args.log_level == "DEBUG"
+    assert args.log_file == log_file
+    init_logging(args)
diff --git a/rtemsspec/util.py b/rtemsspec/util.py
index 8e0577a2..41127031 100644
--- a/rtemsspec/util.py
+++ b/rtemsspec/util.py
@@ -24,6 +24,7 @@
 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 # POSSIBILITY OF SUCH DAMAGE.
 
+import argparse
 import logging
 import os
 import shutil
@@ -97,3 +98,31 @@ def run_command(args: List[str],
             elif task.poll() is not None:
                 break
         return task.wait()
+
+
+def create_argument_parser(
+        default_log_level: str = "INFO") -> argparse.ArgumentParser:
+    """ Creates an argument parser with default logging options. """
+    parser = argparse.ArgumentParser()
+    parser.add_argument(
+        '--log-level',
+        choices=["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"],
+        type=str.upper,
+        default=default_log_level,
+        help="log level")
+    parser.add_argument('--log-file',
+                        type=str,
+                        default=None,
+                        help="log to this file")
+    return parser
+
+
+def init_logging(args: argparse.Namespace) -> None:
+    """ Initializes the logging module. """
+    handlers: List[Any] = [logging.StreamHandler()]
+    if args.log_file is not None:
+        handlers.append(logging.FileHandler(args.log_file, mode="a"))
+    logging.basicConfig(level=args.log_level,
+                        datefmt="%Y-%m-%dT%H:%M:%S",
+                        format='%(asctime)s %(levelname)-8s %(message)s',
+                        handlers=handlers)



More information about the vc mailing list