Skip to content

Commit 4db969d

Browse files
authored
Allowing for extra config arguments in can.logger (#1170)
1 parent 9080c47 commit 4db969d

File tree

3 files changed

+36
-23
lines changed

3 files changed

+36
-23
lines changed

can/logger.py

+17-7
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,13 @@ def _create_base_argument_parser(parser: argparse.ArgumentParser) -> None:
5858
)
5959

6060
parser.add_argument(
61-
"--app_name",
62-
help="""App name can be necessary in the initializer. For example with Vector.""",
61+
"extra_args",
62+
nargs=argparse.REMAINDER,
63+
help="""\
64+
The remainding arguments will be used for the interface initialisation.
65+
For example, `-i vector -c 1 --app-name=MyCanApp` is the equivalent to
66+
opening the bus with `Bus('vector', channel=1, app_name='MyCanApp')`
67+
""",
6368
)
6469

6570

@@ -102,8 +107,6 @@ def _create_bus(parsed_args: Any, **kwargs: Any) -> can.Bus:
102107
config["fd"] = True
103108
if parsed_args.data_bitrate:
104109
config["data_bitrate"] = parsed_args.data_bitrate
105-
if parsed_args.app_name:
106-
config["app_name"] = parsed_args.app_name
107110

108111
return Bus(parsed_args.channel, **config) # type: ignore
109112

@@ -129,6 +132,13 @@ def _parse_filters(parsed_args: Any) -> CanFilters:
129132
return can_filters
130133

131134

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+
)
140+
141+
132142
def main() -> None:
133143
parser = argparse.ArgumentParser(
134144
description="Log CAN traffic, printing messages to stdout or to a given file.",
@@ -179,9 +189,9 @@ def main() -> None:
179189
parser.print_help(sys.stderr)
180190
raise SystemExit(errno.EINVAL)
181191

182-
results = parser.parse_args()
183-
184-
bus = _create_bus(results, can_filters=_parse_filters(results))
192+
results, unknown_args = parser.parse_known_args()
193+
additional_config = _parse_additonal_config(unknown_args)
194+
bus = _create_bus(results, can_filters=_parse_filters(results), **additional_config)
185195

186196
if results.active:
187197
bus.state = BusState.ACTIVE

can/viewer.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
_parse_filters,
3737
_append_filter_argument,
3838
_create_base_argument_parser,
39+
_parse_additonal_config,
3940
)
4041

4142

@@ -480,7 +481,7 @@ def parse_args(args):
480481
parser.print_help(sys.stderr)
481482
raise SystemExit(errno.EINVAL)
482483

483-
parsed_args = parser.parse_args(args)
484+
parsed_args, unknown_args = parser.parse_known_args(args)
484485

485486
can_filters = _parse_filters(parsed_args)
486487

@@ -534,13 +535,15 @@ def parse_args(args):
534535
else:
535536
data_structs[key] = struct.Struct(fmt)
536537

537-
return parsed_args, can_filters, data_structs
538+
additional_config = _parse_additonal_config(unknown_args)
539+
return parsed_args, can_filters, data_structs, additional_config
538540

539541

540542
def main() -> None:
541-
parsed_args, can_filters, data_structs = parse_args(sys.argv[1:])
543+
parsed_args, can_filters, data_structs, additional_config = parse_args(sys.argv[1:])
542544

543-
additional_config = {"can_filters": can_filters} if can_filters else {}
545+
if can_filters:
546+
additional_config.update({"can_filters": can_filters})
544547
bus = _create_bus(parsed_args, **additional_config)
545548
# print(f"Connected to {bus.__class__.__name__}: {bus.channel_info}")
546549

test/test_viewer.py

+12-12
Original file line numberDiff line numberDiff line change
@@ -381,19 +381,19 @@ def test_pack_unpack(self):
381381
)
382382

383383
def test_parse_args(self):
384-
parsed_args, _, _ = parse_args(["-b", "250000"])
384+
parsed_args, _, _, _ = parse_args(["-b", "250000"])
385385
self.assertEqual(parsed_args.bitrate, 250000)
386386

387-
parsed_args, _, _ = parse_args(["--bitrate", "500000"])
387+
parsed_args, _, _, _ = parse_args(["--bitrate", "500000"])
388388
self.assertEqual(parsed_args.bitrate, 500000)
389389

