From f40ae2e3abd7432c5156bbf228beb0e357cd468d Mon Sep 17 00:00:00 2001 From: qth2hi Date: Thu, 14 Dec 2023 12:34:51 +0100 Subject: [PATCH 01/18] Self test maintenance w.r.t. latest stabi branch --- test/component_test.py | 4 +-- test/testconfig/TestConfig.py | 32 ++++++++++++------- ...-test_config_implicit_creation.1.1.1.jsonp | 16 ++++++---- 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/test/component_test.py b/test/component_test.py index 15f7fefc..c4de2027 100644 --- a/test/component_test.py +++ b/test/component_test.py @@ -22,8 +22,8 @@ # # -------------------------------------------------------------------------------------------------------------- # -VERSION = "0.19.0" -VERSION_DATE = "20.11.2023" +VERSION = "0.20.0" +VERSION_DATE = "14.12.2023" # # -------------------------------------------------------------------------------------------------------------- #TM*** diff --git a/test/testconfig/TestConfig.py b/test/testconfig/TestConfig.py index 3cb356ce..68cbb7ff 100644 --- a/test/testconfig/TestConfig.py +++ b/test/testconfig/TestConfig.py @@ -22,7 +22,7 @@ # # -------------------------------------------------------------------------------------------------------------- # -# 18.10.2023 +# 14.12.2023 # # !!! Temporarily tests are deactivated by the following line commented out: # # # listofdictUsecases.append(dictUsecase) @@ -2130,17 +2130,25 @@ dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_1000.jsonp" dictUsecase['EXPECTEDEXCEPTION'] = None dictUsecase['EXPECTEDRETURN'] = """ -[DICT] (2/1) > {dTestDict} [DICT] (5/1) > {kVal_1} [STR] : 'Val_1' -[DICT] (2/1) > {dTestDict} [DICT] (5/2) > {kVal_2} [DICT] (1/1) > {I_am_not_existing_1} [DICT] (1/1) > {I_am_not_existing_2} [STR] : 'Val_1' -[DICT] (2/1) > {dTestDict} [DICT] (5/3) > {kVal_3} [DICT] (1/1) > {I_am_not_existing_3} [DICT] (1/1) > {I_am_not_existing_4} [STR] : 'Val_1_extended' -[DICT] (2/1) > {dTestDict} [DICT] (5/4) > {kVal_3b} [DICT] (1/1) > {I_am_not_existing_3b} [DICT] (1/1) > {I_am_not_existing_4b} [STR] : 'Val_1' -[DICT] (2/1) > {dTestDict} [DICT] (5/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/1) > {A} [INT] : 1 -[DICT] (2/1) > {dTestDict} [DICT] (5/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/2) > {B} [LIST] (2/1) > [INT] : 1 -[DICT] (2/1) > {dTestDict} [DICT] (5/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/2) > {B} [LIST] (2/2) > [INT] : 2 -[DICT] (2/1) > {dTestDict} [DICT] (5/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/3) > {kVal_4D} [DICT] (1/1) > {kVal_4E} [DICT] (1/1) > {kVal_4F} [DICT] (1/1) > {kVal_4G} [DICT] (2/1) > {C} [INT] : 2 -[DICT] (2/1) > {dTestDict} [DICT] (5/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/3) > {kVal_4D} [DICT] (1/1) > {kVal_4E} [DICT] (1/1) > {kVal_4F} [DICT] (1/1) > {kVal_4G} [DICT] (2/2) > {D} [LIST] (2/1) > [INT] : 3 -[DICT] (2/1) > {dTestDict} [DICT] (5/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/3) > {kVal_4D} [DICT] (1/1) > {kVal_4E} [DICT] (1/1) > {kVal_4F} [DICT] (1/1) > {kVal_4G} [DICT] (2/2) > {D} [LIST] (2/2) > [INT] : 4 -[DICT] (2/2) > {Val_1_extended} [STR] : 'Val_1' +[DICT] (4/1) > {dTestDict} [DICT] (6/1) > {kVal_1} [STR] : 'Val_1' +[DICT] (4/1) > {dTestDict} [DICT] (6/2) > {kVal_2} [DICT] (1/1) > {I_am_not_existing_1} [DICT] (1/1) > {I_am_not_existing_2} [STR] : 'Val_1' +[DICT] (4/1) > {dTestDict} [DICT] (6/3) > {kVal_3} [DICT] (1/1) > {I_am_not_existing_3} [DICT] (1/1) > {I_am_not_existing_4} [STR] : 'Val_1_extended' +[DICT] (4/1) > {dTestDict} [DICT] (6/4) > {kVal_3b} [DICT] (1/1) > {I_am_not_existing_3b} [DICT] (1/1) > {I_am_not_existing_4b} [STR] : 'Val_1' +[DICT] (4/1) > {dTestDict} [DICT] (6/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/1) > {A} [INT] : 1 +[DICT] (4/1) > {dTestDict} [DICT] (6/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/2) > {B} [LIST] (2/1) > [INT] : 1 +[DICT] (4/1) > {dTestDict} [DICT] (6/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/2) > {B} [LIST] (2/2) > [INT] : 2 +[DICT] (4/1) > {dTestDict} [DICT] (6/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/3) > {kVal_4D} [DICT] (1/1) > {kVal_4E} [DICT] (1/1) > {kVal_4F} [DICT] (1/1) > {kVal_4G} [DICT] (2/1) > {C} [INT] : 2 +[DICT] (4/1) > {dTestDict} [DICT] (6/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/3) > {kVal_4D} [DICT] (1/1) > {kVal_4E} [DICT] (1/1) > {kVal_4F} [DICT] (1/1) > {kVal_4G} [DICT] (2/2) > {D} [LIST] (2/1) > [INT] : 3 +[DICT] (4/1) > {dTestDict} [DICT] (6/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/3) > {kVal_4D} [DICT] (1/1) > {kVal_4E} [DICT] (1/1) > {kVal_4F} [DICT] (1/1) > {kVal_4G} [DICT] (2/2) > {D} [LIST] (2/2) > [INT] : 4 +[DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/1) > {E} [INT] : 3 +[DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/2) > {F} [LIST] (2/1) > [INT] : 5 +[DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/2) > {F} [LIST] (2/2) > [INT] : 6 +[DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/3) > {kVal_5C} [DICT] (2/1) > {G} [INT] : 4 +[DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/3) > {kVal_5C} [DICT] (2/2) > {H} [LIST] (2/1) > [INT] : 7 +[DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/3) > {kVal_5C} [DICT] (2/2) > {H} [LIST] (2/2) > [INT] : 8 +[DICT] (4/2) > {kVal_5B_name} [STR] : 'kVal_5B' +[DICT] (4/3) > {kVal_5C_name} [STR] : 'kVal_5C' +[DICT] (4/4) > {Val_1_extended} [STR] : 'Val_1' """ listofdictUsecases.append(dictUsecase) del dictUsecase diff --git a/test/testfiles/import/import.1/import.1.1/jpp-test_config_implicit_creation.1.1.1.jsonp b/test/testfiles/import/import.1/import.1.1/jpp-test_config_implicit_creation.1.1.1.jsonp index 91c512cc..2becb3d4 100644 --- a/test/testfiles/import/import.1/import.1.1/jpp-test_config_implicit_creation.1.1.1.jsonp +++ b/test/testfiles/import/import.1/import.1.1/jpp-test_config_implicit_creation.1.1.1.jsonp @@ -18,11 +18,15 @@ "${dTestDict.kVal_3.I_am_not_existing_3.I_am_not_existing_4}" : "${dTestDict}['kVal_2']['I_am_not_existing_1']['I_am_not_existing_2']", // mixture of dotdict and standard notation: ${dTestDict.kVal_4}['kVal_4B']['kVal_4C'] : {"A" : 1, "B" : [1,2]}, - ${dTestDict.kVal_4.kVal_4B.kVal_4C.kVal_4D.kVal_4E}['kVal_4F']['kVal_4G'] : {"C" : 2, "D" : [3,4]} + ${dTestDict.kVal_4.kVal_4B.kVal_4C.kVal_4D.kVal_4E}['kVal_4F']['kVal_4G'] : {"C" : 2, "D" : [3,4]}, // sub key defined by parameter: - // "kVal_5B_name" : "kVal_5B", - // reference: https://github.com/test-fullautomation/python-jsonpreprocessor/issues/153 - // currently not working // ${dTestDict.kVal_5.${kVal_5B_name}} : {"E" : 3, "F" : [5,6]} - // currently not working // ${dTestDict.kVal_5}['${kVal_5B_name}'] : {"G" : 4, "H" : [7,8]} - // currently not working // ${dTestDict.${kVal_5B_name}.${kVal_5B_name}} : {"M" : 5, "N" : [0,9]} + "kVal_5B_name" : "kVal_5B", + "kVal_5C_name" : "kVal_5C", + ${dTestDict.kVal_5.${kVal_5B_name}} : {"E" : 3, "F" : [5,6]}, + ${dTestDict.kVal_5}['${kVal_5B_name}']['${kVal_5C_name}'] : {"G" : 4, "H" : [7,8]} + // + // invalid parameter format (reference: https://github.com/test-fullautomation/python-jsonpreprocessor/issues/153) + // ${dTestDict.${kVal_5B_name}.${kVal_5C_name}.kVal_5D} : {"M" : 5, "N" : [0,9]} + // ${dTestDict.${kVal_5B_name}.${kVal_5C_name}}['kVal_5D'] : {"M" : 5, "N" : [0,9]} } + From 8435da74a0c6acb9002d9530291a75595d786d8f Mon Sep 17 00:00:00 2001 From: mas2hc Date: Tue, 2 Jan 2024 15:05:36 +0700 Subject: [PATCH 02/18] Adds error message log for invalid format --- JsonPreprocessor/CJsonPreprocessor.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 66cdd427..68cb6af4 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -594,6 +594,7 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): elif re.match("^\s*" + pattern + "\s*$", sInputStr): sInputStr = re.sub("\$", "$$", sInputStr) else: + self.__reset() while "str(" in initValue: initValue = re.sub("str\(([\${}0-9A-Za-z\.\-_\[\]]+)\)", "\\1", initValue, count=1) raise Exception(f"Invalid syntax! One or more than one opened or closed curly bracket is missing in expression '{initValue}'.\n \ @@ -669,6 +670,7 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): k = re.sub("\$\$", "$", k) k = re.sub('^\s*\${\s*(.*?)\s*}', '\\1', keyAfterProcessed[0]) elif k.count('{') != k.count('}'): + self.__reset() raise Exception(f"Could not overwrite parameter {k} due to wrong format.\n \ Please check key '{k}' in config file!!!") @@ -757,6 +759,8 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: valueNumberPattern = "[0-9\.]+" if "${" in sInputStr: + if re.search("\[[0-9\s]*[A-Za-z_]+[0-9\s]*\]", sInputStr): + raise Exception(f"Invalid syntax! A sub-element in {sInputStr.strip()} has to enclosed in quotes.") if re.match("^\s*" + nestedPattern + "\s*,*\]*}*\s*$", sInputStr.lower()): sInputStr = re.sub("(" + nestedPattern + ")", "\"\\1\"", sInputStr) nestedParam = re.sub("^\s*\"(.+)\"\s*.*$", "\\1", sInputStr) From 183409977a734c8b61688aaffa53c9f93d75b18a Mon Sep 17 00:00:00 2001 From: qth2hi Date: Tue, 2 Jan 2024 10:48:01 +0100 Subject: [PATCH 03/18] Release item file updated --- .../release_items_JsonPreprocessor.json | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/config/robotframework_aio/release_items_JsonPreprocessor.json b/config/robotframework_aio/release_items_JsonPreprocessor.json index 9f848fa2..6640d9e0 100644 --- a/config/robotframework_aio/release_items_JsonPreprocessor.json +++ b/config/robotframework_aio/release_items_JsonPreprocessor.json @@ -45,20 +45,22 @@ # ------------------------------------------ "RELEASES" : { - "0.9." : [ - "JsonPreprocessor change 0.9 Implicit creation of data structures", - "JsonPreprocessor change 0.9 Dotdict feature bug fixing", - "JsonPreprocessor change 0.9 Update nested parameters handling in key name and value", - "JsonPreprocessor change 0.9 Nested parameter feature bug fixing", - "JsonPreprocessor change 0.9 Nested parameters substitution and overwriting improvement", - "JsonPreprocessor change 0.9 Jsonp file path computation improvement" - ], "0.10." : [ - "JsonPreprocessor change 0.10 Add jsonDump method to write a file in JSON format", - "JsonPreprocessor change 0.10 Improve nested parameter format", - "JsonPreprocessor change 0.10 Improve error message log", - "JsonPreprocessor change 0.10 Fix bugs of data structures implicitly", - "JsonPreprocessor change 0.10 Improve index handling together with nested parameters" +" +* Added a ``jsonDump`` method to write the content of a Python dictionary to a file in JSON format + + **Example:** + + .. code:: + + dictTest = {\"A\" 1, \"B\" 2} + json_preprocessor = CJsonPreprocessor() + json_preprocessor.jsonDump(dictTest, \"./OutputFile.json\") + +* Improved format of nested parameters; improved error messages +* Some bugs fixed in implicitly created data structures +* Improved index handling together with nested parameters +" ] } -} \ No newline at end of file +} From f1de100ffad99ca803362ead0ee9d06d77b5b433 Mon Sep 17 00:00:00 2001 From: Mai Dinh Nam Son Date: Tue, 2 Jan 2024 23:09:13 +0700 Subject: [PATCH 04/18] Temporary disable implicit creation of data structure based on nested params --- JsonPreprocessor/CJsonPreprocessor.py | 31 +++++++++++++++++---------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 68cb6af4..2c243123 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -497,31 +497,35 @@ def __handleDotdictFormat(self, lInputListParams : list, lParams: list = []) -> else: return self.__handleDotdictFormat(lInputListParams, lParams) - def __checkAndCreateNewElement(self, sKey: str, value): + def __checkAndCreateNewElement(self, sKey: str, value, bCheck=False): ''' This method check and create new elements if they are not exist. ''' rootKey = re.sub("\[.*\]", "", sKey) subElements = re.findall("\[\s*'([0-9A-Za-z_]+[0-9A-Za-z\.\-_]*)'\s*\]", sKey) - if len(subElements) <= 1: - return + if len(subElements) < 1: + return True else: for index, element in enumerate(subElements): - if index < len(subElements) - 1: + if index < len(subElements): rootKey = rootKey + "['" + element + "']" sExec = "dumpData = " + rootKey try: exec(sExec) except: - sExec = rootKey + " = {}" - try: - exec(sExec, globals()) - except Exception as error: - self.__reset() - errorMsg = f"Could not set variable '{sKey}' with value '{value}'! Reason: {error}" - raise Exception(errorMsg) + if bCheck==True: + return False # Return 'False' when detected implicit creation of data structures based on nested parameters. + else: + sExec = rootKey + " = {}" + try: + exec(sExec, globals()) + except Exception as error: + self.__reset() + errorMsg = f"Could not set variable '{sKey}' with value '{value}'! Reason: {error}" + raise Exception(errorMsg) else: continue + return True def __updateAndReplaceNestedParam(self, oJson : dict, bNested : bool = False, recursive : bool = False): ''' @@ -669,6 +673,11 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): keyAfterProcessed = self.__nestedParamHandler(k, bKey=True) k = re.sub("\$\$", "$", k) k = re.sub('^\s*\${\s*(.*?)\s*}', '\\1', keyAfterProcessed[0]) + if re.search("\[\s*'" + pattern + "'\s*\]", keyNested): # Temporary disable implicit creation of data structures based on nested parameters. + if not self.__checkAndCreateNewElement(k, v, bCheck=True): # In case check sub-element returns False -> reset() and raise an exception. + self.__reset() + raise Exception(f"\nThe implicit creation of data structures based on nested parameter does not enable yet.\n\ +New parameter '{k}' could not be created by the expression '{keyNested}'") elif k.count('{') != k.count('}'): self.__reset() raise Exception(f"Could not overwrite parameter {k} due to wrong format.\n \ From ef593bdc291277fd02ce910b1ce0ff3eb75c1fe1 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Wed, 3 Jan 2024 11:43:53 +0700 Subject: [PATCH 05/18] Update selftest due to temporary disabled implicit creation based on nested params --- test/testconfig/TestConfig.py | 39 ++++++++++--------- ...-test_config_implicit_creation.1.1.1.jsonp | 12 +++--- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/test/testconfig/TestConfig.py b/test/testconfig/TestConfig.py index 68cbb7ff..0f8d3e72 100644 --- a/test/testconfig/TestConfig.py +++ b/test/testconfig/TestConfig.py @@ -2130,26 +2130,27 @@ dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_1000.jsonp" dictUsecase['EXPECTEDEXCEPTION'] = None dictUsecase['EXPECTEDRETURN'] = """ -[DICT] (4/1) > {dTestDict} [DICT] (6/1) > {kVal_1} [STR] : 'Val_1' -[DICT] (4/1) > {dTestDict} [DICT] (6/2) > {kVal_2} [DICT] (1/1) > {I_am_not_existing_1} [DICT] (1/1) > {I_am_not_existing_2} [STR] : 'Val_1' -[DICT] (4/1) > {dTestDict} [DICT] (6/3) > {kVal_3} [DICT] (1/1) > {I_am_not_existing_3} [DICT] (1/1) > {I_am_not_existing_4} [STR] : 'Val_1_extended' -[DICT] (4/1) > {dTestDict} [DICT] (6/4) > {kVal_3b} [DICT] (1/1) > {I_am_not_existing_3b} [DICT] (1/1) > {I_am_not_existing_4b} [STR] : 'Val_1' -[DICT] (4/1) > {dTestDict} [DICT] (6/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/1) > {A} [INT] : 1 -[DICT] (4/1) > {dTestDict} [DICT] (6/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/2) > {B} [LIST] (2/1) > [INT] : 1 -[DICT] (4/1) > {dTestDict} [DICT] (6/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/2) > {B} [LIST] (2/2) > [INT] : 2 -[DICT] (4/1) > {dTestDict} [DICT] (6/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/3) > {kVal_4D} [DICT] (1/1) > {kVal_4E} [DICT] (1/1) > {kVal_4F} [DICT] (1/1) > {kVal_4G} [DICT] (2/1) > {C} [INT] : 2 -[DICT] (4/1) > {dTestDict} [DICT] (6/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/3) > {kVal_4D} [DICT] (1/1) > {kVal_4E} [DICT] (1/1) > {kVal_4F} [DICT] (1/1) > {kVal_4G} [DICT] (2/2) > {D} [LIST] (2/1) > [INT] : 3 -[DICT] (4/1) > {dTestDict} [DICT] (6/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/3) > {kVal_4D} [DICT] (1/1) > {kVal_4E} [DICT] (1/1) > {kVal_4F} [DICT] (1/1) > {kVal_4G} [DICT] (2/2) > {D} [LIST] (2/2) > [INT] : 4 -[DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/1) > {E} [INT] : 3 -[DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/2) > {F} [LIST] (2/1) > [INT] : 5 -[DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/2) > {F} [LIST] (2/2) > [INT] : 6 -[DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/3) > {kVal_5C} [DICT] (2/1) > {G} [INT] : 4 -[DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/3) > {kVal_5C} [DICT] (2/2) > {H} [LIST] (2/1) > [INT] : 7 -[DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/3) > {kVal_5C} [DICT] (2/2) > {H} [LIST] (2/2) > [INT] : 8 -[DICT] (4/2) > {kVal_5B_name} [STR] : 'kVal_5B' -[DICT] (4/3) > {kVal_5C_name} [STR] : 'kVal_5C' -[DICT] (4/4) > {Val_1_extended} [STR] : 'Val_1' +[DICT] (2/1) > {dTestDict} [DICT] (5/1) > {kVal_1} [STR] : 'Val_1' +[DICT] (2/1) > {dTestDict} [DICT] (5/2) > {kVal_2} [DICT] (1/1) > {I_am_not_existing_1} [DICT] (1/1) > {I_am_not_existing_2} [STR] : 'Val_1' +[DICT] (2/1) > {dTestDict} [DICT] (5/3) > {kVal_3} [DICT] (1/1) > {I_am_not_existing_3} [DICT] (1/1) > {I_am_not_existing_4} [STR] : 'Val_1_extended' +[DICT] (2/1) > {dTestDict} [DICT] (5/4) > {kVal_3b} [DICT] (1/1) > {I_am_not_existing_3b} [DICT] (1/1) > {I_am_not_existing_4b} [STR] : 'Val_1' +[DICT] (2/1) > {dTestDict} [DICT] (5/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/1) > {A} [INT] : 1 +[DICT] (2/1) > {dTestDict} [DICT] (5/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/2) > {B} [LIST] (2/1) > [INT] : 1 +[DICT] (2/1) > {dTestDict} [DICT] (5/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/2) > {B} [LIST] (2/2) > [INT] : 2 +[DICT] (2/1) > {dTestDict} [DICT] (5/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/3) > {kVal_4D} [DICT] (1/1) > {kVal_4E} [DICT] (1/1) > {kVal_4F} [DICT] (1/1) > {kVal_4G} [DICT] (2/1) > {C} [INT] : 2 +[DICT] (2/1) > {dTestDict} [DICT] (5/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/3) > {kVal_4D} [DICT] (1/1) > {kVal_4E} [DICT] (1/1) > {kVal_4F} [DICT] (1/1) > {kVal_4G} [DICT] (2/2) > {D} [LIST] (2/1) > [INT] : 3 +[DICT] (2/1) > {dTestDict} [DICT] (5/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/3) > {kVal_4D} [DICT] (1/1) > {kVal_4E} [DICT] (1/1) > {kVal_4F} [DICT] (1/1) > {kVal_4G} [DICT] (2/2) > {D} [LIST] (2/2) > [INT] : 4 +[DICT] (2/2) > {Val_1_extended} [STR] : 'Val_1' """ +# Comment out these test result due to the implicit creation of data structures based on nested parameters is temporary disabled. +# [DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/1) > {E} [INT] : 3 +# [DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/2) > {F} [LIST] (2/1) > [INT] : 5 +# [DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/2) > {F} [LIST] (2/2) > [INT] : 6 +# [DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/3) > {kVal_5C} [DICT] (2/1) > {G} [INT] : 4 +# [DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/3) > {kVal_5C} [DICT] (2/2) > {H} [LIST] (2/1) > [INT] : 7 +# [DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/3) > {kVal_5C} [DICT] (2/2) > {H} [LIST] (2/2) > [INT] : 8 +# [DICT] (4/2) > {kVal_5B_name} [STR] : 'kVal_5B' +# [DICT] (4/3) > {kVal_5C_name} [STR] : 'kVal_5C' listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- diff --git a/test/testfiles/import/import.1/import.1.1/jpp-test_config_implicit_creation.1.1.1.jsonp b/test/testfiles/import/import.1/import.1.1/jpp-test_config_implicit_creation.1.1.1.jsonp index 2becb3d4..54bd88a9 100644 --- a/test/testfiles/import/import.1/import.1.1/jpp-test_config_implicit_creation.1.1.1.jsonp +++ b/test/testfiles/import/import.1/import.1.1/jpp-test_config_implicit_creation.1.1.1.jsonp @@ -18,12 +18,12 @@ "${dTestDict.kVal_3.I_am_not_existing_3.I_am_not_existing_4}" : "${dTestDict}['kVal_2']['I_am_not_existing_1']['I_am_not_existing_2']", // mixture of dotdict and standard notation: ${dTestDict.kVal_4}['kVal_4B']['kVal_4C'] : {"A" : 1, "B" : [1,2]}, - ${dTestDict.kVal_4.kVal_4B.kVal_4C.kVal_4D.kVal_4E}['kVal_4F']['kVal_4G'] : {"C" : 2, "D" : [3,4]}, - // sub key defined by parameter: - "kVal_5B_name" : "kVal_5B", - "kVal_5C_name" : "kVal_5C", - ${dTestDict.kVal_5.${kVal_5B_name}} : {"E" : 3, "F" : [5,6]}, - ${dTestDict.kVal_5}['${kVal_5B_name}']['${kVal_5C_name}'] : {"G" : 4, "H" : [7,8]} + ${dTestDict.kVal_4.kVal_4B.kVal_4C.kVal_4D.kVal_4E}['kVal_4F']['kVal_4G'] : {"C" : 2, "D" : [3,4]} + // sub key defined by parameter: (Temporary disable implicit creation of data structures based on nested parameters) + // "kVal_5B_name" : "kVal_5B", + // "kVal_5C_name" : "kVal_5C", + // ${dTestDict.kVal_5.${kVal_5B_name}} : {"E" : 3, "F" : [5,6]}, + // ${dTestDict.kVal_5}['${kVal_5B_name}']['${kVal_5C_name}'] : {"G" : 4, "H" : [7,8]} // // invalid parameter format (reference: https://github.com/test-fullautomation/python-jsonpreprocessor/issues/153) // ${dTestDict.${kVal_5B_name}.${kVal_5C_name}.kVal_5D} : {"M" : 5, "N" : [0,9]} From 90cb6ac0cbaa299a19cc999b098e7bf520f7ba0d Mon Sep 17 00:00:00 2001 From: mas2hc Date: Wed, 3 Jan 2024 18:25:05 +0700 Subject: [PATCH 06/18] Fix bug when execute selftest with implicit creation based on nested param disabled --- JsonPreprocessor/CJsonPreprocessor.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 2c243123..206af1da 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -604,7 +604,8 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): raise Exception(f"Invalid syntax! One or more than one opened or closed curly bracket is missing in expression '{initValue}'.\n \ Please check the configuration file of the executed test!") sInputStr = self.__checkParamName(sInputStr) - valueAfterProcessed = self.__nestedParamHandler(sInputStr) + valueAfterProcessed = self.__nestedParamHandler(sInputStr) if not bValueConvertString else \ + self.__nestedParamHandler(sInputStr, bKey=bKey) for valueProcessed in valueAfterProcessed: tmpValueAfterProcessed = re.sub('\\${\s*(.*?)\s*}', '\\1', valueProcessed) sExec = "value = " + tmpValueAfterProcessed if isinstance(tmpValueAfterProcessed, str) else \ @@ -660,12 +661,11 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): elif CNameMangling.STRINGCONVERT.value in k: bStrConvert = True del oJson[k] - k = k.replace(CNameMangling.STRINGCONVERT.value, '') - oJson[k] = v - keyNested = k + keyNested = k.replace(CNameMangling.STRINGCONVERT.value, '') + oJson[keyNested] = v bNested = True while "${" in k: - k = __loadNestedValue(keyNested, k) + k = __loadNestedValue(keyNested, k, bKey=True) elif re.match("^\s*" + pattern + "\s*$", k.lower()): keyNested = k k = re.sub("\$", "$$", k) @@ -673,10 +673,13 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): keyAfterProcessed = self.__nestedParamHandler(k, bKey=True) k = re.sub("\$\$", "$", k) k = re.sub('^\s*\${\s*(.*?)\s*}', '\\1', keyAfterProcessed[0]) - if re.search("\[\s*'" + pattern + "'\s*\]", keyNested): # Temporary disable implicit creation of data structures based on nested parameters. - if not self.__checkAndCreateNewElement(k, v, bCheck=True): # In case check sub-element returns False -> reset() and raise an exception. - self.__reset() - raise Exception(f"\nThe implicit creation of data structures based on nested parameter does not enable yet.\n\ + # Temporary disable implicit creation of data structures based on nested parameters. + # In case check sub-element returns False -> reset() and raise an exception. + if (re.search("\[\s*'" + pattern + "'\s*\]", keyNested) or \ + re.search("\." + pattern + "[\.}]+", keyNested)) and \ + not self.__checkAndCreateNewElement(k, v, bCheck=True): + self.__reset() + raise Exception(f"\nThe implicit creation of data structures based on nested parameter does not enable yet.\n\ New parameter '{k}' could not be created by the expression '{keyNested}'") elif k.count('{') != k.count('}'): self.__reset() @@ -1069,8 +1072,8 @@ def __removeDuplicatedKey(dInput : dict) -> dict: tmpNestedParam = nestedParam.replace("$", "\$") tmpNestedParam = tmpNestedParam.replace("[", "\[") tmpNestedParam = tmpNestedParam.replace("]", "\]") - if re.search("(\s*\"str\(" + tmpNestedParam + "\)\"\s*:)", newLine) \ - or re.search("(\s*\"" + tmpNestedParam + "\"\s*:)", newLine): + if re.search("(\s*\"str\(" + tmpNestedParam + "\)\"\s*:)", newLine.replace(CNameMangling.STRINGCONVERT.value, '')) \ + or re.search("(\s*\"" + tmpNestedParam + "\"\s*:)", newLine.replace(CNameMangling.STRINGCONVERT.value, '')): self.lNestedParams.remove(nestedParam) sJsonDataUpdated = sJsonDataUpdated + newLine + "\n" else: From 211fa50e1468b34e2c093ae494d05187f3d8a31c Mon Sep 17 00:00:00 2001 From: mas2hc Date: Mon, 8 Jan 2024 17:28:37 +0700 Subject: [PATCH 07/18] Fix bug while disables implicit creation based on nested params --- JsonPreprocessor/CJsonPreprocessor.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 206af1da..d27654ed 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -361,12 +361,13 @@ def __referVarHandle(referVar : str, sInputStr : str) -> str: dotdictVariable = re.sub('\$\${\s*(.*?)\s*}', '\\1', referVar) lDotdictVariable = dotdictVariable.split(".") lParams = self.__handleDotdictFormat(lDotdictVariable, []) - sParam = '$${' + lParams[0] + '}' + rootElement = lParams[0] + sParam = '$${' + rootElement + '}' lParams.pop(0) for item in lParams: sParam = sParam + "[" + item + "]" if re.match("^\d+$", item) else sParam + "['" + item + "']" - sInputStr = re.sub('\$\${\s*([^\}]*)\s*}', sParam, sInputStr) - referVar = re.findall('(\$\${\s*.*?\s*})', sInputStr)[0] + sInputStr = re.sub(referVar.replace("$", "\$"), sParam, sInputStr) + referVar = '$${' + rootElement + '}' tmpReferVar = re.sub("\$", "\\$", referVar) pattern = '(' + tmpReferVar + '\s*(\[+\s*.*?\s*\]+)*)' variable = re.search(pattern, sInputStr) From 59c3611202fdc2c6c07364cc2455ac37072ba028 Mon Sep 17 00:00:00 2001 From: qth2hi Date: Tue, 9 Jan 2024 11:53:35 +0100 Subject: [PATCH 08/18] Added BADCASE tests for the "implict creation" feature: JPP_1050 - JPP_1057 --- test/JPP_TestUsecases.csv | 8 + test/JPP_TestUsecases.html | 270 +++++++++++++++++- test/JPP_TestUsecases.rst | 82 +++++- test/JPP_TestUsecases.txt | 34 ++- test/component_test.py | 4 +- .../test_12_IMPLICIT_CREATION_BADCASE.py | 96 +++++++ ...E.py => test_13_CYCLIC_IMPORTS_BADCASE.py} | 4 +- ...SE.py => test_14_PATH_FORMATS_GOODCASE.py} | 4 +- test/testconfig/TestConfig.py | 124 +++++++- ...-test_config_implicit_creation.1.1.1.jsonp | 9 - test/testfiles/jpp-test_config_1001.jsonp | 13 +- test/testfiles/jpp-test_config_1050.jsonp | 21 ++ test/testfiles/jpp-test_config_1051.jsonp | 21 ++ test/testfiles/jpp-test_config_1052.jsonp | 21 ++ test/testfiles/jpp-test_config_1053.jsonp | 21 ++ test/testfiles/jpp-test_config_1054.jsonp | 21 ++ test/testfiles/jpp-test_config_1055.jsonp | 21 ++ test/testfiles/jpp-test_config_1056.jsonp | 21 ++ test/testfiles/jpp-test_config_1057.jsonp | 21 ++ 19 files changed, 785 insertions(+), 31 deletions(-) create mode 100644 test/pytest/pytestfiles/test_12_IMPLICIT_CREATION_BADCASE.py rename test/pytest/pytestfiles/{test_12_CYCLIC_IMPORTS_BADCASE.py => test_13_CYCLIC_IMPORTS_BADCASE.py} (97%) rename test/pytest/pytestfiles/{test_13_PATH_FORMATS_GOODCASE.py => test_14_PATH_FORMATS_GOODCASE.py} (96%) create mode 100644 test/testfiles/jpp-test_config_1050.jsonp create mode 100644 test/testfiles/jpp-test_config_1051.jsonp create mode 100644 test/testfiles/jpp-test_config_1052.jsonp create mode 100644 test/testfiles/jpp-test_config_1053.jsonp create mode 100644 test/testfiles/jpp-test_config_1054.jsonp create mode 100644 test/testfiles/jpp-test_config_1055.jsonp create mode 100644 test/testfiles/jpp-test_config_1056.jsonp create mode 100644 test/testfiles/jpp-test_config_1057.jsonp diff --git a/test/JPP_TestUsecases.csv b/test/JPP_TestUsecases.csv index 0e4d7cd3..544ffd9b 100644 --- a/test/JPP_TestUsecases.csv +++ b/test/JPP_TestUsecases.csv @@ -78,6 +78,14 @@ JPP_0953|COMMON_SYNTAX_VIOLATIONS|BADCASE|JSON file with syntax error (4): file JPP_0954|COMMON_SYNTAX_VIOLATIONS|BADCASE|JSON file with syntax error (5): file is empty (multiple pairs of brackets only) JPP_1000|IMPLICIT_CREATION|GOODCASE|JSON file with dictionary keys to be created implicitly JPP_1001|IMPLICIT_CREATION|GOODCASE|JSON file with dictionary keys to be created implicitly (same key names at all levels) +JPP_1050|IMPLICIT_CREATION|BADCASE|JSON file with implicit creation of data structures based on parameters (1) +JPP_1051|IMPLICIT_CREATION|BADCASE|JSON file with implicit creation of data structures based on parameters (2) +JPP_1052|IMPLICIT_CREATION|BADCASE|JSON file with implicit creation of data structures based on parameters (3) +JPP_1053|IMPLICIT_CREATION|BADCASE|JSON file with implicit creation of data structures based on parameters (4) +JPP_1054|IMPLICIT_CREATION|BADCASE|JSON file with implicit creation of data structures based on parameters (5) +JPP_1055|IMPLICIT_CREATION|BADCASE|JSON file with implicit creation of data structures based on parameters (5) +JPP_1056|IMPLICIT_CREATION|BADCASE|JSON file with implicit creation of data structures based on parameters (6) +JPP_1057|IMPLICIT_CREATION|BADCASE|JSON file with implicit creation of data structures based on parameters (7) JPP_1150|CYCLIC_IMPORTS|BADCASE|JSON file with cyclic imports (JSON file imports itself) JPP_1151|CYCLIC_IMPORTS|BADCASE|JSON file with cyclic imports (JSON file imports another file, that is already imported) JPP_1200|PATH_FORMATS|GOODCASE|Relative path to JSON file diff --git a/test/JPP_TestUsecases.html b/test/JPP_TestUsecases.html index e37e35da..2136df85 100644 --- a/test/JPP_TestUsecases.html +++ b/test/JPP_TestUsecases.html @@ -2638,6 +2638,270 @@ 79 + + + +JPP_1050 + + + + +IMPLICIT_CREATION + + + + +BADCASE + + + + +JSON file with implicit creation of data structures based on parameters (1)
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +80 + + + + + +JPP_1051 + + + + +IMPLICIT_CREATION + + + + +BADCASE + + + + +JSON file with implicit creation of data structures based on parameters (2)
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +81 + + + + + +JPP_1052 + + + + +IMPLICIT_CREATION + + + + +BADCASE + + + + +JSON file with implicit creation of data structures based on parameters (3)
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +82 + + + + + +JPP_1053 + + + + +IMPLICIT_CREATION + + + + +BADCASE + + + + +JSON file with implicit creation of data structures based on parameters (4)
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +83 + + + + + +JPP_1054 + + + + +IMPLICIT_CREATION + + + + +BADCASE + + + + +JSON file with implicit creation of data structures based on parameters (5)
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +84 + + + + + +JPP_1055 + + + + +IMPLICIT_CREATION + + + + +BADCASE + + + + +JSON file with implicit creation of data structures based on parameters (5)
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +85 + + + + + +JPP_1056 + + + + +IMPLICIT_CREATION + + + + +BADCASE + + + + +JSON file with implicit creation of data structures based on parameters (6)
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +86 + + + + + +JPP_1057 + + + + +IMPLICIT_CREATION + + + + +BADCASE + + + + +JSON file with implicit creation of data structures based on parameters (7)
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +87 + + @@ -2668,7 +2932,7 @@ -80 +88 @@ -2701,7 +2965,7 @@ -81 +89 @@ -2735,7 +2999,7 @@
 

