From 3ff0c76081c6876bde81fc900472c2c53675c44b Mon Sep 17 00:00:00 2001 From: mas2hc Date: Fri, 27 Oct 2023 10:21:24 +0700 Subject: [PATCH 01/21] Enhancement ticket 100 - for test cases JPP_0256, JPP_0258 --- JsonPreprocessor/CJsonPreprocessor.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index dbf5d6ad..ed7d3502 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -557,6 +557,7 @@ def __jsonUpdated(k, v, oJson, bNested, keyNested = ''): globals().update({k:v}) def __loadNestedValue(initValue: str, sInputStr: str): + pattern = "\${\s*[0-9A-Za-z_]+[0-9A-Za-z\.\-_]*\s*}(\[+\s*'[0-9A-Za-z\._]+'\s*\]+|\[+\s*\d+\s*\]+)*" bStringValue = False if re.search("(str\(\s*" + pattern + "\))", sInputStr.lower()): sInputStr = re.sub("str\(\s*(" + pattern + ")\s*\)", "$\\1", sInputStr) @@ -578,6 +579,7 @@ def __loadNestedValue(initValue: str, sInputStr: str): ldict = {} exec(sExec, globals(), ldict) if bStringValue: + pattern = "\${\s*[0-9A-Za-z_]+[0-9A-Za-z\.\-_]*\s*}(\[+\s*'[^\$]+'\s*\]+|\[+\s*\d+\s*\]+)*" sInputStr = re.sub("(\$" + pattern + ")", str(ldict['value']), sInputStr, count=1) else: sInputStr = re.sub("\$\$", "$", sInputStr) @@ -703,6 +705,8 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: if "${" in sInputStr: if re.match("\s*{*\[*\".+\"\s*", sInputStr.lower()) and sInputStr.count("\"")==2 \ and re.search("(" + nestedPattern + ")*", sInputStr.lower()): + dictPattern = "\[+\s*'[0-9A-Za-z\.\-_${}\[\]]*'\s*\]+|\[+\s*\d+\s*\]+|\[+\s*\${\s*" + variablePattern + "\s*}\s*\]+" + nestedPattern = "\${\s*" + variablePattern + "(\${\s*" + variablePattern + "\s*})*" + "\s*}(" + dictPattern +")*" lNestedParam = re.findall("(" + nestedPattern + ")", sInputStr) lNestedBase = [] tmpList = [] @@ -710,9 +714,16 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: if nestedParam[0].count("${") > 1: tmpNested = nestedParam[0] if "[" in tmpNested: - pattern = "\[\s*(\${\s*" + variablePattern + "\s*})\s*\]" + pattern = "\[\s*'*\s*(\${\s*[0-9A-Za-z\.\-_${}\[\]]*\s*})\s*'*\s*\]" lNestedBase.append(re.findall(pattern, tmpNested)[0]) for item in re.findall(pattern, tmpNested): + tmpItem = item + while tmpItem.count("${") > 1: + newItem = re.sub("(\${\s*" + variablePattern + "\s*})", "str(\\1)", item) + tmpNested = tmpNested.replace(item, newItem) + item = newItem + tmpItem = re.sub("(str\(.+\))", "", item) + sInputStr = sInputStr.replace(nestedParam[0], tmpNested) patternItem = re.sub(r'([$()\[\]])', r'\\\1', item) tmpNested = re.sub("(" + patternItem + ")", "str(\\1)", tmpNested) sInputStr = re.sub("(" + patternItem + ")", "str(\\1)", sInputStr) @@ -739,6 +750,8 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: sInputStr = __recursiveNestedHandling(sInputStr, tmpList) elif re.match("^\s*" + nestedPattern + "\s*,*\]*}*\s*$", sInputStr.lower()): + dictPattern = "\[+\s*'.+'\s*\]+|\[+\s*\d+\s*\]+|\[+\s*\${\s*" + variablePattern + "\s*}\s*\]+" + nestedPattern = "\${\s*" + variablePattern + "(\${\s*" + variablePattern + "\s*})*" + "\s*}(" + dictPattern +")*" sInputStr = re.sub("(" + nestedPattern + ")", "\"\\1\"", sInputStr) nestedParam = re.sub("^\s*\"(.+)\"\s*.*$", "\\1", sInputStr) self.lNestedParams.append(nestedParam) @@ -827,6 +840,7 @@ def __handleListElements(sInput : str) -> str: return newItem def __handleDuplicatedKey(dInput : dict) -> dict: + pattern = "\${\s*[0-9A-Za-z_]+[0-9A-Za-z\.\-_]*\s*}(\[+\s*'[0-9A-Za-z\._]+'\s*\]+|\[+\s*\d+\s*\]+)*" tmpDict = copy.deepcopy(dInput) for k, v in tmpDict.items(): if isinstance(v, list) and v[0]==CNameMangling.DUPLICATEDKEY_01.value: From a21afa13672d76653a5749978955f59bbd7a2a38 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Mon, 30 Oct 2023 17:07:18 +0700 Subject: [PATCH 02/21] Adds new JsonPreprocessor Selftest test cases --- test/testconfig/TestConfig.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/testconfig/TestConfig.py b/test/testconfig/TestConfig.py index c98cbb8a..b80a642c 100644 --- a/test/testconfig/TestConfig.py +++ b/test/testconfig/TestConfig.py @@ -1124,7 +1124,7 @@ dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0256.jsonp" dictUsecase['EXPECTEDEXCEPTION'] = "The variable '${IAMNOTEXISTING}' is not available!" dictUsecase['EXPECTEDRETURN'] = None -# # # listofdictUsecases.append(dictUsecase) +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} @@ -1152,7 +1152,7 @@ dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0258.jsonp" dictUsecase['EXPECTEDEXCEPTION'] = "The variable '${IAMNOTEXISTING}' is not available!" dictUsecase['EXPECTEDRETURN'] = None -# # # listofdictUsecases.append(dictUsecase) +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} From 422921b4ed5e9991124597aa5df9854b0f171170 Mon Sep 17 00:00:00 2001 From: Mai Dinh Nam Son Date: Mon, 30 Oct 2023 21:50:31 +0700 Subject: [PATCH 03/21] Fixed selftest issue for test case ID JPP_0265 --- JsonPreprocessor/CJsonPreprocessor.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index ed7d3502..6012e0c0 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -542,10 +542,6 @@ def __jsonUpdated(k, v, oJson, bNested, keyNested = ''): else: if CNameMangling.AVOIDDATATYPE.value in k: k = re.sub(CNameMangling.AVOIDDATATYPE.value, "", k) - elif re.search("[\[\]\(\)\s{}]", k): - errorMsg = f"Setting value '{v}' for parameter '{k}' is not permissible \ -when substituting parameters of composite data types in dictionary key names!" - raise Exception(errorMsg) oJson[k] = v globals().update({k:v}) @@ -556,7 +552,7 @@ def __jsonUpdated(k, v, oJson, bNested, keyNested = ''): oJson[k] = v globals().update({k:v}) - def __loadNestedValue(initValue: str, sInputStr: str): + def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): pattern = "\${\s*[0-9A-Za-z_]+[0-9A-Za-z\.\-_]*\s*}(\[+\s*'[0-9A-Za-z\._]+'\s*\]+|\[+\s*\d+\s*\]+)*" bStringValue = False if re.search("(str\(\s*" + pattern + "\))", sInputStr.lower()): @@ -587,6 +583,13 @@ def __loadNestedValue(initValue: str, sInputStr: str): except: self.__reset() raise Exception(f"The variable '{valueProcessed}' is not available!") + if bKey and type(ldict['value']) in [list, dict]: + self.__reset() + while 'str(' in key: + key = re.sub("str\(([0-9A-Za-z\._\${}'\[\]]+)\)", "\\1", key) + errorMsg = f"Could not substitute parameter '{key}' due to a composite data types \ +in dictionary key names! The value of parameter '{valueProcessed}' is {ldict['value']}" + raise Exception(errorMsg) return sInputStr if bool(self.currentCfg) and not recursive: @@ -607,7 +610,7 @@ def __loadNestedValue(initValue: str, sInputStr: str): keyNested = k bNested = True while "${" in k: - k = __loadNestedValue(keyNested, k) + k = __loadNestedValue(keyNested, k, bKey=True, key=keyNested) elif re.match("^\s*" + pattern + "\s*$", k.lower()): keyNested = k k = re.sub("\$", "$$", k) From f005c587a9391bc7df473ec59088d131e6701ad0 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Wed, 1 Nov 2023 17:35:15 +0700 Subject: [PATCH 04/21] Updated error message log --- JsonPreprocessor/CJsonPreprocessor.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 6012e0c0..633c1350 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -587,8 +587,8 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): self.__reset() while 'str(' in key: key = re.sub("str\(([0-9A-Za-z\._\${}'\[\]]+)\)", "\\1", key) - errorMsg = f"Could not substitute parameter '{key}' due to a composite data types \ -in dictionary key names! The value of parameter '{valueProcessed}' is {ldict['value']}" + errorMsg = f"Could not substitute parameter '{key}'! Composite data types are not allowed. \ +The value of parameter '{valueProcessed}' is {ldict['value']}" raise Exception(errorMsg) return sInputStr From 8015387a3019ed3cddafd611b4575bb22d6748af Mon Sep 17 00:00:00 2001 From: mas2hc Date: Thu, 2 Nov 2023 08:55:24 +0700 Subject: [PATCH 05/21] Update error message log regarding ticket 101 --- JsonPreprocessor/CJsonPreprocessor.py | 7 ++++++- test/testconfig/TestConfig.py | 6 +++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 633c1350..33a9af4e 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -983,7 +983,12 @@ def __removeDuplicatedKey(dInput : dict) -> dict: sJsonDataUpdated = sJsonDataUpdated + newLine + "\n" else: if "${" in line: - raise Exception(f"Invalid parameter format in line: {line.strip()}") + invalidPattern1 = "\${\s*[0-9A-Za-z\._]*\[.+\][0-9A-Za-z\._]*\s*}" + if re.search(invalidPattern1, line): + raise Exception(f"Invalid syntax: Found index inside curly brackets in line '{line.strip()}'. \ +Indices in square brackets have to be placed outside the curly brackets.") + else: + raise Exception(f"Invalid parameter format in line: {line.strip()}") sJsonDataUpdated = sJsonDataUpdated + line + "\n" CJSONDecoder = None diff --git a/test/testconfig/TestConfig.py b/test/testconfig/TestConfig.py index b80a642c..13d6705b 100644 --- a/test/testconfig/TestConfig.py +++ b/test/testconfig/TestConfig.py @@ -1415,7 +1415,7 @@ dictUsecase['HINT'] = "Checklist rule 1 / pattern 1" dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0350.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "Invalid parameter format" +dictUsecase['EXPECTEDEXCEPTION'] = "Invalid syntax: Found index" dictUsecase['EXPECTEDRETURN'] = None listofdictUsecases.append(dictUsecase) del dictUsecase @@ -1429,7 +1429,7 @@ dictUsecase['HINT'] = "Checklist rule 1 / pattern 2" dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0351.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "Invalid parameter format" +dictUsecase['EXPECTEDEXCEPTION'] = "Invalid syntax: Found index" dictUsecase['EXPECTEDRETURN'] = None listofdictUsecases.append(dictUsecase) del dictUsecase @@ -1443,7 +1443,7 @@ dictUsecase['HINT'] = "Checklist rule 1 / pattern 3" dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0352.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "Invalid parameter format" +dictUsecase['EXPECTEDEXCEPTION'] = "Invalid syntax: Found index" dictUsecase['EXPECTEDRETURN'] = None listofdictUsecases.append(dictUsecase) del dictUsecase From 8bc9541afc7686c05e77fdc469b67285f8aed1a7 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Thu, 2 Nov 2023 13:22:49 +0700 Subject: [PATCH 06/21] Improved error message log regarding ticket 135 --- JsonPreprocessor/CJsonPreprocessor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 33a9af4e..16545f73 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -758,7 +758,7 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: sInputStr = re.sub("(" + nestedPattern + ")", "\"\\1\"", sInputStr) nestedParam = re.sub("^\s*\"(.+)\"\s*.*$", "\\1", sInputStr) self.lNestedParams.append(nestedParam) - elif re.search("(" + nestedPattern + ")*", sInputStr.lower()) and sInputStr.count("${")>1: + elif re.search("(" + nestedPattern + ")*", sInputStr.lower()) and (sInputStr.count("${")>1 or sInputStr.count("}")>1): raise Exception(f"Invalid nested parameter format: {sInputStr} - The double quotes are missing!!!") elif "," in sInputStr: listPattern = "^\s*(\"*" + nestedPattern + "\"*\s*,+\s*|" + valueStrPattern + "\s*,+\s*|" + valueNumberPattern + "\s*,+\s*)+" + \ From a144eac25c1e1b1b283e2b6e13668b975b9d9287 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Thu, 2 Nov 2023 13:22:49 +0700 Subject: [PATCH 07/21] Improved error message log regarding ticket 135 --- JsonPreprocessor/CJsonPreprocessor.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 16545f73..5b1b83d3 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -758,7 +758,8 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: sInputStr = re.sub("(" + nestedPattern + ")", "\"\\1\"", sInputStr) nestedParam = re.sub("^\s*\"(.+)\"\s*.*$", "\\1", sInputStr) self.lNestedParams.append(nestedParam) - elif re.search("(" + nestedPattern + ")*", sInputStr.lower()) and (sInputStr.count("${")>1 or sInputStr.count("}")>1): + elif re.search("(" + nestedPattern + ")*", sInputStr.lower()) and \ + (sInputStr.count("${")>1 or sInputStr.count("}")>1 or sInputStr.count("{")>1): raise Exception(f"Invalid nested parameter format: {sInputStr} - The double quotes are missing!!!") elif "," in sInputStr: listPattern = "^\s*(\"*" + nestedPattern + "\"*\s*,+\s*|" + valueStrPattern + "\s*,+\s*|" + valueNumberPattern + "\s*,+\s*)+" + \ From 2ef6cedb139c53b42318f7912ae06765aeaf1cc8 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Fri, 3 Nov 2023 11:28:22 +0700 Subject: [PATCH 08/21] Enhancement 150, add write method for JsonPreprocessor --- JsonPreprocessor/CJsonPreprocessor.py | 32 +++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 5b1b83d3..c249db76 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -1059,3 +1059,35 @@ def __removeDuplicatedKey(dInput : dict) -> dict: self.__reset() __removeDuplicatedKey(oJson) return oJson + + def jsonDump(self, oJson : dict, outFile : str) -> str: + ''' + This function is the entry point of JsonPreprocessor. + + It loads the json file, preprocesses it and returns the preprocessed result as data structure. + +**Args:** + + **oJson** (*dictionary*) + + Json/Dictionary object. + + **outFile** (*string*) + + Relative/absolute path to main json file. + + ``%envvariable%`` and ``${envvariable}`` can be used, too in order to access environment variables. + +**Returns:** + + **outFile** (*string*) + + Absolute path to main json file. + ''' + + outFile = CString.NormalizePath(outFile, sReferencePathAbs=os.path.dirname(sys.argv[0])) + jsonObject = json.dumps(oJson, ensure_ascii=False, indent=4) + with open(outFile, "w", encoding='utf-8') as f: + f.write(jsonObject) + + return outFile \ No newline at end of file From ff480404de3591759a3afa3f119ef2590ff60d04 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Fri, 3 Nov 2023 11:28:22 +0700 Subject: [PATCH 09/21] Enhancement 150, add write method for JsonPreprocessor --- JsonPreprocessor/CJsonPreprocessor.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index c249db76..bb29582a 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -1062,9 +1062,9 @@ def __removeDuplicatedKey(dInput : dict) -> dict: def jsonDump(self, oJson : dict, outFile : str) -> str: ''' - This function is the entry point of JsonPreprocessor. + This function is used to write a json file from dictionary object. - It loads the json file, preprocesses it and returns the preprocessed result as data structure. + It loads the dict object, write a new json file, and returns the path of new json file. **Args:** From 20b10d71dc36acec61d347e4d7ec64dd8746e323 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Fri, 3 Nov 2023 17:04:42 +0700 Subject: [PATCH 10/21] Enhancement 155, Invalid error message --- JsonPreprocessor/CJsonPreprocessor.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index bb29582a..1f89b54e 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -746,6 +746,8 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: else: tmpList.append("str(" + nestedParam[0] + ")") nestedBasePattern = re.sub(r'([$()\[\]])', r'\\\1', nestedParam[0]) + nestedBasePattern = nestedBasePattern.replace("{", "\{") + nestedBasePattern = nestedBasePattern.replace("}", "\}") sInputStr = re.sub("(" + nestedBasePattern + ")", "str(\\1)", sInputStr) lNestedBase.append(nestedParam[0]) for nestedBase in lNestedBase: @@ -934,6 +936,10 @@ def __removeDuplicatedKey(dInput : dict) -> dict: raise Exception(f"\n{str(error)} in line: '{line}'") if re.search(pattern, line): + lNestedVar = re.findall("\${\s*([0-9A-Za-z_]+[0-9A-Za-z\.\-_]*)\s*}", line) + for nestedVar in lNestedVar: + if nestedVar[0].isdigit(): + raise Exception(f"Invalid parameter format in line: {line.strip()}") tmpList = re.findall("(\"[^\"]+\")", line) line = re.sub("(\"[^\"]+\")", CNameMangling.COLONS.value, line) items = re.split("\s*:\s*", line) From 96e6e18d6b507a5de2a0f14e951978468a11cdbf Mon Sep 17 00:00:00 2001 From: mas2hc Date: Fri, 10 Nov 2023 09:20:38 +0700 Subject: [PATCH 11/21] Enhancement - Update error message log, ticket 156 --- JsonPreprocessor/CJsonPreprocessor.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 1f89b54e..c7a4f2e0 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -706,7 +706,9 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: valueNumberPattern = "[0-9\.]+" if "${" in sInputStr: - if re.match("\s*{*\[*\".+\"\s*", sInputStr.lower()) and sInputStr.count("\"")==2 \ + if re.search("\${\s*}", sInputStr): + raise Exception(f"Invalid parameter format: {sInputStr}") + elif re.match("\s*{*\[*\".+\"\s*", sInputStr.lower()) and sInputStr.count("\"")==2 \ and re.search("(" + nestedPattern + ")*", sInputStr.lower()): dictPattern = "\[+\s*'[0-9A-Za-z\.\-_${}\[\]]*'\s*\]+|\[+\s*\d+\s*\]+|\[+\s*\${\s*" + variablePattern + "\s*}\s*\]+" nestedPattern = "\${\s*" + variablePattern + "(\${\s*" + variablePattern + "\s*})*" + "\s*}(" + dictPattern +")*" @@ -790,7 +792,7 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: newInputStr = newInputStr + item if tmpItem==items[len(items)-1] else newInputStr + item + "," sInputStr = newInputStr else: - raise Exception(f"Invalid nested parameter format: {sInputStr}") + raise Exception(f"Invalid parameter format: {sInputStr}") sOutput = sInputStr return sOutput From 10604ce77d7609af4df783d296e8b41030909d9d Mon Sep 17 00:00:00 2001 From: mas2hc Date: Fri, 10 Nov 2023 11:29:08 +0700 Subject: [PATCH 12/21] Enhancement - Unfavorable error message, ticket 162 --- JsonPreprocessor/CJsonPreprocessor.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index c7a4f2e0..9b20dbc2 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -582,6 +582,10 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): sInputStr = ldict['value'] except: self.__reset() + if CNameMangling.DUPLICATEDKEY_00.value in valueProcessed: + valueProcessed = valueProcessed.replace(CNameMangling.DUPLICATEDKEY_00.value, '') + elif CNameMangling.DUPLICATEDKEY_02.value in valueProcessed: + valueProcessed = valueProcessed.replace(CNameMangling.DUPLICATEDKEY_02.value, '') raise Exception(f"The variable '{valueProcessed}' is not available!") if bKey and type(ldict['value']) in [list, dict]: self.__reset() From c8720a9bc1eab6873452b32a7773c4eb48972d29 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Fri, 10 Nov 2023 13:21:13 +0700 Subject: [PATCH 13/21] Fix bug - Invalid error message, ticket 163 --- JsonPreprocessor/CJsonPreprocessor.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 9b20dbc2..188829a6 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -716,12 +716,15 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: and re.search("(" + nestedPattern + ")*", sInputStr.lower()): dictPattern = "\[+\s*'[0-9A-Za-z\.\-_${}\[\]]*'\s*\]+|\[+\s*\d+\s*\]+|\[+\s*\${\s*" + variablePattern + "\s*}\s*\]+" nestedPattern = "\${\s*" + variablePattern + "(\${\s*" + variablePattern + "\s*})*" + "\s*}(" + dictPattern +")*" - lNestedParam = re.findall("(" + nestedPattern + ")", sInputStr) + lNestedParam = [] + for item in re.findall("(" + nestedPattern + ")", sInputStr): + if item[0] not in lNestedParam: + lNestedParam.append(item[0]) lNestedBase = [] tmpList = [] for nestedParam in lNestedParam: - if nestedParam[0].count("${") > 1: - tmpNested = nestedParam[0] + if nestedParam.count("${") > 1: + tmpNested = nestedParam if "[" in tmpNested: pattern = "\[\s*'*\s*(\${\s*[0-9A-Za-z\.\-_${}\[\]]*\s*})\s*'*\s*\]" lNestedBase.append(re.findall(pattern, tmpNested)[0]) @@ -732,7 +735,7 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: tmpNested = tmpNested.replace(item, newItem) item = newItem tmpItem = re.sub("(str\(.+\))", "", item) - sInputStr = sInputStr.replace(nestedParam[0], tmpNested) + sInputStr = sInputStr.replace(nestedParam, tmpNested) patternItem = re.sub(r'([$()\[\]])', r'\\\1', item) tmpNested = re.sub("(" + patternItem + ")", "str(\\1)", tmpNested) sInputStr = re.sub("(" + patternItem + ")", "str(\\1)", sInputStr) @@ -750,12 +753,12 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: sInputStr = re.sub("(" + pattern + ")", "str(\\1)", sInputStr) tmpList.append("str(" + tmpNested + ")") else: - tmpList.append("str(" + nestedParam[0] + ")") - nestedBasePattern = re.sub(r'([$()\[\]])', r'\\\1', nestedParam[0]) + tmpList.append("str(" + nestedParam + ")") + nestedBasePattern = re.sub(r'([$()\[\]])', r'\\\1', nestedParam) nestedBasePattern = nestedBasePattern.replace("{", "\{") nestedBasePattern = nestedBasePattern.replace("}", "\}") sInputStr = re.sub("(" + nestedBasePattern + ")", "str(\\1)", sInputStr) - lNestedBase.append(nestedParam[0]) + lNestedBase.append(nestedParam) for nestedBase in lNestedBase: self.lNestedParams.append(nestedBase) From dbd6dea3171637e6af5862f600c89e660955bcf6 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Fri, 10 Nov 2023 21:04:25 +0700 Subject: [PATCH 14/21] Enhancement - update nested parameter format, ticket 136 --- JsonPreprocessor/CJsonPreprocessor.py | 42 ++++++++++++++++++++------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 188829a6..9d460ae8 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -66,6 +66,7 @@ class CNameMangling(Enum): DUPLICATEDKEY_00 = "__rootDuplicatedKey__" DUPLICATEDKEY_01 = "__handleDuplicatedKey__" DUPLICATEDKEY_02 = "__RecursiveInitialValue__" + STRINGCONVERT = "__ConvertParameterToString__" class CPythonJSONDecoder(json.JSONDecoder): """ @@ -366,7 +367,7 @@ def __referVarHandle(referVar : str, sInputStr : str) -> str: sInputStr = re.sub('\$\${\s*([^\}]*)\s*}', sParam, sInputStr) referVar = re.findall('(\$\${\s*.*?\s*})', sInputStr)[0] tmpReferVar = re.sub("\$", "\\$", referVar) - pattern = '(' + tmpReferVar + '\s*\[\s*.*?\s*\])' + pattern = '(' + tmpReferVar + '\s*\[+\s*.*?\s*\]+)' variable = re.findall(pattern, sInputStr) if variable == []: return referVar @@ -553,8 +554,15 @@ def __jsonUpdated(k, v, oJson, bNested, keyNested = ''): globals().update({k:v}) def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): - pattern = "\${\s*[0-9A-Za-z_]+[0-9A-Za-z\.\-_]*\s*}(\[+\s*'[0-9A-Za-z\._]+'\s*\]+|\[+\s*\d+\s*\]+)*" + varPattern = "\${\s*[0-9A-Za-z_]+[0-9A-Za-z\.\-_]*\s*}" + dictPattern = "(\[+\s*'[^\$\[\]\(\)]+'\s*\]+|\[+\s*\d+\s*\]+|\[+\s*" + varPattern + ".*\]+)*" + pattern = varPattern + dictPattern bStringValue = False + bValueConvertString = False + if CNameMangling.STRINGCONVERT.value in sInputStr: + bValueConvertString = True + sInputStr = sInputStr.replace(CNameMangling.STRINGCONVERT.value, '') + initValue = initValue.replace(CNameMangling.STRINGCONVERT.value, '') if re.search("(str\(\s*" + pattern + "\))", sInputStr.lower()): sInputStr = re.sub("str\(\s*(" + pattern + ")\s*\)", "$\\1", sInputStr) bStringValue = True @@ -579,7 +587,7 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): sInputStr = re.sub("(\$" + pattern + ")", str(ldict['value']), sInputStr, count=1) else: sInputStr = re.sub("\$\$", "$", sInputStr) - sInputStr = ldict['value'] + sInputStr = str(ldict['value']) if bValueConvertString else ldict['value'] except: self.__reset() if CNameMangling.DUPLICATEDKEY_00.value in valueProcessed: @@ -594,6 +602,8 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): errorMsg = f"Could not substitute parameter '{key}'! Composite data types are not allowed. \ The value of parameter '{valueProcessed}' is {ldict['value']}" raise Exception(errorMsg) + if "${" not in str(sInputStr): + break return sInputStr if bool(self.currentCfg) and not recursive: @@ -615,6 +625,14 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): bNested = True while "${" in k: k = __loadNestedValue(keyNested, k, bKey=True, key=keyNested) + elif CNameMangling.STRINGCONVERT.value in k: + del oJson[k] + k = k.replace(CNameMangling.STRINGCONVERT.value, '') + oJson[k] = v + keyNested = k + bNested = True + while "${" in k: + k = __loadNestedValue(keyNested, k) elif re.match("^\s*" + pattern + "\s*$", k.lower()): keyNested = k k = re.sub("\$", "$$", k) @@ -704,7 +722,7 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: return sInputStr variablePattern = "[0-9A-Za-z_]+[0-9A-Za-z\.\-_]*" - dictPattern = "\[+\s*'.+'\s*\]+|\[+\s*\d+\s*\]+|\[+\s*\${\s*" + variablePattern + "\s*}\s*\]+" + dictPattern = "\[+\s*'.+'\s*\]+|\[+\s*\d+\s*\]+|\[+\s*\${\s*" + variablePattern + "\s*}.*\]+" nestedPattern = "\${\s*" + variablePattern + "(\${\s*" + variablePattern + "\s*})*" + "\s*}(" + dictPattern +")*" valueStrPattern = "[\"|\']\s*[0-9A-Za-z_\-\s*]+[\"|\']" valueNumberPattern = "[0-9\.]+" @@ -712,6 +730,16 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: if "${" in sInputStr: if re.search("\${\s*}", sInputStr): raise Exception(f"Invalid parameter format: {sInputStr}") + elif re.match("^\s*" + nestedPattern + "\s*,*\]*}*\s*$", sInputStr.lower()): + dictPattern = "\[+\s*'.+'\s*\]+|\[+\s*\d+\s*\]+|\[+\s*\${\s*" + variablePattern + "\s*}.*\]+" + nestedPattern = "\${\s*" + variablePattern + "(\${\s*" + variablePattern + "\s*})*" + "\s*}(" + dictPattern +")*" + sInputStr = re.sub("(" + nestedPattern + ")", "\"\\1\"", sInputStr) + nestedParam = re.sub("^\s*\"(.+)\"\s*.*$", "\\1", sInputStr) + self.lNestedParams.append(nestedParam) + elif re.match("^\s*\"\s*" + nestedPattern + "\"\s*,*\]*}*\s*$", sInputStr.lower()): + nestedParam = re.sub("^\s*\"(.+)\"\s*.*$", "\\1", sInputStr) + self.lNestedParams.append(nestedParam) + sInputStr = sInputStr.replace(nestedParam, nestedParam + CNameMangling.STRINGCONVERT.value) elif re.match("\s*{*\[*\".+\"\s*", sInputStr.lower()) and sInputStr.count("\"")==2 \ and re.search("(" + nestedPattern + ")*", sInputStr.lower()): dictPattern = "\[+\s*'[0-9A-Za-z\.\-_${}\[\]]*'\s*\]+|\[+\s*\d+\s*\]+|\[+\s*\${\s*" + variablePattern + "\s*}\s*\]+" @@ -763,12 +791,6 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: self.lNestedParams.append(nestedBase) sInputStr = __recursiveNestedHandling(sInputStr, tmpList) - elif re.match("^\s*" + nestedPattern + "\s*,*\]*}*\s*$", sInputStr.lower()): - dictPattern = "\[+\s*'.+'\s*\]+|\[+\s*\d+\s*\]+|\[+\s*\${\s*" + variablePattern + "\s*}\s*\]+" - nestedPattern = "\${\s*" + variablePattern + "(\${\s*" + variablePattern + "\s*})*" + "\s*}(" + dictPattern +")*" - sInputStr = re.sub("(" + nestedPattern + ")", "\"\\1\"", sInputStr) - nestedParam = re.sub("^\s*\"(.+)\"\s*.*$", "\\1", sInputStr) - self.lNestedParams.append(nestedParam) elif re.search("(" + nestedPattern + ")*", sInputStr.lower()) and \ (sInputStr.count("${")>1 or sInputStr.count("}")>1 or sInputStr.count("{")>1): raise Exception(f"Invalid nested parameter format: {sInputStr} - The double quotes are missing!!!") From 70885b3377d2c738b2006a00da63b1e754901131 Mon Sep 17 00:00:00 2001 From: qth2hi Date: Mon, 20 Nov 2023 16:16:38 +0100 Subject: [PATCH 15/21] Activated test cases: JPP_0206, JPP_0208, JPP_0209, JPP_0261, JPP_0263, JPP_0264, JPP_0265, JPP_0266, JPP_0267, JPP_0360, JPP_0362, JPP_0363, JPP_0364, JPP_0365, JPP_0366, JPP_0503 --- test/JPP_TestUsecases.csv | 18 + test/JPP_TestUsecases.html | 864 +++++++++++++++--- test/JPP_TestUsecases.rst | 194 +++- test/JPP_TestUsecases.txt | 80 +- test/component_test.py | 4 +- ...test_03_PARAMETER_SUBSTITUTION_GOODCASE.py | 26 +- .../test_04_PARAMETER_SUBSTITUTION_BADCASE.py | 66 +- .../test_06_VALUE_DETECTION_BADCASE.py | 50 +- .../test_07_COMPOSITE_EXPRESSIONS_GOODCASE.py | 10 +- test/testconfig/TestConfig.py | 56 +- 10 files changed, 1200 insertions(+), 168 deletions(-) diff --git a/test/JPP_TestUsecases.csv b/test/JPP_TestUsecases.csv index e7ce6900..0e4d7cd3 100644 --- a/test/JPP_TestUsecases.csv +++ b/test/JPP_TestUsecases.csv @@ -13,15 +13,26 @@ JPP_0202|PARAMETER_SUBSTITUTION|GOODCASE|JSON file with nested parameter / index JPP_0203|PARAMETER_SUBSTITUTION|GOODCASE|JSON file with nested parameter / index parameter substitution in parameter name / dotdict notation JPP_0204|PARAMETER_SUBSTITUTION|GOODCASE|JSON file with nested parameter / index parameter substitution in parameter value / standard notation JPP_0205|PARAMETER_SUBSTITUTION|GOODCASE|JSON file with nested parameter / index parameter substitution in parameter value / dotdict notation +JPP_0206|PARAMETER_SUBSTITUTION|GOODCASE|JSON file with nested parameter / key parameter substitution in parameter name / standard notation JPP_0207|PARAMETER_SUBSTITUTION|GOODCASE|JSON file with nested parameter / key parameter substitution in parameter name / dotdict notation +JPP_0208|PARAMETER_SUBSTITUTION|GOODCASE|JSON file with nested parameter / key parameter substitution in parameter value / standard notation +JPP_0209|PARAMETER_SUBSTITUTION|GOODCASE|JSON file with nested parameter / key parameter substitution in parameter value / dotdict notation JPP_0250|PARAMETER_SUBSTITUTION|BADCASE|JSON file with nested parameter / string parameter substitution in parameter value / innermost parameter not existing JPP_0251|PARAMETER_SUBSTITUTION|BADCASE|JSON file with nested parameter / string parameter substitution in parameter name / in between parameter not existing JPP_0252|PARAMETER_SUBSTITUTION|BADCASE|JSON file with nested parameter / index parameter substitution in parameter name / standard notation / index parameter not existing JPP_0253|PARAMETER_SUBSTITUTION|BADCASE|JSON file with nested parameter / index parameter substitution in parameter name / dotdict notation / index parameter not existing JPP_0254|PARAMETER_SUBSTITUTION|BADCASE|JSON file with nested parameter / index parameter substitution in parameter value / standard notation / index parameter not existing JPP_0255|PARAMETER_SUBSTITUTION|BADCASE|JSON file with nested parameter / index parameter substitution in parameter value / dotdict notation / index parameter not existing +JPP_0256|PARAMETER_SUBSTITUTION|BADCASE|JSON file with nested parameter / key parameter substitution in parameter name / standard notation / variant number not existing JPP_0257|PARAMETER_SUBSTITUTION|BADCASE|JSON file with nested parameter / key parameter substitution in parameter name / dotdict notation / milestone number not existing +JPP_0258|PARAMETER_SUBSTITUTION|BADCASE|JSON file with nested parameter / key parameter substitution in parameter value / standard notation / variant number not existing JPP_0259|PARAMETER_SUBSTITUTION|BADCASE|JSON file with nested parameter / key parameter substitution in parameter value / dotdict notation / milestone number not existing +JPP_0261|PARAMETER_SUBSTITUTION|BADCASE|JSON file with list parameter substitution in parameter name (composite data types not allowed in names) / (2) +JPP_0263|PARAMETER_SUBSTITUTION|BADCASE|JSON file with dictionary parameter substitution in parameter name (composite data types not allowed in names) / (2) +JPP_0264|PARAMETER_SUBSTITUTION|BADCASE|JSON file with list parameter substitution in key name (composite data types not allowed in names) / (1) +JPP_0265|PARAMETER_SUBSTITUTION|BADCASE|JSON file with list parameter substitution in key name (composite data types not allowed in names) / (2) +JPP_0266|PARAMETER_SUBSTITUTION|BADCASE|JSON file with dictionary parameter substitution in key name (composite data types not allowed in names) / (1) +JPP_0267|PARAMETER_SUBSTITUTION|BADCASE|JSON file with dictionary parameter substitution in key name (composite data types not allowed in names) / (2) JPP_0300|VALUE_DETECTION|GOODCASE|JSON file with parameter of type 'list' / index (in square brackets) defined outside the curly brackets (valid syntax) JPP_0301|VALUE_DETECTION|GOODCASE|JSON file with expression containing more closing elements '}' than opening elements '${' (valid syntax) JPP_0302|VALUE_DETECTION|GOODCASE|JSON file with expression starting with '${' and ending with '}' / no further matching '${' and '}' in between (valid syntax) @@ -36,7 +47,13 @@ JPP_0356|VALUE_DETECTION|BADCASE|JSON file with expression containing more openi JPP_0357|VALUE_DETECTION|BADCASE|JSON file with expression containing more opening elements '${' than closing elements '}' (invalid syntax 5) JPP_0358|VALUE_DETECTION|BADCASE|JSON file with expression containing more opening elements '${' than closing elements '}' (invalid syntax 6) JPP_0359|VALUE_DETECTION|BADCASE|JSON file with expression containing more opening elements '${' than closing elements '}' (invalid syntax 6) +JPP_0360|VALUE_DETECTION|BADCASE|JSON file with expression containing more opening elements '${' than closing elements '}' (invalid syntax 9) JPP_0361|VALUE_DETECTION|BADCASE|JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 1) +JPP_0362|VALUE_DETECTION|BADCASE|JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 2) +JPP_0363|VALUE_DETECTION|BADCASE|JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 3) +JPP_0364|VALUE_DETECTION|BADCASE|JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 4) +JPP_0365|VALUE_DETECTION|BADCASE|JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 5) +JPP_0366|VALUE_DETECTION|BADCASE|JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 6) JPP_0367|VALUE_DETECTION|BADCASE|JSON file with expression starting with '${' and ending with '}', further matching '${' and '}' in between (not all nested) (invalid syntax 1) JPP_0368|VALUE_DETECTION|BADCASE|JSON file with expression starting with '${' and ending with '}', further matching '${' and '}' in between (not all nested) (invalid syntax 2) JPP_0369|VALUE_DETECTION|BADCASE|JSON file with expression starting with '${' and ending with '}', further matching '${' and '}' in between (not all nested) (invalid syntax 3) @@ -45,6 +62,7 @@ JPP_0371|VALUE_DETECTION|BADCASE|JSON file with expression starting with '${' an JPP_0500|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file with composite data structure (nested lists and dictionaries 1) JPP_0501|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file with composite data structure (nested lists and dictionaries 2) JPP_0502|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file with composite data structure (nested lists and dictionaries 3 / some key names with dots inside) +JPP_0503|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file with composite data structure (some lists) JPP_0505|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file with composite strings containing several times a colon and a comma (JSON syntax elements) JPP_0506|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file with composite strings containing several combinations of curly brackets and special characters before JPP_0507|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file containing several string concatenations in separate lines (1) diff --git a/test/JPP_TestUsecases.html b/test/JPP_TestUsecases.html index d092480f..e37e35da 100644 --- a/test/JPP_TestUsecases.html +++ b/test/JPP_TestUsecases.html @@ -463,6 +463,39 @@ 14 + + + +JPP_0206 + + + + +PARAMETER_SUBSTITUTION + + + + +GOODCASE + + + + +JSON file with nested parameter / key parameter substitution in parameter name / standard notation
+Expected: JsonPreprocessor creates a new string with all dollar operator expressions resolved as string + + +
+ + + + + + + +15 + + @@ -493,7 +526,73 @@ -15 +16 + + + + + +JPP_0208 + + + + +PARAMETER_SUBSTITUTION + + + + +GOODCASE + + + + +JSON file with nested parameter / key parameter substitution in parameter value / standard notation
+Expected: JsonPreprocessor creates a new string with all dollar operator expressions resolved as string + + +
+ + + + + + + +17 + + + + + +JPP_0209 + + + + +PARAMETER_SUBSTITUTION + + + + +GOODCASE + + + + +JSON file with nested parameter / key parameter substitution in parameter value / dotdict notation
+Expected: JsonPreprocessor creates a new string with all dollar operator expressions resolved as string + + +
+ + + + + + + +18 @@ -526,7 +625,7 @@ -16 +19 @@ -559,7 +658,7 @@ -17 +20 @@ -592,7 +691,7 @@ -18 +21 @@ -613,10 +712,474 @@ -JSON file with nested parameter / index parameter substitution in parameter name / dotdict notation / index parameter not existing
-Expected: No values are returned, and JsonPreprocessor throws an exception - +JSON file with nested parameter / index parameter substitution in parameter name / dotdict notation / index parameter not existing
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +22 + + + + + +JPP_0254 + + + + +PARAMETER_SUBSTITUTION + + + + +BADCASE + + + + +JSON file with nested parameter / index parameter substitution in parameter value / standard notation / index parameter not existing
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +23 + + + + + +JPP_0255 + + + + +PARAMETER_SUBSTITUTION + + + + +BADCASE + + + + +JSON file with nested parameter / index parameter substitution in parameter value / dotdict notation / index parameter not existing
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +24 + + + + + +JPP_0256 + + + + +PARAMETER_SUBSTITUTION + + + + +BADCASE + + + + +JSON file with nested parameter / key parameter substitution in parameter name / standard notation / variant number not existing
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +25 + + + + + +JPP_0257 + + + + +PARAMETER_SUBSTITUTION + + + + +BADCASE + + + + +JSON file with nested parameter / key parameter substitution in parameter name / dotdict notation / milestone number not existing
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +26 + + + + + +JPP_0258 + + + + +PARAMETER_SUBSTITUTION + + + + +BADCASE + + + + +JSON file with nested parameter / key parameter substitution in parameter value / standard notation / variant number not existing
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +27 + + + + + +JPP_0259 + + + + +PARAMETER_SUBSTITUTION + + + + +BADCASE + + + + +JSON file with nested parameter / key parameter substitution in parameter value / dotdict notation / milestone number not existing
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +28 + + + + + +JPP_0261 + + + + +PARAMETER_SUBSTITUTION + + + + +BADCASE + + + + +JSON file with list parameter substitution in parameter name (composite data types not allowed in names) / (2)
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +29 + + + + + +JPP_0263 + + + + +PARAMETER_SUBSTITUTION + + + + +BADCASE + + + + +JSON file with dictionary parameter substitution in parameter name (composite data types not allowed in names) / (2)
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +30 + + + + + +JPP_0264 + + + + +PARAMETER_SUBSTITUTION + + + + +BADCASE + + + + +JSON file with list parameter substitution in key name (composite data types not allowed in names) / (1)
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +31 + + + + + +JPP_0265 + + + + +PARAMETER_SUBSTITUTION + + + + +BADCASE + + + + +JSON file with list parameter substitution in key name (composite data types not allowed in names) / (2)
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +32 + + + + + +JPP_0266 + + + + +PARAMETER_SUBSTITUTION + + + + +BADCASE + + + + +JSON file with dictionary parameter substitution in key name (composite data types not allowed in names) / (1)
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +33 + + + + + +JPP_0267 + + + + +PARAMETER_SUBSTITUTION + + + + +BADCASE + + + + +JSON file with dictionary parameter substitution in key name (composite data types not allowed in names) / (2)
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +34 + + + + + +JPP_0300 + + + + +VALUE_DETECTION + + + + +GOODCASE + + + + +JSON file with parameter of type 'list' / index (in square brackets) defined outside the curly brackets (valid syntax)
+Expected: JsonPreprocessor returns values + +
+Checklist rule 1 +
+ + + + + + + +35 + + + + + +JPP_0301 + + + + +VALUE_DETECTION + + + + +GOODCASE + + + + +JSON file with expression containing more closing elements '}' than opening elements '${' (valid syntax)
+Expected: JsonPreprocessor returns values +
+Checklist rule 3
@@ -625,31 +1188,32 @@ -19 +36 -JPP_0254 +JPP_0302 -PARAMETER_SUBSTITUTION +VALUE_DETECTION - -BADCASE + +GOODCASE -JSON file with nested parameter / index parameter substitution in parameter value / standard notation / index parameter not existing
-Expected: No values are returned, and JsonPreprocessor throws an exception - +JSON file with expression starting with '${' and ending with '}' / no further matching '${' and '}' in between (valid syntax)
+Expected: JsonPreprocessor returns values +
+Checklist rule 4
@@ -658,31 +1222,32 @@ -20 +37 -JPP_0255 +JPP_0304 -PARAMETER_SUBSTITUTION +VALUE_DETECTION - -BADCASE + +GOODCASE -JSON file with nested parameter / index parameter substitution in parameter value / dotdict notation / index parameter not existing
-Expected: No values are returned, and JsonPreprocessor throws an exception - +JSON file with expression starting with '${' and ending with '}', further matching '${' and '}' in between (not all nested) (valid syntax)
+Expected: JsonPreprocessor returns values +
+Checklist rule 6
@@ -691,18 +1256,18 @@ -21 +38 -JPP_0257 +JPP_0350 -PARAMETER_SUBSTITUTION +VALUE_DETECTION @@ -712,10 +1277,11 @@ -JSON file with nested parameter / key parameter substitution in parameter name / dotdict notation / milestone number not existing
+JSON file with parameter of type 'list' / index (in square brackets) defined inside the curly brackets (invalid syntax 1)
Expected: No values are returned, and JsonPreprocessor throws an exception - +
+Checklist rule 1 / pattern 1
@@ -724,18 +1290,18 @@ -22 +39 -JPP_0259 +JPP_0351 -PARAMETER_SUBSTITUTION +VALUE_DETECTION @@ -745,10 +1311,11 @@ -JSON file with nested parameter / key parameter substitution in parameter value / dotdict notation / milestone number not existing
+JSON file with parameter of type 'list' / index (in square brackets) defined inside the curly brackets (invalid syntax 2)
Expected: No values are returned, and JsonPreprocessor throws an exception - +
+Checklist rule 1 / pattern 2
@@ -757,13 +1324,13 @@ -23 +40 -JPP_0300 +JPP_0352 @@ -772,17 +1339,17 @@
- -GOODCASE + +BADCASE -JSON file with parameter of type 'list' / index (in square brackets) defined outside the curly brackets (valid syntax)
-Expected: JsonPreprocessor returns values +JSON file with parameter of type 'list' / index (in square brackets) defined inside the curly brackets (invalid syntax 3)
+Expected: No values are returned, and JsonPreprocessor throws an exception
-Checklist rule 1 +Checklist rule 1 / pattern 3
@@ -791,13 +1358,13 @@ -24 +41 -JPP_0301 +JPP_0353 @@ -806,17 +1373,17 @@
- -GOODCASE + +BADCASE -JSON file with expression containing more closing elements '}' than opening elements '${' (valid syntax)
-Expected: JsonPreprocessor returns values +JSON file with expression containing more opening elements '${' than closing elements '}' (invalid syntax 1)
+Expected: No values are returned, and JsonPreprocessor throws an exception
-Checklist rule 3 +Checklist rule 2 / pattern 1
@@ -825,13 +1392,13 @@ -25 +42 -JPP_0302 +JPP_0354 @@ -840,17 +1407,17 @@
- -GOODCASE + +BADCASE -JSON file with expression starting with '${' and ending with '}' / no further matching '${' and '}' in between (valid syntax)
-Expected: JsonPreprocessor returns values +JSON file with expression containing more opening elements '${' than closing elements '}' (invalid syntax 2)
+Expected: No values are returned, and JsonPreprocessor throws an exception
-Checklist rule 4 +Checklist rule 2 / pattern 2
@@ -859,13 +1426,13 @@ -26 +43 -JPP_0304 +JPP_0355 @@ -874,17 +1441,17 @@
- -GOODCASE + +BADCASE -JSON file with expression starting with '${' and ending with '}', further matching '${' and '}' in between (not all nested) (valid syntax)
-Expected: JsonPreprocessor returns values +JSON file with expression containing more opening elements '${' than closing elements '}' (invalid syntax 3)
+Expected: No values are returned, and JsonPreprocessor throws an exception
-Checklist rule 6 +Checklist rule 2 / pattern 3
@@ -893,13 +1460,13 @@ -27 +44 -JPP_0350 +JPP_0356 @@ -914,11 +1481,11 @@ -JSON file with parameter of type 'list' / index (in square brackets) defined inside the curly brackets (invalid syntax 1)
+JSON file with expression containing more opening elements '${' than closing elements '}' (invalid syntax 4)
Expected: No values are returned, and JsonPreprocessor throws an exception
-Checklist rule 1 / pattern 1 +Checklist rule 2 / pattern 4
@@ -927,13 +1494,13 @@ -28 +45 -JPP_0351 +JPP_0357 @@ -948,11 +1515,11 @@ -JSON file with parameter of type 'list' / index (in square brackets) defined inside the curly brackets (invalid syntax 2)
+JSON file with expression containing more opening elements '${' than closing elements '}' (invalid syntax 5)
Expected: No values are returned, and JsonPreprocessor throws an exception
-Checklist rule 1 / pattern 2 +Checklist rule 2 / pattern 5
@@ -961,13 +1528,13 @@ -29 +46 -JPP_0352 +JPP_0358 @@ -982,11 +1549,11 @@ -JSON file with parameter of type 'list' / index (in square brackets) defined inside the curly brackets (invalid syntax 3)
+JSON file with expression containing more opening elements '${' than closing elements '}' (invalid syntax 6)
Expected: No values are returned, and JsonPreprocessor throws an exception
-Checklist rule 1 / pattern 3 +Checklist rule 2 / pattern 6
@@ -995,13 +1562,13 @@ -30 +47 -JPP_0353 +JPP_0359 @@ -1016,11 +1583,11 @@ -JSON file with expression containing more opening elements '${' than closing elements '}' (invalid syntax 1)
+JSON file with expression containing more opening elements '${' than closing elements '}' (invalid syntax 6)
Expected: No values are returned, and JsonPreprocessor throws an exception
-Checklist rule 2 / pattern 1 +Checklist rule 2 / pattern 7
@@ -1029,13 +1596,13 @@ -31 +48 -JPP_0354 +JPP_0360 @@ -1050,11 +1617,11 @@ -JSON file with expression containing more opening elements '${' than closing elements '}' (invalid syntax 2)
+JSON file with expression containing more opening elements '${' than closing elements '}' (invalid syntax 9)
Expected: No values are returned, and JsonPreprocessor throws an exception
-Checklist rule 2 / pattern 2 +Checklist rule 2 / pattern 8
@@ -1063,13 +1630,13 @@ -32 +49 -JPP_0355 +JPP_0361 @@ -1084,11 +1651,11 @@ -JSON file with expression containing more opening elements '${' than closing elements '}' (invalid syntax 3)
+JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 1)
Expected: No values are returned, and JsonPreprocessor throws an exception
-Checklist rule 2 / pattern 3 +Checklist rule 3 / pattern 1
@@ -1097,13 +1664,13 @@ -33 +50 -JPP_0356 +JPP_0362 @@ -1118,11 +1685,11 @@ -JSON file with expression containing more opening elements '${' than closing elements '}' (invalid syntax 4)
+JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 2)
Expected: No values are returned, and JsonPreprocessor throws an exception
-Checklist rule 2 / pattern 4 +Checklist rule 3 / pattern 2
@@ -1131,13 +1698,13 @@ -34 +51 -JPP_0357 +JPP_0363 @@ -1152,11 +1719,11 @@ -JSON file with expression containing more opening elements '${' than closing elements '}' (invalid syntax 5)
+JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 3)
Expected: No values are returned, and JsonPreprocessor throws an exception
-Checklist rule 2 / pattern 5 +Checklist rule 3 / pattern 3
@@ -1165,13 +1732,13 @@ -35 +52 -JPP_0358 +JPP_0364 @@ -1186,11 +1753,11 @@ -JSON file with expression containing more opening elements '${' than closing elements '}' (invalid syntax 6)
+JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 4)
Expected: No values are returned, and JsonPreprocessor throws an exception
-Checklist rule 2 / pattern 6 +Checklist rule 3 / pattern 4
@@ -1199,13 +1766,13 @@ -36 +53 -JPP_0359 +JPP_0365 @@ -1220,11 +1787,11 @@ -JSON file with expression containing more opening elements '${' than closing elements '}' (invalid syntax 6)
+JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 5)
Expected: No values are returned, and JsonPreprocessor throws an exception
-Checklist rule 2 / pattern 7 +Checklist rule 3 / pattern 5
@@ -1233,13 +1800,13 @@ -37 +54 -JPP_0361 +JPP_0366 @@ -1254,11 +1821,11 @@ -JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 1)
+JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 6)
Expected: No values are returned, and JsonPreprocessor throws an exception
-Checklist rule 3 / pattern 1 +Checklist rule 3 / pattern 6
@@ -1267,7 +1834,7 @@ -38 +55 @@ -1301,7 +1868,7 @@ -39 +56 @@ -1335,7 +1902,7 @@ -40 +57 @@ -1369,7 +1936,7 @@ -41 +58 @@ -1403,7 +1970,7 @@ -42 +59 @@ -1437,7 +2004,7 @@ -43 +60 @@ -1471,7 +2038,7 @@ -44 +61 @@ -1505,7 +2072,7 @@ -45 +62 @@ -1539,7 +2106,40 @@ -46 +63 + + + + + +JPP_0503 + + + + +COMPOSITE_EXPRESSIONS + + + + +GOODCASE + + + + +JSON file with composite data structure (some lists)
+Expected: JsonPreprocessor returns expected value + + +
+ + + + + + + +64 @@ -1572,7 +2172,7 @@ -47 +65 @@ -1605,7 +2205,7 @@ -48 +66 @@ -1638,7 +2238,7 @@ -49 +67 @@ -1671,7 +2271,7 @@ -50 +68 @@ -1704,7 +2304,7 @@ -51 +69 @@ -1737,7 +2337,7 @@ -52 +70 @@ -1771,7 +2371,7 @@ -53 +71 @@ -1804,7 +2404,7 @@ -54 +72 @@ -1837,7 +2437,7 @@ -55 +73 @@ -1870,7 +2470,7 @@ -56 +74 @@ -1903,7 +2503,7 @@ -57 +75 @@ -1936,7 +2536,7 @@ -58 +76 @@ -1969,7 +2569,7 @@ -59 +77 @@ -2002,7 +2602,7 @@ -60 +78 @@ -2035,7 +2635,7 @@ -61 +79 @@ -2068,7 +2668,7 @@ -62 +80 @@ -2101,7 +2701,7 @@ -63 +81 @@ -2135,7 +2735,7 @@
 

