From 2363bab6d165340af1d89ce696b5d77e326d4ef8 Mon Sep 17 00:00:00 2001 From: Kyle Altendorf Date: Tue, 17 Mar 2020 10:15:25 -0400 Subject: [PATCH 1/4] Comma split for .sym enumerations #462 --- src/canmatrix/formats/sym.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/canmatrix/formats/sym.py b/src/canmatrix/formats/sym.py index f3758ae1..bdc86852 100644 --- a/src/canmatrix/formats/sym.py +++ b/src/canmatrix/formats/sym.py @@ -360,7 +360,7 @@ class Mode(object): line = line.split('//')[0] temp_array = line[5:].strip().rstrip(')').split('(', 1) val_table_name = temp_array[0] - split = canmatrix.utils.quote_aware_space_split(temp_array[1]) + split = canmatrix.utils.quote_aware_comma_split(temp_array[1]) temp_array = [s.rstrip(',') for s in split] temp_val_table = {} for entry in temp_array: From c6b44156c234c23d718c5803d270c6fc828c056e Mon Sep 17 00:00:00 2001 From: Kyle Altendorf Date: Tue, 17 Mar 2020 23:22:03 -0400 Subject: [PATCH 2/4] add preliminary tests --- src/canmatrix/tests/test_sym.py | 58 +++++++++++++++++++++++++++++++ src/canmatrix/tests/test_utils.py | 7 ++++ 2 files changed, 65 insertions(+) diff --git a/src/canmatrix/tests/test_sym.py b/src/canmatrix/tests/test_sym.py index 80b1d4fa..27ff9b2b 100644 --- a/src/canmatrix/tests/test_sym.py +++ b/src/canmatrix/tests/test_sym.py @@ -141,3 +141,61 @@ def tests_parse_float(variable_type, bit_length): frame = matrix.frames[0] signal = frame.signals[0] assert signal.is_float + + +def tests_value_tables(): + f = io.BytesIO( + textwrap.dedent( + '''\ + FormatVersion=5.0 // Do not edit this line! + Title="AFE_CAN_ID0" + + {ENUMS} + enum State(0="Power On Reset, and a quoted comma", 1="Ready,set,go", 2="Following",3="Fault", + 4="Forming", 5="N/A", 6="N/A",7="N/A",8="N/A",9="N/A", 10="N/A",11="N/A", + 12="N/A", 13="N/A",14="N/A", 15="N/A") + enum Relay(0="Open", 1="Closed",2="Error",3="N/A") + + {SENDRECEIVE} + [StatusBits] + ID=0CFFC3F7h + Type=Extended + DLC=8 + Var=State_status unsigned 0,16 /e:State + Var=MX2Permissive_status unsigned 32,16 /e:Relay + ''' + ).encode('utf-8'), + ) + + matrix = canmatrix.formats.sym.load(f) + + assert matrix.load_errors == [] + + expected = { + 'Relay': { + 0: 'Open', + 1: 'Closed', + 2: 'Error', + 3: 'N/A', + }, + 'State': { + 0:"Power On Reset, and a quoted comma", + 1: "Ready,set,go", + 2: "Following", + 3: "Fault", + 4: "Forming", + 5: "N/A", + 6: "N/A", + 7: "N/A", + 8: "N/A", + 9: "N/A", + 10: "N/A", + 11: "N/A", + 12: "N/A", + 13: "N/A", + 14: "N/A", + 15: "N/A", + } + } + + assert matrix.value_tables == expected \ No newline at end of file diff --git a/src/canmatrix/tests/test_utils.py b/src/canmatrix/tests/test_utils.py index 356990c1..adc60786 100644 --- a/src/canmatrix/tests/test_utils.py +++ b/src/canmatrix/tests/test_utils.py @@ -10,7 +10,14 @@ def test_utils_guess_value(): assert canmatrix.utils.guess_value("False") == "0" assert canmatrix.utils.guess_value("faLse") == "0" + def test_decode_number(): assert canmatrix.utils.decode_number("0x10") == 16 assert canmatrix.utils.decode_number("0b10") == 2 assert canmatrix.utils.decode_number("10") == 10 + + +def test_quote_aware_comma_split(): + example = '"a,b", c"d,e", f' + split = canmatrix.utils.quote_aware_comma_split(example) + assert split == ['a,b', 'c"d,e"', 'f'] From f0dbe9376da8e686ad6e3ca6d2f6928529e4680c Mon Sep 17 00:00:00 2001 From: Kyle Altendorf Date: Wed, 18 Mar 2020 08:50:10 -0400 Subject: [PATCH 3/4] Space split but with a regexp --- src/canmatrix/formats/sym.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/canmatrix/formats/sym.py b/src/canmatrix/formats/sym.py index bdc86852..f8e9d620 100644 --- a/src/canmatrix/formats/sym.py +++ b/src/canmatrix/formats/sym.py @@ -33,6 +33,7 @@ from builtins import * import attr +import re import canmatrix import canmatrix.utils @@ -323,6 +324,8 @@ class Mode(object): db.add_signal_defines("HexadecimalOutput", 'BOOL False True') db.add_signal_defines("DisplayDecimalPlaces", 'INT 0 65535') db.add_signal_defines("LongName", 'STR') + + kvpair_splitting_pattern = re.compile(r'(\",)(\d+=)') for line_count, line in enumerate(f, 1): try: @@ -360,7 +363,7 @@ class Mode(object): line = line.split('//')[0] temp_array = line[5:].strip().rstrip(')').split('(', 1) val_table_name = temp_array[0] - split = canmatrix.utils.quote_aware_comma_split(temp_array[1]) + split = canmatrix.utils.quote_aware_space_split(re.sub(kvpair_splitting_pattern, r'\1 \2', temp_array[1])) temp_array = [s.rstrip(',') for s in split] temp_val_table = {} for entry in temp_array: From dccd29dece3fc8e0405ffbc906b91bb77aa143b2 Mon Sep 17 00:00:00 2001 From: Kyle Altendorf Date: Wed, 18 Mar 2020 08:51:49 -0400 Subject: [PATCH 4/4] more test cases for comma splitting sym enums --- src/canmatrix/tests/test_sym.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/canmatrix/tests/test_sym.py b/src/canmatrix/tests/test_sym.py index 27ff9b2b..39603923 100644 --- a/src/canmatrix/tests/test_sym.py +++ b/src/canmatrix/tests/test_sym.py @@ -151,8 +151,8 @@ def tests_value_tables(): Title="AFE_CAN_ID0" {ENUMS} - enum State(0="Power On Reset, and a quoted comma", 1="Ready,set,go", 2="Following",3="Fault", - 4="Forming", 5="N/A", 6="N/A",7="N/A",8="N/A",9="N/A", 10="N/A",11="N/A", + enum State(0="Power On Reset, and a quoted comma", 1=",Ready,set,go", 2="Following",3="Fault", + 4="Forming" , 5="N/A", 6="N/A",7="N/A",8="N/A",9="N/A", 10="N/A",11="N/A", 12="N/A", 13="N/A",14="N/A", 15="N/A") enum Relay(0="Open", 1="Closed",2="Error",3="N/A") @@ -180,7 +180,7 @@ def tests_value_tables(): }, 'State': { 0:"Power On Reset, and a quoted comma", - 1: "Ready,set,go", + 1: ",Ready,set,go", 2: "Following", 3: "Fault", 4: "Forming",