From 6afd120e5bfd57d935d56fc3133e9120d7f8af22 Mon Sep 17 00:00:00 2001 From: zariiii9003 <52598363+zariiii9003@users.noreply.github.com> Date: Tue, 7 Jun 2022 10:08:50 +0200 Subject: [PATCH 1/5] detect types in _parse_additonal_config --- can/logger.py | 31 ++++++++++++++++++++++++------- test/test_logger.py | 24 ++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/can/logger.py b/can/logger.py index 053001968..bac0b28f6 100644 --- a/can/logger.py +++ b/can/logger.py @@ -13,12 +13,12 @@ Dynamic Controls 2010 """ - +import re import sys import argparse from datetime import datetime import errno -from typing import Any, Dict, List, Union +from typing import Any, Dict, List, Union, Sequence, Tuple import can from . import Bus, BusState, Logger, SizedRotatingLogger @@ -132,11 +132,28 @@ def _parse_filters(parsed_args: Any) -> CanFilters: return can_filters -def _parse_additonal_config(unknown_args): - return dict( - (arg.split("=", 1)[0].lstrip("--").replace("-", "_"), arg.split("=", 1)[1]) - for arg in unknown_args - ) +def _parse_additonal_config( + unknown_args: Sequence[str], +) -> Dict[str, Union[str, int, float, bool]]: + def _split_arg(_arg: str) -> Tuple[str, str]: + left, right = _arg.split("=", 1) + return left.lstrip("--").replace("-", "_"), right + + args: Dict[str, Union[str, int, float, bool]] = {} + for key, string_val in map(_split_arg, unknown_args): + if re.match(r"^[-+]?\d+$", string_val): + # value is integer + args[key] = int(string_val) + elif re.match(r"^[-+]?\d*\.\d+$", string_val): + # value is float + args[key] = float(string_val) + elif re.match(r"^(?:True|False)$", string_val): + # value is bool + args[key] = string_val == "True" + else: + # value is string + args[key] = string_val + return args def main() -> None: diff --git a/test/test_logger.py b/test/test_logger.py index b694f06bb..b2a91fabf 100644 --- a/test/test_logger.py +++ b/test/test_logger.py @@ -105,6 +105,30 @@ def test_log_virtual_sizedlogger(self): self.assertSuccessfullCleanup() self.mock_logger_sized.assert_called_once() + def test_parse_additonal_config(self): + unknown_args = [ + "--app-name=CANalyzer", + "--serial=5555", + "--receive-own-messages=True", + "--offset=1.5", + ] + parsed_args = can.logger._parse_additonal_config(unknown_args) + + assert "app_name" in parsed_args + assert parsed_args["app_name"] == "CANalyzer" + + assert "serial" in parsed_args + assert parsed_args["serial"] == 5555 + + assert "receive_own_messages" in parsed_args + assert ( + isinstance(parsed_args["receive_own_messages"], bool) + and parsed_args["receive_own_messages"] is True + ) + + assert "offset" in parsed_args + assert parsed_args["offset"] == 1.5 + class TestLoggerCompressedFile(unittest.TestCase): def setUp(self) -> None: From c978b202de84235efaafa49fdc39d8422d78802f Mon Sep 17 00:00:00 2001 From: zariiii9003 <52598363+zariiii9003@users.noreply.github.com> Date: Fri, 10 Jun 2022 13:21:25 +0200 Subject: [PATCH 2/5] check argument format --- can/logger.py | 4 ++++ test/test_logger.py | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/can/logger.py b/can/logger.py index bac0b28f6..ae65dd0e6 100644 --- a/can/logger.py +++ b/can/logger.py @@ -135,6 +135,10 @@ def _parse_filters(parsed_args: Any) -> CanFilters: def _parse_additonal_config( unknown_args: Sequence[str], ) -> Dict[str, Union[str, int, float, bool]]: + for arg in unknown_args: + if not re.match(r"^--[a-zA-Z\-]*?=\S*?$", arg): + raise ValueError(f"Parsing argument {arg} failed") + def _split_arg(_arg: str) -> Tuple[str, str]: left, right = _arg.split("=", 1) return left.lstrip("--").replace("-", "_"), right diff --git a/test/test_logger.py b/test/test_logger.py index b2a91fabf..728a24e69 100644 --- a/test/test_logger.py +++ b/test/test_logger.py @@ -10,6 +10,9 @@ import gzip import os import sys + +import pytest + import can import can.logger @@ -110,6 +113,7 @@ def test_parse_additonal_config(self): "--app-name=CANalyzer", "--serial=5555", "--receive-own-messages=True", + "--false-boolean=False", "--offset=1.5", ] parsed_args = can.logger._parse_additonal_config(unknown_args) @@ -126,9 +130,27 @@ def test_parse_additonal_config(self): and parsed_args["receive_own_messages"] is True ) + assert "false_boolean" in parsed_args + assert ( + isinstance(parsed_args["false_boolean"], bool) + and parsed_args["false_boolean"] is False + ) + assert "offset" in parsed_args assert parsed_args["offset"] == 1.5 + with pytest.raises(ValueError): + can.logger._parse_additonal_config(["--wrong-format"]) + + with pytest.raises(ValueError): + can.logger._parse_additonal_config(["-wrongformat=value"]) + + with pytest.raises(ValueError): + can.logger._parse_additonal_config(["--wrongformat=value1 value2"]) + + with pytest.raises(ValueError): + can.logger._parse_additonal_config(["wrongformat="]) + class TestLoggerCompressedFile(unittest.TestCase): def setUp(self) -> None: From a39788be4579ab2545d78bde07080adef6534e94 Mon Sep 17 00:00:00 2001 From: zariiii9003 <52598363+zariiii9003@users.noreply.github.com> Date: Fri, 10 Jun 2022 16:45:50 +0200 Subject: [PATCH 3/5] fix typo --- can/logger.py | 4 ++-- test/test_logger.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/can/logger.py b/can/logger.py index ae65dd0e6..88d0938f5 100644 --- a/can/logger.py +++ b/can/logger.py @@ -132,7 +132,7 @@ def _parse_filters(parsed_args: Any) -> CanFilters: return can_filters -def _parse_additonal_config( +def _parse_additional_config( unknown_args: Sequence[str], ) -> Dict[str, Union[str, int, float, bool]]: for arg in unknown_args: @@ -211,7 +211,7 @@ def main() -> None: raise SystemExit(errno.EINVAL) results, unknown_args = parser.parse_known_args() - additional_config = _parse_additonal_config(unknown_args) + additional_config = _parse_additional_config(unknown_args) bus = _create_bus(results, can_filters=_parse_filters(results), **additional_config) if results.active: diff --git a/test/test_logger.py b/test/test_logger.py index 728a24e69..25049b13d 100644 --- a/test/test_logger.py +++ b/test/test_logger.py @@ -108,7 +108,7 @@ def test_log_virtual_sizedlogger(self): self.assertSuccessfullCleanup() self.mock_logger_sized.assert_called_once() - def test_parse_additonal_config(self): + def test_parse_additional_config(self): unknown_args = [ "--app-name=CANalyzer", "--serial=5555", @@ -116,7 +116,7 @@ def test_parse_additonal_config(self): "--false-boolean=False", "--offset=1.5", ] - parsed_args = can.logger._parse_additonal_config(unknown_args) + parsed_args = can.logger._parse_additional_config(unknown_args) assert "app_name" in parsed_args assert parsed_args["app_name"] == "CANalyzer" @@ -140,7 +140,7 @@ def test_parse_additonal_config(self): assert parsed_args["offset"] == 1.5 with pytest.raises(ValueError): - can.logger._parse_additonal_config(["--wrong-format"]) + can.logger._parse_additional_config(["--wrong-format"]) with pytest.raises(ValueError): can.logger._parse_additonal_config(["-wrongformat=value"]) From 293fe25ad51477d607939418031d137f7b042397 Mon Sep 17 00:00:00 2001 From: zariiii9003 <52598363+zariiii9003@users.noreply.github.com> Date: Fri, 10 Jun 2022 16:46:26 +0200 Subject: [PATCH 4/5] recognize extra_args --- can/player.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/can/player.py b/can/player.py index 632cc331b..72faa892a 100644 --- a/can/player.py +++ b/can/player.py @@ -13,7 +13,7 @@ from can import LogReader, Message, MessageSync -from .logger import _create_base_argument_parser, _create_bus +from .logger import _create_base_argument_parser, _create_bus, _parse_additional_config def main() -> None: @@ -78,13 +78,14 @@ def main() -> None: parser.print_help(sys.stderr) raise SystemExit(errno.EINVAL) - results = parser.parse_args() + results, unknown_args = parser.parse_known_args() + additional_config = _parse_additional_config(unknown_args) verbosity = results.verbosity error_frames = results.error_frames - with _create_bus(results) as bus: + with _create_bus(results, **additional_config) as bus: with LogReader(results.infile) as reader: in_sync = MessageSync( From 6bfddab4f67195611643f0a113d6ee3c44a5090f Mon Sep 17 00:00:00 2001 From: zariiii9003 <52598363+zariiii9003@users.noreply.github.com> Date: Fri, 10 Jun 2022 16:57:13 +0200 Subject: [PATCH 5/5] fix typo again --- can/viewer.py | 4 ++-- test/test_logger.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/can/viewer.py b/can/viewer.py index a84c865f5..7be04949d 100644 --- a/can/viewer.py +++ b/can/viewer.py @@ -35,7 +35,7 @@ _parse_filters, _append_filter_argument, _create_base_argument_parser, - _parse_additonal_config, + _parse_additional_config, ) @@ -540,7 +540,7 @@ def parse_args(args): else: data_structs[key] = struct.Struct(fmt) - additional_config = _parse_additonal_config(unknown_args) + additional_config = _parse_additional_config(unknown_args) return parsed_args, can_filters, data_structs, additional_config diff --git a/test/test_logger.py b/test/test_logger.py index 25049b13d..bb0015a89 100644 --- a/test/test_logger.py +++ b/test/test_logger.py @@ -143,13 +143,13 @@ def test_parse_additional_config(self): can.logger._parse_additional_config(["--wrong-format"]) with pytest.raises(ValueError): - can.logger._parse_additonal_config(["-wrongformat=value"]) + can.logger._parse_additional_config(["-wrongformat=value"]) with pytest.raises(ValueError): - can.logger._parse_additonal_config(["--wrongformat=value1 value2"]) + can.logger._parse_additional_config(["--wrongformat=value1 value2"]) with pytest.raises(ValueError): - can.logger._parse_additonal_config(["wrongformat="]) + can.logger._parse_additional_config(["wrongformat="]) class TestLoggerCompressedFile(unittest.TestCase):