-
Generated: 20.11.2023 - 15:42:16
+
Generated: 09.01.2024 - 11:50:58
 
diff --git a/test/JPP_TestUsecases.rst b/test/JPP_TestUsecases.rst index b8213208..b37a5f13 100644 --- a/test/JPP_TestUsecases.rst +++ b/test/JPP_TestUsecases.rst @@ -855,6 +855,86 @@ Test Use Cases ---- +* **Test JPP_1050** + + [IMPLICIT_CREATION / BADCASE] + + **JSON file with implicit creation of data structures based on parameters (1)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + +---- + +* **Test JPP_1051** + + [IMPLICIT_CREATION / BADCASE] + + **JSON file with implicit creation of data structures based on parameters (2)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + +---- + +* **Test JPP_1052** + + [IMPLICIT_CREATION / BADCASE] + + **JSON file with implicit creation of data structures based on parameters (3)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + +---- + +* **Test JPP_1053** + + [IMPLICIT_CREATION / BADCASE] + + **JSON file with implicit creation of data structures based on parameters (4)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + +---- + +* **Test JPP_1054** + + [IMPLICIT_CREATION / BADCASE] + + **JSON file with implicit creation of data structures based on parameters (5)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + +---- + +* **Test JPP_1055** + + [IMPLICIT_CREATION / BADCASE] + + **JSON file with implicit creation of data structures based on parameters (5)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + +---- + +* **Test JPP_1056** + + [IMPLICIT_CREATION / BADCASE] + + **JSON file with implicit creation of data structures based on parameters (6)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + +---- + +* **Test JPP_1057** + + [IMPLICIT_CREATION / BADCASE] + + **JSON file with implicit creation of data structures based on parameters (7)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + +---- + * **Test JPP_1150** [CYCLIC_IMPORTS / BADCASE] @@ -887,5 +967,5 @@ Test Use Cases ---- -Generated: 20.11.2023 - 15:42:16 +Generated: 09.01.2024 - 11:50:58 diff --git a/test/JPP_TestUsecases.txt b/test/JPP_TestUsecases.txt index 41d51a22..c06d4d07 100644 --- a/test/JPP_TestUsecases.txt +++ b/test/JPP_TestUsecases.txt @@ -357,6 +357,38 @@ Test JPP_1001 / IMPLICIT_CREATION / GOODCASE Description: JSON file with dictionary keys to be created implicitly (same key names at all levels) Expectation: JsonPreprocessor returns values ------------------------------------------------------------------------------------------------------------------------ +Test JPP_1050 / IMPLICIT_CREATION / BADCASE +Description: JSON file with implicit creation of data structures based on parameters (1) +Expectation: No values are returned, and JsonPreprocessor throws an exception +------------------------------------------------------------------------------------------------------------------------ +Test JPP_1051 / IMPLICIT_CREATION / BADCASE +Description: JSON file with implicit creation of data structures based on parameters (2) +Expectation: No values are returned, and JsonPreprocessor throws an exception +------------------------------------------------------------------------------------------------------------------------ +Test JPP_1052 / IMPLICIT_CREATION / BADCASE +Description: JSON file with implicit creation of data structures based on parameters (3) +Expectation: No values are returned, and JsonPreprocessor throws an exception +------------------------------------------------------------------------------------------------------------------------ +Test JPP_1053 / IMPLICIT_CREATION / BADCASE +Description: JSON file with implicit creation of data structures based on parameters (4) +Expectation: No values are returned, and JsonPreprocessor throws an exception +------------------------------------------------------------------------------------------------------------------------ +Test JPP_1054 / IMPLICIT_CREATION / BADCASE +Description: JSON file with implicit creation of data structures based on parameters (5) +Expectation: No values are returned, and JsonPreprocessor throws an exception +------------------------------------------------------------------------------------------------------------------------ +Test JPP_1055 / IMPLICIT_CREATION / BADCASE +Description: JSON file with implicit creation of data structures based on parameters (5) +Expectation: No values are returned, and JsonPreprocessor throws an exception +------------------------------------------------------------------------------------------------------------------------ +Test JPP_1056 / IMPLICIT_CREATION / BADCASE +Description: JSON file with implicit creation of data structures based on parameters (6) +Expectation: No values are returned, and JsonPreprocessor throws an exception +------------------------------------------------------------------------------------------------------------------------ +Test JPP_1057 / IMPLICIT_CREATION / BADCASE +Description: JSON file with implicit creation of data structures based on parameters (7) +Expectation: No values are returned, and JsonPreprocessor throws an exception +------------------------------------------------------------------------------------------------------------------------ Test JPP_1150 / CYCLIC_IMPORTS / BADCASE Description: JSON file with cyclic imports (JSON file imports itself) Expectation: No values are returned, and JsonPreprocessor throws an exception @@ -370,5 +402,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: 20.11.2023 - 15:42:16 +Generated: 09.01.2024 - 11:50:58 diff --git a/test/component_test.py b/test/component_test.py index c4de2027..2af5d8b8 100644 --- a/test/component_test.py +++ b/test/component_test.py @@ -22,8 +22,8 @@ # # -------------------------------------------------------------------------------------------------------------- # -VERSION = "0.20.0" -VERSION_DATE = "14.12.2023" +VERSION = "0.21.0" +VERSION_DATE = "09.01.2024" # # -------------------------------------------------------------------------------------------------------------- #TM*** diff --git a/test/pytest/pytestfiles/test_12_IMPLICIT_CREATION_BADCASE.py b/test/pytest/pytestfiles/test_12_IMPLICIT_CREATION_BADCASE.py new file mode 100644 index 00000000..68f98ff4 --- /dev/null +++ b/test/pytest/pytestfiles/test_12_IMPLICIT_CREATION_BADCASE.py @@ -0,0 +1,96 @@ +# ************************************************************************************************************** +# Copyright 2020-2023 Robert Bosch GmbH +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# -------------------------------------------------------------------------------------------------------------- +# +# test_12_IMPLICIT_CREATION_BADCASE.py +# +# XC-CT/ECA3-Queckenstedt +# +# 09.01.2024 - 11:50:58 +# +# -------------------------------------------------------------------------------------------------------------- + +import pytest +from pytestlibs.CExecute import CExecute + +# -------------------------------------------------------------------------------------------------------------- + +class Test_IMPLICIT_CREATION_BADCASE: + +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file with implicit creation of data structures based on parameters (1)",] + ) + def test_JPP_1050(self, Description): + nReturn = CExecute.Execute("JPP_1050") + assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file with implicit creation of data structures based on parameters (2)",] + ) + def test_JPP_1051(self, Description): + nReturn = CExecute.Execute("JPP_1051") + assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file with implicit creation of data structures based on parameters (3)",] + ) + def test_JPP_1052(self, Description): + nReturn = CExecute.Execute("JPP_1052") + assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file with implicit creation of data structures based on parameters (4)",] + ) + def test_JPP_1053(self, Description): + nReturn = CExecute.Execute("JPP_1053") + assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file with implicit creation of data structures based on parameters (5)",] + ) + def test_JPP_1054(self, Description): + nReturn = CExecute.Execute("JPP_1054") + assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file with implicit creation of data structures based on parameters (5)",] + ) + def test_JPP_1055(self, Description): + nReturn = CExecute.Execute("JPP_1055") + assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file with implicit creation of data structures based on parameters (6)",] + ) + def test_JPP_1056(self, Description): + nReturn = CExecute.Execute("JPP_1056") + assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file with implicit creation of data structures based on parameters (7)",] + ) + def test_JPP_1057(self, Description): + nReturn = CExecute.Execute("JPP_1057") + assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- diff --git a/test/pytest/pytestfiles/test_12_CYCLIC_IMPORTS_BADCASE.py b/test/pytest/pytestfiles/test_13_CYCLIC_IMPORTS_BADCASE.py similarity index 97% rename from test/pytest/pytestfiles/test_12_CYCLIC_IMPORTS_BADCASE.py rename to test/pytest/pytestfiles/test_13_CYCLIC_IMPORTS_BADCASE.py index 7601d111..c38a70a3 100644 --- a/test/pytest/pytestfiles/test_12_CYCLIC_IMPORTS_BADCASE.py +++ b/test/pytest/pytestfiles/test_13_CYCLIC_IMPORTS_BADCASE.py @@ -14,11 +14,11 @@ # limitations under the License. # -------------------------------------------------------------------------------------------------------------- # -# test_12_CYCLIC_IMPORTS_BADCASE.py +# test_13_CYCLIC_IMPORTS_BADCASE.py # # XC-CT/ECA3-Queckenstedt # -# 10.10.2023 - 13:31:11 +# 09.01.2024 - 11:50:58 # # -------------------------------------------------------------------------------------------------------------- diff --git a/test/pytest/pytestfiles/test_13_PATH_FORMATS_GOODCASE.py b/test/pytest/pytestfiles/test_14_PATH_FORMATS_GOODCASE.py similarity index 96% rename from test/pytest/pytestfiles/test_13_PATH_FORMATS_GOODCASE.py rename to test/pytest/pytestfiles/test_14_PATH_FORMATS_GOODCASE.py index e5d97ecf..089c0276 100644 --- a/test/pytest/pytestfiles/test_13_PATH_FORMATS_GOODCASE.py +++ b/test/pytest/pytestfiles/test_14_PATH_FORMATS_GOODCASE.py @@ -14,11 +14,11 @@ # limitations under the License. # -------------------------------------------------------------------------------------------------------------- # -# test_13_PATH_FORMATS_GOODCASE.py +# test_14_PATH_FORMATS_GOODCASE.py # # XC-CT/ECA3-Queckenstedt # -# 10.10.2023 - 13:31:11 +# 09.01.2024 - 11:50:58 # # -------------------------------------------------------------------------------------------------------------- diff --git a/test/testconfig/TestConfig.py b/test/testconfig/TestConfig.py index 0f8d3e72..bad4926f 100644 --- a/test/testconfig/TestConfig.py +++ b/test/testconfig/TestConfig.py @@ -22,7 +22,7 @@ # # -------------------------------------------------------------------------------------------------------------- # -# 14.12.2023 +# 09.01.2024 # # !!! Temporarily tests are deactivated by the following line commented out: # # # listofdictUsecases.append(dictUsecase) @@ -2142,15 +2142,6 @@ [DICT] (2/1) > {dTestDict} [DICT] (5/5) > {kVal_4} [DICT] (1/1) > {kVal_4B} [DICT] (1/1) > {kVal_4C} [DICT] (3/3) > {kVal_4D} [DICT] (1/1) > {kVal_4E} [DICT] (1/1) > {kVal_4F} [DICT] (1/1) > {kVal_4G} [DICT] (2/2) > {D} [LIST] (2/2) > [INT] : 4 [DICT] (2/2) > {Val_1_extended} [STR] : 'Val_1' """ -# Comment out these test result due to the implicit creation of data structures based on nested parameters is temporary disabled. -# [DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/1) > {E} [INT] : 3 -# [DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/2) > {F} [LIST] (2/1) > [INT] : 5 -# [DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/2) > {F} [LIST] (2/2) > [INT] : 6 -# [DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/3) > {kVal_5C} [DICT] (2/1) > {G} [INT] : 4 -# [DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/3) > {kVal_5C} [DICT] (2/2) > {H} [LIST] (2/1) > [INT] : 7 -# [DICT] (4/1) > {dTestDict} [DICT] (6/6) > {kVal_5} [DICT] (1/1) > {kVal_5B} [DICT] (3/3) > {kVal_5C} [DICT] (2/2) > {H} [LIST] (2/2) > [INT] : 8 -# [DICT] (4/2) > {kVal_5B_name} [STR] : 'kVal_5B' -# [DICT] (4/3) > {kVal_5C_name} [STR] : 'kVal_5C' listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- @@ -2175,6 +2166,119 @@ # -------------------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} +dictUsecase['TESTID'] = "JPP_1050" +dictUsecase['DESCRIPTION'] = "JSON file with implicit creation of data structures based on parameters (1)" +dictUsecase['EXPECTATION'] = "No values are returned, and JsonPreprocessor throws an exception" +dictUsecase['SECTION'] = "IMPLICIT_CREATION" +dictUsecase['SUBSECTION'] = "BADCASE" +dictUsecase['HINT'] = None +dictUsecase['COMMENT'] = None +dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_1050.jsonp" +dictUsecase['EXPECTEDEXCEPTION'] = "The implicit creation of data structures based on nested parameter is not supported" +dictUsecase['EXPECTEDRETURN'] = None +listofdictUsecases.append(dictUsecase) +del dictUsecase +# -------------------------------------------------------------------------------------------------------------- +dictUsecase = {} +dictUsecase['TESTID'] = "JPP_1051" +dictUsecase['DESCRIPTION'] = "JSON file with implicit creation of data structures based on parameters (2)" +dictUsecase['EXPECTATION'] = "No values are returned, and JsonPreprocessor throws an exception" +dictUsecase['SECTION'] = "IMPLICIT_CREATION" +dictUsecase['SUBSECTION'] = "BADCASE" +dictUsecase['HINT'] = None +dictUsecase['COMMENT'] = None +dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_1051.jsonp" +dictUsecase['EXPECTEDEXCEPTION'] = "The implicit creation of data structures based on nested parameter is not supported" +dictUsecase['EXPECTEDRETURN'] = None +listofdictUsecases.append(dictUsecase) +del dictUsecase +# -------------------------------------------------------------------------------------------------------------- +dictUsecase = {} +dictUsecase['TESTID'] = "JPP_1052" +dictUsecase['DESCRIPTION'] = "JSON file with implicit creation of data structures based on parameters (3)" +dictUsecase['EXPECTATION'] = "No values are returned, and JsonPreprocessor throws an exception" +dictUsecase['SECTION'] = "IMPLICIT_CREATION" +dictUsecase['SUBSECTION'] = "BADCASE" +dictUsecase['HINT'] = None +dictUsecase['COMMENT'] = None +dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_1052.jsonp" +dictUsecase['EXPECTEDEXCEPTION'] = "The implicit creation of data structures based on nested parameter is not supported" +dictUsecase['EXPECTEDRETURN'] = None +listofdictUsecases.append(dictUsecase) +del dictUsecase +# -------------------------------------------------------------------------------------------------------------- +dictUsecase = {} +dictUsecase['TESTID'] = "JPP_1053" +dictUsecase['DESCRIPTION'] = "JSON file with implicit creation of data structures based on parameters (4)" +dictUsecase['EXPECTATION'] = "No values are returned, and JsonPreprocessor throws an exception" +dictUsecase['SECTION'] = "IMPLICIT_CREATION" +dictUsecase['SUBSECTION'] = "BADCASE" +dictUsecase['HINT'] = None +dictUsecase['COMMENT'] = None +dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_1053.jsonp" +dictUsecase['EXPECTEDEXCEPTION'] = None # test case currently causes a crash of the JsonPreprocessor; 'EXPECTEDEXCEPTION' needs to be defined after bug is fixed +dictUsecase['EXPECTEDRETURN'] = None +listofdictUsecases.append(dictUsecase) +del dictUsecase +# -------------------------------------------------------------------------------------------------------------- +dictUsecase = {} +dictUsecase['TESTID'] = "JPP_1054" +dictUsecase['DESCRIPTION'] = "JSON file with implicit creation of data structures based on parameters (5)" +dictUsecase['EXPECTATION'] = "No values are returned, and JsonPreprocessor throws an exception" +dictUsecase['SECTION'] = "IMPLICIT_CREATION" +dictUsecase['SUBSECTION'] = "BADCASE" +dictUsecase['HINT'] = None +dictUsecase['COMMENT'] = None +dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_1054.jsonp" +dictUsecase['EXPECTEDEXCEPTION'] = None # test case currently causes a crash of the JsonPreprocessor; 'EXPECTEDEXCEPTION' needs to be defined after bug is fixed +dictUsecase['EXPECTEDRETURN'] = None +listofdictUsecases.append(dictUsecase) +del dictUsecase +# -------------------------------------------------------------------------------------------------------------- +dictUsecase = {} +dictUsecase['TESTID'] = "JPP_1055" +dictUsecase['DESCRIPTION'] = "JSON file with implicit creation of data structures based on parameters (5)" +dictUsecase['EXPECTATION'] = "No values are returned, and JsonPreprocessor throws an exception" +dictUsecase['SECTION'] = "IMPLICIT_CREATION" +dictUsecase['SUBSECTION'] = "BADCASE" +dictUsecase['HINT'] = None +dictUsecase['COMMENT'] = None +dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_1055.jsonp" +dictUsecase['EXPECTEDEXCEPTION'] = None # test case currently causes a crash of the JsonPreprocessor; 'EXPECTEDEXCEPTION' needs to be defined after bug is fixed +dictUsecase['EXPECTEDRETURN'] = None +listofdictUsecases.append(dictUsecase) +del dictUsecase +# -------------------------------------------------------------------------------------------------------------- +dictUsecase = {} +dictUsecase['TESTID'] = "JPP_1056" +dictUsecase['DESCRIPTION'] = "JSON file with implicit creation of data structures based on parameters (6)" +dictUsecase['EXPECTATION'] = "No values are returned, and JsonPreprocessor throws an exception" +dictUsecase['SECTION'] = "IMPLICIT_CREATION" +dictUsecase['SUBSECTION'] = "BADCASE" +dictUsecase['HINT'] = None +dictUsecase['COMMENT'] = None +dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_1056.jsonp" +dictUsecase['EXPECTEDEXCEPTION'] = "The implicit creation of data structures based on nested parameter is not supported" # currently causes : ''NoneType' object has no attribute 'group''! +dictUsecase['EXPECTEDRETURN'] = None +listofdictUsecases.append(dictUsecase) +del dictUsecase +# -------------------------------------------------------------------------------------------------------------- +dictUsecase = {} +dictUsecase['TESTID'] = "JPP_1057" +dictUsecase['DESCRIPTION'] = "JSON file with implicit creation of data structures based on parameters (7)" +dictUsecase['EXPECTATION'] = "No values are returned, and JsonPreprocessor throws an exception" +dictUsecase['SECTION'] = "IMPLICIT_CREATION" +dictUsecase['SUBSECTION'] = "BADCASE" +dictUsecase['HINT'] = None +dictUsecase['COMMENT'] = None +dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_1057.jsonp" +dictUsecase['EXPECTEDEXCEPTION'] = "The implicit creation of data structures based on nested parameter is not supported" # currently values are returned with unresolved dollar operator expressions +dictUsecase['EXPECTEDRETURN'] = None +listofdictUsecases.append(dictUsecase) +del dictUsecase +# -------------------------------------------------------------------------------------------------------------- +# -------------------------------------------------------------------------------------------------------------- +dictUsecase = {} dictUsecase['TESTID'] = "JPP_1150" dictUsecase['DESCRIPTION'] = "JSON file with cyclic imports (JSON file imports itself)" dictUsecase['EXPECTATION'] = "No values are returned, and JsonPreprocessor throws an exception" diff --git a/test/testfiles/import/import.1/import.1.1/jpp-test_config_implicit_creation.1.1.1.jsonp b/test/testfiles/import/import.1/import.1.1/jpp-test_config_implicit_creation.1.1.1.jsonp index 54bd88a9..0ad12b4c 100644 --- a/test/testfiles/import/import.1/import.1.1/jpp-test_config_implicit_creation.1.1.1.jsonp +++ b/test/testfiles/import/import.1/import.1.1/jpp-test_config_implicit_creation.1.1.1.jsonp @@ -19,14 +19,5 @@ // mixture of dotdict and standard notation: ${dTestDict.kVal_4}['kVal_4B']['kVal_4C'] : {"A" : 1, "B" : [1,2]}, ${dTestDict.kVal_4.kVal_4B.kVal_4C.kVal_4D.kVal_4E}['kVal_4F']['kVal_4G'] : {"C" : 2, "D" : [3,4]} - // sub key defined by parameter: (Temporary disable implicit creation of data structures based on nested parameters) - // "kVal_5B_name" : "kVal_5B", - // "kVal_5C_name" : "kVal_5C", - // ${dTestDict.kVal_5.${kVal_5B_name}} : {"E" : 3, "F" : [5,6]}, - // ${dTestDict.kVal_5}['${kVal_5B_name}']['${kVal_5C_name}'] : {"G" : 4, "H" : [7,8]} - // - // invalid parameter format (reference: https://github.com/test-fullautomation/python-jsonpreprocessor/issues/153) - // ${dTestDict.${kVal_5B_name}.${kVal_5C_name}.kVal_5D} : {"M" : 5, "N" : [0,9]} - // ${dTestDict.${kVal_5B_name}.${kVal_5C_name}}['kVal_5D'] : {"M" : 5, "N" : [0,9]} } diff --git a/test/testfiles/jpp-test_config_1001.jsonp b/test/testfiles/jpp-test_config_1001.jsonp index bbb17486..02ed0c06 100644 --- a/test/testfiles/jpp-test_config_1001.jsonp +++ b/test/testfiles/jpp-test_config_1001.jsonp @@ -23,7 +23,6 @@ "subkey" : { "paramA" : "ABC", ${param3.subkey.subkey.paramA} : "DEF", - // https://github.com/test-fullautomation/robotframework-testsuitesmanagement/issues/224 "paramA" : ${param2.subkey.subkey.subkey}, "paramB" : "XYZ", ${param3.subkey.subkey.paramB} : ${param2.subkey.subkey.subkey} @@ -31,3 +30,15 @@ } } } + +// Caution: +// The implicit creation of data structures is only possible with hard coded key names. Parameters are not resolved. +// See: +// "paramA" : "ABC", +// ${param3.subkey.subkey.paramA} : "DEF", +// The name of the last implicitely created key within the expression ${param3.subkey.subkey.paramA} +// is "paramA", and not the value "ABC" of the parameter with the same name ("paramA"). + + + + diff --git a/test/testfiles/jpp-test_config_1050.jsonp b/test/testfiles/jpp-test_config_1050.jsonp new file mode 100644 index 00000000..321a056a --- /dev/null +++ b/test/testfiles/jpp-test_config_1050.jsonp @@ -0,0 +1,21 @@ +// Copyright 2020-2023 Robert Bosch GmbH +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//************************************************************************** + +{ + "testdict" : {"A" : 1}, + "name" : "C", + ${testdict.B}['${name}'] : 2 +} + diff --git a/test/testfiles/jpp-test_config_1051.jsonp b/test/testfiles/jpp-test_config_1051.jsonp new file mode 100644 index 00000000..1d63e26b --- /dev/null +++ b/test/testfiles/jpp-test_config_1051.jsonp @@ -0,0 +1,21 @@ +// Copyright 2020-2023 Robert Bosch GmbH +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//************************************************************************** + +{ + "testdict" : {"A" : 1}, + "name" : "C", + ${testdict.B.${name}} : 2 +} + diff --git a/test/testfiles/jpp-test_config_1052.jsonp b/test/testfiles/jpp-test_config_1052.jsonp new file mode 100644 index 00000000..4028d7da --- /dev/null +++ b/test/testfiles/jpp-test_config_1052.jsonp @@ -0,0 +1,21 @@ +// Copyright 2020-2023 Robert Bosch GmbH +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//************************************************************************** + +{ + "testdict" : {"A" : 1}, + "name" : "C", + ${testdict}['${name}']['${name}'] : 2 +} + diff --git a/test/testfiles/jpp-test_config_1053.jsonp b/test/testfiles/jpp-test_config_1053.jsonp new file mode 100644 index 00000000..29b69f56 --- /dev/null +++ b/test/testfiles/jpp-test_config_1053.jsonp @@ -0,0 +1,21 @@ +// Copyright 2020-2023 Robert Bosch GmbH +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//************************************************************************** + +{ + "name" : "C", + "testdict2" : {"B" : 2}, + ${somethingnotexisting.${testdict2}}['${name}'] : 4 +} + diff --git a/test/testfiles/jpp-test_config_1054.jsonp b/test/testfiles/jpp-test_config_1054.jsonp new file mode 100644 index 00000000..60fcd02e --- /dev/null +++ b/test/testfiles/jpp-test_config_1054.jsonp @@ -0,0 +1,21 @@ +// Copyright 2020-2023 Robert Bosch GmbH +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//************************************************************************** + +{ + "name" : "C", + "testdict" : {"B" : 2}, + ${testdict.${testdict}}['${name}'] : 4 +} + diff --git a/test/testfiles/jpp-test_config_1055.jsonp b/test/testfiles/jpp-test_config_1055.jsonp new file mode 100644 index 00000000..4bd33f3b --- /dev/null +++ b/test/testfiles/jpp-test_config_1055.jsonp @@ -0,0 +1,21 @@ +// Copyright 2020-2023 Robert Bosch GmbH +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//************************************************************************** + +{ + "name" : "C", + "testlist" : ["B", 2], + ${testlist.${testlist}}['${name}'] : 4 +} + diff --git a/test/testfiles/jpp-test_config_1056.jsonp b/test/testfiles/jpp-test_config_1056.jsonp new file mode 100644 index 00000000..f96893a0 --- /dev/null +++ b/test/testfiles/jpp-test_config_1056.jsonp @@ -0,0 +1,21 @@ +// Copyright 2020-2023 Robert Bosch GmbH +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//************************************************************************** + +{ + "testdict" : {"A" : 1}, + "name" : "C", + ${testdict.${name}}['${name}'] : 5 +} + diff --git a/test/testfiles/jpp-test_config_1057.jsonp b/test/testfiles/jpp-test_config_1057.jsonp new file mode 100644 index 00000000..00f03ef0 --- /dev/null +++ b/test/testfiles/jpp-test_config_1057.jsonp @@ -0,0 +1,21 @@ +// Copyright 2020-2023 Robert Bosch GmbH +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//************************************************************************** + +{ + "testdict" : {"A" : 1}, + "name" : "C", + ${testdict}[${name}][${name}] : 4 +} + From e2929e34d4895199ead7a48784a225f4f9486d23 Mon Sep 17 00:00:00 2001 From: qth2hi Date: Tue, 9 Jan 2024 17:05:26 +0100 Subject: [PATCH 09/18] Added test cases JPP_0511, JPP_0551, JPP_0552, JPP_0553, JPP_1058, JPP_0268 --- test/JPP_TestUsecases.csv | 6 + test/JPP_TestUsecases.html | 312 ++++++++++++++---- test/JPP_TestUsecases.rst | 66 +++- test/JPP_TestUsecases.txt | 28 +- test/component_test.py | 2 +- .../test_04_PARAMETER_SUBSTITUTION_BADCASE.py | 10 +- .../test_07_COMPOSITE_EXPRESSIONS_GOODCASE.py | 10 +- .../test_08_COMPOSITE_EXPRESSIONS_BADCASE.py | 26 +- .../test_12_IMPLICIT_CREATION_BADCASE.py | 10 +- test/testconfig/TestConfig.py | 87 +++++ test/testfiles/jpp-test_config_0268.jsonp | 19 ++ test/testfiles/jpp-test_config_0511.jsonp | 20 ++ test/testfiles/jpp-test_config_0551.jsonp | 19 ++ test/testfiles/jpp-test_config_0552.jsonp | 19 ++ test/testfiles/jpp-test_config_0553.jsonp | 19 ++ test/testfiles/jpp-test_config_1058.jsonp | 19 ++ 16 files changed, 609 insertions(+), 63 deletions(-) create mode 100644 test/testfiles/jpp-test_config_0268.jsonp create mode 100644 test/testfiles/jpp-test_config_0511.jsonp create mode 100644 test/testfiles/jpp-test_config_0551.jsonp create mode 100644 test/testfiles/jpp-test_config_0552.jsonp create mode 100644 test/testfiles/jpp-test_config_0553.jsonp create mode 100644 test/testfiles/jpp-test_config_1058.jsonp diff --git a/test/JPP_TestUsecases.csv b/test/JPP_TestUsecases.csv index 544ffd9b..3172ed36 100644 --- a/test/JPP_TestUsecases.csv +++ b/test/JPP_TestUsecases.csv @@ -33,6 +33,7 @@ JPP_0264|PARAMETER_SUBSTITUTION|BADCASE|JSON file with list parameter substituti 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_0268|PARAMETER_SUBSTITUTION|BADCASE|JSON file containing a list; list index is defined by a parameter and wrapped in single quotes 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) @@ -69,7 +70,11 @@ JPP_0507|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file containing several string conc JPP_0508|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file containing several string concatenations in separate lines (2) JPP_0509|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file containing several parameter assignments in separate lines (different syntax) JPP_0510|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file containing several parameter assignments in separate lines (extended string concatenation) +JPP_0511|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file containing a list; list index is defined by a parameter JPP_0550|COMPOSITE_EXPRESSIONS|BADCASE|JSON file with composite data structure (nested lists and dictionaries / some key names with dots inside) +JPP_0551|COMPOSITE_EXPRESSIONS|BADCASE|JSON file containing a list; list index is defined by a parameter and wrapped in single quotes +JPP_0552|COMPOSITE_EXPRESSIONS|BADCASE|JSON file containing a list; list index is defined by a parameter and placed inside the curly brackets (invalid syntax) +JPP_0553|COMPOSITE_EXPRESSIONS|BADCASE|JSON file containing a list; list index is defined by a parameter, wrapped in single quotes and placed inside the curly brackets (invalid syntax) JPP_0600|CODE_COMMENTS|GOODCASE|JSON file with several combinations of code comments JPP_0950|COMMON_SYNTAX_VIOLATIONS|BADCASE|JSON file with syntax error (1) JPP_0951|COMMON_SYNTAX_VIOLATIONS|BADCASE|JSON file with syntax error (2) @@ -86,6 +91,7 @@ JPP_1054|IMPLICIT_CREATION|BADCASE|JSON file with implicit creation of data stru JPP_1055|IMPLICIT_CREATION|BADCASE|JSON file with implicit creation of data structures based on parameters (5) JPP_1056|IMPLICIT_CREATION|BADCASE|JSON file with implicit creation of data structures based on parameters (6) JPP_1057|IMPLICIT_CREATION|BADCASE|JSON file with implicit creation of data structures based on parameters (7) +JPP_1058|IMPLICIT_CREATION|BADCASE|JSON file containing .... (invalid syntax) JPP_1150|CYCLIC_IMPORTS|BADCASE|JSON file with cyclic imports (JSON file imports itself) JPP_1151|CYCLIC_IMPORTS|BADCASE|JSON file with cyclic imports (JSON file imports another file, that is already imported) JPP_1200|PATH_FORMATS|GOODCASE|Relative path to JSON file diff --git a/test/JPP_TestUsecases.html b/test/JPP_TestUsecases.html index 2136df85..a8d3d2c5 100644 --- a/test/JPP_TestUsecases.html +++ b/test/JPP_TestUsecases.html @@ -1123,6 +1123,40 @@ 34
+ + + +JPP_0268 + + + + +PARAMETER_SUBSTITUTION + + + + +BADCASE + + + + +JSON file containing a list; list index is defined by a parameter and wrapped in single quotes
+Expected: No values are returned, and JsonPreprocessor throws an exception + +
+List indices must be of type 'int' +
+ + + + + + + +35 + + @@ -1154,7 +1188,7 @@ -35 +36 @@ -1188,7 +1222,7 @@ -36 +37 @@ -1222,7 +1256,7 @@ -37 +38 @@ -1256,7 +1290,7 @@ -38 +39 @@ -1290,7 +1324,7 @@ -39 +40 @@ -1324,7 +1358,7 @@ -40 +41 @@ -1358,7 +1392,7 @@ -41 +42 @@ -1392,7 +1426,7 @@ -42 +43 @@ -1426,7 +1460,7 @@ -43 +44 @@ -1460,7 +1494,7 @@ -44 +45 @@ -1494,7 +1528,7 @@ -45 +46 @@ -1528,7 +1562,7 @@ -46 +47 @@ -1562,7 +1596,7 @@ -47 +48 @@ -1596,7 +1630,7 @@ -48 +49 @@ -1630,7 +1664,7 @@ -49 +50 @@ -1664,7 +1698,7 @@ -50 +51 @@ -1698,7 +1732,7 @@ -51 +52 @@ -1732,7 +1766,7 @@ -52 +53 @@ -1766,7 +1800,7 @@ -53 +54 @@ -1800,7 +1834,7 @@ -54 +55 @@ -1834,7 +1868,7 @@ -55 +56 @@ -1868,7 +1902,7 @@ -56 +57 @@ -1902,7 +1936,7 @@ -57 +58 @@ -1936,7 +1970,7 @@ -58 +59 @@ -1970,7 +2004,7 @@ -59 +60 @@ -2004,7 +2038,7 @@ -60 +61 @@ -2038,7 +2072,7 @@ -61 +62 @@ -2072,7 +2106,7 @@ -62 +63 @@ -2106,7 +2140,7 @@ -63 +64 @@ -2139,7 +2173,7 @@ -64 +65 @@ -2172,7 +2206,7 @@ -65 +66 @@ -2205,7 +2239,7 @@ -66 +67 @@ -2238,7 +2272,7 @@ -67 +68 @@ -2271,7 +2305,7 @@ -68 +69 @@ -2304,7 +2338,7 @@ -69 +70 @@ -2337,7 +2371,40 @@ -70 +71 + + + + + +JPP_0511 + + + + +COMPOSITE_EXPRESSIONS + + + + +GOODCASE + + + + +JSON file containing a list; list index is defined by a parameter
+Expected: JsonPreprocessor returns expected value + + +
+ + + + + + + +72 @@ -2371,7 +2438,107 @@ -71 +73 + + + + + +JPP_0551 + + + + +COMPOSITE_EXPRESSIONS + + + + +BADCASE + + + + +JSON file containing a list; list index is defined by a parameter and wrapped in single quotes
+Expected: No values are returned, and JsonPreprocessor throws an exception + +
+List indices must be of type 'int' +
+ + + + + + + +74 + + + + + +JPP_0552 + + + + +COMPOSITE_EXPRESSIONS + + + + +BADCASE + + + + +JSON file containing a list; list index is defined by a parameter and placed inside the curly brackets (invalid syntax)
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +75 + + + + + +JPP_0553 + + + + +COMPOSITE_EXPRESSIONS + + + + +BADCASE + + + + +JSON file containing a list; list index is defined by a parameter, wrapped in single quotes and placed inside the curly brackets (invalid syntax)
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +76 @@ -2404,7 +2571,7 @@ -72 +77 @@ -2437,7 +2604,7 @@ -73 +78 @@ -2470,7 +2637,7 @@ -74 +79 @@ -2503,7 +2670,7 @@ -75 +80 @@ -2536,7 +2703,7 @@ -76 +81 @@ -2569,7 +2736,7 @@ -77 +82 @@ -2602,7 +2769,7 @@ -78 +83 @@ -2635,7 +2802,7 @@ -79 +84 @@ -2668,7 +2835,7 @@ -80 +85 @@ -2701,7 +2868,7 @@ -81 +86 @@ -2734,7 +2901,7 @@ -82 +87 @@ -2767,7 +2934,7 @@ -83 +88 @@ -2800,7 +2967,7 @@ -84 +89 @@ -2833,7 +3000,7 @@ -85 +90 @@ -2866,7 +3033,7 @@ -86 +91 @@ -2899,7 +3066,40 @@ -87 +92 + + + + + +JPP_1058 + + + + +IMPLICIT_CREATION + + + + +BADCASE + + + + +JSON file containing .... (invalid syntax)
+Expected: No values are returned, and JsonPreprocessor throws an exception + + +
+ + + + + + + +93 @@ -2932,7 +3132,7 @@ -88 +94 @@ -2965,7 +3165,7 @@ -89 +95 @@ -2999,7 +3199,7 @@
 

