From 8cde9de2963b867ba34850f1d7944708196210e5 Mon Sep 17 00:00:00 2001 From: Daniel <d.hornung@indiscale.com> Date: Thu, 7 Mar 2024 16:27:32 +0100 Subject: [PATCH] WIP: Filling XLSX --- .../table_json_conversion/fill_xlsx.py | 18 +++++----- .../create_jsonschema.py | 6 ++-- .../multiple_refs_model.yml} | 0 .../multiple_refs_schema.json} | 0 .../multiple_refs_template.xlsx} | Bin .../{example.json => data/simple_data.json} | 0 .../simple_data.xlsx} | Bin .../simple_model.yml} | 0 .../simple_schema.json} | 0 .../simple_template.xlsx} | Bin .../table_json_conversion/example_single.json | 32 ------------------ .../table_json_conversion/test_fill_xlsx.py | 14 ++++---- .../test_table_template_generator.py | 7 ++-- 13 files changed, 24 insertions(+), 53 deletions(-) rename unittests/table_json_conversion/{model_multiple_refs.yml => data/multiple_refs_model.yml} (100%) rename unittests/table_json_conversion/{schema_multiple_refs.json => data/multiple_refs_schema.json} (100%) rename unittests/table_json_conversion/{multiple_refs.xlsx => data/multiple_refs_template.xlsx} (100%) rename unittests/table_json_conversion/{example.json => data/simple_data.json} (100%) rename unittests/table_json_conversion/{example_single_data.xlsx => data/simple_data.xlsx} (100%) rename unittests/table_json_conversion/{model_simple.yml => data/simple_model.yml} (100%) rename unittests/table_json_conversion/{model_schema.json => data/simple_schema.json} (100%) rename unittests/table_json_conversion/{example_template.xlsx => data/simple_template.xlsx} (100%) delete mode 100644 unittests/table_json_conversion/example_single.json diff --git a/src/caosadvancedtools/table_json_conversion/fill_xlsx.py b/src/caosadvancedtools/table_json_conversion/fill_xlsx.py index 8c9bba80..ec381ec7 100644 --- a/src/caosadvancedtools/table_json_conversion/fill_xlsx.py +++ b/src/caosadvancedtools/table_json_conversion/fill_xlsx.py @@ -57,6 +57,14 @@ def _get_column_types(sheet: Worksheet) -> OrderedDict: return result +def _get_deep_value(data: Dict[str, Any], path: List[str]): + """Return the value at ``path`` inside the dict ``data``. + """ + if len(path) > 1: + return _get_deep_value(data[path[0]], path[1:]) + return data[path[0]] + + def _get_foreign_key_columns(sheet: Worksheet) -> Dict[str, SimpleNamespace]: """Return the foreign keys of the worksheet. @@ -84,14 +92,6 @@ out: dict[str, SimpleNamespace] return result -def _get_deep_value(data: Dict[str, Any], path: List[str]): - """Return the value at ``path`` inside the dict ``data``. - """ - if len(path) > 1: - return _get_deep_value(data[path.pop(0)], path) - return data[path[0]] - - def _get_row_type_column_index(sheet: Worksheet): """Return the column index (0-indexed) of the column which defines the row types. """ @@ -135,7 +135,7 @@ class TemplateFiller: def fill_data(self, data: dict): """Fill the data into the workbook.""" self._context = data - self._handle_data(data=data, current_path=[]) + self._handle_data(data=data) self._context = None def _create_index(self): diff --git a/unittests/table_json_conversion/create_jsonschema.py b/unittests/table_json_conversion/create_jsonschema.py index 61e4eb20..07264649 100755 --- a/unittests/table_json_conversion/create_jsonschema.py +++ b/unittests/table_json_conversion/create_jsonschema.py @@ -63,10 +63,10 @@ def _parse_arguments(): def main(): """The main function of this script.""" _ = _parse_arguments() - prepare_datamodel("model_simple.yml", ["Training", "Person"], "model_schema.json", + prepare_datamodel("data/simple_model.yml", ["Training", "Person"], "data/simple_schema.json", do_not_create=["Organisation"]) - prepare_datamodel("model_multiple_refs.yml", ["Training", "Person"], - "schema_multiple_refs.json") + prepare_datamodel("data/multiple_refs_model.yml", ["Training", "Person"], + "data/multiple_refs_schema.json") if __name__ == "__main__": diff --git a/unittests/table_json_conversion/model_multiple_refs.yml b/unittests/table_json_conversion/data/multiple_refs_model.yml similarity index 100% rename from unittests/table_json_conversion/model_multiple_refs.yml rename to unittests/table_json_conversion/data/multiple_refs_model.yml diff --git a/unittests/table_json_conversion/schema_multiple_refs.json b/unittests/table_json_conversion/data/multiple_refs_schema.json similarity index 100% rename from unittests/table_json_conversion/schema_multiple_refs.json rename to unittests/table_json_conversion/data/multiple_refs_schema.json diff --git a/unittests/table_json_conversion/multiple_refs.xlsx b/unittests/table_json_conversion/data/multiple_refs_template.xlsx similarity index 100% rename from unittests/table_json_conversion/multiple_refs.xlsx rename to unittests/table_json_conversion/data/multiple_refs_template.xlsx diff --git a/unittests/table_json_conversion/example.json b/unittests/table_json_conversion/data/simple_data.json similarity index 100% rename from unittests/table_json_conversion/example.json rename to unittests/table_json_conversion/data/simple_data.json diff --git a/unittests/table_json_conversion/example_single_data.xlsx b/unittests/table_json_conversion/data/simple_data.xlsx similarity index 100% rename from unittests/table_json_conversion/example_single_data.xlsx rename to unittests/table_json_conversion/data/simple_data.xlsx diff --git a/unittests/table_json_conversion/model_simple.yml b/unittests/table_json_conversion/data/simple_model.yml similarity index 100% rename from unittests/table_json_conversion/model_simple.yml rename to unittests/table_json_conversion/data/simple_model.yml diff --git a/unittests/table_json_conversion/model_schema.json b/unittests/table_json_conversion/data/simple_schema.json similarity index 100% rename from unittests/table_json_conversion/model_schema.json rename to unittests/table_json_conversion/data/simple_schema.json diff --git a/unittests/table_json_conversion/example_template.xlsx b/unittests/table_json_conversion/data/simple_template.xlsx similarity index 100% rename from unittests/table_json_conversion/example_template.xlsx rename to unittests/table_json_conversion/data/simple_template.xlsx diff --git a/unittests/table_json_conversion/example_single.json b/unittests/table_json_conversion/example_single.json deleted file mode 100644 index 9997f17e..00000000 --- a/unittests/table_json_conversion/example_single.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "Training": { - "date": "2023-01-01", - "url": "www.indiscale.com", - "coach": [ - { - "family_name": "Sky", - "given_name": "Max", - "Organisation": "ECB" - }, - { - "family_name": "Sky", - "given_name": "Min", - "Organisation": "ECB" - } - ], - "supervisor": { - "family_name": "Steve", - "given_name": "Stevie", - "Organisation": "IMF" - }, - "duration": 1.0, - "participants": 1, - "subjects": ["Math", "Physics"], - "remote": false - }, - "Person": { - "family_name": "Steve", - "given_name": "Stevie", - "Organisation": "IMF" - } -} diff --git a/unittests/table_json_conversion/test_fill_xlsx.py b/unittests/table_json_conversion/test_fill_xlsx.py index 35f75703..5b45939a 100644 --- a/unittests/table_json_conversion/test_fill_xlsx.py +++ b/unittests/table_json_conversion/test_fill_xlsx.py @@ -56,18 +56,20 @@ custom_output: str, optional assert os.path.exists(outfile) generated = load_workbook(outfile) # workbook can be read known_good_wb = load_workbook(known_good) - if custom_output is not None: - from IPython import embed - embed() + # if custom_output is not None: + # from IPython import embed + # embed() compare_workbooks(generated, known_good_wb) def test_detect(): - example = load_workbook(rfp("example_template.xlsx")) + example = load_workbook(rfp("data/simple_template.xlsx")) assert 0 == _get_row_type_column_index(example['Person']) assert [1, 2] == _get_path_rows(example['Person']) def test_fill_xlsx(): - fill_and_compare(json_file="example_single.json", template_file="example_template.xlsx", - known_good="example_single_data.xlsx") + fill_and_compare(json_file="data/simple_data.json", template_file="data/simple_template.xlsx", + known_good="data/simple_data.xlsx") + # fill_and_compare(json_file="data/example.json", template_file="data/example_template.xlsx", + # known_good="data/example_single_data.xlsx") diff --git a/unittests/table_json_conversion/test_table_template_generator.py b/unittests/table_json_conversion/test_table_template_generator.py index 5d05e213..b7a2dafc 100644 --- a/unittests/table_json_conversion/test_table_template_generator.py +++ b/unittests/table_json_conversion/test_table_template_generator.py @@ -140,7 +140,7 @@ def test_generate_sheets_from_schema(): assert tdef['name'] == (ColumnType.SCALAR, "The name of the Record to be created", ["Training", 'name']) # example case - with open(rfp("model_schema.json")) as sfi: + with open(rfp("data/simple_schema.json")) as sfi: schema = json.load(sfi) with pytest.raises(ValueError, match="A foreign key definition is missing.*"): generator._generate_sheets_from_schema(schema) @@ -197,7 +197,7 @@ def test_get_max_path_length(): def test_template_generator(): generated, _ = _compare_generated_to_known_good( - schema_file=rfp("model_schema.json"), known_good=rfp("example_template.xlsx"), + schema_file=rfp("data/simple_schema.json"), known_good=rfp("data/simple_template.xlsx"), foreign_keys={'Training': {"__this__": ['date', 'url']}}, outfile=None) # test some hidden @@ -230,7 +230,8 @@ def test_template_generator(): def test_model_with_multiple_refs(): _compare_generated_to_known_good( - schema_file=rfp("schema_multiple_refs.json"), known_good=rfp("multiple_refs.xlsx"), + schema_file=rfp("data/multiple_refs_schema.json"), + known_good=rfp("data/multiple_refs_template.xlsx"), foreign_keys={'Training': {"__this__": ['date', 'url'], "Organisation": ["name"]}}, outfile=None) -- GitLab