From 86cfd7fe6d4425b951844fc23b9f1f1bb40ca38e Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Tue, 2 Jul 2024 11:06:25 -0400 Subject: [PATCH 01/51] setup poetry and pre-commit --- .pre-commit-config.yaml | 22 + poetry.lock | 1717 +++++++++++++++++++++++++++++++++++++++ pyproject.toml | 40 + 3 files changed, 1779 insertions(+) create mode 100644 .pre-commit-config.yaml create mode 100644 poetry.lock create mode 100644 pyproject.toml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..9315d09 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,22 @@ +repos: + - repo: https://github.com/Yelp/detect-secrets + rev: v1.5.0 + hooks: + - id: detect-secrets + exclude: package.lock.json + args: ["--exclude-lines", "\\s*\"image/png\": \".+\""] + + - repo: https://github.com/pre-commit/mirrors-isort + rev: v5.10.1 # Use the latest version + hooks: + - id: isort + + - repo: https://github.com/charliermarsh/ruff-pre-commit + rev: v0.0.287 # Use the latest version + hooks: + - id: ruff + + - repo: https://github.com/psf/black + rev: 23.3.0 # Use the latest version + hooks: + - id: black diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..17bf365 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,1717 @@ +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "appnope" +version = "0.1.4" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = ">=3.6" +files = [ + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, +] + +[[package]] +name = "argcomplete" +version = "3.4.0" +description = "Bash tab completion for argparse" +optional = false +python-versions = ">=3.8" +files = [ + {file = "argcomplete-3.4.0-py3-none-any.whl", hash = "sha256:69a79e083a716173e5532e0fa3bef45f793f4e61096cf52b5a42c0211c8b8aa5"}, + {file = "argcomplete-3.4.0.tar.gz", hash = "sha256:c2abcdfe1be8ace47ba777d4fce319eb13bf8ad9dace8d085dcad6eded88057f"}, +] + +[package.extras] +test = ["coverage", "mypy", "pexpect", "ruff", "wheel"] + +[[package]] +name = "asttokens" +version = "2.4.1" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = "*" +files = [ + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, +] + +[package.dependencies] +six = ">=1.12.0" + +[package.extras] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] + +[[package]] +name = "black" +version = "24.4.2" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.8" +files = [ + {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, + {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, + {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, + {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, + {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, + {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, + {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, + {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, + {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, + {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, + {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, + {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, + {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, + {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, + {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, + {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, + {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, + {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, + {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, + {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, + {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, + {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "certifi" +version = "2024.6.2" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, + {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, +] + +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "cfgv" +version = "3.4.0" +description = "Validate configuration and produce human readable error messages." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "comm" +version = "0.2.2" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.8" +files = [ + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, +] + +[package.dependencies] +traitlets = ">=4" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "datamodel-code-generator" +version = "0.25.7" +description = "Datamodel Code Generator" +optional = false +python-versions = "<4.0,>=3.7" +files = [ + {file = "datamodel_code_generator-0.25.7-py3-none-any.whl", hash = "sha256:0b890a0c2bfe8c250f1ddc9656fabeb85db289d4d497a616c19bd80db004dd9a"}, + {file = "datamodel_code_generator-0.25.7.tar.gz", hash = "sha256:975079cb3776f10a71d6aa9914b73149c3fdf4c71825b0977951a959fefc77f6"}, +] + +[package.dependencies] +argcomplete = ">=1.10,<4.0" +black = ">=19.10b0" +genson = ">=1.2.1,<2.0" +inflect = ">=4.1.0,<6.0" +isort = ">=4.3.21,<6.0" +jinja2 = ">=2.10.1,<4.0" +packaging = "*" +pydantic = [ + {version = ">=1.10.0,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.4.0 || >2.4.0,<3.0", extras = ["email"], markers = "python_version >= \"3.12\" and python_version < \"4.0\""}, + {version = ">=1.10.0,<2.4.0 || >2.4.0,<3.0", extras = ["email"], markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, +] +pyyaml = ">=6.0.1" + +[package.extras] +debug = ["PySnooper (>=0.4.1,<2.0.0)"] +graphql = ["graphql-core (>=3.2.3,<4.0.0)"] +http = ["httpx"] +validation = ["openapi-spec-validator (>=0.2.8,<0.7.0)", "prance (>=0.18.2)"] + +[[package]] +name = "debugpy" +version = "1.8.2" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "debugpy-1.8.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7ee2e1afbf44b138c005e4380097d92532e1001580853a7cb40ed84e0ef1c3d2"}, + {file = "debugpy-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f8c3f7c53130a070f0fc845a0f2cee8ed88d220d6b04595897b66605df1edd6"}, + {file = "debugpy-1.8.2-cp310-cp310-win32.whl", hash = "sha256:f179af1e1bd4c88b0b9f0fa153569b24f6b6f3de33f94703336363ae62f4bf47"}, + {file = "debugpy-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:0600faef1d0b8d0e85c816b8bb0cb90ed94fc611f308d5fde28cb8b3d2ff0fe3"}, + {file = "debugpy-1.8.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:8a13417ccd5978a642e91fb79b871baded925d4fadd4dfafec1928196292aa0a"}, + {file = "debugpy-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acdf39855f65c48ac9667b2801234fc64d46778021efac2de7e50907ab90c634"}, + {file = "debugpy-1.8.2-cp311-cp311-win32.whl", hash = "sha256:2cbd4d9a2fc5e7f583ff9bf11f3b7d78dfda8401e8bb6856ad1ed190be4281ad"}, + {file = "debugpy-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:d3408fddd76414034c02880e891ea434e9a9cf3a69842098ef92f6e809d09afa"}, + {file = "debugpy-1.8.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:5d3ccd39e4021f2eb86b8d748a96c766058b39443c1f18b2dc52c10ac2757835"}, + {file = "debugpy-1.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62658aefe289598680193ff655ff3940e2a601765259b123dc7f89c0239b8cd3"}, + {file = "debugpy-1.8.2-cp312-cp312-win32.whl", hash = "sha256:bd11fe35d6fd3431f1546d94121322c0ac572e1bfb1f6be0e9b8655fb4ea941e"}, + {file = "debugpy-1.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:15bc2f4b0f5e99bf86c162c91a74c0631dbd9cef3c6a1d1329c946586255e859"}, + {file = "debugpy-1.8.2-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:5a019d4574afedc6ead1daa22736c530712465c0c4cd44f820d803d937531b2d"}, + {file = "debugpy-1.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40f062d6877d2e45b112c0bbade9a17aac507445fd638922b1a5434df34aed02"}, + {file = "debugpy-1.8.2-cp38-cp38-win32.whl", hash = "sha256:c78ba1680f1015c0ca7115671fe347b28b446081dada3fedf54138f44e4ba031"}, + {file = "debugpy-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:cf327316ae0c0e7dd81eb92d24ba8b5e88bb4d1b585b5c0d32929274a66a5210"}, + {file = "debugpy-1.8.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:1523bc551e28e15147815d1397afc150ac99dbd3a8e64641d53425dba57b0ff9"}, + {file = "debugpy-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e24ccb0cd6f8bfaec68d577cb49e9c680621c336f347479b3fce060ba7c09ec1"}, + {file = "debugpy-1.8.2-cp39-cp39-win32.whl", hash = "sha256:7f8d57a98c5a486c5c7824bc0b9f2f11189d08d73635c326abef268f83950326"}, + {file = "debugpy-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:16c8dcab02617b75697a0a925a62943e26a0330da076e2a10437edd9f0bf3755"}, + {file = "debugpy-1.8.2-py2.py3-none-any.whl", hash = "sha256:16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca"}, + {file = "debugpy-1.8.2.zip", hash = "sha256:95378ed08ed2089221896b9b3a8d021e642c24edc8fef20e5d4342ca8be65c00"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "detect-secrets" +version = "1.5.0" +description = "Tool for detecting secrets in the codebase" +optional = false +python-versions = "*" +files = [ + {file = "detect_secrets-1.5.0-py3-none-any.whl", hash = "sha256:e24e7b9b5a35048c313e983f76c4bd09dad89f045ff059e354f9943bf45aa060"}, + {file = "detect_secrets-1.5.0.tar.gz", hash = "sha256:6bb46dcc553c10df51475641bb30fd69d25645cc12339e46c824c1e0c388898a"}, +] + +[package.dependencies] +pyyaml = "*" +requests = "*" + +[package.extras] +gibberish = ["gibberish-detector"] +word-list = ["pyahocorasick"] + +[[package]] +name = "distlib" +version = "0.3.8" +description = "Distribution utilities" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, + {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, +] + +[[package]] +name = "dnspython" +version = "2.6.1" +description = "DNS toolkit" +optional = false +python-versions = ">=3.8" +files = [ + {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, + {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, +] + +[package.extras] +dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "sphinx (>=7.2.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] +dnssec = ["cryptography (>=41)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] +doq = ["aioquic (>=0.9.25)"] +idna = ["idna (>=3.6)"] +trio = ["trio (>=0.23)"] +wmi = ["wmi (>=1.5.1)"] + +[[package]] +name = "email-validator" +version = "2.2.0" +description = "A robust email address syntax and deliverability validation library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631"}, + {file = "email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7"}, +] + +[package.dependencies] +dnspython = ">=2.0.0" +idna = ">=2.0.0" + +[[package]] +name = "et-xmlfile" +version = "1.1.0" +description = "An implementation of lxml.xmlfile for the standard library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, + {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, +] + +[[package]] +name = "executing" +version = "2.0.1" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.5" +files = [ + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + +[[package]] +name = "filelock" +version = "3.15.4" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, + {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] +typing = ["typing-extensions (>=4.8)"] + +[[package]] +name = "genson" +version = "1.3.0" +description = "GenSON is a powerful, user-friendly JSON Schema generator." +optional = false +python-versions = "*" +files = [ + {file = "genson-1.3.0-py3-none-any.whl", hash = "sha256:468feccd00274cc7e4c09e84b08704270ba8d95232aa280f65b986139cec67f7"}, + {file = "genson-1.3.0.tar.gz", hash = "sha256:e02db9ac2e3fd29e65b5286f7135762e2cd8a986537c075b06fc5f1517308e37"}, +] + +[[package]] +name = "identify" +version = "2.5.36" +description = "File identification library for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "identify-2.5.36-py2.py3-none-any.whl", hash = "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa"}, + {file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"}, +] + +[package.extras] +license = ["ukkonen"] + +[[package]] +name = "idna" +version = "3.7" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, +] + +[[package]] +name = "inflect" +version = "5.6.2" +description = "Correctly generate plurals, singular nouns, ordinals, indefinite articles; convert numbers to words" +optional = false +python-versions = ">=3.7" +files = [ + {file = "inflect-5.6.2-py3-none-any.whl", hash = "sha256:b45d91a4a28a4e617ff1821117439b06eaa86e2a4573154af0149e9be6687238"}, + {file = "inflect-5.6.2.tar.gz", hash = "sha256:aadc7ed73928f5e014129794bbac03058cca35d0a973a5fc4eb45c7fa26005f9"}, +] + +[package.extras] +docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx"] +testing = ["pygments", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "ipykernel" +version = "6.29.5" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, + {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=24" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.26.0" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.10" +files = [ + {file = "ipython-8.26.0-py3-none-any.whl", hash = "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff"}, + {file = "ipython-8.26.0.tar.gz", hash = "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt-toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5.13.0" +typing-extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} + +[package.extras] +all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "intersphinx-registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing-extensions"] +kernel = ["ipykernel"] +matplotlib = ["matplotlib"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["packaging", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] + +[[package]] +name = "isort" +version = "5.13.2" +description = "A Python utility / library to sort Python imports." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, +] + +[package.extras] +colors = ["colorama (>=0.4.6)"] + +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jupyter-client" +version = "8.6.2" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.6.2-py3-none-any.whl", hash = "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f"}, + {file = "jupyter_client-8.6.2.tar.gz", hash = "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df"}, +] + +[package.dependencies] +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "5.7.2" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + +[[package]] +name = "nodeenv" +version = "1.9.1" +description = "Node.js virtual environment builder" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, + {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, +] + +[[package]] +name = "numpy" +version = "2.0.0" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-2.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:04494f6ec467ccb5369d1808570ae55f6ed9b5809d7f035059000a37b8d7e86f"}, + {file = "numpy-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2635dbd200c2d6faf2ef9a0d04f0ecc6b13b3cad54f7c67c61155138835515d2"}, + {file = "numpy-2.0.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:0a43f0974d501842866cc83471bdb0116ba0dffdbaac33ec05e6afed5b615238"}, + {file = "numpy-2.0.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:8d83bb187fb647643bd56e1ae43f273c7f4dbcdf94550d7938cfc32566756514"}, + {file = "numpy-2.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79e843d186c8fb1b102bef3e2bc35ef81160ffef3194646a7fdd6a73c6b97196"}, + {file = "numpy-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d7696c615765091cc5093f76fd1fa069870304beaccfd58b5dcc69e55ef49c1"}, + {file = "numpy-2.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b4c76e3d4c56f145d41b7b6751255feefae92edbc9a61e1758a98204200f30fc"}, + {file = "numpy-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:acd3a644e4807e73b4e1867b769fbf1ce8c5d80e7caaef0d90dcdc640dfc9787"}, + {file = "numpy-2.0.0-cp310-cp310-win32.whl", hash = "sha256:cee6cc0584f71adefe2c908856ccc98702baf95ff80092e4ca46061538a2ba98"}, + {file = "numpy-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:ed08d2703b5972ec736451b818c2eb9da80d66c3e84aed1deeb0c345fefe461b"}, + {file = "numpy-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad0c86f3455fbd0de6c31a3056eb822fc939f81b1618f10ff3406971893b62a5"}, + {file = "numpy-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e7f387600d424f91576af20518334df3d97bc76a300a755f9a8d6e4f5cadd289"}, + {file = "numpy-2.0.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:34f003cb88b1ba38cb9a9a4a3161c1604973d7f9d5552c38bc2f04f829536609"}, + {file = "numpy-2.0.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:b6f6a8f45d0313db07d6d1d37bd0b112f887e1369758a5419c0370ba915b3871"}, + {file = "numpy-2.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f64641b42b2429f56ee08b4f427a4d2daf916ec59686061de751a55aafa22e4"}, + {file = "numpy-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7039a136017eaa92c1848152827e1424701532ca8e8967fe480fe1569dae581"}, + {file = "numpy-2.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:46e161722e0f619749d1cd892167039015b2c2817296104487cd03ed4a955995"}, + {file = "numpy-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0e50842b2295ba8414c8c1d9d957083d5dfe9e16828b37de883f51fc53c4016f"}, + {file = "numpy-2.0.0-cp311-cp311-win32.whl", hash = "sha256:2ce46fd0b8a0c947ae047d222f7136fc4d55538741373107574271bc00e20e8f"}, + {file = "numpy-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbd6acc766814ea6443628f4e6751d0da6593dae29c08c0b2606164db026970c"}, + {file = "numpy-2.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:354f373279768fa5a584bac997de6a6c9bc535c482592d7a813bb0c09be6c76f"}, + {file = "numpy-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4d2f62e55a4cd9c58c1d9a1c9edaedcd857a73cb6fda875bf79093f9d9086f85"}, + {file = "numpy-2.0.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:1e72728e7501a450288fc8e1f9ebc73d90cfd4671ebbd631f3e7857c39bd16f2"}, + {file = "numpy-2.0.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:84554fc53daa8f6abf8e8a66e076aff6ece62de68523d9f665f32d2fc50fd66e"}, + {file = "numpy-2.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c73aafd1afca80afecb22718f8700b40ac7cab927b8abab3c3e337d70e10e5a2"}, + {file = "numpy-2.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49d9f7d256fbc804391a7f72d4a617302b1afac1112fac19b6c6cec63fe7fe8a"}, + {file = "numpy-2.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0ec84b9ba0654f3b962802edc91424331f423dcf5d5f926676e0150789cb3d95"}, + {file = "numpy-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:feff59f27338135776f6d4e2ec7aeeac5d5f7a08a83e80869121ef8164b74af9"}, + {file = "numpy-2.0.0-cp312-cp312-win32.whl", hash = "sha256:c5a59996dc61835133b56a32ebe4ef3740ea5bc19b3983ac60cc32be5a665d54"}, + {file = "numpy-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:a356364941fb0593bb899a1076b92dfa2029f6f5b8ba88a14fd0984aaf76d0df"}, + {file = "numpy-2.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e61155fae27570692ad1d327e81c6cf27d535a5d7ef97648a17d922224b216de"}, + {file = "numpy-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4554eb96f0fd263041baf16cf0881b3f5dafae7a59b1049acb9540c4d57bc8cb"}, + {file = "numpy-2.0.0-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:903703372d46bce88b6920a0cd86c3ad82dae2dbef157b5fc01b70ea1cfc430f"}, + {file = "numpy-2.0.0-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:3e8e01233d57639b2e30966c63d36fcea099d17c53bf424d77f088b0f4babd86"}, + {file = "numpy-2.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cde1753efe513705a0c6d28f5884e22bdc30438bf0085c5c486cdaff40cd67a"}, + {file = "numpy-2.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:821eedb7165ead9eebdb569986968b541f9908979c2da8a4967ecac4439bae3d"}, + {file = "numpy-2.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a1712c015831da583b21c5bfe15e8684137097969c6d22e8316ba66b5baabe4"}, + {file = "numpy-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9c27f0946a3536403efb0e1c28def1ae6730a72cd0d5878db38824855e3afc44"}, + {file = "numpy-2.0.0-cp39-cp39-win32.whl", hash = "sha256:63b92c512d9dbcc37f9d81b123dec99fdb318ba38c8059afc78086fe73820275"}, + {file = "numpy-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:3f6bed7f840d44c08ebdb73b1825282b801799e325bcbdfa6bc5c370e5aecc65"}, + {file = "numpy-2.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9416a5c2e92ace094e9f0082c5fd473502c91651fb896bc17690d6fc475128d6"}, + {file = "numpy-2.0.0-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:17067d097ed036636fa79f6a869ac26df7db1ba22039d962422506640314933a"}, + {file = "numpy-2.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ecb5b0582cd125f67a629072fed6f83562d9dd04d7e03256c9829bdec027ad"}, + {file = "numpy-2.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cef04d068f5fb0518a77857953193b6bb94809a806bd0a14983a8f12ada060c9"}, + {file = "numpy-2.0.0.tar.gz", hash = "sha256:cf5d1c9e6837f8af9f92b6bd3e86d513cdc11f60fd62185cc49ec7d1aba34864"}, +] + +[[package]] +name = "openpyxl" +version = "3.1.5" +description = "A Python library to read/write Excel 2010 xlsx/xlsm files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"}, + {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"}, +] + +[package.dependencies] +et-xmlfile = "*" + +[[package]] +name = "packaging" +version = "24.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, +] + +[[package]] +name = "pandas" +version = "2.2.2" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, + {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"}, + {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, + {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, + {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"}, + {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"}, + {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + +[[package]] +name = "parso" +version = "0.8.4" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "platformdirs" +version = "4.2.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] + +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pre-commit" +version = "3.7.1" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +optional = false +python-versions = ">=3.9" +files = [ + {file = "pre_commit-3.7.1-py2.py3-none-any.whl", hash = "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5"}, + {file = "pre_commit-3.7.1.tar.gz", hash = "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + +[[package]] +name = "prompt-toolkit" +version = "3.0.47" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, + {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "psutil" +version = "6.0.0" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"}, + {file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"}, + {file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"}, + {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"}, + {file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"}, + {file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"}, + {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"}, + {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"}, + {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"}, + {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pydantic" +version = "2.8.0" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.8.0-py3-none-any.whl", hash = "sha256:ead4f3a1e92386a734ca1411cb25d94147cf8778ed5be6b56749047676d6364e"}, + {file = "pydantic-2.8.0.tar.gz", hash = "sha256:d970ffb9d030b710795878940bd0489842c638e7252fc4a19c3ae2f7da4d6141"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +email-validator = {version = ">=2.0.0", optional = true, markers = "extra == \"email\""} +pydantic-core = "2.20.0" +typing-extensions = [ + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, +] + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.20.0" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e9dcd7fb34f7bfb239b5fa420033642fff0ad676b765559c3737b91f664d4fa9"}, + {file = "pydantic_core-2.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:649a764d9b0da29816889424697b2a3746963ad36d3e0968784ceed6e40c6355"}, + {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7701df088d0b05f3460f7ba15aec81ac8b0fb5690367dfd072a6c38cf5b7fdb5"}, + {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab760f17c3e792225cdaef31ca23c0aea45c14ce80d8eff62503f86a5ab76bff"}, + {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cb1ad5b4d73cde784cf64580166568074f5ccd2548d765e690546cff3d80937d"}, + {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b81ec2efc04fc1dbf400647d4357d64fb25543bae38d2d19787d69360aad21c9"}, + {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4a9732a5cad764ba37f3aa873dccb41b584f69c347a57323eda0930deec8e10"}, + {file = "pydantic_core-2.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6dc85b9e10cc21d9c1055f15684f76fa4facadddcb6cd63abab702eb93c98943"}, + {file = "pydantic_core-2.20.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:21d9f7e24f63fdc7118e6cc49defaab8c1d27570782f7e5256169d77498cf7c7"}, + {file = "pydantic_core-2.20.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8b315685832ab9287e6124b5d74fc12dda31e6421d7f6b08525791452844bc2d"}, + {file = "pydantic_core-2.20.0-cp310-none-win32.whl", hash = "sha256:c3dc8ec8b87c7ad534c75b8855168a08a7036fdb9deeeed5705ba9410721c84d"}, + {file = "pydantic_core-2.20.0-cp310-none-win_amd64.whl", hash = "sha256:85770b4b37bb36ef93a6122601795231225641003e0318d23c6233c59b424279"}, + {file = "pydantic_core-2.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:58e251bb5a5998f7226dc90b0b753eeffa720bd66664eba51927c2a7a2d5f32c"}, + {file = "pydantic_core-2.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:78d584caac52c24240ef9ecd75de64c760bbd0e20dbf6973631815e3ef16ef8b"}, + {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5084ec9721f82bef5ff7c4d1ee65e1626783abb585f8c0993833490b63fe1792"}, + {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d0f52684868db7c218437d260e14d37948b094493f2646f22d3dda7229bbe3f"}, + {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1def125d59a87fe451212a72ab9ed34c118ff771e5473fef4f2f95d8ede26d75"}, + {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b34480fd6778ab356abf1e9086a4ced95002a1e195e8d2fd182b0def9d944d11"}, + {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d42669d319db366cb567c3b444f43caa7ffb779bf9530692c6f244fc635a41eb"}, + {file = "pydantic_core-2.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:53b06aea7a48919a254b32107647be9128c066aaa6ee6d5d08222325f25ef175"}, + {file = "pydantic_core-2.20.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1f038156b696a1c39d763b2080aeefa87ddb4162c10aa9fabfefffc3dd8180fa"}, + {file = "pydantic_core-2.20.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3f0f3a4a23717280a5ee3ac4fb1f81d6fde604c9ec5100f7f6f987716bb8c137"}, + {file = "pydantic_core-2.20.0-cp311-none-win32.whl", hash = "sha256:316fe7c3fec017affd916a0c83d6f1ec697cbbbdf1124769fa73328e7907cc2e"}, + {file = "pydantic_core-2.20.0-cp311-none-win_amd64.whl", hash = "sha256:2d06a7fa437f93782e3f32d739c3ec189f82fca74336c08255f9e20cea1ed378"}, + {file = "pydantic_core-2.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d6f8c49657f3eb7720ed4c9b26624063da14937fc94d1812f1e04a2204db3e17"}, + {file = "pydantic_core-2.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad1bd2f377f56fec11d5cfd0977c30061cd19f4fa199bf138b200ec0d5e27eeb"}, + {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed741183719a5271f97d93bbcc45ed64619fa38068aaa6e90027d1d17e30dc8d"}, + {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d82e5ed3a05f2dcb89c6ead2fd0dbff7ac09bc02c1b4028ece2d3a3854d049ce"}, + {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2ba34a099576234671f2e4274e5bc6813b22e28778c216d680eabd0db3f7dad"}, + {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:879ae6bb08a063b3e1b7ac8c860096d8fd6b48dd9b2690b7f2738b8c835e744b"}, + {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b0eefc7633a04c0694340aad91fbfd1986fe1a1e0c63a22793ba40a18fcbdc8"}, + {file = "pydantic_core-2.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:73deadd6fd8a23e2f40b412b3ac617a112143c8989a4fe265050fd91ba5c0608"}, + {file = "pydantic_core-2.20.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:35681445dc85446fb105943d81ae7569aa7e89de80d1ca4ac3229e05c311bdb1"}, + {file = "pydantic_core-2.20.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0f6dd3612a3b9f91f2e63924ea18a4476656c6d01843ca20a4c09e00422195af"}, + {file = "pydantic_core-2.20.0-cp312-none-win32.whl", hash = "sha256:7e37b6bb6e90c2b8412b06373c6978d9d81e7199a40e24a6ef480e8acdeaf918"}, + {file = "pydantic_core-2.20.0-cp312-none-win_amd64.whl", hash = "sha256:7d4df13d1c55e84351fab51383520b84f490740a9f1fec905362aa64590b7a5d"}, + {file = "pydantic_core-2.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:d43e7ab3b65e4dc35a7612cfff7b0fd62dce5bc11a7cd198310b57f39847fd6c"}, + {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b6a24d7b5893392f2b8e3b7a0031ae3b14c6c1942a4615f0d8794fdeeefb08b"}, + {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b2f13c3e955a087c3ec86f97661d9f72a76e221281b2262956af381224cfc243"}, + {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:72432fd6e868c8d0a6849869e004b8bcae233a3c56383954c228316694920b38"}, + {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d70a8ff2d4953afb4cbe6211f17268ad29c0b47e73d3372f40e7775904bc28fc"}, + {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e49524917b8d3c2f42cd0d2df61178e08e50f5f029f9af1f402b3ee64574392"}, + {file = "pydantic_core-2.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4f0f71653b1c1bad0350bc0b4cc057ab87b438ff18fa6392533811ebd01439c"}, + {file = "pydantic_core-2.20.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:16197e6f4fdecb9892ed2436e507e44f0a1aa2cff3b9306d1c879ea2f9200997"}, + {file = "pydantic_core-2.20.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:763602504bf640b3ded3bba3f8ed8a1cc2fc6a87b8d55c1c5689f428c49c947e"}, + {file = "pydantic_core-2.20.0-cp313-none-win32.whl", hash = "sha256:a3f243f318bd9523277fa123b3163f4c005a3e8619d4b867064de02f287a564d"}, + {file = "pydantic_core-2.20.0-cp313-none-win_amd64.whl", hash = "sha256:03aceaf6a5adaad3bec2233edc5a7905026553916615888e53154807e404545c"}, + {file = "pydantic_core-2.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d6f2d8b8da1f03f577243b07bbdd3412eee3d37d1f2fd71d1513cbc76a8c1239"}, + {file = "pydantic_core-2.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a272785a226869416c6b3c1b7e450506152d3844207331f02f27173562c917e0"}, + {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efbb412d55a4ffe73963fed95c09ccb83647ec63b711c4b3752be10a56f0090b"}, + {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1e4f46189d8740561b43655263a41aac75ff0388febcb2c9ec4f1b60a0ec12f3"}, + {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87d3df115f4a3c8c5e4d5acf067d399c6466d7e604fc9ee9acbe6f0c88a0c3cf"}, + {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a340d2bdebe819d08f605e9705ed551c3feb97e4fd71822d7147c1e4bdbb9508"}, + {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:616b9c2f882393d422ba11b40e72382fe975e806ad693095e9a3b67c59ea6150"}, + {file = "pydantic_core-2.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:25c46bb2ff6084859bbcfdf4f1a63004b98e88b6d04053e8bf324e115398e9e7"}, + {file = "pydantic_core-2.20.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:23425eccef8f2c342f78d3a238c824623836c6c874d93c726673dbf7e56c78c0"}, + {file = "pydantic_core-2.20.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:52527e8f223ba29608d999d65b204676398009725007c9336651c2ec2d93cffc"}, + {file = "pydantic_core-2.20.0-cp38-none-win32.whl", hash = "sha256:1c3c5b7f70dd19a6845292b0775295ea81c61540f68671ae06bfe4421b3222c2"}, + {file = "pydantic_core-2.20.0-cp38-none-win_amd64.whl", hash = "sha256:8093473d7b9e908af1cef30025609afc8f5fd2a16ff07f97440fd911421e4432"}, + {file = "pydantic_core-2.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ee7785938e407418795e4399b2bf5b5f3cf6cf728077a7f26973220d58d885cf"}, + {file = "pydantic_core-2.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0e75794883d635071cf6b4ed2a5d7a1e50672ab7a051454c76446ef1ebcdcc91"}, + {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:344e352c96e53b4f56b53d24728217c69399b8129c16789f70236083c6ceb2ac"}, + {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:978d4123ad1e605daf1ba5e01d4f235bcf7b6e340ef07e7122e8e9cfe3eb61ab"}, + {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c05eaf6c863781eb834ab41f5963604ab92855822a2062897958089d1335dad"}, + {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc7e43b4a528ffca8c9151b6a2ca34482c2fdc05e6aa24a84b7f475c896fc51d"}, + {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:658287a29351166510ebbe0a75c373600cc4367a3d9337b964dada8d38bcc0f4"}, + {file = "pydantic_core-2.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1dacf660d6de692fe351e8c806e7efccf09ee5184865893afbe8e59be4920b4a"}, + {file = "pydantic_core-2.20.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3e147fc6e27b9a487320d78515c5f29798b539179f7777018cedf51b7749e4f4"}, + {file = "pydantic_core-2.20.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c867230d715a3dd1d962c8d9bef0d3168994ed663e21bf748b6e3a529a129aab"}, + {file = "pydantic_core-2.20.0-cp39-none-win32.whl", hash = "sha256:22b813baf0dbf612752d8143a2dbf8e33ccb850656b7850e009bad2e101fc377"}, + {file = "pydantic_core-2.20.0-cp39-none-win_amd64.whl", hash = "sha256:3a7235b46c1bbe201f09b6f0f5e6c36b16bad3d0532a10493742f91fbdc8035f"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cafde15a6f7feaec2f570646e2ffc5b73412295d29134a29067e70740ec6ee20"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:2aec8eeea0b08fd6bc2213d8e86811a07491849fd3d79955b62d83e32fa2ad5f"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:840200827984f1c4e114008abc2f5ede362d6e11ed0b5931681884dd41852ff1"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ea1d8b7df522e5ced34993c423c3bf3735c53df8b2a15688a2f03a7d678800"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d5b8376a867047bf08910573deb95d3c8dfb976eb014ee24f3b5a61ccc5bee1b"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d08264b4460326cefacc179fc1411304d5af388a79910832835e6f641512358b"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7a3639011c2e8a9628466f616ed7fb413f30032b891898e10895a0a8b5857d6c"}, + {file = "pydantic_core-2.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:05e83ce2f7eba29e627dd8066aa6c4c0269b2d4f889c0eba157233a353053cea"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:603a843fea76a595c8f661cd4da4d2281dff1e38c4a836a928eac1a2f8fe88e4"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac76f30d5d3454f4c28826d891fe74d25121a346c69523c9810ebba43f3b1cec"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e3b1d4b1b3f6082849f9b28427ef147a5b46a6132a3dbaf9ca1baa40c88609"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2761f71faed820e25ec62eacba670d1b5c2709bb131a19fcdbfbb09884593e5a"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a0586cddbf4380e24569b8a05f234e7305717cc8323f50114dfb2051fcbce2a3"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b8c46a8cf53e849eea7090f331ae2202cd0f1ceb090b00f5902c423bd1e11805"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b4a085bd04af7245e140d1b95619fe8abb445a3d7fdf219b3f80c940853268ef"}, + {file = "pydantic_core-2.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:116b326ac82c8b315e7348390f6d30bcfe6e688a7d3f1de50ff7bcc2042a23c2"}, + {file = "pydantic_core-2.20.0.tar.gz", hash = "sha256:366be8e64e0cb63d87cf79b4e1765c0703dd6313c729b22e7b9e378db6b96877"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pygments" +version = "2.18.0" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pytest" +version = "8.2.2" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, + {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.5,<2.0" + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytz" +version = "2024.1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "pyzmq" +version = "26.0.3" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625"}, + {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf"}, + {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59"}, + {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc"}, + {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8"}, + {file = "pyzmq-26.0.3-cp310-cp310-win32.whl", hash = "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537"}, + {file = "pyzmq-26.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47"}, + {file = "pyzmq-26.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7"}, + {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32"}, + {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a"}, + {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5"}, + {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd"}, + {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83"}, + {file = "pyzmq-26.0.3-cp311-cp311-win32.whl", hash = "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3"}, + {file = "pyzmq-26.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500"}, + {file = "pyzmq-26.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94"}, + {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753"}, + {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20"}, + {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77"}, + {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2"}, + {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798"}, + {file = "pyzmq-26.0.3-cp312-cp312-win32.whl", hash = "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0"}, + {file = "pyzmq-26.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf"}, + {file = "pyzmq-26.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b"}, + {file = "pyzmq-26.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5"}, + {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b"}, + {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa"}, + {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450"}, + {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987"}, + {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a"}, + {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5"}, + {file = "pyzmq-26.0.3-cp37-cp37m-win32.whl", hash = "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf"}, + {file = "pyzmq-26.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a"}, + {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18"}, + {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d"}, + {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6"}, + {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad"}, + {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad"}, + {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67"}, + {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c"}, + {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97"}, + {file = "pyzmq-26.0.3-cp38-cp38-win32.whl", hash = "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc"}, + {file = "pyzmq-26.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972"}, + {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606"}, + {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f"}, + {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5"}, + {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8"}, + {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620"}, + {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4"}, + {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab"}, + {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920"}, + {file = "pyzmq-26.0.3-cp39-cp39-win32.whl", hash = "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879"}, + {file = "pyzmq-26.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2"}, + {file = "pyzmq-26.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad"}, + {file = "pyzmq-26.0.3.tar.gz", hash = "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "ruff" +version = "0.5.0" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.5.0-py3-none-linux_armv6l.whl", hash = "sha256:ee770ea8ab38918f34e7560a597cc0a8c9a193aaa01bfbd879ef43cb06bd9c4c"}, + {file = "ruff-0.5.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:38f3b8327b3cb43474559d435f5fa65dacf723351c159ed0dc567f7ab735d1b6"}, + {file = "ruff-0.5.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7594f8df5404a5c5c8f64b8311169879f6cf42142da644c7e0ba3c3f14130370"}, + {file = "ruff-0.5.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:adc7012d6ec85032bc4e9065110df205752d64010bed5f958d25dbee9ce35de3"}, + {file = "ruff-0.5.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d505fb93b0fabef974b168d9b27c3960714d2ecda24b6ffa6a87ac432905ea38"}, + {file = "ruff-0.5.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dc5cfd3558f14513ed0d5b70ce531e28ea81a8a3b1b07f0f48421a3d9e7d80a"}, + {file = "ruff-0.5.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:db3ca35265de239a1176d56a464b51557fce41095c37d6c406e658cf80bbb362"}, + {file = "ruff-0.5.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b1a321c4f68809fddd9b282fab6a8d8db796b270fff44722589a8b946925a2a8"}, + {file = "ruff-0.5.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c4dfcd8d34b143916994b3876b63d53f56724c03f8c1a33a253b7b1e6bf2a7d"}, + {file = "ruff-0.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81e5facfc9f4a674c6a78c64d38becfbd5e4f739c31fcd9ce44c849f1fad9e4c"}, + {file = "ruff-0.5.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e589e27971c2a3efff3fadafb16e5aef7ff93250f0134ec4b52052b673cf988d"}, + {file = "ruff-0.5.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d2ffbc3715a52b037bcb0f6ff524a9367f642cdc5817944f6af5479bbb2eb50e"}, + {file = "ruff-0.5.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cd096e23c6a4f9c819525a437fa0a99d1c67a1b6bb30948d46f33afbc53596cf"}, + {file = "ruff-0.5.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:46e193b36f2255729ad34a49c9a997d506e58f08555366b2108783b3064a0e1e"}, + {file = "ruff-0.5.0-py3-none-win32.whl", hash = "sha256:49141d267100f5ceff541b4e06552e98527870eafa1acc9dec9139c9ec5af64c"}, + {file = "ruff-0.5.0-py3-none-win_amd64.whl", hash = "sha256:e9118f60091047444c1b90952736ee7b1792910cab56e9b9a9ac20af94cd0440"}, + {file = "ruff-0.5.0-py3-none-win_arm64.whl", hash = "sha256:ed5c4df5c1fb4518abcb57725b576659542bdbe93366f4f329e8f398c4b71178"}, + {file = "ruff-0.5.0.tar.gz", hash = "sha256:eb641b5873492cf9bd45bc9c5ae5320648218e04386a5f0c264ad6ccce8226a1"}, +] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "tornado" +version = "6.4.1" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">=3.8" +files = [ + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"}, + {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"}, + {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"}, + {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "tzdata" +version = "2024.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, +] + +[[package]] +name = "urllib3" +version = "2.2.2" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "virtualenv" +version = "20.26.3" +description = "Virtual Python Environment builder" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"}, + {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"}, +] + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<5" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] + +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.11" +content-hash = "5c832c41828653f3a4246934d425663f62ed5f5fdf789e8223b1191818c82a94" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..5fecaa3 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,40 @@ +[tool.poetry] +name = "metadata-schemas" +version = "0.1.0" +description = "" +authors = ["Mehmood Asghar ", "Gordon Blackadder "] +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.11" +pandas = "^2.2.2" +pydantic = "^2.8.0" +openpyxl = "^3.1.5" +datamodel-code-generator = "^0.25.7" + +[tool.poetry.group.dev.dependencies] +pytest = "^8.2.2" +pre-commit = "^3.7.1" +isort = "^5.13.2" +ruff = "^0.5.0" +black = "^24.4.2" +detect-secrets = "^1.5.0" +ipykernel = "^6.29.5" + +[tool.ruff] +line-length = 120 +fix = true + +[tool.isort] +line_length = 120 +profile = "black" + +[tool.black] +line-length=120 = 120 + +[tool.detect-secrets] +exclude-lines = "\\s*\"image/png\": \".+\"" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" From 0f561aeefd19f7a1697411c0572750f04d8e8e3f Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Tue, 2 Jul 2024 12:21:11 -0400 Subject: [PATCH 02/51] define pydantic schemas --- README.md | 7 + poetry.lock | 90 +- pydantic_schemas/__init__.py | 0 pydantic_schemas/document-schema.py | 611 +++++++ pydantic_schemas/generate_pydantic_schemas.py | 47 + pydantic_schemas/geospatial-schema.py | 1537 +++++++++++++++++ pydantic_schemas/image-schema.py | 1188 +++++++++++++ pydantic_schemas/microdata-schema.py | 1446 ++++++++++++++++ pydantic_schemas/schema_base_model.py | 11 + pydantic_schemas/script-schema.py | 687 ++++++++ pydantic_schemas/series-schema.py | 167 ++ pydantic_schemas/table-schema.py | 535 ++++++ pydantic_schemas/timeseries-db-schema.py | 403 +++++ pydantic_schemas/timeseries-schema.py | 732 ++++++++ pydantic_schemas/video-schema.py | 337 ++++ pyproject.toml | 7 +- 16 files changed, 7802 insertions(+), 3 deletions(-) create mode 100644 pydantic_schemas/__init__.py create mode 100644 pydantic_schemas/document-schema.py create mode 100644 pydantic_schemas/generate_pydantic_schemas.py create mode 100644 pydantic_schemas/geospatial-schema.py create mode 100644 pydantic_schemas/image-schema.py create mode 100644 pydantic_schemas/microdata-schema.py create mode 100644 pydantic_schemas/schema_base_model.py create mode 100644 pydantic_schemas/script-schema.py create mode 100644 pydantic_schemas/series-schema.py create mode 100644 pydantic_schemas/table-schema.py create mode 100644 pydantic_schemas/timeseries-db-schema.py create mode 100644 pydantic_schemas/timeseries-schema.py create mode 100644 pydantic_schemas/video-schema.py diff --git a/README.md b/README.md index b40020f..6d4e3ea 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,10 @@ Metadata JSON Schemas View documentation - https://worldbank.github.io/metadata-schemas/ + + +## Pydantic + +To update the pydantic schemas so that they match the json schemas run + + `python pydantic_schemas\\generate_pydantic_schemas.py` \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index 17bf365..f4dae94 100644 --- a/poetry.lock +++ b/poetry.lock @@ -11,6 +11,26 @@ files = [ {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] +[[package]] +name = "anyio" +version = "4.4.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] + [[package]] name = "appnope" version = "0.1.4" @@ -340,6 +360,7 @@ files = [ argcomplete = ">=1.10,<4.0" black = ">=19.10b0" genson = ">=1.2.1,<2.0" +httpx = {version = "*", optional = true, markers = "extra == \"http\""} inflect = ">=4.1.0,<6.0" isort = ">=4.3.21,<6.0" jinja2 = ">=2.10.1,<4.0" @@ -515,6 +536,62 @@ files = [ {file = "genson-1.3.0.tar.gz", hash = "sha256:e02db9ac2e3fd29e65b5286f7135762e2cd8a986537c075b06fc5f1517308e37"}, ] +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.5" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + +[[package]] +name = "httpx" +version = "0.27.0" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + [[package]] name = "identify" version = "2.5.36" @@ -1587,6 +1664,17 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + [[package]] name = "stack-data" version = "0.6.3" @@ -1714,4 +1802,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "5c832c41828653f3a4246934d425663f62ed5f5fdf789e8223b1191818c82a94" +content-hash = "425661ff008ae6ca9d125ab45757371472e9120f1d3b6fb31131b9dea76352ac" diff --git a/pydantic_schemas/__init__.py b/pydantic_schemas/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pydantic_schemas/document-schema.py b/pydantic_schemas/document-schema.py new file mode 100644 index 0000000..f38cad4 --- /dev/null +++ b/pydantic_schemas/document-schema.py @@ -0,0 +1,611 @@ +# generated by datamodel-codegen: +# filename: document-schema.json +# timestamp: 2024-07-02T16:12:50+00:00 + +from __future__ import annotations + +from enum import Enum +from typing import Any, Dict, List, Optional, Union + +from pydantic import Extra, Field + +from .schema_base_model import SchemaBaseModel + + +class Overwrite(Enum): + """ + Overwrite document if already exists? + """ + + yes = "yes" + no = "no" + + +class Producer(SchemaBaseModel): + name: Optional[str] = Field(None, description="Name (required)", title="Name") + abbr: Optional[str] = Field(None, title="Abbreviation") + affiliation: Optional[str] = Field(None, title="Affiliation") + role: Optional[str] = Field(None, title="Role") + + +class MetadataInformation(SchemaBaseModel): + """ + Document description + """ + + class Config: + extra = Extra.forbid + + title: Optional[str] = Field(None, description="Document title", title="Document title") + idno: Optional[str] = Field(None, title="Unique ID number for the document") + producers: Optional[List[Producer]] = Field(None, description="List of producers", title="Producers") + production_date: Optional[str] = Field( + None, description="Document production date using format(YYYY-MM-DD)", title="Date of Production" + ) + version: Optional[str] = Field( + None, description="Identify and describe the current version of the document", title="Document version" + ) + + +class TitleStatement(SchemaBaseModel): + """ + Study title + """ + + idno: str = Field( + ..., + description="The ID number of a dataset is a unique number that is used to identify a document.", + title="Unique user defined ID", + ) + title: str = Field(..., title="Title") + sub_title: Optional[str] = Field(None, title="Subtitle") + alternate_title: Optional[str] = Field(None, title="Abbreviation or Acronym") + translated_title: Optional[str] = Field(None, title="Translated Title") + + +class AuthorIdItem(SchemaBaseModel): + type: Optional[Any] = Field(None, description="Source of identifier, e.g. ORCID", title="Type") + id: Optional[Any] = Field( + None, description="Author's unique identifier for the corresponding source", title="Identifier" + ) + + +class Author(SchemaBaseModel): + first_name: Optional[str] = Field(None, title="First name") + initial: Optional[str] = Field(None, title="Initial") + last_name: Optional[str] = Field(None, title="Last name") + affiliation: Optional[str] = Field(None, title="Affiliation") + author_id: Optional[List[AuthorIdItem]] = Field( + None, + description="Unique identifier of an author, which may be provided by services like ORCID or other", + title="Author ID", + ) + full_name: Optional[str] = Field( + None, + description=( + "Full name of the author. This element to be used only when first or last name cannot be distinguished." + ), + title="Full name", + ) + + +class Editor(SchemaBaseModel): + first_name: Optional[str] = Field(None, title="First name") + initial: Optional[str] = Field(None, title="Initial") + last_name: Optional[str] = Field(None, title="Last name") + affiliation: Optional[str] = Field(None, title="Affiliation") + + +class Identifier(SchemaBaseModel): + type: Optional[str] = Field( + None, description="Type of identifier e.g. `doi`, `handle`, `other`", title="Identifier type" + ) + identifier: str = Field(..., title="Identifier") + + +class TocStructuredItem(SchemaBaseModel): + id: str = Field(..., title="ID or Number") + parent_id: Optional[str] = Field( + None, description="For sub levels, provide the ID of the parent TOC ID", title="Parent Identifier" + ) + name: str = Field(..., title="Title") + + +class Note(SchemaBaseModel): + note: Optional[str] = Field(None, title="Note") + + +class RefCountryItem(SchemaBaseModel): + name: Optional[str] = Field(None, title="Country name") + code: Optional[str] = Field(None, title="Country code") + + +class GeographicUnit(SchemaBaseModel): + name: str = Field( + ..., description="Name of the geographic unit e.g. 'World', 'Africa', 'Afghanistan'", title="Location name" + ) + code: Optional[str] = Field( + None, description="Code of the geographic unit (for countries, preferred = ISO3 code)", title="Location code" + ) + type: Optional[str] = Field( + None, description="Type of geographic unit e.g. country, state, region, province, town, etc", title="Type" + ) + + +class BboxItem(SchemaBaseModel): + west: Optional[str] = Field(None, title="West") + east: Optional[str] = Field(None, title="East") + south: Optional[str] = Field(None, title="South") + north: Optional[str] = Field(None, title="North") + + +class Language(SchemaBaseModel): + name: str = Field(..., title="Name") + code: Optional[str] = Field(None, title="Code") + + +class LicenseItem(SchemaBaseModel): + name: str = Field(..., title="License") + uri: Optional[str] = Field(None, title="URI") + + +class BibliographicCitationItem(SchemaBaseModel): + style: Optional[str] = Field(None, title="Style") + citation: str = Field(..., title="Citation") + + +class Translator(Editor): + pass + + +class Contributor(SchemaBaseModel): + first_name: Optional[str] = Field(None, title="First name") + initial: Optional[str] = Field(None, title="Initial") + last_name: Optional[str] = Field(None, title="Last name") + affiliation: Optional[str] = Field(None, title="Affiliation") + role: Optional[str] = Field(None, title="Role") + contribution: Optional[str] = Field(None, title="Contribution") + + +class Contact(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + role: Optional[str] = Field(None, title="Role") + affiliation: Optional[str] = Field(None, title="Affiliation") + email: Optional[str] = Field(None, title="Email") + telephone: Optional[str] = Field(None, title="Telephone") + uri: Optional[str] = Field(None, title="URI") + + +class Source(SchemaBaseModel): + source_origin: Optional[str] = Field( + None, + description=( + "For historical materials, information about the origin(s) of the sources and the rules followed in" + " establishing the sources should be specified. May not be relevant to survey data. " + ), + title="Origin of Source", + ) + source_char: Optional[str] = Field( + None, + description="Assessment of characteristics and quality of source material. May not be relevant to survey data.", + title="Characteristics of Source Noted", + ) + source_doc: Optional[str] = Field( + None, description="Documentation and Access to Sources", title="Source documentation" + ) + + +class DataSource(SchemaBaseModel): + name: str = Field(..., title="Dataset name") + uri: Optional[str] = Field(None, description="Link to the dataset", title="URI") + note: Optional[str] = Field(None, title="Note") + + +class Theme(SchemaBaseModel): + id: Optional[str] = Field(None, title="Unique Identifier") + name: str = Field(..., title="Name") + parent_id: Optional[str] = Field(None, title="Parent Identifier") + vocabulary: Optional[str] = Field(None, description="Name of the controlled vocabulary", title="Vocabulary") + uri: Optional[str] = Field( + None, + description="Link to the controlled vocabulary web page, if the theme is from a taxonomy.", + title="Vocabulary URI", + ) + + +class Topic(SchemaBaseModel): + id: Optional[str] = Field(None, title="Unique Identifier") + name: str = Field(..., title="Topic") + parent_id: Optional[str] = Field( + None, description="For subtopics, provide the ID of the parent topic", title="Parent topic Identifier" + ) + vocabulary: Optional[str] = Field( + None, description="Name of the controlled vocabulary, if the topic is from a taxonomy.", title="Vocabulary" + ) + uri: Optional[str] = Field( + None, + description="Link to the controlled vocabulary web page, if the topic is from a taxonomy.", + title="Vocabulary URI", + ) + + +class Discipline(SchemaBaseModel): + id: Optional[str] = Field(None, title="Unique Identifier") + name: str = Field(..., title="Discipline title or name") + parent_id: Optional[str] = Field(None, description="Parent discipline ID", title="Parent discipline Identifier") + vocabulary: Optional[str] = Field(None, description="Vocabulary", title="Vocabulary") + uri: Optional[str] = Field(None, description="Website link", title="URI") + + +class Type(Enum): + isPartOf = "isPartOf" + hasPart = "hasPart" + isVersionOf = "isVersionOf" + isFormatOf = "isFormatOf" + hasFormat = "hasFormat" + references = "references" + isReferencedBy = "isReferencedBy" + isBasedOn = "isBasedOn" + isBasisFor = "isBasisFor" + requires = "requires" + isRequiredBy = "isRequiredBy" + + +class Relation(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + type: Optional[Type] = Field(None, title="Type") + + +class Link(SchemaBaseModel): + uri: str = Field(..., title="URI") + description: Optional[str] = Field(None, title="Description") + + +class Reproducibility(SchemaBaseModel): + statement: Optional[str] = Field(None, title="Statement") + links: Optional[List[Link]] = Field(None, title="Link") + + +class Tag(SchemaBaseModel): + tag: Optional[str] = Field(None, title="Tag") + tag_group: Optional[str] = Field(None, title="Tag group") + + +class ModelInfoItem(SchemaBaseModel): + source: Optional[str] = Field(None, title="Source") + author: Optional[str] = Field(None, title="Author") + version: Optional[str] = Field(None, title="Version") + model_id: Optional[str] = Field(None, title="Model Identifier") + nb_topics: Optional[float] = Field(None, title="Number of topics") + description: Optional[str] = Field(None, title="Description") + corpus: Optional[str] = Field(None, title="Corpus name") + uri: Optional[str] = Field(None, title="URI") + + +class TopicWord(SchemaBaseModel): + word: Optional[str] = Field(None, title="Word") + word_weight: Optional[float] = Field(None, title="Word weight") + + +class TopicDescriptionItem(SchemaBaseModel): + topic_id: Optional[Union[int, str]] = Field(None, title="Topic identifier") + topic_score: Optional[Union[float, str]] = Field(None, title="Topic score") + topic_label: Optional[str] = Field(None, title="Topic label") + topic_words: Optional[List[TopicWord]] = Field(None, description="Words", title="Topic words") + + +class LdaTopic(SchemaBaseModel): + class Config: + extra = Extra.forbid + + model_info: Optional[List[ModelInfoItem]] = Field(None, title="Model information") + topic_description: Optional[List[TopicDescriptionItem]] = Field(None, title="Topic information") + + +class Embedding(SchemaBaseModel): + id: str = Field(..., title="Vector Model ID") + description: Optional[str] = Field(None, title="Vector Model Description") + date: Optional[str] = Field(None, title="Date (YYYY-MM-DD)") + vector: Union[Dict[str, Any], List[Any]] = Field(..., title="Vector") + + +class OriginDescription(SchemaBaseModel): + harvest_date: Optional[str] = Field(None, description="Harvest date using UTC date format") + altered: Optional[bool] = Field( + None, description="If the metadata was altered before dissemination", title="Metadata altered" + ) + base_url: Optional[str] = Field(None, description="Base URL of the originating repository") + identifier: Optional[str] = Field(None, description="Unique idenifiter of the item from the originating repository") + date_stamp: Optional[str] = Field( + None, + description="Datestamp (UTC date format) of the metadata record disseminated by the originating repository", + ) + metadata_namespace: Optional[str] = Field( + None, + description=( + "Metadata namespace URI of the metadata format of the record harvested from the originating repository" + ), + ) + + +class ProvenanceSchema(SchemaBaseModel): + """ + Provenance of metadata based on the OAI provenance schema (http://www.openarchives.org/OAI/2.0/provenance.xsd) + """ + + origin_description: Optional[OriginDescription] = Field(None, title="Origin description") + + +class KeywordItem(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + vocabulary: Optional[str] = Field(None, title="Vocabulary name") + uri: Optional[str] = Field(None, title="Vocabulary URI") + + +class Keyword(SchemaBaseModel): + __root__: List[KeywordItem] + + +class DocumentDescription(SchemaBaseModel): + """ + Document Description + """ + + class Config: + extra = Extra.forbid + + title_statement: TitleStatement = Field(..., description="Study title") + authors: Optional[List[Author]] = Field(None, description="Authors", title="Authors") + editors: Optional[List[Editor]] = Field(None, description="Editors", title="Editors") + date_created: Optional[str] = Field(None, description="Date of creation", title="Date created") + date_available: Optional[str] = Field( + None, + description="Date (often a range) that the resource will become or did become available.", + title="Date available", + ) + date_modified: Optional[str] = Field( + None, description="Date on which the resource was changed.", title="Date last modified" + ) + date_published: Optional[str] = Field( + None, description="Date on which document was published.", title="Date published" + ) + identifiers: Optional[List[Identifier]] = Field(None, description="Other identifiers", title="Other identifiers") + type: Optional[str] = Field( + None, + description=( + "Valid values include - `article`, `book`, `booklet`, `collection`, `conference`, `inbook`, `incollection`," + " `inproceeding`,`manual`, `masterthesis`, `patent`, `phdthesis`, `proceedings`, `techreport`," + " `working-paper`, `website`, `other` " + ), + title="Resource type", + ) + status: Optional[str] = Field( + None, + description=( + "Status of the document - e.g. `Draft`, `Draft released for comment`, `Final draft released for comment`," + " `Final` " + ), + title="Status", + ) + description: Optional[str] = Field( + None, description="An account of the content of the resource.", title="Description" + ) + toc: Optional[str] = Field(None, description="Table of contents", title="Table of contents") + toc_structured: Optional[List[TocStructuredItem]] = Field( + None, description="Table of contents", title="Table of contents" + ) + abstract: Optional[str] = Field(None, description="A summary of the content", title="Abstract") + notes: Optional[List[Note]] = Field(None, title="Notes") + scope: Optional[str] = Field( + None, + description=( + "The extent or scope of the content of the resource. This fields maps to Dublin Core's coverage field." + ), + title="Scope", + ) + ref_country: Optional[List[RefCountryItem]] = Field(None, title="Reference country") + geographic_units: Optional[List[GeographicUnit]] = Field( + None, + description=( + "List of geographic locations (regions, countries, states, provinces, etc.) describing the geographic" + " coverahe of the research project." + ), + title="Geographic locations", + ) + bbox: Optional[List[BboxItem]] = Field(None, title="Geographic bounding box") + spatial_coverage: Optional[str] = Field( + None, description="The spatial extent or scope of the content of the resource.", title="Spatial coverage" + ) + temporal_coverage: Optional[str] = Field( + None, description="The temporal extent or scope of the content of the resource.", title="Temporal coverage" + ) + publication_frequency: Optional[str] = Field( + None, + description=( + "Current stated publication frequency of either an item or an update to an item. Dates are included when" + " the beginning date of the current frequency is not the same as the beginning date of publication." + ), + title="Publication frequency", + ) + languages: Optional[List[Language]] = Field( + None, description="Documentation language e.g. English, French, etc.", title="Language" + ) + license: Optional[List[LicenseItem]] = Field(None, title="License") + bibliographic_citation: Optional[List[BibliographicCitationItem]] = Field( + None, description="A bibliographic reference for the resource.", title="Bibliographic citation" + ) + chapter: Optional[str] = Field(None, description="A chapter or section number", title="Chapter number") + edition: Optional[str] = Field(None, description="The edition of a book", title="Edition") + institution: Optional[str] = Field( + None, description="The sponsoring institution of a document.", title="Institution" + ) + journal: Optional[str] = Field(None, description="Name of the Journal", title="Journal name") + volume: Optional[str] = Field(None, description="Volume number", title="Volume number") + number: Optional[str] = Field( + None, + description=( + "The number of a journal, magazine, technical report, or of a work in a series. An issue of a journal or" + " magazine is usually identified by its volume and number; the organization that issues a technical report" + " usually gives it a number; and sometimes books are given numbers in a named series." + ), + title="Number", + ) + pages: Optional[str] = Field( + None, + description="One or more page numbers or ranges of number, such as 37--42, or 7,53,82--94", + title="Page numbers", + ) + series: Optional[str] = Field( + None, + description=( + "The name given to a series or set of books. When citing an entire book, the title field gives its title" + " and the optional series field gives the name of a series in which the book was published." + ), + title="Series name", + ) + publisher: Optional[str] = Field( + None, description="Entity responsible for making the resource available", title="Publisher" + ) + publisher_address: Optional[str] = Field( + None, + description=( + "For major publishing houses, just the city is given. For small publishers, you can help the reader by" + " giving the complete address." + ), + title="Publisher's address", + ) + annote: Optional[str] = Field( + None, + description=( + "For annotation, element will not be used by standard bibliography styles like the MLA, APA or Chicago, but" + " may be used by others that produce an annotated bibliography." + ), + title="Annotation", + ) + booktitle: Optional[str] = Field( + None, description="Title of a book, part of which is being cited", title="Book title" + ) + crossref: Optional[str] = Field( + None, description="The database key of the entry being cross referenced", title="Book title" + ) + howpublished: Optional[str] = Field( + None, + description=( + "The element is used to store the notice for unusual publications. The first word should be capitalized." + " For example, `WebPage`, or `Distributed at the local tourist office`" + ), + title="Store the notice for unusual publications", + ) + key: Optional[str] = Field( + None, + description=( + "A key is a field used for alphabetizing, cross referencing, and creating a label when the `author'" + " information is missing" + ), + title="Key", + ) + organization: Optional[str] = Field( + None, description="The organization that sponsors a conference or that publishes a manual", title="Organization" + ) + url: Optional[Union[str, List[Any]]] = Field( + None, description="URL of the document, preferably a permanent URL", title="URL" + ) + translators: Optional[List[Translator]] = Field(None, description="Translators", title="Translators") + contributors: Optional[List[Contributor]] = Field(None, description="Contributors", title="Contributors") + contacts: Optional[List[Contact]] = Field(None, description="Contacts", title="Contacts") + rights: Optional[str] = Field( + None, description="Information about rights held in and over the resource.", title="Rights" + ) + copyright: Optional[str] = Field( + None, + description=( + "Statement and identifier indicating the legal ownership and rights regarding use and re-use of all or part" + " of the resource." + ), + title="Copyright", + ) + usage_terms: Optional[str] = Field( + None, description="Terms Governing Use and Reproduction", title="Terms governing use and reproduction" + ) + disclaimer: Optional[str] = Field(None, description="Disclaimer", title="Disclaimer") + security_classification: Optional[str] = Field( + None, + description=( + "Specifics pertaining to the security classification associated with the document, title, abstract," + " contents note, and/or the author. In addition, it can contain handling instructions and external" + " dissemination information pertaining to the dissemination of the document, title, abstract, contents" + " note, and author." + ), + title="Security classification control", + ) + access_restrictions: Optional[str] = Field( + None, + description="Information about restrictions imposed on access to the described materials.", + title="Restrictions on Access", + ) + sources: Optional[List[Source]] = Field( + None, + description=( + "Description of sources used. The element is nestable so that the sources statement might encompass a" + " series of discrete source statements, each of which could contain the facts about an individual source. " + ), + title="Sources", + ) + data_sources: Optional[List[DataSource]] = Field( + None, + description=( + "Used to list the book(s), article(s), serial(s), and/or machine-readable data file(s)--if any--that served" + " as the source(s) of the data collection." + ), + title="Data Sources", + ) + keywords: Optional[Keyword] = Field(None, description="Keywords", title="Keywords") + themes: Optional[List[Theme]] = Field(None, description="Themes") + topics: Optional[List[Topic]] = Field( + None, + description="Topics covered by the table (ideally, the list of topics will be a controlled vocabulary)", + title="Topics", + ) + disciplines: Optional[List[Discipline]] = Field( + None, + description="Disciplines e.g. `Social sciences, economics`, `Natural sciences, biology`", + title="Disciplines", + ) + audience: Optional[str] = Field( + None, description="A category of user for whom the resource is intended.", title="Audience" + ) + mandate: Optional[str] = Field( + None, description="A category of user for whom the resource is intended.", title="Audience" + ) + pricing: Optional[str] = Field( + None, + description="Current price of an item or the special export price of an item in any currency.", + title="Pricing", + ) + relations: Optional[List[Relation]] = Field(None, description="Related documents", title="Document relations") + reproducibility: Optional[Reproducibility] = Field(None, title="Reproducibility") + + +class ScriptSchemaDraft(SchemaBaseModel): + """ + Schema for Document data type + """ + + repositoryid: Optional[str] = Field( + None, + description="Abbreviation for the collection that owns the document", + title="Collection ID that owns the document", + ) + published: Optional[int] = Field(0, description="Status - 0=draft, 1=published", title="Status") + overwrite: Optional[Overwrite] = Field("no", description="Overwrite document if already exists?") + metadata_information: Optional[MetadataInformation] = Field( + None, description="Document description", title="Document metadata information" + ) + document_description: DocumentDescription = Field( + ..., description="Document Description", title="Document Description" + ) + provenance: Optional[List[ProvenanceSchema]] = Field(None, description="Provenance") + tags: Optional[List[Tag]] = Field(None, description="Tags", title="Tags") + lda_topics: Optional[List[LdaTopic]] = Field(None, description="LDA topics", title="LDA topics") + embeddings: Optional[List[Embedding]] = Field(None, description="Word embeddings", title="Word embeddings") + additional: Optional[Dict[str, Any]] = Field(None, description="Additional metadata") diff --git a/pydantic_schemas/generate_pydantic_schemas.py b/pydantic_schemas/generate_pydantic_schemas.py new file mode 100644 index 0000000..2add3d7 --- /dev/null +++ b/pydantic_schemas/generate_pydantic_schemas.py @@ -0,0 +1,47 @@ +import os +from subprocess import run + +SCHEMA_DIR = "schemas" +OUTPUT_DIR = "pydantic_schemas" +PYTHON_VERSION = "3.11" +BASE_CLASS = ".schema_base_model.SchemaBaseModel" +INPUTS = [ + "document-schema.json", + "geospatial-schema.json", + "image-schema.json", + "microdata-schema.json", + "script-schema.json", + "series-schema.json", + "table-schema.json", + "timeseries-db-schema.json", + "timeseries-schema.json", + "video-schema.json", +] + + +if not os.path.exists(OUTPUT_DIR): + os.makedirs(OUTPUT_DIR) + +for input_file in INPUTS: + 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) + run( + [ + "datamodel-codegen", + "--input", + input_path, + "--input-file-type", + "jsonschema", + "--reuse-model", + "--use-schema-description", + "--target-python-version", + PYTHON_VERSION, + "--use-double-quotes", + "--wrap-string-literal", + "--base-class", + BASE_CLASS, + "--output", + output_path, + ] + ) diff --git a/pydantic_schemas/geospatial-schema.py b/pydantic_schemas/geospatial-schema.py new file mode 100644 index 0000000..9024010 --- /dev/null +++ b/pydantic_schemas/geospatial-schema.py @@ -0,0 +1,1537 @@ +# generated by datamodel-codegen: +# filename: geospatial-schema.json +# timestamp: 2024-07-02T16:12:52+00:00 + +from __future__ import annotations + +from enum import Enum +from typing import Any, Dict, List, Optional, Union + +from pydantic import Extra, Field, confloat + +from .schema_base_model import SchemaBaseModel + + +class Overwrite(Enum): + """ + Overwrite if already exists? + """ + + yes = "yes" + no = "no" + + +class Producer(SchemaBaseModel): + name: Optional[str] = Field(None, description="Name (required)", title="Name") + abbr: Optional[str] = Field(None, title="Abbreviation") + affiliation: Optional[str] = Field(None, title="Affiliation") + role: Optional[str] = Field(None, title="Role") + + +class MetadataInformation(SchemaBaseModel): + """ + Document description + """ + + class Config: + extra = Extra.forbid + + title: Optional[str] = Field(None, description="Document title", title="Document title") + idno: Optional[str] = Field(None, title="Unique ID number for the document") + producers: Optional[List[Producer]] = Field(None, description="List of producers", title="Producers") + production_date: Optional[str] = Field( + None, description="Document production date using format(YYYY-MM-DD)", title="Date of Production" + ) + version: Optional[str] = Field( + None, description="Identify and describe the current version of the document", title="Document version" + ) + + +class GeometricObject(SchemaBaseModel): + """ + Definition of the geometric objects including the geometry type and count + """ + + geometricObjectType: Optional[str] = Field( + None, + description=( + "Identification of the objects used to represent features in the vector spatial dataset. Codelist value" + " according to the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_GeometricObjectTypeCode)" + " GeometricObjectType codelist. Possible values: {`complex`, `composite`, `curve`, `point`, `solid`," + " `surface`}" + ), + title="Geometric Object Type", + ) + geometricObjectCount: Optional[int] = Field( + None, description="Number of geometric objects available for the resource", title="Geometric Object count" + ) + + +class VectorSpatialRepresentation(SchemaBaseModel): + """ + Vector Resource spatial representation - Spatial representation information for the dataset (resource). Best practice is to include metadata for spatial representation if the described resource is a georeferenced vector dataset. + """ + + topologyLevel: Optional[str] = Field( + None, + description=( + "Topology level associated to the vector resource. Codelist value according to the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_TopologyLevelCode) TopologyLevel" + " codelist. Possible values: {`geometryOnly`, `topology1D`, `planarGraph`, `fullPlanarGraph`," + " `surfaceGraph`, `fullSurfaceGraph`, `topology3D`, `fullTopology3D`, `abstract`}" + ), + title="Topology Level", + ) + geometricObjects: Optional[List[GeometricObject]] = Field( + None, + description="Definition(s) of the geometric objects including the geometry type and count", + title="Geometric objects definition(s)", + ) + + +class Resolution(SchemaBaseModel): + """ + Resolution associated to the dimension. The resolution is handled as 'measure' which could be either a length, distance [special measure of length), angle or scale. + """ + + uom: Optional[str] = Field(None, description="Unit considered for the resolution measure", title="Unit Of Measure") + + +class AxisDimensionProperty(SchemaBaseModel): + dimensionName: Optional[str] = Field( + None, + description=( + "name type of the dimension. Codelist value according to the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_DimensionNameTypeCode)" + " DimensionNameType codelist. Possible values: {`row`, `column`, `vertical`, `track`, `crossTrack`, `line`," + " `sample`, `time`}" + ), + title="Dimension name type", + ) + dimensionSize: Optional[int] = Field(None, description="Size of the dimension", title="Dimension size") + resolution: Optional[Resolution] = Field( + None, + description=( + "Resolution associated to the dimension. The resolution is handled as 'measure' which could be either a" + " length, distance [special measure of length), angle or scale." + ), + title="Dimension resolution", + ) + + +class GridSpatialRepresentation(SchemaBaseModel): + """ + Grid Resource spatial representation - Spatial representation information for the dataset (resource). Best practice is to include metadata for spatial representation if the described resource is a georeferenced gridded / raster dataset. + """ + + numberOfDimensions: Optional[int] = Field( + None, description="Number of dimensions in the grid", title="Number of dimensions" + ) + axisDimensionProperties: Optional[List[AxisDimensionProperty]] = Field( + None, description="Properties of the axis dimensions", title="Axis dimension properties" + ) + cellGeometry: Optional[str] = Field( + None, + description=( + "Type of geometry used for the grid cells. Codelist value according to the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_CellGeometryCode)" + " CellGeometryCode codelist. Possible values: {`point`, `area`, `voxel`, `stratum`}" + ), + title="Cell geometry", + ) + transformationParameterAvailability: Optional[bool] = Field( + None, + description="Indicates whether grid transformation parameters are available", + title="Transformation Parameter Availability", + ) + + +class SpatialRepresentationInfoItem(SchemaBaseModel): + vectorSpatialRepresentation: Optional[VectorSpatialRepresentation] = Field( + None, + description=( + "Vector Resource spatial representation - Spatial representation information for the dataset (resource)." + " Best practice is to include metadata for spatial representation if the described resource is a" + " georeferenced vector dataset." + ), + ) + gridSpatialRepresentation: Optional[GridSpatialRepresentation] = Field( + None, + description=( + "Grid Resource spatial representation - Spatial representation information for the dataset (resource)." + " Best practice is to include metadata for spatial representation if the described resource is a" + " georeferenced gridded / raster dataset." + ), + ) + + +class AssociationType(SchemaBaseModel): + """ + Type of association between the dataset resource and the aggregate Resource + """ + + codeListValue: Optional[str] = Field( + None, + title=( + "Association type, eg. 'isComposedOf'. Recommended code following the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#DS_AssociationTypeCode)" + " AssociationType codelist. Suggested values: {crossReference, largerWorkCitation, partOfSeamlessDatabase," + " source, stereoMate, isComposedOf, collectiveTitle, series, dependency, revisionOf}" + ), + ) + codeList: Optional[str] = Field( + None, + title=( + "Codelist used for association types. Recommended URI:" + " http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#DS_AssociationTypeCode" + ), + ) + codeSpace: Optional[str] = Field( + None, title="Codespace of the association types codelist. Recommended value: ISOTC211/19115" + ) + + +class InitiativeType(SchemaBaseModel): + """ + Type of initative behind the aggregate Resource + """ + + codeListValue: Optional[str] = Field( + None, + title=( + "Initiative type, eg. 'collection'. Recommended code following the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#DS_InitiativeTypeCode)" + " InitiativeType codelist. Suggested values: {campaign, collection, dataDictionary, exercise, experiment," + " investigation, mission, sensor, operation, platform, process, program, project, sciencePaper, study," + " task, trial, userGuide}" + ), + ) + codeList: Optional[str] = Field( + None, + title=( + "Codelist used for initiative types. Recommended URI:" + " http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#DS_InitiativeTypeCode" + ), + ) + codeSpace: Optional[str] = Field( + None, title="Codespace of the initiative types codelist. Recommended value: ISOTC211/19115" + ) + + +class AggregationInfo(SchemaBaseModel): + """ + Identification of aggregate that encompasses the described resource, eg. data collection + """ + + aggregateDataSetName: Optional[str] = Field(None, title="Name of the Aggregate dataset") + aggregateDataSetIdentifier: Optional[str] = Field(None, title="Identifier of the Aggregate dataset") + associationType: Optional[AssociationType] = Field( + None, + description="Type of association between the dataset resource and the aggregate Resource", + title="Association type", + ) + initiativeType: Optional[InitiativeType] = Field( + None, description="Type of initative behind the aggregate Resource", title="Initiative type" + ) + + +class GeographicBoundingBox(SchemaBaseModel): + westBoundLongitude: Optional[confloat(ge=-180.0, le=180.0)] = Field(None, title="West") + eastBoundLongitude: Optional[confloat(ge=-180.0, le=180.0)] = Field(None, title="East") + southBoundLatitude: Optional[confloat(ge=-180.0, le=180.0)] = Field(None, title="South") + northBoundLatitude: Optional[confloat(ge=-180.0, le=180.0)] = Field(None, title="North") + + +class GeographicElementItem(SchemaBaseModel): + geographicBoundingBox: Optional[GeographicBoundingBox] = Field(None, title="Geographic Bounding Box") + geographicDescription: Optional[str] = Field(None, title="Geographic description identifier") + + +class TemporalElementItem(SchemaBaseModel): + extent: Optional[Any] = None + + +class VerticalElementItem(SchemaBaseModel): + minimumValue: Optional[float] = Field(None, title="Minimum vertical value") + maximumValue: Optional[float] = Field(None, title="Maximum vertical value") + verticalCRS: Optional[Any] = Field( + None, + description="Vertical coordinate reference system used (as defined in the ISO 19136 / GML standard", + title="Vertical CRS", + ) + + +class Extent(SchemaBaseModel): + """ + Defines the spatial (horizontal and vertical) and temporal region to which the content of the resource applies. + """ + + geographicElement: Optional[List[GeographicElementItem]] = Field( + None, description="Geographic extent(s)", title="Geographic extent(s)" + ) + temporalElement: Optional[List[TemporalElementItem]] = Field(None, title="Temporal extent(s)") + verticalElement: Optional[List[VerticalElementItem]] = Field(None, title="Vertical extent(s)") + + +class SpatialResolution(SchemaBaseModel): + """ + Spatial resolution of the resource + """ + + uom: Optional[str] = Field(None, description="Unit considered for the resolution measure", title="Unit Of Measure") + + +class AccessProperties(SchemaBaseModel): + fees: Optional[str] = Field(None, description="Eventual fees associated with the service", title="Fees") + plannedAvailableDateTime: Optional[str] = Field( + None, + description=( + "Date and time when the metadata record was created or updated. Requires an extended ISO 8601 formatted" + " combined UTC date and time string (2009-11-17T10:00:00)" + ), + title="Service availability Date Stamp", + ) + orderingInstructions: Optional[str] = Field( + None, description="Eventual instructions for the ordering", title="Ordering instructions" + ) + turnaround: Optional[str] = Field(None, description="Turnaround", title="Turnaround") + + +class CoupledResourceItem(SchemaBaseModel): + operationName: Optional[str] = Field(None, title="Operation name") + identifier: Optional[str] = Field(None, title="Identifier of the coupled resource") + + +class CouplingType(SchemaBaseModel): + """ + Coupling type + """ + + codeListValue: Optional[str] = Field( + None, + title=( + "Coupling type, eg. 'loose'. Recommended code following the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#SV_CouplingTypeCode) CouplingType" + " codelist. Suggested values: {loose, mixed, tight}" + ), + ) + codeList: Optional[str] = Field( + None, + title=( + "Codelist used for coupling types. Recommended URI:" + " http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#SV_CouplingTypeCode" + ), + ) + codeSpace: Optional[str] = Field( + None, title="Codespace of the coupling types codelist. Recommended value: ISOTC211/19119" + ) + + +class OperatesOnItem(SchemaBaseModel): + """ + Operates On relationship + """ + + uuidref: Optional[str] = Field(None, title="Unique dataset identifier within the same catalogue") + + +class ContentType(SchemaBaseModel): + """ + Type of coverage content + """ + + codeListValue: Optional[str] = Field( + None, + title=( + "Type of coverage content, eg. 'image'. Recommended code following the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_CoverageContentTypeCode) Coverage" + " content type codelist. Suggested values: {image, thematicClassification, physicalMeasurement," + " auxillaryInformation, qualityInformation, referenceInformation, modelResult, coordinate, auxilliaryData}" + ), + ) + codeList: Optional[str] = Field( + None, + title=( + "Codelist used for coverage content types. Recommended URI:" + " http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_CoverageContentTypeCode" + ), + ) + codeSpace: Optional[str] = Field( + None, title="Codespace of the coverage content types codelist. Recommended value: ISOTC211/19115" + ) + + +class DimensionItem(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + type: Optional[str] = Field(None, title="Dimension type") + + +class CoverageDescription(SchemaBaseModel): + """ + description of the coverage (grid/raster), ie. the definition of the grid/raster data structure + """ + + contentType: Optional[ContentType] = Field( + None, description="Type of coverage content", title="Coverage content type" + ) + dimension: Optional[List[DimensionItem]] = Field(None, title="Coverage dimensions") + + +class Cardinality(SchemaBaseModel): + """ + Definition of the member type cardinality + """ + + lower: Optional[int] = Field(None, description="Lower cardinality range value", title="Lower cardinality") + upper: Optional[int] = Field(None, description="Upper cardinality range value", title="Upper cardinality") + + +class ListedValueItem(SchemaBaseModel): + label: Optional[str] = Field(None, description="a label for the value", title="Value label") + code: Optional[str] = Field(None, description="a code for the value", title="Value code") + definition: Optional[str] = Field(None, description="a definition for the value", title="Value definition") + + +class CarrierOfCharacteristic(SchemaBaseModel): + memberName: Optional[str] = Field( + None, description="Name of the property member of the feature type", title="Member name" + ) + definition: Optional[str] = Field( + None, description="Definition of the property member of the feature type", title="Definition" + ) + cardinality: Optional[Cardinality] = Field( + None, description="Definition of the member type cardinality", title="Cardinality" + ) + code: Optional[str] = Field(None, description="Code for the attribute member of the feature type", title="Code") + valueMeasurementUnit: Optional[str] = Field( + None, description="Measurement unit of the values (in case of variable)", title="Value measurement unit" + ) + valueType: Optional[str] = Field( + None, + description=( + "Type of value. A good practice is to rely on primitive data types defined in the XML Schema" + " https://www.w3.org/2009/XMLSchema/XMLSchema.xsd" + ), + title="Value type", + ) + listedValue: Optional[List[ListedValueItem]] = Field( + None, description="List of controlled value(s) used in te attribute member", title="Listed value(s)" + ) + + +class FeatureTypeItem(SchemaBaseModel): + typeName: Optional[str] = Field( + None, + description=( + "text string that uniquely identifies this feature type within the feature catalogue that contains this" + " feature type" + ), + title="Type name", + ) + definition: Optional[str] = Field( + None, description="definition of the feature type in a natural language", title="Definition" + ) + code: Optional[str] = Field( + None, + description=( + "code that uniquely identifies this feature type within the feature catalogue that contains this feature" + " type" + ), + title="Code", + ) + isAbstract: Optional[bool] = Field( + None, description="indicates if the feature type is abstract or not", title="Is abstract" + ) + aliases: Optional[List[str]] = Field(None, description="equivalent name(s) of this feature type", title="Alias(es)") + carrierOfCharacteristics: Optional[List[CarrierOfCharacteristic]] = Field( + None, + description="links this feature type to the property types that it contains", + title="Carrier(s) of characteristics", + ) + + +class Tag(SchemaBaseModel): + tag: Optional[str] = Field(None, title="Tag") + tag_group: Optional[str] = Field(None, title="Tag group") + + +class ModelInfoItem(SchemaBaseModel): + source: Optional[str] = Field(None, title="Source") + author: Optional[str] = Field(None, title="Author") + version: Optional[str] = Field(None, title="Version") + model_id: Optional[str] = Field(None, title="Model Identifier") + nb_topics: Optional[float] = Field(None, title="Number of topics") + description: Optional[str] = Field(None, title="Description") + corpus: Optional[str] = Field(None, title="Corpus name") + uri: Optional[str] = Field(None, title="URI") + + +class TopicWord(SchemaBaseModel): + word: Optional[str] = Field(None, title="Word") + word_weight: Optional[float] = Field(None, title="Word weight") + + +class TopicDescriptionItem(SchemaBaseModel): + topic_id: Optional[Union[int, str]] = Field(None, title="Topic identifier") + topic_score: Optional[Union[float, str]] = Field(None, title="Topic score") + topic_label: Optional[str] = Field(None, title="Topic label") + topic_words: Optional[List[TopicWord]] = Field(None, description="Words", title="Topic words") + + +class LdaTopic(SchemaBaseModel): + class Config: + extra = Extra.forbid + + model_info: Optional[List[ModelInfoItem]] = Field(None, title="Model information") + topic_description: Optional[List[TopicDescriptionItem]] = Field(None, title="Topic information") + + +class Embedding(SchemaBaseModel): + id: str = Field(..., title="Vector Model ID") + description: Optional[str] = Field(None, title="Vector Model Description") + date: Optional[str] = Field(None, title="Date (YYYY-MM-DD)") + vector: Dict[str, Any] = Field(..., title="Vector") + + +class ResourceSchema(SchemaBaseModel): + """ + External resource schema + """ + + dctype: Optional[str] = Field( + "doc/oth", + description=( + "Document types for external resource e.g. `doc/adm` \n* `doc/adm` - Document, Administrative [doc/adm] \n*" + " `doc/anl` - Document, Analytical [doc/anl] \n* `doc/oth` - Document, Other [doc/oth] \n* `doc/qst` -" + " Document, Questionnaire [doc/qst] \n* `doc/ref` - Document, Reference [doc/ref] \n* `doc/rep` - Document," + " Report [doc/rep] \n* `doc/tec` - Document, Technical [doc/tec] \n* `aud` - Audio [aud]\n* `dat` -" + " Database [dat]\n* `map` - Map [map]\n* `dat/micro` - Microdata File [dat/micro]\n* `pic` - Photo [pic]\n*" + " `prg` - Program [prg]\n* `tbl` - Table [tbl]\n* `vid` - Video [vid] \n* `web` - Web Site [web]" + ), + title="Resource type", + ) + dcformat: Optional[str] = Field( + None, + description=( + "Document file format e.g. `application/zip` \n* `application/x-compressed` - Compressed, Generic \n*" + " `application/zip` - Compressed, ZIP \n* `application/x-cspro` - Data, CSPro \n* `application/dbase` -" + " Data, dBase \n* `application/msaccess` - Data, Microsoft Access \n* `application/x-sas` - Data, SAS " + " \n* `application/x-spss` - Data, SPSS \n* `application/x-stata` - Data, Stata \n* `text` - Document," + " Generic \n* `text/html` - Document, HTML \n* `application/msexcel` - Document, Microsoft Excel \n*" + " `application/mspowerpoint` - Document, Microsoft PowerPoint \n* `application/msword` - Document," + " Microsoft Word \n* `application/pdf` - Document, PDF \n* `application/postscript` - Document," + " Postscript \n* `text/plain` - Document, Plain \n* `text/wordperfect` - Document, WordPerfect \n*" + " `image/gif` - Image, GIF \n* `image/jpeg` - Image, JPEG \n* `image/png` - Image, PNG \n*" + " `image/tiff` - Image, TIFF" + ), + title="Resource Format", + ) + title: str = Field(..., description="Title") + author: Optional[str] = Field(None, description="Author") + dcdate: Optional[str] = Field(None, description="Date") + country: Optional[str] = Field(None, description="Country") + language: Optional[str] = Field(None, description="Language") + contributor: Optional[str] = Field(None, description="Contributor") + publisher: Optional[str] = Field(None, description="Publisher") + rights: Optional[str] = Field(None, description="Rights") + description: Optional[str] = Field(None, description="Description") + abstract: Optional[str] = Field(None, description="Abstract") + toc: Optional[str] = Field(None, description="TOC") + filename: Optional[str] = Field( + None, + description=( + "Resource file name or URL. For uploading a file, use the field `file` in formData or use the `Upload file`" + " endpoint." + ), + ) + + +class OriginDescription(SchemaBaseModel): + harvest_date: Optional[str] = Field(None, description="Harvest date using UTC date format") + altered: Optional[bool] = Field( + None, description="If the metadata was altered before dissemination", title="Metadata altered" + ) + base_url: Optional[str] = Field(None, description="Base URL of the originating repository") + identifier: Optional[str] = Field(None, description="Unique idenifiter of the item from the originating repository") + date_stamp: Optional[str] = Field( + None, + description="Datestamp (UTC date format) of the metadata record disseminated by the originating repository", + ) + metadata_namespace: Optional[str] = Field( + None, + description=( + "Metadata namespace URI of the metadata format of the record harvested from the originating repository" + ), + ) + + +class ProvenanceSchema(SchemaBaseModel): + """ + Provenance of metadata based on the OAI provenance schema (http://www.openarchives.org/OAI/2.0/provenance.xsd) + """ + + origin_description: Optional[OriginDescription] = Field(None, title="Origin description") + + +class Language(SchemaBaseModel): + __root__: str = Field( + ..., + description=( + "Language of the resource. Preferred code following the [ISO 639-2](http://www.loc.gov/standards/iso639-2/)" + " (alpha-3 code)" + ), + title="Language", + ) + + +class CharacterSet(SchemaBaseModel): + """ + Character encoding used e.g. UTF-8 + """ + + codeListValue: Optional[str] = Field( + None, + title=( + "Character set code, e.g 'utf8'. Recommended code following the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_CharacterSetCode) CharacterSet" + " codelist" + ), + ) + codeList: Optional[str] = Field( + None, + title=( + "Codelist used for character sets. Recommended URI:" + " http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_CharacterSetCode" + ), + ) + + +class TopicCategory(SchemaBaseModel): + __root__: str = Field( + ..., + description=( + "Topic category of the resource. e.g. `owner`. Recommended code following the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_TopicCategoryCode) TopicCategory" + " codelist. Suggested values: {`farming`, `biota`, `boundaries`, `climatologyMeteorologyAtmosphere`," + " `economy`, `elevation`, `environment`, `geoscientificInformation`, `health`, `imageryBaseMapsEarthCover`," + " `intelligenceMilitary`, `inlandWaters`, `location`, `oceans`, `planningCadastre`, `society`, `structure`," + " `transportation`, `utilitiesCommunication`, `extraTerrestrial`, `disaster`}" + ), + title="Topic Category", + ) + + +class Scope(SchemaBaseModel): + __root__: str = Field( + ..., + description=( + "Scope(s), or 'hierarchy level(s)' applicable to the dataset description e.g. dataset, series. Recommended" + " code following the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MX_ScopeCode) Scope codelist." + " Suggested values: `attribute`, `attributeType`, `collectionHardware`, `collectionSession`, `dataset`," + " `series`, `nonGeographicDataset`, `dimensionGroup`, `feature`, `featureType`, `propertyType`," + " `fieldSession`, `software`, `service`, `model`, `tile`, `initiative`, `stereomate`, `sensor`," + " `platformSeries`, `sensorSeries`, `productionSeries`, `transferAggregate`, `otherAggregate`" + ), + title="Scope / Hierarchy Level", + ) + + +class Date(SchemaBaseModel): + """ + Date + """ + + date: str = Field(..., description="Date in ISO 8601 format - YYYY-MM-DD", title="Date") + type: Optional[str] = Field( + None, + description=( + "Date type e.g. `publication`, `revision`, `creation`, `expiry`, `lastUpdate`, `lastRevision`," + " `deprecated`. See full list at" + " [data.noaa.gov](https://data.noaa.gov/resources/iso19139/schema/resources/Codelist/gmxCodelists.xml#CI_DateTypeCode)" + ), + title="Date type", + ) + + +class OnlineResource(SchemaBaseModel): + """ + Online Resource + """ + + linkage: Optional[str] = Field(None, title="Link to the resource") + name: Optional[str] = Field(None, title="Resource title") + description: Optional[str] = Field(None, title="Resource description") + protocol: Optional[str] = Field( + None, description="Protocol used to access the resource, eg HTTP, FTP", title="Protocol" + ) + function: Optional[str] = Field(None, description="Function of the online resource", title="Function") + + +class Phone(SchemaBaseModel): + """ + Phone contact information + """ + + voice: Optional[str] = Field(None, title="Phone number") + facsimile: Optional[str] = Field(None, title="Facsimile") + + +class Address(SchemaBaseModel): + """ + Address contact information + """ + + deliveryPoint: Optional[str] = Field(None, title="Delivery point") + city: Optional[str] = Field(None, title="City") + postalCode: Optional[str] = Field(None, title="Postal Code") + country: Optional[str] = Field(None, title="Country") + elctronicMailAddress: Optional[str] = Field(None, title="Email") + + +class ContactInfo(SchemaBaseModel): + """ + Information to contact the responsible party + """ + + phone: Optional[Phone] = Field(None, description="Phone contact information", title="Phone") + address: Optional[Address] = Field(None, description="Address contact information", title="Address") + onlineResource: Optional[OnlineResource] = None + + +class ResponsibleParty(SchemaBaseModel): + """ + Definition of a responsible party (individual or organization) + """ + + individualName: Optional[str] = Field(None, description="Name of the individual", title="Individual name") + organisationName: Optional[str] = Field(None, description="Name of the organization", title="Organization name") + positionName: Optional[str] = Field(None, description="Name of the individual position", title="Position name") + contactInfo: Optional[ContactInfo] = Field( + None, description="Information to contact the responsible party", title="Contact info" + ) + role: Optional[str] = Field( + None, + description=( + "Role of the responsible party. Recommended code following the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_RoleCode) Role codelist." + " Suggested values: {`resourceProvider`, `custodian`, `owner`, `sponsor`, `user`, `distributor`," + " `originator`, `pointOfContact`, `principalInvestigator`, `processor`, `publisher`, `author`, `coAuthor`," + " `collaborator`, `editor`, `mediator`, `rightsHolder`, `contributor`, `funder`, `stakeholder`}" + ), + title="Role", + ) + + +class Identifier(SchemaBaseModel): + """ + Unique identifier for the resource metadata + """ + + authority: Optional[str] = Field( + None, description="The authority that identifies uniquely the resource metadata", title="Authority" + ) + code: Optional[Any] = Field(None, description="A code uniquely identifying the resource metadata", title="Code") + + +class Series(SchemaBaseModel): + """ + Series citation + """ + + name: Optional[str] = Field(None, description="Name of the series in which the resource is cited", title="Name") + issueIdentification: Optional[str] = Field(None, description="Identification of the series issue", title="Issue") + page: Optional[str] = Field( + None, description="Identification of the series page in which the resource is cited", title="Page" + ) + + +class Citation(SchemaBaseModel): + """ + A set of elements to describe a resource citation + """ + + title: Optional[str] = Field(None, description="Resource title", title="Title") + alternateTitle: Optional[str] = Field(None, description="Resource alternate title", title="Alternate Title") + date: Optional[List[Date]] = Field( + None, description="Date(s) associated to the resource citation", title="Citation date(s)" + ) + edition: Optional[str] = Field(None, description="Edition", title="Edition") + editionDate: Optional[str] = Field( + None, + description=( + "Date and time when the metadata record was created or updated. Requires an extended ISO 8601 formatted" + " combined UTC date and time string (2009-11-17T10:00:00)" + ), + title="Edition Date", + ) + identifier: Optional[Identifier] = Field( + None, description="Unique identifier for the resource metadata", title="Identifier" + ) + citedResponsibleParty: Optional[List[ResponsibleParty]] = Field( + None, description="Responsible party(ies) to cite in the resource citation", title="Responsible party(ies)" + ) + presentationForm: Optional[List[str]] = Field( + None, + description=( + "The resource presentation form. e.g. 'mapDigital'. Recommended code following the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_PresentationFormCode)" + " PresentationForm codelist. Suggested values: {`documentDigital`, `imageDigital`, `documentHardcopy`," + " `imageHardcopy`, `mapDigital`, `mapHardcopy`, `modelDigital`, `modelHardcopy`, `profileDigital`," + " `profileHardcopy`, `tableDigital`, `tableHardcopy`, `videoDigital`, `videoHardcopy`, `audioDigital`," + " `audioHardcopy`, `multimediaDigital`, `multimediaHardcopy`, `physicalSample`, `diagramDigital`," + " `diagramHardcopy`}" + ), + title="Presentation form", + ) + series: Optional[Series] = Field(None, description="Series citation", title="Series") + otherCitationDetails: Optional[str] = Field(None, title="Other Citation Details") + collectiveTitle: Optional[str] = Field(None, title="Collective Title") + ISBN: Optional[str] = Field(None, title="ISBN") + ISSN: Optional[str] = Field(None, title="ISSN") + + +class ReferenceSystem(SchemaBaseModel): + """ + Reference System + """ + + code: Optional[str] = Field(None, description="example - 5701", title="Reference System Identifier Code") + codeSpace: Optional[str] = Field(None, description="example - 'EPSG'", title="Code Space") + + +class MaintenanceInfo(SchemaBaseModel): + """ + Information about a resource maintenance + """ + + maintenanceAndUpdateFrequency: Optional[str] = Field( + None, + description=( + "Frequency of maintenance/update of a resource. Recommended code following the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_MaintenanceFrequencyCode)" + " MaintenanceFrequency codelist. Suggested values: {`continual`, `daily`, `weekly`, `fortnightly`," + " `monthly`, `quarterly`, `biannually`, `annually`, `asNeeded`, `irregular`, `notPlanned`, `unknown`}" + ), + title="Maintenance and Update Frequency", + ) + + +class GraphicOverview(SchemaBaseModel): + """ + Graphic overview of resource + """ + + fileName: Optional[str] = Field(None, title="File name / URL") + fileDescription: Optional[str] = Field(None, title="File Description") + fileType: Optional[str] = Field(None, title="File Type") + + +class Format(SchemaBaseModel): + """ + Description of a digital format + """ + + name: Optional[str] = Field(None, title="Format name") + version: Optional[str] = Field(None, title="Format version") + amendmentNumber: Optional[str] = Field(None, title="Format version amendment number") + specification: Optional[str] = Field(None, title="Format specification") + fileDecompressionTechnique: Optional[str] = Field(None, title="File decompression technique") + FormatDistributor: Optional[ResponsibleParty] = Field( + None, description="Responsible party in charge of the format distribution", title="Distributor" + ) + + +class Keywords(SchemaBaseModel): + """ + Set of keywords for a given type of keywords, eg. theme, project, instrument + """ + + type: Optional[str] = Field( + None, + description=( + "Type of keyword based on pre-defined code values. based on (but not limited to) code values listed in the" + " ISO 19115 \n {`dataCenter`, `discipline`, `place`, `dataResolution`," + " \n`stratum`,`temporal`,`theme`,`dataCentre`,`featureType`,`instrument`,`platform`,`process`,`project`,`service`,`product`,`subTopicCategory`}" + ), + title="Keyword type", + ) + keyword: str = Field(..., description="Keywords") + thesaurusName: Optional[str] = Field( + None, description="Thesaurus to which keywords are associated", title="Thesaurus" + ) + + +class Restriction(SchemaBaseModel): + __root__: str = Field( + ..., + description=( + "A restriction to access/use a resource. e.g. 'dataset'. Recommended code following the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode) Restriction" + " codelist. Suggested values: {`copyright`, `patent`, `patentPending`, `trademark`, `license`," + " `intellectualPropertyRights`, `restricted`, `otherRestrictions`, `unrestricted`, `licenceUnrestricted`," + " `licenceEndUser`, `licenceDistributor`, `private`, `statutory`, `confidential`, `SBU`, `in-confidence`}" + ), + title="Restriction", + ) + + +class LegalConstraints(SchemaBaseModel): + """ + Legal constraints associated to the resource + """ + + useLimitation: Optional[List[str]] = None + accessConstraints: Optional[List[Restriction]] = Field( + None, + description=( + "A restriction to access/use a resource. e.g. 'dataset'. Recommended code following the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode) Restriction" + " codelist. Suggested values: {`copyright`, `patent`, `patentPending`, `trademark`, `license`," + " `intellectualPropertyRights`, `restricted`, `otherRestrictions`, `unrestricted`, `licenceUnrestricted`," + " `licenceEndUser`, `licenceDistributor`, `private`, `statutory`, `confidential`, `SBU`, `in-confidence`}" + ), + title="Access constraints", + ) + useConstraints: Optional[List[Restriction]] = Field( + None, + description=( + "Legal constraints concerning the use of the resource, e.g. Terms of use statement, License. Recommended" + " code following the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode) Restriction" + " codelist. Suggested values: {`copyright`, `patent`, `patentPending`, `trademark`, `license`," + " `intellectualPropertyRights`, `restricted`, `otherRestrictions`, `unrestricted`, `licenceUnrestricted`," + " `licenceEndUser`, `licenceDistributor`, `private`, `statutory`, `confidential`, `SBU`, `in-confidence`}" + ), + title="Use constraints", + ) + otherConstraints: Optional[List[str]] = Field( + None, + description=( + "Other legal constraints concerning the resource, e.g. additional information to complement the access/use" + " constraints, Disclaimer" + ), + title="Other constraints", + ) + + +class SecurityConstraints(SchemaBaseModel): + """ + Security constraints associated to the resource + """ + + useLimitation: Optional[List[str]] = None + classification: Optional[str] = Field( + None, + description=( + "Security constraint classification , e.g. 'secret'. Recommended code following the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_ClassificationCode)" + " Classification codelist. Suggested values: {`unclassified`, `restricted`, `confidential`, `secret`," + " `topSecret`, `SBU`, `forOfficialUseOnly`, `protected`, `limitedDistribution`}" + ), + title="Classification", + ) + userNote: Optional[str] = Field(None, title="User note") + classificationSystem: Optional[str] = Field( + None, + description=( + "A specific classification system, eg. Organization-specific system to classify resource confidentiality" + ), + title="Classification system", + ) + handlingDescription: Optional[str] = Field( + None, + description="A description for the security constraint associated to the resource", + title="Handling description", + ) + + +class Constraints(SchemaBaseModel): + """ + Constraints associated to the resource + """ + + legalConstraints: Optional[LegalConstraints] = Field( + None, description="Legal constraints associated to the resource", title="Legal constraints" + ) + securityConstraints: Optional[SecurityConstraints] = Field( + None, description="Security constraints associated to the resource", title="Security constraints" + ) + + +class Parameter(SchemaBaseModel): + """ + Service parameter + """ + + name: Optional[str] = Field(None, description="Service parameter name", title="Name") + direction: Optional[str] = Field( + None, description="Direction of the parameter. Suggested values: {in, out, inout}", title="Direction" + ) + description: Optional[str] = Field(None, description="Service parameter description", title="Description") + optionality: Optional[str] = Field( + None, description="Optionality, either 'Optional' or 'Mandatory' value", title="Optionality" + ) + repeatability: Optional[bool] = Field(None, description="Service parameter repeatability", title="Repeatability") + valueType: Optional[str] = Field(None, description="Value type", title="Value type") + + +class DCPItem(SchemaBaseModel): + """ + Distributed Computing Plateform + """ + + codeListValue: Optional[str] = Field( + None, + title=( + "DCP, eg. 'WebServices'. Recommended code following the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#DCPList) DCP codelist. Suggested" + " values: {COM, CORBA, JAVA, SQL, WebServices, XML}" + ), + ) + codeList: Optional[str] = Field( + None, + title=( + "Codelist used for DCPs. Recommended URI:" + " http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#DCPList" + ), + ) + codeSpace: Optional[str] = Field(None, title="Codespace of the DCPs. Recommended value: ISOTC211/19119") + + +class OperationMetadata(SchemaBaseModel): + """ + Service operation metadata descriptions + """ + + operationName: Optional[str] = Field(None, title="Operation name") + DCP: Optional[List[DCPItem]] = Field( + None, description="Distributed Computing Plateform(s). Recommended value: 'WebServices'", title="DCP(s)" + ) + operationDescription: Optional[str] = Field(None, title="Operation description") + invocationName: Optional[str] = Field(None, title="Invocation name") + parameters: Optional[List[Parameter]] = Field(None, description="Operation parameters", title="Parameters") + connectPoint: Optional[OnlineResource] = Field(None, title="Connect Point(s)") + dependsOn: Optional[List[OperationMetadata]] = Field( + None, description="Depends on (other operation metadata)", title="Depends on" + ) + + +class ResourceSpecificUsageItem(SchemaBaseModel): + specificUsage: Optional[str] = Field( + None, + description=( + "A description of a specific usage of this resource relevant to highlight, eg. use case of interest," + " success story, data paper" + ), + title="Specific usage description", + ) + usageDateTime: Optional[str] = Field( + None, + description=( + "Date and time of the usage. Requires an extended ISO 8601 formatted combined UTC date and time string" + " (2009-11-17T10:00:00)" + ), + title="Metadata Date Stamp", + ) + userDeterminedLimitations: Optional[str] = Field(None, title="User determined limitations") + userContactInfo: Optional[List[ResponsibleParty]] = Field(None, title="User contact(s)") + + +class ServiceIdentification(SchemaBaseModel): + """ + Service identification + """ + + serviceType: Optional[str] = Field(None, description="Service type name", title="Service type") + serviceTypeVersion: Optional[str] = Field(None, description="Service type version", title="Service type version") + accessProperties: Optional[AccessProperties] = Field(None, title="Access properties") + restrictions: Optional[List[Constraints]] = Field( + None, description="Constraints associated to the service", title="Service constraints" + ) + keywords: Optional[List[Keywords]] = Field( + None, description="Service keywords, organized by keyword type", title="Service keywords" + ) + coupledResource: Optional[List[CoupledResourceItem]] = Field( + None, description="Coupled resource(s)", title="Coupled resource(s)" + ) + couplingType: Optional[CouplingType] = Field(None, description="Coupling type", title="Coupling type") + containsOperations: Optional[List[OperationMetadata]] = Field( + None, description="Operation(s) contained in the service", title="Contained operation(s)" + ) + operatesOn: Optional[List[OperatesOnItem]] = Field( + None, + description="List identifiers of datasets on which service operates on", + title="Operates on relationship(s)", + ) + + +class IdentificationInfoItem(SchemaBaseModel): + citation: Optional[Citation] = Field(None, description="Dataset citation", title="Citation") + abstract: Optional[str] = Field(None, description="Abstract describing the dataset resource", title="Abstract") + purpose: Optional[str] = Field(None, description="Purpose of the dataset resource", title="Purpose") + credit: Optional[str] = Field(None, description="Credit associated to the dataset resource", title="Credit") + status: Optional[str] = Field( + None, + description=( + "Status of the dataset resource. Recommended code following the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_ProgressCode) Progress codelist." + " Suggested values: {`completed`, `historicalArchive`, `obsolete`, `onGoing`, `planned`, `required`," + " `underDevelopment`, `final`, `pending`, `retired`, `superseded`, `tentative`, `valid`, `accepted`," + " `notAccepted`, `withdrawn`, `proposed`, `deprecated`}" + ), + title="Status", + ) + pointOfContact: Optional[List[ResponsibleParty]] = Field( + None, description="One or more points of contacts for the resource", title="Points of contact" + ) + resourceMaintenance: Optional[List[MaintenanceInfo]] = Field( + None, description="Information about the dataset resource maintenance", title="Resource maintenance" + ) + graphicOverview: Optional[List[GraphicOverview]] = Field( + None, description="Graphic Overview(s) for the dataset resource", title="Graphic Overview(s)" + ) + resourceFormat: Optional[List[Format]] = Field(None, description="Resource format(s)", title="Resource format(s)") + descriptiveKeywords: Optional[List[Keywords]] = Field( + None, description="Descriptive keywords, organized by keyword type", title="Descriptive keywords" + ) + resourceConstraints: Optional[List[Constraints]] = Field( + None, description="Constraints associated to the resource", title="Resource constraints" + ) + resourceSpecificUsage: Optional[List[ResourceSpecificUsageItem]] = Field( + None, description="Resource specific usage(s) - if applicable", title="Resource specific usage(s)" + ) + aggregationInfo: Optional[AggregationInfo] = Field( + None, + description="Identification of aggregate that encompasses the described resource, eg. data collection", + title="Aggregate information", + ) + extent: Optional[Extent] = Field( + None, + description=( + "Defines the spatial (horizontal and vertical) and temporal region to which the content of the resource" + " applies." + ), + title="Extent of the resource", + ) + spatialRepresentationType: Optional[str] = Field( + None, + description=( + "Spatial representation type of the resource. e.g. 'vector'. Recommended code following the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_SpatialRepresentationTypeCode)" + " SpatialRepresentationType codelist. Suggested values: {`vector`, `grid`, `textTable`, `tin`," + " `stereoModel`, `video`}" + ), + title="Spatial Representation type", + ) + spatialResolution: Optional[SpatialResolution] = Field( + None, description="Spatial resolution of the resource", title="Spatial Resolution" + ) + language: Optional[List[Language]] = Field( + None, + description=( + "Resource language(s). Preferred code following the [ISO 639-2](http://www.loc.gov/standards/iso639-2/)" + " (alpha-3 code)" + ), + title="Resource language(s)", + ) + characterSet: Optional[List[CharacterSet]] = Field( + None, description="Resource character set(s)", title="Resource character set(s)" + ) + topicCategory: Optional[List[TopicCategory]] = Field( + None, + description=( + "Topic category of the resource. e.g. `owner`. Recommended code following the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_TopicCategoryCode) TopicCategory" + " codelist. Suggested values: {`farming`, `biota`, `boundaries`, `climatologyMeteorologyAtmosphere`," + " `economy`, `elevation`, `environment`, `geoscientificInformation`, `health`, `imageryBaseMapsEarthCover`," + " `intelligenceMilitary`, `inlandWaters`, `location`, `oceans`, `planningCadastre`, `society`, `structure`," + " `transportation`, `utilitiesCommunication`, `extraTerrestrial`, `disaster`}" + ), + title="Topic categories", + ) + supplementalInformation: Optional[str] = Field( + None, description="Additional information about the resource", title="Supplemental Information" + ) + serviceIdentification: Optional[ServiceIdentification] = Field( + None, description="Service identification", title="Service identification" + ) + + +class FeatureCatalogueDescription(SchemaBaseModel): + """ + description of the feature catalogue (ISO 19110) associated to a vector resource, ie. the definition of the vector data structure + """ + + complianceCode: Optional[bool] = Field( + None, + description="Indicates whether the dataset complies with the feature catalogue description", + title="Compliance code", + ) + language: Optional[str] = Field(None, title="Feature catalogue language") + includedWithDataset: Optional[bool] = Field( + None, + description="Indicates if the feature catalogue (ISO 19110) is included with the dataset?", + title="Included with dataset", + ) + featureCatalogueCitation: Optional[Citation] = Field(None, title="Feature Catalogue citation") + + +class ContentInfoItem(SchemaBaseModel): + featureCatalogueDescription: Optional[FeatureCatalogueDescription] = Field( + None, + description=( + "description of the feature catalogue (ISO 19110) associated to a vector resource, ie. the definition of" + " the vector data structure" + ), + title="Feature Catalogue Description", + ) + coverageDescription: Optional[CoverageDescription] = Field( + None, + description="description of the coverage (grid/raster), ie. the definition of the grid/raster data structure", + title="Coverage Description", + ) + + +class TransferOptions(SchemaBaseModel): + """ + Options of digital transfer available for the resource + """ + + onLine: Optional[List[ResourceSchema]] = Field(None, title="Online Resources") + + +class DistributionInfo(SchemaBaseModel): + """ + Distribution information + """ + + distributionFormat: Optional[List[Format]] = Field(None, title="Distribution format(s)") + distributor: Optional[List[ResponsibleParty]] = Field( + None, description="Responsible party(ies) in charge of the resource distribution", title="Distributor(s)" + ) + transferOptions: Optional[TransferOptions] = Field( + None, description="Options of digital transfer available for the resource", title="Digital transfer options" + ) + + +class ResultItem(SchemaBaseModel): + specification: Optional[Citation] = Field( + None, description="The specification(s) of the data quality conformance result", title="Result specification" + ) + explanation: Optional[str] = Field( + None, + description="The explanation(s) of the data quality conformance (or non-conformance) result", + title="Result explanation", + ) + pass_: Optional[bool] = Field( + None, + alias="pass", + description="Indicates whether or not the conformance result is a success", + title="Result pass", + ) + + +class Result(SchemaBaseModel): + """ + Result of conformance of the resource + """ + + nameOfMeasure: Optional[List[str]] = Field(None, description="Data quality measure names", title="Measures") + measureIdentification: Optional[str] = Field( + None, description="Unique identifier for the data quality measure", title="Measure identification" + ) + measureDescription: Optional[str] = Field( + None, description="Description for the data quality measure", title="Measure description" + ) + evaluationMethodType: Optional[List[str]] = Field( + None, + description=( + "The type of method to evaluate the data quality measure. e.g. 'indirect'. Recommended code following the" + " [ISO/TS 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#DQ_EvaluationMethodTypeCode)" + " TopicCategory codelist. Suggested values: {`directInternal`, `directExternal`, `indirect`}" + ), + title="Evaluation method type", + ) + evaluationMethodDescription: Optional[str] = Field( + None, description="a description of the data quality evaluation method", title="Evaluation method description" + ) + evaluationProcedure: Optional[Citation] = Field( + None, description="Evaluation procedure description (as 'citation')", title="Evaluation procedure" + ) + dateTime: Optional[str] = Field( + None, + description=( + "Date and time when the data quality report has been established. Requires an extended ISO 8601 formatted" + " combined UTC date and time string (2009-11-17T10:00:00)" + ), + title="Report Date Stamp", + ) + result: Optional[List[ResultItem]] = Field( + None, description="Result(s) of consistency associated to the data quality report", title="Result(s)" + ) + + +class DQDomainConsistency(SchemaBaseModel): + """ + Domain consistency report information + """ + + result: Optional[Result] = Field( + None, description="Result of conformance of the resource", title="Conformance Result" + ) + + +class ReportItem(SchemaBaseModel): + DQ_DomainConsistency: Optional[DQDomainConsistency] = Field( + None, description="Domain consistency report information", title="Data quality domain consistency" + ) + + +class SourceItem(SchemaBaseModel): + description: Optional[str] = Field(None, title="Source description") + sourceCitation: Optional[Citation] = Field(None, title="Source citation") + + +class ProcessStepItem(SchemaBaseModel): + description: Optional[str] = Field( + None, description="description of the process step", title="process step description" + ) + rationale: Optional[str] = Field(None, description="rationale of the process step", title="process step rationale") + dateTime: Optional[str] = Field( + None, + description=( + "Date and time when the data quality report has been established. Requires an extended ISO 8601 formatted" + " combined UTC date and time string (2009-11-17T10:00:00)" + ), + title="Date stamp", + ) + processor: Optional[List[ResponsibleParty]] = Field( + None, description="Responsible party(ies) in charge of the processing for the step", title="Processor(s)" + ) + source: Optional[List[SourceItem]] = Field( + None, description="Source(s) processed during the process step", title="Source(s)" + ) + + +class Lineage(SchemaBaseModel): + """ + Description of the resource lineage, ie process steps performed to lead to the resource + """ + + statement: Optional[str] = Field( + None, + description="A description of the overall lineage information. eg. 'Data management workflow'", + title="Lineage statement", + ) + processStep: Optional[List[ProcessStepItem]] = Field( + None, description="Description of the process steps required to obtain the resource", title="Process step(s)" + ) + + +class DataQualityInfoItem(SchemaBaseModel): + scope: Optional[Scope] = Field(None, title="Scope of the data quality information") + report: Optional[List[ReportItem]] = Field( + None, description="Data quality report(s) associated to the resource", title="Data quality report(s)" + ) + lineage: Optional[Lineage] = Field( + None, + description="Description of the resource lineage, ie process steps performed to lead to the resource", + title="Lineage", + ) + + +class PortrayalCatalogueInfo(SchemaBaseModel): + """ + Information identifying the portrayal catalogue used by the resource + """ + + portrayalCatalogueCitation: Optional[List[Citation]] = Field(None, title="Citation for the portrayal catalogue") + + +class FeatureCatalogue(SchemaBaseModel): + name: Optional[str] = Field(None, description="Name of the feature catalogue", title="Name") + scope: Optional[List[str]] = Field( + None, description="Subject domain(s) of feature types defined in this feature catalogue", title="Scope(s)" + ) + fieldOfApplication: Optional[List[str]] = Field( + None, + description="Description of kind(s) of use to which this feature catalogue may be put", + title="Field(s) of application", + ) + versionNumber: Optional[str] = Field( + None, + description=( + "version number of this feature catalogue, which may include both a major version number or letter and a" + " sequence of minor release numbers or letters, such as '3.2.4a.' The format of this attribute may differ" + " between cataloguing authorities." + ), + title="Version number", + ) + versionDate: Optional[Date] = None + producer: Optional[ResponsibleParty] = Field( + None, + description=( + "Name, address, country, and telecommunications address of person or organization having primary" + " responsibility for the intellectual content of this feature catalogue" + ), + title="Producer", + ) + functionalLanguage: Optional[str] = Field( + None, + description=( + "Formal functional language in which the feature operation formal definition occurs in this feature" + " catalogue" + ), + title="Functional language", + ) + featureType: Optional[List[FeatureTypeItem]] = Field( + None, description="Feature type(s) contained in the catalogue", title="Feature type(s)" + ) + + +class Description(SchemaBaseModel): + idno: str = Field(..., description="Global unique persistent identifier", title="Unique Identifier") + language: Optional[str] = Field(None, description="Main metadata language", title="Language") + characterSet: Optional[CharacterSet] = Field( + None, description="Metadata Character encoding used e.g. UTF-8", title="Character set" + ) + parentIdentifier: Optional[str] = Field( + None, + description=( + "Global unique persistent identifier of the parent record, eg. a data collection that includes several" + " datasets" + ), + title="Unique parent identifier", + ) + hierarchyLevel: Optional[List[str]] = Field( + None, + description=( + "List of Scope(s), or 'hierarchy level(s)'. e.g. `dataset`, `service`. Recommended code following the" + " [ISO/TS 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MX_ScopeCode) Scope" + " codelist. (string)" + ), + title="Scope(s) / Hierarchy Level(s)", + ) + hierarchyLevelName: Optional[List[str]] = Field( + None, + description="List of scope / hierarchy level names. Alternative to the use of 'hierarchyLevel' code items.", + title="Scope / hierarchy level names.", + ) + contact: Optional[List[ResponsibleParty]] = Field( + None, description="Contact(s) associated to the metadata", title="Contacts" + ) + dateStamp: Optional[str] = Field( + None, + description=( + "Date and time when the metadata record was created or updated. Requires an extended ISO 8601 formatted" + " combined UTC date and time string (2009-11-17T10:00:00)" + ), + title="Metadata Date Stamp", + ) + metadataStandardName: Optional[str] = Field( + None, + description="Standard name of the metadata standard used. Recommended value: ISO 19115:2003/19139", + title="Metadata standard name", + ) + metadataStandardVersion: Optional[str] = Field( + None, + description=( + "Version of the metadata standard used. Optional for ISO/TC211 standard if the metadata standard name" + " includes the inception year" + ), + title="Metadata standard version", + ) + dataSetURI: Optional[str] = Field( + None, description="A URI that uniquely identifies the dataset", title="Dataset URI" + ) + spatialRepresentationInfo: Optional[List[SpatialRepresentationInfoItem]] = Field( + None, title="Resource Spatial Representation(s)" + ) + referenceSystemInfo: Optional[List[ReferenceSystem]] = Field( + None, + description=( + "Resource's spatial reference systems - Description of the spatial and/or temporal reference systems used" + " in the dataset." + ), + title="Resource Reference Systems", + ) + identificationInfo: Optional[List[IdentificationInfoItem]] = Field( + None, description="Identification(s) of the resource", title="Identification Info(s)" + ) + contentInfo: Optional[List[ContentInfoItem]] = Field( + None, + description="Information on the resource content, ie data structure definition", + title="Content information", + ) + distributionInfo: Optional[DistributionInfo] = Field( + None, description="Distribution information", title="Distribution information" + ) + dataQualityInfo: Optional[List[DataQualityInfoItem]] = Field( + None, description="Data quality information", title="Data quality information" + ) + metadataMaintenance: Optional[MaintenanceInfo] = Field( + None, description="Metadata maintenance information", title="Metadata Maintenance information" + ) + portrayalCatalogueInfo: Optional[PortrayalCatalogueInfo] = Field( + None, + description="Information identifying the portrayal catalogue used by the resource", + title="Portrayal catalogue information", + ) + metadataExtensionInfo: Optional[Any] = None + applicationSchemaInformation: Optional[Any] = None + thesaurusInfo: Optional[List[Citation]] = Field( + None, description="Thesaurus referenced by keywords", title="Thesaurus" + ) + feature_catalogue: Optional[FeatureCatalogue] = Field(None, title="Feature catalogue") + + +class GeospatialSchema(SchemaBaseModel): + """ + Geospatial draft schema + """ + + repositoryid: Optional[str] = Field( + None, + description="Abbreviation for the collection that owns this dataset", + title="Collection ID that owns the dataset", + ) + published: Optional[int] = Field(0, description="Status of the dataset - 0=draft, 1=published") + overwrite: Optional[Overwrite] = Field("no", description="Overwrite if already exists?") + metadata_information: Optional[MetadataInformation] = Field( + None, description="Document description", title="Document metadata information" + ) + description: Description = Field(..., title="Geospatial schema") + provenance: Optional[List[ProvenanceSchema]] = Field(None, description="Provenance") + tags: Optional[List[Tag]] = Field(None, description="Tags", title="Tags") + lda_topics: Optional[List[LdaTopic]] = Field(None, description="LDA topics", title="LDA topics") + embeddings: Optional[List[Embedding]] = Field(None, description="Word embeddings", title="Word embeddings") + additional: Optional[Dict[str, Any]] = Field( + None, description="Any additional metadata", title="Additional metadata" + ) + + +class CharacterEncoding(SchemaBaseModel): + """ + Character encoding used e.g. UTF-8 + """ + + characterSet: Optional[CharacterSet] = Field( + None, description="Character encoding used e.g. UTF-8", title="Character set" + ) + + +class Locale(SchemaBaseModel): + """ + Locale definition for multi-lingual description + """ + + id: Optional[str] = Field(None, description="Locale code, eg. FR, EN", title="Locale code") + languageCode: Optional[Language] = Field(None, description="Language", title="Language") + characterEncoding: Optional[CharacterEncoding] = Field( + None, description="Character encoding used e.g. UTF-8", title="Character set" + ) + + +OperationMetadata.update_forward_refs() diff --git a/pydantic_schemas/image-schema.py b/pydantic_schemas/image-schema.py new file mode 100644 index 0000000..47cd9a7 --- /dev/null +++ b/pydantic_schemas/image-schema.py @@ -0,0 +1,1188 @@ +# generated by datamodel-codegen: +# filename: image-schema.json +# timestamp: 2024-07-02T16:12:54+00:00 + +from __future__ import annotations + +from datetime import datetime +from enum import Enum +from typing import Any, Dict, List, Optional, Union + +from pydantic import AnyUrl, Extra, Field, confloat, constr + +from .schema_base_model import SchemaBaseModel + + +class Overwrite(Enum): + """ + Overwrite document if already exists? + """ + + yes = "yes" + no = "no" + + +class Producer(SchemaBaseModel): + name: Optional[str] = Field(None, description="Name (required)", title="Name") + abbr: Optional[str] = Field(None, title="Abbreviation") + affiliation: Optional[str] = Field(None, title="Affiliation") + role: Optional[str] = Field(None, title="Role") + + +class MetadataInformation(SchemaBaseModel): + """ + Document description + """ + + class Config: + extra = Extra.forbid + + title: Optional[str] = Field(None, description="Document title", title="Document title") + idno: Optional[str] = Field(None, title="Unique ID number for the document") + producers: Optional[List[Producer]] = Field(None, description="List of producers", title="Producers") + production_date: Optional[str] = Field( + None, description="Document production date using format(YYYY-MM-DD)", title="Date of Production" + ) + version: Optional[str] = Field( + None, description="Identify and describe the current version of the document", title="Document version" + ) + + +class Identifier(SchemaBaseModel): + type: Optional[str] = Field( + None, description="Type of identifier e.g. `doi`, `handle`, `other`", title="Identifier type" + ) + identifier: str = Field(..., title="Identifier") + + +class LicenseItem(SchemaBaseModel): + name: Optional[str] = Field(None, title="License") + uri: Optional[str] = Field(None, title="URI") + + +class AlbumItem(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name of album") + description: Optional[str] = Field(None, title="Description") + owner: Optional[str] = Field(None, title="Owner") + uri: Optional[str] = Field(None, title="URI") + + +class Tag(SchemaBaseModel): + tag: Optional[str] = Field(None, title="Tag") + tag_group: Optional[str] = Field(None, title="Tag group") + + +class ModelInfoItem(SchemaBaseModel): + source: Optional[str] = Field(None, title="Source") + author: Optional[str] = Field(None, title="Author") + version: Optional[str] = Field(None, title="Version") + model_id: Optional[str] = Field(None, title="Model Identifier") + nb_topics: Optional[float] = Field(None, title="Number of topics") + description: Optional[str] = Field(None, title="Description") + corpus: Optional[str] = Field(None, title="Corpus name") + uri: Optional[str] = Field(None, title="URI") + + +class TopicWord(SchemaBaseModel): + word: Optional[str] = Field(None, title="Word") + word_weight: Optional[float] = Field(None, title="Word weight") + + +class TopicDescriptionItem(SchemaBaseModel): + topic_id: Optional[Union[int, str]] = Field(None, title="Topic identifier") + topic_score: Optional[Union[float, str]] = Field(None, title="Topic score") + topic_label: Optional[str] = Field(None, title="Topic label") + topic_words: Optional[List[TopicWord]] = Field(None, description="Words", title="Topic words") + + +class LdaTopic(SchemaBaseModel): + class Config: + extra = Extra.forbid + + model_info: Optional[List[ModelInfoItem]] = Field(None, title="Model information") + topic_description: Optional[List[TopicDescriptionItem]] = Field(None, title="Topic information") + + +class Embedding(SchemaBaseModel): + id: str = Field(..., title="Vector Model ID") + description: Optional[str] = Field(None, title="Vector Model Description") + date: Optional[str] = Field(None, title="Date (YYYY-MM-DD)") + vector: Dict[str, Any] = Field(..., title="Vector") + + +class SceneCodesLabelledItem(SchemaBaseModel): + code: Optional[str] = Field(None, description="Scene code as a string of 6 digits", title="Scene Code") + label: Optional[str] = Field(None, description="Label", title="Scene Label") + description: Optional[str] = Field(None, description="Description of the scene", title="Scene Description") + + +class SubjectCodesLabelledItem(SchemaBaseModel): + code: Optional[str] = Field(None, description="Subject code as a string of 8 digits", title="Subject Code") + label: Optional[str] = Field(None, description="Label", title="Subject Label") + description: Optional[str] = Field(None, description="Description of the scene", title="Subject Description") + + +class AltLang(SchemaBaseModel): + __root__: str = Field(..., description="Text in alternative languages") + + +class Delimitertype(Enum): + spatial = "spatial" + temporal = "temporal" + + +class MediaFragment(SchemaBaseModel): + """ + Object defining this fragement of a media asset - if ommitted = the whole asset + """ + + class Config: + extra = Extra.forbid + + uri: AnyUrl + delimitertype: Optional[Delimitertype] = None + description: Optional[str] = None + + +class AltLangObject(SchemaBaseModel): + class Config: + extra = Extra.forbid + + __root__: Dict[ + constr( + regex=r"^(((([A-Za-z]{2,3}(-([A-Za-z]{3}(-[A-Za-z]{3}){0,2}))?)|[A-Za-z]{4}|[A-Za-z]{5,8})(-([A-Za-z]{4}))?(-([A-Za-z]{2}|[0-9]{3}))?(-([A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*(-([0-9A-WY-Za-wy-z](-[A-Za-z0-9]{2,8})+))*(-(x(-[A-Za-z0-9]{1,8})+))?)|(x(-[A-Za-z0-9]{1,8})+))$" + ), + str, + ] = Field(..., description="Text in alternative languages") + + +class ArtworkOrObject(SchemaBaseModel): + class Config: + extra = Extra.forbid + + title: Optional[AltLang] = Field( + None, + description="A reference for the artwork or object in the image.", + title="Title {Artwork or Object detail}", + ) + contentDescription: Optional[AltLang] = Field( + None, + description="A textual description of the content depicted in the artwork or object.", + title="Content Description {Artwork or Object detail}", + ) + physicalDescription: Optional[AltLang] = Field( + None, + description=( + "A textual description of the physical characteristics of the artwork or object, without reference to the" + " content depicted." + ), + title="Physical Description {Artwork or Object detail}", + ) + creatorNames: Optional[List[str]] = Field( + None, + description=( + "Contains the name of the artist who has created artwork or an object in the image. In cases where the" + " artist could or should not be identified the name of a company or organisation may be appropriate." + ), + title="Creator {Artwork or Object detail}", + ) + creatorIdentifiers: Optional[List[str]] = Field( + None, + description="Globally unique identifier for the creator of artwork or object.", + title="Creator ID {Artwork or Object detail}", + ) + contributionDescription: Optional[AltLang] = Field( + None, + description="A textual description about a contribution made to an artwork or an object.", + title="Contribution Description {Artwork or Object detail}", + ) + stylePeriod: Optional[List[str]] = Field( + None, + description=( + "The style, historical or artistic period, movement, group, or school whose characteristics are represented" + " in the artwork or object." + ), + title="Style Period {Artwork or Object detail}", + ) + dateCreated: Optional[datetime] = Field( + None, + description=( + "Designates the date and optionally the time the artwork or object in the image was created. This relates" + " to artwork or objects with associated intellectual property rights." + ), + title="Date Created {Artwork or Object detail}", + ) + circaDateCreated: Optional[str] = Field( + None, + description=( + "Approximate date or range of dates associated with the creation and production of an artwork or object or" + " its components." + ), + title="Circa Date Created {Artwork or Object detail}", + ) + source: Optional[str] = Field( + None, + description=( + "The organisation or body holding and registering the artwork or object in the image for inventory" + " purposes." + ), + title="Source {Artwork or Object detail}", + ) + sourceInventoryNr: Optional[str] = Field( + None, + description=( + "The inventory number issued by the organisation or body holding and registering the artwork or object in" + " the image." + ), + title="Source Inventory Number {Artwork or Object detail}", + ) + sourceInventoryUrl: Optional[AnyUrl] = Field( + None, + description="URL reference to the metadata record of the inventory maintained by the Source.", + title="Source Inventory URL {Artwork or Object detail}", + ) + currentCopyrightOwnerName: Optional[str] = Field( + None, + description="Name of the current owner of the copyright of the artwork or object.", + title="Current Copyright Owner Name {Artwork or Object detail}", + ) + currentCopyrightOwnerIdentifier: Optional[AnyUrl] = Field( + None, + description="Globally unique identifier for the current owner of the copyright of the artwork or object.", + title="Current Copyright Owner ID {Artwork or Object detail}", + ) + copyrightNotice: Optional[AltLang] = Field( + None, + description=( + "Contains any necessary copyright notice for claiming the intellectual property for artwork or an object in" + " the image and should identify the current owner of the copyright of this work with associated" + " intellectual property rights." + ), + title="Copyright Notice {Artwork or Object detail}", + ) + currentLicensorName: Optional[str] = Field( + None, + description="Name of the current licensor of the artwork or object.", + title="Current Licensor Name {Artwork or Object detail}", + ) + currentLicensorIdentifier: Optional[AnyUrl] = Field( + None, + description="Globally unique identifier for the current licensor of the artwork or object.", + title="Current Licensor ID {Artwork or Object detail}", + ) + + +class CreatorContactInfo(SchemaBaseModel): + class Config: + extra = Extra.forbid + + country: Optional[str] = Field( + None, description="The contact information country part.", title="Country {contact info detail}" + ) + emailwork: Optional[str] = Field( + None, description="The contact information email address part.", title="Email address(es) {contact info detail}" + ) + region: Optional[str] = Field( + None, + description="The contact information part denoting regional information such as state or province.", + title="State/Province {contact info detail}", + ) + phonework: Optional[str] = Field( + None, description="The contact information phone number part.", title="Phone number(s) {contact info detail}" + ) + weburlwork: Optional[str] = Field( + None, + description=( + "The contact information web address part. Multiple addresses can be given. May have to be separated by a" + " comma in the user interface." + ), + title="Web URL(s) {contact info detail}", + ) + address: Optional[str] = Field( + None, + description=( + "The contact information address part. Comprises an optional company name and all required information to" + " locate the building or postbox to which mail should be sent. To that end, the address is a multiline" + " field." + ), + title="Address {contact info detail}", + ) + city: Optional[str] = Field( + None, description="The contact information city part.", title="City {contact info detail}" + ) + postalCode: Optional[str] = Field( + None, + description="The contact information part denoting the local postal code.", + title="Postal Code {contact info detail}", + ) + + +class CvTerm(SchemaBaseModel): + class Config: + extra = Extra.forbid + + cvId: Optional[AnyUrl] = Field( + None, + description="The globally unique identifier of the Controlled Vocabulary the term is from.", + title="CV-Term CV ID {CV-Term detail}", + ) + cvTermName: Optional[AltLang] = Field( + None, + description="The natural language name of the term from a Controlled Vocabulary.", + title="CV-Term name {CV-Term detail}", + ) + cvTermId: Optional[AnyUrl] = Field( + None, + description="The globally unique identifier of the term from a Controlled Vocabulary.", + title="CV-Term ID {CV-Term detail}", + ) + cvTermRefinedAbout: Optional[AnyUrl] = Field( + None, + description="The refined 'about' relationship of the term with the content.", + title="Refined 'about' Relationship of the CV-Term {CV-Term detail}", + ) + + +class Device(SchemaBaseModel): + class Config: + extra = Extra.forbid + + manufacturer: Optional[str] = Field(None, description="Name of the manufacturer of the device") + modelName: Optional[str] = Field(None, description="Name of the device model") + serialNumber: Optional[str] = Field(None, description="Serial number, assigned by manufacturer") + attLensDescription: Optional[str] = Field( + None, description="Short description of the lens used with the device at the time of the recording" + ) + ownerDeviceId: Optional[str] = Field(None, description="Identifier assigned by the owner of the device") + + +class EmbdEncRightsExpr(SchemaBaseModel): + class Config: + extra = Extra.forbid + + encRightsExpr: str = Field( + ..., + description=( + "Embedded serialized rights expression using a rights expression language which is encoded as a string." + ), + title="Encoded Rights Expression", + ) + rightsExprEncType: str = Field( + ..., + description="Encoding type of the rights expression, identified by an IANA Media Type.", + title="Encoding type", + ) + rightsExprLangId: AnyUrl = Field( + ..., + description="Identifier of the rights expression language used by the rights expression.", + title="Rights Expression Language ID", + ) + + +class Entity(SchemaBaseModel): + class Config: + extra = Extra.forbid + + name: Optional[AltLang] = Field(None, description="Full name of the entity/concept", title="Name") + identifiers: Optional[List[AnyUrl]] = Field( + None, description="Globally unique identifier of the entity/concept", title="Identifier" + ) + + +class EntityWRole(SchemaBaseModel): + class Config: + extra = Extra.forbid + + name: Optional[AltLang] = Field(None, description="Full name of the entity/concept", title="Name") + role: Optional[List[AnyUrl]] = Field( + None, description="Identifier of the role the entity has in the context of the metadata property", title="Role" + ) + identifiers: Optional[List[AnyUrl]] = Field( + None, description="Globally unique identifier of the entity/concept", title="Identifier" + ) + + +class EpisodeSeason(SchemaBaseModel): + class Config: + extra = Extra.forbid + + name: Optional[AltLang] = Field(None, description="Name of the episode or season of a series", title="Name") + identifier: Optional[AnyUrl] = Field( + None, description="Identifier of the episode or season of a series", title="Identifier" + ) + number: Optional[float] = Field(None, description="Number of the episode or season of a series", title="Number") + + +class FrameSize(SchemaBaseModel): + class Config: + extra = Extra.forbid + + heightPixels: Optional[int] = Field(None, description="Height of the video frame in pixels", title="Height") + widthPixels: Optional[int] = Field(None, description="Width of the video frame in pixels", title="Width") + + +class LinkedEncRightsExpr(SchemaBaseModel): + class Config: + extra = Extra.forbid + + linkedRightsExpr: AnyUrl = Field( + ..., + description="Link to a rights expression using a rights expression language.", + title="Link to Encoded Rights Expression", + ) + rightsExprEncType: str = Field( + ..., + description="Encoding type of the rights expression, identified by an IANA Media Type.", + title="Encoding type", + ) + rightsExprLangId: AnyUrl = Field( + ..., + description="Identifier of the rights expression language used by the rights expression.", + title="Rights Expression Language ID", + ) + + +class Location(SchemaBaseModel): + class Config: + extra = Extra.forbid + + name: Optional[AltLang] = Field(None, description="Full name of the location", title="Name") + identifiers: Optional[List[AnyUrl]] = Field( + None, description="Globally unique identifier of the location", title="Identifier" + ) + worldRegion: Optional[AltLang] = Field( + None, description="Name of the world region the Location is located in", title="World region name" + ) + countryName: Optional[AltLang] = Field( + None, description="Name of the country the Location is located in", title="Country name" + ) + countryCode: Optional[str] = Field( + None, description="ISO code of the country the Location is located in", title="Country ISO code" + ) + provinceState: Optional[AltLang] = Field( + None, description="Name of the state or province the Location is located in", title="State/Province name" + ) + city: Optional[AltLang] = Field(None, description="Name of the city the Location is located in", title="City name") + sublocation: Optional[AltLang] = Field( + None, description="Name of a sub location the Location is located in", title="Sublocation name" + ) + gpsAltitude: Optional[float] = Field( + None, description="Altitude in meters of a WGS84 based position of this Location", title="GPS-Altitude" + ) + gpsLatitude: Optional[float] = Field( + None, description="Lattitude of a WGS84 based position of this Location", title="GPS-Lattitude" + ) + gpsLongitude: Optional[float] = Field( + None, description="Longitude of a WGS84 based position of this Location", title="GPS-Longitude" + ) + + +class PersonWDetails(SchemaBaseModel): + class Config: + extra = Extra.forbid + + name: Optional[AltLang] = Field(None, description="Name of the person", title="Name") + description: Optional[AltLang] = Field(None, description="A textual description of the person", title="Description") + identifiers: Optional[List[AnyUrl]] = Field( + None, description="Globally unique identifier of the person", title="Identifier" + ) + characteristics: Optional[List[CvTerm]] = Field( + None, description="A property or trait of the person", title="Characteristics" + ) + + +class Product(SchemaBaseModel): + class Config: + extra = Extra.forbid + + description: Optional[AltLang] = Field( + None, description="A textual description of the product.", title="Description {Product detail}" + ) + gtin: str = Field( + ..., + description="A 14 digit GTIN (Global Trade Item Number) of the product (GTIN-8 to GTIN-14 codes are used).", + title="GTIN {Product detail}", + ) + name: Optional[AltLang] = Field(None, description="Name of the product.", title="Name {Product detail}") + + +class ProductWGtin(SchemaBaseModel): + class Config: + extra = Extra.forbid + + name: Optional[AltLang] = Field(None, description="Name of the product.", title="Name") + gtin: str = Field( + ..., + description="A 14 digit GTIN (Global Trade Item Number) of the product (GTIN-8 to GTIN-14 codes are used).", + title="GTIN", + ) + description: Optional[AltLang] = Field( + None, description="A textual description of the product.", title="Description" + ) + + +class PublicationEvent(SchemaBaseModel): + class Config: + extra = Extra.forbid + + date: datetime = Field( + ..., description="Date and optionally the time of publishing the video", title="Publication Date" + ) + name: Optional[AltLang] = Field( + None, description="Name of the event for publishing this video.", title="Publication Event Name" + ) + identifier: Optional[AnyUrl] = Field( + None, description="Identifier of the event for publishing this video", title="Publication Event Identifier" + ) + + +class QualifiedLink(SchemaBaseModel): + class Config: + extra = Extra.forbid + + link: Optional[AnyUrl] = Field(None, description="URL of the link", title="Link") + linkQualifier: Optional[AnyUrl] = Field(None, description="Term qualifying the use of the link", title="Qualifier") + + +class Rating(SchemaBaseModel): + class Config: + extra = Extra.forbid + + ratingSourceLink: AnyUrl = Field( + ..., + description=( + "Link to the site and optionally the page of the party which has issued the rating value, linked resource" + " should explain the rating rules." + ), + title="Rating Source Link", + ) + ratingValue: str = Field(..., description="Rating value as issued by the rating source", title="Rating Value") + ratingScaleMinValue: Optional[str] = Field( + None, + description="The value of the rating scale used for the lowest/worst rating", + title="Rating Scale Min Value", + ) + ratingRegions: Optional[List[Location]] = Field( + None, description="Geopolitical region to which this rating applies.", title="Rating Region" + ) + ratingValueLogoLink: Optional[AnyUrl] = Field( + None, description="Visualisation of the rating value referenced by a link", title="Rating Value Logo" + ) + ratingScaleMaxValue: Optional[str] = Field( + None, + description="The value of the rating scale used for the highest/best rating", + title="Rating Scale Max Value", + ) + + +class MeasureType(Enum): + """ + How the measures of the rectangle are expressed + """ + + dummy1 = "dummy1" + + +class RegionWDelimiter(SchemaBaseModel): + class Config: + extra = Extra.forbid + + regionAreaX: Optional[float] = Field( + None, + description="Horizontal axis value of the upper left corner of the rectange", + title="Rectangle, upper left X", + ) + regionAreaY: Optional[float] = Field( + None, + description="Vertical axis value of the upper left corner of the rectange", + title="Rectangle, upper left Y", + ) + measureType: Optional[MeasureType] = Field( + None, description="How the measures of the rectangle are expressed", title="Measure Type" + ) + regionAreaHeight: Optional[float] = Field( + None, description="Vertical height of the rectangle", title="Rectangle, vertical size" + ) + regionText: str = Field(..., description="Text or textual data", title="Text") + regionAreaWidth: Optional[float] = Field( + None, description="Horizontal width of the rectangle", title="Rectangle, horizontal size" + ) + + +class RegistryEntry(SchemaBaseModel): + class Config: + extra = Extra.forbid + + role: Optional[AnyUrl] = Field( + None, description="An identifier of the reason and/or purpose for this Registry Entry.", title="Role" + ) + assetIdentifier: str = Field( + ..., description="Unique identifier of the video as issued by a registry", title="Asset Identifier" + ) + registryIdentifier: AnyUrl = Field( + ..., + description="An identifier for the registry which issued the identifier of the video.", + title="Registry Identifier", + ) + + +class Series(SchemaBaseModel): + class Config: + extra = Extra.forbid + + name: Optional[AltLang] = Field(None, description="Name of the series", title="Series name") + identifier: Optional[AnyUrl] = Field(None, description="Identifier for the series", title="Series identifier") + + +class TemporalCoverage(SchemaBaseModel): + class Config: + extra = Extra.forbid + + tempCoverageFrom: Optional[datetime] = Field( + None, description="Optionally truncated date when the temporal coverage starts", title="From Date" + ) + tempCoverageTo: Optional[datetime] = Field( + None, description="Optionally truncated date when the temporal coverage ends", title="To Date" + ) + + +class TimeFormat(Enum): + """ + Identifier of the time format. For time code formats following SMPTE specifications. + """ + + dummy1 = "dummy1" + + +class VideoTime(SchemaBaseModel): + """ + Frame of the video used for this still image + """ + + class Config: + extra = Extra.forbid + + timeValue: str = Field( + ..., + description=( + "Formated string including hours, minutes, seconds, fractions of seconds or frames, depending on the Time" + " Format" + ), + title="Time Value", + ) + timeFormat: TimeFormat = Field( + ..., + description="Identifier of the time format. For time code formats following SMPTE specifications.", + title="Time Format", + ) + + +class XmpSequence(SchemaBaseModel): + """ + Reflects the structure of an rdf:Seq in XMP/XML + """ + + class Config: + extra = Extra.forbid + + Ordered: Optional[List[Dict[str, Any]]] = None + + +class Topic(SchemaBaseModel): + id: Optional[str] = Field(None, title="Unique Identifier") + name: str = Field(..., title="Topic") + parent_id: Optional[str] = Field( + None, description="For subtopics, provide the ID of the parent topic", title="Parent topic Identifier" + ) + vocabulary: Optional[str] = Field( + None, description="Name of the controlled vocabulary, if the topic is from a taxonomy.", title="Vocabulary" + ) + uri: Optional[str] = Field( + None, + description="Link to the controlled vocabulary web page, if the topic is from a taxonomy.", + title="Vocabulary URI", + ) + + +class Keyword(SchemaBaseModel): + name: str = Field(..., title="Name") + vocabulary: Optional[str] = Field(None, title="Vocabulary name") + uri: Optional[str] = Field(None, title="Vocabulary URI") + + +class CountryItem(SchemaBaseModel): + name: str = Field(..., title="Country name") + code: Optional[str] = Field(None, title="Country code") + + +class Gps(SchemaBaseModel): + """ + Geographic location of where the photo was taken + """ + + latitude: Optional[confloat(ge=-90.0, le=90.0)] = None + longitude: Optional[confloat(ge=-180.0, le=180.0)] = None + altitude: Optional[float] = None + + +class Language(SchemaBaseModel): + name: str = Field(..., title="Name") + code: Optional[str] = Field(None, title="Code") + + +class Type(Enum): + isPartOf = "isPartOf" + hasPart = "hasPart" + isVersionOf = "isVersionOf" + isFormatOf = "isFormatOf" + hasFormat = "hasFormat" + references = "references" + isReferencedBy = "isReferencedBy" + isBasedOn = "isBasedOn" + isBasisFor = "isBasisFor" + requires = "requires" + isRequiredBy = "isRequiredBy" + + +class Relation(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + type: Optional[Type] = Field(None, title="Type") + uri: Optional[str] = Field(None, description="Link to related resource", title="URI") + + +class DcmiSchema(SchemaBaseModel): + """ + Schema based on DCMI elements + """ + + type: Optional[str] = Field("image", description="Type of resource e.g. image", title="Type of resource") + title: str = Field(..., title="Photo title") + caption: Optional[str] = Field(None, title="Photo caption") + description: Optional[str] = Field(None, description="Description") + topics: Optional[List[Topic]] = Field(None, title="Topics") + keywords: Optional[List[Keyword]] = None + creator: Optional[str] = Field(None, description="Name of the person or organization", title="Creator") + contributor: Optional[str] = Field( + None, description="Name of the contributing person or organization", title="Contributor" + ) + publisher: Optional[str] = Field(None, title="Publisher") + date: Optional[str] = Field(None, description="Date when the photo was taken. use format YYYY-MM-DD", title="Date") + country: Optional[List[CountryItem]] = Field(None, title="Country") + coverage: Optional[str] = Field(None, title="Geographic coverage") + gps: Optional[Gps] = Field( + None, description="Geographic location of where the photo was taken", title="Geographic location" + ) + format: Optional[str] = Field( + None, + description=( + "Image file format e.g. `image/gif` - Image, GIF \n* `image/jpeg` - Image, JPEG \n* `image/png` - Image," + " PNG \n* `image/tiff` - Image, TIFF" + ), + title="Image format", + ) + languages: Optional[List[Language]] = Field( + None, description="Metadata language e.g. English, French, etc.", title="Language" + ) + relations: Optional[List[Relation]] = Field(None, title="Related resources") + rights: Optional[str] = Field(None, description="Copyrights", title="Rights") + source: Optional[str] = Field(None, description="Related resource from which resource is derived", title="Source") + note: Optional[str] = Field( + None, description="Any additional information not covered by other fields", title="Notes" + ) + + +class OriginDescription(SchemaBaseModel): + harvest_date: Optional[str] = Field(None, description="Harvest date using UTC date format") + altered: Optional[bool] = Field( + None, description="If the metadata was altered before dissemination", title="Metadata altered" + ) + base_url: Optional[str] = Field(None, description="Base URL of the originating repository") + identifier: Optional[str] = Field(None, description="Unique idenifiter of the item from the originating repository") + date_stamp: Optional[str] = Field( + None, + description="Datestamp (UTC date format) of the metadata record disseminated by the originating repository", + ) + metadata_namespace: Optional[str] = Field( + None, + description=( + "Metadata namespace URI of the metadata format of the record harvested from the originating repository" + ), + ) + + +class ProvenanceSchema(SchemaBaseModel): + """ + Provenance of metadata based on the OAI provenance schema (http://www.openarchives.org/OAI/2.0/provenance.xsd) + """ + + origin_description: Optional[OriginDescription] = Field(None, title="Origin description") + + +class PhotoVideoMetadataIPTC(SchemaBaseModel): + """ + Container for IPTC photo/video metadata + """ + + class Config: + extra = Extra.forbid + + title: Optional[AltLang] = Field( + None, + description=( + "A shorthand reference for the digital image. Title provides a short human readable name which can be a" + " text and/or numeric reference. It is not the same as Headline." + ), + title="Title", + ) + imageSupplierImageId: Optional[str] = Field( + None, + description="Optional identifier assigned by the Image Supplier to the image.", + title="Image Supplier Image ID", + ) + registryEntries: Optional[List[RegistryEntry]] = Field( + None, + description=( + "Both a Registry Item Id and a Registry Organisation Id to record any registration of this digital image" + " with a registry." + ), + title="Image Registry Entry", + ) + digitalImageGuid: Optional[str] = Field( + None, + description=( + "Globally unique identifier for this digital image. It is created and applied by the creator of the digital" + " image at the time of its creation . This value shall not be changed after that time." + ), + title="Digital Image GUID", + ) + dateCreated: Optional[datetime] = Field( + None, + description=( + "Designates the date and optionally the time the content of the image was created rather than the date of" + " the creation of the digital representation." + ), + title="Date Created", + ) + headline: Optional[AltLang] = Field( + None, description="A brief synopsis of the caption. Headline is not the same as Title.", title="Headline" + ) + eventName: Optional[AltLang] = Field( + None, description="Names or describes the specific event at which the photo was taken.", title="Event" + ) + description: Optional[AltLang] = Field( + None, description="A textual description, including captions, of the image.", title="Description" + ) + captionWriter: Optional[str] = Field( + None, + description=( + "Identifier or the name of the person involved in writing, editing or correcting the description of the" + " image." + ), + title="Description Writer", + ) + keywords: Optional[List[str]] = Field( + None, + description=( + "Keywords to express the subject of the image. Keywords may be free text and don't have to be taken from a" + " controlled vocabulary. Codes from the controlled vocabulary IPTC Subject NewsCodes must go to the" + ' "Subject Code" field.' + ), + title="Keywords", + ) + sceneCodes: Optional[List[str]] = Field( + None, + description=( + 'Describes the scene of a photo content. Specifies one ore more terms from the IPTC "Scene-NewsCodes". Each' + " Scene is represented as a string of 6 digits in an unordered list." + ), + title="Scene Code", + ) + sceneCodesLabelled: Optional[List[SceneCodesLabelledItem]] = Field( + None, + description=( + 'Describes the scene of a photo content. Specifies one ore more terms from the IPTC "Scene-NewsCodes". Each' + " Scene is represented as a string of 6 digits in an unordered list." + ), + title="Scene Codes", + ) + subjectCodes: Optional[List[str]] = Field( + None, + description=( + "Specifies one or more Subjects from the IPTC Subject-NewsCodes taxonomy to categorise the image. Each" + " Subject is represented as a string of 8 digits in an unordered list." + ), + title="Subject Code", + ) + subjectCodesLabelled: Optional[List[SubjectCodesLabelledItem]] = Field( + None, + description=( + "Specifies one or more Subjects from the IPTC Subject-NewsCodes taxonomy to categorise the image. Each" + " Subject is represented as a string of 8 digits in an unordered list." + ), + title="Subject Codes", + ) + creatorNames: Optional[List[str]] = Field( + None, + description=( + "Contains the name of the photographer, but in cases where the photographer should not be identified the" + " name of a company or organisation may be appropriate." + ), + title="Creator", + ) + creatorContactInfo: Optional[CreatorContactInfo] = Field( + None, + description=( + "The creator's contact information provides all necessary information to get in contact with the creator of" + " this image and comprises a set of sub-properties for proper addressing." + ), + title="Creator's Contact Info", + ) + creditLine: Optional[str] = Field( + None, + description=( + "The credit to person(s) and/or organisation(s) required by the supplier of the image to be used when" + " published. This is a free-text field." + ), + title="Credit Line", + ) + digitalSourceType: Optional[AnyUrl] = Field( + None, description="The type of the source of this digital image", title="Digital Source Type" + ) + jobid: Optional[str] = Field( + None, + description=( + "Number or identifier for the purpose of improved workflow handling. This is a user created identifier" + " related to the job for which the image is supplied." + ), + title="Job Id", + ) + jobtitle: Optional[str] = Field( + None, + description=( + "Contains the job title of the photographer. As this is sort of a qualifier the Creator element has to be" + " filled in as mandatory prerequisite for using Creator's Jobtitle." + ), + title="Creator's jobtitle", + ) + source: Optional[str] = Field( + None, + description=( + "The name of a person or party who has a role in the content supply chain. This could be an agency, a" + " member of an agency, an individual or a combination. Source could be different from Creator and from the" + " entities in the Copyright Notice." + ), + title="Source", + ) + locationsShown: Optional[List[Location]] = Field( + None, description="The location the photo was taken.", title="Location created" + ) + imageRating: Optional[int] = Field(None, description="Rating of the image by its user or supplier") + supplier: Optional[List[Entity]] = Field( + None, + description="Identifies the most recent supplier of the image, who is not necessarily its owner or creator.", + title="Image Supplier", + ) + copyrightNotice: Optional[AltLang] = Field( + None, + description=( + "Contains any necessary copyright notice for claiming the intellectual property for this photograph and" + " should identify the current owner of the copyright for the photograph. Other entities like the creator of" + " the photograph may be added in the corresponding field. Notes on usage rights should be provided in" + ' "Rights usage terms".' + ), + title="Copyright Notice", + ) + copyrightOwners: Optional[List[EntityWRole]] = Field( + None, description="Owner or owners of the copyright in the licensed image.", title="Copyright Owner" + ) + usageTerms: Optional[AltLang] = Field( + None, description="The licensing parameters of the image expressed in free-text.", title="Rights Usage Terms" + ) + embdEncRightsExpr: Optional[List[EmbdEncRightsExpr]] = Field( + None, + description="An embedded rights expression using any rights expression language", + title="Embedded Encoded Rights Expression", + ) + linkedEncRightsExpr: Optional[List[LinkedEncRightsExpr]] = Field( + None, + description="A linked rights expression using any rights expression language.", + title="Linked Encoded Rights Expression", + ) + webstatementRights: Optional[AnyUrl] = Field( + None, + description=( + "URL referencing a web resouce providing a statement of the copyright ownership and usage rights of the" + " image." + ), + ) + instructions: Optional[str] = Field( + None, + description=( + "Any of a number of instructions from the provider or creator to the receiver of the image which might" + " include any of the following: embargoes (NewsMagazines OUT) and other restrictions not covered by the" + ' "Rights Usage Terms" field; information regarding the original means of capture (scanning notes,' + " colourspace info) or other specific text information that the user may need for accurate reproduction;" + " additional permissions required when publishing; credits for publishing if they exceed the IIM length of" + " the credit field" + ), + title="Instructions", + ) + genres: Optional[List[CvTerm]] = Field( + None, + description=( + "Artistic, style, journalistic, product or other genre(s) of the image (expressed by a term from any" + " Controlled Vocabulary)" + ), + title="Genre", + ) + intellectualGenre: Optional[str] = Field( + None, + description="Describes the nature, intellectual, artistic or journalistic characteristic of an image.", + title="Intellectual Genre", + ) + artworkOrObjects: Optional[List[ArtworkOrObject]] = Field( + None, + description="A set of metadata about artwork or an object in the image", + title="Artwork or Object in the Image", + ) + personInImageNames: Optional[List[str]] = Field( + None, description="Name of a person shown in the image.", title="Person Shown in the Image" + ) + personsShown: Optional[List[PersonWDetails]] = Field( + None, description="Details about a person the content is about.", title="Person Shown in the Image with Details" + ) + modelAges: Optional[List[int]] = Field( + None, + description="Age of the human model(s) at the time this image was taken in a model released image.", + title="Model Age", + ) + additionalModelInfo: Optional[str] = Field( + None, + description="Information about the ethnicity and other facets of the model(s) in a model-released image.", + title="Additional Model Information", + ) + minorModelAgeDisclosure: Optional[AnyUrl] = Field( + None, + description="Age of the youngest model pictured in the image, at the time that the image was made.", + title="Minor Model Age Disclosure", + ) + modelReleaseDocuments: Optional[List[str]] = Field( + None, description="Optional identifier associated with each Model Release.", title="Model Release Id" + ) + modelReleaseStatus: Optional[CvTerm] = Field( + None, + description=( + "Summarises the availability and scope of model releases authorising usage of the likenesses of persons" + " appearing in the photograph." + ), + title="Model Release Status", + ) + organisationInImageCodes: Optional[List[str]] = Field( + None, + description=( + "Code from a controlled vocabulary for identifying the organisation or company which is featured in the" + " image." + ), + title="Code of Organisation Featured in the Image", + ) + organisationInImageNames: Optional[List[str]] = Field( + None, + description="Name of the organisation or company which is featured in the image.", + title="Name of Organisation Featured in the Image", + ) + productsShown: Optional[List[Product]] = Field( + None, description="A product the content is about.", title="Product Shown in the Image" + ) + maxAvailHeight: Optional[int] = Field( + None, + description=( + "The maximum available height in pixels of the original photo from which this photo has been derived by" + " downsizing." + ), + title="Max Avail Height", + ) + maxAvailWidth: Optional[int] = Field( + None, + description=( + "The maximum available width in pixels of the original photo from which this photo has been derived by" + " downsizing." + ), + title="Max Avail Width", + ) + propertyReleaseStatus: Optional[CvTerm] = Field( + None, + description=( + "Summarises the availability and scope of property releases authorising usage of the properties appearing" + " in the photograph." + ), + title="Property Release Status", + ) + propertyReleaseDocuments: Optional[List[str]] = Field( + None, description="Optional identifier associated with each Property Release.", title="Property Release Id" + ) + aboutCvTerms: Optional[List[CvTerm]] = Field( + None, + description=( + "One or more topics, themes or entities the content is about, each one expressed by a term from a" + " Controlled Vocabulary." + ), + title="CV-Term About Image", + ) + + +class IptcPmdSchema(SchemaBaseModel): + """ + Overall structure of photo metadata of a single media asset - sets of metadata for the whole asset and parts of the asset -- the properties comply with the IPTC Photo Metadata Standard 2017.1(IPTC/MS/2017-07-06) + """ + + class Config: + extra = Extra.forbid + + photoVideoMetadataIPTC: PhotoVideoMetadataIPTC = Field(..., description="Container for IPTC photo/video metadata") + + +class LinkedImage(SchemaBaseModel): + class Config: + extra = Extra.forbid + + link: AnyUrl = Field(..., description="Link URL locating the image resource") + mediaType: Optional[str] = Field(None, description="IANA Media (MIME) Type") + widthPixels: Optional[int] = Field(None, description="Width of the image in pixels") + heightPixels: Optional[int] = Field(None, description="Height of the image in pixels") + role: Optional[str] = Field(None, description="Role of this image in the context of the video") + linkQualifiers: Optional[List[AnyUrl]] = Field( + None, description="Qualifier of the relationship of the image with the video" + ) + usedVideoFrame: Optional[VideoTime] = None + + +class ImageDescription(SchemaBaseModel): + idno: Optional[str] = Field(None, description="Image unique identifier", title="Image unique identifier") + identifiers: Optional[List[Identifier]] = Field(None, description="Other identifiers", title="Other identifiers") + iptc: Optional[IptcPmdSchema] = None + dcmi: Optional[DcmiSchema] = None + license: Optional[List[LicenseItem]] = Field(None, title="License") + album: Optional[List[AlbumItem]] = Field(None, title="Album") + + +class ImageDataTypeSchema(SchemaBaseModel): + """ + Uses IPTC JSON schema. See for more details - http://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata. + """ + + repositoryid: Optional[str] = Field( + "central", + description="Abbreviation for the collection that owns the document", + title="Collection ID that owns the document", + ) + published: Optional[int] = Field("0", description="Status `0=draft`, `1=published`", title="Status") + overwrite: Optional[Overwrite] = Field("no", description="Overwrite document if already exists?") + metadata_information: Optional[MetadataInformation] = Field( + None, description="Document description", title="Document metadata information" + ) + image_description: Optional[ImageDescription] = None + provenance: Optional[List[ProvenanceSchema]] = Field(None, description="Provenance") + tags: Optional[List[Tag]] = Field(None, description="Tags", title="Tags") + lda_topics: Optional[List[LdaTopic]] = Field(None, description="LDA topics", title="LDA topics") + embeddings: Optional[List[Embedding]] = Field(None, description="Word embeddings", title="Word embeddings") + additional: Optional[Dict[str, Any]] = Field(None, description="Additional metadata") diff --git a/pydantic_schemas/microdata-schema.py b/pydantic_schemas/microdata-schema.py new file mode 100644 index 0000000..c62c266 --- /dev/null +++ b/pydantic_schemas/microdata-schema.py @@ -0,0 +1,1446 @@ +# generated by datamodel-codegen: +# filename: microdata-schema.json +# timestamp: 2024-07-02T16:12:55+00:00 + +from __future__ import annotations + +from enum import Enum +from typing import Any, Dict, List, Optional, Union + +from pydantic import Extra, Field, constr + +from .schema_base_model import SchemaBaseModel + + +class AccessPolicy(Enum): + """ + Data access policy for attached microdata resources + """ + + direct = "direct" + open = "open" + public = "public" + licensed = "licensed" + remote = "remote" + data_na = "data_na" + + +class Overwrite(Enum): + """ + Overwrite survey if already exists? + """ + + yes = "yes" + no = "no" + + +class Tag(SchemaBaseModel): + tag: Optional[str] = Field(None, title="Tag") + tag_group: Optional[str] = Field(None, title="Tag group") + + +class ModelInfoItem(SchemaBaseModel): + source: Optional[str] = Field(None, title="Source") + author: Optional[str] = Field(None, title="Author") + version: Optional[str] = Field(None, title="Version") + model_id: Optional[str] = Field(None, title="Model Identifier") + nb_topics: Optional[float] = Field(None, title="Number of topics") + description: Optional[str] = Field(None, title="Description") + corpus: Optional[str] = Field(None, title="Corpus name") + uri: Optional[str] = Field(None, title="URI") + + +class TopicWord(SchemaBaseModel): + word: Optional[str] = Field(None, title="Word") + word_weight: Optional[float] = Field(None, title="Word weight") + + +class TopicDescriptionItem(SchemaBaseModel): + topic_id: Optional[Union[int, str]] = Field(None, title="Topic identifier") + topic_score: Optional[Union[float, str]] = Field(None, title="Topic score") + topic_label: Optional[str] = Field(None, title="Topic label") + topic_words: Optional[List[TopicWord]] = Field(None, description="Words", title="Topic words") + + +class LdaTopic(SchemaBaseModel): + class Config: + extra = Extra.forbid + + model_info: Optional[List[ModelInfoItem]] = Field(None, title="Model information") + topic_description: Optional[List[TopicDescriptionItem]] = Field(None, title="Topic information") + + +class Embedding(SchemaBaseModel): + id: str = Field(..., title="Vector Model ID") + description: Optional[str] = Field(None, title="Vector Model Description") + date: Optional[str] = Field(None, title="Date (YYYY-MM-DD)") + vector: Dict[str, Any] = Field(..., title="Vector") + + +class DatafileSchema(SchemaBaseModel): + file_id: str = Field(..., title="File unique ID") + file_name: str = Field(..., title="File name") + file_type: Optional[str] = Field( + None, + description=( + "Types of data files include raw data (ASCII, EBCDIC, etc.) and software-dependent files such as SAS" + " datasets, SPSS export files, etc." + ), + title="File type", + ) + description: Optional[str] = Field(None, title="File description") + case_count: Optional[int] = Field(None, title="Cases count") + var_count: Optional[int] = Field(None, title="Variable count") + producer: Optional[str] = Field(None, description="File producer") + data_checks: Optional[str] = Field(None, title="Processing checks") + missing_data: Optional[str] = Field(None, title="Missing data") + version: Optional[str] = Field(None, title="Version") + notes: Optional[str] = Field(None, title="File notes") + + +class VarIntrvl(Enum): + """ + indicates the interval type; options are discrete or continuous. + """ + + discrete = "discrete" + contin = "contin" + + +class VarSumstatItem(SchemaBaseModel): + type: Optional[str] = Field(None, title="Type") + value: Optional[Union[int, str]] = Field(None, title="Value") + wgtd: Optional[str] = Field(None, description="For weighted values, enter `weighted`", title="Weighted") + + +class Stat(SchemaBaseModel): + type: Optional[str] = Field(None, description="Type such as frequency, percent, etc", title="Type") + value: Optional[Union[int, str]] = Field(None, title="Value") + wgtd: Optional[str] = Field(None, description="For weighted values, enter `weighted`", title="Weighted") + + +class VarCatgryItem(SchemaBaseModel): + value: Optional[str] = Field(None, title="Value") + label: Optional[str] = Field(None, title="Label") + stats: Optional[List[Stat]] = Field( + None, description="Category level statistics e.g. frequency", title="Category statistics" + ) + + +class VarStdCatgry(SchemaBaseModel): + """ + Standard category codes used in the variable, like industry codes, employment codes, or social class codes. The attribute `date` is provided to indicate the version of the code in place at the time of the study. The attribute `URI` is provided to indicate a URN or URL that can be used to obtain an electronic list of the category codes. + """ + + name: Optional[str] = Field(None, title="Standard classification name") + source: Optional[str] = Field(None, title="Source") + date: Optional[str] = Field(None, title="Date") + uri: Optional[str] = Field(None, title="URI") + + +class VarConceptItem(SchemaBaseModel): + title: str = Field(..., title="Concept") + vocab: Optional[str] = Field(None, title="Vocabulary") + uri: Optional[str] = Field(None, title="Vocabulary URI") + + +class VarFormat(SchemaBaseModel): + """ + The technical format of the variable in question. Attributes for this element include: 'type', which indicates if the variable is character or numeric; 'formatname,' which in some cases may provide the name of the particular, proprietary format actually used; 'schema,' which identifies the vendor or standards body that defined the format (acceptable choices are SAS, SPSS, IBM, ANSI, ISO, XML-data or other); 'category,' which describes what kind of data the format represents, and includes date, time, currency, or 'other' conceptual possibilities. + """ + + type: Optional[str] = Field(None, title="Type") + name: Optional[str] = Field(None, title="Name") + note: Optional[str] = Field(None, title="Note") + + +class VariableSchema(SchemaBaseModel): + file_id: str = Field(..., description="File to which the variable belongs", title="File ID e.g. F1") + vid: str = Field(..., description="Unique variable ID e.g. V1, V2", title="Variable unique ID") + name: str = Field(..., title="Variable name") + labl: str = Field(..., title="Variable label") + var_intrvl: Optional[VarIntrvl] = Field( + None, description="indicates the interval type; options are discrete or continuous.", title="Interval type" + ) + var_dcml: Optional[str] = Field( + None, description="Number of decimal points in the variable", title="Variable decimal points" + ) + var_wgt: Optional[int] = Field(0, description="indicates whether the variable is a weight", title="Weight") + loc_start_pos: Optional[int] = Field(None, title="Variable start position") + loc_end_pos: Optional[int] = Field(None, title="Variable end position") + loc_width: Optional[int] = Field(None, title="Variable width") + loc_rec_seg_no: Optional[int] = Field( + None, title="Record segment number, deck or card number the variable is located on" + ) + var_imputation: Optional[str] = Field( + None, + description=( + "According to the Statistical Terminology glossary maintained by the National Science Foundation, this is" + " `the process by which one estimates missing values for items that a survey respondent failed to provide,`" + " and if applicable in this context, it refers to the type of procedure used. " + ), + title="Imputation", + ) + var_derivation: Optional[str] = Field( + None, + description=( + "Used only in the case of a derived variable, this element provides both a description of how the" + " derivation was performed and the command used to generate the derived variable, as well as a" + " specification of the other variables in the study used to generate the derivation. The `var` attribute" + " provides the ID values of the other variables in the study used to generate this derived variable." + ), + title="Derivation", + ) + var_security: Optional[str] = Field(None, title="Security") + var_respunit: Optional[str] = Field(None, title="Source of information") + var_qstn_preqtxt: Optional[str] = Field( + None, + description="Text describing a set of conditions under which a question might be asked.", + title="Pre-question text", + ) + var_qstn_qstnlit: Optional[str] = Field(None, title="Literal question") + var_qstn_postqtxt: Optional[str] = Field(None, title="Post-question text") + var_forward: Optional[str] = Field( + None, + description=( + "Contains a reference to IDs of possible following questions. This can be used to document forward skip" + " instructions." + ), + title="Forward skip", + ) + var_backward: Optional[str] = Field( + None, + description=( + "Contains a reference to IDs of possible preceding questions. This can be used to document backward skip" + " instructions." + ), + title="Backward skip", + ) + var_qstn_ivulnstr: Optional[str] = Field(None, title="Interviewer instructions") + var_universe: Optional[str] = Field(None, title="Universe") + var_sumstat: Optional[List[VarSumstatItem]] = Field( + None, + description=( + "One or more statistical measures that describe the responses to a particular variable and may include one" + " or more standard summaries, e.g., minimum and maximum values, median, mode, etc. \n\n The attribute" + " 'type' denotes the type of statistics being shown: mean, median, mode, valid cases, invalid cases," + " minimum, maximum, or standard deviation." + ), + ) + var_txt: Optional[str] = Field(None, title="Variable description") + var_catgry: Optional[List[VarCatgryItem]] = Field(None, title="Categories") + var_std_catgry: Optional[VarStdCatgry] = Field( + None, + description=( + "Standard category codes used in the variable, like industry codes, employment codes, or social class" + " codes. The attribute `date` is provided to indicate the version of the code in place at the time of the" + " study. The attribute `URI` is provided to indicate a URN or URL that can be used to obtain an electronic" + " list of the category codes." + ), + title="Standard categories", + ) + var_codinstr: Optional[str] = Field(None, title="Recoding and derivation") + var_concept: Optional[List[VarConceptItem]] = Field(None, title="Concepts") + var_format: Optional[VarFormat] = Field( + None, + description=( + "The technical format of the variable in question. Attributes for this element include: 'type', which" + " indicates if the variable is character or numeric; 'formatname,' which in some cases may provide the name" + " of the particular, proprietary format actually used; 'schema,' which identifies the vendor or standards" + " body that defined the format (acceptable choices are SAS, SPSS, IBM, ANSI, ISO, XML-data or other);" + " 'category,' which describes what kind of data the format represents, and includes date, time, currency," + " or 'other' conceptual possibilities." + ), + title="Variable format", + ) + var_notes: Optional[str] = Field(None, title="Variable notes") + + +class GroupType(Enum): + subject = "subject" + section = "section" + multiResp = "multiResp" + grid = "grid" + display = "display" + repetition = "repetition" + version = "version" + iteration = "iteration" + analysis = "analysis" + pragmatic = "pragmatic" + record = "record" + file = "file" + randomized = "randomized" + other = "other" + + +class VariableGroupSchema(SchemaBaseModel): + vgid: constr(max_length=45) = Field( + ..., description="Unique ID for the variable group e.g. VG1", title="Variable Group ID" + ) + variables: Optional[constr(max_length=5000)] = Field( + None, description="List of variables for the group seperated by space e.g. V1 V2 V3", title="Variables" + ) + variable_groups: Optional[constr(max_length=1000)] = Field( + None, description="List of sub-groups e.g. VG2 VG3 VG4", title="Variable groups" + ) + group_type: Optional[GroupType] = Field(None, title="Type") + label: Optional[constr(max_length=255)] = Field(None, title="Label") + universe: Optional[constr(max_length=255)] = Field(None, title="Universe") + notes: Optional[constr(max_length=500)] = Field(None, title="Notes") + txt: Optional[constr(max_length=500)] = Field(None, title="Text") + definition: Optional[constr(max_length=500)] = Field(None, title="Definition") + + +class Producer(SchemaBaseModel): + name: Optional[str] = Field(None, description="Name (required)", title="Name") + abbr: Optional[str] = Field(None, title="Abbreviation") + affiliation: Optional[str] = Field(None, title="Affiliation") + role: Optional[str] = Field(None, title="Role") + + +class VersionStatement(SchemaBaseModel): + """ + Version Statement + """ + + version: Optional[str] = Field(None, title="Version") + version_date: Optional[str] = Field(None, title="Version Date") + version_resp: Optional[str] = Field( + None, + description="The organization or person responsible for the version of the work", + title="Version Responsibility Statement", + ) + version_notes: Optional[str] = Field(None, title="Version Notes") + + +class DocDesc(SchemaBaseModel): + """ + Document Description + """ + + class Config: + extra = Extra.forbid + + title: Optional[str] = Field(None, description="Document title", title="Document title") + idno: Optional[str] = Field(None, title="Unique ID number for the document") + producers: Optional[List[Producer]] = Field(None, description="List of producers", title="Producers") + prod_date: Optional[str] = Field( + None, description="Document production date using format(YYYY-MM-DD)", title="Date of Production" + ) + version_statement: Optional[VersionStatement] = Field( + None, description="Version Statement", title="Version Statement" + ) + + +class Identifier(SchemaBaseModel): + type: Optional[str] = Field( + None, description="Type of identifier e.g. `doi`, `handle`, `other`", title="Identifier type" + ) + identifier: str = Field(..., title="Identifier") + + +class TitleStatement(SchemaBaseModel): + """ + Study title + """ + + idno: str = Field( + ..., + description=( + "The ID number of a dataset is a unique number that is used to identify a particular survey. Define and use" + " a consistent scheme to use. Such an ID could be constructed as follows:" + " country-producer-survey-year-version where \n - country is the 3-letter ISO country abbreviation \n -" + " producer is the abbreviation of the producing agency \n - survey is the survey abbreviation \n - year is" + " the reference year (or the year the survey started) \n - version is the number dataset version number" + " (see Version Description below)" + ), + title="Unique user defined ID", + ) + identifiers: Optional[List[Identifier]] = Field(None, description="Other identifiers", title="Other identifiers") + title: str = Field( + ..., + description=( + "The title is the official name of the survey as it is stated on the questionnaire or as it appears in the" + " design documents. The following items should be noted:\n - Include the reference year(s) of the survey in" + " the title. \n - Do not include the abbreviation of the survey name in the title. \n - As the survey title" + " is a proper noun, the first letter of each word should be capitalized (except for prepositions or other" + " conjunctions).\n - Including the country name in the title is optional." + ), + title="Survey title", + ) + sub_title: Optional[str] = Field(None, description="A short subtitle for the survey", title="Survey subtitle") + alternate_title: Optional[str] = Field( + None, + description=( + "The abbreviation of a survey is usually the first letter of each word of the titled survey. The survey" + " reference year(s) may be included." + ), + title="Abbreviation or Acronym", + ) + translated_title: Optional[str] = Field( + None, + description="In countries with more than one official language, a translation of the title may be provided.", + title="Translated Title", + ) + + +class AuthoringEntityItem(SchemaBaseModel): + name: str = Field(..., title="Agency Name") + affiliation: Optional[str] = Field(None, title="Affiliation") + + +class OthIdItem(SchemaBaseModel): + name: str = Field(..., description="Person or Agency name", title="Name") + role: Optional[str] = Field(None, title="Role") + affiliation: Optional[str] = Field(None, title="Affiliation") + + +class FundingAgency(SchemaBaseModel): + name: str = Field(..., title="Funding Agency/Sponsor") + abbr: Optional[str] = Field(None, title="Abbreviation") + grant: Optional[str] = Field(None, title="Grant Number") + role: Optional[str] = Field(None, title="Role") + + +class ProductionStatement(SchemaBaseModel): + """ + Production Statement + """ + + producers: Optional[List[Producer]] = Field(None, description="List of producers", title="Producers") + copyright: Optional[str] = Field(None, title="Copyright") + prod_date: Optional[str] = Field( + None, + description=( + "Date when the marked-up document/marked-up document source/data collection/other material(s) were produced" + " (not distributed or archived). The ISO standard for dates (YYYY-MM-DD) is recommended for use with the" + " date attribute. Production date for data collection (2.1.3.3) maps to Dublin Core Date element." + ), + title="Production Date", + ) + prod_place: Optional[str] = Field( + None, description="Address of the archive or organization that produced the work", title="Production Place" + ) + funding_agencies: Optional[List[FundingAgency]] = Field( + None, + description=( + "The source(s) of funds for production of the work. If different funding agencies sponsored different" + " stages of the production process, use the 'role' attribute to distinguish them." + ), + title="Funding Agency/Sponsor", + ) + + +class Distributor(SchemaBaseModel): + name: str = Field(..., description="Organization name", title="Organization name") + abbr: Optional[str] = Field(None, title="Abbreviation") + affiliation: Optional[str] = Field(None, title="Affiliation") + uri: Optional[str] = Field(None, title="URI") + + +class ContactItem(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + affiliation: Optional[str] = Field(None, title="Affiliation") + email: Optional[str] = Field(None, title="Email") + uri: Optional[str] = Field(None, title="URI") + + +class DepositorItem(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + abbr: Optional[str] = Field(None, title="Abbreviation") + affiliation: Optional[str] = Field(None, title="Affiliation") + uri: Optional[str] = Field(None, title="URI") + + +class DistributionStatement(SchemaBaseModel): + """ + Distribution Statement + """ + + distributors: Optional[List[Distributor]] = Field( + None, + description=( + "The organization designated by the author or producer to generate copies of the particular work including" + " any necessary editions or revisions. Names and addresses may be specified and other archives may be" + " co-distributors. A URI attribute is included to provide an URN or URL to the ordering service or download" + " facility on a Web site." + ), + title="Distributor", + ) + contact: Optional[List[ContactItem]] = Field(None, description="Contact", title="Contact") + depositor: Optional[List[DepositorItem]] = Field(None, description="Depositor", title="Depositor") + deposit_date: Optional[str] = Field(None, title="Date of Deposit") + distribution_date: Optional[str] = Field(None, title="Date of Distribution") + + +class SeriesStatement(SchemaBaseModel): + """ + Series Statement + """ + + series_name: Optional[str] = Field( + None, description="The name of the series to which the work belongs.", title="Series Name" + ) + series_info: Optional[str] = Field( + None, + description=( + "A survey may be repeated at regular intervals (such as an annual labour force survey), or be part of an" + " international survey program (such as the MICS, CWIQ, DHS, LSMS and others). The Series information is a" + " description of this `collection` of surveys. A brief description of the characteristics of the survey," + " including when it started, how many rounds were already implemented, and who is in charge would be" + " provided here." + ), + title="Series Information", + ) + + +class Holding(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + location: Optional[str] = Field(None, title="Location") + callno: Optional[str] = Field(None, title="Callno") + uri: Optional[str] = Field(None, title="URI") + + +class AgencyItem(SchemaBaseModel): + name: str = Field(..., title="Funding Agency/Sponsor") + affiliation: Optional[str] = Field(None, title="Affiliation") + abbr: Optional[str] = Field(None, title="Abbreviation") + + +class StudyAuthorization(SchemaBaseModel): + """ + Provides structured information on the agency that authorized the study, the date of authorization, and an authorization statement + """ + + date: Optional[str] = Field(None, title="Authorization Date") + agency: Optional[List[AgencyItem]] = Field( + None, + description=( + "The source(s) of funds for production of the work. If different funding agencies sponsored different" + " stages of the production process, use the 'role' attribute to distinguish them." + ), + title="Authorizing Agency", + ) + authorization_statement: Optional[str] = Field( + None, description="Authorization Statement", title="Authorization Statement" + ) + + +class Keyword(SchemaBaseModel): + keyword: Optional[str] = Field(None, title="Keyword") + vocab: Optional[str] = Field(None, title="Vocabulary") + uri: Optional[str] = Field(None, title="uri") + + +class Topic(SchemaBaseModel): + topic: str = Field(..., title="Topic") + vocab: Optional[str] = Field(None, title="Vocab") + uri: Optional[str] = Field(None, title="URI") + + +class TimePeriod(SchemaBaseModel): + start: str = Field(..., description="Start date", title="Start date") + end: Optional[str] = Field(None, description="End date", title="End date") + cycle: Optional[str] = Field(None, description="Cycle", title="Cycle") + + +class CollDate(TimePeriod): + pass + + +class NationItem(SchemaBaseModel): + name: str = Field(..., description="Country name", title="Name") + abbreviation: Optional[str] = Field(None, description="Country ISO code", title="Country code") + + +class BboxItem(SchemaBaseModel): + west: Optional[str] = Field(None, title="West") + east: Optional[str] = Field(None, title="East") + south: Optional[str] = Field(None, title="South") + north: Optional[str] = Field(None, title="North") + + +class BoundPolyItem(SchemaBaseModel): + lat: Optional[str] = Field( + None, + description=( + "Latitude (y coordinate) of a point. Valid range expressed in decimal degrees is as follows: -90,0 to 90,0" + " degrees (latitude)" + ), + title="Latitude", + ) + lon: Optional[str] = Field( + None, + description=( + "Longitude (x coordinate) of a point. Valid range expressed in decimal degrees is as follows: -180,0 to" + " 180,0 degrees (longitude)" + ), + title="longitude", + ) + + +class Standard(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + producer: Optional[str] = Field(None, title="Producer") + + +class QualityStatement(SchemaBaseModel): + """ + The quality statement provides elements to describe compliance with quality standards in the form of a statement and an itemized list of standards complied with, and an element to provide other quality statement. + """ + + compliance_description: Optional[str] = Field(None, title="Standard compliance description") + standards: Optional[List[Standard]] = Field(None, description="Standards", title="Standards") + other_quality_statement: Optional[str] = Field(None, title="Other quality statement") + + +class EvaluatorItem(SchemaBaseModel): + name: str = Field(..., title="Funding Agency/Sponsor") + affiliation: Optional[str] = Field(None, title="Affiliation") + abbr: Optional[str] = Field(None, title="Abbreviation") + role: Optional[str] = Field(None, title="Role") + + +class ExPostEvaluation(SchemaBaseModel): + """ + This structure consists of two parts, standardsCompliance and otherQualityStatements. In standardsCompliance list all specific standards complied with during the execution of this study. Note the standard name and producer and how the study complied with the standard. Enter any additional quality statements in otherQualityStatements. + """ + + completion_date: Optional[str] = Field(None, title="Evaluation completion date") + type: Optional[str] = Field(None, title="Evaluation type") + evaluator: Optional[List[EvaluatorItem]] = Field(None, description="Evaluators", title="Evaluators") + evaluation_process: Optional[str] = Field(None, title="Evaluation process") + outcomes: Optional[str] = Field(None, title="Outcomes") + + +class StudyInfo(SchemaBaseModel): + """ + This section contains information about the data collection's scope across several dimensions, including substantive content, geography, and time. + """ + + study_budget: Optional[str] = Field( + None, + description=( + "Provide a clear summary of the pDescribe the budget of the project in as much detail as needed. Use XHTML" + " structure elements to identify discrete pieces of information in a way that facilitates direct transfer" + " of information on the study budget between DDI 2 and DDI 3 structures.urposes, objectives and content of" + " the survey" + ), + title="Study Budget", + ) + keywords: Optional[List[Keyword]] = Field(None, description="Keywords") + topics: Optional[List[Topic]] = Field(None, description="Topic Classification", title="Topic Classification") + abstract: Optional[str] = Field( + None, + description="Provide a clear summary of the purposes, objectives and content of the survey", + title="Abstract", + ) + time_periods: Optional[List[TimePeriod]] = Field( + None, + description=( + "This field will usually be left empty. Time period differs from the dates of collection as they represent" + " the period for which the data collected are applicable or relevant." + ), + title="Time periods (YYYY/MM/DD)", + ) + coll_dates: Optional[List[CollDate]] = Field( + None, + description=( + "Enter the dates (at least month and year) of the start and end of the data collection. In some cases, data" + " collection for a same survey can be conducted in waves. In such case, you should enter the start and end" + " date of each wave separately, and identify each wave in the 'cycle' field." + ), + title="Dates of Data Collection (YYYY/MM/DD)", + ) + nation: List[NationItem] = Field( + ..., + description=( + "Indicates the country or countries covered in the file. Field `abbreviation` may be used to list common" + " abbreviations; use of ISO country codes is recommended. Maps to Dublin Core Coverage element. Inclusion" + " of this element is recommended." + ), + title="Country", + ) + bbox: Optional[List[BboxItem]] = Field(None, title="Geographic bounding box") + bound_poly: Optional[List[BoundPolyItem]] = Field( + None, + description=( + "This field allows the creation of multiple polygons to describe in a more detailed manner the geographic" + " area covered by the dataset. It should only be used to define the outer boundaries of a covered area. For" + " example, in the United States, such polygons can be created to define boundaries for Hawaii, Alaska, and" + " the continental United States, but not interior boundaries for the contiguous states. This field is used" + " to refine a coordinate-based search, not to actually map an area. \nIf the boundPoly element is used," + " then geoBndBox MUST be present, and all points enclosed by the boundPoly MUST be contained within the" + " geoBndBox. Elements westBL, eastBL, southBL, and northBL of the geoBndBox should each be represented in" + " at least one point of the boundPoly description." + ), + title="Geographic Bounding Polygon", + ) + geog_coverage: Optional[str] = Field( + None, + description=( + " Information on the geographic coverage of the data. Includes the total geographic scope of the data, and" + " any additional levels of geographic coding provided in the variables. Maps to Dublin Core Coverage" + " element. Inclusion of this element in the codebook is recommended." + ), + title="Geographic Coverage", + ) + geog_coverage_notes: Optional[str] = Field( + None, description="Geographic coverage notes", title="Geographic Coverage notes" + ) + geog_unit: Optional[str] = Field( + None, description="Lowest level of geographic aggregation covered by the data", title="Geographic Unit" + ) + analysis_unit: Optional[str] = Field( + None, + description=( + "Basic unit(s) of analysis or observation that the study describes: individuals, families/households," + " groups, facilities, institutions/organizations, administrative units, physical locations, etc." + ), + title="Unit of Analysis", + ) + universe: Optional[str] = Field( + None, + description=( + "We are interested here in the survey universe (not the universe of particular sections of the" + " questionnaires or variables), i.e. in the identification of the population of interest in the survey. The" + " universe will rarely be the entire population of the country. Sample household surveys, for example," + " usually do not cover homeless, nomads, diplomats, community households. Some surveys may cover only the" + " population of a particular age group, or only male (or female), etc." + ), + title="Universe", + ) + data_kind: Optional[str] = Field(None, description="Broad classification of the data", title="Kind of Data") + notes: Optional[str] = Field(None, description="Study notes", title="Study notes") + quality_statement: Optional[QualityStatement] = Field( + None, + description=( + "The quality statement provides elements to describe compliance with quality standards in the form of a" + " statement and an itemized list of standards complied with, and an element to provide other quality" + " statement." + ), + title="Quality Statement", + ) + ex_post_evaluation: Optional[ExPostEvaluation] = Field( + None, + description=( + "This structure consists of two parts, standardsCompliance and otherQualityStatements. In" + " standardsCompliance list all specific standards complied with during the execution of this study. Note" + " the standard name and producer and how the study complied with the standard. Enter any additional quality" + " statements in otherQualityStatements." + ), + title="Ex-Post Evaluation", + ) + + +class Participant(SchemaBaseModel): + name: str = Field(..., title="Participant name") + affiliation: Optional[str] = Field(None, title="Affiliation") + role: Optional[str] = Field(None, title="Role") + + +class Resource(SchemaBaseModel): + name: Optional[str] = Field(None, description="Name of the resource", title="Resource name") + origin: Optional[str] = Field( + None, + description=( + "For historical materials, information about the origin(s) of the sources and the rules followed in" + " establishing the sources should be specified. May not be relevant to survey data. " + ), + title="Origin of resource", + ) + characteristics: Optional[str] = Field( + None, + description="Assessment of characteristics and quality of source material. May not be relevant to survey data.", + title="Characteristics of resource", + ) + + +class DevelopmentActivityItem(SchemaBaseModel): + activity_type: Optional[str] = Field(None, title="Development activity type") + activity_description: Optional[str] = Field(None, title="Development activity description") + participants: Optional[List[Participant]] = Field(None, description="Participants", title="Participants") + resources: Optional[List[Resource]] = Field( + None, description="Development activity resources", title="Development activity resources" + ) + outcome: Optional[str] = Field( + None, description="Development Activity Outcome", title="Development Activity Outcome" + ) + + +class StudyDevelopment(SchemaBaseModel): + """ + Describe the process of study development as a series of development activities. These activities can be typed using a controlled vocabulary. Describe the activity, listing participants with their role and affiliation, resources used (sources of information), and the outcome of the development activity. + """ + + development_activity: Optional[List[DevelopmentActivityItem]] = Field(None, title="Development activity") + + +class DataCollector(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + affiliation: Optional[str] = Field(None, title="Affiliation") + abbr: Optional[str] = Field(None, title="Abbreviation") + role: Optional[str] = Field(None, title="Role") + + +class CollectorTrainingItem(SchemaBaseModel): + type: Optional[str] = Field( + None, description="The percentage of sample members who provided information", title="Training type" + ) + training: Optional[str] = Field(None, description="Training provided to data collectors", title="Training") + + +class ValidPeriodItem(SchemaBaseModel): + event: Optional[str] = Field(None, description="Event e.g. start, end", title="Event") + date: str = Field(..., description="Date", title="Date") + + +class FrameUnit(SchemaBaseModel): + """ + Provides information about the sampling frame unit. The attribute `isPrimary` is boolean, indicating whether the unit is primary or not. + """ + + is_primary: Optional[Union[bool, str]] = Field(None, description="Is a primary unit?", title="Is Primary") + unit_type: Optional[str] = Field( + None, + description=( + "Describes the type of sampling frame unit. The field `num_of_units` provides the number of units in the" + " sampling frame." + ), + title="Unit Type", + ) + num_of_units: Optional[str] = Field( + None, description="Number of units in the sampling frame", title="Number of units" + ) + + +class ReferencePeriodItem(ValidPeriodItem): + pass + + +class SampleFrame(SchemaBaseModel): + """ + Sample frame describes the sampling frame used for identifying the population from which the sample was taken. For example, a telephone book may be a sample frame for a phone survey. In addition to the name, label and text describing the sample frame, this structure lists who maintains the sample frame, the period for which it is valid, a use statement, the universe covered, the type of unit contained in the frame as well as the number of units available, the reference period of the frame and procedures used to update the frame. + """ + + name: Optional[str] = Field(None, description="Sample frame name", title="Sample frame name") + valid_period: Optional[List[ValidPeriodItem]] = Field( + None, + description="Defines a time period for the validity of the sampling frame. Enter dates in YYYY-MM-DD format.", + title="Valid periods (YYYY/MM/DD)", + ) + custodian: Optional[str] = Field( + None, + description=( + "Custodian identifies the agency or individual who is responsible for creating or maintaining the sample" + " frame." + ), + title="Custodian", + ) + universe: Optional[str] = Field( + None, + description=( + "The group of persons or other elements that are the object of research and to which any analytic results" + " refer." + ), + title="Universe", + ) + frame_unit: Optional[FrameUnit] = Field( + None, + description=( + "Provides information about the sampling frame unit. The attribute `isPrimary` is boolean, indicating" + " whether the unit is primary or not." + ), + title="Frame unit", + ) + reference_period: Optional[List[ReferencePeriodItem]] = Field( + None, + description=( + "Indicates the period of time in which the sampling frame was actually used for the study in question. Use" + " ISO 8601 date/time formats to enter the relevant date(s)." + ), + title="Reference periods (YYYY/MM/DD)", + ) + update_procedure: Optional[str] = Field( + None, + description="Description of how and with what frequency the sample frame is updated.", + title="Update procedure", + ) + + +class Source(SchemaBaseModel): + name: Optional[str] = Field(None, description="Name of the source", title="Source name") + origin: Optional[str] = Field( + None, + description=( + "For historical materials, information about the origin(s) of the sources and the rules followed in" + " establishing the sources should be specified. May not be relevant to survey data. " + ), + title="Origin of Source", + ) + characteristics: Optional[str] = Field( + None, + description="Assessment of characteristics and quality of source material. May not be relevant to survey data.", + title="Characteristics of Source Noted", + ) + + +class DataCollection(SchemaBaseModel): + """ + Information about the methodology employed in a data collection + """ + + time_method: Optional[str] = Field( + None, + description=( + "The time method or time dimension of the data collection. Examples: `panel survey`, `h>cross-section`," + " `trend study`, `time-series`" + ), + title="Time Method", + ) + data_collectors: Optional[List[DataCollector]] = Field( + None, + description=( + "The persons and/or agencies that took charge of the data collection. This element includes 3 fields: Name," + " Abbreviation and the Affiliation. In most cases, we will record here the name of the agency, not the name" + " of interviewers. Only in the case of very small-scale surveys, with a very limited number of" + " interviewers, the name of person will be included as well. The field Affiliation is optional and not" + " relevant in all cases." + ), + title="Data Collectors", + ) + collector_training: Optional[List[CollectorTrainingItem]] = Field( + None, + description=( + "Describes the training provided to data collectors including interviewer training, process testing," + " compliance with standards etc. This is repeatable for language and to capture different aspects of the" + " training process. The type attribute allows specification of the type of training being described." + ), + title="Collector training", + ) + frequency: Optional[str] = Field( + None, + description=( + "For data collected at more than one point in time, the frequency with which the data were collected." + " Examples `monthly`, `quarterly`, `yearly`" + ), + title="Frequency of Data Collection", + ) + sampling_procedure: Optional[str] = Field( + None, + description=( + "The type of sample and sample design used to select the survey respondents to represent the population." + " \nThis field only applies to sample surveys. Information on sampling procedure is crucial (although not" + " applicable for censuses and administrative datasets). Examples `National multistage area probability" + " sample`, `Simple random sample`, `Quota sample`" + ), + title="Sampling Procedure", + ) + sample_frame: Optional[SampleFrame] = Field( + None, + description=( + "Sample frame describes the sampling frame used for identifying the population from which the sample was" + " taken. For example, a telephone book may be a sample frame for a phone survey. In addition to the name," + " label and text describing the sample frame, this structure lists who maintains the sample frame, the" + " period for which it is valid, a use statement, the universe covered, the type of unit contained in the" + " frame as well as the number of units available, the reference period of the frame and procedures used to" + " update the frame." + ), + title="Sample Frame", + ) + sampling_deviation: Optional[str] = Field( + None, + description=( + "This field only applies to sample surveys.\nSometimes the reality of the field requires a deviation from" + " the sampling design (for example due to difficulty to access to zones due to weather problems, political" + " instability, etc). If for any reason, the sample design has deviated, this should be reported here. " + ), + title="Deviations from the Sample Design", + ) + coll_mode: Optional[List[str]] = Field( + None, + description=( + "The mode of data collection is the manner in which the interview was conducted or information was" + " gathered. In most cases, the response will be 'face to face interview'. But for some specific kinds of" + " datasets, such as for example data on rain fall, the response will be different." + ), + title="Mode of data collection", + ) + research_instrument: Optional[str] = Field( + None, + description=( + "The type of data collection instrument used. \n`Structured` indicates an instrument in which all" + " respondents are asked the same questions/tests, possibly with precoded answers. If a small portion of" + " such a questionnaire includes open-ended questions, provide appropriate comments. \n`Semi-structured`" + " indicates that the research instrument contains mainly open-ended questions. \n`Unstructured` indicates" + " that in-depth interviews were conducted." + ), + title="Type of Research Instrument", + ) + instru_development: Optional[str] = Field( + None, + description=( + "Describe any development work on the data collection instrument. Type attribute allows for the optional" + " use of a defined development type with or without use of a controlled vocabulary." + ), + title="Instrument development", + ) + instru_development_type: Optional[str] = Field( + None, description="Instrument development type", title="Instrument development type" + ) + sources: Optional[List[Source]] = Field( + None, + description=( + "Description of sources used for the data collection. The element is nestable so that the sources statement" + " might encompass a series of discrete source statements, each of which could contain the facts about an" + " individual source. This element maps to Dublin Core Source element." + ), + title="Sources", + ) + coll_situation: Optional[str] = Field( + None, + description=( + "Description of noteworthy aspects of the data collection situation. Includes information on factors such" + " as cooperativeness of respondents, duration of interviews, number of call-backs, etc." + ), + title="Characteristics of Data Collection Situation - Notes on data collection", + ) + act_min: Optional[str] = Field( + None, + description=( + "Summary of actions taken to minimize data loss. Includes information on actions such as follow-up visits," + " supervisory checks, historical matching, estimation, etc." + ), + title="Supervision", + ) + control_operations: Optional[str] = Field( + None, + description=( + " Methods to facilitate data control performed by the primary investigator or by the data archive. Specify" + " any special programs used for such operations." + ), + title="Control Operations", + ) + weight: Optional[str] = Field( + None, + description=( + "The use of sampling procedures may make it necessary to apply weights to produce accurate statistical" + " results. Describe here the criteria for using weights in analysis of a collection. If a weighting formula" + " or coefficient was developed, provide this formula, define its elements, and indicate how the formula is" + " applied to data." + ), + title="Weighting", + ) + cleaning_operations: Optional[str] = Field( + None, + description="Methods used to `clean` the data collection, e.g., consistency checking, wildcode checking, etc.", + title="Cleaning Operations", + ) + + +class AnalysisInfo(SchemaBaseModel): + """ + Information about Data Appraisal + """ + + response_rate: Optional[str] = Field( + None, description="The percentage of sample members who provided information", title="Response Rate" + ) + sampling_error_estimates: Optional[str] = Field( + None, + description="Measure of how precisely one can estimate a population value from a given sample", + title="Estimates of Sampling Error", + ) + data_appraisal: Optional[str] = Field( + None, + description=( + "Other issues pertaining to data appraisal. Describe here issues such as response variance, nonresponse" + " rate and testing for bias, interviewer and response bias, confidence levels, question bias, etc." + ), + title="Data Appraisal", + ) + + +class DataProcessingItem(SchemaBaseModel): + type: Optional[str] = Field(None, title="Data processing type") + description: str = Field(..., title="Data processing description") + + +class CodingInstruction(SchemaBaseModel): + related_processes: Optional[str] = Field(None, title="Related processes") + type: Optional[str] = Field(None, title="Coding instructions type") + txt: Optional[str] = Field(None, title="Coding instructions text") + command: Optional[str] = Field( + None, + description=( + "Provide command code for the coding instruction. The formalLanguage attribute identifies the language of" + " the command code." + ), + title="Command", + ) + formal_language: Optional[str] = Field( + None, + description="Identifies the language of the command code. e.g. `SPSS`, `R`, `STATA` ", + title="Identify the language of the command code", + ) + + +class Method(SchemaBaseModel): + """ + Methodology and processing + """ + + data_collection: Optional[DataCollection] = Field( + None, description="Information about the methodology employed in a data collection", title="Data Collection" + ) + method_notes: Optional[str] = Field(None, description="Methodology notes", title="Methodology notes") + analysis_info: Optional[AnalysisInfo] = Field( + None, description="Information about Data Appraisal", title="Data Appraisal" + ) + study_class: Optional[Union[str, List[Any]]] = Field( + None, + description=( + "Generally used to give the data archive's class or study status number, which indicates the processing" + " status of the study. May also be used as a text field to describe processing status. Example: `DDA Class" + " C`, `Study is available from http://example.com` " + ), + title="Class of the Study", + ) + data_processing: Optional[List[DataProcessingItem]] = Field( + None, + description=( + "Describes various data processing procedures not captured elsewhere in the documentation, such as" + " topcoding, recoding, suppression, tabulation, etc. The `type` attribute supports better classification of" + " this activity, including the optional use of a controlled vocabulary" + ), + title="Data Processing", + ) + coding_instructions: Optional[List[CodingInstruction]] = Field( + None, + description=( + "Describe specific coding instructions used in data processing, cleaning, assession, or tabulation." + ), + title="Coding Instructions", + ) + + +class DatasetAvailability(SchemaBaseModel): + """ + Information on availability and storage of the collection + """ + + access_place: Optional[str] = Field( + None, + description=( + "Location where the data collection is currently stored. Use the URL field `access_place_url` to provide a" + " URN or URL for the storage site or the actual address from which the data may be downloaded" + ), + title="Location of Data Collection", + ) + access_place_url: Optional[str] = Field( + None, + description=( + "Location where the data collection is currently stored. Provide a URN or URL for the storage site or the" + " actual address from which the data may be downloaded" + ), + title="URL for Location of Data Collection", + ) + original_archive: Optional[str] = Field( + None, + description="Archive from which the data collection was obtained; the originating archive", + title="Archive where study is originally stored", + ) + status: Optional[str] = Field( + None, + description=( + "Statement of collection availability. An archive may need to indicate that a collection is unavailable" + " because it is embargoed for a period of time, because it has been superseded, because a new edition is" + " imminent, etc." + ), + title="Availability Status", + ) + coll_size: Optional[str] = Field( + None, + description=( + "Summarizes the number of physical files that exist in a collection, recording the number of files that" + " contain data and noting whether the collection contains machine-readable documentation and/or other" + " supplementary files and information such as data dictionaries, data definition statements, or data" + " collection instruments." + ), + title="Extent of Collection", + ) + complete: Optional[str] = Field( + None, + description=( + "This item indicates the relationship of the data collected to the amount of data coded and stored in the" + " data collection. Information as to why certain items of collected information were not included in the" + " data file stored by the archive should be provided" + ), + title="Completeness of Study Stored", + ) + file_quantity: Optional[str] = Field( + None, description="Total number of physical files associated with a collection", title="Number of Files" + ) + notes: Optional[str] = Field(None, description="Notes and comments", title="Notes") + + +class ConfDecItem(SchemaBaseModel): + txt: Optional[str] = Field( + None, description="Confidentiality declaration text", title="Confidentiality declaration text" + ) + required: Optional[str] = Field( + None, + description="Is signing of a confidentiality declaration required", + title="Is signing of a confidentiality declaration required?", + ) + form_url: Optional[str] = Field( + None, + description="Provide a URN or URL for online access to a confidentiality declaration form.", + title="Confidentiality declaration form URL", + ) + form_id: Optional[str] = Field( + None, description="Indicates the number or ID of the form that the user must fill out", title="Form ID" + ) + + +class SpecPermItem(SchemaBaseModel): + txt: Optional[str] = Field( + None, description="Confidentiality declaration text", title="Special permissions description" + ) + required: Optional[str] = Field( + None, + description="Indicate if special permissions are required to access a resource", + title="Indicate if special permissions are required to access a resource", + ) + form_url: Optional[str] = Field(None, description="Link to the form URL", title="Form URL") + form_id: Optional[str] = Field( + None, description="Indicates the number or ID of the form that the user must fill out", title="Form ID" + ) + + +class ContactItem1(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + affiliation: Optional[str] = Field(None, title="Affiliation") + uri: Optional[str] = Field(None, title="URI") + email: Optional[str] = Field(None, title="Email") + + +class DatasetUse(SchemaBaseModel): + """ + Information on terms of use for the data collection + """ + + conf_dec: Optional[List[ConfDecItem]] = Field( + None, + description=( + " This element is used to determine if signing of a confidentiality declaration is needed to access a" + " resource." + ), + title="Confidentiality Declaration", + ) + spec_perm: Optional[List[SpecPermItem]] = Field( + None, + description="Determine if any special permissions are required to access a resource", + title="Special Permissions", + ) + restrictions: Optional[str] = Field( + None, + description=( + "Any restrictions on access to or use of the collection such as privacy certification or distribution" + " restrictions should be indicated here. These can be restrictions applied by the author, producer, or" + " disseminator of the data collection. If the data are restricted to only a certain class of user, specify" + " which type." + ), + title="Restrictions", + ) + contact: Optional[List[ContactItem1]] = Field(None, description="Contact", title="Contact") + cit_req: Optional[str] = Field( + None, + description=( + "Text of requirement that a data collection should be cited properly in articles or other publications that" + " are based on analysis of the data." + ), + title="Citation requirement", + ) + deposit_req: Optional[str] = Field( + None, + description=( + "Information regarding user responsibility for informing archives of their use of data through providing" + " citations to the published work or providing copies of the manuscripts." + ), + title="Deposit requirement", + ) + conditions: Optional[str] = Field( + None, + description=( + "Indicates any additional information that will assist the user in understanding the access and use" + " conditions of the data collection." + ), + title="Conditions", + ) + disclaimer: Optional[str] = Field( + None, description="Information regarding responsibility for uses of the data collection", title="Disclaimer" + ) + + +class DataAccess(SchemaBaseModel): + """ + Data Access + """ + + dataset_availability: Optional[DatasetAvailability] = Field( + None, description="Information on availability and storage of the collection", title="Data Set Availability" + ) + dataset_use: Optional[DatasetUse] = Field( + None, description=" Information on terms of use for the data collection", title="Data Set Availability" + ) + notes: Optional[str] = Field(None, description="Notes and comments", title="Notes") + + +class StudyDesc(SchemaBaseModel): + """ + Study Description + """ + + class Config: + extra = Extra.forbid + + title_statement: TitleStatement = Field(..., description="Study title") + authoring_entity: Optional[List[AuthoringEntityItem]] = Field( + None, + description=( + "The person, corporate body, or agency responsible for the work's substantive and intellectual content." + " Repeat the element for each author, and use 'affiliation' attribute if available. Invert first and last" + " name and use commas." + ), + title="Authoring entity/Primary investigators", + ) + oth_id: Optional[List[OthIdItem]] = Field( + None, + description="Acknowledge any other people and institutions that have in some form contributed to the survey", + title="Other Identifications/Acknowledgments", + ) + production_statement: Optional[ProductionStatement] = Field( + None, description="Production Statement", title="Production Statement" + ) + distribution_statement: Optional[DistributionStatement] = Field( + None, description="Distribution Statement", title="Distribution Statement" + ) + series_statement: Optional[SeriesStatement] = Field(None, description="Series Statement", title="Series Statement") + version_statement: Optional[VersionStatement] = Field( + None, description="Version Statement", title="Version Statement" + ) + bib_citation: Optional[str] = Field( + None, + description=( + "Complete bibliographic reference containing all of the standard elements of a citation that can be used to" + " cite the work. The `'bib_citation_format'` field is provided to enable specification of the particular" + " citation style used, e.g., APA, MLA, Chicago, etc." + ), + title="Bibliographic Citation", + ) + bib_citation_format: Optional[str] = Field( + None, + description="Specification of the particular citation style used, e.g., `APA`, `MLA`, `Chicago`, etc.", + title="Bibliographic Citation Format", + ) + holdings: Optional[List[Holding]] = Field( + None, + description=( + "Information concerning either the physical or electronic holdings of the cited work. Attributes include:" + " location--The physical location where a copy is held; callno--The call number for a work at the location" + " specified; and URI--A URN or URL for accessing the electronic copy of the cited work." + ), + title="Holdings Information", + ) + study_notes: Optional[str] = Field(None, title="Study notes") + study_authorization: Optional[StudyAuthorization] = Field( + None, + description=( + "Provides structured information on the agency that authorized the study, the date of authorization, and an" + " authorization statement" + ), + title="Study Authorization", + ) + study_info: StudyInfo = Field( + ..., + description=( + "This section contains information about the data collection's scope across several dimensions, including" + " substantive content, geography, and time." + ), + title="Study Scope", + ) + study_development: Optional[StudyDevelopment] = Field( + None, + description=( + "Describe the process of study development as a series of development activities. These activities can be" + " typed using a controlled vocabulary. Describe the activity, listing participants with their role and" + " affiliation, resources used (sources of information), and the outcome of the development activity." + ), + title="Study Development", + ) + method: Optional[Method] = Field(None, description="Methodology and processing", title="Methodology and Processing") + data_access: Optional[DataAccess] = Field(None, description="Data Access") + + +class OriginDescription(SchemaBaseModel): + harvest_date: Optional[str] = Field(None, description="Harvest date using UTC date format") + altered: Optional[bool] = Field( + None, description="If the metadata was altered before dissemination", title="Metadata altered" + ) + base_url: Optional[str] = Field(None, description="Base URL of the originating repository") + identifier: Optional[str] = Field(None, description="Unique idenifiter of the item from the originating repository") + date_stamp: Optional[str] = Field( + None, + description="Datestamp (UTC date format) of the metadata record disseminated by the originating repository", + ) + metadata_namespace: Optional[str] = Field( + None, + description=( + "Metadata namespace URI of the metadata format of the record harvested from the originating repository" + ), + ) + + +class ProvenanceSchema(SchemaBaseModel): + """ + Provenance of metadata based on the OAI provenance schema (http://www.openarchives.org/OAI/2.0/provenance.xsd) + """ + + origin_description: Optional[OriginDescription] = Field(None, title="Origin description") + + +class DdiSchema(SchemaBaseModel): + """ + Schema for Microdata data type based on DDI 2.5 + """ + + doc_desc: Optional[DocDesc] = None + study_desc: Optional[StudyDesc] = None + data_files: Optional[List[DatafileSchema]] = Field(None, description="Data files") + variables: Optional[List[VariableSchema]] = Field(None, description="Variables") + variable_groups: Optional[List[VariableGroupSchema]] = Field( + None, description="Variable group", title="Variable groups" + ) + + +class MicrodataSchema(DdiSchema): + """ + Schema for Microdata data type based on DDI 2.5 + """ + + repositoryid: Optional[str] = Field( + None, + description="Abbreviation for the collection that owns this survey.", + title="Collection ID that owns the survey", + ) + access_policy: Optional[AccessPolicy] = Field( + "data_na", description="Data access policy for attached microdata resources", title="Data access policy" + ) + published: Optional[int] = Field(0, description="Status of the survey - 0=draft, 1=published") + overwrite: Optional[Overwrite] = Field("no", description="Overwrite survey if already exists?") + provenance: Optional[List[ProvenanceSchema]] = Field(None, description="Provenance") + tags: Optional[List[Tag]] = Field(None, description="Tags", title="Tags (user-defined)") + lda_topics: Optional[List[LdaTopic]] = Field(None, description="LDA topics", title="LDA topics") + embeddings: Optional[List[Embedding]] = Field(None, description="Word embeddings", title="Word embeddings") + additional: Optional[Dict[str, Any]] = Field(None, description="Additional metadata not covered by DDI elements") diff --git a/pydantic_schemas/schema_base_model.py b/pydantic_schemas/schema_base_model.py new file mode 100644 index 0000000..06c7548 --- /dev/null +++ b/pydantic_schemas/schema_base_model.py @@ -0,0 +1,11 @@ +from pydantic import BaseModel, ConfigDict + + +class SchemaBaseModel(BaseModel): + model_config = ConfigDict( + validate_assignment=True, protected_namespaces=(), use_enum_values=True + ) # if a subclass has a model_config then this will be overridden + + def __setitem__(self, key, value): + """Allow dict like setting: Model[key] = value""" + setattr(self, key, value) diff --git a/pydantic_schemas/script-schema.py b/pydantic_schemas/script-schema.py new file mode 100644 index 0000000..cad4971 --- /dev/null +++ b/pydantic_schemas/script-schema.py @@ -0,0 +1,687 @@ +# generated by datamodel-codegen: +# filename: script-schema.json +# timestamp: 2024-07-02T16:12:57+00:00 + +from __future__ import annotations + +from enum import Enum +from typing import Any, Dict, List, Optional, Union + +from pydantic import Extra, Field + +from .schema_base_model import SchemaBaseModel + + +class Overwrite(Enum): + """ + Overwrite document if already exists? + """ + + yes = "yes" + no = "no" + + +class Producer(SchemaBaseModel): + name: Optional[str] = Field(None, description="Name (required)", title="Name") + abbr: Optional[str] = Field(None, title="Abbreviation") + affiliation: Optional[str] = Field(None, title="Affiliation") + role: Optional[str] = Field(None, title="Role") + + +class DocDesc(SchemaBaseModel): + """ + Document description; the Document is the file containing the structured metadata + """ + + class Config: + extra = Extra.forbid + + title: Optional[str] = Field(None, description="Document title", title="Document title") + idno: Optional[str] = Field(None, title="Unique ID number for the document") + producers: Optional[List[Producer]] = Field( + None, description="List of producers of the document", title="Producers" + ) + prod_date: Optional[str] = Field( + None, description="Document production date using format(YYYY-MM-DD)", title="Date of production" + ) + version: Optional[str] = Field( + None, description="Identify and describe the current version of the document", title="Document version" + ) + + +class Identifier(SchemaBaseModel): + type: Optional[str] = Field( + None, description="Type of identifier e.g. `doi`, `handle`, `other`", title="Identifier type" + ) + identifier: str = Field(..., title="Identifier") + + +class TitleStatement(SchemaBaseModel): + """ + Project title + """ + + idno: str = Field( + ..., + description=( + "The ID number of a research project is a unique number that is used to identify a particular project." + " Define and use a consistent scheme to use." + ), + title="Unique user defined ID", + ) + identifiers: Optional[List[Identifier]] = Field(None, description="Other identifiers", title="Other identifiers") + title: str = Field( + ..., + description=( + "The title is the name of the project, which may correspond to the title of an academic paper, of a project" + " impact evaluation, etc." + ), + title="Project title", + ) + sub_title: Optional[str] = Field(None, description="A short subtitle for the project", title="Project subtitle") + alternate_title: Optional[str] = Field( + None, + description=( + "The abbreviation of a project is usually the first letter of each word of the project title. The project" + " reference year(s) may be included." + ), + title="Abbreviation or acronym", + ) + translated_title: Optional[str] = Field( + None, + description="In countries with more than one official language, a translation of the title may be provided.", + title="Translated title", + ) + + +class OutputItem(SchemaBaseModel): + type: Optional[str] = Field( + None, + description=( + "Type of outputs of the script/research project. Example: `Working paper`, `On-line interactive data" + " visualization` (ideally, a controlled vocabulary should be used)" + ), + title="Type of output", + ) + title: str = Field(..., description="Title of the output", title="Title") + authors: Optional[str] = Field(None, description="Authors", title="Authors") + description: Optional[str] = Field( + None, + description=( + "Brief description of the output; for articles and working papers, this can include the bibliographic" + " citation." + ), + title="Description", + ) + abstract: Optional[str] = Field(None, description="Abstract (for papers, articles, books)", title="Abstract") + uri: Optional[str] = Field(None, description="On-line location of the output", title="URI") + doi: Optional[str] = Field(None, description="Digital Object Identifier (DOI) of the output", title="DOI") + + +class ApprovalProces(SchemaBaseModel): + approval_phase: Optional[str] = Field(None, title="A name of the approval phase") + approval_authority: Optional[str] = Field(None, title="Approval authority") + submission_date: Optional[str] = Field(None, title="Date submitted") + reviewer: Optional[str] = Field(None, title="Reviewer") + review_status: Optional[str] = Field(None, title="Review status") + approval_date: Optional[str] = Field(None, title="Date of approval") + + +class LanguageItem(SchemaBaseModel): + name: str = Field(..., title="Name") + code: Optional[str] = Field(None, title="Code") + + +class VersionStatement(SchemaBaseModel): + """ + Version statement + """ + + version: Optional[str] = Field(None, title="Version") + version_date: Optional[str] = Field(None, title="Version date") + version_resp: Optional[str] = Field( + None, + description="The organization or person responsible for the version of the work", + title="Version responsibility statement", + ) + version_notes: Optional[str] = Field(None, title="Version notes") + + +class Erratum(SchemaBaseModel): + date: Optional[str] = Field( + None, description="Date when the erratum was reported or published", title="Date of erratum" + ) + description: Optional[str] = Field( + None, + description="A description of the erratum, with information on which data, scripts, or output were impacted", + title="Description of the erratum", + ) + + +class Proces(SchemaBaseModel): + name: Optional[str] = Field(None, description="A short name for the implementation phase", title="Phase name") + date_start: Optional[str] = Field( + None, + description="Start date of the phase period (as a string; recommended ISO format YYY or YYY-MM or YYY-MM-DD)", + title="Phase start date", + ) + date_end: Optional[str] = Field( + None, + description="End date of the phase period (as a string; recommended ISO format YYY or YYY-MM or YYY-MM-DD)", + title="Phase end date", + ) + description: Optional[str] = Field( + None, description="Description of the implementation phase", title="Phase description" + ) + + +class AuthorIdItem(SchemaBaseModel): + type: Optional[str] = Field(None, description="Source of identifier, e.g. ORCID", title="Type") + id: Optional[str] = Field( + None, description="Author's unique identifier for the corresponding source", title="Identifier" + ) + + +class AuthoringEntityItem(SchemaBaseModel): + name: str = Field( + ..., + description=( + "Name of the person, corporate body, or agency responsible for the work's substantive and intellectual" + " content. If a person, invert first and last name and use commas." + ), + title="Author (or primary investigator) name", + ) + role: Optional[str] = Field( + None, + description="Title of the person (if any) responsible for the work's substantive and intellectual content.", + title="Role", + ) + affiliation: Optional[str] = Field(None, title="Affiliation of the author/primary investigator") + abbreviation: Optional[str] = Field(None, description="Abbreviation", title="Abbreviation") + email: Optional[str] = Field(None, description="Email", title="Email") + author_id: Optional[List[AuthorIdItem]] = Field( + None, + description="Unique identifier of an author, which may be provided by services like ORCID or other", + title="Author ID", + ) + + +class Contributor(SchemaBaseModel): + name: str = Field( + ..., + description=( + "Name of the person, corporate body, or agency responsible for the work's substantive and intellectual" + " content. If a person, invert first and last name and use commas." + ), + title="Name", + ) + role: Optional[str] = Field( + None, + description="Title of the person (if any) responsible for the work's substantive and intellectual content.", + title="Role", + ) + affiliation: Optional[str] = Field(None, title="Affiliation") + abbreviation: Optional[str] = Field(None, description="Abbreviation", title="Abbreviation") + email: Optional[str] = Field(None, description="Email", title="Email") + url: Optional[str] = Field(None, description="URL", title="URL") + + +class Sponsor(SchemaBaseModel): + name: Optional[str] = Field(None, title="Funding Agency/Sponsor") + abbr: Optional[str] = Field(None, title="Abbreviation") + role: Optional[str] = Field(None, title="Role") + grant_no: Optional[str] = Field(None, title="Grant number") + + +class Curator(SchemaBaseModel): + name: str = Field( + ..., + description=( + "Name of the person, corporate body, or agency responsible for the project curation. If a person, invert" + " first and last name and use commas." + ), + title="Name", + ) + role: Optional[str] = Field( + None, description="Title of the person (if any) responsible for the project curation.", title="Role" + ) + affiliation: Optional[str] = Field(None, title="Affiliation") + abbreviation: Optional[str] = Field(None, description="Abbreviation", title="Abbreviation") + email: Optional[str] = Field(None, description="Email", title="Email") + url: Optional[str] = Field(None, description="URL", title="URL") + + +class ReviewsComment(SchemaBaseModel): + """ + List and description of reviews and comments received on the project + """ + + comment_date: Optional[str] = Field( + None, description="Date when the comment was provided", title="Date of the comment" + ) + comment_by: Optional[str] = Field( + None, + description="Name and title of the comment provider (individual or organization)", + title="Provider of the comment", + ) + comment_description: Optional[str] = Field( + None, description="A description of the comment", title="Description of the comment" + ) + comment_response: Optional[str] = Field( + None, + description="Response by the primary investigator or research team on the comment", + title="Response on the comment", + ) + + +class Acknowledgement(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + affiliation: Optional[str] = Field(None, title="Affiliation") + role: Optional[str] = Field(None, title="Role") + + +class RelatedProject(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + uri: Optional[str] = Field(None, title="URI") + note: Optional[str] = Field(None, title="Note") + + +class GeographicUnit(SchemaBaseModel): + name: str = Field( + ..., description="Name of the geographic unit e.g. 'World', 'Africa', 'Afghanistan'", title="Location name" + ) + code: Optional[str] = Field( + None, description="Code of the geographic unit (for countries, preferred = ISO3 code)", title="Location code" + ) + type: Optional[str] = Field( + None, description="Type of geographic unit e.g. country, state, region, province, town, etc", title="Type" + ) + + +class Keyword(SchemaBaseModel): + name: Optional[str] = Field(None, description="Keyword, composed of one or multiple words", title="Name") + vocabulary: Optional[str] = Field( + None, + description="Vocabulary name (for keywords extracted from controlled vocabularies)", + title="Vocabulary name", + ) + uri: Optional[str] = Field(None, title="Vocabulary URI") + + +class Theme(SchemaBaseModel): + id: Optional[str] = Field(None, title="Unique Identifier") + name: str = Field(..., title="Name") + parent_id: Optional[str] = Field(None, title="Parent Identifier") + vocabulary: Optional[str] = Field(None, description="Name of the controlled vocabulary", title="Vocabulary") + uri: Optional[str] = Field( + None, + description="Link to the controlled vocabulary web page, if the theme is from a taxonomy.", + title="Vocabulary URI", + ) + + +class Topic(SchemaBaseModel): + id: str = Field(..., title="Unique identifier") + name: str = Field(..., title="Topic") + parent_id: Optional[str] = Field( + None, description="For subtopics, provide the ID of the parent topic", title="Parent topic identifier" + ) + vocabulary: Optional[str] = Field( + None, description="Name of the controlled vocabulary, if the topic is from a taxonomy.", title="Vocabulary name" + ) + uri: Optional[str] = Field( + None, + description="Link to the controlled vocabulary web page, if the topic is from a taxonomy.", + title="Vocabulary URI", + ) + + +class Discipline(SchemaBaseModel): + id: Optional[str] = Field(None, title="Unique Identifier") + name: str = Field(..., title="Discipline title or name") + parent_id: Optional[str] = Field(None, description="Parent discipline ID", title="Parent discipline Identifier") + vocabulary: Optional[str] = Field(None, description="Vocabulary", title="Vocabulary") + uri: Optional[str] = Field(None, description="Website link", title="URI") + + +class RepositoryUriItem(SchemaBaseModel): + name: str = Field( + ..., + description="Name of the repository where code is hosted. e.g. `Github`, `Bitbucket`, etc.", + title="Repository name", + ) + type: Optional[str] = Field(None, description="Repo type e.g. `git`, `svn`, `other`", title="Type") + uri: Optional[Any] = Field(None, description="URI of the project repository", title="URI") + + +class LicenseItem(SchemaBaseModel): + name: Optional[str] = Field(None, title="License") + uri: Optional[str] = Field(None, title="URI") + + +class Method(SchemaBaseModel): + name: Optional[str] = Field(None, title="Method name") + note: Optional[str] = Field(None, title="Description") + + +class SoftwareItem(SchemaBaseModel): + class Config: + extra = Extra.forbid + + name: Optional[str] = Field(None, title="Name") + version: Optional[str] = Field(None, title="Version") + library: Optional[List[str]] = Field( + None, description="Software-specific libraries or packages used", title="Libraries or packages used" + ) + + +class Author(SchemaBaseModel): + name: Optional[str] = Field(None, title="Person or organization name") + abbr: Optional[str] = Field(None, title="Abbreviation") + role: Optional[str] = Field(None, title="Role") + + +class LicenseItem1(SchemaBaseModel): + name: Optional[str] = Field(None, title="License name") + uri: Optional[str] = Field(None, title="License URI") + + +class Script(SchemaBaseModel): + file_name: Optional[str] = Field(None, title="File name") + zip_package: Optional[str] = Field( + None, description="Provide the name of the zip file, if the file is included in a zip", title="Zip file" + ) + title: str = Field(..., title="Title") + authors: Optional[List[Author]] = Field(None, description="Author(s) of the script", title="Authors") + date: Optional[str] = Field(None, title="Date") + format: Optional[str] = Field(None, title="Format") + software: Optional[str] = Field(None, title="Software") + description: Optional[str] = Field(None, title="Description") + methods: Optional[str] = Field(None, title="Methods") + dependencies: Optional[str] = Field(None, title="Dependencies") + instructions: Optional[str] = Field(None, title="Instructions or note for running the script") + source_code_repo: Optional[str] = Field(None, title="Source code repositor") + notes: Optional[str] = Field(None, title="Notes") + license: Optional[List[LicenseItem1]] = Field(None, title="License") + + +class Dataset(SchemaBaseModel): + name: Optional[str] = Field(None, title="Dataset name") + idno: Optional[str] = Field(None, description="unique ID of the dataset", title="Dataset ID") + note: Optional[str] = Field( + None, + description=( + "Brief description of the dataset (note: ideally, the dataset will be documented using a specific metadata" + " schema like the DDI)." + ), + title="Description", + ) + access_type: Optional[str] = Field(None, title="Data access policy") + license: Optional[str] = Field(None, title="License") + license_uri: Optional[str] = Field(None, title="License URI") + uri: Optional[str] = Field( + None, + description="Link to the website where the data may be accessed or more information on access can be found", + title="Dataset URI", + ) + + +class Contact(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + role: Optional[str] = Field(None, title="Role") + affiliation: Optional[str] = Field(None, title="Affiliation") + email: Optional[str] = Field(None, title="Email") + telephone: Optional[str] = Field(None, title="Telephone") + uri: Optional[str] = Field(None, title="URI") + + +class ProjectDesc(SchemaBaseModel): + """ + Description of the research project + """ + + title_statement: Optional[TitleStatement] = Field(None, description="Project title") + abstract: Optional[str] = Field(None, title="Abstract") + review_board: Optional[str] = Field( + None, + description=( + "Information on whether and when the project was submitted, reviewed, and approved by an institutional" + " review board (or independent ethics committee, ethical review board (ERB), research ethics board, or" + " equivalent)." + ), + title="Institutional review board", + ) + output: Optional[List[OutputItem]] = Field( + None, description="Description of outputs of the research project", title="Output" + ) + approval_process: Optional[List[ApprovalProces]] = Field( + None, description="A description of the project output review process", title="Approval process" + ) + project_website: Optional[List[str]] = Field(None, description="Project website link", title="Project website") + language: Optional[List[LanguageItem]] = Field( + None, description="Documentation language e.g. English, French, etc.", title="Language" + ) + production_date: Optional[List[str]] = Field( + None, + description=( + "Date in ISO format when the dissemination-ready version of the research project was produced. It can be a" + " year (YYYY), year-month (YYYY-MM), or year-month-day (YYYY-MM-DD)" + ), + title="Date of production (YYYY-MM-DD)", + ) + version_statement: Optional[VersionStatement] = Field( + None, description="Version statement", title="Version statement" + ) + errata: Optional[List[Erratum]] = Field( + None, description="List of corrected errors in data, scripts or output", title="Errata" + ) + process: Optional[List[Proces]] = Field( + None, + description=( + "A description, following a logical sequence, of the various phases of the research project implementation." + " This field may be used to document explorations steps that may have resulted in dead ends, to document" + " intermediary steps at which a project may have been reviewed and approved, etc." + ), + title="Process", + ) + authoring_entity: Optional[List[AuthoringEntityItem]] = Field( + None, + description=( + "The person, corporate body, or agency responsible for the project's substantive and intellectual content." + " Repeat the element for each author/primary investigator, and use 'affiliation' attribute if available." + " Invert first and last name and use commas." + ), + title="Authoring entity", + ) + contributors: Optional[List[Contributor]] = Field( + None, description="The person, corporate body, or agency who contributed to the project.", title="Contributors" + ) + sponsors: Optional[List[Sponsor]] = Field( + None, + description=( + "The source(s) of funds for production of the work. If different funding agencies sponsored different" + " stages of the production process, use the 'role' attribute to distinguish them." + ), + title="Sponsors / Funding agencies", + ) + curators: Optional[List[Curator]] = Field( + None, description="The person, corporate body, or agency who curated the project.", title="Curators" + ) + reviews_comments: Optional[List[ReviewsComment]] = None + acknowledgements: Optional[List[Acknowledgement]] = Field( + None, + description="Acknowledgments of persons or organizations (other than sponsors) who contributed to the project.", + title="Other acknowledgments", + ) + acknowledgement_statement: Optional[str] = Field( + None, description="Acknowledgement statement", title="Acknowledgement statement" + ) + disclaimer: Optional[str] = Field(None, title="Disclaimer") + confidentiality: Optional[str] = Field(None, title="Confidentiality") + citation_requirement: Optional[str] = Field( + None, description="Citation requirement (can include a specific recommended citation)" + ) + related_projects: Optional[List[RelatedProject]] = Field( + None, description="A list and bried description of related research projects", title="Related research projects" + ) + geographic_units: Optional[List[GeographicUnit]] = Field( + None, + description=( + "List of geographic locations (regions, countries, states, provinces, etc.) describing the geographic" + " coverahe of the research project." + ), + title="Geographic locations", + ) + keywords: Optional[List[Keyword]] = Field(None, title="Keywords") + themes: Optional[List[Theme]] = Field(None, description="Themes") + topics: Optional[List[Topic]] = Field( + None, + description=( + "Topics covered by the project (ideally, a controlled vocabulary should be used). This can be a" + " hierarchical list of topics." + ), + title="Topics", + ) + disciplines: Optional[List[Discipline]] = Field( + None, + description="Disciplines e.g. `Social sciences, economics`, `Natural sciences, biology`", + title="Disciplines", + ) + repository_uri: Optional[List[RepositoryUriItem]] = Field( + None, description="Source code repository", title="Source code repository" + ) + license: Optional[List[LicenseItem]] = Field( + None, + description=( + "Overall statement on license. Note: information on license specific to scripts and/or datasets should be" + " provided in the documentation of scripts and datasets." + ), + title="License", + ) + copyright: Optional[str] = Field(None, title="Copyright") + technology_environment: Optional[str] = Field( + None, + description="Notes about the technology environment used by the authors to implement the project", + title="Technology environment", + ) + technology_requirements: Optional[str] = Field( + None, + description="Software/hardware or other technology requirements needed to replicate the scripts", + title="Technology requirements", + ) + reproduction_instructions: Optional[str] = Field(None, description="Reproduction instructions") + methods: Optional[List[Method]] = Field( + None, description="Methods or algorithms applied", title="Methods or algorithms applied" + ) + software: Optional[List[SoftwareItem]] = Field( + None, description="List of software applications used for the project", title="Software" + ) + scripts: Optional[List[Script]] = Field(None, description="Description of each script file", title="Script files") + data_statement: Optional[str] = Field( + None, + description=( + "Overall statement on data used by the project. More detailed description of the datasets should be" + " provided in the 'datasets' field." + ), + ) + datasets: Optional[List[Dataset]] = Field( + None, description="List and description of datasets used by the research project", title="Datasets" + ) + contacts: Optional[List[Contact]] = Field(None, description="Contacts", title="Contacts") + + +class Tag(SchemaBaseModel): + tag: Optional[str] = Field(None, title="Tag") + tag_group: Optional[str] = Field(None, title="Tag group") + + +class ModelInfoItem(SchemaBaseModel): + source: Optional[str] = Field(None, title="Source") + author: Optional[str] = Field(None, title="Author") + version: Optional[str] = Field(None, title="Version") + model_id: Optional[str] = Field(None, title="Model Identifier") + nb_topics: Optional[float] = Field(None, title="Number of topics") + description: Optional[str] = Field(None, title="Description") + corpus: Optional[str] = Field(None, title="Corpus name") + uri: Optional[str] = Field(None, title="URI") + + +class TopicWord(SchemaBaseModel): + word: Optional[str] = Field(None, title="Word") + word_weight: Optional[float] = Field(None, title="Word weight") + + +class TopicDescriptionItem(SchemaBaseModel): + topic_id: Optional[Union[int, str]] = Field(None, title="Topic identifier") + topic_score: Optional[Union[float, str]] = Field(None, title="Topic score") + topic_label: Optional[str] = Field(None, title="Topic label") + topic_words: Optional[List[TopicWord]] = Field(None, description="Words", title="Topic words") + + +class LdaTopic(SchemaBaseModel): + class Config: + extra = Extra.forbid + + model_info: Optional[List[ModelInfoItem]] = Field(None, title="Model information") + topic_description: Optional[List[TopicDescriptionItem]] = Field(None, title="Topic information") + + +class Embedding(SchemaBaseModel): + id: str = Field(..., title="Vector Model ID") + description: Optional[str] = Field(None, title="Vector Model Description") + date: Optional[str] = Field(None, title="Date (YYYY-MM-DD)") + vector: Dict[str, Any] = Field(..., title="Vector") + + +class OriginDescription(SchemaBaseModel): + harvest_date: Optional[str] = Field(None, description="Harvest date using UTC date format") + altered: Optional[bool] = Field( + None, description="If the metadata was altered before dissemination", title="Metadata altered" + ) + base_url: Optional[str] = Field(None, description="Base URL of the originating repository") + identifier: Optional[str] = Field(None, description="Unique idenifiter of the item from the originating repository") + date_stamp: Optional[str] = Field( + None, + description="Datestamp (UTC date format) of the metadata record disseminated by the originating repository", + ) + metadata_namespace: Optional[str] = Field( + None, + description=( + "Metadata namespace URI of the metadata format of the record harvested from the originating repository" + ), + ) + + +class ProvenanceSchema(SchemaBaseModel): + """ + Provenance of metadata based on the OAI provenance schema (http://www.openarchives.org/OAI/2.0/provenance.xsd) + """ + + origin_description: Optional[OriginDescription] = Field(None, title="Origin description") + + +class ResearchProjectSchemaDraft(SchemaBaseModel): + """ + Schema for documenting research projects and data analysis scripts + """ + + repositoryid: Optional[str] = Field( + None, + description="Abbreviation for the collection that owns the research project", + title="Collection ID that owns the project", + ) + published: Optional[int] = Field(0, description="Status of the project - 0=draft, 1=published", title="Status") + overwrite: Optional[Overwrite] = Field("no", description="Overwrite document if already exists?") + doc_desc: Optional[DocDesc] = Field( + None, + description="Document description; the Document is the file containing the structured metadata", + title="Document description", + ) + project_desc: Optional[ProjectDesc] = Field( + None, description="Description of the research project", title="Project description" + ) + provenance: Optional[List[ProvenanceSchema]] = Field(None, description="Provenance") + tags: Optional[List[Tag]] = Field(None, description="Tags", title="Tags (user-defined)") + lda_topics: Optional[List[LdaTopic]] = Field(None, description="LDA topics", title="LDA topics") + embeddings: Optional[List[Embedding]] = Field(None, description="Word embeddings", title="Word embeddings") + additional: Optional[Dict[str, Any]] = Field(None, description="Additional metadata") diff --git a/pydantic_schemas/series-schema.py b/pydantic_schemas/series-schema.py new file mode 100644 index 0000000..09eb3ab --- /dev/null +++ b/pydantic_schemas/series-schema.py @@ -0,0 +1,167 @@ +# generated by datamodel-codegen: +# filename: series-schema.json +# timestamp: 2024-07-02T16:12:58+00:00 + +from __future__ import annotations + +from typing import List, Optional + +from pydantic import Field + +from .schema_base_model import SchemaBaseModel + + +class Model(SchemaBaseModel): + pass + + +class Alias(SchemaBaseModel): + alias: Optional[str] = Field(None, title="Alias") + + +class DefinitionReference(SchemaBaseModel): + source: Optional[str] = Field(None, title="Source") + uri: str = Field(..., description="URI", title="URI") + note: Optional[str] = Field(None, description="Note", title="Note") + + +class RelatedConcept(SchemaBaseModel): + name: str = Field(..., title="Name") + definition: Optional[str] = Field(None, description="Definition", title="Definition") + + +class Topic(SchemaBaseModel): + topic: str = Field(..., title="Topic") + vocabulary: Optional[str] = Field( + None, description="Name of the controlled vocabulary, if the topic is from a taxonomy.", title="Vocabulary" + ) + uri: Optional[str] = Field( + None, + description="Link to the controlled vocabulary web page, if the topic is from a taxonomy.", + title="Vocabulary URI", + ) + + +class SeriesDate(SchemaBaseModel): + start: Optional[str] = Field(None, title="Start") + end: Optional[str] = Field(None, title="End") + + +class GeographicUnit(SchemaBaseModel): + name: str = Field( + ..., description="Name of the geographic unit e.g. 'World', 'Africa', 'Afghanistan'", title="Location name" + ) + code: Optional[str] = Field( + None, description="Code of the geographic unit (for countries, preferred = ISO3 code)", title="Location code" + ) + type: Optional[str] = Field( + None, description="Type of geographic unit e.g. country, state, region, province etc", title="Type" + ) + + +class SerAccessLicense(SchemaBaseModel): + type: Optional[str] = Field(None, title="License type") + uri: Optional[str] = Field(None, title="URI") + + +class SeriesLink(SchemaBaseModel): + type: Optional[str] = Field(None, description="Link types - API, website, etc.", title="Link type") + description: Optional[str] = Field(None, title="Description") + uri: Optional[str] = Field(None, title="URI") + + +class ApiDocumentation(SchemaBaseModel): + """ + API Documentation + """ + + description: Optional[str] = Field(None, title="Description") + uri: Optional[str] = Field(None, title="URI") + + +class Keyword(SchemaBaseModel): + name: Optional[str] = Field(None, title="Keyword") + vocabulary: Optional[str] = Field(None, title="Vocabulary") + uri: Optional[str] = Field(None, title="URI") + + +class Note(SchemaBaseModel): + note: Optional[str] = Field(None, title="Note") + + +class RelatedIndicator(SchemaBaseModel): + code: Optional[str] = Field(None, title="Indicator code") + label: Optional[str] = Field(None, title="Indicator name") + uri: Optional[str] = Field(None, title="URI") + + +class ComplianceItem(SchemaBaseModel): + standard: Optional[str] = Field(None, title="Standard name") + organization: Optional[str] = Field(None, title="Organization name") + uri: Optional[str] = Field(None, title="URI") + + +class SeriesGroup(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + version: Optional[str] = Field(None, title="Version") + uri: Optional[str] = Field(None, title="URI") + + +class Series(SchemaBaseModel): + idno: str = Field(..., description="Unique series ID", title="Series unique ID") + name: str = Field(..., title="Series Name") + db_idno: Optional[str] = Field(None, description="Series database ID", title="Database ID") + aliases: Optional[List[Alias]] = Field(None, title="Series other names") + measurement_unit: Optional[str] = Field(None, title="Series unit of measure") + periodicity: Optional[str] = Field(None, title="Periodicity of data") + base_period: Optional[str] = Field(None, title="Base period") + definition_short: Optional[str] = Field(None, title="Definition short") + definition_long: Optional[str] = Field(None, title="Definition long") + definition_references: Optional[List[DefinitionReference]] = Field( + None, + description="URL to standard definition of the indicator (international or national standard)", + title="Definition references", + ) + related_concepts: Optional[List[RelatedConcept]] = Field( + None, description="Related concepts", title="Related concepts" + ) + methodology: Optional[str] = Field(None, title="Methodology") + imputation: Optional[str] = Field(None, title="Imputations") + quality_checks: Optional[str] = Field(None, title="Quality control methods") + quality_note: Optional[str] = Field(None, title="Note on data quality") + series_break: Optional[str] = Field(None, title="Breaks in series") + statistical_concept: Optional[str] = Field(None, title="Statistical concept") + limitation: Optional[str] = Field(None, title="Limitations and exceptions") + topics: Optional[List[Topic]] = Field(None, description="Topics covered by the indicator", title="Topics") + relevance: Optional[str] = Field(None, title="Relavance") + series_dates: Optional[List[SeriesDate]] = Field(None, title="Series dates") + geographic_units: Optional[List[GeographicUnit]] = Field( + None, + description=( + "List of geographic units (regions, countries, states, provinces, etc.) for which data are available in the" + " database." + ), + title="Geographic locations", + ) + aggregation_method: Optional[str] = Field(None, title="Aggregation method") + ser_access_license: Optional[SerAccessLicense] = Field(None, title="Access licence") + confidentiality: Optional[str] = Field( + None, description="Confidentiality statement", title="Confidentiality statement" + ) + confidentiality_status: Optional[str] = Field(None, title="Confidentiality status") + confidentiality_note: Optional[str] = Field(None, title="Confidentiality note") + series_links: Optional[List[SeriesLink]] = Field( + None, description="Links to API calls, websites, etc.", title="Series links" + ) + api_documentation: Optional[ApiDocumentation] = Field(None, description="API Documentation") + source: Optional[str] = Field(None, title="Original source") + source_note: Optional[str] = Field(None, title="Notes form original source") + keywords: Optional[List[Keyword]] = Field(None, description="Keywords") + notes: Optional[List[Note]] = Field(None, description="Notes", title="Notes") + related_indicators: Optional[List[RelatedIndicator]] = Field(None, description="Related indicators") + compliance: Optional[List[ComplianceItem]] = Field( + None, description="Compliance with international resolution", title="Compliance with international resolution" + ) + series_groups: Optional[List[SeriesGroup]] = Field( + None, description="Series included in groups", title="Series groups" + ) diff --git a/pydantic_schemas/table-schema.py b/pydantic_schemas/table-schema.py new file mode 100644 index 0000000..d74decd --- /dev/null +++ b/pydantic_schemas/table-schema.py @@ -0,0 +1,535 @@ +# generated by datamodel-codegen: +# filename: table-schema.json +# timestamp: 2024-07-02T16:13:00+00:00 + +from __future__ import annotations + +from enum import Enum +from typing import Any, Dict, List, Optional, Union + +from pydantic import Extra, Field + +from .schema_base_model import SchemaBaseModel + + +class Overwrite(Enum): + """ + Overwrite document if already exists? + """ + + yes = "yes" + no = "no" + + +class Producer(SchemaBaseModel): + name: Optional[str] = Field(None, description="Name (required)", title="Name") + abbr: Optional[str] = Field(None, title="Abbreviation") + affiliation: Optional[str] = Field(None, title="Affiliation") + role: Optional[str] = Field(None, title="Role") + + +class MetadataInformation(SchemaBaseModel): + """ + Document description + """ + + class Config: + extra = Extra.forbid + + idno: Optional[str] = Field(None, title="Unique ID number for the document") + title: Optional[str] = Field(None, title="Document title") + producers: Optional[List[Producer]] = Field(None, description="List of producers", title="Producers") + production_date: Optional[str] = Field( + None, description="Document production date using format(YYYY-MM-DD)", title="Date of Production" + ) + version: Optional[str] = Field( + None, description="Identify and describe the current version of the document", title="Document version" + ) + + +class TitleStatement(SchemaBaseModel): + """ + Title statement + """ + + idno: str = Field( + ..., + description=( + "The ID number of a dataset is a unique number that is used to identify a particular survey. Define and use" + " a consistent scheme to use. Such an ID could be constructed as follows:" + " country-producer-survey-year-version where \n - country is the 3-letter ISO country abbreviation \n -" + " producer is the abbreviation of the producing agency \n - survey is the survey abbreviation \n - year is" + " the reference year (or the year the survey started) \n - version is the number dataset version number" + " (see Version Description below)" + ), + title="Unique user defined ID", + ) + table_number: Optional[str] = Field(None, description="Table number", title="Table number") + title: str = Field(..., description="Table title", title="Table title") + sub_title: Optional[str] = Field(None, description="A short subtitle for the table", title="Table subtitle") + alternate_title: Optional[str] = Field( + None, + description="Any form of the title used as a substitute or alternative to the formal title of the resource.", + title="Abbreviation or Acronym", + ) + translated_title: Optional[str] = Field(None, title="Translated title") + + +class Identifier(SchemaBaseModel): + type: Optional[str] = Field( + None, description="Type of identifier e.g. `doi`, `handle`, `other`", title="Identifier type" + ) + identifier: str = Field(..., title="Identifier") + + +class PublisherItem(SchemaBaseModel): + name: str = Field(..., title="Name") + affiliation: Optional[str] = Field(None, title="Affiliation") + abbreviation: Optional[str] = Field(None, title="Abbreviation") + role: Optional[str] = Field(None, title="Role") + uri: Optional[str] = Field(None, title="URI") + + +class TableColumn(SchemaBaseModel): + label: str = Field(..., title="Label") + var_name: Optional[str] = Field(None, description="Variable name", title="Variable name") + dataset: Optional[str] = Field( + None, description="Identifies the dataset that contains the variable reported in var_name", title="Dataset" + ) + + +class TableRow(TableColumn): + pass + + +class TableFootnote(SchemaBaseModel): + number: Optional[str] = Field(None, description="Footnote number", title="Footnote number") + text: str = Field(..., title="Footnote text") + + +class TableSery(SchemaBaseModel): + name: str = Field(..., description="Name", title="Name") + maintainer: Optional[str] = Field(None, title="Maintainer") + uri: Optional[str] = Field(None, title="URI") + description: Optional[str] = Field(None, title="Description") + + +class Statistic(SchemaBaseModel): + value: Optional[str] = Field(None, title="Value") + + +class UnitObservationItem(Statistic): + pass + + +class DataSource(SchemaBaseModel): + name: Optional[str] = Field( + None, + description=( + "The name (title) of the data source. For example, a table data may be extracted from the `Population" + " Census 2020`." + ), + title="Name", + ) + abbreviation: Optional[str] = Field( + None, description="The abbreviation (acronym) of the data source.", title="Abbreviation" + ) + source_id: Optional[str] = Field( + None, + description="A unique identifier for the source, such as a Digital Object Identifier (DOI).", + title="Source ID", + ) + note: Optional[str] = Field( + None, + description=( + "A note that describes how the source was used, possibly mentioning issues in the use of the source." + ), + title="Note", + ) + uri: Optional[str] = Field(None, description="A link (URL) to the source dataset.", title="URI") + + +class TimePeriod(SchemaBaseModel): + from_: str = Field( + ..., + alias="from", + description="Date in ISO format (YYYY-MM-DD). Partial dates are supported", + title="Start date", + ) + to: Optional[str] = Field( + None, description="Date in ISO format (YYYY-MM-DD). Partial dates are supported", title="End date" + ) + + +class UniverseItem(SchemaBaseModel): + value: Optional[str] = Field(None, title="Universe") + + +class RefCountryItem(SchemaBaseModel): + name: Optional[str] = Field(None, title="Country name") + code: Optional[str] = Field(None, title="Country code") + + +class GeographicUnit(SchemaBaseModel): + name: str = Field( + ..., description="Name of the geographic unit e.g. 'World', 'Africa', 'Afghanistan'", title="Location name" + ) + code: Optional[str] = Field( + None, description="Code of the geographic unit (for countries, preferred = ISO3 code)", title="Location code" + ) + type: Optional[str] = Field( + None, description="Type of geographic unit e.g. country, state, region, province etc", title="Type" + ) + + +class BboxItem(SchemaBaseModel): + west: Optional[str] = Field(None, title="West") + east: Optional[str] = Field(None, title="East") + south: Optional[str] = Field(None, title="South") + north: Optional[str] = Field(None, title="North") + + +class Language(SchemaBaseModel): + name: Optional[str] = Field(None, description="Language name", title="Name") + code: Optional[str] = Field(None, title="code") + + +class Link(SchemaBaseModel): + uri: Optional[str] = Field(None, title="URL") + description: Optional[str] = Field(None, title="Description") + + +class ApiDocumentationItem(SchemaBaseModel): + description: Optional[str] = Field(None, title="Description") + uri: Optional[str] = Field(None, title="URI") + + +class Publication(SchemaBaseModel): + title: Optional[str] = Field(None, title="Title") + uri: Optional[str] = Field(None, title="URL") + + +class Theme(SchemaBaseModel): + id: Optional[str] = Field(None, title="Unique Identifier") + name: str = Field(..., title="Name") + parent_id: Optional[str] = Field(None, title="Parent Identifier") + vocabulary: Optional[str] = Field(None, description="Name of the controlled vocabulary", title="Vocabulary") + uri: Optional[str] = Field( + None, + description="Link to the controlled vocabulary web page, if the theme is from a taxonomy.", + title="Vocabulary URI", + ) + + +class Topic(SchemaBaseModel): + id: str = Field(..., title="Unique Identifier") + name: str = Field(..., title="Topic") + parent_id: Optional[str] = Field( + None, description="For subtopics, provide the ID of the parent topic", title="Parent topic Identifier" + ) + vocabulary: Optional[str] = Field( + None, description="Name of the controlled vocabulary, if the topic is from a taxonomy.", title="Vocabulary" + ) + uri: Optional[str] = Field( + None, + description="Link to the controlled vocabulary web page, if the topic is from a taxonomy.", + title="Vocabulary URI", + ) + + +class Discipline(SchemaBaseModel): + id: Optional[str] = Field(None, title="Unique Identifier") + name: str = Field(..., title="Discipline title or name") + parent_id: Optional[str] = Field(None, description="Parent discipline ID", title="Parent discipline Identifier") + vocabulary: Optional[str] = Field(None, description="Vocabulary", title="Vocabulary") + uri: Optional[str] = Field(None, description="Website link", title="URI") + + +class Definition(SchemaBaseModel): + name: str = Field(..., title="Definition") + definition: Optional[str] = Field(None, description="Definition", title="Definition") + uri: Optional[str] = Field(None, description="Website link", title="URI") + + +class Classification(SchemaBaseModel): + name: str = Field(..., title="Classification name") + version: Optional[str] = Field(None, description="Version number", title="Version") + organization: Optional[str] = Field( + None, description="Organization responsible for the classification", title="Organization" + ) + uri: Optional[str] = Field(None, description="Website link", title="URI") + + +class LicenseItem(SchemaBaseModel): + name: Optional[str] = Field(None, title="License") + uri: Optional[str] = Field(None, title="URI") + + +class Contact(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + role: Optional[str] = Field(None, title="Role") + affiliation: Optional[str] = Field(None, title="Affiliation") + email: Optional[str] = Field(None, title="Email") + telephone: Optional[str] = Field(None, title="Telephone") + uri: Optional[str] = Field(None, title="URI") + + +class Note(SchemaBaseModel): + note: Optional[str] = Field(None, title="Note") + + +class Type(Enum): + isPartOf = "isPartOf" + hasPart = "hasPart" + isVersionOf = "isVersionOf" + isFormatOf = "isFormatOf" + hasFormat = "hasFormat" + references = "references" + isReferencedBy = "isReferencedBy" + isBasedOn = "isBasedOn" + isBasisFor = "isBasisFor" + requires = "requires" + isRequiredBy = "isRequiredBy" + + +class Relation(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + type: Optional[Type] = Field(None, title="Type") + + +class Tag(SchemaBaseModel): + tag: Optional[str] = Field(None, title="Tag") + tag_group: Optional[str] = Field(None, title="Tag group") + + +class ModelInfoItem(SchemaBaseModel): + source: Optional[str] = Field(None, title="Source") + author: Optional[str] = Field(None, title="Author") + version: Optional[str] = Field(None, title="Version") + model_id: Optional[str] = Field(None, title="Model Identifier") + nb_topics: Optional[float] = Field(None, title="Number of topics") + description: Optional[str] = Field(None, title="Description") + corpus: Optional[str] = Field(None, title="Corpus name") + uri: Optional[str] = Field(None, title="URI") + + +class TopicWord(SchemaBaseModel): + word: Optional[str] = Field(None, title="Word") + word_weight: Optional[float] = Field(None, title="Word weight") + + +class TopicDescriptionItem(SchemaBaseModel): + topic_id: Optional[Union[int, str]] = Field(None, title="Topic identifier") + topic_score: Optional[Union[float, str]] = Field(None, title="Topic score") + topic_label: Optional[str] = Field(None, title="Topic label") + topic_words: Optional[List[TopicWord]] = Field(None, description="Words", title="Topic words") + + +class LdaTopic(SchemaBaseModel): + class Config: + extra = Extra.forbid + + model_info: Optional[List[ModelInfoItem]] = Field(None, title="Model information") + topic_description: Optional[List[TopicDescriptionItem]] = Field(None, title="Topic information") + + +class Embedding(SchemaBaseModel): + id: str = Field(..., title="Vector Model ID") + description: Optional[str] = Field(None, title="Vector Model Description") + date: Optional[str] = Field(None, title="Date (YYYY-MM-DD)") + vector: Dict[str, Any] = Field(..., title="Vector") + + +class OriginDescription(SchemaBaseModel): + harvest_date: Optional[str] = Field(None, description="Harvest date using UTC date format") + altered: Optional[bool] = Field( + None, description="If the metadata was altered before dissemination", title="Metadata altered" + ) + base_url: Optional[str] = Field(None, description="Base URL of the originating repository") + identifier: Optional[str] = Field(None, description="Unique idenifiter of the item from the originating repository") + date_stamp: Optional[str] = Field( + None, + description="Datestamp (UTC date format) of the metadata record disseminated by the originating repository", + ) + metadata_namespace: Optional[str] = Field( + None, + description=( + "Metadata namespace URI of the metadata format of the record harvested from the originating repository" + ), + ) + + +class ProvenanceSchema(SchemaBaseModel): + """ + Provenance of metadata based on the OAI provenance schema (http://www.openarchives.org/OAI/2.0/provenance.xsd) + """ + + origin_description: Optional[OriginDescription] = Field(None, title="Origin description") + + +class AuthorIdItem(SchemaBaseModel): + type: Optional[Any] = Field(None, description="Source of identifier, e.g. ORCID", title="Type") + id: Optional[Any] = Field( + None, description="Author's unique identifier for the corresponding source", title="Identifier" + ) + + +class AuthoringEntityItem(SchemaBaseModel): + name: str = Field(..., title="Agency Name") + affiliation: Optional[str] = Field(None, title="Affiliation") + abbreviation: Optional[str] = Field(None, title="Abbreviation") + uri: Optional[str] = Field(None, title="URI") + author_id: Optional[List[AuthorIdItem]] = Field( + None, + description="Unique identifier of an author, which may be provided by services like ORCID or other", + title="Author ID", + ) + + +class AuthoringEntity(SchemaBaseModel): + """ + The person, corporate body, or agency responsible for the work's substantive and intellectual content. Repeat the element for each author, and use 'affiliation' attribute if available. Invert first and last name and use commas. + """ + + __root__: List[AuthoringEntityItem] = Field( + ..., + description=( + "The person, corporate body, or agency responsible for the work's substantive and intellectual content." + " Repeat the element for each author, and use 'affiliation' attribute if available. Invert first and last" + " name and use commas." + ), + title="Authoring entity/Primary investigators", + ) + + +class ContributorItem(PublisherItem): + pass + + +class Contributor(SchemaBaseModel): + __root__: List[ContributorItem] + + +class KeywordItem(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + vocabulary: Optional[str] = Field(None, title="Vocabulary name") + uri: Optional[str] = Field(None, title="Vocabulary URI") + + +class Keyword(SchemaBaseModel): + __root__: List[KeywordItem] + + +class TableDescription(SchemaBaseModel): + """ + Table Description + """ + + class Config: + extra = Extra.forbid + + title_statement: Optional[TitleStatement] = Field(None, description="Title statement") + identifiers: Optional[List[Identifier]] = Field(None, description="Other identifiers", title="Other identifiers") + authoring_entity: Optional[AuthoringEntity] = Field(None, description="Authoring entity", title="Authoring entity") + contributors: Optional[Contributor] = Field(None, description="Contributors", title="Contributors") + publisher: Optional[List[PublisherItem]] = Field(None, description="Publisher", title="Publisher") + date_created: Optional[str] = Field(None, description="Date created", title="Date created") + date_published: Optional[str] = Field(None, title="Date published") + date_modified: Optional[str] = Field( + None, description="Date on which the resource was changed.", title="Date last modified" + ) + version: Optional[str] = Field(None, title="Version") + description: Optional[str] = Field(None, description="Description", title="Description") + table_columns: Optional[List[TableColumn]] = Field( + None, description="List of table column names", title="Table column names" + ) + table_rows: Optional[List[TableRow]] = Field(None, description="Table row level data", title="Table row level data") + table_footnotes: Optional[List[TableFootnote]] = Field(None, description="Footnotes", title="Chart footnotes") + table_series: Optional[List[TableSery]] = Field(None, description="Table series", title="Table series") + statistics: Optional[List[Statistic]] = Field(None, title="Statistics") + unit_observation: Optional[List[UnitObservationItem]] = Field(None, title="Unit observation") + data_sources: Optional[List[DataSource]] = Field(None, title="Data sources") + time_periods: Optional[List[TimePeriod]] = Field(None, description="Time periods", title="Time periods") + universe: Optional[List[UniverseItem]] = Field(None, title="Universe") + ref_country: Optional[List[RefCountryItem]] = Field(None, title="Reference country") + geographic_units: Optional[List[GeographicUnit]] = Field( + None, + description=( + "List of geographic units (regions, countries, states, provinces, etc.) for which data are available in the" + " database." + ), + title="Geographic locations", + ) + geographic_granularity: Optional[str] = Field( + None, + description="Granularity of geographic coverage. examples `national`, `regional`, `provincial`", + title="Geographic granularity", + ) + bbox: Optional[List[BboxItem]] = Field(None, title="Geographic bounding box") + languages: Optional[List[Language]] = Field(None, description="languages") + links: Optional[List[Link]] = Field(None, title="Links") + api_documentation: Optional[List[ApiDocumentationItem]] = Field(None, description="API Documentation") + publications: Optional[List[Publication]] = Field(None, title="Publications") + keywords: Optional[Keyword] = Field(None, description="Keywords", title="Keywords") + themes: Optional[List[Theme]] = Field(None, description="Themes") + topics: Optional[List[Topic]] = Field( + None, + description="Topics covered by the table (ideally, the list of topics will be a controlled vocabulary)", + title="Topics", + ) + disciplines: Optional[List[Discipline]] = Field( + None, + description="Disciplines e.g. `Social sciences, economics`, `Natural sciences, biology`", + title="Disciplines", + ) + definitions: Optional[List[Definition]] = Field( + None, description="Definitions or concepts covered by the table", title="Definitions" + ) + classifications: Optional[List[Classification]] = Field( + None, description="Classifications used in the table", title="Classifications" + ) + rights: Optional[str] = Field(None, title="Rights") + license: Optional[List[LicenseItem]] = Field(None, title="License") + citation: Optional[str] = Field(None, description="A bibliographic reference for the resource.", title="Citation") + confidentiality: Optional[str] = Field(None, title="Confidentiality") + sdc: Optional[str] = Field( + None, + description=( + "Information on statistical disclosure control measures applied to the table. This can include cell" + " suppression, or other techniques. Specialized packages have been developed for this purpose, like" + " [*sdcTable: Methods for Statistical Disclosure Control in Tabular" + " Data*](https://cran.r-project.org/web/packages/sdcTable/index.html) and" + " https://cran.r-project.org/web/packages/sdcTable/sdcTable.pdf \nThe information provided here should be" + " such that it does not provide intruders with useful information for reverse-engineering the protection" + " measures applied to the table." + ), + title="Statistical disclosure control", + ) + contacts: Optional[List[Contact]] = Field(None, description="Contacts", title="Contacts") + notes: Optional[List[Note]] = Field(None, title="Notes") + relations: Optional[List[Relation]] = Field(None, description="Related documents", title="Relations") + + +class Model(SchemaBaseModel): + """ + Draft Schema for Table data type + """ + + repositoryid: Optional[str] = Field( + None, + description="Abbreviation for the collection that owns the document", + title="Collection ID that owns the document", + ) + published: Optional[int] = Field(0, description="Status - 0=draft, 1=published", title="Status") + overwrite: Optional[Overwrite] = Field("no", description="Overwrite document if already exists?") + metadata_information: Optional[MetadataInformation] = Field( + None, description="Document description", title="Document metadata information" + ) + table_description: Optional[TableDescription] = Field( + None, description="Table Description", title="Table Description" + ) + provenance: Optional[List[ProvenanceSchema]] = Field(None, description="Provenance") + tags: Optional[List[Tag]] = Field(None, description="Tags", title="Tags") + lda_topics: Optional[List[LdaTopic]] = Field(None, description="LDA topics", title="LDA topics") + embeddings: Optional[List[Embedding]] = Field(None, description="Word embeddings", title="Word embeddings") + additional: Optional[Dict[str, Any]] = Field(None, description="Additional metadata") diff --git a/pydantic_schemas/timeseries-db-schema.py b/pydantic_schemas/timeseries-db-schema.py new file mode 100644 index 0000000..d3fa6f9 --- /dev/null +++ b/pydantic_schemas/timeseries-db-schema.py @@ -0,0 +1,403 @@ +# generated by datamodel-codegen: +# filename: timeseries-db-schema.json +# timestamp: 2024-07-02T16:13:01+00:00 + +from __future__ import annotations + +from enum import Enum +from typing import Any, Dict, List, Optional + +from pydantic import Extra, Field + +from .schema_base_model import SchemaBaseModel + + +class Overwrite(Enum): + """ + Overwrite database if already exists? + """ + + yes = "yes" + no = "no" + + +class Producer(SchemaBaseModel): + name: Optional[str] = Field(None, description="Name (required)", title="Name") + abbr: Optional[str] = Field(None, title="Abbreviation") + affiliation: Optional[str] = Field(None, title="Affiliation") + role: Optional[str] = Field(None, title="Role") + + +class MetadataInformation(SchemaBaseModel): + """ + Document description + """ + + class Config: + extra = Extra.forbid + + title: Optional[str] = Field(None, description="Document title", title="Document title") + idno: Optional[str] = Field(None, title="Unique ID number for the document") + producers: Optional[List[Producer]] = Field(None, description="List of producers", title="Producers") + prod_date: Optional[str] = Field( + None, description="Document production date using format(YYYY-MM-DD)", title="Date of Production" + ) + version: Optional[str] = Field( + None, description="Identify and describe the current version of the document", title="Document version" + ) + + +class Identifier(SchemaBaseModel): + type: Optional[str] = Field( + None, description="Type of identifier e.g. `doi`, `handle`, `other`", title="Identifier type" + ) + identifier: str = Field(..., title="Identifier") + + +class TitleStatement(SchemaBaseModel): + """ + Study title + """ + + idno: str = Field( + ..., + description="The ID number of a database is a unique number that is used to identify a particular database.", + title="Unique user defined ID", + ) + identifiers: Optional[List[Identifier]] = Field(None, description="Other identifiers", title="Other identifiers") + title: str = Field( + ..., + description=( + "The title is the official name of the survey as it is stated on the questionnaire or as it appears in the" + " design documents. The following items should be noted:\n - Include the reference year(s) of the survey in" + " the title. \n - Do not include the abbreviation of the survey name in the title. \n - As the survey title" + " is a proper noun, the first letter of each word should be capitalized (except for prepositions or other" + " conjunctions).\n - Including the country name in the title is optional." + ), + title="Survey title", + ) + sub_title: Optional[str] = Field(None, description="A short subtitle for the survey", title="Survey subtitle") + alternate_title: Optional[str] = Field( + None, + description=( + "The abbreviation of a survey is usually the first letter of each word of the titled survey. The survey" + " reference year(s) may be included." + ), + title="Abbreviation or Acronym", + ) + translated_title: Optional[str] = Field( + None, + description="In countries with more than one official language, a translation of the title may be provided.", + title="Translated Title", + ) + + +class AuthoringEntityItem(SchemaBaseModel): + name: str = Field( + ..., + description=( + "Name of the person, corporate body, or agency responsible for the work's substantive and intellectual" + " content. If a person, invert first and last name and use commas." + ), + title="Agency Name", + ) + affiliation: Optional[str] = Field(None, title="Affiliation") + abbreviation: Optional[str] = Field(None, description="Abbreviation", title="Abbreviation") + email: Optional[str] = Field(None, description="Email", title="Email") + uri: Optional[str] = Field(None, title="URI") + + +class VersionItem(SchemaBaseModel): + version: str = Field(..., description="Version number e.g. v1.0", title="Version") + date: str = Field(..., title="Version Date") + responsibility: Optional[str] = Field( + None, description="Version Responsibility Statement", title="Version Responsibility Statement" + ) + notes: Optional[str] = Field(None, title="Version Notes") + + +class UpdateScheduleItem(SchemaBaseModel): + update: Optional[str] = Field(None, title="Schedule date") + + +class TimeCoverageItem(SchemaBaseModel): + start: Optional[str] = Field( + None, description="Time coverage, start date (oldest date for which data are available)", title="Start date" + ) + end: Optional[str] = Field( + None, description="Time coverage, end date (most recent date for which data are available)", title="End date" + ) + + +class PeriodicityItem(SchemaBaseModel): + period: Optional[str] = Field(None, title="Period") + + +class Theme(SchemaBaseModel): + id: Optional[str] = Field(None, title="Unique Identifier") + name: str = Field(..., title="Name") + parent_id: Optional[str] = Field(None, title="Parent Identifier") + vocabulary: Optional[str] = Field(None, description="Name of the controlled vocabulary", title="Vocabulary") + uri: Optional[str] = Field( + None, + description="Link to the controlled vocabulary web page, if the theme is from a taxonomy.", + title="Vocabulary URI", + ) + + +class Topic(SchemaBaseModel): + id: str = Field(..., title="Unique Identifier") + name: str = Field(..., title="Topic") + parent_id: Optional[str] = Field( + None, description="For subtopics, provide the ID of the parent topic", title="Parent topic Identifier" + ) + vocabulary: Optional[str] = Field( + None, description="Name of the controlled vocabulary, if the topic is from a taxonomy.", title="Vocabulary" + ) + uri: Optional[str] = Field( + None, + description="Link to the controlled vocabulary web page, if the topic is from a taxonomy.", + title="Vocabulary URI", + ) + + +class Keyword(SchemaBaseModel): + name: str = Field(..., title="Keyword") + vocabulary: Optional[str] = Field(None, title="Vocabulary") + uri: Optional[str] = Field(None, title="URI") + + +class RefCountryItem(SchemaBaseModel): + name: Optional[str] = Field(None, title="Country name") + code: Optional[str] = Field(None, title="Country code") + + +class GeographicUnit(SchemaBaseModel): + name: str = Field( + ..., description="Name of the geographic unit e.g. 'World', 'Africa', 'Afghanistan'", title="Location name" + ) + code: Optional[str] = Field( + None, description="Code of the geographic unit (for countries, preferred = ISO3 code)", title="Location code" + ) + type: Optional[str] = Field( + None, description="Type of geographic unit e.g. country, state, region, province etc", title="Type" + ) + + +class BboxItem(SchemaBaseModel): + west: Optional[str] = Field(None, title="West") + east: Optional[str] = Field(None, title="East") + south: Optional[str] = Field(None, title="South") + north: Optional[str] = Field(None, title="North") + + +class Sponsor(SchemaBaseModel): + name: Optional[str] = Field(None, description="Name of the sponsoring agency", title="Funding Agency/Sponsor") + abbreviation: Optional[str] = Field( + None, description="Abbreviation (acronym) of the sponsoring agency", title="Abbreviation" + ) + role: Optional[str] = Field(None, description="Specific role of the sponsoring agency", title="Role") + grant: Optional[str] = Field(None, description="Grant number", title="Grant") + uri: Optional[str] = Field(None, title="URI") + + +class Acknowledgment(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + affiliation: Optional[str] = Field(None, title="Affiliation") + role: Optional[str] = Field(None, title="Role") + uri: Optional[str] = Field(None, title="URI") + + +class Contact(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + role: Optional[str] = Field(None, title="Role") + affiliation: Optional[str] = Field(None, title="Affiliation") + email: Optional[str] = Field(None, title="Email") + telephone: Optional[str] = Field(None, title="Telephone") + uri: Optional[str] = Field(None, title="URI") + + +class Link(SchemaBaseModel): + uri: Optional[str] = Field(None, title="URI") + description: Optional[str] = Field(None, title="Description") + + +class Language(SchemaBaseModel): + name: Optional[str] = Field(None, description="Language title", title="Name") + code: Optional[str] = Field(None, title="code") + + +class AccessOption(SchemaBaseModel): + type: str = Field(..., description="Access type e.g. API, Bulk, Query, etc", title="Access type") + uri: Optional[str] = Field(None, title="URI") + note: Optional[str] = Field(None, description="Note", title="Note") + + +class LicenseItem(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + uri: Optional[str] = Field(None, title="URI") + note: Optional[str] = Field(None, title="Note") + + +class Note(SchemaBaseModel): + note: Optional[str] = Field(None, title="Note") + + +class DatabaseDescription(SchemaBaseModel): + """ + Database Description + """ + + class Config: + extra = Extra.forbid + + title_statement: TitleStatement = Field(..., description="Study title") + authoring_entity: Optional[List[AuthoringEntityItem]] = Field( + None, + description=( + "The person, corporate body, or agency responsible for the work's substantive and intellectual content." + " Repeat the element for each author, and use 'affiliation' attribute if available. Invert first and last" + " name and use commas." + ), + title="Authoring entity", + ) + abstract: Optional[str] = Field(None, description="A brief description of the database", title="Abstract") + url: Optional[str] = Field(None, description="Link to the dataset web page", title="Dataset URL") + type: Optional[str] = Field(None, description="Dataset type", title="Dataset type") + doi: Optional[str] = Field(None, description="DOI handle", title="DOI") + date_created: Optional[str] = Field( + None, description="Date this version of the dataset was created", title="Date of creation" + ) + date_published: Optional[str] = Field( + None, description="Date this version of the dataset was published", title="Dataset published date" + ) + version: Optional[List[VersionItem]] = Field(None, title="Version Statement") + update_frequency: Optional[str] = Field( + None, + description="Dataset frequency of updates (for datasets updated at regular intervals)", + title="Frequency of update", + ) + update_schedule: Optional[List[UpdateScheduleItem]] = Field( + None, description="Dataset schedule of updates", title="Schedule of updates" + ) + time_coverage: Optional[List[TimeCoverageItem]] = Field( + None, + description=( + "Time coverage for the whole database. This will typically be the min and max dates for which data are" + " available in any series contained in the database." + ), + title="Range of dates covered by the dataset", + ) + time_coverage_note: Optional[str] = Field(None, description="Time coverage note", title="Time coverage note") + periodicity: Optional[List[PeriodicityItem]] = Field( + None, + description=( + "Periodicity of the data contained in the database (NOT the periodicity of update of the database). This" + " describes the various reference periods for the series. Example: `annual`, `quarterly`, `monthly`," + " `daily`." + ), + title="Periodicity of series", + ) + themes: Optional[List[Theme]] = Field(None, description="Themes") + topics: Optional[List[Topic]] = Field( + None, + description="Topics covered by the database (ideally, the list of topics will be a controlled vocabulary)", + title="Topics", + ) + keywords: Optional[List[Keyword]] = Field(None, description="Keywords") + ref_country: Optional[List[RefCountryItem]] = Field( + None, description="List of countries for which data are available", title="Reference country" + ) + geographic_units: Optional[List[GeographicUnit]] = Field( + None, + description=( + "List of geographic units (regions, countries, states, provinces, etc.) for which data are available in the" + " database." + ), + title="Geographic locations", + ) + geographic_coverage_note: Optional[str] = Field( + None, description="Notes on geographic coverage", title="Geographic coverage notes" + ) + bbox: Optional[List[BboxItem]] = Field(None, description="Geographic bounding box", title="Geographic bounding box") + geographic_granularity: Optional[str] = Field( + None, + description="Granularity of geographic coverage e.g. `national`, `regional`, `provincial`", + title="Geographic granularity", + ) + geographic_area_count: Optional[str] = Field(None, description="Number of geographic areas") + sponsors: Optional[List[Sponsor]] = Field( + None, + description=( + "The source(s) of funds for production of the work. If different funding agencies sponsored different" + " stages of the production process, use the 'role' attribute to distinguish them." + ), + title="Sponsor/Funding Agency", + ) + acknowledgments: Optional[List[Acknowledgment]] = Field( + None, description="Other Acknowledgments", title="Other Acknowledgments" + ) + acknowledgment_statement: Optional[str] = Field( + None, + title=( + "An overall statement of acknowledgment, which can be used as an alternative (or supplement) to the" + " itemized list provided in `acknowledgments`." + ), + ) + contacts: Optional[List[Contact]] = Field(None, description="Contacts", title="Contacts") + links: Optional[List[Link]] = Field(None, description="Related links", title="Related links") + languages: Optional[List[Language]] = Field(None, description="Supported languages") + access_options: Optional[List[AccessOption]] = Field( + None, description="Access options e.g. API, Bulk, Query", title="Access options" + ) + license: Optional[List[LicenseItem]] = Field(None, description="License information", title="License") + citation: Optional[str] = Field(None, title="Citation") + notes: Optional[List[Note]] = Field(None, description="Notes", title="Notes") + disclaimer: Optional[str] = Field(None, title="Disclaimer") + copyright: Optional[str] = Field(None, title="Copyright") + + +class OriginDescription(SchemaBaseModel): + harvest_date: Optional[str] = Field(None, description="Harvest date using UTC date format") + altered: Optional[bool] = Field( + None, description="If the metadata was altered before dissemination", title="Metadata altered" + ) + base_url: Optional[str] = Field(None, description="Base URL of the originating repository") + identifier: Optional[str] = Field(None, description="Unique idenifiter of the item from the originating repository") + date_stamp: Optional[str] = Field( + None, + description="Datestamp (UTC date format) of the metadata record disseminated by the originating repository", + ) + metadata_namespace: Optional[str] = Field( + None, + description=( + "Metadata namespace URI of the metadata format of the record harvested from the originating repository" + ), + ) + + +class ProvenanceSchema(SchemaBaseModel): + """ + Provenance of metadata based on the OAI provenance schema (http://www.openarchives.org/OAI/2.0/provenance.xsd) + """ + + origin_description: Optional[OriginDescription] = Field(None, title="Origin description") + + +class TimeseriesDatabaseSchema(SchemaBaseModel): + """ + Schema for timeseries database + """ + + published: Optional[int] = Field(0, description="0=draft, 1=published", title="Status") + overwrite: Optional[Overwrite] = Field("no", description="Overwrite database if already exists?") + metadata_information: Optional[MetadataInformation] = Field( + None, description="Document description", title="Document metadata information" + ) + database_description: DatabaseDescription = Field( + ..., description="Database Description", title="Database Description" + ) + provenance: Optional[List[ProvenanceSchema]] = Field(None, description="Provenance") + additional: Optional[Dict[str, Any]] = Field( + None, description="Any other custom metadata not covered by the schema", title="Additional custom metadata" + ) diff --git a/pydantic_schemas/timeseries-schema.py b/pydantic_schemas/timeseries-schema.py new file mode 100644 index 0000000..03bcb3c --- /dev/null +++ b/pydantic_schemas/timeseries-schema.py @@ -0,0 +1,732 @@ +# generated by datamodel-codegen: +# filename: timeseries-schema.json +# timestamp: 2024-07-02T16:13:03+00:00 + +from __future__ import annotations + +from enum import Enum +from typing import Any, Dict, List, Optional, Union + +from pydantic import Extra, Field + +from .schema_base_model import SchemaBaseModel + + +class Producer(SchemaBaseModel): + name: Optional[str] = Field(None, description="Name (required)", title="Name") + abbr: Optional[str] = Field(None, title="Abbreviation") + affiliation: Optional[str] = Field(None, title="Affiliation") + role: Optional[str] = Field(None, title="Role") + + +class VersionStatement(SchemaBaseModel): + """ + Version Statement + """ + + version: Optional[str] = Field(None, title="Version") + version_date: Optional[str] = Field(None, title="Version Date") + version_resp: Optional[str] = Field( + None, + description="The organization or person responsible for the version of the work", + title="Version Responsibility Statement", + ) + version_notes: Optional[str] = Field(None, title="Version Notes") + + +class MetadataInformation(SchemaBaseModel): + """ + Information on the production of the metadata + """ + + class Config: + extra = Extra.forbid + + title: Optional[str] = Field(None, description="Document title", title="Document title") + idno: Optional[str] = Field(None, title="Unique ID number for the document") + producers: Optional[List[Producer]] = Field(None, description="List of producers", title="Producers") + prod_date: Optional[str] = Field( + None, description="Document production date using format(YYYY-MM-DD)", title="Date of Production" + ) + version_statement: Optional[VersionStatement] = Field( + None, description="Version Statement", title="Version Statement" + ) + + +class AuthoringEntityItem(SchemaBaseModel): + name: str = Field( + ..., + description=( + "Name of the person, corporate body, or agency responsible for the work's substantive and intellectual" + " content. If a person, invert first and last name and use commas." + ), + title="Agency Name", + ) + affiliation: Optional[str] = Field(None, title="Affiliation") + abbreviation: Optional[Any] = Field(None, description="Abbreviation", title="Abbreviation") + email: Optional[Any] = Field(None, description="Email", title="Email") + uri: Optional[str] = Field(None, title="URI") + + +class Alias(SchemaBaseModel): + alias: Optional[str] = Field(None, title="Alias") + + +class AlternateIdentifier(SchemaBaseModel): + identifier: str = Field(..., title="Identifier") + name: Optional[str] = Field(None, title="Identifier name") + database: Optional[str] = Field(None, title="Database") + uri: Optional[str] = Field(None, title="URI") + notes: Optional[str] = Field(None, title="Notes") + + +class Language(SchemaBaseModel): + name: Optional[str] = Field(None, description="Language title", title="Name") + code: Optional[str] = Field(None, title="code") + + +class Dimension(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + label: str = Field(..., title="Label") + description: Optional[str] = Field(None, title="Description") + + +class DefinitionReference(SchemaBaseModel): + source: Optional[str] = Field(None, title="Source") + uri: str = Field(..., description="URI", title="URI") + note: Optional[str] = Field(None, description="Note", title="Note") + + +class StatisticalConceptReference(DefinitionReference): + pass + + +class Concept(SchemaBaseModel): + name: str = Field(..., title="Name") + definition: Optional[str] = Field(None, description="Definition", title="Definition") + uri: Optional[str] = Field(None, description="Website link", title="URI") + + +class DataCollection(SchemaBaseModel): + """ + This description should include, when applicable, the sample frame used, the questions used to collect the data, the type of interview, the dates/duration of fieldwork, the sample size and the response rate. Some additional information on questionnaire design and testing, interviewer training, methods used to monitor non-response etc. + """ + + data_source: Optional[str] = Field(None, title="Data source") + method: Optional[str] = Field(None, title="Data collection method") + period: Optional[str] = Field(None, title="Data collection period") + note: Optional[str] = Field(None, title="Data collection note") + uri: Optional[str] = Field(None, title="Data collection URL") + + +class MethodologyReference(DefinitionReference): + pass + + +class DerivationReference(DefinitionReference): + pass + + +class ImputationReference(DefinitionReference): + pass + + +class Theme(SchemaBaseModel): + id: Optional[str] = Field(None, title="Unique Identifier") + name: str = Field(..., title="Name") + parent_id: Optional[str] = Field(None, title="Parent Identifier") + vocabulary: Optional[str] = Field(None, description="Name of the controlled vocabulary", title="Vocabulary") + uri: Optional[str] = Field( + None, + description="Link to the controlled vocabulary web page, if the theme is from a taxonomy.", + title="Vocabulary URI", + ) + + +class Topic(SchemaBaseModel): + id: Optional[str] = Field(None, title="Unique Identifier") + name: str = Field(..., title="Topic") + parent_id: Optional[str] = Field( + None, description="For subtopics, provide the ID of the parent topic", title="Parent topic Identifier" + ) + vocabulary: Optional[str] = Field( + None, description="Name of the controlled vocabulary, if the topic is from a taxonomy.", title="Vocabulary" + ) + uri: Optional[str] = Field( + None, + description="Link to the controlled vocabulary web page, if the topic is from a taxonomy.", + title="Vocabulary URI", + ) + + +class Discipline(SchemaBaseModel): + id: Optional[str] = Field(None, title="Unique Identifier") + name: str = Field(..., title="Discipline title or name") + parent_id: Optional[str] = Field(None, title="Parent Identifier") + vocabulary: Optional[str] = Field(None, description="Vocabulary", title="Vocabulary") + uri: Optional[str] = Field(None, description="Website link", title="URI") + + +class Mandate(SchemaBaseModel): + """ + Mandate + """ + + mandate: Optional[str] = Field(None, title="Mandate") + uri: Optional[str] = Field(None, title="URL") + + +class TimePeriod(SchemaBaseModel): + start: Optional[str] = Field(None, title="Start") + end: Optional[str] = Field(None, title="End") + notes: Optional[str] = Field(None, title="Notes") + + +class RefCountryItem(SchemaBaseModel): + name: Optional[str] = Field(None, title="Country name") + code: Optional[str] = Field(None, title="Country code") + + +class GeographicUnit(SchemaBaseModel): + name: str = Field( + ..., description="Name of the geographic unit e.g. 'World', 'Africa', 'Afghanistan'", title="Location name" + ) + code: Optional[str] = Field( + None, description="Code of the geographic unit (for countries, preferred = ISO3 code)", title="Location code" + ) + type: Optional[str] = Field( + None, description="Type of geographic unit e.g. country, state, region, province etc", title="Type" + ) + + +class BboxItem(SchemaBaseModel): + west: Optional[str] = Field(None, title="West") + east: Optional[str] = Field(None, title="East") + south: Optional[str] = Field(None, title="South") + north: Optional[str] = Field(None, title="North") + + +class AggregationMethodReference(DefinitionReference): + pass + + +class LicenseItem(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + uri: Optional[str] = Field(None, title="URI") + note: Optional[str] = Field(None, title="Note") + + +class Link(SchemaBaseModel): + type: Optional[str] = Field(None, description="Link types - API, website, etc.", title="Link type") + description: Optional[str] = Field(None, title="Description") + uri: Optional[str] = Field(None, title="URI") + + +class ApiDocumentationItem(SchemaBaseModel): + description: Optional[str] = Field(None, title="Description") + uri: Optional[str] = Field(None, title="URI") + + +class OtherIdentifier(SchemaBaseModel): + type: Optional[str] = Field(None, title="Type") + identifier: Optional[str] = Field(None, title="Identifier") + + +class AuthorIdItem(SchemaBaseModel): + type: Optional[str] = Field(None, title="Type") + id: Optional[str] = Field(None, title="Identifier") + + +class Author(SchemaBaseModel): + first_name: Optional[str] = Field(None, title="First name") + initial: Optional[str] = Field(None, title="Initial") + last_name: Optional[str] = Field(None, title="Last name") + affiliation: Optional[str] = Field(None, title="Affiliation") + author_id: Optional[List[AuthorIdItem]] = Field(None, title="Author ID") + full_name: Optional[str] = Field(None, title="Full name") + + +class Dataset(SchemaBaseModel): + idno: Optional[str] = Field(None, title="Identifier (IDNO)") + title: Optional[str] = Field( + None, description="Title of the dataset inluding the country and year if relevant", title="Title" + ) + uri: Optional[str] = Field(None, title="URI") + + +class Source(SchemaBaseModel): + idno: Optional[str] = Field(None, title="Source ID") + other_identifiers: Optional[List[OtherIdentifier]] = Field(None, title="Identifiers") + type: Optional[str] = Field(None, title="Source type") + name: str = Field(..., description="Source name", title="Name") + organization: Optional[str] = Field(None, title="Organization") + authors: Optional[List[Author]] = Field(None, title="Authors") + datasets: Optional[List[Dataset]] = Field(None, title="Datasets") + publisher: Optional[str] = Field(None, title="Publisher") + publication_date: Optional[str] = Field(None, title="Publication date") + uri: Optional[str] = Field(None, title="URI") + access_date: Optional[str] = Field(None, title="Access date") + note: Optional[str] = Field(None, title="Note") + + +class DirectSource(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + organization: Optional[str] = Field(None, title="Organization") + uri: Optional[str] = Field(None, title="URI") + note: Optional[str] = Field(None, title="Note") + + +class Keyword(SchemaBaseModel): + name: str = Field(..., title="Keyword") + vocabulary: Optional[str] = Field(None, title="Vocabulary") + uri: Optional[str] = Field(None, title="URI") + + +class Acronym(SchemaBaseModel): + acronym: str = Field(..., title="Acronym or abbreviation") + expansion: str = Field(..., title="Expansion of the acronym or abbreviation") + occurrence: Optional[float] = Field(None, title="Occurrence of the acronym in the document") + + +class Erratum(SchemaBaseModel): + date: Optional[str] = Field( + None, description="Date when the erratum was reported or published", title="Date of erratum" + ) + description: Optional[str] = Field( + None, + description="A description of the erratum, with information on which data or metadata were impacted", + title="Description of the erratum", + ) + uri: Optional[str] = Field(None, title="URI") + + +class Acknowledgement(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + affiliation: Optional[str] = Field(None, title="Affiliation") + role: Optional[str] = Field(None, title="Role") + + +class Note(SchemaBaseModel): + note: Optional[str] = Field(None, title="Note") + type: Optional[str] = Field(None, description="Type of note", title="Note type") + uri: Optional[str] = Field(None, title="URI") + + +class RelatedIndicator(SchemaBaseModel): + code: Optional[str] = Field(None, title="Indicator code") + label: Optional[str] = Field(None, title="Indicator name") + uri: Optional[str] = Field(None, title="URI") + relationship: Optional[str] = Field(None, title="Relationship") + type: Optional[str] = Field(None, title="Type") + + +class ComplianceItem(SchemaBaseModel): + standard: str = Field(..., title="Standard name") + abbreviation: Optional[str] = Field(None, title="Abbreviation") + custodian: Optional[str] = Field(None, title="Name of the custodian organization") + uri: Optional[str] = Field(None, title="URI") + + +class FrameworkItem(SchemaBaseModel): + name: str = Field(..., title="Name") + abbreviation: Optional[str] = Field(None, title="Abbreviation") + custodian: Optional[str] = Field(None, title="Custodian") + description: Optional[str] = Field(None, title="Description") + goal_id: Optional[str] = Field(None, title="Goal ID") + goal_name: Optional[str] = Field(None, title="Goal name") + goal_description: Optional[str] = Field(None, title="Goal description") + target_id: Optional[str] = Field(None, title="target ID") + target_name: Optional[str] = Field(None, title="Target name") + target_description: Optional[str] = Field(None, title="Target description") + indicator_id: Optional[str] = Field(None, title="Indicator ID") + indicator_name: Optional[str] = Field(None, title="Indicator name") + indicator_description: Optional[str] = Field(None, title="Indicator description") + uri: Optional[str] = Field(None, title="URI") + notes: Optional[str] = Field(None, title="Description") + + +class SeriesGroup(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + description: Optional[str] = Field( + None, description="A brief description of the series group.", title="Description" + ) + version: Optional[str] = Field(None, title="Version") + uri: Optional[str] = Field(None, title="URI") + + +class Contact(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + role: Optional[str] = Field(None, title="Role") + position: Optional[str] = Field(None, title="Position") + affiliation: Optional[str] = Field(None, title="Affiliation") + email: Optional[str] = Field(None, title="Email") + telephone: Optional[str] = Field(None, title="Telephone") + uri: Optional[str] = Field(None, title="URI") + + +class SeriesDescription(SchemaBaseModel): + """ + Series information + """ + + idno: str = Field(..., description="Unique series ID", title="Series unique ID") + doi: Optional[str] = Field(None, title="DOI handle") + name: str = Field(..., title="Series Name") + display_name: Optional[str] = Field(None, title="Display Name") + authoring_entity: Optional[List[AuthoringEntityItem]] = Field( + None, + description=( + "The person, corporate body, or agency responsible for the work's substantive and intellectual content." + " Repeat the element for each author, and use 'affiliation' attribute if available. Invert first and last" + " name and use commas." + ), + title="Authoring entity", + ) + database_id: Optional[str] = Field(None, description="Series database ID", title="Database ID") + database_name: Optional[str] = Field(None, description="Series database name", title="Database name") + date_last_update: Optional[str] = Field(None, title="Last updated date") + date_released: Optional[str] = Field(None, title="Date released") + version_statement: Optional[VersionStatement] = Field( + None, description="Version Statement", title="Version Statement" + ) + aliases: Optional[List[Alias]] = Field(None, title="Series other names") + alternate_identifiers: Optional[List[AlternateIdentifier]] = Field(None, title="Alternate identifiers") + languages: Optional[List[Language]] = Field(None, description="Supported languages") + measurement_unit: Optional[str] = Field(None, title="Series unit of measure") + power_code: Optional[str] = Field( + None, + description=( + "Power of 10 by which the reported statistics should be multiplied. e.g. '6' indicating millions of units" + ), + title="Power code", + ) + dimensions: Optional[List[Dimension]] = Field(None, title="Dimensions") + release_calendar: Optional[str] = Field(None, description="Release calendar", title="Release calendar") + periodicity: Optional[str] = Field(None, title="Periodicity of data") + base_period: Optional[str] = Field(None, title="Base period") + definition_short: Optional[str] = Field(None, title="Definition short") + definition_long: Optional[str] = Field(None, title="Definition long") + definition_references: Optional[List[DefinitionReference]] = Field( + None, + description="URL to standard definition of the indicator (international or national standard)", + title="Definition references", + ) + statistical_concept: Optional[str] = Field(None, title="Statistical concept") + statistical_concept_references: Optional[List[StatisticalConceptReference]] = Field( + None, description="URLs for statistical concept references", title="Statistical concept references" + ) + concepts: Optional[List[Concept]] = Field(None, description="Related concepts", title="Related concepts") + universe: Optional[str] = Field( + None, + description="Target population (the statistical universe about which information is sought)", + title="Universe", + ) + data_collection: Optional[DataCollection] = Field( + None, + description=( + " This description should include, when applicable, the sample frame used, the questions used to collect" + " the data, the type of interview, the dates/duration of fieldwork, the sample size and the response rate." + " Some additional information on questionnaire design and testing, interviewer training, methods used to" + " monitor non-response etc." + ), + title="Data collection", + ) + methodology: Optional[str] = Field(None, title="Methodology") + methodology_references: Optional[List[MethodologyReference]] = Field( + None, description="URLs for methodology references", title="Methodology references" + ) + derivation: Optional[str] = Field(None, title="Derivation") + derivation_references: Optional[List[DerivationReference]] = Field( + None, description="URLs for derivation references", title="Derivation references" + ) + imputation: Optional[str] = Field(None, title="Imputations") + imputation_references: Optional[List[ImputationReference]] = Field( + None, description="URLs for imputation references", title="Imputation references" + ) + seasonal_adjustment: Optional[str] = Field( + None, + description=( + "Application of statistical techniques to time series data in order to remove seasonal fluctuations and to" + " better understand underlying trends." + ), + title="Seasonal adjustment", + ) + adjustments: Optional[List[str]] = Field( + None, + description=( + "Description of any adjustments with respect to use of standard classifications and harmonization of" + " breakdowns for age group and other dimensions, or adjustments made for compliance with specific" + " international or national definitions." + ), + title="Other adjustments", + ) + missing: Optional[str] = Field(None, title="Treatment of missing values") + validation_rules: Optional[List[str]] = Field( + None, description="Set of rules to validate values for indicators, e.g. range checks", title="Validation rules" + ) + quality_checks: Optional[str] = Field(None, title="Quality control methods") + quality_note: Optional[str] = Field(None, title="Note on data quality") + sources_discrepancies: Optional[str] = Field(None, title="Discrepency sources") + series_break: Optional[str] = Field(None, title="Breaks in series") + limitation: Optional[str] = Field(None, title="Limitations and exceptions") + themes: Optional[List[Theme]] = Field(None, description="Themes") + topics: Optional[List[Topic]] = Field( + None, + description="Topics covered by the table (ideally, the list of topics will be a controlled vocabulary)", + title="Topics", + ) + disciplines: Optional[List[Discipline]] = Field( + None, + description="Disciplines e.g. `Social sciences, economics`, `Natural sciences, biology`", + title="Disciplines", + ) + relevance: Optional[str] = Field(None, title="Relavance") + mandate: Optional[Mandate] = Field(None, description="Mandate", title="Mandate") + time_periods: Optional[List[TimePeriod]] = Field(None, title="Series dates") + ref_country: Optional[List[RefCountryItem]] = Field( + None, description="List of countries for which data are available", title="Reference country" + ) + geographic_units: Optional[List[GeographicUnit]] = Field( + None, + description=( + "List of geographic units (regions, countries, states, provinces, etc.) for which data are available in the" + " database." + ), + title="Geographic locations", + ) + bbox: Optional[List[BboxItem]] = Field(None, title="Geographic bounding box") + aggregation_method: Optional[str] = Field(None, title="Aggregation method") + aggregation_method_references: Optional[List[AggregationMethodReference]] = Field( + None, description="URLs for aggregation method references", title="Aggregation method references" + ) + disaggregation: Optional[str] = Field(None, title="Dissaggregation") + license: Optional[List[LicenseItem]] = Field(None, description="License information", title="License") + confidentiality: Optional[str] = Field( + None, description="Confidentiality statement", title="Confidentiality statement" + ) + confidentiality_status: Optional[str] = Field(None, title="Confidentiality status") + confidentiality_note: Optional[str] = Field(None, title="Confidentiality note") + citation_requirement: Optional[str] = Field( + None, description="Citation requirement (can include a specific recommended citation)" + ) + links: Optional[List[Link]] = Field(None, description="Links to API calls, websites, etc.", title="Series links") + api_documentation: Optional[List[ApiDocumentationItem]] = Field(None, description="API Documentation") + sources: Optional[List[Source]] = Field(None, description="Sources", title="Sources") + sources_note: Optional[str] = Field(None, title="Notes form original sources") + direct_sources: Optional[List[DirectSource]] = Field( + None, description="Refers to the sources from where the data was directly collected", title="Direct sources" + ) + keywords: Optional[List[Keyword]] = Field(None, description="Keywords") + acronyms: Optional[List[Acronym]] = Field(None, description="Acronyms") + errata: Optional[List[Erratum]] = Field( + None, description="List of corrected errors in data or metadata", title="Errata" + ) + acknowledgements: Optional[List[Acknowledgement]] = Field( + None, description="Acknowledgments of persons or organizations", title="Other acknowledgments" + ) + acknowledgement_statement: Optional[str] = Field( + None, description="Acknowledgement statement", title="Acknowledgement statement" + ) + disclaimer: Optional[str] = Field(None, title="Disclaimer") + notes: Optional[List[Note]] = Field(None, description="Notes", title="Notes") + related_indicators: Optional[List[RelatedIndicator]] = Field(None, description="Related indicators") + compliance: Optional[List[ComplianceItem]] = Field( + None, description="Compliance with international resolution", title="Compliance with international resolution" + ) + framework: Optional[List[FrameworkItem]] = Field(None, title="Framework") + series_groups: Optional[List[SeriesGroup]] = Field( + None, description="Series included in groups", title="Series groups" + ) + contacts: Optional[List[Contact]] = Field(None, description="Contacts", title="Contacts") + + +class DataType(Enum): + string = "string" + integer = "integer" + float = "float" + date = "date" + boolean = "boolean" + + +class ColumnType(Enum): + dimension = "dimension" + time_period = "time_period" + measure = "measure" + attribute = "attribute" + indicator_id = "indicator_id" + indicator_name = "indicator_name" + annotation = "annotation" + geography = "geography" + observation_value = "observation_value" + + +class TimePeriodFormat(Enum): + YYYY = "YYYY" + YYYY_MM = "YYYY-MM" + YYYY_MM_DD = "YYYY-MM-DD" + YYYY_MM_DDTHH_MM_SS = "YYYY-MM-DDTHH:MM:SS" + YYYY_MM_DDTHH_MM_SSZ = "YYYY-MM-DDTHH:MM:SSZ" + + +class CodeListItem(SchemaBaseModel): + code: Optional[str] = Field(None, title="Code") + label: Optional[str] = Field(None, title="Label") + description: Optional[str] = Field(None, title="Description") + + +class CodeListReference(SchemaBaseModel): + id: Optional[str] = Field(None, title="Identifier (ID)") + name: Optional[str] = Field(None, title="Name") + version: Optional[str] = Field(None, title="Version") + uri: str = Field(..., description="URI", title="URI") + note: Optional[str] = Field(None, description="Note", title="Note") + + +class DataStructureItem(SchemaBaseModel): + name: Optional[str] = Field(None, description="Name (required)", title="Name") + label: Optional[str] = Field(None, title="Label") + description: Optional[str] = Field(None, title="Description") + data_type: Optional[DataType] = Field(None, title="Data type") + column_type: Optional[ColumnType] = Field(None, title="Column type") + time_period_format: Optional[TimePeriodFormat] = Field(None, title="Time period format") + code_list: Optional[List[CodeListItem]] = Field(None, title="Code list") + code_list_reference: Optional[CodeListReference] = Field(None, title="Code list reference") + + +class Operator(Enum): + field_ = "=" + field__ = "!=" + field__1 = "<" + field___1 = "<=" + field__2 = ">" + field___2 = ">=" + in_ = "in" + field_in = "!in" + + +class Filter(SchemaBaseModel): + field: Optional[str] = Field(None, title="Field") + operator: Optional[Operator] = Field(None, title="Operator") + value: Optional[Union[str, float, bool, List[Any]]] = Field(None, title="Value") + + +class DataNote(SchemaBaseModel): + filters: Optional[List[Filter]] = Field(None, description="Filters", title="Filters") + note: Optional[str] = Field(None, title="Note") + + +class Tag(SchemaBaseModel): + tag: Optional[str] = Field(None, title="Tag") + tag_group: Optional[str] = Field(None, title="Tag group") + + +class NameType(Enum): + Personal = "Personal" + Organizational = "Organizational" + + +class Creator(SchemaBaseModel): + name: str = Field(..., title="Name") + nameType: Optional[NameType] = Field(None, title="Name type") + givenName: Optional[str] = Field(None, title="Given name") + familyName: Optional[str] = Field(None, title="Family name") + + +class TitleType(Enum): + AlternativeTitle = "AlternativeTitle" + Subtitle = "Subtitle" + TranslatedTitle = "TranslatedTitle" + Other = "Other" + + +class Title(SchemaBaseModel): + title: str = Field(..., title="Title") + titleType: Optional[TitleType] = Field(None, title="Title type") + lang: Optional[str] = Field(None, title="Language") + + +class ResourceTypeGeneral(Enum): + Audiovisual = "Audiovisual" + Collection = "Collection" + DataPaper = "DataPaper" + Dataset = "Dataset" + Event = "Event" + Image = "Image" + InteractiveResource = "InteractiveResource" + Model = "Model" + PhysicalObject = "PhysicalObject" + Service = "Service" + Software = "Software" + Sound = "Sound" + Text = "Text" + Workflow = "Workflow" + Other = "Other" + + +class Types(SchemaBaseModel): + resourceType: str = Field(..., title="Resource type") + resourceTypeGeneral: Optional[ResourceTypeGeneral] = Field(None, title="Resource type general") + + +class DataciteSchema(SchemaBaseModel): + """ + Schema based on Datacite elements + """ + + doi: Optional[str] = Field(None, title="DOI") + prefix: Optional[str] = Field(None, title="Prefix") + suffix: Optional[str] = Field(None, title="Suffix") + creators: Optional[List[Creator]] = Field(None, title="Creators") + titles: Optional[List[Title]] = Field(None, title="Titles") + publisher: Optional[str] = Field(None, title="Publisher") + publicationYear: Optional[str] = Field(None, title="Publication year") + types: Optional[Types] = Field(None, title="Types") + url: Optional[str] = Field(None, title="URL") + language: Optional[str] = Field(None, title="Language") + + +class OriginDescription(SchemaBaseModel): + harvest_date: Optional[str] = Field(None, description="Harvest date using UTC date format") + altered: Optional[bool] = Field( + None, description="If the metadata was altered before dissemination", title="Metadata altered" + ) + base_url: Optional[str] = Field(None, description="Base URL of the originating repository") + identifier: Optional[str] = Field(None, description="Unique idenifiter of the item from the originating repository") + date_stamp: Optional[str] = Field( + None, + description="Datestamp (UTC date format) of the metadata record disseminated by the originating repository", + ) + metadata_namespace: Optional[str] = Field( + None, + description=( + "Metadata namespace URI of the metadata format of the record harvested from the originating repository" + ), + ) + + +class ProvenanceSchema(SchemaBaseModel): + """ + Provenance of metadata based on the OAI provenance schema (http://www.openarchives.org/OAI/2.0/provenance.xsd) + """ + + origin_description: Optional[OriginDescription] = Field(None, title="Origin description") + + +class TimeseriesSchema(SchemaBaseModel): + """ + Schema for timeseries data type + """ + + idno: Optional[str] = Field(None, description="Project unique identifier", title="Project unique identifier") + metadata_information: Optional[MetadataInformation] = Field( + None, description="Information on the production of the metadata", title="Metadata creation" + ) + series_description: SeriesDescription = Field(..., description="Series information") + data_structure: Optional[List[DataStructureItem]] = Field(None, description="Data structure definition") + data_notes: Optional[List[DataNote]] = Field(None, description="Data notes", title="Data notes") + datacite: Optional[DataciteSchema] = Field(None, description="DataCite metadata for generating DOI") + provenance: Optional[List[ProvenanceSchema]] = Field(None, description="Provenance") + tags: Optional[List[Tag]] = Field(None, description="Tags", title="Tags (user-defined)") + additional: Optional[Dict[str, Any]] = Field( + None, description="Any other custom metadata not covered by the schema", title="Additional custom metadata" + ) diff --git a/pydantic_schemas/video-schema.py b/pydantic_schemas/video-schema.py new file mode 100644 index 0000000..8ec65cb --- /dev/null +++ b/pydantic_schemas/video-schema.py @@ -0,0 +1,337 @@ +# generated by datamodel-codegen: +# filename: video-schema.json +# timestamp: 2024-07-02T16:13:05+00:00 + +from __future__ import annotations + +from enum import Enum +from typing import Any, Dict, List, Optional, Union + +from pydantic import Extra, Field + +from .schema_base_model import SchemaBaseModel + + +class Overwrite(Enum): + """ + Overwrite document if already exists? + """ + + yes = "yes" + no = "no" + + +class Producer(SchemaBaseModel): + name: Optional[str] = Field(None, description="Name (required)", title="Name") + abbr: Optional[str] = Field(None, title="Abbreviation") + affiliation: Optional[str] = Field(None, title="Affiliation") + role: Optional[str] = Field(None, title="Role") + + +class MetadataInformation(SchemaBaseModel): + """ + Document description + """ + + class Config: + extra = Extra.forbid + + title: Optional[str] = Field(None, description="Document title", title="Document title") + idno: Optional[str] = Field(None, title="Unique ID number for the document") + producers: Optional[List[Producer]] = Field(None, description="List of producers", title="Producers") + production_date: Optional[str] = Field( + None, description="Document production date using format(YYYY-MM-DD)", title="Date of Production" + ) + version: Optional[str] = Field( + None, description="Identify and describe the current version of the document", title="Document version" + ) + + +class Identifier(SchemaBaseModel): + type: Optional[str] = Field( + None, description="Type of identifier e.g. `doi`, `handle`, `other`", title="Identifier type" + ) + identifier: str = Field(..., title="Identifier") + + +class Keyword(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + vocabulary: Optional[str] = Field(None, title="Vocabulary name") + uri: Optional[str] = Field(None, title="Vocabulary URI") + + +class Topic(SchemaBaseModel): + id: Optional[str] = Field(None, title="Unique Identifier") + name: str = Field(..., title="Topic") + parent_id: Optional[str] = Field( + None, description="For subtopics, provide the ID of the parent topic", title="Parent topic Identifier" + ) + vocabulary: Optional[str] = Field( + None, description="Name of the controlled vocabulary, if the topic is from a taxonomy.", title="Vocabulary" + ) + uri: Optional[str] = Field( + None, + description="Link to the controlled vocabulary web page, if the topic is from a taxonomy.", + title="Vocabulary URI", + ) + + +class Person(SchemaBaseModel): + name: str = Field(..., title="Name") + role: Optional[str] = Field(None, title="Role") + + +class CountryItem(SchemaBaseModel): + name: Optional[str] = Field(None, title="Country name") + code: Optional[str] = Field(None, title="Country code") + + +class BboxItem(SchemaBaseModel): + west: Optional[str] = Field(None, title="West") + east: Optional[str] = Field(None, title="East") + south: Optional[str] = Field(None, title="South") + north: Optional[str] = Field(None, title="North") + + +class LanguageItem(SchemaBaseModel): + name: Optional[str] = Field(None, description="Language name", title="Name") + code: Optional[str] = Field(None, title="code") + + +class Contact(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name") + role: Optional[str] = Field(None, title="Role") + affiliation: Optional[str] = Field(None, title="Affiliation") + email: Optional[str] = Field(None, title="Email") + telephone: Optional[str] = Field(None, title="Telephone") + uri: Optional[str] = Field(None, title="URI") + + +class Contributor(SchemaBaseModel): + name: str = Field(..., title="Name") + affiliation: Optional[str] = Field(None, title="Affiliation") + abbreviation: Optional[str] = Field(None, title="Abbreviation") + role: Optional[str] = Field(None, title="Role") + uri: Optional[str] = Field(None, title="URI") + + +class Sponsor(SchemaBaseModel): + name: str = Field(..., title="Funding Agency/Sponsor") + abbr: Optional[str] = Field(None, title="Abbreviation") + grant: Optional[str] = Field(None, title="Grant Number") + role: Optional[str] = Field(None, title="Role") + + +class Translator(SchemaBaseModel): + first_name: Optional[str] = Field(None, title="First name") + initial: Optional[str] = Field(None, title="Initial") + last_name: Optional[str] = Field(None, title="Last name") + affiliation: Optional[str] = Field(None, title="Affiliation") + + +class TranscriptItem(SchemaBaseModel): + language: Optional[str] = Field(None, title="Language") + text: Optional[str] = Field(None, title="Text") + + +class AlbumItem(SchemaBaseModel): + name: Optional[str] = Field(None, title="Name of album") + description: Optional[str] = Field(None, title="Description") + owner: Optional[str] = Field(None, title="Owner") + uri: Optional[str] = Field(None, title="URI") + + +class VideoDescription(SchemaBaseModel): + """ + Video description + """ + + idno: str = Field(..., title="Unique video identifier") + identifiers: Optional[List[Identifier]] = Field(None, description="Other identifiers", title="Other identifiers") + title: str = Field(..., description="Title") + alt_title: Optional[str] = Field(None, description="Alternate title or other title") + description: Optional[str] = Field(None, description="Description") + genre: Optional[str] = Field(None, description="Genre") + keywords: Optional[List[Keyword]] = None + topics: Optional[List[Topic]] = Field( + None, + description="Topics covered by the table (ideally, the list of topics will be a controlled vocabulary)", + title="Topics", + ) + persons: Optional[List[Person]] = Field(None, title="Persons shown in the video") + main_entity: Optional[str] = Field(None, description="Primary entity described in the video") + date_created: Optional[str] = Field(None, description="Date of creation (YYYY-MM-DD)") + date_published: Optional[str] = Field(None, description="Date published (YYYY-MM-DD)") + version: Optional[str] = Field(None, description="Version") + status: Optional[str] = Field( + None, + description=( + "Status of a creative work in terms of its stage in lifecycle. e.g. `incomplete`, `draft`, `published`," + " `obsolete`" + ), + title="Creative work status", + ) + country: Optional[List[CountryItem]] = Field(None, title="Countries") + spatial_coverage: Optional[str] = Field(None, description="Place(s) which are the focus of the content") + content_reference_time: Optional[str] = Field( + None, + description=( + "Specific time described by a creative work, for works that emphasize a particular moment within an Event" + ), + ) + temporal_coverage: Optional[str] = Field( + None, description="Period that the content applies to using ISO 8601 date time format" + ) + recorded_at: Optional[str] = Field(None, description="Location where video was recorded") + audience: Optional[str] = Field(None, description="Intended audience") + bbox: Optional[List[BboxItem]] = Field(None, title="Geographic bounding box") + language: Optional[List[LanguageItem]] = Field(None, description="languages") + creator: Optional[str] = Field(None, description="Creator") + production_company: Optional[str] = Field(None, description="Production company") + publisher: Optional[str] = Field(None, description="Publisher") + repository: Optional[str] = Field(None, title="Repository") + contacts: Optional[List[Contact]] = Field(None, description="Contacts", title="Contacts") + contributors: Optional[List[Contributor]] = None + sponsors: Optional[List[Sponsor]] = Field(None, title="Funding Agency/Sponsor") + translators: Optional[List[Translator]] = Field(None, description="Translators", title="Translators") + is_based_on: Optional[str] = Field( + None, + description="A resource from which this work is derived or from which it is a modification or adaption", + title="A resource from which this work is derived", + ) + is_part_of: Optional[str] = Field(None, title="Indicate an item that this item is part of") + relations: Optional[List] = Field( + None, + title=( + "Defines, as a free text field, the relation between the video being documented and other resources. This" + " is a Dublin Core element." + ), + ) + video_provider: Optional[str] = Field(None, description="Video provider e.g. youtube, vimeo, facebook") + video_url: Optional[str] = Field(None, description="Video URL") + embed_url: Optional[str] = Field(None, description="Video embed URL") + encoding_format: Optional[str] = Field(None, description="Media type using a MIME format", title="Encoding format") + duration: Optional[str] = Field( + None, description="The duration of the video in ISO 8601 date time format - `hh:mm:ss`", title="Duration" + ) + rights: Optional[str] = Field(None, description="Rights") + copyright_holder: Optional[str] = Field( + None, description="The party holding the legal copyright", title="Copyright holder" + ) + copyright_notice: Optional[str] = Field( + None, description="Text of a notice describing the copyright", title="Copyright text" + ) + copyright_year: Optional[str] = Field( + None, description="Year during which claimed copyright for the video was first asserted", title="Copyright year" + ) + credit_text: Optional[str] = Field( + None, + description=( + "This element that can be used to credit the person(s) and/or organization(s) associated with a published" + " video. It corresponds to the `creditText` element of VideoObject." + ), + title="Credits", + ) + citation: Optional[str] = Field( + None, + description="This element provides a required or recommended citation of the audio file.", + title="Citation", + ) + transcript: Optional[List[TranscriptItem]] = Field(None, title="Transcript") + media: Optional[List[str]] = Field(None, title="Media") + album: Optional[List[AlbumItem]] = Field(None, title="Album") + + +class Tag(SchemaBaseModel): + tag: Optional[str] = Field(None, title="Tag") + tag_group: Optional[str] = Field(None, title="Tag group") + + +class ModelInfoItem(SchemaBaseModel): + source: Optional[str] = Field(None, title="Source") + author: Optional[str] = Field(None, title="Author") + version: Optional[str] = Field(None, title="Version") + model_id: Optional[str] = Field(None, title="Model Identifier") + nb_topics: Optional[float] = Field(None, title="Number of topics") + description: Optional[str] = Field(None, title="Description") + corpus: Optional[str] = Field(None, title="Corpus name") + uri: Optional[str] = Field(None, title="URI") + + +class TopicWord(SchemaBaseModel): + word: Optional[str] = Field(None, title="Word") + word_weight: Optional[float] = Field(None, title="Word weight") + + +class TopicDescriptionItem(SchemaBaseModel): + topic_id: Optional[Union[int, str]] = Field(None, title="Topic identifier") + topic_score: Optional[Union[float, str]] = Field(None, title="Topic score") + topic_label: Optional[str] = Field(None, title="Topic label") + topic_words: Optional[List[TopicWord]] = Field(None, description="Words", title="Topic words") + + +class LdaTopic(SchemaBaseModel): + class Config: + extra = Extra.forbid + + model_info: Optional[List[ModelInfoItem]] = Field(None, title="Model information") + topic_description: Optional[List[TopicDescriptionItem]] = Field(None, title="Topic information") + + +class Embedding(SchemaBaseModel): + id: str = Field(..., title="Vector Model ID") + description: Optional[str] = Field(None, title="Vector Model Description") + date: Optional[str] = Field(None, title="Date (YYYY-MM-DD)") + vector: Dict[str, Any] = Field(..., title="Vector") + + +class OriginDescription(SchemaBaseModel): + harvest_date: Optional[str] = Field(None, description="Harvest date using UTC date format") + altered: Optional[bool] = Field( + None, description="If the metadata was altered before dissemination", title="Metadata altered" + ) + base_url: Optional[str] = Field(None, description="Base URL of the originating repository") + identifier: Optional[str] = Field(None, description="Unique idenifiter of the item from the originating repository") + date_stamp: Optional[str] = Field( + None, + description="Datestamp (UTC date format) of the metadata record disseminated by the originating repository", + ) + metadata_namespace: Optional[str] = Field( + None, + description=( + "Metadata namespace URI of the metadata format of the record harvested from the originating repository" + ), + ) + + +class ProvenanceSchema(SchemaBaseModel): + """ + Provenance of metadata based on the OAI provenance schema (http://www.openarchives.org/OAI/2.0/provenance.xsd) + """ + + origin_description: Optional[OriginDescription] = Field(None, title="Origin description") + + +class Model(SchemaBaseModel): + """ + Video schema based on the elements from Dublin Core and Schema.org's VideoObject + """ + + repositoryid: Optional[str] = Field( + None, + description="Abbreviation for the collection that owns the document", + title="Collection ID that owns the document", + ) + published: Optional[int] = Field(0, description="Status - 0=draft, 1=published", title="Status") + overwrite: Optional[Overwrite] = Field("no", description="Overwrite document if already exists?") + metadata_information: Optional[MetadataInformation] = Field( + None, description="Document description", title="Document metadata information" + ) + video_description: VideoDescription = Field( + ..., description="Video description", title="Video metadata information" + ) + provenance: Optional[List[ProvenanceSchema]] = Field(None, description="Provenance") + tags: Optional[List[Tag]] = Field(None, description="Tags", title="Tags") + lda_topics: Optional[List[LdaTopic]] = Field(None, description="LDA topics", title="LDA topics") + embeddings: Optional[List[Embedding]] = Field(None, description="Word embeddings", title="Word embeddings") + additional: Optional[Dict[str, Any]] = Field(None, description="Additional metadata") diff --git a/pyproject.toml b/pyproject.toml index 5fecaa3..c621090 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,7 +10,7 @@ python = "^3.11" pandas = "^2.2.2" pydantic = "^2.8.0" openpyxl = "^3.1.5" -datamodel-code-generator = "^0.25.7" +datamodel-code-generator = {extras = ["http"], version = "^0.25.7"} [tool.poetry.group.dev.dependencies] pytest = "^8.2.2" @@ -24,13 +24,16 @@ ipykernel = "^6.29.5" [tool.ruff] line-length = 120 fix = true +exclude = [ + "pydantic_schemas/**" +] [tool.isort] line_length = 120 profile = "black" [tool.black] -line-length=120 = 120 +line-length = 120 [tool.detect-secrets] exclude-lines = "\\s*\"image/png\": \".+\"" From 0a89f1d2131636e9ccd0e49053390e183a2a0297 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Tue, 2 Jul 2024 12:22:14 -0400 Subject: [PATCH 03/51] turn unicode apostrophe to ascii --- schemas/geospatial-schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schemas/geospatial-schema.json b/schemas/geospatial-schema.json index d3dad95..b6ffadd 100644 --- a/schemas/geospatial-schema.json +++ b/schemas/geospatial-schema.json @@ -912,7 +912,7 @@ "referenceSystemInfo": { "type": "array", "title": "Resource Reference Systems", - "description": "Resource’s spatial reference systems - Description of the spatial and/or temporal reference systems used in the dataset.", + "description": "Resource's spatial reference systems - Description of the spatial and/or temporal reference systems used in the dataset.", "items": { "$ref": "#/definitions/referenceSystem" } From d8eda9c6aea790d4d0ccd1d79dc487914ccd1edb Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Tue, 2 Jul 2024 12:22:53 -0400 Subject: [PATCH 04/51] type is integer, not type number - format integer --- schemas/iptc-pmd-schema.json | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/schemas/iptc-pmd-schema.json b/schemas/iptc-pmd-schema.json index 279badf..3fc3f37 100644 --- a/schemas/iptc-pmd-schema.json +++ b/schemas/iptc-pmd-schema.json @@ -284,8 +284,7 @@ "description": "Age of the human model(s) at the time this image was taken in a model released image.", "type": "array", "items": { - "type": "number", - "format": "integer" + "type": "integer" } }, "additionalModelInfo": { @@ -340,14 +339,12 @@ "maxAvailHeight": { "title": "Max Avail Height", "description": "The maximum available height in pixels of the original photo from which this photo has been derived by downsizing.", - "type": "number", - "format": "integer" + "type": "integer" }, "maxAvailWidth": { "title": "Max Avail Width", "description": "The maximum available width in pixels of the original photo from which this photo has been derived by downsizing.", - "type": "number", - "format": "integer" + "type": "integer" }, "propertyReleaseStatus": { "$ref": "iptc-phovidmdshared-schema.json#/definitions/CvTerm", From be56cb15a5ae00beacc6651a4b64ecb42d2e1a27 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Tue, 2 Jul 2024 13:33:23 -0400 Subject: [PATCH 05/51] rename so that - become _ --- pydantic_schemas/{document-schema.py => document_schema.py} | 2 +- pydantic_schemas/generate_pydantic_schemas.py | 2 +- pydantic_schemas/{geospatial-schema.py => geospatial_schema.py} | 2 +- pydantic_schemas/{image-schema.py => image_schema.py} | 2 +- pydantic_schemas/{microdata-schema.py => microdata_schema.py} | 2 +- pydantic_schemas/{script-schema.py => script_schema.py} | 2 +- pydantic_schemas/{series-schema.py => series_schema.py} | 2 +- pydantic_schemas/{table-schema.py => table_schema.py} | 2 +- .../{timeseries-db-schema.py => timeseries_db_schema.py} | 2 +- pydantic_schemas/{timeseries-schema.py => timeseries_schema.py} | 2 +- pydantic_schemas/{video-schema.py => video_schema.py} | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) rename pydantic_schemas/{document-schema.py => document_schema.py} (99%) rename pydantic_schemas/{geospatial-schema.py => geospatial_schema.py} (99%) rename pydantic_schemas/{image-schema.py => image_schema.py} (99%) rename pydantic_schemas/{microdata-schema.py => microdata_schema.py} (99%) rename pydantic_schemas/{script-schema.py => script_schema.py} (99%) rename pydantic_schemas/{series-schema.py => series_schema.py} (99%) rename pydantic_schemas/{table-schema.py => table_schema.py} (99%) rename pydantic_schemas/{timeseries-db-schema.py => timeseries_db_schema.py} (99%) rename pydantic_schemas/{timeseries-schema.py => timeseries_schema.py} (99%) rename pydantic_schemas/{video-schema.py => video_schema.py} (99%) diff --git a/pydantic_schemas/document-schema.py b/pydantic_schemas/document_schema.py similarity index 99% rename from pydantic_schemas/document-schema.py rename to pydantic_schemas/document_schema.py index f38cad4..0925171 100644 --- a/pydantic_schemas/document-schema.py +++ b/pydantic_schemas/document_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: document-schema.json -# timestamp: 2024-07-02T16:12:50+00:00 +# timestamp: 2024-07-02T17:29:16+00:00 from __future__ import annotations diff --git a/pydantic_schemas/generate_pydantic_schemas.py b/pydantic_schemas/generate_pydantic_schemas.py index 2add3d7..04dd64f 100644 --- a/pydantic_schemas/generate_pydantic_schemas.py +++ b/pydantic_schemas/generate_pydantic_schemas.py @@ -25,7 +25,7 @@ for input_file in INPUTS: 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) + output_path = os.path.join(OUTPUT_DIR, output_file).replace("-", "_") run( [ "datamodel-codegen", diff --git a/pydantic_schemas/geospatial-schema.py b/pydantic_schemas/geospatial_schema.py similarity index 99% rename from pydantic_schemas/geospatial-schema.py rename to pydantic_schemas/geospatial_schema.py index 9024010..116d4e4 100644 --- a/pydantic_schemas/geospatial-schema.py +++ b/pydantic_schemas/geospatial_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: geospatial-schema.json -# timestamp: 2024-07-02T16:12:52+00:00 +# timestamp: 2024-07-02T17:29:18+00:00 from __future__ import annotations diff --git a/pydantic_schemas/image-schema.py b/pydantic_schemas/image_schema.py similarity index 99% rename from pydantic_schemas/image-schema.py rename to pydantic_schemas/image_schema.py index 47cd9a7..5abb48f 100644 --- a/pydantic_schemas/image-schema.py +++ b/pydantic_schemas/image_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: image-schema.json -# timestamp: 2024-07-02T16:12:54+00:00 +# timestamp: 2024-07-02T17:29:20+00:00 from __future__ import annotations diff --git a/pydantic_schemas/microdata-schema.py b/pydantic_schemas/microdata_schema.py similarity index 99% rename from pydantic_schemas/microdata-schema.py rename to pydantic_schemas/microdata_schema.py index c62c266..0ff5104 100644 --- a/pydantic_schemas/microdata-schema.py +++ b/pydantic_schemas/microdata_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: microdata-schema.json -# timestamp: 2024-07-02T16:12:55+00:00 +# timestamp: 2024-07-02T17:29:23+00:00 from __future__ import annotations diff --git a/pydantic_schemas/script-schema.py b/pydantic_schemas/script_schema.py similarity index 99% rename from pydantic_schemas/script-schema.py rename to pydantic_schemas/script_schema.py index cad4971..35bffdf 100644 --- a/pydantic_schemas/script-schema.py +++ b/pydantic_schemas/script_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: script-schema.json -# timestamp: 2024-07-02T16:12:57+00:00 +# timestamp: 2024-07-02T17:29:24+00:00 from __future__ import annotations diff --git a/pydantic_schemas/series-schema.py b/pydantic_schemas/series_schema.py similarity index 99% rename from pydantic_schemas/series-schema.py rename to pydantic_schemas/series_schema.py index 09eb3ab..fecb250 100644 --- a/pydantic_schemas/series-schema.py +++ b/pydantic_schemas/series_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: series-schema.json -# timestamp: 2024-07-02T16:12:58+00:00 +# timestamp: 2024-07-02T17:29:26+00:00 from __future__ import annotations diff --git a/pydantic_schemas/table-schema.py b/pydantic_schemas/table_schema.py similarity index 99% rename from pydantic_schemas/table-schema.py rename to pydantic_schemas/table_schema.py index d74decd..cf6e39b 100644 --- a/pydantic_schemas/table-schema.py +++ b/pydantic_schemas/table_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: table-schema.json -# timestamp: 2024-07-02T16:13:00+00:00 +# timestamp: 2024-07-02T17:29:28+00:00 from __future__ import annotations diff --git a/pydantic_schemas/timeseries-db-schema.py b/pydantic_schemas/timeseries_db_schema.py similarity index 99% rename from pydantic_schemas/timeseries-db-schema.py rename to pydantic_schemas/timeseries_db_schema.py index d3fa6f9..5ff18b2 100644 --- a/pydantic_schemas/timeseries-db-schema.py +++ b/pydantic_schemas/timeseries_db_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: timeseries-db-schema.json -# timestamp: 2024-07-02T16:13:01+00:00 +# timestamp: 2024-07-02T17:29:30+00:00 from __future__ import annotations diff --git a/pydantic_schemas/timeseries-schema.py b/pydantic_schemas/timeseries_schema.py similarity index 99% rename from pydantic_schemas/timeseries-schema.py rename to pydantic_schemas/timeseries_schema.py index 03bcb3c..4fc4a93 100644 --- a/pydantic_schemas/timeseries-schema.py +++ b/pydantic_schemas/timeseries_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: timeseries-schema.json -# timestamp: 2024-07-02T16:13:03+00:00 +# timestamp: 2024-07-02T17:29:32+00:00 from __future__ import annotations diff --git a/pydantic_schemas/video-schema.py b/pydantic_schemas/video_schema.py similarity index 99% rename from pydantic_schemas/video-schema.py rename to pydantic_schemas/video_schema.py index 8ec65cb..8c6f8e2 100644 --- a/pydantic_schemas/video-schema.py +++ b/pydantic_schemas/video_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: video-schema.json -# timestamp: 2024-07-02T16:13:05+00:00 +# timestamp: 2024-07-02T17:29:33+00:00 from __future__ import annotations From 990a9b53585ee6c70bffbac0d7239009a3bdb787 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Tue, 2 Jul 2024 15:03:52 -0400 Subject: [PATCH 06/51] change keywords from an optional keyword (which is then itself a list) to a list of keyword objects --- schemas/document-schema.json | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/schemas/document-schema.json b/schemas/document-schema.json index 8f37dc2..5e7ecca 100644 --- a/schemas/document-schema.json +++ b/schemas/document-schema.json @@ -6,22 +6,19 @@ "type": "object", "definitions":{ "keyword":{ - "type":"array", - "items":{ - "type":"object", - "properties":{ - "name":{ - "title":"Name", - "type":"string" - }, - "vocabulary":{ - "title":"Vocabulary name", - "type":"string" - }, - "uri":{ - "title":"Vocabulary URI", - "type":"string" - } + "type":"object", + "properties":{ + "name":{ + "title":"Name", + "type":"string" + }, + "vocabulary":{ + "title":"Vocabulary name", + "type":"string" + }, + "uri":{ + "title":"Vocabulary URI", + "type":"string" } } } @@ -789,9 +786,8 @@ }, "keywords":{ - "allOf": [ - {"$ref":"#/definitions/keyword"} - ], + "type": "array", + "items": {"$ref":"#/definitions/keyword"}, "title":"Keywords", "description":"Keywords" }, From 1cfee8adbe6c368280a7163f946f8bcd5ac0b120 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Tue, 2 Jul 2024 15:05:18 -0400 Subject: [PATCH 07/51] update document keyword definition --- pydantic_schemas/document_schema.py | 10 +++------- pydantic_schemas/geospatial_schema.py | 2 +- pydantic_schemas/image_schema.py | 2 +- pydantic_schemas/microdata_schema.py | 2 +- pydantic_schemas/script_schema.py | 2 +- pydantic_schemas/series_schema.py | 2 +- pydantic_schemas/table_schema.py | 2 +- pydantic_schemas/timeseries_db_schema.py | 2 +- pydantic_schemas/timeseries_schema.py | 2 +- pydantic_schemas/video_schema.py | 2 +- 10 files changed, 12 insertions(+), 16 deletions(-) diff --git a/pydantic_schemas/document_schema.py b/pydantic_schemas/document_schema.py index 0925171..c9ad00a 100644 --- a/pydantic_schemas/document_schema.py +++ b/pydantic_schemas/document_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: document-schema.json -# timestamp: 2024-07-02T17:29:16+00:00 +# timestamp: 2024-07-02T19:00:44+00:00 from __future__ import annotations @@ -336,16 +336,12 @@ class ProvenanceSchema(SchemaBaseModel): origin_description: Optional[OriginDescription] = Field(None, title="Origin description") -class KeywordItem(SchemaBaseModel): +class Keyword(SchemaBaseModel): name: Optional[str] = Field(None, title="Name") vocabulary: Optional[str] = Field(None, title="Vocabulary name") uri: Optional[str] = Field(None, title="Vocabulary URI") -class Keyword(SchemaBaseModel): - __root__: List[KeywordItem] - - class DocumentDescription(SchemaBaseModel): """ Document Description @@ -559,7 +555,7 @@ class Config: ), title="Data Sources", ) - keywords: Optional[Keyword] = Field(None, description="Keywords", title="Keywords") + keywords: Optional[List[Keyword]] = Field(None, description="Keywords", title="Keywords") themes: Optional[List[Theme]] = Field(None, description="Themes") topics: Optional[List[Topic]] = Field( None, diff --git a/pydantic_schemas/geospatial_schema.py b/pydantic_schemas/geospatial_schema.py index 116d4e4..79b9f29 100644 --- a/pydantic_schemas/geospatial_schema.py +++ b/pydantic_schemas/geospatial_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: geospatial-schema.json -# timestamp: 2024-07-02T17:29:18+00:00 +# timestamp: 2024-07-02T19:00:46+00:00 from __future__ import annotations diff --git a/pydantic_schemas/image_schema.py b/pydantic_schemas/image_schema.py index 5abb48f..2a30038 100644 --- a/pydantic_schemas/image_schema.py +++ b/pydantic_schemas/image_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: image-schema.json -# timestamp: 2024-07-02T17:29:20+00:00 +# timestamp: 2024-07-02T19:00:48+00:00 from __future__ import annotations diff --git a/pydantic_schemas/microdata_schema.py b/pydantic_schemas/microdata_schema.py index 0ff5104..c76c89c 100644 --- a/pydantic_schemas/microdata_schema.py +++ b/pydantic_schemas/microdata_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: microdata-schema.json -# timestamp: 2024-07-02T17:29:23+00:00 +# timestamp: 2024-07-02T19:00:49+00:00 from __future__ import annotations diff --git a/pydantic_schemas/script_schema.py b/pydantic_schemas/script_schema.py index 35bffdf..726013d 100644 --- a/pydantic_schemas/script_schema.py +++ b/pydantic_schemas/script_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: script-schema.json -# timestamp: 2024-07-02T17:29:24+00:00 +# timestamp: 2024-07-02T19:00:51+00:00 from __future__ import annotations diff --git a/pydantic_schemas/series_schema.py b/pydantic_schemas/series_schema.py index fecb250..093a897 100644 --- a/pydantic_schemas/series_schema.py +++ b/pydantic_schemas/series_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: series-schema.json -# timestamp: 2024-07-02T17:29:26+00:00 +# timestamp: 2024-07-02T19:00:52+00:00 from __future__ import annotations diff --git a/pydantic_schemas/table_schema.py b/pydantic_schemas/table_schema.py index cf6e39b..0ece7e2 100644 --- a/pydantic_schemas/table_schema.py +++ b/pydantic_schemas/table_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: table-schema.json -# timestamp: 2024-07-02T17:29:28+00:00 +# timestamp: 2024-07-02T19:00:54+00:00 from __future__ import annotations diff --git a/pydantic_schemas/timeseries_db_schema.py b/pydantic_schemas/timeseries_db_schema.py index 5ff18b2..f6a0480 100644 --- a/pydantic_schemas/timeseries_db_schema.py +++ b/pydantic_schemas/timeseries_db_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: timeseries-db-schema.json -# timestamp: 2024-07-02T17:29:30+00:00 +# timestamp: 2024-07-02T19:00:55+00:00 from __future__ import annotations diff --git a/pydantic_schemas/timeseries_schema.py b/pydantic_schemas/timeseries_schema.py index 4fc4a93..e34cdaa 100644 --- a/pydantic_schemas/timeseries_schema.py +++ b/pydantic_schemas/timeseries_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: timeseries-schema.json -# timestamp: 2024-07-02T17:29:32+00:00 +# timestamp: 2024-07-02T19:01:01+00:00 from __future__ import annotations diff --git a/pydantic_schemas/video_schema.py b/pydantic_schemas/video_schema.py index 8c6f8e2..79c9c9e 100644 --- a/pydantic_schemas/video_schema.py +++ b/pydantic_schemas/video_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: video-schema.json -# timestamp: 2024-07-02T17:29:33+00:00 +# timestamp: 2024-07-02T19:01:03+00:00 from __future__ import annotations From 68e60c87f51bca3be5ad9ac141fc84383f29eaff Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Tue, 9 Jul 2024 11:40:00 -0400 Subject: [PATCH 08/51] move to definitions folder --- pydantic_schemas/definitions/__init__.py | 0 .../{ => definitions}/document_schema.py | 2 +- .../{ => definitions}/geospatial_schema.py | 117 +++++++++++------- .../{ => definitions}/image_schema.py | 2 +- .../{ => definitions}/microdata_schema.py | 2 +- .../{ => definitions}/schema_base_model.py | 0 .../{ => definitions}/script_schema.py | 2 +- .../{ => definitions}/series_schema.py | 2 +- .../{ => definitions}/table_schema.py | 2 +- .../{ => definitions}/timeseries_db_schema.py | 2 +- .../{ => definitions}/timeseries_schema.py | 4 +- .../{ => definitions}/video_schema.py | 2 +- pydantic_schemas/generate_pydantic_schemas.py | 2 +- 13 files changed, 86 insertions(+), 53 deletions(-) create mode 100644 pydantic_schemas/definitions/__init__.py rename pydantic_schemas/{ => definitions}/document_schema.py (99%) rename pydantic_schemas/{ => definitions}/geospatial_schema.py (95%) rename pydantic_schemas/{ => definitions}/image_schema.py (99%) rename pydantic_schemas/{ => definitions}/microdata_schema.py (99%) rename pydantic_schemas/{ => definitions}/schema_base_model.py (100%) rename pydantic_schemas/{ => definitions}/script_schema.py (99%) rename pydantic_schemas/{ => definitions}/series_schema.py (99%) rename pydantic_schemas/{ => definitions}/table_schema.py (99%) rename pydantic_schemas/{ => definitions}/timeseries_db_schema.py (99%) rename pydantic_schemas/{ => definitions}/timeseries_schema.py (99%) rename pydantic_schemas/{ => definitions}/video_schema.py (99%) diff --git a/pydantic_schemas/definitions/__init__.py b/pydantic_schemas/definitions/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pydantic_schemas/document_schema.py b/pydantic_schemas/definitions/document_schema.py similarity index 99% rename from pydantic_schemas/document_schema.py rename to pydantic_schemas/definitions/document_schema.py index c9ad00a..ba3f256 100644 --- a/pydantic_schemas/document_schema.py +++ b/pydantic_schemas/definitions/document_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: document-schema.json -# timestamp: 2024-07-02T19:00:44+00:00 +# timestamp: 2024-07-08T15:58:21+00:00 from __future__ import annotations diff --git a/pydantic_schemas/geospatial_schema.py b/pydantic_schemas/definitions/geospatial_schema.py similarity index 95% rename from pydantic_schemas/geospatial_schema.py rename to pydantic_schemas/definitions/geospatial_schema.py index 79b9f29..04a234c 100644 --- a/pydantic_schemas/geospatial_schema.py +++ b/pydantic_schemas/definitions/geospatial_schema.py @@ -1,10 +1,9 @@ # generated by datamodel-codegen: # filename: geospatial-schema.json -# timestamp: 2024-07-02T19:00:46+00:00 +# timestamp: 2024-07-08T15:58:23+00:00 from __future__ import annotations -from enum import Enum from typing import Any, Dict, List, Optional, Union from pydantic import Extra, Field, confloat @@ -12,15 +11,6 @@ from .schema_base_model import SchemaBaseModel -class Overwrite(Enum): - """ - Overwrite if already exists? - """ - - yes = "yes" - no = "no" - - class Producer(SchemaBaseModel): name: Optional[str] = Field(None, description="Name (required)", title="Name") abbr: Optional[str] = Field(None, title="Abbreviation") @@ -243,13 +233,34 @@ class GeographicBoundingBox(SchemaBaseModel): northBoundLatitude: Optional[confloat(ge=-180.0, le=180.0)] = Field(None, title="North") +class Geohash(SchemaBaseModel): + geohash: Optional[str] = Field(None, title="Geohash") + note: Optional[str] = Field(None, title="Note") + + class GeographicElementItem(SchemaBaseModel): geographicBoundingBox: Optional[GeographicBoundingBox] = Field(None, title="Geographic Bounding Box") + geohash: Optional[Geohash] = Field(None, title="Geohash") geographicDescription: Optional[str] = Field(None, title="Geographic description identifier") -class TemporalElementItem(SchemaBaseModel): - extent: Optional[Any] = None +class TemporalElementExtentItem(SchemaBaseModel): + beginPosition: Optional[str] = Field( + None, + description=( + "Begin time position. Requires an extended ISO 8601 formatted combined UTC date and time string" + " (2009-11-17T10:00:00)" + ), + title="Begin time position", + ) + endPosition: Optional[str] = Field( + None, + description=( + "End time position. Requires an extended ISO 8601 formatted combined UTC date and time string" + " (2009-11-17T10:00:00)" + ), + title="End time position", + ) class VerticalElementItem(SchemaBaseModel): @@ -270,16 +281,13 @@ class Extent(SchemaBaseModel): geographicElement: Optional[List[GeographicElementItem]] = Field( None, description="Geographic extent(s)", title="Geographic extent(s)" ) - temporalElement: Optional[List[TemporalElementItem]] = Field(None, title="Temporal extent(s)") + temporalElementExtent: Optional[List[TemporalElementExtentItem]] = Field(None, title="Temporal extent(s)") verticalElement: Optional[List[VerticalElementItem]] = Field(None, title="Vertical extent(s)") -class SpatialResolution(SchemaBaseModel): - """ - Spatial resolution of the resource - """ - +class SpatialResolutionItem(SchemaBaseModel): uom: Optional[str] = Field(None, description="Unit considered for the resolution measure", title="Unit Of Measure") + value: Optional[float] = Field(None, description="Value", title="Value") class AccessProperties(SchemaBaseModel): @@ -724,11 +732,7 @@ class ResponsibleParty(SchemaBaseModel): ) -class Identifier(SchemaBaseModel): - """ - Unique identifier for the resource metadata - """ - +class IdentifierItem(SchemaBaseModel): authority: Optional[str] = Field( None, description="The authority that identifies uniquely the resource metadata", title="Authority" ) @@ -753,7 +757,7 @@ class Citation(SchemaBaseModel): """ title: Optional[str] = Field(None, description="Resource title", title="Title") - alternateTitle: Optional[str] = Field(None, description="Resource alternate title", title="Alternate Title") + alternateTitle: Optional[List[str]] = Field(None, description="Resource alternate title", title="Alternate Title") date: Optional[List[Date]] = Field( None, description="Date(s) associated to the resource citation", title="Citation date(s)" ) @@ -766,13 +770,13 @@ class Citation(SchemaBaseModel): ), title="Edition Date", ) - identifier: Optional[Identifier] = Field( - None, description="Unique identifier for the resource metadata", title="Identifier" + identifier: Optional[List[IdentifierItem]] = Field( + None, description="Identifiers for the resource metadata", title="Identifier" ) citedResponsibleParty: Optional[List[ResponsibleParty]] = Field( None, description="Responsible party(ies) to cite in the resource citation", title="Responsible party(ies)" ) - presentationForm: Optional[List[str]] = Field( + presentationForm: Optional[List[Any]] = Field( None, description=( "The resource presentation form. e.g. 'mapDigital'. Recommended code following the [ISO/TS" @@ -801,6 +805,17 @@ class ReferenceSystem(SchemaBaseModel): codeSpace: Optional[str] = Field(None, description="example - 'EPSG'", title="Code Space") +class UpdateScopeItem(SchemaBaseModel): + scope: Optional[str] = Field( + None, description="Scope of data to which maintenance is applied", title="Update Scope" + ) + description: Optional[str] = Field( + None, + description="Additional information about the range or extent of the resource", + title="Update Scope Description", + ) + + class MaintenanceInfo(SchemaBaseModel): """ Information about a resource maintenance @@ -816,6 +831,26 @@ class MaintenanceInfo(SchemaBaseModel): ), title="Maintenance and Update Frequency", ) + dateOfNextUpdate: Optional[str] = Field( + None, + description=( + "Date of the next update of the resource. Requires an extended ISO 8601 formatted combined UTC date and" + " time string (2009-11-17T10:00:00)" + ), + title="Date of Next Update", + ) + userDefinedMaintenanceFrequency: Optional[str] = Field( + None, description="User defined maintenance frequency", title="User Defined Maintenance Frequency" + ) + updateScope: Optional[List[UpdateScopeItem]] = Field( + None, description="Scope of data to which maintenance is applied", title="Update Scope" + ) + maintenanceNote: Optional[List[str]] = Field( + None, description="Note about the maintenance", title="Maintenance Note" + ) + contact: Optional[ResponsibleParty] = Field( + None, description="Contact information for the maintenance", title="Contact" + ) class GraphicOverview(SchemaBaseModel): @@ -1067,12 +1102,16 @@ class ServiceIdentification(SchemaBaseModel): ) -class IdentificationInfoItem(SchemaBaseModel): +class IdentificationInfo(SchemaBaseModel): + """ + Identification(s) of the resource + """ + citation: Optional[Citation] = Field(None, description="Dataset citation", title="Citation") abstract: Optional[str] = Field(None, description="Abstract describing the dataset resource", title="Abstract") purpose: Optional[str] = Field(None, description="Purpose of the dataset resource", title="Purpose") credit: Optional[str] = Field(None, description="Credit associated to the dataset resource", title="Credit") - status: Optional[str] = Field( + status: Optional[List] = Field( None, description=( "Status of the dataset resource. Recommended code following the [ISO/TS" @@ -1115,7 +1154,7 @@ class IdentificationInfoItem(SchemaBaseModel): ), title="Extent of the resource", ) - spatialRepresentationType: Optional[str] = Field( + spatialRepresentationType: Optional[List[str]] = Field( None, description=( "Spatial representation type of the resource. e.g. 'vector'. Recommended code following the [ISO/TS" @@ -1125,7 +1164,7 @@ class IdentificationInfoItem(SchemaBaseModel): ), title="Spatial Representation type", ) - spatialResolution: Optional[SpatialResolution] = Field( + spatialResolution: Optional[List[SpatialResolutionItem]] = Field( None, description="Spatial resolution of the resource", title="Spatial Resolution" ) language: Optional[List[Language]] = Field( @@ -1405,7 +1444,7 @@ class Description(SchemaBaseModel): ), title="Unique parent identifier", ) - hierarchyLevel: Optional[List[str]] = Field( + hierarchyLevel: Optional[str] = Field( None, description=( "List of Scope(s), or 'hierarchy level(s)'. e.g. `dataset`, `service`. Recommended code following the" @@ -1414,7 +1453,7 @@ class Description(SchemaBaseModel): ), title="Scope(s) / Hierarchy Level(s)", ) - hierarchyLevelName: Optional[List[str]] = Field( + hierarchyLevelName: Optional[str] = Field( None, description="List of scope / hierarchy level names. Alternative to the use of 'hierarchyLevel' code items.", title="Scope / hierarchy level names.", @@ -1457,7 +1496,7 @@ class Description(SchemaBaseModel): ), title="Resource Reference Systems", ) - identificationInfo: Optional[List[IdentificationInfoItem]] = Field( + identificationInfo: Optional[IdentificationInfo] = Field( None, description="Identification(s) of the resource", title="Identification Info(s)" ) contentInfo: Optional[List[ContentInfoItem]] = Field( @@ -1492,13 +1531,7 @@ class GeospatialSchema(SchemaBaseModel): Geospatial draft schema """ - repositoryid: Optional[str] = Field( - None, - description="Abbreviation for the collection that owns this dataset", - title="Collection ID that owns the dataset", - ) - published: Optional[int] = Field(0, description="Status of the dataset - 0=draft, 1=published") - overwrite: Optional[Overwrite] = Field("no", description="Overwrite if already exists?") + idno: Optional[str] = Field(None, description="Project unique identifier", title="Project unique identifier") metadata_information: Optional[MetadataInformation] = Field( None, description="Document description", title="Document metadata information" ) diff --git a/pydantic_schemas/image_schema.py b/pydantic_schemas/definitions/image_schema.py similarity index 99% rename from pydantic_schemas/image_schema.py rename to pydantic_schemas/definitions/image_schema.py index 2a30038..be78bc7 100644 --- a/pydantic_schemas/image_schema.py +++ b/pydantic_schemas/definitions/image_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: image-schema.json -# timestamp: 2024-07-02T19:00:48+00:00 +# timestamp: 2024-07-08T15:58:24+00:00 from __future__ import annotations diff --git a/pydantic_schemas/microdata_schema.py b/pydantic_schemas/definitions/microdata_schema.py similarity index 99% rename from pydantic_schemas/microdata_schema.py rename to pydantic_schemas/definitions/microdata_schema.py index c76c89c..1fff33b 100644 --- a/pydantic_schemas/microdata_schema.py +++ b/pydantic_schemas/definitions/microdata_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: microdata-schema.json -# timestamp: 2024-07-02T19:00:49+00:00 +# timestamp: 2024-07-08T15:58:26+00:00 from __future__ import annotations diff --git a/pydantic_schemas/schema_base_model.py b/pydantic_schemas/definitions/schema_base_model.py similarity index 100% rename from pydantic_schemas/schema_base_model.py rename to pydantic_schemas/definitions/schema_base_model.py diff --git a/pydantic_schemas/script_schema.py b/pydantic_schemas/definitions/script_schema.py similarity index 99% rename from pydantic_schemas/script_schema.py rename to pydantic_schemas/definitions/script_schema.py index 726013d..49d5af8 100644 --- a/pydantic_schemas/script_schema.py +++ b/pydantic_schemas/definitions/script_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: script-schema.json -# timestamp: 2024-07-02T19:00:51+00:00 +# timestamp: 2024-07-08T15:58:28+00:00 from __future__ import annotations diff --git a/pydantic_schemas/series_schema.py b/pydantic_schemas/definitions/series_schema.py similarity index 99% rename from pydantic_schemas/series_schema.py rename to pydantic_schemas/definitions/series_schema.py index 093a897..e45ab74 100644 --- a/pydantic_schemas/series_schema.py +++ b/pydantic_schemas/definitions/series_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: series-schema.json -# timestamp: 2024-07-02T19:00:52+00:00 +# timestamp: 2024-07-08T15:58:30+00:00 from __future__ import annotations diff --git a/pydantic_schemas/table_schema.py b/pydantic_schemas/definitions/table_schema.py similarity index 99% rename from pydantic_schemas/table_schema.py rename to pydantic_schemas/definitions/table_schema.py index 0ece7e2..174500e 100644 --- a/pydantic_schemas/table_schema.py +++ b/pydantic_schemas/definitions/table_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: table-schema.json -# timestamp: 2024-07-02T19:00:54+00:00 +# timestamp: 2024-07-08T15:58:31+00:00 from __future__ import annotations diff --git a/pydantic_schemas/timeseries_db_schema.py b/pydantic_schemas/definitions/timeseries_db_schema.py similarity index 99% rename from pydantic_schemas/timeseries_db_schema.py rename to pydantic_schemas/definitions/timeseries_db_schema.py index f6a0480..96eb2d8 100644 --- a/pydantic_schemas/timeseries_db_schema.py +++ b/pydantic_schemas/definitions/timeseries_db_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: timeseries-db-schema.json -# timestamp: 2024-07-02T19:00:55+00:00 +# timestamp: 2024-07-08T15:58:33+00:00 from __future__ import annotations diff --git a/pydantic_schemas/timeseries_schema.py b/pydantic_schemas/definitions/timeseries_schema.py similarity index 99% rename from pydantic_schemas/timeseries_schema.py rename to pydantic_schemas/definitions/timeseries_schema.py index e34cdaa..cecd75a 100644 --- a/pydantic_schemas/timeseries_schema.py +++ b/pydantic_schemas/definitions/timeseries_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: timeseries-schema.json -# timestamp: 2024-07-02T19:01:01+00:00 +# timestamp: 2024-07-08T15:58:36+00:00 from __future__ import annotations @@ -570,7 +570,7 @@ class TimePeriodFormat(Enum): class CodeListItem(SchemaBaseModel): code: Optional[str] = Field(None, title="Code") - label: Optional[str] = Field(None, title="Label") + name: Optional[str] = Field(None, title="Name") description: Optional[str] = Field(None, title="Description") diff --git a/pydantic_schemas/video_schema.py b/pydantic_schemas/definitions/video_schema.py similarity index 99% rename from pydantic_schemas/video_schema.py rename to pydantic_schemas/definitions/video_schema.py index 79c9c9e..732098a 100644 --- a/pydantic_schemas/video_schema.py +++ b/pydantic_schemas/definitions/video_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: video-schema.json -# timestamp: 2024-07-02T19:01:03+00:00 +# timestamp: 2024-07-08T15:58:38+00:00 from __future__ import annotations diff --git a/pydantic_schemas/generate_pydantic_schemas.py b/pydantic_schemas/generate_pydantic_schemas.py index 04dd64f..0872a42 100644 --- a/pydantic_schemas/generate_pydantic_schemas.py +++ b/pydantic_schemas/generate_pydantic_schemas.py @@ -2,7 +2,7 @@ from subprocess import run SCHEMA_DIR = "schemas" -OUTPUT_DIR = "pydantic_schemas" +OUTPUT_DIR = os.path.join("pydantic_schemas", "definitions") PYTHON_VERSION = "3.11" BASE_CLASS = ".schema_base_model.SchemaBaseModel" INPUTS = [ From dbc379c0771a7cd29c579c1a8df579759a3d2e7f Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Tue, 9 Jul 2024 21:20:18 -0400 Subject: [PATCH 09/51] git ignore --- .gitignore | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..582d90f --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] + +# Unit test +.pytest_cache/ + +# Environments +.venv + +# Visual Studio Code +.vscode/ + +# Environment variables +.env \ No newline at end of file From a100924c609f54783ec806e92ee8fbe734bfcf99 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Wed, 10 Jul 2024 11:55:19 -0400 Subject: [PATCH 10/51] update pydantic after merging master --- .../definitions/document_schema.py | 2 +- .../definitions/geospatial_schema.py | 32 ++++++++++++++++++- pydantic_schemas/definitions/image_schema.py | 2 +- .../definitions/microdata_schema.py | 2 +- pydantic_schemas/definitions/script_schema.py | 2 +- pydantic_schemas/definitions/series_schema.py | 2 +- pydantic_schemas/definitions/table_schema.py | 2 +- .../definitions/timeseries_db_schema.py | 2 +- .../definitions/timeseries_schema.py | 2 +- pydantic_schemas/definitions/video_schema.py | 2 +- pydantic_schemas/generate_pydantic_schemas.py | 1 + 11 files changed, 41 insertions(+), 10 deletions(-) diff --git a/pydantic_schemas/definitions/document_schema.py b/pydantic_schemas/definitions/document_schema.py index ba3f256..d0d4b1b 100644 --- a/pydantic_schemas/definitions/document_schema.py +++ b/pydantic_schemas/definitions/document_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: document-schema.json -# timestamp: 2024-07-08T15:58:21+00:00 +# timestamp: 2024-07-10T15:53:28+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/geospatial_schema.py b/pydantic_schemas/definitions/geospatial_schema.py index 04a234c..27e87db 100644 --- a/pydantic_schemas/definitions/geospatial_schema.py +++ b/pydantic_schemas/definitions/geospatial_schema.py @@ -1,9 +1,10 @@ # generated by datamodel-codegen: # filename: geospatial-schema.json -# timestamp: 2024-07-08T15:58:23+00:00 +# timestamp: 2024-07-10T15:53:30+00:00 from __future__ import annotations +from enum import Enum from typing import Any, Dict, List, Optional, Union from pydantic import Extra, Field, confloat @@ -238,10 +239,39 @@ class Geohash(SchemaBaseModel): note: Optional[str] = Field(None, title="Note") +class Ring(Enum): + exterior = "exterior" + interior = "interior" + + +class Type(Enum): + Point = "Point" + LineString = "LineString" + Polygon = "Polygon" + + +class PolygonItem(SchemaBaseModel): + ring: Optional[Ring] = Field(None, title="Ring boundary") + type: Optional[Type] = Field(None, title="Type") + coordinates: Optional[List[List[float]]] = Field(None, title="Coordinates") + + +class GeographicBoundingPolygon(SchemaBaseModel): + """ + Geographic Bounding Polygon + """ + + id: Optional[str] = Field(None, title="Identifier") + polygon: Optional[List[PolygonItem]] = Field(None, title="Polygon") + + class GeographicElementItem(SchemaBaseModel): geographicBoundingBox: Optional[GeographicBoundingBox] = Field(None, title="Geographic Bounding Box") geohash: Optional[Geohash] = Field(None, title="Geohash") geographicDescription: Optional[str] = Field(None, title="Geographic description identifier") + geographicBoundingPolygon: Optional[GeographicBoundingPolygon] = Field( + None, description="Geographic Bounding Polygon", title="Geographic Bounding Polygon" + ) class TemporalElementExtentItem(SchemaBaseModel): diff --git a/pydantic_schemas/definitions/image_schema.py b/pydantic_schemas/definitions/image_schema.py index be78bc7..dcad7a2 100644 --- a/pydantic_schemas/definitions/image_schema.py +++ b/pydantic_schemas/definitions/image_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: image-schema.json -# timestamp: 2024-07-08T15:58:24+00:00 +# timestamp: 2024-07-10T15:53:31+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/microdata_schema.py b/pydantic_schemas/definitions/microdata_schema.py index 1fff33b..d89dd0e 100644 --- a/pydantic_schemas/definitions/microdata_schema.py +++ b/pydantic_schemas/definitions/microdata_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: microdata-schema.json -# timestamp: 2024-07-08T15:58:26+00:00 +# timestamp: 2024-07-10T15:53:33+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/script_schema.py b/pydantic_schemas/definitions/script_schema.py index 49d5af8..2a87f6f 100644 --- a/pydantic_schemas/definitions/script_schema.py +++ b/pydantic_schemas/definitions/script_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: script-schema.json -# timestamp: 2024-07-08T15:58:28+00:00 +# timestamp: 2024-07-10T15:53:35+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/series_schema.py b/pydantic_schemas/definitions/series_schema.py index e45ab74..bb5db6c 100644 --- a/pydantic_schemas/definitions/series_schema.py +++ b/pydantic_schemas/definitions/series_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: series-schema.json -# timestamp: 2024-07-08T15:58:30+00:00 +# timestamp: 2024-07-10T15:53:36+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/table_schema.py b/pydantic_schemas/definitions/table_schema.py index 174500e..e16648a 100644 --- a/pydantic_schemas/definitions/table_schema.py +++ b/pydantic_schemas/definitions/table_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: table-schema.json -# timestamp: 2024-07-08T15:58:31+00:00 +# timestamp: 2024-07-10T15:53:38+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/timeseries_db_schema.py b/pydantic_schemas/definitions/timeseries_db_schema.py index 96eb2d8..6afaf76 100644 --- a/pydantic_schemas/definitions/timeseries_db_schema.py +++ b/pydantic_schemas/definitions/timeseries_db_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: timeseries-db-schema.json -# timestamp: 2024-07-08T15:58:33+00:00 +# timestamp: 2024-07-10T15:53:39+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/timeseries_schema.py b/pydantic_schemas/definitions/timeseries_schema.py index cecd75a..7a14649 100644 --- a/pydantic_schemas/definitions/timeseries_schema.py +++ b/pydantic_schemas/definitions/timeseries_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: timeseries-schema.json -# timestamp: 2024-07-08T15:58:36+00:00 +# timestamp: 2024-07-10T15:53:41+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/video_schema.py b/pydantic_schemas/definitions/video_schema.py index 732098a..df3457c 100644 --- a/pydantic_schemas/definitions/video_schema.py +++ b/pydantic_schemas/definitions/video_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: video-schema.json -# timestamp: 2024-07-08T15:58:38+00:00 +# timestamp: 2024-07-10T15:53:43+00:00 from __future__ import annotations diff --git a/pydantic_schemas/generate_pydantic_schemas.py b/pydantic_schemas/generate_pydantic_schemas.py index 0872a42..b16a4ff 100644 --- a/pydantic_schemas/generate_pydantic_schemas.py +++ b/pydantic_schemas/generate_pydantic_schemas.py @@ -23,6 +23,7 @@ os.makedirs(OUTPUT_DIR) for input_file in INPUTS: + 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("-", "_") From f1127677659da5da6caf74ea597bd8a4971f8f46 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Fri, 12 Jul 2024 16:34:06 -0400 Subject: [PATCH 11/51] array must be of something --- schemas/video-schema.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/schemas/video-schema.json b/schemas/video-schema.json index 4224330..4fd3aba 100644 --- a/schemas/video-schema.json +++ b/schemas/video-schema.json @@ -478,7 +478,10 @@ "relations": { "type": "array", - "title":"Defines, as a free text field, the relation between the video being documented and other resources. This is a Dublin Core element." + "title":"Defines, as a free text field, the relation between the video being documented and other resources. This is a Dublin Core element.", + "items": { + "type": "string" + } }, "video_provider": { From 7dee00cf01d0e05659dbccf55cc6ad27bfd82e1c Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Fri, 12 Jul 2024 16:34:51 -0400 Subject: [PATCH 12/51] updated for latest schema --- pydantic_schemas/definitions/document_schema.py | 2 +- pydantic_schemas/definitions/geospatial_schema.py | 2 +- pydantic_schemas/definitions/image_schema.py | 2 +- pydantic_schemas/definitions/microdata_schema.py | 2 +- pydantic_schemas/definitions/script_schema.py | 2 +- pydantic_schemas/definitions/series_schema.py | 2 +- pydantic_schemas/definitions/table_schema.py | 2 +- pydantic_schemas/definitions/timeseries_db_schema.py | 2 +- pydantic_schemas/definitions/timeseries_schema.py | 2 +- pydantic_schemas/definitions/video_schema.py | 4 ++-- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pydantic_schemas/definitions/document_schema.py b/pydantic_schemas/definitions/document_schema.py index d0d4b1b..80da9f6 100644 --- a/pydantic_schemas/definitions/document_schema.py +++ b/pydantic_schemas/definitions/document_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: document-schema.json -# timestamp: 2024-07-10T15:53:28+00:00 +# timestamp: 2024-07-12T20:05:43+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/geospatial_schema.py b/pydantic_schemas/definitions/geospatial_schema.py index 27e87db..93bf783 100644 --- a/pydantic_schemas/definitions/geospatial_schema.py +++ b/pydantic_schemas/definitions/geospatial_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: geospatial-schema.json -# timestamp: 2024-07-10T15:53:30+00:00 +# timestamp: 2024-07-12T20:05:45+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/image_schema.py b/pydantic_schemas/definitions/image_schema.py index dcad7a2..ce29f51 100644 --- a/pydantic_schemas/definitions/image_schema.py +++ b/pydantic_schemas/definitions/image_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: image-schema.json -# timestamp: 2024-07-10T15:53:31+00:00 +# timestamp: 2024-07-12T20:05:47+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/microdata_schema.py b/pydantic_schemas/definitions/microdata_schema.py index d89dd0e..cbc5d26 100644 --- a/pydantic_schemas/definitions/microdata_schema.py +++ b/pydantic_schemas/definitions/microdata_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: microdata-schema.json -# timestamp: 2024-07-10T15:53:33+00:00 +# timestamp: 2024-07-12T20:05:49+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/script_schema.py b/pydantic_schemas/definitions/script_schema.py index 2a87f6f..a5c4010 100644 --- a/pydantic_schemas/definitions/script_schema.py +++ b/pydantic_schemas/definitions/script_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: script-schema.json -# timestamp: 2024-07-10T15:53:35+00:00 +# timestamp: 2024-07-12T20:05:51+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/series_schema.py b/pydantic_schemas/definitions/series_schema.py index bb5db6c..2ba6820 100644 --- a/pydantic_schemas/definitions/series_schema.py +++ b/pydantic_schemas/definitions/series_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: series-schema.json -# timestamp: 2024-07-10T15:53:36+00:00 +# timestamp: 2024-07-12T20:05:52+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/table_schema.py b/pydantic_schemas/definitions/table_schema.py index e16648a..196713f 100644 --- a/pydantic_schemas/definitions/table_schema.py +++ b/pydantic_schemas/definitions/table_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: table-schema.json -# timestamp: 2024-07-10T15:53:38+00:00 +# timestamp: 2024-07-12T20:05:54+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/timeseries_db_schema.py b/pydantic_schemas/definitions/timeseries_db_schema.py index 6afaf76..7a353b2 100644 --- a/pydantic_schemas/definitions/timeseries_db_schema.py +++ b/pydantic_schemas/definitions/timeseries_db_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: timeseries-db-schema.json -# timestamp: 2024-07-10T15:53:39+00:00 +# timestamp: 2024-07-12T20:05:55+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/timeseries_schema.py b/pydantic_schemas/definitions/timeseries_schema.py index 7a14649..165ed93 100644 --- a/pydantic_schemas/definitions/timeseries_schema.py +++ b/pydantic_schemas/definitions/timeseries_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: timeseries-schema.json -# timestamp: 2024-07-10T15:53:41+00:00 +# timestamp: 2024-07-12T20:05:57+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/video_schema.py b/pydantic_schemas/definitions/video_schema.py index df3457c..f48843d 100644 --- a/pydantic_schemas/definitions/video_schema.py +++ b/pydantic_schemas/definitions/video_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: video-schema.json -# timestamp: 2024-07-10T15:53:43+00:00 +# timestamp: 2024-07-12T20:05:59+00:00 from __future__ import annotations @@ -200,7 +200,7 @@ class VideoDescription(SchemaBaseModel): title="A resource from which this work is derived", ) is_part_of: Optional[str] = Field(None, title="Indicate an item that this item is part of") - relations: Optional[List] = Field( + relations: Optional[List[str]] = Field( None, title=( "Defines, as a free text field, the relation between the video being documented and other resources. This" From 657d200379f1d63955eb0d85333dea4fff02d03e Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Fri, 12 Jul 2024 16:36:28 -0400 Subject: [PATCH 13/51] function to make skeleton of schemas --- pydantic_schemas/quick_start.py | 198 +++++++++++++++++++ pydantic_schemas/tests/__init__.py | 0 pydantic_schemas/tests/test_quick_start.py | 210 +++++++++++++++++++++ 3 files changed, 408 insertions(+) create mode 100644 pydantic_schemas/quick_start.py create mode 100644 pydantic_schemas/tests/__init__.py create mode 100644 pydantic_schemas/tests/test_quick_start.py diff --git a/pydantic_schemas/quick_start.py b/pydantic_schemas/quick_start.py new file mode 100644 index 0000000..4d10c79 --- /dev/null +++ b/pydantic_schemas/quick_start.py @@ -0,0 +1,198 @@ +import importlib +import inspect +import typing +from enum import Enum +from typing import Any, Callable, List, Type + +from pydantic import BaseModel + +metadata_types_file_map = { + "document_schema": "ScriptSchemaDraft", + "geospatial_schema": "GeospatialSchema", + "image_schema": "ImageDataTypeSchema", + "microdata_schema": "MicrodataSchema", + "script_schema": "ResearchProjectSchemaDraft", + "series_schema": "Series", + "table_schema": "Model", + "timeseries_db_schema": "TimeseriesDatabaseSchema", + "timeseries_schema": "TimeseriesSchema", + "video_schema": "Model", +} + + +def _is_typing_annotation(annotation): + if isinstance(annotation, str): + return False # Skip forward references which are in string form + + # Check if the annotation is directly from typing + if getattr(annotation, "__module__", None) == "typing": + return True + + # Handle special cases for generic types like List[int], Dict[str, int], etc. + origin = getattr(annotation, "__origin__", None) + if origin and getattr(origin, "__module__", None) == "typing": + return True + + return False + + +def _is_builtin_type(tp): + return tp in (str, int, float, bool, bytes, complex) + + +def _is_enum_type(tp): + return inspect.isclass(tp) and issubclass(tp, Enum) + + +def _is_pydantic_subclass(cl): + return inspect.isclass(cl) and issubclass(cl, BaseModel) + + +def _filter_list_for_condition(args: List[Any], condition: Callable[[Any], bool]) -> List[Any]: + return [a for a in args if condition(a)] + + +def _is_pydantic_annotated_string(p, debug=False, indentation=""): + if typing.get_origin(p) is typing.Annotated: + args = typing.get_args(p) + if len(args) == 2 and args[0] is str: + if debug: + print(indentation, "Is Annotated String") + return True + if debug: + print(indentation, f"Is Annotated not string {p}") + return False + + +def _create_default_class_from_annotation(p: Any, debug: bool = False, indentation: str = ""): + if p is str: + if debug: + print(indentation, "STR") + return "" + elif _is_enum_type(p): + if debug: + print(indentation, "ENUM") + return list(p)[0].value # get first value of the enum + elif _is_pydantic_subclass(p): + if debug: + print(indentation, "pydantic CLASS") + return make_skeleton(p, debug=debug, indentation=indentation + " ") + else: + raise ValueError(f"Unknown annotation: {p}") + + +def _create_default_from_list_of_args( + args: List[Any], return_none_for_builtin_or_enum=True, debug=False, indentation="" +): + """ + return None for built in types and enums, but create skeletons of pydantic or typed parameters + """ + args = _filter_list_for_condition(args, lambda a: a is not type(None)) + typed_args = _filter_list_for_condition(args, _is_typing_annotation) # _filter_list_for_typing_args(args) + pydantic_args = _filter_list_for_condition(args, _is_pydantic_subclass) # _filter_for_pydantic_args(args) + if debug: + print( + indentation, + f"LIST OF ARGS: {args}, LIST OF TYPED ARGS: {typed_args}, LIST_OF_PYDANTIC_ARGS: {pydantic_args}", + ) + if len(typed_args): + print(indentation, "moving to _create_default_from_typing_annotation") + # because dicts are more complicated than lists, we should default to dicts + typed_dicts = _filter_list_for_condition(typed_args, lambda p: getattr(p, "__origin__", None) is dict) + typed_lists = _filter_list_for_condition(typed_args, lambda p: getattr(p, "__origin__", None) is list) + if len(typed_dicts): + chosen_type = typed_dicts[0] + elif len(typed_lists): + chosen_type = typed_lists[0] + else: + chosen_type = typed_args[0] + return _create_default_from_typing_annotation(chosen_type, debug=debug, indentation=indentation) + elif len(pydantic_args): + return make_skeleton(pydantic_args[0]) + elif len(_filter_list_for_condition(args, lambda a: _is_builtin_type(a) or _is_enum_type(a))): + if debug: + print(indentation, "all builtins or enums") + if return_none_for_builtin_or_enum: + return None + elif len(_filter_list_for_condition(args, lambda a: a is str)): + return "" + else: + raise ValueError(f"Can't create a default of {args}") + elif len(args) == 1 and _is_pydantic_annotated_string(args[0], debug=debug, indentation=indentation): + return "" + else: + raise ValueError(f"Can't create a default of {args}") + + +def _create_default_from_typing_annotation(p: Any, debug: bool = False, indentation=""): + if debug: + print(indentation, "_create_default_from_typing_annotation") + if p is typing.Any: + return "" + args = typing.get_args(p) + if len(args) == 0: + raise ValueError(p) + isOptional = type(None) in args + if isOptional: + if debug: + print(indentation, "isOPTIONAL") + return _create_default_from_list_of_args( + args, return_none_for_builtin_or_enum=True, debug=debug, indentation=indentation + ) + elif getattr(p, "__origin__", None) is list: + if debug: + print(indentation, "isLIST") + if _is_pydantic_subclass(args[0]): + return [make_skeleton(args[0], debug=debug, indentation=indentation + " ")] + else: + return [_create_default(args[0], debug=debug, indentation=indentation + " ")] + elif getattr(p, "__origin__", None) is dict: + if debug: + print(indentation, "isDICT") + k = _create_default(args[0], debug=debug, indentation=indentation + " ") + v = _create_default(args[1], debug=debug, indentation=indentation + " ") + return {k: v} + elif len(args) > 1: + if debug: + print(indentation, "isUNION") + return _create_default_from_list_of_args( + args, return_none_for_builtin_or_enum=False, debug=debug, indentation=indentation + ) + else: + raise ValueError(f"Unknown typing {p}") + + +def _create_default(p: inspect.Parameter, debug: bool = False, indentation: str = ""): + if hasattr(p, "annotation"): + p = p.annotation + if inspect.isclass(p) and not _is_typing_annotation(p): + if debug: + print(indentation, "CLASS") + return _create_default_class_from_annotation(p, debug=debug, indentation=indentation) + elif _is_typing_annotation(p): + if debug: + print(indentation, "TYPED") + return _create_default_from_typing_annotation(p, debug=debug, indentation=indentation) + elif _is_pydantic_annotated_string(p, debug=debug, indentation=indentation): + if debug: + print(indentation, "ANNOTATED STRING") + return "" + else: + raise ValueError(f"Unknown parameter {p}") + + +def make_skeleton(cl: Type[BaseModel], debug=False, indentation=""): + parameter_map = inspect.signature(cl).parameters # {'name': } + param_values = {} + for name, param in parameter_map.items(): + if debug: + print(indentation, f"{param.name}: {param.annotation}") + param_values[name] = _create_default(param, debug=debug, indentation=indentation + " ") + if debug: + print(indentation, f"Parameter: {name}, value: {param_values[name]}") + return cl(**param_values) + + +def create_empty_schema_from_path(module_name, class_name, debug=False): + MyClass = getattr(importlib.import_module(module_name), class_name) + return make_skeleton(MyClass, debug=debug) diff --git a/pydantic_schemas/tests/__init__.py b/pydantic_schemas/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pydantic_schemas/tests/test_quick_start.py b/pydantic_schemas/tests/test_quick_start.py new file mode 100644 index 0000000..ffdb2dd --- /dev/null +++ b/pydantic_schemas/tests/test_quick_start.py @@ -0,0 +1,210 @@ +from enum import Enum +from typing import Any, Dict, List, Optional, Union + +import pytest +from pydantic import BaseModel + +from ..quick_start import create_empty_schema_from_path, make_skeleton, metadata_types_file_map + + +def test_simple_strings(): + class Simple(BaseModel): + a: str + b: str + + expected = Simple(a="", b="") + actual = make_skeleton(Simple) + assert expected == actual + + +def test_simple_optional_string(): + class SimpleOptional(BaseModel): + a: Optional[str] + b: str + + expected = SimpleOptional(a=None, b="") + actual = make_skeleton(SimpleOptional) + assert expected == actual, actual + + +def test_simple_enum(): + class Color(Enum): + RED = 1 + GREEN = 2 + BLUE = 3 + + class SimpleEnum(BaseModel): + a: Color + + expected = SimpleEnum(a=Color.RED) + actual = make_skeleton(SimpleEnum) + assert actual == expected, actual + + +def test_optional_enum(): + class Color(Enum): + RED = 1 + GREEN = 2 + BLUE = 3 + + class SimpleEnum(BaseModel): + a: Optional[Color] = None + + expected = SimpleEnum(a=None) + actual = make_skeleton(SimpleEnum) + assert actual == expected, actual + + +def test_one_level(): + class Simple(BaseModel): + a: str + b: str + + class OneLevel(BaseModel): + c: Simple + + expected = OneLevel(c=Simple(a="", b="")) + actual = make_skeleton(OneLevel) + assert actual == expected + + +def test_one_level_optional(): + class Simple(BaseModel): + a: str + b: str + + class OneLevel(BaseModel): + c: Optional[Simple] + + expected = OneLevel(c=Simple(a="", b="")) + actual = make_skeleton(OneLevel) + assert actual == expected, actual + + +def test_two_levels(): + class Simple(BaseModel): + a: str + b: str + + class OneLevel(BaseModel): + c: Optional[Simple] = None + c1: Optional[str] = None + c2: str + + class TwoLevel(BaseModel): + d: OneLevel + e: Optional[OneLevel] = None + f: Optional[str] + + expected = TwoLevel( + d=OneLevel(c=Simple(a="", b=""), c1=None, c2=""), e=OneLevel(c=Simple(a="", b=""), c1=None, c2=""), f=None + ) + actual = make_skeleton(TwoLevel) + assert actual == expected, actual + + +def test_list_of_builtin(): + class Simple(BaseModel): + a: List[str] + b: str + + expected = Simple(a=[""], b="") + actual = make_skeleton(Simple) + assert actual == expected, actual + + +def test_list_of_enum(): + class Color(Enum): + RED = 1 + GREEN = 2 + BLUE = 3 + + class Simple(BaseModel): + a: List[Color] + b: str + + expected = Simple(a=[Color.RED], b="") + actual = make_skeleton(Simple) + assert actual == expected, actual + + +def test_list_of_pydantic(): + class Simple(BaseModel): + a: str + b: str + + class OneLevel(BaseModel): + c: List[Simple] + + expected = OneLevel(c=[Simple(a="", b="")]) + actual = make_skeleton(OneLevel) + assert actual == expected, actual + + +def test_dict_of_strs(): + class Simple(BaseModel): + a: Dict[str, str] + b: str + + expected = Simple(a={"": ""}, b="") + actual = make_skeleton(Simple) + assert actual == expected, actual + + +def test_union_of_str_list_str(): + class Simple(BaseModel): + a: Optional[Union[str, List[str]]] = None + b: Any + c: str + + expected = Simple(a=[""], b="", c="") + actual = make_skeleton(Simple) + assert actual == expected, actual + + class SimpleReversed(BaseModel): + a: Optional[Union[List[str], str]] = None + b: Any + c: str + + expected = SimpleReversed(a=[""], b="", c="") + actual = make_skeleton(SimpleReversed) + assert actual == expected, actual + + +def test_union_of_List_Dict(): + class Simple(BaseModel): + a: Union[Dict[str, str], List[Any]] + + expected = Simple(a={"": ""}) + actual = make_skeleton(Simple, debug=True) + assert actual == expected, actual + + # because a dict is more complicated than a list, we should default to using the dict + class Simple(BaseModel): + a: Union[List[Any], Dict[str, str]] + + expected = Simple(a={"": ""}) + actual = make_skeleton(Simple, debug=True) + assert actual == expected, actual + + +def test_union_of_many_builtins(): + class Simple(BaseModel): + a: Union[int, float, str] + + expected = Simple(a="") + actual = make_skeleton(Simple, debug=True) + assert actual == expected, actual + + +@pytest.mark.parametrize("k, v", [(k, v) for k, v in metadata_types_file_map.items()]) +def test_actual_schemas(k, v): + base = "pydantic_schemas.definitions.{}" + print(k) + try: + create_empty_schema_from_path(base.format(k), v) + except TypeError as e: + if str(e) == "To define root models, use `pydantic.RootModel` rather than a field called '__root__'": + print("Caught the specific TypeError:", e) + else: + raise From 190a82a8abad8147034b563a7f3e062673a3c8e9 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Tue, 16 Jul 2024 15:11:55 -0400 Subject: [PATCH 14/51] write and read simple pydantic to excel --- pydantic_schemas/excel_to_pydantic.py | 64 +++++ pydantic_schemas/pydantic_to_excel.py | 257 ++++++++++++++++++ .../tests/test_pydantic_to_excel.py | 38 +++ 3 files changed, 359 insertions(+) create mode 100644 pydantic_schemas/excel_to_pydantic.py create mode 100644 pydantic_schemas/pydantic_to_excel.py create mode 100644 pydantic_schemas/tests/test_pydantic_to_excel.py diff --git a/pydantic_schemas/excel_to_pydantic.py b/pydantic_schemas/excel_to_pydantic.py new file mode 100644 index 0000000..8e917cb --- /dev/null +++ b/pydantic_schemas/excel_to_pydantic.py @@ -0,0 +1,64 @@ +from typing import Dict, Type + +import numpy as np +import pandas as pd +from pydantic import BaseModel + + +def find_string_and_count_nans(arr, search_str): + """ + Finds the index of the first occurrence of a string in a NumPy array, + and counts the number of NaNs immediately following that string. + + Args: + - arr (np.ndarray): The NumPy array to search in. + - search_str (str): The string to search for. + + Returns: + - tuple: (index, nan_count) + - index (int): Index of the first occurrence of the string, or -1 if not found. + - nan_count (int): Number of NaNs immediately following the string. + """ + index = np.where(arr == search_str)[0] # Find index of the first occurrence + if len(index) == 0: + return -1, 0 # Return -1 if string not found, nan_count is 0 + index = index[0] # Take the first occurrence index + nan_count = 0 + for i in range(index + 1, len(arr)): + if pd.isna(arr[i]): + nan_count += 1 + else: + break + return int(index), nan_count + + +def is_horizontally_organized(m: Type[BaseModel], df: pd.DataFrame): + """True if the index is along the top with the values below. False if the index is on the left side with the values to the right""" + expected_fields = m.schema()["properties"].keys() + fields_if_horizontally_arranged = df.iloc[0, :].values + fields_if_vertically_arranged = df.iloc[:, 0].values + + horizontal_intersection = len(set(expected_fields).intersection(fields_if_horizontally_arranged)) + vertical_intersection = len(set(expected_fields).intersection(fields_if_vertically_arranged)) + return horizontal_intersection > vertical_intersection + + +def instantiate_from_df(m: Type[BaseModel], df: pd.DataFrame): + name = m.schema()["title"] + names = df.iloc[:, 0].values + idx, sze = find_string_and_count_nans(df.iloc[:, 0].values, "Simple") + if idx < 0: + raise IndexError(f"{name} not found in {names}") + sub = df.iloc[idx + 1 : idx + 1 + sze, 1:] + if is_horizontally_organized(m, sub): + sub = sub.T + return m(**sub.set_index(sub.columns[0]).to_dict(orient="dict")[sub.columns[1]]) + + +def excel_to_pydantic(filename: str, sheetname: str, objects: Dict[str, Type[BaseModel]]): + fields = objects.values() + df = pd.read_excel(filename, sheet_name=sheetname) + ret = {} + for k, v in objects.items(): + ret[k] = instantiate_from_df(v, df) + return ret diff --git a/pydantic_schemas/pydantic_to_excel.py b/pydantic_schemas/pydantic_to_excel.py new file mode 100644 index 0000000..409907f --- /dev/null +++ b/pydantic_schemas/pydantic_to_excel.py @@ -0,0 +1,257 @@ +import os +from typing import Optional, Type + +import pandas as pd +from openpyxl import Workbook, load_workbook +from openpyxl.styles import Font, PatternFill, Protection +from pydantic import BaseModel + + +def protect_and_shade_given_cell(sheet, row: int, col: int): + grey_fill = PatternFill(start_color="DDDDDD", end_color="DDDDDD", fill_type="solid") + sheet.cell(row=row, column=col).fill = grey_fill + sheet.cell(row=row, column=col).protection = Protection(locked=True) + + +def protect_and_shade_row(sheet, row: int, colmin: int = 1, colmax: Optional[int] = None): + if colmax is None: + colmax = max(colmin, 27, sheet.max_column) + for col in range(colmin, colmax): + protect_and_shade_given_cell(sheet, row, col) + + +def protect_and_shade_col(sheet, col: int, rowmin: int, rowmax: int): + for row in range(rowmin, rowmax): + protect_and_shade_given_cell(sheet, row, col) + + +def unprotect_cell(sheet, row, column): + sheet.cell(row=row, column=column).protection = Protection(locked=False) + + +def unprotect_row(sheet, row, colmin: int, colmax: Optional[int] = None): + if colmax is None: + colmax = max(colmin, 27, sheet.max_column) + for col in range(colmin, colmax): + unprotect_cell(sheet, row, col) + + +def unprotect_given_col(sheet, col: int, rowmin: int, rowmax: int): + for row in range(rowmin, rowmax): + unprotect_cell(sheet, row, col) + + +def shade_30_rows(doc_filepath: str, sheet_name: str, startrow: int): + wb = load_workbook(doc_filepath) + ws = wb[sheet_name] + for r in range(startrow, startrow + 30): + protect_and_shade_row(ws, r) + wb.save(doc_filepath) + + +def correct_column_widths(filename: str, sheet_name: str): + """ + Adjusts the column widths of an Excel sheet based on the maximum length of the content in each column. + If a column has no filled values, its width remains unchanged. + + Args: + filename (str): The path to the Excel file. + sheet_name (str): The name of the sheet to adjust column widths for. + """ + # Load the existing workbook + wb = load_workbook(filename) + ws = wb[sheet_name] + + # Adjust column widths based on the maximum length of the content in each column + for col in ws.columns: + max_length = 0 + column = col[0].column_letter # Get the column letter + for cell in col: + try: + if len(str(cell.value)) > max_length: + max_length = len(cell.value) + except: + pass + if max_length > 0: # Only adjust if there are filled values in the column + adjusted_width = max_length + 2 + ws.column_dimensions[column].width = adjusted_width + + # Save the workbook + wb.save(filename) + + +def shade_locked_cells(filename: str, sheet_name: str): + """ + Shades every cell grey if it is locked and leaves it unshaded if it is not locked. + + Args: + filename (str): The path to the Excel file. + sheet_name (str): The name of the sheet to apply the shading. + """ + # Load the existing workbook + wb = load_workbook(filename) + ws = wb[sheet_name] + + # Define the grey fill + grey_fill = PatternFill(start_color="DDDDDD", end_color="DDDDDD", fill_type="solid") + + # Iterate through each cell in the worksheet + for row in ws.iter_rows(): + for cell in row: + if cell.protection.locked: + cell.fill = grey_fill + else: + cell.fill = PatternFill() # Remove any fill (reset to default) + + # Save the workbook + wb.save(filename) + + +def write_to_cell(filename: str, sheet_name: str, row: int, col: int, text: str, isBold=False): + """ + Writes text to a specified cell in the Excel file. + + Args: + filename (str): The path to the Excel file. + sheet_name (str): The name of the sheet. + row_num (int): The row number (1-based index). + col_num (int): The column number (1-based index). + text (str): The text to write to the cell. + """ + # Load the existing workbook or create a new one if it doesn't exist + try: + wb = load_workbook(filename) + except FileNotFoundError: + wb = Workbook() + + # Select the worksheet by name + ws = wb[sheet_name] + + # Write text to the specified cell + cell = ws.cell(row=row, column=col, value=text) + cell.font = Font(bold=isBold) + + protect_and_shade_row(ws, row=row, colmin=col) + + # Save the workbook + wb.save(filename) + + return row + 1 + + +def create_sheet_and_write_title(doc_filepath: str, sheet_name: str, sheet_title: str, sheet_number: int = 0): + """ + In the given excel document, creates a new sheet called sheet_name and in the top left cell + writes in sheet_title in bold. + + It will create the excel document at doc_filepath if it does not already exist. + + The new sheet will be inserted at the specified sheet_number position. If sheet_number is + greater than the total number of sheets, the new sheet will be added at the end. + + Args: + doc_filepath (str): The path to the Excel document. + sheet_name (str): The name of the new sheet to create. + sheet_title (str): The title to write in the top left cell of the new sheet, in bold. + sheet_number (int): The position to insert the new sheet (0-indexed). If greater than the + total number of sheets, the new sheet will be added at the end. + + Returns: + int: index of next row below the final written row + + Raises: + ValueError: if a sheet called sheet_name already exists in the document to prevent overwriting. + """ + # Check if the file exists + if os.path.exists(doc_filepath): + workbook = load_workbook(doc_filepath) + else: + workbook = Workbook() + # Remove the default sheet created by Workbook() + if len(workbook.sheetnames) == 1 and workbook.sheetnames[0] == "Sheet": + del workbook["Sheet"] + + # Check if the sheet already exists + if sheet_name in workbook.sheetnames: + raise ValueError(f"A sheet called '{sheet_name}' already exists in the document.") + + # Create a new sheet + new_sheet = workbook.create_sheet(title=sheet_name) + + # Write the title in bold in the top left cell (A1) + bold_font = Font(bold=True, size=14) + new_sheet["A1"] = sheet_title + new_sheet["A1"].font = bold_font + + # Shade the background of the cells in the first 2 rows grey and lock them + for row in range(1, 3): + protect_and_shade_row(new_sheet, row) + + # Determine the position to insert the new sheet + total_sheets = len(workbook.sheetnames) + insert_position = min(sheet_number, total_sheets) + + # Move the new sheet to the specified position + workbook._sheets.insert(insert_position, workbook._sheets.pop()) + + # Save the workbook + workbook.save(doc_filepath) + + return 3 + + +def write_simple_pydantic_to_sheet(doc_filepath: str, sheet_name: str, ob: BaseModel, startrow: int, index_above=False): + """ + Returns: + int: index of next row below the final written row + """ + startrow = write_to_cell(doc_filepath, sheet_name, startrow, 1, ob.model_json_schema()["title"], isBold=True) + startcol = 2 + + ob_dict = ob.model_dump(mode="json") + df = pd.json_normalize(ob_dict).T + if index_above: + df = df.T + + # Annoyingly, openpyxl uses 1 based indexing but + # But pandas uses 0 based indexing. + + with pd.ExcelWriter(doc_filepath, mode="a", if_sheet_exists="overlay") as writer: + df.to_excel( + writer, + sheet_name=sheet_name, + header=index_above, + index=not index_above, + startrow=startrow - 1, + startcol=startcol - 1, + merge_cells=True, + ) + + # Open the Excel file with openpyxl + workbook = load_workbook(doc_filepath) + sheet = workbook[sheet_name] + + # Get the DataFrame dimensions + rows, cols = df.shape + + if index_above: + protect_and_shade_row(sheet, startrow) + for c in range(startcol, cols + startcol): + cell = sheet.cell(startrow, c) + cell.font = Font(bold=False) + for r in range(startrow + 1, startrow + rows + 1): + unprotect_row(sheet, r, startcol, colmax=startcol + cols) + protect_and_shade_row(sheet, r, colmin=startcol + cols) + else: + protect_and_shade_col(sheet, startcol, startrow, startrow + rows) + for r in range(startrow, startrow + rows): + cell = sheet.cell(r, startcol) + cell.font = Font(bold=False) + unprotect_row(sheet, r, startcol + 1, colmax=startcol + cols + 1) + protect_and_shade_row(sheet, r, colmin=cols + startcol + 1) + + sheet.protection.enable() + # Save the workbook + workbook.save(doc_filepath) + + return startrow + rows diff --git a/pydantic_schemas/tests/test_pydantic_to_excel.py b/pydantic_schemas/tests/test_pydantic_to_excel.py new file mode 100644 index 0000000..d4ca4a9 --- /dev/null +++ b/pydantic_schemas/tests/test_pydantic_to_excel.py @@ -0,0 +1,38 @@ +from enum import Enum +from typing import Any, Dict, List, Optional, Union + +import pytest +from pydantic import BaseModel + +from ..excel_to_pydantic import excel_to_pydantic +from ..pydantic_to_excel import ( + create_sheet_and_write_title, + shade_30_rows, + shade_locked_cells, + write_simple_pydantic_to_sheet, +) + + +@pytest.mark.parametrize("index_above", [True, False]) +def test_simple_schema(tmpdir, index_above): + class Simple(BaseModel): + idno: str + title: str + author: str + + simple_original = Simple(idno="AVal", title="BVal", author="CVal") + + filename = tmpdir.join(f"integration_test_simple_{index_above}.xlsx") + sheetname = "Document Metadata" + sheet_title = "Document Metadata" + current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) + + current_row = write_simple_pydantic_to_sheet( + filename, sheetname, simple_original, current_row + 1, index_above=index_above + ) + + shade_30_rows(filename, sheetname, current_row + 1) + shade_locked_cells(filename, sheetname) + + parsed_output = excel_to_pydantic("GORDON.xlsx", "Document Metadata", {"simple": Simple}) + assert parsed_output["simple"] == simple_original From 850daaea2be5443c6fcd00fa8a6e1d20cc692975 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Tue, 16 Jul 2024 15:24:26 -0400 Subject: [PATCH 15/51] docstring for write_simple_pydantic_to_sheet --- pydantic_schemas/pydantic_to_excel.py | 43 +++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/pydantic_schemas/pydantic_to_excel.py b/pydantic_schemas/pydantic_to_excel.py index 409907f..7055e56 100644 --- a/pydantic_schemas/pydantic_to_excel.py +++ b/pydantic_schemas/pydantic_to_excel.py @@ -42,6 +42,7 @@ def unprotect_given_col(sheet, col: int, rowmin: int, rowmax: int): def shade_30_rows(doc_filepath: str, sheet_name: str, startrow: int): + """For use after all data is written so there is a clear border around the data""" wb = load_workbook(doc_filepath) ws = wb[sheet_name] for r in range(startrow, startrow + 30): @@ -202,6 +203,48 @@ def create_sheet_and_write_title(doc_filepath: str, sheet_name: str, sheet_title def write_simple_pydantic_to_sheet(doc_filepath: str, sheet_name: str, ob: BaseModel, startrow: int, index_above=False): """ + Assumes a pydantic object made up of built in types and not other pydantic objects nor Lists nor Dicts nor enums. + + Starting from startrow, it writes the name of the pydantic object in the first column. It then writes the data + starting in the row below and from the second column. + + If index_above = False then the data is printed with indexs down the second column and values down the third column + If index_above = True then the data is printed with indexs along the second row and values along the third row + + Example: + + class Simple(BaseModel): + a: str + b: str + + example = Simple(a="value_a", b="value_b") + # with index_above=True + write_simple_pydantic_to_sheet("filename", "sheetname", example, startrow=1, index_above=True) + + gives: + + Simple + a b + value_a value_b + + # with index_above=False + write_simple_pydantic_to_sheet("filename", "sheetname", example, startrow=1, index_above=False) + + gives: + + Simple + + a value_a + b value_b + + Args: + doc_filepath (str): The path to the Excel document. + sheet_name (str): The name of the new sheet to create. + ob (BaseModel): a pydantic class + startrow (int): the row from which to start writing the data + index_above (bool): if True then the index is written along a row with the data below, if False then the data is + written in a column with the data to the right. Default is False + Returns: int: index of next row below the final written row """ From bf6055cc2ea13c8e1cf6c4e83aee3865a55342d8 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Wed, 17 Jul 2024 17:05:57 -0400 Subject: [PATCH 16/51] work with multinesting where we use multiindexs --- pydantic_schemas/excel_to_pydantic.py | 85 +++++++++++++--- pydantic_schemas/pydantic_to_excel.py | 40 ++++++-- .../tests/test_pydantic_to_excel.py | 98 ++++++++++++++++++- 3 files changed, 200 insertions(+), 23 deletions(-) diff --git a/pydantic_schemas/excel_to_pydantic.py b/pydantic_schemas/excel_to_pydantic.py index 8e917cb..952acaa 100644 --- a/pydantic_schemas/excel_to_pydantic.py +++ b/pydantic_schemas/excel_to_pydantic.py @@ -1,4 +1,4 @@ -from typing import Dict, Type +from typing import Dict, Optional, Type import numpy as np import pandas as pd @@ -34,6 +34,12 @@ def find_string_and_count_nans(arr, search_str): def is_horizontally_organized(m: Type[BaseModel], df: pd.DataFrame): """True if the index is along the top with the values below. False if the index is on the left side with the values to the right""" + rows, cols = df.shape + if rows == 1: + return True + elif cols == 1: + return False + expected_fields = m.schema()["properties"].keys() fields_if_horizontally_arranged = df.iloc[0, :].values fields_if_vertically_arranged = df.iloc[:, 0].values @@ -43,22 +49,77 @@ def is_horizontally_organized(m: Type[BaseModel], df: pd.DataFrame): return horizontal_intersection > vertical_intersection -def instantiate_from_df(m: Type[BaseModel], df: pd.DataFrame): - name = m.schema()["title"] +def get_relevant_sub_frame(m: Type[BaseModel], df: pd.DataFrame, name_of_field: Optional[str] = None): + """ + THe dataframe likely contains lots and lots of information about other models. + + THis function obtains only that information that pertains to this model + """ + name_of_class = m.schema()["title"] names = df.iloc[:, 0].values - idx, sze = find_string_and_count_nans(df.iloc[:, 0].values, "Simple") + idx, sze = find_string_and_count_nans(df.iloc[:, 0].values, name_of_class) if idx < 0: - raise IndexError(f"{name} not found in {names}") - sub = df.iloc[idx + 1 : idx + 1 + sze, 1:] + if name_of_field is not None: + idx, sze = find_string_and_count_nans(df.iloc[:, 0].values, name_of_field) + if idx < 0: + error_message = f"'{name_of_class}' " + if name_of_field is not None: + error_message += f"and '{name_of_field}' " + error_message += "not found in {names}" + raise IndexError(error_message) + + sub = df.iloc[idx : idx + sze + 1, 1:] + + sub = sub.dropna(how="all", axis=0) # drop all null rows + sub = sub.dropna(how="all", axis=1) # drop all null columns if is_horizontally_organized(m, sub): sub = sub.T - return m(**sub.set_index(sub.columns[0]).to_dict(orient="dict")[sub.columns[1]]) + # sub.iloc[:, 0] = sub.iloc[:, 0].ffill() + return sub + +# def instantiate_from_df(m: Type[BaseModel], df: pd.DataFrame): +# name = m.schema()["title"] +# names = df.iloc[:, 0].values +# idx, sze = find_string_and_count_nans(df.iloc[:, 0].values, name) +# if idx < 0: +# raise IndexError(f"'{name}' not found in {names}") +# sub = df.iloc[idx + 1 : idx + 1 + sze, 1:] +# if is_horizontally_organized(m, sub): +# sub = sub.T +# sub = sub.dropna(how='all') +# return m(**sub.set_index(sub.columns[0]).to_dict(orient="dict")[sub.columns[1]]) -def excel_to_pydantic(filename: str, sheetname: str, objects: Dict[str, Type[BaseModel]]): + +def get_instance(model_type, df): + objects = {k: v.annotation for k, v in model_type.model_fields.items()} fields = objects.values() - df = pd.read_excel(filename, sheet_name=sheetname) ret = {} - for k, v in objects.items(): - ret[k] = instantiate_from_df(v, df) - return ret + for name, field in objects.items(): + if isinstance(field, type(BaseModel)): + print(f"BASE: {field}") + sub = get_relevant_sub_frame(field, df, name) + print(sub) + ret[name] = get_instance(field, sub) + print(ret[name]) + else: + print(f"builtin: {name}") + ret[name] = df.set_index(df.columns[0]).loc[name].values[0] + print(ret[name]) + print() + return model_type(**ret) + + +def excel_sheet_to_pydantic(filename: str, sheetname: str, model_type: Type[BaseModel]): + df = pd.read_excel(filename, sheet_name=sheetname) + try: + df = get_relevant_sub_frame(model_type, df) + except (KeyError, IndexError): + pass + return get_instance(model_type, df) + # objects = {k: v.annotation for k, v in model_type.model_fields.items()} + # fields = objects.values() + # ret = {} + # for k, v in objects.items(): + # ret[k] = instantiate_from_df(v, df) + # return model_type(**ret) diff --git a/pydantic_schemas/pydantic_to_excel.py b/pydantic_schemas/pydantic_to_excel.py index 7055e56..0a1def0 100644 --- a/pydantic_schemas/pydantic_to_excel.py +++ b/pydantic_schemas/pydantic_to_excel.py @@ -203,7 +203,8 @@ def create_sheet_and_write_title(doc_filepath: str, sheet_name: str, sheet_title def write_simple_pydantic_to_sheet(doc_filepath: str, sheet_name: str, ob: BaseModel, startrow: int, index_above=False): """ - Assumes a pydantic object made up of built in types and not other pydantic objects nor Lists nor Dicts nor enums. + Assumes a pydantic object made up of built in types or pydantic objects utimately made of built in types. + Do not use if the object or it's children contain Lists or Dicts or enums. Starting from startrow, it writes the name of the pydantic object in the first column. It then writes the data starting in the row below and from the second column. @@ -253,6 +254,15 @@ class Simple(BaseModel): ob_dict = ob.model_dump(mode="json") df = pd.json_normalize(ob_dict).T + df.index = df.index.str.split(".", expand=True) + index_levels = df.index.nlevels + if index_above and index_levels > 1: + warnings.warn( + "Setting index_above=True is incompatible with a hierarchical index. Setting index_above to False.", + UserWarning, + ) + index_above = False + if index_above: df = df.T @@ -286,15 +296,33 @@ class Simple(BaseModel): unprotect_row(sheet, r, startcol, colmax=startcol + cols) protect_and_shade_row(sheet, r, colmin=startcol + cols) else: - protect_and_shade_col(sheet, startcol, startrow, startrow + rows) + for col in range(startcol, startcol + index_levels): + protect_and_shade_col(sheet, col, startrow, startrow + rows) + for r in range(startrow, startrow + rows): + cell = sheet.cell(r, col) + cell.font = Font(bold=False) + firstdatacol = startcol + index_levels for r in range(startrow, startrow + rows): - cell = sheet.cell(r, startcol) - cell.font = Font(bold=False) - unprotect_row(sheet, r, startcol + 1, colmax=startcol + cols + 1) - protect_and_shade_row(sheet, r, colmin=cols + startcol + 1) + unprotect_row(sheet, r, firstdatacol, colmax=firstdatacol + cols) + protect_and_shade_row(sheet, r, colmin=cols + firstdatacol) sheet.protection.enable() # Save the workbook workbook.save(doc_filepath) return startrow + rows + + +def write_nested_simple_pydantic_to_sheet( + doc_filepath: str, sheet_name: str, ob: BaseModel, startrow: int, index_above=False +): + """ + Assumes the pydantic object is made up only of other pydantic objects that are themselves made up only of built in types + """ + for mfield, _ in ob.model_fields.items(): + child = getattr(ob, mfield) + startrow = write_simple_pydantic_to_sheet( + doc_filepath, sheet_name, child, startrow + 1, index_above=index_above + ) + + return startrow diff --git a/pydantic_schemas/tests/test_pydantic_to_excel.py b/pydantic_schemas/tests/test_pydantic_to_excel.py index d4ca4a9..a34d81b 100644 --- a/pydantic_schemas/tests/test_pydantic_to_excel.py +++ b/pydantic_schemas/tests/test_pydantic_to_excel.py @@ -1,14 +1,17 @@ from enum import Enum from typing import Any, Dict, List, Optional, Union +import pandas as pd import pytest -from pydantic import BaseModel +from pydantic import BaseModel, Field -from ..excel_to_pydantic import excel_to_pydantic +from ..excel_to_pydantic import excel_sheet_to_pydantic, get_instance from ..pydantic_to_excel import ( + correct_column_widths, create_sheet_and_write_title, shade_30_rows, shade_locked_cells, + write_nested_simple_pydantic_to_sheet, write_simple_pydantic_to_sheet, ) @@ -22,7 +25,7 @@ class Simple(BaseModel): simple_original = Simple(idno="AVal", title="BVal", author="CVal") - filename = tmpdir.join(f"integration_test_simple_{index_above}.xlsx") + filename = tmpdir.join(f"integration_test_simple_schema_{index_above}.xlsx") sheetname = "Document Metadata" sheet_title = "Document Metadata" current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) @@ -30,9 +33,94 @@ class Simple(BaseModel): current_row = write_simple_pydantic_to_sheet( filename, sheetname, simple_original, current_row + 1, index_above=index_above ) + correct_column_widths(filename, sheetname) + shade_30_rows(filename, sheetname, current_row + 1) + shade_locked_cells(filename, sheetname) + + parsed_simple = excel_sheet_to_pydantic(filename, sheetname, Simple) + assert parsed_simple == simple_original + + +@pytest.mark.parametrize("index_above", [True, False]) +def test_two_layer_simple_schema(tmpdir, index_above): + class Production(BaseModel): + idno: str + title: str + author: str + + class Country(BaseModel): + name: str + initials: str + + class ProductionAndCountries(BaseModel): + production: Production + countries: Country + + inp = ProductionAndCountries( + production=Production(idno="AVal", title="BVal", author="CVal"), + countries=Country(name="MyCountry", initials="MC"), + ) + + filename = tmpdir.join(f"integration_test_two_layer_simple_schema_{index_above}.xlsx") + sheetname = "Document Metadata" + sheet_title = "Document Metadata" + current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) + + current_row = write_nested_simple_pydantic_to_sheet(filename, sheetname, inp, current_row, index_above=index_above) + correct_column_widths(filename, sheetname) + shade_30_rows(filename, sheetname, current_row + 1) + shade_locked_cells(filename, sheetname) + parsed_outp = excel_sheet_to_pydantic(filename, sheetname, ProductionAndCountries) + assert parsed_outp == inp + + +def test_multilayer_simple_schema(tmpdir): + class Production(BaseModel): + idno: str + title: str + author: str + + class Country(BaseModel): + name: str + initials: str + + class Language(BaseModel): + name: Optional[str] = Field(None, description="Language title", title="Name") + code: Optional[str] = Field(None, title="code") + + class Topic(BaseModel): + id: Optional[str] = Field(None, title="Unique Identifier") + name: str = Field(..., title="Topic") + + class SeriesDescription(BaseModel): + language: Language + topic: Topic + + class ProductionAndCountries(BaseModel): + production: Production + countries: Country + series_description: SeriesDescription + + series_description = SeriesDescription( + language=Language(name="English", code="EN"), topic=Topic(id="topic1", name="topic1") + ) + + inp = ProductionAndCountries( + production=Production(idno="AVal", title="BVal", author="CVal"), + countries=Country(name="MyCountry", initials="MC"), + series_description=series_description, + ) + + filename = tmpdir.join(f"integration_test_multilayer_simple_schema_.xlsx") + sheetname = "Document Metadata" + sheet_title = "Document Metadata" + + current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) + current_row = write_nested_simple_pydantic_to_sheet(filename, sheetname, inp, current_row + 1) + correct_column_widths(filename, sheet_name=sheetname) shade_30_rows(filename, sheetname, current_row + 1) shade_locked_cells(filename, sheetname) - parsed_output = excel_to_pydantic("GORDON.xlsx", "Document Metadata", {"simple": Simple}) - assert parsed_output["simple"] == simple_original + parsed_outp = excel_sheet_to_pydantic(filename, sheetname, ProductionAndCountries) + assert parsed_outp == inp From 235045b110ab75ce382aa28393b457351b92b4e5 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Fri, 19 Jul 2024 15:05:28 -0400 Subject: [PATCH 17/51] handle list and lists of lists --- pydantic_schemas/excel_to_pydantic.py | 158 ++++++++++---- pydantic_schemas/pydantic_to_excel.py | 110 +++++++++- pydantic_schemas/quick_start.py | 3 +- .../tests/test_pydantic_to_excel.py | 206 ++++++++++++++++++ 4 files changed, 428 insertions(+), 49 deletions(-) diff --git a/pydantic_schemas/excel_to_pydantic.py b/pydantic_schemas/excel_to_pydantic.py index 952acaa..fc44cca 100644 --- a/pydantic_schemas/excel_to_pydantic.py +++ b/pydantic_schemas/excel_to_pydantic.py @@ -1,4 +1,7 @@ -from typing import Dict, Optional, Type +import json +import warnings +from collections.abc import Iterable +from typing import Dict, Optional, Type, Union, get_args, get_origin import numpy as np import pandas as pd @@ -40,7 +43,7 @@ def is_horizontally_organized(m: Type[BaseModel], df: pd.DataFrame): elif cols == 1: return False - expected_fields = m.schema()["properties"].keys() + expected_fields = m.model_json_schema()["properties"].keys() fields_if_horizontally_arranged = df.iloc[0, :].values fields_if_vertically_arranged = df.iloc[:, 0].values @@ -55,17 +58,22 @@ def get_relevant_sub_frame(m: Type[BaseModel], df: pd.DataFrame, name_of_field: THis function obtains only that information that pertains to this model """ - name_of_class = m.schema()["title"] names = df.iloc[:, 0].values - idx, sze = find_string_and_count_nans(df.iloc[:, 0].values, name_of_class) + try: + name_of_class = m.model_json_schema()["title"] + + idx, sze = find_string_and_count_nans(names, name_of_class) + except AttributeError: + idx = -1 + sze = 0 if idx < 0: if name_of_field is not None: - idx, sze = find_string_and_count_nans(df.iloc[:, 0].values, name_of_field) + idx, sze = find_string_and_count_nans(names, name_of_field) if idx < 0: error_message = f"'{name_of_class}' " if name_of_field is not None: error_message += f"and '{name_of_field}' " - error_message += "not found in {names}" + error_message += f"not found in {names}" raise IndexError(error_message) sub = df.iloc[idx : idx + sze + 1, 1:] @@ -74,52 +82,128 @@ def get_relevant_sub_frame(m: Type[BaseModel], df: pd.DataFrame, name_of_field: sub = sub.dropna(how="all", axis=1) # drop all null columns if is_horizontally_organized(m, sub): sub = sub.T - # sub.iloc[:, 0] = sub.iloc[:, 0].ffill() return sub -# def instantiate_from_df(m: Type[BaseModel], df: pd.DataFrame): -# name = m.schema()["title"] -# names = df.iloc[:, 0].values -# idx, sze = find_string_and_count_nans(df.iloc[:, 0].values, name) -# if idx < 0: -# raise IndexError(f"'{name}' not found in {names}") -# sub = df.iloc[idx + 1 : idx + 1 + sze, 1:] -# if is_horizontally_organized(m, sub): -# sub = sub.T -# sub = sub.dropna(how='all') -# return m(**sub.set_index(sub.columns[0]).to_dict(orient="dict")[sub.columns[1]]) +def annotation_is_list_or_optional_list(annotation): + """ + Check if an annotation is a List or an Optional[List]. + + Args: + annotation: The type annotation to check. + + Returns: + bool: True if the annotation is a List or an Optional[List], False otherwise. + """ + origin = get_origin(annotation) + args = get_args(annotation) + + # Check for List[something] + if origin is list: + return True + # Check for Optional[List[something]] + if origin is Optional or origin is Union: + for a in args: + if get_origin(a) is list: + return True -def get_instance(model_type, df): + return False + + +def get_arg_of_list_or_optional_list(annotation): + """ + Check if an annotation is a List or an Optional[List]. + + Args: + annotation: The type annotation to check. + + Returns: + bool: True if the annotation is a List or an Optional[List], False otherwise. + """ + origin = get_origin(annotation) + args = get_args(annotation) + + # Check for List[something] + if origin is list: + return args[0] + + # Check for Optional[List[something]] + if origin is Optional or origin is Union: + for a in args: + if get_origin(a) is list: + return get_arg_of_list_or_optional_list(a) + + raise ValueError(f"Expected List annotation but got {annotation}") + + +def get_value(name, field, df, is_list=False): + if isinstance(field, type(BaseModel)): + print(f"BASE: {field}") + sub = get_relevant_sub_frame(field, df, name) + print(sub) + base_instance = get_instance(field, sub, is_list=is_list) + print("BASE INSTANCE: ", base_instance) + return base_instance + elif annotation_is_list_or_optional_list(field): + print("LIST", name, field) + sub_type = get_arg_of_list_or_optional_list(field) + vals = get_value(name, sub_type, df, is_list=True) + if is_list: + # we had a list of lists! + # vals = [json.loads(v.replace("'", '"')) for v in vals if v is not None else None] + vals = [json.loads(v.replace("'", '"')) if v is not None else None for v in vals] + return vals + else: + print(f"builtin: {name}") + sub = df.set_index(df.columns[0]) + if name in sub.index: + values = sub.loc[name].values + if is_list: + print(values) + return values + if len(values) > 0: + return values[0] + print(f"No values found for name = {name}, field = {field}") + if isinstance(field, type(str)): + warnings.warn( + f"Required string field '{name}' not found, setting to an empty string", + UserWarning, + ) + return "" + return None + + +def get_instance(model_type, df, is_list=False): objects = {k: v.annotation for k, v in model_type.model_fields.items()} - fields = objects.values() ret = {} for name, field in objects.items(): - if isinstance(field, type(BaseModel)): - print(f"BASE: {field}") - sub = get_relevant_sub_frame(field, df, name) - print(sub) - ret[name] = get_instance(field, sub) - print(ret[name]) - else: - print(f"builtin: {name}") - ret[name] = df.set_index(df.columns[0]).loc[name].values[0] - print(ret[name]) + ret[name] = get_value(name, field, df, is_list=is_list) print() - return model_type(**ret) + if is_list: + num_list_elements = set([len(v) for _, v in ret.items()]) + assert len(num_list_elements) == 1, ret + num_list_elements = num_list_elements.pop() + elements = [] + for i in range(num_list_elements): + sub = {k: v[i] for k, v in ret.items()} + if all([v is None for _, v in sub.items()]): + continue + elements.append(model_type(**sub)) + return elements + else: + for k, v in ret.items(): + if isinstance(v, list) or isinstance(v, np.ndarray): + ret[k] = [elem for elem in v if elem is not None] + print(ret) + return model_type(**ret) def excel_sheet_to_pydantic(filename: str, sheetname: str, model_type: Type[BaseModel]): df = pd.read_excel(filename, sheet_name=sheetname) + df = df.where(df.notnull(), None) try: df = get_relevant_sub_frame(model_type, df) except (KeyError, IndexError): pass return get_instance(model_type, df) - # objects = {k: v.annotation for k, v in model_type.model_fields.items()} - # fields = objects.values() - # ret = {} - # for k, v in objects.items(): - # ret[k] = instantiate_from_df(v, df) - # return model_type(**ret) diff --git a/pydantic_schemas/pydantic_to_excel.py b/pydantic_schemas/pydantic_to_excel.py index 0a1def0..9cfcb30 100644 --- a/pydantic_schemas/pydantic_to_excel.py +++ b/pydantic_schemas/pydantic_to_excel.py @@ -1,11 +1,14 @@ import os -from typing import Optional, Type +import warnings +from typing import Dict, List, Optional, Tuple, Type, Union, get_args, get_origin import pandas as pd from openpyxl import Workbook, load_workbook from openpyxl.styles import Font, PatternFill, Protection from pydantic import BaseModel +MAXCOL = 200 + def protect_and_shade_given_cell(sheet, row: int, col: int): grey_fill = PatternFill(start_color="DDDDDD", end_color="DDDDDD", fill_type="solid") @@ -15,7 +18,7 @@ def protect_and_shade_given_cell(sheet, row: int, col: int): def protect_and_shade_row(sheet, row: int, colmin: int = 1, colmax: Optional[int] = None): if colmax is None: - colmax = max(colmin, 27, sheet.max_column) + colmax = max(colmin, MAXCOL, sheet.max_column) for col in range(colmin, colmax): protect_and_shade_given_cell(sheet, row, col) @@ -31,7 +34,7 @@ def unprotect_cell(sheet, row, column): def unprotect_row(sheet, row, colmin: int, colmax: Optional[int] = None): if colmax is None: - colmax = max(colmin, 27, sheet.max_column) + colmax = max(colmin, MAXCOL, sheet.max_column) for col in range(colmin, colmax): unprotect_cell(sheet, row, col) @@ -201,10 +204,89 @@ def create_sheet_and_write_title(doc_filepath: str, sheet_name: str, sheet_title return 3 +def replace_row_with_multiple_rows(original_df, new_df, row_to_replace): + """ + Replace a specified row in the original DataFrame with multiple rows from the new DataFrame. + + Parameters: + original_df (pd.DataFrame): The original DataFrame. + new_df (pd.DataFrame): The new DataFrame with the rows to insert. + row_to_replace (str): The name of the row to be replaced. + + Returns: + pd.DataFrame: The updated DataFrame with the specified row replaced by the new rows. + """ + # Split the original DataFrame into two parts: before and after the row to be replaced + df_before = original_df.loc[:row_to_replace].iloc[:-1] + df_after = original_df.loc[row_to_replace:].drop(row_to_replace, axis=0) + + # Concatenate the parts with the new rows + df_replaced = pd.concat([df_before, new_df, df_after]) + df_replaced = df_replaced.dropna(how="all", axis=1) + return df_replaced + + +def is_list_annotation(ob: BaseModel, idx: str): + if idx in ob.model_fields and hasattr(ob.model_fields[idx], "annotation"): + annotation = ob.model_fields[idx].annotation + origin = get_origin(annotation) + args = get_args(annotation) + + # Check for List[something] + if origin is list and len(args) == 1: + return True + + # Check for Optional[List[something]] + if origin is Union and len(args) == 2 and type(None) in args: + inner_type = args[0] if args[1] is type(None) else args[1] + return get_origin(inner_type) is list + + # Check for Union[List[something], something] + if origin is Union and any(get_origin(arg) is list for arg in args): + return any(get_origin(arg) is list for arg in args) + + return False + + +def pydantic_to_dataframe(ob: BaseModel) -> Tuple[pd.DataFrame, List[int]]: + """ + Convert to a dataframe, identifying rows that are made of lists and exploding them over multiple rows with + hierarchical indices if needed. + + Returns the dataframe and also a list of the indexs (denoted by zero-based numbers) that are of list types. + The list of indexs is intended to be used for appropriately shading the excel sheet. + """ + ob_dict = ob.model_dump(mode="json") + df = pd.json_normalize(ob_dict).T + + list_indices = [] + i = 0 + for idx in df.index: + vals = df.loc[idx][0] + if isinstance(vals, list) or is_list_annotation(ob, idx): + if vals is not None and len(vals) > 0 and (isinstance(vals[0], BaseModel) or isinstance(vals[0], Dict)): + print("list of base models", vals[0]) + sub = pd.json_normalize(df.loc[idx].values[0]).reset_index(drop=True).T + sub.index = sub.index.map(lambda x: f"{idx}." + x) + df = replace_row_with_multiple_rows(df, sub, idx) + list_indices += list(range(i, i + len(sub))) + i += len(sub) + else: + print("list of builtins or else empty") + df = replace_row_with_multiple_rows(df, df.loc[idx].explode().to_frame().reset_index(drop=True).T, idx) + list_indices.append(i) + i += 1 + else: + i += 1 + + df.index = df.index.str.split(".", expand=True) + return df, list_indices + + def write_simple_pydantic_to_sheet(doc_filepath: str, sheet_name: str, ob: BaseModel, startrow: int, index_above=False): """ - Assumes a pydantic object made up of built in types or pydantic objects utimately made of built in types. - Do not use if the object or it's children contain Lists or Dicts or enums. + Assumes a pydantic object made up of built in types or pydantic objects utimately made of built in types or Lists. + Do not use if the object or it's children contain Dicts or enums. Starting from startrow, it writes the name of the pydantic object in the first column. It then writes the data starting in the row below and from the second column. @@ -252,9 +334,12 @@ class Simple(BaseModel): startrow = write_to_cell(doc_filepath, sheet_name, startrow, 1, ob.model_json_schema()["title"], isBold=True) startcol = 2 - ob_dict = ob.model_dump(mode="json") - df = pd.json_normalize(ob_dict).T - df.index = df.index.str.split(".", expand=True) + # ob_dict = ob.model_dump(mode="json") + # df = pd.json_normalize(ob_dict).T + # df, list_rows = explode_lists(df) + + # df.index = df.index.str.split(".", expand=True) + df, list_rows = pydantic_to_dataframe(ob=ob) index_levels = df.index.nlevels if index_above and index_levels > 1: warnings.warn( @@ -302,9 +387,12 @@ class Simple(BaseModel): cell = sheet.cell(r, col) cell.font = Font(bold=False) firstdatacol = startcol + index_levels - for r in range(startrow, startrow + rows): - unprotect_row(sheet, r, firstdatacol, colmax=firstdatacol + cols) - protect_and_shade_row(sheet, r, colmin=cols + firstdatacol) + for i, r in enumerate(range(startrow, startrow + rows)): + if i in list_rows: + unprotect_row(sheet, r, firstdatacol) + else: + unprotect_row(sheet, r, firstdatacol, colmax=firstdatacol + 1) + protect_and_shade_row(sheet, r, colmin=firstdatacol + 1) sheet.protection.enable() # Save the workbook diff --git a/pydantic_schemas/quick_start.py b/pydantic_schemas/quick_start.py index 4d10c79..b137f42 100644 --- a/pydantic_schemas/quick_start.py +++ b/pydantic_schemas/quick_start.py @@ -96,7 +96,8 @@ def _create_default_from_list_of_args( f"LIST OF ARGS: {args}, LIST OF TYPED ARGS: {typed_args}, LIST_OF_PYDANTIC_ARGS: {pydantic_args}", ) if len(typed_args): - print(indentation, "moving to _create_default_from_typing_annotation") + if debug: + print(indentation, "moving to _create_default_from_typing_annotation") # because dicts are more complicated than lists, we should default to dicts typed_dicts = _filter_list_for_condition(typed_args, lambda p: getattr(p, "__origin__", None) is dict) typed_lists = _filter_list_for_condition(typed_args, lambda p: getattr(p, "__origin__", None) is list) diff --git a/pydantic_schemas/tests/test_pydantic_to_excel.py b/pydantic_schemas/tests/test_pydantic_to_excel.py index a34d81b..e75afbe 100644 --- a/pydantic_schemas/tests/test_pydantic_to_excel.py +++ b/pydantic_schemas/tests/test_pydantic_to_excel.py @@ -1,3 +1,4 @@ +import os from enum import Enum from typing import Any, Dict, List, Optional, Union @@ -124,3 +125,208 @@ class ProductionAndCountries(BaseModel): parsed_outp = excel_sheet_to_pydantic(filename, sheetname, ProductionAndCountries) assert parsed_outp == inp + + +def test_optional_missing_deprecated_new_simple(tmpdir): + class Production(BaseModel): + idno: Optional[str] = None + title: Optional[str] = None + subtitle: Optional[str] = None + author: str + deprecatedFeature: str + + original_production = Production(idno="", subtitle=None, author="author", deprecatedFeature="toberemoved") + + filename = tmpdir.join(f"integration_test_optional_missing_deprecated_new_simple_.xlsx") + sheetname = "Document Metadata" + sheet_title = "Document Metadata" + + current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) + current_row = write_simple_pydantic_to_sheet(filename, sheetname, original_production, current_row + 1) + correct_column_widths(filename, sheet_name=sheetname) + shade_30_rows(filename, sheetname, current_row + 1) + shade_locked_cells(filename, sheetname) + + class Production(BaseModel): + idno: Optional[str] = None + title: Optional[str] = None + author: str + newFeature: Optional[str] = None + requiredNewFeature: str + + new_production = excel_sheet_to_pydantic(filename=filename, sheetname=sheetname, model_type=Production) + assert new_production.idno is None + assert new_production.title is None + assert new_production.author == "author" + assert new_production.newFeature is None + assert new_production.requiredNewFeature == "" + + +def test_optional_missing_deprecated_new_two_level(tmpdir): + class Production(BaseModel): + idno: Optional[str] = None + title: Optional[str] = None + subtitle: Optional[str] = None + author: str + deprecatedFeature: str + + class Country(BaseModel): + name: str + initials: str + + class ProductionAndCountries(BaseModel): + production: Production + countries: Country + + example_production = Production(idno="", subtitle=None, author="author", deprecatedFeature="toberemoved") + example_country = Country(name="MadeupCountry", initials="MC") + example_production_and_country = ProductionAndCountries(production=example_production, countries=example_country) + + filename = tmpdir.join(f"integration_test_optional_missing_deprecated_new_two_level_.xlsx") + sheetname = "Document Metadata" + sheet_title = "Document Metadata" + + current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) + current_row = write_nested_simple_pydantic_to_sheet( + filename, sheetname, example_production_and_country, current_row + 1 + ) + correct_column_widths(filename, sheet_name=sheetname) + shade_30_rows(filename, sheetname, current_row + 1) + shade_locked_cells(filename, sheetname) + + class Production(BaseModel): + idno: Optional[str] = None + title: Optional[str] = None + author: str + newFeature: Optional[str] = None + requiredNewFeature: str + + class NewTopLevel(BaseModel): + val1: str + val2: str + + class ProductionAndCountries(BaseModel): + production: Production + countries: Country + newTopLevelFeature: Optional[NewTopLevel] = None + + new_pandc = excel_sheet_to_pydantic(filename=filename, sheetname=sheetname, model_type=ProductionAndCountries) + assert new_pandc.production.idno is None + assert new_pandc.production.title is None + assert new_pandc.production.author == "author" + assert new_pandc.production.newFeature is None + assert new_pandc.production.requiredNewFeature == "" + assert new_pandc.countries.name == "MadeupCountry" + assert new_pandc.countries.initials == "MC" + + +def test_lists(tmpdir): + class Person(BaseModel): + name: str + affiliations: Optional[List[str]] = None + + class Production(BaseModel): + idno: Optional[str] = None + title: Optional[str] = None + authors: List[Person] + + class Country(BaseModel): + name: str + initials: str + + class ProductionAndCountries(BaseModel): + production: Production + countries: List[Country] + dates: List[str] + other: List[str] + otherOptional: Optional[List[str]] = None + + author0 = Person(name="person_0") + author1 = Person(name="person_1", affiliations=["Org1", "Org2"]) + author2 = Person(name="person_2") + author3 = Person(name="person_3", affiliations=["Org3"]) + example_production = Production(idno="", authors=[author0, author1, author2, author3]) + example_country = Country(name="MadeupCountry", initials="MC") + example_other_country = Country(name="MadeupCountry2", initials="MC2") + example_dates = ["April", "May", "June"] + example_production_and_country = ProductionAndCountries( + production=example_production, + countries=[example_country, example_other_country], + dates=["April", "May", "June"], + other=[], + otherOptional=None, + ) + + filename = tmpdir.join(f"integration_test_lists_.xlsx") + sheetname = "Document Metadata" + sheet_title = "Document Metadata" + + current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) + current_row = write_simple_pydantic_to_sheet(filename, sheetname, example_production_and_country, current_row + 1) + correct_column_widths(filename, sheet_name=sheetname) + shade_30_rows(filename, sheetname, current_row + 1) + shade_locked_cells(filename, sheetname) + new_pandc = excel_sheet_to_pydantic(filename=filename, sheetname=sheetname, model_type=ProductionAndCountries) + assert new_pandc.production.idno is None + assert new_pandc.production.title is None + assert len(new_pandc.production.authors) == 4 + assert author1 in new_pandc.production.authors + assert author1 in new_pandc.production.authors + assert author2 in new_pandc.production.authors + assert author3 in new_pandc.production.authors + assert len(new_pandc.countries) == 2 + assert example_country in new_pandc.countries + assert example_other_country in new_pandc.countries + assert new_pandc.dates == example_dates + assert new_pandc.other == [] + assert new_pandc.otherOptional is None or new_pandc.otherOptional == [] + + +def test_demo(): + filename = "demo_output.xlsx" + sheetname = "metadata" + sheet_title = "Formatting metadata examples" + + class SingleLevelData(BaseModel): + title: Optional[str] = None + author: str + + class Country(BaseModel): + name: str + initials: str + listOfAlternativeNames: Optional[List[str]] = None + + class Description(BaseModel): + statement: str + abstract: str + + class MultiLevelAndListData(BaseModel): + description: Description + countries: List[Country] + organization: str + + class MetaDataOfVariousHierarchies(BaseModel): + # idno: Optional[str] = None + single_level_data: SingleLevelData + multi_level_data: MultiLevelAndListData + + example = MetaDataOfVariousHierarchies( + single_level_data=SingleLevelData(title="Metadata demo", author="FirstName LastName"), + multi_level_data=MultiLevelAndListData( + description=Description(statement="Data can be hierarchical", abstract="Or it can be in lists"), + countries=[ + Country(name="MyCountry", initials="MC", listOfAlternativeNames=["Lists", "can have lists"]), + Country(name="YourCountry", initials="YC"), + ], + organization="Example Org", + ), + ) + + if os.path.exists(filename): + os.remove(filename) + + current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) + current_row = write_nested_simple_pydantic_to_sheet(filename, sheetname, example, current_row + 1) + correct_column_widths(filename, sheet_name=sheetname) + shade_30_rows(filename, sheetname, current_row + 1) + shade_locked_cells(filename, sheetname) From b7d32a872ccd0746243b813af17358c7c0cb2f86 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Mon, 22 Jul 2024 15:50:06 -0400 Subject: [PATCH 18/51] seperate out top level simple fields --- pydantic_schemas/excel_to_pydantic.py | 117 +++++++---------- pydantic_schemas/pydantic_to_excel.py | 120 ++++++++++-------- .../tests/test_pydantic_to_excel.py | 35 +++-- pydantic_schemas/utils.py | 74 +++++++++++ 4 files changed, 215 insertions(+), 131 deletions(-) create mode 100644 pydantic_schemas/utils.py diff --git a/pydantic_schemas/excel_to_pydantic.py b/pydantic_schemas/excel_to_pydantic.py index fc44cca..69d3d28 100644 --- a/pydantic_schemas/excel_to_pydantic.py +++ b/pydantic_schemas/excel_to_pydantic.py @@ -7,6 +7,13 @@ import pandas as pd from pydantic import BaseModel +from .utils import ( + annotation_contains_list, + get_subtype_of_optional_or_list, + is_list_annotation, + seperate_simple_from_pydantic, +) + def find_string_and_count_nans(arr, search_str): """ @@ -43,6 +50,9 @@ def is_horizontally_organized(m: Type[BaseModel], df: pd.DataFrame): elif cols == 1: return False + print("is_horizontally_organized is looking at ", m) + if is_list_annotation(m): + m = get_subtype_of_optional_or_list(m) expected_fields = m.model_json_schema()["properties"].keys() fields_if_horizontally_arranged = df.iloc[0, :].values fields_if_vertically_arranged = df.iloc[:, 0].values @@ -80,79 +90,29 @@ def get_relevant_sub_frame(m: Type[BaseModel], df: pd.DataFrame, name_of_field: sub = sub.dropna(how="all", axis=0) # drop all null rows sub = sub.dropna(how="all", axis=1) # drop all null columns + print("SubFrame = \n", sub) if is_horizontally_organized(m, sub): sub = sub.T return sub -def annotation_is_list_or_optional_list(annotation): - """ - Check if an annotation is a List or an Optional[List]. - - Args: - annotation: The type annotation to check. - - Returns: - bool: True if the annotation is a List or an Optional[List], False otherwise. - """ - origin = get_origin(annotation) - args = get_args(annotation) - - # Check for List[something] - if origin is list: - return True - - # Check for Optional[List[something]] - if origin is Optional or origin is Union: - for a in args: - if get_origin(a) is list: - return True - - return False - - -def get_arg_of_list_or_optional_list(annotation): - """ - Check if an annotation is a List or an Optional[List]. - - Args: - annotation: The type annotation to check. - - Returns: - bool: True if the annotation is a List or an Optional[List], False otherwise. - """ - origin = get_origin(annotation) - args = get_args(annotation) - - # Check for List[something] - if origin is list: - return args[0] - - # Check for Optional[List[something]] - if origin is Optional or origin is Union: - for a in args: - if get_origin(a) is list: - return get_arg_of_list_or_optional_list(a) - - raise ValueError(f"Expected List annotation but got {annotation}") - - -def get_value(name, field, df, is_list=False): - if isinstance(field, type(BaseModel)): - print(f"BASE: {field}") - sub = get_relevant_sub_frame(field, df, name) +def get_value(name, field_annotation, df, is_list=False): + if isinstance(field_annotation, type(BaseModel)): + print(f"BASE: {field_annotation}") + sub = get_relevant_sub_frame(field_annotation, df, name) print(sub) - base_instance = get_instance(field, sub, is_list=is_list) + base_instance = get_instance_of_pydantic(field_annotation, sub, is_list=is_list) print("BASE INSTANCE: ", base_instance) return base_instance - elif annotation_is_list_or_optional_list(field): - print("LIST", name, field) - sub_type = get_arg_of_list_or_optional_list(field) + elif annotation_contains_list(field_annotation): + print("LIST", name, field_annotation) + sub_type = get_subtype_of_optional_or_list(field_annotation) vals = get_value(name, sub_type, df, is_list=True) + print(f"vals in get_value of list: {vals}") if is_list: # we had a list of lists! - # vals = [json.loads(v.replace("'", '"')) for v in vals if v is not None else None] - vals = [json.loads(v.replace("'", '"')) if v is not None else None for v in vals] + vals = [json.loads(v.replace("'", '"')) if isinstance(v, str) else v for v in vals] + return vals else: print(f"builtin: {name}") @@ -164,8 +124,8 @@ def get_value(name, field, df, is_list=False): return values if len(values) > 0: return values[0] - print(f"No values found for name = {name}, field = {field}") - if isinstance(field, type(str)): + print(f"No values found for name = {name}, field annotation = {field_annotation}") + if isinstance(field_annotation, type(str)): warnings.warn( f"Required string field '{name}' not found, setting to an empty string", UserWarning, @@ -174,13 +134,14 @@ def get_value(name, field, df, is_list=False): return None -def get_instance(model_type, df, is_list=False): +def get_instance_of_pydantic(model_type: Type[BaseModel], df, is_list=False): objects = {k: v.annotation for k, v in model_type.model_fields.items()} ret = {} for name, field in objects.items(): ret[name] = get_value(name, field, df, is_list=is_list) - print() + print(f"for {name} got {ret[name]}") if is_list: + print(f"Making a list of pydantic objects from {ret}") num_list_elements = set([len(v) for _, v in ret.items()]) assert len(num_list_elements) == 1, ret num_list_elements = num_list_elements.pop() @@ -200,10 +161,30 @@ def get_instance(model_type, df, is_list=False): def excel_sheet_to_pydantic(filename: str, sheetname: str, model_type: Type[BaseModel]): - df = pd.read_excel(filename, sheet_name=sheetname) + df = pd.read_excel(filename, sheet_name=sheetname, header=None) df = df.where(df.notnull(), None) try: df = get_relevant_sub_frame(model_type, df) except (KeyError, IndexError): pass - return get_instance(model_type, df) + children = seperate_simple_from_pydantic(model_type) + ret = {} + if len(children["simple"]): + sub = get_relevant_sub_frame(model_type, df, name_of_field=df.iloc[0, 0]) + for name in children["simple"]: + print(f"Looking to get {name}") + field = model_type.model_fields[name] + ret[name] = get_value(name, field.annotation, sub) + print() + for name in children["pydantic"]: + print(f"Looking to get {name}") + # sub = get_relevant_sub_frame(model_type.model_fields[name].annotation, df, name_of_field = name) + # ret[name] = get_instance_of_pydantic(model_type.model_fields[name].annotation, sub) + ret[name] = get_value(name, model_type.model_fields[name].annotation, df) + print() + for k, v in ret.items(): + if isinstance(v, list) or isinstance(v, np.ndarray): + ret[k] = [elem for elem in v if elem is not None] + print(ret) + + return model_type(**ret) diff --git a/pydantic_schemas/pydantic_to_excel.py b/pydantic_schemas/pydantic_to_excel.py index 9cfcb30..15eea53 100644 --- a/pydantic_schemas/pydantic_to_excel.py +++ b/pydantic_schemas/pydantic_to_excel.py @@ -1,12 +1,22 @@ +import builtins import os +import typing import warnings -from typing import Dict, List, Optional, Tuple, Type, Union, get_args, get_origin +from typing import Any, Dict, List, Optional, Tuple, Type, Union, get_args, get_origin import pandas as pd from openpyxl import Workbook, load_workbook from openpyxl.styles import Font, PatternFill, Protection from pydantic import BaseModel +from .utils import ( + annotation_contains_list, + get_subtype_of_optional_or_list, + is_list_annotation, + is_optional_annotation, + seperate_simple_from_pydantic, +) + MAXCOL = 200 @@ -226,29 +236,7 @@ def replace_row_with_multiple_rows(original_df, new_df, row_to_replace): return df_replaced -def is_list_annotation(ob: BaseModel, idx: str): - if idx in ob.model_fields and hasattr(ob.model_fields[idx], "annotation"): - annotation = ob.model_fields[idx].annotation - origin = get_origin(annotation) - args = get_args(annotation) - - # Check for List[something] - if origin is list and len(args) == 1: - return True - - # Check for Optional[List[something]] - if origin is Union and len(args) == 2 and type(None) in args: - inner_type = args[0] if args[1] is type(None) else args[1] - return get_origin(inner_type) is list - - # Check for Union[List[something], something] - if origin is Union and any(get_origin(arg) is list for arg in args): - return any(get_origin(arg) is list for arg in args) - - return False - - -def pydantic_to_dataframe(ob: BaseModel) -> Tuple[pd.DataFrame, List[int]]: +def pydantic_to_dataframe(ob: Union[BaseModel, Dict, List[Dict]]) -> Tuple[pd.DataFrame, List[int]]: """ Convert to a dataframe, identifying rows that are made of lists and exploding them over multiple rows with hierarchical indices if needed. @@ -256,34 +244,51 @@ def pydantic_to_dataframe(ob: BaseModel) -> Tuple[pd.DataFrame, List[int]]: Returns the dataframe and also a list of the indexs (denoted by zero-based numbers) that are of list types. The list of indexs is intended to be used for appropriately shading the excel sheet. """ - ob_dict = ob.model_dump(mode="json") + if isinstance(ob, BaseModel): + ob_dict = ob.model_dump(mode="json") + else: + ob_dict = ob df = pd.json_normalize(ob_dict).T - + print(df) list_indices = [] - i = 0 - for idx in df.index: - vals = df.loc[idx][0] - if isinstance(vals, list) or is_list_annotation(ob, idx): - if vals is not None and len(vals) > 0 and (isinstance(vals[0], BaseModel) or isinstance(vals[0], Dict)): - print("list of base models", vals[0]) - sub = pd.json_normalize(df.loc[idx].values[0]).reset_index(drop=True).T - sub.index = sub.index.map(lambda x: f"{idx}." + x) - df = replace_row_with_multiple_rows(df, sub, idx) - list_indices += list(range(i, i + len(sub))) - i += len(sub) + if isinstance(ob, list): + list_indices = list(range(len(df))) + else: + i = 0 + for idx in df.index: + vals = df.loc[idx][0] + if isinstance(vals, list) or (hasattr(ob, "annotation") and annotation_contains_list(ob.annotation)): + if vals is not None and len(vals) > 0 and (isinstance(vals[0], BaseModel) or isinstance(vals[0], Dict)): + print("list of base models", vals[0]) + sub = pd.json_normalize(df.loc[idx].values[0]).reset_index(drop=True).T + sub.index = sub.index.map(lambda x: f"{idx}." + x) + df = replace_row_with_multiple_rows(df, sub, idx) + list_indices += list(range(i, i + len(sub))) + i += len(sub) + else: + print("list of builtins or else empty") + df = replace_row_with_multiple_rows( + df, df.loc[idx].explode().to_frame().reset_index(drop=True).T, idx + ) + list_indices.append(i) + i += 1 else: - print("list of builtins or else empty") - df = replace_row_with_multiple_rows(df, df.loc[idx].explode().to_frame().reset_index(drop=True).T, idx) - list_indices.append(i) i += 1 - else: - i += 1 - - df.index = df.index.str.split(".", expand=True) + print(df) + if len(df): + df.index = df.index.str.split(".", expand=True) return df, list_indices -def write_simple_pydantic_to_sheet(doc_filepath: str, sheet_name: str, ob: BaseModel, startrow: int, index_above=False): +def write_simple_pydantic_to_sheet( + doc_filepath: str, + sheet_name: str, + ob: BaseModel, + startrow: int, + index_above=False, + write_title=True, + title: Optional[str] = None, +): """ Assumes a pydantic object made up of built in types or pydantic objects utimately made of built in types or Lists. Do not use if the object or it's children contain Dicts or enums. @@ -331,14 +336,12 @@ class Simple(BaseModel): Returns: int: index of next row below the final written row """ - startrow = write_to_cell(doc_filepath, sheet_name, startrow, 1, ob.model_json_schema()["title"], isBold=True) + if write_title: + if title is None: + title = ob.model_json_schema()["title"] + startrow = write_to_cell(doc_filepath, sheet_name, startrow, 1, title, isBold=True) startcol = 2 - # ob_dict = ob.model_dump(mode="json") - # df = pd.json_normalize(ob_dict).T - # df, list_rows = explode_lists(df) - - # df.index = df.index.str.split(".", expand=True) df, list_rows = pydantic_to_dataframe(ob=ob) index_levels = df.index.nlevels if index_above and index_levels > 1: @@ -407,10 +410,19 @@ def write_nested_simple_pydantic_to_sheet( """ Assumes the pydantic object is made up only of other pydantic objects that are themselves made up only of built in types """ - for mfield, _ in ob.model_fields.items(): - child = getattr(ob, mfield) + print(ob) + children = seperate_simple_from_pydantic(ob) + print(children["simple"]) + if len(children["simple"]): + simple_children = {k: getattr(ob, k) for k in children["simple"]} + startrow = write_simple_pydantic_to_sheet( + doc_filepath, sheet_name, simple_children, startrow, index_above=False, write_title=False + ) + print("Done with simple children, now nesting pydantic objects") + for mfield in children["pydantic"]: + field = ob.model_dump(mode="json")[mfield] startrow = write_simple_pydantic_to_sheet( - doc_filepath, sheet_name, child, startrow + 1, index_above=index_above + doc_filepath, sheet_name, field, startrow + 2, index_above=index_above, title=mfield ) return startrow diff --git a/pydantic_schemas/tests/test_pydantic_to_excel.py b/pydantic_schemas/tests/test_pydantic_to_excel.py index e75afbe..01f8154 100644 --- a/pydantic_schemas/tests/test_pydantic_to_excel.py +++ b/pydantic_schemas/tests/test_pydantic_to_excel.py @@ -6,7 +6,7 @@ import pytest from pydantic import BaseModel, Field -from ..excel_to_pydantic import excel_sheet_to_pydantic, get_instance +from ..excel_to_pydantic import excel_sheet_to_pydantic from ..pydantic_to_excel import ( correct_column_widths, create_sheet_and_write_title, @@ -31,7 +31,7 @@ class Simple(BaseModel): sheet_title = "Document Metadata" current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) - current_row = write_simple_pydantic_to_sheet( + current_row = write_nested_simple_pydantic_to_sheet( filename, sheetname, simple_original, current_row + 1, index_above=index_above ) correct_column_widths(filename, sheetname) @@ -39,7 +39,7 @@ class Simple(BaseModel): shade_locked_cells(filename, sheetname) parsed_simple = excel_sheet_to_pydantic(filename, sheetname, Simple) - assert parsed_simple == simple_original + assert parsed_simple == simple_original, parsed_simple @pytest.mark.parametrize("index_above", [True, False]) @@ -102,6 +102,9 @@ class ProductionAndCountries(BaseModel): production: Production countries: Country series_description: SeriesDescription + idno: str + title: Optional[str] = None + subtitle: Optional[str] = None series_description = SeriesDescription( language=Language(name="English", code="EN"), topic=Topic(id="topic1", name="topic1") @@ -111,6 +114,8 @@ class ProductionAndCountries(BaseModel): production=Production(idno="AVal", title="BVal", author="CVal"), countries=Country(name="MyCountry", initials="MC"), series_description=series_description, + idno="example_idno", + title="example_title", ) filename = tmpdir.join(f"integration_test_multilayer_simple_schema_.xlsx") @@ -124,7 +129,7 @@ class ProductionAndCountries(BaseModel): shade_locked_cells(filename, sheetname) parsed_outp = excel_sheet_to_pydantic(filename, sheetname, ProductionAndCountries) - assert parsed_outp == inp + assert parsed_outp == inp, parsed_outp def test_optional_missing_deprecated_new_simple(tmpdir): @@ -142,7 +147,7 @@ class Production(BaseModel): sheet_title = "Document Metadata" current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) - current_row = write_simple_pydantic_to_sheet(filename, sheetname, original_production, current_row + 1) + current_row = write_nested_simple_pydantic_to_sheet(filename, sheetname, original_production, current_row + 1) correct_column_widths(filename, sheet_name=sheetname) shade_30_rows(filename, sheetname, current_row + 1) shade_locked_cells(filename, sheetname) @@ -262,7 +267,9 @@ class ProductionAndCountries(BaseModel): sheet_title = "Document Metadata" current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) - current_row = write_simple_pydantic_to_sheet(filename, sheetname, example_production_and_country, current_row + 1) + current_row = write_nested_simple_pydantic_to_sheet( + filename, sheetname, example_production_and_country, current_row + 1 + ) correct_column_widths(filename, sheet_name=sheetname) shade_30_rows(filename, sheetname, current_row + 1) shade_locked_cells(filename, sheetname) @@ -294,7 +301,7 @@ class SingleLevelData(BaseModel): class Country(BaseModel): name: str initials: str - listOfAlternativeNames: Optional[List[str]] = None + list_of_alternative_names: Optional[List[str]] = None class Description(BaseModel): statement: str @@ -305,21 +312,31 @@ class MultiLevelAndListData(BaseModel): countries: List[Country] organization: str + class SubObject(BaseModel): + a: str + b: str + class MetaDataOfVariousHierarchies(BaseModel): - # idno: Optional[str] = None + idno: Optional[str] = None + database_name: Optional[str] = None single_level_data: SingleLevelData multi_level_data: MultiLevelAndListData + top_level_list: List[str] + top_level_optional_list: Optional[List[str]] = None + top_level_list_of_pydantic_objects: List[SubObject] example = MetaDataOfVariousHierarchies( single_level_data=SingleLevelData(title="Metadata demo", author="FirstName LastName"), multi_level_data=MultiLevelAndListData( description=Description(statement="Data can be hierarchical", abstract="Or it can be in lists"), countries=[ - Country(name="MyCountry", initials="MC", listOfAlternativeNames=["Lists", "can have lists"]), + Country(name="MyCountry", initials="MC", list_of_alternative_names=["Lists", "can have lists"]), Country(name="YourCountry", initials="YC"), ], organization="Example Org", ), + top_level_list=["a", "b"], + top_level_list_of_pydantic_objects=[SubObject(a="a", b="b")], ) if os.path.exists(filename): diff --git a/pydantic_schemas/utils.py b/pydantic_schemas/utils.py new file mode 100644 index 0000000..c64161b --- /dev/null +++ b/pydantic_schemas/utils.py @@ -0,0 +1,74 @@ +import typing +from typing import Any, Dict, Optional, Union, get_args, get_origin + +from pydantic import BaseModel + + +def is_optional_annotation(anno: typing._UnionGenericAlias) -> bool: + return type(None) in typing.get_args(anno) + + +def is_union_annotation(anno: typing._UnionGenericAlias) -> bool: + # return len(typing.get_args(anno))>=2 + origin = get_origin(anno) + return origin in [Optional, Union] + + +def is_dict_annotation(anno: typing._UnionGenericAlias) -> bool: + return typing.get_origin(anno) is dict + + +def is_list_annotation(anno: typing._UnionGenericAlias) -> bool: + return typing.get_origin(anno) is list + + +def get_subtype_of_optional_or_list(anno: typing._UnionGenericAlias) -> Any: + args = typing.get_args(anno) + for a in args: + print(f"getting subtype {a}, is it None?={isinstance(a, type(None))}") + args = [a for a in args if not a is type(None)] + if len(args) > 1: + raise ValueError(f"Too many sub types: {args}") + arg = args[0] + if hasattr(arg, "annotation"): + if is_list_annotation(arg.annotation): + return get_subtype_of_optional_or_list(arg.annotation) + else: + raise NotYetImplementedError("Only optional lists and optional builtin types implemented") + return arg + + +def annotation_contains_pydantic(anno: typing._UnionGenericAlias) -> bool: + if isinstance(anno, type(BaseModel)): + return True + elif is_optional_annotation(anno) or is_list_annotation(anno): + subtype = get_subtype_of_optional_or_list(anno) + return isinstance(subtype, type(BaseModel)) + else: + return False + + +def annotation_contains_list(anno: typing._UnionGenericAlias) -> bool: + if is_list_annotation(anno): + return True + elif is_union_annotation(anno): + args = typing.get_args(anno) + args = [a for a in args if not a is type(None)] + for a in args: + if is_list_annotation(a): + return True + return False + + +def seperate_simple_from_pydantic(ob: BaseModel) -> Dict[str, Dict]: + """ + Returns a dictionary of lists of field names that are either of other pydantic types or of other types + """ + simple_children = [] + pydantic_children = [] + for mfield, field_info in ob.model_fields.items(): + if annotation_contains_pydantic(field_info.annotation): + pydantic_children.append(mfield) + else: + simple_children.append(mfield) + return {"simple": simple_children, "pydantic": pydantic_children} From 131def17841cd6f90390a486a62a8a4efd350529 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Tue, 23 Jul 2024 10:36:21 -0400 Subject: [PATCH 19/51] write metadata over many sheets --- pydantic_schemas/pydantic_to_excel.py | 81 +++++++++++++++++-- .../tests/test_pydantic_to_excel.py | 48 ++++++++++- pydantic_schemas/utils.py | 29 ++++++- 3 files changed, 146 insertions(+), 12 deletions(-) diff --git a/pydantic_schemas/pydantic_to_excel.py b/pydantic_schemas/pydantic_to_excel.py index 15eea53..a316479 100644 --- a/pydantic_schemas/pydantic_to_excel.py +++ b/pydantic_schemas/pydantic_to_excel.py @@ -15,6 +15,7 @@ is_list_annotation, is_optional_annotation, seperate_simple_from_pydantic, + subset_pydantic_model, ) MAXCOL = 200 @@ -236,7 +237,9 @@ def replace_row_with_multiple_rows(original_df, new_df, row_to_replace): return df_replaced -def pydantic_to_dataframe(ob: Union[BaseModel, Dict, List[Dict]]) -> Tuple[pd.DataFrame, List[int]]: +def pydantic_to_dataframe( + ob: Union[BaseModel, Dict, List[Dict]], annotations: Optional[Dict[str, typing._UnionGenericAlias]] = None +) -> Tuple[pd.DataFrame, List[int]]: """ Convert to a dataframe, identifying rows that are made of lists and exploding them over multiple rows with hierarchical indices if needed. @@ -249,6 +252,7 @@ def pydantic_to_dataframe(ob: Union[BaseModel, Dict, List[Dict]]) -> Tuple[pd.Da else: ob_dict = ob df = pd.json_normalize(ob_dict).T + print("pydantic_to_dataframe") print(df) list_indices = [] if isinstance(ob, list): @@ -257,7 +261,12 @@ def pydantic_to_dataframe(ob: Union[BaseModel, Dict, List[Dict]]) -> Tuple[pd.Da i = 0 for idx in df.index: vals = df.loc[idx][0] - if isinstance(vals, list) or (hasattr(ob, "annotation") and annotation_contains_list(ob.annotation)): + field = ob_dict[idx.split(".")[0]] + if ( + isinstance(vals, list) + or (annotations is not None and annotation_contains_list(annotations[idx.split(".")[0]])) + or (hasattr(field, "annotation") and annotation_contains_list(field.annotation)) + ): # (hasattr(ob, "annotation") and annotation_contains_list(ob.annotation)): if vals is not None and len(vals) > 0 and (isinstance(vals[0], BaseModel) or isinstance(vals[0], Dict)): print("list of base models", vals[0]) sub = pd.json_normalize(df.loc[idx].values[0]).reset_index(drop=True).T @@ -288,6 +297,7 @@ def write_simple_pydantic_to_sheet( index_above=False, write_title=True, title: Optional[str] = None, + annotations=None, ): """ Assumes a pydantic object made up of built in types or pydantic objects utimately made of built in types or Lists. @@ -342,7 +352,7 @@ class Simple(BaseModel): startrow = write_to_cell(doc_filepath, sheet_name, startrow, 1, title, isBold=True) startcol = 2 - df, list_rows = pydantic_to_dataframe(ob=ob) + df, list_rows = pydantic_to_dataframe(ob=ob, annotations=annotations) index_levels = df.index.nlevels if index_above and index_levels > 1: warnings.warn( @@ -383,6 +393,7 @@ class Simple(BaseModel): for r in range(startrow + 1, startrow + rows + 1): unprotect_row(sheet, r, startcol, colmax=startcol + cols) protect_and_shade_row(sheet, r, colmin=startcol + cols) + next_row = startrow + rows + 2 else: for col in range(startcol, startcol + index_levels): protect_and_shade_col(sheet, col, startrow, startrow + rows) @@ -396,16 +407,17 @@ class Simple(BaseModel): else: unprotect_row(sheet, r, firstdatacol, colmax=firstdatacol + 1) protect_and_shade_row(sheet, r, colmin=firstdatacol + 1) + next_row = startrow + rows sheet.protection.enable() # Save the workbook workbook.save(doc_filepath) - return startrow + rows + return next_row def write_nested_simple_pydantic_to_sheet( - doc_filepath: str, sheet_name: str, ob: BaseModel, startrow: int, index_above=False + doc_filepath: str, sheet_name: str, ob: BaseModel, startrow: int, index_above=False, write_title=True ): """ Assumes the pydantic object is made up only of other pydantic objects that are themselves made up only of built in types @@ -414,15 +426,68 @@ def write_nested_simple_pydantic_to_sheet( children = seperate_simple_from_pydantic(ob) print(children["simple"]) if len(children["simple"]): - simple_children = {k: getattr(ob, k) for k in children["simple"]} + child_object = subset_pydantic_model(ob, children["simple"]) startrow = write_simple_pydantic_to_sheet( - doc_filepath, sheet_name, simple_children, startrow, index_above=False, write_title=False + doc_filepath, + sheet_name, + child_object, + startrow, + index_above=False, + write_title=False, + annotations={k: v.annotation for k, v in child_object.model_fields.items()}, ) print("Done with simple children, now nesting pydantic objects") + if write_title: + startrow = startrow + 2 for mfield in children["pydantic"]: field = ob.model_dump(mode="json")[mfield] + print(f"write_nested_simple_pydantic_to_sheet::428, field={field}") startrow = write_simple_pydantic_to_sheet( - doc_filepath, sheet_name, field, startrow + 2, index_above=index_above, title=mfield + doc_filepath, sheet_name, field, startrow, index_above=index_above, title=mfield, write_title=write_title ) return startrow + + +def write_across_many_sheets(doc_filepath: str, ob: BaseModel, title: Optional[str] = None): + children = seperate_simple_from_pydantic(ob) + sheet_number = 0 + if len(children["simple"]): + if title is not None: + title += " Metadata" + else: + title = "Metadata" + sheet_name = "metadata" + current_row = create_sheet_and_write_title(doc_filepath, sheet_name, f"{title}", sheet_number=sheet_number) + child_object = subset_pydantic_model(ob, children["simple"]) + current_row = write_simple_pydantic_to_sheet( + doc_filepath, + sheet_name, + child_object, + current_row + 1, + index_above=False, + write_title=False, + annotations={k: v.annotation for k, v in child_object.model_fields.items()}, + ) + correct_column_widths(doc_filepath, sheet_name=sheet_name) + shade_30_rows(doc_filepath, sheet_name, current_row + 1) + shade_locked_cells(doc_filepath, sheet_name) + sheet_number += 1 + + for fieldname in children["pydantic"]: + print(f"\n\n{fieldname}\n") + current_row = create_sheet_and_write_title(doc_filepath, fieldname, fieldname, sheet_number=sheet_number) + field = getattr(ob, fieldname) + if not isinstance(field, BaseModel): + field = subset_pydantic_model(ob, [fieldname], name=fieldname) + write_title = False + else: + write_title = True + + current_row = write_nested_simple_pydantic_to_sheet( + doc_filepath, fieldname, field, current_row + 1, write_title=write_title + ) + correct_column_widths(doc_filepath, sheet_name=fieldname) + shade_30_rows(doc_filepath, fieldname, current_row + 1) + shade_locked_cells(doc_filepath, fieldname) + sheet_number += 1 diff --git a/pydantic_schemas/tests/test_pydantic_to_excel.py b/pydantic_schemas/tests/test_pydantic_to_excel.py index 01f8154..1724530 100644 --- a/pydantic_schemas/tests/test_pydantic_to_excel.py +++ b/pydantic_schemas/tests/test_pydantic_to_excel.py @@ -12,6 +12,7 @@ create_sheet_and_write_title, shade_30_rows, shade_locked_cells, + write_across_many_sheets, write_nested_simple_pydantic_to_sheet, write_simple_pydantic_to_sheet, ) @@ -63,6 +64,7 @@ class ProductionAndCountries(BaseModel): ) filename = tmpdir.join(f"integration_test_two_layer_simple_schema_{index_above}.xlsx") + # filename = "GORDON_twolayer.xlsx" sheetname = "Document Metadata" sheet_title = "Document Metadata" current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) @@ -73,7 +75,7 @@ class ProductionAndCountries(BaseModel): shade_locked_cells(filename, sheetname) parsed_outp = excel_sheet_to_pydantic(filename, sheetname, ProductionAndCountries) - assert parsed_outp == inp + assert parsed_outp == inp, parsed_outp def test_multilayer_simple_schema(tmpdir): @@ -289,6 +291,50 @@ class ProductionAndCountries(BaseModel): assert new_pandc.otherOptional is None or new_pandc.otherOptional == [] +def test_metadata_over_several_sheets(tmpdir): + class Person(BaseModel): + name: str + affiliations: Optional[List[str]] = None + + class Production(BaseModel): + idno: Optional[str] = None + title: Optional[str] = None + authors: List[Person] + + class Country(BaseModel): + name: str + initials: str + + class ProductionAndCountries(BaseModel): + production: Production + countries: List[Country] + dates: List[str] + other: List[str] + otherOptional: Optional[List[str]] = None + single_val: str + + author0 = Person(name="person_0") + author1 = Person(name="person_1", affiliations=["Org1", "Org2"]) + author2 = Person(name="person_2") + author3 = Person(name="person_3", affiliations=["Org3"]) + example_production = Production(idno="myidno", authors=[author0, author1, author2, author3]) + example_country = Country(name="MadeupCountry", initials="MC") + example_other_country = Country(name="MadeupCountry2", initials="MC2") + example_dates = ["April", "May", "June"] + example_production_and_country = ProductionAndCountries( + production=example_production, + countries=[example_country, example_other_country], + dates=example_dates, + other=["12"], + otherOptional=None, + single_val="single", + ) + + filename = tmpdir.join(f"integration_test_optional_missing_deprecated_new_two_level_.xlsx") + title = "Example" + write_across_many_sheets(filename, example_production_and_country, title) + + def test_demo(): filename = "demo_output.xlsx" sheetname = "metadata" diff --git a/pydantic_schemas/utils.py b/pydantic_schemas/utils.py index c64161b..4aa6d17 100644 --- a/pydantic_schemas/utils.py +++ b/pydantic_schemas/utils.py @@ -1,7 +1,7 @@ import typing -from typing import Any, Dict, Optional, Union, get_args, get_origin +from typing import Any, Dict, List, Optional, Union, get_args, get_origin -from pydantic import BaseModel +from pydantic import BaseModel, create_model def is_optional_annotation(anno: typing._UnionGenericAlias) -> bool: @@ -34,7 +34,7 @@ def get_subtype_of_optional_or_list(anno: typing._UnionGenericAlias) -> Any: if is_list_annotation(arg.annotation): return get_subtype_of_optional_or_list(arg.annotation) else: - raise NotYetImplementedError("Only optional lists and optional builtin types implemented") + raise NotImplementedError("Only optional lists and optional builtin types implemented") return arg @@ -72,3 +72,26 @@ def seperate_simple_from_pydantic(ob: BaseModel) -> Dict[str, Dict]: else: simple_children.append(mfield) return {"simple": simple_children, "pydantic": pydantic_children} + + +def subset_pydantic_model(model: BaseModel, feature_names: List[str], name: Optional[str] = None) -> BaseModel: + """ + Create a new Pydantic model with only the specified subset of features. + + :param model: The original Pydantic model object. + :param feature_names: List of feature names to include in the new model. + :return: A new Pydantic model instance with the specified features and values inherited from the original model + """ + # Filter the fields of the original model based on the feature names + fields = { + name: (model.model_fields[name].annotation, model.model_fields[name].default) + for name in feature_names + if name in model.model_fields + } + + # Create a new Pydantic model with the filtered fields + if name is None: + name = "SubsetModel" + SubModel = create_model(name, **fields) + + return SubModel(**{k: v for k, v in model.model_dump().items() if k in feature_names}) From 87ed4b13d3628687788587aa1283198e6af8069c Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Tue, 23 Jul 2024 11:40:11 -0400 Subject: [PATCH 20/51] read metadata written over many sheets --- pydantic_schemas/excel_to_pydantic.py | 24 ++++++++++- pydantic_schemas/pydantic_to_excel.py | 40 ++++++++++--------- .../tests/test_pydantic_to_excel.py | 18 ++++++++- pydantic_schemas/utils.py | 18 ++++++--- 4 files changed, 72 insertions(+), 28 deletions(-) diff --git a/pydantic_schemas/excel_to_pydantic.py b/pydantic_schemas/excel_to_pydantic.py index 69d3d28..a2753c2 100644 --- a/pydantic_schemas/excel_to_pydantic.py +++ b/pydantic_schemas/excel_to_pydantic.py @@ -12,6 +12,7 @@ get_subtype_of_optional_or_list, is_list_annotation, seperate_simple_from_pydantic, + subset_pydantic_model_type, ) @@ -178,8 +179,6 @@ def excel_sheet_to_pydantic(filename: str, sheetname: str, model_type: Type[Base print() for name in children["pydantic"]: print(f"Looking to get {name}") - # sub = get_relevant_sub_frame(model_type.model_fields[name].annotation, df, name_of_field = name) - # ret[name] = get_instance_of_pydantic(model_type.model_fields[name].annotation, sub) ret[name] = get_value(name, model_type.model_fields[name].annotation, df) print() for k, v in ret.items(): @@ -188,3 +187,24 @@ def excel_sheet_to_pydantic(filename: str, sheetname: str, model_type: Type[Base print(ret) return model_type(**ret) + + +def excel_doc_to_pydantic(filename, model_type): + children = seperate_simple_from_pydantic(model_type) + annotations = {k: v.annotation for k, v in model_type.model_fields.items()} + ret = {} + + if len(children["simple"]) > 0: + field_type = subset_pydantic_model_type(model_type, children["simple"]) + toplevel = excel_sheet_to_pydantic(filename, sheetname="metadata", model_type=field_type) + ret.update(toplevel.model_dump()) + for fieldname in children["pydantic"]: + print(f"Looking to get {fieldname}") + field_type = annotations[fieldname] + if isinstance(field_type, type(BaseModel)): + ret[fieldname] = excel_sheet_to_pydantic(filename, sheetname=fieldname, model_type=field_type) + else: + field_type = subset_pydantic_model_type(model_type, [fieldname]) + sublevel = excel_sheet_to_pydantic(filename, sheetname=fieldname, model_type=field_type) + ret.update(sublevel.model_dump()) + return model_type(**ret) diff --git a/pydantic_schemas/pydantic_to_excel.py b/pydantic_schemas/pydantic_to_excel.py index a316479..0b3daaf 100644 --- a/pydantic_schemas/pydantic_to_excel.py +++ b/pydantic_schemas/pydantic_to_excel.py @@ -154,7 +154,9 @@ def write_to_cell(filename: str, sheet_name: str, row: int, col: int, text: str, return row + 1 -def create_sheet_and_write_title(doc_filepath: str, sheet_name: str, sheet_title: str, sheet_number: int = 0): +def create_sheet_and_write_title( + doc_filepath: str, sheet_name: str, sheet_title: Optional[str] = None, sheet_number: int = 0 +): """ In the given excel document, creates a new sheet called sheet_name and in the top left cell writes in sheet_title in bold. @@ -193,14 +195,15 @@ def create_sheet_and_write_title(doc_filepath: str, sheet_name: str, sheet_title # Create a new sheet new_sheet = workbook.create_sheet(title=sheet_name) - # Write the title in bold in the top left cell (A1) - bold_font = Font(bold=True, size=14) - new_sheet["A1"] = sheet_title - new_sheet["A1"].font = bold_font + if sheet_title is not None: + # Write the title in bold in the top left cell (A1) + bold_font = Font(bold=True, size=14) + new_sheet["A1"] = sheet_title + new_sheet["A1"].font = bold_font - # Shade the background of the cells in the first 2 rows grey and lock them - for row in range(1, 3): - protect_and_shade_row(new_sheet, row) + # Shade the background of the cells in the first 2 rows grey and lock them + for row in range(1, 3): + protect_and_shade_row(new_sheet, row) # Determine the position to insert the new sheet total_sheets = len(workbook.sheetnames) @@ -212,7 +215,10 @@ def create_sheet_and_write_title(doc_filepath: str, sheet_name: str, sheet_title # Save the workbook workbook.save(doc_filepath) - return 3 + if sheet_title is not None: + return 3 + else: + return 0 def replace_row_with_multiple_rows(original_df, new_df, row_to_replace): @@ -417,7 +423,7 @@ class Simple(BaseModel): def write_nested_simple_pydantic_to_sheet( - doc_filepath: str, sheet_name: str, ob: BaseModel, startrow: int, index_above=False, write_title=True + doc_filepath: str, sheet_name: str, ob: BaseModel, startrow: int, index_above=False ): """ Assumes the pydantic object is made up only of other pydantic objects that are themselves made up only of built in types @@ -437,13 +443,11 @@ def write_nested_simple_pydantic_to_sheet( annotations={k: v.annotation for k, v in child_object.model_fields.items()}, ) print("Done with simple children, now nesting pydantic objects") - if write_title: - startrow = startrow + 2 for mfield in children["pydantic"]: field = ob.model_dump(mode="json")[mfield] print(f"write_nested_simple_pydantic_to_sheet::428, field={field}") startrow = write_simple_pydantic_to_sheet( - doc_filepath, sheet_name, field, startrow, index_above=index_above, title=mfield, write_title=write_title + doc_filepath, sheet_name, field, startrow, index_above=index_above, title=mfield ) return startrow @@ -476,17 +480,15 @@ def write_across_many_sheets(doc_filepath: str, ob: BaseModel, title: Optional[s for fieldname in children["pydantic"]: print(f"\n\n{fieldname}\n") - current_row = create_sheet_and_write_title(doc_filepath, fieldname, fieldname, sheet_number=sheet_number) field = getattr(ob, fieldname) if not isinstance(field, BaseModel): field = subset_pydantic_model(ob, [fieldname], name=fieldname) - write_title = False + sheet_title = None else: - write_title = True + sheet_title = fieldname + current_row = create_sheet_and_write_title(doc_filepath, fieldname, sheet_title, sheet_number=sheet_number) - current_row = write_nested_simple_pydantic_to_sheet( - doc_filepath, fieldname, field, current_row + 1, write_title=write_title - ) + current_row = write_nested_simple_pydantic_to_sheet(doc_filepath, fieldname, field, current_row + 1) correct_column_widths(doc_filepath, sheet_name=fieldname) shade_30_rows(doc_filepath, fieldname, current_row + 1) shade_locked_cells(doc_filepath, fieldname) diff --git a/pydantic_schemas/tests/test_pydantic_to_excel.py b/pydantic_schemas/tests/test_pydantic_to_excel.py index 1724530..d3962ea 100644 --- a/pydantic_schemas/tests/test_pydantic_to_excel.py +++ b/pydantic_schemas/tests/test_pydantic_to_excel.py @@ -6,7 +6,7 @@ import pytest from pydantic import BaseModel, Field -from ..excel_to_pydantic import excel_sheet_to_pydantic +from ..excel_to_pydantic import excel_doc_to_pydantic, excel_sheet_to_pydantic from ..pydantic_to_excel import ( correct_column_widths, create_sheet_and_write_title, @@ -334,6 +334,22 @@ class ProductionAndCountries(BaseModel): title = "Example" write_across_many_sheets(filename, example_production_and_country, title) + new_pandc = excel_doc_to_pydantic(filename, ProductionAndCountries) + assert new_pandc.production.idno == "myidno" + assert new_pandc.production.title is None + assert len(new_pandc.production.authors) == 4 + assert author1 in new_pandc.production.authors + assert author1 in new_pandc.production.authors + assert author2 in new_pandc.production.authors + assert author3 in new_pandc.production.authors + assert len(new_pandc.countries) == 2 + assert example_country in new_pandc.countries + assert example_other_country in new_pandc.countries + assert new_pandc.dates == example_dates + assert new_pandc.other == ["12"] + assert new_pandc.otherOptional is None or new_pandc.otherOptional == [] + assert new_pandc.single_val == "single" + def test_demo(): filename = "demo_output.xlsx" diff --git a/pydantic_schemas/utils.py b/pydantic_schemas/utils.py index 4aa6d17..723ad9e 100644 --- a/pydantic_schemas/utils.py +++ b/pydantic_schemas/utils.py @@ -1,5 +1,5 @@ import typing -from typing import Any, Dict, List, Optional, Union, get_args, get_origin +from typing import Any, Dict, List, Optional, Type, Union, get_args, get_origin from pydantic import BaseModel, create_model @@ -74,24 +74,30 @@ def seperate_simple_from_pydantic(ob: BaseModel) -> Dict[str, Dict]: return {"simple": simple_children, "pydantic": pydantic_children} -def subset_pydantic_model(model: BaseModel, feature_names: List[str], name: Optional[str] = None) -> BaseModel: +def subset_pydantic_model_type( + model_type: Type[BaseModel], feature_names: List[str], name: Optional[str] = None +) -> Type[BaseModel]: """ - Create a new Pydantic model with only the specified subset of features. + Create a new Pydantic model type with only the specified subset of features. :param model: The original Pydantic model object. :param feature_names: List of feature names to include in the new model. - :return: A new Pydantic model instance with the specified features and values inherited from the original model + :return: A new Pydantic model type with the specified features from the original model """ # Filter the fields of the original model based on the feature names fields = { - name: (model.model_fields[name].annotation, model.model_fields[name].default) + name: (model_type.model_fields[name].annotation, model_type.model_fields[name].default) for name in feature_names - if name in model.model_fields + if name in model_type.model_fields } # Create a new Pydantic model with the filtered fields if name is None: name = "SubsetModel" SubModel = create_model(name, **fields) + return SubModel + +def subset_pydantic_model(model: BaseModel, feature_names: List[str], name: Optional[str] = None) -> BaseModel: + SubModel = subset_pydantic_model_type(type(model), feature_names, name=name) return SubModel(**{k: v for k, v in model.model_dump().items() if k in feature_names}) From c6366165c174ecffeb0aa81ddd5a9e1d653bf599 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Tue, 23 Jul 2024 16:57:13 -0400 Subject: [PATCH 21/51] write dictionaries of str to str --- pydantic_schemas/pydantic_to_excel.py | 22 ++++-- .../tests/test_pydantic_to_excel.py | 14 ++++ pydantic_schemas/utils.py | 71 ++++++++++++------- 3 files changed, 78 insertions(+), 29 deletions(-) diff --git a/pydantic_schemas/pydantic_to_excel.py b/pydantic_schemas/pydantic_to_excel.py index 0b3daaf..b6131b1 100644 --- a/pydantic_schemas/pydantic_to_excel.py +++ b/pydantic_schemas/pydantic_to_excel.py @@ -10,7 +10,9 @@ from pydantic import BaseModel from .utils import ( + annotation_contains_dict, annotation_contains_list, + assert_dict_annotation_is_strings_or_any, get_subtype_of_optional_or_list, is_list_annotation, is_optional_annotation, @@ -239,7 +241,7 @@ def replace_row_with_multiple_rows(original_df, new_df, row_to_replace): # Concatenate the parts with the new rows df_replaced = pd.concat([df_before, new_df, df_after]) - df_replaced = df_replaced.dropna(how="all", axis=1) + # df_replaced = df_replaced.dropna(how="all", axis=1) return df_replaced @@ -264,14 +266,25 @@ def pydantic_to_dataframe( if isinstance(ob, list): list_indices = list(range(len(df))) else: + for idx, _ in ob_dict.items(): + if annotations is not None and annotation_contains_dict(annotations[idx]): + print("Found a dictionary") + assert_dict_annotation_is_strings_or_any(annotations[idx]) + field = ob_dict[idx] + dict_df = pd.DataFrame([field.keys(), field.values()], index=["key", "value"]) + dict_df.index = dict_df.index.map(lambda x: f"{idx}.{x}") + df = df[~df.index.str.startswith(f"{idx}.")] + df = pd.concat([df, dict_df]) i = 0 for idx in df.index: + print(f"pydantic_to_dataframe::269 idx = {idx}, df = {df}") vals = df.loc[idx][0] field = ob_dict[idx.split(".")[0]] + if ( isinstance(vals, list) or (annotations is not None and annotation_contains_list(annotations[idx.split(".")[0]])) - or (hasattr(field, "annotation") and annotation_contains_list(field.annotation)) + or (annotations is not None and annotation_contains_dict(annotations[idx.split(".")[0]])) ): # (hasattr(ob, "annotation") and annotation_contains_list(ob.annotation)): if vals is not None and len(vals) > 0 and (isinstance(vals[0], BaseModel) or isinstance(vals[0], Dict)): print("list of base models", vals[0]) @@ -455,14 +468,13 @@ def write_nested_simple_pydantic_to_sheet( def write_across_many_sheets(doc_filepath: str, ob: BaseModel, title: Optional[str] = None): children = seperate_simple_from_pydantic(ob) + print(f"pydantic_to_excel::459 children: {children}") sheet_number = 0 if len(children["simple"]): if title is not None: - title += " Metadata" - else: title = "Metadata" sheet_name = "metadata" - current_row = create_sheet_and_write_title(doc_filepath, sheet_name, f"{title}", sheet_number=sheet_number) + current_row = create_sheet_and_write_title(doc_filepath, sheet_name, title, sheet_number=sheet_number) child_object = subset_pydantic_model(ob, children["simple"]) current_row = write_simple_pydantic_to_sheet( doc_filepath, diff --git a/pydantic_schemas/tests/test_pydantic_to_excel.py b/pydantic_schemas/tests/test_pydantic_to_excel.py index d3962ea..921c2da 100644 --- a/pydantic_schemas/tests/test_pydantic_to_excel.py +++ b/pydantic_schemas/tests/test_pydantic_to_excel.py @@ -6,6 +6,9 @@ import pytest from pydantic import BaseModel, Field +from pydantic_schemas.definitions.document_schema import ScriptSchemaDraft +from pydantic_schemas.quick_start import make_skeleton + from ..excel_to_pydantic import excel_doc_to_pydantic, excel_sheet_to_pydantic from ..pydantic_to_excel import ( correct_column_widths, @@ -351,6 +354,15 @@ class ProductionAndCountries(BaseModel): assert new_pandc.single_val == "single" +def test_write_real_skeleton(tmpdir): + filename = tmpdir.join(f"Document_metadata.xlsx") + sheet_title = "Document" + + ob = make_skeleton(ScriptSchemaDraft) + + write_across_many_sheets(filename, ob, sheet_title) + + def test_demo(): filename = "demo_output.xlsx" sheetname = "metadata" @@ -386,6 +398,7 @@ class MetaDataOfVariousHierarchies(BaseModel): top_level_list: List[str] top_level_optional_list: Optional[List[str]] = None top_level_list_of_pydantic_objects: List[SubObject] + dictionary: Dict[str, str] example = MetaDataOfVariousHierarchies( single_level_data=SingleLevelData(title="Metadata demo", author="FirstName LastName"), @@ -399,6 +412,7 @@ class MetaDataOfVariousHierarchies(BaseModel): ), top_level_list=["a", "b"], top_level_list_of_pydantic_objects=[SubObject(a="a", b="b")], + dictionary={"example_key": "example_value"}, ) if os.path.exists(filename): diff --git a/pydantic_schemas/utils.py b/pydantic_schemas/utils.py index 723ad9e..9bc0d98 100644 --- a/pydantic_schemas/utils.py +++ b/pydantic_schemas/utils.py @@ -1,5 +1,5 @@ import typing -from typing import Any, Dict, List, Optional, Type, Union, get_args, get_origin +from typing import Any, Callable, Dict, List, Optional, Type, Union, get_args, get_origin from pydantic import BaseModel, create_model @@ -22,44 +22,67 @@ def is_list_annotation(anno: typing._UnionGenericAlias) -> bool: return typing.get_origin(anno) is list -def get_subtype_of_optional_or_list(anno: typing._UnionGenericAlias) -> Any: +def get_subtype_of_optional_or_list(anno: typing._UnionGenericAlias, debug=False) -> Any: args = typing.get_args(anno) - for a in args: - print(f"getting subtype {a}, is it None?={isinstance(a, type(None))}") + if debug: + for a in args: + print(f"getting subtype {a}, is it NoneType?={a is type(None)}") args = [a for a in args if not a is type(None)] - if len(args) > 1: - raise ValueError(f"Too many sub types: {args}") - arg = args[0] - if hasattr(arg, "annotation"): - if is_list_annotation(arg.annotation): + # if len(args) > 1: + # raise ValueError(f"Too many sub types: {args}") + for arg in args: + if hasattr(arg, "annotation") and is_dict_annotation(arg.annotation): + raise NotImplementedError("DICTS not yet implemented") + for arg in args: + if hasattr(arg, "annotation") and is_list_annotation(arg.annotation): return get_subtype_of_optional_or_list(arg.annotation) - else: - raise NotImplementedError("Only optional lists and optional builtin types implemented") - return arg - - -def annotation_contains_pydantic(anno: typing._UnionGenericAlias) -> bool: - if isinstance(anno, type(BaseModel)): - return True - elif is_optional_annotation(anno) or is_list_annotation(anno): - subtype = get_subtype_of_optional_or_list(anno) - return isinstance(subtype, type(BaseModel)) + if len(args) == 1: + return args[0] else: - return False + raise NotImplementedError("Only optional lists optional builtin types implemented") -def annotation_contains_list(anno: typing._UnionGenericAlias) -> bool: - if is_list_annotation(anno): +def _annotation_contains_generic( + anno: typing._UnionGenericAlias, checker: Callable[[typing._UnionGenericAlias], bool] +) -> bool: + if checker(anno): return True elif is_union_annotation(anno): args = typing.get_args(anno) args = [a for a in args if not a is type(None)] for a in args: - if is_list_annotation(a): + if checker(a): return True + elif is_optional_annotation(anno) or is_list_annotation(anno): + subtype = get_subtype_of_optional_or_list(anno) + return checker(subtype) return False +def annotation_contains_list(anno: typing._UnionGenericAlias) -> bool: + return _annotation_contains_generic(anno, is_list_annotation) + + +def annotation_contains_dict(anno: typing._UnionGenericAlias) -> bool: + return _annotation_contains_generic(anno, is_dict_annotation) + + +def annotation_contains_pydantic(anno: typing._UnionGenericAlias) -> bool: + return _annotation_contains_generic(anno, lambda x: isinstance(x, type(BaseModel))) + + +def assert_dict_annotation_is_strings_or_any(anno): + if is_dict_annotation(anno): + args = typing.get_args(anno) + for a in args: + if not (a is str or a is typing.Any): + raise AssertionError(f"exepcted dictionaries of strings to strings or Any but got {anno}") + elif is_optional_annotation(anno): + assert_dict_annotation_is_strings_or_any(get_subtype_of_optional_or_list(anno)) + else: + raise ValueError(f"Expected dictionary or optional dictionary annotation but got {anno}") + + def seperate_simple_from_pydantic(ob: BaseModel) -> Dict[str, Dict]: """ Returns a dictionary of lists of field names that are either of other pydantic types or of other types From bc6f3c3056bdaa92e302035d869376707df2c982 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Tue, 23 Jul 2024 17:00:40 -0400 Subject: [PATCH 22/51] specift the array as an array of str --- pydantic_schemas/definitions/document_schema.py | 6 ++---- pydantic_schemas/definitions/geospatial_schema.py | 2 +- pydantic_schemas/definitions/image_schema.py | 2 +- pydantic_schemas/definitions/microdata_schema.py | 2 +- pydantic_schemas/definitions/script_schema.py | 2 +- pydantic_schemas/definitions/series_schema.py | 2 +- pydantic_schemas/definitions/table_schema.py | 2 +- pydantic_schemas/definitions/timeseries_db_schema.py | 2 +- pydantic_schemas/definitions/timeseries_schema.py | 2 +- pydantic_schemas/definitions/video_schema.py | 2 +- schemas/document-schema.json | 3 +++ 11 files changed, 14 insertions(+), 13 deletions(-) diff --git a/pydantic_schemas/definitions/document_schema.py b/pydantic_schemas/definitions/document_schema.py index 80da9f6..b3a4496 100644 --- a/pydantic_schemas/definitions/document_schema.py +++ b/pydantic_schemas/definitions/document_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: document-schema.json -# timestamp: 2024-07-12T20:05:43+00:00 +# timestamp: 2024-07-23T17:17:15+00:00 from __future__ import annotations @@ -503,9 +503,7 @@ class Config: organization: Optional[str] = Field( None, description="The organization that sponsors a conference or that publishes a manual", title="Organization" ) - url: Optional[Union[str, List[Any]]] = Field( - None, description="URL of the document, preferably a permanent URL", title="URL" - ) + url: Optional[List[str]] = Field(None, description="URL of the document, preferably a permanent URL", title="URL") translators: Optional[List[Translator]] = Field(None, description="Translators", title="Translators") contributors: Optional[List[Contributor]] = Field(None, description="Contributors", title="Contributors") contacts: Optional[List[Contact]] = Field(None, description="Contacts", title="Contacts") diff --git a/pydantic_schemas/definitions/geospatial_schema.py b/pydantic_schemas/definitions/geospatial_schema.py index 93bf783..71c931d 100644 --- a/pydantic_schemas/definitions/geospatial_schema.py +++ b/pydantic_schemas/definitions/geospatial_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: geospatial-schema.json -# timestamp: 2024-07-12T20:05:45+00:00 +# timestamp: 2024-07-23T17:17:17+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/image_schema.py b/pydantic_schemas/definitions/image_schema.py index ce29f51..339d700 100644 --- a/pydantic_schemas/definitions/image_schema.py +++ b/pydantic_schemas/definitions/image_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: image-schema.json -# timestamp: 2024-07-12T20:05:47+00:00 +# timestamp: 2024-07-23T17:17:19+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/microdata_schema.py b/pydantic_schemas/definitions/microdata_schema.py index cbc5d26..6af8dc5 100644 --- a/pydantic_schemas/definitions/microdata_schema.py +++ b/pydantic_schemas/definitions/microdata_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: microdata-schema.json -# timestamp: 2024-07-12T20:05:49+00:00 +# timestamp: 2024-07-23T17:17:20+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/script_schema.py b/pydantic_schemas/definitions/script_schema.py index a5c4010..042ea31 100644 --- a/pydantic_schemas/definitions/script_schema.py +++ b/pydantic_schemas/definitions/script_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: script-schema.json -# timestamp: 2024-07-12T20:05:51+00:00 +# timestamp: 2024-07-23T17:17:22+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/series_schema.py b/pydantic_schemas/definitions/series_schema.py index 2ba6820..8b3c14d 100644 --- a/pydantic_schemas/definitions/series_schema.py +++ b/pydantic_schemas/definitions/series_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: series-schema.json -# timestamp: 2024-07-12T20:05:52+00:00 +# timestamp: 2024-07-23T17:17:24+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/table_schema.py b/pydantic_schemas/definitions/table_schema.py index 196713f..c21806c 100644 --- a/pydantic_schemas/definitions/table_schema.py +++ b/pydantic_schemas/definitions/table_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: table-schema.json -# timestamp: 2024-07-12T20:05:54+00:00 +# timestamp: 2024-07-23T17:17:25+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/timeseries_db_schema.py b/pydantic_schemas/definitions/timeseries_db_schema.py index 7a353b2..cbc875f 100644 --- a/pydantic_schemas/definitions/timeseries_db_schema.py +++ b/pydantic_schemas/definitions/timeseries_db_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: timeseries-db-schema.json -# timestamp: 2024-07-12T20:05:55+00:00 +# timestamp: 2024-07-23T17:17:27+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/timeseries_schema.py b/pydantic_schemas/definitions/timeseries_schema.py index 165ed93..416610e 100644 --- a/pydantic_schemas/definitions/timeseries_schema.py +++ b/pydantic_schemas/definitions/timeseries_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: timeseries-schema.json -# timestamp: 2024-07-12T20:05:57+00:00 +# timestamp: 2024-07-23T17:17:29+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/video_schema.py b/pydantic_schemas/definitions/video_schema.py index f48843d..2c5c4fb 100644 --- a/pydantic_schemas/definitions/video_schema.py +++ b/pydantic_schemas/definitions/video_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: video-schema.json -# timestamp: 2024-07-12T20:05:59+00:00 +# timestamp: 2024-07-23T17:17:30+00:00 from __future__ import annotations diff --git a/schemas/document-schema.json b/schemas/document-schema.json index 5e7ecca..9dee870 100644 --- a/schemas/document-schema.json +++ b/schemas/document-schema.json @@ -587,6 +587,9 @@ "url": { "type": ["string", "array"], + "items": { + "type": "string" + }, "title": "URL", "description":"URL of the document, preferably a permanent URL" }, From e80c4145b4f29b0a913d8134a7102b981b6b3842 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Tue, 23 Jul 2024 18:07:56 -0400 Subject: [PATCH 23/51] read dictionaries --- pydantic_schemas/excel_to_pydantic.py | 11 ++++++++++- pydantic_schemas/tests/test_pydantic_to_excel.py | 16 ++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/pydantic_schemas/excel_to_pydantic.py b/pydantic_schemas/excel_to_pydantic.py index a2753c2..0bd1f1e 100644 --- a/pydantic_schemas/excel_to_pydantic.py +++ b/pydantic_schemas/excel_to_pydantic.py @@ -5,9 +5,10 @@ import numpy as np import pandas as pd -from pydantic import BaseModel +from pydantic import BaseModel, create_model from .utils import ( + annotation_contains_dict, annotation_contains_list, get_subtype_of_optional_or_list, is_list_annotation, @@ -105,6 +106,14 @@ def get_value(name, field_annotation, df, is_list=False): base_instance = get_instance_of_pydantic(field_annotation, sub, is_list=is_list) print("BASE INSTANCE: ", base_instance) return base_instance + elif annotation_contains_dict(field_annotation): + dictionary_type = create_model(name, **{"key": (Optional[str], None), "value": (Optional[str], None)}) + sub = get_relevant_sub_frame(dictionary_type, df, name) + dict_results = get_instance_of_pydantic(dictionary_type, sub, is_list=True) + ret = {} + for d in dict_results: + ret[d.key] = d.value + return ret elif annotation_contains_list(field_annotation): print("LIST", name, field_annotation) sub_type = get_subtype_of_optional_or_list(field_annotation) diff --git a/pydantic_schemas/tests/test_pydantic_to_excel.py b/pydantic_schemas/tests/test_pydantic_to_excel.py index 921c2da..6381920 100644 --- a/pydantic_schemas/tests/test_pydantic_to_excel.py +++ b/pydantic_schemas/tests/test_pydantic_to_excel.py @@ -354,6 +354,22 @@ class ProductionAndCountries(BaseModel): assert new_pandc.single_val == "single" +def test_dictionaries(tmpdir): + class SubDict(BaseModel): + sub_additional: Optional[Dict[str, Any]] = Field(None, description="Additional metadata at a lower level") + + class WithDict(BaseModel): + additional: Optional[Dict[str, Any]] = Field(None, description="Additional metadata") + sub: SubDict + + wd = WithDict(additional={"s": "sa", "a": "va"}, sub=SubDict(sub_additional={"sub": "subval", "sub2": "subval2"})) + filename = tmpdir.join(f"integration_test_dictionaries_.xlsx") + + write_across_many_sheets(filename, wd, title="Dictionaries") + parsed_outp = excel_doc_to_pydantic(filename, WithDict) + assert parsed_outp == wd, parsed_outp + + def test_write_real_skeleton(tmpdir): filename = tmpdir.join(f"Document_metadata.xlsx") sheet_title = "Document" From 6f66bdcbc745572b8b616fc7a225f4bfd3204556 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Wed, 24 Jul 2024 17:12:15 -0400 Subject: [PATCH 24/51] make status an array of strings not just an array --- schemas/geospatial-schema.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/schemas/geospatial-schema.json b/schemas/geospatial-schema.json index 83e979d..5f3082f 100644 --- a/schemas/geospatial-schema.json +++ b/schemas/geospatial-schema.json @@ -982,7 +982,10 @@ "title": "Status", "description": "Status of the dataset resource. Recommended code following the [ISO/TS 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_ProgressCode) Progress codelist. Suggested values: {`completed`, `historicalArchive`, `obsolete`, `onGoing`, `planned`, `required`, `underDevelopment`, `final`, `pending`, `retired`, `superseded`, `tentative`, `valid`, `accepted`, `notAccepted`, `withdrawn`, `proposed`, `deprecated`}", "type": "array", - "_xpath": "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:status/gmd:MD_ProgressCode" + "_xpath": "gmd:identificationInfo/gmd:MD_DataIdentification/gmd:status/gmd:MD_ProgressCode", + "items": { + "type": "string" + } }, "pointOfContact": { "title": "Points of contact", From 9cdced6c2109d3bb3427222b7b3398429ed21917 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Wed, 24 Jul 2024 17:13:51 -0400 Subject: [PATCH 25/51] collapse root models --- pydantic_schemas/generate_pydantic_schemas.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pydantic_schemas/generate_pydantic_schemas.py b/pydantic_schemas/generate_pydantic_schemas.py index b16a4ff..06e76d4 100644 --- a/pydantic_schemas/generate_pydantic_schemas.py +++ b/pydantic_schemas/generate_pydantic_schemas.py @@ -40,6 +40,7 @@ PYTHON_VERSION, "--use-double-quotes", "--wrap-string-literal", + "--collapse-root-models", "--base-class", BASE_CLASS, "--output", From eac8caa90d4d278962afa5d48af410e4cac55268 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Wed, 24 Jul 2024 17:19:23 -0400 Subject: [PATCH 26/51] resolve bugs with making excel sheets of skeletons --- pydantic_schemas/quick_start.py | 103 +++++++++++++----- .../tests/test_pydantic_to_excel.py | 39 ++++++- pydantic_schemas/tests/test_quick_start.py | 58 +++++++--- pydantic_schemas/utils.py | 41 ++++++- 4 files changed, 192 insertions(+), 49 deletions(-) diff --git a/pydantic_schemas/quick_start.py b/pydantic_schemas/quick_start.py index b137f42..fcc4917 100644 --- a/pydantic_schemas/quick_start.py +++ b/pydantic_schemas/quick_start.py @@ -2,11 +2,13 @@ import inspect import typing from enum import Enum -from typing import Any, Callable, List, Type +from typing import Any, Callable, Dict, List, Type -from pydantic import BaseModel +from pydantic import AnyUrl, BaseModel -metadata_types_file_map = { +from pydantic_schemas.utils import standardize_keys_in_dict + +METADATA_TYPES_FILE_MAP = { "document_schema": "ScriptSchemaDraft", "geospatial_schema": "GeospatialSchema", "image_schema": "ImageDataTypeSchema", @@ -19,6 +21,8 @@ "video_schema": "Model", } +DEFAULT_URL = "http://www.example.com" + def _is_typing_annotation(annotation): if isinstance(annotation, str): @@ -55,35 +59,62 @@ def _filter_list_for_condition(args: List[Any], condition: Callable[[Any], bool] def _is_pydantic_annotated_string(p, debug=False, indentation=""): if typing.get_origin(p) is typing.Annotated: args = typing.get_args(p) - if len(args) == 2 and args[0] is str: + if args[0] is str: if debug: print(indentation, "Is Annotated String") return True if debug: - print(indentation, f"Is Annotated not string {p}") + print(indentation, f"Is Annotated but not a string {p}") + return False + + +def _is_pydantic_annotated_float(p, debug=False, indentation=""): + if typing.get_origin(p) is typing.Annotated: + args = typing.get_args(p) + if args[0] is float: + if debug: + print(indentation, "Is Annotated float") + return True + if debug: + print(indentation, f"Is Annotated but not a float {p}") return False -def _create_default_class_from_annotation(p: Any, debug: bool = False, indentation: str = ""): +def _create_default_class_from_annotation( + p: Any, is_optional: bool = False, debug: bool = False, indentation: str = "" +): if p is str: if debug: print(indentation, "STR") - return "" + if is_optional: + return None + else: + return "" + elif p is float: + if debug: + print(indentation, "STR") + if is_optional: + return None + else: + raise ValueError("Cannot create default float as it's not optional") elif _is_enum_type(p): if debug: print(indentation, "ENUM") - return list(p)[0].value # get first value of the enum + if is_optional: + return None + else: + return list(p)[0].value # get first value of the enum elif _is_pydantic_subclass(p): if debug: print(indentation, "pydantic CLASS") return make_skeleton(p, debug=debug, indentation=indentation + " ") + elif isinstance(p, type(AnyUrl)): + return DEFAULT_URL else: raise ValueError(f"Unknown annotation: {p}") -def _create_default_from_list_of_args( - args: List[Any], return_none_for_builtin_or_enum=True, debug=False, indentation="" -): +def _create_default_from_list_of_args(args: List[Any], is_optional=True, debug=False, indentation=""): """ return None for built in types and enums, but create skeletons of pydantic or typed parameters """ @@ -107,25 +138,40 @@ def _create_default_from_list_of_args( chosen_type = typed_lists[0] else: chosen_type = typed_args[0] - return _create_default_from_typing_annotation(chosen_type, debug=debug, indentation=indentation) + return _create_default_from_typing_annotation( + chosen_type, is_optional=is_optional, debug=debug, indentation=indentation + ) elif len(pydantic_args): - return make_skeleton(pydantic_args[0]) + return make_skeleton(pydantic_args[0], debug=debug, indentation=indentation + " ") elif len(_filter_list_for_condition(args, lambda a: _is_builtin_type(a) or _is_enum_type(a))): if debug: print(indentation, "all builtins or enums") - if return_none_for_builtin_or_enum: + if is_optional: return None elif len(_filter_list_for_condition(args, lambda a: a is str)): return "" else: raise ValueError(f"Can't create a default of {args}") elif len(args) == 1 and _is_pydantic_annotated_string(args[0], debug=debug, indentation=indentation): - return "" + if is_optional: + return None + else: + return "" + elif len(args) == 1 and _is_pydantic_annotated_float(args[0], debug=debug, indentation=indentation): + if is_optional: + return None + else: + raise ValueError(f"Can't create a default of {args}") + elif len(args) == 1 and isinstance(args[0], type(AnyUrl)): + if is_optional: + return None + else: + return DEFAULT_URL else: raise ValueError(f"Can't create a default of {args}") -def _create_default_from_typing_annotation(p: Any, debug: bool = False, indentation=""): +def _create_default_from_typing_annotation(p: Any, is_optional: bool = False, debug: bool = False, indentation=""): if debug: print(indentation, "_create_default_from_typing_annotation") if p is typing.Any: @@ -137,16 +183,17 @@ def _create_default_from_typing_annotation(p: Any, debug: bool = False, indentat if isOptional: if debug: print(indentation, "isOPTIONAL") - return _create_default_from_list_of_args( - args, return_none_for_builtin_or_enum=True, debug=debug, indentation=indentation - ) + return _create_default_from_list_of_args(args, is_optional=True, debug=debug, indentation=indentation) elif getattr(p, "__origin__", None) is list: if debug: print(indentation, "isLIST") if _is_pydantic_subclass(args[0]): return [make_skeleton(args[0], debug=debug, indentation=indentation + " ")] else: - return [_create_default(args[0], debug=debug, indentation=indentation + " ")] + if is_optional: + return [] + else: + return [_create_default(args[0], is_optional=False, debug=debug, indentation=indentation + " ")] elif getattr(p, "__origin__", None) is dict: if debug: print(indentation, "isDICT") @@ -156,28 +203,29 @@ def _create_default_from_typing_annotation(p: Any, debug: bool = False, indentat elif len(args) > 1: if debug: print(indentation, "isUNION") - return _create_default_from_list_of_args( - args, return_none_for_builtin_or_enum=False, debug=debug, indentation=indentation - ) + return _create_default_from_list_of_args(args, is_optional=is_optional, debug=debug, indentation=indentation) else: raise ValueError(f"Unknown typing {p}") -def _create_default(p: inspect.Parameter, debug: bool = False, indentation: str = ""): +def _create_default(p: inspect.Parameter, is_optional: bool = False, debug: bool = False, indentation: str = ""): if hasattr(p, "annotation"): p = p.annotation if inspect.isclass(p) and not _is_typing_annotation(p): if debug: print(indentation, "CLASS") - return _create_default_class_from_annotation(p, debug=debug, indentation=indentation) + return _create_default_class_from_annotation(p, is_optional=is_optional, debug=debug, indentation=indentation) elif _is_typing_annotation(p): if debug: print(indentation, "TYPED") - return _create_default_from_typing_annotation(p, debug=debug, indentation=indentation) + return _create_default_from_typing_annotation(p, is_optional=is_optional, debug=debug, indentation=indentation) elif _is_pydantic_annotated_string(p, debug=debug, indentation=indentation): if debug: print(indentation, "ANNOTATED STRING") - return "" + if is_optional: + return None + else: + return "" else: raise ValueError(f"Unknown parameter {p}") @@ -191,6 +239,7 @@ def make_skeleton(cl: Type[BaseModel], debug=False, indentation=""): param_values[name] = _create_default(param, debug=debug, indentation=indentation + " ") if debug: print(indentation, f"Parameter: {name}, value: {param_values[name]}") + param_values = standardize_keys_in_dict(param_values) return cl(**param_values) diff --git a/pydantic_schemas/tests/test_pydantic_to_excel.py b/pydantic_schemas/tests/test_pydantic_to_excel.py index 6381920..9062f68 100644 --- a/pydantic_schemas/tests/test_pydantic_to_excel.py +++ b/pydantic_schemas/tests/test_pydantic_to_excel.py @@ -7,6 +7,16 @@ from pydantic import BaseModel, Field from pydantic_schemas.definitions.document_schema import ScriptSchemaDraft + +# from pydantic_schemas.definitions.geospatial_schema import GeospatialSchema +# from pydantic_schemas.definitions.image_schema import ImageDataTypeSchema +from pydantic_schemas.definitions.microdata_schema import MicrodataSchema +from pydantic_schemas.definitions.script_schema import ResearchProjectSchemaDraft +from pydantic_schemas.definitions.series_schema import Series +from pydantic_schemas.definitions.table_schema import Model as TableModel +from pydantic_schemas.definitions.timeseries_db_schema import TimeseriesDatabaseSchema +from pydantic_schemas.definitions.timeseries_schema import TimeseriesSchema +from pydantic_schemas.definitions.video_schema import Model as VideoModel from pydantic_schemas.quick_start import make_skeleton from ..excel_to_pydantic import excel_doc_to_pydantic, excel_sheet_to_pydantic @@ -370,13 +380,30 @@ class WithDict(BaseModel): assert parsed_outp == wd, parsed_outp -def test_write_real_skeleton(tmpdir): - filename = tmpdir.join(f"Document_metadata.xlsx") - sheet_title = "Document" - - ob = make_skeleton(ScriptSchemaDraft) +NAME_TO_TYPE = { + "Document": (ScriptSchemaDraft, write_across_many_sheets), + # "Geospatial":GeospatialSchema, + # "Image":ImageDataTypeSchema, + "Survey_microdata": (MicrodataSchema, write_across_many_sheets), + "Script": (ResearchProjectSchemaDraft, write_across_many_sheets), + "Series": (Series, write_across_many_sheets), # should be one sheet + "Table": (TableModel, write_across_many_sheets), + "Timeseries_DB": (TimeseriesDatabaseSchema, write_across_many_sheets), # could be one sheet + "Timeseries": (TimeseriesSchema, write_across_many_sheets), + "Video": (VideoModel, write_across_many_sheets), # could be one sheet +} + + +@pytest.mark.parametrize("name, type_and_writer", [(k, v) for k, v in NAME_TO_TYPE.items()]) +def test_write_real_skeleton(tmpdir, name, type_and_writer): + type, writer = type_and_writer + # folder = "excel_sheets" + filename = os.path.join(tmpdir, f"{name}_metadata.xlsx") + if os.path.exists(filename): + os.remove(filename) + ob = make_skeleton(type) - write_across_many_sheets(filename, ob, sheet_title) + writer(filename, ob, name) def test_demo(): diff --git a/pydantic_schemas/tests/test_quick_start.py b/pydantic_schemas/tests/test_quick_start.py index ffdb2dd..4d6f0ed 100644 --- a/pydantic_schemas/tests/test_quick_start.py +++ b/pydantic_schemas/tests/test_quick_start.py @@ -2,9 +2,9 @@ from typing import Any, Dict, List, Optional, Union import pytest -from pydantic import BaseModel +from pydantic import AnyUrl, BaseModel, Field, confloat -from ..quick_start import create_empty_schema_from_path, make_skeleton, metadata_types_file_map +from ..quick_start import DEFAULT_URL, METADATA_TYPES_FILE_MAP, create_empty_schema_from_path, make_skeleton def test_simple_strings(): @@ -109,7 +109,7 @@ class Simple(BaseModel): b: str expected = Simple(a=[""], b="") - actual = make_skeleton(Simple) + actual = make_skeleton(Simple, debug=True) assert actual == expected, actual @@ -157,7 +157,7 @@ class Simple(BaseModel): b: Any c: str - expected = Simple(a=[""], b="", c="") + expected = Simple(a=[], b="", c="") actual = make_skeleton(Simple) assert actual == expected, actual @@ -166,7 +166,7 @@ class SimpleReversed(BaseModel): b: Any c: str - expected = SimpleReversed(a=[""], b="", c="") + expected = SimpleReversed(a=[], b="", c="") actual = make_skeleton(SimpleReversed) assert actual == expected, actual @@ -197,14 +197,44 @@ class Simple(BaseModel): assert actual == expected, actual -@pytest.mark.parametrize("k, v", [(k, v) for k, v in metadata_types_file_map.items()]) +def test_constriainedfloat(): + class GeographicBoundingBox(BaseModel): + westBoundLongitude: Optional[confloat(ge=-180.0, le=180.0)] = Field(None, title="West") + eastBoundLongitude: Optional[confloat(ge=-180.0, le=180.0)] = Field(None, title="East") + southBoundLatitude: Optional[confloat(ge=-180.0, le=180.0)] = Field(None, title="South") + northBoundLatitude: Optional[confloat(ge=-180.0, le=180.0)] = Field(None, title="North") + + class GeographicElementItem(BaseModel): + geographicBoundingBox: Optional[GeographicBoundingBox] = Field(None, title="Geographic Bounding Box") + + expected = GeographicElementItem(geographicBoundingBox=GeographicBoundingBox()) + actual = make_skeleton(GeographicElementItem, debug=True) + assert actual == expected, actual + + +def test_url(): + class RegistryEntry(BaseModel): + role: Optional[AnyUrl] = None + assetIdentifier: str = Field(...) + registryIdentifier: AnyUrl = Field(...) + + expected = RegistryEntry(role=None, assetIdentifier="", registryIdentifier=DEFAULT_URL) + actual = make_skeleton(RegistryEntry, debug=True) + assert actual == expected, actual + + +def test_fieldname_is_protected(): + class BadFieldNames(BaseModel): + from_: str = Field(..., alias="from") + # import_: str + other: str + + expected = BadFieldNames(**{"from": "", "other": ""}) + actual = make_skeleton(BadFieldNames, debug=True) + assert actual == expected, actual + + +@pytest.mark.parametrize("k, v", [(k, v) for k, v in METADATA_TYPES_FILE_MAP.items()]) def test_actual_schemas(k, v): base = "pydantic_schemas.definitions.{}" - print(k) - try: - create_empty_schema_from_path(base.format(k), v) - except TypeError as e: - if str(e) == "To define root models, use `pydantic.RootModel` rather than a field called '__root__'": - print("Caught the specific TypeError:", e) - else: - raise + create_empty_schema_from_path(base.format(k), v, debug=True) diff --git a/pydantic_schemas/utils.py b/pydantic_schemas/utils.py index 9bc0d98..d196dcc 100644 --- a/pydantic_schemas/utils.py +++ b/pydantic_schemas/utils.py @@ -1,7 +1,7 @@ import typing from typing import Any, Callable, Dict, List, Optional, Type, Union, get_args, get_origin -from pydantic import BaseModel, create_model +from pydantic import BaseModel, ValidationError, create_model def is_optional_annotation(anno: typing._UnionGenericAlias) -> bool: @@ -97,6 +97,38 @@ def seperate_simple_from_pydantic(ob: BaseModel) -> Dict[str, Dict]: return {"simple": simple_children, "pydantic": pydantic_children} +def _standardize_keys_in_list_of_possible_dicts(lst: List[any]) -> List[Any]: + new_value = [] + for item in lst: + if isinstance(item, dict): + new_value.append(standardize_keys_in_dict(item)) + elif isinstance(item, list): + new_value.append(_standardize_keys_in_list_of_possible_dicts(item)) + else: + new_value.append(item) + return new_value + + +def standardize_keys_in_dict(d: Dict[str, Any]) -> Dict[str, Any]: + """ + sometimes when field names are also python protected names like 'from' and 'import' + then we append an underscore to the field name to avoide clashes. + + But pydantic doesn't expect that underscore to be there when instantiating, so we must remove it. + """ + new_dict = {} + for key, value in d.items(): + new_key = key.rstrip("_") + if isinstance(value, dict): + new_value = standardize_keys_in_dict(value) + elif isinstance(value, list): + new_value = _standardize_keys_in_list_of_possible_dicts(value) + else: + new_value = value + new_dict[new_key] = new_value + return new_dict + + def subset_pydantic_model_type( model_type: Type[BaseModel], feature_names: List[str], name: Optional[str] = None ) -> Type[BaseModel]: @@ -123,4 +155,9 @@ def subset_pydantic_model_type( def subset_pydantic_model(model: BaseModel, feature_names: List[str], name: Optional[str] = None) -> BaseModel: SubModel = subset_pydantic_model_type(type(model), feature_names, name=name) - return SubModel(**{k: v for k, v in model.model_dump().items() if k in feature_names}) + input_dict = {k: v for k, v in model.model_dump(mode="json").items() if k in feature_names} + input_dict_standardized = standardize_keys_in_dict(input_dict) + try: + return SubModel(**input_dict_standardized) + except: + raise ValueError(input_dict_standardized) From 9e474e32ec02f36ccedab9ebcb88302013747994 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Wed, 24 Jul 2024 17:20:28 -0400 Subject: [PATCH 27/51] empty excel sheets for metadata --- excel_sheets/Document_metadata.xlsx | Bin 0 -> 115353 bytes excel_sheets/Script_metadata.xlsx | Bin 0 -> 122191 bytes excel_sheets/Series_metadata.xlsx | Bin 0 -> 74107 bytes excel_sheets/Survey_microdata_metadata.xlsx | Bin 0 -> 168918 bytes excel_sheets/Table_metadata.xlsx | Bin 0 -> 109767 bytes excel_sheets/Timeseries_DB_metadata.xlsx | Bin 0 -> 94531 bytes excel_sheets/Timeseries_metadata.xlsx | Bin 0 -> 172568 bytes excel_sheets/Video_metadata.xlsx | Bin 0 -> 96419 bytes .../definitions/document_schema.py | 2 +- .../definitions/geospatial_schema.py | 84 +++++------------- pydantic_schemas/definitions/image_schema.py | 66 +++++++------- .../definitions/microdata_schema.py | 2 +- pydantic_schemas/definitions/script_schema.py | 2 +- pydantic_schemas/definitions/series_schema.py | 2 +- pydantic_schemas/definitions/table_schema.py | 34 ++----- .../definitions/timeseries_db_schema.py | 2 +- .../definitions/timeseries_schema.py | 2 +- pydantic_schemas/definitions/video_schema.py | 2 +- 18 files changed, 63 insertions(+), 135 deletions(-) create mode 100644 excel_sheets/Document_metadata.xlsx create mode 100644 excel_sheets/Script_metadata.xlsx create mode 100644 excel_sheets/Series_metadata.xlsx create mode 100644 excel_sheets/Survey_microdata_metadata.xlsx create mode 100644 excel_sheets/Table_metadata.xlsx create mode 100644 excel_sheets/Timeseries_DB_metadata.xlsx create mode 100644 excel_sheets/Timeseries_metadata.xlsx create mode 100644 excel_sheets/Video_metadata.xlsx diff --git a/excel_sheets/Document_metadata.xlsx b/excel_sheets/Document_metadata.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..63f799fa292a5a5d43c76d52dd7b3c11f0e998d2 GIT binary patch literal 115353 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 literal 0 HcmV?d00001 diff --git a/excel_sheets/Script_metadata.xlsx b/excel_sheets/Script_metadata.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2fe3959fd28407e32b9683f8fed81cd1b3fe1109 GIT binary patch literal 122191 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 UgO85X(@uvy2OSZvPWs6H53yVuSpWb4 literal 0 HcmV?d00001 diff --git a/excel_sheets/Series_metadata.xlsx b/excel_sheets/Series_metadata.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..719489253a3844c52dc0a54b87b0e61ce2a41b9a GIT binary patch literal 74107 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

SPr4 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 literal 0 HcmV?d00001 diff --git a/excel_sheets/Survey_microdata_metadata.xlsx b/excel_sheets/Survey_microdata_metadata.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2fce8f417cbfee250dc0f6a063b0173e21861a56 GIT binary patch literal 168918 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 literal 0 HcmV?d00001 diff --git a/excel_sheets/Timeseries_metadata.xlsx b/excel_sheets/Timeseries_metadata.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a4e8aab816682f27c9e040a5ea468124ada06711 GIT binary patch literal 172568 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 J0q45X{{i}jSwsK; literal 0 HcmV?d00001 diff --git a/excel_sheets/Video_metadata.xlsx b/excel_sheets/Video_metadata.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..15ccc9bb3044dda9eaa63fe2b1ea5a720a2fe3f9 GIT binary patch literal 96419 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 Fe*xltuK@r6 literal 0 HcmV?d00001 diff --git a/pydantic_schemas/definitions/document_schema.py b/pydantic_schemas/definitions/document_schema.py index b3a4496..58e26cd 100644 --- a/pydantic_schemas/definitions/document_schema.py +++ b/pydantic_schemas/definitions/document_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: document-schema.json -# timestamp: 2024-07-23T17:17:15+00:00 +# timestamp: 2024-07-24T21:06:20+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/geospatial_schema.py b/pydantic_schemas/definitions/geospatial_schema.py index 71c931d..96ce18f 100644 --- a/pydantic_schemas/definitions/geospatial_schema.py +++ b/pydantic_schemas/definitions/geospatial_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: geospatial-schema.json -# timestamp: 2024-07-23T17:17:17+00:00 +# timestamp: 2024-07-24T21:06:22+00:00 from __future__ import annotations @@ -612,17 +612,6 @@ class ProvenanceSchema(SchemaBaseModel): origin_description: Optional[OriginDescription] = Field(None, title="Origin description") -class Language(SchemaBaseModel): - __root__: str = Field( - ..., - description=( - "Language of the resource. Preferred code following the [ISO 639-2](http://www.loc.gov/standards/iso639-2/)" - " (alpha-3 code)" - ), - title="Language", - ) - - class CharacterSet(SchemaBaseModel): """ Character encoding used e.g. UTF-8 @@ -645,37 +634,6 @@ class CharacterSet(SchemaBaseModel): ) -class TopicCategory(SchemaBaseModel): - __root__: str = Field( - ..., - description=( - "Topic category of the resource. e.g. `owner`. Recommended code following the [ISO/TS" - " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_TopicCategoryCode) TopicCategory" - " codelist. Suggested values: {`farming`, `biota`, `boundaries`, `climatologyMeteorologyAtmosphere`," - " `economy`, `elevation`, `environment`, `geoscientificInformation`, `health`, `imageryBaseMapsEarthCover`," - " `intelligenceMilitary`, `inlandWaters`, `location`, `oceans`, `planningCadastre`, `society`, `structure`," - " `transportation`, `utilitiesCommunication`, `extraTerrestrial`, `disaster`}" - ), - title="Topic Category", - ) - - -class Scope(SchemaBaseModel): - __root__: str = Field( - ..., - description=( - "Scope(s), or 'hierarchy level(s)' applicable to the dataset description e.g. dataset, series. Recommended" - " code following the [ISO/TS" - " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MX_ScopeCode) Scope codelist." - " Suggested values: `attribute`, `attributeType`, `collectionHardware`, `collectionSession`, `dataset`," - " `series`, `nonGeographicDataset`, `dimensionGroup`, `feature`, `featureType`, `propertyType`," - " `fieldSession`, `software`, `service`, `model`, `tile`, `initiative`, `stereomate`, `sensor`," - " `platformSeries`, `sensorSeries`, `productionSeries`, `transferAggregate`, `otherAggregate`" - ), - title="Scope / Hierarchy Level", - ) - - class Date(SchemaBaseModel): """ Date @@ -928,27 +886,13 @@ class Keywords(SchemaBaseModel): ) -class Restriction(SchemaBaseModel): - __root__: str = Field( - ..., - description=( - "A restriction to access/use a resource. e.g. 'dataset'. Recommended code following the [ISO/TS" - " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode) Restriction" - " codelist. Suggested values: {`copyright`, `patent`, `patentPending`, `trademark`, `license`," - " `intellectualPropertyRights`, `restricted`, `otherRestrictions`, `unrestricted`, `licenceUnrestricted`," - " `licenceEndUser`, `licenceDistributor`, `private`, `statutory`, `confidential`, `SBU`, `in-confidence`}" - ), - title="Restriction", - ) - - class LegalConstraints(SchemaBaseModel): """ Legal constraints associated to the resource """ useLimitation: Optional[List[str]] = None - accessConstraints: Optional[List[Restriction]] = Field( + accessConstraints: Optional[List[str]] = Field( None, description=( "A restriction to access/use a resource. e.g. 'dataset'. Recommended code following the [ISO/TS" @@ -959,7 +903,7 @@ class LegalConstraints(SchemaBaseModel): ), title="Access constraints", ) - useConstraints: Optional[List[Restriction]] = Field( + useConstraints: Optional[List[str]] = Field( None, description=( "Legal constraints concerning the use of the resource, e.g. Terms of use statement, License. Recommended" @@ -1141,7 +1085,7 @@ class IdentificationInfo(SchemaBaseModel): abstract: Optional[str] = Field(None, description="Abstract describing the dataset resource", title="Abstract") purpose: Optional[str] = Field(None, description="Purpose of the dataset resource", title="Purpose") credit: Optional[str] = Field(None, description="Credit associated to the dataset resource", title="Credit") - status: Optional[List] = Field( + status: Optional[List[str]] = Field( None, description=( "Status of the dataset resource. Recommended code following the [ISO/TS" @@ -1197,7 +1141,7 @@ class IdentificationInfo(SchemaBaseModel): spatialResolution: Optional[List[SpatialResolutionItem]] = Field( None, description="Spatial resolution of the resource", title="Spatial Resolution" ) - language: Optional[List[Language]] = Field( + language: Optional[List[str]] = Field( None, description=( "Resource language(s). Preferred code following the [ISO 639-2](http://www.loc.gov/standards/iso639-2/)" @@ -1208,7 +1152,7 @@ class IdentificationInfo(SchemaBaseModel): characterSet: Optional[List[CharacterSet]] = Field( None, description="Resource character set(s)", title="Resource character set(s)" ) - topicCategory: Optional[List[TopicCategory]] = Field( + topicCategory: Optional[List[str]] = Field( None, description=( "Topic category of the resource. e.g. `owner`. Recommended code following the [ISO/TS" @@ -1400,7 +1344,19 @@ class Lineage(SchemaBaseModel): class DataQualityInfoItem(SchemaBaseModel): - scope: Optional[Scope] = Field(None, title="Scope of the data quality information") + scope: Optional[str] = Field( + None, + description=( + "Scope(s), or 'hierarchy level(s)' applicable to the dataset description e.g. dataset, series. Recommended" + " code following the [ISO/TS" + " 19139](http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MX_ScopeCode) Scope codelist." + " Suggested values: `attribute`, `attributeType`, `collectionHardware`, `collectionSession`, `dataset`," + " `series`, `nonGeographicDataset`, `dimensionGroup`, `feature`, `featureType`, `propertyType`," + " `fieldSession`, `software`, `service`, `model`, `tile`, `initiative`, `stereomate`, `sensor`," + " `platformSeries`, `sensorSeries`, `productionSeries`, `transferAggregate`, `otherAggregate`" + ), + title="Scope of the data quality information", + ) report: Optional[List[ReportItem]] = Field( None, description="Data quality report(s) associated to the resource", title="Data quality report(s)" ) @@ -1591,7 +1547,7 @@ class Locale(SchemaBaseModel): """ id: Optional[str] = Field(None, description="Locale code, eg. FR, EN", title="Locale code") - languageCode: Optional[Language] = Field(None, description="Language", title="Language") + languageCode: Optional[str] = Field(None, description="Language", title="Language") characterEncoding: Optional[CharacterEncoding] = Field( None, description="Character encoding used e.g. UTF-8", title="Character set" ) diff --git a/pydantic_schemas/definitions/image_schema.py b/pydantic_schemas/definitions/image_schema.py index 339d700..0fd3700 100644 --- a/pydantic_schemas/definitions/image_schema.py +++ b/pydantic_schemas/definitions/image_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: image-schema.json -# timestamp: 2024-07-23T17:17:19+00:00 +# timestamp: 2024-07-24T21:06:23+00:00 from __future__ import annotations @@ -122,10 +122,6 @@ class SubjectCodesLabelledItem(SchemaBaseModel): description: Optional[str] = Field(None, description="Description of the scene", title="Subject Description") -class AltLang(SchemaBaseModel): - __root__: str = Field(..., description="Text in alternative languages") - - class Delimitertype(Enum): spatial = "spatial" temporal = "temporal" @@ -160,17 +156,17 @@ class ArtworkOrObject(SchemaBaseModel): class Config: extra = Extra.forbid - title: Optional[AltLang] = Field( + title: Optional[str] = Field( None, description="A reference for the artwork or object in the image.", title="Title {Artwork or Object detail}", ) - contentDescription: Optional[AltLang] = Field( + contentDescription: Optional[str] = Field( None, description="A textual description of the content depicted in the artwork or object.", title="Content Description {Artwork or Object detail}", ) - physicalDescription: Optional[AltLang] = Field( + physicalDescription: Optional[str] = Field( None, description=( "A textual description of the physical characteristics of the artwork or object, without reference to the" @@ -191,7 +187,7 @@ class Config: description="Globally unique identifier for the creator of artwork or object.", title="Creator ID {Artwork or Object detail}", ) - contributionDescription: Optional[AltLang] = Field( + contributionDescription: Optional[str] = Field( None, description="A textual description about a contribution made to an artwork or an object.", title="Contribution Description {Artwork or Object detail}", @@ -251,7 +247,7 @@ class Config: description="Globally unique identifier for the current owner of the copyright of the artwork or object.", title="Current Copyright Owner ID {Artwork or Object detail}", ) - copyrightNotice: Optional[AltLang] = Field( + copyrightNotice: Optional[str] = Field( None, description=( "Contains any necessary copyright notice for claiming the intellectual property for artwork or an object in" @@ -326,7 +322,7 @@ class Config: description="The globally unique identifier of the Controlled Vocabulary the term is from.", title="CV-Term CV ID {CV-Term detail}", ) - cvTermName: Optional[AltLang] = Field( + cvTermName: Optional[str] = Field( None, description="The natural language name of the term from a Controlled Vocabulary.", title="CV-Term name {CV-Term detail}", @@ -383,7 +379,7 @@ class Entity(SchemaBaseModel): class Config: extra = Extra.forbid - name: Optional[AltLang] = Field(None, description="Full name of the entity/concept", title="Name") + name: Optional[str] = Field(None, description="Full name of the entity/concept", title="Name") identifiers: Optional[List[AnyUrl]] = Field( None, description="Globally unique identifier of the entity/concept", title="Identifier" ) @@ -393,7 +389,7 @@ class EntityWRole(SchemaBaseModel): class Config: extra = Extra.forbid - name: Optional[AltLang] = Field(None, description="Full name of the entity/concept", title="Name") + name: Optional[str] = Field(None, description="Full name of the entity/concept", title="Name") role: Optional[List[AnyUrl]] = Field( None, description="Identifier of the role the entity has in the context of the metadata property", title="Role" ) @@ -406,7 +402,7 @@ class EpisodeSeason(SchemaBaseModel): class Config: extra = Extra.forbid - name: Optional[AltLang] = Field(None, description="Name of the episode or season of a series", title="Name") + name: Optional[str] = Field(None, description="Name of the episode or season of a series", title="Name") identifier: Optional[AnyUrl] = Field( None, description="Identifier of the episode or season of a series", title="Identifier" ) @@ -446,24 +442,24 @@ class Location(SchemaBaseModel): class Config: extra = Extra.forbid - name: Optional[AltLang] = Field(None, description="Full name of the location", title="Name") + name: Optional[str] = Field(None, description="Full name of the location", title="Name") identifiers: Optional[List[AnyUrl]] = Field( None, description="Globally unique identifier of the location", title="Identifier" ) - worldRegion: Optional[AltLang] = Field( + worldRegion: Optional[str] = Field( None, description="Name of the world region the Location is located in", title="World region name" ) - countryName: Optional[AltLang] = Field( + countryName: Optional[str] = Field( None, description="Name of the country the Location is located in", title="Country name" ) countryCode: Optional[str] = Field( None, description="ISO code of the country the Location is located in", title="Country ISO code" ) - provinceState: Optional[AltLang] = Field( + provinceState: Optional[str] = Field( None, description="Name of the state or province the Location is located in", title="State/Province name" ) - city: Optional[AltLang] = Field(None, description="Name of the city the Location is located in", title="City name") - sublocation: Optional[AltLang] = Field( + city: Optional[str] = Field(None, description="Name of the city the Location is located in", title="City name") + sublocation: Optional[str] = Field( None, description="Name of a sub location the Location is located in", title="Sublocation name" ) gpsAltitude: Optional[float] = Field( @@ -481,8 +477,8 @@ class PersonWDetails(SchemaBaseModel): class Config: extra = Extra.forbid - name: Optional[AltLang] = Field(None, description="Name of the person", title="Name") - description: Optional[AltLang] = Field(None, description="A textual description of the person", title="Description") + name: Optional[str] = Field(None, description="Name of the person", title="Name") + description: Optional[str] = Field(None, description="A textual description of the person", title="Description") identifiers: Optional[List[AnyUrl]] = Field( None, description="Globally unique identifier of the person", title="Identifier" ) @@ -495,7 +491,7 @@ class Product(SchemaBaseModel): class Config: extra = Extra.forbid - description: Optional[AltLang] = Field( + description: Optional[str] = Field( None, description="A textual description of the product.", title="Description {Product detail}" ) gtin: str = Field( @@ -503,22 +499,20 @@ class Config: description="A 14 digit GTIN (Global Trade Item Number) of the product (GTIN-8 to GTIN-14 codes are used).", title="GTIN {Product detail}", ) - name: Optional[AltLang] = Field(None, description="Name of the product.", title="Name {Product detail}") + name: Optional[str] = Field(None, description="Name of the product.", title="Name {Product detail}") class ProductWGtin(SchemaBaseModel): class Config: extra = Extra.forbid - name: Optional[AltLang] = Field(None, description="Name of the product.", title="Name") + name: Optional[str] = Field(None, description="Name of the product.", title="Name") gtin: str = Field( ..., description="A 14 digit GTIN (Global Trade Item Number) of the product (GTIN-8 to GTIN-14 codes are used).", title="GTIN", ) - description: Optional[AltLang] = Field( - None, description="A textual description of the product.", title="Description" - ) + description: Optional[str] = Field(None, description="A textual description of the product.", title="Description") class PublicationEvent(SchemaBaseModel): @@ -528,7 +522,7 @@ class Config: date: datetime = Field( ..., description="Date and optionally the time of publishing the video", title="Publication Date" ) - name: Optional[AltLang] = Field( + name: Optional[str] = Field( None, description="Name of the event for publishing this video.", title="Publication Event Name" ) identifier: Optional[AnyUrl] = Field( @@ -630,7 +624,7 @@ class Series(SchemaBaseModel): class Config: extra = Extra.forbid - name: Optional[AltLang] = Field(None, description="Name of the series", title="Series name") + name: Optional[str] = Field(None, description="Name of the series", title="Series name") identifier: Optional[AnyUrl] = Field(None, description="Identifier for the series", title="Series identifier") @@ -826,7 +820,7 @@ class PhotoVideoMetadataIPTC(SchemaBaseModel): class Config: extra = Extra.forbid - title: Optional[AltLang] = Field( + title: Optional[str] = Field( None, description=( "A shorthand reference for the digital image. Title provides a short human readable name which can be a" @@ -863,13 +857,13 @@ class Config: ), title="Date Created", ) - headline: Optional[AltLang] = Field( + headline: Optional[str] = Field( None, description="A brief synopsis of the caption. Headline is not the same as Title.", title="Headline" ) - eventName: Optional[AltLang] = Field( + eventName: Optional[str] = Field( None, description="Names or describes the specific event at which the photo was taken.", title="Event" ) - description: Optional[AltLang] = Field( + description: Optional[str] = Field( None, description="A textual description, including captions, of the image.", title="Description" ) captionWriter: Optional[str] = Field( @@ -982,7 +976,7 @@ class Config: description="Identifies the most recent supplier of the image, who is not necessarily its owner or creator.", title="Image Supplier", ) - copyrightNotice: Optional[AltLang] = Field( + copyrightNotice: Optional[str] = Field( None, description=( "Contains any necessary copyright notice for claiming the intellectual property for this photograph and" @@ -995,7 +989,7 @@ class Config: copyrightOwners: Optional[List[EntityWRole]] = Field( None, description="Owner or owners of the copyright in the licensed image.", title="Copyright Owner" ) - usageTerms: Optional[AltLang] = Field( + usageTerms: Optional[str] = Field( None, description="The licensing parameters of the image expressed in free-text.", title="Rights Usage Terms" ) embdEncRightsExpr: Optional[List[EmbdEncRightsExpr]] = Field( diff --git a/pydantic_schemas/definitions/microdata_schema.py b/pydantic_schemas/definitions/microdata_schema.py index 6af8dc5..f3bb4d3 100644 --- a/pydantic_schemas/definitions/microdata_schema.py +++ b/pydantic_schemas/definitions/microdata_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: microdata-schema.json -# timestamp: 2024-07-23T17:17:20+00:00 +# timestamp: 2024-07-24T21:06:25+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/script_schema.py b/pydantic_schemas/definitions/script_schema.py index 042ea31..17ef719 100644 --- a/pydantic_schemas/definitions/script_schema.py +++ b/pydantic_schemas/definitions/script_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: script-schema.json -# timestamp: 2024-07-23T17:17:22+00:00 +# timestamp: 2024-07-24T21:06:27+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/series_schema.py b/pydantic_schemas/definitions/series_schema.py index 8b3c14d..3c371ae 100644 --- a/pydantic_schemas/definitions/series_schema.py +++ b/pydantic_schemas/definitions/series_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: series-schema.json -# timestamp: 2024-07-23T17:17:24+00:00 +# timestamp: 2024-07-24T21:06:28+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/table_schema.py b/pydantic_schemas/definitions/table_schema.py index c21806c..d04c0bb 100644 --- a/pydantic_schemas/definitions/table_schema.py +++ b/pydantic_schemas/definitions/table_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: table-schema.json -# timestamp: 2024-07-23T17:17:25+00:00 +# timestamp: 2024-07-24T21:06:30+00:00 from __future__ import annotations @@ -386,40 +386,16 @@ class AuthoringEntityItem(SchemaBaseModel): ) -class AuthoringEntity(SchemaBaseModel): - """ - The person, corporate body, or agency responsible for the work's substantive and intellectual content. Repeat the element for each author, and use 'affiliation' attribute if available. Invert first and last name and use commas. - """ - - __root__: List[AuthoringEntityItem] = Field( - ..., - description=( - "The person, corporate body, or agency responsible for the work's substantive and intellectual content." - " Repeat the element for each author, and use 'affiliation' attribute if available. Invert first and last" - " name and use commas." - ), - title="Authoring entity/Primary investigators", - ) - - class ContributorItem(PublisherItem): pass -class Contributor(SchemaBaseModel): - __root__: List[ContributorItem] - - class KeywordItem(SchemaBaseModel): name: Optional[str] = Field(None, title="Name") vocabulary: Optional[str] = Field(None, title="Vocabulary name") uri: Optional[str] = Field(None, title="Vocabulary URI") -class Keyword(SchemaBaseModel): - __root__: List[KeywordItem] - - class TableDescription(SchemaBaseModel): """ Table Description @@ -430,8 +406,10 @@ class Config: title_statement: Optional[TitleStatement] = Field(None, description="Title statement") identifiers: Optional[List[Identifier]] = Field(None, description="Other identifiers", title="Other identifiers") - authoring_entity: Optional[AuthoringEntity] = Field(None, description="Authoring entity", title="Authoring entity") - contributors: Optional[Contributor] = Field(None, description="Contributors", title="Contributors") + authoring_entity: Optional[List[AuthoringEntityItem]] = Field( + None, description="Authoring entity", title="Authoring entity" + ) + contributors: Optional[List[ContributorItem]] = Field(None, description="Contributors", title="Contributors") publisher: Optional[List[PublisherItem]] = Field(None, description="Publisher", title="Publisher") date_created: Optional[str] = Field(None, description="Date created", title="Date created") date_published: Optional[str] = Field(None, title="Date published") @@ -470,7 +448,7 @@ class Config: links: Optional[List[Link]] = Field(None, title="Links") api_documentation: Optional[List[ApiDocumentationItem]] = Field(None, description="API Documentation") publications: Optional[List[Publication]] = Field(None, title="Publications") - keywords: Optional[Keyword] = Field(None, description="Keywords", title="Keywords") + keywords: Optional[List[KeywordItem]] = Field(None, description="Keywords", title="Keywords") themes: Optional[List[Theme]] = Field(None, description="Themes") topics: Optional[List[Topic]] = Field( None, diff --git a/pydantic_schemas/definitions/timeseries_db_schema.py b/pydantic_schemas/definitions/timeseries_db_schema.py index cbc875f..6c5bc95 100644 --- a/pydantic_schemas/definitions/timeseries_db_schema.py +++ b/pydantic_schemas/definitions/timeseries_db_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: timeseries-db-schema.json -# timestamp: 2024-07-23T17:17:27+00:00 +# timestamp: 2024-07-24T21:06:31+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/timeseries_schema.py b/pydantic_schemas/definitions/timeseries_schema.py index 416610e..b3f39a2 100644 --- a/pydantic_schemas/definitions/timeseries_schema.py +++ b/pydantic_schemas/definitions/timeseries_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: timeseries-schema.json -# timestamp: 2024-07-23T17:17:29+00:00 +# timestamp: 2024-07-24T21:06:33+00:00 from __future__ import annotations diff --git a/pydantic_schemas/definitions/video_schema.py b/pydantic_schemas/definitions/video_schema.py index 2c5c4fb..f0a26c9 100644 --- a/pydantic_schemas/definitions/video_schema.py +++ b/pydantic_schemas/definitions/video_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: video-schema.json -# timestamp: 2024-07-23T17:17:30+00:00 +# timestamp: 2024-07-24T21:06:35+00:00 from __future__ import annotations From 5b5fc429e8715e69c45a933cf41a739aa17da58e Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Mon, 29 Jul 2024 10:48:29 -0400 Subject: [PATCH 28/51] rewrite the excel to pydantic --- excel_sheets/Document_metadata.xlsx | Bin 115353 -> 180719 bytes excel_sheets/Script_metadata.xlsx | Bin 122191 -> 188842 bytes excel_sheets/Series_metadata.xlsx | Bin 74107 -> 49843 bytes excel_sheets/Survey_microdata_metadata.xlsx | Bin 168918 -> 269270 bytes excel_sheets/Table_metadata.xlsx | Bin 109767 -> 178976 bytes excel_sheets/Timeseries_DB_metadata.xlsx | Bin 94531 -> 65537 bytes excel_sheets/Timeseries_metadata.xlsx | Bin 172568 -> 244226 bytes excel_sheets/Video_metadata.xlsx | Bin 96419 -> 68939 bytes pydantic_schemas/excel_to_pydantic.py | 219 ------------- .../tests/test_pydantic_to_excel.py | 77 +++-- pydantic_schemas/tests/test_quick_start.py | 7 +- pydantic_schemas/utils/__init__.py | 0 pydantic_schemas/utils/excel_to_pydantic.py | 300 ++++++++++++++++++ .../{ => utils}/pydantic_to_excel.py | 154 +++++---- pydantic_schemas/{ => utils}/quick_start.py | 2 +- pydantic_schemas/{ => utils}/utils.py | 22 +- 16 files changed, 471 insertions(+), 310 deletions(-) delete mode 100644 pydantic_schemas/excel_to_pydantic.py create mode 100644 pydantic_schemas/utils/__init__.py create mode 100644 pydantic_schemas/utils/excel_to_pydantic.py rename pydantic_schemas/{ => utils}/pydantic_to_excel.py (79%) rename pydantic_schemas/{ => utils}/quick_start.py (99%) rename pydantic_schemas/{ => utils}/utils.py (89%) diff --git a/excel_sheets/Document_metadata.xlsx b/excel_sheets/Document_metadata.xlsx index 63f799fa292a5a5d43c76d52dd7b3c11f0e998d2..1c31afdb0624295fe5735fef796a06fa3638313e 100644 GIT binary patch literal 180719 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 diff --git a/excel_sheets/Script_metadata.xlsx b/excel_sheets/Script_metadata.xlsx index 2fe3959fd28407e32b9683f8fed81cd1b3fe1109..0ff2eda8e736beb46e2de203168393cd588274c2 100644 GIT binary patch literal 188842 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

6znc=(WTv(ksWyaNUx1 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 UgO85X(@uvy2OSZvPWs6H53yVuSpWb4 diff --git a/excel_sheets/Series_metadata.xlsx b/excel_sheets/Series_metadata.xlsx index 719489253a3844c52dc0a54b87b0e61ce2a41b9a..526917be956f33fe6c40ab56ae090d962724e4a3 100644 GIT binary patch literal 49843 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

SPr4 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 diff --git a/excel_sheets/Survey_microdata_metadata.xlsx b/excel_sheets/Survey_microdata_metadata.xlsx index 2fce8f417cbfee250dc0f6a063b0173e21861a56..03f5fea54b7ca93ac205630f6c8ca50a422d40d3 100644 GIT binary patch literal 269270 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 xk#o_v#}HBk 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 literal 94531 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 diff --git a/excel_sheets/Timeseries_metadata.xlsx b/excel_sheets/Timeseries_metadata.xlsx index a4e8aab816682f27c9e040a5ea468124ada06711..eb5ca7428cfe9f295532ecc13d95c85377a4647c 100644 GIT binary patch literal 244226 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 literal 172568 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 J0q45X{{i}jSwsK; diff --git a/excel_sheets/Video_metadata.xlsx b/excel_sheets/Video_metadata.xlsx index 15ccc9bb3044dda9eaa63fe2b1ea5a720a2fe3f9..b549c7d2d62112573cab928ad22e19b8c5b23ddb 100644 GIT binary patch literal 68939 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 Tx#Z-=fG`7tc(0=LYw~{ps}4+l literal 96419 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 Fe*xltuK@r6 diff --git a/pydantic_schemas/excel_to_pydantic.py b/pydantic_schemas/excel_to_pydantic.py deleted file mode 100644 index 0bd1f1e..0000000 --- a/pydantic_schemas/excel_to_pydantic.py +++ /dev/null @@ -1,219 +0,0 @@ -import json -import warnings -from collections.abc import Iterable -from typing import Dict, Optional, Type, Union, get_args, get_origin - -import numpy as np -import pandas as pd -from pydantic import BaseModel, create_model - -from .utils import ( - annotation_contains_dict, - annotation_contains_list, - get_subtype_of_optional_or_list, - is_list_annotation, - seperate_simple_from_pydantic, - subset_pydantic_model_type, -) - - -def find_string_and_count_nans(arr, search_str): - """ - Finds the index of the first occurrence of a string in a NumPy array, - and counts the number of NaNs immediately following that string. - - Args: - - arr (np.ndarray): The NumPy array to search in. - - search_str (str): The string to search for. - - Returns: - - tuple: (index, nan_count) - - index (int): Index of the first occurrence of the string, or -1 if not found. - - nan_count (int): Number of NaNs immediately following the string. - """ - index = np.where(arr == search_str)[0] # Find index of the first occurrence - if len(index) == 0: - return -1, 0 # Return -1 if string not found, nan_count is 0 - index = index[0] # Take the first occurrence index - nan_count = 0 - for i in range(index + 1, len(arr)): - if pd.isna(arr[i]): - nan_count += 1 - else: - break - return int(index), nan_count - - -def is_horizontally_organized(m: Type[BaseModel], df: pd.DataFrame): - """True if the index is along the top with the values below. False if the index is on the left side with the values to the right""" - rows, cols = df.shape - if rows == 1: - return True - elif cols == 1: - return False - - print("is_horizontally_organized is looking at ", m) - if is_list_annotation(m): - m = get_subtype_of_optional_or_list(m) - expected_fields = m.model_json_schema()["properties"].keys() - fields_if_horizontally_arranged = df.iloc[0, :].values - fields_if_vertically_arranged = df.iloc[:, 0].values - - horizontal_intersection = len(set(expected_fields).intersection(fields_if_horizontally_arranged)) - vertical_intersection = len(set(expected_fields).intersection(fields_if_vertically_arranged)) - return horizontal_intersection > vertical_intersection - - -def get_relevant_sub_frame(m: Type[BaseModel], df: pd.DataFrame, name_of_field: Optional[str] = None): - """ - THe dataframe likely contains lots and lots of information about other models. - - THis function obtains only that information that pertains to this model - """ - names = df.iloc[:, 0].values - try: - name_of_class = m.model_json_schema()["title"] - - idx, sze = find_string_and_count_nans(names, name_of_class) - except AttributeError: - idx = -1 - sze = 0 - if idx < 0: - if name_of_field is not None: - idx, sze = find_string_and_count_nans(names, name_of_field) - if idx < 0: - error_message = f"'{name_of_class}' " - if name_of_field is not None: - error_message += f"and '{name_of_field}' " - error_message += f"not found in {names}" - raise IndexError(error_message) - - sub = df.iloc[idx : idx + sze + 1, 1:] - - sub = sub.dropna(how="all", axis=0) # drop all null rows - sub = sub.dropna(how="all", axis=1) # drop all null columns - print("SubFrame = \n", sub) - if is_horizontally_organized(m, sub): - sub = sub.T - return sub - - -def get_value(name, field_annotation, df, is_list=False): - if isinstance(field_annotation, type(BaseModel)): - print(f"BASE: {field_annotation}") - sub = get_relevant_sub_frame(field_annotation, df, name) - print(sub) - base_instance = get_instance_of_pydantic(field_annotation, sub, is_list=is_list) - print("BASE INSTANCE: ", base_instance) - return base_instance - elif annotation_contains_dict(field_annotation): - dictionary_type = create_model(name, **{"key": (Optional[str], None), "value": (Optional[str], None)}) - sub = get_relevant_sub_frame(dictionary_type, df, name) - dict_results = get_instance_of_pydantic(dictionary_type, sub, is_list=True) - ret = {} - for d in dict_results: - ret[d.key] = d.value - return ret - elif annotation_contains_list(field_annotation): - print("LIST", name, field_annotation) - sub_type = get_subtype_of_optional_or_list(field_annotation) - vals = get_value(name, sub_type, df, is_list=True) - print(f"vals in get_value of list: {vals}") - if is_list: - # we had a list of lists! - vals = [json.loads(v.replace("'", '"')) if isinstance(v, str) else v for v in vals] - - return vals - else: - print(f"builtin: {name}") - sub = df.set_index(df.columns[0]) - if name in sub.index: - values = sub.loc[name].values - if is_list: - print(values) - return values - if len(values) > 0: - return values[0] - print(f"No values found for name = {name}, field annotation = {field_annotation}") - if isinstance(field_annotation, type(str)): - warnings.warn( - f"Required string field '{name}' not found, setting to an empty string", - UserWarning, - ) - return "" - return None - - -def get_instance_of_pydantic(model_type: Type[BaseModel], df, is_list=False): - objects = {k: v.annotation for k, v in model_type.model_fields.items()} - ret = {} - for name, field in objects.items(): - ret[name] = get_value(name, field, df, is_list=is_list) - print(f"for {name} got {ret[name]}") - if is_list: - print(f"Making a list of pydantic objects from {ret}") - num_list_elements = set([len(v) for _, v in ret.items()]) - assert len(num_list_elements) == 1, ret - num_list_elements = num_list_elements.pop() - elements = [] - for i in range(num_list_elements): - sub = {k: v[i] for k, v in ret.items()} - if all([v is None for _, v in sub.items()]): - continue - elements.append(model_type(**sub)) - return elements - else: - for k, v in ret.items(): - if isinstance(v, list) or isinstance(v, np.ndarray): - ret[k] = [elem for elem in v if elem is not None] - print(ret) - return model_type(**ret) - - -def excel_sheet_to_pydantic(filename: str, sheetname: str, model_type: Type[BaseModel]): - df = pd.read_excel(filename, sheet_name=sheetname, header=None) - df = df.where(df.notnull(), None) - try: - df = get_relevant_sub_frame(model_type, df) - except (KeyError, IndexError): - pass - children = seperate_simple_from_pydantic(model_type) - ret = {} - if len(children["simple"]): - sub = get_relevant_sub_frame(model_type, df, name_of_field=df.iloc[0, 0]) - for name in children["simple"]: - print(f"Looking to get {name}") - field = model_type.model_fields[name] - ret[name] = get_value(name, field.annotation, sub) - print() - for name in children["pydantic"]: - print(f"Looking to get {name}") - ret[name] = get_value(name, model_type.model_fields[name].annotation, df) - print() - for k, v in ret.items(): - if isinstance(v, list) or isinstance(v, np.ndarray): - ret[k] = [elem for elem in v if elem is not None] - print(ret) - - return model_type(**ret) - - -def excel_doc_to_pydantic(filename, model_type): - children = seperate_simple_from_pydantic(model_type) - annotations = {k: v.annotation for k, v in model_type.model_fields.items()} - ret = {} - - if len(children["simple"]) > 0: - field_type = subset_pydantic_model_type(model_type, children["simple"]) - toplevel = excel_sheet_to_pydantic(filename, sheetname="metadata", model_type=field_type) - ret.update(toplevel.model_dump()) - for fieldname in children["pydantic"]: - print(f"Looking to get {fieldname}") - field_type = annotations[fieldname] - if isinstance(field_type, type(BaseModel)): - ret[fieldname] = excel_sheet_to_pydantic(filename, sheetname=fieldname, model_type=field_type) - else: - field_type = subset_pydantic_model_type(model_type, [fieldname]) - sublevel = excel_sheet_to_pydantic(filename, sheetname=fieldname, model_type=field_type) - ret.update(sublevel.model_dump()) - return model_type(**ret) diff --git a/pydantic_schemas/tests/test_pydantic_to_excel.py b/pydantic_schemas/tests/test_pydantic_to_excel.py index 9062f68..5206c74 100644 --- a/pydantic_schemas/tests/test_pydantic_to_excel.py +++ b/pydantic_schemas/tests/test_pydantic_to_excel.py @@ -17,22 +17,25 @@ from pydantic_schemas.definitions.timeseries_db_schema import TimeseriesDatabaseSchema from pydantic_schemas.definitions.timeseries_schema import TimeseriesSchema from pydantic_schemas.definitions.video_schema import Model as VideoModel -from pydantic_schemas.quick_start import make_skeleton - -from ..excel_to_pydantic import excel_doc_to_pydantic, excel_sheet_to_pydantic -from ..pydantic_to_excel import ( +from pydantic_schemas.utils.excel_to_pydantic import ( + excel_doc_to_pydantic, + excel_sheet_to_pydantic, + excel_single_sheet_to_pydantic, +) +from pydantic_schemas.utils.pydantic_to_excel import ( correct_column_widths, create_sheet_and_write_title, shade_30_rows, shade_locked_cells, write_across_many_sheets, write_nested_simple_pydantic_to_sheet, - write_simple_pydantic_to_sheet, + write_to_single_sheet, ) +from pydantic_schemas.utils.quick_start import make_skeleton -@pytest.mark.parametrize("index_above", [True, False]) -def test_simple_schema(tmpdir, index_above): +# @pytest.mark.parametrize("index_above", [True, False]) +def test_simple_schema(tmpdir, index_above=False): class Simple(BaseModel): idno: str title: str @@ -56,8 +59,8 @@ class Simple(BaseModel): assert parsed_simple == simple_original, parsed_simple -@pytest.mark.parametrize("index_above", [True, False]) -def test_two_layer_simple_schema(tmpdir, index_above): +# @pytest.mark.parametrize("index_above", [True, False]) +def test_two_layer_simple_schema(tmpdir, index_above=False): class Production(BaseModel): idno: str title: str @@ -77,7 +80,6 @@ class ProductionAndCountries(BaseModel): ) filename = tmpdir.join(f"integration_test_two_layer_simple_schema_{index_above}.xlsx") - # filename = "GORDON_twolayer.xlsx" sheetname = "Document Metadata" sheet_title = "Document Metadata" current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) @@ -241,9 +243,18 @@ class ProductionAndCountries(BaseModel): def test_lists(tmpdir): + class ContactMethod(Enum): + phone = "PHONE" + email = "EMAIL" + + class Contact(BaseModel): + method: Optional[ContactMethod] = None + contact_address: Optional[str] = None + class Person(BaseModel): name: str affiliations: Optional[List[str]] = None + contact_details: Optional[List[Contact]] = None class Production(BaseModel): idno: Optional[str] = None @@ -262,8 +273,15 @@ class ProductionAndCountries(BaseModel): otherOptional: Optional[List[str]] = None author0 = Person(name="person_0") - author1 = Person(name="person_1", affiliations=["Org1", "Org2"]) - author2 = Person(name="person_2") + author1 = Person( + name="person_1", + affiliations=["Org1", "Org2"], + contact_details=[ + Contact(method=ContactMethod.email, contact_address="example@example.com"), + Contact(method=ContactMethod.phone, contact_address="123456789"), + ], + ) + author2 = Person(name="person_2", contact_details=[Contact()]) author3 = Person(name="person_3", affiliations=["Org3"]) example_production = Production(idno="", authors=[author0, author1, author2, author3]) example_country = Country(name="MadeupCountry", initials="MC") @@ -292,7 +310,7 @@ class ProductionAndCountries(BaseModel): assert new_pandc.production.idno is None assert new_pandc.production.title is None assert len(new_pandc.production.authors) == 4 - assert author1 in new_pandc.production.authors + assert author0 in new_pandc.production.authors assert author1 in new_pandc.production.authors assert author2 in new_pandc.production.authors assert author3 in new_pandc.production.authors @@ -370,33 +388,37 @@ class SubDict(BaseModel): class WithDict(BaseModel): additional: Optional[Dict[str, Any]] = Field(None, description="Additional metadata") + optional_dict: Optional[Dict[str, Any]] = None sub: SubDict wd = WithDict(additional={"s": "sa", "a": "va"}, sub=SubDict(sub_additional={"sub": "subval", "sub2": "subval2"})) filename = tmpdir.join(f"integration_test_dictionaries_.xlsx") - write_across_many_sheets(filename, wd, title="Dictionaries") parsed_outp = excel_doc_to_pydantic(filename, WithDict) assert parsed_outp == wd, parsed_outp NAME_TO_TYPE = { - "Document": (ScriptSchemaDraft, write_across_many_sheets), + "Document": (ScriptSchemaDraft, write_across_many_sheets, excel_doc_to_pydantic), # "Geospatial":GeospatialSchema, # "Image":ImageDataTypeSchema, - "Survey_microdata": (MicrodataSchema, write_across_many_sheets), - "Script": (ResearchProjectSchemaDraft, write_across_many_sheets), - "Series": (Series, write_across_many_sheets), # should be one sheet - "Table": (TableModel, write_across_many_sheets), - "Timeseries_DB": (TimeseriesDatabaseSchema, write_across_many_sheets), # could be one sheet - "Timeseries": (TimeseriesSchema, write_across_many_sheets), - "Video": (VideoModel, write_across_many_sheets), # could be one sheet + "Survey_microdata": (MicrodataSchema, write_across_many_sheets, excel_doc_to_pydantic), + "Script": (ResearchProjectSchemaDraft, write_across_many_sheets, excel_doc_to_pydantic), + "Series": (Series, write_to_single_sheet, excel_single_sheet_to_pydantic), # should be one sheet + "Table": (TableModel, write_across_many_sheets, excel_doc_to_pydantic), + "Timeseries_DB": ( + TimeseriesDatabaseSchema, + write_to_single_sheet, + excel_single_sheet_to_pydantic, + ), # could be one sheet + "Timeseries": (TimeseriesSchema, write_across_many_sheets, excel_doc_to_pydantic), + "Video": (VideoModel, write_to_single_sheet, excel_single_sheet_to_pydantic), # could be one sheet } -@pytest.mark.parametrize("name, type_and_writer", [(k, v) for k, v in NAME_TO_TYPE.items()]) -def test_write_real_skeleton(tmpdir, name, type_and_writer): - type, writer = type_and_writer +@pytest.mark.parametrize("name, type_writer_reader", [(k, v) for k, v in NAME_TO_TYPE.items()]) +def test_write_real_skeleton(tmpdir, name, type_writer_reader): + type, writer, reader = type_writer_reader # folder = "excel_sheets" filename = os.path.join(tmpdir, f"{name}_metadata.xlsx") if os.path.exists(filename): @@ -404,6 +426,7 @@ def test_write_real_skeleton(tmpdir, name, type_and_writer): ob = make_skeleton(type) writer(filename, ob, name) + reader(filename, type) def test_demo(): @@ -446,9 +469,9 @@ class MetaDataOfVariousHierarchies(BaseModel): example = MetaDataOfVariousHierarchies( single_level_data=SingleLevelData(title="Metadata demo", author="FirstName LastName"), multi_level_data=MultiLevelAndListData( - description=Description(statement="Data can be hierarchical", abstract="Or it can be in lists"), + description=Description(statement="Data can be hierarchical", abstract="like this"), countries=[ - Country(name="MyCountry", initials="MC", list_of_alternative_names=["Lists", "can have lists"]), + Country(name="MyCountry", initials="MC", list_of_alternative_names=["And Lists", "can have lists"]), Country(name="YourCountry", initials="YC"), ], organization="Example Org", diff --git a/pydantic_schemas/tests/test_quick_start.py b/pydantic_schemas/tests/test_quick_start.py index 4d6f0ed..49dd752 100644 --- a/pydantic_schemas/tests/test_quick_start.py +++ b/pydantic_schemas/tests/test_quick_start.py @@ -4,7 +4,12 @@ import pytest from pydantic import AnyUrl, BaseModel, Field, confloat -from ..quick_start import DEFAULT_URL, METADATA_TYPES_FILE_MAP, create_empty_schema_from_path, make_skeleton +from pydantic_schemas.utils.quick_start import ( + DEFAULT_URL, + METADATA_TYPES_FILE_MAP, + create_empty_schema_from_path, + make_skeleton, +) def test_simple_strings(): diff --git a/pydantic_schemas/utils/__init__.py b/pydantic_schemas/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pydantic_schemas/utils/excel_to_pydantic.py b/pydantic_schemas/utils/excel_to_pydantic.py new file mode 100644 index 0000000..9ecece7 --- /dev/null +++ b/pydantic_schemas/utils/excel_to_pydantic.py @@ -0,0 +1,300 @@ +import json +import warnings +from collections.abc import Iterable +from typing import Any, Dict, List, Optional, Type, Union, get_args, get_origin + +import numpy as np +import pandas as pd +from pydantic import BaseModel, create_model + +from .quick_start import make_skeleton +from .utils import ( + annotation_contains_dict, + annotation_contains_list, + annotation_contains_pydantic, + get_subtype_of_optional_or_list, + is_dict_annotation, + is_list_annotation, + is_optional_annotation, + is_optional_list, + seperate_simple_from_pydantic, + subset_pydantic_model_type, +) + + +def find_string_and_count_nans(arr, search_str): + """ + Finds the index of the first occurrence of a string in a NumPy array, + and counts the number of NaNs immediately following that string. + + Args: + - arr (np.ndarray): The NumPy array to search in. + - search_str (str): The string to search for. + + Returns: + - tuple: (index, nan_count) + - index (int): Index of the first occurrence of the string, or -1 if not found. + - nan_count (int): Number of NaNs immediately following the string. + """ + index = np.where(arr == search_str)[0] # Find index of the first occurrence + if len(index) == 0: + return -1, 0 # Return -1 if string not found, nan_count is 0 + index = index[0] # Take the first occurrence index + nan_count = 0 + for i in range(index + 1, len(arr)): + if pd.isna(arr[i]): + nan_count += 1 + else: + break + return int(index), nan_count + + +# def is_horizontally_organized(m: Type[BaseModel], df: pd.DataFrame): +# """True if the index is along the top with the values below. False if the index is on the left side with the values to the right""" +# rows, cols = df.shape +# if rows == 1: +# return True +# elif cols == 1: +# return False + +# print("is_horizontally_organized is looking at ", m) +# if is_list_annotation(m): +# m = get_subtype_of_optional_or_list(m) +# expected_fields = m.model_json_schema()["properties"].keys() +# fields_if_horizontally_arranged = df.iloc[0, :].values +# fields_if_vertically_arranged = df.iloc[:, 0].values + +# horizontal_intersection = len(set(expected_fields).intersection(fields_if_horizontally_arranged)) +# vertical_intersection = len(set(expected_fields).intersection(fields_if_vertically_arranged)) +# return horizontal_intersection > vertical_intersection + + +def get_relevant_sub_frame(m: Type[BaseModel], df: pd.DataFrame, name_of_field: Optional[str] = None): + """ + THe dataframe likely contains lots and lots of information about other models. + + THis function obtains only that information that pertains to this model + """ + names = df.iloc[:, 0].values + try: + name_of_class = m.model_json_schema()["title"] + + idx, sze = find_string_and_count_nans(names, name_of_class) + except AttributeError: + idx = -1 + sze = 0 + if idx < 0: + if name_of_field is not None: + idx, sze = find_string_and_count_nans(names, name_of_field) + if idx < 0: + error_message = f"'{m}' " + if name_of_field is not None: + error_message += f"and '{name_of_field}' " + error_message += f"not found in {names}" + raise IndexError(error_message) + + sub = df.iloc[idx : idx + sze + 1, 1:] + + sub = sub.dropna(how="all", axis=0) # drop all null rows + sub = sub.dropna(how="all", axis=1) # drop all null columns + print("SubFrame = \n", sub) + # if is_horizontally_organized(m, sub): + # sub = sub.T + return sub + + +def handle_optional(name, annotation, df, from_within_list: bool = False): + args = [a for a in get_args(annotation) if a is not type(None)] + assert len(args) == 1, f"handle_optional encountered {args}" + ret = annotation_switch(name, args[0], df, from_within_list=from_within_list) + print(f"optional ret: {ret}") + print(f"isinstance(ret, list): {isinstance(ret, list)}") + # print(f"len(ret): {len(ret)}") + if (isinstance(ret, list) or isinstance(ret, dict)) and len(ret) == 0: + return None + elif isinstance(ret, str) and ret == "": + return None + else: + return ret + + +def handle_list(name, anno, df): + subtype = get_subtype_of_optional_or_list(anno) + if isinstance(subtype, type(BaseModel)): + try: + subframe = get_relevant_sub_frame(subtype, df, name_of_field=name) + except IndexError: + return [] + list_of_subs = [] + for c in subframe.columns[1:]: + subsubframe = subframe.loc[:, [subframe.columns[0], c]] + print("subsubframe") + print(subsubframe) + print() + sub = instantiate_pydantic_object(model_type=subtype, df=subsubframe, from_within_list=True) + print(f"instantiated: {sub}") + list_of_subs.append(sub) + return list_of_subs + # raise NotImplementedError(f"handle_list - {name}, {anno}, {subframe}") + else: + values = df.set_index(df.columns[0]).loc[name] + print(f"handle_list anno:{anno}, value: {values}") + return [v for v in values if v is not None] + + +def handle_list_within_list(name, anno, df): + print(f"handle_list_within_list {name}, {anno}") + print(df) + values = df.set_index(df.columns[0]).loc[name, df.columns[1]] + print(f"values: {values}, {type(values)}") + if values is None: + return [] + values = json.loads(values.replace("'", '"').replace("None", "null")) + if len(values) == 0: + return [] + sub_type = get_subtype_of_optional_or_list(anno) + if isinstance(values[0], dict) and annotation_contains_pydantic(sub_type): + return [sub_type(**v) for v in values] + elif not isinstance(values[0], dict) and not annotation_contains_pydantic(sub_type): + return [sub_type(v) for v in values] + else: + raise NotImplementedError(f"handle_list_within_list unexpected values - {name}, {anno}, {values}, {df}") + + +def handle_builtin_or_enum(name, anno, df): + print(df) + if len(df) == 0: + return "" + df_indexed = df.set_index(df.columns[0]) + print("handle_builtin_or_enum", df_indexed) + # return df_indexed.loc[name, df.columns[1]] + if name not in df_indexed.index: + return "" + values = df_indexed.loc[name] + if len(values) == 0: + return "" + values = [v for v in values if v is not None] + if len(values) == 0: + return "" + elif len(values) >= 2: + raise ValueError(f"Expected only a single value but got {values}") + else: + return values[0] + + +def handle_dict(name, anno, df): + dictionary_type = create_model(name, **{"key": (Optional[List[str]], None), "value": (Optional[List[Any]], None)}) + dict_results = annotation_switch(name, dictionary_type, df) + if ( + dict_results.key is None + or len(dict_results.key) == 0 + or dict_results.value is None + or len(dict_results.value) == 0 + ): + return {} + else: + ret = {k: v for k, v in zip(dict_results.key, dict_results.value) if k is not None} + return ret + # raise NotImplementedError(f"Dictionary: {name}, {anno}, {dict_results}, {ret}") + + +def annotation_switch(name: str, anno, df: pd.DataFrame, from_within_list=False) -> Any: + print(f"annotation_to_value name: {name}") + if is_optional_annotation(anno): + print("optional") + return handle_optional(name, anno, df, from_within_list=from_within_list) + elif is_dict_annotation(anno): + return handle_dict(name, anno, df) + elif is_list_annotation(anno): + if from_within_list: + print("list within a list") + return handle_list_within_list(name, anno, df) + else: + print("list") + return handle_list(name, anno, df) + elif isinstance(anno, type(BaseModel)): + print("pydantic") + try: + sub = get_relevant_sub_frame(anno, df, name_of_field=name) + except IndexError: + return make_skeleton(anno) + return instantiate_pydantic_object(anno, sub) + elif len(get_args(anno)) == 0: + print("builtin or enum") + return handle_builtin_or_enum(name, anno, df) + else: + raise NotImplementedError(anno) + + +def instantiate_pydantic_object(model_type: Type[BaseModel], df: pd.DataFrame, from_within_list=False) -> BaseModel: + ret = {} + print(f"instantiate_pydantic_object df = {df}") + for field_name, field_info in model_type.model_fields.items(): + anno = field_info.annotation + print(f"Instantiating field {field_name}, anno {anno} and args {get_args(anno)}") + ret[field_name] = annotation_switch(field_name, anno, df, from_within_list=from_within_list) + print(ret[field_name]) + print() + return model_type(**ret) + + +def excel_sheet_to_pydantic(filename: str, sheetname: str, model_type: Union[Type[BaseModel], Type[List[BaseModel]]]): + df = pd.read_excel(filename, sheet_name=sheetname, header=None) + df = df.where(df.notnull(), None) + try: + df = get_relevant_sub_frame(model_type, df) + except (KeyError, IndexError): + pass + + if is_optional_annotation(model_type): + return handle_optional(df.iloc[0, 0], model_type, df) + + if is_list_annotation(model_type): + return handle_list(df.iloc[0, 0], model_type, df) + + children = seperate_simple_from_pydantic(model_type) + ret = {} + if "simple" in children and len(children["simple"]): + sub = get_relevant_sub_frame(model_type, df, name_of_field=df.iloc[0, 0]) + simple_child_field_type = subset_pydantic_model_type(model_type, children["simple"]) + fields = instantiate_pydantic_object(simple_child_field_type, sub) + for child in children["simple"]: + ret[child] = getattr(fields, child) + for name in children["pydantic"]: + print(f"Looking to get {name}") + anno = model_type.model_fields[name].annotation + ret[name] = annotation_switch(name, anno, df) + print() + for k, v in ret.items(): + if isinstance(v, list) or isinstance(v, np.ndarray): + ret[k] = [elem for elem in v if elem is not None] + print(ret) + + return model_type(**ret) + + +def excel_single_sheet_to_pydantic(filename: str, model_type: Type[BaseModel]) -> BaseModel: + return excel_sheet_to_pydantic(filename, "metadata", model_type) + + +def excel_doc_to_pydantic(filename, model_type): + children = seperate_simple_from_pydantic(model_type) + annotations = {k: v.annotation for k, v in model_type.model_fields.items()} + ret = {} + + if len(children["simple"]) > 0: + field_type = subset_pydantic_model_type(model_type, children["simple"]) + fields = excel_sheet_to_pydantic(filename, sheetname="metadata", model_type=field_type) + for child in children["simple"]: + ret[child] = getattr(fields, child) + for fieldname in children["pydantic"]: + print(f"Looking to get {fieldname}") + field_type = annotations[fieldname] + ret[fieldname] = excel_sheet_to_pydantic(filename, sheetname=fieldname, model_type=field_type) + # if isinstance(field_type, type(BaseModel)): + # ret[fieldname] = excel_sheet_to_pydantic(filename, sheetname=fieldname, model_type=field_type) + # else: + # field_type = subset_pydantic_model_type(model_type, [fieldname]) + # sublevel = excel_sheet_to_pydantic(filename, sheetname=fieldname, model_type=field_type) + # ret.update(sublevel.model_dump()) + return model_type(**ret) diff --git a/pydantic_schemas/pydantic_to_excel.py b/pydantic_schemas/utils/pydantic_to_excel.py similarity index 79% rename from pydantic_schemas/pydantic_to_excel.py rename to pydantic_schemas/utils/pydantic_to_excel.py index b6131b1..abee325 100644 --- a/pydantic_schemas/pydantic_to_excel.py +++ b/pydantic_schemas/utils/pydantic_to_excel.py @@ -124,7 +124,7 @@ def shade_locked_cells(filename: str, sheet_name: str): wb.save(filename) -def write_to_cell(filename: str, sheet_name: str, row: int, col: int, text: str, isBold=False): +def write_to_cell(filename: str, sheet_name: str, row: int, col: int, text: str, isBold=False, debug: bool = False): """ Writes text to a specified cell in the Excel file. @@ -157,7 +157,7 @@ def write_to_cell(filename: str, sheet_name: str, row: int, col: int, text: str, def create_sheet_and_write_title( - doc_filepath: str, sheet_name: str, sheet_title: Optional[str] = None, sheet_number: int = 0 + doc_filepath: str, sheet_name: str, sheet_title: Optional[str] = None, sheet_number: int = 0, debug=False ): """ In the given excel document, creates a new sheet called sheet_name and in the top left cell @@ -204,8 +204,11 @@ def create_sheet_and_write_title( new_sheet["A1"].font = bold_font # Shade the background of the cells in the first 2 rows grey and lock them - for row in range(1, 3): - protect_and_shade_row(new_sheet, row) + # for row in range(1, 3): + # protect_and_shade_row(new_sheet, row) + unprotect_cell(new_sheet, 1, 1) + protect_and_shade_row(new_sheet, 1, 2) + protect_and_shade_row(new_sheet, 2) # Determine the position to insert the new sheet total_sheets = len(workbook.sheetnames) @@ -246,7 +249,9 @@ def replace_row_with_multiple_rows(original_df, new_df, row_to_replace): def pydantic_to_dataframe( - ob: Union[BaseModel, Dict, List[Dict]], annotations: Optional[Dict[str, typing._UnionGenericAlias]] = None + ob: Union[BaseModel, Dict, List[Dict]], + annotations: Optional[Dict[str, typing._UnionGenericAlias]] = None, + debug: bool = False, ) -> Tuple[pd.DataFrame, List[int]]: """ Convert to a dataframe, identifying rows that are made of lists and exploding them over multiple rows with @@ -260,24 +265,31 @@ def pydantic_to_dataframe( else: ob_dict = ob df = pd.json_normalize(ob_dict).T - print("pydantic_to_dataframe") - print(df) + if debug: + print("pydantic_to_dataframe") + print(df) list_indices = [] if isinstance(ob, list): list_indices = list(range(len(df))) else: for idx, _ in ob_dict.items(): if annotations is not None and annotation_contains_dict(annotations[idx]): - print("Found a dictionary") + if debug: + print("Found a dictionary") assert_dict_annotation_is_strings_or_any(annotations[idx]) field = ob_dict[idx] - dict_df = pd.DataFrame([field.keys(), field.values()], index=["key", "value"]) + if field is None or len(field) == 0: + dict_df = pd.DataFrame(["", ""], index=["key", "value"]) + else: + dict_df = pd.DataFrame([field.keys(), field.values()], index=["key", "value"]) dict_df.index = dict_df.index.map(lambda x: f"{idx}.{x}") df = df[~df.index.str.startswith(f"{idx}.")] + df = df[df.index != idx] df = pd.concat([df, dict_df]) i = 0 for idx in df.index: - print(f"pydantic_to_dataframe::269 idx = {idx}, df = {df}") + if debug: + print(f"pydantic_to_dataframe::283 idx = {idx}, df = {df}") vals = df.loc[idx][0] field = ob_dict[idx.split(".")[0]] @@ -287,14 +299,16 @@ def pydantic_to_dataframe( or (annotations is not None and annotation_contains_dict(annotations[idx.split(".")[0]])) ): # (hasattr(ob, "annotation") and annotation_contains_list(ob.annotation)): if vals is not None and len(vals) > 0 and (isinstance(vals[0], BaseModel) or isinstance(vals[0], Dict)): - print("list of base models", vals[0]) + if debug: + print("list of base models", vals[0]) sub = pd.json_normalize(df.loc[idx].values[0]).reset_index(drop=True).T sub.index = sub.index.map(lambda x: f"{idx}." + x) df = replace_row_with_multiple_rows(df, sub, idx) list_indices += list(range(i, i + len(sub))) i += len(sub) else: - print("list of builtins or else empty") + if debug: + print("list of builtins or else empty") df = replace_row_with_multiple_rows( df, df.loc[idx].explode().to_frame().reset_index(drop=True).T, idx ) @@ -302,7 +316,8 @@ def pydantic_to_dataframe( i += 1 else: i += 1 - print(df) + if debug: + print(df) if len(df): df.index = df.index.str.split(".", expand=True) return df, list_indices @@ -317,6 +332,7 @@ def write_simple_pydantic_to_sheet( write_title=True, title: Optional[str] = None, annotations=None, + debug: bool = False, ): """ Assumes a pydantic object made up of built in types or pydantic objects utimately made of built in types or Lists. @@ -368,20 +384,20 @@ class Simple(BaseModel): if write_title: if title is None: title = ob.model_json_schema()["title"] - startrow = write_to_cell(doc_filepath, sheet_name, startrow, 1, title, isBold=True) + startrow = write_to_cell(doc_filepath, sheet_name, startrow, 1, title, isBold=True, debug=debug) startcol = 2 - df, list_rows = pydantic_to_dataframe(ob=ob, annotations=annotations) + df, list_rows = pydantic_to_dataframe(ob=ob, annotations=annotations, debug=debug) index_levels = df.index.nlevels - if index_above and index_levels > 1: - warnings.warn( - "Setting index_above=True is incompatible with a hierarchical index. Setting index_above to False.", - UserWarning, - ) - index_above = False + # if index_above and index_levels > 1: + # warnings.warn( + # "Setting index_above=True is incompatible with a hierarchical index. Setting index_above to False.", + # UserWarning, + # ) + # index_above = False - if index_above: - df = df.T + # if index_above: + # df = df.T # Annoyingly, openpyxl uses 1 based indexing but # But pandas uses 0 based indexing. @@ -404,29 +420,29 @@ class Simple(BaseModel): # Get the DataFrame dimensions rows, cols = df.shape - if index_above: - protect_and_shade_row(sheet, startrow) - for c in range(startcol, cols + startcol): - cell = sheet.cell(startrow, c) + # if index_above: + # protect_and_shade_row(sheet, startrow) + # for c in range(startcol, cols + startcol): + # cell = sheet.cell(startrow, c) + # cell.font = Font(bold=False) + # for r in range(startrow + 1, startrow + rows + 1): + # unprotect_row(sheet, r, startcol, colmax=startcol + cols) + # protect_and_shade_row(sheet, r, colmin=startcol + cols) + # next_row = startrow + rows + 2 + # else: + for col in range(startcol, startcol + index_levels): + protect_and_shade_col(sheet, col, startrow, startrow + rows) + for r in range(startrow, startrow + rows): + cell = sheet.cell(r, col) cell.font = Font(bold=False) - for r in range(startrow + 1, startrow + rows + 1): - unprotect_row(sheet, r, startcol, colmax=startcol + cols) - protect_and_shade_row(sheet, r, colmin=startcol + cols) - next_row = startrow + rows + 2 - else: - for col in range(startcol, startcol + index_levels): - protect_and_shade_col(sheet, col, startrow, startrow + rows) - for r in range(startrow, startrow + rows): - cell = sheet.cell(r, col) - cell.font = Font(bold=False) - firstdatacol = startcol + index_levels - for i, r in enumerate(range(startrow, startrow + rows)): - if i in list_rows: - unprotect_row(sheet, r, firstdatacol) - else: - unprotect_row(sheet, r, firstdatacol, colmax=firstdatacol + 1) - protect_and_shade_row(sheet, r, colmin=firstdatacol + 1) - next_row = startrow + rows + firstdatacol = startcol + index_levels + for i, r in enumerate(range(startrow, startrow + rows)): + if i in list_rows: + unprotect_row(sheet, r, firstdatacol) + else: + unprotect_row(sheet, r, firstdatacol, colmax=firstdatacol + 1) + protect_and_shade_row(sheet, r, colmin=firstdatacol + 1) + next_row = startrow + rows sheet.protection.enable() # Save the workbook @@ -436,14 +452,16 @@ class Simple(BaseModel): def write_nested_simple_pydantic_to_sheet( - doc_filepath: str, sheet_name: str, ob: BaseModel, startrow: int, index_above=False + doc_filepath: str, sheet_name: str, ob: BaseModel, startrow: int, index_above=False, debug=False ): """ Assumes the pydantic object is made up only of other pydantic objects that are themselves made up only of built in types """ - print(ob) + if debug: + print(ob) children = seperate_simple_from_pydantic(ob) - print(children["simple"]) + if debug: + print(children["simple"]) if len(children["simple"]): child_object = subset_pydantic_model(ob, children["simple"]) startrow = write_simple_pydantic_to_sheet( @@ -454,28 +472,46 @@ def write_nested_simple_pydantic_to_sheet( index_above=False, write_title=False, annotations={k: v.annotation for k, v in child_object.model_fields.items()}, + debug=debug, ) - print("Done with simple children, now nesting pydantic objects") + if debug: + print("Done with simple children, now nesting pydantic objects") for mfield in children["pydantic"]: field = ob.model_dump(mode="json")[mfield] - print(f"write_nested_simple_pydantic_to_sheet::428, field={field}") + if debug: + print(f"write_nested_simple_pydantic_to_sheet::428, field={field}") startrow = write_simple_pydantic_to_sheet( - doc_filepath, sheet_name, field, startrow, index_above=index_above, title=mfield + doc_filepath, sheet_name, field, startrow, index_above=index_above, title=mfield, debug=debug ) return startrow -def write_across_many_sheets(doc_filepath: str, ob: BaseModel, title: Optional[str] = None): +def write_to_single_sheet(doc_filepath: str, ob: BaseModel, title: Optional[str] = None, debug=False): + if title is None: + title = "Metadata" + sheet_name = "metadata" + current_row = create_sheet_and_write_title(doc_filepath, sheet_name, title, sheet_number=0, debug=debug) + current_row = write_nested_simple_pydantic_to_sheet(doc_filepath, sheet_name, ob, current_row + 1) + correct_column_widths(doc_filepath, sheet_name=sheet_name) + shade_30_rows(doc_filepath, sheet_name, current_row + 1) + shade_locked_cells(doc_filepath, sheet_name) + + +def write_across_many_sheets(doc_filepath: str, ob: BaseModel, title: Optional[str] = None, debug=False): children = seperate_simple_from_pydantic(ob) - print(f"pydantic_to_excel::459 children: {children}") + if debug: + print(f"children: {children}") sheet_number = 0 if len(children["simple"]): - if title is not None: + if title is None: title = "Metadata" sheet_name = "metadata" - current_row = create_sheet_and_write_title(doc_filepath, sheet_name, title, sheet_number=sheet_number) + current_row = create_sheet_and_write_title( + doc_filepath, sheet_name, title, sheet_number=sheet_number, debug=debug + ) child_object = subset_pydantic_model(ob, children["simple"]) + current_row = write_simple_pydantic_to_sheet( doc_filepath, sheet_name, @@ -484,6 +520,7 @@ def write_across_many_sheets(doc_filepath: str, ob: BaseModel, title: Optional[s index_above=False, write_title=False, annotations={k: v.annotation for k, v in child_object.model_fields.items()}, + debug=debug, ) correct_column_widths(doc_filepath, sheet_name=sheet_name) shade_30_rows(doc_filepath, sheet_name, current_row + 1) @@ -491,14 +528,17 @@ def write_across_many_sheets(doc_filepath: str, ob: BaseModel, title: Optional[s sheet_number += 1 for fieldname in children["pydantic"]: - print(f"\n\n{fieldname}\n") + if debug: + print(f"\n\n{fieldname}\n") field = getattr(ob, fieldname) if not isinstance(field, BaseModel): field = subset_pydantic_model(ob, [fieldname], name=fieldname) sheet_title = None else: sheet_title = fieldname - current_row = create_sheet_and_write_title(doc_filepath, fieldname, sheet_title, sheet_number=sheet_number) + current_row = create_sheet_and_write_title( + doc_filepath, fieldname, sheet_title, sheet_number=sheet_number, debug=debug + ) current_row = write_nested_simple_pydantic_to_sheet(doc_filepath, fieldname, field, current_row + 1) correct_column_widths(doc_filepath, sheet_name=fieldname) diff --git a/pydantic_schemas/quick_start.py b/pydantic_schemas/utils/quick_start.py similarity index 99% rename from pydantic_schemas/quick_start.py rename to pydantic_schemas/utils/quick_start.py index fcc4917..53de288 100644 --- a/pydantic_schemas/quick_start.py +++ b/pydantic_schemas/utils/quick_start.py @@ -6,7 +6,7 @@ from pydantic import AnyUrl, BaseModel -from pydantic_schemas.utils import standardize_keys_in_dict +from .utils import standardize_keys_in_dict METADATA_TYPES_FILE_MAP = { "document_schema": "ScriptSchemaDraft", diff --git a/pydantic_schemas/utils.py b/pydantic_schemas/utils/utils.py similarity index 89% rename from pydantic_schemas/utils.py rename to pydantic_schemas/utils/utils.py index d196dcc..9083fa3 100644 --- a/pydantic_schemas/utils.py +++ b/pydantic_schemas/utils/utils.py @@ -22,20 +22,32 @@ def is_list_annotation(anno: typing._UnionGenericAlias) -> bool: return typing.get_origin(anno) is list +def is_optional_list(anno: typing._UnionGenericAlias) -> bool: + if is_optional_annotation(anno): + args = typing.get_args(anno) + if len(args) == 1 and is_list_annotation(args[0]): + return True + return False + + def get_subtype_of_optional_or_list(anno: typing._UnionGenericAlias, debug=False) -> Any: + if debug: + print(f"getting subtype of {anno}") args = typing.get_args(anno) if debug: for a in args: print(f"getting subtype {a}, is it NoneType?={a is type(None)}") args = [a for a in args if not a is type(None)] - # if len(args) > 1: - # raise ValueError(f"Too many sub types: {args}") for arg in args: if hasattr(arg, "annotation") and is_dict_annotation(arg.annotation): raise NotImplementedError("DICTS not yet implemented") for arg in args: + if debug: + print(f"checking arg {arg} -- {hasattr(arg, 'annotation')} -- {is_list_annotation(arg)}") if hasattr(arg, "annotation") and is_list_annotation(arg.annotation): - return get_subtype_of_optional_or_list(arg.annotation) + return get_subtype_of_optional_or_list(arg.annotation, debug=debug) + elif is_list_annotation(arg): + return get_subtype_of_optional_or_list(arg, debug=debug) if len(args) == 1: return args[0] else: @@ -47,13 +59,13 @@ def _annotation_contains_generic( ) -> bool: if checker(anno): return True - elif is_union_annotation(anno): + if is_union_annotation(anno): args = typing.get_args(anno) args = [a for a in args if not a is type(None)] for a in args: if checker(a): return True - elif is_optional_annotation(anno) or is_list_annotation(anno): + if is_optional_annotation(anno) or is_list_annotation(anno): # optional check is pointless given union check above subtype = get_subtype_of_optional_or_list(anno) return checker(subtype) return False From e4f250cc085ef20365727d7fb9be927196590375 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Tue, 30 Jul 2024 09:06:22 -0400 Subject: [PATCH 29/51] allow users to add columns --- .../tests/test_pydantic_to_excel.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/pydantic_schemas/tests/test_pydantic_to_excel.py b/pydantic_schemas/tests/test_pydantic_to_excel.py index 5206c74..2a7a9b6 100644 --- a/pydantic_schemas/tests/test_pydantic_to_excel.py +++ b/pydantic_schemas/tests/test_pydantic_to_excel.py @@ -1,6 +1,6 @@ import os from enum import Enum -from typing import Any, Dict, List, Optional, Union +from typing import Any, Dict, List, Optional import pandas as pd import pytest @@ -25,7 +25,7 @@ from pydantic_schemas.utils.pydantic_to_excel import ( correct_column_widths, create_sheet_and_write_title, - shade_30_rows, + shade_30_rows_and_protect_sheet, shade_locked_cells, write_across_many_sheets, write_nested_simple_pydantic_to_sheet, @@ -52,7 +52,7 @@ class Simple(BaseModel): filename, sheetname, simple_original, current_row + 1, index_above=index_above ) correct_column_widths(filename, sheetname) - shade_30_rows(filename, sheetname, current_row + 1) + shade_30_rows_and_protect_sheet(filename, sheetname, current_row + 1) shade_locked_cells(filename, sheetname) parsed_simple = excel_sheet_to_pydantic(filename, sheetname, Simple) @@ -86,7 +86,7 @@ class ProductionAndCountries(BaseModel): current_row = write_nested_simple_pydantic_to_sheet(filename, sheetname, inp, current_row, index_above=index_above) correct_column_widths(filename, sheetname) - shade_30_rows(filename, sheetname, current_row + 1) + shade_30_rows_and_protect_sheet(filename, sheetname, current_row + 1) shade_locked_cells(filename, sheetname) parsed_outp = excel_sheet_to_pydantic(filename, sheetname, ProductionAndCountries) @@ -142,7 +142,7 @@ class ProductionAndCountries(BaseModel): current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) current_row = write_nested_simple_pydantic_to_sheet(filename, sheetname, inp, current_row + 1) correct_column_widths(filename, sheet_name=sheetname) - shade_30_rows(filename, sheetname, current_row + 1) + shade_30_rows_and_protect_sheet(filename, sheetname, current_row + 1) shade_locked_cells(filename, sheetname) parsed_outp = excel_sheet_to_pydantic(filename, sheetname, ProductionAndCountries) @@ -166,7 +166,7 @@ class Production(BaseModel): current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) current_row = write_nested_simple_pydantic_to_sheet(filename, sheetname, original_production, current_row + 1) correct_column_widths(filename, sheet_name=sheetname) - shade_30_rows(filename, sheetname, current_row + 1) + shade_30_rows_and_protect_sheet(filename, sheetname, current_row + 1) shade_locked_cells(filename, sheetname) class Production(BaseModel): @@ -213,7 +213,7 @@ class ProductionAndCountries(BaseModel): filename, sheetname, example_production_and_country, current_row + 1 ) correct_column_widths(filename, sheet_name=sheetname) - shade_30_rows(filename, sheetname, current_row + 1) + shade_30_rows_and_protect_sheet(filename, sheetname, current_row + 1) shade_locked_cells(filename, sheetname) class Production(BaseModel): @@ -304,7 +304,7 @@ class ProductionAndCountries(BaseModel): filename, sheetname, example_production_and_country, current_row + 1 ) correct_column_widths(filename, sheet_name=sheetname) - shade_30_rows(filename, sheetname, current_row + 1) + shade_30_rows_and_protect_sheet(filename, sheetname, current_row + 1) shade_locked_cells(filename, sheetname) new_pandc = excel_sheet_to_pydantic(filename=filename, sheetname=sheetname, model_type=ProductionAndCountries) assert new_pandc.production.idno is None @@ -487,5 +487,5 @@ class MetaDataOfVariousHierarchies(BaseModel): current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) current_row = write_nested_simple_pydantic_to_sheet(filename, sheetname, example, current_row + 1) correct_column_widths(filename, sheet_name=sheetname) - shade_30_rows(filename, sheetname, current_row + 1) + shade_30_rows_and_protect_sheet(filename, sheetname, current_row + 1) shade_locked_cells(filename, sheetname) From e7c49d8d240f1ce48c8722beb5b6a6abef41b075 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Tue, 30 Jul 2024 09:32:10 -0400 Subject: [PATCH 30/51] excel interface --- pydantic_schemas/excel_interface.py | 207 ++++++++++++++++++++ pydantic_schemas/utils/excel_to_pydantic.py | 14 +- pydantic_schemas/utils/pydantic_to_excel.py | 86 +++++--- pydantic_schemas/utils/utils.py | 6 +- 4 files changed, 270 insertions(+), 43 deletions(-) create mode 100644 pydantic_schemas/excel_interface.py diff --git a/pydantic_schemas/excel_interface.py b/pydantic_schemas/excel_interface.py new file mode 100644 index 0000000..132bd8f --- /dev/null +++ b/pydantic_schemas/excel_interface.py @@ -0,0 +1,207 @@ +from pydantic import BaseModel + +from pydantic_schemas.definitions.document_schema import ScriptSchemaDraft +from pydantic_schemas.definitions.microdata_schema import MicrodataSchema +from pydantic_schemas.definitions.script_schema import ResearchProjectSchemaDraft +from pydantic_schemas.definitions.series_schema import Series +from pydantic_schemas.definitions.table_schema import Model as TableModel +from pydantic_schemas.definitions.timeseries_db_schema import TimeseriesDatabaseSchema +from pydantic_schemas.definitions.timeseries_schema import TimeseriesSchema +from pydantic_schemas.definitions.video_schema import Model as VideoModel +from pydantic_schemas.utils.excel_to_pydantic import excel_doc_to_pydantic, excel_single_sheet_to_pydantic +from pydantic_schemas.utils.pydantic_to_excel import write_across_many_sheets, write_to_single_sheet +from pydantic_schemas.utils.quick_start import make_skeleton +from pydantic_schemas.utils.utils import standardize_keys_in_dict + + +class ExcelInterface: + """ + An Excel interface creating, saving and updating metadata for various types: + documents, scripts, series, survey_microdata, table, timeseries, timeseries_db, video + + For each of these types there are three functions: + + write_empty_metadata_to_excel_for_ + save_metadata_to_excel_for_ + read_metadata_excel_of_ + + write_empty_metadata_to_excel_for_: + Args: + filename (str): The path to the Excel file. + title (str): The title for the Excel sheet. + + Outputs: + An Excel file into which metadata can be entered + + save_metadata_to_excel_for_: + Args: + filename (str): The path to the Excel file. + title (str): The title for the Excel sheet. + object (BaseModel): The pydantic object to save to the Excel file. + + Outputs: + An Excel file containing the metadata from the pydantic object. The file can be updated as needed. + + read_metadata_excel_of_: + Args: + filename (str): The path to the Excel file. + + Returns: + BaseModel: a pydantic object containing the metadata from the file + """ + + _NAME_TO_TYPE_WRITER_READER = { + "Document": (ScriptSchemaDraft, write_across_many_sheets, excel_doc_to_pydantic), + # "Geospatial":GeospatialSchema, + # "Image":ImageDataTypeSchema, + "Script": (ResearchProjectSchemaDraft, write_across_many_sheets, excel_doc_to_pydantic), + "Series": (Series, write_to_single_sheet, excel_single_sheet_to_pydantic), # should be one sheet + "Survey_microdata": (MicrodataSchema, write_across_many_sheets, excel_doc_to_pydantic), + "Table": (TableModel, write_across_many_sheets, excel_doc_to_pydantic), + "Timeseries": (TimeseriesSchema, write_across_many_sheets, excel_doc_to_pydantic), + "Timeseries_DB": ( + TimeseriesDatabaseSchema, + write_to_single_sheet, + excel_single_sheet_to_pydantic, + ), # could be one sheet + "Video": (VideoModel, write_to_single_sheet, excel_single_sheet_to_pydantic), # could be one sheet + } + + @staticmethod + def _merge_dicts(base, update): + if len(update) == 0: + return base + new_dict = {} + for key, base_value in base.items(): + if key in update: + update_value = update[key] + if isinstance(base_value, dict): + if isinstance(update_value, dict) and len(update_value) > 0: + new_dict[key] = ExcelInterface._merge_dicts(base_value, update_value) + else: + new_dict[key] = base_value + elif isinstance(base_value, list): + if isinstance(update_value, list) and len(update_value) > 0: + new_list = [] + min_length = min(len(base_value), len(update_value)) + for i in range(min_length): + if isinstance(base_value[i], dict): + if isinstance(update_value[i], dict): + new_list.append(ExcelInterface._merge_dicts(base_value[i], update_value[i])) + else: + new_list.append(base_value[i]) + else: + new_list.append(update_value[i]) + new_list.extend(update_value[min_length:]) + new_dict[key] = new_list + else: + new_dict[key] = base_value + else: + if update_value is not None: + new_dict[key] = update_value + else: + new_dict[key] = base_value + else: + new_dict[key] = base_value + return new_dict + + def _write_empty_excel(self, name: str, filename: str, title: str): + assert ( + name in self._NAME_TO_TYPE_WRITER_READER + ), f"{name} not found in {list(self._NAME_TO_TYPE_WRITER_READER.keys())}" + schema = self._NAME_TO_TYPE_WRITER_READER[name][0] + writer = self._NAME_TO_TYPE_WRITER_READER[name][1] + if not str(filename).endswith(".xlsx"): + filename += ".xlsx" + ob = make_skeleton(schema, debug=False) + writer(filename, ob, title) + + def _save_to_excel(self, name: str, filename: str, title: str, object: BaseModel): + assert ( + name in self._NAME_TO_TYPE_WRITER_READER + ), f"{name} not found in {list(self._NAME_TO_TYPE_WRITER_READER.keys())}" + schema = self._NAME_TO_TYPE_WRITER_READER[name][0] + writer = self._NAME_TO_TYPE_WRITER_READER[name][1] + skeleton_object = make_skeleton(schema, debug=False) + + combined_dict = self._merge_dicts( + skeleton_object.model_dump(), + object.model_dump(exclude_none=True, exclude_unset=True, exclude_defaults=True), + ) + combined_dict = standardize_keys_in_dict(combined_dict) + new_ob = schema(**combined_dict) + writer(filename, new_ob, title) + + def _read_excel(self, name: str, filename: str) -> BaseModel: + assert ( + name in self._NAME_TO_TYPE_WRITER_READER + ), f"{name} not found in {list(self._NAME_TO_TYPE_WRITER_READER.keys())}" + schema = self._NAME_TO_TYPE_WRITER_READER[name][0] + reader = self._NAME_TO_TYPE_WRITER_READER[name][2] + read_object = reader(filename, schema) + skeleton_object = make_skeleton(schema, debug=False) + + combined_dict = self._merge_dicts( + skeleton_object.model_dump(), + read_object.model_dump(exclude_none=True, exclude_unset=True, exclude_defaults=True), + ) + combined_dict = standardize_keys_in_dict(combined_dict) + new_ob = schema(**combined_dict) + return new_ob + + # Method to generate write and read methods for all types + def __init__(self): + for name in self._NAME_TO_TYPE_WRITER_READER.keys(): + self._generate_methods(name) + + def _generate_methods(self, name): + def write_skeleton_method(filename=f"{name}_metadata.xlsx", title=f"{name} Metadata"): + self._write_empty_excel(name, filename=filename, title=title) + + write_skeleton_method.__name__ = f"write_empty_metadata_to_excel_for_{name.lower()}" + write_skeleton_doc_template = """ + Create an Excel document formatted for writing {name} metadata. + + Args: + filename (str): The path to the Excel file. + title (str): The title for the Excel sheet. + + Outputs: + An Excel file into which metadata can be entered + """ + write_skeleton_method.__doc__ = write_skeleton_doc_template.format(name=name) + setattr(self, write_skeleton_method.__name__, write_skeleton_method) + + def save_to_excel_method(object, filename=f"{name}_metadata.xlsx", title=f"{name} Metadata"): + self._save_to_excel(name, filename=filename, title=title, object=object) + + save_to_excel_method.__name__ = f"save_metadata_to_excel_for_{name.lower()}" + save_doc_template = """ + Save an Excel document of the given {name} metadata. + + Args: + filename (str): The path to the Excel file. + title (str): The title for the Excel sheet. + object (BaseModel): The pydantic object to save to the Excel file. + + Outputs: + An Excel file containing the metadata from the pydantic object. This file can be updated as needed. + """ + save_to_excel_method.__doc__ = save_doc_template.format(name=name) + setattr(self, save_to_excel_method.__name__, save_to_excel_method) + + def read_method(filename): + return self._read_excel(name, filename=filename) + + read_method.__name__ = f"read_metadata_excel_of_{name.lower()}" + read_doc_template = """ + Read in {name} metadata from an appropriately formatted Excel file as a pydantic object. + + Args: + filename (str): The path to the Excel file. + + Returns: + BaseModel: a pydantic object containing the metadata from the file + """ + read_method.__doc__ = read_doc_template.format(name=name) + setattr(self, read_method.__name__, read_method) diff --git a/pydantic_schemas/utils/excel_to_pydantic.py b/pydantic_schemas/utils/excel_to_pydantic.py index 9ecece7..5902e08 100644 --- a/pydantic_schemas/utils/excel_to_pydantic.py +++ b/pydantic_schemas/utils/excel_to_pydantic.py @@ -1,7 +1,6 @@ import json import warnings -from collections.abc import Iterable -from typing import Any, Dict, List, Optional, Type, Union, get_args, get_origin +from typing import Any, List, Optional, Type, Union, get_args import numpy as np import pandas as pd @@ -9,14 +8,11 @@ from .quick_start import make_skeleton from .utils import ( - annotation_contains_dict, - annotation_contains_list, annotation_contains_pydantic, get_subtype_of_optional_or_list, is_dict_annotation, is_list_annotation, is_optional_annotation, - is_optional_list, seperate_simple_from_pydantic, subset_pydantic_model_type, ) @@ -277,7 +273,7 @@ def excel_single_sheet_to_pydantic(filename: str, model_type: Type[BaseModel]) - return excel_sheet_to_pydantic(filename, "metadata", model_type) -def excel_doc_to_pydantic(filename, model_type): +def excel_doc_to_pydantic(filename: str, model_type: Type[BaseModel]) -> BaseModel: children = seperate_simple_from_pydantic(model_type) annotations = {k: v.annotation for k, v in model_type.model_fields.items()} ret = {} @@ -291,10 +287,4 @@ def excel_doc_to_pydantic(filename, model_type): print(f"Looking to get {fieldname}") field_type = annotations[fieldname] ret[fieldname] = excel_sheet_to_pydantic(filename, sheetname=fieldname, model_type=field_type) - # if isinstance(field_type, type(BaseModel)): - # ret[fieldname] = excel_sheet_to_pydantic(filename, sheetname=fieldname, model_type=field_type) - # else: - # field_type = subset_pydantic_model_type(model_type, [fieldname]) - # sublevel = excel_sheet_to_pydantic(filename, sheetname=fieldname, model_type=field_type) - # ret.update(sublevel.model_dump()) return model_type(**ret) diff --git a/pydantic_schemas/utils/pydantic_to_excel.py b/pydantic_schemas/utils/pydantic_to_excel.py index abee325..d014de0 100644 --- a/pydantic_schemas/utils/pydantic_to_excel.py +++ b/pydantic_schemas/utils/pydantic_to_excel.py @@ -1,26 +1,22 @@ -import builtins import os import typing -import warnings -from typing import Any, Dict, List, Optional, Tuple, Type, Union, get_args, get_origin +from typing import Dict, List, Optional, Tuple, Union import pandas as pd from openpyxl import Workbook, load_workbook -from openpyxl.styles import Font, PatternFill, Protection +from openpyxl.styles import Alignment, Font, PatternFill, Protection +from openpyxl.worksheet.protection import SheetProtection from pydantic import BaseModel from .utils import ( annotation_contains_dict, annotation_contains_list, assert_dict_annotation_is_strings_or_any, - get_subtype_of_optional_or_list, - is_list_annotation, - is_optional_annotation, seperate_simple_from_pydantic, subset_pydantic_model, ) -MAXCOL = 200 +MAXCOL = 30 def protect_and_shade_given_cell(sheet, row: int, col: int): @@ -57,12 +53,25 @@ def unprotect_given_col(sheet, col: int, rowmin: int, rowmax: int): unprotect_cell(sheet, row, col) -def shade_30_rows(doc_filepath: str, sheet_name: str, startrow: int): +def shade_30_rows_and_protect_sheet(doc_filepath: str, sheet_name: str, startrow: int): """For use after all data is written so there is a clear border around the data""" wb = load_workbook(doc_filepath) ws = wb[sheet_name] for r in range(startrow, startrow + 30): protect_and_shade_row(ws, r) + ws.protection = SheetProtection( + sheet=True, + formatCells=False, + formatColumns=False, + formatRows=False, + insertColumns=False, + insertRows=True, + insertHyperlinks=False, + deleteColumns=False, + deleteRows=True, + selectLockedCells=False, + selectUnlockedCells=False, + ) wb.save(doc_filepath) @@ -78,18 +87,19 @@ def correct_column_widths(filename: str, sheet_name: str): # Load the existing workbook wb = load_workbook(filename) ws = wb[sheet_name] - # Adjust column widths based on the maximum length of the content in each column for col in ws.columns: max_length = 0 column = col[0].column_letter # Get the column letter for cell in col: - try: - if len(str(cell.value)) > max_length: - max_length = len(cell.value) - except: - pass + if column != "A": + cell.alignment = Alignment(wrap_text=True, vertical="top") + if cell.value is not None: + cell_length = len(str(cell.value)) + if cell_length > max_length: + max_length = cell_length if max_length > 0: # Only adjust if there are filled values in the column + max_length = max(min(max_length, 28), 11) adjusted_width = max_length + 2 ws.column_dimensions[column].width = adjusted_width @@ -124,7 +134,9 @@ def shade_locked_cells(filename: str, sheet_name: str): wb.save(filename) -def write_to_cell(filename: str, sheet_name: str, row: int, col: int, text: str, isBold=False, debug: bool = False): +def write_to_cell( + filename: str, sheet_name: str, row: int, col: int, text: str, isBold=False, size=14, debug: bool = False +): """ Writes text to a specified cell in the Excel file. @@ -146,7 +158,7 @@ def write_to_cell(filename: str, sheet_name: str, row: int, col: int, text: str, # Write text to the specified cell cell = ws.cell(row=row, column=col, value=text) - cell.font = Font(bold=isBold) + cell.font = Font(bold=isBold, size=size) protect_and_shade_row(ws, row=row, colmin=col) @@ -157,7 +169,12 @@ def write_to_cell(filename: str, sheet_name: str, row: int, col: int, text: str, def create_sheet_and_write_title( - doc_filepath: str, sheet_name: str, sheet_title: Optional[str] = None, sheet_number: int = 0, debug=False + doc_filepath: str, + sheet_name: str, + sheet_title: Optional[str] = None, + sheet_number: int = 0, + protect_title: bool = True, + debug=False, ): """ In the given excel document, creates a new sheet called sheet_name and in the top left cell @@ -200,13 +217,16 @@ def create_sheet_and_write_title( if sheet_title is not None: # Write the title in bold in the top left cell (A1) bold_font = Font(bold=True, size=14) - new_sheet["A1"] = sheet_title + new_sheet["A1"] = sheet_title.replace("_", " ") new_sheet["A1"].font = bold_font # Shade the background of the cells in the first 2 rows grey and lock them # for row in range(1, 3): # protect_and_shade_row(new_sheet, row) - unprotect_cell(new_sheet, 1, 1) + if protect_title: + protect_and_shade_given_cell(new_sheet, 1, 1) + else: + unprotect_cell(new_sheet, 1, 1) protect_and_shade_row(new_sheet, 1, 2) protect_and_shade_row(new_sheet, 2) @@ -264,7 +284,10 @@ def pydantic_to_dataframe( ob_dict = ob.model_dump(mode="json") else: ob_dict = ob - df = pd.json_normalize(ob_dict).T + try: + df = pd.json_normalize(ob_dict).T + except NotImplementedError: + raise NotImplementedError(ob) if debug: print("pydantic_to_dataframe") print(df) @@ -384,7 +407,12 @@ class Simple(BaseModel): if write_title: if title is None: title = ob.model_json_schema()["title"] - startrow = write_to_cell(doc_filepath, sheet_name, startrow, 1, title, isBold=True, debug=debug) + if startrow == 1: + title = title.replace("_", " ") + size = 14 + else: + size = 12 + startrow = write_to_cell(doc_filepath, sheet_name, startrow, 1, title, isBold=True, size=size, debug=debug) startcol = 2 df, list_rows = pydantic_to_dataframe(ob=ob, annotations=annotations, debug=debug) @@ -491,10 +519,12 @@ def write_to_single_sheet(doc_filepath: str, ob: BaseModel, title: Optional[str] if title is None: title = "Metadata" sheet_name = "metadata" - current_row = create_sheet_and_write_title(doc_filepath, sheet_name, title, sheet_number=0, debug=debug) + current_row = create_sheet_and_write_title( + doc_filepath, sheet_name, title, sheet_number=0, protect_title=False, debug=debug + ) current_row = write_nested_simple_pydantic_to_sheet(doc_filepath, sheet_name, ob, current_row + 1) correct_column_widths(doc_filepath, sheet_name=sheet_name) - shade_30_rows(doc_filepath, sheet_name, current_row + 1) + shade_30_rows_and_protect_sheet(doc_filepath, sheet_name, current_row + 1) shade_locked_cells(doc_filepath, sheet_name) @@ -508,7 +538,7 @@ def write_across_many_sheets(doc_filepath: str, ob: BaseModel, title: Optional[s title = "Metadata" sheet_name = "metadata" current_row = create_sheet_and_write_title( - doc_filepath, sheet_name, title, sheet_number=sheet_number, debug=debug + doc_filepath, sheet_name, title, sheet_number=sheet_number, protect_title=False, debug=debug ) child_object = subset_pydantic_model(ob, children["simple"]) @@ -523,7 +553,7 @@ def write_across_many_sheets(doc_filepath: str, ob: BaseModel, title: Optional[s debug=debug, ) correct_column_widths(doc_filepath, sheet_name=sheet_name) - shade_30_rows(doc_filepath, sheet_name, current_row + 1) + shade_30_rows_and_protect_sheet(doc_filepath, sheet_name, current_row + 1) shade_locked_cells(doc_filepath, sheet_name) sheet_number += 1 @@ -537,11 +567,11 @@ def write_across_many_sheets(doc_filepath: str, ob: BaseModel, title: Optional[s else: sheet_title = fieldname current_row = create_sheet_and_write_title( - doc_filepath, fieldname, sheet_title, sheet_number=sheet_number, debug=debug + doc_filepath, fieldname, sheet_title, sheet_number=sheet_number, protect_title=True, debug=debug ) current_row = write_nested_simple_pydantic_to_sheet(doc_filepath, fieldname, field, current_row + 1) correct_column_widths(doc_filepath, sheet_name=fieldname) - shade_30_rows(doc_filepath, fieldname, current_row + 1) + shade_30_rows_and_protect_sheet(doc_filepath, fieldname, current_row + 1) shade_locked_cells(doc_filepath, fieldname) sheet_number += 1 diff --git a/pydantic_schemas/utils/utils.py b/pydantic_schemas/utils/utils.py index 9083fa3..705eb24 100644 --- a/pydantic_schemas/utils/utils.py +++ b/pydantic_schemas/utils/utils.py @@ -1,7 +1,7 @@ import typing -from typing import Any, Callable, Dict, List, Optional, Type, Union, get_args, get_origin +from typing import Any, Callable, Dict, List, Optional, Type, Union -from pydantic import BaseModel, ValidationError, create_model +from pydantic import BaseModel, create_model def is_optional_annotation(anno: typing._UnionGenericAlias) -> bool: @@ -10,7 +10,7 @@ def is_optional_annotation(anno: typing._UnionGenericAlias) -> bool: def is_union_annotation(anno: typing._UnionGenericAlias) -> bool: # return len(typing.get_args(anno))>=2 - origin = get_origin(anno) + origin = typing.get_origin(anno) return origin in [Optional, Union] From 7c3845ff0a38a372abf6c62d7cb70e7f19704c4d Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Tue, 30 Jul 2024 09:39:58 -0400 Subject: [PATCH 31/51] text excel interface --- .../tests/test_excel_interface.py | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 pydantic_schemas/tests/test_excel_interface.py diff --git a/pydantic_schemas/tests/test_excel_interface.py b/pydantic_schemas/tests/test_excel_interface.py new file mode 100644 index 0000000..1faa565 --- /dev/null +++ b/pydantic_schemas/tests/test_excel_interface.py @@ -0,0 +1,51 @@ +import pytest + +from pydantic_schemas.excel_interface import ExcelInterface + + +@pytest.mark.parametrize( + "name", ["document", "script", "series", "survey_microdata", "table", "timeseries_db", "timeseries", "video"] +) +def test_metadata(tmpdir, name): + ei = ExcelInterface() + filename = tmpdir.join(f"test_{name}.xlsx") + + # Write empty metadata + write_method = getattr(ei, f"write_empty_metadata_to_excel_for_{name}") + write_method(filename=filename) + + # Read the metadata back + read_method = getattr(ei, f"read_metadata_excel_of_{name}") + tmp = read_method(filename) + + # Save the read metadata to a new file + filename2 = tmpdir.join(f"test_{name}_2.xlsx") + save_method = getattr(ei, f"save_metadata_to_excel_for_{name}") + save_method(object=tmp, filename=filename2) + + +# def test_document(tmpdir): +# ei = ExcelInterface() +# filename = tmpdir.join(f"test_document.xlsx") +# # filename = "test_document.xlsx" +# ei.write_empty_metadata_to_excel_for_document(filename=filename) +# tmp = ei.read_metadata_excel_of_document(filename) +# filename2 = tmpdir.join(f"test_document2") +# # filename2 = "test_document2.xlsx" +# ei.save_metadata_to_excel_for_document(filename=filename2, object=tmp) + + +# # ei.write_empty_metadata_to_excel_for_script() +# # ei.read_metadata_excel_of_script("Script_metadata.xlsx") +# # ei.write_empty_metadata_to_excel_for_series() +# # ei.read_metadata_excel_of_series("Series_metadata.xlsx") +# # ei.write_empty_metadata_to_excel_for_survey_microdata() +# # ei.read_metadata_excel_of_survey_microdata("Survey_microdata_metadata.xlsx") +# # ei.write_empty_metadata_to_excel_for_table() +# # ei.read_metadata_excel_of_table("Table_metadata.xlsx") +# # ei.write_empty_metadata_to_excel_for_timeseries_db() +# # ei.read_metadata_excel_of_timeseries_db("Timeseries_DB_metadata.xlsx") +# # ei.write_empty_metadata_to_excel_for_timeseries() +# # ei.read_metadata_excel_of_timeseries("Timeseries_metadata.xlsx") +# # ei.write_empty_metadata_to_excel_for_video() +# # ei.read_metadata_excel_of_video("Video_metadata.xlsx") From 6cb2957b96b27058544ee394771a72591307aad2 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Thu, 1 Aug 2024 10:41:24 -0400 Subject: [PATCH 32/51] prepare for build --- README.md | 2 +- pydantic_schemas/definitions/__init__.py | 0 .../{definitions => }/document_schema.py | 0 pydantic_schemas/excel_interface.py | 208 ++++++++++++------ .../{definitions => }/geospatial_schema.py | 0 .../{definitions => }/image_schema.py | 0 .../{definitions => }/microdata_schema.py | 0 .../{definitions => }/schema_base_model.py | 0 .../{definitions => }/script_schema.py | 0 .../{definitions => }/series_schema.py | 0 .../{definitions => }/table_schema.py | 0 .../tests/test_pydantic_to_excel.py | 16 +- .../{definitions => }/timeseries_db_schema.py | 0 .../{definitions => }/timeseries_schema.py | 0 .../{ => utils}/generate_pydantic_schemas.py | 2 +- .../{definitions => }/video_schema.py | 0 pyproject.toml | 10 +- 17 files changed, 159 insertions(+), 79 deletions(-) delete mode 100644 pydantic_schemas/definitions/__init__.py rename pydantic_schemas/{definitions => }/document_schema.py (100%) rename pydantic_schemas/{definitions => }/geospatial_schema.py (100%) rename pydantic_schemas/{definitions => }/image_schema.py (100%) rename pydantic_schemas/{definitions => }/microdata_schema.py (100%) rename pydantic_schemas/{definitions => }/schema_base_model.py (100%) rename pydantic_schemas/{definitions => }/script_schema.py (100%) rename pydantic_schemas/{definitions => }/series_schema.py (100%) rename pydantic_schemas/{definitions => }/table_schema.py (100%) rename pydantic_schemas/{definitions => }/timeseries_db_schema.py (100%) rename pydantic_schemas/{definitions => }/timeseries_schema.py (100%) rename pydantic_schemas/{ => utils}/generate_pydantic_schemas.py (95%) rename pydantic_schemas/{definitions => }/video_schema.py (100%) diff --git a/README.md b/README.md index 6d4e3ea..ae35a15 100644 --- a/README.md +++ b/README.md @@ -8,4 +8,4 @@ View documentation - https://worldbank.github.io/metadata-schemas/ To update the pydantic schemas so that they match the json schemas run - `python pydantic_schemas\\generate_pydantic_schemas.py` \ No newline at end of file + `python pydantic_schemas\\utils\\generate_pydantic_schemas.py` \ No newline at end of file diff --git a/pydantic_schemas/definitions/__init__.py b/pydantic_schemas/definitions/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/pydantic_schemas/definitions/document_schema.py b/pydantic_schemas/document_schema.py similarity index 100% rename from pydantic_schemas/definitions/document_schema.py rename to pydantic_schemas/document_schema.py diff --git a/pydantic_schemas/excel_interface.py b/pydantic_schemas/excel_interface.py index 132bd8f..9c0eaa1 100644 --- a/pydantic_schemas/excel_interface.py +++ b/pydantic_schemas/excel_interface.py @@ -1,17 +1,21 @@ +from typing import Optional + from pydantic import BaseModel -from pydantic_schemas.definitions.document_schema import ScriptSchemaDraft -from pydantic_schemas.definitions.microdata_schema import MicrodataSchema -from pydantic_schemas.definitions.script_schema import ResearchProjectSchemaDraft -from pydantic_schemas.definitions.series_schema import Series -from pydantic_schemas.definitions.table_schema import Model as TableModel -from pydantic_schemas.definitions.timeseries_db_schema import TimeseriesDatabaseSchema -from pydantic_schemas.definitions.timeseries_schema import TimeseriesSchema -from pydantic_schemas.definitions.video_schema import Model as VideoModel -from pydantic_schemas.utils.excel_to_pydantic import excel_doc_to_pydantic, excel_single_sheet_to_pydantic -from pydantic_schemas.utils.pydantic_to_excel import write_across_many_sheets, write_to_single_sheet -from pydantic_schemas.utils.quick_start import make_skeleton -from pydantic_schemas.utils.utils import standardize_keys_in_dict +from . import ( + document_schema, + microdata_schema, + script_schema, + series_schema, + table_schema, + timeseries_db_schema, + timeseries_schema, + video_schema, +) +from .utils.excel_to_pydantic import excel_doc_to_pydantic, excel_single_sheet_to_pydantic +from .utils.pydantic_to_excel import write_across_many_sheets, write_to_single_sheet +from .utils.quick_start import make_skeleton +from .utils.utils import standardize_keys_in_dict class ExcelInterface: @@ -50,21 +54,21 @@ class ExcelInterface: BaseModel: a pydantic object containing the metadata from the file """ - _NAME_TO_TYPE_WRITER_READER = { - "Document": (ScriptSchemaDraft, write_across_many_sheets, excel_doc_to_pydantic), - # "Geospatial":GeospatialSchema, - # "Image":ImageDataTypeSchema, - "Script": (ResearchProjectSchemaDraft, write_across_many_sheets, excel_doc_to_pydantic), - "Series": (Series, write_to_single_sheet, excel_single_sheet_to_pydantic), # should be one sheet - "Survey_microdata": (MicrodataSchema, write_across_many_sheets, excel_doc_to_pydantic), - "Table": (TableModel, write_across_many_sheets, excel_doc_to_pydantic), - "Timeseries": (TimeseriesSchema, write_across_many_sheets, excel_doc_to_pydantic), - "Timeseries_DB": ( - TimeseriesDatabaseSchema, + _NAME_FUNCTION_MAP = { + "document": (document_schema.ScriptSchemaDraft, write_across_many_sheets, excel_doc_to_pydantic), + # "geospatial":GeospatialSchema, + # "image":ImageDataTypeSchema, + "script": (script_schema.ResearchProjectSchemaDraft, write_across_many_sheets, excel_doc_to_pydantic), + "series": (series_schema.Series, write_to_single_sheet, excel_single_sheet_to_pydantic), # one sheet + "survey_microdata": (microdata_schema.MicrodataSchema, write_across_many_sheets, excel_doc_to_pydantic), + "table": (table_schema.Model, write_across_many_sheets, excel_doc_to_pydantic), + "timeseries": (timeseries_schema.TimeseriesSchema, write_across_many_sheets, excel_doc_to_pydantic), + "timeseries_db": ( + timeseries_db_schema.TimeseriesDatabaseSchema, write_to_single_sheet, excel_single_sheet_to_pydantic, - ), # could be one sheet - "Video": (VideoModel, write_to_single_sheet, excel_single_sheet_to_pydantic), # could be one sheet + ), # one sheet + "video": (video_schema.Model, write_to_single_sheet, excel_single_sheet_to_pydantic), # one sheet } @staticmethod @@ -105,25 +109,66 @@ def _merge_dicts(base, update): new_dict[key] = base_value return new_dict - def _write_empty_excel(self, name: str, filename: str, title: str): - assert ( - name in self._NAME_TO_TYPE_WRITER_READER - ), f"{name} not found in {list(self._NAME_TO_TYPE_WRITER_READER.keys())}" - schema = self._NAME_TO_TYPE_WRITER_READER[name][0] - writer = self._NAME_TO_TYPE_WRITER_READER[name][1] + def write_empty_metadata_to_excel( + self, metadata_type: str, filename: Optional[str] = None, title: Optional[str] = None + ): + """ + Create an Excel document formatted for writing the given metadata_type metadata. + + Args: + metadata_type (str): the name of a supported metadata type, currently: + document, script, series, survey_microdata, table, timeseries, timeseries_DB, video + Currently not supported: + geospatial, image + filename (Optional[str]): The path to the Excel file. If None, defaults to {metadata_type}_metadata.xlsx + title (Optional[str]): The title for the Excel sheet. If None, defaults to '{metadata_type} Metadata' + + Outputs: + An Excel file into which metadata can be entered + """ + metadata_type = metadata_type.lower() + self.raise_if_unsupported_metadata_type(metadata_type=metadata_type) + schema = self._NAME_FUNCTION_MAP[metadata_type][0] + writer = self._NAME_FUNCTION_MAP[metadata_type][1] + if filename is None: + filename = f"{metadata_type}_metadata.xlsx" if not str(filename).endswith(".xlsx"): filename += ".xlsx" - ob = make_skeleton(schema, debug=False) - writer(filename, ob, title) - - def _save_to_excel(self, name: str, filename: str, title: str, object: BaseModel): - assert ( - name in self._NAME_TO_TYPE_WRITER_READER - ), f"{name} not found in {list(self._NAME_TO_TYPE_WRITER_READER.keys())}" - schema = self._NAME_TO_TYPE_WRITER_READER[name][0] - writer = self._NAME_TO_TYPE_WRITER_READER[name][1] + if title is None: + title = f"{metadata_type.capitalize()} Metadata" skeleton_object = make_skeleton(schema, debug=False) + writer(filename, skeleton_object, title) + + def save_metadata_to_excel( + self, metadata_type: str, object: BaseModel, filename: Optional[str] = None, title: Optional[str] = None + ): + """ + Save an Excel document of the given metadata_type metadata. + Args: + metadata_type (str): the name of a supported metadata type, currently: + document, script, series, survey_microdata, table, timeseries, timeseries_db, video + Currently not supported: + geospatial, image + object (BaseModel): The pydantic object to save to the Excel file. + filename (Optional[str]): The path to the Excel file. Defaults to {name}_metadata.xlsx + title (Optional[str]): The title for the Excel sheet. Defaults to '{name} Metadata' + + Outputs: + An Excel file containing the metadata from the pydantic object. This file can be updated as needed. + """ + metadata_type = metadata_type.lower() + self.raise_if_unsupported_metadata_type(metadata_type=metadata_type) + schema = self._NAME_FUNCTION_MAP[metadata_type][0] + writer = self._NAME_FUNCTION_MAP[metadata_type][1] + if filename is None: + filename = f"{metadata_type}_metadata.xlsx" + if not str(filename).endswith(".xlsx"): + filename += ".xlsx" + if title is None: + title = f"{metadata_type.capitalize()} Metadata" + + skeleton_object = make_skeleton(schema, debug=False) combined_dict = self._merge_dicts( skeleton_object.model_dump(), object.model_dump(exclude_none=True, exclude_unset=True, exclude_defaults=True), @@ -132,12 +177,20 @@ def _save_to_excel(self, name: str, filename: str, title: str, object: BaseModel new_ob = schema(**combined_dict) writer(filename, new_ob, title) - def _read_excel(self, name: str, filename: str) -> BaseModel: - assert ( - name in self._NAME_TO_TYPE_WRITER_READER - ), f"{name} not found in {list(self._NAME_TO_TYPE_WRITER_READER.keys())}" - schema = self._NAME_TO_TYPE_WRITER_READER[name][0] - reader = self._NAME_TO_TYPE_WRITER_READER[name][2] + def read_metadata_excel(self, metadata_type: str, filename: str) -> BaseModel: + """ + Read in metadata_type metadata from an appropriately formatted Excel file as a pydantic object. + + Args: + filename (str): The path to the Excel file. + + Returns: + BaseModel: a pydantic object containing the metadata from the file + """ + metadata_type = metadata_type.lower() + self.raise_if_unsupported_metadata_type(metadata_type=metadata_type) + schema = self._NAME_FUNCTION_MAP[metadata_type][0] + reader = self._NAME_FUNCTION_MAP[metadata_type][2] read_object = reader(filename, schema) skeleton_object = make_skeleton(schema, debug=False) @@ -151,49 +204,57 @@ def _read_excel(self, name: str, filename: str) -> BaseModel: # Method to generate write and read methods for all types def __init__(self): - for name in self._NAME_TO_TYPE_WRITER_READER.keys(): - self._generate_methods(name) + for metadata_type in self._NAME_FUNCTION_MAP.keys(): + self._generate_methods(metadata_type.lower()) - def _generate_methods(self, name): - def write_skeleton_method(filename=f"{name}_metadata.xlsx", title=f"{name} Metadata"): - self._write_empty_excel(name, filename=filename, title=title) + def _generate_methods(self, metadata_type): + def write_skeleton_method( + filename=f"{metadata_type}_metadata.xlsx", title=f"{metadata_type.capitalize()} Metadata" + ): + self.write_empty_metadata_to_excel(metadata_type=metadata_type, filename=filename, title=title) - write_skeleton_method.__name__ = f"write_empty_metadata_to_excel_for_{name.lower()}" + write_skeleton_method.__name__ = f"write_empty_metadata_to_excel_for_{metadata_type}" write_skeleton_doc_template = """ Create an Excel document formatted for writing {name} metadata. Args: - filename (str): The path to the Excel file. - title (str): The title for the Excel sheet. + filename (str): The path to the Excel file. Defaults to {name}_metadata.xlsx + title (str): The title for the Excel sheet. Defaults to '{name_capitalized} Metadata' Outputs: - An Excel file into which metadata can be entered + An Excel file into which {name} metadata can be entered """ - write_skeleton_method.__doc__ = write_skeleton_doc_template.format(name=name) + write_skeleton_method.__doc__ = write_skeleton_doc_template.format( + name=metadata_type, name_capitalized=metadata_type.capitalize() + ) setattr(self, write_skeleton_method.__name__, write_skeleton_method) - def save_to_excel_method(object, filename=f"{name}_metadata.xlsx", title=f"{name} Metadata"): - self._save_to_excel(name, filename=filename, title=title, object=object) + def save_to_excel_method( + object, filename=f"{metadata_type}_metadata.xlsx", title=f"{metadata_type.capitalize()} Metadata" + ): + self.save_metadata_to_excel(metadata_type=metadata_type, object=object, filename=filename, title=title) - save_to_excel_method.__name__ = f"save_metadata_to_excel_for_{name.lower()}" + save_to_excel_method.__name__ = f"save_metadata_to_excel_for_{metadata_type}" save_doc_template = """ - Save an Excel document of the given {name} metadata. + Save an Excel document of the {name} metadata. Args: - filename (str): The path to the Excel file. - title (str): The title for the Excel sheet. object (BaseModel): The pydantic object to save to the Excel file. + filename (str): The path to the Excel file. Defaults to {name}_metadata.xlsx + title (str): The title for the Excel sheet. Defaults to '{name_capitalized} Metadata' Outputs: - An Excel file containing the metadata from the pydantic object. This file can be updated as needed. + An Excel file containing the {name} metadata from the pydantic object. This file can be updated as needed. """ - save_to_excel_method.__doc__ = save_doc_template.format(name=name) + save_to_excel_method.__doc__ = save_doc_template.format( + name=metadata_type, name_capitalized=metadata_type.capitalize() + ) setattr(self, save_to_excel_method.__name__, save_to_excel_method) def read_method(filename): - return self._read_excel(name, filename=filename) + return self.read_metadata_excel(metadata_type, filename=filename) - read_method.__name__ = f"read_metadata_excel_of_{name.lower()}" + read_method.__name__ = f"read_metadata_excel_of_{metadata_type}" read_doc_template = """ Read in {name} metadata from an appropriately formatted Excel file as a pydantic object. @@ -203,5 +264,18 @@ def read_method(filename): Returns: BaseModel: a pydantic object containing the metadata from the file """ - read_method.__doc__ = read_doc_template.format(name=name) + read_method.__doc__ = read_doc_template.format(name=metadata_type) setattr(self, read_method.__name__, read_method) + + def raise_if_unsupported_metadata_type(self, metadata_type: str): + """ + If the type is specifically unsupported - geospatial or image - a NotImplementedError is raised + If the type is simply unknown then a ValueError is raised. + """ + metadata_type = metadata_type.lower() + if metadata_type == "geospatial": + raise NotImplementedError("Geospatial schema contains an infinite loop so cannot be written to excel") + if metadata_type == "image": + raise NotImplementedError("Due to an issue with image metadata schema definition causing __root__ errors") + if metadata_type not in self._NAME_FUNCTION_MAP.keys(): + raise ValueError(f"'{metadata_type}' not supported. Must be: {list(self._NAME_FUNCTION_MAP.keys())}") diff --git a/pydantic_schemas/definitions/geospatial_schema.py b/pydantic_schemas/geospatial_schema.py similarity index 100% rename from pydantic_schemas/definitions/geospatial_schema.py rename to pydantic_schemas/geospatial_schema.py diff --git a/pydantic_schemas/definitions/image_schema.py b/pydantic_schemas/image_schema.py similarity index 100% rename from pydantic_schemas/definitions/image_schema.py rename to pydantic_schemas/image_schema.py diff --git a/pydantic_schemas/definitions/microdata_schema.py b/pydantic_schemas/microdata_schema.py similarity index 100% rename from pydantic_schemas/definitions/microdata_schema.py rename to pydantic_schemas/microdata_schema.py diff --git a/pydantic_schemas/definitions/schema_base_model.py b/pydantic_schemas/schema_base_model.py similarity index 100% rename from pydantic_schemas/definitions/schema_base_model.py rename to pydantic_schemas/schema_base_model.py diff --git a/pydantic_schemas/definitions/script_schema.py b/pydantic_schemas/script_schema.py similarity index 100% rename from pydantic_schemas/definitions/script_schema.py rename to pydantic_schemas/script_schema.py diff --git a/pydantic_schemas/definitions/series_schema.py b/pydantic_schemas/series_schema.py similarity index 100% rename from pydantic_schemas/definitions/series_schema.py rename to pydantic_schemas/series_schema.py diff --git a/pydantic_schemas/definitions/table_schema.py b/pydantic_schemas/table_schema.py similarity index 100% rename from pydantic_schemas/definitions/table_schema.py rename to pydantic_schemas/table_schema.py diff --git a/pydantic_schemas/tests/test_pydantic_to_excel.py b/pydantic_schemas/tests/test_pydantic_to_excel.py index 2a7a9b6..3ca5276 100644 --- a/pydantic_schemas/tests/test_pydantic_to_excel.py +++ b/pydantic_schemas/tests/test_pydantic_to_excel.py @@ -6,17 +6,16 @@ import pytest from pydantic import BaseModel, Field -from pydantic_schemas.definitions.document_schema import ScriptSchemaDraft +from pydantic_schemas.document_schema import ScriptSchemaDraft # from pydantic_schemas.definitions.geospatial_schema import GeospatialSchema # from pydantic_schemas.definitions.image_schema import ImageDataTypeSchema -from pydantic_schemas.definitions.microdata_schema import MicrodataSchema -from pydantic_schemas.definitions.script_schema import ResearchProjectSchemaDraft -from pydantic_schemas.definitions.series_schema import Series -from pydantic_schemas.definitions.table_schema import Model as TableModel -from pydantic_schemas.definitions.timeseries_db_schema import TimeseriesDatabaseSchema -from pydantic_schemas.definitions.timeseries_schema import TimeseriesSchema -from pydantic_schemas.definitions.video_schema import Model as VideoModel +from pydantic_schemas.microdata_schema import MicrodataSchema +from pydantic_schemas.script_schema import ResearchProjectSchemaDraft +from pydantic_schemas.series_schema import Series +from pydantic_schemas.table_schema import Model as TableModel +from pydantic_schemas.timeseries_db_schema import TimeseriesDatabaseSchema +from pydantic_schemas.timeseries_schema import TimeseriesSchema from pydantic_schemas.utils.excel_to_pydantic import ( excel_doc_to_pydantic, excel_sheet_to_pydantic, @@ -32,6 +31,7 @@ write_to_single_sheet, ) from pydantic_schemas.utils.quick_start import make_skeleton +from pydantic_schemas.video_schema import Model as VideoModel # @pytest.mark.parametrize("index_above", [True, False]) diff --git a/pydantic_schemas/definitions/timeseries_db_schema.py b/pydantic_schemas/timeseries_db_schema.py similarity index 100% rename from pydantic_schemas/definitions/timeseries_db_schema.py rename to pydantic_schemas/timeseries_db_schema.py diff --git a/pydantic_schemas/definitions/timeseries_schema.py b/pydantic_schemas/timeseries_schema.py similarity index 100% rename from pydantic_schemas/definitions/timeseries_schema.py rename to pydantic_schemas/timeseries_schema.py diff --git a/pydantic_schemas/generate_pydantic_schemas.py b/pydantic_schemas/utils/generate_pydantic_schemas.py similarity index 95% rename from pydantic_schemas/generate_pydantic_schemas.py rename to pydantic_schemas/utils/generate_pydantic_schemas.py index 06e76d4..981124c 100644 --- a/pydantic_schemas/generate_pydantic_schemas.py +++ b/pydantic_schemas/utils/generate_pydantic_schemas.py @@ -2,7 +2,7 @@ from subprocess import run SCHEMA_DIR = "schemas" -OUTPUT_DIR = os.path.join("pydantic_schemas", "definitions") +OUTPUT_DIR = os.path.join("pydantic_schemas") PYTHON_VERSION = "3.11" BASE_CLASS = ".schema_base_model.SchemaBaseModel" INPUTS = [ diff --git a/pydantic_schemas/definitions/video_schema.py b/pydantic_schemas/video_schema.py similarity index 100% rename from pydantic_schemas/definitions/video_schema.py rename to pydantic_schemas/video_schema.py diff --git a/pyproject.toml b/pyproject.toml index c621090..93414e7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,9 +1,15 @@ [tool.poetry] -name = "metadata-schemas" -version = "0.1.0" +name = "metadataschemas" +version = "0.1.4" description = "" authors = ["Mehmood Asghar ", "Gordon Blackadder "] readme = "README.md" +packages = [ + { include = "*_schema.py", from = "pydantic_schemas", to = "metadataschemas"}, + { include = "schema_base_model.py", from = "pydantic_schemas", to = "metadataschemas"}, + { include = "excel_interface.py", from = "pydantic_schemas", to = "metadataschemas"}, + { include = "utils", from = "pydantic_schemas", to = "metadataschemas"}, +] [tool.poetry.dependencies] python = "^3.11" From 0d1cf8942edaaaf0c1e0756027e93d865732b461 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Wed, 7 Aug 2024 10:10:09 -0400 Subject: [PATCH 33/51] simplify interface --- pydantic_schemas/excel_interface.py | 219 +++++++----------- .../tests/test_excel_interface.py | 46 +--- .../tests/test_pydantic_to_excel.py | 2 +- pyproject.toml | 2 +- 4 files changed, 99 insertions(+), 170 deletions(-) diff --git a/pydantic_schemas/excel_interface.py b/pydantic_schemas/excel_interface.py index 9c0eaa1..b6c37d6 100644 --- a/pydantic_schemas/excel_interface.py +++ b/pydantic_schemas/excel_interface.py @@ -2,8 +2,9 @@ from pydantic import BaseModel -from . import ( +from . import ( # image_schema, document_schema, + geospatial_schema, microdata_schema, script_schema, series_schema, @@ -21,54 +22,46 @@ class ExcelInterface: """ An Excel interface creating, saving and updating metadata for various types: - documents, scripts, series, survey_microdata, table, timeseries, timeseries_db, video - - For each of these types there are three functions: - - write_empty_metadata_to_excel_for_ - save_metadata_to_excel_for_ - read_metadata_excel_of_ - - write_empty_metadata_to_excel_for_: - Args: - filename (str): The path to the Excel file. - title (str): The title for the Excel sheet. - - Outputs: - An Excel file into which metadata can be entered - - save_metadata_to_excel_for_: - Args: - filename (str): The path to the Excel file. - title (str): The title for the Excel sheet. - object (BaseModel): The pydantic object to save to the Excel file. - - Outputs: - An Excel file containing the metadata from the pydantic object. The file can be updated as needed. + documents, scripts, series, survey, table, timeseries, timeseries_db, video + """ - read_metadata_excel_of_: - Args: - filename (str): The path to the Excel file. + _TYPE_TO_SCHEMA = { + "document": document_schema.ScriptSchemaDraft, + "geospatial": geospatial_schema.GeospatialSchema, + # "image":image_schema.ImageDataTypeSchema, + "script": script_schema.ResearchProjectSchemaDraft, + "series": series_schema.Series, + "survey": microdata_schema.MicrodataSchema, + "table": table_schema.Model, + "timeseries": timeseries_schema.TimeseriesSchema, + "timeseries_db": timeseries_db_schema.TimeseriesDatabaseSchema, + "video": video_schema.Model, + } - Returns: - BaseModel: a pydantic object containing the metadata from the file - """ + _TYPE_TO_WRITER = { + "document": write_across_many_sheets, + # "geospatial":, + # "image":, + "script": write_across_many_sheets, + "series": write_to_single_sheet, # one sheet + "survey": write_across_many_sheets, + "table": write_across_many_sheets, + "timeseries": write_across_many_sheets, + "timeseries_db": write_to_single_sheet, # one sheet + "video": write_to_single_sheet, # one sheet + } - _NAME_FUNCTION_MAP = { - "document": (document_schema.ScriptSchemaDraft, write_across_many_sheets, excel_doc_to_pydantic), - # "geospatial":GeospatialSchema, - # "image":ImageDataTypeSchema, - "script": (script_schema.ResearchProjectSchemaDraft, write_across_many_sheets, excel_doc_to_pydantic), - "series": (series_schema.Series, write_to_single_sheet, excel_single_sheet_to_pydantic), # one sheet - "survey_microdata": (microdata_schema.MicrodataSchema, write_across_many_sheets, excel_doc_to_pydantic), - "table": (table_schema.Model, write_across_many_sheets, excel_doc_to_pydantic), - "timeseries": (timeseries_schema.TimeseriesSchema, write_across_many_sheets, excel_doc_to_pydantic), - "timeseries_db": ( - timeseries_db_schema.TimeseriesDatabaseSchema, - write_to_single_sheet, - excel_single_sheet_to_pydantic, - ), # one sheet - "video": (video_schema.Model, write_to_single_sheet, excel_single_sheet_to_pydantic), # one sheet + _TYPE_TO_READER = { + "document": excel_doc_to_pydantic, + # "geospatial":, + # "image":, + "script": excel_doc_to_pydantic, + "series": excel_single_sheet_to_pydantic, # one sheet + "survey": excel_doc_to_pydantic, + "table": excel_doc_to_pydantic, + "timeseries": excel_doc_to_pydantic, + "timeseries_db": excel_single_sheet_to_pydantic, # one sheet + "video": excel_single_sheet_to_pydantic, # one sheet } @staticmethod @@ -109,58 +102,76 @@ def _merge_dicts(base, update): new_dict[key] = base_value return new_dict - def write_empty_metadata_to_excel( + @staticmethod + def _process_metadata_type(metadata_type: str) -> str: + metadata_type = metadata_type.lower() + if metadata_type == "microdata" or metadata_type == "survey_microdata": + metadata_type = "survey" + return metadata_type + + def type_to_outline(self, metadata_type: str, debug: bool = False) -> BaseModel: + metadata_type = self._process_metadata_type(metadata_type) + schema = self._TYPE_TO_SCHEMA[metadata_type] + skeleton_object = make_skeleton(schema, debug=debug) + return skeleton_object + + def write_outline_metadata_to_excel( self, metadata_type: str, filename: Optional[str] = None, title: Optional[str] = None - ): + ) -> str: """ - Create an Excel document formatted for writing the given metadata_type metadata. + Create an Excel file formatted for writing the given metadata_type metadata. Args: metadata_type (str): the name of a supported metadata type, currently: - document, script, series, survey_microdata, table, timeseries, timeseries_DB, video + document, script, series, survey, table, timeseries, timeseries_DB, video Currently not supported: geospatial, image filename (Optional[str]): The path to the Excel file. If None, defaults to {metadata_type}_metadata.xlsx title (Optional[str]): The title for the Excel sheet. If None, defaults to '{metadata_type} Metadata' + Returns: + str: filename of metadata file + Outputs: An Excel file into which metadata can be entered """ - metadata_type = metadata_type.lower() + metadata_type = self._process_metadata_type(metadata_type) self.raise_if_unsupported_metadata_type(metadata_type=metadata_type) - schema = self._NAME_FUNCTION_MAP[metadata_type][0] - writer = self._NAME_FUNCTION_MAP[metadata_type][1] if filename is None: filename = f"{metadata_type}_metadata.xlsx" if not str(filename).endswith(".xlsx"): filename += ".xlsx" if title is None: title = f"{metadata_type.capitalize()} Metadata" - skeleton_object = make_skeleton(schema, debug=False) + skeleton_object = self.type_to_outline(metadata_type, debug=False) + writer = self._TYPE_TO_WRITER[metadata_type] writer(filename, skeleton_object, title) + return filename def save_metadata_to_excel( self, metadata_type: str, object: BaseModel, filename: Optional[str] = None, title: Optional[str] = None - ): + ) -> str: """ Save an Excel document of the given metadata_type metadata. Args: metadata_type (str): the name of a supported metadata type, currently: - document, script, series, survey_microdata, table, timeseries, timeseries_db, video + document, script, series, survey, table, timeseries, timeseries_db, video Currently not supported: geospatial, image object (BaseModel): The pydantic object to save to the Excel file. filename (Optional[str]): The path to the Excel file. Defaults to {name}_metadata.xlsx title (Optional[str]): The title for the Excel sheet. Defaults to '{name} Metadata' + Returns: + str: filename of metadata file + Outputs: An Excel file containing the metadata from the pydantic object. This file can be updated as needed. """ - metadata_type = metadata_type.lower() + metadata_type = self._process_metadata_type(metadata_type) self.raise_if_unsupported_metadata_type(metadata_type=metadata_type) - schema = self._NAME_FUNCTION_MAP[metadata_type][0] - writer = self._NAME_FUNCTION_MAP[metadata_type][1] + if filename is None: filename = f"{metadata_type}_metadata.xlsx" if not str(filename).endswith(".xlsx"): @@ -168,31 +179,40 @@ def save_metadata_to_excel( if title is None: title = f"{metadata_type.capitalize()} Metadata" - skeleton_object = make_skeleton(schema, debug=False) + skeleton_object = self.type_to_outline(metadata_type=metadata_type, debug=False) combined_dict = self._merge_dicts( skeleton_object.model_dump(), object.model_dump(exclude_none=True, exclude_unset=True, exclude_defaults=True), ) combined_dict = standardize_keys_in_dict(combined_dict) + + schema = self._TYPE_TO_SCHEMA[metadata_type] new_ob = schema(**combined_dict) + + writer = self._TYPE_TO_WRITER[metadata_type] writer(filename, new_ob, title) + return filename def read_metadata_excel(self, metadata_type: str, filename: str) -> BaseModel: """ Read in metadata_type metadata from an appropriately formatted Excel file as a pydantic object. Args: + metadata_type (str): the name of a supported metadata type, currently: + document, script, series, survey, table, timeseries, timeseries_db, video + Currently not supported: + geospatial, image filename (str): The path to the Excel file. Returns: BaseModel: a pydantic object containing the metadata from the file """ - metadata_type = metadata_type.lower() + metadata_type = self._process_metadata_type(metadata_type) self.raise_if_unsupported_metadata_type(metadata_type=metadata_type) - schema = self._NAME_FUNCTION_MAP[metadata_type][0] - reader = self._NAME_FUNCTION_MAP[metadata_type][2] + schema = self._TYPE_TO_SCHEMA[metadata_type] + reader = self._TYPE_TO_READER[metadata_type] read_object = reader(filename, schema) - skeleton_object = make_skeleton(schema, debug=False) + skeleton_object = self.type_to_outline(metadata_type=metadata_type, debug=False) combined_dict = self._merge_dicts( skeleton_object.model_dump(), @@ -202,80 +222,15 @@ def read_metadata_excel(self, metadata_type: str, filename: str) -> BaseModel: new_ob = schema(**combined_dict) return new_ob - # Method to generate write and read methods for all types - def __init__(self): - for metadata_type in self._NAME_FUNCTION_MAP.keys(): - self._generate_methods(metadata_type.lower()) - - def _generate_methods(self, metadata_type): - def write_skeleton_method( - filename=f"{metadata_type}_metadata.xlsx", title=f"{metadata_type.capitalize()} Metadata" - ): - self.write_empty_metadata_to_excel(metadata_type=metadata_type, filename=filename, title=title) - - write_skeleton_method.__name__ = f"write_empty_metadata_to_excel_for_{metadata_type}" - write_skeleton_doc_template = """ - Create an Excel document formatted for writing {name} metadata. - - Args: - filename (str): The path to the Excel file. Defaults to {name}_metadata.xlsx - title (str): The title for the Excel sheet. Defaults to '{name_capitalized} Metadata' - - Outputs: - An Excel file into which {name} metadata can be entered - """ - write_skeleton_method.__doc__ = write_skeleton_doc_template.format( - name=metadata_type, name_capitalized=metadata_type.capitalize() - ) - setattr(self, write_skeleton_method.__name__, write_skeleton_method) - - def save_to_excel_method( - object, filename=f"{metadata_type}_metadata.xlsx", title=f"{metadata_type.capitalize()} Metadata" - ): - self.save_metadata_to_excel(metadata_type=metadata_type, object=object, filename=filename, title=title) - - save_to_excel_method.__name__ = f"save_metadata_to_excel_for_{metadata_type}" - save_doc_template = """ - Save an Excel document of the {name} metadata. - - Args: - object (BaseModel): The pydantic object to save to the Excel file. - filename (str): The path to the Excel file. Defaults to {name}_metadata.xlsx - title (str): The title for the Excel sheet. Defaults to '{name_capitalized} Metadata' - - Outputs: - An Excel file containing the {name} metadata from the pydantic object. This file can be updated as needed. - """ - save_to_excel_method.__doc__ = save_doc_template.format( - name=metadata_type, name_capitalized=metadata_type.capitalize() - ) - setattr(self, save_to_excel_method.__name__, save_to_excel_method) - - def read_method(filename): - return self.read_metadata_excel(metadata_type, filename=filename) - - read_method.__name__ = f"read_metadata_excel_of_{metadata_type}" - read_doc_template = """ - Read in {name} metadata from an appropriately formatted Excel file as a pydantic object. - - Args: - filename (str): The path to the Excel file. - - Returns: - BaseModel: a pydantic object containing the metadata from the file - """ - read_method.__doc__ = read_doc_template.format(name=metadata_type) - setattr(self, read_method.__name__, read_method) - def raise_if_unsupported_metadata_type(self, metadata_type: str): """ If the type is specifically unsupported - geospatial or image - a NotImplementedError is raised If the type is simply unknown then a ValueError is raised. """ - metadata_type = metadata_type.lower() + metadata_type = self._process_metadata_type(metadata_type) if metadata_type == "geospatial": raise NotImplementedError("Geospatial schema contains an infinite loop so cannot be written to excel") if metadata_type == "image": raise NotImplementedError("Due to an issue with image metadata schema definition causing __root__ errors") - if metadata_type not in self._NAME_FUNCTION_MAP.keys(): - raise ValueError(f"'{metadata_type}' not supported. Must be: {list(self._NAME_FUNCTION_MAP.keys())}") + if metadata_type not in self._TYPE_TO_SCHEMA.keys(): + raise ValueError(f"'{metadata_type}' not supported. Must be: {list(self._TYPE_TO_SCHEMA.keys())}") diff --git a/pydantic_schemas/tests/test_excel_interface.py b/pydantic_schemas/tests/test_excel_interface.py index 1faa565..bd43dc8 100644 --- a/pydantic_schemas/tests/test_excel_interface.py +++ b/pydantic_schemas/tests/test_excel_interface.py @@ -4,48 +4,22 @@ @pytest.mark.parametrize( - "name", ["document", "script", "series", "survey_microdata", "table", "timeseries_db", "timeseries", "video"] + "metadata_type", ["document", "script", "series", "survey", "table", "timeseries_db", "timeseries", "video"] ) -def test_metadata(tmpdir, name): +def test_metadata(tmpdir, metadata_type): ei = ExcelInterface() - filename = tmpdir.join(f"test_{name}.xlsx") # Write empty metadata - write_method = getattr(ei, f"write_empty_metadata_to_excel_for_{name}") - write_method(filename=filename) + filename = ei.write_outline_metadata_to_excel( + metadata_type=metadata_type, filename=tmpdir.join(f"test_{metadata_type}.xlsx"), title=metadata_type + ) # Read the metadata back - read_method = getattr(ei, f"read_metadata_excel_of_{name}") - tmp = read_method(filename) + tmp = ei.read_metadata_excel(metadata_type=metadata_type, filename=filename) # Save the read metadata to a new file - filename2 = tmpdir.join(f"test_{name}_2.xlsx") - save_method = getattr(ei, f"save_metadata_to_excel_for_{name}") - save_method(object=tmp, filename=filename2) + filename2 = tmpdir.join(f"test_{metadata_type}_2.xlsx") + ei.save_metadata_to_excel(metadata_type=metadata_type, object=tmp, filename=filename2, title=metadata_type) - -# def test_document(tmpdir): -# ei = ExcelInterface() -# filename = tmpdir.join(f"test_document.xlsx") -# # filename = "test_document.xlsx" -# ei.write_empty_metadata_to_excel_for_document(filename=filename) -# tmp = ei.read_metadata_excel_of_document(filename) -# filename2 = tmpdir.join(f"test_document2") -# # filename2 = "test_document2.xlsx" -# ei.save_metadata_to_excel_for_document(filename=filename2, object=tmp) - - -# # ei.write_empty_metadata_to_excel_for_script() -# # ei.read_metadata_excel_of_script("Script_metadata.xlsx") -# # ei.write_empty_metadata_to_excel_for_series() -# # ei.read_metadata_excel_of_series("Series_metadata.xlsx") -# # ei.write_empty_metadata_to_excel_for_survey_microdata() -# # ei.read_metadata_excel_of_survey_microdata("Survey_microdata_metadata.xlsx") -# # ei.write_empty_metadata_to_excel_for_table() -# # ei.read_metadata_excel_of_table("Table_metadata.xlsx") -# # ei.write_empty_metadata_to_excel_for_timeseries_db() -# # ei.read_metadata_excel_of_timeseries_db("Timeseries_DB_metadata.xlsx") -# # ei.write_empty_metadata_to_excel_for_timeseries() -# # ei.read_metadata_excel_of_timeseries("Timeseries_metadata.xlsx") -# # ei.write_empty_metadata_to_excel_for_video() -# # ei.read_metadata_excel_of_video("Video_metadata.xlsx") + # make an outline object + ei.type_to_outline(metadata_type=metadata_type) diff --git a/pydantic_schemas/tests/test_pydantic_to_excel.py b/pydantic_schemas/tests/test_pydantic_to_excel.py index 3ca5276..ba8dfe0 100644 --- a/pydantic_schemas/tests/test_pydantic_to_excel.py +++ b/pydantic_schemas/tests/test_pydantic_to_excel.py @@ -402,7 +402,7 @@ class WithDict(BaseModel): "Document": (ScriptSchemaDraft, write_across_many_sheets, excel_doc_to_pydantic), # "Geospatial":GeospatialSchema, # "Image":ImageDataTypeSchema, - "Survey_microdata": (MicrodataSchema, write_across_many_sheets, excel_doc_to_pydantic), + "Survey": (MicrodataSchema, write_across_many_sheets, excel_doc_to_pydantic), "Script": (ResearchProjectSchemaDraft, write_across_many_sheets, excel_doc_to_pydantic), "Series": (Series, write_to_single_sheet, excel_single_sheet_to_pydantic), # should be one sheet "Table": (TableModel, write_across_many_sheets, excel_doc_to_pydantic), diff --git a/pyproject.toml b/pyproject.toml index 93414e7..a51fd03 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "metadataschemas" -version = "0.1.4" +version = "0.1.10" description = "" authors = ["Mehmood Asghar ", "Gordon Blackadder "] readme = "README.md" From 8529028d07d36bdddfc624b8658fef7e8612021b Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Thu, 8 Aug 2024 09:37:59 -0400 Subject: [PATCH 34/51] bug fix: final list element was shaded and locked --- pydantic_schemas/utils/pydantic_to_excel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pydantic_schemas/utils/pydantic_to_excel.py b/pydantic_schemas/utils/pydantic_to_excel.py index d014de0..663925a 100644 --- a/pydantic_schemas/utils/pydantic_to_excel.py +++ b/pydantic_schemas/utils/pydantic_to_excel.py @@ -44,7 +44,7 @@ def unprotect_cell(sheet, row, column): def unprotect_row(sheet, row, colmin: int, colmax: Optional[int] = None): if colmax is None: colmax = max(colmin, MAXCOL, sheet.max_column) - for col in range(colmin, colmax): + for col in range(colmin, colmax + 1): unprotect_cell(sheet, row, col) From b83fcc430dcd75e639d6d845a48c865da9ce2e58 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Thu, 8 Aug 2024 09:39:06 -0400 Subject: [PATCH 35/51] inflate read data to schema --- poetry.lock | 102 ++-------------------------- pydantic_schemas/excel_interface.py | 15 +++- pyproject.toml | 4 +- 3 files changed, 23 insertions(+), 98 deletions(-) diff --git a/poetry.lock b/poetry.lock index f4dae94..f0f2c66 100644 --- a/poetry.lock +++ b/poetry.lock @@ -11,26 +11,6 @@ files = [ {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] -[[package]] -name = "anyio" -version = "4.4.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.8" -files = [ - {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, - {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, -] - -[package.dependencies] -idna = ">=2.8" -sniffio = ">=1.1" - -[package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] - [[package]] name = "appnope" version = "0.1.4" @@ -44,13 +24,13 @@ files = [ [[package]] name = "argcomplete" -version = "3.4.0" +version = "3.5.0" description = "Bash tab completion for argparse" optional = false python-versions = ">=3.8" files = [ - {file = "argcomplete-3.4.0-py3-none-any.whl", hash = "sha256:69a79e083a716173e5532e0fa3bef45f793f4e61096cf52b5a42c0211c8b8aa5"}, - {file = "argcomplete-3.4.0.tar.gz", hash = "sha256:c2abcdfe1be8ace47ba777d4fce319eb13bf8ad9dace8d085dcad6eded88057f"}, + {file = "argcomplete-3.5.0-py3-none-any.whl", hash = "sha256:d4bcf3ff544f51e16e54228a7ac7f486ed70ebf2ecfe49a63a91171c76bf029b"}, + {file = "argcomplete-3.5.0.tar.gz", hash = "sha256:4349400469dccfb7950bb60334a680c58d88699bff6159df61251878dc6bf74b"}, ] [package.extras] @@ -347,20 +327,19 @@ test = ["pytest"] [[package]] name = "datamodel-code-generator" -version = "0.25.7" +version = "0.25.9" description = "Datamodel Code Generator" optional = false python-versions = "<4.0,>=3.7" files = [ - {file = "datamodel_code_generator-0.25.7-py3-none-any.whl", hash = "sha256:0b890a0c2bfe8c250f1ddc9656fabeb85db289d4d497a616c19bd80db004dd9a"}, - {file = "datamodel_code_generator-0.25.7.tar.gz", hash = "sha256:975079cb3776f10a71d6aa9914b73149c3fdf4c71825b0977951a959fefc77f6"}, + {file = "datamodel_code_generator-0.25.9-py3-none-any.whl", hash = "sha256:9e0324233123d6e39a35bc0004771956935889a974aacfd7a0651de11d2219a9"}, + {file = "datamodel_code_generator-0.25.9.tar.gz", hash = "sha256:65ca9807d8edbd88a7f7931c10f4bc1c08bd9bbc5bb0508418a2b6a16590eb65"}, ] [package.dependencies] argcomplete = ">=1.10,<4.0" black = ">=19.10b0" genson = ">=1.2.1,<2.0" -httpx = {version = "*", optional = true, markers = "extra == \"http\""} inflect = ">=4.1.0,<6.0" isort = ">=4.3.21,<6.0" jinja2 = ">=2.10.1,<4.0" @@ -536,62 +515,6 @@ files = [ {file = "genson-1.3.0.tar.gz", hash = "sha256:e02db9ac2e3fd29e65b5286f7135762e2cd8a986537c075b06fc5f1517308e37"}, ] -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "httpcore" -version = "1.0.5" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, - {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, -] - -[package.dependencies] -certifi = "*" -h11 = ">=0.13,<0.15" - -[package.extras] -asyncio = ["anyio (>=4.0,<5.0)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.26.0)"] - -[[package]] -name = "httpx" -version = "0.27.0" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, - {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, -] - -[package.dependencies] -anyio = "*" -certifi = "*" -httpcore = "==1.*" -idna = "*" -sniffio = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] - [[package]] name = "identify" version = "2.5.36" @@ -1664,17 +1587,6 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -[[package]] -name = "sniffio" -version = "1.3.1" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, - {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, -] - [[package]] name = "stack-data" version = "0.6.3" @@ -1802,4 +1714,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "425661ff008ae6ca9d125ab45757371472e9120f1d3b6fb31131b9dea76352ac" +content-hash = "548bd0d8e7fb0a3cc4adbe09b1c592b315164c51ccbae0258fbed5a375349274" diff --git a/pydantic_schemas/excel_interface.py b/pydantic_schemas/excel_interface.py index b6c37d6..9111f0e 100644 --- a/pydantic_schemas/excel_interface.py +++ b/pydantic_schemas/excel_interface.py @@ -212,13 +212,26 @@ def read_metadata_excel(self, metadata_type: str, filename: str) -> BaseModel: schema = self._TYPE_TO_SCHEMA[metadata_type] reader = self._TYPE_TO_READER[metadata_type] read_object = reader(filename, schema) + new_ob = self.inflate_read_data_to_schema(metadata_type, read_object) + return new_ob + + def inflate_read_data_to_schema(self, metadata_type, read_object): + metadata_type = self._process_metadata_type(metadata_type) + self.raise_if_unsupported_metadata_type(metadata_type=metadata_type) skeleton_object = self.type_to_outline(metadata_type=metadata_type, debug=False) + if isinstance(read_object, dict): + read_object_dict = read_object + elif isinstance(read_object, BaseModel): + read_object_dict = read_object.model_dump(exclude_none=True, exclude_unset=True, exclude_defaults=True) + else: + raise ValueError(f"Expected dict or pydantic BaseModel but got {type(read_object)}") combined_dict = self._merge_dicts( skeleton_object.model_dump(), - read_object.model_dump(exclude_none=True, exclude_unset=True, exclude_defaults=True), + read_object_dict, ) combined_dict = standardize_keys_in_dict(combined_dict) + schema = self._TYPE_TO_SCHEMA[metadata_type] new_ob = schema(**combined_dict) return new_ob diff --git a/pyproject.toml b/pyproject.toml index a51fd03..64285f9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "metadataschemas" -version = "0.1.10" +version = "0.1.13" description = "" authors = ["Mehmood Asghar ", "Gordon Blackadder "] readme = "README.md" @@ -16,7 +16,6 @@ python = "^3.11" pandas = "^2.2.2" pydantic = "^2.8.0" openpyxl = "^3.1.5" -datamodel-code-generator = {extras = ["http"], version = "^0.25.7"} [tool.poetry.group.dev.dependencies] pytest = "^8.2.2" @@ -26,6 +25,7 @@ ruff = "^0.5.0" black = "^24.4.2" detect-secrets = "^1.5.0" ipykernel = "^6.29.5" +datamodel-code-generator = "^0.25.9" [tool.ruff] line-length = 120 From 6949a285fcf6b6d223b6d9aa6d7f7e6278d0796b Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Thu, 8 Aug 2024 12:08:55 -0400 Subject: [PATCH 36/51] marginal speedup --- .../tests/test_pydantic_to_excel.py | 58 ++++++++++------ pydantic_schemas/tests/test_quick_start.py | 2 +- pydantic_schemas/utils/pydantic_to_excel.py | 69 ++++++++++--------- pydantic_schemas/utils/quick_start.py | 4 +- 4 files changed, 75 insertions(+), 58 deletions(-) diff --git a/pydantic_schemas/tests/test_pydantic_to_excel.py b/pydantic_schemas/tests/test_pydantic_to_excel.py index ba8dfe0..d2895cb 100644 --- a/pydantic_schemas/tests/test_pydantic_to_excel.py +++ b/pydantic_schemas/tests/test_pydantic_to_excel.py @@ -24,6 +24,7 @@ from pydantic_schemas.utils.pydantic_to_excel import ( correct_column_widths, create_sheet_and_write_title, + open_or_create_workbook, shade_30_rows_and_protect_sheet, shade_locked_cells, write_across_many_sheets, @@ -51,9 +52,11 @@ class Simple(BaseModel): current_row = write_nested_simple_pydantic_to_sheet( filename, sheetname, simple_original, current_row + 1, index_above=index_above ) - correct_column_widths(filename, sheetname) - shade_30_rows_and_protect_sheet(filename, sheetname, current_row + 1) - shade_locked_cells(filename, sheetname) + worksheet = open_or_create_workbook(filename) + correct_column_widths(worksheet, sheetname) + shade_30_rows_and_protect_sheet(worksheet, sheetname, current_row + 1) + shade_locked_cells(worksheet, sheetname) + worksheet.save(filename) parsed_simple = excel_sheet_to_pydantic(filename, sheetname, Simple) assert parsed_simple == simple_original, parsed_simple @@ -85,9 +88,11 @@ class ProductionAndCountries(BaseModel): current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) current_row = write_nested_simple_pydantic_to_sheet(filename, sheetname, inp, current_row, index_above=index_above) - correct_column_widths(filename, sheetname) - shade_30_rows_and_protect_sheet(filename, sheetname, current_row + 1) - shade_locked_cells(filename, sheetname) + worksheet = open_or_create_workbook(filename) + correct_column_widths(worksheet, sheetname) + shade_30_rows_and_protect_sheet(worksheet, sheetname, current_row + 1) + shade_locked_cells(worksheet, sheetname) + worksheet.save(filename) parsed_outp = excel_sheet_to_pydantic(filename, sheetname, ProductionAndCountries) assert parsed_outp == inp, parsed_outp @@ -141,9 +146,11 @@ class ProductionAndCountries(BaseModel): current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) current_row = write_nested_simple_pydantic_to_sheet(filename, sheetname, inp, current_row + 1) - correct_column_widths(filename, sheet_name=sheetname) - shade_30_rows_and_protect_sheet(filename, sheetname, current_row + 1) - shade_locked_cells(filename, sheetname) + worksheet = open_or_create_workbook(filename) + correct_column_widths(worksheet, sheet_name=sheetname) + shade_30_rows_and_protect_sheet(worksheet, sheetname, current_row + 1) + shade_locked_cells(worksheet, sheetname) + worksheet.save(filename) parsed_outp = excel_sheet_to_pydantic(filename, sheetname, ProductionAndCountries) assert parsed_outp == inp, parsed_outp @@ -165,9 +172,11 @@ class Production(BaseModel): current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) current_row = write_nested_simple_pydantic_to_sheet(filename, sheetname, original_production, current_row + 1) - correct_column_widths(filename, sheet_name=sheetname) - shade_30_rows_and_protect_sheet(filename, sheetname, current_row + 1) - shade_locked_cells(filename, sheetname) + worksheet = open_or_create_workbook(filename) + correct_column_widths(worksheet, sheet_name=sheetname) + shade_30_rows_and_protect_sheet(worksheet, sheetname, current_row + 1) + shade_locked_cells(worksheet, sheetname) + worksheet.save(filename) class Production(BaseModel): idno: Optional[str] = None @@ -212,9 +221,11 @@ class ProductionAndCountries(BaseModel): current_row = write_nested_simple_pydantic_to_sheet( filename, sheetname, example_production_and_country, current_row + 1 ) - correct_column_widths(filename, sheet_name=sheetname) - shade_30_rows_and_protect_sheet(filename, sheetname, current_row + 1) - shade_locked_cells(filename, sheetname) + worksheet = open_or_create_workbook(filename) + correct_column_widths(worksheet, sheet_name=sheetname) + shade_30_rows_and_protect_sheet(worksheet, sheetname, current_row + 1) + shade_locked_cells(worksheet, sheetname) + worksheet.save(filename) class Production(BaseModel): idno: Optional[str] = None @@ -303,9 +314,12 @@ class ProductionAndCountries(BaseModel): current_row = write_nested_simple_pydantic_to_sheet( filename, sheetname, example_production_and_country, current_row + 1 ) - correct_column_widths(filename, sheet_name=sheetname) - shade_30_rows_and_protect_sheet(filename, sheetname, current_row + 1) - shade_locked_cells(filename, sheetname) + worksheet = open_or_create_workbook(filename) + correct_column_widths(worksheet, sheet_name=sheetname) + shade_30_rows_and_protect_sheet(worksheet, sheetname, current_row + 1) + shade_locked_cells(worksheet, sheetname) + worksheet.save(filename) + new_pandc = excel_sheet_to_pydantic(filename=filename, sheetname=sheetname, model_type=ProductionAndCountries) assert new_pandc.production.idno is None assert new_pandc.production.title is None @@ -486,6 +500,8 @@ class MetaDataOfVariousHierarchies(BaseModel): current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) current_row = write_nested_simple_pydantic_to_sheet(filename, sheetname, example, current_row + 1) - correct_column_widths(filename, sheet_name=sheetname) - shade_30_rows_and_protect_sheet(filename, sheetname, current_row + 1) - shade_locked_cells(filename, sheetname) + worksheet = open_or_create_workbook(filename) + correct_column_widths(worksheet, sheet_name=sheetname) + shade_30_rows_and_protect_sheet(worksheet, sheetname, current_row + 1) + shade_locked_cells(worksheet, sheetname) + worksheet.save(filename) diff --git a/pydantic_schemas/tests/test_quick_start.py b/pydantic_schemas/tests/test_quick_start.py index 49dd752..3e506e1 100644 --- a/pydantic_schemas/tests/test_quick_start.py +++ b/pydantic_schemas/tests/test_quick_start.py @@ -241,5 +241,5 @@ class BadFieldNames(BaseModel): @pytest.mark.parametrize("k, v", [(k, v) for k, v in METADATA_TYPES_FILE_MAP.items()]) def test_actual_schemas(k, v): - base = "pydantic_schemas.definitions.{}" + base = "pydantic_schemas.{}" create_empty_schema_from_path(base.format(k), v, debug=True) diff --git a/pydantic_schemas/utils/pydantic_to_excel.py b/pydantic_schemas/utils/pydantic_to_excel.py index 663925a..c4095d7 100644 --- a/pydantic_schemas/utils/pydantic_to_excel.py +++ b/pydantic_schemas/utils/pydantic_to_excel.py @@ -53,10 +53,20 @@ def unprotect_given_col(sheet, col: int, rowmin: int, rowmax: int): unprotect_cell(sheet, row, col) -def shade_30_rows_and_protect_sheet(doc_filepath: str, sheet_name: str, startrow: int): +def open_or_create_workbook(doc_filepath): + if os.path.exists(doc_filepath): + workbook = load_workbook(doc_filepath) + else: + workbook = Workbook() + # Remove the default sheet created by Workbook() + if len(workbook.sheetnames) == 1 and workbook.sheetnames[0] == "Sheet": + del workbook["Sheet"] + return workbook + + +def shade_30_rows_and_protect_sheet(workbook: Workbook, sheet_name: str, startrow: int): """For use after all data is written so there is a clear border around the data""" - wb = load_workbook(doc_filepath) - ws = wb[sheet_name] + ws = workbook[sheet_name] for r in range(startrow, startrow + 30): protect_and_shade_row(ws, r) ws.protection = SheetProtection( @@ -72,21 +82,19 @@ def shade_30_rows_and_protect_sheet(doc_filepath: str, sheet_name: str, startrow selectLockedCells=False, selectUnlockedCells=False, ) - wb.save(doc_filepath) -def correct_column_widths(filename: str, sheet_name: str): +def correct_column_widths(workbook: Workbook, sheet_name: str): """ Adjusts the column widths of an Excel sheet based on the maximum length of the content in each column. If a column has no filled values, its width remains unchanged. Args: - filename (str): The path to the Excel file. + workbook (Workbook): The openPyxl Workbook of an Excel file. sheet_name (str): The name of the sheet to adjust column widths for. """ # Load the existing workbook - wb = load_workbook(filename) - ws = wb[sheet_name] + ws = workbook[sheet_name] # Adjust column widths based on the maximum length of the content in each column for col in ws.columns: max_length = 0 @@ -103,21 +111,17 @@ def correct_column_widths(filename: str, sheet_name: str): adjusted_width = max_length + 2 ws.column_dimensions[column].width = adjusted_width - # Save the workbook - wb.save(filename) - -def shade_locked_cells(filename: str, sheet_name: str): +def shade_locked_cells(workbook: Workbook, sheet_name: str): """ Shades every cell grey if it is locked and leaves it unshaded if it is not locked. Args: - filename (str): The path to the Excel file. + workbook (Workbook): The openPyxl Workbook of an Excel file. sheet_name (str): The name of the sheet to apply the shading. """ # Load the existing workbook - wb = load_workbook(filename) - ws = wb[sheet_name] + ws = workbook[sheet_name] # Define the grey fill grey_fill = PatternFill(start_color="DDDDDD", end_color="DDDDDD", fill_type="solid") @@ -130,9 +134,6 @@ def shade_locked_cells(filename: str, sheet_name: str): else: cell.fill = PatternFill() # Remove any fill (reset to default) - # Save the workbook - wb.save(filename) - def write_to_cell( filename: str, sheet_name: str, row: int, col: int, text: str, isBold=False, size=14, debug: bool = False @@ -199,13 +200,7 @@ def create_sheet_and_write_title( ValueError: if a sheet called sheet_name already exists in the document to prevent overwriting. """ # Check if the file exists - if os.path.exists(doc_filepath): - workbook = load_workbook(doc_filepath) - else: - workbook = Workbook() - # Remove the default sheet created by Workbook() - if len(workbook.sheetnames) == 1 and workbook.sheetnames[0] == "Sheet": - del workbook["Sheet"] + workbook = open_or_create_workbook(doc_filepath) # Check if the sheet already exists if sheet_name in workbook.sheetnames: @@ -523,9 +518,11 @@ def write_to_single_sheet(doc_filepath: str, ob: BaseModel, title: Optional[str] doc_filepath, sheet_name, title, sheet_number=0, protect_title=False, debug=debug ) current_row = write_nested_simple_pydantic_to_sheet(doc_filepath, sheet_name, ob, current_row + 1) - correct_column_widths(doc_filepath, sheet_name=sheet_name) - shade_30_rows_and_protect_sheet(doc_filepath, sheet_name, current_row + 1) - shade_locked_cells(doc_filepath, sheet_name) + workbook = open_or_create_workbook(doc_filepath) + correct_column_widths(workbook, sheet_name=sheet_name) + shade_30_rows_and_protect_sheet(workbook, sheet_name, current_row + 1) + shade_locked_cells(workbook, sheet_name) + workbook.save(doc_filepath) def write_across_many_sheets(doc_filepath: str, ob: BaseModel, title: Optional[str] = None, debug=False): @@ -552,9 +549,11 @@ def write_across_many_sheets(doc_filepath: str, ob: BaseModel, title: Optional[s annotations={k: v.annotation for k, v in child_object.model_fields.items()}, debug=debug, ) - correct_column_widths(doc_filepath, sheet_name=sheet_name) - shade_30_rows_and_protect_sheet(doc_filepath, sheet_name, current_row + 1) - shade_locked_cells(doc_filepath, sheet_name) + workbook = open_or_create_workbook(doc_filepath) + correct_column_widths(workbook, sheet_name=sheet_name) + shade_30_rows_and_protect_sheet(workbook, sheet_name, current_row + 1) + shade_locked_cells(workbook, sheet_name) + workbook.save(doc_filepath) sheet_number += 1 for fieldname in children["pydantic"]: @@ -571,7 +570,9 @@ def write_across_many_sheets(doc_filepath: str, ob: BaseModel, title: Optional[s ) current_row = write_nested_simple_pydantic_to_sheet(doc_filepath, fieldname, field, current_row + 1) - correct_column_widths(doc_filepath, sheet_name=fieldname) - shade_30_rows_and_protect_sheet(doc_filepath, fieldname, current_row + 1) - shade_locked_cells(doc_filepath, fieldname) + workbook = open_or_create_workbook(doc_filepath) + correct_column_widths(workbook, sheet_name=fieldname) + shade_30_rows_and_protect_sheet(workbook, fieldname, current_row + 1) + shade_locked_cells(workbook, fieldname) + workbook.save(doc_filepath) sheet_number += 1 diff --git a/pydantic_schemas/utils/quick_start.py b/pydantic_schemas/utils/quick_start.py index 53de288..ece358f 100644 --- a/pydantic_schemas/utils/quick_start.py +++ b/pydantic_schemas/utils/quick_start.py @@ -10,8 +10,8 @@ METADATA_TYPES_FILE_MAP = { "document_schema": "ScriptSchemaDraft", - "geospatial_schema": "GeospatialSchema", - "image_schema": "ImageDataTypeSchema", + # "geospatial_schema": "GeospatialSchema", + # "image_schema": "ImageDataTypeSchema", "microdata_schema": "MicrodataSchema", "script_schema": "ResearchProjectSchemaDraft", "series_schema": "Series", From 7857924b7d6e07068af97e3135aa6a7b703a8d96 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Fri, 9 Aug 2024 11:59:42 -0400 Subject: [PATCH 37/51] make unknown fields raise an error --- pydantic_schemas/schema_base_model.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pydantic_schemas/schema_base_model.py b/pydantic_schemas/schema_base_model.py index 06c7548..90d8df9 100644 --- a/pydantic_schemas/schema_base_model.py +++ b/pydantic_schemas/schema_base_model.py @@ -3,7 +3,7 @@ class SchemaBaseModel(BaseModel): model_config = ConfigDict( - validate_assignment=True, protected_namespaces=(), use_enum_values=True + validate_assignment=True, protected_namespaces=(), use_enum_values=True, extra="forbid" ) # if a subclass has a model_config then this will be overridden def __setitem__(self, key, value): diff --git a/pyproject.toml b/pyproject.toml index 64285f9..0ba3153 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "metadataschemas" -version = "0.1.13" +version = "0.1.15" description = "" authors = ["Mehmood Asghar ", "Gordon Blackadder "] readme = "README.md" From a29291c274dc002fa0ea905727297ff5bf324ad7 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Fri, 9 Aug 2024 13:28:49 -0400 Subject: [PATCH 38/51] create automatic excel file creation --- README.md | 6 +++++- excel_sheets/Document_metadata.xlsx | Bin 180719 -> 0 bytes excel_sheets/Script_metadata.xlsx | Bin 188842 -> 0 bytes excel_sheets/Series_metadata.xlsx | Bin 49843 -> 0 bytes excel_sheets/Survey_microdata_metadata.xlsx | Bin 269270 -> 0 bytes excel_sheets/Table_metadata.xlsx | Bin 178976 -> 0 bytes excel_sheets/Timeseries_DB_metadata.xlsx | Bin 65537 -> 0 bytes excel_sheets/Timeseries_metadata.xlsx | Bin 244226 -> 0 bytes excel_sheets/Video_metadata.xlsx | Bin 68939 -> 0 bytes pydantic_schemas/excel_interface.py | 3 +++ .../generators/generate_excel_files.py | 12 ++++++++++++ .../generate_pydantic_schemas.py | 0 12 files changed, 20 insertions(+), 1 deletion(-) delete mode 100644 excel_sheets/Document_metadata.xlsx delete mode 100644 excel_sheets/Script_metadata.xlsx delete mode 100644 excel_sheets/Series_metadata.xlsx delete mode 100644 excel_sheets/Survey_microdata_metadata.xlsx delete mode 100644 excel_sheets/Table_metadata.xlsx delete mode 100644 excel_sheets/Timeseries_DB_metadata.xlsx delete mode 100644 excel_sheets/Timeseries_metadata.xlsx delete mode 100644 excel_sheets/Video_metadata.xlsx create mode 100644 pydantic_schemas/generators/generate_excel_files.py rename pydantic_schemas/{utils => generators}/generate_pydantic_schemas.py (100%) diff --git a/README.md b/README.md index ae35a15..e95e38f 100644 --- a/README.md +++ b/README.md @@ -8,4 +8,8 @@ View documentation - https://worldbank.github.io/metadata-schemas/ To update the pydantic schemas so that they match the json schemas run - `python pydantic_schemas\\utils\\generate_pydantic_schemas.py` \ No newline at end of file + `python pydantic_schemas\\generators\\generate_pydantic_schemas.py` + +Then to update the Excel sheets run + + `python pydantic_schemas\\generators\\generate_excel_files.py` \ No newline at end of file diff --git a/excel_sheets/Document_metadata.xlsx b/excel_sheets/Document_metadata.xlsx deleted file mode 100644 index 1c31afdb0624295fe5735fef796a06fa3638313e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180719 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

6znc=(WTv(ksWyaNUx1 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 G^nUUpA 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 diff --git a/excel_sheets/Timeseries_metadata.xlsx b/excel_sheets/Timeseries_metadata.xlsx deleted file mode 100644 index eb5ca7428cfe9f295532ecc13d95c85377a4647c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244226 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 diff --git a/excel_sheets/Video_metadata.xlsx b/excel_sheets/Video_metadata.xlsx deleted file mode 100644 index b549c7d2d62112573cab928ad22e19b8c5b23ddb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68939 zcmeIb3p|tm`#-Le4l$Ap#F_l6N zD~xKi5Ua@A7DCL-VdwjIFI4aM|J_Nf1_-}}3sk9+s5O>Nh%>-D^z*LA(_jW#1j zs>#X8DaiS35<6IyuD8Af{!|VggCm*8)r7A0GrVGp{ zFK?W_@#%27;fJG9_q9}$;W{IV5`Ab#!VQ%dmoc+4n&0SKdLE?4SOh*;x@lGs)4_P@ z{n_x;y2*;;nnGrp;U?NFiJdsoys&=VDo4cB4O6EXjw#mj&r3`6PAb0rq4q*d zn)WfJQXU|Bx6L>t+~s=H>tIFaEzZj6-bogu7h}s@hpjR_YjodwReYff>?)&6`EZ9k zvMgamOoPheox4=DHNtZU(eKuH@82e%zFs#Rw?bvfo+ZcTjC6Lm`H@Lb*|Olm%6p!7 z*}_EB2Iu$IPiw1Kl*~}qtaIye7q`AoEL;(hyD=KZXTA2yp4U?Kg+2V;>MPfIpS>?! zyFhFBAnuu#>OR*#IOkPE+qQcb$F03bx1!-CxYq|C*H;5ZFZZ$>H+u8B(ba$ZY%V)r zojy)pPVVY#Ik}18XA`s!alp&N$D{AoQ2Ob#ZFdTIzgP{!CcX~x?D0`5S#=kz+5yE{=M#rYEUN zU15RBvZdD?UL6YUDQ+V~y?lSb*hlLlixaf?F{KjcH+kg8O}Pn$*ShwRlFi3tCV9Vh zf7|mu{oKvF(OYb*dc)|g@m^OIqn&K4_6B~aI&-Qd?RAh!0mnA7DE(AP>gxlo-m_+l z)AuGfPx7*`WVMD&P=D00qH3y~gWsW=vdR%Lu5$$kFKWG;lKa8jxx=A-$*J*@67t9z z?@G-WV@v;QXGe{dGbyfEw=tAx{`mCA!t<5RXKSc)A8pi9xbpmHx7D#}}e57 z?dds}GIIfy%~x#QVCo6q7L(yZrG83?@}Hjjp~oSt$JWYsI_=KWhyS5nw4AY;@Lcc7 zr}2v)tx;Jp5vg!3B5u#d$-|S!7{=U);ANKF8~<@)SXP0;b9(g2-coZ0XKP+vQmljeuviVc@!f^G9-EdD*tSx^~{o}eK69i(lkUeihp&X z;^cGMQ-*tLKeU{7!aKJ^hdATRm9)a~^DWGFYA(|9e>CantD19T$DemK0iXK{cXm8UCt~s1D{YDU9Y%^1T#ME``+SVDTbzxF zs5aWCd#2aw4Q%Zv)mgWY%?pf2CtYzIlYe5{9>U#7W3$^j3lv9ja&*iZLV^@cVoLHh zrXM>z45)Z-Qkcp+_H+qWKa85f&goiyqcY26dYI?4Dx6cjrLR-5Fx~Jy%~*fVE_?s- z=cRVU3v=HtAw2ye_A*Q0v95BBmVOC=kP)qM8d zo1tr&wIiFx(N+8CzC-W&=;Opq!#g)`-C^idGGhMO#L#t7t3UfS#X6%{73W#CH$5Kt z66XeL`uu0}l0xseiJqx1>pkv2+d751)u}V1V9)YQ^$k>sW7>0q^7svtlqOj3x(K_u zHj%5jrJ!m4n&PdCNvn+>Pl(mXV>OoU->@Zn!lB2i!x!Y_F1ZupVd#0Yldh*cM%U@2 z;{@h)!w#$- zKK;^U`AM(^pEkCiKPx|RSoy^lt2%}sbH6$HNSr_^zf(D9uKKGqvnANoy2m3nxK_@b zpmsV#dDJwRKa0)2uqQBzCeS_VbHZ+cdo}Fk%2Usl8~Lw%Yd4dd{(hEHcrDYeJXfn= z)()GZ5Z`Nhvw>RIH_J0&%PqM{mp|$}j0}hm$u3-d4{)f_;V+;s@vB{0Kf<+fqVCFM z%(Jl5r;m(J-C6L2Xv?2@by?OmaL*%tjYTdUCNqH;SIeuLT6<=mH@Zg$m`0 za)G95x@)K~j893W(M_>jF}*-SrHA%r(GUsP?w*_AE6Z<@#BFR0x11YGmk5xOwze;? zS^-{`Jr>LDrl3)E!Qxc5L{e@-MFD{YJV7-Q5Yq@E0am`(Rni3hlT$>E;H%J7fJ+v` z&^nSfp>_dKOBeBi3qttiI5g=nzoizHkKx2(frFu)q*oto&43TJ@%64x?a(&S@sq zb6zx&$a;i)Qp3YQ?E64`dmAB*Knj+?fgbRK!FCHGDI_2i8QRf9e_dNk0;cDSdLjWU zHYr#f7RDEcp(U&e3eh!BkOi7bvPEpbD<{zDF>GI9SDO#L;BXMKOo>|(YJe(JZL~Ka zo#rnrBksbC;Ks+%3q^|>0}V(x{_-;RE{PmBG7ecNGHkRpz@FwCl}%Thp}$JsUH^oB zvVO7tC;gF#8HiN~cf<)qGNKsq2{F=OhQTTWcY_lK$p*y+pA1GC&M=$_9rtJ4=greS zH4_r_PU)R0M<~p^4*~mUd_~ZrbH#(lrQ$v`7&=a{A0+TIbk>-j51PTTW->}FC;af^ zx#H=ktiT5nlqO)gQtLVwh6z{`+P6#|V}K~r<~|EGM8=_>iRLxZ3`l4ADrM-M7$t6P z9Q~O{zp>YVgy)YagYT3ma7*Km&qQ+@sRpV?l};(0Q@X5lL+OsveWe_wXG$-WDwN(S zF_fB>I7)n_Vaj8a$17_pPg9<&Y^c0M*<5+eI~ zx0DgwbcVww!2SbU0JDH?hV6v;!;Znu!xCW+V1=+s7!%eB8?G@y<3Ab;G%PeWYwXnU z*EpteJ}$K7Lh(h2IA6?6&6p7b36Ezyp0S8D^%^A2uW=qE z`dvtBk4SCp0gw8@Jm-V-twmmx9zNdbF?IipAQM2;CTc=@2?S)iYglh*c`6MMccv;K z(c5F$k`AUI9ecwp$PUMUCQ@v)HzY;y50;^KU?y^%;^-x!v5kR-q)2{P8GMIi9M>ui zSt1(KXlsa#2tMhZY%w?U*z52&;cvt1!as(83jZAbCA=fNE1VZD3YUu*8KDrN95F6J zEkYw=a>Ue#8M6omkRu@&2cZK(_!|h7{b8^#7!LM!=KekeuZ!sqhy#J~=jXmq_tnj^ z@BhVY(#R-%py^mK{!jo)lpQY|Zgnh>OQpZU7Q_o{=|EREMM_1OJKHfr}^P#qTxjZGj_P0g&C9AoTSb_2~k}rEV9%B1~qr!CLCa z=lxcz0ie}-`>iHQCAvyFc4tya1(}zH4TphNG8UD6hyLNy!4I}V+x3uFyBlW}Q(h}V zS?kWnL59P5=y-b`Iu@UYj_mXOFr8)7?|TE*{Q3EZ=veo*FE;+*gwh8B%$ZiLPY_sV zS{T2lkU(s$FGun}d7^IQE4?R+S$rCn)Kz{^++eHoI>o0hc4{QlMec;fyo(m|60m8tS4AU4oo(SrRC*YfSGGLy^dHngP0OG?y&e zff>b3jYAcQmNuFgkWTUS%Fw$oqq(_p^dga2qpAV+B!7Ate3xV-_f{OT$kf7|Y4ORT z(c-g3i^UgT&`?d^PGjpbL zlCIUwCW-gY?G;DHs*YkGFMzd|Q%q1O(dvL~cG3J+p;E!?QAv@RidKx%g+_ z=hWF{r}#NB&J?(7dRbteL46XJAb7ngGcnl6f z67*D)KQJ3=&GJl1q>r#exS&<3eroA+oVRA*^mAcE6s`|mfo<3p#wXpks;_bhv2s1J3Y1Fi3zV8nB5D`?Azx-+ml0 zVUBwj>jU!^{1A@7T-<5qmBq`V5eo!D0xD0^&OFA6Ws7_GCNL~O7uI6j+IUq;m_1t= zbDTG2-}PJ1cv7em987B&9qXnYo9TEu#qqh} zXG4Vra~4=H@LF(k!R-al7kplzU^K_b+Q`f3q|t4o=SH866pZH>TN`^BdqYR2*AU>H z2^j~xhJXQEg`K$7?`;EK_w#d~AAR++JkP{_xBBLGQX@8rQMO(Fmd8S)V?pPDE(|eM?a)|OV<JEhP`0PB?mCX1GWNbHvj`zmU zvD6qko*4JTtgz~H|Xq6XrKD3{QtSPZrn2Kd)T&L-pad3RQYC;6>r+$~%f-l}M#<~y%$b9S1a6(hZH zdALwfRZVA}>E@t&9jh333XQ@QV%+D(?4DM7y>#mH>(8gYxc*}5%j++vQm#{`mR&EK zT7JEJ>Z|Lorc$p{r@p@adTPaWi0q?}tw3iWi9=u@H;2GLZhVW0zk!3yle8CY<^-Y< z`5AVhu*{{Qy%ZRhmtKs-bc@OxdhrD!O|!hsARke3F$nR4!bglJL*^q*j*vs;|I#qI zki|yc)5PLg&xO|)vXHJI6X~=ygSCq~6vdKbCb`U9 zwq+;z*)tLf!@@@^s;cYEHQg4J*kQ-GZ1LK6hRuCrr6uyq<;~?+%de4NFTY8CtGuJU zi@ck>hrGAEkNkf5gYv=hVe&`i!{txON8co%AhVDmFc2^33?$Qg2n@vQ8(;hl90Z5L zI3O_mo=ODWHN*|a>r90aCA?}JTOtxP&^zMQxZ)-rKNhE$W}pbg!=72-%%jYs%^^_! zHA&F1I;nwn03z-GO8BviHA(9sU}cgNtg7+RV+RfW=su+5I|kObe>{Ip%=%U~eDAux zJne^tPWpiJ0s&_yM-@H^hkd&LQ`qZXy#i57tv!t7&FS=kyC%?49ZK}flU9(D>1^o9 zw7)Ew{vmt*FUj(f)|w!I&Q5YGTR%+$Pz@yU*(8@xYHV*- zFh|NBtMAI#}u?PTuZTp*Zc;!?@BA2-SJ zX$Y&@@5`s{aRiJ5=xRNcN~z?)qx4I>&T<-zzDlb%EGP_veFl57qwDN82*#RYaz4f3 zO8DgCI>)CT|IhIm$7da%b9~-$-Q)Vl4UR83ZhU;v@x{lN9ydL1c6`Ngi{q<~TUJri zWqH{T%hi9$%P3^3nJx@jBwfM$IeZ#g@_7`i;V?4KQYtV`iVAXoLO0$(7Z^PqWQ6_) zMe)A~jH6gh@JUewmQ-MT#-p%xU9yEmsa--Pj2rpn=*LhrdlGb-aYjZn21heo4KW-y zGH(>9*%wLG4f`m7&#a}zlCYf4Ft{s0$_pv0O_R3{UQSea84Xq6=z2ImdKN@XiiVCw z(ai+$izmdfIa{}QpI8uKIB)N)urG3OLowaL#&NR9i&MALp^rO&|cxY!nhJro-%UB;du$-0bb5<)-r{htF5E zS5KeoY@dC@Zwn))&?kJEVxW5a+&cT9>m3^z=L&a)&sMZmPnf$Z1FGNw)!(GghwgEc zhTw6F2AwQ__qehBX|sOxZ%CZ?a44#&3qLMSS8yGYm?3ky7rl6*3B zshf)#a}vU;HeMI1nh0I!Sd+AR2!Nt+3_Q0_>40`S;9afLO}`m$AaMTd{DWJumQNgT zx*r&c*7DdWOx_kzQRFoyydG4iZt?WJ0(gz!2!({-iMIwiqY|JMSlrCHplU<5m3rA7p1$+;c?I*q)vS%*3ZobBSq*6WP%IlPk+CB^OTZG@ zTq{|L3_`JNpi$u0m&odMF#@-TyyjXP#J)-NaGQ8?U<26dk&{Q_gRGHXw1ow-#y3ea z)(C+;{yx@7oP-o+Y!`iLOCdAp5Mo}gxLTS|b zeal$jX#)1`T#N)16qkX5BC=h?><%Or|al9b=fN1h&^)rR);i-x= zwe{V-@Z@Mw)c84|Ne&NLMTZ&Y*|2RNZ6)#vq2hI{Y;w_;g z(h@obS`}$lLEqbT{^4GK%c4|UEImAHp#AL!snIw@UsD{^%p*spuwc@bfdip1{jlk* z+)jRN2RDV;YL7y>&ckpnj6S&k4sX;98T0s4mqZLeD=W^5IRN1;9+s~F(~fp=V|TSIMyLzY69K%mPX70~4muPO)&*mtSqH!fuw zpa4SV9iD7eKRQi=6e4LP!vT?i+>6cW>UkYri_Ba1wNE%I$Q_D|KN5Oh&TLs<&X0}3 z|3${1!it3-ib6^Ighk9V95fcFq9I7a`H!PwkC zHjw)~{+CK09-#E0$AbHTy}_9tqEZ}e$A(W+AKBe4{IhL#x;P zbkrg~iDgd%55gH&jVZ`Trz}h_{HQ%S;1ddgKaC3GBo{m>HdWj`y| z)YoZ}a_Tin&klZ?$Fowy^4m(mWUi_d+>eP>3diy(c&wo97LGK=g@;Q=W)R1Up1nUw z%LZ$0KN<3*s=Lm~vkOY;*v^P9bP5ktG=B-bgCzG~+ClQ`m$s5x+Fq6qxU?0T5DM9} z5;{giC1H6ylGuUOKw=3V3R<4Rm7{}#K^F6qSNVj{t%?R7Cv0>_G*2_%EC{irZ8cFFwR}DPxU7=xs04brSMoqqMGac zyiGx=9UG>dgx;r$&iHrssTK@ze(OVR$>bu+6??pr*oq>ae7E%>TMn!D{88s<4@Z&3U3E(HJ&FC zFyJI{Y06ekOHM7&S=XJ*j2?m73{Juib`6uc*l%>Pt$7FY=hX`ibQRv^Evb9boeL=B z&D*XHvXAkp%rt~+HF+y%(i{j$nXKpWTXWAZCmcERFrc+C-OZoFw{ikrAL4O^D2W)( z2ET5!qxXG+CSg>eOgE=i$(*F0WBoE>tPfD zXDO8(TN^fUS`n^q$eTEOr8|Vk;^JU8<@t?q(N5GD0v;gsNMbfUZSG*<*;ru*hiSXO z71Jr0*q@5shQJgR-a}8tg#XeBj9(rZmmum35@2Z7Qh)UVz8VIJkce54Bnb;a5_d6T zk>Z9TtVAqE0CaK+rxWEbb_3-`)fmgX0w@Mta0c=Sjgy`%m;S!p75?YBbdE9RaK14H zCzXjSd3Yossv-g$Rs-B4PxPhR6HKOSml}jPLQ$)RFi9BrFP$X(^{LqoQG3V^(O9Wk zbyTWW0UfQjq%d9(-%1043>8n4`qw1OymTo3)d@X7I?1%EANQH~FaBkK!R8xa@KUX+ zkQb{;67@*H;25$WC1P3eA5{|I!sFFa@nbUti^(#x-^f4?g5n2wfD9zHPyA@*-|d*K zgA|1Z+ld%B*unjFqG1!j7N4JVrzXtL+Zc4GV=d!Rp>}wdB3st3`Wvfd8tNo*7NDsP z2=RcaK)8uB&sjsAc-j(dqZ8KJB7rUm0W~JT+bJ(Z&_gl}6W0f^p2kj<84p6y^INa+ zuP=2@Lc5@GS!Pr6GxRWHV;_^Lt81BffG@d4K%}3}DhS#NvnM-UzYU>MCff&aV1J}v zujAk4Rd<8Ott8ksGL=zzmzU$URn%5Wz>0*}P+kL*ZGl>TScpo<$9U%L|7ddtLQPsW z|M_kHbNvj< zBb7mDs{sVQwKb8blPgBxT}T1-i#ul8%M3S^S;Aj#xY*KK8imznYlYCo6N*yk7bMQ0 zC?cVg-Zk{Vh;7WrLE19v0cF_fcTx{he*Gkp7_7fM<}Go4KM4u*#bG5}u+OShwSfJWdfc7OO4D?bGm=$u#`I z>i5#;{l*O1P9y;}d`X{%@7J8`Vg`#oE%1$HlY-X6OvvnEvfhCqjpzPyuUgNEYy}U{ ztM;8H9FHkN0TMFG`n5`wE)F0;wc+g>CUI54F75|IRt*~tM_jxWpyLE4jL1(rXez~VfKl<(T7 zay$T44uQP}5~hb^13g&;jHDTy2n+*d`^UVtui_L>Z-uPgbSOKz{PL!%96d~6z8KBtM3&1rtyd>Fhs z=g+qwfR(`0!NYG#j^cI=q=d)4ML${~3agAI?^~8P=@)MnLLf$=T+*UYj6rt8#ztmVI6g7t@S&yn4hkasT7{Fm-rkoAkla>b!LM1nm#L|R$X;m74m zvasT+TKHlE*Mgpwg#y;mz4Df(_dp@}zh0{Dhdo^sTA+8O8vRSVQqjM7=v}~n%F9hX z$_dP#!q-@AAn6iQks@9dfh5c#(8b;52$*LHh0bWXB(>XaOVey9cGH61tcOjN~T4>tA~HRi$6NEg3bi1nJxsg?-xgytISPjzWq>6g-`j zpKatSnPiWshO0V1G-Ark1w}pn;bOVJ!CYwKp%V1|Wu1ni-eoKRBW&!n1#Km7k9Z@s z)dJ>yD6VzZ54vmZmbuoCS7`d_j(=495~OQd6t)<2t*4hbA8O$kQ9~}OUP6jRZWDA? z+Y>86iy0X*k3zB7YczC=?UGq+a2A_Yf|Rsk*Mk?Wqf)>mY{cvmIF?bmmQ|S=3zCgI zM9U^9rW!W{Q|*wMYH+6N1se@|$V5Ld5PG3R4IknO5{Wn$4jkgl)&SyhKxgAEB)}>s zAjImWlAz{=wX9pC%|?M!xW4o1HfN{(v*tfeCP#jgBY!zltYy*c!Gn!=eXD~!K`aoI z$3Mk~r+#Xn-)_gpe&8`5q|PQ&$A-?6)~yH2?PZ%JecL4Im-7xQGTkK_yhH-FtCe1N zCRF*#SU}Jd38y=Y97`xPmwYpIq|9B z(JSrvh94^-n_&4>NJ+?k=RC<1LcOTF6R`%%eX+7&@e<64TVPr3W}#kq?I8AWk&T*t z8#QzK#e3Ic%$C$=Uzv=~Lx#Bdi^dfQ*5AQ5fXYW!5>pk86fsIDgt1j{VgZL-ZBLCR zOyQ{|L&&3LyLA`2QvBE6r41tijrgO%BtdYC!jj}jCzKP+(nR*`r%zJ+<0cX*>L zI1Z%|{MQG^tsGVRRPd6XaA}{aLabR$!^(=gJbWP1wN4G_c(LnA_FT!ZabOqL`fw-3 zEcJh`VaqP5^=;Pd*Vo0ih7`33Wf=9kQ4%wx^t%rBc?F^@ODYJSZ;!JJ@z-Ta1m zqB-P?#z?QRyE>_Xc0fxH5`45kkT}Wza8ZhzfBE~qOH^<^j2}u1)~_#+CGtvBS99>v z0vS*H6&oYs;*nv2V)&+eKx4c}7#|35df24U-lBMvKDK}oNkND1=T~z-dyY0ELo(xe zU2>)FCyg$Rk(z3nGc=7gS83X5x@#WLJfV3}Gg&iJvsm+u<|oZA&5>GaS~IjDi}_c; zS8N{w-Wx;5Qe)_N^4roh&t;$N0Ra(MxJtsM1E!+dnVmF$2Gu}v#n_;LPeGvR`C>-p zV_s{DNkMj3%L@*7BH_II5?vEV-}`mDbBg?98+0gPF{5==9d+)T?hY>Oyx5>g35bE| zA{<@s=j}e_xAvC*p4lr^Y*e3{TKn)}Z{w)`y8{pX{Jgy8@V#CK_Wk-@`At_2mWANE zby|OTtQ3480T)7gYef>c!^JIPhK=xZr2l@n_-rO#(p*lbV|wv{*c{WdnC=%zx!`G3 zif&}XEQ(%Ct!|)0`-8e&In>T04bv#oV@h>x9TFax?h1a@d8}b3Wqu4zcl?HCyA5sb zx83fz-E~WKyXThXmhMJ$%W%8z_Q36-Tc+D1x5sW-ZrN@*Zcp5D-SXV>y@vpgeCY7W zhmKwO(6Kka4~NV1cJ$vJcgnFmd6Nn zRULF5nC=WN>pamgmtqvtq>FHHeUP^^xO@WR;)aGd8zQt~v~FrW)+*7e(Q4G{(URAm zq&-V}k+!AwHtpTohqNQKW3+E-Kh`eMu8AK4oNAz>wgx(u)j&sXO+RR5N&|QQ@%+u# zN<*j%TjK_d*yn%!7KC+U49`j0FP!QMWUFGu@lH2T6!NLAm6fXmRAfE>105U8rIB0` ztg*c>Sh=R>Bx5%?j-{-Ranj9lY|p6k$SL(FGz_DxjIq+iJ0@h9dIXnrUTqjfv5B$Q zB|84+YUQ1)?_X>z+FWE;w5`aYXnT=!k!#V8qMb$VMZ1f?-7E&t|kVE9a|N6e~3 zn_adh1!H-jwQhuVSEK7a!3FM|q`M7)#sqOG@oY>8mzISEYU6PPYCQ=PtBnecO>KHZ zwGC~#)R0l>!_1q>K?&v?z}RyaPGC2 zcdjWf)Lpo4;l71Y3-2u~Tli(6@*>?u>lW=>6t(EyqOwI_7Ac$PnyfR~XA)&{&m;{x zvhEE5X<3jFcy9PK#3KQ5;j7Ce*T810^_#AEIK)7))r+-7>xwoM{dT8oy%MMZF=T!XmbAQQ zkLn*o!2NnDavCLN5FBv8yMBk`EvlenADoitWLc16(Dkvnz0KkGGcoyJN?@@r`LD1T zW>wS17!QbS@@FC-a zL48Jj<`D3p9y*}dY2dkkoV{*VAVU{KOBf)ZtOEIDxv}5_*y||5+hBKqX5*E>V5t1} zQnPt(mYMC(aWnZ!G*Z)=6oz#m*#fcf`p{kq*qFsREZQcHOvMWKuG1}Fpi6;5Bi&Qn zZo1ua`|TOP!SZDzA?9wOQ{eRyu`m!RX^W+%izH2fSYhexNC~IC z6c2C!F)|j3XsNOSnyXAH4<^UN>t;FlKCE-gq4?t)%qSybB6aZ&IuA|Vf?swz7GT6oImb+(bU>z4}?6bmo$-pU|wN}@O}pj0G7mKdS5t% z>@ODc*86^p7fHVt@B-?s_%D$}kyuCoMVd|=n1I~M!ty(DKx*`_?idQ1m%nIzl+(X=O7<`rA&Pb@ju-@s_#SoZr6xjHm31nXPN0uYWC9KZA?J4rIQP$j0#5jM0S7m!66lE) zAyAm^5TNyx_EJLvf%j%U#VzNBKdxaBWlBu0Zm&c8L(?6>&pS^x7*Zz2+|s2wBs|R9 z5&WX_bi+cM6I+&E+OkaZU$q$aQKiA&ZfEzw)d=Cxe|O-apP!|=c7F(@-P`qD>;54u zI=>N;?F8ksw=|ouRZ&;gBGopepfSORgQw?*eyCOw6KDH=E)K;ox7?Nq+kXh9)ozZq zT~w(Jn(Mta@*c0|}42A9wdGMEgO~KKoVAKZqSxb5#lV z60lFx#@XCArex?sSfMn$9lYbb-$F{*T)Ap{As6&K^8fcH^Qlc)pnd4fZ6{^^la=-- z`VU^}KgBZtkqRGwp6HRS5K#0$&=v2i**sK+B1xS%7jY@#a>TWW8xbiHcOudv z?ngX|$cf00cosp9co9(^Q4vuc@h;*+1S6s$qB){1f)ml*xX|`K6YTv!d}n+UvejaPP^9jHuzeTR=)al*ja~s5BJf$_b&?ARJF+c znbUC*Wi#FelIG6M@J=kjZhNGYzUTQ3ctFAIrG4Bz$KfZ+#wPac)Fw}OS^|MFuXyu- z3_YmMq2QtkmRj4ic55Bdg3`|b!#hB3Aku41!%Z9#wIB~0l77L&3`vGI99oJ6`$-V<_0*2JDg5&jF2jVgKH5&I}}|mktw>Nug;Mw) zsA?mI*xt4CCw&W+`QVa;3e60`98LXB`v%p9(4b;7B-&@X6LL2K*omOOVMx_&*l1@+ z9e916ch_*j%U?rdUx56l+w|@}w3CO}$Mq9+qV9I@g=#JZzm1C6ufB6`%x+C-J#=st zlsvaF(^Vh~v*kFed)+r7BBr~BJmwk1t{-W?kC1s}FQitxz81TH{X-Mf4 zjC-u#iw3;u=jR`~R0Hn+qy;jm-gX<6h}^!MRI>GZzBH)*#?FYDL(v-$Iz!@mu-QYZ zP2)xkiRzKXL+aYuIkZ}o{!iMheBTIPwD8NVQkzV&zccZ{H8Iv_42g-8r`JI4Wu%0( zGEeM)*g!089S+<7bVxl_*#yV_v}rKH_<-{5I>aVa^3vS{`uLCHI5j#1>9`!*3kJ4j zGRF2pCi@35HaZ4mY&aQX1G(Lw#@N{QR0KwtRn09bH9^S|p6^1?ALKrSFwlJ>WbX3^ zx(}G}aKVI!Doc2zMB)!jcsL+07$r-1z*=8_1>#Rico5Qrr&yNofEswew*4n1Jk?;r zV=qg1q@{}fp@csu;UP)9xo=YqX@?1 zV@Cm$R4O>xUPZ%VdI5eURl+b~OS%CJZz8EcAjV^Zg;m1YY)KP>lnn01+6_oVJ-6Tm z00)T;RzBd7{ww|-Csx^Ka;ViwTD7##%k zuDhQ7%B=I1&9+#k}p`Xh{#8PFYY$schI`PIbAWQ4T0@6 z!3OoBkP?xAI)Z~jNy@=deQ}W`12;JTVO8k|P7d!U66@O{Bl+4{}2iO6(?Sm&cDS5c;LtINt}xWEIy*>`B>b?a&iiCKAXf2-JypBGe*eCwT_pQQvn|h z+J^`@5WLSLKtIT5-v@^_-*^MHF!kaQQRB9&-5lq=>#m)5{Jew69@>#%d*zLG-A%Sd zqT*MaZ>T)9_p$dX?=Oc#sbb^DPuky{sS=*v+^}zN{ek;VbE^xw^Yl}_);}>xOo_Hs zoVGWy%Pz*1wsvjj*o%AG^!8) zTzF7N0srBIU(DLwunSi>*DfKVXH0aqw(>@MeGyo`S^j>M#9);D==3WKEwt`n|MLf@#fMhoNA+?>D<#nqwggx=Oz`c4KKShc|`7^-o)}NRfX;=9z0kuV&?W; zYv#<{qtOs`F>%_W&iwc1o-}8^-Fm70;;B|U#o}8Jp1r)oo4H%RtrI@gY&CVeru>sD znhhcyyMjr()`YoK`Y_(Qgv7_IC@#;3x0q=}#O#hca&+ZV8_aWUk=A~S&WR9uYloH* zP_ML_JwxwpO<5NC(=bamt1H=u-@akbt96D33?x0d{zy_{(dwS)?XONZEb%GH+=ufV zRgkyhqsXa3Ux!mT-Bdy0u z=Faw9+J(p(7gLZ*^PZ;LVV{U{Jv3s+i!u7~S82CMe%{#GOX@prA{X19*>GV~%hQAU zhmb`J&%ynYm$ObU%<^=?GT%f_S<}6`>-iDaOI63ZoWnGqy}edK@OmX!s%8Jdd`Hn; zZ_)Ty+mKh=&%f8$>;EJrc)_~v)yFPSMqc*A9H{DQAe^mJBUcKWSL-?CXiR#Ux$1FL0Y^ria*Q^)8CKHS!-4swK#&wT7 zu+eEpTgqjE_mRtwgA+|&&!aw8(dt}>OPoe^*O@va^7_Qp)+4SzUNKrv@%^TcBX=ro zSE*1Oe%q*J+LLn6>vJrod2LQUTr|$cP63|m`gxY(u{jn~<;I&FlMCNb^lHUz?T-qI zqmC}OwtZ!U#=Z)!A_Xo&%Kg=yvaDK9KLy=r(r`IBCGd>$_t+PJ(3jp`J8$DV+)#N1 zae@bG-JRm$hWFlPtURfdeX1$xa`Cxc#a%toZ=X)}8gBz6Bt$t&fSr)Kha^{LYozOH;m7|?tVK?w~;&Zxn7ZPP1d>q(V8yBbFEJTGCcwn z)w+lA(u=N4U%PVqyZuLuY=H7Qs^Xg~*NFGNh;A+HxLL;So_aRXYPFwk*SX|%xI-6- zW(gk(lDR3nc4h|AKLgy?x7C*ON!JWgPF2!YkC}ze;E($28%?_Kj%hSZPHsNYu{sQ*0s9E9a*C=Zsp-#t-wby#ao%a8N}J% zbJsD$XP44yUgW!8eG5NS7Wt(}3)Wa*7j3Ak7UA1{C6ZFt1{>+|Hx`)o{$}$+vos8T zF-O%P^d9{7O82?*8k{~k7w+p>^lbb2IcHPmv^onOY)C#rnJ^w9?~Q-hd;uGhf{b*j zYqQT;NVUpNoA$A*m8taCHyIycaY7q>gEVjfnh3s0rDxD~HNopkQL?1xoYagt=eqZI1O;SluZ-8iKYSyli zWlKGmZwp?j1`l6RedK~eghImfgVq}+05`9l-2BLYG!v5(I&NOjaNAMcTKtelN4K}@ zc~GaIlg1Rhoaj*Y@Rs3y&#gI86&&lzB{;Xt`v!6x6sfQ=0bvE$GwSmv0fX@cGz_&j~h82PLzrA`F+TY`U zdiiDNtJBBH%gJ4x-Dk>y*B=>12Y(^RDh_yg_;~c)8vakeV2OIeo3{cvxifi6avB4# z2G5U=PF48&3#4EC051=Z0|AJyr~mP{{GHAW{Gubn^hXT)E4lgm2k`gM{r#n3^22@% zRy_oR*)_CGn+Mw?Nf Tx#Z-=fG`7tc(0=LYw~{ps}4+l diff --git a/pydantic_schemas/excel_interface.py b/pydantic_schemas/excel_interface.py index 9111f0e..49c98dc 100644 --- a/pydantic_schemas/excel_interface.py +++ b/pydantic_schemas/excel_interface.py @@ -64,6 +64,9 @@ class ExcelInterface: "video": excel_single_sheet_to_pydantic, # one sheet } + def get_metadata_types(self): + return list(self._TYPE_TO_READER.keys()) + @staticmethod def _merge_dicts(base, update): if len(update) == 0: diff --git a/pydantic_schemas/generators/generate_excel_files.py b/pydantic_schemas/generators/generate_excel_files.py new file mode 100644 index 0000000..83fb6f7 --- /dev/null +++ b/pydantic_schemas/generators/generate_excel_files.py @@ -0,0 +1,12 @@ +import os + +from pydantic_schemas.excel_interface import ExcelInterface + +ei = ExcelInterface() + +for metadata_type in ei.get_metadata_types(): + filename = f"excel_sheets/{metadata_type.capitalize()}_metadata.xlsx" + print(f"Writing {metadata_type} outline to {filename}") + if os.path.exists(filename): + os.remove(filename) + ei.write_outline_metadata_to_excel(metadata_type=metadata_type, filename=filename) diff --git a/pydantic_schemas/utils/generate_pydantic_schemas.py b/pydantic_schemas/generators/generate_pydantic_schemas.py similarity index 100% rename from pydantic_schemas/utils/generate_pydantic_schemas.py rename to pydantic_schemas/generators/generate_pydantic_schemas.py From 833ecd511bd3e3e6371f09fb37c0ac38744c36e5 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Fri, 9 Aug 2024 13:32:42 -0400 Subject: [PATCH 39/51] updated excel outlines --- excel_sheets/Document_metadata.xlsx | Bin 0 -> 37488 bytes excel_sheets/Script_metadata.xlsx | Bin 0 -> 38833 bytes excel_sheets/Series_metadata.xlsx | Bin 0 -> 12663 bytes excel_sheets/Survey_metadata.xlsx | Bin 0 -> 54989 bytes excel_sheets/Table_metadata.xlsx | Bin 0 -> 37005 bytes excel_sheets/Timeseries_db_metadata.xlsx | Bin 0 -> 15773 bytes excel_sheets/Timeseries_metadata.xlsx | Bin 0 -> 48577 bytes excel_sheets/Video_metadata.xlsx | Bin 0 -> 16368 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 excel_sheets/Document_metadata.xlsx create mode 100644 excel_sheets/Script_metadata.xlsx create mode 100644 excel_sheets/Series_metadata.xlsx create mode 100644 excel_sheets/Survey_metadata.xlsx create mode 100644 excel_sheets/Table_metadata.xlsx create mode 100644 excel_sheets/Timeseries_db_metadata.xlsx create mode 100644 excel_sheets/Timeseries_metadata.xlsx create mode 100644 excel_sheets/Video_metadata.xlsx diff --git a/excel_sheets/Document_metadata.xlsx b/excel_sheets/Document_metadata.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c48e87435cec3bc0107e9f10a5bdb3e71b2d1b40 GIT binary patch literal 37488 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 A9smFU literal 0 HcmV?d00001 diff --git a/excel_sheets/Series_metadata.xlsx b/excel_sheets/Series_metadata.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..001455c04fe17db15fc7bea089148e128ec2a89e GIT binary patch literal 12663 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 Dgd(Tn literal 0 HcmV?d00001 diff --git a/excel_sheets/Table_metadata.xlsx b/excel_sheets/Table_metadata.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c7972a07889e1061fba5b9b098264b436368e985 GIT binary patch literal 37005 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 z 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 S6LW$*un!LcUCo~O>wf^uzl#C@ literal 0 HcmV?d00001 diff --git a/excel_sheets/Video_metadata.xlsx b/excel_sheets/Video_metadata.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f494837f83b90e2285a3dbe567998cb6cad65638 GIT binary patch literal 16368 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 literal 0 HcmV?d00001 From 4c73e49c981c253e3f092dd62ac6e081a4fc9312 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Fri, 9 Aug 2024 14:19:52 -0400 Subject: [PATCH 40/51] include versioning and automatic type detection --- excel_sheets/Document_metadata.xlsx | Bin 37488 -> 37599 bytes excel_sheets/Script_metadata.xlsx | Bin 38833 -> 39002 bytes excel_sheets/Series_metadata.xlsx | Bin 12663 -> 12780 bytes excel_sheets/Survey_metadata.xlsx | Bin 54989 -> 54839 bytes excel_sheets/Table_metadata.xlsx | Bin 37005 -> 37129 bytes excel_sheets/Timeseries_db_metadata.xlsx | Bin 15773 -> 15836 bytes excel_sheets/Timeseries_metadata.xlsx | Bin 48577 -> 48932 bytes excel_sheets/Video_metadata.xlsx | Bin 16368 -> 16443 bytes pydantic_schemas/excel_interface.py | 39 ++++++++++++++---- .../tests/test_excel_interface.py | 2 +- .../tests/test_pydantic_to_excel.py | 2 +- pydantic_schemas/utils/pydantic_to_excel.py | 23 ++++++++++- 12 files changed, 55 insertions(+), 11 deletions(-) diff --git a/excel_sheets/Document_metadata.xlsx b/excel_sheets/Document_metadata.xlsx index c48e87435cec3bc0107e9f10a5bdb3e71b2d1b40..5cb330d1d3efa38d2ebc69e2afb081e58f37954e 100644 GIT binary patch literal 37599 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 literal 37488 zcmdRXc{G%7|G%-#wjo8ONXj;tG=#(` zF)_x(U~Dsk!5Fjs#%FoH&*yv2bB>vQ=RD{8M>@`NUH5yxUhnsP->=*5q@d770RaI~ zfqHMT^G8~&k3Hu8*1`R^f&1@@znfi zCUwZ{PF@{a`+8!frf4dc&dGS+s?|&!?W5WzIyvw)|>aLErZ&>6x=Bo zi7M5_#oaC63U~%o7DPSu#oS2Ll{ES~T=jP1hxQTA>*(}@Vebx{+KC!=)IU(J4lEf^ z6yHFM+yP3KJ!zb=TbPq<-@eH{Z|sXd^NKKXU9FtmKUBDW^Tgr|SM>HZ0s_+iu7aC? zko$@bj~_JJp!P~8LEIHH}<5c|PZ(7bW1a;-i$gSua-3 zt@ur0nirq>)N}&F%ST3;-T}_@@PwkCg(5b5Ha5`1RQ!;z17~OKntz(-iBpc+1`z>) z9CZN!S+04)eRM*uy8F8S`BQhrK%@&7gZqs(#!||=JxsgTwLqx0}l;DR@rI%>U>@3FXZ z30^)0@<*?@#<*x*HSaoe>ViK+<^3p7Z)sEenS1VqYh)cPcGlc_KS%dzX7&$)+|d&U zl=j8>?NxA8fp+>AkJwzeHFV}v)5mL`;B($B-@YHa5#JV*CR}@bv9NoS=)UzP2XY-d zL!%d)NbtK~`a|@6xBeo`h8tD3e@_lj6#8`vk@qQg-Us>2LhOB^SJ#!Fi~Xe!ieBBb zx9z6I;HR>$=7`_BXxr@_hU>n6`}3Qw@bwL|wlGxb?aw7$AyZyE)mf$9&n7lsJ$QsL z6)Cgn!>D<;ihyH4Xz$nWg6S@r%h%Jk_9-E77EUvcWaHb??9a_YyIV77&K?f8)4@RRG7au&|u@6n5i%;2@ zdIHa-zja2VNAm6lsUdKSjxme2NBz_=FF#gn!=xSAei+`mr*=fz=)>{#`((kQxk;JV z>=f5N6VpvENLqUT`L*;f*_f&Z(N_GuTeK4YEHj4!$K(A8OB;@C9nJ|J3;yQASoi$M zx5cw{1BDrmo7QB=1&++W-3LLJw-{^<`mi~!GVo=B>jjz5-@`LRK)^NV{8-6NTivMT~)s8_w zr_{`w6@0HUREzO!>`uNoc*O5w6QfkOAEU3W;pPz3(b{sR?2+bAWBA8u)>Tm6ENQuK zdqP>(`8{fzQ%}ZKSZuFmCV!dP)g(54<>C&p_A}k?hIeH04l4Lf*e{%Tj2SJf(Wo}P zI5JUI5CYOd(@i17_Z<>?mQ_I~Co9t$KI}9)F<<^Qz(%=U(!|sBp;Bd7zS4fiqI2ko z+Vj2k8J5*s4>kz;*5(czFv`n(P$S-bI@KRVpJ)!>I&9o0R1=fw;7k1Z?HhyGc1<<{I&RdPX6CK_c4i->|`dOrSar@ztH=k<22BUP@|m|3ljzpl9M$zOM~?9|%1 z(`Q|EFMbx>o%%G|>h9t30Ahv{gz)Vl0bAt$!LLj+Y>V%<)5f2?GG#qWz6`pTH=b2O zpS?Kuw&9xD`%N}z_W3uha7k&K%@Q)l+|uNVPCTV*B5RGQ-x+q#j~+PHE(}(B+JuO%}t$eK*rF+S~rtyT)yv+*?8xzq_C=75P?E@bS>;IW?3uFH{r~_D?M^w zEN?fO=>=K-JhOvZ+P_mG5j%XQ1F^MXr|U^nq+jkHbq?0$huM2Mvm?~PC%=>{V8Pju z)t?T(<~a5$)A!+x1F#1M1zpBuwJe{-Hpbk!b3?l1azkyIEqzCh$@{3;IF)Q>FZS6Y z?w4frkCF?|uk4lvpIjFWd??~}_u{-hBxU2}H$~-dKKJWNM%-|uN)~t+;bDifw(9jH zzc#)n?r+g!J_^SESbueKy}sfDVHe#el?H_)HsYoOY|8q#pPKFuk&==B>j3%GpzLy2 zQa~UvLO?+N&jTdPKgc`ys=Iqgu+AU<{c(yU;`)NRZ*5K-ayUM^=0LgivGKL9LiN$q za8H>vAft2l-=vO_u$A$f_Ad{K3@@C2=hLg5N-7q4NA75D@7I`KqIXcQMs+$fl-HQqEVimKtIv zdrPck{m`Md06;q_1?zzWL5<+K9LeFHj53^V_0keMkpBF5mUh$t@GUev@Bo@MSN82=9%L^-O0GZU~+WIm`GaqX?0kIL)uRL%A*I|#eXy6$C zG>>{vjyH4<2Wm{B&%A@FL7*(^{PL{qPsp$0(b7}>*UM`u4Y5W@V=%%Wqyz7D9sp%` zv?FQ{bCd#Ey7XZJ>cXZ{3E?qK3PzXNK~2mIwao!d z!=twjb37QyCJpeR2@_?Di~Em6+_i3l`7RRl`vJB3QZND0#Hp+Nl~>`u~kK@pjCBLbX3b!%2ef4 z^FNE7wb^;Va2I{}%$#sq^qL(or$nclPOyO+0|^8114#pM1BnAS2VkZ*OcPAwO_NOH zOcPCSn!@UC)Fsr#*Cjb6+}Nsq#`wwjz>5)on;lTW9Tcj`{a zjB;{nbTVJP^#V@jZ+L}7+Zzj=t{Q7;vY1=|7L9&D=520W-)h~ur`5MrsnxmF ztTm=pu+_3vt<|knw$;8>uQj+;qV;6!?pE*C!=ip-8`my4$XmB}cwO*wy|5f@z|he! zL@Fgx+84Ti`0ttQ045EIB(33HSkw$zUy|Y~ui~J>W7O=*u_GkxQkTtDcpM#S?DI{# zU`$9n?nJ)yxR6NPaaZY|LQ-)je@QP1t+6<^LApsu%;H3<^oWqK#c@07A42hGH%>ow z-Qxc09$`!PhvRwQBn32tcEugZmz5XV8F$!K)<{S@?&vRBAt6w-P2wg-1l_-sf-@e7Zl*{((>u;di~n6{9f7&eU)y-jU=J1aW<|S zGKDtBS^wHlEuV{`RTP$qsHlzt{vanWhJlv=)o_?yR-zYEcQk!Yv z9=*7O`7&394#Ziw$~X!c#99852^Rucm~W6dB&2I`FjeM?kgI$bwzp!6YcoEo&4{gyPgU7=OH3v{O+~F$Og#Q!{#`naz>#= zZ}0SN;(PU-cA{t2-ZNL60Dr!&TlVN#!oBk1%Fb6!F`JEFY~r`3 zEH+8>%ko=O{;L-MuPD8!7ce_{q*Nyi?Tg4j3@*};*Rcry4%X0M6$0fO2>I?)!S;_e zS`Noz7P~o%=<)6z4~!3>sv4*C5_**#?o&C{Gj@@aGir~SEV+*HVJNT$_h*lW_ALIy zn>%`8YysJz8a%`tQ)jbW(O{$OfX8Y($6hdGO)a+MXcI=C6?;>FwCM2Nq)JAFEe__v z7!4=laedB=_Y=zsxV-Od_NOWg6xcAt8nRc)!{hUQUi3pwmr;Ch(SyJ!I%a|G?}26e zAz3#|V@w-*iz}!4VT24w_9$xzRn4554Dj_0iwp=)?9R;qvnBpH0(;vMfBM#X0fAeI z|FMJFw=xGy#9@Q_$16p;90KWU(%np2&K`diE0G{1njj@w-FH~#VR)7AJKc%b3yTWC z{!HzA^VVzesZFYQEk*PlDjO3?Z6VQmu0_qmr%JN1fEIie7RUh^*RYr|*X!$8nB|s9 z4|ND8dulW^ER0GTS#0t6zzl+ZU+8J;OO`9MEzQUg|cQL^6vasbD|%_7vpBZ6ry_I`#Y4FkE=tnm7NZRB*P zX>DD^QpI3BgkoEXIEkmX5nI}wOr6F$SZDo|^GMFhsuUH-EU_oor0*W8+bYMbqp6P-=LtoA zYTk0enselKbtw&p1T7ySqM}+5OA`N+ZrAx^v2NLJ@cBQlf7}-!ioX9RwZ8Q-iDMq-M14 z9@#&qIVVDwq$|?bMu@K6ul*vZ;Cb-69Z>q2xeN`uC3`bu-bbg(p(MR5=qapwkVSgW z(yD9HQsF^GC(&&dCy7!XLp|MEb)U5AmPuMpu{Gzb?tLnO$|pL=3-cghyoAN}s}lo_ z8g;Q-6EX6M7;aYp%wEWV)9|`Wa2(|JMX-ts2X&_I^BF!wEE?|UK2z6trjAZJ!>s8a zsD#>UL{b6WGa}tLcyL63>MbFzOEZ(IY`bR`*&n;9_*nVrTKpoetBRDucZkR*gxTJl zkpfCkVj1ND6?J|r@d+F_dZ#IkSjdNX@`>GY4BtKpNtD{vt?6)(Z-3FytbPiraSfVi zu|Xm-{!ps;a(tYtMyrroqhqSX&iI3N;=3&NWQuQXwAw4DC8TPnts(vV%{|zoIiIrV zSI3Q6tY^`z$cXDN&4TB{7yU)X&Ik(L5;n8gc1$>?(R}a5EAbCpwOWN`EmSpxALnnj z629lUGgD%7{00rVv|HbMKcnLMbaHJ!T#pr6|J4K6P!euRGJF(NbbL)ye4dK*v-k#A z6?yS}jmP$G9*Mu5zacIDgq=iD{E@w~Uxg(sMAIZr9P;ue3_Y7R#1vm}me^)-v}@C9 zR=REyM94dS?&1ot<)==i?T5b2hvM(&?_Q1QA9sm_>b|{Oz_o(jTgX-TwZc8Ogp@2C zR%5@ovy#)7UAI_XQ~-FoBHKVcyDn}JI}l&0vUy(Uw#ue?VZlbbRIwxRTdb>gBobKD?ICn{3U(=j8R^{^i8xH|KFMKLy*+x%* zAB{Pq{jnA?MZ)}wJxRAJ@wC`JE?OJ!*d@C?{!Evgq>!b>PIGeD zB^@GMp09pP=w-f+yl7Iq)n1vq!ZohjG=!e#%lwFcnJ@iSD7f+92FK=)+9K(???222 zh%818>yd5?Kgd@b7r$&_n<{$R0qjfd<+Pgv}DA#87BDdM$(uhvaf_Zh2$Sc?XYKi~xOj+DSOTaSTr9Aj>ub8tXN z48$D24(~N|fTAg#?0`DP$Meu-JWd)gG1@`8R49`&lsU&e|B#PI6w(UPe8!R zc|D?Clz2)LA1}k``YmXy`XRPs7K5_t==KGU(mIP#4h4wul5}FcjreDoQY(JI# z>{YGDWj4d^p}W9z^o_n4`=s7S`BERw{hBHL%A5jIfNb^>gGA~EaOgv_WGtS&l6sAqSzckx<&K0d#3-mI?zH0ytT?1|)|FWroiYXa^%`Sc)w~0?ZjDo*r31QV5k zMC;IKP|jTP68A5cGIXG?v9v0Gcmp#no5*1jLSq?hRt9j938O=x%mH8(l9J&`2C>-$ zIS5BAkCT8LFdgiq;KRZwd9j=nAfCB|LSP~OAS84bg|h|6p2b8iEUas&hjNw{pwJ~^ z)lFM8S0oa#rI-PLnlk8y>;T#<7V6KYGLS7~J(r;^#ZXhiJkpe~KQC~xMX$4g<&IJc(iG%0ZxCTKu8?It#{=4lf{u4dyYoBNHO; zE{iYhpA?(aoK*Os_apd+#E+9dcK`7Hq44A450f8JKi2&?`h(jB65=mtTg?yHq6srZ zs~onmY%v628bg=$D83r>qs$I@BqnZIW?*ua{+R$Aip1-*Zhr7$S5&We8d=YVMVv$&d z_P+u5!&}$&J%L6ojwXBhA01Xyi(6j1uwznsQg?Fq56lbo7sW69?a+4UQ#y7!r^@Wg zPWjvUpQ6}NP66$JrvMf!xLww)%21|^t$5o({$JS@Z7KF!K+3Di8(+-l~aLDYS*^!vU<*f@s3mX^KPi~ns zo)n(kF}Z1S|K$3~J(Eh4W|M-GYLlve;K!%LMUUZO^pon3R!)lW+qQ6M1eCVKn74CM z+;T^PZxQLi8iTGHgNllGilH%C(dhZHR*kwwjeMRWX9eyZLX+-&8if}I+&)!pY9yXw zYiJ7x7AFnOweEGgEYFv|Nkbz#SVfYKJPdq;k|8yAjS9{qy<8&P;2hW-pXjQ2OQ_s+ zhoc0y*Z3*A&qDhz_<5vD{D6gyyilQv(3iXWimk2_*dM2b(CS+=AE7AE$#@&7FKy)( zmqxyReNv!j@At6#G4HGkZ8sj}tl65D4N-QT>OWXUh$ra z?8sjY>s6sQ`Lgrz7JJ1H=6}@){&L2UY};#FJ~ zzRg0*QLJ~RD>sO@N|pGtsmqssA8*qoA=0QJ8n>_TtEN4!8f<_~U>%ZXv<=;5d8aKc zjglqWnrmLqy6Byhy?xd)gTZP0&N7lwMLJFn5J6xJCijXy5P+2se>nts?L#8y#Mp2WU6=1U{7n4Kiv%GM1J?X!B15gSEbZ zPo?v;4P3t3nr{1e4z6rN=MY&$Sc)N~IB9g=@e}k_0_5!mE#U_$n_mlgTX4r03KlzC zh5u~9yF@QosE-TZblsR>{^ZnH+DpFyV7l+h8qR#cCr%231_xWknuSJcjeyU#@+1-Z zOQ$B$l*kNd<#3N^ND+7#uAIDN8xeT`ZA%oJG_}kvenC~dp7*S?;zvZ*0kl2w_N1wO zZt*Ls)AhX9ofSP1wFl4+M6oGTx7^~_)ST<^_vDJ+nEqPyMX<~)+)s^df0$VeQ)BBm z9Q4B*oN5Wi{A*n<&@kobhVlDSx%GD{I&jL;4&NibWuxNM(<@ zgSY{HHjO96AnXu@QMl$8u!-U*CzgZ0nPGUqB%KJ?MDyfwb&u?oHDHq*B8L?kbcr+V zmprzI=`%}QIsi``v z`|aiC9IH599lo-L-8W>;p%Oa$tH59!C^|DX#(49J`*?EJIuC_WZk_(ft<#xdVJZH2 z{6I|Rpge=nwr*_nAayM-br#)j&!|K!lyNsWHsf!LfcE*`{M!}?z* z0#*lm-pUDP>#m@&_tOK_d10mC94fw^5e}x;2F>R!)OndvE}*f!)P{w+Kr@OH`XYup zxKI~iMsY!7F;w=jD#1nLMic< z!LC=e@2~GjOcLSgXwUL(g_fprR?g)40P5^4i`rFZvUh*WcUJIo22X|Shfg<)>L0Na zsfeI6=NT;2nIN#q(PIbXoWx3374RDuFT3g`aq&j>LkFw|=kZgf1FVnl23Vptp z(=)V}!|Eu&q`L*KY(n5^6Yk0034N}&2vGvLamFwZ${;>4j?+`FN25voRFKcD(cu9J z@5LVCJeFZOz+_qeKo+ziyYA=Dk_kr+BbbBc5b=5Jg^5Kxn+1b1syGA~6cI&R_{L#C zt(h-M>VY2&9eFxaTz%yPT)fu&>KPKg0RbbS6hpt3bb&>#)N&sWzTJ2z-tn!>Yhmt< z9Uq}5Dsq3`ps-N8Dx8}yCmDZg!&>(vPwb0o1EEfpCk4tHg!7rN=@ukq zHmur528+-)KRF8z^p*h7 z9_F$mnRB5A$rGyDiyh!BRQ-4aoTUtMhiA2n1#;-J8{0ca!Ho9|gs1tAb1oEcrcec( zj5F?Y`$ruIIa~XtKJX-xCbo|AVUCS~QQ0K#j*&XWWCmn6nWrO*=&nFRg1}7W=?OLo zoni}s<3Ta8nRO3-PVeu$pC?f&gjrRQ5|7e-y9LGVjJZkt3HnBqvoItIjno`lD4%A3 zco)^kO90zc_OZNkKXR65#F%jIQxW*YOR(vMa@nPo4CXEToGMk>-ib?P0NBzUM;Bl+ zg}X)e#%3B12g;*&_b3pgG1F_5!0IN=hcz29BDAYzoK|-#O*en^kX&i1)v!OVH~*hwi8Tc+F3dMLDQ3^V(bhV+zg1jnL@G%v#;0>9unE z;Jo|G_KU$wWY?BuIT*SNqn?)RR!m$;QOyHp5FTpI>B{4*#D~ktsN*awBdq&Tkk(72 z`L)Q^fs4OqDl3v01r@OHeiUd_HGQ6e!@|MPy6ig5rRjqX{k&%xFvHglT0ouCk%DKS zt6W=3-y_354n7+{6vackdAzS^Uhc$%j#Tk{v_z;@G188=X#>~5D{G*EM#Y#5v(4qV z*axNSc}(+L?BU@V*ked+4F}x@(2!fcv6lA;+=lgGA1v;LD1tt);Z-U2Vc)VLiY8^T zlpFQOzeOzYloHnCaNy-TCp!xBl z&Ny@*Yj6#sa2qdeM#>k1r_jP%?2ZSw*z7fhL0W~-!n-c3I_&tS#n69WFmdq$z#3<{uy!4r5zP=?C`LbjXdw?8u~*@dT!8e%FWQvIc1 z)H{lJMF}EaBZsHTuI{eTiHx{DQjfu5u_-C`mby_lqmt3W4)NZrs>X@+@;~oh;*Kec zuPA&)p4!V93)qVeb7_gE8;Xyu3UB^BusPl*LiN|y*OXhQK1xO5M)I8$71AWui}REO z8rX2IhwX{b8pbFK2Uno^Q}RMAhWiw9PwMcV3;Nh+E7jOp8_-Z|3Sv#M<`v4@-O6+j z>!$DVB$wf?4D1W`=~JxHp%?6ryE~Y3ju)UW-}4lH@O0k`(1?-mG+Tfnkb8@CTq-Q1 zcAk&s?3oX0`DCsgG-4@X85LHIFb%!HO{Xa8)9y*()sLmQkf0y3>pjvmXiYSJh&<=$ z2fZ!1usZbkcS5E6`axd~u;&8&pfg-;T0SvOCel^~B>o=zSNotCCv(qpb@{ri_J=O< zE4m04%1-m3%Q}y20z|pyHuqHGVw*5z^cXQ3*X9ziqk8kIhR#2e<2vM5K=qkQ3-*Y81k-gi}*;16NL?x8rwtIgKv$jV+-8 zx>_0QVBEWoOuoP{_r}a#PCH>Dj;_t=NLj|i$pwAj%VF0vB)&Y9Id%EVop(js)6(7* zTuIA0ZFl0t;g_20pFa;t%iCvn25h{$U8mT1122A)jVZ#v0PgNn9`*( z!HoVA|L)nLw9I!;Uu%l(cPGw1=lpT{~gvrK$A1STgN_OuUyzR`yQDe6va} zS@L1;nucWC4@^RdLBl?!i()^)m!bLZH=3V6z3qh6`BS}V2@g*jq}_dJFMi_qOO5@{ z3*M*Q|86hx<(OEbzFvp*qnPE(`JJI6ldbMc$gdq8*ok%u6gmfG#byN^t|`*eICsQhw`i#C5bFM_ zZ)m+Zk!%t9LGRcF-6d@f1DJN-S8f_u4nEeeldq*Iy`$*0hWCks$2ApB9BI=Oe*WxC zTGn^F3nz|FXbQSNOK{D4GFH?EiqSn*7AA5$V*_^!lK;$o=aa6STdauhJwmI|#G|Oj z>zys+Yj<;}sTX(%G4rYe=ttg3=%v`2>L2g7$zPQ{{@TUrdv@;e?_;0BhI~E!@c7te z7F%tQsDyP{aZ%QLBrh(?(he({c-S2h5s(!ioI|lS(Lb7zqt?3mUFu>{q7d42$&J=^?u!Z`-*jvu6lM1C3s7z!!U{s))+L6 zTN`lJP*Olp2!1GmA@z_KpWp893o{yOK(!6Uz`#2vNfbjsH#H;#HzXuRU7cKi2XbC$ zuaZqjL;@w~O5Pw2nX6pvhB>xk?VOOuLOdiV;e7=yASiapz8jHUoDB!Wh8!RsRd3xi zn)Plqkr zumNmbI}`9Jk+&@rNm`~k0Yls^KA~C|>UAngxUiolm!YZE6qQvt{cq!@hAt}E+#iS- zqEvB~i7b>!H0XQBW(|il?^V^THs`GaMVGkAW%aEy4@GsWS9E3@f`QJ;F~3N`>814YI#c{~=SNmJO)gU98#DTxpG!s5!p zSkL6{5Q!R;W&}5J?^>*0pWycug8`9O>W3!S-MEX|yfs_#Zp+WYzBX75xF9y^V5|8j?^CbjY3eT|Ql+++qa|?@-*nij)7ZlkRSJ zXF6(2m13uqzw!8rHr`U6PQg5B^YvS27OJn@+i<|Fp`J1S`~ZuD+oFS0sd?&Tzd3Ek zj;Bp&o7}CBYiPP#wrLnY&reIcbJ~9EiIWo=X72fS(>7Ra;V=DT zkhU?Zy5Pm82^~&p1DMp68K`=2m90W)(RgzvN$XHfu<9^?9;DvLnG>PRlr|x-e?CkZ zt!HFrcl6xOQd-JSpoaF5W2@>M9PH;W=Z9`q>#UJiePUm#fmsdEuReYgpWKCVnoX)VbeO>n5&aPx}ID(lOyo$LQq zU=D?D2Dk*yn(r%KWtap!68Tr0Y%|#{%uUB_sm7ysf>v{+$7kzTpS+3Hx8in3(tYPQ zhc|nx@@q2TUz;2Rwg-P%-JvIB=oRocl2v>6h={zLr^AQ2R~)Uy-c%9Zma|GM)M&l+ zUoGXW>1R`AnWZQB3leo_Xmf}&pN^VX-d!~HkPknxZ`BPR$3XO)GrnrBvPcd*Yy2A@ z-)*(2WoJ#)@)?`o7lk8w7`2-Ei+jVpW8cEEkD<0Ru>MF&6_H7ASt7vLbWhIW zls|K{EQm8h@}Fa(=Z6-Ds<358+1xj;sV!v-x!m{stB|n>rSC{6qP#f++D8iJzWHHm zh{P2c0+42$Ezof8OETQoJLbR*bw%I-)*=Ir46o(PFVGmH?1>3B3Ijvpx$oA@0p>C| zvy<&`3VQ+#iKZ*DBRDg(GR`k3gCp?Imxkg4o7_UUq;;=D|0Cst{>n>3_x=}Yoy^~) zb(T*KZ2+2%{1gvCvdZ7M9zF!l$=>M#-_cI~;FY!h8v~flrLD8K#3J?PV*r0hrocIp5edbF|;ivbVm zY#8Ohtvn zc{~iMh)Y4Agc^fV6;iWPFQ#HsO;Qo5QK^j7b*Zq_qp2;a>Z!%4o~guCxzvnQhg3{z z@`eE!4WUVI`Mc<8eUP3!TpR9$Tuy14uF}(mRCZL>02N?;z|WUN2m&>0YQ$=UYu48Y z)=1Q>s{up^M2JQRMMy@hjS!CziI9p|6CoBM9I?Jev~drY;HM#}(WuV&9!fzTW~eXa zA8R57gQUbp_G`C{4Rrv=hSq--91$7WIkI`gU_@#}dqjBzG_qzybwqkZcSLMNb7aei z@rdxqj*(3x`$x73RdI=TmbZ#f1FmPmc4xwNXTeJFov7i4^Hs?@$sQ&K(hktfTe~ww zd9e2%ta1A#cMdP>OJnv*W4J$&xwlXp)9C&W)E>gmLr$Da+e$BO#SP5pFhnmoIv_Khm1k#L&4UBEUO!@X$ zErnpb-jzMteGRvR#*nz0opC&@H=~U(%qX%Z!ZWOCwK(14_HfX|L_eZM2{`zL%P?2B zF#f79)@)GadRS;x#Dyvx%iPv0OraM$frnA9LYK}kh+$!Y3uD+a#+1oL1IS{F3;TKn z=j=o!Lh~9eA7`oznW7f?8kP_;03A&B%q1uG_3PD@)=__u)2+V-W&{4&sq|+He(Dt$ z5IErVA3K%(e|IWdJ(ZJYFP@rMd)M5>{@p7!IR=k;q^b2`$7gfz{7pN;fcfqhNR!3; z)MaOxLI?9`Cd)Fx)bHe2GBCRcvE*GbNJhGVLUG-|ias{Eyibcp=`Z$(N(GYqDyF3X zVSox&cj@^-c;5T-=*PJFHeBS`50M)vuz@RtNaA8x9R;Mo;CE<7(2DO{h#rP5B8&C0Rz@e9r5&?U7x zJzWErKQ~j#X5LWX^s81mlFy;vGw^x(ISEzl#qH*p0);N?@y#I$wSu@rvIVVRU6DF3v_{8*U9ls^IL008x7Ycx?T=0d=wA^62k<@lyXShnZ!#N5ZF2wHU%{X zU;>o$r@GdU?+lTsU5|?+AEf0ox&+5n=S3qW&EoP7qVtJe65~7O#Us}{C;U=~JGi&J z=37KK6a=6QnVLJ~mvrqPKM*2VD~5~rvkc2ebeWBV<^>`}&El0UZS#w}^u~?n*G7uf z$Gcd{ZO!Q#PS~j~o2_th8s8PNzE%o%!|z~KKDJ9~Tss6%3oyH(d@v=y zrAu~Pb6zr1s{V${!LoczSE7jed!vH3wx+QoYMgLo`cZk~5aC*J=bNRLhWXiDd&Uhy z*40YjZjvnl`LHgvaou^LNO7~9d6qi)8C|=__lFcTitVwv8nlnALMu4;C|m4^lyh9^ zLCmTxa5doIUw+b`LlYlBlO9;|Z-VxS5yw_d0eAO(_&mEM zJa~;sv7P`A%+W@N8~2FcKULIg1QJ9EPtQWYnIN7>ukAMuJpCo_e(fGXZ?98*=LGpN z50Ee5PW;7)ok51rvj4W-O^s}zmNVHpkPuw<;bVmdD-0p1Oly8-=ShjE+3HKv3t=6loGWmI2V&q&zcRyC@^t?K z)dQQsKq-u8RXvCHRE>Hqcw(QoQ>KbIHLT!Hf5O6HG^HLoK%I5)3d3R18|TsyFciAl z(GV=fn#2_YGUO0!waDdl&Ww;{HpLh7A-g*xrDKl0B;j1o2#97?nt+YieQ>b$#3JyY zSeQ`ecg{~jK%ns2f5gHDe-SnNDPXoF4P8_XdH87C!&ak8LF`9LABBc}x>qC6r@Y8$ zm+>8$jrFvLiis%QF<;xQvoVM61R>7~Ia)6bJ;%l1!TQ#Q3_@T94q6vEUR#VWEu+x@ z9fTlGFyn_0VD1CXOdEkh;i{%qAaSXUZRCIx+TSm>KGvzU$^j0_xlqlRFNh% z2ZPwsGD=3HJBniH;n$-U9ByIo%C+{@?D-)t`kTK&@ys&wK*@qz1+ENB^1(#2!go|5 zZ`Ur3&gXQ~MyAHxp|cCqOH%_MNHl_=_rmPt*ivbhbueBDawTG^ojbetF=)XYsLO!X zH%#};xTT=$n9F4u7+dICm|=L;fZ+**W^W03h|q&5>3c=5jUEgMWL!2VL-u5MOAJydiWh{ehw@QZOF0x#Eh01EB4RfEQ!MzY$>T$ zH^emqNH4aG)U@W*GO+mSqn-J6nOozk%0&)1zQ<-PC47GfHn6fK5%gO)GV2ptYmKone0Fh6NY9e8;6i zq-<6`q0BSp+$F6KG~4qe{k+l1g^8{=@Fbj&_s_aFpXv-{y6; zWh8g&UiXmWP`)mf1w{xk-hp%8jJoSI$ZaD+4nU3JoseH42l>aR9T6k`zk^RX3#N0BOTU5fp;5~8i@$^M z@m!2A^*b1!Mtp#T{SL-o^r)^t#696aC7~_o?MlV{2YZVP&ea4)o)?+Jk?Py7y0HvS!; zY+C#~K>5GrFV|}B=YaUbnuI0%bEE%iZxX#E(*k3%uevEh%Z24YN@cl(Oyk>iG7WK8gW z>;gRT2Y9@{xSNLm;EVy~HAG)cFCplJP^sC3sVW@3aTd*H)|`R=?~keMLXW7#a4~w7 z|9`~jhJVegPb*-yaxr>AwSeHm+0;*GSo5Z6!V`1fLf_*Z>02KSuzGLwgbb9`+scFk zw>j+ye zmaVkS_AmgOUj0y)>Esey?bxw-ii*v)lrXF^Bn4MFz0M8@u8eVc7WFGx;&+Dq>(3ncEhFIf_66B%WSR>Q1nf>&q z5q%BxB_9r9po&CesrNG5>7(qk``gC~u;4ZyS}}0txf%wszdoJQ03t}zAhKsD@l}OiXjFw4q?7wqKD-%@eG`>} zU_{dv5OURy6wcgsoJUJCP7s0hxQ_oyOkSuWbsVmW`V>RtBZTjmub*VHGtSdLo596N6%ey6QJ~O)8!U5_8 z7RC1SYwyqZo0bZf)n?g%qr+y3Vyhk32OQ-N0Fj@59dm-;Z`!YTdkU|78;F1kdK=*`x`85zc+{)gkL&$aQ_ivv)k54ad zPN_WUNoyZlib+W^uD^>>H>+PH5RVRWG)P5JjHJ*(AF40StTVj>c-IO!8(OOJPKfJ+CEeDk3R=^dB65uQ~p6&b{~CbME(Z?)-kw^Lu{xInQ%` z8+rPW!x!v;JYRU41a~P^S5X1iaPMBn1p?5vsAzM2~GkR4#(ZP>v)F^1tpUFN4wMV;ZHy| zc%14%dLrpC(;+@lRw--q1@49_DpbcG#+`bj-yer{lJ4{|(aAdAK*E}-W*|HT?nHg7 zNaId`^EeqB&3I4KmJ$jg$Q-Ml?1WQfc02a-`Po74wNqTK0-C4G@QCLo`xKQwu-t#> z$b4|>;^Z|S@N*M`)ZDUH-7pS?cUnQzpMK6W?E)#qYoiI5Pv`Py5=R1gGI(2?oL+d$ z_d7Lr2zQ5`wL5!t(ukxipg{B|5$%*R@aYe%OvtaP+HtL+yrywXhLU0&mb@9iSjfyO zshL$$y{VskzaZ-8Yl^>>$!WGwEA-YOG0PQ@Y9;0&>UIBhAZZRYXoY?en5Gu2K1}pH z&P-C#qegprQ5qw z=;w;dg^W12kp`_H;y;nHoui_^be>Q%iITE|WyNK8c#pb>d=p8j9EPtaKQ}-j2bUEW z#1CcO;dql>p;8GGchp`w{4>t9i8skR_(+LPByGeT+)wGWe+0Fw>B30RD4iTZUL~+v zc;S&5(+Z2R-iZ!GuDW6R(6mc)-W{=;0S%w;k9;BsUq;Z&F&b4*!+ihV*IRAB50@_J zB|fJN$$0YdeaC2F+Ufap#h}{yS=eydNwmUKhp-U*$DmV7{fX^M90Q5W)lx)3l>btn z6bY-cZfZ@I$qnw-fcF%CYDSMp%-kGOzZ=}#n)=jRNX2^1rF1dMRqir$$a*N9!;&EJ zSl=c`Kb&wbM8v!naq&yb1U#4$94z?!p*9i0!jqIW5tc4iQ1l8DZpyCaCZJKS*1%QXR$Z=R{goh*?r$-nbAtwzx4aGomcR$g zB_;BXu{H`Ixpcsw?}7=?p-GJ*30+%ltLxS0Vh>1N=YA&_2m|ZziAW(u&+P*hMR5)0 z=~5!Kk+#r2$jm>B?Sp5gUVRu(C(Eb?T0J#$z=d2V2 zmgyv?b_p*AZC2RGbh5awR4)Tm2!fG0|tq{ z&GL;-{dUSvfHEIR*KEIB2PtKQwk$y@sdK3hDl@tG$7@*%w&#Uez^ci2_T<^BfO1R- zJKqxM=Tl0$n5mv)zh9&x;y3lfTXtG{R!Q;aRg&`jqxQw6V@bJ226&n8$@ymS!Ko#h z*+Vt?i$r&~^3dVw-;13Ed>X%Mv*d|!?|Kc`#Brs+z`OtGLfr+Y+aLgFqsJQVtvC~c z^Y?MX;e0k{1X2dEgYuj)=%!BQ_Vela4#;KCCNdMnu2>Jp?3nAGo8oP3R`z4&cz@dk z+Kp$@547IAJ>&dP^-OoWMH9{|{6mash3F7jCJ)=Cvs!m}W!y(qHOV6;{EfMu5Ds-z z_>$zk_@+mk-a4`2zJ>7@a@M$|gF*F;{Fa%Ak^5gi&X^6rEE6PJ_&GkUl8QYilIQu* z%w;HHNh|Za<1ek&UKrS_E{sou&58U)v9b?q{Bs0;F#XVhkjYj8(I0uDld@lPzidY% zTU>Ywu1;o4SD@godLpJryB0+bgf;S=ae$1z^#D_3StHo4OuwGHY<3|}c&Y35*ed@K zVY^mBBuv1J=xil=xkDpdPb>U9ZzjOzBm8Giy?&TnhVYe48gju+cM0+dl8)`7HOwZqBg_ z4l7~rSq?3D*Bp0fPYet>eKi{!tXlPCVF>$1aPF9<{-FLd9{lAZ z1wI6)OsrY*#ffDVH4QhP%4Ztg31UHW1KA4Bihmyl4k!o5c=nvrGBcf3r|8W{;~!Pt zXBSC-3!9%4y!5cftLQytR3(lqlflGIt_<#5yy;qrx=IjAt~f1-7V#4L`h_Nb@L`j$ zagUUi*TB@&4ZC@qC0ySU$R$E$nW0U(e2`;~Y+X`-rKr9MkXr$La#d0^qTCoZWgEYi zf&Mx*D);AX%R+Z5#7kXN`$P8{Y_}CKo60st_&DbDKQuz?tCAlfDjj|p(z zXv$REwm&KI(A6}FUMW9GB%Jo0$%z1osDo!T-$E~75i85SypC)(jz!0k5yhciUd`$$ z)uBUSbpH610$F**z48x(quTrqpro$z7N^z3%+GjC z*V;#O1u7jsAXvrTAx7dK@vjb-xfn9`fR(9G@#Yz0h2;^LZbm4m3D*?XFn5CHEG|)n z`FX!~^2$gp?X|Cr;nNnkaZedTY>S(RCcjw7@AKo-mn$W>sbKR2n;)*)fh8jg%t!=? zi4WkT+mjWj_F+RAwwN2I(eJ4A14=)(f01;{1Aqt49qEt52gsen<2MY>s1AxY{V`8} zu8saQ&$g6)jRaBtt#-%xWA>6iaLN>evH(El@hul`6Cy!lbRa!H3iQTY#B7~U?geP5 zIpXpceShJNu&r6pZ2@}+sv^>R2|a=c79gM~3P=%wqaXokVgdmo zMG!&}kP=!#GeQU*LXsQLdEa~A^IPk?F5&#vde{8}#kJhCXXcri=kuAp_dM2SN9g$u z9XiB(=u05W4dZr;i_fY5>Zbm1QGf3EyIKeN2LvnL3J6dL_w}(rS+KR7WoMj1TnVdt z^;rBZ$9cWSxp0(1=!05$--KQK5UVV( zJTAaSl`Em+k}HKd-vY#sAm8{7-+Q3MuK8`Iu43`Kg0Xuj>V+ZbqxNMP|R^}-N$`hL|ew*C6PXE0-3<##rg4TaCVUn@o>k3u%uEU28asQ_Y zuKq!8zioJ)ZefKy%brN-{2ql{KXUa=nIM;JTG~tc83E~u>wVF3N?u!d&#s}P&2H`6 zF?&C*C#*Wu-&1UkVE=yG;b?JH`YD9v=K0(s=W9%)T-ABP*y|L8E@4!DHJNS5gP0jy z>s->_zBqA>z zFwctTzt;IP1MRz-H7^bI)0Y{BlB;?((SBpz$^7mc4+tkb==XN&=0yJPo>vYzQe2FO z4&}%mI>bwLPq>d_h=-f6+h2bw{dUmOP5av^U&+)0eGHJ+8KzH`p_5tol{L zk|p2)w_S=)#GUj6Fv3KgtLw$lrKc93vvuiDFA{q$n9MI|MyxF>++Ik0n6Vn}GNL#( z1gle=n6gzq!EJE%SP68ciM7bwsph8VA*5!^S6&|Ec>EJ)vv9tyA%`h@VMVE-pVedN z>j|Dd1wtlwTwuQQy;bC4|1DX1V)vG%`t$U*r`fjL2 zZ87CIzq2BC65t;H60GIThtpSEzBGBc1Fw6x_w`@A7ymUTgW>a~&B6hGX62(g+OO?; z!lF07EafG4j)tiE3Qu7O;hMEw{Z9f!>8CEka$8=n`yk#Luv8a%_TKriIa;1x{659T zYG5m75|{0f!%Mll*RIhVY0O3~k`BVz;dIh@0HjN-anS2D2984- zU;50gqoD@1kEdFm_B*5vq2z0W72*S9K>uVb`(yfeU_rH4zF zVA-f=d%+9Xypm_b7KS|m@Y5^=qLlruBw0Tl-XLvJcf)AZ=4N`4v@#06!-})ibq8F3 zQQ?R}VRMs%q+sYxyO>QY6F;fpcTH8thck>%T*&J<^BK#nS##;AGB1$%b>d4eYf-wl zEJ`m561S_{%DAU^W9k~2J0?>eZk76H>Dd<8T^dc;<}wzZ$qAkd?(-os6&d$!UW1Pp zX4>%|&J>zdeXn-9btwFK6X8RSt{5**cLp1yL1N|!8J>4qu@)D3$)}1&$vFe(Rx%V% z?3$)SJgcNiLS(uZRD_$2p(3G49{swJWQLs_HCEAd5ivS)dEfa8X&6sW9sXOGCnS zue|q3s``J3E3+~X>c#bEBg0uWUbMlj%j2UCQ~E|VT1vO$o3y|RF{mPZ{kmR3f1QR@ zjC=FI6Z;8cKl?Ala;4E>RRuX$+o0}__N&lm@;|ilntqWy^m7SIyCWwOpjkK0NC~8w z#Z?)c__X(=bLHe0mW4a^(kxw92i!Cs^W++e_$}IOm_8q#h1Sb`(zVAfLJLClPos8p zo#(5&*;I_`g3Nx_W;E8wXqv89ehaV^?_$?+*L^Bh3(6N$BW^l|VWo=B+GHAi5;kl+ z;`{maxVC2Q%k+BIfh%eL$eqR3aN!xP5&HU=m$tt1Kl=KJ^Uaql3h}xx#M&ROzL8um zNPLMx8YM+UIlpv&-e#@J=j&5;;^xoDmf(aL=|EU7>G%4KEM?5;yI!@Rp7C1Yt10oSq~PqxPc0Y9D0V~QJIa$< z0b|+|N1Wz(PaD0BZH{^T_#SuZ?Z(egs~zbao$4q;oJ98C(Ae8e^b~va_tKk1cTRBw z&6uJAPZ?d4?blVEA$+$#6jy#|8&zVDxM#PuhnrhSu;QP8{ke-gK;y0qBnz|=>~DQKRPcehv9RZKkbWLy^5prYTGe0b9h=Lb zF&CrgwPD3keT0nOb{V&W)XvJd9|GT~W&zqnByHT?BJ9}@>yd*4D`CVT-P0id(e}Gl znTkuBw?>xmeh8;u;&t7t zw{auEl&O)8oe}gvxi`Qmbpl90dJRw-_a>nb%m%mr^uwJl?zKsXokI)vlT0ZAQudPb zIN`&)F29{cWNnQ8n7DW&5Ix;SIHE1y2sSD0o<^xG)H@3GjG$qC>(xVcDx%uNKDtz&^40DrmjRkRckxA9OTGEa*rO zZxCCMNDxzyU=U{zVD-={*DCX>&?@~Z-zxj6=qlYR&noMxa1b}0SB~}Uoj1XSPZ4_0 z_s(R%QSO;554vk3d_bk;XtD#^DthBh(=^f=t~<2_?MPe|ChGwOndYM`Zv}(r; z%x`#6mO8K=O_fLw2a>O9xr?gA{vG&9+M4-080n!p@!A+8mfQvdLX2UQ<*f+V&#ZTS z_gs_u!nf-B!kG#Wpl4xVjBtv#PznwRX^a=H|a6jyqC(U5q)y z^_1ut<1V>y|DflHGn?Yxrax?Ok&F8aJ&S>98aI}n!QhfL_jmf^a&>a7kF_NWFMrlb z=|7r$B@ZQlxF57Oue4L?0JITKjoeGqck@YdT)RB1)IpB(=gq7oR3^{2>cZ ze1?Qn2McTb)BNLqu$;H{yUfQIYG{0am8>dX{c^>Vc(;sq>Z$H7KY*w?)gy-vc59)b z0hLiJ-hOhR3)f3}fjEmPu21yhaaLSh3H00s=4o7S>5my$T61O4 z^BY)5*j;E=V1049cvLet?v{yOp|lz`pm{v#wc`w2c{K^Xx&Y0-7o?P2^Kz|F>_Nd&{IjGTgf+!DX^Me}A zt6O;O?17BlMwA?ln$cQ%#KK4S{G3!T%Ra)KzEtkVg=Xc>t0L_xXMa7Kua=duX1+?7 za!&RvvpL<9CYbSs_=#sPX6-70b zQc847jvYGS)fKY21Gz8HNm{e0(!FkyILmUHF1txGfJK)sPeOv3<#_x{3CW8r%JDh* z5^^jjJ5W4$KCn}hI=#rYGSD2&Y?@63^ z$b36KK|;ENIVe6p|HL26UUbbTS;H<@Br6ZL5!l)PdoKHb(`evy;16C!532)5xD`BK zPw7ArPEBh)0$JwUp?e1_3QnX?-g^htL#a7E(iuvA7 zvZNc%vXD}MZ>9nenoW)%x>_n?X5W?!PfX%>R<4iwZsFcEa&~Xx2>nP{6>QUUV8eD) zuZYBu>JO!8?R_I6OSE+x5&9qN#$(Zl#;VXYH}J37Y#a%6cZ?i_B)u+=(bXTGuf>ff zVY>aPJYnUQLu0)*ytY;ct)+`x>__F1IseXWn13=fMIJqLX!XJW$ZeE=cgRxE{=xmb zpBbm1GwVmnMu))O5bZT@i4$BBCr%um$Y~a+aj$7L3asC%o2(u@?j5ukQI$Y6HC*_d zSFoGBu~fG)2Zfl<7X#u z6euKUT}rN8KW0Loz8yaqdn5Md^HSdpH&Dy+B4Hp@0qS?X4rGfPbI%@Z2boM`oeS1x zeof~jx&AC2tb^r=17Tntzz`0xocA^ppPD;4IruX&w6X!w5wz7cS?UoQ69fK$ZrGdL z>Jnda-Xwp^15iFi@2&9vKu;yjqEFs**09YSL*Y{=MD<_}F%Gc}69PE@uRn>f$en=Z zCmS1RBsec7N_YDX2q)-_uf=8K-SJM_b3Zo;!?Or*v=$lYo)ZhitP_R+&OfJ(b-I>T zNn_o+V^!UxX;>E;7#e0Wpy+AXYq}kouTgJ-@6XO1$Oc*Lv zu`w@_9R4#qNyQ(4U(tu8fzm+f?Hy4ayjb~F{nf*(>^odL%sWC6snPN9b56(ejziOi zJ4CQ5*kCLhR+9Pqr~J+bFM7oA##5dgmU(ki>(fmGV5jLlK53H)gNX~`Qg}(Lw2}^D z2UCX%)(9(wb;W9}vaHfYJc@n{H*}KnPeY}l(iPK^B&;#Q0Z1_f*od98!Z2-aK!!S#OT!MI9>WUVZp2Q zz5Vs~pCZCf?yzO-DFGu=@gcRgW4LQwby|H}YnJ4|iCAGL7vVG-Z0uo3&o2sQ8dzEN z6n45T>_mC&f{-gb$a}iR6GpibR_R;moN4YINgXB~?H$2bUM#~Z&kkS2 z1Gw>oM4n`xl(Pht^ZVDa5z(x4Pp z4C{zhS`}ZVk9Z7+MBmdj(m$_nsBfGrl_#N?mf2C#aSE%p%DBV6Bf3Ku!Az&7@JCPq z)qD3><_9G99&siD!KCH@7~GSju!x$BIVmc-vZl&>+rTP~`HF$_S*|&IGwbi}9y;KSt)k!S zRUYidq}=VRQMV5mmwJSEn_mtXmr*k|OOFm1ms?*-MtKhym-t6kHL?N+j7#1;FRRlJ z>BS6ex!5A(&!@5O#>YwUvNK3E+oiF|#2Z?(7RQ@fvk5nwpA|e!A9s!Y*KL<$M)o3{ zU@SJ)D!TX|tdjXZSfypjgNBwB5S$IXXHUKNL23a05vuwh_}cSezIJy($m$Q|+8sEV z{#(oR>R`#V;_N$yf8^|OaBsyH96T_?x42Xe9V8`wFVg{U9Gw$~`OPD0tHu>35i#K} z{fEW|TSXih6&3|K)EdhN(}EA@Qp?+3^V}s!B}G5#|hoWXXwnuuGImr zPvg;}4Q*Ap!FEUT9%NV%lIu%lD6x?r9l;TrWMm}FaZ*=z4}Q~W0#PszhQkr$Na8w{ z>`n1)*uhP+ZITgx=W8;~QQYj>hYnT7)BR7+qEvqKwIcM5;4!-_nJL86bd6AzzUMd3 zfUeqpk(B0T=cT&lb+}NFYJaB$#iI@$8)NO&NH`&_- z022$roS7z2RHNwn?4_lpZUCT8oU*cmU+W@~CiN-DV~GGDd3^^Gy0$#mjhW92BCY2k zCe8gP8i;$yT=H4U+8ByNnB5{pV>dDL03dPIYGqw^Z*~{cy-s!n5jP22lx@OHJ78jB zFOsx~c8#Ezgsd$=H#Q*Kb7XY8B4sNH*r>m=umJ(Wch(66GO4aGFBY>^2XdxFkr25Q zz1mdG*auRn2(dso_{&!-%^B<%x2!YeqcbJIne3H03>gNKx{xHQ+oEH42Oz|~sV-pe z0MrV+H@yfAiQ3ws6b@pLyp#H3+uOsOoLiKgb^Px7FlBpA5gZ%6o1QmJ*_#`ieg;i) zj@H^;#^tT9?egI=?GP=y?6}}E6FW#{W794Vj%CQE%-s%E>EsggV1oz8KjdAeVdq~t zaVsWeLmVekmL$>pg(1a3=w&?+*g6#@kcx1h-tOXsY=K*_LPn_@W@XN|ViGsBhNQ~c z?VMd=9&OO$m7c`oNTmtEei znA8nsoYIh>o%3zI=E%nz>^Q9%?gi#UHBB&-@CI5ceaK*B2M&otL42362LdKBxKInHh%M?ebjpS|XD-7=|+KtSWME z>megkH|TJu$};V!!d)AhBcE(=;JnMW>?U3G=$p@<<)_+jDc6HYnh`C~1d2ZP&wB(W zW9Bj;br21sdQCuAYY%VjeaYXf=pq*t6c_!5+~#R)tj(s@e<8;Y`MhNe4K7m5amoee z@^H4$tCVAZ3NtLO1Uui{P>^zYX6d+;M42R-BB>se*)hb zLz4h_zX@{K8hLJ+Fb{!PHSg?s$mt5YPS-aP&z7Mo^xGp7HiU3&Wr~%#E_$tzi5sFg zh9O%!#Y(4J4Q-M4Hw18EL&J9X%EsnM=J-c0C#m7|Iss13O&h-0fkU!HL=g$yFx=Rd z2B%SaxSqhH;fM4G_34S!*vOGgB1^$Gqj_sK5$5baso!8Z?u3BF?6q5~=7JNd2usH( zq8z`0+4*?83a--(RBV4I-ocvrdi<3?xu^%jYnL+%3?c^187yw5$FkbcKYV=M0rKi5 zQkC^Fk>HJ;wXeu-%3cVu33L+$oIe-#slD66Z#gJ9JDWH@zA$I0QTMrixVzhLIV>2K zO+=5c%%y77!RzO{E&P`wgU7Oo6XV;PJ#}@B4O>gy_;fVBFmnknwFCy=Kcc7wAQM*V z`Ba2nV)~jq5Dvc?Rl0=0X?nBY)ajLkAYc6Re7-*k;!OitJGRJXV=g*3!&g@livu;z zD%vlajG9px*}q}BvnTP(lW58&B+q}D97_xUw`XQQ>s$Aba-vD5o?_Ix$>>|4@JP|5 zDQYOY26CTp3|#~4uWk6v*p3^Vwqt(r8v-jED9F*DGLZk1fL6y_RtT)er%*Y4f^reN z1;#JhDQq25T?AJBT!N?(369z#5TfS%9sk{l_RtyO?Fl$T~l9O3QDCx3l2<*wn?CdxhzSO~bw@XMcb3L||94D0v&g zY1CcaRakkld2m@J?6~wRo8zYDH>_V|Bs{&MY-%YlcgpnAJ2|zYg6fRakHza5N2$$_ zFRE&e9DU0g;?7=-?eC98-$%`_ZB7*Fb%nDgwX8>1BddwYOJ}K_lZQMu0vXcM1#dHw zpW3i?KECo-C*({~VVS(1n-NR1s*;68rct#>apr1sWhYa+)a-plKvtsD$B?P6v4(kf z(T-wj6dm+!Knp$Zv(|2%!c{qayFf__kI=M#o2G| zjgl@dO<_u$W5a?1R;~xNJ!Y|O-)qrFRHC52)^vz_{rZR+6m)4VinuqUkElmMm)Bs# zy;Xfg0}6^?BNF%MfQV)kbY)FvZ;uCoXvISb#Hc;;amq!?)OHa#pp4v1p#Hjx#&jdm z8<_66y(tr)S@*K6fY36=co%BNuF^%)j+M&PJLv24xytB^{_JM-vT8Tq>}6Ar=aS>? z%m~twfbB$hN{E)m1?Uc)3;)ze++LOk`g77V16@y@bDd2nbq(dBr(unI&6uXQ?RCy& z8&L5NFj{#0h;|#t^3?$OPdwBH&i_4DrcX0+xC&7VR2qDpJ#|n;Q+)B*RP_3Kc(r2% zG5K}H$}U|7wWIbWgTd|6B{_NNLTpC-$2S=nkFVGWo0=`kd7D~|SR0)cQBqg$d`2pV$>IQV$>njXu}#PqzDv{&-@biZyik-G@W!d->qW)sB~rj+W5tBu zPNq?a2QKW$F}>yXMo!t_P^c)<6jA5fIA=dw`?y~-|QW1w`eOFoar?j{*F7lmR&Vn+F ztW@TuZSg;#^9_OWtyBaqan+suIZfg5httWUvhP)MlCKKu$L`LOmf9gnY*8bf|-glf$WUUu11nm0C+PZ(4betq@F7DP9d@;8S zOxb%kbtOQ0Uz=ph4R+DCv#KdDr3iT?T|Lp*ksZe9k$PAxaNBDwI>*^JEU%JR;A^sS z$@z?zAM;Pkvq%@+$;i24eLdsppS^fbc`-MOMR^fZ=Hf@5Ucxy8XrYE`APjf#?pO3eZ6ZC1KO)59KKFfhAL`NDVnW+ z>J-W&Zu+W5FxS3n@9%xOz;isM%gk*0>X`=v=`UK=aH*D+uTwX9Ekhj{Xabnu;2B(& z*9B-oWpZFYD_9ZDm;7F3vZ{T;)=_Xx? z7fVj6BfCMKgK^j4lG98y1@o7MUqzw;#ibHCDGm&`uvy1ZNjerV)DKHuH(GX-EGKPx zcax;ada>=E#X2L(&WCK;Q$arB9dpjR;{obdxUC1~eB50_S6UPK4|md*1Xt;MLNpSq z(qT%`Wcu}b&6Ts^ET!{>oC%8wx1N5J3pPFfNS>|p>F>u}#$V+b+%Cw=^A{DXX1wUX zJd~09u^_=E>t%6qvlja3fEjqooD^4;PHxIPiym(fOYZlGbJ;qkb9siJiv~d{{bqGj z=IHpUbid{w@(=pFnyKKj|BD&GdY_>1e(>k);>@Auk-DHmQ1^`uFG&!Bw6~-1$9=)0 zuX1jk0v#Z79GqC0+)s+;r0{Ws``xN`{|nS)G15>7sh}o4Agn;hQ8cv=Nm^;J%7y4~ z6|%Kmq-l#VR+N6A@|>@yO~Gvi2d%^VL3b{DRF?*{mDAA@f|gl5&YxN5f1b>NOjJ&1 zqJ~Fr<@A7spA6J*Cec;`G3!^Zhetlt6cbAw=qBREK=-w@g}eK>gHQZ^{<$v{|9im- zGqsWRKiTJ{LKC4S%dw4O<2u?v@t*#*W(tY2x41^SNm<7O?`(lIC`(B|bR%hVn?i=f z<$)r~E#^rFDA+At`s1Iq*f>6 z*`mpS@>t}~MTEh8E6N0RbpDq*O(lgI7GnYBepCr{e@ZYrI)7S?Rtet&%FX0+AP%Ot zu<-4*X{P=!QCc*~C|)dD3n=fQYB7In9lq_cHJyWIqRFe84IzM@!5B@zqW(5jz|Jjd z=4;*FiKAgl7H!A?^jwS81jqxUBZVycJQk;OifGc}HD5!dydGS*J_^~+xdj3Q#uA?| zPe{slR+KIs7ssO=~06kRjmou6o7mZS~3+as!P) zfwt~n7Cxf@za2;$LN!%vePBBo=6>TjaXsKe*7zw0J@5g_skzf*7U)&;aJ4JuQ=SQZ z#x1ARd1&HMRM%b%FEVZ^O*f_kQj*oVohl!lqov@86lTh_oKoXSxD_6kBJ0WR_q znQ6k=o{@`E@GF4n!5^(cR1r|)CoE7J7x&RXD|K}ZZCyVJ)e9f-4ni?$n^56I4>v8f z+%MHBi_MBNy|56eWoWUyQ*lII`}Sj+BGqR7io>VvTAk9hvAoG9^d5mQud#)noE+EV z$ekx|s*rbd>u5(Pff4d@4u9kaC|$AMegT-E5N}ui5zzdGrj5!k$LTSv;K`E?$$b2| znDwsSP*{mz;k5^B*ZFA*807kuYoB`61Qd+RD_2N0iz_iFa>3u?t`eTI(X{CAB0bd| z{ul{R>h}q^97J|!LWPeaa3a214i&Ss1>n2P7s%GS4-OMqv)z-+%am}?+Gd?dUU0bD zo~Pdda>~JJlwHtE#UZ)+*!K@n`pZqF9Nz3S*`^fvPRZeqwg3VJWcBDtp8%4*YsEI;VKEx2!E*3sG?Iu7|2vKX!zl}qdB#kxmrMwVy zs)EzB>e+8HS6jTF3pzp2!ZWd-j;u#k*REvMFwj`ezY91)9Bxh5WfLdG%Yl2b#JPDZ zP~A53+f!$l6&P%PzX|kzZzSflHr-;UKCcnU%+zo3-r#nkJh8nQt~Y8B-pxTr>wZ~ma}m&xHp3^a7ds2;Wm|KQhxOZRJ;kE-Bk^Qg}LjkJX- zv(M4cuuFFO%mQ@=klEMkvcY?Sl$EgUDwKE3=3xic^4~8yak1QPHmu;IzVMdD5@aB0 z$6{*m`>n5h{*d^Zd_f<2No&m~aY!NRV+>gt6JSF%hdxj|wjtsLWwkvI&$P?$j+Y;M zq||L5Y;)(a1=~P>#>*=YdZt$67BtD)kFYNZDOO)^YA;53l3x<{0} z&Zy}Kw@p}xrW+Um4kmS#fQC8mPj(Sww+qU|w7lQE@}$0*SLu1{W)_c)SEqUXyR#q6 zi{2>@7Po!R(jFN7o~>TY#qk4sZ;5l&X^7EB(YxLLhE37*4RUFAcgLE!C>h#oset1=-xX`O4JB?Y%|HJGIc_ns*w$=8~cnUk{G~unlP`gJP+%+9RwZ zU#C&F)CMUWacnPSBYFV{hQD#RQog_B&@F0q6{a??6pc#kk6l4e-`F+`C5CN>dQ~r1 zY-ONNRIa#WWgoZkx%u)%@t2G&WgEYf=BI2t-<#LGQ>rQMsaD@8PLWSIqORpaybl+w ztd#lEXXS2xY(QExch*_6K`C-Dv7zKwaq_V5*=~z;dG#~qW;VA?EndlM@E1RSr+Te; z^!v-3HtsjGBL~{}S`KH6R*(!P%tn4N{I+e<^wmi|R7*z8r`YZ2OH2*a%Ao9?7e@6^~zi zdA+#*>MJiBS1*g#p1waVL~NLue1e)bnIaUuT`iIe^Au`77Av$>?G2+&q`px4t&H-J z5)H~2st*lNmD#x7VVorlp}ycSIc5Ilv2cc2C;z@c!?P0AaC0QJ$$odiqx4JQ7oPUM zi;s=~;HhC@bxh7BsnuGsZdtG9iaYqS1&WL0m5PeLWn{AsbY9ImY2)i<{^6a<2a5(z zSJvr!792mw5_n^uj!os-Yt!3%s&{@Z1hj?A5O$i3#CHj_@wD@j(O4P)jKUK=HYUT!cP~{O7*L4a*oo>-$k(=+Y&jKbU z_SYa%*Y#43--~NM3s;@k&0F&df+i>k@ZNkN2 zcs}jvbr>-~zS;E^cB5L9nkaoA2 z`hs$6@dHm!Q}cK7Dzn8c)ymI{JFjL7+j##p_qOpLeQBua^6W@0up>%d#5X|HS4}hZ z$CRe9XFzg}r6@k|m%f{Z*K%Om{$u8XZ*_ZM^&m#GAAOFR<@&ERBX!cKS$;P~gI;O> z9_||b@!BvowQg6u{a2JIWL+;ro3LHdmnPip`ukofx1_4QzNOE*WJt0 zwx>0;FVd0~X({U3sdd6)?LHx*5LN9ELNA_4-1HTUwyfwhhKaV@JEppZX{AzH71{~m znV27r9R1&DC|-989aAwMsMlW1#Gse5sjoR1L2o>pcTLg{t!$U9f3q)2yPClW@f6A# zXyEeQ&`ce{Xp#l}eOF0MMvB+`f@lgvNfF;5QGYe9)Df(vxM$D`X(~J&^Wy@oHeI0F zbiAF=I=yut?=KEU02*H-*D8(hOp=)y`)ex6Sb46zOr-Wd+4`7G-O6Q~?!!av@&O^jo@680tre`LnZr?zz9Bc7s;)F|O&|Y~i*f%8eZYo=n2c6o!_Pp3w@qQk4jHa^OVH|Z# z_Fq!k%Bus{RtTG9KTQwJU^1_*3QZZ2pK@KrviAKk*|NLTCvGYeX!2^lVt!73E+P6C zm;yMGqbhP*u=l>b(Z z6uVOJw*I0aEn=j7t1kw9zIH;(EuAXn;_BucZZo^{LZc z_l!Jsf=6jWb=6c6S<&QO zHK!j3kfZc>Iotgy1Nio3rWA{3R-AQ7rP3wkFKEzfE2>`f!;2i>Yi2!-zUgZ+pQtb5 z0{mCha;QZ-`lw0JC0ch}KHqC5x#F0?rR=?7=#!P`skp5)nAJ%4Qx6*IlHkX~V`d}Q z1F^}i=~d}79ZO@dY2M@R?HKuB&jeZuiP?yUC)TG_HK?t>W8|V|!f>IEi2swE`ZF{o zP?1mdnV{N10WDX1tk2ssL8Q6v?sf=pO~Bk8laj8YVN6qWRivmJ_tXkYx%(vNq^KHm zypGltQKag0nkJnXe5+4WYXeoM8&sW6ub%Pvq_(_HBqX)Wl{3?_2ME^om3NF>x5Xwq zrdNRp#>(!PjWm^EBbsbVOBpiisr@PGJ{eYD1Kj-mz-u>Uv%OJVw;IS;|JGrDjkyTZ z`|YaiJ&R6{Yexa@KHwZuDd?$|(T1yz=`yXbZ7C?nKUAwH;#JyOdRIbpBeut-GnZ30 z?IXJ6*V|-TV#tCD+KYTjafEd{c^&PXk2q&=LkuXYTk#qY0G9JH;mD>bv}+HKv5j4y z#pFDPtfhCh|M@5rsU(7r&hgfujZHim@tDU%m#zi&^t4l-r(p z`=^wSQXkI>rhjfc0&d*q~DPL<0+ZyfnW3z~b-i|+9$_oHWL2d-NWPdFdXy~OyPjhiQcds zcg!@G-zRNbNn`vsZ+p@)w7h$2x!kOHzb&-zi}(NCL%VRt8${v<4NKc}?vpC$zHR;& zR{%)`Ro1{_o6(^MU8-{DfPdg^D+vEV!*l7M-C6LTEEU7SyuEe&iY9-jxYg80)gj0`3ndk#Z6ryN`te*cw6qQc z@D~^FA_Dbe3!sQ(GGTgd8oh*`Y}B8p5^mBj>X6iKWafNybZ{_;6c9z>2RDGj!6eNF z@YW&;J^Z}R3Vg3Ud+9k87#cN;T$;oKa5(1)bTlajA-+a}5SEf+DOF(7hAnx|wjR8_ zs}Zs59tmDs8SBn;CsSXF8bD`md>90X`^A!0f#MW>E%G7`f$QR?eh8R^oAm3)B~9j% z6M%5o&c@Os=QwQV#w73sUOTBHpXiX{Oge|Kr3T)xReGj0Fua3p|*%y)=7RyYe-C zG20)beLKmM}Od|_(sYs27Von+$u!JjDdZ#mS>>d zkuWfLrv{fxhJPLfM*FIFkpN3JReBxsVRbjcl1gBTw!{+0s%TxY>Ko48P$<4!y=!oD z6$!HuSk{Mo=fO6-#u8vpNNabi#z`@gWn%!mqI)KVp7674c$v>3CVZ=Uum6Nark)sw zrf!3F-h5ztl@`R-lTKqFRROf{#NZdPS2oO0HQ5KG1Y(GW-L}mzfyeC*$DuB ze?x;4O*qkow3-wtx&ejEYdds-oh+lYqDL_4Pyi)3lC;hus<1K;G%2_A*-kIadD2;2 zVXkrq9_<7QBqDvBCI*)l6F8S5!MlVR6UxlU%<9Z^#AHo&W+A6@c-818P?54bj|mU` zvL~GS5+SNYK|t)_qLmAiKH$KTx?%;`Y!V2z+1|Rmy^35+<+KF!PVaQjwoae+rNC>`T7_H(oMcq7pYC=P*sxe^tW6MttU?WfvswY$-q2nxfEy-24QxbhJ- zh)vdv03Q$1CO$bCNOTD5dN&$ipo>!u%A<4m3Enf=VtJTABO z*JM!7dL64SG4n1li!L;@WOf^P3b2I^T2oa!143lK(8&_m&-6ga3$N4qs^MBz zT_P`E=mW{plU4((bHf84JwMOhy8QxB*JV)!zG+EL$=aO**{mfNC(^VWYW^sjHGyKr zAO;!-%oen;s9F9Iq}*43`70$bvAb?^a)E5b)pQ67wk z4myvrm6P+^J}b?4p{>W3XBCP`By;rUwEbE*Jads8o;{GMI#v$uftVnG6Aaa) zbv*JEb@(V+1BN+cwk7*BFAEG*qe5ij2XOalz4yi-AX$!rX*F)X zyVgpaQ?OSJ`ixu#eO5BKRcn@+H)KHxCA#)x5`y~IYPL{O`i;-Sh7r$@?bV)P&X%Ac zw6ktCYRrawatSXO1*EKPTP#8Hey;42!>T5Nwq^rj1aWg~(?4*)2~qOZ&p76I$7nW8Il?CL$Pt8o@Y>$)>df+QA~Ng_h+Vl`vqWjwBhCZbDQn5C zI28esJs$jhG39-iUqn=ux3fZ6yFU;(yJ(Uq2MdtQRkC zWR+jitFoZAP8Z425btC}JtCo%#lliXT|?&^C7MxSUZp}a1~W5kyFI$K!=IP(sIUO8 z?@jKiN~}7&n^>0=x4+ro20M@6B5b$Cvz%Kt(@3jTt5V6mP(FuMAbp<-Tjtk-;fXG973E~Ej z0@+@hg=6cYk%t=+oD84^Y)36U0u7%%d(@p`OrF+V<~eXs8V zM~L8OCUlbcInDx;Ue^Vdb-qYOy(Fh|iUqd4-V28Jd2i6IySseKd_B;5nug)y zQ+y0{a+=1}=-XyzAN~;h*`InG#=ZyS=e(H`U}%@K@fOXCn^q6A9Im7V?EQz+&N>YB zEY`j_sMBEMT8?u(G#uh!c{$)oylcigwNzA7z@SbE%!w9cFVE_CIUrfNrj2k+$S;0A zgrAmK@tPN!&#C}z?-|j86 z{75i_CPwpryrzEyNrijMG@SzRw-ljHi>Hav{4GVczOa3!=?sa#rAThL!4^$?=s#0r zoL6yyrZM;br>^YTig0Xw8U9BuSNkV%8okZaL(8cK|LJr1PE;;IF|wE%>H9wR!?o4tS2K1p%{&n0D+hNM8Qh&8nr{;n?WSMJdlw zf3Rp{A+&UZ_+vIMpzsag@il_2CkQ=eCAInjmV`uo zveTI4B>hB}aApd^$jF#oCP!k(F4^CAxP}VeA>FIwZ8paSVn8&hRtKm_9?1iGEN(jg zy&vzx$M&lofN^NcZ_ zkp^A8GqvDYzo8{ud-h_tvjKc}^M}~|F)Ki>;AGa@#gFqO79w)2EA&Na$=xdZn(VK& zJG%tqV#FhDaFp)+b`BK`FPDp3aRBBUeGveTvf1`*7!u|+)NKU%)Nz|KhEM4)8&2|G zn(RXKWHu~1ZwAb5U=RvW03wbg0(buP=MiIWTib*=Qum#aXh(P%>{EajO*oju9Jn-(z+E*5m#yR@XI_$^9G3{hJkF zbA2uqVBr|@#0pTmgu4?JzDo{DVrp0P0K+Mtw*a0sT6=La=rB|%=@GhQBS>j+bbb)I zjP$KTOi4DxXy)zhgsc)V_1Obax>#21Nvtqd8_S55!3tp2u^duFOH_pYIoGC%?&0t_eK*b*<|J z>ekbFO4L(`%KEHVP#a?;8O*dB@(Q=3D-9!Us{s>ntua+(rEv=JZiLVPsg;8>N?$Z4 zLXS+uD1X8f>Xh_J@9W&4^Va&*{=BQNX!7z{*Fxiiz6TDp9;fz4fME*n`<&zuKkHRc z=2OJ|r$*)H$_>j6%8mTa`5F2d_!%vqTQ*!aST+(rCvGTiAa0aKKRn3Cm&rFQ9HRPxxW1mvkrIY@V9?lBV6b4g{db)bndd7N=eILALJ)Q9TY`9~K zU&CPaNfbzc%TB}s&aL;!h zvh=h!qrH**m&-DBirf@vU?%@M?d&h3ui-Po8V+i-MzhULh6D88sYX*yIUri7d$!Nrf393=!Evk}XMy z7G)VG`%IRyB?j3Udl|%xVMt=kZ|Lpk+nnBWUeh1%`JMBdbDo(q=gj9i_kBN~=f1D| zGuQK6r*_6Y{$<_O+c?f@Pt2U=L+yk%{W50i3wNn1if$#!O1(T)MbWK98RcrH%0KHz zqL`{Z-4Q?kzu)Qg6EWmOq0ZxNGf|eP^?0-4kCgA2k6NMbZ^+GPkL5Et3r!}Q=5{-E zr~AW}o636x-0(^#2*eKJZi;7jsYeZc9St1~l-{buX}OL32|GZ;g%EiL?fskqv3xBk^WplRBf z*F!ZSuu2mX>nf8B>zeZOhzgK$PM>fCljRq@4}Jd`lF5o6MNk{zGvmzc=V{`}TEoUMI%dfd z)4dY=XA{GWdQGhRU{BC}K5I@ZRaX%)HNAN#T+8GNEMUXy*noNvq&H?b@@wV5+@ve= zJP<)dW6PUyP_%T$J@EqT!~t@Fy4fE-WIr-|u-GHO7hUb0H~E6OoEMq0><=fdRoj*p zf@E`2YHs_jVgr0x5Brw4$3QlHe+e65M0E42ifPM@;sF^ns)5YOCoNvwidG@{sZIGA zRl7O(&O3k(Xte2|H~xMDO{5WwZyD#i_ui^LEinq-+w0bAeTXv?ip*?@st19hqM zAQIwD&^p^31b-3kn&e|8or#zS$!dZe)D%Iyz&u$n2!+9(89o5~)(`V(0s$RN8BM2B zc;kRb*!i0DD$={zNzBsPL?LMO9%<_C0GhA3t01$wd*M{i$?^*1a9JTQx^8@}MZn>J zCXW1|_{oM1hLp5ALDNq6l{Z6~{lkj0k(imQm8)gQbnmrY2RoZTp_^B75;X zcC1N=Vc+sn6-`f@iyTv9E+*?^?lHD)K*QI_Jp4AZtwyX-1g-e;Q@l@Y5?coY;~PPi z|6Ix;5dXHMwY}?DvI)Dmiq9N|!$XSK;Hf0A8%9BC2RajxPoYY5S{0#D(c2ctW2W?t%9h1O@P@yo{S`7<* za!SxUse%7vQ=wIppWeBnD)ui!ChKd^Vozc_+2ORTA`H zV{Cpaka!oWyr2J{CnkJN-wFnsZt~bfy?qHF-mjVvs}C-CNKm93h9 zMn_L%+9p9?$Kb0pH3jjwTfdghYsVXX-RS^;V>|!=*~1p#=LYohhPpX>ZL;!V8!UKG zjyo{<$etp0ZP8;iosE{SI+d)h-I^=ZKTw3JPjyn6?rQI2(|?f7I&$KV=&cN*borNXz4FJwV{A>(a zDI5=w#roB4V0kMQxXskHFKqTrX~q`u%Gn*IwCWEobwfpNeraQN+0{IEA>n9s>0(xV z{q0>dM+A1KBdR%)+kJvTH-x)CoNe?Jj_oc6&#h$B&eiDw8OyRcp%Q;ftO$K%?vg>t z-e_Gd+AXK~oI$Q_){Y*wxAic+dGv?%v%b>rPlLYXe*IL|QEF%KdO1=Vx5|_bG_0NR z1V_uJ>{5>k1!9i+@VsnvwJji~3a0mJzYqJM0_XP?e`Nf(vGJ=z=U_%UQSbaX4Wd}> zm_-faxzbkI${3XoWgxCS*YEFFNxD6*V>>x%b~7riT4!Td#GX>UD$CvKX-6m5X@oR8 z{S5-upQm-hfx*c7{J^m#*ej@+VnJ#y9orx#f1zx6`bNaAuZOy)N=<;uM38INbk#En z^uvwA?jp6VYZXun?wbL?Qk2b6kMYcT3t;X3X%7z4vtCTJ7&B`2wOeN~r{LH7--1+*$Fq2hdY81+qt^2F4#J-=DJ$2<3Ipr?-SKn_5cpgz6@eyrc9^?}kafzekUc zs60s4~hgoJ*L92U}Ks^c5S02f>688>z$x(fQxZ3 z1ZKX(h8R?ym==U`Y7v`WG3K#Xl$SLc$uqf8Q2c468U8@UgY*b7I$qX%PKn30ac|4~ zJ=r&nFEsiS!mHbH$2*>KK1xuujw|*2qJ)JgT%488)f?7v?0NZuxVP|w%oBdhCv`@BjbE;8M^b3#G8_DOXu`g!uakQSr6i3eT! zq{-kD312gA%XSmI|9UM0@HEZoa9-(Yo*L=AN82CfIo8Rxyav}-FN%J^uxSE`#BTy1HU&bb+QmH%pF<~Uyb6127bm{$k%Y!q%U9R zm+Xo5M!&v`ILWwhS9Phm&%;BgnH8Ck7NIcmdPH@}LY6nin6KkD`&z#RZ_nv9!LxI; zx1(gT|5nXDaNkpk9#j1q*)X-X{FsoMQY~kp&w)E7OwIq2-agd-b)QiQzJ0 zdKJo|3XJ=D+Zmp=0b2NKJ!z+DNd}`E%AXw>JQslPY1I8<`5YBPZH(Dzkq^ZRT@v~d zFS(A{R*0sHD#_nL{S^W`<Z@k+Ir&78p1CT~0Z#=aK_`-1ku zPFZXLF{xyJLn;&sO6>{5n7kU6-|BtiwBSZgr?zXZO)ve0*PL7pf zEKm11Aj0BsCdXC{HUD^KhNi%S?!YBRX462RVJNAyQi$e zr=Jjcp~Ci7*8ccX6+V!#%YGcT`|!TZ2Dj6_lA11qQ&Zt*@euPvy5@lF=j<|c>{9lETM{BcC8xQjtYV01Al%eA&}6o0u_uYqMO8#=sE5e)YXU21 z6zR#66L>cx0Ki2aigP*;u(vbV8)OOfaP~UCnZzio7Lz(T_Vwf=eUjHD%no%g(b{J* z2Gt%)Ym5dhf(^f~xN+JsTiWFc#T(}Pxwtf{CRF(iLu+3i9dzWe*4=PmYL$}XJTvvy z^SSri(-WgbJPw#r`_PBRIbQLqh8HBV9*8=~9?VMOH~x604*l{mY67tT({vVNnVqe4 zRi9)^{SA0&gL3lcGs2T?Y@x}Ee_zx(5cQPv{ES|B;HMTIZ8LgZDZXjj{Si^8c0EgH zFf#QzaDC>3#iUuqO{WU6lY&}2HZ=D?UNu!YE^4fHX}ZQbbho#H_+CB)OPgp8&zNUb zptQU1L@E>QEBQ#Z)5liExU|#!Xc{05(0B8)-RBPl1GvfK$poms&TM@3s1FwEXvLR06Z4|af*K;1k+5A0m+of`--!>^N;tVzXOJ%q8$5OTPW=>x7$)E z@>`TGGfc`6rMv}l8)d=%w} z5{0rj{9BZ*!ZjrdC7=F@5=`?ZW(#GTT~mfqF8SM`mT|uj0LnnhC3HJb{r>;9 z{O5v78B95oZwC|Nw}Su8yiSQjISp>(Y$W`4QZzH9Ctp&Vi~b(K1bOjyOxpbRKP_Vx AGXMYp literal 38833 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 A9smFU diff --git a/excel_sheets/Series_metadata.xlsx b/excel_sheets/Series_metadata.xlsx index 001455c04fe17db15fc7bea089148e128ec2a89e..7b712666ba995cd6bdcccddcbb226649c0e35ff9 100644 GIT binary patch literal 12780 zcmeHtcT|&WvoF2(4pOBE(u>l&fD{n~6$JqW1f+x}CG^k*q!{VFvk?N)L7G%SI)V`C zO-g_O2@nFD`0caL{mS04oDGfQ!56Qx_KzZzsn)!*@tOijfg4wB7TpPkqH+Kygd)Rn~`L zk(Xh00#2c*T^OFSvyV^Tl{}HCt9*4S8gP*nCrOE3a+OJLl+r+d?yKAt-wN^B;Fu~F z$^s5{+|E3wsh}`%GMUdy^_3eFBAT`@hm+L2-pd*CbuO7m$yHtBDEr1rLbVR$Rf?w7 zl}#4Jzlb&(pf}1|>j$8%@!JTS7!Cemf;U_=c?YBV05%pD^}m~71#q+ZVZ+;m4*gCs zvTzHV&6byAcS>$O5#`iR5AEWis^^E-MHWTTeaqO7??*9Y z#Tnu%{T_#6#^;4baZjsN6P_3e<)vm%=nGa6VqT~CG8&^N+ zKb@R-OiXW(NIK}9piJ&WF5Qh%IBgCBCh!r-`Iy-zue?0jYw+z)OMF|FabLE19u&D}tw{}q>2ripo5VW$SSN%AwrSm@ z8b~6CCEjUDSHKh6I33c^TK_KNbFd@w?0a}5c;DM{S`<3jTrWDe@KAz>T2+j>7_!$+ zQmAKM``8|P?L$?*#>kre6UT1!%$$4_xB<>fL>hCKa{U9jw!{uvJ`Czgd}xVKE* zz*w{kE8c=(bJoYqL&vrPRpOd_`w{D}$eD_SqCaAd?v5Y%&u^vMWst<0-W_-FnjL=~ z)l)v=P2LK>8_`)2)l)X&v1QM9?X1F~V1vO=n*NJC${sxr=rW#ZyF`FRXC$y@;S z63jBq);z0fwr8><8%2HI(~UQ2KgOISrRkO#k57Rm-8HIb;0IByd$sT}am*}!a#*0& zfQ2ZnFBqW(;_CheIYT5je=3j!X8OwwIe-K0%dm@K&FRB$(C*(?vWwqL-BBBI`5;6L zKjk)k8gb28p4Lr{)mF`K7>P_M5k7VWH+I^8SZ!`N<~q*vU-uQh(eK>Yns|+YT?! zP++5_83dCOsD>x=@X?gY2Hd$#doEZwbDlA-vIiFBLFpvK*;jKHd+-f@mt^VCgj{(U zVK=4#JjXxDxIx02aD@%W_DZ!TSEzmS9y^5Rbz1pHYC$!nXUsQQ+-ezu>s(7iEg#eL zjC$*j)lj1!y}R*7$+B;IFyZCUWC8_sqPaBYzeCaS)NSnHGCFCnJXaIEvn=yY?T+uD zf#+up0pVXH9fe*WX-zQdtWfe5D{n|h5$2~oB5nzN@FM$<2q~o!b_o)Ecq6;gD$tum zI;rP_K?TSc`(kuP`eWHKs9iQt#DBPOxA9OhcdTBT+uychJlb?l)7iA^v_gDlN=k&^ z>Y>|UU#~Ibjlfsg?Dp+5JEbf*3^mOY3Q2n;%*_z58(gi*(}0fd-@D#L{N37=mw3Q< z+(!BpO_tgf=M5u-&fBR~NF#rPg6YZzB-cYpX!u0IV!dXNR8qa(O?R^n+*->gqjOmG z*+rjyfK1+2A(5@lD~IjIDe{Tu3U{HHQL=gii&`tLQ&Z+QIhm}KghrC_d+~tIlZ|d~ zmL=I~yhi_&hfeEXM@LWBI}9uHcNLP@dL#GqxOQ^GQ-(X$BYb=MDA8H;rC4w#Kv z*9En^?#r}kNY>FLGksWI>vh#PYM}9~qr{PDY?dtr+KAg0?avF75eu0{KB8H=^91%~ zJw2lWc-0e??A2kpf9CQ@i*i+d-Qw_xdPM+ob{XaTM*g;5hEF#&wuc4|_ghv121bb$ zgPp{90$S`r@TXgQI3VjH)}Ry=Y0ExYqX7L-xsq(4hEPbjzWEq04c)6sGJGyZx8>d4 zH!r+mrcgq`PNBvU)?XO=)uTETCEe7&8uK1h%IDHE{;ysIQI|byZGzlA z;mwe*@r4I-rlTjJ1<2V2GQWwk$A#8{)XKVqejJGeRxzfBQWkM^&&rFc%6n$S$$WxL z4#;w!%gje;q_IeTiGC*=O9D{+qOz(CoglYEl1s5B;G2u5*4@ls(I-*(cD_qq`LXNu zA}qQM`=1*~(wzpCM;sWspofjc^ydcR1#ok4x3jVFa2Ng8*S~g=%vq=#^m)?F1yk2m z9J$HKePg-%9NGz3#6e#}R?7cXK_nr>S*K>&MT)3XP`X2DN&CdBZczdJw zch2IDICkq8ce5x^E@#V&TT{i#0SygJCyVRZSuajzhm~gofDNrp(`#Ok9cBMx7uTaH zJ753Pb>%>r<3)$u55SAlPNT)%>_C(^Jiye6BP}kDP$A%CxxUxO3-Q#~J@BRP!KU*m zR5_4{@Pe9;5E7S70cla2F5WM^_dM;kn%EPegL9DOtu z7`GcI(?cC$@mdCbO05NP?HWzyew`IKz0R?-@i5&?!3>QapM_;Zc9iDN;EPK0-Y7z# z92zd&)O3Olv_rTYl{}2=RYaRP?N-zsLB?R6-OatrfhhPQTvd5IF4=dzaGX z0PP-75tqFMfVUqFQ=<2#dSPXh7VKwV+UmUS%F6ipd!td?2xuTHnO`Sy>!R$Y(S&V@ zR!MKku%SgxR!&x4R&MJpMXeT*G1NR96xIEsfUkkUz$joCFcugB zj0Q%aNDwzRuS}>@#o$?WsH_18UG~eF^+(9AiAr}4c1OSrBr~=h!fB;&FXuQ-P?aU8 zd&_f~vq`dIyYTVk^u<|7+xJh49u~?Oc^n3pGFgl!1|K(d3(=VlINKvQ+gn==IIe7I zxbUbyt8DQ(UL7C&(rIAzVS0)QFv4`XC1E1&0R?|Xuq4fft;Dp1(l?l@c`H6=m z5X1Q#c910x6Dekyx1#FjflI=`CD?!>+=u;Oz}<=r(FOHagfl1xqv#OKo79`)o9+{g zCD%%dOKeL-4TlXy4MYtg1`tDl0l;wAz#_L*(?0}A1WK?JV(K%4T%$1G4R?Wz(p$9e z3e>edQEc^SYHB%IJwJjrcT5>raC8pBSJ^MB1^=`>Qz5gze_lu>ZgbfOByvZ6{G)*m%z#J8J|@3>TUc~OMyQ8 zupByL(Bl!J$Ew#%h$lg@oOu0_5=CT%Rr3|&Q zxf(66rx0IN6-psx0Nsiwk?6P=PfDUHP=Z&RLtO*XucUd0e?^rDOl_mbtYg(?<#}*` zOFlx0)El|j8t+DY>9lAwJ8x}4F9%dQASuQvrS355;Y+IWMB=-5sKpcAQ{^)uaZ}~u z$A6o{AO(6bLi_+!YspO%ERh!@pl-kIHRwDNkfVLtk!5%~Rnge!&&1luv7On-VfS4m zh2%NtHWld_D2$W30Hjw*w*pc#Ai1t8Y=>8#L;DWTp+l1j$L1EZQTW)`-PBoya~0f^ z5JlRPb>2gZfEK7ZTKub|@A^I=%V*LeP%0-)7pT#a>o#5~C#?{EV-6JwJqAK_u zPq5>0C3UC@vtbW7R|@I-T)J9$WaQj(c;fv0AU*XoqHG{~%R&SI5UJ;gxcL6T%PlZx zwB=H6d+BL()|+mZS)FXUj@s<}LK;XS1BHs)ZZfqSi_zW!nTRn8;YD%MTZ0NY8RHY+mj+vog{8C8X4q-*dWuC>#0~Y#1BBr>*@zh;s!J{8kTds!!4>QX z-^8;v4gtPB~3*ykLrlW4UncAf!7OUejrb7L^X5@xV=c}pr>g!Hc53&iB$SIs! zmBvVCJKxOtOv>N&UH92lfM?pa9!z*;oesU3_d&|v4O~CjRlv@&Z9ky%&cYpjv*5#^ za5rS#XHS7T%l6}`v3EAj&_90U|c6@;uW6jd&jp~B6GAoX%W)}2R`-a8D+9ow@MG83Lb zmx?kQPbhZ8u==R9T}&^dIpYyD*Gnj0o$PThC~Cp%m$V_NW@73Q!$jJf?MX~{P+-hr zTPXD>$TmcZU>)v`ZZUiUOXS}Ir$`hF@e}hFT7!9ci|N3L_Y7a?sM`y$*=Rg6x(TMz z;~xJil`0zP=d5h;4}` z>@~ZbRrRCJ@C6eL&X<8w1TartKRWj|#HxbT;4;AjwX1h?c~^FYb+@spqtk*T0&2Hw zLykK7UVFJ!kM%Sq?iICwF9i4=4Ro)rBG1p0x5@@!gJ%X?F|S|3aXW6g{2JK_dqhTN z#e|_@7M@VT-WesCxoZFR;>;Fb!d}!K?yqIoe^Uv_b`t69;R!)o(Ib*1(pGk)T3JTv zeXPrHi1PPPPMLEHCn|*`Lgf_~k9Xuam$n3Ar0;nJ@7fHf%yhMC4x{C@ma46h>i($b zb?e~E6)$0`4AzoZ3UlXtFX-t&b6K3+1#D|k)Z@+b`pb!Oo)MrE!vrEwsU=?|UX`VY2@#Fz^*%gZRS|x?!W^0jkmd-9T!&62gCic7fhJho zhClW!X(!_I!edU!0zycjmiEHk=Fa;X-l{JklejE|4_LLAH@aBi;U3fkc?Y7!fd zw&T}22)gIuVlhuKs)$UN<7U{gVN{U|^2}>vKl&(1BC4*EdhaLScYJZ9K9KbCWwFq0->g6z-{m|U> z!Mma5O2EwMOQOrKQ^0gNamJ<`Ua@b5dJb*LkA)hifLwZ^Q0=9Yg!)JCD9tR;O)c!( z`7P177(b&T8L#I2I&+)XYR&{1!RRv1edY0seZ5F9&Us1wLz~O&zFP#vqL3?Qa{7p?@UA_HC}Et)USWC`b4djW}kUiE<#kR2B4`DQC-g0b4knHvXtZNKn2LT$MQ^lbbF zCoSjrFj`AGx83O3fjN#m@+Le)j4;YYO^IHL<#>%bi!a79(9Uf?(rcH`k@h{JnR5{h zz7${AXl@CWp3$X>!T-gQXGw?qS35BVHSH8{1+u7^n9}>c_$73muo*$cl%%68*Z~K zJaw%LbKv`njbF?&%l~eRcY|j$j`iH1b^I!?z|#~Liw=HDhB&QI_cdtm=M7&R<)jo~)}+MM#k>|oUVi{HQT{|lA_kVlC1 zyTM^P81>tM_5ZQ|m-FMFlJGZuHHAwE@d{ZQu8(LAk|@&S|D}ebgNt0>-bJs|QvYJ| zD&c%>B*7;PS67oQ{+0Hf!rnzE#EON$9aYaDi>}b1n7$hSdtg+BhE#Y_i~w!Ftj#Z+ zWw_i9F=AmI7fTs$tL=k(3Fisiu+d937!vpe>J3t7$rxKm3Gc{Is_%A z&JF}NrOwYPIf^O=E-jUv!Vt^lE6DvgSTh`nLcy_>+6sOCxG6mq2nkd|RZU}_m!56~ zD$Ol70$;kfwfOP_EiFpEDnTT!&ov_~G(+l9~p3CXt z#@a44+ABLScj`js1btjjIp2DW23)MeW;yO&SSnux{_}CX_3(I}Ixc2bj|K~i{Ljbn z?jAmlHts(rxn@nC0@B5(&IBVl#Bgf(^|T9wjS6+3#-(SK5Q>zpw5n9srh>KrrF1N9 zcOECka+dp7+}FK!chIb+nG?W)jk8zxU`{$Bo26}IO(-V3mvwo(rOJJ;NR|Z(u1DR3 zykMSqo5useHs0rCiA~Jm(L1h=GD(&$tZ31z2+Klo&yzlXqxNbDd^}{imY4{P3%z?L zyXcsklCG!IQ$NK1NSCkCIP2#0NGZo-qq7yh&_Th1nXc=p@%@i+wU*CCSlX4)nEOTP&_fCBKYUTz zcQdBq?0~w+JPCKh%{jdyiL^R0Uldv8%20CcyN1)rc7%Wf*M0r_rY0-9dey|mVNP$K z4ZLNud-RB}v{vXTSn@p>)X?u$sn|ddpO_Nl{wOk;OOL}b!;+-#t~*YqN6fs6W-mJ9 zpOI5D>Mh#K*aWx>dYkmkj?m4MJxN)^CqgZn?FD@M{xVn)$&XmC70~{AWZ_V{k(q}N z{d#m~)Fvp5624dP$1zerH6``A3U$_9d*dk_MUm?4iEgthh2lJ?fg+i*z3(_-TFK-b z-2UY0tpQ7p0y>-42vA)j+mNYtcNW(mmBFJ0?)zyrmg1YrvrB>nguB;21(WZ^ z(F6S-5tBOxwbjTG3c^hjHiMl#e4EJWl`8}1R6Ua)B2C}R^KP7N&lT-gODg%w;|;>U z$nzY%?wj1~fW6oZjA-WBwGXIzZYJsK3(k$Uf9>*Ktp1B4j-+5Q{v-FZ5xL?3>2po@ zI+1bDNj9lJQoqEueT?POYa%V?vbtJ)C2ctUq5JA|^JzoxtTct0G*Z=!zh9P`QN~b2 zikxoMg@5Y8WQqwgAUjId+xx_d^+t~&h1bN5dS!k_kj`KTIHSllgU8Ny{b1St^C&wX zG5RX@C>eH$8#Yu|UYRopdpcu;ps7FPy{ayIJpbc;mGzFWLn<-*S43E=IAl%yC3&30 zp`-=jIZI5F%!5?3Yq%9s8c#Uy-D=SW-MAjiVcjxvhpyNDRYQAJ0d;Q)>CNpR(mS{` zs!v?EDaJw$guZ6Fs~#!mOmqA*+v>HpUbSPgi~$D=ixl&1;b!CLE-LclnwhBUj3Z8_ z0->?7&@1i25r6l!QazHiA!kt|HwVl(BTK6I=OBg~amE+0k4lQ)-5$iIW zesH54>%D`3WtMB6$@Lq$D#E!^@gs<@R6=V9ynVu*&Xe_e?r7~pl7y`$_Zk~75;_F- zaYbhuw~qSbY1bf0-HX9*!z2@FnUHte=;9lDMV}84obh>D8ZJVI2?cu5o?wVl)@*CR zL7~;N8t?h<7Y8FHbc!c!nPP=eV^bQ$e1OUm{C^sn|7Lng5;H$5h%uD%&$9Ak%I6sX z;P9ic#Kw>Qn4r}NEbJ#7aRzDYZJDP8X%kVY`yR1))h2b_UvjR5T(cL@TME0@J2m;K z#XRFHhv(;r?M@cPwN~TU+w#K)1~=@u%v_^IhF%~Uc+jnees+r^ z2>lusK9fT*6KIl)Ad-`cd^Q;LUPWJ+F~9m@_G&U4>4S~p0zMmEZ<03B(!tksc3R;p z)y8MgoPHtM_a2&0{!p{YT^#53m8+%|OYg51FH9o~5eDXN#(mJfIscRqs9|}OB$52$ z!7a->O1Ila54h44o|&;X=^tmst`zL0;*4E0{WAZUPwT9m*(u6pB5Ah1w5;>kDI!^RuKS`Fn~3x``vr2h<}^l-J% zD;NW(F#FSwSz}XmfU}2irIRVxNKi(0x8D<0I6Swx$ntZM<7O%3s-xxE>!W*@` zw1A-0fot$Ly7hJR+%j`f%ZjRw3tHeSU`iT)O{;vJ3vBkpB$) zxfK2lBoz7|&HpNlKZAeH^S{Bi!v6yQFIoSyoS#$aZ#jA*|1q%)bn!7${#aPVn70z9 Kh^L7D`1N0bu!?s8 literal 12663 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 literal 54989 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 Dgd(Tn diff --git a/excel_sheets/Table_metadata.xlsx b/excel_sheets/Table_metadata.xlsx index c7972a07889e1061fba5b9b098264b436368e985..dec1d9e5a1531ae8d16a6372763db32264588984 100644 GIT binary patch literal 37129 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

;L)3GzE`CXUM zzM#mc!$qH~z+dxS=rzAO@f8HJkj2pMW#i%hr>--BhN}JJ_#I*_ z8T-61DO<@fj5Q%cMz%qSLdw>p*ESeCQ;G5AAqoC-RDiNeri

7{I~QD!sgHUqJ5 zNjJ45s1dtKOj^m8sKF9pGo9?NoNaTC35vC(naCFmI}TeD>tTN*N0ImMSTE&L(9UI5=$y4T`W-fHMDQ}FdOxtnBXT)rBuwy@5Yfk4+!`+CL7-{;hdi9k#!20-(h-EE6#siGNg zbz37}Ym^-bJep>D+|=~R;q%2NsF+tle8w^R?bs#J1pf4O2pOz)_+gb>u2Fx#M&gYT zlnIY6@4(?e~H94@Mluap5iTaKomBE$*VW9{T#YWM4_`ZKl$ar_3xuw5ux0Hs)@HhC1CTu9{eUW<$GLaWDNU#ijko)S4;OUR7D% zfS8azIa>yMe}21f5Oe$t_Ah(Y`(Mv)pK`9 zzB9+>u_{ip@B)KjlyhJHW13)R&((f=Ba(9RQ9snZ;J&{5#F`-jeh#*wdmO@L^x!1ReM6Ud8OP~<<&nveSaFn`y@6Uw5CwNt2Z+xXkst}3!X@EyASId zL4V?&MLDruyLD1Uw?4DBekeC-QA`KyY39wGF>W@P2@5nAFnylAoT=-^mLjdo7XF=S zzXnV?Ta2yo4|A@QET9f$VezUCO)HDYg76%+&;}k^D>l(fwcV!#_E|*c>%>Iz?#t(Z zdPH+@F*BXCKIy2|8$s(Bn#WySaTpyC{e4_k7|h1j)5jx}2>|Hd&wzt3#si0t-#%v~ zpuLzB_v@7KVH`}JG%_g`_Lrh=aaP7mW~Vk1TpGW8jqk4)yTXg!diYSTgj*#uKm<3G z>(Q*xXg_dPwFoG8hdDmR?R^gsu z0yzX$LEnlS(j<*hb^|`)%IGc1`z{V@T1H9X+(w@2(&LVmRk6E7gHzt{FN7SExPZhG zoOE_V|w46Vwb{}uCx69M^$r5*KdOWpq1`~xPLmJ zK&-F3GZyQ0%}o6(Eyu=u?Q#>Dso_{53d?LqbRi~OF*GS(ojy8X z=-zR?Og2@!t?R^a#_<=_4nz~y75_fUm?SYwhG%>AoP03~!7rEOYlD9-g_y;1*?8aV^3l-_*Ly z+cgsATOC^G+@2cNN9iUaiIXUq(ac22rb zFC~)7f+T`Vd?IZqVrTz|9cZyw4v`AhG9t4EygE3o=&T&kZ^AR>rXn@(`=82;lkXu1 zv`YpYQHLlM`{D)&x6Sh6x=zoXlkm2b}+~mrD{*`FQO51B$!UU3rkb}6Z@WMP*>d!|_9)@pa zv|R@$CvToz!de{GvjB*>JaWuDO}YYLF+27i8Nfn9&j=urc#5vUB(6R)>yaD%cx?yRhAp zDc0>~4GKIPNz(6Rd|>8>sb84vv%pvD52rWBIxKskzpr`l*|A&M6^Iegg+Z>a&6)`{ zLBqlI`HF+i&~tj57uh;w75L6fzVyxYducfOu@ri7f@B|&Vw#5|XrdiqS;>+Y6n$(iU&WMk9LL!ouk2~pz#ANebm^QeH z|J)AMHD}S26`HaYj*8Le%*kLiIgJzXnSO0KZeAJYQhDT*s1DQybhqcP(;DiMrY9~< z)t!sr@>4k~C{)GKDVYcTdj^iCvN1hTjy_?iwDyT#H$4c{gl!6bwJ1-$ASGRe z`Ib^Q5%#H$+Ufz_wujJD*y(BP* zNdOR_+mj6#^DEf2&=vzL>q_srC;fc~}A9!O@>h{EH9{8l?m2ag*N_j3?&jS#d7_ z+q(O3E`8VFzL1}}&|d)ZbxF1z!1l1gUBO`daEP7Do)pHy$h(wHx}oT=!ARLDlgwxf z#wuOAlnRMGDLXa07%7bVAa^P0)_YQRc11E$7}qfGQjR$9N!eM^%t&Ee1F}nz_1u%P zvm%6%!kDk#r8EWYN!iI>Gg26X>R*&_(B;S-%5I3wC}o`Yccq)rzeNFzLdJP?S2%g= ze{cS4R%H}3dh%T{F?L7%fBZTlhtUo0a*E>ibc*I^7W$Cdp82_fQF;Wx8^3+`Uu_p^ AzyJUM literal 37005 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 literal 15773 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 z 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 S6LW$*un!LcUCo~O>wf^uzl#C@ diff --git a/excel_sheets/Video_metadata.xlsx b/excel_sheets/Video_metadata.xlsx index f494837f83b90e2285a3dbe567998cb6cad65638..8dfa4ece808930a4290b95f6768db6ad850eee37 100644 GIT binary patch delta 7674 zcmb7JcT`hbmq$hEy-RPQB=inK#6qtIrAU*eG%+GolGqRkAo4Cq6%eEgh|&ZE1tLin6qBS7v@l?oPSARD-pNd*ymM`}7$P&e+Q-;g`>EKIGw6mTwq>)0LF27*Few{wd!0CLu+N!uL z>Dd;&^t_gPa*FM9cW$36ny-MtAC3YBo_Y)kCjtiY3uw=~zKfPdC1{eqC`+q-DfTI9 ztn6vRcd!WZ{M`DrqpFarp_qL0q@zM2uWr7C=+b)rjpfS>_U9uqNiL^f^MmMhPfWfH z-e_!Y!Wq15{EnBOz4#%h{=780)}aDtJeG72-yb=&oQXPF4xV+iG2bBs5%~Vq5e$wQ z&e@W$H;(9>V4*rBH*|+4N`Z!^4A7<*MWs&p!?5FfbKk1|>dqo(l|FS>j;Wk>A(*u3 z=JsV~<_q26v_9sOu&`WNy1VLm%;?E&QjO2_vSpO7fC)4#z<=rqid^eN-rWzb9*^4V zYbVWawnE910XazG27Y&Ie&))-e$~j(3>=KJUy9lFA$Agyl=`ffF#D?^1MMVKTGv?B zyqm~ePiG%${~+@6tAp9?k)Ao^ZiC5aZjPIX$lOwEB8Id$)(Xvyn#Mg=KvJG zh-j&}gjzlLI!z*Oj!h-iHlW-luZM1{;tp_bOu=weYt!o$w$0Y*we4UsA`HydI*lVO z6RO;aT*xe_Qtt@jZ8LU%e|x^CFL#v}H?Opv6+q~5Y$iJmjp;SJOhH=@){5PN=&V7x z(5aSFL6_Lp%Ik4ES9W){$eZM4vH`1o_Iq>}5#6d%#_m6mW4Q>04^De*~C6FG0!=j{kSbZRciFQVQ7!N`}jI~BUS=B9}y zPIjeXw+SDJdtFPyr&>taddj$O+^f4)W4EXGNi{paej>MX51d}O&AV@e+}t8;ERD2U zapMN^*TOB8B>_02j4&_Pd5uK3I&q@O#CJ(wU`&z>=lk%0^PD?}GgmK=!vqqz!FxQ$ z)^14K#o=aNZ5swkYjhS1cb3$;S?*eXWpAJrxogeN{(zRl(Bd)sb6NpID;xF{S{_5o ze)bw#;k)$cyB_%ti~`?%_L8&YzWeCrWEH0cZTGB{i+W#k4;0NTRaA#D{>@7J|G?|P z+`gpxJbUKmdjE?$rFK+BT2{0?V9az{WcFDGZb~8Ss_6W7+3+=9@|&H@A^A&Z_zK@2 ziLsTS_()nt#m0i$T>QSQ3-a6oXa28HV%M%pdfKeYu0N8TA8GSSF~soA^E`H-icwmg zUlxQed~9e_X>ji*A@Vy<0ttEhyU*@U-Pw9Xy6sAb^ZSBa(?8CY|Lxq5JzZnSp$+h< zn&x8$4+5TK-NrASbQ+KGM$tmMmy>p`1^}(fQov&o29!0O^c}A5p|0?pCt*oo?`-!e z!)&V>_zWp(x_@36F+Di1kC+~wcR@^#&La@h%1^> zdS+h#AldRD+2tTP@E{q1oH8Ptwhp!GnFtqmg=goCmN%tgF?)^~a-U{8ckgeE3?QdW z22U6tWB$tsxJ%XLB)yR7lHhR}JGt-}ARg6xa)K$Ri?|h7kuXrIX;cinV^I~Ws!hN-6``+=q)QuVnffi?h z+=ti>0LKiL@*E!Hvnpx5kuRs*{1!c-zcD%aX++~hV|-GO$J1-^%rfI%r-3Wt5Fsyu za158cPWCl4<62O^Er{`nh?E)j>bU4L6K;wuh%~6IN;kVXaBGlvbt!A=`YLZ<{SuyQ z1=oV>grc~)FlXKvWjq7!@<~gsr!Xd!%Ff?PFKl6f-#njWWj~u_)gW+uiPhs)A>vw_ z87&%s3xQ=?mTK0_EK0yC1Gl8>k{pw=@Y~V>#tTo@rY9r zf>i8(j;AXfImA3M8c>tTZoY=!Fi+Vg;2m+ENz>?eq?>LyedA46Sr*%AGbI~?J@k~9po00Dl7sW1} z_9g2>y96KVEG=YqG~c9b;edgtN#t*^&qQK4S1Qa!LorY!DqWNF>x{aFVh}q z%iWO3N=qKs+efJol7@}gOIejlz{}*$EGyz~1~<6|kga#&Ry7A=mnL3y9MGSC@$)Fa z!2=O}vG=M&E>+q}BQP1>D6I zL{AfHdVtQ6K`sb4J#CGE?%85!w6iG|6R6tt|AIOh|=GeS-9s%w%Zt* zVV&3V6M;Jds`5SDSM7?lhwMN(xpP_g{e!vCZHAFe(Qd81L4?pLu3=3GMXMZ!8T_H% ziq{A%@oIh!*}i_9_2r$PDrK5nqugHbCDq4geY&tq+xPsoE`55P69vs2%FU{P5I;op zWs4KsXauchdDr80c(_wV2%GB-8M-fnTM87;ug?F*jl`ElBJb7VdhMZK3ZwDZk-h8i zFg2VktZ?OWwlC$E@%lsPh}aPj@oI~dy*=K|v?ly&MxN@0iAqdHoj?4c3lq?%AO%=+ z(t{H0aJAY6l>H+A^%d+Qv|HPEl;m`(T;$6OwZJux@D4Gr@F~VWiR*<}n@Nb|TgwY4 z&tw!OSErv%sPT@c0FM7#svIR^@}l?oEs3u%Dc!uVW>t)xeY?Zk0A$%s^^s5rrOeFH zQ!yeCJRAlo8m>;Ck-2RV!h;?;dGq;-jYaj@zmr2}QIDH~Mq^;TX0lHd)%-3Zc*;p0 zyfT(Z8+gx9l3Ggz^9Ty@a4HKo!go5qMcts zx+0QOrg5d3mayNwcFigq7B(Yn=Q~&_6>dR@whkJ89hcvG~C^E>oPtjw?ZvEOn!gT1HS$$QuZ6@-Eevtdj#&O;&L zNGE-RAvuOmPN$@wt(azeS|7SoPVe3rjW4VZEGG zR|)u(R+%{4oTs=-srVL8+wnVb`%x48{&SRz$_h#|F zyPaAu6%}hr+rZ`&tCU3BC^mr<)oWt|%W~$HK7CqjQnh=zCuTQsK&|E_)WJYh*$#o4 zxwpr~*XVy9vg($LEwv`UpSf@0Th7VnkV=&Ymc4J`vUM@eyv)qmkC6kVu*O@SRZQ^P zj^4P3xW$HesaT7rlzwv5OG?F75ipmxcJ`C!40<2wSpGRVt7bWj=JdfUxaRiR>NJgecas#G3~=P{Ahoa_=EVS_7h}!4i)p%v^u-<_qMY zz<{G<#lhK6kC$R#Db+x*@O?WMf^a-|(ZShQm$$x$C5QfbE#i4)%?cVEU{B=)dA=8l z;i&~zs;{8OwvXZ})2zEY<)#*iyR%7YyKMN&m6bIZYK?FB#si^t<&zBrO#Dh3d%c!T zGu}^${~Q5!-k+L&|trq;Jrg|e5X8g?LZsV>U%-4dq?y(eO zu>Q*7tt8~GNoG;{;W#920mC&kws#nB~MDBX-hN~U;eH@D%3_ z!fejXU2n0?&Fa4drU=N7Nvk@XSWx+48?|efmRl~x1Sz5U>_j`}>9pbrGghfZNwq@7 z1!q||JG|6%EEIvx?`p>_#9Run#F}JQmV0jGdZ>g#xToO4Z{-Y=&g$sjlw4 zr$V%e@_e^#PgufA#$62Ar_+KE5E1i}m*mp}Krvn38|hI+cjUa#=^jN7~{f!Qct7D!We!mS*T8{emu4BP~~c;)ZUvk;%QspvgKbS z0OZI@OUDXO{Q1$?b|}@*s>N00TwpWnO_Wyamlrut>VIZ)5XCHbhcp0XFbL(?Q<^Qe-( zejCZJnZ6%>;{x@+0Yf-u`3LSuARPZaui@rBOe&Y99$o|0I6B_>Heo;bXQ*+^0dSr*{$u*v>Q*i=Jp zp6O(Kymw3k(+K&;cEi^Q-IIJkAmDQNJIqTeD=T86GVERQ5 z8khY01nbKs=zA9w=imSTB>^E-R;J4YuE{c)Ka5#lHW|F13i)qjO-o#pF8^OLWzHB5 z9sO|^DCU3USlrNLMR@}zI|dw~7~md;AZnba{p~1qrqw;U)k+{;mbY62U{+LP{Xg>| zafgkW{&58Ja%Jw!s%~7I$1~>wpha1YX^H^*S6i50HX+eXOMfDw%%&`Hm9A;&>c6Q+ zV*WR_L9IoxcmAPY`~PU?|H>%$+rQ|igxcdxR_cTD#V2auddWK^LXX$m3CQ)Z+!De< z1iY0b?=W@nra_HwdmF1a{*?dr+uEpRXbYk~Qn0Qs_Y&@4ek->Aa#~VfJOOl>6p1XX zhw7rB3ZvUSolxAPjMjilukj?GYNY<$Zs@wUo05Id4x$#B9@INR>S>?FDuki1qVBJ? zoAE2IY(WuD2elL2n?c+0^=rhsx!KO})}f?a(n?=YGx6f3rFxtfaqQPi2eL!6$nHWY zVWXi5v0c^G`6+iaehrJ#FG_0_m@jVUS-Taol?4xZ_PlE(=tF7b$oG9M&uv%R_XC7pGC8h`>5!gR5N8JQrr`qq)SzpUy} zmc@&?YktJbPowl<k=Cqk0Z1>En6GBtWC(^kBi zeWUJiFDpo3_A*%Xq$#A~@uR_k{?a8u+uZ=Vor`>DDgwMAe1j(XOCOL*^6w0ye%*8j z%O|JZ18%Z$3ad;FE??-(X2a5K!u)7vo9Ed&Es`mKW2AwK&y`$0pP2#|`;uDWK zXXaQMFkeE#wm&eH9Y3B=h-6gi)a5Q$z5VZ`rAjmmP24Pt+VeTIR-JZ70ur z{~R9~jy9&JTa*8obNpu#3d~&)bSs0ijkERfZq||_O+xn9#_!J4QEAys6$zi^cN9$5 zO|;4kya+t5ebWTi{HBA-jm#g90%eE;Z?DJb=**PAg&40TZmzoid^iv>Qe7U>fYqBA zxj?6A0^8Peri<`zb$B6Q4{6oY)=RWRY)CO7zD)+_8B426`&WwiqwvFl6S!+_qmFh- zjdYx4ww6S&&@Ix-H)?)YA=W=0f;P*_gA{I$@e#*8ZyJaAi=2zjf5B;cmy;0v@NPbY zl|X>bX?)mxWv1S?er1H;I1!$L5w`pEiH;DRCqWXEGqz=aAa1r6h15>a>Au3>ChEbS z$gW(X^fOd(Q~!8B45ex8ckC&C`jsJURnAr&FEVEseSw1Lp1j6)YsY~Zm7Kh6+ z{ZoG~M}bv+Eh>qO0rcPQ2ZIfCM5#B1f2TGL4GV?&@6VkhLqLy#5cTkafsk&X4h@al zP49qUB}MADjrozI+%&(hV;LL^fG;y@M`&okM`>u-ezTxF?;N=VK%pX3E^bhvBXvL& hRPIo0*26Oo1Sto`C{=~)9|y944k+lvygqgFKLFzelKTJv delta 7472 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 LK*w{`DZ>8)v(-n) diff --git a/pydantic_schemas/excel_interface.py b/pydantic_schemas/excel_interface.py index 49c98dc..e4bb5a8 100644 --- a/pydantic_schemas/excel_interface.py +++ b/pydantic_schemas/excel_interface.py @@ -1,5 +1,6 @@ from typing import Optional +from openpyxl import load_workbook from pydantic import BaseModel from . import ( # image_schema, @@ -148,7 +149,7 @@ def write_outline_metadata_to_excel( title = f"{metadata_type.capitalize()} Metadata" skeleton_object = self.type_to_outline(metadata_type, debug=False) writer = self._TYPE_TO_WRITER[metadata_type] - writer(filename, skeleton_object, title) + writer(filename, skeleton_object, metadata_type, title) return filename def save_metadata_to_excel( @@ -193,23 +194,47 @@ def save_metadata_to_excel( new_ob = schema(**combined_dict) writer = self._TYPE_TO_WRITER[metadata_type] - writer(filename, new_ob, title) + writer(filename, new_ob, metadata_type, title) return filename - def read_metadata_excel(self, metadata_type: str, filename: str) -> BaseModel: + @staticmethod + def _get_metadata_type_from_excel_file(filename: str) -> str: + error_message = "Improperly formatted Excel file for metadata" + workbook = load_workbook(filename) + # Select the 'metadata' sheet + try: + sheet = workbook["metadata"] + # Get the value of cell C1 + type_info = sheet["C1"].value + except KeyError: + raise ValueError(f"Sheet 'metadata' not found. {error_message}") + except Exception as e: + raise ValueError(f"Error reading Excel file: {e}") + finally: + # Close the workbook + workbook.close() + + if not type_info or not isinstance(type_info, str): + raise ValueError(f"Cell C3 is empty or not a string. {error_message}") + + cell_values = type_info.split(" ") + + if len(cell_values) < 3 or cell_values[1] != "type" or cell_values[2] != "metadata": + raise ValueError(f"Cell C3 is improperly formatted. {error_message}") + + return cell_values[0] + + def read_metadata_excel(self, filename: str) -> BaseModel: """ Read in metadata_type metadata from an appropriately formatted Excel file as a pydantic object. Args: - metadata_type (str): the name of a supported metadata type, currently: - document, script, series, survey, table, timeseries, timeseries_db, video - Currently not supported: - geospatial, image filename (str): The path to the Excel file. Returns: BaseModel: a pydantic object containing the metadata from the file """ + metadata_type = self._get_metadata_type_from_excel_file(filename) metadata_type = self._process_metadata_type(metadata_type) self.raise_if_unsupported_metadata_type(metadata_type=metadata_type) schema = self._TYPE_TO_SCHEMA[metadata_type] diff --git a/pydantic_schemas/tests/test_excel_interface.py b/pydantic_schemas/tests/test_excel_interface.py index bd43dc8..c7f4807 100644 --- a/pydantic_schemas/tests/test_excel_interface.py +++ b/pydantic_schemas/tests/test_excel_interface.py @@ -15,7 +15,7 @@ def test_metadata(tmpdir, metadata_type): ) # Read the metadata back - tmp = ei.read_metadata_excel(metadata_type=metadata_type, filename=filename) + tmp = ei.read_metadata_excel(filename=filename) # Save the read metadata to a new file filename2 = tmpdir.join(f"test_{metadata_type}_2.xlsx") diff --git a/pydantic_schemas/tests/test_pydantic_to_excel.py b/pydantic_schemas/tests/test_pydantic_to_excel.py index d2895cb..6207851 100644 --- a/pydantic_schemas/tests/test_pydantic_to_excel.py +++ b/pydantic_schemas/tests/test_pydantic_to_excel.py @@ -407,7 +407,7 @@ class WithDict(BaseModel): wd = WithDict(additional={"s": "sa", "a": "va"}, sub=SubDict(sub_additional={"sub": "subval", "sub2": "subval2"})) filename = tmpdir.join(f"integration_test_dictionaries_.xlsx") - write_across_many_sheets(filename, wd, title="Dictionaries") + write_across_many_sheets(filename, wd, "test", title="Dictionaries") parsed_outp = excel_doc_to_pydantic(filename, WithDict) assert parsed_outp == wd, parsed_outp diff --git a/pydantic_schemas/utils/pydantic_to_excel.py b/pydantic_schemas/utils/pydantic_to_excel.py index c4095d7..dc69560 100644 --- a/pydantic_schemas/utils/pydantic_to_excel.py +++ b/pydantic_schemas/utils/pydantic_to_excel.py @@ -510,13 +510,28 @@ def write_nested_simple_pydantic_to_sheet( return startrow -def write_to_single_sheet(doc_filepath: str, ob: BaseModel, title: Optional[str] = None, debug=False): +def write_metadata_type_and_version(doc_filepath: str, metadata_type: str): + wb = open_or_create_workbook(doc_filepath) + sheet = wb["metadata"] + + sheet["C1"] = f"{metadata_type} type metadata version 20240809.1" + + version_font = Font(name="Consolas", size=9) + sheet["C1"].font = version_font + + wb.save(doc_filepath) + + +def write_to_single_sheet( + doc_filepath: str, ob: BaseModel, metadata_type: str, title: Optional[str] = None, debug=False +): if title is None: title = "Metadata" sheet_name = "metadata" current_row = create_sheet_and_write_title( doc_filepath, sheet_name, title, sheet_number=0, protect_title=False, debug=debug ) + write_metadata_type_and_version(doc_filepath=doc_filepath, metadata_type=metadata_type) current_row = write_nested_simple_pydantic_to_sheet(doc_filepath, sheet_name, ob, current_row + 1) workbook = open_or_create_workbook(doc_filepath) correct_column_widths(workbook, sheet_name=sheet_name) @@ -525,7 +540,9 @@ def write_to_single_sheet(doc_filepath: str, ob: BaseModel, title: Optional[str] workbook.save(doc_filepath) -def write_across_many_sheets(doc_filepath: str, ob: BaseModel, title: Optional[str] = None, debug=False): +def write_across_many_sheets( + doc_filepath: str, ob: BaseModel, metadata_type: str, title: Optional[str] = None, debug=False +): children = seperate_simple_from_pydantic(ob) if debug: print(f"children: {children}") @@ -537,6 +554,8 @@ def write_across_many_sheets(doc_filepath: str, ob: BaseModel, title: Optional[s current_row = create_sheet_and_write_title( doc_filepath, sheet_name, title, sheet_number=sheet_number, protect_title=False, debug=debug ) + write_metadata_type_and_version(doc_filepath=doc_filepath, metadata_type=metadata_type) + child_object = subset_pydantic_model(ob, children["simple"]) current_row = write_simple_pydantic_to_sheet( From cefd80b1f6a810b8ea84a5041eefa0e529122b61 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Tue, 13 Aug 2024 10:27:34 -0400 Subject: [PATCH 41/51] 100X speed up excel writers --- excel_sheets/Document_metadata.xlsx | Bin 37599 -> 38853 bytes excel_sheets/Script_metadata.xlsx | Bin 39002 -> 40331 bytes excel_sheets/Series_metadata.xlsx | Bin 12780 -> 13580 bytes excel_sheets/Survey_metadata.xlsx | Bin 54839 -> 53804 bytes excel_sheets/Table_metadata.xlsx | Bin 37129 -> 38933 bytes excel_sheets/Timeseries_db_metadata.xlsx | Bin 15836 -> 15568 bytes excel_sheets/Timeseries_metadata.xlsx | Bin 48932 -> 51082 bytes excel_sheets/Video_metadata.xlsx | Bin 16443 -> 16591 bytes .../tests/test_pydantic_to_excel.py | 124 +-- pydantic_schemas/utils/excel_to_pydantic.py | 9 +- pydantic_schemas/utils/pydantic_to_excel.py | 759 ++++++++---------- 11 files changed, 358 insertions(+), 534 deletions(-) diff --git a/excel_sheets/Document_metadata.xlsx b/excel_sheets/Document_metadata.xlsx index 5cb330d1d3efa38d2ebc69e2afb081e58f37954e..8b91933a455d25b5969a048f30d8c67e6d9bc052 100644 GIT binary patch literal 38853 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 BEtdcQ literal 37599 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 diff --git a/excel_sheets/Script_metadata.xlsx b/excel_sheets/Script_metadata.xlsx index 971d58614b9e508df62ba7561074d5c098a0dfa5..66475c7a5ed9db328dffcb7b43ba5b5460404a9a 100644 GIT binary patch literal 40331 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 literal 39002 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 AGXMYp diff --git a/excel_sheets/Series_metadata.xlsx b/excel_sheets/Series_metadata.xlsx index 7b712666ba995cd6bdcccddcbb226649c0e35ff9..ba893f3a196c7b5a6b3dc69cdfd2689f2e080ab6 100644 GIT binary patch literal 13580 zcmdUWXH*l~(l%0*D$)dLLFv+)bRtSodKFZf6agtgP&!0Vid4}k2uP8pAPLfYXwoqv zozQzRL=1$QTO!+_|SURAVyg5#kRc zDuq3s?4wcSK+k}HPL8+YPcH~mrf6=8FL=mEchFrP=G|B8>CTSHUI>CpO@_sNWT(#s zaFeyZ^%!{+Aw{duJ6Bb*Iw-E?{1EZ#ieIUcu|VsbrL59NK|s+2C-s@-Kz_AYCSAp3 z5eh=AX%CBO#!@%v(2)Xus+QI0A5(w|fK1njL+?33Lc;LhQ*Z!zJN=wPUXs3Ht0ZkC zp&Jskp8rOG`C-i?g|H`Wd}peJHY=l-u0A!c0~_A1JWVd2uz9fivAA4`nu}2_?~GK^ zr+Rj)<+3mLdlEE^NgP8o3cM8=Luq%;D{9WmaPeHkK~GaYH1}vaFPw9&nNM`i-qAU) zKUO+4*YhkJ-Dvhz!*l*!v)zmW$prV57ZIGL*6$k8J&mtx?(?38CDJ1>KO(kYLq<9s z-O9gEu|)6{#Ll^{+}ge2jwpjuyWE&3S1*XZ?R(uO6%UT!A?h4g2EnjP;;tzZ6zk&gA3ji!6Wr1Z4n-V6cpL4{%I+0)}f}I@9xt4)t8W zHcf?GboJn~ruOoRLI7q%+TvsJAHDe*o$Dl5Gt^oGEi8@curs9?> zNvlFg7ZYRaM0hNvu0M0nu+_|Mb_w3$wQ}U-jVG?|*=*X5b|E&RE|0lLZ7x5eR;6%DjfQQ7=%Xhfa>;r)jY_A#!y zNp-95mK%ys8Sw3&$cJ6Oo_i&$<^ARv#c2}xwthXMV3>Mk%uLJkuU5~75yBNl?3AgU zVcXi_=RZxraNEgsUAZ!WZ$gwlyFtLNMJEbSb!mtfhdwI{nFTLK^sjvOsu!i&Jm9^3 zCrZ#$naNv;)A>p;0*g(`O`FB(DqKvA zeGrXFHO0*vn!L-nsQ;YISs@#zDXze6PW_H~jHUCVe29tiZU$gnqS!8jg9xqMX# z#8d30%TaSCad443bChYFf8tvAog2oNkXqcrAaX^`{@f*Y?~1cwmG|F2vAf0C-tTYl zwVdJb<_EbKYIdF9`jQ@g9!@&V@Z3h8_}R~~&lup`kqSDgsJHhm$#EGrt=F4Z!h7!G zszW1(WZXp)cC-gsbr$Fa3V^H9vZr!VZ&Ecpxp6PEFiKYK9k(?&l}?0JP><(O3U+h+W}N+d_-1U$ic$9 zud~Ap_Ck16F|+9#&P6R_6SY6a_XL)DQ;hfQGu^N3| z$1rAG;qY8F-PU~RtagW5Kz$B`q=Ab zz}-Wu?5y&ftI{uvOYQ(`?YqF6Cuy2|wVM4(Bbi6-n+YX_jFhAr>H(8ypw_+BPyXz4 zieuz8At@Ff%cK4M2g}XIB{^u7S6m&@Ki;0-$c{`wv|f!02(nFae%Wp$%k1I)flpMc z%C353Qd3UE!CO2%Zi`uU}f`v#`fjJ}ohq|!BYithuRq@44AOpDP{iQbOB$vCHPjT%}` zONRzt@ZC@LYqtA=^Xk&3UsPVU-Lk$44aH8*?|Z&bzNVKR@QLBX15Hximz*chvPv%) zZ9IQ=lIcVrq)X#FX}DuP=cAN;nuZ^=HNq^Pi`5jtnxc;*4Q#&hGcw1N&{CXd^`1wg zU)=MH8`&2P^LSz=?Ks5Ref4Rxs*Ly5Q8RuFbX*(@=MUd;_{4vC3*#8714SPL`U z<4;#E584dlNjn@y=3*yjXoClfZsj?OFaUK=1p}U+bcnmXC2O0=Y+s!JvABI)iZ02v41N%Be zFDXV&IaVa&hI1FyE#>RkcU#wI)t`Wvl8#-@5BgjHu}W#0T5ddTFpvLCDeZh zA9axEhwSmQ-PoGlkD3R7RSsrb7l-60rkkP3L+sUb5zbf1| zdO9kHK+USH4TDdt_6R<-Kms>1C-EDY9ZU}jh0X+Co5JA^06_3fFtE&UnNZ3FX97G}MZPB>hQ{d{_fPM5L;qU-G zzo%;8l{gREQNUxlVWDlRHX#iiMFk-2YV5&}VrwfkEBt&x9TM1BcW}6xNWZh!o(#{D z@B<$vKt0t6fLp)`)wQ8{95>z=goak`OfMp%di)Z12&++19j9=5zny5iF@oAx+Suu^OVeEk}PqK8&Mtl z`#x_H2v!C25}E!#P`r8xANf;k?bKRTT7nY-;sU}0V)jTev=~kdDTaTEe@UcQq}Q#N zqxW{Na&J)YND4?2AW5&D)kdKy9_Q#Ou>ix!D5}<~e z8xQlf8~h_)HXX~fB!eCW?`!1kr!RmOa|;nK6%?x(<&y!G4kGt|wCJSU@k=I3W;$>? zWY}fcH#VuXs&v#h1wRdVx<`$n#;{{fV$NbtW4JMLOB}tYdas_*BR6fnwuHSgw}p7A z5ORm#fF9abXB#?9A2Z;5d-G6nK)CV*h7zN=B(+4fB)mk^E7R-KOVgX2lAHpQBtE1- zk{~IxBwEVWp|Lr*Nrk*w<0p`wAdb)YiO4e6%Gqx-mx4!arogqx(9tQC!^733wL9)& zpG(d&*W&^N_O+?leA^j{sFmAkDB?Ii^&)?&%yg>MSJ3gNvj{Ep! zt#o(^!}2NlISjfO9C|DEW4uC#R=NZ4A3=I)t}l~gb15R;-)Hx-{lWUsyi9%(GA$Dg zu4~{3S=&14wt3PmEa1r=Cx#6}j$y`7ES+0YT%uUg?bYqINU=y6Ns&*fO7TnCNr6dC z+o{=chud99q1KYFsyeF;+$gLA*jmQHGQYz|HbGEavqVv(@KI)>^ z$lu$Y?Dpkt@ zD(T^qjdcx;A;7@S&Fv{(n%42u2DwG?WrD1WOZv?T7Y<*6+2na00ASis%7ARjW|EuuQE)$9S>> ziiU@=m*OK2LvDBk57R>Ul@ex1_{%KD!EmiF)Jp0SmNb{b)z6SRU3qQN{3cS9=?SoUR0c;eg547USp47s9VevbKe5Jfl7vuJ??Fy4l2t`bM~p z5e>V#$O?Ibo!BVlNp(sHm6Ogn-Ff`yZ{wJpTiFi&Z-e! z!*iA|+^pn`W4M(O<*RU$5=OJ|TVE(|sSB=9xHW4@QeMf@6Ef|#WZ#j$YXJo`3_<~1 z(2-0V@Bv1Gm>8zD<+b<^l5Y8`^QF+(t6#WAL8C6vNfBWuEJPuq&i{@gK8xi+xJ}7f zck;(P|B-ZWmv{U7 zv1U22W*uthf zK-|#A!wq+L*MuQFpa^#?d&zf4@BsKA9suwpz;C8z0tqHF11{HnKCqHEeDNx7h0l^NJYX#vn&3Z?gREy}zNU5Iz zbKO@Jzo|=#7S|Qe9LRb0IIzV%iF? zu;XPTKW`+!{L6&7FAIJXLk&hN4%K9sW>Ytu=_OCH6OX2N%EKZ`{+frCIXo|m`2+dO zth2J=H@;8>Hs2~?pbbAG#6;c7_LG*#>TK}4ea*{e2m|g$B)+x*IaU8jMilbKwE3vW z+&N43mo4zkL2G`(TAmJmXjW$mz8sP#U?a(NL^7gvU?Y+m^jqq#g@oKD?6mx5<_1)Y zbuj>?7RYjE>xay-sOXOG_Q8A~>)EBxAnhM+LY= zGLo2a(LK;$@OFLhw6Z`zu>)gzZ1DMGdhRLT;{77b;|@OhDgbOM0q`^nkxng6ezajw zm$Cf|;jxMhn2iz#(dEi!;iCO3riIIbO^MtwGqih0UGKm0GvRY=-7sz;k0@U2cm%R4 z86I5QSkIw)3a`;ucTA258IwZ`N)Ux$j0t_qG(~Z=S#>}81+GLl^gd8Av{FbO!TQtp zdhsmyK$Q!}2H1MP%XIOb0~VId5bC!liJzNhdhq%W98VZAbpoHqG-7C@a3448eb~2Z z@SwZ)n3$N44WR@jh!VAqMfI)7aT`A93p^rYN@q*P-4TsHh%I#+1Ayiz7xc7woC9qr zj*Up)Uf23#Z60)06&fuL#QSbzmks4D=3$O1>OqPuR+M*-lp~q%O8puSvUGja(580x zuxmCJvHmhn5CKyL-T-Wbv`n>=9F4~z!cN4Aag@1D7~0&MFgz{40Rm0OgW{kH$4mtv zQv*NEgH>Ik%)Z6V+5)uY7tL6X>$&=4=HChsBG|NLjvwS;RZrk2mRgA;2Ib%Gi*ACd z0z)pIqnC{W+BSyNHNXjb`)erdQs_7B)&*v+B{Q$1l10j=roZXN6&SL5VY47gf)U|t zQLAzIKJ|Fjsj06%5gnq;=5tBdshA@|3kSw2j+QICA=1RmuQ|5;t)N!+@Vz)4xKOv1 z=4j3Wp^CUe`?ClQvyKQ2#D2Zgxy&l5mH-A6pEfkUV?eA``!``=Ya`WI)9NiU#os3S1sy(4iqQwm2;!5ixK-xX!1uc;oJr+T3dL_-ch)rpVm z(bmUxwgyc_r1>{zqPIEIOYc#GRqcVTNPF8O2H}6<8W4&dl={&(p=N_S+`ys==#gnr zx+)Q=>DkSHkWwBJmpM_M9$2-%Peqt*?i>jsY%301u-#<4e4O3T9be6ZF=8~1&A#P2 z#p}E_h8QfPISwbpmadN>GIqWNo#GW#V(Wi-++`+);T52=s=wrq1FS80Vyc0o_%y=E z_76Pn)i)h%Sy^(1$s4XdS3vQ{1;f<0VSm1FQ_zffSYr6Dv8B_Hrs=3< z;IHJRTvF6c9Kikod|GpVZE2FYS&u^2Z4$}#Wc|#QBNpzGv0=a1E!o-uzn>>FU<*)_ zu^xFIRBSqM%=IDCk_8bJ{u$z+$Pc#{C6Md==KY#8$20@$CW1>mvnfpHvSKmgu|><3 z3LUfbXLTAWhKEiS|I1VCN4BSrIS69xNq}*KY-`at6e=ol#3ET9qz$XwWk=ho9>2^8 zDlO`)z{T?ga8Uhl*Fu$xK4UPe~iT3YK^-UJ9t)1C3itex;a~myO z7l}K}BZ^lm9)X%{I6X4-@tEvl`^viG=f2E|xGxh`vH}jgB{^P&VGFVD2!$r#thf$p zlzfj_S}T{Vk0KBiWRKn-G4@Gw*#2FeH9>*Ek=3Q}KhQ-rrCE#MwOHL)^^RH!v3+X# z`vm2buj&p*!$6JQ#ph>QO-CjFFk{+Yd%M35 z7X0i+^np`tr%CdU>Zft`cKpWEJx7$QDe0 z=qz#;dCQ(Eoo8iq7ZNR9&<1((+~h1I?zt&-_j41I8;}?iQ+6HQRUuU;{V}7HI$qZv zo3e8bNTv>eZY(T}#iV;_@|bp0IB7i<^3l<|E+p)v-X)}%mnAC9@1*%&NG>nC9Fp+W zbQnVCltmsTtB}_$MVF(9yQ^uCSsbn7-VO0qe{FoBJDt&#QAg*dk+hD1u#m3K^_#{Q zb@W|@#PV{sAaYJu&j~f3r!#Q%(ra}wfZt3iBaS&C?a#)%UB+TeVer~STu4So1 z&Xw!JG&)*c!W2%|g@r|QG~Wx;<>ftqWR&K+3z6|FNj(_CPWxlv*RPFyET|1cvT=m(|yWj5gv9Ba5adK`;QwsR{(1ZcOup!2p063_1a>hfG@sEoY)})$Y?^ zzk?n^z+qg$>QEmJyOCXso5$0rhOiOV=dl~aN_(dOQFFNE#bIp?bVoM^f5stEeT$Pr zC?0fB?dFA^;X^&u|e;F>8lT#ez*9;Rn^KMNd+ zG6VoOmqClzjaB7>?eqVvGNgOR$VA{HYfI`r7djdoE4sAUF z#6N;-_K?^glgpr$4)~kU&_iSt5V(8jN9aIJqHXal_)P-IKRa3ud}{sq$Vf;wh`p|K zzdBlc9t5~M`TT5#oV4@+rAeN_i$nt?8C{H1uH?qQH_7uTEDs&EV50qa*Zpp~_!uk` zA#nLCr~ZgRp%%n$dM{w((=w~m*qUm=^d-nWkcCfwK3;2mDdbG~I$iPg1A|LuZ2H3H z`sJ&I7hO0sulJL_TT)j@`=qX)^4&uBV=?I7WT0COi_*4pBkPA(dCZSj#{EcTUJVWg z@u+OewA_TIaOmA@-!b66)pg7Jy^2SD_IqH}TWl4FB)WFyUWd8N`Ij$GevUinQ*M$v zT-$6)vM?!s{sK$+Ttz)3tlvxJOXDpvyYwB!m|#ImF^;!#=5y^2I6HL!>$O;1qm*JH z^BAJljo|&{=?fOS@^1H1^OtE|X(6SFi(SV0lJ+RnSTdDJa$!~>{kLvl^bK7DT{{0y zh4CIPW0txmZa1$M+2uYDukNHT;jI>%8XVy;4JI3Tzs0br+hyQnD3z)8bRH2oA*ZJ_ z0>OYt@HSY*H)-h`I*8(WWQ(|xP~p`9J&lnEveu_)<5oHMqUHCLry^Ca;qJSUGFB3N zMC2Mw%N>=G(=Q*BvEeui1oc~Y{JOoMa%4=H9{p5`FJ!9XBfxj_6D4o6-Xgl8^+Mmj zr#k}_iZt{m>s4B%yqf~(&0H%Z<6F#P&^VLangZoXw1nwY1ZceO=|qE8zXoN{dgdsq|tjnnT5ES@^SZAqYWBYG1V`sgOt z&nKU!)r}^dkSWaKAM*~G7BL08fU_x(!`Fdpr%Bhf=uil+{oeUmC8szk<1budrBJui z*c_%Q)eRmMPs}%8paU5Xlh6_hw+m_yJmxTM)FMzW-OW;JgSO_@K!}uT7uUH{BPk@rM({0L=2;| zq$DIX#8+EyCwCtS@t@Ccp6hy&O3_}1F*@1my>BCx`Y>8@HJYaS>2l8Nwj_tPEo}T~ z6ORjnE+HdB3`Q@T<;&@V%yVy-Y_l4>Ay-UN>LzTLasRF5MLFHeV%f6KzHE=45naOY zcZ#)o4p-^<9A4j|PFk<^DR=UtX5K!r3vEs1)wz0W?EWJeT|(akf_gCZ4eZ0W!veYQ z`MsEJo@Z~hHN8Z)l5+K8eIYQljLF7aOrC>%x&QPE0rTY@v+5rFjbz@_uOpgN0-%yT zihuG(&Wo`*8Df9A2yvqHzj)(kC!9S9!5If8@!Fk=MzIcXT*ITzqd32rf z%+;VBcE5^OZRT^HB``r(VZFHs!H$vPt_GX*QGjo6)VEf4)}=S7K?AZa{Af+-U$+Ye= zsk~I$$6|rmYl-#OFHPTJ4b-&Tc_p2E?}mn*zS=c-KjwU@ioF$gt-)?aT$XLv%;RM! ze-&CvN-H!e2l&ZS=G0kTC*#YHFMBf#Rd91&*RWo|_{5OGho`?J<$e^1+E;vgg}u$n zT;<+HRoB1}nVNXKvctw(>|6%hR$|2_v`6Bf_{yx$*A^3TJs@Jt{tMq#}h(hu&Q1`>B>3X3^-TXnV@GZcA9X0JbzVA ztvEDMVUu1m_ygeGRY&2Ai?|Z=}7Iid20{v$tZYTUKfuO`PM}9q|G{KDbpVG0F;O<)yeuu_fj{f9lPUm$X`_D zK;En5ta>BhDl;JB^3bCfmXVYhybrG#FcR|LM4ME2pPCD;2|jbtpVW|In|&{^BJ9?N zm=l5vltb0n&1BhIRv`7!*}NvMpPm2d{M^hoz0RhlP>pwIbGwF>*OiQ?WzpxiL}tx) z10O-+BHcxp8m@J?zAYnNbve<~!|q&5`_O}VB@3INs}o0++kWyzu#OT0{Yj_BO=28|2>x9wST`f z@=KS5;H#~7QY+#y|wml1C?Q1lz$oc9~*6dxAJ>A z^S6~pC(sxFvhtte=6BWKsrx^wYU2MO^4}GIr^5dz3QGKYz(W nU!wkZJHLn0f9$wR{f~iVq)S1(2}43cMSQ3cNxWM6=ez$06&SqC literal 12780 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 Kh^L7D`1N0bu!?s8 diff --git a/excel_sheets/Survey_metadata.xlsx b/excel_sheets/Survey_metadata.xlsx index 768a65e59b52027a2266f9292fe10ed2b10283b5..3be5d6f6f46038fe3590ae299ac18b95c354559a 100644 GIT binary patch literal 53804 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 KPEW5^p#KM!1MEcr literal 54839 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 diff --git a/excel_sheets/Table_metadata.xlsx b/excel_sheets/Table_metadata.xlsx index dec1d9e5a1531ae8d16a6372763db32264588984..ce38e330fffda5fc5fc0b65992bf1d96002aa1a2 100644 GIT binary patch literal 38933 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

T?p0?%=Z}c$7o%PU@AndYFD>}h=cfN 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

;L)3GzE`CXUM zzM#mc!$qH~z+dxS=rzAO@f8HJkj2pMW#i%hr>--BhN}JJ_#I*_ z8T-61DO<@fj5Q%cMz%qSLdw>p*ESeCQ;G5AAqoC-RDiNeri

7{I~QD!sgHUqJ5 zNjJ45s1dtKOj^m8sKF9pGo9?NoNaTC35vC(naCFmI}TeD>tTN*N0ImMSTE&L(9UI5=$y4T`W-fHMDQ}FdOxtnBXT)rBuwy@5Yfk4+!`+CL7-{;hdi9k#!20-(h-EE6#siGNg zbz37}Ym^-bJep>D+|=~R;q%2NsF+tle8w^R?bs#J1pf4O2pOz)_+gb>u2Fx#M&gYT zlnIY6@4(?e~H94@Mluap5iTaKomBE$*VW9{T#YWM4_`ZKl$ar_3xuw5ux0Hs)@HhC1CTu9{eUW<$GLaWDNU#ijko)S4;OUR7D% zfS8azIa>yMe}21f5Oe$t_Ah(Y`(Mv)pK`9 zzB9+>u_{ip@B)KjlyhJHW13)R&((f=Ba(9RQ9snZ;J&{5#F`-jeh#*wdmO@L^x!1ReM6Ud8OP~<<&nveSaFn`y@6Uw5CwNt2Z+xXkst}3!X@EyASId zL4V?&MLDruyLD1Uw?4DBekeC-QA`KyY39wGF>W@P2@5nAFnylAoT=-^mLjdo7XF=S zzXnV?Ta2yo4|A@QET9f$VezUCO)HDYg76%+&;}k^D>l(fwcV!#_E|*c>%>Iz?#t(Z zdPH+@F*BXCKIy2|8$s(Bn#WySaTpyC{e4_k7|h1j)5jx}2>|Hd&wzt3#si0t-#%v~ zpuLzB_v@7KVH`}JG%_g`_Lrh=aaP7mW~Vk1TpGW8jqk4)yTXg!diYSTgj*#uKm<3G z>(Q*xXg_dPwFoG8hdDmR?R^gsu z0yzX$LEnlS(j<*hb^|`)%IGc1`z{V@T1H9X+(w@2(&LVmRk6E7gHzt{FN7SExPZhG zoOE_V|w46Vwb{}uCx69M^$r5*KdOWpq1`~xPLmJ zK&-F3GZyQ0%}o6(Eyu=u?Q#>Dso_{53d?LqbRi~OF*GS(ojy8X z=-zR?Og2@!t?R^a#_<=_4nz~y75_fUm?SYwhG%>AoP03~!7rEOYlD9-g_y;1*?8aV^3l-_*Ly z+cgsATOC^G+@2cNN9iUaiIXUq(ac22rb zFC~)7f+T`Vd?IZqVrTz|9cZyw4v`AhG9t4EygE3o=&T&kZ^AR>rXn@(`=82;lkXu1 zv`YpYQHLlM`{D)&x6Sh6x=zoXlkm2b}+~mrD{*`FQO51B$!UU3rkb}6Z@WMP*>d!|_9)@pa zv|R@$CvToz!de{GvjB*>JaWuDO}YYLF+27i8Nfn9&j=urc#5vUB(6R)>yaD%cx?yRhAp zDc0>~4GKIPNz(6Rd|>8>sb84vv%pvD52rWBIxKskzpr`l*|A&M6^Iegg+Z>a&6)`{ zLBqlI`HF+i&~tj57uh;w75L6fzVyxYducfOu@ri7f@B|&Vw#5|XrdiqS;>+Y6n$(iU&WMk9LL!ouk2~pz#ANebm^QeH z|J)AMHD}S26`HaYj*8Le%*kLiIgJzXnSO0KZeAJYQhDT*s1DQybhqcP(;DiMrY9~< z)t!sr@>4k~C{)GKDVYcTdj^iCvN1hTjy_?iwDyT#H$4c{gl!6bwJ1-$ASGRe z`Ib^Q5%#H$+Ufz_wujJD*y(BP* zNdOR_+mj6#^DEf2&=vzL>q_srC;fc~}A9!O@>h{EH9{8l?m2ag*N_j3?&jS#d7_ z+q(O3E`8VFzL1}}&|d)ZbxF1z!1l1gUBO`daEP7Do)pHy$h(wHx}oT=!ARLDlgwxf z#wuOAlnRMGDLXa07%7bVAa^P0)_YQRc11E$7}qfGQjR$9N!eM^%t&Ee1F}nz_1u%P zvm%6%!kDk#r8EWYN!iI>Gg26X>R*&_(B;S-%5I3wC}o`Yccq)rzeNFzLdJP?S2%g= ze{cS4R%H}3dh%T{F?L7%fBZTlhtUo0a*E>ibc*I^7W$Cdp82_fQF;Wx8^3+`Uu_p^ AzyJUM diff --git a/excel_sheets/Timeseries_db_metadata.xlsx b/excel_sheets/Timeseries_db_metadata.xlsx index d0173b7af1dff58c66260afded39dabcdc2ceda5..bab0859458fbdec2355307368910476e11f7a138 100644 GIT binary patch literal 15568 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 Q5FhYw3Xph=;jd5s0WCL}K>z>% literal 15836 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 diff --git a/excel_sheets/Timeseries_metadata.xlsx b/excel_sheets/Timeseries_metadata.xlsx index a3a6ffaed11ad95e70402e5ba7046a8f54bdd546..0d3fd1ab01385ee8bfa1264fd95f011f628e6f45 100644 GIT binary patch literal 51082 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 CnA;iv literal 48932 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 literal 16443 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 Ymbx+~a%mh54F~xvfduhY@t^Ph51*=rlK=n! diff --git a/pydantic_schemas/tests/test_pydantic_to_excel.py b/pydantic_schemas/tests/test_pydantic_to_excel.py index 6207851..ef64653 100644 --- a/pydantic_schemas/tests/test_pydantic_to_excel.py +++ b/pydantic_schemas/tests/test_pydantic_to_excel.py @@ -23,19 +23,19 @@ ) from pydantic_schemas.utils.pydantic_to_excel import ( correct_column_widths, - create_sheet_and_write_title, + create_sheet, open_or_create_workbook, shade_30_rows_and_protect_sheet, shade_locked_cells, write_across_many_sheets, - write_nested_simple_pydantic_to_sheet, + write_pydantic_to_sheet, + write_title_and_version_info, write_to_single_sheet, ) from pydantic_schemas.utils.quick_start import make_skeleton from pydantic_schemas.video_schema import Model as VideoModel -# @pytest.mark.parametrize("index_above", [True, False]) def test_simple_schema(tmpdir, index_above=False): class Simple(BaseModel): idno: str @@ -44,25 +44,13 @@ class Simple(BaseModel): simple_original = Simple(idno="AVal", title="BVal", author="CVal") - filename = tmpdir.join(f"integration_test_simple_schema_{index_above}.xlsx") - sheetname = "Document Metadata" - sheet_title = "Document Metadata" - current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) + filename = tmpdir.join(f"integration_test_simple_schema_.xlsx") + write_to_single_sheet(filename, simple_original, "simple_original", "Simple Metadata") - current_row = write_nested_simple_pydantic_to_sheet( - filename, sheetname, simple_original, current_row + 1, index_above=index_above - ) - worksheet = open_or_create_workbook(filename) - correct_column_widths(worksheet, sheetname) - shade_30_rows_and_protect_sheet(worksheet, sheetname, current_row + 1) - shade_locked_cells(worksheet, sheetname) - worksheet.save(filename) - - parsed_simple = excel_sheet_to_pydantic(filename, sheetname, Simple) + parsed_simple = excel_sheet_to_pydantic(filename, "metadata", Simple) assert parsed_simple == simple_original, parsed_simple -# @pytest.mark.parametrize("index_above", [True, False]) def test_two_layer_simple_schema(tmpdir, index_above=False): class Production(BaseModel): idno: str @@ -82,19 +70,10 @@ class ProductionAndCountries(BaseModel): countries=Country(name="MyCountry", initials="MC"), ) - filename = tmpdir.join(f"integration_test_two_layer_simple_schema_{index_above}.xlsx") - sheetname = "Document Metadata" - sheet_title = "Document Metadata" - current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) + filename = tmpdir.join(f"integration_test_two_layer_simple_schema.xlsx") + write_to_single_sheet(filename, inp, "ProductionAndCountries", "Production and Countries") - current_row = write_nested_simple_pydantic_to_sheet(filename, sheetname, inp, current_row, index_above=index_above) - worksheet = open_or_create_workbook(filename) - correct_column_widths(worksheet, sheetname) - shade_30_rows_and_protect_sheet(worksheet, sheetname, current_row + 1) - shade_locked_cells(worksheet, sheetname) - worksheet.save(filename) - - parsed_outp = excel_sheet_to_pydantic(filename, sheetname, ProductionAndCountries) + parsed_outp = excel_sheet_to_pydantic(filename, "metadata", ProductionAndCountries) assert parsed_outp == inp, parsed_outp @@ -141,18 +120,8 @@ class ProductionAndCountries(BaseModel): ) filename = tmpdir.join(f"integration_test_multilayer_simple_schema_.xlsx") - sheetname = "Document Metadata" - sheet_title = "Document Metadata" - - current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) - current_row = write_nested_simple_pydantic_to_sheet(filename, sheetname, inp, current_row + 1) - worksheet = open_or_create_workbook(filename) - correct_column_widths(worksheet, sheet_name=sheetname) - shade_30_rows_and_protect_sheet(worksheet, sheetname, current_row + 1) - shade_locked_cells(worksheet, sheetname) - worksheet.save(filename) - - parsed_outp = excel_sheet_to_pydantic(filename, sheetname, ProductionAndCountries) + write_to_single_sheet(filename, inp, "ProductionAndCountries", "Production and Countries") + parsed_outp = excel_sheet_to_pydantic(filename, "metadata", ProductionAndCountries) assert parsed_outp == inp, parsed_outp @@ -167,16 +136,7 @@ class Production(BaseModel): original_production = Production(idno="", subtitle=None, author="author", deprecatedFeature="toberemoved") filename = tmpdir.join(f"integration_test_optional_missing_deprecated_new_simple_.xlsx") - sheetname = "Document Metadata" - sheet_title = "Document Metadata" - - current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) - current_row = write_nested_simple_pydantic_to_sheet(filename, sheetname, original_production, current_row + 1) - worksheet = open_or_create_workbook(filename) - correct_column_widths(worksheet, sheet_name=sheetname) - shade_30_rows_and_protect_sheet(worksheet, sheetname, current_row + 1) - shade_locked_cells(worksheet, sheetname) - worksheet.save(filename) + write_to_single_sheet(filename, original_production, "Production", "Production") class Production(BaseModel): idno: Optional[str] = None @@ -185,7 +145,7 @@ class Production(BaseModel): newFeature: Optional[str] = None requiredNewFeature: str - new_production = excel_sheet_to_pydantic(filename=filename, sheetname=sheetname, model_type=Production) + new_production = excel_sheet_to_pydantic(filename=filename, sheetname="metadata", model_type=Production) assert new_production.idno is None assert new_production.title is None assert new_production.author == "author" @@ -214,18 +174,10 @@ class ProductionAndCountries(BaseModel): example_production_and_country = ProductionAndCountries(production=example_production, countries=example_country) filename = tmpdir.join(f"integration_test_optional_missing_deprecated_new_two_level_.xlsx") - sheetname = "Document Metadata" - sheet_title = "Document Metadata" - current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) - current_row = write_nested_simple_pydantic_to_sheet( - filename, sheetname, example_production_and_country, current_row + 1 + write_to_single_sheet( + filename, example_production_and_country, "ProductionAndCountries", "Production and Countries" ) - worksheet = open_or_create_workbook(filename) - correct_column_widths(worksheet, sheet_name=sheetname) - shade_30_rows_and_protect_sheet(worksheet, sheetname, current_row + 1) - shade_locked_cells(worksheet, sheetname) - worksheet.save(filename) class Production(BaseModel): idno: Optional[str] = None @@ -243,7 +195,7 @@ class ProductionAndCountries(BaseModel): countries: Country newTopLevelFeature: Optional[NewTopLevel] = None - new_pandc = excel_sheet_to_pydantic(filename=filename, sheetname=sheetname, model_type=ProductionAndCountries) + new_pandc = excel_sheet_to_pydantic(filename=filename, sheetname="metadata", model_type=ProductionAndCountries) assert new_pandc.production.idno is None assert new_pandc.production.title is None assert new_pandc.production.author == "author" @@ -307,20 +259,12 @@ class ProductionAndCountries(BaseModel): ) filename = tmpdir.join(f"integration_test_lists_.xlsx") - sheetname = "Document Metadata" - sheet_title = "Document Metadata" - - current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) - current_row = write_nested_simple_pydantic_to_sheet( - filename, sheetname, example_production_and_country, current_row + 1 + # filename = "integration_test_lists_.xlsx" + write_to_single_sheet( + filename, example_production_and_country, "ProductionAndCountries", "Production and Countries" ) - worksheet = open_or_create_workbook(filename) - correct_column_widths(worksheet, sheet_name=sheetname) - shade_30_rows_and_protect_sheet(worksheet, sheetname, current_row + 1) - shade_locked_cells(worksheet, sheetname) - worksheet.save(filename) - new_pandc = excel_sheet_to_pydantic(filename=filename, sheetname=sheetname, model_type=ProductionAndCountries) + new_pandc = excel_sheet_to_pydantic(filename=filename, sheetname="metadata", model_type=ProductionAndCountries) assert new_pandc.production.idno is None assert new_pandc.production.title is None assert len(new_pandc.production.authors) == 4 @@ -376,8 +320,10 @@ class ProductionAndCountries(BaseModel): ) filename = tmpdir.join(f"integration_test_optional_missing_deprecated_new_two_level_.xlsx") - title = "Example" - write_across_many_sheets(filename, example_production_and_country, title) + # filename = f"integration_test_optional_missing_deprecated_new_two_level_.xlsx" + write_across_many_sheets( + filename, example_production_and_country, "ProductionAndCountries", "Production and Countries" + ) new_pandc = excel_doc_to_pydantic(filename, ProductionAndCountries) assert new_pandc.production.idno == "myidno" @@ -407,7 +353,8 @@ class WithDict(BaseModel): wd = WithDict(additional={"s": "sa", "a": "va"}, sub=SubDict(sub_additional={"sub": "subval", "sub2": "subval2"})) filename = tmpdir.join(f"integration_test_dictionaries_.xlsx") - write_across_many_sheets(filename, wd, "test", title="Dictionaries") + write_across_many_sheets(filename, wd, "WithDict", "Looking at dictionaries") + parsed_outp = excel_doc_to_pydantic(filename, WithDict) assert parsed_outp == wd, parsed_outp @@ -439,13 +386,12 @@ def test_write_real_skeleton(tmpdir, name, type_writer_reader): os.remove(filename) ob = make_skeleton(type) - writer(filename, ob, name) + writer(filename, ob, name, f"{name} Metadata") reader(filename, type) def test_demo(): filename = "demo_output.xlsx" - sheetname = "metadata" sheet_title = "Formatting metadata examples" class SingleLevelData(BaseModel): @@ -498,10 +444,12 @@ class MetaDataOfVariousHierarchies(BaseModel): if os.path.exists(filename): os.remove(filename) - current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) - current_row = write_nested_simple_pydantic_to_sheet(filename, sheetname, example, current_row + 1) - worksheet = open_or_create_workbook(filename) - correct_column_widths(worksheet, sheet_name=sheetname) - shade_30_rows_and_protect_sheet(worksheet, sheetname, current_row + 1) - shade_locked_cells(worksheet, sheetname) - worksheet.save(filename) + write_to_single_sheet(filename, example, "MetaDataOfVariousHierarchies", sheet_title) + + # current_row = create_sheet_and_write_title(filename, sheetname, sheet_title) + # current_row = write_nested_simple_pydantic_to_sheet(filename, sheetname, example, current_row + 1) + # worksheet = open_or_create_workbook(filename) + # correct_column_widths(worksheet, sheet_name=sheetname) + # shade_30_rows_and_protect_sheet(worksheet, sheetname, current_row + 1) + # shade_locked_cells(worksheet, sheetname) + # worksheet.save(filename) diff --git a/pydantic_schemas/utils/excel_to_pydantic.py b/pydantic_schemas/utils/excel_to_pydantic.py index 5902e08..a8dc618 100644 --- a/pydantic_schemas/utils/excel_to_pydantic.py +++ b/pydantic_schemas/utils/excel_to_pydantic.py @@ -237,10 +237,11 @@ def instantiate_pydantic_object(model_type: Type[BaseModel], df: pd.DataFrame, f def excel_sheet_to_pydantic(filename: str, sheetname: str, model_type: Union[Type[BaseModel], Type[List[BaseModel]]]): df = pd.read_excel(filename, sheet_name=sheetname, header=None) df = df.where(df.notnull(), None) - try: - df = get_relevant_sub_frame(model_type, df) - except (KeyError, IndexError): - pass + if sheetname != "metadata": + try: + df = get_relevant_sub_frame(model_type, df) + except (KeyError, IndexError): + pass if is_optional_annotation(model_type): return handle_optional(df.iloc[0, 0], model_type, df) diff --git a/pydantic_schemas/utils/pydantic_to_excel.py b/pydantic_schemas/utils/pydantic_to_excel.py index dc69560..27567bd 100644 --- a/pydantic_schemas/utils/pydantic_to_excel.py +++ b/pydantic_schemas/utils/pydantic_to_excel.py @@ -1,17 +1,22 @@ +import copy +import json import os -import typing +from enum import Enum from typing import Dict, List, Optional, Tuple, Union import pandas as pd from openpyxl import Workbook, load_workbook -from openpyxl.styles import Alignment, Font, PatternFill, Protection +from openpyxl.styles import Alignment, Border, Font, PatternFill, Protection, Side +from openpyxl.utils.dataframe import dataframe_to_rows from openpyxl.worksheet.protection import SheetProtection +from openpyxl.worksheet.worksheet import Worksheet from pydantic import BaseModel -from .utils import ( +from pydantic_schemas.utils.utils import ( annotation_contains_dict, annotation_contains_list, assert_dict_annotation_is_strings_or_any, + get_subtype_of_optional_or_list, seperate_simple_from_pydantic, subset_pydantic_model, ) @@ -19,72 +24,61 @@ MAXCOL = 30 -def protect_and_shade_given_cell(sheet, row: int, col: int): - grey_fill = PatternFill(start_color="DDDDDD", end_color="DDDDDD", fill_type="solid") - sheet.cell(row=row, column=col).fill = grey_fill - sheet.cell(row=row, column=col).protection = Protection(locked=True) +def unprotect_cell(sheet, row, column): + sheet.cell(row=row, column=column).protection = Protection(locked=False) -def protect_and_shade_row(sheet, row: int, colmin: int = 1, colmax: Optional[int] = None): +def unprotect_row(sheet, row, colmin: int, colmax: Optional[int] = None): if colmax is None: colmax = max(colmin, MAXCOL, sheet.max_column) - for col in range(colmin, colmax): - protect_and_shade_given_cell(sheet, row, col) + for col in range(colmin, colmax + 1): + unprotect_cell(sheet, row, col) -def protect_and_shade_col(sheet, col: int, rowmin: int, rowmax: int): +def unprotect_given_col(sheet, col: int, rowmin: int, rowmax: int): for row in range(rowmin, rowmax): - protect_and_shade_given_cell(sheet, row, col) + unprotect_cell(sheet, row, col) -def unprotect_cell(sheet, row, column): - sheet.cell(row=row, column=column).protection = Protection(locked=False) +def protect_and_shade_given_cell(sheet, row: int, col: int): + grey_fill = PatternFill(start_color="DDDDDD", end_color="DDDDDD", fill_type="solid") + sheet.cell(row=row, column=col).fill = grey_fill + sheet.cell(row=row, column=col).protection = Protection(locked=True) -def unprotect_row(sheet, row, colmin: int, colmax: Optional[int] = None): +def protect_and_shade_row(sheet, row: int, colmin: int = 1, colmax: Optional[int] = None): if colmax is None: colmax = max(colmin, MAXCOL, sheet.max_column) - for col in range(colmin, colmax + 1): - unprotect_cell(sheet, row, col) + for col in range(colmin, colmax): + protect_and_shade_given_cell(sheet, row, col) -def unprotect_given_col(sheet, col: int, rowmin: int, rowmax: int): +def protect_and_shade_col(sheet, col: int, rowmin: int, rowmax: int): for row in range(rowmin, rowmax): - unprotect_cell(sheet, row, col) + protect_and_shade_given_cell(sheet, row, col) -def open_or_create_workbook(doc_filepath): - if os.path.exists(doc_filepath): - workbook = load_workbook(doc_filepath) - else: - workbook = Workbook() - # Remove the default sheet created by Workbook() - if len(workbook.sheetnames) == 1 and workbook.sheetnames[0] == "Sheet": - del workbook["Sheet"] - return workbook +def shade_locked_cells(worksheet: Worksheet): + """ + Shades every cell grey if it is locked and leaves it unshaded if it is not locked. + Args: + worksheet (Worksheet): The openPyxl Worksheet from an Excel file. + sheet_name (str): The name of the sheet to apply the shading. + """ + # Define the grey fill + grey_fill = PatternFill(start_color="DDDDDD", end_color="DDDDDD", fill_type="solid") -def shade_30_rows_and_protect_sheet(workbook: Workbook, sheet_name: str, startrow: int): - """For use after all data is written so there is a clear border around the data""" - ws = workbook[sheet_name] - for r in range(startrow, startrow + 30): - protect_and_shade_row(ws, r) - ws.protection = SheetProtection( - sheet=True, - formatCells=False, - formatColumns=False, - formatRows=False, - insertColumns=False, - insertRows=True, - insertHyperlinks=False, - deleteColumns=False, - deleteRows=True, - selectLockedCells=False, - selectUnlockedCells=False, - ) + # Iterate through each cell in the worksheet + for row in worksheet.iter_rows(): + for cell in row: + if cell.protection.locked: + cell.fill = grey_fill + else: + cell.fill = PatternFill() # Remove any fill (reset to default) -def correct_column_widths(workbook: Workbook, sheet_name: str): +def correct_column_widths(worksheet: Worksheet): """ Adjusts the column widths of an Excel sheet based on the maximum length of the content in each column. If a column has no filled values, its width remains unchanged. @@ -94,9 +88,8 @@ def correct_column_widths(workbook: Workbook, sheet_name: str): sheet_name (str): The name of the sheet to adjust column widths for. """ # Load the existing workbook - ws = workbook[sheet_name] # Adjust column widths based on the maximum length of the content in each column - for col in ws.columns: + for col in worksheet.columns: max_length = 0 column = col[0].column_letter # Get the column letter for cell in col: @@ -109,136 +102,26 @@ def correct_column_widths(workbook: Workbook, sheet_name: str): if max_length > 0: # Only adjust if there are filled values in the column max_length = max(min(max_length, 28), 11) adjusted_width = max_length + 2 - ws.column_dimensions[column].width = adjusted_width - - -def shade_locked_cells(workbook: Workbook, sheet_name: str): - """ - Shades every cell grey if it is locked and leaves it unshaded if it is not locked. - - Args: - workbook (Workbook): The openPyxl Workbook of an Excel file. - sheet_name (str): The name of the sheet to apply the shading. - """ - # Load the existing workbook - ws = workbook[sheet_name] - - # Define the grey fill - grey_fill = PatternFill(start_color="DDDDDD", end_color="DDDDDD", fill_type="solid") - - # Iterate through each cell in the worksheet - for row in ws.iter_rows(): - for cell in row: - if cell.protection.locked: - cell.fill = grey_fill - else: - cell.fill = PatternFill() # Remove any fill (reset to default) - - -def write_to_cell( - filename: str, sheet_name: str, row: int, col: int, text: str, isBold=False, size=14, debug: bool = False -): - """ - Writes text to a specified cell in the Excel file. - - Args: - filename (str): The path to the Excel file. - sheet_name (str): The name of the sheet. - row_num (int): The row number (1-based index). - col_num (int): The column number (1-based index). - text (str): The text to write to the cell. - """ - # Load the existing workbook or create a new one if it doesn't exist - try: - wb = load_workbook(filename) - except FileNotFoundError: - wb = Workbook() - - # Select the worksheet by name - ws = wb[sheet_name] - - # Write text to the specified cell - cell = ws.cell(row=row, column=col, value=text) - cell.font = Font(bold=isBold, size=size) - - protect_and_shade_row(ws, row=row, colmin=col) - - # Save the workbook - wb.save(filename) - - return row + 1 - - -def create_sheet_and_write_title( - doc_filepath: str, - sheet_name: str, - sheet_title: Optional[str] = None, - sheet_number: int = 0, - protect_title: bool = True, - debug=False, -): - """ - In the given excel document, creates a new sheet called sheet_name and in the top left cell - writes in sheet_title in bold. - - It will create the excel document at doc_filepath if it does not already exist. - - The new sheet will be inserted at the specified sheet_number position. If sheet_number is - greater than the total number of sheets, the new sheet will be added at the end. - - Args: - doc_filepath (str): The path to the Excel document. - sheet_name (str): The name of the new sheet to create. - sheet_title (str): The title to write in the top left cell of the new sheet, in bold. - sheet_number (int): The position to insert the new sheet (0-indexed). If greater than the - total number of sheets, the new sheet will be added at the end. - - Returns: - int: index of next row below the final written row - - Raises: - ValueError: if a sheet called sheet_name already exists in the document to prevent overwriting. - """ - # Check if the file exists - workbook = open_or_create_workbook(doc_filepath) - - # Check if the sheet already exists - if sheet_name in workbook.sheetnames: - raise ValueError(f"A sheet called '{sheet_name}' already exists in the document.") + worksheet.column_dimensions[column].width = adjusted_width - # Create a new sheet - new_sheet = workbook.create_sheet(title=sheet_name) - - if sheet_title is not None: - # Write the title in bold in the top left cell (A1) - bold_font = Font(bold=True, size=14) - new_sheet["A1"] = sheet_title.replace("_", " ") - new_sheet["A1"].font = bold_font - - # Shade the background of the cells in the first 2 rows grey and lock them - # for row in range(1, 3): - # protect_and_shade_row(new_sheet, row) - if protect_title: - protect_and_shade_given_cell(new_sheet, 1, 1) - else: - unprotect_cell(new_sheet, 1, 1) - protect_and_shade_row(new_sheet, 1, 2) - protect_and_shade_row(new_sheet, 2) - # Determine the position to insert the new sheet - total_sheets = len(workbook.sheetnames) - insert_position = min(sheet_number, total_sheets) - - # Move the new sheet to the specified position - workbook._sheets.insert(insert_position, workbook._sheets.pop()) - - # Save the workbook - workbook.save(doc_filepath) - - if sheet_title is not None: - return 3 - else: - return 0 +def shade_30_rows_and_protect_sheet(worksheet: Worksheet, startrow: int): + """For use after all data is written so there is a clear border around the data""" + for r in range(startrow, startrow + 30): + protect_and_shade_row(worksheet, r) + worksheet.protection = SheetProtection( + sheet=True, + formatCells=False, + formatColumns=False, + formatRows=False, + insertColumns=False, + insertRows=True, + insertHyperlinks=False, + deleteColumns=False, + deleteRows=True, + selectLockedCells=False, + selectUnlockedCells=False, + ) def replace_row_with_multiple_rows(original_df, new_df, row_to_replace): @@ -264,8 +147,7 @@ def replace_row_with_multiple_rows(original_df, new_df, row_to_replace): def pydantic_to_dataframe( - ob: Union[BaseModel, Dict, List[Dict]], - annotations: Optional[Dict[str, typing._UnionGenericAlias]] = None, + ob: Union[BaseModel, List[BaseModel]], debug: bool = False, ) -> Tuple[pd.DataFrame, List[int]]: """ @@ -275,323 +157,316 @@ def pydantic_to_dataframe( Returns the dataframe and also a list of the indexs (denoted by zero-based numbers) that are of list types. The list of indexs is intended to be used for appropriately shading the excel sheet. """ - if isinstance(ob, BaseModel): - ob_dict = ob.model_dump(mode="json") + if isinstance(ob, list): + ob_dict = [elem.model_dump() for elem in ob] + annotations = {k: v.annotation for k, v in ob[0].model_fields.items()} + is_list_of_objects = True else: - ob_dict = ob - try: - df = pd.json_normalize(ob_dict).T - except NotImplementedError: - raise NotImplementedError(ob) + ob_dict = ob.model_dump() + annotations = {k: v.annotation for k, v in ob.model_fields.items()} + is_list_of_objects = False + df = pd.json_normalize(ob_dict).T if debug: print("pydantic_to_dataframe") print(df) + + # handle dictionaries + # for idx, field in ob_dict.items(): + # if annotation_contains_dict(annotations[idx]): + for fieldname, anno in annotations.items(): + if annotation_contains_dict(anno): + if debug: + print("Found a dictionary") + if is_list_of_objects: + continue + assert_dict_annotation_is_strings_or_any(anno) + field = ob_dict[fieldname] + if field is None or len(field) == 0: + dict_df = pd.DataFrame(["", ""], index=["key", "value"]) + else: + dict_df = pd.DataFrame([field.keys(), field.values()], index=["key", "value"]) + dict_df.index = dict_df.index.map(lambda x: f"{fieldname}.{x}") + df = df[~df.index.str.startswith(f"{fieldname}.")] + df = df[df.index != fieldname] + df = pd.concat([df, dict_df]) + + i = 0 list_indices = [] - if isinstance(ob, list): - list_indices = list(range(len(df))) - else: - for idx, _ in ob_dict.items(): - if annotations is not None and annotation_contains_dict(annotations[idx]): - if debug: - print("Found a dictionary") - assert_dict_annotation_is_strings_or_any(annotations[idx]) - field = ob_dict[idx] - if field is None or len(field) == 0: - dict_df = pd.DataFrame(["", ""], index=["key", "value"]) - else: - dict_df = pd.DataFrame([field.keys(), field.values()], index=["key", "value"]) - dict_df.index = dict_df.index.map(lambda x: f"{idx}.{x}") - df = df[~df.index.str.startswith(f"{idx}.")] - df = df[df.index != idx] - df = pd.concat([df, dict_df]) - i = 0 - for idx in df.index: + enums = {} + for idx in df.index: + if debug: + print(f"pydantic_to_dataframe::172 idx = {idx}, df = {df}") + vals = df.loc[idx] # [0] + if debug: + print(f"vals: {vals}") + print(f'idx.split(".")[0]: {idx.split(".")[0]}') + print(f'annotations[idx.split(".")[0]]: {annotations[idx.split(".")[0]]}') + # field = ob_dict[idx.split(".")[0]] + + if annotation_contains_list(annotations[idx.split(".")[0]]) or annotation_contains_dict( + annotations[idx.split(".")[0]] + ): + if annotation_contains_list(annotations[idx.split(".")[0]]): + subtype = get_subtype_of_optional_or_list(annotations[idx.split(".")[0]]) + else: + subtype = dict if debug: - print(f"pydantic_to_dataframe::283 idx = {idx}, df = {df}") - vals = df.loc[idx][0] - field = ob_dict[idx.split(".")[0]] - - if ( - isinstance(vals, list) - or (annotations is not None and annotation_contains_list(annotations[idx.split(".")[0]])) - or (annotations is not None and annotation_contains_dict(annotations[idx.split(".")[0]])) - ): # (hasattr(ob, "annotation") and annotation_contains_list(ob.annotation)): - if vals is not None and len(vals) > 0 and (isinstance(vals[0], BaseModel) or isinstance(vals[0], Dict)): - if debug: - print("list of base models", vals[0]) - sub = pd.json_normalize(df.loc[idx].values[0]).reset_index(drop=True).T - sub.index = sub.index.map(lambda x: f"{idx}." + x) - df = replace_row_with_multiple_rows(df, sub, idx) - list_indices += list(range(i, i + len(sub))) - i += len(sub) - else: - if debug: - print("list of builtins or else empty") - df = replace_row_with_multiple_rows( - df, df.loc[idx].explode().to_frame().reset_index(drop=True).T, idx - ) - list_indices.append(i) - i += 1 + print("subtype = ", subtype) + print("isinstance(subtype, BaseModel)", isinstance(subtype, type(BaseModel))) + print("isinstance(subtype, dict)", isinstance(subtype, dict)) + if is_list_of_objects: + if debug: + print("list of lists") + list_indices.append(i) + i += 1 + elif isinstance(subtype, type(BaseModel)) or isinstance(subtype, dict): + if debug: + print("list of base models", vals) + sub = pd.json_normalize(df.loc[idx].values[0]).reset_index(drop=True).T + sub.index = sub.index.map(lambda x: f"{idx}." + x) + df = replace_row_with_multiple_rows(df, sub, idx) + list_indices += list(range(i, i + len(sub))) + i += len(sub) else: + if debug: + print("list of builtins or else empty") + df = replace_row_with_multiple_rows(df, df.loc[idx].explode().to_frame().reset_index(drop=True).T, idx) + list_indices.append(i) i += 1 + else: + if isinstance(annotations[idx.split(".")[0]], type(Enum)): + dropdown_options = [e.value for e in annotations[idx.split(".")[0]]] + dropdown = DataValidation( + type="list", + formula1=f'"{",".join(dropdown_options)}"', + showDropDown=False, + allow_blank=True, + showErrorMessage=True, + ) + enums[i] = dropdown + i += 1 if debug: print(df) if len(df): df.index = df.index.str.split(".", expand=True) - return df, list_indices - - -def write_simple_pydantic_to_sheet( - doc_filepath: str, - sheet_name: str, - ob: BaseModel, - startrow: int, - index_above=False, - write_title=True, - title: Optional[str] = None, - annotations=None, - debug: bool = False, -): - """ - Assumes a pydantic object made up of built in types or pydantic objects utimately made of built in types or Lists. - Do not use if the object or it's children contain Dicts or enums. - - Starting from startrow, it writes the name of the pydantic object in the first column. It then writes the data - starting in the row below and from the second column. - - If index_above = False then the data is printed with indexs down the second column and values down the third column - If index_above = True then the data is printed with indexs along the second row and values along the third row - - Example: - - class Simple(BaseModel): - a: str - b: str - - example = Simple(a="value_a", b="value_b") - # with index_above=True - write_simple_pydantic_to_sheet("filename", "sheetname", example, startrow=1, index_above=True) - - gives: - - Simple - a b - value_a value_b + if is_list_of_objects: + list_indices = list(range(len(df))) + return df, list_indices, enums - # with index_above=False - write_simple_pydantic_to_sheet("filename", "sheetname", example, startrow=1, index_above=False) - gives: +def stringify_enum(elem): + if isinstance(elem, Enum): + return str(elem.value) + else: + raise TypeError(f"{elem} is not an enum") - Simple - a value_a - b value_b +def stringify_cell_element(elem): + if isinstance(elem, list): + return json.dumps(elem, default=stringify_enum) + elif isinstance(elem, Enum): + return str(elem.value) + elif isinstance(elem, dict): + return json.dumps(elem, default=stringify_enum) + else: + return elem - Args: - doc_filepath (str): The path to the Excel document. - sheet_name (str): The name of the new sheet to create. - ob (BaseModel): a pydantic class - startrow (int): the row from which to start writing the data - index_above (bool): if True then the index is written along a row with the data below, if False then the data is - written in a column with the data to the right. Default is False - Returns: - int: index of next row below the final written row - """ - if write_title: - if title is None: - title = ob.model_json_schema()["title"] - if startrow == 1: - title = title.replace("_", " ") - size = 14 - else: - size = 12 - startrow = write_to_cell(doc_filepath, sheet_name, startrow, 1, title, isBold=True, size=size, debug=debug) - startcol = 2 - - df, list_rows = pydantic_to_dataframe(ob=ob, annotations=annotations, debug=debug) - index_levels = df.index.nlevels - # if index_above and index_levels > 1: - # warnings.warn( - # "Setting index_above=True is incompatible with a hierarchical index. Setting index_above to False.", - # UserWarning, - # ) - # index_above = False - - # if index_above: - # df = df.T - - # Annoyingly, openpyxl uses 1 based indexing but - # But pandas uses 0 based indexing. - - with pd.ExcelWriter(doc_filepath, mode="a", if_sheet_exists="overlay") as writer: - df.to_excel( - writer, - sheet_name=sheet_name, - header=index_above, - index=not index_above, - startrow=startrow - 1, - startcol=startcol - 1, - merge_cells=True, - ) +def write_pydantic_to_excel(ws, ob, row_number, debug=False): + df, list_rows, enums = pydantic_to_dataframe(ob, debug=debug) + list_rows_tracker = {} + list_of_enums_tracker = {} + for i, r in enumerate(dataframe_to_rows(df, index=True, header=False)): + if debug: + print(r) + if all(map(lambda x: x is None, r)): + continue + r = [stringify_cell_element(val) for val in r] + # r = [str(val) if isinstance(val, list) else str(val.value) if isinstance(val, Enum) else val for val in r ] + r = [""] + r + if debug: + print("about to append", r) + ws.append(r) + for col in range(2, df.index.nlevels + 2): + cell = ws.cell(row=row_number, column=col) + cell.font = Font(bold=True) + cell.border = Border( + top=Side(border_style=None), + left=Side(border_style="thin"), + right=Side(border_style="thin"), + bottom=Side(border_style=None), + ) + if cell.value is not None and cell.value != "": + if debug: + print("turning on some borders") + border_copy = copy.copy(cell.border) + border_copy.top = Side(border_style="thin") + cell.border = border_copy + min_unprotected_cell = df.index.nlevels + 2 + max_unprotected_cell = None if i - 1 in list_rows else min_unprotected_cell + unprotect_row(ws, row_number, colmin=min_unprotected_cell, colmax=max_unprotected_cell) + if i - 1 in enums: + dropdown = enums[i - 1] + ws.add_data_validation(dropdown) + for j in range( + min_unprotected_cell, ws.max_column if max_unprotected_cell is None else min_unprotected_cell + 1 + ): + dropdown.add(ws.cell(row_number, j)) + if max_unprotected_cell is None: + list_rows_tracker[row_number] = ws.max_column + if i - 1 in enums: + list_of_enums_tracker[row_number] = dropdown + row_number += 1 + + for col in range(2, df.index.nlevels + 2): + cell = ws.cell(row=row_number, column=col) + border_copy = copy.copy(cell.border) + border_copy.top = Side(border_style="thin") + cell.border = border_copy + + return row_number + 1, list_rows_tracker, list_of_enums_tracker + + +def write_title_and_version_info( + ws: Worksheet, sheet_title: Optional[str], version: Optional[str], protect_title=True +) -> int: + if sheet_title is None: + return 1 + if sheet_title is not None: + sheet_title = sheet_title.replace("_", " ") + ws.append([sheet_title, None, version]) - # Open the Excel file with openpyxl - workbook = load_workbook(doc_filepath) - sheet = workbook[sheet_name] - - # Get the DataFrame dimensions - rows, cols = df.shape - - # if index_above: - # protect_and_shade_row(sheet, startrow) - # for c in range(startcol, cols + startcol): - # cell = sheet.cell(startrow, c) - # cell.font = Font(bold=False) - # for r in range(startrow + 1, startrow + rows + 1): - # unprotect_row(sheet, r, startcol, colmax=startcol + cols) - # protect_and_shade_row(sheet, r, colmin=startcol + cols) - # next_row = startrow + rows + 2 - # else: - for col in range(startcol, startcol + index_levels): - protect_and_shade_col(sheet, col, startrow, startrow + rows) - for r in range(startrow, startrow + rows): - cell = sheet.cell(r, col) - cell.font = Font(bold=False) - firstdatacol = startcol + index_levels - for i, r in enumerate(range(startrow, startrow + rows)): - if i in list_rows: - unprotect_row(sheet, r, firstdatacol) - else: - unprotect_row(sheet, r, firstdatacol, colmax=firstdatacol + 1) - protect_and_shade_row(sheet, r, colmin=firstdatacol + 1) - next_row = startrow + rows + if sheet_title is not None: + bold_font = Font(bold=True, size=14) + ws["A1"].font = bold_font + if protect_title == False: + unprotect_row(ws, 1, colmin=1, colmax=1) - sheet.protection.enable() - # Save the workbook - workbook.save(doc_filepath) + if version is not None: + version_font = Font(name="Consolas", size=9) + ws["C1"].font = version_font - return next_row + ws.append([]) + return 3 -def write_nested_simple_pydantic_to_sheet( - doc_filepath: str, sheet_name: str, ob: BaseModel, startrow: int, index_above=False, debug=False -): - """ - Assumes the pydantic object is made up only of other pydantic objects that are themselves made up only of built in types - """ - if debug: - print(ob) +def write_pydantic_to_sheet(worksheet: Worksheet, ob: BaseModel, current_row: int, debug: bool = False) -> int: children = seperate_simple_from_pydantic(ob) if debug: - print(children["simple"]) + print("Children:") + print(children) + list_rows = {} + enum_list_rows = {} + if len(children["simple"]): child_object = subset_pydantic_model(ob, children["simple"]) - startrow = write_simple_pydantic_to_sheet( - doc_filepath, - sheet_name, - child_object, - startrow, - index_above=False, - write_title=False, - annotations={k: v.annotation for k, v in child_object.model_fields.items()}, - debug=debug, + current_row, sub_list_rows, sub_list_enums = write_pydantic_to_excel( + ws=worksheet, ob=child_object, row_number=current_row ) - if debug: - print("Done with simple children, now nesting pydantic objects") + list_rows.update(sub_list_rows) + enum_list_rows.update(sub_list_enums) + for mfield in children["pydantic"]: - field = ob.model_dump(mode="json")[mfield] - if debug: - print(f"write_nested_simple_pydantic_to_sheet::428, field={field}") - startrow = write_simple_pydantic_to_sheet( - doc_filepath, sheet_name, field, startrow, index_above=index_above, title=mfield, debug=debug + worksheet.append([mfield]) + worksheet.cell(row=current_row, column=1).font = Font(bold=True, size=12) + current_row += 1 + child_object = getattr(ob, mfield) + current_row, sub_list_rows, sub_list_enums = write_pydantic_to_excel( + ws=worksheet, ob=child_object, row_number=current_row ) + list_rows.update(sub_list_rows) + enum_list_rows.update(sub_list_enums) - return startrow + for row, col in list_rows.items(): + unprotect_row(worksheet, row, colmin=col, colmax=None) + if row in enum_list_rows: + dropdown = enum_list_rows[row] + for j in range(col, worksheet.max_column): + dropdown.add(worksheet.cell(row, j)) + return current_row -def write_metadata_type_and_version(doc_filepath: str, metadata_type: str): - wb = open_or_create_workbook(doc_filepath) - sheet = wb["metadata"] +def open_or_create_workbook(doc_filepath): + if os.path.exists(doc_filepath): + workbook = load_workbook(doc_filepath) + else: + workbook = Workbook() + # Remove the default sheet created by Workbook() + if len(workbook.sheetnames) == 1 and workbook.sheetnames[0] == "Sheet": + del workbook["Sheet"] + return workbook - sheet["C1"] = f"{metadata_type} type metadata version 20240809.1" - version_font = Font(name="Consolas", size=9) - sheet["C1"].font = version_font +def create_sheet(workbook, sheetname, sheet_number): + # Check if the sheet already exists + if sheetname in workbook.sheetnames: + raise ValueError(f"A sheet called '{sheetname}' already exists in the document.") - wb.save(doc_filepath) + # Create a new sheet + new_sheet = workbook.create_sheet(title=sheetname) + + # Determine the position to insert the new sheet + total_sheets = len(workbook.sheetnames) + insert_position = min(sheet_number, total_sheets) + + # Move the new sheet to the specified position + workbook._sheets.insert(insert_position, workbook._sheets.pop()) + return new_sheet def write_to_single_sheet( - doc_filepath: str, ob: BaseModel, metadata_type: str, title: Optional[str] = None, debug=False + doc_filepath: str, ob: BaseModel, metadata_type: str, title: Optional[str] = None, verbose=False ): - if title is None: - title = "Metadata" - sheet_name = "metadata" - current_row = create_sheet_and_write_title( - doc_filepath, sheet_name, title, sheet_number=0, protect_title=False, debug=debug - ) - write_metadata_type_and_version(doc_filepath=doc_filepath, metadata_type=metadata_type) - current_row = write_nested_simple_pydantic_to_sheet(doc_filepath, sheet_name, ob, current_row + 1) - workbook = open_or_create_workbook(doc_filepath) - correct_column_widths(workbook, sheet_name=sheet_name) - shade_30_rows_and_protect_sheet(workbook, sheet_name, current_row + 1) - shade_locked_cells(workbook, sheet_name) - workbook.save(doc_filepath) + model_default_name = ob.model_json_schema()["title"] + wb = open_or_create_workbook(doc_filepath) + ws = create_sheet(wb, "metadata", sheet_number=0) + version = f"{metadata_type} type metadata version 20240812.1" + 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) + shade_30_rows_and_protect_sheet(worksheet=ws, startrow=current_row) + shade_locked_cells(worksheet=ws) + wb.save(doc_filepath) def write_across_many_sheets( - doc_filepath: str, ob: BaseModel, metadata_type: str, title: Optional[str] = None, debug=False + doc_filepath: str, ob: BaseModel, metadata_type: str, title: Optional[str] = None, verbose=False ): + wb = open_or_create_workbook(doc_filepath) + ws = create_sheet(wb, "metadata", sheet_number=0) + version = f"{metadata_type} type metadata version 20240812.1" + current_row = write_title_and_version_info(ws, title, version, protect_title=False) + children = seperate_simple_from_pydantic(ob) - if debug: + if verbose: print(f"children: {children}") sheet_number = 0 - if len(children["simple"]): - if title is None: - title = "Metadata" - sheet_name = "metadata" - current_row = create_sheet_and_write_title( - doc_filepath, sheet_name, title, sheet_number=sheet_number, protect_title=False, debug=debug - ) - write_metadata_type_and_version(doc_filepath=doc_filepath, metadata_type=metadata_type) + if len(children["simple"]): child_object = subset_pydantic_model(ob, children["simple"]) - current_row = write_simple_pydantic_to_sheet( - doc_filepath, - sheet_name, - child_object, - current_row + 1, - index_above=False, - write_title=False, - annotations={k: v.annotation for k, v in child_object.model_fields.items()}, - debug=debug, - ) - workbook = open_or_create_workbook(doc_filepath) - correct_column_widths(workbook, sheet_name=sheet_name) - shade_30_rows_and_protect_sheet(workbook, sheet_name, current_row + 1) - shade_locked_cells(workbook, sheet_name) - workbook.save(doc_filepath) - sheet_number += 1 + current_row = write_pydantic_to_sheet(ws, child_object, current_row, debug=verbose) + correct_column_widths(worksheet=ws) + shade_30_rows_and_protect_sheet(worksheet=ws, startrow=current_row) + shade_locked_cells(worksheet=ws) + sheet_number += 1 for fieldname in children["pydantic"]: - if debug: + if verbose: print(f"\n\n{fieldname}\n") - field = getattr(ob, fieldname) - if not isinstance(field, BaseModel): - field = subset_pydantic_model(ob, [fieldname], name=fieldname) + child_object = getattr(ob, fieldname) + if verbose: + print(child_object) + ws = create_sheet(wb, fieldname, sheet_number=sheet_number) + if not isinstance(child_object, BaseModel): + child_object = subset_pydantic_model(ob, [fieldname], name=fieldname) sheet_title = None else: sheet_title = fieldname - current_row = create_sheet_and_write_title( - doc_filepath, fieldname, sheet_title, sheet_number=sheet_number, protect_title=True, debug=debug - ) - - current_row = write_nested_simple_pydantic_to_sheet(doc_filepath, fieldname, field, current_row + 1) - workbook = open_or_create_workbook(doc_filepath) - correct_column_widths(workbook, sheet_name=fieldname) - shade_30_rows_and_protect_sheet(workbook, fieldname, current_row + 1) - shade_locked_cells(workbook, fieldname) - workbook.save(doc_filepath) + current_row = write_title_and_version_info(ws, sheet_title, None, protect_title=True) + current_row = write_pydantic_to_sheet(ws, child_object, current_row, debug=verbose) + correct_column_widths(worksheet=ws) + shade_30_rows_and_protect_sheet(worksheet=ws, startrow=current_row) + shade_locked_cells(worksheet=ws) sheet_number += 1 + wb.save(doc_filepath) From 5db1610d43c5cd70ee0858d4dc1717df3aa5a840 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Thu, 22 Aug 2024 14:01:01 -0400 Subject: [PATCH 42/51] add readme --- README.md | 79 +++++++++++++- poetry.lock | 103 ++++++++++--------- pydantic_schemas/excel_interface.py | 10 +- pydantic_schemas/utils/excel_to_pydantic.py | 108 ++++++++++++-------- pydantic_schemas/utils/pydantic_to_excel.py | 7 +- pyproject.toml | 3 +- 6 files changed, 208 insertions(+), 102 deletions(-) diff --git a/README.md b/README.md index e95e38f..d429065 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,83 @@ # metadata-schemas -Metadata JSON Schemas +This repository contains both the definitions of Metadata Schemas and a python library for creating schema objects with pydantic and Excel. -View documentation - https://worldbank.github.io/metadata-schemas/ +## Defining Metadata Schemas +The schemas are defined in the JSON Schema format in the folder `schemas`. For more information you can view documentation at https://worldbank.github.io/metadata-schemas/ -## Pydantic +## Python library -To update the pydantic schemas so that they match the json schemas run +To install the library run + +```pip install metadataschemas``` + +### Creating a pydantic metadata object + +To create a timeseries metadata object run + +```python +from metadataschemas import timeseries_schema + +timeseries_metadata = timeseries_schema.TimeseriesSchema(idno='project_idno',series_description=timeseries_schema.SeriesDescription(idno='project_idno', name='project_name')) +``` + +Depending on your IDE, selecting `TimeseriesSchema` could show you what fields the schema contains and their corresponding object definitions. + +There are metadata objects for each of the following metadata types: + +| Metadata Type | Metadata Object | +|------------------|-------------------------------------------------| +| document | `document_schema.ScriptSchemaDraft` | +| geospatial | `geospatial_schema.GeospatialSchema` | +| script | `script_schema.ResearchProjectSchemaDraft` | +| series | `series_schema.Series` | +| survey | `microdata_schema.MicrodataSchema` | +| table | `table_schema.Model` | +| timeseries | `timeseries_schema.TimeseriesSchema` | +| timeseries_db | `timeseries_db_schema.TimeseriesDatabaseSchema` | +| video | `video_schema.Model` | + +### Python - Excel interface + +The Excel interface exists to + +1. Create blank Excel files formatted for a given metadata type +2. Write metadata objects to Excel +3. Read an appropriately formatted Excel file containing metadata into a pydantic metadata object + +To use it run: + +```python +from metadataschemas import ExcelInterface + +ei = ExcelInterface() + +filename = ei.write_outline_metadata_to_excel(metadata_type='timeseries') + +filename = ei.save_metadata_to_excel(metadata_type='timeseries', + object=timeseries_metadata) + +# Then after you have updated the metadata in the Excel file + +updated_timeseries_metadata = ei.read_metadata_excel(filename = timeseries_metadata_filename) +``` + +Note that the Excel interface currently does not support Geospatial metadata. + +The Excel interface also offers a convenient way to get started creating metadata in pydantic by creating an empty pydantic object for a given metadata type which can then be updated as needed. + +```python +survey_metadata = ei.type_to_outline(metadata_type="survey") + +survey_metadata.repositoryid = "repository id" + +survey_metadata.study_desc.title_statement.idno = "project_idno" +``` + + +## Updating Pydantic definitions and Excel sheets + +To update the pydantic schemas so that they match the latest json schemas run `python pydantic_schemas\\generators\\generate_pydantic_schemas.py` diff --git a/poetry.lock b/poetry.lock index f0f2c66..bea39c6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -846,56 +846,63 @@ files = [ [[package]] name = "numpy" -version = "2.0.0" +version = "2.1.0" description = "Fundamental package for array computing in Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "numpy-2.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:04494f6ec467ccb5369d1808570ae55f6ed9b5809d7f035059000a37b8d7e86f"}, - {file = "numpy-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2635dbd200c2d6faf2ef9a0d04f0ecc6b13b3cad54f7c67c61155138835515d2"}, - {file = "numpy-2.0.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:0a43f0974d501842866cc83471bdb0116ba0dffdbaac33ec05e6afed5b615238"}, - {file = "numpy-2.0.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:8d83bb187fb647643bd56e1ae43f273c7f4dbcdf94550d7938cfc32566756514"}, - {file = "numpy-2.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79e843d186c8fb1b102bef3e2bc35ef81160ffef3194646a7fdd6a73c6b97196"}, - {file = "numpy-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d7696c615765091cc5093f76fd1fa069870304beaccfd58b5dcc69e55ef49c1"}, - {file = "numpy-2.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b4c76e3d4c56f145d41b7b6751255feefae92edbc9a61e1758a98204200f30fc"}, - {file = "numpy-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:acd3a644e4807e73b4e1867b769fbf1ce8c5d80e7caaef0d90dcdc640dfc9787"}, - {file = "numpy-2.0.0-cp310-cp310-win32.whl", hash = "sha256:cee6cc0584f71adefe2c908856ccc98702baf95ff80092e4ca46061538a2ba98"}, - {file = "numpy-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:ed08d2703b5972ec736451b818c2eb9da80d66c3e84aed1deeb0c345fefe461b"}, - {file = "numpy-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad0c86f3455fbd0de6c31a3056eb822fc939f81b1618f10ff3406971893b62a5"}, - {file = "numpy-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e7f387600d424f91576af20518334df3d97bc76a300a755f9a8d6e4f5cadd289"}, - {file = "numpy-2.0.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:34f003cb88b1ba38cb9a9a4a3161c1604973d7f9d5552c38bc2f04f829536609"}, - {file = "numpy-2.0.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:b6f6a8f45d0313db07d6d1d37bd0b112f887e1369758a5419c0370ba915b3871"}, - {file = "numpy-2.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f64641b42b2429f56ee08b4f427a4d2daf916ec59686061de751a55aafa22e4"}, - {file = "numpy-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7039a136017eaa92c1848152827e1424701532ca8e8967fe480fe1569dae581"}, - {file = "numpy-2.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:46e161722e0f619749d1cd892167039015b2c2817296104487cd03ed4a955995"}, - {file = "numpy-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0e50842b2295ba8414c8c1d9d957083d5dfe9e16828b37de883f51fc53c4016f"}, - {file = "numpy-2.0.0-cp311-cp311-win32.whl", hash = "sha256:2ce46fd0b8a0c947ae047d222f7136fc4d55538741373107574271bc00e20e8f"}, - {file = "numpy-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbd6acc766814ea6443628f4e6751d0da6593dae29c08c0b2606164db026970c"}, - {file = "numpy-2.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:354f373279768fa5a584bac997de6a6c9bc535c482592d7a813bb0c09be6c76f"}, - {file = "numpy-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4d2f62e55a4cd9c58c1d9a1c9edaedcd857a73cb6fda875bf79093f9d9086f85"}, - {file = "numpy-2.0.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:1e72728e7501a450288fc8e1f9ebc73d90cfd4671ebbd631f3e7857c39bd16f2"}, - {file = "numpy-2.0.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:84554fc53daa8f6abf8e8a66e076aff6ece62de68523d9f665f32d2fc50fd66e"}, - {file = "numpy-2.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c73aafd1afca80afecb22718f8700b40ac7cab927b8abab3c3e337d70e10e5a2"}, - {file = "numpy-2.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49d9f7d256fbc804391a7f72d4a617302b1afac1112fac19b6c6cec63fe7fe8a"}, - {file = "numpy-2.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0ec84b9ba0654f3b962802edc91424331f423dcf5d5f926676e0150789cb3d95"}, - {file = "numpy-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:feff59f27338135776f6d4e2ec7aeeac5d5f7a08a83e80869121ef8164b74af9"}, - {file = "numpy-2.0.0-cp312-cp312-win32.whl", hash = "sha256:c5a59996dc61835133b56a32ebe4ef3740ea5bc19b3983ac60cc32be5a665d54"}, - {file = "numpy-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:a356364941fb0593bb899a1076b92dfa2029f6f5b8ba88a14fd0984aaf76d0df"}, - {file = "numpy-2.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e61155fae27570692ad1d327e81c6cf27d535a5d7ef97648a17d922224b216de"}, - {file = "numpy-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4554eb96f0fd263041baf16cf0881b3f5dafae7a59b1049acb9540c4d57bc8cb"}, - {file = "numpy-2.0.0-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:903703372d46bce88b6920a0cd86c3ad82dae2dbef157b5fc01b70ea1cfc430f"}, - {file = "numpy-2.0.0-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:3e8e01233d57639b2e30966c63d36fcea099d17c53bf424d77f088b0f4babd86"}, - {file = "numpy-2.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cde1753efe513705a0c6d28f5884e22bdc30438bf0085c5c486cdaff40cd67a"}, - {file = "numpy-2.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:821eedb7165ead9eebdb569986968b541f9908979c2da8a4967ecac4439bae3d"}, - {file = "numpy-2.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a1712c015831da583b21c5bfe15e8684137097969c6d22e8316ba66b5baabe4"}, - {file = "numpy-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9c27f0946a3536403efb0e1c28def1ae6730a72cd0d5878db38824855e3afc44"}, - {file = "numpy-2.0.0-cp39-cp39-win32.whl", hash = "sha256:63b92c512d9dbcc37f9d81b123dec99fdb318ba38c8059afc78086fe73820275"}, - {file = "numpy-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:3f6bed7f840d44c08ebdb73b1825282b801799e325bcbdfa6bc5c370e5aecc65"}, - {file = "numpy-2.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9416a5c2e92ace094e9f0082c5fd473502c91651fb896bc17690d6fc475128d6"}, - {file = "numpy-2.0.0-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:17067d097ed036636fa79f6a869ac26df7db1ba22039d962422506640314933a"}, - {file = "numpy-2.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ecb5b0582cd125f67a629072fed6f83562d9dd04d7e03256c9829bdec027ad"}, - {file = "numpy-2.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cef04d068f5fb0518a77857953193b6bb94809a806bd0a14983a8f12ada060c9"}, - {file = "numpy-2.0.0.tar.gz", hash = "sha256:cf5d1c9e6837f8af9f92b6bd3e86d513cdc11f60fd62185cc49ec7d1aba34864"}, + {file = "numpy-2.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6326ab99b52fafdcdeccf602d6286191a79fe2fda0ae90573c5814cd2b0bc1b8"}, + {file = "numpy-2.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0937e54c09f7a9a68da6889362ddd2ff584c02d015ec92672c099b61555f8911"}, + {file = "numpy-2.1.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:30014b234f07b5fec20f4146f69e13cfb1e33ee9a18a1879a0142fbb00d47673"}, + {file = "numpy-2.1.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:899da829b362ade41e1e7eccad2cf274035e1cb36ba73034946fccd4afd8606b"}, + {file = "numpy-2.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08801848a40aea24ce16c2ecde3b756f9ad756586fb2d13210939eb69b023f5b"}, + {file = "numpy-2.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:398049e237d1aae53d82a416dade04defed1a47f87d18d5bd615b6e7d7e41d1f"}, + {file = "numpy-2.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0abb3916a35d9090088a748636b2c06dc9a6542f99cd476979fb156a18192b84"}, + {file = "numpy-2.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:10e2350aea18d04832319aac0f887d5fcec1b36abd485d14f173e3e900b83e33"}, + {file = "numpy-2.1.0-cp310-cp310-win32.whl", hash = "sha256:f6b26e6c3b98adb648243670fddc8cab6ae17473f9dc58c51574af3e64d61211"}, + {file = "numpy-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:f505264735ee074250a9c78247ee8618292091d9d1fcc023290e9ac67e8f1afa"}, + {file = "numpy-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:76368c788ccb4f4782cf9c842b316140142b4cbf22ff8db82724e82fe1205dce"}, + {file = "numpy-2.1.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:f8e93a01a35be08d31ae33021e5268f157a2d60ebd643cfc15de6ab8e4722eb1"}, + {file = "numpy-2.1.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:9523f8b46485db6939bd069b28b642fec86c30909cea90ef550373787f79530e"}, + {file = "numpy-2.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54139e0eb219f52f60656d163cbe67c31ede51d13236c950145473504fa208cb"}, + {file = "numpy-2.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ebbf9fbdabed208d4ecd2e1dfd2c0741af2f876e7ae522c2537d404ca895c3"}, + {file = "numpy-2.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:378cb4f24c7d93066ee4103204f73ed046eb88f9ad5bb2275bb9fa0f6a02bd36"}, + {file = "numpy-2.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8f699a709120b220dfe173f79c73cb2a2cab2c0b88dd59d7b49407d032b8ebd"}, + {file = "numpy-2.1.0-cp311-cp311-win32.whl", hash = "sha256:ffbd6faeb190aaf2b5e9024bac9622d2ee549b7ec89ef3a9373fa35313d44e0e"}, + {file = "numpy-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:0af3a5987f59d9c529c022c8c2a64805b339b7ef506509fba7d0556649b9714b"}, + {file = "numpy-2.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fe76d75b345dc045acdbc006adcb197cc680754afd6c259de60d358d60c93736"}, + {file = "numpy-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f358ea9e47eb3c2d6eba121ab512dfff38a88db719c38d1e67349af210bc7529"}, + {file = "numpy-2.1.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:dd94ce596bda40a9618324547cfaaf6650b1a24f5390350142499aa4e34e53d1"}, + {file = "numpy-2.1.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:b47c551c6724960479cefd7353656498b86e7232429e3a41ab83be4da1b109e8"}, + {file = "numpy-2.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0756a179afa766ad7cb6f036de622e8a8f16ffdd55aa31f296c870b5679d745"}, + {file = "numpy-2.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24003ba8ff22ea29a8c306e61d316ac74111cebf942afbf692df65509a05f111"}, + {file = "numpy-2.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b34fa5e3b5d6dc7e0a4243fa0f81367027cb6f4a7215a17852979634b5544ee0"}, + {file = "numpy-2.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c4f982715e65036c34897eb598d64aef15150c447be2cfc6643ec7a11af06574"}, + {file = "numpy-2.1.0-cp312-cp312-win32.whl", hash = "sha256:c4cd94dfefbefec3f8b544f61286584292d740e6e9d4677769bc76b8f41deb02"}, + {file = "numpy-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0cdef204199278f5c461a0bed6ed2e052998276e6d8ab2963d5b5c39a0500bc"}, + {file = "numpy-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8ab81ccd753859ab89e67199b9da62c543850f819993761c1e94a75a814ed667"}, + {file = "numpy-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:442596f01913656d579309edcd179a2a2f9977d9a14ff41d042475280fc7f34e"}, + {file = "numpy-2.1.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:848c6b5cad9898e4b9ef251b6f934fa34630371f2e916261070a4eb9092ffd33"}, + {file = "numpy-2.1.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:54c6a63e9d81efe64bfb7bcb0ec64332a87d0b87575f6009c8ba67ea6374770b"}, + {file = "numpy-2.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:652e92fc409e278abdd61e9505649e3938f6d04ce7ef1953f2ec598a50e7c195"}, + {file = "numpy-2.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ab32eb9170bf8ffcbb14f11613f4a0b108d3ffee0832457c5d4808233ba8977"}, + {file = "numpy-2.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:8fb49a0ba4d8f41198ae2d52118b050fd34dace4b8f3fb0ee34e23eb4ae775b1"}, + {file = "numpy-2.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:44e44973262dc3ae79e9063a1284a73e09d01b894b534a769732ccd46c28cc62"}, + {file = "numpy-2.1.0-cp313-cp313-win32.whl", hash = "sha256:ab83adc099ec62e044b1fbb3a05499fa1e99f6d53a1dde102b2d85eff66ed324"}, + {file = "numpy-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:de844aaa4815b78f6023832590d77da0e3b6805c644c33ce94a1e449f16d6ab5"}, + {file = "numpy-2.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:343e3e152bf5a087511cd325e3b7ecfd5b92d369e80e74c12cd87826e263ec06"}, + {file = "numpy-2.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f07fa2f15dabe91259828ce7d71b5ca9e2eb7c8c26baa822c825ce43552f4883"}, + {file = "numpy-2.1.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5474dad8c86ee9ba9bb776f4b99ef2d41b3b8f4e0d199d4f7304728ed34d0300"}, + {file = "numpy-2.1.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:1f817c71683fd1bb5cff1529a1d085a57f02ccd2ebc5cd2c566f9a01118e3b7d"}, + {file = "numpy-2.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a3336fbfa0d38d3deacd3fe7f3d07e13597f29c13abf4d15c3b6dc2291cbbdd"}, + {file = "numpy-2.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a894c51fd8c4e834f00ac742abad73fc485df1062f1b875661a3c1e1fb1c2f6"}, + {file = "numpy-2.1.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:9156ca1f79fc4acc226696e95bfcc2b486f165a6a59ebe22b2c1f82ab190384a"}, + {file = "numpy-2.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:624884b572dff8ca8f60fab591413f077471de64e376b17d291b19f56504b2bb"}, + {file = "numpy-2.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:15ef8b2177eeb7e37dd5ef4016f30b7659c57c2c0b57a779f1d537ff33a72c7b"}, + {file = "numpy-2.1.0-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:e5f0642cdf4636198a4990de7a71b693d824c56a757862230454629cf62e323d"}, + {file = "numpy-2.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15976718c004466406342789f31b6673776360f3b1e3c575f25302d7e789575"}, + {file = "numpy-2.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6c1de77ded79fef664d5098a66810d4d27ca0224e9051906e634b3f7ead134c2"}, + {file = "numpy-2.1.0.tar.gz", hash = "sha256:7dc90da0081f7e1da49ec4e398ede6a8e9cc4f5ebe5f9e06b443ed889ee9aaa2"}, ] [[package]] @@ -1714,4 +1721,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "548bd0d8e7fb0a3cc4adbe09b1c592b315164c51ccbae0258fbed5a375349274" +content-hash = "7671a941b5d68d34eb48386ca5fc6a447fbd50677549e35a46fe64869f94d6fb" diff --git a/pydantic_schemas/excel_interface.py b/pydantic_schemas/excel_interface.py index e4bb5a8..4332ee1 100644 --- a/pydantic_schemas/excel_interface.py +++ b/pydantic_schemas/excel_interface.py @@ -140,7 +140,7 @@ def write_outline_metadata_to_excel( An Excel file into which metadata can be entered """ metadata_type = self._process_metadata_type(metadata_type) - self.raise_if_unsupported_metadata_type(metadata_type=metadata_type) + self._raise_if_unsupported_metadata_type(metadata_type=metadata_type) if filename is None: filename = f"{metadata_type}_metadata.xlsx" if not str(filename).endswith(".xlsx"): @@ -174,7 +174,7 @@ def save_metadata_to_excel( An Excel file containing the metadata from the pydantic object. This file can be updated as needed. """ metadata_type = self._process_metadata_type(metadata_type) - self.raise_if_unsupported_metadata_type(metadata_type=metadata_type) + self._raise_if_unsupported_metadata_type(metadata_type=metadata_type) if filename is None: filename = f"{metadata_type}_metadata.xlsx" @@ -236,7 +236,7 @@ def read_metadata_excel(self, filename: str) -> BaseModel: """ metadata_type = self._get_metadata_type_from_excel_file(filename) metadata_type = self._process_metadata_type(metadata_type) - self.raise_if_unsupported_metadata_type(metadata_type=metadata_type) + self._raise_if_unsupported_metadata_type(metadata_type=metadata_type) schema = self._TYPE_TO_SCHEMA[metadata_type] reader = self._TYPE_TO_READER[metadata_type] read_object = reader(filename, schema) @@ -245,7 +245,7 @@ def read_metadata_excel(self, filename: str) -> BaseModel: def inflate_read_data_to_schema(self, metadata_type, read_object): metadata_type = self._process_metadata_type(metadata_type) - self.raise_if_unsupported_metadata_type(metadata_type=metadata_type) + self._raise_if_unsupported_metadata_type(metadata_type=metadata_type) skeleton_object = self.type_to_outline(metadata_type=metadata_type, debug=False) if isinstance(read_object, dict): @@ -263,7 +263,7 @@ def inflate_read_data_to_schema(self, metadata_type, read_object): new_ob = schema(**combined_dict) return new_ob - def raise_if_unsupported_metadata_type(self, metadata_type: str): + def _raise_if_unsupported_metadata_type(self, metadata_type: str): """ If the type is specifically unsupported - geospatial or image - a NotImplementedError is raised If the type is simply unknown then a ValueError is raised. diff --git a/pydantic_schemas/utils/excel_to_pydantic.py b/pydantic_schemas/utils/excel_to_pydantic.py index a8dc618..6387916 100644 --- a/pydantic_schemas/utils/excel_to_pydantic.py +++ b/pydantic_schemas/utils/excel_to_pydantic.py @@ -65,7 +65,7 @@ def find_string_and_count_nans(arr, search_str): # return horizontal_intersection > vertical_intersection -def get_relevant_sub_frame(m: Type[BaseModel], df: pd.DataFrame, name_of_field: Optional[str] = None): +def get_relevant_sub_frame(m: Type[BaseModel], df: pd.DataFrame, name_of_field: Optional[str] = None, debug=False): """ THe dataframe likely contains lots and lots of information about other models. @@ -93,19 +93,21 @@ def get_relevant_sub_frame(m: Type[BaseModel], df: pd.DataFrame, name_of_field: sub = sub.dropna(how="all", axis=0) # drop all null rows sub = sub.dropna(how="all", axis=1) # drop all null columns - print("SubFrame = \n", sub) + if debug: + print("SubFrame = \n", sub) # if is_horizontally_organized(m, sub): # sub = sub.T return sub -def handle_optional(name, annotation, df, from_within_list: bool = False): +def handle_optional(name, annotation, df, from_within_list: bool = False, debug=False): args = [a for a in get_args(annotation) if a is not type(None)] assert len(args) == 1, f"handle_optional encountered {args}" ret = annotation_switch(name, args[0], df, from_within_list=from_within_list) - print(f"optional ret: {ret}") - print(f"isinstance(ret, list): {isinstance(ret, list)}") - # print(f"len(ret): {len(ret)}") + if debug: + print(f"optional ret: {ret}") + print(f"isinstance(ret, list): {isinstance(ret, list)}") + # print(f"len(ret): {len(ret)}") if (isinstance(ret, list) or isinstance(ret, dict)) and len(ret) == 0: return None elif isinstance(ret, str) and ret == "": @@ -114,7 +116,7 @@ def handle_optional(name, annotation, df, from_within_list: bool = False): return ret -def handle_list(name, anno, df): +def handle_list(name, anno, df, debug=False): subtype = get_subtype_of_optional_or_list(anno) if isinstance(subtype, type(BaseModel)): try: @@ -124,25 +126,30 @@ def handle_list(name, anno, df): list_of_subs = [] for c in subframe.columns[1:]: subsubframe = subframe.loc[:, [subframe.columns[0], c]] - print("subsubframe") - print(subsubframe) - print() + if debug: + print("subsubframe") + print(subsubframe) + print() sub = instantiate_pydantic_object(model_type=subtype, df=subsubframe, from_within_list=True) - print(f"instantiated: {sub}") + if debug: + print(f"instantiated: {sub}") list_of_subs.append(sub) return list_of_subs # raise NotImplementedError(f"handle_list - {name}, {anno}, {subframe}") else: values = df.set_index(df.columns[0]).loc[name] - print(f"handle_list anno:{anno}, value: {values}") + if debug: + print(f"handle_list anno:{anno}, value: {values}") return [v for v in values if v is not None] -def handle_list_within_list(name, anno, df): - print(f"handle_list_within_list {name}, {anno}") - print(df) +def handle_list_within_list(name, anno, df, debug=False): + if debug: + print(f"handle_list_within_list {name}, {anno}") + print(df) values = df.set_index(df.columns[0]).loc[name, df.columns[1]] - print(f"values: {values}, {type(values)}") + if debug: + print(f"values: {values}, {type(values)}") if values is None: return [] values = json.loads(values.replace("'", '"').replace("None", "null")) @@ -157,12 +164,14 @@ def handle_list_within_list(name, anno, df): raise NotImplementedError(f"handle_list_within_list unexpected values - {name}, {anno}, {values}, {df}") -def handle_builtin_or_enum(name, anno, df): - print(df) +def handle_builtin_or_enum(name, anno, df, debug=False): + if debug: + print(df) if len(df) == 0: return "" df_indexed = df.set_index(df.columns[0]) - print("handle_builtin_or_enum", df_indexed) + if debug: + print("handle_builtin_or_enum", df_indexed) # return df_indexed.loc[name, df.columns[1]] if name not in df_indexed.index: return "" @@ -194,47 +203,60 @@ def handle_dict(name, anno, df): # raise NotImplementedError(f"Dictionary: {name}, {anno}, {dict_results}, {ret}") -def annotation_switch(name: str, anno, df: pd.DataFrame, from_within_list=False) -> Any: - print(f"annotation_to_value name: {name}") +def annotation_switch(name: str, anno, df: pd.DataFrame, from_within_list=False, debug=False) -> Any: + if debug: + print(f"annotation_to_value name: {name}") if is_optional_annotation(anno): - print("optional") + if debug: + print("optional") return handle_optional(name, anno, df, from_within_list=from_within_list) elif is_dict_annotation(anno): return handle_dict(name, anno, df) elif is_list_annotation(anno): if from_within_list: - print("list within a list") + if debug: + print("list within a list") return handle_list_within_list(name, anno, df) else: - print("list") + if debug: + print("list") return handle_list(name, anno, df) elif isinstance(anno, type(BaseModel)): - print("pydantic") + if debug: + print("pydantic") try: sub = get_relevant_sub_frame(anno, df, name_of_field=name) except IndexError: return make_skeleton(anno) return instantiate_pydantic_object(anno, sub) elif len(get_args(anno)) == 0: - print("builtin or enum") + if debug: + print("builtin or enum") return handle_builtin_or_enum(name, anno, df) else: raise NotImplementedError(anno) -def instantiate_pydantic_object(model_type: Type[BaseModel], df: pd.DataFrame, from_within_list=False) -> BaseModel: +def instantiate_pydantic_object( + model_type: Type[BaseModel], df: pd.DataFrame, from_within_list=False, debug=False +) -> BaseModel: ret = {} - print(f"instantiate_pydantic_object df = {df}") + if debug: + print(f"instantiate_pydantic_object df = {df}") for field_name, field_info in model_type.model_fields.items(): anno = field_info.annotation - print(f"Instantiating field {field_name}, anno {anno} and args {get_args(anno)}") + if debug: + print(f"Instantiating field {field_name}, anno {anno} and args {get_args(anno)}") ret[field_name] = annotation_switch(field_name, anno, df, from_within_list=from_within_list) - print(ret[field_name]) - print() + if debug: + print(ret[field_name]) + print() return model_type(**ret) -def excel_sheet_to_pydantic(filename: str, sheetname: str, model_type: Union[Type[BaseModel], Type[List[BaseModel]]]): +def excel_sheet_to_pydantic( + filename: str, sheetname: str, model_type: Union[Type[BaseModel], Type[List[BaseModel]]], debug=False +): df = pd.read_excel(filename, sheet_name=sheetname, header=None) df = df.where(df.notnull(), None) if sheetname != "metadata": @@ -254,38 +276,40 @@ def excel_sheet_to_pydantic(filename: str, sheetname: str, model_type: Union[Typ if "simple" in children and len(children["simple"]): sub = get_relevant_sub_frame(model_type, df, name_of_field=df.iloc[0, 0]) simple_child_field_type = subset_pydantic_model_type(model_type, children["simple"]) - fields = instantiate_pydantic_object(simple_child_field_type, sub) + fields = instantiate_pydantic_object(simple_child_field_type, sub, debug=debug) for child in children["simple"]: ret[child] = getattr(fields, child) for name in children["pydantic"]: - print(f"Looking to get {name}") + if debug: + print(f"Looking to get {name}") anno = model_type.model_fields[name].annotation ret[name] = annotation_switch(name, anno, df) - print() for k, v in ret.items(): if isinstance(v, list) or isinstance(v, np.ndarray): ret[k] = [elem for elem in v if elem is not None] - print(ret) + if debug: + print(ret) return model_type(**ret) -def excel_single_sheet_to_pydantic(filename: str, model_type: Type[BaseModel]) -> BaseModel: - return excel_sheet_to_pydantic(filename, "metadata", model_type) +def excel_single_sheet_to_pydantic(filename: str, model_type: Type[BaseModel], verbose=False) -> BaseModel: + return excel_sheet_to_pydantic(filename, "metadata", model_type, debug=verbose) -def excel_doc_to_pydantic(filename: str, model_type: Type[BaseModel]) -> BaseModel: +def excel_doc_to_pydantic(filename: str, model_type: Type[BaseModel], verbose=False) -> BaseModel: children = seperate_simple_from_pydantic(model_type) annotations = {k: v.annotation for k, v in model_type.model_fields.items()} ret = {} if len(children["simple"]) > 0: field_type = subset_pydantic_model_type(model_type, children["simple"]) - fields = excel_sheet_to_pydantic(filename, sheetname="metadata", model_type=field_type) + fields = excel_sheet_to_pydantic(filename, sheetname="metadata", model_type=field_type, debug=verbose) for child in children["simple"]: ret[child] = getattr(fields, child) for fieldname in children["pydantic"]: - print(f"Looking to get {fieldname}") + if verbose: + print(f"Looking to get {fieldname}") field_type = annotations[fieldname] - ret[fieldname] = excel_sheet_to_pydantic(filename, sheetname=fieldname, model_type=field_type) + ret[fieldname] = excel_sheet_to_pydantic(filename, sheetname=fieldname, model_type=field_type, debug=verbose) return model_type(**ret) diff --git a/pydantic_schemas/utils/pydantic_to_excel.py b/pydantic_schemas/utils/pydantic_to_excel.py index 27567bd..cd61fda 100644 --- a/pydantic_schemas/utils/pydantic_to_excel.py +++ b/pydantic_schemas/utils/pydantic_to_excel.py @@ -2,17 +2,18 @@ import json import os from enum import Enum -from typing import Dict, List, Optional, Tuple, Union +from typing import List, Optional, Tuple, Union import pandas as pd from openpyxl import Workbook, load_workbook from openpyxl.styles import Alignment, Border, Font, PatternFill, Protection, Side from openpyxl.utils.dataframe import dataframe_to_rows +from openpyxl.worksheet.datavalidation import DataValidation from openpyxl.worksheet.protection import SheetProtection from openpyxl.worksheet.worksheet import Worksheet from pydantic import BaseModel -from pydantic_schemas.utils.utils import ( +from .utils import ( annotation_contains_dict, annotation_contains_list, assert_dict_annotation_is_strings_or_any, @@ -418,6 +419,8 @@ def write_to_single_sheet( doc_filepath: str, ob: BaseModel, metadata_type: str, title: Optional[str] = None, verbose=False ): model_default_name = ob.model_json_schema()["title"] + if title is None: + 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" diff --git a/pyproject.toml b/pyproject.toml index 0ba3153..db66af0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "metadataschemas" -version = "0.1.15" +version = "0.1.0" description = "" authors = ["Mehmood Asghar ", "Gordon Blackadder "] readme = "README.md" @@ -14,6 +14,7 @@ packages = [ [tool.poetry.dependencies] python = "^3.11" pandas = "^2.2.2" +numpy = "^2.1.0" pydantic = "^2.8.0" openpyxl = "^3.1.5" From 8acb0082a4b37cb81044cd236756418ddc5f2ea4 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Mon, 26 Aug 2024 17:54:20 -0400 Subject: [PATCH 43/51] implement template to pydantic --- .../generators/generate_excel_files.py | 4 +- ...excel_interface.py => schema_interface.py} | 30 +- .../tests/test_excel_interface.py | 4 +- .../tests/test_template_to_pydantic.py | 1923 +++++++++++++++++ .../utils/template_to_pydantic.py | 147 ++ pydantic_schemas/utils/utils.py | 25 +- 6 files changed, 2115 insertions(+), 18 deletions(-) rename pydantic_schemas/{excel_interface.py => schema_interface.py} (90%) create mode 100644 pydantic_schemas/tests/test_template_to_pydantic.py create mode 100644 pydantic_schemas/utils/template_to_pydantic.py diff --git a/pydantic_schemas/generators/generate_excel_files.py b/pydantic_schemas/generators/generate_excel_files.py index 83fb6f7..3a6ba8d 100644 --- a/pydantic_schemas/generators/generate_excel_files.py +++ b/pydantic_schemas/generators/generate_excel_files.py @@ -1,8 +1,8 @@ import os -from pydantic_schemas.excel_interface import ExcelInterface +from pydantic_schemas.schema_interface import SchemaInterface -ei = ExcelInterface() +ei = SchemaInterface() for metadata_type in ei.get_metadata_types(): filename = f"excel_sheets/{metadata_type.capitalize()}_metadata.xlsx" diff --git a/pydantic_schemas/excel_interface.py b/pydantic_schemas/schema_interface.py similarity index 90% rename from pydantic_schemas/excel_interface.py rename to pydantic_schemas/schema_interface.py index 4332ee1..5486788 100644 --- a/pydantic_schemas/excel_interface.py +++ b/pydantic_schemas/schema_interface.py @@ -1,4 +1,4 @@ -from typing import Optional +from typing import Dict, Optional from openpyxl import load_workbook from pydantic import BaseModel @@ -17,13 +17,16 @@ from .utils.excel_to_pydantic import excel_doc_to_pydantic, excel_single_sheet_to_pydantic from .utils.pydantic_to_excel import write_across_many_sheets, write_to_single_sheet from .utils.quick_start import make_skeleton +from .utils.template_to_pydantic import pydantic_from_template from .utils.utils import standardize_keys_in_dict -class ExcelInterface: +class SchemaInterface: """ - An Excel interface creating, saving and updating metadata for various types: + Interface with Excel for creating, saving and updating metadata for various types: documents, scripts, series, survey, table, timeseries, timeseries_db, video + + Retrieve pydantic model definitions for each metadata type """ _TYPE_TO_SCHEMA = { @@ -65,6 +68,20 @@ class ExcelInterface: "video": excel_single_sheet_to_pydantic, # one sheet } + def get_metadata_class(self, metadata_type: str): + metadata_type = self._process_metadata_type(metadata_type) + if metadata_type not in self._TYPE_TO_SCHEMA: + raise NameError(f"{metadata_type} not known, must be one of {list(self._TYPE_TO_SCHEMA.keys())}.") + schema = self._TYPE_TO_SCHEMA[metadata_type] + return schema + + def template_to_pydantic(self, template: Dict, parent_schema_type: str, name: Optional[str] = None) -> BaseModel: + # metadata_type = self._process_metadata_type(parent_schema_type) + # schema = self._TYPE_TO_SCHEMA[metadata_type] + schema = self.get_metadata_class(parent_schema_type) + + return pydantic_from_template(template, schema, name) + def get_metadata_types(self): return list(self._TYPE_TO_READER.keys()) @@ -78,7 +95,7 @@ def _merge_dicts(base, update): update_value = update[key] if isinstance(base_value, dict): if isinstance(update_value, dict) and len(update_value) > 0: - new_dict[key] = ExcelInterface._merge_dicts(base_value, update_value) + new_dict[key] = SchemaInterface._merge_dicts(base_value, update_value) else: new_dict[key] = base_value elif isinstance(base_value, list): @@ -88,7 +105,7 @@ def _merge_dicts(base, update): for i in range(min_length): if isinstance(base_value[i], dict): if isinstance(update_value[i], dict): - new_list.append(ExcelInterface._merge_dicts(base_value[i], update_value[i])) + new_list.append(SchemaInterface._merge_dicts(base_value[i], update_value[i])) else: new_list.append(base_value[i]) else: @@ -114,8 +131,7 @@ def _process_metadata_type(metadata_type: str) -> str: return metadata_type def type_to_outline(self, metadata_type: str, debug: bool = False) -> BaseModel: - metadata_type = self._process_metadata_type(metadata_type) - schema = self._TYPE_TO_SCHEMA[metadata_type] + schema = self.get_metadata_class(metadata_type) skeleton_object = make_skeleton(schema, debug=debug) return skeleton_object diff --git a/pydantic_schemas/tests/test_excel_interface.py b/pydantic_schemas/tests/test_excel_interface.py index c7f4807..5d3ef69 100644 --- a/pydantic_schemas/tests/test_excel_interface.py +++ b/pydantic_schemas/tests/test_excel_interface.py @@ -1,13 +1,13 @@ import pytest -from pydantic_schemas.excel_interface import ExcelInterface +from pydantic_schemas.schema_interface import SchemaInterface @pytest.mark.parametrize( "metadata_type", ["document", "script", "series", "survey", "table", "timeseries_db", "timeseries", "video"] ) def test_metadata(tmpdir, metadata_type): - ei = ExcelInterface() + ei = SchemaInterface() # Write empty metadata filename = ei.write_outline_metadata_to_excel( diff --git a/pydantic_schemas/tests/test_template_to_pydantic.py b/pydantic_schemas/tests/test_template_to_pydantic.py new file mode 100644 index 0000000..c83ec89 --- /dev/null +++ b/pydantic_schemas/tests/test_template_to_pydantic.py @@ -0,0 +1,1923 @@ +from pydantic_schemas import timeseries_schema +from pydantic_schemas.utils.quick_start import make_skeleton +from pydantic_schemas.utils.template_to_pydantic import pydantic_from_template + + +def test_actual_template_to_skeleton(): + ts1 = { + "type": "template", + "title": "Timeseries project", + "items": [ + { + "type": "section_container", + "key": "metadata_information", + "title": "Metadata information", + "class": "recommended", + "items": [ + { + "key": "metadata_information1674224341900", + "title": "Information on metadata", + "type": "section", + "items": [ + { + "key": "metadata_information.title", + "title": "Document title", + "type": "string", + "help_text": 'The title of the metadata document (which may be the same as the element "Name" in the "Indicator description / Title statement" section). The metadata document is the metadata file (XML or JSON file) that is being generated. ', + "display_type": "text", + }, + { + "key": "metadata_information.idno", + "title": "Document ID", + "type": "string", + "help_text": 'A unique identifier for the indicator/series metadata document. This identifier must be unique in the catalog where the metadata are intended to be published. Ideally, the identifier should also be unique globally. This is different from the "Primary identifier" in section Database description / Title statement, although it is good practice to generate identifiers that establish a clear connection between these two identifiers. The Document ID could also include the metadata document version identifier. For example, if the "Primary identifier" of the indicator “External debt disbursements by private creditors in current US dollars” is "DT.DIS.PRVT.CD”, the Document ID could be “WB_DT.DIS.PRVT.CD_v1.0” if the metadata are produced by the IHSN and if this is version 1.0 of the metadata. Each organization should establish systematic rules to generate such IDs. A validation rule can be set (using a regular expression) in user templates to enforce a specific ID format. The identifier may not contain blank spaces.', + "display_type": "text", + }, + { + "key": "metadata_information.producers", + "title": "Metadata producers", + "type": "array", + "props": [ + { + "key": "name", + "title": "Name", + "type": "string", + "rules_": "required", + "prop_key": "metadata_information.producers.name", + "help_text": "The name of the person or organization who produced the metadata or contributed to its production.", + "display_type": "text", + }, + { + "key": "abbr", + "title": "Abbreviation", + "type": "string", + "prop_key": "metadata_information.producers.abbr", + "help_text": 'The abbreviation (or acronym) of the organization that is referenced in "Name".', + "display_type": "text", + }, + { + "key": "affiliation", + "title": "Affiliation", + "type": "string", + "prop_key": "metadata_information.producers.affiliation", + "help_text": 'The affiliation of the person or organization mentioned in "Name".', + "display_type": "text", + }, + { + "key": "role", + "title": "Role", + "type": "string", + "prop_key": "metadata_information.producers.role", + "help_text": 'The specific role of the person or organization mentioned in "Name" in the production of the metadata.', + "display_type": "textarea", + }, + ], + "help_text": 'The metadata producer is the person or organization with the financial and/or administrative responsibility for the processes whereby the metadata document was created. This is a "Recommended" element. For catalog administration purposes, information on the producer and on the date of metadata production is useful.', + "is_recommended": True, + }, + { + "key": "metadata_information.prod_date", + "title": "Production date", + "type": "string", + "help_text": 'The date the metadata on this indicator was produced (not distributed or archived), preferably entered in ISO 8601 format (YYYY-MM-DD or YYY-MM). A validation rule can be set in user templates to enforce a date format. This is a "Recommended" element, as information on the producer and on the date of metadata production is useful for catalog administration purposes.', + "is_recommended": True, + "display_type": "text", + }, + { + "key": "metadata_information.version", + "title": "Version", + "type": "string", + "help_text": "The version of the metadata document (not the version of the indicator/time series itself).", + "display_type": "text", + }, + ], + "help_text": "", + } + ], + }, + { + "type": "section_container", + "key": "series_description_container", + "title": "Indicator description", + "class": "mandatory recommended", + "expanded": True, + "items": [ + { + "key": "series_description_container1673533435878", + "title": "Title statement", + "type": "section", + "items": [ + { + "key": "series_description.idno", + "title": "Primary ID", + "type": "string", + "class": "required", + "required": True, + "rules_": "required|alpha_dash|min:5|max:80", + "help_text": 'A unique identifier of the indicator/series. The "Primary ID" (also referred to as IDNO) is a unique identification number used to identify the database. A unique identifier is required for cataloguing purpose, so this element is declared as "Required". The identifier will allow users to cite the indicator/series properly. The identifier must be unique within the catalog. Ideally, it should also be globally unique; the recommended option is to obtain a Digital Object Identifier (DOI) for the study. Alternatively, the "Primary ID" can be constructed by an organization using a consistent scheme. For example, the name of the series in the World Bank’s World Development Indicators series are composed of the following four elements, separated by a dot: Topic code (2 digits); General subject code (3 digits); Specific subject code (4 digits); Extensions (2 digits each). Note that the schema allows you to provide more than one identifier for a same study (in element "Other identifiers"); a catalog-specific identifier is thus not incompatible with a globally unique identifier like a DOI. A validation rule can be set (using a regular expression) in user templates to enforce a specific ID format. A validation rule can be set (using a regular expression) in user templates to enforce a specific ID format. The identifier may not contain blank spaces.', + "is_required": True, + "display_type": "text", + }, + { + "key": "series_description.alternate_identifiers", + "title": "Other identifiers", + "type": "array", + "props": [ + { + "key": "name", + "title": "Type", + "type": "string", + "name": "Country name", + "prop_key": "series_description.alternate_identifiers.name", + "help_text": 'The type of identifier. For example: “DOI”, or "ISBN". ', + "display_type": "text", + }, + { + "key": "identifier", + "title": "Identifier", + "type": "string", + "name": "Identifier", + "prop_key": "series_description.alternate_identifiers.identifier", + "help_text": "The identifier itself. ", + "display_type": "text", + }, + { + "key": "database", + "title": "Database", + "type": "string", + "prop_key": "series_description.alternate_identifiers.database", + "help_text": "The name of the database (or catalog) where this alternative identifier is used, e.g. “IMF, International Financial Statistics (IFS)”.", + "display_type": "text", + }, + { + "key": "uri", + "title": "URL", + "type": "string", + "prop_key": "series_description.alternate_identifiers.uri", + "help_text": "A link (URL) to the database mentioned in database.", + "rules": {"is_uri": True}, + "display_type": "text", + }, + { + "key": "notes", + "title": "Notes", + "type": "string", + "prop_key": "series_description.alternate_identifiers.notes", + "help_text": "Additional information on the other identifier.", + "display_type": "textarea", + }, + ], + "help_text": 'This repeatable element is used to enter identifiers (IDs) other than the "Primary ID" (IDNO). The element "Primary ID" is the reference identifier for the catalog in which the metadata is intended to be published. But the same indicator/metadata may be published in other catalogs. For example, a data catalog may publish metadata for series extracted from the World Bank World Development Indicators (WDI) database. And the WDI itself contains series generated and published by other organizations, such as the World Health Organization or UNICEF. Catalog administrators may want to assign a unique identifier specific to their catalog (the "Primary ID" element) but keep track of the identifier of the series or indicator in the originating catalog or databases. The "Other identifiers" can also include a Digital Object Identifier (DOI). The "Primary ID" can be repeated here (the "Primary ID" does not provide a "Type" parameter, so if a DOI or other standard ID type is used as main identifier, it is recommended to repeat it here with the identification of the type).\n\n ', + }, + { + "key": "series_description.name", + "type": "string", + "class": "name", + "title": "Name", + "help_text": "The name (label) of the indicator/series. Make sure to use a unique name for each distinct indicator/series. Note that a field alias is provided (see below) to capture alternative names for the indicator/series. Pay attention to the consistent use of capitalization in the name of indicators/series.", + "is_required": True, + "display_type": "text", + }, + { + "key": "series_description.aliases", + "title": "Aliases", + "type": "array", + "props": [ + { + "key": "alias", + "title": "Alias", + "type": "string", + "prop_key": "series_description.aliases.alias", + "help_text": "An alternative name for the indicator or series being documented.", + "display_type": "text", + } + ], + "help_text": 'A series or an indicator can be referred to using different names. For example, the indicator "Child mortality rate" could also be referred to as "Under-five mortality rate". The aliases element is provided to capture the alternative names of the documented series or indicator. Pay attention to the consistent use of capitalization in the aliases.', + }, + { + "key": "series_description.database_id", + "type": "string", + "class": "database_id", + "title": "Database ID", + "help_text": 'The unique identifier of the database the indicator/series belongs to. This field must correspond to the element "Database description / Title statement / Primary ID" of the database metadata. This is the only field that is needed to establish the link between the indicator metadata and the information on the database it belongs to.', + "display_type": "text", + }, + ], + "help_text": "", + }, + { + "key": "series_description_container1673533506085", + "title": "Sources, concepts, and methods", + "type": "section", + "items": [ + { + "key": "series_description.definition_short", + "type": "string", + "class": "definition_short", + "title": "Definition short", + "help_text": "A short definition of the series. The short definition captures the essence of the series.", + "is_recommended": True, + "display_type": "textarea", + }, + { + "key": "series_description.definition_long", + "type": "string", + "class": "definition_long", + "title": "Definition long", + "help_text": 'A long(er) version of the definition of the series. If only one definition is available (not a short/long version), it is recommended to capture it in the "Definition short" element. Alternatively, the same definition can be stored in both "Definition short" and "Definition long".', + "display_type": "textarea", + }, + { + "key": "series_description.definition_references", + "title": "Definition references", + "type": "array", + "props": [ + { + "key": "source", + "title": "Source", + "type": "string", + "name": "Source", + "prop_key": "series_description.definition_references.source", + "help_text": "The source of the definition (title, or label).", + "display_type": "text", + }, + { + "key": "uri", + "title": "URL", + "type": "string", + "rules_": "required", + "prop_key": "series_description.definition_references.uri", + "help_text": "A link (URL) to the source of the definition.", + "rules": {"is_uri": True}, + "display_type": "text", + }, + { + "key": "note", + "title": "Note", + "type": "string", + "prop_key": "series_description.definition_references.note", + "help_text": "This element provides for annotating or explaining the reason the reference has been included as part of the metadata.", + "display_type": "textarea", + }, + ], + "help_text": "This element is provided to link to an external resources from which the definition was extracted.", + }, + { + "key": "series_description.relevance", + "type": "string", + "title": "Relevance", + "help_text": "This field documents the relevance of an indicator or series in relation to a social imperative or policy objective.", + "display_type": "textarea", + }, + { + "key": "series_description.methodology", + "type": "string", + "class": "methodology", + "title": "Methodology", + "help_text": "Methodological details on the production of the series or indicator.", + "display_type": "textarea", + }, + { + "key": "series_description.derivation", + "type": "string", + "title": "Derivation", + "help_text": 'Description of the derivation method (not including imputations, which should be described in element "Imputation").', + "display_type": "textarea", + }, + { + "key": "series_description.imputation", + "type": "string", + "class": "imputation", + "title": "Imputation", + "help_text": "Data may have been imputed to account for data gaps or for other reasons (harmonization/standardization, and others). If imputations have been made, this element provides the space for their description.", + "display_type": "textarea", + }, + { + "key": "series_description.statistical_concept", + "type": "string", + "class": "statistical_concept", + "title": "Statistical concept", + "help_text": "A reference of the series with content of a statistical character. This can include coding concepts or standards that are applied to render the data statistically relevant.", + "display_type": "textarea", + }, + { + "key": "series_description.concepts", + "title": "Related concepts", + "type": "array", + "props": [ + { + "key": "name", + "title": "Name", + "type": "string", + "name": "Concept name", + "rules_": "required", + "prop_key": "series_description.concepts.name", + "help_text": "A concise and standardized name (label) for the concept.", + "display_type": "text", + }, + { + "key": "definition", + "title": "Definition", + "type": "string", + "prop_key": "series_description.concepts.definition", + "help_text": "The definition of the concept.", + "display_type": "textarea", + }, + { + "key": "uri", + "title": "URL", + "type": "string", + "prop_key": "series_description.concepts.uri", + "help_text": "A link (URL) to a resource providing more detailed information on the concept.", + "rules": {"is_uri": True}, + "display_type": "text", + }, + ], + "help_text": 'This repeatable element can be used to document concepts related to the indicators or time series (other than the main statistical concept that may have been entered in "Statistical concept"). For example, the concept of malnutrition could be documented in relation to the indicators “Prevalence of stunting” and “Prevalence of wasting”.', + }, + { + "key": "series_description.aggregation_method", + "type": "string", + "title": "Aggregation method", + "help_text": 'The "Aggregation method" element describes how values can be aggregated from one geographic level (for example, a country) to a higher-level geographic area (for example, a group of country defined based on a geographic criteria (region, world) or another criteria (low/medium/high-income countries, island countries, OECD countries, etc.). The aggregation method can be simple (like “sum” or “population-weighted average”) or more complex, involving weighting of values.', + "display_type": "textarea", + }, + { + "key": "series_description.sources", + "title": "Sources of data", + "type": "array", + "props": [ + { + "key": "id", + "title": "ID", + "type": "string", + "prop_key": "series_description.sources.id", + "help_text": "This element records the Primary ID (unique identifier) of a source of data. If the source does not have a specific unique identifier, a sequential number can be used. If the source is a dataset or database that has its own unique identifier (possibly a DOI), this identifier should be used.", + "display_type": "text", + }, + { + "key": "name", + "title": "Title", + "type": "string", + "name": "Source name", + "rules_": "required", + "prop_key": "series_description.sources.name", + "help_text": "The title (name, or label) of the source of data.", + "display_type": "text", + }, + { + "key": "organization", + "title": "Organization", + "type": "string", + "prop_key": "series_description.sources.organization", + "help_text": "The organization responsible for the source data.", + "display_type": "text", + }, + { + "key": "type", + "title": "Type", + "type": "string", + "name": "Link type", + "prop_key": "series_description.sources.type", + "help_text": "The type of data, e.g. “household survey”, “administrative data”, or “external database”.", + "display_type": "text", + }, + { + "key": "note", + "title": "Notes", + "type": "string", + "prop_key": "series_description.sources.note", + "help_text": "This element can be used to provide additional information regarding the source of data.", + "display_type": "textarea", + }, + ], + "help_text": 'This element provides information on the source(s) of data that were used to generate the indicator. A source can refer to an organization (e.g., “Source: World Health Organization”), or to a dataset (e.g., for a national poverty headcount indicator, the sources will likely be a list of sample household surveys). In sources, we are mainly interested in the latter. When a series in a database is a series extracted from another database (e.g., when the World Bank World Development Indicators include a series from the World Health Organization in its database), the source organization should be mentioned in the "Authoring entity" element of the schema. The sources element is a repeatable element. In international databases where series cover many countries, a series may have a large number of sources (for example, the World Bank poverty headcount data are extracted from hundreds of different national household surveys). The content of this element can thus be quite large. This information is however useful, as it contributes to establish the traceability and credibility of the data.', + }, + { + "key": "series_description.sources_note", + "type": "string", + "title": "Notes on data source", + "help_text": "Additional information on the source(s) of data used to generate the series or indicator.", + "display_type": "textarea", + }, + { + "key": "series_description.data_collection.data_source", + "type": "string", + "title": "Data source", + "help_text": "Data source", + "display_type": "text", + }, + { + "key": "series_description_container16735335060851694030746673", + "title": "Data collection", + "type": "section", + "items": [ + { + "key": "series_description.data_collection.method", + "type": "string", + "title": "Data collection method", + "help_text": "Method", + "display_type": "text", + }, + { + "key": "series_description.data_collection.period", + "type": "string", + "title": "Data collection period", + "help_text": "Period", + "display_type": "text", + }, + { + "key": "series_description.data_collection.note", + "type": "string", + "title": "Data collection note", + "help_text": "Note", + "display_type": "textarea", + }, + { + "key": "series_description.data_collection.uri", + "type": "string", + "title": "Data collection URL", + "help_text": "Data collection URL", + "display_type": "text", + "rules": {"is_uri": True}, + }, + ], + "help_text": "", + }, + ], + "help_text": "", + }, + { + "key": "series_description_container1673533684214", + "title": "Standards and frameworks", + "type": "section", + "items": [ + { + "key": "series_description.compliance", + "title": "Standards", + "type": "array", + "props": [ + { + "key": "standard", + "title": "Name", + "type": "string", + "prop_key": "series_description.compliance.standard", + "help_text": "The name of the standard that the series complies with. This name will ideally include a label and a version or a date. For example: “International Standard Industrial Classification of All Economic Activities (ISIC) Revision 4, published in 2007”", + "display_type": "text", + }, + { + "key": "abbreviation", + "title": "Abbreviation", + "type": "string", + "prop_key": "series_description.compliance.abbreviation", + "help_text": 'The acronym of the standard that the series complies with. For example, "ICD10" for version 10 of the International Classification of Diseases.', + "display_type": "text", + }, + { + "key": "custodian", + "title": "Custodian", + "type": "string", + "prop_key": "series_description.compliance.custodian", + "help_text": "The organization that maintains the standard that is being used for compliance. For example: “United Nations Statistics Division”.", + "display_type": "text", + }, + { + "key": "uri", + "title": "URL", + "type": "string", + "prop_key": "series_description.compliance.uri", + "help_text": "A link to a public website site where information on the compliance standard can be obtained.", + "rules": {"is_uri": True}, + "display_type": "text", + }, + ], + "help_text": "For some indicators, international standards have been established. This is for example the case of indicators like the unemployment or unemployment rate, for which the International Conference of Labour Statisticians defines the standards concepts and methods. The compliance element is used to document the compliance of a series with one or multiple national or international standards.", + }, + { + "key": "series_description.framework", + "title": "Frameworks", + "type": "nested_array", + "props": [ + { + "key": "name", + "title": "Name", + "type": "string", + "prop_key": "series_description.framework.name", + "help_text": 'The name of the monitoring framework. For example, "Sustainable Development Goals".', + "display_type": "text", + }, + { + "key": "abbreviation", + "title": "Abbreviation", + "type": "string", + "prop_key": "series_description.framework.abbreviation", + "help_text": 'The acronym or abbreviation of the framework, for example "SDG" for the Sustainable Development Goals.', + "display_type": "text", + }, + { + "key": "custodian", + "title": "Custodian", + "type": "string", + "prop_key": "series_description.framework.custodian", + "help_text": "The name of the organization that is the official custodian of the framework.", + "display_type": "text", + }, + { + "key": "description", + "title": "Description", + "type": "string", + "prop_key": "series_description.framework.description", + "help_text": "A brief description of the framework.", + "display_type": "textarea", + }, + { + "key": "goal_id", + "title": "Goal ID", + "type": "string", + "prop_key": "series_description.framework.goal_id", + "help_text": "The identifier of the Goal that the indicator or series is associated with.", + "display_type": "text", + }, + { + "key": "goal_name", + "title": "Goal name", + "type": "string", + "prop_key": "series_description.framework.goal_name", + "help_text": "The name (label) of the Goal that the indicator or series is associated with.", + "display_type": "text", + }, + { + "key": "goal_description", + "title": "Goal description", + "type": "string", + "prop_key": "series_description.framework.goal_description", + "help_text": "A brief description of the Goal that the indicator or series is associated with.", + "display_type": "textarea", + }, + { + "key": "target_id", + "title": "Target ID", + "type": "string", + "prop_key": "series_description.framework.target_id", + "help_text": "The identifier of the Target that the indicator or series is associated with.", + "display_type": "text", + }, + { + "key": "target_name", + "title": "Target name", + "type": "string", + "prop_key": "series_description.framework.target_name", + "help_text": "The name (label) of the Target that the indicator or series is associated with.", + "display_type": "text", + }, + { + "key": "target_description", + "title": "Target description", + "type": "string", + "prop_key": "series_description.framework.target_description", + "help_text": "A brief description of the Target that the indicator or series is associated with.", + "display_type": "textarea", + }, + { + "key": "indicator_id", + "title": "Indicator ID", + "type": "string", + "prop_key": "series_description.framework.indicator_id", + "help_text": "The identifier of the indicator, as provided in the framework.", + "display_type": "text", + }, + { + "key": "indicator_name", + "title": "Indicator name", + "type": "string", + "prop_key": "series_description.framework.indicator_name", + "help_text": 'The name of the indicator, as provided in the framework (which may be different from the name provided in "Name").', + "display_type": "text", + }, + { + "key": "indicator_description", + "title": "Indicator description", + "type": "string", + "prop_key": "series_description.framework.indicator_description", + "help_text": "A brief description of the indicator, as provided in the framework.", + "display_type": "textarea", + }, + { + "key": "uri", + "title": "URL", + "type": "string", + "prop_key": "series_description.framework.uri", + "help_text": "A link to a website providing detailed information on the framework, its goals, targets, and indicators.", + "rules": {"is_uri": True}, + "display_type": "text", + }, + { + "key": "notes", + "title": "Notes", + "type": "string", + "prop_key": "series_description.framework.notes", + "help_text": "Any additional information on the relationship between the indicator/series and the framework.", + "display_type": "textarea", + }, + ], + "help_text": "Some national, regional, and international agencies develop monitoring frameworks, with goals, targets, and indicators. Some well-known examples are the Millennium Development Goals and the Sustainable Development Goals which establish international goals for human development, or the World Summit for Children (1990) which set international goals in the areas of child survival, development and protection, supporting sector goals such as women’s health and education, nutrition, child health, water and sanitation, basic education, and children in difficult circumstances. The framework element is used to link an indicator or series to the framework, goal, and target associated with it.", + }, + ], + "help_text": "", + }, + { + "key": "series_description_container1673533307656", + "title": "Quality", + "type": "section", + "items": [ + { + "key": "series_description.limitation", + "type": "string", + "title": "Limitations", + "help_text": "This element is used to communicate to the user any limitations or exceptions in using the data. The limitations may result from the methodology, from issues of quality or consistency in the data source, or other.", + "display_type": "textarea", + }, + { + "key": "series_description.quality_checks", + "type": "string", + "title": "Quality checks", + "help_text": "Data may have gone through data quality checks to assure that the values are reasonable and coherent, which can be described in this element. These quality checks may include checking for outlying values or other. A brief description of such quality control procedures will contribute to reinforcing the credibility of the data being disseminated.", + "display_type": "textarea", + }, + { + "key": "series_description.quality_note", + "type": "string", + "title": "Quality note", + "help_text": "Additional information or an overall statement on data quality. These could for example cover non-standard quality notes and/or information on independent reviews on the data quality.", + "display_type": "textarea", + }, + { + "key": "series_description.validation_rules", + "type": "simple_array", + "title": "Validation rules", + "help_text": "Set of rules to validate values for indicators, e.g. range checks", + "display_type": "text", + }, + { + "key": "series_description.sources_discrepancies", + "type": "string", + "title": "Discrepancies", + "help_text": "This element is used to describe and explain why the data in the series may be different from the data for the same series published in other sources. International organizations, for example, may apply different techniques to make data obtained from national sources comparable across countries, in which cases the data published in international databases may differ from the data published in national, official databases.", + "display_type": "textarea", + }, + { + "key": "series_description.adjustments", + "type": "simple_array", + "title": "Adjustments", + "help_text": "Description of any adjustments with respect to use of standard classifications and harmonization of breakdowns for age group and other dimensions, or adjustments made for compliance with specific international or national definitions.", + "display_type": "textarea", + }, + { + "key": "series_description.missing", + "type": "string", + "class": "missing", + "title": "Missing", + "help_text": "Information on missing values in the series or indicator. This information can be related to treatment of missing values, to the cause(s) of missing values, and others.", + "display_type": "textarea", + }, + { + "key": "series_description.errata", + "type": "array", + "title": "Errata", + "props": [ + { + "key": "type", + "title": "Date", + "type": "string", + "prop_key": "series_description.errata.type", + "help_text": "The date the erratum was published, preferably in ISO format (YYYY-MM-DD).", + "display_type": "text", + }, + { + "key": "description", + "title": "Description", + "type": "string", + "prop_key": "series_description.errata.description", + "help_text": "A brief description of the error and remedy.", + "display_type": "textarea", + }, + ], + "help_text": "A list of errata for the indicator.", + }, + ], + "help_text": "", + }, + { + "key": "series_description_container1674230835280", + "title": "Geographic and time coverage", + "type": "section", + "items": [ + { + "key": "series_description.time_periods", + "title": "Time coverage", + "type": "array", + "props": [ + { + "key": "start", + "title": "Start", + "type": "string", + "name": "time_periods.start", + "rules_": "required", + "prop_key": "series_description.time_periods.start", + "help_text": "The initial date of the series in the dataset. The start date should be entered in ISO 8601 format (YYYY-MM-DD or YYYY-MM or YYYY). A validation rule can be set to enforce the use of a specific date format.", + "display_type": "text", + }, + { + "key": "end", + "title": "End", + "type": "string", + "prop_key": "series_description.time_periods.end", + "help_text": "The end date is the latest date for which an estimate for the indicator is available. The end date should be entered in ISO 8601 format (YYYY-MM-DD or YYYY-MM or YYYY). A validation rule can be set to enforce the use of a specific date format.", + "display_type": "text", + }, + ], + "help_text": "The time period covers the entire span of data available for the series. The time period has a start and an end and is reported according to the periodicity provided in a previous element.\n", + }, + { + "key": "series_description.ref_country", + "title": "Countries", + "help_text": 'A list of countries for which data are available in the series. This element may be redundant with the element "Geographic areas" which could also contain a list of countries, although information does not have to be repeated. Country names should be entered in "Countries" and optionally in "Geographic areas". The element "Geographic areas" can then be used to provide additional information, such as the name of sub-national or supra-national areas (e.g. "Sub-saharan Africa", or "Bangkok". Note that if an indicator is related to a sub-national area of a country, the name of that country should be entered in "Countries". ', + "type": "array", + "props": [ + { + "key": "name", + "title": "Name", + "type": "string", + "prop_key": "series_description.ref_country.name", + "help_text": "The name of the country. Pay attention to use consistent country names across all indicators being documented. Avoid using different names or name spelling for a same country.", + "display_type": "text", + }, + { + "key": "code", + "title": "Code", + "type": "string", + "prop_key": "series_description.ref_country.code", + "help_text": "The code of the country. The use of the ISO 3166-1 alpha-3 codes is recommended.", + "display_type": "text", + }, + ], + "is_recommended": True, + "enum": [ + {"code": "AFG", "name": "Afghanistan"}, + {"code": "AFR", "name": "Africa"}, + {"code": "AFE", "name": "Africa Eastern and Southern"}, + {"code": "AFW", "name": "Africa Western and Central"}, + {"code": "ALB", "name": "Albania"}, + {"code": "DZA", "name": "Algeria"}, + {"code": "ASM", "name": "American Samoa"}, + {"code": "AND", "name": "Andorra"}, + {"code": "AGO", "name": "Angola"}, + {"code": "ATG", "name": "Antigua and Barbuda"}, + {"code": "ARB", "name": "Arab World"}, + {"code": "ARG", "name": "Argentina"}, + {"code": "ARM", "name": "Armenia"}, + {"code": "ABW", "name": "Aruba"}, + {"code": "AUS", "name": "Australia"}, + {"code": "AUT", "name": "Austria"}, + {"code": "AZE", "name": "Azerbaijan"}, + {"code": "BHS", "name": "Bahamas, The"}, + {"code": "BHR", "name": "Bahrain"}, + {"code": "BGD", "name": "Bangladesh"}, + {"code": "BRB", "name": "Barbados"}, + {"code": "BLR", "name": "Belarus"}, + {"code": "BEL", "name": "Belgium"}, + {"code": "BLZ", "name": "Belize"}, + {"code": "BEN", "name": "Benin"}, + {"code": "BMU", "name": "Bermuda"}, + {"code": "BTN", "name": "Bhutan"}, + {"code": "BOL", "name": "Bolivia"}, + {"code": "BIH", "name": "Bosnia and Herzegovina"}, + {"code": "BWA", "name": "Botswana"}, + {"code": "BRA", "name": "Brazil"}, + {"code": "VGB", "name": "British Virgin Islands"}, + {"code": "BRN", "name": "Brunei Darussalam"}, + {"code": "BGR", "name": "Bulgaria"}, + {"code": "BFA", "name": "Burkina Faso"}, + {"code": "BDI", "name": "Burundi"}, + {"code": "CPV", "name": "Cabo Verde"}, + {"code": "KHM", "name": "Cambodia"}, + {"code": "CMR", "name": "Cameroon"}, + {"code": "CAN", "name": "Canada"}, + {"code": "CSS", "name": "Caribbean small states"}, + {"code": "CYM", "name": "Cayman Islands"}, + {"code": "CAF", "name": "Central African Republic"}, + {"code": "CEB", "name": "Central Europe and the Baltics"}, + {"code": "TCD", "name": "Chad"}, + {"code": "CHI", "name": "Channel Islands"}, + {"code": "CHL", "name": "Chile"}, + {"code": "CHN", "name": "China"}, + {"code": "COL", "name": "Colombia"}, + {"code": "COM", "name": "Comoros"}, + {"code": "COD", "name": "Congo, Dem. Rep."}, + {"code": "COG", "name": "Congo, Rep."}, + {"code": "CRI", "name": "Costa Rica"}, + {"code": "CIV", "name": "Côte d'Ivoire"}, + {"code": "HRV", "name": "Croatia"}, + {"code": "CUB", "name": "Cuba"}, + {"code": "CUW", "name": "Curacao"}, + {"code": "CYP", "name": "Cyprus"}, + {"code": "CZE", "name": "Czechia"}, + {"code": "DNK", "name": "Denmark"}, + {"code": "DJI", "name": "Djibouti"}, + {"code": "DMA", "name": "Dominica"}, + {"code": "DOM", "name": "Dominican Republic"}, + {"code": "EAR", "name": "Early-demographic dividend"}, + {"code": "EAS", "name": "East Asia & Pacific"}, + {"code": "EAP", "name": "East Asia & Pacific (excluding high income)"}, + {"code": "BEA", "name": "East Asia & Pacific (IBRD-only countries)"}, + {"code": "TEA", "name": "East Asia & Pacific (IDA & IBRD countries)"}, + {"code": "DEA", "name": "East Asia & Pacific (IDA-eligible countries)"}, + {"code": "CEA", "name": "East Asia and the Pacific (IFC classification)"}, + {"code": "ECU", "name": "Ecuador"}, + {"code": "EGY", "name": "Egypt, Arab Rep."}, + {"code": "SLV", "name": "El Salvador"}, + {"code": "GNQ", "name": "Equatorial Guinea"}, + {"code": "ERI", "name": "Eritrea"}, + {"code": "EST", "name": "Estonia"}, + {"code": "SWZ", "name": "Eswatini"}, + {"code": "ETH", "name": "Ethiopia"}, + {"code": "EMU", "name": "Euro area"}, + {"code": "ECS", "name": "Europe & Central Asia"}, + {"code": "ECA", "name": "Europe & Central Asia (excluding high income)"}, + {"code": "BEC", "name": "Europe & Central Asia (IBRD-only countries)"}, + {"code": "TEC", "name": "Europe & Central Asia (IDA & IBRD countries)"}, + {"code": "DEC", "name": "Europe & Central Asia (IDA-eligible countries)"}, + {"code": "CEU", "name": "Europe and Central Asia (IFC classification)"}, + {"code": "EUU", "name": "European Union"}, + {"code": "FRO", "name": "Faroe Islands"}, + {"code": "FJI", "name": "Fiji"}, + {"code": "FIN", "name": "Finland"}, + {"code": "FCS", "name": "Fragile and conflict affected situations"}, + {"code": "FRA", "name": "France"}, + {"code": "PYF", "name": "French Polynesia"}, + {"code": "GAB", "name": "Gabon"}, + {"code": "GMB", "name": "Gambia, The"}, + {"code": "GEO", "name": "Georgia"}, + {"code": "DEU", "name": "Germany"}, + {"code": "GHA", "name": "Ghana"}, + {"code": "GIB", "name": "Gibraltar"}, + {"code": "GRC", "name": "Greece"}, + {"code": "GRL", "name": "Greenland"}, + {"code": "GRD", "name": "Grenada"}, + {"code": "GUM", "name": "Guam"}, + {"code": "GTM", "name": "Guatemala"}, + {"code": "GIN", "name": "Guinea"}, + {"code": "GNB", "name": "Guinea-Bissau"}, + {"code": "GUY", "name": "Guyana"}, + {"code": "HTI", "name": "Haiti"}, + {"code": "HPC", "name": "Heavily indebted poor countries (HIPC)"}, + {"code": "HIC", "name": "High income"}, + {"code": "HND", "name": "Honduras"}, + {"code": "HKG", "name": "Hong Kong SAR, China"}, + {"code": "HUN", "name": "Hungary"}, + {"code": "BHI", "name": "IBRD countries classified as high income"}, + {"code": "IBD", "name": "IBRD only"}, + {"code": "IBB", "name": "IBRD, including blend"}, + {"code": "ISL", "name": "Iceland"}, + {"code": "IBT", "name": "IDA & IBRD total"}, + {"code": "IDB", "name": "IDA blend"}, + {"code": "DFS", "name": "IDA countries classified as Fragile Situations"}, + { + "code": "FXS", + "name": "IDA countries classified as fragile situations, excluding Sub-Saharan Africa", + }, + { + "code": "DSF", + "name": "IDA countries in Sub-Saharan Africa classified as fragile situations ", + }, + { + "code": "DNS", + "name": "IDA countries in Sub-Saharan Africa not classified as fragile situations ", + }, + {"code": "DNF", "name": "IDA countries not classified as Fragile Situations"}, + { + "code": "NXS", + "name": "IDA countries not classified as fragile situations, excluding Sub-Saharan Africa", + }, + {"code": "IDX", "name": "IDA only"}, + {"code": "IDA", "name": "IDA total"}, + {"code": "IND", "name": "India"}, + {"code": "IDN", "name": "Indonesia"}, + {"code": "IRN", "name": "Iran, Islamic Rep."}, + {"code": "IRQ", "name": "Iraq"}, + {"code": "IRL", "name": "Ireland"}, + {"code": "IMN", "name": "Isle of Man"}, + {"code": "ISR", "name": "Israel"}, + {"code": "ITA", "name": "Italy"}, + {"code": "JAM", "name": "Jamaica"}, + {"code": "JPN", "name": "Japan"}, + {"code": "JOR", "name": "Jordan"}, + {"code": "KAZ", "name": "Kazakhstan"}, + {"code": "KEN", "name": "Kenya"}, + {"code": "KIR", "name": "Kiribati"}, + {"code": "PRK", "name": "Korea, Dem. People's Rep."}, + {"code": "KOR", "name": "Korea, Rep."}, + {"code": "XKX", "name": "Kosovo"}, + {"code": "KWT", "name": "Kuwait"}, + {"code": "KGZ", "name": "Kyrgyz Republic"}, + {"code": "LAO", "name": "Lao PDR"}, + {"code": "LTE", "name": "Late-demographic dividend"}, + {"code": "LCN", "name": "Latin America & Caribbean "}, + {"code": "LAC", "name": "Latin America & Caribbean (excluding high income)"}, + {"code": "BLA", "name": "Latin America & the Caribbean (IBRD-only countries)"}, + {"code": "TLA", "name": "Latin America & the Caribbean (IDA & IBRD countries)"}, + {"code": "DLA", "name": "Latin America & the Caribbean (IDA-eligible countries)"}, + {"code": "CLA", "name": "Latin America and the Caribbean (IFC classification)"}, + {"code": "LVA", "name": "Latvia"}, + {"code": "LDC", "name": "Least developed countries: UN classification"}, + {"code": "LBN", "name": "Lebanon"}, + {"code": "LSO", "name": "Lesotho"}, + {"code": "LBR", "name": "Liberia"}, + {"code": "LBY", "name": "Libya"}, + {"code": "LIE", "name": "Liechtenstein"}, + {"code": "LTU", "name": "Lithuania"}, + {"code": "LMY", "name": "Low & middle income"}, + {"code": "LIC", "name": "Low income"}, + {"code": "LMC", "name": "Lower middle income"}, + {"code": "LUX", "name": "Luxembourg"}, + {"code": "MAC", "name": "Macao SAR, China"}, + {"code": "MDG", "name": "Madagascar"}, + {"code": "MWI", "name": "Malawi"}, + {"code": "MYS", "name": "Malaysia"}, + {"code": "MDV", "name": "Maldives"}, + {"code": "MLI", "name": "Mali"}, + {"code": "MLT", "name": "Malta"}, + {"code": "MHL", "name": "Marshall Islands"}, + {"code": "MRT", "name": "Mauritania"}, + {"code": "MUS", "name": "Mauritius"}, + {"code": "MEX", "name": "Mexico"}, + {"code": "FSM", "name": "Micronesia, Fed. Sts."}, + {"code": "MDE", "name": "Middle East (developing only)"}, + {"code": "MEA", "name": "Middle East & North Africa"}, + {"code": "MNA", "name": "Middle East & North Africa (excluding high income)"}, + {"code": "BMN", "name": "Middle East & North Africa (IBRD-only countries)"}, + {"code": "TMN", "name": "Middle East & North Africa (IDA & IBRD countries)"}, + {"code": "DMN", "name": "Middle East & North Africa (IDA-eligible countries)"}, + {"code": "CME", "name": "Middle East and North Africa (IFC classification)"}, + {"code": "MIC", "name": "Middle income"}, + {"code": "MDA", "name": "Moldova"}, + {"code": "MCO", "name": "Monaco"}, + {"code": "MNG", "name": "Mongolia"}, + {"code": "MNE", "name": "Montenegro"}, + {"code": "MAR", "name": "Morocco"}, + {"code": "MOZ", "name": "Mozambique"}, + {"code": "MMR", "name": "Myanmar"}, + {"code": "NAM", "name": "Namibia"}, + {"code": "NRU", "name": "Nauru"}, + {"code": "NPL", "name": "Nepal"}, + {"code": "NLD", "name": "Netherlands"}, + {"code": "NCL", "name": "New Caledonia"}, + {"code": "NZL", "name": "New Zealand"}, + {"code": "NIC", "name": "Nicaragua"}, + {"code": "NER", "name": "Niger"}, + {"code": "NGA", "name": "Nigeria"}, + {"code": "NRS", "name": "Non-resource rich Sub-Saharan Africa countries"}, + {"code": "NAF", "name": "North Africa"}, + {"code": "NAC", "name": "North America"}, + {"code": "MKD", "name": "North Macedonia"}, + {"code": "MNP", "name": "Northern Mariana Islands"}, + {"code": "NOR", "name": "Norway"}, + {"code": "INX", "name": "Not classified"}, + {"code": "OED", "name": "OECD members"}, + {"code": "OMN", "name": "Oman"}, + {"code": "OSS", "name": "Other small states"}, + {"code": "PSS", "name": "Pacific island small states"}, + {"code": "PAK", "name": "Pakistan"}, + {"code": "PLW", "name": "Palau"}, + {"code": "PAN", "name": "Panama"}, + {"code": "PNG", "name": "Papua New Guinea"}, + {"code": "PRY", "name": "Paraguay"}, + {"code": "PER", "name": "Peru"}, + {"code": "PHL", "name": "Philippines"}, + {"code": "POL", "name": "Poland"}, + {"code": "PRT", "name": "Portugal"}, + {"code": "PST", "name": "Post-demographic dividend"}, + {"code": "PRE", "name": "Pre-demographic dividend"}, + {"code": "PRI", "name": "Puerto Rico"}, + {"code": "QAT", "name": "Qatar"}, + {"code": "RRS", "name": "Resource rich Sub-Saharan Africa countries"}, + {"code": "ROU", "name": "Romania"}, + {"code": "RUS", "name": "Russian Federation"}, + {"code": "RWA", "name": "Rwanda"}, + {"code": "WSM", "name": "Samoa"}, + {"code": "SMR", "name": "San Marino"}, + {"code": "STP", "name": "Sao Tome and Principe"}, + {"code": "SAU", "name": "Saudi Arabia"}, + {"code": "SEN", "name": "Senegal"}, + {"code": "SRB", "name": "Serbia"}, + {"code": "SYC", "name": "Seychelles"}, + {"code": "SLE", "name": "Sierra Leone"}, + {"code": "SGP", "name": "Singapore"}, + {"code": "SXM", "name": "Sint Maarten (Dutch part)"}, + {"code": "SVK", "name": "Slovak Republic"}, + {"code": "SVN", "name": "Slovenia"}, + {"code": "SST", "name": "Small states"}, + {"code": "SLB", "name": "Solomon Islands"}, + {"code": "SOM", "name": "Somalia"}, + {"code": "ZAF", "name": "South Africa"}, + {"code": "SAS", "name": "South Asia"}, + {"code": "TSA", "name": "South Asia (IDA & IBRD)"}, + {"code": "DSA", "name": "South Asia (IDA-eligible countries)"}, + {"code": "CSA", "name": "South Asia (IFC classification)"}, + {"code": "SSD", "name": "South Sudan"}, + {"code": "ESP", "name": "Spain"}, + {"code": "LKA", "name": "Sri Lanka"}, + {"code": "KNA", "name": "St. Kitts and Nevis"}, + {"code": "LCA", "name": "St. Lucia"}, + {"code": "MAF", "name": "St. Martin (French part)"}, + {"code": "VCT", "name": "St. Vincent and the Grenadines"}, + {"code": "SSF", "name": "Sub-Saharan Africa "}, + {"code": "SSA", "name": "Sub-Saharan Africa (excluding high income)"}, + {"code": "BSS", "name": "Sub-Saharan Africa (IBRD-only countries)"}, + {"code": "TSS", "name": "Sub-Saharan Africa (IDA & IBRD countries)"}, + {"code": "DSS", "name": "Sub-Saharan Africa (IDA-eligible countries)"}, + {"code": "CAA", "name": "Sub-Saharan Africa (IFC classification)"}, + {"code": "SXZ", "name": "Sub-Saharan Africa excluding South Africa"}, + {"code": "XZN", "name": "Sub-Saharan Africa excluding South Africa and Nigeria"}, + {"code": "SDN", "name": "Sudan"}, + {"code": "SUR", "name": "Suriname"}, + {"code": "SWE", "name": "Sweden"}, + {"code": "CHE", "name": "Switzerland"}, + {"code": "SYR", "name": "Syrian Arab Republic"}, + {"code": "TWN", "name": "Taiwan, China"}, + {"code": "TJK", "name": "Tajikistan"}, + {"code": "TZA", "name": "Tanzania"}, + {"code": "THA", "name": "Thailand"}, + {"code": "TLS", "name": "Timor-Leste"}, + {"code": "TGO", "name": "Togo"}, + {"code": "TON", "name": "Tonga"}, + {"code": "TTO", "name": "Trinidad and Tobago"}, + {"code": "TUN", "name": "Tunisia"}, + {"code": "TUR", "name": "Turkiye"}, + {"code": "TKM", "name": "Turkmenistan"}, + {"code": "TCA", "name": "Turks and Caicos Islands"}, + {"code": "TUV", "name": "Tuvalu"}, + {"code": "UGA", "name": "Uganda"}, + {"code": "UKR", "name": "Ukraine"}, + {"code": "ARE", "name": "United Arab Emirates"}, + {"code": "GBR", "name": "United Kingdom"}, + {"code": "USA", "name": "United States"}, + {"code": "UMC", "name": "Upper middle income"}, + {"code": "URY", "name": "Uruguay"}, + {"code": "UZB", "name": "Uzbekistan"}, + {"code": "VUT", "name": "Vanuatu"}, + {"code": "VEN", "name": "Venezuela, RB"}, + {"code": "VNM", "name": "Vietnam"}, + {"code": "VIR", "name": "Virgin Islands (U.S.)"}, + {"code": "PSE", "name": "West Bank and Gaza"}, + {"code": "WLD", "name": "World"}, + {"code": "YEM", "name": "Yemen, Rep."}, + {"code": "ZMB", "name": "Zambia"}, + {"code": "ZWE", "name": "Zimbabwe"}, + ], + }, + { + "key": "series_description.geographic_units", + "title": "Geographic areas", + "type": "array", + "props": [ + { + "key": "name", + "title": "Name", + "type": "string", + "name": "Geographic unit name", + "rules_": "required", + "prop_key": "series_description.geographic_units.name", + "help_text": 'Name of the geographic unit e.g. “World, ”Africa“, ”OECD countries“, ”Bangkok".', + "display_type": "text", + }, + { + "key": "code", + "title": "Code", + "type": "string", + "prop_key": "series_description.geographic_units.code", + "help_text": "Code of the geographic unit. The ISO 3166-1 alpha-3 code is preferred when the unit is a country.", + "display_type": "text", + }, + { + "key": "type", + "title": "Type", + "type": "string", + "prop_key": "series_description.geographic_units.type", + "help_text": "Type of geographic unit e.g. “country”, “state”, “region”, “province”, “city”, etc.", + "display_type": "text", + }, + ], + "help_text": 'List of geographic units (regions, countries, states, provinces, etc.) for which data are available for the series. Note that country names should be entered in "Countries" (although they may be included in this element as well).', + }, + { + "key": "series_description.bbox", + "title": "Bounding box", + "type": "array", + "props": [ + { + "key": "west", + "title": "West", + "type": "string", + "prop_key": "series_description.bbox.west", + "help_text": "West longitude of the bounding box.", + "display_type": "text", + }, + { + "key": "east", + "title": "East", + "type": "string", + "prop_key": "series_description.bbox.east", + "help_text": "East longitude of the bounding box.", + "display_type": "text", + }, + { + "key": "south", + "title": "South", + "type": "string", + "prop_key": "series_description.bbox.south", + "help_text": "South latitude of the bounding box.", + "display_type": "text", + }, + { + "key": "north", + "title": "North", + "type": "string", + "prop_key": "series_description.bbox.north", + "help_text": "North latitude of the bounding box.", + "display_type": "text", + }, + ], + "help_text": "This element is used to define one or multiple geographic bounding box(es), which are the rectangular fundamental geometric description of the geographic coverage of the data. A bounding box is defined by west and east longitudes and north and south latitudes, and includes the largest geographic extent of the dataset’s geographic coverage. The bounding box provides the geographic coordinates of the top left (north/west) and bottom-right (south/east) corners of a rectangular area. This element can be used in catalogs as the first pass of a coordinate-based search. The valid range of latitude in degrees is -90 and +90 for the southern and northern hemisphere, respectively. Longitude is in the range -180 and +180 specifying coordinates west and east of the Prime Meridian, respectively.", + }, + ], + "help_text": "", + }, + { + "type": "section", + "key": "series_description", + "title": "Description", + "class": "mandatory recommended", + "expanded": True, + "items": [ + { + "key": "series_description.authoring_entity", + "title": "Authoring entity", + "type": "array", + "props": [ + { + "key": "name", + "title": "Name", + "type": "string", + "prop_key": "series_description.authoring_entity.name", + "help_text": "The name of the person or organization who is responsible for the production of the indicator or series. ", + "display_type": "text", + }, + { + "key": "affiliation", + "title": "Affiliation", + "type": "string", + "prop_key": "series_description.authoring_entity.affiliation", + "help_text": 'The affiliation of the person or organization mentioned in "Name".', + "display_type": "text", + }, + { + "key": "abbreviation", + "title": "Abbreviation", + "type": "string", + "prop_key": "series_description.authoring_entity.abbreviation", + "help_text": 'Abbreviated name (acronym) of the organization mentioned in "Name".', + "display_type": "text", + }, + { + "key": "email", + "title": "Email", + "type": "string", + "prop_key": "series_description.authoring_entity.email", + "help_text": 'The public email contact of the person or organizations mentioned in "Name". It is good practice to provide a service account email address, not a personal one.', + "display_type": "text", + }, + { + "key": "uri", + "title": "URL", + "type": "string", + "prop_key": "series_description.authoring_entity.uri", + "help_text": 'A link (URL) to the website of the entity mentioned in "Name".', + "rules": {"is_uri": True}, + "display_type": "text", + }, + ], + "help_text": 'This repeatable set of elements is used to identify the organization(s) or person(s) who are the main producers/curators of the indicator. Note that a similar element is provided at the database level. The "Authoring entity" for the indicator can be different from the "Authoring entity" of the database. For example, the World Bank is the authoring entity for the World Development Indicators database, but the database contains indicators obtained from the International Monetary Fund, the World Health Organization, and other organizations that are thus the authoring entities for their respective indicators.', + "is_recommended": True, + }, + { + "key": "series_description.mandate.mandate", + "type": "string", + "title": "Mandate", + "display_type": "text", + "help_text": "Description of the institutional mandate or of a set of rules or other formal set of instructions assigning responsibility as well as the authority to an organization for the collection, processing, and dissemination of statistics for this indicator.", + }, + { + "key": "series_description.mandate.uri", + "type": "string", + "title": "Mandate URL", + "help_text": "A URL to a description of the institutional mandate.", + "display_type": "text", + "rules": {"is_uri": True}, + }, + { + "key": "series_description.measurement_unit", + "type": "string", + "class": "measurement_unit", + "title": "Measurement unit", + "help_text": 'The unit of measurement. Note that in many databases the measurement unit will be included in the series name/label. In the World Bank’s World Development Indicators for example, series are named as follows:\n- CO2 emissions (kg per 2010 US$ of GDP)\n- GDP per capita (current US$)\n- GDP per capita (current LCU)\n- Population density (people per sq. km of land area)\nIn such case, the name of the series should not be changed, but the measurement unit may be extracted from it and stored in element "Measurement unit".', + "is_recommended": True, + "display_type": "text", + }, + { + "key": "series_description.dimensions", + "title": "Dimensions", + "type": "array", + "props": [ + { + "key": "name", + "title": "Name", + "type": "string", + "prop_key": "series_description.dimensions.name", + "help_text": "Identifier of the dimension", + "display_type": "text", + }, + { + "key": "label", + "title": "Label", + "type": "string", + "prop_key": "series_description.dimensions.label", + "help_text": "The label of the disaggregation level, for example “sex”, or “urban/rural”.", + "display_type": "text", + }, + { + "key": "description", + "title": "Description", + "type": "string", + "prop_key": "series_description.dimensions.description", + "help_text": "A description of the disaggregation level (for example, if the label was “age group”, the description can provide detailed information on the age groups, e.g. “The age groups in the database are 0-14, 15-49, 50-64, and 65+ years old”.)", + "display_type": "textarea", + }, + ], + "help_text": 'An indicator or time series can be made available at different levels of disaggregation. For example, an indicator containing estimates of the “Population” of a country by year can be available by sex. The data curators in such case will have two options: (i) create and document three separate indicators, namely “Population, Total”, “Population, Female”, and “Population, Male”; or create a single indicator “Population” and attach a dimension “sex” to it, with values “Total”, “Female”, and “Male”. The dimensions are features (or “variables”) that define the different levels of disaggregation within an indicator/series. The element dimensions is used to provide an itemized list of disaggregations that correspond exactly to the published data. Note that when an indicator is available at two “non-overlapping” levels of disaggregation, it should be split into two indicators. For example, if the "Population" indicator is available by male/female and by urban/rural, but not by male/urban/male/rural/female urban/female rural, it should be treated as two separate indicators (“Population by sex” with dimension sex = “male / female” and “Population by area of residence” with dimension area = “urban / rural”.) Note also that another element in the schema, disaggregation, is also provided, in which a narrative description of the actual or recommended disaggregation can be documented.\n', + }, + { + "key": "series_description.release_calendar", + "title": "Release calendar", + "type": "string", + "help_text": 'Information on the expected dates of updates for the indicator. For example: "Every first Monday of the month".', + "display_type": "textarea", + }, + { + "key": "series_description.periodicity", + "type": "string", + "class": "periodicity", + "title": "Periodicity", + "help_text": "The periodicity of the series. It is recommended to use a controlled vocabulary with values like annual, quarterly, monthly, daily, ad-hoc, etc.", + "is_recommended": True, + "display_type": "dropdown-custom", + "enum": [ + {"code": "ann", "label": "Annual"}, + {"label": "Semi-annual", "code": "sem"}, + {"code": "qua", "label": "Quarterly"}, + {"code": "mon", "label": "Monthly"}, + {"code": "bim", "label": "Bi-monthly"}, + {"label": "Weekly", "code": "wee"}, + {"code": "biw", "label": "Bi-weekly"}, + {"code": "day", "label": "Daily"}, + {"label": "Hourly", "code": "hou"}, + {"label": "Ad hoc", "code": "irr"}, + ], + }, + { + "key": "series_description.base_period", + "type": "string", + "class": "base_period", + "title": "Base period", + "help_text": "The base period for the series. This field will only apply to series that require a base year (or other reference time) used as a benchmark, like a Consumer Price Index (CPI) which will have a value of 100 for a reference base year.", + "display_type": "text", + }, + { + "key": "series_description.series_break", + "type": "string", + "title": "Breaks in series", + "help_text": "Breaks in statistical series occur when there is a change in the standards, sources of data, or reference year used in the compilation of a series. Breaks in series must be well documented. The documentation should include the reason(s) for the break, the time it occured, and information on the impact on comparability of data over time.", + "display_type": "textarea", + }, + { + "key": "series_description.keywords", + "title": "Keywords", + "type": "array", + "props": [ + { + "key": "name", + "title": "Keyword", + "type": "string", + "name": "Source name", + "rules_": "required", + "prop_key": "series_description.keywords.name", + "help_text": "The keyword (or phrase) itself. ", + "display_type": "text", + }, + { + "key": "vocabulary", + "title": "Vocabulary", + "type": "string", + "prop_key": "series_description.keywords.vocabulary", + "help_text": "The controlled vocabulary (including version number or date) from which the keyword is extracted, if any.", + "display_type": "text", + }, + { + "key": "uri", + "title": "URL", + "type": "string", + "prop_key": "series_description.keywords.uri", + "help_text": "The URL of the controlled vocabulary from which the keyword is extracted, if any.", + "rules": {"is_uri": True}, + "display_type": "text", + }, + ], + "help_text": "Keywords are words or phrases that describe salient aspects of what the indicator measures. The addition of keywords can significantly improve the discoverability of data and is thus recommended. Keywords can summarize and improve the description of the content or subject matter of a resource. Keywords can be selected from a standard thesaurus, preferably an international, multilingual thesaurus. Or they can be suggested by machine learning models. A controlled vocabulary can be used in user templates.", + "is_recommended": True, + }, + { + "key": "series_description.topics", + "title": "Topics", + "type": "array", + "props": [ + { + "key": "id", + "title": "ID", + "type": "string", + "rules_": "required", + "prop_key": "series_description.topics.id", + "help_text": "The unique identifier of the topic. It can be a sequential number, or the ID of the topic in a controlled vocabulary.", + "display_type": "text", + }, + { + "key": "name", + "title": "Label", + "type": "string", + "name": "Topic name", + "rules_": "required", + "prop_key": "series_description.topics.name", + "help_text": "The label of the topic. ", + "display_type": "text", + }, + { + "key": "parent_id", + "title": "Parent ID", + "type": "string", + "help_text": 'When a hierarchical (nested) controlled vocabulary is used, the "Parent ID" field can be used to indicate a higher-level topic to which this topic belongs.', + "prop_key": "series_description.topics.parent_id", + "display_type": "text", + }, + { + "key": "vocabulary", + "title": "Vocabulary", + "type": "string", + "prop_key": "series_description.topics.vocabulary", + "help_text": "The specification (name including the version and date) of the controlled vocabulary from which the topic is taken.", + "display_type": "text", + }, + { + "key": "uri", + "title": "URL", + "type": "string", + "prop_key": "series_description.topics.uri", + "help_text": "A link (URL) to the controlled vocabulary website.", + "rules": {"is_uri": True}, + "display_type": "text", + }, + ], + "help_text": '"Topics" indicate the broad substantive topic(s) that the indicator/series covers. A topic classification facilitates referencing and searches in electronic survey catalogs; topics should thus be selected from a standard controlled vocabulary, for example the CESSDA Topics classification (a typology of topics available in 11 languages), or the Journal of Economic Literature (JEL) Classification System. Note that you may combine topics from more than one controlled vocabulary. ', + }, + { + "key": "series_description.themes", + "title": "Themes", + "type": "array", + "props": [ + { + "key": "id", + "title": "ID", + "type": "string", + "rules_": "required", + "prop_key": "series_description.themes.id", + "help_text": "The unique identifier of the theme. It can be a sequential number, or the ID of the theme in a controlled vocabulary.", + "display_type": "text", + }, + { + "key": "name", + "title": "Name", + "type": "string", + "name": "Topic name", + "rules_": "required", + "prop_key": "series_description.themes.name", + "help_text": "The label of the theme associated with the data.", + "display_type": "text", + }, + { + "key": "parent_id", + "title": "Parent ID", + "type": "string", + "help_text": 'When a hierarchical (nested) controlled vocabulary is used, the "Parent ID" field can be used to indicate a higher-level theme to which this theme belongs.', + "prop_key": "series_description.themes.parent_id", + "display_type": "text", + }, + { + "key": "vocabulary", + "title": "Vocabulary", + "type": "string", + "prop_key": "series_description.themes.vocabulary", + "help_text": "The name of the controlled vocabulary used, if any.", + "display_type": "text", + }, + { + "key": "uri", + "title": "URL", + "type": "string", + "prop_key": "series_description.themes.uri", + "help_text": 'A link to the controlled vocabulary mentioned in field "Vocabulary".', + "rules": {"is_uri": True}, + "display_type": "text", + }, + ], + "help_text": "Themes provide a general idea of the research that might guide the creation and/or demand for the series. A theme is broad and is likely also subject to a community based definition or list. A controlled vocabulary should be used. This element will rarely be used (the element topics described below will be used more often).", + }, + { + "key": "series_description.disciplines", + "title": "Disciplines", + "type": "array", + "help_text": "Information on the academic disciplines related to the content of the document. A controlled vocabulary will preferably be used, for example the one provided by the list of academic fields in Wikipedia.", + "props": [ + { + "key": "id", + "title": "ID", + "type": "string", + "rules_": "required", + "prop_key": "series_description.disciplines.id", + "help_text": "The ID of the discipline, preferably taken from a controlled vocabulary.", + "display_type": "text", + }, + { + "key": "name", + "title": "Name", + "type": "string", + "name": "Topic name", + "rules_": "required", + "prop_key": "series_description.disciplines.name", + "help_text": "The name (label) of the discipline, preferably taken from a controlled vocabulary.", + "display_type": "text", + }, + { + "key": "parent_id", + "title": "Parent ID", + "type": "string", + "help_text": "The parent ID of the discipline (ID of the item one level up in the hierarchy), if a hierarchical controlled vocabulary is used.", + "prop_key": "series_description.disciplines.parent_id", + "display_type": "text", + }, + { + "key": "vocabulary", + "title": "Vocabulary", + "type": "string", + "prop_key": "series_description.disciplines.vocabulary", + "help_text": "The name (including version number) of the controlled vocabulary used, if any.", + "display_type": "text", + }, + { + "key": "uri", + "title": "URL", + "type": "string", + "prop_key": "series_description.disciplines.uri", + "help_text": "The URL to the controlled vocabulary used, if any.", + "rules": {"is_uri": True}, + "display_type": "text", + }, + ], + }, + { + "key": "series_description.disaggregation", + "type": "string", + "title": "Disaggregation", + "help_text": "This element is intended to inform users that an indicator or series is available at various levels of disaggregation. The related series should be listed (by name and/or identifier). For indicator “Population, total” for example, one may inform the user that the indicator is also available (in other series) by sex, urban/rural, and age group (in series “Population, male” and “Population, female”, etc.).", + "display_type": "textarea", + }, + { + "key": "series_description.languages", + "title": "Language", + "type": "array", + "props": [ + { + "key": "name", + "title": "Name", + "type": "string", + "prop_key": "series_description.languages.name", + "help_text": "The name of the language.", + "display_type": "text", + }, + { + "key": "code", + "title": "Code", + "type": "string", + "prop_key": "series_description.languages.code", + "help_text": "The code of the language.", + "display_type": "text", + }, + ], + "help_text": "The language of the indicator/series metadata. For the language codes and names, the use of the ISO 639-2 standard is recommended.", + }, + { + "key": "series_description.acronyms", + "title": "Acronyms", + "type": "array", + "props": [ + { + "key": "acronym", + "title": "Acronym", + "type": "string", + "name": "Acronym", + "rules_": "required", + "prop_key": "series_description.acronyms.acronym", + "help_text": "An acronym referenced in the series metadata (e.g. “GDP”).", + "display_type": "text", + }, + { + "key": "expansion", + "title": "Expansion", + "type": "string", + "rules_": "required", + "prop_key": "series_description.acronyms.expansion", + "help_text": "The expansion of the acronym, i.e. the full name or title that it represents (e.g., “Gross Domestic Product” for GDP).", + "display_type": "text", + }, + { + "key": "occurence", + "title": "Occurence", + "type": "integer", + "prop_key": "series_description.acronyms.occurence", + "help_text": "This numeric element can be used to indicate the number of times the acronym is mentioned in the metadata. The element will rarely be used.", + "display_type": "text", + }, + ], + "help_text": "The acronyms element is used to document the meaning of all acronyms used in the metadata of a series. If some acronyms are well known (like “GDP”, or “IMF” for example), others may be less obvious or could be uncertain (does “PPP” mean “public-private partnership”, or “purchasing power parity”?). In any case, providing a list of acronyms with their meaning will help users and make your metadata more discoverable. Note that acronyms should not include country codes used in the documentation of the geographic coverage of the data.", + }, + { + "key": "series_description.related_indicators", + "title": "Related indicators", + "type": "array", + "props": [ + { + "key": "code", + "title": "Code", + "type": "string", + "prop_key": "series_description.related_indicators.code", + "help_text": "The code for the indicator that is referenced in the document. It will likely be an ID that is used by that indicator.", + "display_type": "text", + }, + { + "key": "uri", + "title": "URL", + "type": "string", + "prop_key": "series_description.related_indicators.uri", + "help_text": "A link to the related indicator.", + "rules": {"is_uri": True}, + "display_type": "text", + }, + { + "key": "label", + "title": "Name", + "type": "string", + "prop_key": "series_description.related_indicators.label", + "help_text": "The name or label of the indicator that is associated with the indicator being documented.", + "display_type": "text", + }, + { + "key": "relationship", + "title": "Relationship", + "type": "string", + "prop_key": "series_description.related_indicators.relationship", + "help_text": "", + "display_type": "text", + }, + { + "key": "type", + "title": "Type", + "type": "string", + "prop_key": "series_description.related_indicators.type", + "help_text": "", + "display_type": "text", + }, + ], + "help_text": "This element allows to reference indicators that are often associated with the indicator being documented.", + }, + { + "key": "series_description.series_groups", + "title": "Indicator groups", + "type": "array", + "props": [ + { + "key": "name", + "title": "Group name", + "type": "string", + "rules_": "required", + "prop_key": "series_description.series_groups.name", + "help_text": "The name of the indicator/series group.", + "display_type": "text", + }, + { + "key": "description", + "title": "Description", + "type": "string", + "rules_": "required", + "prop_key": "series_description.series_groups.description", + "help_text": "A brief description of the indicator/series group.", + "display_type": "textarea", + }, + { + "key": "version", + "title": "Version", + "type": "string", + "prop_key": "series_description.series_groups.version", + "help_text": "The version of the group.", + "display_type": "text", + }, + { + "key": "uri", + "title": "URL", + "type": "string", + "prop_key": "series_description.series_groups.uri", + "help_text": "A URL to a site describing the grouping.", + "rules": {"is_uri": True}, + "display_type": "text", + }, + ], + "help_text": "This element allows organizing indicators and series by thematic or other groups. These groups are “virtual” and do not affect the data. One indicator/series can belong to more than one group.", + }, + { + "key": "series_description.notes", + "title": "Notes", + "type": "array", + "props": [ + { + "key": "note", + "title": "Note", + "type": "string", + "prop_key": "series_description.notes.note", + "help_text": "The note itself.", + "display_type": "textarea", + }, + { + "key": "type", + "title": "Type", + "type": "string", + "prop_key": "series_description.notes.type", + "help_text": "The type of note. This element should make use of a controlled vocabulary to organize the notes into categories. ", + "display_type": "text", + }, + ], + "help_text": "This element is open and reserved for explanatory notes deemed useful to the users of the data. Notes should account for additional information that might help: replicate the series; access the data and research area, or discoverability in general.", + }, + ], + }, + { + "key": "series_description_container1674231510403", + "title": "Access and use", + "type": "section", + "items": [ + { + "key": "series_description.license", + "title": "License", + "type": "array", + "props": [ + { + "key": "name", + "title": "Name", + "type": "string", + "prop_key": "series_description.license.name", + "help_text": "The name of the license, for example “Creative Commons Attribution 4.0 International license (CC-BY 4.0)”.", + "display_type": "text", + }, + { + "key": "uri", + "title": "URL", + "type": "string", + "prop_key": "series_description.license.uri", + "help_text": "A URL where detailed information on the license / terms of use can be found.", + "rules": {"is_uri": True}, + "display_type": "text", + }, + { + "key": "note", + "title": "Note", + "type": "string", + "prop_key": "series_description.license.note", + "help_text": "Additional information on the license.", + "display_type": "textarea", + }, + ], + "help_text": "This set of elements is used to describe the access license(s) attached to the indicator/series.", + }, + { + "key": "series_description.confidentiality", + "type": "string", + "title": "Confidentiality statement", + "help_text": "A statement of confidentiality for the series.", + "display_type": "textarea", + }, + { + "key": "series_description.confidentiality_status", + "type": "string", + "title": "Confidentiality status", + "help_text": 'This indicates a confidentiality status for the series. A controlled vocabulary should be used with possible options “public”, “official use only”, “confidential”, “strictly confidential”, "unknown". When all series are made publicly available, and belong to a database that has an open or public access policy, this element can be ignored.', + "enum": [ + {"code": "pub", "label": "Public"}, + {"code": "off", "label": "Official use only"}, + {"label": "Restricted", "code": "res"}, + {"code": "con", "label": "Confidential"}, + {"code": "sco", "label": "Strictly confidential"}, + {"code": "unk", "label": "Unknown"}, + ], + "display_type": "text", + }, + { + "key": "series_description.confidentiality_note", + "type": "string", + "title": "Confidentiality note", + "enum": [], + "help_text": "This element is reserved for additional notes regarding confidentiality of the data. This could involve references to specific laws and circumstances regarding the use of data.", + "display_type": "textarea", + }, + { + "key": "series_description.links", + "title": "Links", + "type": "array", + "props": [ + { + "key": "type", + "title": "Type", + "type": "string", + "name": "Link type", + "prop_key": "series_description.links.type", + "help_text": "This element allows to classify the type of link that is provided.", + "display_type": "text", + }, + { + "key": "description", + "title": "Description", + "type": "string", + "prop_key": "series_description.links.description", + "help_text": "A description of the link that is provided.", + "display_type": "textarea", + }, + { + "key": "uri", + "title": "URL", + "type": "string", + "rules_": "required", + "prop_key": "series_description.links.uri", + "help_text": "The link (URL) to the described resource.", + "rules": {"is_uri": True}, + "display_type": "text", + }, + ], + "help_text": "This element provides links to online resources of any type that could be useful to the data users. This can be links to description of methods and reference documents, analytics tools, visualizations, data sources, or other.", + }, + { + "key": "series_description.api_documentation", + "title": "API documentation", + "type": "array", + "props": [ + { + "key": "description", + "title": "Description", + "type": "string", + "prop_key": "series_description.api_documentation.description", + "help_text": "This element will not contain the API documentation itself, but information on what documentation is available.", + "display_type": "textarea", + }, + { + "key": "uri", + "title": "URL", + "type": "string", + "rules_": "required", + "prop_key": "series_description.api_documentation.uri", + "help_text": "The URL of the API documentation.", + "rules": {"is_uri": True}, + "display_type": "text", + }, + ], + "help_text": "Increasingly, data are made accessible via Application Programming Interfaces (APIs). The API associated with a series must be documented. The documentation will usually not be specific to a series, but apply to all series in a same database.", + }, + ], + "help_text": "", + }, + { + "key": "series_description_container1694030886312", + "title": "Contacts", + "type": "section", + "items": [ + { + "key": "series_description.contacts", + "title": "Contacts", + "type": "array", + "props": [ + { + "key": "name", + "title": "Name", + "type": "string", + "prop_key": "series_description.contacts.name", + "help_text": "The name of the contact person that should be contacted. Instead of the name of an individual (which would be subject to change and require frequent update of the metadata), a title can be provided here (e.g. “data helpdesk”).", + "display_type": "text", + }, + { + "key": "role", + "title": "Role", + "type": "string", + "prop_key": "series_description.contacts.role", + "help_text": 'The specific role of the contact person mentioned in "Name". This will be used when multiple contacts are listed, and is intended to help users direct their questions and requests to the right contact person.', + "display_type": "textarea", + }, + { + "key": "affiliation", + "title": "Affiliation", + "type": "string", + "prop_key": "series_description.contacts.affiliation", + "help_text": 'The organization or affiliation of the contact person mentioned in "Name".', + "display_type": "text", + }, + { + "key": "email", + "title": "Email", + "type": "string", + "prop_key": "series_description.contacts.email", + "help_text": 'The email address of the person or organization mentioned in "Name". Avoid using personal email accounts; the use of an anonymous email is recommended (e.g., “helpdesk@….org”)', + "display_type": "text", + }, + { + "key": "telephone", + "title": "Phone", + "type": "string", + "prop_key": "series_description.contacts.telephone", + "help_text": 'The phone number of the person or organization mentioned in "Name".', + "display_type": "text", + }, + { + "key": "uri", + "title": "URL", + "type": "string", + "prop_key": "series_description.contacts.uri", + "help_text": "The URL of the agency (typically, a URL to a “contact us” web page)", + "rules": {"is_uri": True}, + "display_type": "text", + }, + ], + "help_text": "Contacts", + } + ], + "help_text": "", + }, + ], + }, + { + "type": "section_container", + "id": "tags", + "key": "tags_container", + "title": "Tags", + "items": [ + { + "key": "tags", + "title": "Tags", + "type": "array", + "props": [ + { + "key": "tag", + "title": "Tag", + "type": "string", + "prop_key": "tags.tag", + "help_text": "A user-defined tag.", + "display_type": "text", + }, + { + "key": "tag_group", + "title": "Tag group", + "type": "string", + "prop_key": "tags.tag_group", + "help_text": "A user-defined group (optional) to which the tag belongs. Grouping tags allows implementation of controlled facets in data catalogs.", + "display_type": "text", + }, + ], + "help_text": "Tags, especially when organized in tag groups, provide a powerful and flexible solution to enable custom facets (filters) in data catalogs. ", + } + ], + }, + ], + } + + t = pydantic_from_template(ts1, timeseries_schema.TimeseriesSchema, "IHSN INDICATOR 1.0 Template v01 EN") + make_skeleton(t) diff --git a/pydantic_schemas/utils/template_to_pydantic.py b/pydantic_schemas/utils/template_to_pydantic.py new file mode 100644 index 0000000..5ff28b3 --- /dev/null +++ b/pydantic_schemas/utils/template_to_pydantic.py @@ -0,0 +1,147 @@ +import warnings +from typing import Dict, List, Optional, Tuple, Type + +from pydantic import BaseModel, Field, create_model + +from .utils import get_subtype_of_optional_or_list, is_list_annotation, is_optional_annotation, standardize_keys_in_dict + + +def get_child_field_info_from_dot_annotated_name(name, parent_schema): + name_split = name.split(".") + for key in name_split[:-1]: + parent_schema = parent_schema.model_fields[key].annotation + if is_optional_annotation(parent_schema) or is_list_annotation(parent_schema): + parent_schema = get_subtype_of_optional_or_list(parent_schema) + try: + child_field_info = parent_schema.model_fields[name_split[-1]] + except KeyError as e: + raise KeyError(name) + return child_field_info + + +def define_simple_element(item, parent_schema, type=str): + assert ( + isinstance(item, dict) and "type" in item and item["type"] in ["string", "integer"] + ), f"expected string item, got {item}" + try: + child_field_info = get_child_field_info_from_dot_annotated_name(item["key"], parent_schema) + if "title" in item: + child_field_info.title = item["title"] + if "description" in item: + child_field_info.description = item["description"] + except KeyError as e: + warnings.warn(f"KeyError: {e}. Proceeding since {item['key']} is a string type.", UserWarning) + child_field_info = Field(..., title=item["title"], description=item["help_text"]) + if "required" in item and item["required"]: + field_type = type, child_field_info + else: + child_field_info.default = None + field_type = Optional[type], child_field_info + return {item["key"]: field_type} + + +def get_children_of_props(props, parent_schema) -> Dict[str, Tuple["type_annotation", "field_info"]]: + children = {} + for prop in props: + name = prop["prop_key"] + try: + child_field_info = get_child_field_info_from_dot_annotated_name(name, parent_schema) + if "title" in prop: + child_field_info.title = prop["title"] + if "help_text" in prop: + child_field_info.description = prop["help_text"] + child_field = child_field_info.annotation, child_field_info + children[prop["key"]] = child_field + except KeyError as e: + if prop["type"] == "string": + warnings.warn(f"KeyError: {e}. Proceeding since {name} is a string type.", UserWarning) + children.update(define_simple_element(prop, parent_schema=parent_schema)) + elif prop["type"] == "integer": + warnings.warn(f"KeyError: {e}. Proceeding since {name} is an int type.", UserWarning) + children.update(define_simple_element(prop, parent_schema=parent_schema, type=int)) + else: + raise KeyError(e) from e + children = standardize_keys_in_dict(children, snake_to_pascal=True) + return children + + +def define_array_element(item, parent_schema): + assert "type" in item and ( + item["type"] == "array" or item["type"] == "nested_array" + ), f"expected array item but got {item}" + assert "props" in item, f"expected props in item but got {item.keys()}" + assert "key" in item, f"expected key in item but got {item.keys()}" + children = get_children_of_props(item["props"], parent_schema) + item_element = create_model(f"{item['key']}_item", **children) + return {item["key"]: (List[item_element], item_element)} + + +def define_simple_array_element(item, parent_schema): + assert ( + isinstance(item, dict) and "type" in item and item["type"] == "simple_array" + ), f"expected simple_array item, got {item}" + try: + child_field_info = get_child_field_info_from_dot_annotated_name(item["key"], parent_schema) + if "title" in item: + child_field_info.title = item["title"] + if "description" in item: + child_field_info.description = item["description"] + except KeyError as e: + warnings.warn(f"KeyError: {e}. Proceeding since {item['key']} is a simple_array type.", UserWarning) + child_field_info = Field(..., title=item["title"], description=item["help_text"]) + if "required" in item and item["required"]: + field_type = List[str], child_field_info + else: + child_field_info.default = None + field_type = Optional[List[str]], child_field_info + return {item["key"]: field_type} + + +def define_from_section_container(item, parent_schema): + assert ( + isinstance(item, dict) and "type" in item and item["type"] == "section_container" + ), f"expected section_container got {item}" + name = item["key"] + sub_model = create_model(name, **define_group_of_elements(item["items"], parent_schema)) + sub_field = Field(...) + if "title" in item: + sub_field.title = item["title"] + if "required" not in item or not item["required"]: + sub_field.default = None + return {name: (sub_model, sub_field)} + + +def define_group_of_elements(items, parent_schema): + elements = {} + for i, item in enumerate(items): + if item["type"] == "section_container": + elements.update(define_from_section_container(item, parent_schema=parent_schema)) + elif item["type"] == "string": + elements.update(define_simple_element(item, parent_schema, str)) + elif item["type"] == "integer": + elements.update(define_simple_element(item, parent_schema, int)) + elif item["type"] in ["array", "nested_array"]: + elements.update(define_array_element(item, parent_schema)) + elif item["type"] == "simple_array": + elements.update(define_simple_array_element(item, parent_schema)) + elif item["type"] == "section": + print(f"encountered section {item['key']}, {item['title']}, ignoring this heirarchy and appending") + assert "items" in item, f"section does not contain items, found only {item}" + elements.update(define_group_of_elements(item["items"], parent_schema)) + else: + raise NotImplementedError(f"item {i} has type {item['type']}, {item}") + elements = standardize_keys_in_dict(elements, snake_to_pascal=True) + return elements + + +def pydantic_from_template(template: Dict, parent_schema: Type[BaseModel], name: Optional[str] = None) -> BaseModel: + assert "items" in template, f"expected 'items' in template but got {list(template.keys())}" + m = define_group_of_elements(template["items"], parent_schema) + m = standardize_keys_in_dict(m, snake_to_pascal=True) + if name is None: + if "title" in template: + name = template["title"] + else: + name = "new_model" + name = name.replace(" ", "_").rstrip("_").split(".")[-1] + return create_model(name, **m) diff --git a/pydantic_schemas/utils/utils.py b/pydantic_schemas/utils/utils.py index 705eb24..c96cc8c 100644 --- a/pydantic_schemas/utils/utils.py +++ b/pydantic_schemas/utils/utils.py @@ -109,19 +109,25 @@ def seperate_simple_from_pydantic(ob: BaseModel) -> Dict[str, Dict]: return {"simple": simple_children, "pydantic": pydantic_children} -def _standardize_keys_in_list_of_possible_dicts(lst: List[any]) -> List[Any]: +def _standardize_keys_in_list_of_possible_dicts(lst: List[any], snake_to_pascal: bool) -> List[Any]: new_value = [] for item in lst: if isinstance(item, dict): - new_value.append(standardize_keys_in_dict(item)) + new_value.append(standardize_keys_in_dict(item, snake_to_pascal)) elif isinstance(item, list): - new_value.append(_standardize_keys_in_list_of_possible_dicts(item)) + new_value.append(_standardize_keys_in_list_of_possible_dicts(item, snake_to_pascal)) else: new_value.append(item) return new_value -def standardize_keys_in_dict(d: Dict[str, Any]) -> Dict[str, Any]: +def capitalize_first_letter(s): + if s: + return s[0].upper() + s[1:] + return s + + +def standardize_keys_in_dict(d: Dict[str, Any], snake_to_pascal: bool = False) -> Dict[str, Any]: """ sometimes when field names are also python protected names like 'from' and 'import' then we append an underscore to the field name to avoide clashes. @@ -130,11 +136,16 @@ def standardize_keys_in_dict(d: Dict[str, Any]) -> Dict[str, Any]: """ new_dict = {} for key, value in d.items(): - new_key = key.rstrip("_") + new_key = key.replace(" ", "_").rstrip("_") + new_key = new_key.split(".")[-1] + if snake_to_pascal: + print(f"snake_to_pascal from {new_key}") + new_key = "".join([capitalize_first_letter(x) for x in new_key.split("_")]) + print(f"to {new_key}\n") if isinstance(value, dict): - new_value = standardize_keys_in_dict(value) + new_value = standardize_keys_in_dict(value, snake_to_pascal=snake_to_pascal) elif isinstance(value, list): - new_value = _standardize_keys_in_list_of_possible_dicts(value) + new_value = _standardize_keys_in_list_of_possible_dicts(value, snake_to_pascal) else: new_value = value new_dict[new_key] = new_value From d762c3f1e72e440d0e7e4a731bb906e7cd711420 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Wed, 28 Aug 2024 09:58:56 -0400 Subject: [PATCH 44/51] generalise excel interface to schema interface, fix bugs in template to pydantic --- .../generators/generate_excel_files.py | 2 +- .../generators/generate_pydantic_schemas.py | 1 - pydantic_schemas/schema_interface.py | 59 +++---- pydantic_schemas/series_schema.py | 167 ------------------ .../tests/test_excel_interface.py | 2 +- .../utils/template_to_pydantic.py | 140 ++++++++++----- pydantic_schemas/utils/utils.py | 34 +++- pyproject.toml | 4 +- 8 files changed, 142 insertions(+), 267 deletions(-) delete mode 100644 pydantic_schemas/series_schema.py diff --git a/pydantic_schemas/generators/generate_excel_files.py b/pydantic_schemas/generators/generate_excel_files.py index 3a6ba8d..03fdfec 100644 --- a/pydantic_schemas/generators/generate_excel_files.py +++ b/pydantic_schemas/generators/generate_excel_files.py @@ -4,7 +4,7 @@ ei = SchemaInterface() -for metadata_type in ei.get_metadata_types(): +for metadata_type in ei.list_metadata_types(): filename = f"excel_sheets/{metadata_type.capitalize()}_metadata.xlsx" print(f"Writing {metadata_type} outline to {filename}") if os.path.exists(filename): diff --git a/pydantic_schemas/generators/generate_pydantic_schemas.py b/pydantic_schemas/generators/generate_pydantic_schemas.py index 981124c..516a1b0 100644 --- a/pydantic_schemas/generators/generate_pydantic_schemas.py +++ b/pydantic_schemas/generators/generate_pydantic_schemas.py @@ -11,7 +11,6 @@ "image-schema.json", "microdata-schema.json", "script-schema.json", - "series-schema.json", "table-schema.json", "timeseries-db-schema.json", "timeseries-schema.json", diff --git a/pydantic_schemas/schema_interface.py b/pydantic_schemas/schema_interface.py index 5486788..5bf3a13 100644 --- a/pydantic_schemas/schema_interface.py +++ b/pydantic_schemas/schema_interface.py @@ -1,4 +1,4 @@ -from typing import Dict, Optional +from typing import Dict, Optional, Type from openpyxl import load_workbook from pydantic import BaseModel @@ -8,7 +8,6 @@ geospatial_schema, microdata_schema, script_schema, - series_schema, table_schema, timeseries_db_schema, timeseries_schema, @@ -24,7 +23,7 @@ class SchemaInterface: """ Interface with Excel for creating, saving and updating metadata for various types: - documents, scripts, series, survey, table, timeseries, timeseries_db, video + documents, scripts, survey, table, timeseries, timeseries_db, video Retrieve pydantic model definitions for each metadata type """ @@ -34,7 +33,6 @@ class SchemaInterface: "geospatial": geospatial_schema.GeospatialSchema, # "image":image_schema.ImageDataTypeSchema, "script": script_schema.ResearchProjectSchemaDraft, - "series": series_schema.Series, "survey": microdata_schema.MicrodataSchema, "table": table_schema.Model, "timeseries": timeseries_schema.TimeseriesSchema, @@ -47,7 +45,6 @@ class SchemaInterface: # "geospatial":, # "image":, "script": write_across_many_sheets, - "series": write_to_single_sheet, # one sheet "survey": write_across_many_sheets, "table": write_across_many_sheets, "timeseries": write_across_many_sheets, @@ -60,7 +57,6 @@ class SchemaInterface: # "geospatial":, # "image":, "script": excel_doc_to_pydantic, - "series": excel_single_sheet_to_pydantic, # one sheet "survey": excel_doc_to_pydantic, "table": excel_doc_to_pydantic, "timeseries": excel_doc_to_pydantic, @@ -69,21 +65,19 @@ class SchemaInterface: } def get_metadata_class(self, metadata_type: str): - metadata_type = self._process_metadata_type(metadata_type) - if metadata_type not in self._TYPE_TO_SCHEMA: - raise NameError(f"{metadata_type} not known, must be one of {list(self._TYPE_TO_SCHEMA.keys())}.") + metadata_type = self.standardize_metadata_type_name(metadata_type) schema = self._TYPE_TO_SCHEMA[metadata_type] return schema - def template_to_pydantic(self, template: Dict, parent_schema_type: str, name: Optional[str] = None) -> BaseModel: - # metadata_type = self._process_metadata_type(parent_schema_type) - # schema = self._TYPE_TO_SCHEMA[metadata_type] + def template_to_pydantic( + self, template: Dict, parent_schema_type: str, name: Optional[str] = None + ) -> Type[BaseModel]: schema = self.get_metadata_class(parent_schema_type) return pydantic_from_template(template, schema, name) - def get_metadata_types(self): - return list(self._TYPE_TO_READER.keys()) + def list_metadata_types(self): + return list(self._TYPE_TO_SCHEMA.keys()) @staticmethod def _merge_dicts(base, update): @@ -123,11 +117,12 @@ def _merge_dicts(base, update): new_dict[key] = base_value return new_dict - @staticmethod - def _process_metadata_type(metadata_type: str) -> str: + def standardize_metadata_type_name(self, metadata_type: str) -> str: metadata_type = metadata_type.lower() + metadata_type = metadata_type.replace("-", "_") if metadata_type == "microdata" or metadata_type == "survey_microdata": metadata_type = "survey" + self._raise_if_unsupported_metadata_type(metadata_type=metadata_type) return metadata_type def type_to_outline(self, metadata_type: str, debug: bool = False) -> BaseModel: @@ -155,8 +150,10 @@ def write_outline_metadata_to_excel( Outputs: An Excel file into which metadata can be entered """ - metadata_type = self._process_metadata_type(metadata_type) - self._raise_if_unsupported_metadata_type(metadata_type=metadata_type) + metadata_type = self.standardize_metadata_type_name(metadata_type) + if metadata_type == "geospatial": + raise NotImplementedError("Geospatial schema contains an infinite loop so cannot be written to excel") + if filename is None: filename = f"{metadata_type}_metadata.xlsx" if not str(filename).endswith(".xlsx"): @@ -189,8 +186,9 @@ def save_metadata_to_excel( Outputs: An Excel file containing the metadata from the pydantic object. This file can be updated as needed. """ - metadata_type = self._process_metadata_type(metadata_type) - self._raise_if_unsupported_metadata_type(metadata_type=metadata_type) + metadata_type = self.standardize_metadata_type_name(metadata_type) + if metadata_type == "geospatial": + raise NotImplementedError("Geospatial schema contains an infinite loop so cannot be written to excel") if filename is None: filename = f"{metadata_type}_metadata.xlsx" @@ -240,7 +238,7 @@ def _get_metadata_type_from_excel_file(filename: str) -> str: return cell_values[0] - def read_metadata_excel(self, filename: str) -> BaseModel: + def read_metadata_from_excel(self, filename: str) -> BaseModel: """ Read in metadata_type metadata from an appropriately formatted Excel file as a pydantic object. @@ -251,25 +249,13 @@ def read_metadata_excel(self, filename: str) -> BaseModel: BaseModel: a pydantic object containing the metadata from the file """ metadata_type = self._get_metadata_type_from_excel_file(filename) - metadata_type = self._process_metadata_type(metadata_type) - self._raise_if_unsupported_metadata_type(metadata_type=metadata_type) + metadata_type = self.standardize_metadata_type_name(metadata_type) schema = self._TYPE_TO_SCHEMA[metadata_type] reader = self._TYPE_TO_READER[metadata_type] read_object = reader(filename, schema) - new_ob = self.inflate_read_data_to_schema(metadata_type, read_object) - return new_ob - - def inflate_read_data_to_schema(self, metadata_type, read_object): - metadata_type = self._process_metadata_type(metadata_type) - self._raise_if_unsupported_metadata_type(metadata_type=metadata_type) skeleton_object = self.type_to_outline(metadata_type=metadata_type, debug=False) - if isinstance(read_object, dict): - read_object_dict = read_object - elif isinstance(read_object, BaseModel): - read_object_dict = read_object.model_dump(exclude_none=True, exclude_unset=True, exclude_defaults=True) - else: - raise ValueError(f"Expected dict or pydantic BaseModel but got {type(read_object)}") + read_object_dict = read_object.model_dump(exclude_none=True, exclude_unset=True, exclude_defaults=True) combined_dict = self._merge_dicts( skeleton_object.model_dump(), read_object_dict, @@ -284,9 +270,6 @@ def _raise_if_unsupported_metadata_type(self, metadata_type: str): If the type is specifically unsupported - geospatial or image - a NotImplementedError is raised If the type is simply unknown then a ValueError is raised. """ - metadata_type = self._process_metadata_type(metadata_type) - if metadata_type == "geospatial": - raise NotImplementedError("Geospatial schema contains an infinite loop so cannot be written to excel") if metadata_type == "image": raise NotImplementedError("Due to an issue with image metadata schema definition causing __root__ errors") if metadata_type not in self._TYPE_TO_SCHEMA.keys(): diff --git a/pydantic_schemas/series_schema.py b/pydantic_schemas/series_schema.py deleted file mode 100644 index 3c371ae..0000000 --- a/pydantic_schemas/series_schema.py +++ /dev/null @@ -1,167 +0,0 @@ -# generated by datamodel-codegen: -# filename: series-schema.json -# timestamp: 2024-07-24T21:06:28+00:00 - -from __future__ import annotations - -from typing import List, Optional - -from pydantic import Field - -from .schema_base_model import SchemaBaseModel - - -class Model(SchemaBaseModel): - pass - - -class Alias(SchemaBaseModel): - alias: Optional[str] = Field(None, title="Alias") - - -class DefinitionReference(SchemaBaseModel): - source: Optional[str] = Field(None, title="Source") - uri: str = Field(..., description="URI", title="URI") - note: Optional[str] = Field(None, description="Note", title="Note") - - -class RelatedConcept(SchemaBaseModel): - name: str = Field(..., title="Name") - definition: Optional[str] = Field(None, description="Definition", title="Definition") - - -class Topic(SchemaBaseModel): - topic: str = Field(..., title="Topic") - vocabulary: Optional[str] = Field( - None, description="Name of the controlled vocabulary, if the topic is from a taxonomy.", title="Vocabulary" - ) - uri: Optional[str] = Field( - None, - description="Link to the controlled vocabulary web page, if the topic is from a taxonomy.", - title="Vocabulary URI", - ) - - -class SeriesDate(SchemaBaseModel): - start: Optional[str] = Field(None, title="Start") - end: Optional[str] = Field(None, title="End") - - -class GeographicUnit(SchemaBaseModel): - name: str = Field( - ..., description="Name of the geographic unit e.g. 'World', 'Africa', 'Afghanistan'", title="Location name" - ) - code: Optional[str] = Field( - None, description="Code of the geographic unit (for countries, preferred = ISO3 code)", title="Location code" - ) - type: Optional[str] = Field( - None, description="Type of geographic unit e.g. country, state, region, province etc", title="Type" - ) - - -class SerAccessLicense(SchemaBaseModel): - type: Optional[str] = Field(None, title="License type") - uri: Optional[str] = Field(None, title="URI") - - -class SeriesLink(SchemaBaseModel): - type: Optional[str] = Field(None, description="Link types - API, website, etc.", title="Link type") - description: Optional[str] = Field(None, title="Description") - uri: Optional[str] = Field(None, title="URI") - - -class ApiDocumentation(SchemaBaseModel): - """ - API Documentation - """ - - description: Optional[str] = Field(None, title="Description") - uri: Optional[str] = Field(None, title="URI") - - -class Keyword(SchemaBaseModel): - name: Optional[str] = Field(None, title="Keyword") - vocabulary: Optional[str] = Field(None, title="Vocabulary") - uri: Optional[str] = Field(None, title="URI") - - -class Note(SchemaBaseModel): - note: Optional[str] = Field(None, title="Note") - - -class RelatedIndicator(SchemaBaseModel): - code: Optional[str] = Field(None, title="Indicator code") - label: Optional[str] = Field(None, title="Indicator name") - uri: Optional[str] = Field(None, title="URI") - - -class ComplianceItem(SchemaBaseModel): - standard: Optional[str] = Field(None, title="Standard name") - organization: Optional[str] = Field(None, title="Organization name") - uri: Optional[str] = Field(None, title="URI") - - -class SeriesGroup(SchemaBaseModel): - name: Optional[str] = Field(None, title="Name") - version: Optional[str] = Field(None, title="Version") - uri: Optional[str] = Field(None, title="URI") - - -class Series(SchemaBaseModel): - idno: str = Field(..., description="Unique series ID", title="Series unique ID") - name: str = Field(..., title="Series Name") - db_idno: Optional[str] = Field(None, description="Series database ID", title="Database ID") - aliases: Optional[List[Alias]] = Field(None, title="Series other names") - measurement_unit: Optional[str] = Field(None, title="Series unit of measure") - periodicity: Optional[str] = Field(None, title="Periodicity of data") - base_period: Optional[str] = Field(None, title="Base period") - definition_short: Optional[str] = Field(None, title="Definition short") - definition_long: Optional[str] = Field(None, title="Definition long") - definition_references: Optional[List[DefinitionReference]] = Field( - None, - description="URL to standard definition of the indicator (international or national standard)", - title="Definition references", - ) - related_concepts: Optional[List[RelatedConcept]] = Field( - None, description="Related concepts", title="Related concepts" - ) - methodology: Optional[str] = Field(None, title="Methodology") - imputation: Optional[str] = Field(None, title="Imputations") - quality_checks: Optional[str] = Field(None, title="Quality control methods") - quality_note: Optional[str] = Field(None, title="Note on data quality") - series_break: Optional[str] = Field(None, title="Breaks in series") - statistical_concept: Optional[str] = Field(None, title="Statistical concept") - limitation: Optional[str] = Field(None, title="Limitations and exceptions") - topics: Optional[List[Topic]] = Field(None, description="Topics covered by the indicator", title="Topics") - relevance: Optional[str] = Field(None, title="Relavance") - series_dates: Optional[List[SeriesDate]] = Field(None, title="Series dates") - geographic_units: Optional[List[GeographicUnit]] = Field( - None, - description=( - "List of geographic units (regions, countries, states, provinces, etc.) for which data are available in the" - " database." - ), - title="Geographic locations", - ) - aggregation_method: Optional[str] = Field(None, title="Aggregation method") - ser_access_license: Optional[SerAccessLicense] = Field(None, title="Access licence") - confidentiality: Optional[str] = Field( - None, description="Confidentiality statement", title="Confidentiality statement" - ) - confidentiality_status: Optional[str] = Field(None, title="Confidentiality status") - confidentiality_note: Optional[str] = Field(None, title="Confidentiality note") - series_links: Optional[List[SeriesLink]] = Field( - None, description="Links to API calls, websites, etc.", title="Series links" - ) - api_documentation: Optional[ApiDocumentation] = Field(None, description="API Documentation") - source: Optional[str] = Field(None, title="Original source") - source_note: Optional[str] = Field(None, title="Notes form original source") - keywords: Optional[List[Keyword]] = Field(None, description="Keywords") - notes: Optional[List[Note]] = Field(None, description="Notes", title="Notes") - related_indicators: Optional[List[RelatedIndicator]] = Field(None, description="Related indicators") - compliance: Optional[List[ComplianceItem]] = Field( - None, description="Compliance with international resolution", title="Compliance with international resolution" - ) - series_groups: Optional[List[SeriesGroup]] = Field( - None, description="Series included in groups", title="Series groups" - ) diff --git a/pydantic_schemas/tests/test_excel_interface.py b/pydantic_schemas/tests/test_excel_interface.py index 5d3ef69..4d6203e 100644 --- a/pydantic_schemas/tests/test_excel_interface.py +++ b/pydantic_schemas/tests/test_excel_interface.py @@ -15,7 +15,7 @@ def test_metadata(tmpdir, metadata_type): ) # Read the metadata back - tmp = ei.read_metadata_excel(filename=filename) + tmp = ei.read_metadata_from_excel(filename=filename) # Save the read metadata to a new file filename2 = tmpdir.join(f"test_{metadata_type}_2.xlsx") diff --git a/pydantic_schemas/utils/template_to_pydantic.py b/pydantic_schemas/utils/template_to_pydantic.py index 5ff28b3..f44d311 100644 --- a/pydantic_schemas/utils/template_to_pydantic.py +++ b/pydantic_schemas/utils/template_to_pydantic.py @@ -7,22 +7,28 @@ def get_child_field_info_from_dot_annotated_name(name, parent_schema): + assert isinstance(parent_schema, type(BaseModel)), "get_child_field_info_from_dot_annotated_name" name_split = name.split(".") for key in name_split[:-1]: parent_schema = parent_schema.model_fields[key].annotation if is_optional_annotation(parent_schema) or is_list_annotation(parent_schema): parent_schema = get_subtype_of_optional_or_list(parent_schema) + if not isinstance(parent_schema, type(BaseModel)): + raise KeyError(name) try: child_field_info = parent_schema.model_fields[name_split[-1]] except KeyError as e: - raise KeyError(name) + raise KeyError(name) from e + except: + raise ValueError(f"name={name}, parent_schema={parent_schema}") return child_field_info -def define_simple_element(item, parent_schema, type=str): +def define_simple_element(item, parent_schema, element_type=str): + assert isinstance(parent_schema, type(BaseModel)), "define_simple_element" assert ( - isinstance(item, dict) and "type" in item and item["type"] in ["string", "integer"] - ), f"expected string item, got {item}" + isinstance(item, dict) and "type" in item and item["type"] in ["string", "text", "integer", "number", "boolean"] + ), f"expected string, integer or boolean item, got {item}" try: child_field_info = get_child_field_info_from_dot_annotated_name(item["key"], parent_schema) if "title" in item: @@ -31,52 +37,58 @@ def define_simple_element(item, parent_schema, type=str): child_field_info.description = item["description"] except KeyError as e: warnings.warn(f"KeyError: {e}. Proceeding since {item['key']} is a string type.", UserWarning) - child_field_info = Field(..., title=item["title"], description=item["help_text"]) + child_field_info = Field(..., title=item["title"]) + if "help_text" in item: + child_field_info.description = item["help_text"] if "required" in item and item["required"]: - field_type = type, child_field_info + field_type = element_type, child_field_info else: child_field_info.default = None - field_type = Optional[type], child_field_info + field_type = Optional[element_type], child_field_info return {item["key"]: field_type} def get_children_of_props(props, parent_schema) -> Dict[str, Tuple["type_annotation", "field_info"]]: + assert isinstance(parent_schema, type(BaseModel)), "get_children_of_props" children = {} for prop in props: - name = prop["prop_key"] - try: - child_field_info = get_child_field_info_from_dot_annotated_name(name, parent_schema) - if "title" in prop: - child_field_info.title = prop["title"] - if "help_text" in prop: - child_field_info.description = prop["help_text"] - child_field = child_field_info.annotation, child_field_info - children[prop["key"]] = child_field - except KeyError as e: - if prop["type"] == "string": - warnings.warn(f"KeyError: {e}. Proceeding since {name} is a string type.", UserWarning) - children.update(define_simple_element(prop, parent_schema=parent_schema)) - elif prop["type"] == "integer": - warnings.warn(f"KeyError: {e}. Proceeding since {name} is an int type.", UserWarning) - children.update(define_simple_element(prop, parent_schema=parent_schema, type=int)) - else: - raise KeyError(e) from e - children = standardize_keys_in_dict(children, snake_to_pascal=True) + if "prop_key" not in prop: + children.update(template_type_handler(prop, parent_schema)) + else: + name = prop["prop_key"] + try: + child_field_info = get_child_field_info_from_dot_annotated_name(name, parent_schema) + if "title" in prop: + child_field_info.title = prop["title"] + if "help_text" in prop: + child_field_info.description = prop["help_text"] + child_field = child_field_info.annotation, child_field_info + children[prop["key"]] = child_field + except KeyError as e: + children.update(template_type_handler(prop, parent_schema)) return children def define_array_element(item, parent_schema): + assert isinstance(parent_schema, type(BaseModel)), "define_array_element" assert "type" in item and ( item["type"] == "array" or item["type"] == "nested_array" ), f"expected array item but got {item}" - assert "props" in item, f"expected props in item but got {item.keys()}" assert "key" in item, f"expected key in item but got {item.keys()}" - children = get_children_of_props(item["props"], parent_schema) - item_element = create_model(f"{item['key']}_item", **children) - return {item["key"]: (List[item_element], item_element)} + if "props" not in item: + warnings.warn(f"array without type found, assuming array of str: {item}") + field_info = Field(..., title=item["title"]) + if "help_text" in item: + field_info.description = item["help_text"] + return {item["key"]: (List[str], field_info)} + else: + children = get_children_of_props(item["props"], parent_schema) + item_element = create_model(f"{item['key']}_item", **children) + return {item["key"]: (List[item_element], item_element)} def define_simple_array_element(item, parent_schema): + assert isinstance(parent_schema, type(BaseModel)), "define_simple_array_element" assert ( isinstance(item, dict) and "type" in item and item["type"] == "simple_array" ), f"expected simple_array item, got {item}" @@ -88,7 +100,9 @@ def define_simple_array_element(item, parent_schema): child_field_info.description = item["description"] except KeyError as e: warnings.warn(f"KeyError: {e}. Proceeding since {item['key']} is a simple_array type.", UserWarning) - child_field_info = Field(..., title=item["title"], description=item["help_text"]) + child_field_info = Field(..., title=item["title"]) + if "help_test" in item: + child_field_info.description = item["help_text"] if "required" in item and item["required"]: field_type = List[str], child_field_info else: @@ -98,6 +112,7 @@ def define_simple_array_element(item, parent_schema): def define_from_section_container(item, parent_schema): + assert isinstance(parent_schema, type(BaseModel)), "define_from_section_container" assert ( isinstance(item, dict) and "type" in item and item["type"] == "section_container" ), f"expected section_container got {item}" @@ -112,32 +127,59 @@ def define_from_section_container(item, parent_schema): def define_group_of_elements(items, parent_schema): + assert isinstance(parent_schema, type(BaseModel)), "define_group_of_elements" elements = {} for i, item in enumerate(items): - if item["type"] == "section_container": - elements.update(define_from_section_container(item, parent_schema=parent_schema)) - elif item["type"] == "string": - elements.update(define_simple_element(item, parent_schema, str)) - elif item["type"] == "integer": - elements.update(define_simple_element(item, parent_schema, int)) - elif item["type"] in ["array", "nested_array"]: - elements.update(define_array_element(item, parent_schema)) - elif item["type"] == "simple_array": - elements.update(define_simple_array_element(item, parent_schema)) - elif item["type"] == "section": - print(f"encountered section {item['key']}, {item['title']}, ignoring this heirarchy and appending") - assert "items" in item, f"section does not contain items, found only {item}" - elements.update(define_group_of_elements(item["items"], parent_schema)) + if "is_custom" in item and item["is_custom"] == True: + if "additional" not in elements: + elements["additional"] = {} + elements["additional"].update(template_type_handler(item, parent_schema)) + elements["additional"] = standardize_keys_in_dict(elements["additional"], pascal_to_snake=True) else: - raise NotImplementedError(f"item {i} has type {item['type']}, {item}") - elements = standardize_keys_in_dict(elements, snake_to_pascal=True) + elements.update(template_type_handler(item, parent_schema)) + elements = standardize_keys_in_dict(elements, pascal_to_snake=True) + if "additional" in elements: + additional = elements.pop("additional") + additional = create_model("additional", **additional) + sub_field = Field(...) + sub_field.title = "additional" + elements["additional"] = additional, sub_field return elements -def pydantic_from_template(template: Dict, parent_schema: Type[BaseModel], name: Optional[str] = None) -> BaseModel: +def template_type_handler(item, parent_schema): + assert isinstance(parent_schema, type(BaseModel)), "template_type_handler" + if item["type"] == "section_container": + return define_from_section_container(item, parent_schema) + elif item["type"] in ["string", "text"]: + return define_simple_element(item, parent_schema, str) + elif item["type"] in ["integer", "number"]: + return define_simple_element(item, parent_schema, int) + elif item["type"] == "boolean": + return define_simple_element(item, parent_schema, bool) + elif item["type"] in ["array", "nested_array"]: + return define_array_element(item, parent_schema) + elif item["type"] == "simple_array": + return define_simple_array_element(item, parent_schema) + elif item["type"] == "section": + warnings.warn(f"encountered section {item['key']}, {item['title']}, ignoring this heirarchy and appending") + if "items" in item: + return define_group_of_elements(item["items"], parent_schema) + elif "props" in item: + return define_group_of_elements(item["props"], parent_schema) + else: + raise ValueError(f"section does not contain items or props, found only {item}") + else: + raise NotImplementedError(f"type {item['type']}, {item}") + + +def pydantic_from_template( + template: Dict, parent_schema: Type[BaseModel], name: Optional[str] = None +) -> Type[BaseModel]: + assert isinstance(parent_schema, type(BaseModel)), "pydantic_from_template" assert "items" in template, f"expected 'items' in template but got {list(template.keys())}" m = define_group_of_elements(template["items"], parent_schema) - m = standardize_keys_in_dict(m, snake_to_pascal=True) + m = standardize_keys_in_dict(m, pascal_to_snake=True) if name is None: if "title" in template: name = template["title"] diff --git a/pydantic_schemas/utils/utils.py b/pydantic_schemas/utils/utils.py index c96cc8c..1e4a923 100644 --- a/pydantic_schemas/utils/utils.py +++ b/pydantic_schemas/utils/utils.py @@ -1,3 +1,4 @@ +import re import typing from typing import Any, Callable, Dict, List, Optional, Type, Union @@ -109,13 +110,19 @@ def seperate_simple_from_pydantic(ob: BaseModel) -> Dict[str, Dict]: return {"simple": simple_children, "pydantic": pydantic_children} -def _standardize_keys_in_list_of_possible_dicts(lst: List[any], snake_to_pascal: bool) -> List[Any]: +def _standardize_keys_in_list_of_possible_dicts(lst: List[any], snake_to_pascal, pascal_to_snake) -> List[Any]: new_value = [] for item in lst: if isinstance(item, dict): - new_value.append(standardize_keys_in_dict(item, snake_to_pascal)) + new_value.append( + standardize_keys_in_dict(item, snake_to_pascal=snake_to_pascal, pascal_to_snake=pascal_to_snake) + ) elif isinstance(item, list): - new_value.append(_standardize_keys_in_list_of_possible_dicts(item, snake_to_pascal)) + new_value.append( + _standardize_keys_in_list_of_possible_dicts( + item, snake_to_pascal=snake_to_pascal, pascal_to_snake=pascal_to_snake + ) + ) else: new_value.append(item) return new_value @@ -127,7 +134,14 @@ def capitalize_first_letter(s): return s -def standardize_keys_in_dict(d: Dict[str, Any], snake_to_pascal: bool = False) -> Dict[str, Any]: +def split_on_capitals(s): + # Use regular expression to split on capitalized letters + return re.findall(r"[a-z]+|[A-Z][a-z]*", s) + + +def standardize_keys_in_dict( + d: Dict[str, Any], snake_to_pascal: bool = False, pascal_to_snake: bool = False +) -> Dict[str, Any]: """ sometimes when field names are also python protected names like 'from' and 'import' then we append an underscore to the field name to avoide clashes. @@ -139,13 +153,17 @@ def standardize_keys_in_dict(d: Dict[str, Any], snake_to_pascal: bool = False) - new_key = key.replace(" ", "_").rstrip("_") new_key = new_key.split(".")[-1] if snake_to_pascal: - print(f"snake_to_pascal from {new_key}") new_key = "".join([capitalize_first_letter(x) for x in new_key.split("_")]) - print(f"to {new_key}\n") + elif pascal_to_snake: + new_key = "_".join([x.lower() for x in split_on_capitals(new_key)]) if isinstance(value, dict): - new_value = standardize_keys_in_dict(value, snake_to_pascal=snake_to_pascal) + new_value = standardize_keys_in_dict( + value, snake_to_pascal=snake_to_pascal, pascal_to_snake=pascal_to_snake + ) elif isinstance(value, list): - new_value = _standardize_keys_in_list_of_possible_dicts(value, snake_to_pascal) + new_value = _standardize_keys_in_list_of_possible_dicts( + value, snake_to_pascal, pascal_to_snake=pascal_to_snake + ) else: new_value = value new_dict[new_key] = new_value diff --git a/pyproject.toml b/pyproject.toml index db66af0..bb6a5d6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,13 +1,13 @@ [tool.poetry] name = "metadataschemas" -version = "0.1.0" +version = "0.1.5" description = "" authors = ["Mehmood Asghar ", "Gordon Blackadder "] readme = "README.md" packages = [ { include = "*_schema.py", from = "pydantic_schemas", to = "metadataschemas"}, { include = "schema_base_model.py", from = "pydantic_schemas", to = "metadataschemas"}, - { include = "excel_interface.py", from = "pydantic_schemas", to = "metadataschemas"}, + { include = "schema_interface.py", from = "pydantic_schemas", to = "metadataschemas"}, { include = "utils", from = "pydantic_schemas", to = "metadataschemas"}, ] From 05f04a448d495ff9f6bf5d5af5ebf38f91e46517 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Thu, 5 Sep 2024 16:30:05 -0400 Subject: [PATCH 45/51] include resource, delete Series, remove template stuff but make the manager work with templates --- README.md | 4 +- excel_sheets/Document_metadata.xlsx | Bin 38853 -> 38854 bytes excel_sheets/Resource_metadata.xlsx | Bin 0 -> 8441 bytes excel_sheets/Script_metadata.xlsx | Bin 40331 -> 40332 bytes excel_sheets/Series_metadata.xlsx | Bin 13580 -> 0 bytes excel_sheets/Survey_metadata.xlsx | Bin 53804 -> 53805 bytes excel_sheets/Table_metadata.xlsx | Bin 38933 -> 38933 bytes excel_sheets/Timeseries_db_metadata.xlsx | Bin 15568 -> 15570 bytes excel_sheets/Timeseries_metadata.xlsx | Bin 51082 -> 51082 bytes excel_sheets/Video_metadata.xlsx | Bin 16591 -> 16592 bytes pydantic_schemas/document_schema.py | 4 +- .../generators/generate_excel_files.py | 14 +- .../generators/generate_pydantic_schemas.py | 3 +- pydantic_schemas/geospatial_schema.py | 4 +- pydantic_schemas/image_schema.py | 4 +- pydantic_schemas/metadata_manager.py | 273 +++++++++++++++++ pydantic_schemas/microdata_schema.py | 4 +- pydantic_schemas/resource_schema.py | 64 ++++ pydantic_schemas/schema_interface.py | 276 ------------------ pydantic_schemas/script_schema.py | 4 +- pydantic_schemas/table_schema.py | 4 +- .../tests/test_excel_interface.py | 18 +- .../tests/test_pydantic_to_excel.py | 2 - pydantic_schemas/timeseries_db_schema.py | 4 +- pydantic_schemas/timeseries_schema.py | 4 +- pydantic_schemas/utils/quick_start.py | 1 - .../{ => utils}/schema_base_model.py | 0 .../utils/template_to_pydantic.py | 189 ------------ pydantic_schemas/utils/utils.py | 67 ++++- pydantic_schemas/video_schema.py | 4 +- pyproject.toml | 5 +- 31 files changed, 434 insertions(+), 518 deletions(-) create mode 100644 excel_sheets/Resource_metadata.xlsx delete mode 100644 excel_sheets/Series_metadata.xlsx create mode 100644 pydantic_schemas/metadata_manager.py create mode 100644 pydantic_schemas/resource_schema.py delete mode 100644 pydantic_schemas/schema_interface.py rename pydantic_schemas/{ => utils}/schema_base_model.py (100%) delete mode 100644 pydantic_schemas/utils/template_to_pydantic.py diff --git a/README.md b/README.md index d429065..2cd459a 100644 --- a/README.md +++ b/README.md @@ -79,8 +79,8 @@ survey_metadata.study_desc.title_statement.idno = "project_idno" To update the pydantic schemas so that they match the latest json schemas run - `python pydantic_schemas\\generators\\generate_pydantic_schemas.py` + `python pydantic_schemas/generators/generate_pydantic_schemas.py` Then to update the Excel sheets run - `python pydantic_schemas\\generators\\generate_excel_files.py` \ No newline at end of file + `python pydantic_schemas/generators/generate_excel_files.py` \ No newline at end of file diff --git a/excel_sheets/Document_metadata.xlsx b/excel_sheets/Document_metadata.xlsx index 8b91933a455d25b5969a048f30d8c67e6d9bc052..c334e93203fe9e068024c705393a82aef00a1546 100644 GIT binary patch delta 835 zcmX@Qp6S?nCf)#VW)=|!1_lm>OAzr^tNy%qrh3YxqX#NvqbW4KQLLEexvdFv*7mvUgyLgOxSXDNuoenozbSnmu7js z-0x(|wT5xc#YAVpu00LL-V*gOdu|!13Ew=PwP@G6)4PA3SlY`~QD0XjJN^7BwMltA zMyhKC)fOx>Tk%k-{zW#YxNGH{zrhaH-oh-hHtTL`R?fa}pCdO@tFm(P$JDTOW=DhW ztYe9<;aL~|H+^At?$)*cGWYB@n8)IEXnuY0eUy-hoEbAmSzz-gMhiA(V2Eti<(SI@ zW}Fqdzzb$9P}*S$W<20-SVCbr2VvqnvI1FrSoT3CaC}Jwapq#1F zO#U%oq52qB9dvUhu$F2*;9_8~%49$@=RyWZ)1*w+$uFn!D1g$Di_-y%GHwQj%~|Mb zpA`euN=??E1`fK(cGIMpCe?%OESM%J57Nu-`M*`4nStSrAOiz0%&|bafiYq7f@v~f zKkuI=&A4mw?P*dmARV6$WX1F|GBBJ5>f%SyvACasp(01WJijPADL+3OTktG@dbRd4 jP*XZ91A`Qb=J?5h(>1}?)lQdY%$huNx*FTL$si>F5^5d_ delta 788 zcmX@Mp6Td%Cf)#VW)=|!1_lm>9TA8UsmV5{zA2^ah~&Y%?(R;NX1-s z>#UnAGjlIXM}^ArWHX_+67P0DFzG*Ez_9+Kvph$a&3UsT_ zoE4cMutL#Y*Ii&{gZ62W`j|hP6aB=BI?5LQ+IRj}(X(T{EPHHi_nkStd|U6D=p`;! z*;Lss-C;G2ed6yNeAsuR-T8ld6C!(sRp#5Qo$UQ7$}Xquwu@+G;L@M9TBqi&NKss( zabNv<|G(82N{_vJYu|gd_oGsP>7QTbUs+KCB64QT9AyEv&0iSJ*_eSLvRRK~E)SS- zPUHeFn6Xf4hb5R16H^C~x|<=)4Ho%ayb{8gUw<0H$n6ei21!jm-uDcwWJCW>Mld61 zA_s&~J}DW@n0$A#H6juwD^4*3YmAyA&3J!u*%T!(Z}t>vCIybk8w81w#LayK!sA1cXk{|PkWX))Lc?P(Af*-w*Znph7K zGBDSx$jw1FmfiDzt3ERW!y7>c240xkfOG?6{N#nxWWdHAm?q7*bMl>OQV>g~N!u^# zXJDwv(J#+0%1+A9&&Fo(@~2m8F9QuqXJufJLNPdQ;^gXyGL!SCL;PJgU79g-@~r7< KY-cBf)BylKlNSR3 diff --git a/excel_sheets/Resource_metadata.xlsx b/excel_sheets/Resource_metadata.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b9fe85f939855ea46db85a1ac44add0832dbc73a GIT binary patch literal 8441 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 lqW&hIo1ydjMf5-K{twF>bHV@s literal 0 HcmV?d00001 diff --git a/excel_sheets/Script_metadata.xlsx b/excel_sheets/Script_metadata.xlsx index 66475c7a5ed9db328dffcb7b43ba5b5460404a9a..4977bb150363c74533623777791769ebb188750b 100644 GIT binary patch delta 826 zcmeC)&D67-i8sKTnMH(wfq{b|rCfF*?*UFA69sxpnZT%*Q#s6 zQpuQzLkW-f^9CDDt~D{Pzgil5OIJPbhDP)E=gY5W{yeh7C&kIjH+7~%ISYP zzHjA&RS|R3{)+_Yw{bT0$%Vg}vqx9{`fc9T#q;i~?(z6kG+Xr1K9M~?Bx3jf(s#O@ zwb|HQ>a_Ob$bj$<&+os=NAZ8;%$PaK0&ENnbJQ6agc%q%|6$Z)V+MxEW?hb1JYdEt zkz>4I#$=_5_F#s3QXNEUMV>G>SY%)2N(dvX^)!TGF)^GOBsF=`lxJWi)l)Y!f*FR> zIUo$18OdPAB5s@(Y*-SIAM)_INj1MMT&r$;O5@ty=DRN9!oFi&zs8^Aj6X4Cr zB*FlX$4HM_i@B3|85l}i85kshu?qv+8uy8SbWOf7OAu_(8=yh$N?;+m*@6n7$lt$z zMyfXt14DKhx?brdu)-9m!U?RUnh&@b7_2hU70$^6D_k`jV#&VQ(oCBw!9pKq3(A8m zu|M-@%M5M?hHv@kdgCT5%uxrs&1;Udjm|^{hKd~h;*!do)M9Kt-R}On>j2PuVoVGS zK=a_Bfw67!!Z}i4gZ9mlX3U>_YmOY4_j`^slj`)z4%20{(SyyzZiBlqBLf33J2?80 Q3^SMqWS}lq`EN)oz8XQ>4iDgo#rEmm~Iq)T9@;@~t?*Y8m^a zKl%EB(2bU7|LHA=T*}$hCwKkLoIRo6`DeSUonEwN^CP{-SKF>HdeU@Ve)4Pg|E?Kx zGq=CB?==rUw%Nh#!|VG`#8JE-IWuOCvH%+c!yI)624P^JZ2rfn%f<{0kvv|Oa z(;~-s!Hg+N6YZH-0HrjN>UhA6m3hM4V8;H+l@LaD>uCtXa$-0$NNV!rDbK)4YNl>x z1T&1Lb3hojGm;rW22Wl*(;5*8lb_Et1B)uml4iU=*=Cj!n3p(9nn{6Ua=>iS$&+UZ zDuCk5qt;^XWL^e_(pClr3833yU|Zu}5wODdBCM0|L3}a!El_`(5?EM%wxB%FWs&>$ z&q(#=VPMEEL)R}g*?+b=*!7jOrI}{ufwirkEeICc4;0#12@*0e)2qnM3GilQ5@CR( zD3G!CXC7^t!Og(%Eg#+3*vX1>AjW#nk&e`!$iPsMqhDN7nUh+K&7ke>ue%NaJtfA( zzyLH44jLF+r!X+Y7p3MD>+69?G#586Sw#hR=A^^uM88ZL? diff --git a/excel_sheets/Series_metadata.xlsx b/excel_sheets/Series_metadata.xlsx deleted file mode 100644 index ba893f3a196c7b5a6b3dc69cdfd2689f2e080ab6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13580 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 diff --git a/excel_sheets/Survey_metadata.xlsx b/excel_sheets/Survey_metadata.xlsx index 3be5d6f6f46038fe3590ae299ac18b95c354559a..23a4e8173289c49f8997a0f1649880dae7090186 100644 GIT binary patch delta 974 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 G+yekj?dk>q delta 560 zcmeC`XYT4}<_+*>W)WdvVBla_6~sG{_W%cwid-w%GiBmc?Rr0sMLOaF>Jui+V0k2_ zdM|9P=i(zP?%uvUZS8FnJ(wBsBEu5=!+(lR%jI2wn zM42D97hHB*o>_5BmnHXGRri6@pZH`ZZJTA%bI9h*u{SHWq=mJ;zv07_%^+R!LX%Nj zVov0t7nkPq1{+PTU6sD7{`Ia!tJU&ubR2yC`t{3qi1mHPfd&~+<|2pOhrk##^007jv B=`8>N diff --git a/excel_sheets/Video_metadata.xlsx b/excel_sheets/Video_metadata.xlsx index 1486a557f3a0249209a43ee707a2ebcbd014c15f..d21681aa57007c048d8d45b8d69cb57359705ef2 100644 GIT binary patch delta 590 zcmX@#$atZVkvG7bnMH(wfq{b|y79yPDw%?(N8L(T`s$I2JYUzTsPXBWxDL+|DV&NC%#}cYm9Sxthr&S#p{?* z_r|)(GBfrvbW|uTPrfExD*tZQ1C#IPH?Xh&82p~|l+Au-_cgs~yv+t*CmUL7^7?uG z7hM&YAh1Ho-PB!U6O*1!eQ?3Y`)!6ZPw3t1%(`us{apEae#n8}pD(}OQIqxh#4b0l zDJB{Q6P~H9c&JqWMvF7twQ|Kt}ew^W`#$*udpq1Gp4=Jalp_@z&)qSqWL z((O8W{K2oQ^@6*O-I%-g;*LE=^H{wO&94u>j}jD-Gh^l`Z~n+=$;J!}k5Mwf*)ibcbcdJ-Nut2!YBd~yttv5uV%g!1Rnv>7jnaP8~7G$mf8w0}}bp{4u zV8Fvb1LK3q%JxbMAT=_M6XQbk7#My(XJn9oDFD*j8WlMv+i*xtuD9m_+u3I?&A58< zDtj3)@1(u76_XVMLwr$cPO-iohz#&%WD;S3M{wlg$u}PvGcqt}GchpmBbnU5_W*;`-Y5VVW(l&6; z6hog`r;qtb^Mu{FarQ)(v{-#Yw#wh{#hc9D-q2%?U-SKn~u9cYXkS`dJ&&Ln-l%SihAxk@g5G~`Fdt)FUuZV+kIzFKcCyXMknZ+ znUpG9&>JV~y(i?4?`vG0R6Of%tioO|VHJ7X+)c%wqVC_#m*2EaYjtVdy=RN=b!}ba zV)cIVYxn=I8FSv1-L>z%I`yMYhV+lG`ESKhLLzcz%p7Hb&7T=9*qDJKvRRL#T@TFI zVHUy+Voc_@dIlEwVHL{=7KpHU1QxKh^@a#^+gT$*bMkpRGkH+hf(>S4V3?!Mz#t3^ zco=A4ygymRUI}cJr@b_j0>@-q4ynlv_B>#retT)gRg+iS%Yb>O?4_+3tr!^Mi&Arn z_4PnxfHxzP2m?GSBNtD;`N)`&fkB&zfq@@p36O4Jd^K6#K@Mz;gM&1q*W?%nO|Z*m Zw>h;)19e str: + metadata_name = metadata_name.lower() + metadata_name = metadata_name.replace("-", "_") + if metadata_name == "microdata" or metadata_name == "survey_microdata": + metadata_name = "survey" + self._raise_if_unsupported_metadata_name(metadata_name=metadata_name) + return metadata_name + + def create_metadata_outline( + self, metadata_name_or_class: Union[str, Type[BaseModel]], debug: bool = False + ) -> BaseModel: + if isinstance(metadata_name_or_class, str): + schema = self.metadata_class_from_name(metadata_name_or_class) + else: + schema = metadata_name_or_class + skeleton_object = make_skeleton(schema, debug=debug) + return skeleton_object + + def write_metadata_outline_to_excel( + self, + metadata_name_or_class: Union[str, Type[BaseModel]], + filename: Optional[str] = None, + title: Optional[str] = None, + ) -> str: + """ + Create an Excel file formatted for writing the given metadata_name metadata. + + Args: + metadata_name_or_class (str or type[BaseModel]): the name of a supported metadata type, currently: + document, script, series, survey, table, timeseries, timeseries_DB, video + Currently not supported: + geospatial, image + If passed as a BaseModel type, for instance this is what you would do with a template, then the writer + defaults to a single page. + filename (Optional[str]): The path to the Excel file. If None, defaults to {metadata_name}_metadata.xlsx + title (Optional[str]): The title for the Excel sheet. If None, defaults to '{metadata_name} Metadata' + + Returns: + str: filename of metadata file + + Outputs: + An Excel file into which metadata can be entered + """ + if isinstance(metadata_name_or_class, str): + metadata_name = self.standardize_metadata_name(metadata_name_or_class) + if metadata_name == "geospatial": + raise NotImplementedError("Geospatial schema contains an infinite loop so cannot be written to excel") + skeleton_object = self.create_metadata_outline(metadata_name, debug=False) + writer = self._TYPE_TO_WRITER[metadata_name] + if filename is None: + filename = f"{metadata_name}_metadata.xlsx" + if title is None: + title = f"{metadata_name.capitalize()} Metadata" + else: + skeleton_object = make_skeleton(metadata_name_or_class, debug=False) + writer = write_to_single_sheet + metadata_name = metadata_name_or_class.model_json_schema()["title"] + if filename is None: + filename = f"{metadata_name}_metadata.xlsx" + if title is None: + title = f"{metadata_name.capitalize()} Metadata" + + if not str(filename).endswith(".xlsx"): + filename += ".xlsx" + writer(filename, skeleton_object, metadata_name, title) + return filename + + def save_metadata_to_excel( + self, + metadata_name_or_class: Union[str, Type[BaseModel]], + object: BaseModel, + filename: Optional[str] = None, + title: Optional[str] = None, + ) -> str: + """ + Save an Excel document of the given metadata object. + + Args: + metadata_name_or_class (str or type[BaseModel]): the name of a supported metadata type, currently: + document, script, series, survey, table, timeseries, timeseries_DB, video + Currently not supported: + geospatial, image + If passed as a BaseModel type, for instance this is what you would do with a template, then the writer defaults to a single page. + object (BaseModel): The pydantic object to save to the Excel file. + filename (Optional[str]): The path to the Excel file. Defaults to {name}_metadata.xlsx + title (Optional[str]): The title for the Excel sheet. Defaults to '{name} Metadata' + + Returns: + str: filename of metadata file + + Outputs: + An Excel file containing the metadata from the pydantic object. This file can be updated as needed. + """ + if isinstance(metadata_name_or_class, str): + metadata_name = self.standardize_metadata_name(metadata_name_or_class) + if metadata_name == "geospatial": + raise NotImplementedError("Geospatial schema contains an infinite loop so cannot be written to excel") + schema = self.metadata_class_from_name(metadata_name) + else: + schema = metadata_name_or_class + writer = write_to_single_sheet + metadata_name = metadata_name_or_class.model_json_schema()["title"] + skeleton_object = self.create_metadata_outline(metadata_name_or_class=metadata_name_or_class, debug=False) + + if filename is None: + filename = f"{metadata_name}_metadata.xlsx" + if not str(filename).endswith(".xlsx"): + filename += ".xlsx" + if title is None: + title = f"{metadata_name.capitalize()} Metadata" + + combined_dict = merge_dicts( + skeleton_object.model_dump(), + object.model_dump(exclude_none=True, exclude_unset=True, exclude_defaults=True), + ) + combined_dict = standardize_keys_in_dict(combined_dict) + new_ob = schema(**combined_dict) + + writer = self._TYPE_TO_WRITER[metadata_name] + writer(filename, new_ob, metadata_name, title) + return filename + + @staticmethod + def _get_metadata_name_from_excel_file(filename: str) -> str: + error_message = "Improperly formatted Excel file for metadata" + workbook = load_workbook(filename) + # Select the 'metadata' sheet + try: + sheet = workbook["metadata"] + # Get the value of cell C1 + type_info = sheet["C1"].value + except KeyError: + raise ValueError(f"Sheet 'metadata' not found. {error_message}") + except Exception as e: + raise ValueError(f"Error reading Excel file: {e}") + finally: + # Close the workbook + workbook.close() + + if not type_info or not isinstance(type_info, str): + raise ValueError(f"Cell C3 is empty or not a string. {error_message}") + + cell_values = type_info.split(" ") + + if len(cell_values) < 3 or cell_values[1] != "type" or cell_values[2] != "metadata": + raise ValueError(f"Cell C3 is improperly formatted. {error_message}") + + return cell_values[0] + + def read_metadata_from_excel(self, filename: str, metadata_class: Optional[Type[BaseModel]] = None) -> BaseModel: + """ + Read in metadata from an appropriately formatted Excel file as a pydantic object. + If using s standard metadata types (documents, scripts, survey, table, timeseries, timeseries_db, video) then there is no need to pass in the metadata_class. But if using a template, then the class must be provided. + Args: + filename (str): The path to the Excel file. + metadata_class (Optional type of BaseModel): A pudantic class type correspondong to the type used to write the Excel file + + Returns: + BaseModel: a pydantic object containing the metadata from the file + """ + metadata_name = self._get_metadata_name_from_excel_file(filename) + try: + metadata_name = self.standardize_metadata_name(metadata_name) + schema = self._TYPE_TO_SCHEMA[metadata_name] + reader = self._TYPE_TO_READER[metadata_name] + except ValueError: + if metadata_class is None: + raise ValueError( + f"'{metadata_name}' not supported. Must be: {list(self._TYPE_TO_SCHEMA.keys())} or try passing in the metadata_class" + ) + schema = metadata_class + reader = excel_single_sheet_to_pydantic + read_object = reader(filename, schema) + + skeleton_object = self.create_metadata_outline(metadata_name_or_class=schema, debug=False) + + read_object_dict = read_object.model_dump(exclude_none=True, exclude_unset=True, exclude_defaults=True) + combined_dict = merge_dicts( + skeleton_object.model_dump(), + read_object_dict, + ) + combined_dict = standardize_keys_in_dict(combined_dict) + new_ob = schema(**combined_dict) + return new_ob + + def _raise_if_unsupported_metadata_name(self, metadata_name: str): + """ + If the type is specifically unsupported - geospatial or image - a NotImplementedError is raised + If the type is simply unknown then a ValueError is raised. + """ + if metadata_name == "image": + raise NotImplementedError("Due to an issue with image metadata schema definition causing __root__ errors") + if metadata_name not in self._TYPE_TO_SCHEMA.keys(): + raise ValueError(f"'{metadata_name}' not supported. Must be: {list(self._TYPE_TO_SCHEMA.keys())}") diff --git a/pydantic_schemas/microdata_schema.py b/pydantic_schemas/microdata_schema.py index f3bb4d3..28646c2 100644 --- a/pydantic_schemas/microdata_schema.py +++ b/pydantic_schemas/microdata_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: microdata-schema.json -# timestamp: 2024-07-24T21:06:25+00:00 +# timestamp: 2024-08-29T18:53:43+00:00 from __future__ import annotations @@ -9,7 +9,7 @@ from pydantic import Extra, Field, constr -from .schema_base_model import SchemaBaseModel +from .utils.schema_base_model import SchemaBaseModel class AccessPolicy(Enum): diff --git a/pydantic_schemas/resource_schema.py b/pydantic_schemas/resource_schema.py new file mode 100644 index 0000000..de2a619 --- /dev/null +++ b/pydantic_schemas/resource_schema.py @@ -0,0 +1,64 @@ +# generated by datamodel-codegen: +# filename: resource-schema.json +# timestamp: 2024-08-29T18:53:45+00:00 + +from __future__ import annotations + +from typing import Optional + +from pydantic import Field + +from .utils.schema_base_model import SchemaBaseModel + + +class Model(SchemaBaseModel): + """ + External resource schema + """ + + dctype: Optional[str] = Field( + "doc/oth", + description=( + "Document types for external resource e.g. `doc/adm` \n* `doc/adm` - Document, Administrative [doc/adm] \n*" + " `doc/anl` - Document, Analytical [doc/anl] \n* `doc/oth` - Document, Other [doc/oth] \n* `doc/qst` -" + " Document, Questionnaire [doc/qst] \n* `doc/ref` - Document, Reference [doc/ref] \n* `doc/rep` - Document," + " Report [doc/rep] \n* `doc/tec` - Document, Technical [doc/tec] \n* `aud` - Audio [aud]\n* `dat` -" + " Database [dat]\n* `map` - Map [map]\n* `dat/micro` - Microdata File [dat/micro]\n* `pic` - Photo [pic]\n*" + " `prg` - Program [prg]\n* `tbl` - Table [tbl]\n* `vid` - Video [vid] \n* `web` - Web Site [web]" + ), + title="Resource type", + ) + dcformat: Optional[str] = Field( + None, + description=( + "Document file format e.g. `application/zip` \n* `application/x-compressed` - Compressed, Generic \n*" + " `application/zip` - Compressed, ZIP \n* `application/x-cspro` - Data, CSPro \n* `application/dbase` -" + " Data, dBase \n* `application/msaccess` - Data, Microsoft Access \n* `application/x-sas` - Data, SAS " + " \n* `application/x-spss` - Data, SPSS \n* `application/x-stata` - Data, Stata \n* `text` - Document," + " Generic \n* `text/html` - Document, HTML \n* `application/msexcel` - Document, Microsoft Excel \n*" + " `application/mspowerpoint` - Document, Microsoft PowerPoint \n* `application/msword` - Document," + " Microsoft Word \n* `application/pdf` - Document, PDF \n* `application/postscript` - Document," + " Postscript \n* `text/plain` - Document, Plain \n* `text/wordperfect` - Document, WordPerfect \n*" + " `image/gif` - Image, GIF \n* `image/jpeg` - Image, JPEG \n* `image/png` - Image, PNG \n*" + " `image/tiff` - Image, TIFF" + ), + title="Resource Format", + ) + title: str = Field(..., description="Title") + author: Optional[str] = Field(None, description="Author") + dcdate: Optional[str] = Field(None, description="Date") + country: Optional[str] = Field(None, description="Country") + language: Optional[str] = Field(None, description="Language") + contributor: Optional[str] = Field(None, description="Contributor") + publisher: Optional[str] = Field(None, description="Publisher") + rights: Optional[str] = Field(None, description="Rights") + description: Optional[str] = Field(None, description="Description") + abstract: Optional[str] = Field(None, description="Abstract") + toc: Optional[str] = Field(None, description="TOC") + filename: Optional[str] = Field( + None, + description=( + "Resource file name or URL. For uploading a file, use the field `file` in formData or use the `Upload file`" + " endpoint." + ), + ) diff --git a/pydantic_schemas/schema_interface.py b/pydantic_schemas/schema_interface.py deleted file mode 100644 index 5bf3a13..0000000 --- a/pydantic_schemas/schema_interface.py +++ /dev/null @@ -1,276 +0,0 @@ -from typing import Dict, Optional, Type - -from openpyxl import load_workbook -from pydantic import BaseModel - -from . import ( # image_schema, - document_schema, - geospatial_schema, - microdata_schema, - script_schema, - table_schema, - timeseries_db_schema, - timeseries_schema, - video_schema, -) -from .utils.excel_to_pydantic import excel_doc_to_pydantic, excel_single_sheet_to_pydantic -from .utils.pydantic_to_excel import write_across_many_sheets, write_to_single_sheet -from .utils.quick_start import make_skeleton -from .utils.template_to_pydantic import pydantic_from_template -from .utils.utils import standardize_keys_in_dict - - -class SchemaInterface: - """ - Interface with Excel for creating, saving and updating metadata for various types: - documents, scripts, survey, table, timeseries, timeseries_db, video - - Retrieve pydantic model definitions for each metadata type - """ - - _TYPE_TO_SCHEMA = { - "document": document_schema.ScriptSchemaDraft, - "geospatial": geospatial_schema.GeospatialSchema, - # "image":image_schema.ImageDataTypeSchema, - "script": script_schema.ResearchProjectSchemaDraft, - "survey": microdata_schema.MicrodataSchema, - "table": table_schema.Model, - "timeseries": timeseries_schema.TimeseriesSchema, - "timeseries_db": timeseries_db_schema.TimeseriesDatabaseSchema, - "video": video_schema.Model, - } - - _TYPE_TO_WRITER = { - "document": write_across_many_sheets, - # "geospatial":, - # "image":, - "script": write_across_many_sheets, - "survey": write_across_many_sheets, - "table": write_across_many_sheets, - "timeseries": write_across_many_sheets, - "timeseries_db": write_to_single_sheet, # one sheet - "video": write_to_single_sheet, # one sheet - } - - _TYPE_TO_READER = { - "document": excel_doc_to_pydantic, - # "geospatial":, - # "image":, - "script": excel_doc_to_pydantic, - "survey": excel_doc_to_pydantic, - "table": excel_doc_to_pydantic, - "timeseries": excel_doc_to_pydantic, - "timeseries_db": excel_single_sheet_to_pydantic, # one sheet - "video": excel_single_sheet_to_pydantic, # one sheet - } - - def get_metadata_class(self, metadata_type: str): - metadata_type = self.standardize_metadata_type_name(metadata_type) - schema = self._TYPE_TO_SCHEMA[metadata_type] - return schema - - def template_to_pydantic( - self, template: Dict, parent_schema_type: str, name: Optional[str] = None - ) -> Type[BaseModel]: - schema = self.get_metadata_class(parent_schema_type) - - return pydantic_from_template(template, schema, name) - - def list_metadata_types(self): - return list(self._TYPE_TO_SCHEMA.keys()) - - @staticmethod - def _merge_dicts(base, update): - if len(update) == 0: - return base - new_dict = {} - for key, base_value in base.items(): - if key in update: - update_value = update[key] - if isinstance(base_value, dict): - if isinstance(update_value, dict) and len(update_value) > 0: - new_dict[key] = SchemaInterface._merge_dicts(base_value, update_value) - else: - new_dict[key] = base_value - elif isinstance(base_value, list): - if isinstance(update_value, list) and len(update_value) > 0: - new_list = [] - min_length = min(len(base_value), len(update_value)) - for i in range(min_length): - if isinstance(base_value[i], dict): - if isinstance(update_value[i], dict): - new_list.append(SchemaInterface._merge_dicts(base_value[i], update_value[i])) - else: - new_list.append(base_value[i]) - else: - new_list.append(update_value[i]) - new_list.extend(update_value[min_length:]) - new_dict[key] = new_list - else: - new_dict[key] = base_value - else: - if update_value is not None: - new_dict[key] = update_value - else: - new_dict[key] = base_value - else: - new_dict[key] = base_value - return new_dict - - def standardize_metadata_type_name(self, metadata_type: str) -> str: - metadata_type = metadata_type.lower() - metadata_type = metadata_type.replace("-", "_") - if metadata_type == "microdata" or metadata_type == "survey_microdata": - metadata_type = "survey" - self._raise_if_unsupported_metadata_type(metadata_type=metadata_type) - return metadata_type - - def type_to_outline(self, metadata_type: str, debug: bool = False) -> BaseModel: - schema = self.get_metadata_class(metadata_type) - skeleton_object = make_skeleton(schema, debug=debug) - return skeleton_object - - def write_outline_metadata_to_excel( - self, metadata_type: str, filename: Optional[str] = None, title: Optional[str] = None - ) -> str: - """ - Create an Excel file formatted for writing the given metadata_type metadata. - - Args: - metadata_type (str): the name of a supported metadata type, currently: - document, script, series, survey, table, timeseries, timeseries_DB, video - Currently not supported: - geospatial, image - filename (Optional[str]): The path to the Excel file. If None, defaults to {metadata_type}_metadata.xlsx - title (Optional[str]): The title for the Excel sheet. If None, defaults to '{metadata_type} Metadata' - - Returns: - str: filename of metadata file - - Outputs: - An Excel file into which metadata can be entered - """ - metadata_type = self.standardize_metadata_type_name(metadata_type) - if metadata_type == "geospatial": - raise NotImplementedError("Geospatial schema contains an infinite loop so cannot be written to excel") - - if filename is None: - filename = f"{metadata_type}_metadata.xlsx" - if not str(filename).endswith(".xlsx"): - filename += ".xlsx" - if title is None: - title = f"{metadata_type.capitalize()} Metadata" - skeleton_object = self.type_to_outline(metadata_type, debug=False) - writer = self._TYPE_TO_WRITER[metadata_type] - writer(filename, skeleton_object, metadata_type, title) - return filename - - def save_metadata_to_excel( - self, metadata_type: str, object: BaseModel, filename: Optional[str] = None, title: Optional[str] = None - ) -> str: - """ - Save an Excel document of the given metadata_type metadata. - - Args: - metadata_type (str): the name of a supported metadata type, currently: - document, script, series, survey, table, timeseries, timeseries_db, video - Currently not supported: - geospatial, image - object (BaseModel): The pydantic object to save to the Excel file. - filename (Optional[str]): The path to the Excel file. Defaults to {name}_metadata.xlsx - title (Optional[str]): The title for the Excel sheet. Defaults to '{name} Metadata' - - Returns: - str: filename of metadata file - - Outputs: - An Excel file containing the metadata from the pydantic object. This file can be updated as needed. - """ - metadata_type = self.standardize_metadata_type_name(metadata_type) - if metadata_type == "geospatial": - raise NotImplementedError("Geospatial schema contains an infinite loop so cannot be written to excel") - - if filename is None: - filename = f"{metadata_type}_metadata.xlsx" - if not str(filename).endswith(".xlsx"): - filename += ".xlsx" - if title is None: - title = f"{metadata_type.capitalize()} Metadata" - - skeleton_object = self.type_to_outline(metadata_type=metadata_type, debug=False) - combined_dict = self._merge_dicts( - skeleton_object.model_dump(), - object.model_dump(exclude_none=True, exclude_unset=True, exclude_defaults=True), - ) - combined_dict = standardize_keys_in_dict(combined_dict) - - schema = self._TYPE_TO_SCHEMA[metadata_type] - new_ob = schema(**combined_dict) - - writer = self._TYPE_TO_WRITER[metadata_type] - writer(filename, new_ob, metadata_type, title) - return filename - - @staticmethod - def _get_metadata_type_from_excel_file(filename: str) -> str: - error_message = "Improperly formatted Excel file for metadata" - workbook = load_workbook(filename) - # Select the 'metadata' sheet - try: - sheet = workbook["metadata"] - # Get the value of cell C1 - type_info = sheet["C1"].value - except KeyError: - raise ValueError(f"Sheet 'metadata' not found. {error_message}") - except Exception as e: - raise ValueError(f"Error reading Excel file: {e}") - finally: - # Close the workbook - workbook.close() - - if not type_info or not isinstance(type_info, str): - raise ValueError(f"Cell C3 is empty or not a string. {error_message}") - - cell_values = type_info.split(" ") - - if len(cell_values) < 3 or cell_values[1] != "type" or cell_values[2] != "metadata": - raise ValueError(f"Cell C3 is improperly formatted. {error_message}") - - return cell_values[0] - - def read_metadata_from_excel(self, filename: str) -> BaseModel: - """ - Read in metadata_type metadata from an appropriately formatted Excel file as a pydantic object. - - Args: - filename (str): The path to the Excel file. - - Returns: - BaseModel: a pydantic object containing the metadata from the file - """ - metadata_type = self._get_metadata_type_from_excel_file(filename) - metadata_type = self.standardize_metadata_type_name(metadata_type) - schema = self._TYPE_TO_SCHEMA[metadata_type] - reader = self._TYPE_TO_READER[metadata_type] - read_object = reader(filename, schema) - skeleton_object = self.type_to_outline(metadata_type=metadata_type, debug=False) - - read_object_dict = read_object.model_dump(exclude_none=True, exclude_unset=True, exclude_defaults=True) - combined_dict = self._merge_dicts( - skeleton_object.model_dump(), - read_object_dict, - ) - combined_dict = standardize_keys_in_dict(combined_dict) - schema = self._TYPE_TO_SCHEMA[metadata_type] - new_ob = schema(**combined_dict) - return new_ob - - def _raise_if_unsupported_metadata_type(self, metadata_type: str): - """ - If the type is specifically unsupported - geospatial or image - a NotImplementedError is raised - If the type is simply unknown then a ValueError is raised. - """ - if metadata_type == "image": - raise NotImplementedError("Due to an issue with image metadata schema definition causing __root__ errors") - if metadata_type not in self._TYPE_TO_SCHEMA.keys(): - raise ValueError(f"'{metadata_type}' not supported. Must be: {list(self._TYPE_TO_SCHEMA.keys())}") diff --git a/pydantic_schemas/script_schema.py b/pydantic_schemas/script_schema.py index 17ef719..cb9e2ee 100644 --- a/pydantic_schemas/script_schema.py +++ b/pydantic_schemas/script_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: script-schema.json -# timestamp: 2024-07-24T21:06:27+00:00 +# timestamp: 2024-08-29T18:53:47+00:00 from __future__ import annotations @@ -9,7 +9,7 @@ from pydantic import Extra, Field -from .schema_base_model import SchemaBaseModel +from .utils.schema_base_model import SchemaBaseModel class Overwrite(Enum): diff --git a/pydantic_schemas/table_schema.py b/pydantic_schemas/table_schema.py index d04c0bb..6c0a88d 100644 --- a/pydantic_schemas/table_schema.py +++ b/pydantic_schemas/table_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: table-schema.json -# timestamp: 2024-07-24T21:06:30+00:00 +# timestamp: 2024-08-29T18:53:48+00:00 from __future__ import annotations @@ -9,7 +9,7 @@ from pydantic import Extra, Field -from .schema_base_model import SchemaBaseModel +from .utils.schema_base_model import SchemaBaseModel class Overwrite(Enum): diff --git a/pydantic_schemas/tests/test_excel_interface.py b/pydantic_schemas/tests/test_excel_interface.py index 4d6203e..543501d 100644 --- a/pydantic_schemas/tests/test_excel_interface.py +++ b/pydantic_schemas/tests/test_excel_interface.py @@ -1,25 +1,25 @@ import pytest -from pydantic_schemas.schema_interface import SchemaInterface +from pydantic_schemas.metadata_manager import MetadataManager @pytest.mark.parametrize( - "metadata_type", ["document", "script", "series", "survey", "table", "timeseries_db", "timeseries", "video"] + "metadata_name", ["document", "script", "survey", "table", "timeseries_db", "timeseries", "video"] ) -def test_metadata(tmpdir, metadata_type): - ei = SchemaInterface() +def test_metadata(tmpdir, metadata_name): + ei = MetadataManager() # Write empty metadata - filename = ei.write_outline_metadata_to_excel( - metadata_type=metadata_type, filename=tmpdir.join(f"test_{metadata_type}.xlsx"), title=metadata_type + filename = ei.write_metadata_outline_to_excel( + metadata_name_or_class=metadata_name, filename=tmpdir.join(f"test_{metadata_name}.xlsx"), title=metadata_name ) # Read the metadata back tmp = ei.read_metadata_from_excel(filename=filename) # Save the read metadata to a new file - filename2 = tmpdir.join(f"test_{metadata_type}_2.xlsx") - ei.save_metadata_to_excel(metadata_type=metadata_type, object=tmp, filename=filename2, title=metadata_type) + filename2 = tmpdir.join(f"test_{metadata_name}_2.xlsx") + ei.save_metadata_to_excel(metadata_name_or_class=metadata_name, object=tmp, filename=filename2, title=metadata_name) # make an outline object - ei.type_to_outline(metadata_type=metadata_type) + ei.create_metadata_outline(metadata_name_or_class=metadata_name) diff --git a/pydantic_schemas/tests/test_pydantic_to_excel.py b/pydantic_schemas/tests/test_pydantic_to_excel.py index ef64653..6090fd1 100644 --- a/pydantic_schemas/tests/test_pydantic_to_excel.py +++ b/pydantic_schemas/tests/test_pydantic_to_excel.py @@ -12,7 +12,6 @@ # from pydantic_schemas.definitions.image_schema import ImageDataTypeSchema from pydantic_schemas.microdata_schema import MicrodataSchema from pydantic_schemas.script_schema import ResearchProjectSchemaDraft -from pydantic_schemas.series_schema import Series from pydantic_schemas.table_schema import Model as TableModel from pydantic_schemas.timeseries_db_schema import TimeseriesDatabaseSchema from pydantic_schemas.timeseries_schema import TimeseriesSchema @@ -365,7 +364,6 @@ class WithDict(BaseModel): # "Image":ImageDataTypeSchema, "Survey": (MicrodataSchema, write_across_many_sheets, excel_doc_to_pydantic), "Script": (ResearchProjectSchemaDraft, write_across_many_sheets, excel_doc_to_pydantic), - "Series": (Series, write_to_single_sheet, excel_single_sheet_to_pydantic), # should be one sheet "Table": (TableModel, write_across_many_sheets, excel_doc_to_pydantic), "Timeseries_DB": ( TimeseriesDatabaseSchema, diff --git a/pydantic_schemas/timeseries_db_schema.py b/pydantic_schemas/timeseries_db_schema.py index 6c5bc95..add308e 100644 --- a/pydantic_schemas/timeseries_db_schema.py +++ b/pydantic_schemas/timeseries_db_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: timeseries-db-schema.json -# timestamp: 2024-07-24T21:06:31+00:00 +# timestamp: 2024-08-29T18:53:50+00:00 from __future__ import annotations @@ -9,7 +9,7 @@ from pydantic import Extra, Field -from .schema_base_model import SchemaBaseModel +from .utils.schema_base_model import SchemaBaseModel class Overwrite(Enum): diff --git a/pydantic_schemas/timeseries_schema.py b/pydantic_schemas/timeseries_schema.py index b3f39a2..dd5dcab 100644 --- a/pydantic_schemas/timeseries_schema.py +++ b/pydantic_schemas/timeseries_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: timeseries-schema.json -# timestamp: 2024-07-24T21:06:33+00:00 +# timestamp: 2024-08-29T18:53:52+00:00 from __future__ import annotations @@ -9,7 +9,7 @@ from pydantic import Extra, Field -from .schema_base_model import SchemaBaseModel +from .utils.schema_base_model import SchemaBaseModel class Producer(SchemaBaseModel): diff --git a/pydantic_schemas/utils/quick_start.py b/pydantic_schemas/utils/quick_start.py index ece358f..de09833 100644 --- a/pydantic_schemas/utils/quick_start.py +++ b/pydantic_schemas/utils/quick_start.py @@ -14,7 +14,6 @@ # "image_schema": "ImageDataTypeSchema", "microdata_schema": "MicrodataSchema", "script_schema": "ResearchProjectSchemaDraft", - "series_schema": "Series", "table_schema": "Model", "timeseries_db_schema": "TimeseriesDatabaseSchema", "timeseries_schema": "TimeseriesSchema", diff --git a/pydantic_schemas/schema_base_model.py b/pydantic_schemas/utils/schema_base_model.py similarity index 100% rename from pydantic_schemas/schema_base_model.py rename to pydantic_schemas/utils/schema_base_model.py diff --git a/pydantic_schemas/utils/template_to_pydantic.py b/pydantic_schemas/utils/template_to_pydantic.py deleted file mode 100644 index f44d311..0000000 --- a/pydantic_schemas/utils/template_to_pydantic.py +++ /dev/null @@ -1,189 +0,0 @@ -import warnings -from typing import Dict, List, Optional, Tuple, Type - -from pydantic import BaseModel, Field, create_model - -from .utils import get_subtype_of_optional_or_list, is_list_annotation, is_optional_annotation, standardize_keys_in_dict - - -def get_child_field_info_from_dot_annotated_name(name, parent_schema): - assert isinstance(parent_schema, type(BaseModel)), "get_child_field_info_from_dot_annotated_name" - name_split = name.split(".") - for key in name_split[:-1]: - parent_schema = parent_schema.model_fields[key].annotation - if is_optional_annotation(parent_schema) or is_list_annotation(parent_schema): - parent_schema = get_subtype_of_optional_or_list(parent_schema) - if not isinstance(parent_schema, type(BaseModel)): - raise KeyError(name) - try: - child_field_info = parent_schema.model_fields[name_split[-1]] - except KeyError as e: - raise KeyError(name) from e - except: - raise ValueError(f"name={name}, parent_schema={parent_schema}") - return child_field_info - - -def define_simple_element(item, parent_schema, element_type=str): - assert isinstance(parent_schema, type(BaseModel)), "define_simple_element" - assert ( - isinstance(item, dict) and "type" in item and item["type"] in ["string", "text", "integer", "number", "boolean"] - ), f"expected string, integer or boolean item, got {item}" - try: - child_field_info = get_child_field_info_from_dot_annotated_name(item["key"], parent_schema) - if "title" in item: - child_field_info.title = item["title"] - if "description" in item: - child_field_info.description = item["description"] - except KeyError as e: - warnings.warn(f"KeyError: {e}. Proceeding since {item['key']} is a string type.", UserWarning) - child_field_info = Field(..., title=item["title"]) - if "help_text" in item: - child_field_info.description = item["help_text"] - if "required" in item and item["required"]: - field_type = element_type, child_field_info - else: - child_field_info.default = None - field_type = Optional[element_type], child_field_info - return {item["key"]: field_type} - - -def get_children_of_props(props, parent_schema) -> Dict[str, Tuple["type_annotation", "field_info"]]: - assert isinstance(parent_schema, type(BaseModel)), "get_children_of_props" - children = {} - for prop in props: - if "prop_key" not in prop: - children.update(template_type_handler(prop, parent_schema)) - else: - name = prop["prop_key"] - try: - child_field_info = get_child_field_info_from_dot_annotated_name(name, parent_schema) - if "title" in prop: - child_field_info.title = prop["title"] - if "help_text" in prop: - child_field_info.description = prop["help_text"] - child_field = child_field_info.annotation, child_field_info - children[prop["key"]] = child_field - except KeyError as e: - children.update(template_type_handler(prop, parent_schema)) - return children - - -def define_array_element(item, parent_schema): - assert isinstance(parent_schema, type(BaseModel)), "define_array_element" - assert "type" in item and ( - item["type"] == "array" or item["type"] == "nested_array" - ), f"expected array item but got {item}" - assert "key" in item, f"expected key in item but got {item.keys()}" - if "props" not in item: - warnings.warn(f"array without type found, assuming array of str: {item}") - field_info = Field(..., title=item["title"]) - if "help_text" in item: - field_info.description = item["help_text"] - return {item["key"]: (List[str], field_info)} - else: - children = get_children_of_props(item["props"], parent_schema) - item_element = create_model(f"{item['key']}_item", **children) - return {item["key"]: (List[item_element], item_element)} - - -def define_simple_array_element(item, parent_schema): - assert isinstance(parent_schema, type(BaseModel)), "define_simple_array_element" - assert ( - isinstance(item, dict) and "type" in item and item["type"] == "simple_array" - ), f"expected simple_array item, got {item}" - try: - child_field_info = get_child_field_info_from_dot_annotated_name(item["key"], parent_schema) - if "title" in item: - child_field_info.title = item["title"] - if "description" in item: - child_field_info.description = item["description"] - except KeyError as e: - warnings.warn(f"KeyError: {e}. Proceeding since {item['key']} is a simple_array type.", UserWarning) - child_field_info = Field(..., title=item["title"]) - if "help_test" in item: - child_field_info.description = item["help_text"] - if "required" in item and item["required"]: - field_type = List[str], child_field_info - else: - child_field_info.default = None - field_type = Optional[List[str]], child_field_info - return {item["key"]: field_type} - - -def define_from_section_container(item, parent_schema): - assert isinstance(parent_schema, type(BaseModel)), "define_from_section_container" - assert ( - isinstance(item, dict) and "type" in item and item["type"] == "section_container" - ), f"expected section_container got {item}" - name = item["key"] - sub_model = create_model(name, **define_group_of_elements(item["items"], parent_schema)) - sub_field = Field(...) - if "title" in item: - sub_field.title = item["title"] - if "required" not in item or not item["required"]: - sub_field.default = None - return {name: (sub_model, sub_field)} - - -def define_group_of_elements(items, parent_schema): - assert isinstance(parent_schema, type(BaseModel)), "define_group_of_elements" - elements = {} - for i, item in enumerate(items): - if "is_custom" in item and item["is_custom"] == True: - if "additional" not in elements: - elements["additional"] = {} - elements["additional"].update(template_type_handler(item, parent_schema)) - elements["additional"] = standardize_keys_in_dict(elements["additional"], pascal_to_snake=True) - else: - elements.update(template_type_handler(item, parent_schema)) - elements = standardize_keys_in_dict(elements, pascal_to_snake=True) - if "additional" in elements: - additional = elements.pop("additional") - additional = create_model("additional", **additional) - sub_field = Field(...) - sub_field.title = "additional" - elements["additional"] = additional, sub_field - return elements - - -def template_type_handler(item, parent_schema): - assert isinstance(parent_schema, type(BaseModel)), "template_type_handler" - if item["type"] == "section_container": - return define_from_section_container(item, parent_schema) - elif item["type"] in ["string", "text"]: - return define_simple_element(item, parent_schema, str) - elif item["type"] in ["integer", "number"]: - return define_simple_element(item, parent_schema, int) - elif item["type"] == "boolean": - return define_simple_element(item, parent_schema, bool) - elif item["type"] in ["array", "nested_array"]: - return define_array_element(item, parent_schema) - elif item["type"] == "simple_array": - return define_simple_array_element(item, parent_schema) - elif item["type"] == "section": - warnings.warn(f"encountered section {item['key']}, {item['title']}, ignoring this heirarchy and appending") - if "items" in item: - return define_group_of_elements(item["items"], parent_schema) - elif "props" in item: - return define_group_of_elements(item["props"], parent_schema) - else: - raise ValueError(f"section does not contain items or props, found only {item}") - else: - raise NotImplementedError(f"type {item['type']}, {item}") - - -def pydantic_from_template( - template: Dict, parent_schema: Type[BaseModel], name: Optional[str] = None -) -> Type[BaseModel]: - assert isinstance(parent_schema, type(BaseModel)), "pydantic_from_template" - assert "items" in template, f"expected 'items' in template but got {list(template.keys())}" - m = define_group_of_elements(template["items"], parent_schema) - m = standardize_keys_in_dict(m, pascal_to_snake=True) - if name is None: - if "title" in template: - name = template["title"] - else: - name = "new_model" - name = name.replace(" ", "_").rstrip("_").split(".")[-1] - return create_model(name, **m) diff --git a/pydantic_schemas/utils/utils.py b/pydantic_schemas/utils/utils.py index 1e4a923..a7b3d02 100644 --- a/pydantic_schemas/utils/utils.py +++ b/pydantic_schemas/utils/utils.py @@ -110,6 +110,62 @@ def seperate_simple_from_pydantic(ob: BaseModel) -> Dict[str, Dict]: return {"simple": simple_children, "pydantic": pydantic_children} +def merge_dicts(base, update): + """merge a pair of dicitonaries in which the values are themselves either dictionaries to be merged or lists of + dictionaries to be merged""" + if len(update) == 0: + return base + elif len(base) == 0: + return update + new_dict = {} + for key, base_value in base.items(): + if key in update: + update_value = update[key] + if isinstance(base_value, dict): + if isinstance(update_value, dict): + new_dict[key] = merge_dicts(base_value, update_value) + else: + new_dict[key] = base_value + elif isinstance(base_value, list): + if isinstance(update_value, list) and len(update_value) > 0: + new_list = [] + min_length = min(len(base_value), len(update_value)) + for i in range(min_length): + if isinstance(base_value[i], dict): + if isinstance(update_value[i], dict): + new_list.append(merge_dicts(base_value[i], update_value[i])) + else: + new_list.append(base_value[i]) + else: + new_list.append(update_value[i]) + new_list.extend(update_value[min_length:]) + new_dict[key] = new_list + else: + new_dict[key] = base_value + else: + if update_value is not None: + new_dict[key] = update_value + else: + new_dict[key] = base_value + else: + new_dict[key] = base_value + for key, update_value in update.items(): + if key not in base: + new_dict[key] = update_value + return new_dict + + +def capitalize_first_letter(s): + if s: + return s[0].upper() + s[1:] + return s + + +def split_on_capitals(s): + # Use regular expression to split on capitalized letters + return re.findall(r"[a-z]+|[A-Z][a-z]*", s) + + def _standardize_keys_in_list_of_possible_dicts(lst: List[any], snake_to_pascal, pascal_to_snake) -> List[Any]: new_value = [] for item in lst: @@ -128,17 +184,6 @@ def _standardize_keys_in_list_of_possible_dicts(lst: List[any], snake_to_pascal, return new_value -def capitalize_first_letter(s): - if s: - return s[0].upper() + s[1:] - return s - - -def split_on_capitals(s): - # Use regular expression to split on capitalized letters - return re.findall(r"[a-z]+|[A-Z][a-z]*", s) - - def standardize_keys_in_dict( d: Dict[str, Any], snake_to_pascal: bool = False, pascal_to_snake: bool = False ) -> Dict[str, Any]: diff --git a/pydantic_schemas/video_schema.py b/pydantic_schemas/video_schema.py index f0a26c9..285479a 100644 --- a/pydantic_schemas/video_schema.py +++ b/pydantic_schemas/video_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: video-schema.json -# timestamp: 2024-07-24T21:06:35+00:00 +# timestamp: 2024-08-29T18:53:54+00:00 from __future__ import annotations @@ -9,7 +9,7 @@ from pydantic import Extra, Field -from .schema_base_model import SchemaBaseModel +from .utils.schema_base_model import SchemaBaseModel class Overwrite(Enum): diff --git a/pyproject.toml b/pyproject.toml index bb6a5d6..51d8047 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,13 +1,12 @@ [tool.poetry] name = "metadataschemas" -version = "0.1.5" +version = "0.1.6" description = "" authors = ["Mehmood Asghar ", "Gordon Blackadder "] readme = "README.md" packages = [ { include = "*_schema.py", from = "pydantic_schemas", to = "metadataschemas"}, - { include = "schema_base_model.py", from = "pydantic_schemas", to = "metadataschemas"}, - { include = "schema_interface.py", from = "pydantic_schemas", to = "metadataschemas"}, + { include = "metadata_manager.py", from = "pydantic_schemas", to = "metadataschemas"}, { include = "utils", from = "pydantic_schemas", to = "metadataschemas"}, ] From 04f4e22d8d65b3812a90b6cbcbffa9059dee828a Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Thu, 5 Sep 2024 16:31:17 -0400 Subject: [PATCH 46/51] resetting version number --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 51d8047..09ca40f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "metadataschemas" -version = "0.1.6" +version = "0.1.0" description = "" authors = ["Mehmood Asghar ", "Gordon Blackadder "] readme = "README.md" From ab6a78d72f78431e740c1fb2b1d469a06e54bb48 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Thu, 5 Sep 2024 16:46:37 -0400 Subject: [PATCH 47/51] update pydantic and excel sheets after merging --- README.md | 29 +- excel_sheets/Document_metadata.xlsx | Bin 38854 -> 38854 bytes excel_sheets/Resource_metadata.xlsx | Bin 8441 -> 8437 bytes excel_sheets/Script_metadata.xlsx | Bin 40332 -> 40329 bytes excel_sheets/Survey_metadata.xlsx | Bin 53805 -> 53804 bytes excel_sheets/Table_metadata.xlsx | Bin 38933 -> 38933 bytes excel_sheets/Timeseries_db_metadata.xlsx | Bin 15570 -> 15569 bytes excel_sheets/Timeseries_metadata.xlsx | Bin 51082 -> 51139 bytes excel_sheets/Video_metadata.xlsx | Bin 16592 -> 16592 bytes pydantic_schemas/document_schema.py | 2 +- pydantic_schemas/geospatial_schema.py | 2 +- pydantic_schemas/image_schema.py | 2 +- pydantic_schemas/microdata_schema.py | 2 +- pydantic_schemas/resource_schema.py | 2 +- pydantic_schemas/script_schema.py | 2 +- pydantic_schemas/table_schema.py | 2 +- .../tests/test_template_to_pydantic.py | 1923 ----------------- pydantic_schemas/timeseries_db_schema.py | 2 +- pydantic_schemas/timeseries_schema.py | 7 +- pydantic_schemas/utils/pydantic_to_excel.py | 2 +- pydantic_schemas/video_schema.py | 2 +- 21 files changed, 32 insertions(+), 1947 deletions(-) delete mode 100644 pydantic_schemas/tests/test_template_to_pydantic.py diff --git a/README.md b/README.md index 2cd459a..6b669be 100644 --- a/README.md +++ b/README.md @@ -37,9 +37,11 @@ There are metadata objects for each of the following metadata types: | timeseries_db | `timeseries_db_schema.TimeseriesDatabaseSchema` | | video | `video_schema.Model` | -### Python - Excel interface +### Python - Metadata Manager -The Excel interface exists to +The Manager exists to be an interface with Excel and to lightly assist creating schemas. + +For Excel we can: 1. Create blank Excel files formatted for a given metadata type 2. Write metadata objects to Excel @@ -48,29 +50,34 @@ The Excel interface exists to To use it run: ```python -from metadataschemas import ExcelInterface +from metadataschemas import MetadataManager -ei = ExcelInterface() +mm = MetadataManager() -filename = ei.write_outline_metadata_to_excel(metadata_type='timeseries') +filename = mm.write_metadata_outline_to_excel('timeseries') -filename = ei.save_metadata_to_excel(metadata_type='timeseries', +filename = mm.save_metadata_to_excel('timeseries', object=timeseries_metadata) # Then after you have updated the metadata in the Excel file -updated_timeseries_metadata = ei.read_metadata_excel(filename = timeseries_metadata_filename) +updated_timeseries_metadata = mm.read_metadata_from_excel(timeseries_metadata_filename) ``` -Note that the Excel interface currently does not support Geospatial metadata. +Note that the Excel write and save functions do not currently support Geospatial metadata. -The Excel interface also offers a convenient way to get started creating metadata in pydantic by creating an empty pydantic object for a given metadata type which can then be updated as needed. +The manager also offers a convenient way to get started creating metadata in pydantic by creating an empty pydantic object for a given metadata type which can then be updated as needed. ```python -survey_metadata = ei.type_to_outline(metadata_type="survey") +# list the supported metadata types +mm.metadata_type_names -survey_metadata.repositoryid = "repository id" +# get the pydantic class for a given metadata type +survey_type = mm.metadata_class_from_name("survey") +# create an instantiated pydantic object and then fill in your data +survey_metadata = mm.type_to_outline(metadata_type="survey") +survey_metadata.repositoryid = "repository id" survey_metadata.study_desc.title_statement.idno = "project_idno" ``` diff --git a/excel_sheets/Document_metadata.xlsx b/excel_sheets/Document_metadata.xlsx index c334e93203fe9e068024c705393a82aef00a1546..02e041742d2234867b0bbac217aeb0eefc472ed0 100644 GIT binary patch delta 2082 zcmbVNc~H}58V2<~bIbKiTmf(5oe4uOdE-vfPIfHh(f=ykasQ3oLkFVMmu9~E zyrQ4t!#~8&h#CpA@<D-US7hkjl?XNZO~=EQ%@Qs@f9sQjxPKPy{5jo-)nfj#pI+s(stVYA8SICQL=46lygq5sC?9WRGuBH03OVMe$bkAads7gAdk)JYgead zvU9?CciL7S!zu{5vhn@Am?rPBg=U5N^`lxPWt3Rx#a7BUWWv3T7cb%PD}PCV^eWhL z)l#}BMo4X7)*gej4C6)X_4OBE9Z8UtsY2MW+z6NL>D`tUNfvYuj8I{@;-13PVWJoHi%~4uVGdNPsJDZ5 zD(Ul!s=D#F{VznDb^YaCaehQUVgS*f7%21;1_=Fyf%bm(0rvj(fpkB50NtM+i1ot; zVEwUy&H<@kR`2|&A=<^J>}r3jVjvE~M%omja9|P7Bl#{amLwIQ#&l`k|B(|MakZ&c zHgFo#i3AH4BnHEE7sm>2_VOoVNd}sy1AK*ZItafMP|g1C>1hmwhXY2JT~>AVgzp-Oa;h_&H_tzG*10XT*jmk;)^0Ofz@O z_YJuG(&pdqYZt823AO;JU{~uCvw60#P^8V$%j(}Ci^{Ksc8MWCQJxd2B|a0dUFI&BP{YKGjfme7!dh;Jh~rnn|8|$~)4SV1Q)jW~SBV)^sRMFVAZnCR+|l zHtE<0COVsR`~!0{ixj9aO}E7SEPoaj@Q*!Y`kXs!wn2Sm8fjn!6h$92X>zwv-$rv_ z^k=}X-CjBYK=n?fzMb+$EYKKt7(iGU>RF-A0lRYHn!dM7qdMA*HOaTe$VGYG2G&yH zz~7)o##^I!ujK&__`^GXzS(W_M$%*T-*WwDux1bcQYWrTdQN>1knnr)KLTn#u69c` zpZL38-ztUJ1)R)-1JiLv+ui?<1i)>}0R8t3YU@#&+=XXft-h%&M?m%vSY@Wygb2sw z$7J71xgh?Fu}P-__K)LfYiHTsnPdZ=ctGu5_@Y+yx*bhu0Jl$%sOqIFO=$SS094*L zNN*2kAlmWG9Q<+=llE{yU@sYq37hC0?M`F7Ou_n%*}>#Ydsv}}K`0wyAE;D{goPMn zM?o22kCm%b^p=#GsEoddq)mKX3U$#F?S}J^N?BAMxwKB%i;|Gr#U#l)1YxY%l0}`N zjw{9HRUFm?og=UyKZeS?^UwLJjXt^+%pvP%=6dhX1M~KtR-~3-Fu7)0GIh?%R7*tX z?{5(XWnhaCZbay5zJR`43tCBIVVjPYBp2=2BILivY6&m}9R1@U1D_UqXyYP_eY8%^ zQ39%qeYDQm;y^9JO16-&jm&M7ZliDM)_;Dfr&j-@)Lo0x(j!`QFFU5i+_Ip510du7 AjQ{`u delta 2001 zcmaJ?dsGrw8b?J<#I*E?R!ZebMi)UHA345y%eStzn*_L_@e(V8exXIapM+r#B!hb zcvnMcT(4{#%f6c7_eD^C$b8c)07n+HLl??|VFWyO;9svqp%o$mQy= z1Kvl>p*B8@0S9uK#6Q`##F0z}bEl3oJlc*8F`&3CI0L6nymL0?ms(BIGnR8DG_aLU z36uO`0w+qM%I(YyAdqqt1j1a_aWUAsK9Jq7dC6zs5J(XbXi}{yE|~O`&@zsq|0-G%GbFZn*N)i+(@R=m_e4L^IFEv$NwxuC@c)YSa zt}^aB&BRNJpRs`M*U%|CUw@``en6_6Bd|4O0a{2a7zYa6!Dma$wL(J#-Oq>5@d)TS z6)eclOudQYWR1fD{9NI$j(#mk)et5MeZ~bU`uKIjv1y%s2qACA(0+Y3&v@z z@IG{z3QxMJT&PA~??%&DsVO+#YD{pZnBqSp`?W{NIa(+8*A*g`$n2yd;t8~E^EqT^ zBUXAx=}L(q5>#;>b@Is!N~?<4G_ab!a6Wx@jILm+#)AZYY}@A-M!0R0vx*f74w>I$ z#~A*8VrpBDq~KO`>o%sq?ljdiGo7Gny#I=&tTvrmc$fS)swNqvKS`#@t@4utzpKqM5fKQN#YSSRG*#Gl2=;s)Qd^ z&rbDM1!?E@=s9goC|7Z`P>OQxy zREA8SS6R#MJEK7NNvwaKS;*)WN0eQ~&Y~D`f&Y|1v+!wt=w$;)FY*^~7P(nZ0q#pfp0rmISMdt+Gp{k&7|5~0SRBeVKT{s^ zE}<&*^37n3>fX@4-g59_hbwq&q7OyoO&Eck9d0n|v!mY{EC;<$2n2*(Za`*Y0PXTA z=>nlwoPapN5VUO9H^e!}HJ65$KCu}~45Sroy*hoWo#7^qxud#V3Pd7aX7&h}X z4CjEzQXL4`W9tfg)BYCzp+;;plK~E%L$B*$TK&08s0J9wxrzqav4#fmDZ4a>nc#qV zhW>sfg4+NtUUgb`Y*}->I>13y0-ZhXYpokVE7LR00cVHX`bDpD?dhD%!T_WxTrYFP z0o*{k8)>u4uT}r=9G`^23|IU5<<}BFij96R*ahC&{9feGn?;QE%U8I4AGNSetyp{o zgvPr4-_Z5`tUvAVza=U0DL%iov~{?<;ILl~66+9VzEOd_DRPddDU0_#o)~U*A&A-c zeld&mK?5tD8DGUC311^>f|%lHr!;2u%V@=T7&8WQTw+>K;!mn&M-chT-|~A^r`>Vb zK|NbW+fNO=ac8rT-wNf)e9F9rxW8m6~N;hw^1Fyj1JS#epo@ z(YiO2d;zYplkg;&ovh%I8ijJSfSO0Qm8H$}Xy)ib##!W|C&yhu742-!B0cw}2yNuk zehXaVuIy$1Kdg41Mo^01@#1_BP^_Pv zUzDm>k(;x0qObp91D>}3r>0cD-jeFky(`XPj)PN@P{wwRkK3}&whJvT`#*0>&Ru~! z7RTN{KE5qTTYn1o52-oF9dwT!O|X(~{ghp%@QF!b6|r+*ARHhuP_?kvqySIbKN%D>pp)qDBvy1(rol`^t^e9b>AjuJ$h z-!a;;F#`i>vp&Z`J}~36m=iOIG1)@u8CXD3I+hVE&?xf=ERZJa4H4KPXUz!@;K@Ja z%)rVF<)s<#PWF{ok_X8NO+EXqkB@;tr;mX_0vPx(u&q&Ua-Y0<6iCg^yG)5v%nS@^ z0t^hiFa^#A|> delta 593 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 HT+j4h#PcLN diff --git a/excel_sheets/Survey_metadata.xlsx b/excel_sheets/Survey_metadata.xlsx index 23a4e8173289c49f8997a0f1649880dae7090186..0d0eae172b74b020d2d2de7f587678c9607cf945 100644 GIT binary patch delta 1778 zcmZux3pA8j9KYXq7DwAq}!=brEW{{Q>?{qJ{w=lm}_N8(wIgo2~J zgrq6}Kn7gDt2CM#>FK`j;iYqsk42vYM%`9 z;4f_6K7!WR+QKEb`~;0Asc`u=FWpkkSUa*ym3p9Bw zydkn;7ZMxyuQgvx2S7C1639&zBdVYnJ+=-8-PTecL8SR^Tf?7%qH4efmQD2rV%IACcc82GEG-uezp1s3_6 z$>v-9d}-u-0{tjt{<iSd>AQ9N}`rjDs*(i42`pX5sY=GGi5+s^xxyFPN{ox*R?*D8y7= z3tOpr#q$WiS;8UA2C;0O30rO+n|*H0ixAH8mFX4X{rjc{&2LzSy_;omwNsY-1bTu3mxG1Q)Y(gVxrh(}P;;w77t+KIMr2_E5|=Bo?* zhRVuVmr3|rC0`iP&ME6E7H8=}pgUxA!4Z`vH)(oNISAA8Yqqa{`LexqnKkgd0Ljl=)Kmi4s zL2ha&pxv`nK--PWP4c!EwVVG9wB7m=T(KyDl%*n%f)nigb+A<4vJPr%oh8IuQ2X@+ zO4-ubkDy?*Npl^nH3y&oQd_Mz-Z}WP)dCgHwBnHwDA%?__v?-aV4LWH{CAW_>B+#F z1U2Gb0`2M*M|%XL3cfs`E}fM$Lqrh(yM)auWyowZM9<;0;W5W|iEF^=Hf1!0wBs>E zZ!|?}S4Pk0+&y)9w;BM;J)0|GgHU2f`?~glNb7eGO>sYKH|*Q2%}EduHKAMw>L50PizImf_yGXm{xwCkmPSp&nvUJ*b>4U2ky0qr zsdZ57WZAK)`_&?bItBod@XLrqlwJcs3G}`aWJ(Z!H<<~~cj6HN4DZxNi>7trF+ELi lu1U*y6Vc_&WA;v41b}=Q093xz2OtuegGiTw^o3S&@*hE9^8Ww; delta 1824 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 Wz7%i9uu^jY;9BV)&HLWcu>S&*u9k!V delta 2058 zcmaJ?eK^y58=sdj?^5K1T~A#_$IFBn!c>oxQ>b&E5SntDx1!+~!Y_x8$J<%GixEwVn$w~FgvxvTC>N->0JHsJlFNTuFvOtfA7zIf9~%;_tkrv zSMO;Wg?^)@y$J?`>A`RWn{uOvdaDp23;h{UKKL~RG=^_DS~gts-*V27aAF$jQIE8rKi5G;O%ZdQ#&6q)&>;QzxP%|; z{@L@7jNs8};+%Nrw~Q%5R>xymD%WBnZ`T(2mMGRoqi-3r?6oO$l-CDEIV{!$Ch z+sHSw8(wJI`-`%On}tq6SaTiCpSg%ie@qtvC^)D zP8x)$Y~uAuCDBXEl#&u2Ny202NU6DJk4MUesfcOO;=)H^_cUJAD_PR@bwoChNN7tF zY4_}>fg&i^f{MwFr*ytLJyE#JclqfH02UCha%}%`b#6A^1o_ z^X&)^Y^UhZw2+eL5k!kxczQqANqNCboCPUc>Dxn6lzv@IrQTWW%Nbe2(cv>K?Gh&B zGsgT?K0Ws-VW?Y78)7h;<`i&NE0?#@Lz`h2*r8|Qu(cl1@;_4FFBT&#n%I0P1VNs` z#P%PzHy{HKD}7F9zyo_vmi=loIzQem9;^12OjG>s2xn*?7RH4G;^cXZzx)KdO%mTS ztjOLe%5EwV<3)|>D_KM2tRraFnC;5=4PkAXoh9~U8EcOde7ZF>6YFDEj=yy;Lx6;DGS|W%H$&`ZPpe8^- zg`5@w{a6l-ffA;0IcwQ_@q(*yjx^B~=VAryPwo1;#B{{WUVAoa%VEwS-j%xIY893e z%$XdRd39QTcldR9RF|(sn2YMD(j7jhmv(=^J5rUd7J`(r0JLW4WIfGegDeJprb#PiBMKIs6W!tbk##?dUEJHsBDK)H^{gHaJRT@3LP)} z%I-Tat2ZNcQ-GUiLx7{~KtA39JT%iah&^Zh^x>1B?0s%9@YdK>pEK-9&d&orRsG<4 zp%ZXEqifjWVH{V7bq~S0Yr%kNkprOMbdB%)!nS%H_HR1tD^I__!iMVbQV&R~)_{S& z6bGO*(>44LXWZ~TcjAc=4|Wk;x7lrIl{9%?=i{JcsuBkS`R1+$rT6ikT8i6*ee{!{ zJk|}aR@A(N-vyUboIt3lEd&$p9W4acPr1X_ueJREGIxisS*Xnn0)1vE zeYJrL6TALLsV}vYF4hr53Xa` cIzF%TROg$JJk)rQq#giVA_b`LJkr7c0s}teeEqz~W1c`NJpz2CfV&W;^{eEI&jr)U1$lE?g7Ofzt*W9K}R^0;2{ou4m+ zd{`S1n^rG+Lgx|7$#nPEPiF0z#^1l&cM(_Mou!ZLL{G;mrtF;Z^i^%i-xvEibJJhd z{^frhx delta 530 zcmcaud8v{&z?+#xgn@y9gCV_Kb|UWqP9PPzfvJ$?&BSY(^|yJqxJK&vSU0vDQ4!dF z;^VfCWxYa+%kurBxAC!Tmwo*Ib9(f|7p!KD^PC@RZdhvZIwsV;v2L!+%)Ja96)MY< zuL+mRznlHQtv}Pjh)0@WIZ18omp`|vjpVxoMRe=ctE0o+#-8D8b zt(ocTM8jahGqn{DmFiz< zaoTr%viZH+A?=#KK+UHuetIWg|4H0@TW!^u)2_4hFBfgqp7tnDwd?5b2fwb?i|#sh zWAEOB6@nU^_5XZp8Bu&6IWuOCvH%+c!yI)624P^BRBZmksKdq#43W*+9Nk)A#!jOU zW)NetfY~#!z)!PSMzBDn#UrqQouxNKpvTG@5t@@PSeb#9aav0=-kYpytpw(ISxYm? zb4<44km3*UW@Hj!fXBt;2|$HwC$F)V0V_OhEp5eO#=sC?l$ukluLmO0G(;|*eDjep xBLjmr69WT3(D^XX!1#8uf{h&57)KjvM&HS?Hkx2wCy-|}d8v&WTb&h1H2|#hzTf}= diff --git a/excel_sheets/Timeseries_metadata.xlsx b/excel_sheets/Timeseries_metadata.xlsx index 7b8141476598a1ad88c0fbbe986939701d920ce4..c955f658e6ed95d44d5406b2b4dce61eb901163b 100644 GIT binary patch delta 20577 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 delta 22821 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 Vr|iwZG_!*hn09b*1=Af49spp Date: Thu, 5 Sep 2024 16:48:04 -0400 Subject: [PATCH 48/51] include ref to excel sheet folder --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 6b669be..dc40ff6 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,10 @@ This repository contains both the definitions of Metadata Schemas and a python l The schemas are defined in the JSON Schema format in the folder `schemas`. For more information you can view documentation at https://worldbank.github.io/metadata-schemas/ +## Excel + +Excel sheets formatted for each metadata type are located in this repo in the excel_sheets folder. + ## Python library To install the library run From ddce25f14c46972c24cf545587ee1e771835d8cd Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Fri, 6 Sep 2024 16:56:46 -0400 Subject: [PATCH 49/51] fix bugs when working with templates --- pydantic_schemas/metadata_manager.py | 22 ++--- .../tests/test_excel_interface.py | 25 ------ .../tests/test_metadata_manager.py | 90 +++++++++++++++++++ pydantic_schemas/utils/excel_to_pydantic.py | 13 ++- 4 files changed, 113 insertions(+), 37 deletions(-) delete mode 100644 pydantic_schemas/tests/test_excel_interface.py create mode 100644 pydantic_schemas/tests/test_metadata_manager.py diff --git a/pydantic_schemas/metadata_manager.py b/pydantic_schemas/metadata_manager.py index 77a3d3f..0cfe462 100644 --- a/pydantic_schemas/metadata_manager.py +++ b/pydantic_schemas/metadata_manager.py @@ -1,5 +1,5 @@ from copy import copy -from typing import Dict, Optional, Type, Union +from typing import Dict, List, Optional, Type, Union from openpyxl import load_workbook from pydantic import BaseModel @@ -68,18 +68,18 @@ class MetadataManager: "video": excel_single_sheet_to_pydantic, # one sheet } - def metadata_class_from_name(self, metadata_name: str): + def metadata_class_from_name(self, metadata_name: str) -> Type[BaseModel]: metadata_name = self.standardize_metadata_name(metadata_name) schema = self._TYPE_TO_SCHEMA[metadata_name] return copy(schema) @property - def metadata_type_names(self): + def metadata_type_names(self) -> List[str]: return list(self._TYPE_TO_SCHEMA.keys()) def standardize_metadata_name(self, metadata_name: str) -> str: metadata_name = metadata_name.lower() - metadata_name = metadata_name.replace("-", "_") + metadata_name = metadata_name.replace("-", "_").replace(" ", "_") if metadata_name == "microdata" or metadata_name == "survey_microdata": metadata_name = "survey" self._raise_if_unsupported_metadata_name(metadata_name=metadata_name) @@ -175,10 +175,11 @@ def save_metadata_to_excel( if metadata_name == "geospatial": raise NotImplementedError("Geospatial schema contains an infinite loop so cannot be written to excel") schema = self.metadata_class_from_name(metadata_name) + writer = self._TYPE_TO_WRITER[metadata_name] else: + metadata_name = metadata_name_or_class.model_json_schema()["title"] schema = metadata_name_or_class writer = write_to_single_sheet - metadata_name = metadata_name_or_class.model_json_schema()["title"] skeleton_object = self.create_metadata_outline(metadata_name_or_class=metadata_name_or_class, debug=False) if filename is None: @@ -195,7 +196,7 @@ def save_metadata_to_excel( combined_dict = standardize_keys_in_dict(combined_dict) new_ob = schema(**combined_dict) - writer = self._TYPE_TO_WRITER[metadata_name] + # writer = self._TYPE_TO_WRITER[metadata_name] writer(filename, new_ob, metadata_name, title) return filename @@ -229,10 +230,11 @@ def _get_metadata_name_from_excel_file(filename: str) -> str: def read_metadata_from_excel(self, filename: str, metadata_class: Optional[Type[BaseModel]] = None) -> BaseModel: """ Read in metadata from an appropriately formatted Excel file as a pydantic object. - If using s standard metadata types (documents, scripts, survey, table, timeseries, timeseries_db, video) then there is no need to pass in the metadata_class. But if using a template, then the class must be provided. + If using standard metadata types (documents, resource, script, survey, table, timeseries, timeseries_db, video) then there is no need to pass in the metadata_class. But if using a template, then the class must be provided. + Args: filename (str): The path to the Excel file. - metadata_class (Optional type of BaseModel): A pudantic class type correspondong to the type used to write the Excel file + metadata_class (Optional type of BaseModel): A pydantic class type correspondong to the type used to write the Excel file Returns: BaseModel: a pydantic object containing the metadata from the file @@ -242,11 +244,11 @@ def read_metadata_from_excel(self, filename: str, metadata_class: Optional[Type[ metadata_name = self.standardize_metadata_name(metadata_name) schema = self._TYPE_TO_SCHEMA[metadata_name] reader = self._TYPE_TO_READER[metadata_name] - except ValueError: + except ValueError as e: if metadata_class is None: raise ValueError( f"'{metadata_name}' not supported. Must be: {list(self._TYPE_TO_SCHEMA.keys())} or try passing in the metadata_class" - ) + ) from e schema = metadata_class reader = excel_single_sheet_to_pydantic read_object = reader(filename, schema) diff --git a/pydantic_schemas/tests/test_excel_interface.py b/pydantic_schemas/tests/test_excel_interface.py deleted file mode 100644 index 543501d..0000000 --- a/pydantic_schemas/tests/test_excel_interface.py +++ /dev/null @@ -1,25 +0,0 @@ -import pytest - -from pydantic_schemas.metadata_manager import MetadataManager - - -@pytest.mark.parametrize( - "metadata_name", ["document", "script", "survey", "table", "timeseries_db", "timeseries", "video"] -) -def test_metadata(tmpdir, metadata_name): - ei = MetadataManager() - - # Write empty metadata - filename = ei.write_metadata_outline_to_excel( - metadata_name_or_class=metadata_name, filename=tmpdir.join(f"test_{metadata_name}.xlsx"), title=metadata_name - ) - - # Read the metadata back - tmp = ei.read_metadata_from_excel(filename=filename) - - # Save the read metadata to a new file - filename2 = tmpdir.join(f"test_{metadata_name}_2.xlsx") - ei.save_metadata_to_excel(metadata_name_or_class=metadata_name, object=tmp, filename=filename2, title=metadata_name) - - # make an outline object - ei.create_metadata_outline(metadata_name_or_class=metadata_name) diff --git a/pydantic_schemas/tests/test_metadata_manager.py b/pydantic_schemas/tests/test_metadata_manager.py new file mode 100644 index 0000000..5df4fef --- /dev/null +++ b/pydantic_schemas/tests/test_metadata_manager.py @@ -0,0 +1,90 @@ +import pytest + +from pydantic_schemas.metadata_manager import MetadataManager + + +@pytest.mark.parametrize( + "metadata_name", ["document", "script", "survey", "table", "timeseries_db", "timeseries", "video"] +) +def test_metadata_by_name(tmpdir, metadata_name): + mm = MetadataManager() + assert metadata_name in mm.metadata_type_names + + for debug in [True, False]: + mm.create_metadata_outline(metadata_name_or_class=metadata_name, debug=debug) + + # Write empty metadata + filename = mm.write_metadata_outline_to_excel( + metadata_name_or_class=metadata_name, filename=tmpdir.join(f"test_{metadata_name}.xlsx"), title=metadata_name + ) + + # Read the metadata back + tmp = mm.read_metadata_from_excel(filename=filename) + + # Save the read metadata to a new file + filename2 = tmpdir.join(f"test_{metadata_name}_2.xlsx") + mm.save_metadata_to_excel(metadata_name_or_class=metadata_name, object=tmp, filename=filename2, title=metadata_name) + + # make an outline object + mm.create_metadata_outline(metadata_name_or_class=metadata_name) + + +@pytest.mark.parametrize( + "metadata_name", ["document", "script", "survey", "table", "timeseries_db", "timeseries", "video"] +) +def test_metadata_by_class(tmpdir, metadata_name): + mm = MetadataManager() + + metadata_class = mm.metadata_class_from_name(metadata_name=metadata_name) + + # outline from class + mm.create_metadata_outline(metadata_name_or_class=metadata_class) + + # write and read from class + filename_class = mm.write_metadata_outline_to_excel( + metadata_name_or_class=metadata_class, + filename=tmpdir.join(f"test_class_{metadata_name}.xlsx"), + title=metadata_name, + ) + mm.read_metadata_from_excel(filename=filename_class, metadata_class=metadata_class) + + +def test_standardize_metadata_name(): + mm = MetadataManager() + inputs = [ + "Document", + "SCRIPT", + "survey", + "survey-microdata", + "survey microdata", + "microdata", + "table", + "timeseries-db", + "timeseries-db", + "TimeSeries", + "VIdeo", + ] + + expecteds = [ + "document", + "script", + "survey", + "survey", + "survey", + "survey", + "table", + "timeseries_db", + "timeseries_db", + "timeseries", + "video", + ] + + for inp, expected in zip(inputs, expecteds): + actual = mm.standardize_metadata_name(inp) + assert actual == expected, f"expected {expected} but got {actual}" + + with pytest.raises(NotImplementedError): + mm.standardize_metadata_name("Image") + + with pytest.raises(ValueError): + mm.standardize_metadata_name("Bad-name") diff --git a/pydantic_schemas/utils/excel_to_pydantic.py b/pydantic_schemas/utils/excel_to_pydantic.py index 6387916..124b2e7 100644 --- a/pydantic_schemas/utils/excel_to_pydantic.py +++ b/pydantic_schemas/utils/excel_to_pydantic.py @@ -102,8 +102,17 @@ def get_relevant_sub_frame(m: Type[BaseModel], df: pd.DataFrame, name_of_field: def handle_optional(name, annotation, df, from_within_list: bool = False, debug=False): args = [a for a in get_args(annotation) if a is not type(None)] - assert len(args) == 1, f"handle_optional encountered {args}" - ret = annotation_switch(name, args[0], df, from_within_list=from_within_list) + # assert len(args) == 1, f"handle_optional encountered {args}" + if len(args) > 1: + if str in args: + arg = str + elif float in args: + arg = float + else: + arg = args[0] + else: + arg = args[0] + ret = annotation_switch(name, arg, df, from_within_list=from_within_list) if debug: print(f"optional ret: {ret}") print(f"isinstance(ret, list): {isinstance(ret, list)}") From 742c114a3744c125905abdb3bcbf26b882934f68 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Fri, 13 Sep 2024 14:45:15 -0400 Subject: [PATCH 50/51] rename surveys, timeseries and timeseries_db --- excel_sheets/Document_metadata.xlsx | Bin 38854 -> 38854 bytes ..._metadata.xlsx => Indicator_metadata.xlsx} | Bin 51139 -> 51139 bytes excel_sheets/Indicators_db_metadata.xlsx | Bin 0 -> 15572 bytes ..._metadata.xlsx => Microdata_metadata.xlsx} | Bin 53804 -> 53806 bytes excel_sheets/Resource_metadata.xlsx | Bin 8437 -> 8437 bytes excel_sheets/Script_metadata.xlsx | Bin 40329 -> 40333 bytes excel_sheets/Table_metadata.xlsx | Bin 38933 -> 38933 bytes excel_sheets/Timeseries_db_metadata.xlsx | Bin 15569 -> 0 bytes excel_sheets/Video_metadata.xlsx | Bin 16592 -> 16589 bytes pydantic_schemas/document_schema.py | 2 +- .../generators/generate_pydantic_schemas.py | 41 ++++++++++++------ pydantic_schemas/geospatial_schema.py | 2 +- pydantic_schemas/image_schema.py | 2 +- ...meseries_schema.py => indicator_schema.py} | 2 +- ...s_db_schema.py => indicators_db_schema.py} | 2 +- pydantic_schemas/metadata_manager.py | 38 ++++++++-------- pydantic_schemas/microdata_schema.py | 2 +- pydantic_schemas/resource_schema.py | 2 +- pydantic_schemas/script_schema.py | 2 +- pydantic_schemas/table_schema.py | 2 +- .../tests/test_metadata_manager.py | 24 +++++----- .../tests/test_pydantic_to_excel.py | 4 +- pydantic_schemas/tests/test_quick_start.py | 18 ++++---- pydantic_schemas/utils/quick_start.py | 18 ++------ pydantic_schemas/video_schema.py | 2 +- 25 files changed, 84 insertions(+), 79 deletions(-) rename excel_sheets/{Timeseries_metadata.xlsx => Indicator_metadata.xlsx} (88%) create mode 100644 excel_sheets/Indicators_db_metadata.xlsx rename excel_sheets/{Survey_metadata.xlsx => Microdata_metadata.xlsx} (88%) delete mode 100644 excel_sheets/Timeseries_db_metadata.xlsx rename pydantic_schemas/{timeseries_schema.py => indicator_schema.py} (99%) rename pydantic_schemas/{timeseries_db_schema.py => indicators_db_schema.py} (99%) diff --git a/excel_sheets/Document_metadata.xlsx b/excel_sheets/Document_metadata.xlsx index 02e041742d2234867b0bbac217aeb0eefc472ed0..4a357c7c71052c2819867ecaa6e03c8a0d7c2d09 100644 GIT binary patch delta 528 zcmX@Mp6S?nCf)#VW)=|!1_lm>>=NCHyazadROI6v!T5<+wdyA`HEEn~%~YQ-VFt@1 zG1Yrv7q@V{Qq+^Y{|z%C5-V-&kX~53k`QH>pk=%b({JpCWTqH zRY_i)# z8bx`|=_D3>yx*od^Q7W6wN z|4GbHi4l2P_|2d3t&*=m$%h?h{7y!H-EnJ;@lo%($aj5c17x!v$6OvT z!(hf^7BPON}B6T-Im>Vqexp*anF~9yagpu1F&J2>8e7x@&SjmR|os3{c z&O{CfqkK{_m@)b8WNUaFOjej;4%Qbn#STo*p5hFqA3|yMsStiHl->-be?n>dX%P9= aX%=982d0^U>7UcAz_i(PS1?^S-2(t~`riKl delta 528 zcmX@Mp6S?nCf)#VW)=|!1_lm>ycX4oyazadROFkf-)tsc)vBLmbYzi^xPbbE2{Tw8 ziK*TTyJ!-abmiUK%+uF+52haf@&C`wuqB*_est(xWbX+{j{34LbFx9=+_#-g3?6Cy ze#?^-ZYkdR^}>Yr{Ep@YXP4hoEI5{TP%(40=V6UAhjY&Kd1a@i{^&ZZvVm=bW4o@Z zMz_#8oy3xt_uDjQp0vAaTz|DR_F|~8c}~co-=8nP-cl2{y|X0SAo!A0qEgnUz+UlI z=ldQzG)_H!GoR_!Q3J;diVv);Rr9a@J^aitc+SV!bJiAZyHlXHYUzV=`Nglp|3|*q zvv&K}smHFiepCq%`uAt{FE$kKN6w6yqb$J2z%WOhfkBvoVe?-`JvL@wfNa*|n9BoZ zoD;dg3uY`-+F=Q1#KhD=r0!-2bAv@b7q5gc=GUKwFmk)YnL$#MkM}(TE7{P$lM&3w znaBZQlut?qGbZ1iYz>ct$qG}u0Nz%(;3{d1ZXm^Pd43a0C(djJ6TYUHN? diff --git a/excel_sheets/Timeseries_metadata.xlsx b/excel_sheets/Indicator_metadata.xlsx similarity index 88% rename from excel_sheets/Timeseries_metadata.xlsx rename to excel_sheets/Indicator_metadata.xlsx index c955f658e6ed95d44d5406b2b4dce61eb901163b..3131f10e5e141523f14acc2f0732990c1958ec7b 100644 GIT binary patch delta 1880 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 diff --git a/excel_sheets/Indicators_db_metadata.xlsx b/excel_sheets/Indicators_db_metadata.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..91d092f0ab61facfd4fce8867a12356c1d8436e1 GIT binary patch literal 15572 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 StTZ&Nz)Kq-@o@FM-~Jcy;=zOf literal 0 HcmV?d00001 diff --git a/excel_sheets/Survey_metadata.xlsx b/excel_sheets/Microdata_metadata.xlsx similarity index 88% rename from excel_sheets/Survey_metadata.xlsx rename to excel_sheets/Microdata_metadata.xlsx index 0d0eae172b74b020d2d2de7f587678c9607cf945..422ac6618d7515c150fa391ff3b54e753944dbf9 100644 GIT binary patch delta 2496 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 diff --git a/excel_sheets/Resource_metadata.xlsx b/excel_sheets/Resource_metadata.xlsx index 835494a37fe0c53a45e1d25c52dc311ddae1dada..65bd3f3c7d0462f7aa26629c586e76e05770a27b 100644 GIT binary patch delta 423 zcmezB_|=g&z?+#xgn@y9gCV;_cOvfr4j>h&UL_Gb@v2sR9Yd4GY1Sj0Dk^G?J6t=r zyPEh;k=XkC`;yex4h4@T_V>%*?z+&JE&oyTSHnb|WmjM9vMZFmmg6sC;c%(CL~H8I z7sWfiUer8wen<0yFS~CknuM0J@_9iYZ%b^~Ozks9d)BK*j++*>6)8=w(}M zZn?PBUiw*z;_(#mta^#IqKtIC{E)-1A0Pg_rzY{Y%c|=qmKe->-O*Ju<+AHTgEFRl zqDKqAg)^Sj@_$gmu_JBylcjt2-o9geGvusm;9Zf@-7D8uR-c^xEVthoKkHui#H(8MTT(r`cf~o(ad1i!%Gj>) zaa-2ecA>>(|L1MVxhrtT;@JDg$F~J(>rdhSAvNc?gYL1T30BgrpR&soJ~1h*VwRHp z>~cfoU5vq`OU7>wdY4YAZkhDC+Q1{ody)Z{vAy)o$dy;ue3`#+HcJ#^S;mE+7A5@$ zr-ayq|L4q@G*c$YI=H^}{_|SX!py}?c5(CWFMGQAn%kr>#q6xLEnFHWThsQOnBTUp zZFW-ayuYyydp(3%=Gv^gsam;SPR`tajb>%#^pBy(rq7<#ouzr|YFWwO7yG$-FTY*) zxBa71M%It7`DevZ{2ng02l>E^_hL@W zAjV`9sb^pTS?O3tut2TMBd|b{tT#kpgPb)yFeiVOGY6~EmA3=adGgL+dW*aTn0_yB T2BtL>tiW`tf-9I_tKb0u@g}Tk diff --git a/excel_sheets/Script_metadata.xlsx b/excel_sheets/Script_metadata.xlsx index cff1cbdb1b7e753bebea7a9016b8bfc56bd439ee..a08a0c7126571af2544745c1a4b2e27768d107cd 100644 GIT binary patch delta 853 zcmeC&&D6V_i8sKTnMH(wfq{b|yF_;)?}2(C71{QRf9pG-;Aut%20yx>NfRHObV}Ttwg(BwrJidJE-Y(egpIR z`Y+3GDSp_rhq--8j}q%*gYTOSt+jgRP5q~BGWkHp0XErfB8{Rv=X4SaKHhKBoOx35 z*34JG_q|x%=`C$oQD0XzciQ<}Y0s@v#*xyxB@V8!6CS(%GcYlY5qbUi&3vX=uCo+g zJSdzwchdG(g6 zV2}VtEDUUG+&}riEOoH9S3qqYN?>g=vjxFI2D7D^WRgHah9;os5AbGW5@CQRo5%^Q zrJ4`87#OTF(T$y(2R3L0&>)b{_5cmqTnQF>P|2!;Yz|O5(*De&EiSEkqv7P(xoT`v IXM#)u0JF<0nE(I) delta 837 zcmeC(&D6P@i8sKTnMH(wfq{b|zeRN-?}2(C75TJd4m7)YbF)FL*05L2!ktyR5rLw~(GraKXp(ZI+QI49&Pr zd7KTe7*99TdieF@!^$|j{9PxOIiK3HNyBi$L%SC*mFi`pS?_nfGWosQp=_#}hh5dJ zl;=;D?%R9&UivPftD$;%MH}yhIbF++?B0Iz>teb8N+o-9%g);Oq&J3rczyqiI!Xv_ ze#>ab#taOj&3YWOdBBV_BFA{ajHyZ!?ZFJqq&kSysytzCu*iYRl@LZw>uCtXYGODu zNNVzwDbK)4YNu{y1T&1Mb3hn&Gm^oK$xCKhbHbx#@{5^fV2z5iq#5r_ww283Tg^Fv?(HTca$;`J2`Q#8r#H~AVC0oJ0ZLP diff --git a/excel_sheets/Table_metadata.xlsx b/excel_sheets/Table_metadata.xlsx index 6b2a61c3dfa7a48796860ec91a0838152dce93b1..d0e32ec84e2862fc29ea24910184ec32e9d37f65 100644 GIT binary patch delta 527 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 Oz`p@N;xL_GpZ)`44Vdr% diff --git a/excel_sheets/Video_metadata.xlsx b/excel_sheets/Video_metadata.xlsx index 741d2257a895e5618789d48aad0424a4d36248d8..ebfc6a5f1148f6e8590c0f756ad8e00720feacb8 100644 GIT binary patch delta 587 zcmcc6$auDqkvG7bnMH(wfq{b|uS9nu?}2(C6*)=6T;nxR@H8U>gCLMj$xjX_$}cF^ zPtGq&)vL(OSvv8c-(druw)oUndrL1fB?VsNzU-%>BF(l*FO94rMf_> z-u}zH1t&gRZ#Z%*pcRUW&2DpQkp}9x&W!Fd-N{QF)YvNRK*j(7frHi- delta 611 zcmX@x$atZVkvG7bnMH(wfq{des6}-m?}2(C6?rlyEae?g@H8U>gCLMj$xjX_$}cF^ zPtGq&)vL(OnL5$e|F8j1+y7Hjs$XwOb#{r>SMXC%G~_&@>$OLB(a(USEAQ@Kp0-xH z>2%-6-#<34y`shORC%9^yuqY{TVCY8o)nOH_M3|%gUVKS?O;2BJdW*lQJ#m5-zj+1 zf7LAKP<^hw!6V3fk^$Fd1L>QAE3dBMiQhPvC5mxd#>K!UCH)6ygxqHT%bhW4=9|eg zSFU^gY2BffK} z�la`4yub8#6GRHfwXV>wy_t%|e(#jLAG!&%gp-tzsF$0--jKzyemb-VlKfJ8MpO z7*9T9XC@Eg&5W6&EWpOVFh`w%K^Pd~FwnsGV6vjUk^)GLjN`<(5IqKl-_IEtBwz}F z^tMJtj>%RWQj=@#dBAq|*h@36p1i_d#s;KqyZh^|13+bBObiU%NZJ}0nXDKX;)_yq ziuLtCWPmp#lL!MmF-&rhW_&$a#z78jrY(@?Jvq`r6YSjCZB8xHz{GK#8Qr-ClNUOu KvDMgtECK+W7Sc%o diff --git a/pydantic_schemas/document_schema.py b/pydantic_schemas/document_schema.py index 514d337..4a4dad3 100644 --- a/pydantic_schemas/document_schema.py +++ b/pydantic_schemas/document_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: document-schema.json -# timestamp: 2024-09-05T20:33:52+00:00 +# timestamp: 2024-09-13T18:34:42+00:00 from __future__ import annotations diff --git a/pydantic_schemas/generators/generate_pydantic_schemas.py b/pydantic_schemas/generators/generate_pydantic_schemas.py index cd58c5b..6344806 100644 --- a/pydantic_schemas/generators/generate_pydantic_schemas.py +++ b/pydantic_schemas/generators/generate_pydantic_schemas.py @@ -5,27 +5,40 @@ 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 = [ +# "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", + "geospatial-schema.json": "geospatial_schema.py", + "image-schema.json": "image_schema.py", + "microdata-schema.json": "microdata_schema.py", + "resource-schema.json": "resource_schema.py", + "script-schema.json": "script_schema.py", + "table-schema.json": "table_schema.py", + "timeseries-db-schema.json": "indicators_db_schema.py", + "timeseries-schema.json": "indicator_schema.py", + "video-schema.json": "video_schema.py", +} if not os.path.exists(OUTPUT_DIR): os.makedirs(OUTPUT_DIR) -for input_file in INPUTS: +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_file = os.path.splitext(input_file)[0] + ".py" output_path = os.path.join(OUTPUT_DIR, output_file).replace("-", "_") run( [ diff --git a/pydantic_schemas/geospatial_schema.py b/pydantic_schemas/geospatial_schema.py index 714f2bc..4aef392 100644 --- a/pydantic_schemas/geospatial_schema.py +++ b/pydantic_schemas/geospatial_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: geospatial-schema.json -# timestamp: 2024-09-05T20:33:54+00:00 +# timestamp: 2024-09-13T18:34:45+00:00 from __future__ import annotations diff --git a/pydantic_schemas/image_schema.py b/pydantic_schemas/image_schema.py index 53db665..84362e4 100644 --- a/pydantic_schemas/image_schema.py +++ b/pydantic_schemas/image_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: image-schema.json -# timestamp: 2024-09-05T20:33:56+00:00 +# timestamp: 2024-09-13T18:34:48+00:00 from __future__ import annotations diff --git a/pydantic_schemas/timeseries_schema.py b/pydantic_schemas/indicator_schema.py similarity index 99% rename from pydantic_schemas/timeseries_schema.py rename to pydantic_schemas/indicator_schema.py index bb7e452..247d78f 100644 --- a/pydantic_schemas/timeseries_schema.py +++ b/pydantic_schemas/indicator_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: timeseries-schema.json -# timestamp: 2024-09-05T20:34:07+00:00 +# timestamp: 2024-09-13T18:35:02+00:00 from __future__ import annotations diff --git a/pydantic_schemas/timeseries_db_schema.py b/pydantic_schemas/indicators_db_schema.py similarity index 99% rename from pydantic_schemas/timeseries_db_schema.py rename to pydantic_schemas/indicators_db_schema.py index 9d2ad49..a77eac9 100644 --- a/pydantic_schemas/timeseries_db_schema.py +++ b/pydantic_schemas/indicators_db_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: timeseries-db-schema.json -# timestamp: 2024-09-05T20:34:05+00:00 +# timestamp: 2024-09-13T18:35:00+00:00 from __future__ import annotations diff --git a/pydantic_schemas/metadata_manager.py b/pydantic_schemas/metadata_manager.py index 0cfe462..70f9c69 100644 --- a/pydantic_schemas/metadata_manager.py +++ b/pydantic_schemas/metadata_manager.py @@ -7,12 +7,12 @@ from . import ( # image_schema, document_schema, geospatial_schema, + indicator_schema, + indicators_db_schema, microdata_schema, resource_schema, script_schema, table_schema, - timeseries_db_schema, - timeseries_schema, video_schema, ) from .utils.excel_to_pydantic import excel_doc_to_pydantic, excel_single_sheet_to_pydantic @@ -24,7 +24,7 @@ class MetadataManager: """ Interface with Excel for creating, saving and updating metadata for various types: - documents, scripts, survey, table, timeseries, timeseries_db, video + document, indicator, indicators_db, microdata, resource, script, table, video Retrieve pydantic model definitions for each metadata type """ @@ -35,10 +35,10 @@ class MetadataManager: # "image":image_schema.ImageDataTypeSchema, "resource": resource_schema.Model, "script": script_schema.ResearchProjectSchemaDraft, - "survey": microdata_schema.MicrodataSchema, + "microdata": microdata_schema.MicrodataSchema, "table": table_schema.Model, - "timeseries": timeseries_schema.TimeseriesSchema, - "timeseries_db": timeseries_db_schema.TimeseriesDatabaseSchema, + "indicator": indicator_schema.TimeseriesSchema, + "indicators_db": indicators_db_schema.TimeseriesDatabaseSchema, "video": video_schema.Model, } @@ -48,10 +48,10 @@ class MetadataManager: # "image":, "resource": write_to_single_sheet, "script": write_across_many_sheets, - "survey": write_across_many_sheets, + "microdata": write_across_many_sheets, "table": write_across_many_sheets, - "timeseries": write_across_many_sheets, - "timeseries_db": write_to_single_sheet, # one sheet + "indicator": write_across_many_sheets, + "indicators_db": write_to_single_sheet, # one sheet "video": write_to_single_sheet, # one sheet } @@ -61,10 +61,10 @@ class MetadataManager: # "image":, "resource": excel_single_sheet_to_pydantic, "script": excel_doc_to_pydantic, - "survey": excel_doc_to_pydantic, + "microdata": excel_doc_to_pydantic, "table": excel_doc_to_pydantic, - "timeseries": excel_doc_to_pydantic, - "timeseries_db": excel_single_sheet_to_pydantic, # one sheet + "indicator": excel_doc_to_pydantic, + "indicators_db": excel_single_sheet_to_pydantic, # one sheet "video": excel_single_sheet_to_pydantic, # one sheet } @@ -80,8 +80,12 @@ def metadata_type_names(self) -> List[str]: def standardize_metadata_name(self, metadata_name: str) -> str: metadata_name = metadata_name.lower() metadata_name = metadata_name.replace("-", "_").replace(" ", "_") - if metadata_name == "microdata" or metadata_name == "survey_microdata": - metadata_name = "survey" + if metadata_name == "survey" or metadata_name == "survey_microdata": + metadata_name = "microdata" + elif metadata_name == "timeseries": + metadata_name = "indicator" + elif metadata_name == "timeseries_db": + metadata_name = "indicators_db" self._raise_if_unsupported_metadata_name(metadata_name=metadata_name) return metadata_name @@ -106,7 +110,7 @@ def write_metadata_outline_to_excel( Args: metadata_name_or_class (str or type[BaseModel]): the name of a supported metadata type, currently: - document, script, series, survey, table, timeseries, timeseries_DB, video + document, indicator, indicators_db, microdata, resource, script, table, video Currently not supported: geospatial, image If passed as a BaseModel type, for instance this is what you would do with a template, then the writer @@ -156,7 +160,7 @@ def save_metadata_to_excel( Args: metadata_name_or_class (str or type[BaseModel]): the name of a supported metadata type, currently: - document, script, series, survey, table, timeseries, timeseries_DB, video + document, indicator, indicators_db, microdata, resource, script, table, video Currently not supported: geospatial, image If passed as a BaseModel type, for instance this is what you would do with a template, then the writer defaults to a single page. @@ -230,7 +234,7 @@ def _get_metadata_name_from_excel_file(filename: str) -> str: def read_metadata_from_excel(self, filename: str, metadata_class: Optional[Type[BaseModel]] = None) -> BaseModel: """ Read in metadata from an appropriately formatted Excel file as a pydantic object. - If using standard metadata types (documents, resource, script, survey, table, timeseries, timeseries_db, video) then there is no need to pass in the metadata_class. But if using a template, then the class must be provided. + If using standard metadata types (document, indicator, indicators_db, microdata, resource, script, table, video) then there is no need to pass in the metadata_class. But if using a template, then the class must be provided. Args: filename (str): The path to the Excel file. diff --git a/pydantic_schemas/microdata_schema.py b/pydantic_schemas/microdata_schema.py index 0829736..89469e9 100644 --- a/pydantic_schemas/microdata_schema.py +++ b/pydantic_schemas/microdata_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: microdata-schema.json -# timestamp: 2024-09-05T20:33:58+00:00 +# timestamp: 2024-09-13T18:34:51+00:00 from __future__ import annotations diff --git a/pydantic_schemas/resource_schema.py b/pydantic_schemas/resource_schema.py index 64fd55e..0201c74 100644 --- a/pydantic_schemas/resource_schema.py +++ b/pydantic_schemas/resource_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: resource-schema.json -# timestamp: 2024-09-05T20:34:00+00:00 +# timestamp: 2024-09-13T18:34:53+00:00 from __future__ import annotations diff --git a/pydantic_schemas/script_schema.py b/pydantic_schemas/script_schema.py index 73db35c..c226999 100644 --- a/pydantic_schemas/script_schema.py +++ b/pydantic_schemas/script_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: script-schema.json -# timestamp: 2024-09-05T20:34:02+00:00 +# timestamp: 2024-09-13T18:34:55+00:00 from __future__ import annotations diff --git a/pydantic_schemas/table_schema.py b/pydantic_schemas/table_schema.py index 58d3859..55a5729 100644 --- a/pydantic_schemas/table_schema.py +++ b/pydantic_schemas/table_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: table-schema.json -# timestamp: 2024-09-05T20:34:03+00:00 +# timestamp: 2024-09-13T18:34:58+00:00 from __future__ import annotations diff --git a/pydantic_schemas/tests/test_metadata_manager.py b/pydantic_schemas/tests/test_metadata_manager.py index 5df4fef..426ab84 100644 --- a/pydantic_schemas/tests/test_metadata_manager.py +++ b/pydantic_schemas/tests/test_metadata_manager.py @@ -4,7 +4,7 @@ @pytest.mark.parametrize( - "metadata_name", ["document", "script", "survey", "table", "timeseries_db", "timeseries", "video"] + "metadata_name", ["document", "script", "microdata", "table", "indicators_db", "indicator", "video"] ) def test_metadata_by_name(tmpdir, metadata_name): mm = MetadataManager() @@ -30,7 +30,7 @@ def test_metadata_by_name(tmpdir, metadata_name): @pytest.mark.parametrize( - "metadata_name", ["document", "script", "survey", "table", "timeseries_db", "timeseries", "video"] + "metadata_name", ["document", "script", "microdata", "table", "timeseries_db", "indicator", "video"] ) def test_metadata_by_class(tmpdir, metadata_name): mm = MetadataManager() @@ -59,23 +59,25 @@ def test_standardize_metadata_name(): "survey microdata", "microdata", "table", + "indicators-db", "timeseries-db", - "timeseries-db", - "TimeSeries", + "INdicator", + "timeseries", "VIdeo", ] expecteds = [ "document", "script", - "survey", - "survey", - "survey", - "survey", + "microdata", + "microdata", + "microdata", + "microdata", "table", - "timeseries_db", - "timeseries_db", - "timeseries", + "indicators_db", + "indicators_db", + "indicator", + "indicator", "video", ] diff --git a/pydantic_schemas/tests/test_pydantic_to_excel.py b/pydantic_schemas/tests/test_pydantic_to_excel.py index 6090fd1..e5884bc 100644 --- a/pydantic_schemas/tests/test_pydantic_to_excel.py +++ b/pydantic_schemas/tests/test_pydantic_to_excel.py @@ -7,14 +7,14 @@ from pydantic import BaseModel, Field from pydantic_schemas.document_schema import ScriptSchemaDraft +from pydantic_schemas.indicator_schema import TimeseriesSchema +from pydantic_schemas.indicators_db_schema import TimeseriesDatabaseSchema # from pydantic_schemas.definitions.geospatial_schema import GeospatialSchema # from pydantic_schemas.definitions.image_schema import ImageDataTypeSchema from pydantic_schemas.microdata_schema import MicrodataSchema from pydantic_schemas.script_schema import ResearchProjectSchemaDraft from pydantic_schemas.table_schema import Model as TableModel -from pydantic_schemas.timeseries_db_schema import TimeseriesDatabaseSchema -from pydantic_schemas.timeseries_schema import TimeseriesSchema from pydantic_schemas.utils.excel_to_pydantic import ( excel_doc_to_pydantic, excel_sheet_to_pydantic, diff --git a/pydantic_schemas/tests/test_quick_start.py b/pydantic_schemas/tests/test_quick_start.py index 3e506e1..9d53dc2 100644 --- a/pydantic_schemas/tests/test_quick_start.py +++ b/pydantic_schemas/tests/test_quick_start.py @@ -4,12 +4,8 @@ import pytest from pydantic import AnyUrl, BaseModel, Field, confloat -from pydantic_schemas.utils.quick_start import ( - DEFAULT_URL, - METADATA_TYPES_FILE_MAP, - create_empty_schema_from_path, - make_skeleton, -) +from pydantic_schemas.metadata_manager import MetadataManager +from pydantic_schemas.utils.quick_start import DEFAULT_URL, make_skeleton # create_empty_schema_from_path, def test_simple_strings(): @@ -239,7 +235,9 @@ class BadFieldNames(BaseModel): assert actual == expected, actual -@pytest.mark.parametrize("k, v", [(k, v) for k, v in METADATA_TYPES_FILE_MAP.items()]) -def test_actual_schemas(k, v): - base = "pydantic_schemas.{}" - create_empty_schema_from_path(base.format(k), v, debug=True) +@pytest.mark.parametrize("n", [n for n in MetadataManager().metadata_type_names]) +def test_actual_schemas(n): + if n == "geospatial": + return + klass = MetadataManager().metadata_class_from_name(n) + make_skeleton(klass) diff --git a/pydantic_schemas/utils/quick_start.py b/pydantic_schemas/utils/quick_start.py index de09833..13d11bd 100644 --- a/pydantic_schemas/utils/quick_start.py +++ b/pydantic_schemas/utils/quick_start.py @@ -8,18 +8,6 @@ from .utils import standardize_keys_in_dict -METADATA_TYPES_FILE_MAP = { - "document_schema": "ScriptSchemaDraft", - # "geospatial_schema": "GeospatialSchema", - # "image_schema": "ImageDataTypeSchema", - "microdata_schema": "MicrodataSchema", - "script_schema": "ResearchProjectSchemaDraft", - "table_schema": "Model", - "timeseries_db_schema": "TimeseriesDatabaseSchema", - "timeseries_schema": "TimeseriesSchema", - "video_schema": "Model", -} - DEFAULT_URL = "http://www.example.com" @@ -242,6 +230,6 @@ def make_skeleton(cl: Type[BaseModel], debug=False, indentation=""): return cl(**param_values) -def create_empty_schema_from_path(module_name, class_name, debug=False): - MyClass = getattr(importlib.import_module(module_name), class_name) - return make_skeleton(MyClass, debug=debug) +# def create_empty_schema_from_path(module_name, class_name, debug=False): +# MyClass = getattr(importlib.import_module(module_name), class_name) +# return make_skeleton(MyClass, debug=debug) diff --git a/pydantic_schemas/video_schema.py b/pydantic_schemas/video_schema.py index 64b2904..0d6485b 100644 --- a/pydantic_schemas/video_schema.py +++ b/pydantic_schemas/video_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: video-schema.json -# timestamp: 2024-09-05T20:34:08+00:00 +# timestamp: 2024-09-13T18:35:04+00:00 from __future__ import annotations From a98d5c1af436ee541fcd8a2b51a3ea10c3c14738 Mon Sep 17 00:00:00 2001 From: Gordon Blackadder Date: Fri, 13 Sep 2024 15:04:22 -0400 Subject: [PATCH 51/51] following merge from main - apply schema changes to pydantic and excel --- excel_sheets/Document_metadata.xlsx | Bin 38854 -> 38763 bytes excel_sheets/Indicator_metadata.xlsx | Bin 51139 -> 51233 bytes excel_sheets/Indicators_db_metadata.xlsx | Bin 15572 -> 15572 bytes excel_sheets/Microdata_metadata.xlsx | Bin 53806 -> 53806 bytes excel_sheets/Resource_metadata.xlsx | Bin 8437 -> 8436 bytes excel_sheets/Script_metadata.xlsx | Bin 40333 -> 40333 bytes excel_sheets/Table_metadata.xlsx | Bin 38933 -> 38933 bytes excel_sheets/Video_metadata.xlsx | Bin 16589 -> 16588 bytes pydantic_schemas/document_schema.py | 28 +++++++---------------- pydantic_schemas/geospatial_schema.py | 2 +- pydantic_schemas/image_schema.py | 2 +- pydantic_schemas/indicator_schema.py | 15 ++++++------ pydantic_schemas/indicators_db_schema.py | 2 +- pydantic_schemas/microdata_schema.py | 2 +- pydantic_schemas/resource_schema.py | 2 +- pydantic_schemas/script_schema.py | 2 +- pydantic_schemas/table_schema.py | 2 +- pydantic_schemas/video_schema.py | 2 +- 18 files changed, 24 insertions(+), 35 deletions(-) diff --git a/excel_sheets/Document_metadata.xlsx b/excel_sheets/Document_metadata.xlsx index 4a357c7c71052c2819867ecaa6e03c8a0d7c2d09..d5237aa11a64797ce72e8d4a27fde3ce21b342cd 100644 GIT binary patch delta 16965 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 delta 17358 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 diff --git a/excel_sheets/Indicator_metadata.xlsx b/excel_sheets/Indicator_metadata.xlsx index 3131f10e5e141523f14acc2f0732990c1958ec7b..3fcbb6824cca0345a7c699f83651e877ccdd9d89 100644 GIT binary patch delta 19392 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 delta 19221 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 LCKF;Rr5FDnBRz@_ diff --git a/excel_sheets/Indicators_db_metadata.xlsx b/excel_sheets/Indicators_db_metadata.xlsx index 91d092f0ab61facfd4fce8867a12356c1d8436e1..9f2d6b80d635b8c24626f63d893eefb73e7804c7 100644 GIT binary patch delta 408 zcmcaod8Lvkz?+#xgn@y9gTb|8BF{k%*9zUpToIRz6R*nGAIv&zz|$7L^vS#ve#aEl zzNRi+&da8q^Cm54D{psla<)qCZ_CKpWjWJj*Z#k(&S`#&`z@0l`*Xv9?n2XB>-wF3 zmzJq~Vp4de93|TA@Nxji52y{b>cl7z;pG?(q4-_wzm7uoPM4w@A*~A_@;zz ziG!=&iI+ delta 408 zcmcaod8Lvkz?+#xgn@y9gCVbEBF{mNyb|3=L3R206R*nG`}!X?;A#7R>Pq$NI)+<| z)`$zJPna-+<&l`>J+X^R0+X)1yMKAwTIr_KeII}S*tpi?3)5`}{e@peZUn@9*;W|1 zAYQ#XO`k#O-N{umcw3|o2Ta>gPoH43rmHwYQW75nwi)XG}_j=R1SvwLJGu@j%KW_Qc;KxeZ?NhD< zEk5ATbvvM6{HODMj~yDP9>1B-^zx{IM~@bW z-fa}h45TLunLP(_f1AZIg1FHZk3n1qOCK<|&&mcKijyx{nS+#YTib&uA8Qv7HObl% WM4hz;%dy#5gLuw1ZXl}L#uETU{j_xe diff --git a/excel_sheets/Microdata_metadata.xlsx b/excel_sheets/Microdata_metadata.xlsx index 422ac6618d7515c150fa391ff3b54e753944dbf9..173a2fdb33f1708b36b6b7b23a4049d00513fe96 100644 GIT binary patch delta 562 zcmZ3tgn8W(W}X0VW)=|!1_llW=Zc9u2RWQ8bR(xN+RZxgs(k%HzrzMRZSkqE_Lg2c zw8S-1&&Rs4<%o*Fc8!nQx|a0{EiTLVkJ^^Up(peB|L64RiO0Avv)1sz7?C678 zW?YZ2-<)`YyCI|RMTw5k#bpKeS(j_t9%kHQCjYA;z-Svw`;xV4yo(LKZ#J~nUORK@ zKVy^02c!CV5Nt8!QB z%#?T5zoUPiBV79g(M%-^v-^D)|bOeA;nN?_~DZ4L5U*LpOcWOJ6-F+0SbCfrKVzgvqa<15{%khB+ zM9Yhs@`LCwm1hnh+Aj4LFNl^Zju8dX6&)75e4qf_zkf!mHxC0tcG+b6MUtDZPmKcW zH(n&d4N~X1b`_ZZy5lUEK5`_287Mwk?!oRWz=2RU*|bR)Uf{a-Wjs(ih#|6v23w*RN5RKKpv z;aH?2E}%YP!VH#2VygGTE}8@;U3qtZ^0c+mO{e=l{{FFXEyvrPWsLDnpCwit+#!*3 z+jZUFS#LXS*gLBF!;abr#&T`fi*S7@S@vM+zYyz|RT_B*lr$H69Mm}TCnv>y>BY^L z>RZc%BzSKuI@+f+rIIs!TD`%IANhx;oOvQJd*-X(cJE(zdP`6J@bAwTE8Y2~u_{+H zQ-UPUmO8lVo%pC!FA>Ek?piqKZ?MB=4`B;gn{_ueD_6glH|zHabKQETYxkNp=1+Ck zhwq81>sc57H+^C0vYTe%QsLsqCOdHb_?-Vq8aW_zBWK3UQQrKC(UOfRr)0A(#|It| zEiY=y52C|Vo;iSMyVP5}AX=(8MifL>bXf56fdX*<{u!y>JPZukWs~g}Np8MAH43cX zc##M?dzBg6K!5q`~z6(*+=Ua^YDUc=Sx( zde$5y_U^1bh|)jj0-{PG)NTmHcpfb14xxG>)MW@Ic>ydJ522P`a0O|9bHNfssb2&e Sop8|_#G8B34MaV?=m`K?m-Sfy diff --git a/excel_sheets/Resource_metadata.xlsx b/excel_sheets/Resource_metadata.xlsx index 65bd3f3c7d0462f7aa26629c586e76e05770a27b..0aa789affe1843a60ecde0de9f553fa2d7202ecf 100644 GIT binary patch delta 558 zcmezB_{EVYz?+#xgn@y9gTbj{BF{lirwZLjv97Z_UroHGS-)lO1hLYc4Hk_pM^ps1 zYkb_+^~||5aCg0b)HXgA^S+P2e{5X4#fsytvYo5EK~Q_9>8*RJ3lC3|?QCN3_|*}% z)JRyby;^?lqCY+C9A5iZGdrFA$s3`PDxx`~#WkYm%^H)cz_$Jy=b08WR&RNs;TRfL zkjlB(x8Cf`NvFP*(JSf`B~C4zxpPk->-v8F^PfMtJ{QtlKJnzWjD^Ztp91~FTQA?( z{$cHndFl0{7uI}Yaa`UIUFI1#>-O%uwv$cQUuV5961sV{S=05V_4n1T_y1dcq3ZJ6 z-SrasOg9g$ub(_0+3UKIGh^l`3$QUT%u#1x5C#TFMUMXFe~emeOimS>wKxv(f#`Q) z&dfl1va!^25LZSzjuFJIk$DW_Cd&GNx$EU@5WzV4i<}uqjgGtwqZ*Ce!OcfQ1Ne|0a7TM f^CvedXo758qaec+B0ITIR&?@x1p&4Nav)^@`W(dO delta 558 zcmez3_|=goz?+#xgn@y9gCV=NBb^(u+j*AuU4*4HsKX`E&~!l|O7*0{s9 zbGxgF?-YrxzrQa@eeF>2SYm&_{Ozs_joI=aHGefs)LC}*#V)%-*=sreA{Gvps!Oz{ z&U{h4HnXWWVc1&WxF(EWpOVFh`w%K^Pb!6*-&#Flw_gWtVK$u9LGt1mon-a%Lbk+VV1tcPD$uD}gvUK#ttx zPI+~CP;l?O%aka^%)pQ)z`(!@v={~&7#~eOFE0bq@D`{+eKMDVR18SN;>kB388b34 zXfrV|@WWIC=>|ptX^^}1%kzt}lk)Sk^(u060=yZSL>OREtQ%?k`th!{K*hg-21uc3 gE|}b)pb4^VwSo*&sO;ndS<%V&6a?57%7K&t09=v8^#A|> diff --git a/excel_sheets/Script_metadata.xlsx b/excel_sheets/Script_metadata.xlsx index a08a0c7126571af2544745c1a4b2e27768d107cd..60295413986841759b61bda3bfb05e3f6926df2e 100644 GIT binary patch delta 501 zcmeC(&D6V_i6_9DnMH(wfq{d;sbV6}K@O)1-N@}yw*n_#m9O{pKWxC$_W#tB>eowT zJ-TW}pqC0;`+vyP9`N8@=9(Wp zeFMW)y$lBUTV6BW$&7G zJ=3ffDapV7xTxUOZLYkotCio%8P6uoPYX6hD35N$M_ z6HMFANCDB47tgeT2m9pbGtEI_3bQ~qOirBT0-}~fsJ9Txcs5wD5<=~VP^@#ng5Gm1 YK^ofTfKAyy#~Q@@Gsg`?xyE+>g%fJPCK6~?YULT zI8s`-#KARo!eiHe1}3I4BCj96na?!Kb(X@52Zb}|PTKyeaBF1xr0IXu^yQ1fa&PQi zk;nR6e(~$@|B)}OlDB{JN-j;b;Y{JJ|L0rBj2sZUkuziFC~yA6XvxNuU9wr1V-639 zJ}q*b7er4{nq&{6HInMV;w$q+xS4WFHt(-o1*WrG&wy#mi4n{|@yU~?JO@eFOx?l= zqK&3=f@#|sDU3j4CNG|80}uAe&u5y0#1v+MY?z!l%LPO&hfr@Jl<{n^U?q?O8onPw evCaYWyysYg1l#7AgXQK}gQ!1q+(4AeTu%TB?AU(* diff --git a/excel_sheets/Table_metadata.xlsx b/excel_sheets/Table_metadata.xlsx index d0e32ec84e2862fc29ea24910184ec32e9d37f65..04da6475417740e791d1934535c9477f19ec913f 100644 GIT binary patch delta 501 zcmbQbfobXnCY}IqW)=|!1_llWmx_rz2RU3SbR%#0F*HoPDqnxl@2~++TYT!Py``7@ z4lL3Wzu>2!Xvld)*K5z(MVX6^thjr7^0c+mP29(S{Qq+^EbDD+8RPus&k`#R?vTj2 z?Yi)BY^L z>f6eMBzSKuI@+i7q3Lj|YCVtHznccC#+FCYmi^kN|10a!B{!LS^W@@}J^j3_dx=%= z%r(7YRtuEGpHxh==gZ{{Kl;n$_wI(YiE12HRWa$$pKRS#e&A12 zah3hH+g0}^zUA7?wCjH^SCpsPaHsI@|L0rBh#U~QkuziFC~yA6XvxOpQn6W=V2R%*8dzN{l9-FBZ%HL zkrPZGosi!fd~8K{3+%ju@zJ7LDb7BE+9&ODwryTP`e=%<210KJA~?mP?x7! Yf;8|=2b+>(hr2RU*}bR)II=KYv>RleTW|F8j1+y7Hns$bV_ z;9RsuTtI!ogc&T4#8mHzU98bC%=-S`^Yk^|gQ>@V)c&~t_J;sl{`xf_1G@o zJh3D`y;|u!!=gKj1vh%M_&&VGs;psqm~YR7`AO{o)1PwjObTdX={a=g{INGHLW;tE zt-s*Qq{?V*lA-Ao8d8wPS>N3G-^}Nv4`1NDCr@MJOlQBE zX6hZLZ|`<}{lCo@ES7Hn<@Na0p$efbGXMTW|K>#w2;In;F>{nRe`2&`W6CYrtjjTz z2SlF`xyTEmXDjhpf#}sS^GC3n0{A(22Ahij$j6gPZsNc4wC-gzmpL} z@0!R7rjJfa0nwASr`W)QeRBR3bCB4IDfS@hwnmQr|ti#Db=r+ zxO#N&ifglIY&oJLuwCQhwytN+oq@aS{iC+=v6%OL{QYC&S`#aex5{>|@&-ZenWney zsjfWSCfnJ>;_<5^Y^jm3UVF9t+C_hQ*g3rRuV!{S`cpSTB~?UoMvH4i&zm(SRe^2& zH_kIHW~|=wLZeZGH74>rUc@LpHQBVy zFzQuDS540H?n9Yxq<@6voZGygDTlh4?h$%6tFX6PJs1_ohZfWtro zFV6i>OD{7e1zzL6?5Ch;$azG!XwTY3nTwCCxO;o@w6)9!bC3V{|L10yh*js@ z<>~h=Kg9$`@NCO$cG>R5cgBy2#b&})#cmhr!?DlTKKt>dxJ&!wC=1$*1kiBwDjbu&(<9|yAhWMh? zoML@F5Q(aB@;`eS#ut;N9ppeZSv$xudQ6UR&;&becAHa+G%#UYXGV9v?&JjyYHXEu GAbSAdB-u6q diff --git a/pydantic_schemas/document_schema.py b/pydantic_schemas/document_schema.py index 4a4dad3..ba3c89f 100644 --- a/pydantic_schemas/document_schema.py +++ b/pydantic_schemas/document_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: document-schema.json -# timestamp: 2024-09-13T18:34:42+00:00 +# timestamp: 2024-09-13T19:00:20+00:00 from __future__ import annotations @@ -12,15 +12,6 @@ from .utils.schema_base_model import SchemaBaseModel -class Overwrite(Enum): - """ - Overwrite document if already exists? - """ - - yes = "yes" - no = "no" - - class Producer(SchemaBaseModel): name: Optional[str] = Field(None, description="Name (required)", title="Name") abbr: Optional[str] = Field(None, title="Abbreviation") @@ -336,7 +327,7 @@ class ProvenanceSchema(SchemaBaseModel): origin_description: Optional[OriginDescription] = Field(None, title="Origin description") -class Keyword(SchemaBaseModel): +class KeywordItem(SchemaBaseModel): name: Optional[str] = Field(None, title="Name") vocabulary: Optional[str] = Field(None, title="Vocabulary name") uri: Optional[str] = Field(None, title="Vocabulary URI") @@ -482,7 +473,7 @@ class Config: None, description="Title of a book, part of which is being cited", title="Book title" ) crossref: Optional[str] = Field( - None, description="The database key of the entry being cross referenced", title="Book title" + None, description="The database key of the entry being cross referenced", title="Cross reference" ) howpublished: Optional[str] = Field( None, @@ -506,6 +497,9 @@ class Config: url: Optional[List[str]] = Field(None, description="URL of the document, preferably a permanent URL", title="URL") translators: Optional[List[Translator]] = Field(None, description="Translators", title="Translators") contributors: Optional[List[Contributor]] = Field(None, description="Contributors", title="Contributors") + acknowledgement_statement: Optional[str] = Field( + None, description="Acknowledgement statement", title="Acknowledgement statement" + ) contacts: Optional[List[Contact]] = Field(None, description="Contacts", title="Contacts") rights: Optional[str] = Field( None, description="Information about rights held in and over the resource.", title="Rights" @@ -553,7 +547,7 @@ class Config: ), title="Data Sources", ) - keywords: Optional[List[Keyword]] = Field(None, description="Keywords", title="Keywords") + keywords: Optional[List[KeywordItem]] = Field(None, description="Keywords", title="Keywords") themes: Optional[List[Theme]] = Field(None, description="Themes") topics: Optional[List[Topic]] = Field( None, @@ -585,13 +579,7 @@ class ScriptSchemaDraft(SchemaBaseModel): Schema for Document data type """ - repositoryid: Optional[str] = Field( - None, - description="Abbreviation for the collection that owns the document", - title="Collection ID that owns the document", - ) - published: Optional[int] = Field(0, description="Status - 0=draft, 1=published", title="Status") - overwrite: Optional[Overwrite] = Field("no", description="Overwrite document if already exists?") + idno: Optional[str] = Field(None, description="Project unique identifier", title="Project unique identifier") metadata_information: Optional[MetadataInformation] = Field( None, description="Document description", title="Document metadata information" ) diff --git a/pydantic_schemas/geospatial_schema.py b/pydantic_schemas/geospatial_schema.py index 4aef392..dbe46aa 100644 --- a/pydantic_schemas/geospatial_schema.py +++ b/pydantic_schemas/geospatial_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: geospatial-schema.json -# timestamp: 2024-09-13T18:34:45+00:00 +# 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 84362e4..24c7168 100644 --- a/pydantic_schemas/image_schema.py +++ b/pydantic_schemas/image_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: image-schema.json -# timestamp: 2024-09-13T18:34:48+00:00 +# 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 247d78f..7ce366b 100644 --- a/pydantic_schemas/indicator_schema.py +++ b/pydantic_schemas/indicator_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: timeseries-schema.json -# timestamp: 2024-09-13T18:35:02+00:00 +# timestamp: 2024-09-13T19:00:32+00:00 from __future__ import annotations @@ -85,10 +85,17 @@ class Language(SchemaBaseModel): code: Optional[str] = Field(None, title="code") +class CodeListItem(SchemaBaseModel): + code: Optional[str] = Field(None, title="Code") + label: Optional[str] = Field(None, title="Label") + description: Optional[str] = Field(None, title="Description") + + class Dimension(SchemaBaseModel): name: Optional[str] = Field(None, title="Name") label: str = Field(..., title="Label") description: Optional[str] = Field(None, title="Description") + code_list: Optional[List[CodeListItem]] = Field(None, title="Code list") class DefinitionReference(SchemaBaseModel): @@ -569,12 +576,6 @@ class TimePeriodFormat(Enum): YYYY_MM_DDTHH_MM_SSZ = "YYYY-MM-DDTHH:MM:SSZ" -class CodeListItem(SchemaBaseModel): - code: Optional[str] = Field(None, title="Code") - label: Optional[str] = Field(None, title="Label") - description: Optional[str] = Field(None, title="Description") - - class CodeListReference(SchemaBaseModel): id: Optional[str] = Field(None, title="Identifier (ID)") name: Optional[str] = Field(None, title="Name") diff --git a/pydantic_schemas/indicators_db_schema.py b/pydantic_schemas/indicators_db_schema.py index a77eac9..67b860b 100644 --- a/pydantic_schemas/indicators_db_schema.py +++ b/pydantic_schemas/indicators_db_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: timeseries-db-schema.json -# timestamp: 2024-09-13T18:35:00+00:00 +# 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 89469e9..2c94423 100644 --- a/pydantic_schemas/microdata_schema.py +++ b/pydantic_schemas/microdata_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: microdata-schema.json -# timestamp: 2024-09-13T18:34:51+00:00 +# 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 0201c74..d72de0d 100644 --- a/pydantic_schemas/resource_schema.py +++ b/pydantic_schemas/resource_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: resource-schema.json -# timestamp: 2024-09-13T18:34:53+00:00 +# 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 c226999..f785ffe 100644 --- a/pydantic_schemas/script_schema.py +++ b/pydantic_schemas/script_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: script-schema.json -# timestamp: 2024-09-13T18:34:55+00:00 +# 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 55a5729..0795030 100644 --- a/pydantic_schemas/table_schema.py +++ b/pydantic_schemas/table_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: table-schema.json -# timestamp: 2024-09-13T18:34:58+00:00 +# timestamp: 2024-09-13T19:00:29+00:00 from __future__ import annotations diff --git a/pydantic_schemas/video_schema.py b/pydantic_schemas/video_schema.py index 0d6485b..3b376ab 100644 --- a/pydantic_schemas/video_schema.py +++ b/pydantic_schemas/video_schema.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: # filename: video-schema.json -# timestamp: 2024-09-13T18:35:04+00:00 +# timestamp: 2024-09-13T19:00:33+00:00 from __future__ import annotations