390-
parsed_args, _, _ = parse_args(["-c", "can0"])
390+
parsed_args, _, _, _ = parse_args(["-c", "can0"])
391391
self.assertEqual(parsed_args.channel, "can0")
392392

393-
parsed_args, _, _ = parse_args(["--channel", "PCAN_USBBUS1"])
393+
parsed_args, _, _, _ = parse_args(["--channel", "PCAN_USBBUS1"])
394394
self.assertEqual(parsed_args.channel, "PCAN_USBBUS1")
395395

396-
parsed_args, _, data_structs = parse_args(["-d", "100:<L"])
396+
parsed_args, _, data_structs, _ = parse_args(["-d", "100:<L"])
397397
self.assertEqual(parsed_args.decode, ["100:<L"])
398398

399399
self.assertIsInstance(data_structs, dict)
@@ -406,7 +406,7 @@ def test_parse_args(self):
406406
f = open("test.txt", "w")
407407
f.write("100:<BB\n101:<HH\n")
408408
f.close()
409-
parsed_args, _, data_structs = parse_args(["-d", "test.txt"])
409+
parsed_args, _, data_structs, _ = parse_args(["-d", "test.txt"])
410410

411411
self.assertIsInstance(data_structs, dict)
412412
self.assertEqual(len(data_structs), 2)
@@ -420,7 +420,7 @@ def test_parse_args(self):
420420
self.assertEqual(data_structs[0x101].size, 4)
421421
os.remove("test.txt")
422422

423-
parsed_args, _, data_structs = parse_args(
423+
parsed_args, _, data_structs, _ = parse_args(
424424
["--decode", "100:<LH:10.:100.", "101:<ff", "102:<Bf:1:57.3"]
425425
)
426426
self.assertEqual(
@@ -453,14 +453,14 @@ def test_parse_args(self):
453453
self.assertEqual(data_structs[0x102][1], 1)
454454
self.assertAlmostEqual(data_structs[0x102][2], 57.3)
455455

456-
parsed_args, can_filters, _ = parse_args(["-f", "100:7FF"])
456+
parsed_args, can_filters, _, _ = parse_args(["-f", "100:7FF"])
457457
self.assertEqual(parsed_args.filter, ["100:7FF"])
458458
self.assertIsInstance(can_filters, list)
459459
self.assertIsInstance(can_filters[0], dict)
460460
self.assertEqual(can_filters[0]["can_id"], 0x100)
461461
self.assertEqual(can_filters[0]["can_mask"], 0x7FF)
462462

463-
parsed_args, can_filters, _ = parse_args(["-f", "101:7FF", "102:7FC"])
463+
parsed_args, can_filters, _, _ = parse_args(["-f", "101:7FF", "102:7FC"])
464464
self.assertEqual(parsed_args.filter, ["101:7FF", "102:7FC"])
465465
self.assertIsInstance(can_filters, list)
466466
self.assertIsInstance(can_filters[0], dict)
@@ -473,17 +473,17 @@ def test_parse_args(self):
473473
with self.assertRaises(argparse.ArgumentError):
474474
parse_args(["-f", "101,7FF"])
475475

476-
parsed_args, can_filters, _ = parse_args(["--filter", "100~7FF"])
476+
parsed_args, can_filters, _, _ = parse_args(["--filter", "100~7FF"])
477477
self.assertEqual(parsed_args.filter, ["100~7FF"])
478478
self.assertIsInstance(can_filters, list)
479479
self.assertIsInstance(can_filters[0], dict)
480480
self.assertEqual(can_filters[0]["can_id"], 0x100 | 0x20000000)
481481
self.assertEqual(can_filters[0]["can_mask"], 0x7FF & 0x20000000)
482482

483-
parsed_args, _, _ = parse_args(["-i", "socketcan"])
483+
parsed_args, _, _, _ = parse_args(["-i", "socketcan"])
484484
self.assertEqual(parsed_args.interface, "socketcan")
485485

486-
parsed_args, _, _ = parse_args(["--interface", "pcan"])
486+
parsed_args, _, _, _ = parse_args(["--interface", "pcan"])
487487
self.assertEqual(parsed_args.interface, "pcan")
488488

489489
# Make sure it exits with the correct error code when displaying the help page

0 commit comments

Comments
 (0)