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