From dca9f50ee81cc1dcb41dabd2b3d4369f579924ff Mon Sep 17 00:00:00 2001 From: gordonblackadder <171737385+gblackadder@users.noreply.github.com> Date: Tue, 24 Sep 2024 17:00:26 -0400 Subject: [PATCH 1/3] standardize version numbers in excel --- excel_sheets/Document_metadata.xlsx | Bin 38763 -> 38759 bytes excel_sheets/Indicator_metadata.xlsx | Bin 51233 -> 51226 bytes excel_sheets/Indicators_db_metadata.xlsx | Bin 15572 -> 15567 bytes excel_sheets/Microdata_metadata.xlsx | Bin 53806 -> 53801 bytes excel_sheets/Resource_metadata.xlsx | Bin 8436 -> 8433 bytes excel_sheets/Script_metadata.xlsx | Bin 40333 -> 40325 bytes excel_sheets/Table_metadata.xlsx | Bin 38933 -> 38929 bytes excel_sheets/Video_metadata.xlsx | Bin 16588 -> 16584 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/excel_sheets/Document_metadata.xlsx b/excel_sheets/Document_metadata.xlsx index d5237aa11a64797ce72e8d4a27fde3ce21b342cd..f9ec93d30771db6adb52bad1627a8aac737d9497 100644 GIT binary patch delta 2168 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 diff --git a/excel_sheets/Indicator_metadata.xlsx b/excel_sheets/Indicator_metadata.xlsx index 3fcbb6824cca0345a7c699f83651e877ccdd9d89..1e8011d97b55c7e15af5378f4c44d9c816feb730 100644 GIT binary patch delta 2252 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 LBp#*t^V9zVT%D4l literal 15572 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 BDc1l1 delta 1985 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 C1MOb` delta 1968 zcmZuy2~bm46#W4L7&e!%1hD*1HELOc76hp^ic1l+!O|9DfglLV8i>t8SR!qaA~;B& z7$784w1O*QlmJn{jf_y5$tW_2P=q485vfL&geE}+sej(Qci(yUoOkEGx%X#?b&iR3 zO#FOx^{@~G8A4txr#zDej(Q=BtRL@rt_GV?5VS5hx>k(s6w$-`%sduP{%6fkraW$lFH_w>Y>w`49o&6p8X#daE8U8=?Pn_6|&E)1!K?_&Y&56^JPfN^03f59Tua?wZ&vVkNUv3QtO{ zx!xO&UA&xg(zDdwZg{LTVW4&THN z+!^9smtq%8w4bc-8s06Ws-kX)*M{iP(e8a_r!h^;TbesXC zSe%e#C_x1X$J_fRi2VU_XS~2KW7R{r4RMFv5fLmxm@pGjzzW0+HbZjZT!aLZ5GgE0 z2rvPufGZG7q@?Mnmy4`MIJ#naV-&-xtX-APtv~gYq3;iBt=!#ZHGA&&XZ|M5_1TmX zZP(N_Wu7ubaVL#NwqGAU)jX9Yl{bya#B%qve<}CVcJGk3QSsrX00ovrIIMO`_bRE& zknIop1mF9T01_u8_gQS!jlJ>pWS(tyGcotx${h7TgPX={9PIT(dYJS{iyh&KbgS$O z^*Q%i?Ifk0s=Dron zEXVKt4~_MQ*SizT(qd9mU7eN@yu|_m9>^>SD>tVaojzByVOL8Fp6T~1r4Ngd&@%#0@+9u|W{rUT%^ z2AEyf6F2I9v&b3a)P1f%mZSEUbFd zb9B!4EqL`!PtpItAw|!TInZd9eqQkt<0c@)c%awcvb=@?=~3%-XSNE#NHkl|W71Lr zI8mOuS5^rC6?S_oE?^}uo6|vSbwH>Y8ze_M@eluh9YiaV-5YV_T)9 zRkJm?vZ|}=7aRm`(H+30C}YhrcofU#j2!458DJMwSR!%aw(QK;+$Ho5vAjk3d}%4K zvvoV=!ARn(MmNNm=q zQYm0k{|IJE0-|483|DmYdyw5IRTC3p-YE0rugFbpk^-L6*Sf9ML zUw)al^}ZMJ{}N{VoLRq6Fujl)R>Rth+Nj!n)*OZI)H{C>kr6yu9i%p0UY0Yen?;PZBT0g MnUB}cFVryp1DHMt*8l(j diff --git a/excel_sheets/Table_metadata.xlsx b/excel_sheets/Table_metadata.xlsx index 04da6475417740e791d1934535c9477f19ec913f..422a2cc8b69f2563ef8d9f47995d7651a8d6994d 100644 GIT binary patch delta 1774 zcmZux3pA8z82-o1AY*cETx&`vm%)(2(5gw>s+6>q2E&-d7?+u7Tq;cVC^@r{K8#$} zO0BGp)NHNYp~)7ltc{pubEya=m*mzoW@cwb3TOZGo&SBl^FGgW-uFG{dvmH(vZ_?j z-kxxTJ_JGP5G{?6g}$#Y55BKg(L%C>ICg&QF3#;hVj;(Ti<`;BJnt#?aR1Y$7MbRT7x}iSE-{9;_!3gmclGv{H3l5Wh+^Rda4!7q?mD;qSW^aqojLTT4pc~9Br;&ctsomX~x=sdoXYVBzlIme^!35_}5yq7(l zM44(z_cY0QC!L#ewJmnWUy3p2`5D`?h&uzWKjO^M!!~s551gEdhc%n+(`LP|Zp1fs zy_ZtOdBVa89PMr45&yp*hTA?K4rWPS3pAo=`2myr`-dA6blP>3CH@lRlJ1iu;VAj68p*zCE(D2XkcTa zf~&AZ=oM}0%4nfxgr>RVk75%P_KKsRTYsiss25UgDy0sXBg~AQe2Hz{ z8xW+awl18p^5BU{ZuuL@;1ilRqqp#UF-O?eZeTb)XtyaEz6l0? zz~I)_*`~Pvc<)^6-kNQHJrtK-Cb&L`Di*LEQ5P%5%LG5sfjQOMXue#s(m1TRrIy+eeOh82gs%w3&vqIywP`j)hOpo4W*dl6=mw0#oJD)nBm1YBqLp9*+Fei|yvjqsXw;?=aeR&`{^eZ4c<_2dn|M;Yq0YZoy zLMkv$1B}pZggp*`xBwv!_Djpim zbgB8CO9E>GPqPI>J^u8Lo{0^9we=snW?Z~{nmeMBrDLJuqJiH9eROtN1a>x4)*Tmc zS|AYB`gV`@wutx@J)*9$jZ$ZQ5Pl#7&hIUng8{}k7C9tLI zp_E_;t9%}evzz8YE$0Yakpc#pgNk_jVl_-jxl3Bg$W^q|%bqVTSHpZ!GitkKXYJq+G@=7R z=!MzH;~Cfu@Gf`N;>l=nP1vfL5JZUyi9BJ4SNxYZ;dr%5lmUaFKjn^EOWelg!h}e> zcxFt*Q6@9u|K?gYAWUkLi)cs)GF~G7IZG*~#DH?H@#2!2xhAkX;0@PY)hJt`_z%V$ Bz48D6 delta 1763 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 E0sthzN&o-= delta 6145 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 Date: Wed, 25 Sep 2024 15:00:03 -0400 Subject: [PATCH 2/3] update document schema to not have date --- pydantic_schemas/document_schema.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pydantic_schemas/document_schema.py b/pydantic_schemas/document_schema.py index ba3c89f..e15b6ea 100644 --- a/pydantic_schemas/document_schema.py +++ b/pydantic_schemas/document_schema.py @@ -1,6 +1,5 @@ # generated by datamodel-codegen: # filename: document-schema.json -# timestamp: 2024-09-13T19:00:20+00:00 from __future__ import annotations From ff6b79e4c1e75f41bbf36dc2c285235f5811d746 Mon Sep 17 00:00:00 2001 From: gordonblackadder <171737385+gblackadder@users.noreply.github.com> Date: Wed, 25 Sep 2024 17:45:26 -0400 Subject: [PATCH 3/3] remove dates from pydantic models --- README.md | 30 ++++++- pydantic_schemas/generators/__init__.py | 0 .../generators/generate_excel_files.py | 83 ++++++++++++++++++- .../generators/generate_pydantic_schemas.py | 14 +--- pydantic_schemas/geospatial_schema.py | 1 - pydantic_schemas/image_schema.py | 1 - pydantic_schemas/indicator_schema.py | 1 - pydantic_schemas/indicators_db_schema.py | 1 - pydantic_schemas/microdata_schema.py | 1 - pydantic_schemas/resource_schema.py | 1 - pydantic_schemas/script_schema.py | 1 - pydantic_schemas/table_schema.py | 1 - pydantic_schemas/utils/pydantic_to_excel.py | 7 +- pydantic_schemas/video_schema.py | 1 - 14 files changed, 113 insertions(+), 30 deletions(-) create mode 100644 pydantic_schemas/generators/__init__.py diff --git a/README.md b/README.md index dc40ff6..772a715 100644 --- a/README.md +++ b/README.md @@ -86,12 +86,34 @@ survey_metadata.study_desc.title_statement.idno = "project_idno" ``` -## Updating Pydantic definitions and Excel sheets +## Updating Schemas -To update the pydantic schemas so that they match the latest json schemas run +First create a branch from the main branch. + +Then make the change you want to the json schema in the schemas folder. + +Then in pyproject.toml update the version number, changing either the major, minor or patch number as appropriate. + +Next update the pydantic schemas so that they match the latest json schemas by running `python pydantic_schemas/generators/generate_pydantic_schemas.py` -Then to update the Excel sheets run +Finally update the Excel sheets by running + + `python pydantic_schemas/generators/generate_excel_files.py` + +## Versioning conventions for schemas + +### Major Changes + +- field type changes that break convention and cannot be coerced such as a field moving from string to an array +- a mandatory field added or optional field changed to mandatory + +### Minor Changes + +- field removed +- optional field added + +### Patch Changes - `python pydantic_schemas/generators/generate_excel_files.py` \ No newline at end of file +- field type changes that can be coerced such as int to string \ No newline at end of file diff --git a/pydantic_schemas/generators/__init__.py b/pydantic_schemas/generators/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pydantic_schemas/generators/generate_excel_files.py b/pydantic_schemas/generators/generate_excel_files.py index 00da0dd..d1acbfb 100644 --- a/pydantic_schemas/generators/generate_excel_files.py +++ b/pydantic_schemas/generators/generate_excel_files.py @@ -1,7 +1,75 @@ import os +import openpyxl + from pydantic_schemas.metadata_manager import MetadataManager + +def compare_excel_files(file1, file2): + # Load the workbooks + wb1 = openpyxl.load_workbook(file1) + wb2 = openpyxl.load_workbook(file2) + + # Get all sheet names + sheets1 = wb1.sheetnames + sheets2 = wb2.sheetnames + + # Check if both workbooks have the same sheets + if sheets1 != sheets2: + print("Sheet names do not match") + print(f"File1 sheets: {sheets1}") + print(f"File2 sheets: {sheets2}") + return False + + # Iterate through each sheet + for sheet_name in sheets1: + ws1 = wb1[sheet_name] + ws2 = wb2[sheet_name] + + # Iterate through each cell in the sheet + for row in ws1.iter_rows(): + for cell in row: + cell_address = cell.coordinate + if sheet_name == "metadata" and cell_address == "C1": + continue # Skip comparison for cell C1 in 'metadata' sheet which only contains the versioning number + + differences = [] + if ws1[cell_address].value != ws2[cell_address].value: + differences.append(f"Value: {ws1[cell_address].value} != {ws2[cell_address].value}") + if ( + ws1[cell_address].font.name != ws2[cell_address].font.name + or ws1[cell_address].font.size != ws2[cell_address].font.size + or ws1[cell_address].font.bold != ws2[cell_address].font.bold + or ws1[cell_address].font.italic != ws2[cell_address].font.italic + ): + differences.append(f"Font: {ws1[cell_address].font} != {ws2[cell_address].font}") + if ( + ws1[cell_address].fill.start_color.index != ws2[cell_address].fill.start_color.index + or ws1[cell_address].fill.end_color.index != ws2[cell_address].fill.end_color.index + ): + differences.append(f"Fill: {ws1[cell_address].fill} != {ws2[cell_address].fill}") + if ( + ws1[cell_address].border.left.style != ws2[cell_address].border.left.style + or ws1[cell_address].border.right.style != ws2[cell_address].border.right.style + or ws1[cell_address].border.top.style != ws2[cell_address].border.top.style + or ws1[cell_address].border.bottom.style != ws2[cell_address].border.bottom.style + ): + differences.append(f"Border: {ws1[cell_address].border} != {ws2[cell_address].border}") + if ( + ws1[cell_address].alignment.horizontal != ws2[cell_address].alignment.horizontal + or ws1[cell_address].alignment.vertical != ws2[cell_address].alignment.vertical + ): + differences.append(f"Alignment: {ws1[cell_address].alignment} != {ws2[cell_address].alignment}") + + if differences: + print(f"Differences found at {sheet_name} {cell_address}:") + for difference in differences: + print(f" - {difference}") + return False + + return True + + metadata_manager = MetadataManager() for metadata_name in metadata_manager.metadata_type_names: @@ -10,5 +78,16 @@ filename = f"excel_sheets/{metadata_name.capitalize()}_metadata.xlsx" print(f"Writing {metadata_name} outline to {filename}") if os.path.exists(filename): - os.remove(filename) - metadata_manager.write_metadata_outline_to_excel(metadata_name_or_class=metadata_name, filename=filename) + filename2 = f"excel_sheets/{metadata_name.capitalize()}_metadata2.xlsx" + metadata_manager.write_metadata_outline_to_excel(metadata_name_or_class=metadata_name, filename=filename2) + are_identical = compare_excel_files(filename, filename2) + if are_identical: + print("they're the same") + os.remove(filename2) + else: + print("updating") + os.remove(filename) + os.rename(filename2, filename) + else: + metadata_manager.write_metadata_outline_to_excel(metadata_name_or_class=metadata_name, filename=filename) + print() diff --git a/pydantic_schemas/generators/generate_pydantic_schemas.py b/pydantic_schemas/generators/generate_pydantic_schemas.py index 6344806..a04344c 100644 --- a/pydantic_schemas/generators/generate_pydantic_schemas.py +++ b/pydantic_schemas/generators/generate_pydantic_schemas.py @@ -5,18 +5,6 @@ OUTPUT_DIR = os.path.join("pydantic_schemas") PYTHON_VERSION = "3.11" BASE_CLASS = ".utils.schema_base_model.SchemaBaseModel" -# INPUTS = [ -# "document-schema.json", -# "geospatial-schema.json", -# "image-schema.json", -# "microdata-schema.json", -# "resource-schema.json", -# "script-schema.json", -# "table-schema.json", -# "timeseries-db-schema.json", -# "timeseries-schema.json", -# "video-schema.json", -# ] INPUTS_TO_OUTPUTS = { "document-schema.json": "document_schema.py", @@ -38,7 +26,6 @@ for input_file, output_file in INPUTS_TO_OUTPUTS.items(): print(f"Generating pydantic schema for {input_file}") input_path = os.path.join(SCHEMA_DIR, input_file) - # output_file = os.path.splitext(input_file)[0] + ".py" output_path = os.path.join(OUTPUT_DIR, output_file).replace("-", "_") run( [ @@ -54,6 +41,7 @@ "--use-double-quotes", "--wrap-string-literal", "--collapse-root-models", + "--disable-timestamp", "--base-class", BASE_CLASS, "--output", diff --git a/pydantic_schemas/geospatial_schema.py b/pydantic_schemas/geospatial_schema.py index dbe46aa..3678503 100644 --- a/pydantic_schemas/geospatial_schema.py +++ b/pydantic_schemas/geospatial_schema.py @@ -1,6 +1,5 @@ # generated by datamodel-codegen: # filename: geospatial-schema.json -# timestamp: 2024-09-13T19:00:22+00:00 from __future__ import annotations diff --git a/pydantic_schemas/image_schema.py b/pydantic_schemas/image_schema.py index 24c7168..a586e22 100644 --- a/pydantic_schemas/image_schema.py +++ b/pydantic_schemas/image_schema.py @@ -1,6 +1,5 @@ # generated by datamodel-codegen: # filename: image-schema.json -# timestamp: 2024-09-13T19:00:23+00:00 from __future__ import annotations diff --git a/pydantic_schemas/indicator_schema.py b/pydantic_schemas/indicator_schema.py index 7ce366b..8a0b79f 100644 --- a/pydantic_schemas/indicator_schema.py +++ b/pydantic_schemas/indicator_schema.py @@ -1,6 +1,5 @@ # generated by datamodel-codegen: # filename: timeseries-schema.json -# timestamp: 2024-09-13T19:00:32+00:00 from __future__ import annotations diff --git a/pydantic_schemas/indicators_db_schema.py b/pydantic_schemas/indicators_db_schema.py index 67b860b..c796872 100644 --- a/pydantic_schemas/indicators_db_schema.py +++ b/pydantic_schemas/indicators_db_schema.py @@ -1,6 +1,5 @@ # generated by datamodel-codegen: # filename: timeseries-db-schema.json -# timestamp: 2024-09-13T19:00:30+00:00 from __future__ import annotations diff --git a/pydantic_schemas/microdata_schema.py b/pydantic_schemas/microdata_schema.py index 2c94423..036a238 100644 --- a/pydantic_schemas/microdata_schema.py +++ b/pydantic_schemas/microdata_schema.py @@ -1,6 +1,5 @@ # generated by datamodel-codegen: # filename: microdata-schema.json -# timestamp: 2024-09-13T19:00:25+00:00 from __future__ import annotations diff --git a/pydantic_schemas/resource_schema.py b/pydantic_schemas/resource_schema.py index d72de0d..beaf096 100644 --- a/pydantic_schemas/resource_schema.py +++ b/pydantic_schemas/resource_schema.py @@ -1,6 +1,5 @@ # generated by datamodel-codegen: # filename: resource-schema.json -# timestamp: 2024-09-13T19:00:26+00:00 from __future__ import annotations diff --git a/pydantic_schemas/script_schema.py b/pydantic_schemas/script_schema.py index f785ffe..6af04b5 100644 --- a/pydantic_schemas/script_schema.py +++ b/pydantic_schemas/script_schema.py @@ -1,6 +1,5 @@ # generated by datamodel-codegen: # filename: script-schema.json -# timestamp: 2024-09-13T19:00:27+00:00 from __future__ import annotations diff --git a/pydantic_schemas/table_schema.py b/pydantic_schemas/table_schema.py index 0795030..4ea8836 100644 --- a/pydantic_schemas/table_schema.py +++ b/pydantic_schemas/table_schema.py @@ -1,6 +1,5 @@ # generated by datamodel-codegen: # filename: table-schema.json -# timestamp: 2024-09-13T19:00:29+00:00 from __future__ import annotations diff --git a/pydantic_schemas/utils/pydantic_to_excel.py b/pydantic_schemas/utils/pydantic_to_excel.py index f10e0c6..5f621be 100644 --- a/pydantic_schemas/utils/pydantic_to_excel.py +++ b/pydantic_schemas/utils/pydantic_to_excel.py @@ -1,9 +1,12 @@ import copy +import importlib.metadata import json import os from enum import Enum from typing import List, Optional, Tuple, Union +__version__ = importlib.metadata.version("metadataschemas") + import pandas as pd from openpyxl import Workbook, load_workbook from openpyxl.styles import Alignment, Border, Font, PatternFill, Protection, Side @@ -423,7 +426,7 @@ def write_to_single_sheet( title = model_default_name wb = open_or_create_workbook(doc_filepath) ws = create_sheet(wb, "metadata", sheet_number=0) - version = f"{metadata_type} type metadata version 20240812.1" + version = f"{metadata_type} type metadata version {__version__}" current_row = write_title_and_version_info(ws, title, version, protect_title=False) current_row = write_pydantic_to_sheet(ws, ob, current_row, debug=verbose) correct_column_widths(worksheet=ws) @@ -437,7 +440,7 @@ def write_across_many_sheets( ): wb = open_or_create_workbook(doc_filepath) ws = create_sheet(wb, "metadata", sheet_number=0) - version = f"{metadata_type} type metadata version 20240905.1" + version = f"{metadata_type} type metadata version {__version__}" current_row = write_title_and_version_info(ws, title, version, protect_title=False) children = seperate_simple_from_pydantic(ob) diff --git a/pydantic_schemas/video_schema.py b/pydantic_schemas/video_schema.py index 3b376ab..fc23af7 100644 --- a/pydantic_schemas/video_schema.py +++ b/pydantic_schemas/video_schema.py @@ -1,6 +1,5 @@ # generated by datamodel-codegen: # filename: video-schema.json -# timestamp: 2024-09-13T19:00:33+00:00 from __future__ import annotations