-
Generated: 09.01.2024 - 11:50:58
+
Generated: 09.01.2024 - 17:01:37
 
diff --git a/test/JPP_TestUsecases.rst b/test/JPP_TestUsecases.rst index b37a5f13..ceab336a 100644 --- a/test/JPP_TestUsecases.rst +++ b/test/JPP_TestUsecases.rst @@ -345,6 +345,18 @@ Test Use Cases ---- +* **Test JPP_0268** + + [PARAMETER_SUBSTITUTION / BADCASE] + + **JSON file containing a list; list index is defined by a parameter and wrapped in single quotes** + + Expected: No values are returned, and JsonPreprocessor throws an exception + + *Hint: List indices must be of type 'int'* + +---- + * **Test JPP_0300** [VALUE_DETECTION / GOODCASE] @@ -763,6 +775,16 @@ Test Use Cases ---- +* **Test JPP_0511** + + [COMPOSITE_EXPRESSIONS / GOODCASE] + + **JSON file containing a list; list index is defined by a parameter** + + Expected: JsonPreprocessor returns expected value + +---- + * **Test JPP_0550** [COMPOSITE_EXPRESSIONS / BADCASE] @@ -775,6 +797,38 @@ Test Use Cases ---- +* **Test JPP_0551** + + [COMPOSITE_EXPRESSIONS / BADCASE] + + **JSON file containing a list; list index is defined by a parameter and wrapped in single quotes** + + Expected: No values are returned, and JsonPreprocessor throws an exception + + *Hint: List indices must be of type 'int'* + +---- + +* **Test JPP_0552** + + [COMPOSITE_EXPRESSIONS / BADCASE] + + **JSON file containing a list; list index is defined by a parameter and placed inside the curly brackets (invalid syntax)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + +---- + +* **Test JPP_0553** + + [COMPOSITE_EXPRESSIONS / BADCASE] + + **JSON file containing a list; list index is defined by a parameter, wrapped in single quotes and placed inside the curly brackets (invalid syntax)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + +---- + * **Test JPP_0600** [CODE_COMMENTS / GOODCASE] @@ -935,6 +989,16 @@ Test Use Cases ---- +* **Test JPP_1058** + + [IMPLICIT_CREATION / BADCASE] + + **JSON file containing .... (invalid syntax)** + + Expected: No values are returned, and JsonPreprocessor throws an exception + +---- + * **Test JPP_1150** [CYCLIC_IMPORTS / BADCASE] @@ -967,5 +1031,5 @@ Test Use Cases ---- -Generated: 09.01.2024 - 11:50:58 +Generated: 09.01.2024 - 17:01:37 diff --git a/test/JPP_TestUsecases.txt b/test/JPP_TestUsecases.txt index c06d4d07..986630ea 100644 --- a/test/JPP_TestUsecases.txt +++ b/test/JPP_TestUsecases.txt @@ -147,6 +147,11 @@ 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_0268 / PARAMETER_SUBSTITUTION / BADCASE +Description: JSON file containing a list; list index is defined by a parameter and wrapped in single quotes +Expectation: No values are returned, and JsonPreprocessor throws an exception +Hint.......: List indices must be of type 'int' +------------------------------------------------------------------------------------------------------------------------ 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 @@ -320,11 +325,28 @@ Test JPP_0510 / COMPOSITE_EXPRESSIONS / GOODCASE Description: JSON file containing several parameter assignments in separate lines (extended string concatenation) Expectation: JsonPreprocessor returns expected value ------------------------------------------------------------------------------------------------------------------------ +Test JPP_0511 / COMPOSITE_EXPRESSIONS / GOODCASE +Description: JSON file containing a list; list index is defined by a parameter +Expectation: JsonPreprocessor returns expected value +------------------------------------------------------------------------------------------------------------------------ Test JPP_0550 / COMPOSITE_EXPRESSIONS / BADCASE Description: JSON file with composite data structure (nested lists and dictionaries / some key names with dots inside) Expectation: No values are returned, and JsonPreprocessor throws an exception Hint.......: Dotdict notation (ambiguous in this case) ------------------------------------------------------------------------------------------------------------------------ +Test JPP_0551 / COMPOSITE_EXPRESSIONS / BADCASE +Description: JSON file containing a list; list index is defined by a parameter and wrapped in single quotes +Expectation: No values are returned, and JsonPreprocessor throws an exception +Hint.......: List indices must be of type 'int' +------------------------------------------------------------------------------------------------------------------------ +Test JPP_0552 / COMPOSITE_EXPRESSIONS / BADCASE +Description: JSON file containing a list; list index is defined by a parameter and placed inside the curly brackets (invalid syntax) +Expectation: No values are returned, and JsonPreprocessor throws an exception +------------------------------------------------------------------------------------------------------------------------ +Test JPP_0553 / COMPOSITE_EXPRESSIONS / BADCASE +Description: JSON file containing a list; list index is defined by a parameter, wrapped in single quotes and placed inside the curly brackets (invalid syntax) +Expectation: No values are returned, and JsonPreprocessor throws an exception +------------------------------------------------------------------------------------------------------------------------ Test JPP_0600 / CODE_COMMENTS / GOODCASE Description: JSON file with several combinations of code comments Expectation: JsonPreprocessor returns remaining content of JSON file (valid parameters) @@ -389,6 +411,10 @@ Test JPP_1057 / IMPLICIT_CREATION / BADCASE Description: JSON file with implicit creation of data structures based on parameters (7) Expectation: No values are returned, and JsonPreprocessor throws an exception ------------------------------------------------------------------------------------------------------------------------ +Test JPP_1058 / IMPLICIT_CREATION / BADCASE +Description: JSON file containing .... (invalid syntax) +Expectation: No values are returned, and JsonPreprocessor throws an exception +------------------------------------------------------------------------------------------------------------------------ Test JPP_1150 / CYCLIC_IMPORTS / BADCASE Description: JSON file with cyclic imports (JSON file imports itself) Expectation: No values are returned, and JsonPreprocessor throws an exception @@ -402,5 +428,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: 09.01.2024 - 11:50:58 +Generated: 09.01.2024 - 17:01:37 diff --git a/test/component_test.py b/test/component_test.py index 2af5d8b8..80b6e3db 100644 --- a/test/component_test.py +++ b/test/component_test.py @@ -22,7 +22,7 @@ # # -------------------------------------------------------------------------------------------------------------- # -VERSION = "0.21.0" +VERSION = "0.22.0" VERSION_DATE = "09.01.2024" # # -------------------------------------------------------------------------------------------------------------- diff --git a/test/pytest/pytestfiles/test_04_PARAMETER_SUBSTITUTION_BADCASE.py b/test/pytest/pytestfiles/test_04_PARAMETER_SUBSTITUTION_BADCASE.py index 279acb4b..e65c42db 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 # -# 20.11.2023 - 15:42:16 +# 09.01.2024 - 17:01:37 # # -------------------------------------------------------------------------------------------------------------- @@ -157,4 +157,12 @@ def test_JPP_0266(self, Description): def test_JPP_0267(self, Description): nReturn = CExecute.Execute("JPP_0267") assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file containing a list; list index is defined by a parameter and wrapped in single quotes",] + ) + def test_JPP_0268(self, Description): + nReturn = CExecute.Execute("JPP_0268") + assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- diff --git a/test/pytest/pytestfiles/test_07_COMPOSITE_EXPRESSIONS_GOODCASE.py b/test/pytest/pytestfiles/test_07_COMPOSITE_EXPRESSIONS_GOODCASE.py index ebbf359d..f125caec 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 # -# 20.11.2023 - 15:42:16 +# 09.01.2024 - 17:01:37 # # -------------------------------------------------------------------------------------------------------------- @@ -109,4 +109,12 @@ def test_JPP_0509(self, Description): def test_JPP_0510(self, Description): nReturn = CExecute.Execute("JPP_0510") assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: JsonPreprocessor returns expected value + @pytest.mark.parametrize( + "Description", ["JSON file containing a list; list index is defined by a parameter",] + ) + def test_JPP_0511(self, Description): + nReturn = CExecute.Execute("JPP_0511") + assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- diff --git a/test/pytest/pytestfiles/test_08_COMPOSITE_EXPRESSIONS_BADCASE.py b/test/pytest/pytestfiles/test_08_COMPOSITE_EXPRESSIONS_BADCASE.py index 91d5a125..b2fb54e1 100644 --- a/test/pytest/pytestfiles/test_08_COMPOSITE_EXPRESSIONS_BADCASE.py +++ b/test/pytest/pytestfiles/test_08_COMPOSITE_EXPRESSIONS_BADCASE.py @@ -18,7 +18,7 @@ # # XC-CT/ECA3-Queckenstedt # -# 10.10.2023 - 13:31:11 +# 09.01.2024 - 17:01:37 # # -------------------------------------------------------------------------------------------------------------- @@ -37,4 +37,28 @@ class Test_COMPOSITE_EXPRESSIONS_BADCASE: def test_JPP_0550(self, Description): nReturn = CExecute.Execute("JPP_0550") assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file containing a list; list index is defined by a parameter and wrapped in single quotes",] + ) + def test_JPP_0551(self, Description): + nReturn = CExecute.Execute("JPP_0551") + assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file containing a list; list index is defined by a parameter and placed inside the curly brackets (invalid syntax)",] + ) + def test_JPP_0552(self, Description): + nReturn = CExecute.Execute("JPP_0552") + assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file containing a list; list index is defined by a parameter, wrapped in single quotes and placed inside the curly brackets (invalid syntax)",] + ) + def test_JPP_0553(self, Description): + nReturn = CExecute.Execute("JPP_0553") + assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- diff --git a/test/pytest/pytestfiles/test_12_IMPLICIT_CREATION_BADCASE.py b/test/pytest/pytestfiles/test_12_IMPLICIT_CREATION_BADCASE.py index 68f98ff4..027c4a2c 100644 --- a/test/pytest/pytestfiles/test_12_IMPLICIT_CREATION_BADCASE.py +++ b/test/pytest/pytestfiles/test_12_IMPLICIT_CREATION_BADCASE.py @@ -18,7 +18,7 @@ # # XC-CT/ECA3-Queckenstedt # -# 09.01.2024 - 11:50:58 +# 09.01.2024 - 17:01:37 # # -------------------------------------------------------------------------------------------------------------- @@ -93,4 +93,12 @@ def test_JPP_1056(self, Description): def test_JPP_1057(self, Description): nReturn = CExecute.Execute("JPP_1057") assert nReturn == 0 +# -------------------------------------------------------------------------------------------------------------- + # Expected: No values are returned, and JsonPreprocessor throws an exception + @pytest.mark.parametrize( + "Description", ["JSON file containing .... (invalid syntax)",] + ) + def test_JPP_1058(self, Description): + nReturn = CExecute.Execute("JPP_1058") + assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- diff --git a/test/testconfig/TestConfig.py b/test/testconfig/TestConfig.py index bad4926f..85908dda 100644 --- a/test/testconfig/TestConfig.py +++ b/test/testconfig/TestConfig.py @@ -1281,6 +1281,20 @@ listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- +dictUsecase = {} +dictUsecase['TESTID'] = "JPP_0268" +dictUsecase['DESCRIPTION'] = "JSON file containing a list; list index is defined by a parameter and wrapped in single quotes" +dictUsecase['EXPECTATION'] = "No values are returned, and JsonPreprocessor throws an exception" +dictUsecase['SECTION'] = "PARAMETER_SUBSTITUTION" +dictUsecase['SUBSECTION'] = "BADCASE" +dictUsecase['HINT'] = "List indices must be of type 'int'" +dictUsecase['COMMENT'] = None +dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0268.jsonp" +dictUsecase['EXPECTEDEXCEPTION'] = "List indices must be of type 'int' (error message placeholder)" +dictUsecase['EXPECTEDRETURN'] = None +listofdictUsecases.append(dictUsecase) +del dictUsecase +# -------------------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} dictUsecase['TESTID'] = "JPP_0300" @@ -1989,6 +2003,23 @@ listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- +dictUsecase = {} +dictUsecase['TESTID'] = "JPP_0511" +dictUsecase['DESCRIPTION'] = "JSON file containing a list; list index is defined by a parameter" +dictUsecase['EXPECTATION'] = "JsonPreprocessor returns expected value" +dictUsecase['SECTION'] = "COMPOSITE_EXPRESSIONS" +dictUsecase['SUBSECTION'] = "GOODCASE" +dictUsecase['HINT'] = None +dictUsecase['COMMENT'] = None +dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0511.jsonp" +dictUsecase['EXPECTEDEXCEPTION'] = None +dictUsecase['EXPECTEDRETURN'] = """ +[DICT] (2/1) > {intval} [INT] : 1 +[DICT] (2/2) > {listval} [LIST] (2/1) > [STR] : 'B' +[DICT] (2/2) > {listval} [LIST] (2/2) > [INT] : 4""" +listofdictUsecases.append(dictUsecase) +del dictUsecase +# -------------------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} dictUsecase['TESTID'] = "JPP_0550" @@ -2004,6 +2035,48 @@ listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- +dictUsecase = {} +dictUsecase['TESTID'] = "JPP_0551" +dictUsecase['DESCRIPTION'] = "JSON file containing a list; list index is defined by a parameter and wrapped in single quotes" +dictUsecase['EXPECTATION'] = "No values are returned, and JsonPreprocessor throws an exception" +dictUsecase['SECTION'] = "COMPOSITE_EXPRESSIONS" +dictUsecase['SUBSECTION'] = "BADCASE" +dictUsecase['HINT'] = "List indices must be of type 'int'" +dictUsecase['COMMENT'] = None +dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0551.jsonp" +dictUsecase['EXPECTEDEXCEPTION'] = "List indices must be of type 'int' (error message placeholder)" +dictUsecase['EXPECTEDRETURN'] = None +listofdictUsecases.append(dictUsecase) +del dictUsecase +# -------------------------------------------------------------------------------------------------------------- +dictUsecase = {} +dictUsecase['TESTID'] = "JPP_0552" +dictUsecase['DESCRIPTION'] = "JSON file containing a list; list index is defined by a parameter and placed inside the curly brackets (invalid syntax)" +dictUsecase['EXPECTATION'] = "No values are returned, and JsonPreprocessor throws an exception" +dictUsecase['SECTION'] = "COMPOSITE_EXPRESSIONS" +dictUsecase['SUBSECTION'] = "BADCASE" +dictUsecase['HINT'] = None +dictUsecase['COMMENT'] = None +dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0552.jsonp" +dictUsecase['EXPECTEDEXCEPTION'] = "Invalid syntax: Found index" +dictUsecase['EXPECTEDRETURN'] = None +listofdictUsecases.append(dictUsecase) +del dictUsecase +# -------------------------------------------------------------------------------------------------------------- +dictUsecase = {} +dictUsecase['TESTID'] = "JPP_0553" +dictUsecase['DESCRIPTION'] = "JSON file containing a list; list index is defined by a parameter, wrapped in single quotes and placed inside the curly brackets (invalid syntax)" +dictUsecase['EXPECTATION'] = "No values are returned, and JsonPreprocessor throws an exception" +dictUsecase['SECTION'] = "COMPOSITE_EXPRESSIONS" +dictUsecase['SUBSECTION'] = "BADCASE" +dictUsecase['HINT'] = None +dictUsecase['COMMENT'] = None +dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0553.jsonp" +dictUsecase['EXPECTEDEXCEPTION'] = "Invalid syntax: Found index" +dictUsecase['EXPECTEDRETURN'] = None +listofdictUsecases.append(dictUsecase) +del dictUsecase +# -------------------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} dictUsecase['TESTID'] = "JPP_0600" @@ -2277,6 +2350,20 @@ listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- +dictUsecase = {} +dictUsecase['TESTID'] = "JPP_1058" +dictUsecase['DESCRIPTION'] = "JSON file containing .... (invalid syntax)" +dictUsecase['EXPECTATION'] = "No values are returned, and JsonPreprocessor throws an exception" +dictUsecase['SECTION'] = "IMPLICIT_CREATION" +dictUsecase['SUBSECTION'] = "BADCASE" +dictUsecase['HINT'] = None +dictUsecase['COMMENT'] = None +dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_1058.jsonp" +dictUsecase['EXPECTEDEXCEPTION'] = "The implicit creation of data structures based on nested parameter is not supported" # currently: ''NoneType' object has no attribute 'group''! +dictUsecase['EXPECTEDRETURN'] = None +listofdictUsecases.append(dictUsecase) +del dictUsecase +# -------------------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} dictUsecase['TESTID'] = "JPP_1150" diff --git a/test/testfiles/jpp-test_config_0268.jsonp b/test/testfiles/jpp-test_config_0268.jsonp new file mode 100644 index 00000000..93b678fc --- /dev/null +++ b/test/testfiles/jpp-test_config_0268.jsonp @@ -0,0 +1,19 @@ +// Copyright 2020-2023 Robert Bosch GmbH +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//************************************************************************** +{ + "intval" : 1, + "listval" : ["B", 2], + "param_${listval}['${intval}']}" : 3 +} \ No newline at end of file diff --git a/test/testfiles/jpp-test_config_0511.jsonp b/test/testfiles/jpp-test_config_0511.jsonp new file mode 100644 index 00000000..c34931ab --- /dev/null +++ b/test/testfiles/jpp-test_config_0511.jsonp @@ -0,0 +1,20 @@ +// Copyright 2020-2023 Robert Bosch GmbH +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//************************************************************************** +{ + "intval" : 1, + "listval" : ["B", 2], + ${listval}[${intval}] : 4 +} + diff --git a/test/testfiles/jpp-test_config_0551.jsonp b/test/testfiles/jpp-test_config_0551.jsonp new file mode 100644 index 00000000..96e59e59 --- /dev/null +++ b/test/testfiles/jpp-test_config_0551.jsonp @@ -0,0 +1,19 @@ +// Copyright 2020-2023 Robert Bosch GmbH +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//************************************************************************** +{ + "intval" : 1, + "listval" : ["B", 2], + ${listval}['${intval}'] : 4 +} diff --git a/test/testfiles/jpp-test_config_0552.jsonp b/test/testfiles/jpp-test_config_0552.jsonp new file mode 100644 index 00000000..ddbf0be6 --- /dev/null +++ b/test/testfiles/jpp-test_config_0552.jsonp @@ -0,0 +1,19 @@ +// Copyright 2020-2023 Robert Bosch GmbH +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//************************************************************************** +{ + "intval" : 1, + "listval" : ["B", 2], + ${listval[${intval}]} : 4 +} diff --git a/test/testfiles/jpp-test_config_0553.jsonp b/test/testfiles/jpp-test_config_0553.jsonp new file mode 100644 index 00000000..bf53e4b2 --- /dev/null +++ b/test/testfiles/jpp-test_config_0553.jsonp @@ -0,0 +1,19 @@ +// Copyright 2020-2023 Robert Bosch GmbH +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//************************************************************************** +{ + "intval" : 1, + "listval" : ["B", 2], + ${listval['${intval}']} : 4 +} diff --git a/test/testfiles/jpp-test_config_1058.jsonp b/test/testfiles/jpp-test_config_1058.jsonp new file mode 100644 index 00000000..49e1a75e --- /dev/null +++ b/test/testfiles/jpp-test_config_1058.jsonp @@ -0,0 +1,19 @@ +// Copyright 2020-2023 Robert Bosch GmbH +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//************************************************************************** +{ + "testdict" : {"A" : 1}, + "name" : "C", + ${testdict.${name}}['${name}'] : 5 +} From 34a35aa697fc2c8c05ce9584f2aa3cdfdf76b6d1 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Wed, 10 Jan 2024 11:01:01 +0700 Subject: [PATCH 10/18] Fix bugs based on the comment in ticket 153 --- JsonPreprocessor/CJsonPreprocessor.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index d27654ed..66c6674a 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -377,6 +377,8 @@ def __referVarHandle(referVar : str, sInputStr : str) -> str: referVars = re.findall("(" + pattern + ")", sInputStr) while sInputStr.count("$$") > len(referVars): for var in referVars: + if var not in sInputStr: + continue if "." in var: ddVar = re.sub('\$\${\s*(.*?)\s*}', '\\1', var) lddVar = ddVar.split(".") @@ -400,6 +402,9 @@ def __referVarHandle(referVar : str, sInputStr : str) -> str: tmpValue = ldict['value'] except: raise Exception(f"The variable '{var.replace('$$', '$')}' is not available!") + if bKey and (isinstance(tmpValue, list) or isinstance(tmpValue, dict)): + raise Exception(f"Substitute the element '{sInputStr.replace('$$', '$')}' failed! \ +Due to the datatype of '{sVar.replace('$$', '$')}' is '{type(tmpValue)}'.") subPattern = "(" + tmpVar + "(\[\s*'[^\$\[\]\(\)]+'\s*\]|\[\s*\d+\s*\])*)" var = re.sub("\$", "\\$", re.search(subPattern, sInputStr).group(1)) if re.search("\[.+\]", var): @@ -645,7 +650,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*\]+|\[+\s*\${.+\s*\]+)*" for k, v in tmpJson.items(): keyNested = '' bStrConvert = False @@ -680,7 +685,7 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): re.search("\." + pattern + "[\.}]+", keyNested)) and \ not self.__checkAndCreateNewElement(k, v, bCheck=True): self.__reset() - raise Exception(f"\nThe implicit creation of data structures based on nested parameter does not enable yet.\n\ + raise Exception(f"The implicit creation of data structures based on nested parameter is not supported. \ New parameter '{k}' could not be created by the expression '{keyNested}'") elif k.count('{') != k.count('}'): self.__reset() From 4d722a8b956f3d3acc5cfef089fc5b773248b22e Mon Sep 17 00:00:00 2001 From: mas2hc Date: Wed, 10 Jan 2024 13:36:39 +0700 Subject: [PATCH 11/18] Fix Bug - 179, memory interferences are back. --- JsonPreprocessor/CJsonPreprocessor.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 66c6674a..33deee4b 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -244,6 +244,7 @@ def __processImportFiles(self, input_data : dict) -> dict: # length of lImportedFiles should equal to recursive_level self.lImportedFiles = self.lImportedFiles[:self.recursive_level] if abs_path_file in self.lImportedFiles: + self.__reset() raise Exception(f"Cyclic imported json file '{abs_path_file}'!") oJsonImport = self.jsonLoad(abs_path_file, masterFile=False) @@ -401,8 +402,10 @@ def __referVarHandle(referVar : str, sInputStr : str) -> str: exec(sExec, globals(), ldict) tmpValue = ldict['value'] except: + self.__reset() raise Exception(f"The variable '{var.replace('$$', '$')}' is not available!") if bKey and (isinstance(tmpValue, list) or isinstance(tmpValue, dict)): + self.__reset() raise Exception(f"Substitute the element '{sInputStr.replace('$$', '$')}' failed! \ Due to the datatype of '{sVar.replace('$$', '$')}' is '{type(tmpValue)}'.") subPattern = "(" + tmpVar + "(\[\s*'[^\$\[\]\(\)]+'\s*\]|\[\s*\d+\s*\])*)" @@ -435,6 +438,7 @@ def __referVarHandle(referVar : str, sInputStr : str) -> str: exec(sExec, globals(), ldict) tmpValue = ldict['value'] except: + self.__reset() raise Exception(f"The variable '{var}' is not available!") sInputStr = re.sub(tmpVar, tmpValue, sInputStr) if isinstance(tmpValue, str) else \ re.sub(tmpVar, str(tmpValue), sInputStr) @@ -451,6 +455,7 @@ def __referVarHandle(referVar : str, sInputStr : str) -> str: exec(sExec, globals(), ldict) tmpValue = ldict['value'] except: + self.__reset() raise Exception(f"The variable '{fullVariable}' is not available!") pattern = re.sub('\[', '\\[', fullVariable) pattern = re.sub('\]', '\\]', pattern) @@ -778,6 +783,7 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: if "${" in sInputStr: if re.search("\[[0-9\s]*[A-Za-z_]+[0-9\s]*\]", sInputStr): + self.__reset() raise Exception(f"Invalid syntax! A sub-element in {sInputStr.strip()} has to enclosed in quotes.") if re.match("^\s*" + nestedPattern + "\s*,*\]*}*\s*$", sInputStr.lower()): sInputStr = re.sub("(" + nestedPattern + ")", "\"\\1\"", sInputStr) @@ -840,6 +846,7 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: sInputStr = __recursiveNestedHandling(sInputStr, tmpList) elif "," in sInputStr: if not re.match("^\s*\".+\"\s*$", sInputStr): + self.__reset() 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*$" @@ -853,6 +860,7 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: tmpItem = item if "${" in item: if not re.match("^\s*\"*" + nestedPattern + "\"*\]*}*\s*$", item): + self.__reset() raise Exception(f"Invalid nested parameter format: {item}") elif re.match("^\s*\".*" + nestedPattern + ".*\"\s*$", item): item = re.sub("(" + nestedPattern + ")", "str(\\1)", item) @@ -868,10 +876,12 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: sInputStr = newInputStr elif re.search("\${\s*}", sInputStr) or re.search("\${.+}\.", sInputStr) \ or (nestedKey and (sInputStr.count("{") != sInputStr.count("}") or sInputStr.count("[") != sInputStr.count("]"))): + self.__reset() raise Exception(f"Invalid parameter format: {sInputStr}") elif nestedKey and re.match("^\s*\${[^\(\)\!@#%\^\&\-\+\/\\\=`~\?]+[}\[\]]+\s*$", sInputStr): sInputStr = re.sub("^\s*(\${[^\(\)\!@#%\^\&\-\+\/\\\=`~\?]+[}\[\]]+)\s*$", "\"\\1\"", sInputStr) else: + self.__reset() raise Exception(f"Invalid nested parameter format: {sInputStr} - The double quotes are missing!!!") sOutput = sInputStr @@ -996,6 +1006,7 @@ def __removeDuplicatedKey(dInput : dict) -> dict: jFile = CString.NormalizePath(jFile, sReferencePathAbs=os.path.dirname(os.path.abspath(sys.argv[0]))) if not(os.path.isfile(jFile)): + self.__reset() raise Exception(f"File '{jFile}' is not existing!") self.lImportedFiles.append(jFile) @@ -1015,12 +1026,14 @@ def __removeDuplicatedKey(dInput : dict) -> dict: try: listDummy = shlex.split(line) except Exception as error: + self.__reset() 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(): + self.__reset() raise Exception(f"Invalid parameter format in line: {line.strip()}") tmpList = re.findall("(\"[^\"]+\")", line) line = re.sub("(\"[^\"]+\")", CNameMangling.COLONS.value, line) @@ -1084,6 +1097,7 @@ def __removeDuplicatedKey(dInput : dict) -> dict: sJsonDataUpdated = sJsonDataUpdated + newLine + "\n" else: if "${" in line: + self.__reset() 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()}'. \ @@ -1097,6 +1111,7 @@ def __removeDuplicatedKey(dInput : dict) -> dict: if self.syntax == CSyntaxType.python: CJSONDecoder = CPythonJSONDecoder else: + self.__reset() raise Exception(f"Provided syntax '{self.syntax}' is not supported.") try: @@ -1104,8 +1119,7 @@ def __removeDuplicatedKey(dInput : dict) -> dict: cls=CJSONDecoder, object_pairs_hook=self.__processImportFiles) except Exception as error: - if masterFile: - self.__reset() + self.__reset() raise Exception(f"JSON file: {jFile}\n{error}") self.__checkDotInParamName(oJson) From 66eef84caa5789c64a0e19c35da15a12fde00e4e Mon Sep 17 00:00:00 2001 From: mas2hc Date: Wed, 10 Jan 2024 13:55:14 +0700 Subject: [PATCH 12/18] Tiny wording adaption for error message log. --- JsonPreprocessor/CJsonPreprocessor.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 33deee4b..0535f6fa 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -406,8 +406,8 @@ def __referVarHandle(referVar : str, sInputStr : str) -> str: raise Exception(f"The variable '{var.replace('$$', '$')}' is not available!") if bKey and (isinstance(tmpValue, list) or isinstance(tmpValue, dict)): self.__reset() - raise Exception(f"Substitute the element '{sInputStr.replace('$$', '$')}' failed! \ -Due to the datatype of '{sVar.replace('$$', '$')}' is '{type(tmpValue)}'.") + raise Exception(f"Overwrite the element '{sInputStr.replace('$$', '$')}' failed! \ +Due to the datatype of '{sVar.replace('$$', '$')}' is '{type(tmpValue)}'. Only simple data types are allowed to be substituted inside.") subPattern = "(" + tmpVar + "(\[\s*'[^\$\[\]\(\)]+'\s*\]|\[\s*\d+\s*\])*)" var = re.sub("\$", "\\$", re.search(subPattern, sInputStr).group(1)) if re.search("\[.+\]", var): @@ -641,8 +641,9 @@ 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}'! Composite data types are not allowed. \ -The value of parameter '{valueProcessed}' is {ldict['value']}" + errorMsg = f"Found expression '{key}' with at least one parameter of composite data type \ +('{valueProcessed}' is of type {type(ldict['value'])}). Because of this expression is the name of a parameter, \ +only simple data types are allowed to be substituted inside." raise Exception(errorMsg) if "${" not in str(sInputStr): break From 7df687b29968495fe2c4c5a4b3e72f9ce6291755 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Wed, 10 Jan 2024 14:01:13 +0700 Subject: [PATCH 13/18] Update selftest expected exception due error message update, ticket 175 --- test/testconfig/TestConfig.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/testconfig/TestConfig.py b/test/testconfig/TestConfig.py index 0f8d3e72..e6621ef4 100644 --- a/test/testconfig/TestConfig.py +++ b/test/testconfig/TestConfig.py @@ -1192,7 +1192,7 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0261.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "Composite data types are not allowed" +dictUsecase['EXPECTEDEXCEPTION'] = "only simple data types are allowed to be substituted inside." dictUsecase['EXPECTEDRETURN'] = None listofdictUsecases.append(dictUsecase) del dictUsecase @@ -1220,7 +1220,7 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0263.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "Composite data types are not allowed" +dictUsecase['EXPECTEDEXCEPTION'] = "only simple data types are allowed to be substituted inside." dictUsecase['EXPECTEDRETURN'] = None listofdictUsecases.append(dictUsecase) del dictUsecase @@ -1234,7 +1234,7 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0264.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "Composite data types are not allowed" +dictUsecase['EXPECTEDEXCEPTION'] = "only simple data types are allowed to be substituted inside." dictUsecase['EXPECTEDRETURN'] = None listofdictUsecases.append(dictUsecase) del dictUsecase @@ -1248,7 +1248,7 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0265.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "Composite data types are not allowed" +dictUsecase['EXPECTEDEXCEPTION'] = "only simple data types are allowed to be substituted inside." dictUsecase['EXPECTEDRETURN'] = None listofdictUsecases.append(dictUsecase) del dictUsecase @@ -1262,7 +1262,7 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0266.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "Composite data types are not allowed" +dictUsecase['EXPECTEDEXCEPTION'] = "only simple data types are allowed to be substituted inside." dictUsecase['EXPECTEDRETURN'] = None listofdictUsecases.append(dictUsecase) del dictUsecase @@ -1276,7 +1276,7 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0267.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "Composite data types are not allowed" +dictUsecase['EXPECTEDEXCEPTION'] = "only simple data types are allowed to be substituted inside." dictUsecase['EXPECTEDRETURN'] = None listofdictUsecases.append(dictUsecase) del dictUsecase From c55ea80aa4a0de7b3a180c70c0a206a8607ba0a3 Mon Sep 17 00:00:00 2001 From: qth2hi Date: Wed, 10 Jan 2024 12:36:39 +0100 Subject: [PATCH 14/18] Self test maintenance based on latest fixes in JsonPreprocessor Self test cases added (and commented out; to be invstigated later): JPP_0551, JPP_0552, JPP_0553, JPP_0268 --- test/JPP_TestUsecases.csv | 6 +- test/JPP_TestUsecases.html | 252 ++++-------------- test/JPP_TestUsecases.rst | 48 +--- test/JPP_TestUsecases.txt | 22 +- test/component_test.py | 2 +- .../test_04_PARAMETER_SUBSTITUTION_BADCASE.py | 10 +- .../test_08_COMPOSITE_EXPRESSIONS_BADCASE.py | 26 +- .../test_12_IMPLICIT_CREATION_BADCASE.py | 4 +- test/testconfig/TestConfig.py | 22 +- 9 files changed, 80 insertions(+), 312 deletions(-) diff --git a/test/JPP_TestUsecases.csv b/test/JPP_TestUsecases.csv index 3172ed36..7cf077ad 100644 --- a/test/JPP_TestUsecases.csv +++ b/test/JPP_TestUsecases.csv @@ -33,7 +33,6 @@ JPP_0264|PARAMETER_SUBSTITUTION|BADCASE|JSON file with list parameter substituti 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_0268|PARAMETER_SUBSTITUTION|BADCASE|JSON file containing a list; list index is defined by a parameter and wrapped in single quotes 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) @@ -72,9 +71,6 @@ JPP_0509|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file containing several parameter a JPP_0510|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file containing several parameter assignments in separate lines (extended string concatenation) JPP_0511|COMPOSITE_EXPRESSIONS|GOODCASE|JSON file containing a list; list index is defined by a parameter JPP_0550|COMPOSITE_EXPRESSIONS|BADCASE|JSON file with composite data structure (nested lists and dictionaries / some key names with dots inside) -JPP_0551|COMPOSITE_EXPRESSIONS|BADCASE|JSON file containing a list; list index is defined by a parameter and wrapped in single quotes -JPP_0552|COMPOSITE_EXPRESSIONS|BADCASE|JSON file containing a list; list index is defined by a parameter and placed inside the curly brackets (invalid syntax) -JPP_0553|COMPOSITE_EXPRESSIONS|BADCASE|JSON file containing a list; list index is defined by a parameter, wrapped in single quotes and placed inside the curly brackets (invalid syntax) JPP_0600|CODE_COMMENTS|GOODCASE|JSON file with several combinations of code comments JPP_0950|COMMON_SYNTAX_VIOLATIONS|BADCASE|JSON file with syntax error (1) JPP_0951|COMMON_SYNTAX_VIOLATIONS|BADCASE|JSON file with syntax error (2) @@ -91,7 +87,7 @@ JPP_1054|IMPLICIT_CREATION|BADCASE|JSON file with implicit creation of data stru JPP_1055|IMPLICIT_CREATION|BADCASE|JSON file with implicit creation of data structures based on parameters (5) JPP_1056|IMPLICIT_CREATION|BADCASE|JSON file with implicit creation of data structures based on parameters (6) JPP_1057|IMPLICIT_CREATION|BADCASE|JSON file with implicit creation of data structures based on parameters (7) -JPP_1058|IMPLICIT_CREATION|BADCASE|JSON file containing .... (invalid syntax) +JPP_1058|IMPLICIT_CREATION|BADCASE|JSON file with implicit creation of data structures based on parameters (8) JPP_1150|CYCLIC_IMPORTS|BADCASE|JSON file with cyclic imports (JSON file imports itself) JPP_1151|CYCLIC_IMPORTS|BADCASE|JSON file with cyclic imports (JSON file imports another file, that is already imported) JPP_1200|PATH_FORMATS|GOODCASE|Relative path to JSON file diff --git a/test/JPP_TestUsecases.html b/test/JPP_TestUsecases.html index a8d3d2c5..e844199b 100644 --- a/test/JPP_TestUsecases.html +++ b/test/JPP_TestUsecases.html @@ -1123,40 +1123,6 @@ 34
- - - -JPP_0268 - - - - -PARAMETER_SUBSTITUTION - - - - -BADCASE - - - - -JSON file containing a list; list index is defined by a parameter and wrapped in single quotes
-Expected: No values are returned, and JsonPreprocessor throws an exception - -
-List indices must be of type 'int' -
- - - - - - - -35 - - @@ -1188,7 +1154,7 @@ -36 +35 @@ -1222,7 +1188,7 @@ -37 +36 @@ -1256,7 +1222,7 @@ -38 +37 @@ -1290,7 +1256,7 @@ -39 +38 @@ -1324,7 +1290,7 @@ -40 +39 @@ -1358,7 +1324,7 @@ -41 +40 @@ -1392,7 +1358,7 @@ -42 +41 @@ -1426,7 +1392,7 @@ -43 +42 @@ -1460,7 +1426,7 @@ -44 +43 @@ -1494,7 +1460,7 @@ -45 +44 @@ -1528,7 +1494,7 @@ -46 +45 @@ -1562,7 +1528,7 @@ -47 +46 @@ -1596,7 +1562,7 @@ -48 +47 @@ -1630,7 +1596,7 @@ -49 +48 @@ -1664,7 +1630,7 @@ -50 +49 @@ -1698,7 +1664,7 @@ -51 +50 @@ -1732,7 +1698,7 @@ -52 +51 @@ -1766,7 +1732,7 @@ -53 +52 @@ -1800,7 +1766,7 @@ -54 +53 @@ -1834,7 +1800,7 @@ -55 +54 @@ -1868,7 +1834,7 @@ -56 +55 @@ -1902,7 +1868,7 @@ -57 +56 @@ -1936,7 +1902,7 @@ -58 +57 @@ -1970,7 +1936,7 @@ -59 +58 @@ -2004,7 +1970,7 @@ -60 +59 @@ -2038,7 +2004,7 @@ -61 +60 @@ -2072,7 +2038,7 @@ -62 +61 @@ -2106,7 +2072,7 @@ -63 +62 @@ -2140,7 +2106,7 @@ -64 +63 @@ -2173,7 +2139,7 @@ -65 +64 @@ -2206,7 +2172,7 @@ -66 +65 @@ -2239,7 +2205,7 @@ -67 +66 @@ -2272,7 +2238,7 @@ -68 +67 @@ -2305,7 +2271,7 @@ -69 +68 @@ -2338,7 +2304,7 @@ -70 +69 @@ -2371,7 +2337,7 @@ -71 +70 @@ -2404,7 +2370,7 @@ -72 +71 @@ -2438,107 +2404,7 @@ -73 - - - - - -JPP_0551 - - - - -COMPOSITE_EXPRESSIONS - - - - -BADCASE - - - - -JSON file containing a list; list index is defined by a parameter and wrapped in single quotes
-Expected: No values are returned, and JsonPreprocessor throws an exception - -
-List indices must be of type 'int' -
- - - - - - - -74 - - - - - -JPP_0552 - - - - -COMPOSITE_EXPRESSIONS - - - - -BADCASE - - - - -JSON file containing a list; list index is defined by a parameter and placed inside the curly brackets (invalid syntax)
-Expected: No values are returned, and JsonPreprocessor throws an exception - - -
- - - - - - - -75 - - - - - -JPP_0553 - - - - -COMPOSITE_EXPRESSIONS - - - - -BADCASE - - - - -JSON file containing a list; list index is defined by a parameter, wrapped in single quotes and placed inside the curly brackets (invalid syntax)
-Expected: No values are returned, and JsonPreprocessor throws an exception - - -
- - - - - - - -76 +72 @@ -2571,7 +2437,7 @@ -77 +73 @@ -2604,7 +2470,7 @@ -78 +74 @@ -2637,7 +2503,7 @@ -79 +75 @@ -2670,7 +2536,7 @@ -80 +76 @@ -2703,7 +2569,7 @@ -81 +77 @@ -2736,7 +2602,7 @@ -82 +78 @@ -2769,7 +2635,7 @@ -83 +79 @@ -2802,7 +2668,7 @@ -84 +80 @@ -2835,7 +2701,7 @@ -85 +81 @@ -2868,7 +2734,7 @@ -86 +82 @@ -2901,7 +2767,7 @@ -87 +83 @@ -2934,7 +2800,7 @@ -88 +84 @@ -2967,7 +2833,7 @@ -89 +85 @@ -3000,7 +2866,7 @@ -90 +86 @@ -3033,7 +2899,7 @@ -91 +87 @@ -3066,7 +2932,7 @@ -92 +88 @@ -3087,7 +2953,7 @@ -JSON file containing .... (invalid syntax)
+JSON file with implicit creation of data structures based on parameters (8)
Expected: No values are returned, and JsonPreprocessor throws an exception @@ -3099,7 +2965,7 @@ -93 +89 @@ -3132,7 +2998,7 @@ -94 +90 @@ -3165,7 +3031,7 @@ -95 +91 @@ -3199,7 +3065,7 @@
 