-
Generated: 18.10.2023 - 17:37:45
+
Generated: 20.11.2023 - 15:42:16
 
diff --git a/test/JPP_TestUsecases.rst b/test/JPP_TestUsecases.rst index 7c806efd..b8213208 100644 --- a/test/JPP_TestUsecases.rst +++ b/test/JPP_TestUsecases.rst @@ -145,6 +145,16 @@ Test Use Cases ---- +* **Test JPP_0206** + + [PARAMETER_SUBSTITUTION / GOODCASE] + + **JSON file with nested parameter / key parameter substitution in parameter name / standard notation** + + Expected: JsonPreprocessor creates a new string with all dollar operator expressions resolved as string + +---- + * **Test JPP_0207** [PARAMETER_SUBSTITUTION / GOODCASE] @@ -155,6 +165,26 @@ Test Use Cases ---- +* **Test JPP_0208** + + [PARAMETER_SUBSTITUTION / GOODCASE] + + **JSON file with nested parameter / key parameter substitution in parameter value / standard notation** + + Expected: JsonPreprocessor creates a new string with all dollar operator expressions resolved as string + +---- + +* **Test JPP_0209** + + [PARAMETER_SUBSTITUTION / GOODCASE] + + **JSON file with nested parameter / key parameter substitution in parameter value / dotdict notation** + + Expected: JsonPreprocessor creates a new string with all dollar operator expressions resolved as string + +---- + * **Test JPP_0250** [PARAMETER_SUBSTITUTION / BADCASE] @@ -215,6 +245,16 @@ Test Use Cases ---- +* **Test JPP_0256** + + [PARAMETER_SUBSTITUTION / BADCASE] + + **JSON file with nested parameter / key parameter substitution in parameter name / standard notation / variant number not existing** + + Expected: No values are returned, and JsonPreprocessor throws an exception + +---- + * **Test JPP_0257** [PARAMETER_SUBSTITUTION / BADCASE] @@ -225,6 +265,16 @@ Test Use Cases ---- +* **Test JPP_0258** + + [PARAMETER_SUBSTITUTION / BADCASE] + + **JSON file with nested parameter / key parameter substitution in parameter value / standard notation / variant number not existing** + + Expected: No values are returned, and JsonPreprocessor throws an exception + +---- + * **Test JPP_0259** [PARAMETER_SUBSTITUTION / BADCASE] @@ -235,6 +285,66 @@ Test Use Cases ---- +* **Test JPP_0261** + + [PARAMETER_SUBSTITUTION / BADCASE] + + **JSON file with list parameter substitution in parameter name (composite data types not allowed in names) / (2)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + +---- + +* **Test JPP_0263** + + [PARAMETER_SUBSTITUTION / BADCASE] + + **JSON file with dictionary parameter substitution in parameter name (composite data types not allowed in names) / (2)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + +---- + +* **Test JPP_0264** + + [PARAMETER_SUBSTITUTION / BADCASE] + + **JSON file with list parameter substitution in key name (composite data types not allowed in names) / (1)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + +---- + +* **Test JPP_0265** + + [PARAMETER_SUBSTITUTION / BADCASE] + + **JSON file with list parameter substitution in key name (composite data types not allowed in names) / (2)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + +---- + +* **Test JPP_0266** + + [PARAMETER_SUBSTITUTION / BADCASE] + + **JSON file with dictionary parameter substitution in key name (composite data types not allowed in names) / (1)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + +---- + +* **Test JPP_0267** + + [PARAMETER_SUBSTITUTION / BADCASE] + + **JSON file with dictionary parameter substitution in key name (composite data types not allowed in names) / (2)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + +---- + * **Test JPP_0300** [VALUE_DETECTION / GOODCASE] @@ -403,6 +513,18 @@ Test Use Cases ---- +* **Test JPP_0360** + + [VALUE_DETECTION / BADCASE] + + **JSON file with expression containing more opening elements '${' than closing elements '}' (invalid syntax 9)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + + *Hint: Checklist rule 2 / pattern 8* + +---- + * **Test JPP_0361** [VALUE_DETECTION / BADCASE] @@ -415,6 +537,66 @@ Test Use Cases ---- +* **Test JPP_0362** + + [VALUE_DETECTION / BADCASE] + + **JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 2)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + + *Hint: Checklist rule 3 / pattern 2* + +---- + +* **Test JPP_0363** + + [VALUE_DETECTION / BADCASE] + + **JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 3)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + + *Hint: Checklist rule 3 / pattern 3* + +---- + +* **Test JPP_0364** + + [VALUE_DETECTION / BADCASE] + + **JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 4)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + + *Hint: Checklist rule 3 / pattern 4* + +---- + +* **Test JPP_0365** + + [VALUE_DETECTION / BADCASE] + + **JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 5)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + + *Hint: Checklist rule 3 / pattern 5* + +---- + +* **Test JPP_0366** + + [VALUE_DETECTION / BADCASE] + + **JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 6)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + + *Hint: Checklist rule 3 / pattern 6* + +---- + * **Test JPP_0367** [VALUE_DETECTION / BADCASE] @@ -511,6 +693,16 @@ Test Use Cases ---- +* **Test JPP_0503** + + [COMPOSITE_EXPRESSIONS / GOODCASE] + + **JSON file with composite data structure (some lists)** + + Expected: JsonPreprocessor returns expected value + +---- + * **Test JPP_0505** [COMPOSITE_EXPRESSIONS / GOODCASE] @@ -695,5 +887,5 @@ Test Use Cases ---- -Generated: 18.10.2023 - 17:37:45 +Generated: 20.11.2023 - 15:42:16 diff --git a/test/JPP_TestUsecases.txt b/test/JPP_TestUsecases.txt index c1646d12..41d51a22 100644 --- a/test/JPP_TestUsecases.txt +++ b/test/JPP_TestUsecases.txt @@ -67,10 +67,22 @@ Test JPP_0205 / PARAMETER_SUBSTITUTION / GOODCASE Description: JSON file with nested parameter / index parameter substitution in parameter value / dotdict notation Expectation: JsonPreprocessor creates a new string with all dollar operator expressions resolved as string ------------------------------------------------------------------------------------------------------------------------ +Test JPP_0206 / PARAMETER_SUBSTITUTION / GOODCASE +Description: JSON file with nested parameter / key parameter substitution in parameter name / standard notation +Expectation: JsonPreprocessor creates a new string with all dollar operator expressions resolved as string +------------------------------------------------------------------------------------------------------------------------ Test JPP_0207 / PARAMETER_SUBSTITUTION / GOODCASE Description: JSON file with nested parameter / key parameter substitution in parameter name / dotdict notation Expectation: JsonPreprocessor creates a new string with all dollar operator expressions resolved as string ------------------------------------------------------------------------------------------------------------------------ +Test JPP_0208 / PARAMETER_SUBSTITUTION / GOODCASE +Description: JSON file with nested parameter / key parameter substitution in parameter value / standard notation +Expectation: JsonPreprocessor creates a new string with all dollar operator expressions resolved as string +------------------------------------------------------------------------------------------------------------------------ +Test JPP_0209 / PARAMETER_SUBSTITUTION / GOODCASE +Description: JSON file with nested parameter / key parameter substitution in parameter value / dotdict notation +Expectation: JsonPreprocessor creates a new string with all dollar operator expressions resolved as string +------------------------------------------------------------------------------------------------------------------------ Test JPP_0250 / PARAMETER_SUBSTITUTION / BADCASE Description: JSON file with nested parameter / string parameter substitution in parameter value / innermost parameter not existing Expectation: No values are returned, and JsonPreprocessor throws an exception @@ -95,14 +107,46 @@ Test JPP_0255 / PARAMETER_SUBSTITUTION / BADCASE Description: JSON file with nested parameter / index parameter substitution in parameter value / dotdict notation / index parameter not existing Expectation: No values are returned, and JsonPreprocessor throws an exception ------------------------------------------------------------------------------------------------------------------------ +Test JPP_0256 / PARAMETER_SUBSTITUTION / BADCASE +Description: JSON file with nested parameter / key parameter substitution in parameter name / standard notation / variant number not existing +Expectation: No values are returned, and JsonPreprocessor throws an exception +------------------------------------------------------------------------------------------------------------------------ Test JPP_0257 / PARAMETER_SUBSTITUTION / BADCASE Description: JSON file with nested parameter / key parameter substitution in parameter name / dotdict notation / milestone number not existing Expectation: No values are returned, and JsonPreprocessor throws an exception ------------------------------------------------------------------------------------------------------------------------ +Test JPP_0258 / PARAMETER_SUBSTITUTION / BADCASE +Description: JSON file with nested parameter / key parameter substitution in parameter value / standard notation / variant number not existing +Expectation: No values are returned, and JsonPreprocessor throws an exception +------------------------------------------------------------------------------------------------------------------------ Test JPP_0259 / PARAMETER_SUBSTITUTION / BADCASE Description: JSON file with nested parameter / key parameter substitution in parameter value / dotdict notation / milestone number not existing Expectation: No values are returned, and JsonPreprocessor throws an exception ------------------------------------------------------------------------------------------------------------------------ +Test JPP_0261 / PARAMETER_SUBSTITUTION / BADCASE +Description: JSON file with list parameter substitution in parameter name (composite data types not allowed in names) / (2) +Expectation: No values are returned, and JsonPreprocessor throws an exception +------------------------------------------------------------------------------------------------------------------------ +Test JPP_0263 / PARAMETER_SUBSTITUTION / BADCASE +Description: JSON file with dictionary parameter substitution in parameter name (composite data types not allowed in names) / (2) +Expectation: No values are returned, and JsonPreprocessor throws an exception +------------------------------------------------------------------------------------------------------------------------ +Test JPP_0264 / PARAMETER_SUBSTITUTION / BADCASE +Description: JSON file with list parameter substitution in key name (composite data types not allowed in names) / (1) +Expectation: No values are returned, and JsonPreprocessor throws an exception +------------------------------------------------------------------------------------------------------------------------ +Test JPP_0265 / PARAMETER_SUBSTITUTION / BADCASE +Description: JSON file with list parameter substitution in key name (composite data types not allowed in names) / (2) +Expectation: No values are returned, and JsonPreprocessor throws an exception +------------------------------------------------------------------------------------------------------------------------ +Test JPP_0266 / PARAMETER_SUBSTITUTION / BADCASE +Description: JSON file with dictionary parameter substitution in key name (composite data types not allowed in names) / (1) +Expectation: No values are returned, and JsonPreprocessor throws an exception +------------------------------------------------------------------------------------------------------------------------ +Test JPP_0267 / PARAMETER_SUBSTITUTION / BADCASE +Description: JSON file with dictionary parameter substitution in key name (composite data types not allowed in names) / (2) +Expectation: No values are returned, and JsonPreprocessor throws an exception +------------------------------------------------------------------------------------------------------------------------ Test JPP_0300 / VALUE_DETECTION / GOODCASE Description: JSON file with parameter of type 'list' / index (in square brackets) defined outside the curly brackets (valid syntax) Expectation: JsonPreprocessor returns values @@ -173,11 +217,41 @@ Description: JSON file with expression containing more opening elements '${' tha Expectation: No values are returned, and JsonPreprocessor throws an exception Hint.......: Checklist rule 2 / pattern 7 ------------------------------------------------------------------------------------------------------------------------ +Test JPP_0360 / VALUE_DETECTION / BADCASE +Description: JSON file with expression containing more opening elements '${' than closing elements '}' (invalid syntax 9) +Expectation: No values are returned, and JsonPreprocessor throws an exception +Hint.......: Checklist rule 2 / pattern 8 +------------------------------------------------------------------------------------------------------------------------ Test JPP_0361 / VALUE_DETECTION / BADCASE Description: JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 1) Expectation: No values are returned, and JsonPreprocessor throws an exception Hint.......: Checklist rule 3 / pattern 1 ------------------------------------------------------------------------------------------------------------------------ +Test JPP_0362 / VALUE_DETECTION / BADCASE +Description: JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 2) +Expectation: No values are returned, and JsonPreprocessor throws an exception +Hint.......: Checklist rule 3 / pattern 2 +------------------------------------------------------------------------------------------------------------------------ +Test JPP_0363 / VALUE_DETECTION / BADCASE +Description: JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 3) +Expectation: No values are returned, and JsonPreprocessor throws an exception +Hint.......: Checklist rule 3 / pattern 3 +------------------------------------------------------------------------------------------------------------------------ +Test JPP_0364 / VALUE_DETECTION / BADCASE +Description: JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 4) +Expectation: No values are returned, and JsonPreprocessor throws an exception +Hint.......: Checklist rule 3 / pattern 4 +------------------------------------------------------------------------------------------------------------------------ +Test JPP_0365 / VALUE_DETECTION / BADCASE +Description: JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 5) +Expectation: No values are returned, and JsonPreprocessor throws an exception +Hint.......: Checklist rule 3 / pattern 5 +------------------------------------------------------------------------------------------------------------------------ +Test JPP_0366 / VALUE_DETECTION / BADCASE +Description: JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 6) +Expectation: No values are returned, and JsonPreprocessor throws an exception +Hint.......: Checklist rule 3 / pattern 6 +------------------------------------------------------------------------------------------------------------------------ Test JPP_0367 / VALUE_DETECTION / BADCASE Description: JSON file with expression starting with '${' and ending with '}', further matching '${' and '}' in between (not all nested) (invalid syntax 1) Expectation: No values are returned, and JsonPreprocessor throws an exception @@ -218,6 +292,10 @@ Description: JSON file with composite data structure (nested lists and dictionar Expectation: JsonPreprocessor returns expected value Hint.......: Standard notation ------------------------------------------------------------------------------------------------------------------------ +Test JPP_0503 / COMPOSITE_EXPRESSIONS / GOODCASE +Description: JSON file with composite data structure (some lists) +Expectation: JsonPreprocessor returns expected value +------------------------------------------------------------------------------------------------------------------------ Test JPP_0505 / COMPOSITE_EXPRESSIONS / GOODCASE Description: JSON file with composite strings containing several times a colon and a comma (JSON syntax elements) Expectation: JsonPreprocessor returns expected value @@ -292,5 +370,5 @@ Description: Relative path to JSON file Expectation: JsonPreprocessor resolves the relative path and returns values from JSON file Hint.......: Works with raw path to JSON file (path not normalized internally) ------------------------------------------------------------------------------------------------------------------------ -Generated: 18.10.2023 - 17:37:45 +Generated: 20.11.2023 - 15:42:16 diff --git a/test/component_test.py b/test/component_test.py index 6e285531..15f7fefc 100644 --- a/test/component_test.py +++ b/test/component_test.py @@ -22,8 +22,8 @@ # # -------------------------------------------------------------------------------------------------------------- # -VERSION = "0.18.0" -VERSION_DATE = "18.10.2023" +VERSION = "0.19.0" +VERSION_DATE = "20.11.2023" # # -------------------------------------------------------------------------------------------------------------- #TM*** diff --git a/test/pytest/pytestfiles/test_03_PARAMETER_SUBSTITUTION_GOODCASE.py b/test/pytest/pytestfiles/test_03_PARAMETER_SUBSTITUTION_GOODCASE.py index e9ad6163..0a3a7454 100644 --- a/test/pytest/pytestfiles/test_03_PARAMETER_SUBSTITUTION_GOODCASE.py +++ b/test/pytest/pytestfiles/test_03_PARAMETER_SUBSTITUTION_GOODCASE.py @@ -18,7 +18,7 @@ # # XC-CT/ECA3-Queckenstedt # -# 10.10.2023 - 13:31:11 +# 20.11.2023 - 15:42:16 # # -------------------------------------------------------------------------------------------------------------- @@ -77,6 +77,14 @@ def test_JPP_0204(self, Description): def test_JPP_0205(self, Description): nReturn = CExecute.Execute("JPP_0205") assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: JsonPreprocessor creates a new string with all dollar operator expressions resolved as string + @pytest.mark.parametrize( + "Description", ["JSON file with nested parameter / key parameter substitution in parameter name / standard notation",] + ) + def test_JPP_0206(self, Description): + nReturn = CExecute.Execute("JPP_0206") + assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- # Expected: JsonPreprocessor creates a new string with all dollar operator expressions resolved as string @pytest.mark.parametrize( @@ -85,4 +93,20 @@ def test_JPP_0205(self, Description): def test_JPP_0207(self, Description): nReturn = CExecute.Execute("JPP_0207") assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: JsonPreprocessor creates a new string with all dollar operator expressions resolved as string + @pytest.mark.parametrize( + "Description", ["JSON file with nested parameter / key parameter substitution in parameter value / standard notation",] + ) + def test_JPP_0208(self, Description): + nReturn = CExecute.Execute("JPP_0208") + assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: JsonPreprocessor creates a new string with all dollar operator expressions resolved as string + @pytest.mark.parametrize( + "Description", ["JSON file with nested parameter / key parameter substitution in parameter value / dotdict notation",] + ) + def test_JPP_0209(self, Description): + nReturn = CExecute.Execute("JPP_0209") + assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- diff --git a/test/pytest/pytestfiles/test_04_PARAMETER_SUBSTITUTION_BADCASE.py b/test/pytest/pytestfiles/test_04_PARAMETER_SUBSTITUTION_BADCASE.py index 9087124c..279acb4b 100644 --- a/test/pytest/pytestfiles/test_04_PARAMETER_SUBSTITUTION_BADCASE.py +++ b/test/pytest/pytestfiles/test_04_PARAMETER_SUBSTITUTION_BADCASE.py @@ -18,7 +18,7 @@ # # XC-CT/ECA3-Queckenstedt # -# 10.10.2023 - 13:31:11 +# 20.11.2023 - 15:42:16 # # -------------------------------------------------------------------------------------------------------------- @@ -77,6 +77,14 @@ def test_JPP_0254(self, Description): def test_JPP_0255(self, Description): nReturn = CExecute.Execute("JPP_0255") assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file with nested parameter / key parameter substitution in parameter name / standard notation / variant number not existing",] + ) + def test_JPP_0256(self, Description): + nReturn = CExecute.Execute("JPP_0256") + assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- # Expected: No values are returned, and JsonPreprocessor throws an exception @pytest.mark.parametrize( @@ -85,6 +93,14 @@ def test_JPP_0255(self, Description): def test_JPP_0257(self, Description): nReturn = CExecute.Execute("JPP_0257") assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file with nested parameter / key parameter substitution in parameter value / standard notation / variant number not existing",] + ) + def test_JPP_0258(self, Description): + nReturn = CExecute.Execute("JPP_0258") + assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- # Expected: No values are returned, and JsonPreprocessor throws an exception @pytest.mark.parametrize( @@ -93,4 +109,52 @@ def test_JPP_0257(self, Description): def test_JPP_0259(self, Description): nReturn = CExecute.Execute("JPP_0259") assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file with list parameter substitution in parameter name (composite data types not allowed in names) / (2)",] + ) + def test_JPP_0261(self, Description): + nReturn = CExecute.Execute("JPP_0261") + assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file with dictionary parameter substitution in parameter name (composite data types not allowed in names) / (2)",] + ) + def test_JPP_0263(self, Description): + nReturn = CExecute.Execute("JPP_0263") + assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file with list parameter substitution in key name (composite data types not allowed in names) / (1)",] + ) + def test_JPP_0264(self, Description): + nReturn = CExecute.Execute("JPP_0264") + assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file with list parameter substitution in key name (composite data types not allowed in names) / (2)",] + ) + def test_JPP_0265(self, Description): + nReturn = CExecute.Execute("JPP_0265") + assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file with dictionary parameter substitution in key name (composite data types not allowed in names) / (1)",] + ) + def test_JPP_0266(self, Description): + nReturn = CExecute.Execute("JPP_0266") + assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file with dictionary parameter substitution in key name (composite data types not allowed in names) / (2)",] + ) + def test_JPP_0267(self, Description): + nReturn = CExecute.Execute("JPP_0267") + assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- diff --git a/test/pytest/pytestfiles/test_06_VALUE_DETECTION_BADCASE.py b/test/pytest/pytestfiles/test_06_VALUE_DETECTION_BADCASE.py index 34b47d4e..216473b4 100644 --- a/test/pytest/pytestfiles/test_06_VALUE_DETECTION_BADCASE.py +++ b/test/pytest/pytestfiles/test_06_VALUE_DETECTION_BADCASE.py @@ -18,7 +18,7 @@ # # XC-CT/ECA3-Queckenstedt # -# 10.10.2023 - 13:31:11 +# 20.11.2023 - 15:42:16 # # -------------------------------------------------------------------------------------------------------------- @@ -109,6 +109,14 @@ def test_JPP_0358(self, Description): def test_JPP_0359(self, Description): nReturn = CExecute.Execute("JPP_0359") assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file with expression containing more opening elements '${' than closing elements '}' (invalid syntax 9)",] + ) + def test_JPP_0360(self, Description): + nReturn = CExecute.Execute("JPP_0360") + assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- # Expected: No values are returned, and JsonPreprocessor throws an exception @pytest.mark.parametrize( @@ -117,6 +125,46 @@ def test_JPP_0359(self, Description): def test_JPP_0361(self, Description): nReturn = CExecute.Execute("JPP_0361") assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 2)",] + ) + def test_JPP_0362(self, Description): + nReturn = CExecute.Execute("JPP_0362") + assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 3)",] + ) + def test_JPP_0363(self, Description): + nReturn = CExecute.Execute("JPP_0363") + assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 4)",] + ) + def test_JPP_0364(self, Description): + nReturn = CExecute.Execute("JPP_0364") + assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 5)",] + ) + def test_JPP_0365(self, Description): + nReturn = CExecute.Execute("JPP_0365") + assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file with expression containing more closing elements '}' than opening elements '${' (invalid syntax 6)",] + ) + def test_JPP_0366(self, Description): + nReturn = CExecute.Execute("JPP_0366") + assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- # Expected: No values are returned, and JsonPreprocessor throws an exception @pytest.mark.parametrize( diff --git a/test/pytest/pytestfiles/test_07_COMPOSITE_EXPRESSIONS_GOODCASE.py b/test/pytest/pytestfiles/test_07_COMPOSITE_EXPRESSIONS_GOODCASE.py index 95f0ff5b..ebbf359d 100644 --- a/test/pytest/pytestfiles/test_07_COMPOSITE_EXPRESSIONS_GOODCASE.py +++ b/test/pytest/pytestfiles/test_07_COMPOSITE_EXPRESSIONS_GOODCASE.py @@ -18,7 +18,7 @@ # # XC-CT/ECA3-Queckenstedt # -# 18.10.2023 - 17:37:45 +# 20.11.2023 - 15:42:16 # # -------------------------------------------------------------------------------------------------------------- @@ -53,6 +53,14 @@ def test_JPP_0501(self, Description): def test_JPP_0502(self, Description): nReturn = CExecute.Execute("JPP_0502") assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: JsonPreprocessor returns expected value + @pytest.mark.parametrize( + "Description", ["JSON file with composite data structure (some lists)",] + ) + def test_JPP_0503(self, Description): + nReturn = CExecute.Execute("JPP_0503") + assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- # Expected: JsonPreprocessor returns expected value @pytest.mark.parametrize( diff --git a/test/testconfig/TestConfig.py b/test/testconfig/TestConfig.py index 13d6705b..3cb356ce 100644 --- a/test/testconfig/TestConfig.py +++ b/test/testconfig/TestConfig.py @@ -896,7 +896,7 @@ [DICT] (22/21) > {milestone} [STR] : 'milestone' [DICT] (22/22) > {VAR_VARIANT_1_MS_MILESTONE_2_param} [STR] : 'value' """ -# # # listofdictUsecases.append(dictUsecase) +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} @@ -982,7 +982,7 @@ [DICT] (22/21) > {milestone} [STR] : 'milestone' [DICT] (22/22) > {param} [STR] : 'VAR_VARIANT_1_MS_MILESTONE_2 value' """ -# # # listofdictUsecases.append(dictUsecase) +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} @@ -1025,7 +1025,7 @@ [DICT] (22/21) > {milestone} [STR] : 'milestone' [DICT] (22/22) > {param} [STR] : 'VAR_VARIANT_1_MS_MILESTONE_2 value' """ -# # # listofdictUsecases.append(dictUsecase) +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------------------- @@ -1192,9 +1192,9 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0261.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "composite data types not allowed in names (placeholder)" +dictUsecase['EXPECTEDEXCEPTION'] = "Composite data types are not allowed" dictUsecase['EXPECTEDRETURN'] = None -# # # listofdictUsecases.append(dictUsecase) +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} @@ -1220,9 +1220,9 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0263.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "composite data types not allowed in names (placeholder)" +dictUsecase['EXPECTEDEXCEPTION'] = "Composite data types are not allowed" dictUsecase['EXPECTEDRETURN'] = None -# # # listofdictUsecases.append(dictUsecase) +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} @@ -1234,9 +1234,9 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0264.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "composite data types not allowed in names (placeholder)" +dictUsecase['EXPECTEDEXCEPTION'] = "Composite data types are not allowed" dictUsecase['EXPECTEDRETURN'] = None -# # # listofdictUsecases.append(dictUsecase) +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} @@ -1248,9 +1248,9 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0265.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "composite data types not allowed in names (placeholder)" +dictUsecase['EXPECTEDEXCEPTION'] = "Composite data types are not allowed" dictUsecase['EXPECTEDRETURN'] = None -# # # listofdictUsecases.append(dictUsecase) +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} @@ -1262,9 +1262,9 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0266.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "composite data types not allowed in names (placeholder)" +dictUsecase['EXPECTEDEXCEPTION'] = "Composite data types are not allowed" dictUsecase['EXPECTEDRETURN'] = None -# # # listofdictUsecases.append(dictUsecase) +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} @@ -1276,9 +1276,9 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0267.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "composite data types not allowed in names (placeholder)" +dictUsecase['EXPECTEDEXCEPTION'] = "Composite data types are not allowed" dictUsecase['EXPECTEDRETURN'] = None -# # # listofdictUsecases.append(dictUsecase) +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------------------- @@ -1555,9 +1555,9 @@ dictUsecase['HINT'] = "Checklist rule 2 / pattern 8" dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0360.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "invalid syntax (placeholder)" +dictUsecase['EXPECTEDEXCEPTION'] = "One or more than one opened or closed curly bracket is missing in expression" dictUsecase['EXPECTEDRETURN'] = None -# # # listofdictUsecases.append(dictUsecase) +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} @@ -1583,9 +1583,9 @@ dictUsecase['HINT'] = "Checklist rule 3 / pattern 2" dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0362.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "invalid syntax (placeholder)" +dictUsecase['EXPECTEDEXCEPTION'] = "Invalid nested parameter format" dictUsecase['EXPECTEDRETURN'] = None -# # # listofdictUsecases.append(dictUsecase) +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} @@ -1597,9 +1597,9 @@ dictUsecase['HINT'] = "Checklist rule 3 / pattern 3" dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0363.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "invalid syntax (placeholder)" +dictUsecase['EXPECTEDEXCEPTION'] = "Invalid nested parameter format" dictUsecase['EXPECTEDRETURN'] = None -# # # listofdictUsecases.append(dictUsecase) +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} @@ -1611,9 +1611,9 @@ dictUsecase['HINT'] = "Checklist rule 3 / pattern 4" dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0364.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "invalid syntax (placeholder)" +dictUsecase['EXPECTEDEXCEPTION'] = "Invalid nested parameter format" dictUsecase['EXPECTEDRETURN'] = None -# # # listofdictUsecases.append(dictUsecase) +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} @@ -1625,9 +1625,9 @@ dictUsecase['HINT'] = "Checklist rule 3 / pattern 5" dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0365.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "invalid syntax (placeholder)" +dictUsecase['EXPECTEDEXCEPTION'] = "Invalid nested parameter format" dictUsecase['EXPECTEDRETURN'] = None -# # # listofdictUsecases.append(dictUsecase) +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} @@ -1639,9 +1639,9 @@ dictUsecase['HINT'] = "Checklist rule 3 / pattern 6" dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0366.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "invalid syntax (placeholder)" +dictUsecase['EXPECTEDEXCEPTION'] = "Invalid nested parameter format" dictUsecase['EXPECTEDRETURN'] = None -# # # listofdictUsecases.append(dictUsecase) +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} @@ -1833,7 +1833,7 @@ [DICT] (10/9) > {val5} [INT] : 2 [DICT] (10/10) > {val6} [STR] : '2' """ -# # # listofdictUsecases.append(dictUsecase) +listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} From 1f538ef6a9261bf85be18d3d12850ca148df7851 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Thu, 23 Nov 2023 12:09:49 +0700 Subject: [PATCH 16/21] Bug fix - Data structures implicitly, usercases 1 to 5, ticket 153 --- JsonPreprocessor/CJsonPreprocessor.py | 45 +++++++++++++++++++++------ 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 9d460ae8..37faac7b 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -383,6 +383,34 @@ def __referVarHandle(referVar : str, sInputStr : str) -> str: pattern = "\$\${\s*[0-9A-Za-z_]+[0-9A-Za-z\.\-_]*\s*}" referVars = re.findall("(" + pattern + ")", sInputStr) + if sInputStr.count("$$") > len(referVars): + for var in referVars: + if "." in var: + ddVar = re.sub('\$\${\s*(.*?)\s*}', '\\1', var) + lddVar = ddVar.split(".") + lElements = self.__handleDotdictFormat(lddVar, []) + sVar = '$${' + lElements[0] + '}' + lElements.pop(0) + for item in lElements: + sVar = sVar + "[" + item + "]" if re.match("^\d+$", item) else sVar + "['" + item + "']" + else: + sVar = var + rootVar = re.search('^\s*\$\${(\s*.*?)}', sVar).group(1) + tmpVar = re.sub("\$", "\\$", sVar) + subPattern = tmpVar + "((\[\s*'[^\$\[\]\(\)]+'\s*\]|\[\s*\d+\s*\])*)" + subVar = re.search(subPattern, sInputStr).group(1) + sExec = "value = " + rootVar + subVar + try: + ldict = {} + exec(sExec, globals(), ldict) + tmpValue = ldict['value'] + except: + raise Exception(f"The variable '{var}' is not available!") + subPattern = "(" + tmpVar + "(\[\s*'[^\$\[\]\(\)]+'\s*\]|\[\s*\d+\s*\])*)" + var = re.sub("\$", "\\$", re.search(subPattern, sInputStr).group(1)) + sInputStr = re.sub(var, tmpValue, sInputStr) if isinstance(tmpValue, str) else \ + re.sub(var, str(tmpValue), sInputStr) + referVars = re.findall("(" + pattern + ")", sInputStr) lNestedParam = [] if len(referVars) > 1: if not bKey: @@ -428,7 +456,7 @@ def __referVarHandle(referVar : str, sInputStr : str) -> str: sInputStr = re.sub(pattern, '\'' + tmpValue + '\'', sInputStr) if isinstance(tmpValue, str) else \ re.sub(pattern, '\'' + str(tmpValue) + '\'', sInputStr) sKeyHandled = sUpdateVar + sInputStr - lNestedParam.append(re.sub("\$\$", "$", sKeyHandled)) + lNestedParam.append(re.sub("\$\$", "$", __referVarHandle(sUpdateVar, sKeyHandled))) return lNestedParam else: lNestedParam.append(re.sub("\$\$", "$", __referVarHandle(referVars[0], sInputStr))) @@ -613,7 +641,7 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): globals().update({k:v}) tmpJson = copy.deepcopy(oJson) - pattern = "\${\s*[0-9A-Za-z_]+[0-9A-Za-z\.\-_]*\s*}(\[+\s*'.+'\s*\]+|\[+\s*\d+\s*\]+)*" + pattern = "\${\s*[0-9A-Za-z_]+[0-9A-Za-z\.\$\{\}\-_]*\s*}(\[+\s*'.+'\s*\]+|\[+\s*\d+\s*\]+)*" for k, v in tmpJson.items(): keyNested = '' if CNameMangling.DUPLICATEDKEY_00.value in k: @@ -728,9 +756,7 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: valueNumberPattern = "[0-9\.]+" if "${" in sInputStr: - if re.search("\${\s*}", sInputStr): - raise Exception(f"Invalid parameter format: {sInputStr}") - elif re.match("^\s*" + nestedPattern + "\s*,*\]*}*\s*$", sInputStr.lower()): + if re.match("^\s*" + nestedPattern + "\s*,*\]*}*\s*$", sInputStr.lower()): dictPattern = "\[+\s*'.+'\s*\]+|\[+\s*\d+\s*\]+|\[+\s*\${\s*" + variablePattern + "\s*}.*\]+" nestedPattern = "\${\s*" + variablePattern + "(\${\s*" + variablePattern + "\s*})*" + "\s*}(" + dictPattern +")*" sInputStr = re.sub("(" + nestedPattern + ")", "\"\\1\"", sInputStr) @@ -791,10 +817,9 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: self.lNestedParams.append(nestedBase) sInputStr = __recursiveNestedHandling(sInputStr, tmpList) - elif re.search("(" + nestedPattern + ")*", sInputStr.lower()) and \ - (sInputStr.count("${")>1 or sInputStr.count("}")>1 or sInputStr.count("{")>1): - raise Exception(f"Invalid nested parameter format: {sInputStr} - The double quotes are missing!!!") elif "," in sInputStr: + if not re.match("^\s*\".+\"\s*$", sInputStr): + raise Exception(f"Invalid nested parameter format: {sInputStr} - The double quotes are missing!!!") listPattern = "^\s*(\"*" + nestedPattern + "\"*\s*,+\s*|" + valueStrPattern + "\s*,+\s*|" + valueNumberPattern + "\s*,+\s*)+" + \ "(\"*" + nestedPattern + "\"*\s*,*\s*|" + valueStrPattern + "\s*,*\s*|" + valueNumberPattern + "\s*,*\s*)*\]*}*\s*$" lNestedParam = re.findall("(" + nestedPattern + ")", sInputStr) @@ -820,8 +845,10 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: self.lNestedParams.append(nestedParam) newInputStr = newInputStr + item if tmpItem==items[len(items)-1] else newInputStr + item + "," sInputStr = newInputStr - else: + elif re.search("\${\s*}", sInputStr) or re.search("\${.+}\.", sInputStr): raise Exception(f"Invalid parameter format: {sInputStr}") + else: + raise Exception(f"Invalid nested parameter format: {sInputStr} - The double quotes are missing!!!") sOutput = sInputStr return sOutput From f29314cea1f8319d8c059cfb11c01cfb273c622d Mon Sep 17 00:00:00 2001 From: mas2hc Date: Tue, 28 Nov 2023 11:23:53 +0700 Subject: [PATCH 17/21] Enhancement ticket 153 - Data structures implicitly usercases [5],[6] --- JsonPreprocessor/CJsonPreprocessor.py | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 37faac7b..9e3ea149 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -383,7 +383,7 @@ def __referVarHandle(referVar : str, sInputStr : str) -> str: pattern = "\$\${\s*[0-9A-Za-z_]+[0-9A-Za-z\.\-_]*\s*}" referVars = re.findall("(" + pattern + ")", sInputStr) - if sInputStr.count("$$") > len(referVars): + while sInputStr.count("$$") > len(referVars): for var in referVars: if "." in var: ddVar = re.sub('\$\${\s*(.*?)\s*}', '\\1', var) @@ -393,10 +393,12 @@ def __referVarHandle(referVar : str, sInputStr : str) -> str: lElements.pop(0) for item in lElements: sVar = sVar + "[" + item + "]" if re.match("^\d+$", item) else sVar + "['" + item + "']" + sInputStr = sInputStr.replace(var, sVar) else: sVar = var rootVar = re.search('^\s*\$\${(\s*.*?)}', sVar).group(1) tmpVar = re.sub("\$", "\\$", sVar) + tmpVar = re.sub("((\[\s*'[^\$\[\]\(\)]+'\s*\]|\[\s*\d+\s*\])*)", "", tmpVar) subPattern = tmpVar + "((\[\s*'[^\$\[\]\(\)]+'\s*\]|\[\s*\d+\s*\])*)" subVar = re.search(subPattern, sInputStr).group(1) sExec = "value = " + rootVar + subVar @@ -405,12 +407,15 @@ def __referVarHandle(referVar : str, sInputStr : str) -> str: exec(sExec, globals(), ldict) tmpValue = ldict['value'] except: - raise Exception(f"The variable '{var}' is not available!") + raise Exception(f"The variable '{var.replace('$$', '$')}' is not available!") subPattern = "(" + tmpVar + "(\[\s*'[^\$\[\]\(\)]+'\s*\]|\[\s*\d+\s*\])*)" var = re.sub("\$", "\\$", re.search(subPattern, sInputStr).group(1)) + if re.search("\[.+\]", var): + var = var.replace("[", "\[") + var = var.replace("]", "\]") sInputStr = re.sub(var, tmpValue, sInputStr) if isinstance(tmpValue, str) else \ re.sub(var, str(tmpValue), sInputStr) - referVars = re.findall("(" + pattern + ")", sInputStr) + referVars = re.findall("(" + pattern + ")", sInputStr) lNestedParam = [] if len(referVars) > 1: if not bKey: @@ -714,7 +719,7 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): del tmpJson return oJson, bNested - def __checkAndUpdateKeyValue(self, sInputStr: str) -> str: + def __checkAndUpdateKeyValue(self, sInputStr: str, nestedKey = False) -> str: ''' This function checks and makes up all nested parameters in json configuration files. @@ -845,8 +850,11 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: self.lNestedParams.append(nestedParam) newInputStr = newInputStr + item if tmpItem==items[len(items)-1] else newInputStr + item + "," sInputStr = newInputStr - elif re.search("\${\s*}", sInputStr) or re.search("\${.+}\.", sInputStr): + elif re.search("\${\s*}", sInputStr) or re.search("\${.+}\.", sInputStr) \ + or (nestedKey and (sInputStr.count("{") != sInputStr.count("}") or sInputStr.count("[") != sInputStr.count("]"))): raise Exception(f"Invalid parameter format: {sInputStr}") + elif nestedKey and re.match("^\s*\${[^\(\)\!@#%\^\&\-\+\/\\\=`~\?]+[}\[\]]+\s*$", sInputStr): + sInputStr = re.sub("^\s*(\${[^\(\)\!@#%\^\&\-\+\/\\\=`~\?]+[}\[\]]+)\s*$", "\"\\1\"", sInputStr) else: raise Exception(f"Invalid nested parameter format: {sInputStr} - The double quotes are missing!!!") @@ -1004,6 +1012,10 @@ def __removeDuplicatedKey(dInput : dict) -> dict: newLine = "" i=0 for item in items: + nestedKey = False + nestedKeyPattern = "^\s*,\s*\${.+[\]}]\s*$" + if i==0 or re.match(nestedKeyPattern, item): + nestedKey = True if CNameMangling.COLONS.value in item: while CNameMangling.COLONS.value in item: item = re.sub(CNameMangling.COLONS.value, tmpList[0], item, count=1) @@ -1033,7 +1045,7 @@ def __removeDuplicatedKey(dInput : dict) -> dict: newSubItem = __handleListElements(item) newSubItem = newSubItem + "]" if bLastElement else newSubItem + "]," else: - newSubItem = self.__checkAndUpdateKeyValue(item) + newSubItem = self.__checkAndUpdateKeyValue(item, nestedKey) if i Date: Tue, 28 Nov 2023 21:37:52 +0700 Subject: [PATCH 18/21] Enhancement 150 - Json dump feature - update based on review comments --- JsonPreprocessor/CJsonPreprocessor.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 9e3ea149..b48cb0cb 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -1138,9 +1138,7 @@ def __removeDuplicatedKey(dInput : dict) -> dict: def jsonDump(self, oJson : dict, outFile : str) -> str: ''' - This function is used to write a json file from dictionary object. - - It loads the dict object, write a new json file, and returns the path of new json file. + This function writes the content of a Python dictionary to a file in JSON format and returns a normalized path to this JSON file. **Args:** @@ -1150,7 +1148,7 @@ def jsonDump(self, oJson : dict, outFile : str) -> str: **outFile** (*string*) - Relative/absolute path to main json file. + Path and name of the JSON output file. The path can be absolute or relative and is also allowed to contain environment variables. ``%envvariable%`` and ``${envvariable}`` can be used, too in order to access environment variables. @@ -1158,10 +1156,10 @@ def jsonDump(self, oJson : dict, outFile : str) -> str: **outFile** (*string*) - Absolute path to main json file. + Normalized path and name of the JSON output file. ''' - outFile = CString.NormalizePath(outFile, sReferencePathAbs=os.path.dirname(sys.argv[0])) + outFile = CString.NormalizePath(outFile, sReferencePathAbs=os.path.dirname(os.path.abspath(sys.argv[0]))) jsonObject = json.dumps(oJson, ensure_ascii=False, indent=4) with open(outFile, "w", encoding='utf-8') as f: f.write(jsonObject) From 7cb0a2a76df56b5662cef2e04d43983bdeabfacb Mon Sep 17 00:00:00 2001 From: mas2hc Date: Tue, 28 Nov 2023 21:59:36 +0700 Subject: [PATCH 19/21] Enhancement 150 - JSON dump feature: Adding try...catch --- JsonPreprocessor/CJsonPreprocessor.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index b48cb0cb..fa8142bb 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -1150,8 +1150,6 @@ def jsonDump(self, oJson : dict, outFile : str) -> str: Path and name of the JSON output file. The path can be absolute or relative and is also allowed to contain environment variables. - ``%envvariable%`` and ``${envvariable}`` can be used, too in order to access environment variables. - **Returns:** **outFile** (*string*) @@ -1161,7 +1159,11 @@ def jsonDump(self, oJson : dict, outFile : str) -> str: outFile = CString.NormalizePath(outFile, sReferencePathAbs=os.path.dirname(os.path.abspath(sys.argv[0]))) jsonObject = json.dumps(oJson, ensure_ascii=False, indent=4) - with open(outFile, "w", encoding='utf-8') as f: - f.write(jsonObject) + try: + with open(outFile, "w", encoding='utf-8') as f: + f.write(jsonObject) + except Exception as error: + errorMsg = f"Could not write a JSON file '{outFile}'! Reason: {error}" + raise Exception(errorMsg) return outFile \ No newline at end of file From 0bb63d94b050e2cc0881617e26dec6b9353712f0 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Tue, 28 Nov 2023 22:16:11 +0700 Subject: [PATCH 20/21] Update to version 0.3.1, history, and document --- JsonPreprocessor/JsonPreprocessor.pdf | Bin 415447 -> 418664 bytes JsonPreprocessor/version.py | 4 ++-- packagedoc/additional_docs/History.tex | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/JsonPreprocessor/JsonPreprocessor.pdf b/JsonPreprocessor/JsonPreprocessor.pdf index 0b5f8b4a708c0bca8b072b35a4f9c11cc60df2f2..7b2544f28ac8e0629331ec8c6f6f71e18a2758ad 100644 GIT binary patch delta 114832 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 delta 112080 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

2HvcvN#`bn5 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 Date: Wed, 29 Nov 2023 14:22:18 +0700 Subject: [PATCH 21/21] Fix bug - tiny change to avoid relative path issue --- JsonPreprocessor/CJsonPreprocessor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index fa8142bb..d5cae2e6 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -978,7 +978,7 @@ def __removeDuplicatedKey(dInput : dict) -> dict: for item in dInput: __removeDuplicatedKey(item) - jFile = CString.NormalizePath(jFile, sReferencePathAbs=os.path.dirname(sys.argv[0])) + jFile = CString.NormalizePath(jFile, sReferencePathAbs=os.path.dirname(os.path.abspath(sys.argv[0]))) if not(os.path.isfile(jFile)): raise Exception(f"File '{jFile}' is not existing!")