Skip to content

Commit

Permalink
implemented joinmatches fix for issue 69
Browse files Browse the repository at this point in the history
  • Loading branch information
dmulyalin committed Jun 13, 2022
1 parent 4d3e632 commit 16c98a5
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 28 deletions.
57 changes: 56 additions & 1 deletion test/pytest/test_answers_and_docs.py
Original file line number Diff line number Diff line change
Expand Up @@ -7140,4 +7140,59 @@ def test_to_int_with_dynamic_path_issue_67_multiptocess_mode():
102: {'bar': 345, 'baz': False, 'biz': False}}} in res

# if __name__ == '__main__':
# test_to_int_with_dynamic_path_issue_67_multiptocess_mode()
# test_to_int_with_dynamic_path_issue_67_multiptocess_mode()

def test_issue_69_fix():
template1 = """
<input load="text">
snmp-server chassis-id test
snmp-server host 2.2.2.2 version 2c public
snmp-server host 1.1.1.1 version 2c public
snmp-server enable traps bgp
snmp-server enable traps entity
</input>
<group name="snmp.config" expand="" >
snmp-server chassis-id {{ chassis_id }}
<group name="servers*" expand="" >
snmp-server host {{ server }} version {{ version }} {{ community }}
</group>
snmp-server enable traps {{ traps | joinmatches(',') | to_list }}
</group>
"""
template2 = """
<input load="text">
snmp-server chassis-id test
snmp-server enable traps bgp
snmp-server enable traps entity
snmp-server host 2.2.2.2 version 2c public
snmp-server host 1.1.1.1 version 2c public
</input>
<group name="snmp.config" expand="" >
snmp-server chassis-id {{ chassis_id }}
<group name="servers*" expand="" >
snmp-server host {{ server }} version {{ version }} {{ community }}
</group>
snmp-server enable traps {{ traps | joinmatches(',') | to_list }}
</group>
"""
parser1 = ttp(template=template1)
parser1.parse()
res1 = parser1.result()
pprint.pprint(res1)

parser2 = ttp(template=template2)
parser2.parse()
res2 = parser2.result()
pprint.pprint(res2)

assert res1 == res2 == [[{'snmp': {'config': {'chassis_id': 'test',
'servers': [{'community': 'public',
'server': '2.2.2.2',
'version': '2c'},
{'community': 'public',
'server': '1.1.1.1',
'version': '2c'}],
'traps': ['bgp', 'entity']}}}]]
# test_issue_69_fix()
69 changes: 42 additions & 27 deletions ttp/ttp.py
Original file line number Diff line number Diff line change
Expand Up @@ -3062,33 +3062,48 @@ def add(self, result, PATH, DEFAULTS=None, FUNCTIONS=None, REDICT=""):
def join(self, result, PATH, DEFAULTS=None, FUNCTIONS=None, REDICT=""):
DEFAULTS = DEFAULTS or {}
FUNCTIONS = FUNCTIONS or []
# if path not the same, results belong to different group, skip them
if self.record["PATH"] != PATH:
return
# retrieve joinchar to use
joinchar = "\n"
for varname, varvalue in result.items():
# check if need to skip vars that were added to results on the go
if not varname in REDICT["VARIABLES"]:
continue
for item in REDICT["VARIABLES"][varname].functions:
if item["name"] == "joinmatches":
joinchar = item["args"][0] if item["args"] else joinchar
break
# join results:
for k in result.keys():
if k in self.record["result"]: # if we already have results
if isinstance(self.record["result"][k], str):
self.record["result"][k] += joinchar + result[k] # join strings
elif isinstance(self.record["result"][k], list):
if isinstance(result[k], list):
self.record["result"][k] += result[k] # join lists
else:
self.record["result"][k].append(result[k]) # append to list
else: # transform result to list and append new result to it
self.record["result"][k] = [self.record["result"][k], result[k]]
else:
self.record["result"][k] = result[k] # if first result
# if same path - save into self.record
if self.record["PATH"] == PATH:
# retrieve joinchar to use
joinchar = "\n"
for varname, varvalue in result.items():
# check if need to skip vars that were added to results on the go
if not varname in REDICT["VARIABLES"]:
continue
for item in REDICT["VARIABLES"][varname].functions:
if item["name"] == "joinmatches":
joinchar = item["args"][0] if item["args"] else joinchar
break
# join results:
for k in result.keys():
if k in self.record["result"]: # if we already have results
if isinstance(self.record["result"][k], str):
self.record["result"][k] += joinchar + result[k] # join strings
elif isinstance(self.record["result"][k], list):
if isinstance(result[k], list):
self.record["result"][k] += result[k] # join lists
else:
self.record["result"][k].append(result[k]) # append to list
else: # transform result to list and append new result to it
self.record["result"][k] = [self.record["result"][k], result[k]]
else:
self.record["result"][k] = result[k] # if first result
# if different path - that can happen if we have group ended and result
# actually belongs to another already started group, hence need to save
# directly into results
elif REDICT["GROUP"].group_id in self.started_groups:
# save current results to results structure and start new record by calling self.start
self.start(
result=result,
PATH=PATH,
DEFAULTS=DEFAULTS,
FUNCTIONS=FUNCTIONS,
REDICT=REDICT,
)
# mark new record as needed to be merged with last item in results
self.record["merge_with_last"] = True
# no need to add DEFAULTS for this record as DEFAULTS processed already by previous group record
self.record["DEFAULTS"] = {}

def end(self, result, PATH, DEFAULTS=None, FUNCTIONS=None, REDICT=""):
DEFAULTS = DEFAULTS or {}
Expand Down

0 comments on commit 16c98a5

Please sign in to comment.