-
Generated: 09.01.2024 - 17:01:37
+
Generated: 10.01.2024 - 12:25:22
 
diff --git a/test/JPP_TestUsecases.rst b/test/JPP_TestUsecases.rst index ceab336a..90d36826 100644 --- a/test/JPP_TestUsecases.rst +++ b/test/JPP_TestUsecases.rst @@ -345,18 +345,6 @@ Test Use Cases ---- -* **Test JPP_0268** - - [PARAMETER_SUBSTITUTION / BADCASE] - - **JSON file containing a list; list index is defined by a parameter and wrapped in single quotes** - - Expected: No values are returned, and JsonPreprocessor throws an exception - - *Hint: List indices must be of type 'int'* - ----- - * **Test JPP_0300** [VALUE_DETECTION / GOODCASE] @@ -797,38 +785,6 @@ Test Use Cases ---- -* **Test JPP_0551** - - [COMPOSITE_EXPRESSIONS / BADCASE] - - **JSON file containing a list; list index is defined by a parameter and wrapped in single quotes** - - Expected: No values are returned, and JsonPreprocessor throws an exception - - *Hint: List indices must be of type 'int'* - ----- - -* **Test JPP_0552** - - [COMPOSITE_EXPRESSIONS / BADCASE] - - **JSON file containing a list; list index is defined by a parameter and placed inside the curly brackets (invalid syntax)** - - Expected: No values are returned, and JsonPreprocessor throws an exception - ----- - -* **Test JPP_0553** - - [COMPOSITE_EXPRESSIONS / BADCASE] - - **JSON file containing a list; list index is defined by a parameter, wrapped in single quotes and placed inside the curly brackets (invalid syntax)** - - Expected: No values are returned, and JsonPreprocessor throws an exception - ----- - * **Test JPP_0600** [CODE_COMMENTS / GOODCASE] @@ -993,7 +949,7 @@ Test Use Cases [IMPLICIT_CREATION / BADCASE] - **JSON file containing .... (invalid syntax)** + **JSON file with implicit creation of data structures based on parameters (8)** Expected: No values are returned, and JsonPreprocessor throws an exception @@ -1031,5 +987,5 @@ Test Use Cases ---- -Generated: 09.01.2024 - 17:01:37 +Generated: 10.01.2024 - 12:25:22 diff --git a/test/JPP_TestUsecases.txt b/test/JPP_TestUsecases.txt index 986630ea..b6015cb1 100644 --- a/test/JPP_TestUsecases.txt +++ b/test/JPP_TestUsecases.txt @@ -147,11 +147,6 @@ 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_0268 / PARAMETER_SUBSTITUTION / BADCASE -Description: JSON file containing a list; list index is defined by a parameter and wrapped in single quotes -Expectation: No values are returned, and JsonPreprocessor throws an exception -Hint.......: List indices must be of type 'int' ------------------------------------------------------------------------------------------------------------------------- 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 @@ -334,19 +329,6 @@ Description: JSON file with composite data structure (nested lists and dictionar Expectation: No values are returned, and JsonPreprocessor throws an exception Hint.......: Dotdict notation (ambiguous in this case) ------------------------------------------------------------------------------------------------------------------------ -Test JPP_0551 / COMPOSITE_EXPRESSIONS / BADCASE -Description: JSON file containing a list; list index is defined by a parameter and wrapped in single quotes -Expectation: No values are returned, and JsonPreprocessor throws an exception -Hint.......: List indices must be of type 'int' ------------------------------------------------------------------------------------------------------------------------- -Test JPP_0552 / COMPOSITE_EXPRESSIONS / BADCASE -Description: JSON file containing a list; list index is defined by a parameter and placed inside the curly brackets (invalid syntax) -Expectation: No values are returned, and JsonPreprocessor throws an exception ------------------------------------------------------------------------------------------------------------------------- -Test JPP_0553 / COMPOSITE_EXPRESSIONS / BADCASE -Description: JSON file containing a list; list index is defined by a parameter, wrapped in single quotes and placed inside the curly brackets (invalid syntax) -Expectation: No values are returned, and JsonPreprocessor throws an exception ------------------------------------------------------------------------------------------------------------------------- Test JPP_0600 / CODE_COMMENTS / GOODCASE Description: JSON file with several combinations of code comments Expectation: JsonPreprocessor returns remaining content of JSON file (valid parameters) @@ -412,7 +394,7 @@ Description: JSON file with implicit creation of data structures based on parame Expectation: No values are returned, and JsonPreprocessor throws an exception ------------------------------------------------------------------------------------------------------------------------ Test JPP_1058 / IMPLICIT_CREATION / BADCASE -Description: JSON file containing .... (invalid syntax) +Description: JSON file with implicit creation of data structures based on parameters (8) Expectation: No values are returned, and JsonPreprocessor throws an exception ------------------------------------------------------------------------------------------------------------------------ Test JPP_1150 / CYCLIC_IMPORTS / BADCASE @@ -428,5 +410,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: 09.01.2024 - 17:01:37 +Generated: 10.01.2024 - 12:25:22 diff --git a/test/component_test.py b/test/component_test.py index 80b6e3db..634c513e 100644 --- a/test/component_test.py +++ b/test/component_test.py @@ -23,7 +23,7 @@ # -------------------------------------------------------------------------------------------------------------- # VERSION = "0.22.0" -VERSION_DATE = "09.01.2024" +VERSION_DATE = "10.01.2024" # # -------------------------------------------------------------------------------------------------------------- #TM*** diff --git a/test/pytest/pytestfiles/test_04_PARAMETER_SUBSTITUTION_BADCASE.py b/test/pytest/pytestfiles/test_04_PARAMETER_SUBSTITUTION_BADCASE.py index e65c42db..7957f35a 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 # -# 09.01.2024 - 17:01:37 +# 10.01.2024 - 12:25:22 # # -------------------------------------------------------------------------------------------------------------- @@ -157,12 +157,4 @@ def test_JPP_0266(self, Description): def test_JPP_0267(self, Description): nReturn = CExecute.Execute("JPP_0267") assert nReturn == 0 -# -------------------------------------------------------------------------------------------------------------- - # Expected: No values are returned, and JsonPreprocessor throws an exception - @pytest.mark.parametrize( - "Description", ["JSON file containing a list; list index is defined by a parameter and wrapped in single quotes",] - ) - def test_JPP_0268(self, Description): - nReturn = CExecute.Execute("JPP_0268") - assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- diff --git a/test/pytest/pytestfiles/test_08_COMPOSITE_EXPRESSIONS_BADCASE.py b/test/pytest/pytestfiles/test_08_COMPOSITE_EXPRESSIONS_BADCASE.py index b2fb54e1..d5da154a 100644 --- a/test/pytest/pytestfiles/test_08_COMPOSITE_EXPRESSIONS_BADCASE.py +++ b/test/pytest/pytestfiles/test_08_COMPOSITE_EXPRESSIONS_BADCASE.py @@ -18,7 +18,7 @@ # # XC-CT/ECA3-Queckenstedt # -# 09.01.2024 - 17:01:37 +# 10.01.2024 - 12:25:22 # # -------------------------------------------------------------------------------------------------------------- @@ -37,28 +37,4 @@ class Test_COMPOSITE_EXPRESSIONS_BADCASE: def test_JPP_0550(self, Description): nReturn = CExecute.Execute("JPP_0550") assert nReturn == 0 -# -------------------------------------------------------------------------------------------------------------- - # Expected: No values are returned, and JsonPreprocessor throws an exception - @pytest.mark.parametrize( - "Description", ["JSON file containing a list; list index is defined by a parameter and wrapped in single quotes",] - ) - def test_JPP_0551(self, Description): - nReturn = CExecute.Execute("JPP_0551") - assert nReturn == 0 -# -------------------------------------------------------------------------------------------------------------- - # Expected: No values are returned, and JsonPreprocessor throws an exception - @pytest.mark.parametrize( - "Description", ["JSON file containing a list; list index is defined by a parameter and placed inside the curly brackets (invalid syntax)",] - ) - def test_JPP_0552(self, Description): - nReturn = CExecute.Execute("JPP_0552") - assert nReturn == 0 -# -------------------------------------------------------------------------------------------------------------- - # Expected: No values are returned, and JsonPreprocessor throws an exception - @pytest.mark.parametrize( - "Description", ["JSON file containing a list; list index is defined by a parameter, wrapped in single quotes and placed inside the curly brackets (invalid syntax)",] - ) - def test_JPP_0553(self, Description): - nReturn = CExecute.Execute("JPP_0553") - assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- diff --git a/test/pytest/pytestfiles/test_12_IMPLICIT_CREATION_BADCASE.py b/test/pytest/pytestfiles/test_12_IMPLICIT_CREATION_BADCASE.py index 027c4a2c..2bf499e9 100644 --- a/test/pytest/pytestfiles/test_12_IMPLICIT_CREATION_BADCASE.py +++ b/test/pytest/pytestfiles/test_12_IMPLICIT_CREATION_BADCASE.py @@ -18,7 +18,7 @@ # # XC-CT/ECA3-Queckenstedt # -# 09.01.2024 - 17:01:37 +# 10.01.2024 - 12:25:22 # # -------------------------------------------------------------------------------------------------------------- @@ -96,7 +96,7 @@ def test_JPP_1057(self, Description): # -------------------------------------------------------------------------------------------------------------- # Expected: No values are returned, and JsonPreprocessor throws an exception @pytest.mark.parametrize( - "Description", ["JSON file containing .... (invalid syntax)",] + "Description", ["JSON file with implicit creation of data structures based on parameters (8)",] ) def test_JPP_1058(self, Description): nReturn = CExecute.Execute("JPP_1058") diff --git a/test/testconfig/TestConfig.py b/test/testconfig/TestConfig.py index eaad5f36..8478a876 100644 --- a/test/testconfig/TestConfig.py +++ b/test/testconfig/TestConfig.py @@ -1292,7 +1292,7 @@ dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0268.jsonp" dictUsecase['EXPECTEDEXCEPTION'] = "List indices must be of type 'int' (error message placeholder)" dictUsecase['EXPECTEDRETURN'] = None -listofdictUsecases.append(dictUsecase) +# # listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------------------- @@ -2046,7 +2046,7 @@ dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0551.jsonp" dictUsecase['EXPECTEDEXCEPTION'] = "List indices must be of type 'int' (error message placeholder)" dictUsecase['EXPECTEDRETURN'] = None -listofdictUsecases.append(dictUsecase) +# # listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} @@ -2060,7 +2060,7 @@ dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0552.jsonp" dictUsecase['EXPECTEDEXCEPTION'] = "Invalid syntax: Found index" dictUsecase['EXPECTEDRETURN'] = None -listofdictUsecases.append(dictUsecase) +# # listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} @@ -2074,7 +2074,7 @@ dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0553.jsonp" dictUsecase['EXPECTEDEXCEPTION'] = "Invalid syntax: Found index" dictUsecase['EXPECTEDRETURN'] = None -listofdictUsecases.append(dictUsecase) +# # listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------------------- @@ -2289,7 +2289,7 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_1053.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = None # test case currently causes a crash of the JsonPreprocessor; 'EXPECTEDEXCEPTION' needs to be defined after bug is fixed +dictUsecase['EXPECTEDEXCEPTION'] = "Only simple data types are allowed to be substituted inside" dictUsecase['EXPECTEDRETURN'] = None listofdictUsecases.append(dictUsecase) del dictUsecase @@ -2303,7 +2303,7 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_1054.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = None # test case currently causes a crash of the JsonPreprocessor; 'EXPECTEDEXCEPTION' needs to be defined after bug is fixed +dictUsecase['EXPECTEDEXCEPTION'] = "Only simple data types are allowed to be substituted inside" dictUsecase['EXPECTEDRETURN'] = None listofdictUsecases.append(dictUsecase) del dictUsecase @@ -2317,7 +2317,7 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_1055.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = None # test case currently causes a crash of the JsonPreprocessor; 'EXPECTEDEXCEPTION' needs to be defined after bug is fixed +dictUsecase['EXPECTEDEXCEPTION'] = "Only simple data types are allowed to be substituted inside" dictUsecase['EXPECTEDRETURN'] = None listofdictUsecases.append(dictUsecase) del dictUsecase @@ -2331,7 +2331,7 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_1056.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "The implicit creation of data structures based on nested parameter is not supported" # currently causes : ''NoneType' object has no attribute 'group''! +dictUsecase['EXPECTEDEXCEPTION'] = "The implicit creation of data structures based on nested parameter is not supported" dictUsecase['EXPECTEDRETURN'] = None listofdictUsecases.append(dictUsecase) del dictUsecase @@ -2345,21 +2345,21 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_1057.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "The implicit creation of data structures based on nested parameter is not supported" # currently values are returned with unresolved dollar operator expressions +dictUsecase['EXPECTEDEXCEPTION'] = "Could not set variable 'testdict[C][C]' with value '4'! Reason: name 'C' is not defined" dictUsecase['EXPECTEDRETURN'] = None listofdictUsecases.append(dictUsecase) del dictUsecase # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} dictUsecase['TESTID'] = "JPP_1058" -dictUsecase['DESCRIPTION'] = "JSON file containing .... (invalid syntax)" +dictUsecase['DESCRIPTION'] = "JSON file with implicit creation of data structures based on parameters (8)" dictUsecase['EXPECTATION'] = "No values are returned, and JsonPreprocessor throws an exception" dictUsecase['SECTION'] = "IMPLICIT_CREATION" dictUsecase['SUBSECTION'] = "BADCASE" dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_1058.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "The implicit creation of data structures based on nested parameter is not supported" # currently: ''NoneType' object has no attribute 'group''! +dictUsecase['EXPECTEDEXCEPTION'] = "The implicit creation of data structures based on nested parameter is not supported" dictUsecase['EXPECTEDRETURN'] = None listofdictUsecases.append(dictUsecase) del dictUsecase From a95c86f271780a3d06cdd5d583e51ad3afa9de18 Mon Sep 17 00:00:00 2001 From: mas2hc Date: Thu, 11 Jan 2024 14:05:46 +0700 Subject: [PATCH 15/18] Update reset method based on usecase in test case JPP_1057 --- JsonPreprocessor/CJsonPreprocessor.py | 68 ++++++++++++++++----------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 0535f6fa..36c2f355 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -202,7 +202,7 @@ def __init__(self, syntax: CSyntaxType = CSyntaxType.python , currentCfg : dict self.lNestedParams = [] self.lDotInParamName = [] - def __reset(self) -> None: + def __reset(self, bCleanGlobalVars : bool = False) -> None: ''' Reset initial variables which are set in constructor method after master Json file is loaded. ''' @@ -212,6 +212,21 @@ def __reset(self) -> None: self.dUpdatedParams = {} self.lNestedParams = [] self.lDotInParamName = [] + if bCleanGlobalVars: + lGlobalVars = [] + for name, value in globals().items(): + if re.match("^__.+$", name): + continue + else: + if isinstance(value, str) or isinstance(value, int) or \ + isinstance(value, float) or isinstance(value, dict) or \ + isinstance(value, list) or isinstance(value, type(None)): + lGlobalVars.append(name) + for var in lGlobalVars: + try: + del globals()[var] + except: + pass def __processImportFiles(self, input_data : dict) -> dict: ''' @@ -244,7 +259,7 @@ def __processImportFiles(self, input_data : dict) -> dict: # length of lImportedFiles should equal to recursive_level self.lImportedFiles = self.lImportedFiles[:self.recursive_level] if abs_path_file in self.lImportedFiles: - self.__reset() + self.__reset(bCleanGlobalVars=True) raise Exception(f"Cyclic imported json file '{abs_path_file}'!") oJsonImport = self.jsonLoad(abs_path_file, masterFile=False) @@ -402,10 +417,10 @@ def __referVarHandle(referVar : str, sInputStr : str) -> str: exec(sExec, globals(), ldict) tmpValue = ldict['value'] except: - self.__reset() + self.__reset(bCleanGlobalVars=True) raise Exception(f"The variable '{var.replace('$$', '$')}' is not available!") if bKey and (isinstance(tmpValue, list) or isinstance(tmpValue, dict)): - self.__reset() + self.__reset(bCleanGlobalVars=True) raise Exception(f"Overwrite the element '{sInputStr.replace('$$', '$')}' failed! \ Due to the datatype of '{sVar.replace('$$', '$')}' is '{type(tmpValue)}'. Only simple data types are allowed to be substituted inside.") subPattern = "(" + tmpVar + "(\[\s*'[^\$\[\]\(\)]+'\s*\]|\[\s*\d+\s*\])*)" @@ -438,7 +453,7 @@ def __referVarHandle(referVar : str, sInputStr : str) -> str: exec(sExec, globals(), ldict) tmpValue = ldict['value'] except: - self.__reset() + self.__reset(bCleanGlobalVars=True) raise Exception(f"The variable '{var}' is not available!") sInputStr = re.sub(tmpVar, tmpValue, sInputStr) if isinstance(tmpValue, str) else \ re.sub(tmpVar, str(tmpValue), sInputStr) @@ -455,7 +470,7 @@ def __referVarHandle(referVar : str, sInputStr : str) -> str: exec(sExec, globals(), ldict) tmpValue = ldict['value'] except: - self.__reset() + self.__reset(bCleanGlobalVars=True) raise Exception(f"The variable '{fullVariable}' is not available!") pattern = re.sub('\[', '\\[', fullVariable) pattern = re.sub('\]', '\\]', pattern) @@ -531,7 +546,7 @@ def __checkAndCreateNewElement(self, sKey: str, value, bCheck=False): try: exec(sExec, globals()) except Exception as error: - self.__reset() + self.__reset(bCleanGlobalVars=True) errorMsg = f"Could not set variable '{sKey}' with value '{value}'! Reason: {error}" raise Exception(errorMsg) else: @@ -565,7 +580,7 @@ def __jsonUpdated(k, v, oJson, bNested, keyNested = ''): try: exec(sExec, globals()) except Exception as error: - self.__reset() + self.__reset(bCleanGlobalVars=True) errorMsg = f"Could not set variable '{k}' with value '{v}'! Reason: {error}" raise Exception(errorMsg) @@ -609,7 +624,7 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): elif re.match("^\s*" + pattern + "\s*$", sInputStr): sInputStr = re.sub("\$", "$$", sInputStr) else: - self.__reset() + self.__reset(bCleanGlobalVars=True) while "str(" in initValue: initValue = re.sub("str\(([\${}0-9A-Za-z\.\-_\[\]]+)\)", "\\1", initValue, count=1) raise Exception(f"Invalid syntax! One or more than one opened or closed curly bracket is missing in expression '{initValue}'.\n \ @@ -631,14 +646,14 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): sInputStr = re.sub("\$\$", "$", sInputStr) sInputStr = str(ldict['value']) if bValueConvertString else ldict['value'] except: - self.__reset() + self.__reset(bCleanGlobalVars=True) 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() + self.__reset(bCleanGlobalVars=True) while 'str(' in key: key = re.sub("str\(([0-9A-Za-z\._\${}'\[\]]+)\)", "\\1", key) errorMsg = f"Found expression '{key}' with at least one parameter of composite data type \ @@ -690,11 +705,11 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): if (re.search("\[\s*'" + pattern + "'\s*\]", keyNested) or \ re.search("\." + pattern + "[\.}]+", keyNested)) and \ not self.__checkAndCreateNewElement(k, v, bCheck=True): - self.__reset() + self.__reset(bCleanGlobalVars=True) raise Exception(f"The implicit creation of data structures based on nested parameter is not supported. \ New parameter '{k}' could not be created by the expression '{keyNested}'") elif k.count('{') != k.count('}'): - self.__reset() + self.__reset(bCleanGlobalVars=True) raise Exception(f"Could not overwrite parameter {k} due to wrong format.\n \ Please check key '{k}' in config file!!!") @@ -784,7 +799,7 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: if "${" in sInputStr: if re.search("\[[0-9\s]*[A-Za-z_]+[0-9\s]*\]", sInputStr): - self.__reset() + self.__reset(bCleanGlobalVars=True) raise Exception(f"Invalid syntax! A sub-element in {sInputStr.strip()} has to enclosed in quotes.") if re.match("^\s*" + nestedPattern + "\s*,*\]*}*\s*$", sInputStr.lower()): sInputStr = re.sub("(" + nestedPattern + ")", "\"\\1\"", sInputStr) @@ -847,7 +862,7 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: sInputStr = __recursiveNestedHandling(sInputStr, tmpList) elif "," in sInputStr: if not re.match("^\s*\".+\"\s*$", sInputStr): - self.__reset() + self.__reset(bCleanGlobalVars=True) 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*$" @@ -861,7 +876,7 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: tmpItem = item if "${" in item: if not re.match("^\s*\"*" + nestedPattern + "\"*\]*}*\s*$", item): - self.__reset() + self.__reset(bCleanGlobalVars=True) raise Exception(f"Invalid nested parameter format: {item}") elif re.match("^\s*\".*" + nestedPattern + ".*\"\s*$", item): item = re.sub("(" + nestedPattern + ")", "str(\\1)", item) @@ -877,12 +892,12 @@ def __recursiveNestedHandling(sInputStr: str, lNestedParam: list) -> str: sInputStr = newInputStr elif re.search("\${\s*}", sInputStr) or re.search("\${.+}\.", sInputStr) \ or (nestedKey and (sInputStr.count("{") != sInputStr.count("}") or sInputStr.count("[") != sInputStr.count("]"))): - self.__reset() + self.__reset(bCleanGlobalVars=True) raise Exception(f"Invalid parameter format: {sInputStr}") elif nestedKey and re.match("^\s*\${[^\(\)\!@#%\^\&\-\+\/\\\=`~\?]+[}\[\]]+\s*$", sInputStr): sInputStr = re.sub("^\s*(\${[^\(\)\!@#%\^\&\-\+\/\\\=`~\?]+[}\[\]]+)\s*$", "\"\\1\"", sInputStr) else: - self.__reset() + self.__reset(bCleanGlobalVars=True) raise Exception(f"Invalid nested parameter format: {sInputStr} - The double quotes are missing!!!") sOutput = sInputStr @@ -1007,7 +1022,7 @@ def __removeDuplicatedKey(dInput : dict) -> dict: jFile = CString.NormalizePath(jFile, sReferencePathAbs=os.path.dirname(os.path.abspath(sys.argv[0]))) if not(os.path.isfile(jFile)): - self.__reset() + self.__reset(bCleanGlobalVars=True) raise Exception(f"File '{jFile}' is not existing!") self.lImportedFiles.append(jFile) @@ -1015,8 +1030,7 @@ def __removeDuplicatedKey(dInput : dict) -> dict: try: sJsonData= self.__load_and_removeComments(jFile) except Exception as reason: - if masterFile: - self.__reset() + self.__reset(bCleanGlobalVars=True) raise Exception(f"Could not read json file '{jFile}' due to: '{reason}'!") pattern = "\${\s*[0-9A-Za-z_]+[0-9A-Za-z\.\-_]*\s*}(\[+\s*'.+'\s*\]+|\[+\s*\d+\s*\]+)*" @@ -1027,14 +1041,14 @@ def __removeDuplicatedKey(dInput : dict) -> dict: try: listDummy = shlex.split(line) except Exception as error: - self.__reset() + self.__reset(bCleanGlobalVars=True) 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(): - self.__reset() + self.__reset(bCleanGlobalVars=True) raise Exception(f"Invalid parameter format in line: {line.strip()}") tmpList = re.findall("(\"[^\"]+\")", line) line = re.sub("(\"[^\"]+\")", CNameMangling.COLONS.value, line) @@ -1098,7 +1112,7 @@ def __removeDuplicatedKey(dInput : dict) -> dict: sJsonDataUpdated = sJsonDataUpdated + newLine + "\n" else: if "${" in line: - self.__reset() + self.__reset(bCleanGlobalVars=True) 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()}'. \ @@ -1112,7 +1126,7 @@ def __removeDuplicatedKey(dInput : dict) -> dict: if self.syntax == CSyntaxType.python: CJSONDecoder = CPythonJSONDecoder else: - self.__reset() + self.__reset(bCleanGlobalVars=True) raise Exception(f"Provided syntax '{self.syntax}' is not supported.") try: @@ -1120,7 +1134,7 @@ def __removeDuplicatedKey(dInput : dict) -> dict: cls=CJSONDecoder, object_pairs_hook=self.__processImportFiles) except Exception as error: - self.__reset() + self.__reset(bCleanGlobalVars=True) raise Exception(f"JSON file: {jFile}\n{error}") self.__checkDotInParamName(oJson) @@ -1168,7 +1182,7 @@ def __removeDuplicatedKey(dInput : dict) -> dict: ldict = {} exec(sExec, globals(), ldict) except: - self.__reset() + self.__reset(bCleanGlobalVars=True) raise Exception(f"The variable '{parseNestedParam[0]}' is not available!") self.__reset() From b2d74260aca90850c5cd6933391b327711c21eea Mon Sep 17 00:00:00 2001 From: mas2hc Date: Thu, 11 Jan 2024 17:19:48 +0700 Subject: [PATCH 16/18] Tiny change to fix a small side effect, ticket 69 --- JsonPreprocessor/CJsonPreprocessor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index 36c2f355..d0d2aeff 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -692,7 +692,7 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): oJson[keyNested] = v bNested = True while "${" in k: - k = __loadNestedValue(keyNested, k, bKey=True) + k = __loadNestedValue(keyNested, k, bKey=True, key=keyNested) elif re.match("^\s*" + pattern + "\s*$", k.lower()): keyNested = k k = re.sub("\$", "$$", k) From 06bc22d9c64c7722d08a61cc5a4793b1612adbc3 Mon Sep 17 00:00:00 2001 From: qth2hi Date: Thu, 11 Jan 2024 18:15:52 +0100 Subject: [PATCH 17/18] JsonPreprocessor documentation: maintenance and extensions --- JsonPreprocessor/JsonPreprocessor.pdf | Bin 418437 -> 353937 bytes packagedoc/additional_docs/Description.tex | 5 +- .../additional_docs/The JSONP format.tex | 161 ++++++++++++++++-- 3 files changed, 144 insertions(+), 22 deletions(-) diff --git a/JsonPreprocessor/JsonPreprocessor.pdf b/JsonPreprocessor/JsonPreprocessor.pdf index e273db913a2da22ce235b7736f10e55fd9a77c0f..3c318f47fdceb4602793e6865284941139e0666e 100644 GIT binary patch delta 160332 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�p{YLNUv^V~t8COwnWrLz|ry8|(0@7TEYC=@js?`6p$a zYsFzKiWW`Zh_3mBqOY@K>5pdxh|1z{&WsoFd|}kzPZr0!5UxkzL$jIpt!GRO4+9Op2Ahl{E8}Youg_^l*9A3ykt)$z*Zn)X|JHT+ zG{=4GIP5awOw&wx>T2Jn;gL~Jbm3#LtM%Mmy=Pan6qpmKh9%&>RPvxZ(W$_$&jzZ(Ez8yiz z?B1Vwf8v?pj3S#ZcejhK>t7@s2nz)G>v&u}B#hoXs%-v!b|FRo+hc@wvf%=F`iZsc zb?SRKJ)%Z@e&l_PXojds2mn?;9!BpyBSvpT1b7vh!pkGnh;Jc%I(uNDqZN#HW-xdz zbO!kR8UudwatVgi;GA)=FFiva%ZJxE%(v;OfG9 zP@Iih$6Yn=203V}t;eF>tdm7u-`0|Wq~$|Brh~f{tRTNdm#>z1RHwwKH*LlNJ@Iwg z3}QjbRZR|*;#}8BgP%5xt|Z~82(71l3b1SEC9&=)2hERvv>vQ9e(VYI?~o0#ds45^w_eu&h+GY zKe>vFGJpLIWj@1W8UL=yph-1i3~{!!o1nteoH9)M{&0k!sRH1&bY;Ib7#Eu{W&`Et@848O`8?9Y(+qwN}%vB6CqPsSh49YQn-{jLfps zw-hn?nN+}SPiwuO%Ep(>Um6-lDU1(EM9)kc)}NHjnGr@#Yr#5odC^{a!IL+btu(VKqcX zCzeJcEoxmk{X4R<GPz_vnV8>2jn8R} z6rS}dHe;$ZFS$`#BSAD-j32WcehJ;Wf2$$=F|Q#kx{oSS=}OT^rwV*_eH zzXn&+D#>)2k_|6MJbgdAMh9`xx{C4?9O5VH_}yjN1Hk zq_CW{gXYO6H7XnKhX^C^_I4WCu^XeF+S?_QN$T26YPsv>gVl%DYk@z#6(9emQ(ECU zM^^~xam%7)5H;KMGhn|%0*7>Luq(e)3_%;$+}g;$ij`V1?gJ-5kx*TtD3p$rb4)WI z)~Lv0LbYm%OXifRW7)z9-Hu@u{bkRq>2A*axTZbsy0~+*$S|tT&5SvL@*pi?l?F>O z69U1OIXI0mNwdZe+v$v+9`r}djs|^U_v3qt8p@gm>$tr!OH)74WJ^U~oJ}q>t~w^A zgd9~$Hurpg%;8cXlovm$-Z|6lkymS(5%4K%^^@oIs%Exf9H%&Hic7=KJCQ8fJlXlm ziECU>2R0&sjlHMZ-=)3!9n_(CX40!6`0NxRyuveXd+u4tV}CgK-^YlZzbOyhK(bsq zini-!E3qb*uK4T%gAu3rBnRT_s+rdx)ly1}%_%2yd^1`8EUnHoN z@`o06)C-R;yya!!pch;oipN{uvaN*w0udRu?I}%T1k!R`J5azk1@=@G@UFpDU3N z^X@5qiwr#m@zs(`oFo4wQ&_qE!n0UPcR^xc$U7Iz=M~KVPY{fM;QLRJKIs?C@5cVd zQMDGNe~#PmNz0_Dq)6euaShw93)tD-o$o>RVK)lFty`>2p}3%CL$15Is=>I`+Q_36 zw~((S`CY{ppo=1|#^cFGpEzGwgT@iO0gWRFRDcE&MEJ%PM&C4@Ng#Z6yGJ;dn2g{v z2X|yd?8^`4?;N<{8g+F7#%rPt2CYVqSp&^<-E0pIT7eljXa&~bpap10>RBnp<@$4A zRG@tyAA~@W9G62G9Fs#K$`C;*#fXr~7Dn1M1>k+e z`>UZt1cWyCqJ||#6Nwa2m{k46OJ|gCi}}DXnyBoR9i3wO07+_lk5I@oC3ei==Jt7z zm#z~FB}7H!L!igzN1(;#_mPv9sG~GlPr#OJF2we`SWWso8n>*wAzPkl85#7rEJoh zD%QkEE@u5b{pfkK?d>F)-z&fT{gtAFm+|cE-BH;Wij8c|@eH4{(C;VYh#`OAGLVz-e`sgxG}U!AvRqXP^TrHl2Sr z_@9Be|1$&He>)90`Pl!PXhduS%Ej~G8xRI66k$$gGW<#QQJrILdc&O%)iOv~m9Hh! z%T5np-jM+7`Rdl|xC!%9DrNbycu;h~*dxi7eDr>da0kIkA!+&PZ4zv;L5H0l3kz%Hqm?@HfO{{{V|7A16v~9Jt4CXy1j3g_au))x*u2;M1YX zGDoio5=ztCfxXX;m^k42^_BO}kS3ZEC>H~Co>Ku?e7+u&%=I~SJ>q(+EbWju9;16N ziwHtI%xsD}V-L#k+J$a6%N=H)ziw!jb~kihX=RoL8flEyG4SFIZeCOCK5xTi04sg>!RbDX;18u=hC$1qtHwRRADyvJyG+l#c;!tp4fIy-* z=T4JYwnLqaX?l)FnP+GCVdJJZjxQDK7jA%?n+uC3Gq+&fc{7D-5x33bDr~hcfW$st z!LakHT!Qf%kPPk2kiil&mJ;G|A8V~L8d{16FukREP1MF(qol9 z1*3JaYLv``uiLQrpmu?ACatwRfWhs0BR7@qe^zL@05GM9bq@*X_%$~#Jd*SooznGT zD;PMn?mNP97fkEpac{xoEBQ@G;6j2g0^c%VUL%~d3+f?DIwP$J*&KJ=jw)<1C$`eL zvqr`>+Lk-IQ78jF{a9}c-D3BRF4NpC7HoReNnL|*cDmpYpz)wwsyuoEeQAv)u z5!2|UfDJ^13BE7AB4WslYK?<{98*tWrzBZ4j@A-JV8s%Yggl!%cln(Q$GExgPQ6Gm z3cfANH&P_`5HKn_3u;1HH)vOw!oYxAvEEU6sCR9)91{r1OeLq?Dc4M>%=EDEhb0=t z;HHeb##wI^eMRAVvPYSL?*(z&v?qz4bp>c{KzuVxSd>~Z0{E9vY%c}~6`0x|hNTKT zU!Hvf8+83NuabjOZ5Kloioq?bR_T2t#aR>G+L3zbgRBtVo@p||B$n`x8Y;b%7bMv= zQ>n~^hqbS3@EGw9ugB}CvYUMl{lYBAkEOVmbqm;~gSNkGwluvKdv&TGI9JvP)!xT@((@tZpQ_=9MiyS_cc4_za`Sq zQ&5x07tz5}SfDNtxyxIdw_z=QgGlkiE!JSeG=t%b@hYyU32sKyRVX^l_8H50s9_)c zJYJOBeOGZS5-ue1Rhw*ilU?u*tywxS*O3VW1aOe@ zW6e>EY;S;FAW~(`QB4i@s-9i%l8s_H-J>uVW>d^(NZ3yvw_q+^r5p#(`&0nk3E(`?fea_o4Rtyu4@Q;#{8Sv_1?MO}cvYWzjlZ8eJvkiMjl(xPtc{m==>f#bL{IH7 z;3;H0eU8MQr{DE)*@IsnKk*Y2^U-jchv$|L?1&hsZw*YZOVj@18MWNa5hC-aZpkF4HozO(n|$#I`iIyvVZE;h>J3F`}vhh=|`+!|3|#8X%bZB4Lj1S(9M*8l%(J0l(D0YW^J39l``~U?{`(!kHqujJ!UofjWE9gE|{lfI4@70d;

zJlf|`LDT- zbp;FjbhEke9`=0A^5X}o!Rue8&DvnTTtnz9R7u^!u*L3c-KvZI)7Q+~&e1?QePH$X zg~B;9P4Of5@v30Unaw(mRQHU#Z$D8u(A-2xkd;BOW7GHuo0r$LMv{tb5S2l zW$6+rWPDZOdm}aa>6RKI_AQz9>rb+Q3q@48DKiGM5_;KrkAB|rJ3)CQDjbJCk;bL* z$;ATTX!QXKNEj!VdC{$Ou|7`pMnQ%E=Yd%+*l&qvTd?I?zr!y@<4dXN%*ED4&I=jP zZu;Jw`$@)T3Y#XWjHR`XUye~-J_T7@)X141DHf4_8&k9>Q%KPaq{N-#bGgKenwz1L|&yByQd`&R$N61RqXf$^o0J}C3 zvXZ8dyvvr<$eaYe)^Ibk@jls4(7R(X>{8}#*;VgV5%@2!UvR|0%Dp`3#$I(|%+)T9 zpPVh*;ggBPE>*~xM;h9J=J6aq-CP1~30VtWk-X7Ue$;Gxg(bW~Rl7<5zN36ax8_D% zY$TeIv{avEAOFZ^*uWG|E-(fJF(@9EcP!$$4Z)BkcRUl9zP!_~L5_ajrHg1K-LO6Q zt8qmYLr6MuME@Eu9eUXb{B~jk3FjjK30LI%NBFfhNceErzl4V*N@c&9>Iq-zzh;k{ z<>B|uY>@iMV)*{Fd^%f6nmplNPl5sqZC*}XU+WzSD56IOGQRWf4;1?DY(5zB-TUvm zRBr=N3~6Ruhsy{5^tR5GjdT?EzqTZ`FSa$KxYv~L3uq5?sTAoY zmrvP$D%RQqY{t23QWVRnG(={8HC;0)Whpo7oTn7q?AdJcWpp|e-^LBcNR`^pccJ-P zNU-JvF)sR3B7fG1V35U!I4f^Z!NZVmoQp#EwxE!Tr6u>hEB<&N_*#6J$w+|JA_bv*oy-tH#~A+8 z5j#B6h+5KIe1AkYT!N+5HPB6iRYNXWRVBrpsNbGpq?PhEW1kG>yTy5O?U{;jaR8lV z)RL5zRmKz>>wyfGu(T<&Mpt%4s&zW!1_tpr8m|l*v7ALH{RJrbE~mdZBbg&vbY0no zwhyXIz!M_tFXL@#SITuJZW(S<9sQrNc6lQdo;ll_rahl%e?MJ)@#zv0)?P@ap~x?s zZs$eS+!0Ww7)DemekNgrYqjx_DEp4DDXv=6U@4wkuf?5~F*vgP%bPmo51RZC-2?ie zmosfUf_p|7i-K{pQk3_31-LQrhoh7t&QJ+|4zR#rM_8rs+IVzXhamn85G|o)thlT* zMEDBDuXWaO#vDt59tRI3=J{yq=}VF*?CDT_6=ff5chCa4n}*0q87p?*28CDct_GBu z%LxC0%C>tM2SS%$Qw~0-Z+ROfv?Pru^$hg@Q%O%9r|%Q6a!%VgK*w zEVbwYa`4yujy#Uy`=$A^#?r0G6aaszOZuV)7?x6}{*ly!YXp7`pOa=S2X4fiJhQ3w za~Yf=b5kPid=bdnH2Vkn*%y&AOk#m*=e8NVwbr`EvZbh|srrkJV2X8dWuK2LG<*{{ zu$JpT?|3>vERAkZ5Mcc^&-}pzU=MkeY^4

v#QndsqYv2?z_LfN2F#~*ugL)oBx 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 delta 225874 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 qCE)$=^x^%({|@=-{htq Date: Sun, 14 Jan 2024 22:59:12 +0700 Subject: [PATCH 18/18] Ticket 187, usage of single quotes within square brackets --- JsonPreprocessor/CJsonPreprocessor.py | 21 ++++++++++++--------- test/testconfig/TestConfig.py | 2 +- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/JsonPreprocessor/CJsonPreprocessor.py b/JsonPreprocessor/CJsonPreprocessor.py index d0d2aeff..c37b7daf 100644 --- a/JsonPreprocessor/CJsonPreprocessor.py +++ b/JsonPreprocessor/CJsonPreprocessor.py @@ -443,8 +443,7 @@ def __referVarHandle(referVar : str, sInputStr : str) -> str: tmpPattern = re.sub("\$", "\\$", sUpdateVar) sInputStr = re.sub(tmpPattern, '', sInputStr, count=1) for var in referVars[::-1]: - tmpVar = re.sub("\$", "\\$", var) - pattern = '(' + tmpVar + '\s*\[\s*.*?\s*\])' + pattern = '(' + var.replace('$', '\$') + '\s*\[\s*.*?\s*\])' variable = re.findall(pattern, sInputStr) if variable == []: sExec = "value = " + re.search('^\s*\$\${(\s*.*?)}', var).group(1) @@ -455,8 +454,10 @@ def __referVarHandle(referVar : str, sInputStr : str) -> str: except: self.__reset(bCleanGlobalVars=True) raise Exception(f"The variable '{var}' is not available!") - sInputStr = re.sub(tmpVar, tmpValue, sInputStr) if isinstance(tmpValue, str) else \ - re.sub(tmpVar, str(tmpValue), sInputStr) + if re.search("\[\s*"+ var.replace('$', '\$') +"\s*\]", sInputStr) and isinstance(tmpValue, str): + sInputStr = sInputStr.replace(var, "'" + var + "'") + sInputStr = re.sub(var.replace('$', '\$'), tmpValue, sInputStr) if isinstance(tmpValue, str) else \ + re.sub(var.replace('$', '\$'), str(tmpValue), sInputStr) continue while variable != []: fullVariable = variable[0] @@ -633,7 +634,7 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): valueAfterProcessed = self.__nestedParamHandler(sInputStr) if not bValueConvertString else \ self.__nestedParamHandler(sInputStr, bKey=bKey) for valueProcessed in valueAfterProcessed: - tmpValueAfterProcessed = re.sub('\\${\s*(.*?)\s*}', '\\1', valueProcessed) + tmpValueAfterProcessed = re.sub("'*\${\s*(.*?)\s*}'*", '\\1', valueProcessed) sExec = "value = " + tmpValueAfterProcessed if isinstance(tmpValueAfterProcessed, str) else \ "value = " + str(tmpValueAfterProcessed) try: @@ -675,6 +676,7 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): for k, v in tmpJson.items(): keyNested = '' bStrConvert = False + bImplicitCreation = False if CNameMangling.DUPLICATEDKEY_00.value in k: del oJson[k] k = k.replace(CNameMangling.DUPLICATEDKEY_00.value, '') @@ -695,6 +697,9 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): k = __loadNestedValue(keyNested, k, bKey=True, key=keyNested) elif re.match("^\s*" + pattern + "\s*$", k.lower()): keyNested = k + if re.search("\[\s*'*" + pattern + "'*\s*\]", keyNested) or \ + re.search("\." + pattern + "[\.}]+", keyNested): + bImplicitCreation = True k = re.sub("\$", "$$", k) k = self.__checkParamName(k) keyAfterProcessed = self.__nestedParamHandler(k, bKey=True) @@ -702,9 +707,7 @@ def __loadNestedValue(initValue: str, sInputStr: str, bKey=False, key=''): k = re.sub('^\s*\${\s*(.*?)\s*}', '\\1', keyAfterProcessed[0]) # Temporary disable implicit creation of data structures based on nested parameters. # In case check sub-element returns False -> reset() and raise an exception. - if (re.search("\[\s*'" + pattern + "'\s*\]", keyNested) or \ - re.search("\." + pattern + "[\.}]+", keyNested)) and \ - not self.__checkAndCreateNewElement(k, v, bCheck=True): + if bImplicitCreation and not self.__checkAndCreateNewElement(k, v, bCheck=True): self.__reset(bCleanGlobalVars=True) raise Exception(f"The implicit creation of data structures based on nested parameter is not supported. \ New parameter '{k}' could not be created by the expression '{keyNested}'") @@ -1175,7 +1178,7 @@ def __removeDuplicatedKey(dInput : dict) -> dict: param = self.__checkParamName(param) param = re.sub("\${", "$${", param) parseNestedParam = self.__nestedParamHandler(param) - tmpParseNestedParam = re.sub('\${\s*(.*?)\s*}', '\\1', parseNestedParam[0]) + tmpParseNestedParam = re.sub("'*\${\s*(.*?)\s*}'*", '\\1', parseNestedParam[0]) sExec = "value = " + tmpParseNestedParam if isinstance(tmpParseNestedParam, str) else \ "value = " + str(tmpParseNestedParam) try: diff --git a/test/testconfig/TestConfig.py b/test/testconfig/TestConfig.py index 8478a876..b0dad3b3 100644 --- a/test/testconfig/TestConfig.py +++ b/test/testconfig/TestConfig.py @@ -2345,7 +2345,7 @@ dictUsecase['HINT'] = None dictUsecase['COMMENT'] = None dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_1057.jsonp" -dictUsecase['EXPECTEDEXCEPTION'] = "Could not set variable 'testdict[C][C]' with value '4'! Reason: name 'C' is not defined" +dictUsecase['EXPECTEDEXCEPTION'] = "The implicit creation of data structures based on nested parameter is not supported" dictUsecase['EXPECTEDRETURN'] = None listofdictUsecases.append(dictUsecase) del dictUsecase