Skip to content

Commit 6afd120

Browse files
committed
detect types in _parse_additonal_config
1 parent 0c4dee0 commit 6afd120

File tree

2 files changed

+48
-7
lines changed

2 files changed

+48
-7
lines changed

can/logger.py

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@
1313
1414
Dynamic Controls 2010
1515
"""
16-
16+
import re
1717
import sys
1818
import argparse
1919
from datetime import datetime
2020
import errno
21-
from typing import Any, Dict, List, Union
21+
from typing import Any, Dict, List, Union, Sequence, Tuple
2222

2323
import can
2424
from . import Bus, BusState, Logger, SizedRotatingLogger
@@ -132,11 +132,28 @@ def _parse_filters(parsed_args: Any) -> CanFilters:
132132
return can_filters
133133

134134

135-
def _parse_additonal_config(unknown_args):
136-
return dict(
137-
(arg.split("=", 1)[0].lstrip("--").replace("-", "_"), arg.split("=", 1)[1])
138-
for arg in unknown_args
139-
)
135+
def _parse_additonal_config(
136+
unknown_args: Sequence[str],
137+
) -> Dict[str, Union[str, int, float, bool]]:
138+
def _split_arg(_arg: str) -> Tuple[str, str]:
139+
left, right = _arg.split("=", 1)
140+
return left.lstrip("--").replace("-", "_"), right
141+
142+
args: Dict[str, Union[str, int, float, bool]] = {}
143+
for key, string_val in map(_split_arg, unknown_args):
144+
if re.match(r"^[-+]?\d+$", string_val):
145+
# value is integer
146+
args[key] = int(string_val)
147+
elif re.match(r"^[-+]?\d*\.\d+$", string_val):
148+
# value is float
149+
args[key] = float(string_val)
150+
elif re.match(r"^(?:True|False)$", string_val):
151+
# value is bool
152+
args[key] = string_val == "True"
153+
else:
154+
# value is string
155+
args[key] = string_val
156+
return args
140157

141158

142159
def main() -> None:

test/test_logger.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,30 @@ def test_log_virtual_sizedlogger(self):
105105
self.assertSuccessfullCleanup()
106106
self.mock_logger_sized.assert_called_once()
107107

108+
def test_parse_additonal_config(self):
109+
unknown_args = [
110+
"--app-name=CANalyzer",
111+
"--serial=5555",
112+
"--receive-own-messages=True",
113+
"--offset=1.5",
114+
]
115+
parsed_args = can.logger._parse_additonal_config(unknown_args)
116+
117+
assert "app_name" in parsed_args
118+
assert parsed_args["app_name"] == "CANalyzer"
119+
120+
assert "serial" in parsed_args
121+
assert parsed_args["serial"] == 5555
122+
123+
assert "receive_own_messages" in parsed_args
124+
assert (
125+
isinstance(parsed_args["receive_own_messages"], bool)
126+
and parsed_args["receive_own_messages"] is True
127+
)
128+
129+
assert "offset" in parsed_args
130+
assert parsed_args["offset"] == 1.5
131+
108132

109133
class TestLoggerCompressedFile(unittest.TestCase):
110134
def setUp(self) -> None:

0 commit comments

Comments
 (0)