From 5ed35bc5fe8985d3dcf1a1ce5410f6673cbc077a Mon Sep 17 00:00:00 2001 From: Dominic Tarro <57306102+dominictarro@users.noreply.github.com> Date: Wed, 31 Jan 2024 00:23:42 -0500 Subject: [PATCH] GitHub Pages site (#35) * Make a mixin and simplify * Mkdocs documentation * Automated site deployment * Publish docs on push to main * Fix block access --- .github/workflows/publish-docs.yml | 47 + Pipfile | 5 + Pipfile.lock | 911 ++++++----- docs/Datasets/Media Inventory.md | 35 + docs/Datasets/Oryx.md | 74 + docs/License.md | 23 + docs/Media Inventory.md | 40 - docs/Oryx.md | 62 - docs/_static/bracket-curly.png | Bin 0 -> 9386 bytes docs/_static/calendar.png | Bin 0 -> 7672 bytes docs/_static/cloud-computing.png | Bin 0 -> 14196 bytes .../_static/example-oryx-media.jpeg | Bin .../_static/example-oryx-media.png | Bin docs/_static/gallery.png | Bin 0 -> 17717 bytes docs/_static/twitter.png | Bin 0 -> 17708 bytes docs/about.md | 25 + docs/css/neoteroi-mkdocs.css | 1399 +++++++++++++++++ docs/index.md | 20 + mkdocs.yml | 35 + src/borderlands/schema/dataset.py | 13 +- src/borderlands/schema/formatter.py | 112 +- src/scripts/docs.py | 15 +- tests/schema/test_dataset.py | 63 + tool.py | 24 - 24 files changed, 2257 insertions(+), 646 deletions(-) create mode 100644 .github/workflows/publish-docs.yml create mode 100644 docs/Datasets/Media Inventory.md create mode 100644 docs/Datasets/Oryx.md create mode 100644 docs/License.md delete mode 100644 docs/Media Inventory.md delete mode 100644 docs/Oryx.md create mode 100644 docs/_static/bracket-curly.png create mode 100644 docs/_static/calendar.png create mode 100644 docs/_static/cloud-computing.png rename assets/example oryx media.jpeg => docs/_static/example-oryx-media.jpeg (100%) rename assets/example oryx media.png => docs/_static/example-oryx-media.png (100%) create mode 100644 docs/_static/gallery.png create mode 100644 docs/_static/twitter.png create mode 100644 docs/about.md create mode 100644 docs/css/neoteroi-mkdocs.css create mode 100644 docs/index.md create mode 100644 mkdocs.yml create mode 100644 tests/schema/test_dataset.py delete mode 100644 tool.py diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml new file mode 100644 index 0000000..a20b662 --- /dev/null +++ b/.github/workflows/publish-docs.yml @@ -0,0 +1,47 @@ +name: Publish docs + +on: + workflow_dispatch: + push: + branches: + - main + +jobs: + build-and-publish-docs: + name: Build and publish docs + runs-on: ubuntu-latest + + steps: + - name: Check out repository code + uses: actions/checkout@v4 + + - name: Setup Python + id: setup-python + uses: actions/setup-python@v4 + with: + python-version: "3.11" + cache: "pipenv" + + - name: Install pipenv + run: | + python -m pip install --upgrade pipenv wheel + + - name: Install dependencies + if: steps.setup-python.outputs.cache-hit != 'true' + run: | + pipenv sync --dev + pipenv run pip install -e . + + - name: Update dataset files + run: | + pipenv run dataset-docs + + - name: Build docs + run: | + pipenv run mkdocs build + + - name: Publish docs + uses: JamesIves/github-pages-deploy-action@v4.4.2 + with: + branch: docs + folder: site diff --git a/Pipfile b/Pipfile index f028dad..cfa804b 100644 --- a/Pipfile +++ b/Pipfile @@ -29,9 +29,14 @@ pytest = "*" click = "*" prefect-github = ">=0.2.2" moto = {extras = ["s3"], version = "<5.0,>=3.1.16"} +mkdocs = "*" +mkdocs-material = "*" +tabulate = "*" +neoteroi-mkdocs = "*" [requires] python_version = "3.11" [scripts] tests = "pytest tests/" +dataset-docs = "python src/scripts/docs.py" diff --git a/Pipfile.lock b/Pipfile.lock index fbf0cb1..828e0bd 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "ec4d282a2940aa903e7b6fad32c8b575fcdca2d84e36c4f727784302d19a45f1" + "sha256": "c0c011d0494c7345f6126af54e579f50637419e32e324b728a31bb0b92bf15b0" }, "pipfile-spec": 6, "requires": { @@ -18,85 +18,85 @@ "default": { "aiohttp": { "hashes": [ - "sha256:02ab6006ec3c3463b528374c4cdce86434e7b89ad355e7bf29e2f16b46c7dd6f", - "sha256:04fa38875e53eb7e354ece1607b1d2fdee2d175ea4e4d745f6ec9f751fe20c7c", - "sha256:0b0a6a36ed7e164c6df1e18ee47afbd1990ce47cb428739d6c99aaabfaf1b3af", - "sha256:0d406b01a9f5a7e232d1b0d161b40c05275ffbcbd772dc18c1d5a570961a1ca4", - "sha256:0e49b08eafa4f5707ecfb321ab9592717a319e37938e301d462f79b4e860c32a", - "sha256:0e7ba7ff228c0d9a2cd66194e90f2bca6e0abca810b786901a569c0de082f489", - "sha256:11cb254e397a82efb1805d12561e80124928e04e9c4483587ce7390b3866d213", - "sha256:11ff168d752cb41e8492817e10fb4f85828f6a0142b9726a30c27c35a1835f01", - "sha256:176df045597e674fa950bf5ae536be85699e04cea68fa3a616cf75e413737eb5", - "sha256:219a16763dc0294842188ac8a12262b5671817042b35d45e44fd0a697d8c8361", - "sha256:22698f01ff5653fe66d16ffb7658f582a0ac084d7da1323e39fd9eab326a1f26", - "sha256:237533179d9747080bcaad4d02083ce295c0d2eab3e9e8ce103411a4312991a0", - "sha256:289ba9ae8e88d0ba16062ecf02dd730b34186ea3b1e7489046fc338bdc3361c4", - "sha256:2c59e0076ea31c08553e868cec02d22191c086f00b44610f8ab7363a11a5d9d8", - "sha256:2c9376e2b09895c8ca8b95362283365eb5c03bdc8428ade80a864160605715f1", - "sha256:3135713c5562731ee18f58d3ad1bf41e1d8883eb68b363f2ffde5b2ea4b84cc7", - "sha256:3b9c7426923bb7bd66d409da46c41e3fb40f5caf679da624439b9eba92043fa6", - "sha256:3c0266cd6f005e99f3f51e583012de2778e65af6b73860038b968a0a8888487a", - "sha256:41473de252e1797c2d2293804e389a6d6986ef37cbb4a25208de537ae32141dd", - "sha256:4831df72b053b1eed31eb00a2e1aff6896fb4485301d4ccb208cac264b648db4", - "sha256:49f0c1b3c2842556e5de35f122fc0f0b721334ceb6e78c3719693364d4af8499", - "sha256:4b4c452d0190c5a820d3f5c0f3cd8a28ace48c54053e24da9d6041bf81113183", - "sha256:4ee8caa925aebc1e64e98432d78ea8de67b2272252b0a931d2ac3bd876ad5544", - "sha256:500f1c59906cd142d452074f3811614be04819a38ae2b3239a48b82649c08821", - "sha256:5216b6082c624b55cfe79af5d538e499cd5f5b976820eac31951fb4325974501", - "sha256:54311eb54f3a0c45efb9ed0d0a8f43d1bc6060d773f6973efd90037a51cd0a3f", - "sha256:54631fb69a6e44b2ba522f7c22a6fb2667a02fd97d636048478db2fd8c4e98fe", - "sha256:565760d6812b8d78d416c3c7cfdf5362fbe0d0d25b82fed75d0d29e18d7fc30f", - "sha256:598db66eaf2e04aa0c8900a63b0101fdc5e6b8a7ddd805c56d86efb54eb66672", - "sha256:5c4fa235d534b3547184831c624c0b7c1e262cd1de847d95085ec94c16fddcd5", - "sha256:69985d50a2b6f709412d944ffb2e97d0be154ea90600b7a921f95a87d6f108a2", - "sha256:69da0f3ed3496808e8cbc5123a866c41c12c15baaaead96d256477edf168eb57", - "sha256:6c93b7c2e52061f0925c3382d5cb8980e40f91c989563d3d32ca280069fd6a87", - "sha256:70907533db712f7aa791effb38efa96f044ce3d4e850e2d7691abd759f4f0ae0", - "sha256:81b77f868814346662c96ab36b875d7814ebf82340d3284a31681085c051320f", - "sha256:82eefaf1a996060602f3cc1112d93ba8b201dbf5d8fd9611227de2003dddb3b7", - "sha256:85c3e3c9cb1d480e0b9a64c658cd66b3cfb8e721636ab8b0e746e2d79a7a9eed", - "sha256:8a22a34bc594d9d24621091d1b91511001a7eea91d6652ea495ce06e27381f70", - "sha256:8cef8710fb849d97c533f259103f09bac167a008d7131d7b2b0e3a33269185c0", - "sha256:8d44e7bf06b0c0a70a20f9100af9fcfd7f6d9d3913e37754c12d424179b4e48f", - "sha256:8d7f98fde213f74561be1d6d3fa353656197f75d4edfbb3d94c9eb9b0fc47f5d", - "sha256:8d8e4450e7fe24d86e86b23cc209e0023177b6d59502e33807b732d2deb6975f", - "sha256:8fc49a87ac269d4529da45871e2ffb6874e87779c3d0e2ccd813c0899221239d", - "sha256:90ec72d231169b4b8d6085be13023ece8fa9b1bb495e4398d847e25218e0f431", - "sha256:91c742ca59045dce7ba76cab6e223e41d2c70d79e82c284a96411f8645e2afff", - "sha256:9b05d33ff8e6b269e30a7957bd3244ffbce2a7a35a81b81c382629b80af1a8bf", - "sha256:9b05d5cbe9dafcdc733262c3a99ccf63d2f7ce02543620d2bd8db4d4f7a22f83", - "sha256:9c5857612c9813796960c00767645cb5da815af16dafb32d70c72a8390bbf690", - "sha256:a34086c5cc285be878622e0a6ab897a986a6e8bf5b67ecb377015f06ed316587", - "sha256:ab221850108a4a063c5b8a70f00dd7a1975e5a1713f87f4ab26a46e5feac5a0e", - "sha256:b796b44111f0cab6bbf66214186e44734b5baab949cb5fb56154142a92989aeb", - "sha256:b8c3a67eb87394386847d188996920f33b01b32155f0a94f36ca0e0c635bf3e3", - "sha256:bcb6532b9814ea7c5a6a3299747c49de30e84472fa72821b07f5a9818bce0f66", - "sha256:bcc0ea8d5b74a41b621ad4a13d96c36079c81628ccc0b30cfb1603e3dfa3a014", - "sha256:bea94403a21eb94c93386d559bce297381609153e418a3ffc7d6bf772f59cc35", - "sha256:bff7e2811814fa2271be95ab6e84c9436d027a0e59665de60edf44e529a42c1f", - "sha256:c72444d17777865734aa1a4d167794c34b63e5883abb90356a0364a28904e6c0", - "sha256:c7b5d5d64e2a14e35a9240b33b89389e0035e6de8dbb7ffa50d10d8b65c57449", - "sha256:c7e939f1ae428a86e4abbb9a7c4732bf4706048818dfd979e5e2839ce0159f23", - "sha256:c88a15f272a0ad3d7773cf3a37cc7b7d077cbfc8e331675cf1346e849d97a4e5", - "sha256:c9110c06eaaac7e1f5562caf481f18ccf8f6fdf4c3323feab28a93d34cc646bd", - "sha256:ca7ca5abfbfe8d39e653870fbe8d7710be7a857f8a8386fc9de1aae2e02ce7e4", - "sha256:cae4c0c2ca800c793cae07ef3d40794625471040a87e1ba392039639ad61ab5b", - "sha256:cdefe289681507187e375a5064c7599f52c40343a8701761c802c1853a504558", - "sha256:cf2a0ac0615842b849f40c4d7f304986a242f1e68286dbf3bd7a835e4f83acfd", - "sha256:cfeadf42840c1e870dc2042a232a8748e75a36b52d78968cda6736de55582766", - "sha256:d737e69d193dac7296365a6dcb73bbbf53bb760ab25a3727716bbd42022e8d7a", - "sha256:d7481f581251bb5558ba9f635db70908819caa221fc79ee52a7f58392778c636", - "sha256:df9cf74b9bc03d586fc53ba470828d7b77ce51b0582d1d0b5b2fb673c0baa32d", - "sha256:e1f80197f8b0b846a8d5cf7b7ec6084493950d0882cc5537fb7b96a69e3c8590", - "sha256:ecca113f19d5e74048c001934045a2b9368d77b0b17691d905af18bd1c21275e", - "sha256:ee2527134f95e106cc1653e9ac78846f3a2ec1004cf20ef4e02038035a74544d", - "sha256:f27fdaadce22f2ef950fc10dcdf8048407c3b42b73779e48a4e76b3c35bca26c", - "sha256:f694dc8a6a3112059258a725a4ebe9acac5fe62f11c77ac4dcf896edfa78ca28", - "sha256:f800164276eec54e0af5c99feb9494c295118fc10a11b997bbb1348ba1a52065", - "sha256:ffcd828e37dc219a72c9012ec44ad2e7e3066bec6ff3aaa19e7d435dbf4032ca" + "sha256:017a21b0df49039c8f46ca0971b3a7fdc1f56741ab1240cb90ca408049766168", + "sha256:039df344b45ae0b34ac885ab5b53940b174530d4dd8a14ed8b0e2155b9dddccb", + "sha256:055ce4f74b82551678291473f66dc9fb9048a50d8324278751926ff0ae7715e5", + "sha256:06a9b2c8837d9a94fae16c6223acc14b4dfdff216ab9b7202e07a9a09541168f", + "sha256:07b837ef0d2f252f96009e9b8435ec1fef68ef8b1461933253d318748ec1acdc", + "sha256:0ed621426d961df79aa3b963ac7af0d40392956ffa9be022024cd16297b30c8c", + "sha256:0fa43c32d1643f518491d9d3a730f85f5bbaedcbd7fbcae27435bb8b7a061b29", + "sha256:1f5a71d25cd8106eab05f8704cd9167b6e5187bcdf8f090a66c6d88b634802b4", + "sha256:1f5cd333fcf7590a18334c90f8c9147c837a6ec8a178e88d90a9b96ea03194cc", + "sha256:27468897f628c627230dba07ec65dc8d0db566923c48f29e084ce382119802bc", + "sha256:298abd678033b8571995650ccee753d9458dfa0377be4dba91e4491da3f2be63", + "sha256:2c895a656dd7e061b2fd6bb77d971cc38f2afc277229ce7dd3552de8313a483e", + "sha256:361a1026c9dd4aba0109e4040e2aecf9884f5cfe1b1b1bd3d09419c205e2e53d", + "sha256:363afe77cfcbe3a36353d8ea133e904b108feea505aa4792dad6585a8192c55a", + "sha256:38a19bc3b686ad55804ae931012f78f7a534cce165d089a2059f658f6c91fa60", + "sha256:38f307b41e0bea3294a9a2a87833191e4bcf89bb0365e83a8be3a58b31fb7f38", + "sha256:3e59c23c52765951b69ec45ddbbc9403a8761ee6f57253250c6e1536cacc758b", + "sha256:4b4af9f25b49a7be47c0972139e59ec0e8285c371049df1a63b6ca81fdd216a2", + "sha256:504b6981675ace64c28bf4a05a508af5cde526e36492c98916127f5a02354d53", + "sha256:50fca156d718f8ced687a373f9e140c1bb765ca16e3d6f4fe116e3df7c05b2c5", + "sha256:522a11c934ea660ff8953eda090dcd2154d367dec1ae3c540aff9f8a5c109ab4", + "sha256:52df73f14ed99cee84865b95a3d9e044f226320a87af208f068ecc33e0c35b96", + "sha256:595f105710293e76b9dc09f52e0dd896bd064a79346234b521f6b968ffdd8e58", + "sha256:59c26c95975f26e662ca78fdf543d4eeaef70e533a672b4113dd888bd2423caa", + "sha256:5bce0dc147ca85caa5d33debc4f4d65e8e8b5c97c7f9f660f215fa74fc49a321", + "sha256:5eafe2c065df5401ba06821b9a054d9cb2848867f3c59801b5d07a0be3a380ae", + "sha256:5ed3e046ea7b14938112ccd53d91c1539af3e6679b222f9469981e3dac7ba1ce", + "sha256:5fe9ce6c09668063b8447f85d43b8d1c4e5d3d7e92c63173e6180b2ac5d46dd8", + "sha256:648056db9a9fa565d3fa851880f99f45e3f9a771dd3ff3bb0c048ea83fb28194", + "sha256:69361bfdca5468c0488d7017b9b1e5ce769d40b46a9f4a2eed26b78619e9396c", + "sha256:6b0e029353361f1746bac2e4cc19b32f972ec03f0f943b390c4ab3371840aabf", + "sha256:6b88f9386ff1ad91ace19d2a1c0225896e28815ee09fc6a8932fded8cda97c3d", + "sha256:770d015888c2a598b377bd2f663adfd947d78c0124cfe7b959e1ef39f5b13869", + "sha256:7943c414d3a8d9235f5f15c22ace69787c140c80b718dcd57caaade95f7cd93b", + "sha256:7cf5c9458e1e90e3c390c2639f1017a0379a99a94fdfad3a1fd966a2874bba52", + "sha256:7f46acd6a194287b7e41e87957bfe2ad1ad88318d447caf5b090012f2c5bb528", + "sha256:82e6aa28dd46374f72093eda8bcd142f7771ee1eb9d1e223ff0fa7177a96b4a5", + "sha256:835a55b7ca49468aaaac0b217092dfdff370e6c215c9224c52f30daaa735c1c1", + "sha256:84871a243359bb42c12728f04d181a389718710129b36b6aad0fc4655a7647d4", + "sha256:8aacb477dc26797ee089721536a292a664846489c49d3ef9725f992449eda5a8", + "sha256:8e2c45c208c62e955e8256949eb225bd8b66a4c9b6865729a786f2aa79b72e9d", + "sha256:90842933e5d1ff760fae6caca4b2b3edba53ba8f4b71e95dacf2818a2aca06f7", + "sha256:938a9653e1e0c592053f815f7028e41a3062e902095e5a7dc84617c87267ebd5", + "sha256:939677b61f9d72a4fa2a042a5eee2a99a24001a67c13da113b2e30396567db54", + "sha256:9d3c9b50f19704552f23b4eaea1fc082fdd82c63429a6506446cbd8737823da3", + "sha256:a6fe5571784af92b6bc2fda8d1925cccdf24642d49546d3144948a6a1ed58ca5", + "sha256:a78ed8a53a1221393d9637c01870248a6f4ea5b214a59a92a36f18151739452c", + "sha256:ab40e6251c3873d86ea9b30a1ac6d7478c09277b32e14745d0d3c6e76e3c7e29", + "sha256:abf151955990d23f84205286938796c55ff11bbfb4ccfada8c9c83ae6b3c89a3", + "sha256:acef0899fea7492145d2bbaaaec7b345c87753168589cc7faf0afec9afe9b747", + "sha256:b40670ec7e2156d8e57f70aec34a7216407848dfe6c693ef131ddf6e76feb672", + "sha256:b791a3143681a520c0a17e26ae7465f1b6f99461a28019d1a2f425236e6eedb5", + "sha256:b955ed993491f1a5da7f92e98d5dad3c1e14dc175f74517c4e610b1f2456fb11", + "sha256:ba39e9c8627edc56544c8628cc180d88605df3892beeb2b94c9bc857774848ca", + "sha256:bca77a198bb6e69795ef2f09a5f4c12758487f83f33d63acde5f0d4919815768", + "sha256:c3452ea726c76e92f3b9fae4b34a151981a9ec0a4847a627c43d71a15ac32aa6", + "sha256:c46956ed82961e31557b6857a5ca153c67e5476972e5f7190015018760938da2", + "sha256:c7c8b816c2b5af5c8a436df44ca08258fc1a13b449393a91484225fcb7545533", + "sha256:cd73265a9e5ea618014802ab01babf1940cecb90c9762d8b9e7d2cc1e1969ec6", + "sha256:dad46e6f620574b3b4801c68255492e0159d1712271cc99d8bdf35f2043ec266", + "sha256:dc9b311743a78043b26ffaeeb9715dc360335e5517832f5a8e339f8a43581e4d", + "sha256:df822ee7feaaeffb99c1a9e5e608800bd8eda6e5f18f5cfb0dc7eeb2eaa6bbec", + "sha256:e083c285857b78ee21a96ba1eb1b5339733c3563f72980728ca2b08b53826ca5", + "sha256:e5e46b578c0e9db71d04c4b506a2121c0cb371dd89af17a0586ff6769d4c58c1", + "sha256:e99abf0bba688259a496f966211c49a514e65afa9b3073a1fcee08856e04425b", + "sha256:ee43080e75fc92bf36219926c8e6de497f9b247301bbf88c5c7593d931426679", + "sha256:f033d80bc6283092613882dfe40419c6a6a1527e04fc69350e87a9df02bbc283", + "sha256:f1088fa100bf46e7b398ffd9904f4808a0612e1d966b4aa43baa535d1b6341eb", + "sha256:f56455b0c2c7cc3b0c584815264461d07b177f903a04481dfc33e08a89f0c26b", + "sha256:f59dfe57bb1ec82ac0698ebfcdb7bcd0e99c255bd637ff613760d5f33e7c81b3", + "sha256:f7217af2e14da0856e082e96ff637f14ae45c10a5714b63c77f26d8884cf1051", + "sha256:f734e38fd8666f53da904c52a23ce517f1b07722118d750405af7e4123933511", + "sha256:f95511dd5d0e05fd9728bac4096319f80615aaef4acbecb35a990afebe953b0e", + "sha256:fdd215b7b7fd4a53994f238d0f46b7ba4ac4c0adb12452beee724ddd0743ae5d", + "sha256:feeb18a801aacb098220e2c3eea59a512362eb408d4afd0c242044c33ad6d542", + "sha256:ff30218887e62209942f91ac1be902cc80cddb86bf00fbc6783b7a43b2bea26f" ], "markers": "python_version >= '3.8'", - "version": "==3.9.1" + "version": "==3.9.3" }, "aiosignal": { "hashes": [ @@ -236,19 +236,19 @@ }, "boto3": { "hashes": [ - "sha256:34b2b404bd2bec869ec2fc6aeeeeb884c72a9b895e2c7716b95381ab8deb9069", - "sha256:50776db195a73533f4f2c9d000c69f9d0e9fb9810f9f81584adc283e9516ad0d" + "sha256:0d800130e43a5d4e71300cc6f91aabcef6fe6f26bc206bc61374bf695049587a", + "sha256:c4dec7ea9bc9210ec783d39b56d332f5a266b0d1e31a96c5092f6bd5252361ba" ], "markers": "python_version >= '3.8'", - "version": "==1.34.29" + "version": "==1.34.31" }, "botocore": { "hashes": [ - "sha256:34223fdb8ebd47d1fce5724bb1bcb164e81853ea9ca532b50639c749fc347458", - "sha256:44d918b91a1c1085d99266f8bf6ecc087c8a73a8efbb8e829f0c2dcd1ddf9963" + "sha256:6ee1ba451ce3d640dccd485906f68a55d9e7f3534553876e4adc75d6060a05ac", + "sha256:d5a2153dbe9687f510f179e03913bc9b4e266c865cabebe440c4d05ab923faa7" ], "markers": "python_version >= '3.8'", - "version": "==1.34.29" + "version": "==1.34.31" }, "cachetools": { "hashes": [ @@ -461,41 +461,41 @@ }, "cryptography": { "hashes": [ - "sha256:0b7cacc142260ada944de070ce810c3e2a438963ee3deb45aa26fd2cee94c9a4", - "sha256:126e0ba3cc754b200a2fb88f67d66de0d9b9e94070c5bc548318c8dab6383cb6", - "sha256:160fa08dfa6dca9cb8ad9bd84e080c0db6414ba5ad9a7470bc60fb154f60111e", - "sha256:16b9260d04a0bfc8952b00335ff54f471309d3eb9d7e8dbfe9b0bd9e26e67881", - "sha256:25ec6e9e81de5d39f111a4114193dbd39167cc4bbd31c30471cebedc2a92c323", - "sha256:265bdc693570b895eb641410b8fc9e8ddbce723a669236162b9d9cfb70bd8d77", - "sha256:2dff7a32880a51321f5de7869ac9dde6b1fca00fc1fef89d60e93f215468e824", - "sha256:2fe16624637d6e3e765530bc55caa786ff2cbca67371d306e5d0a72e7c3d0407", - "sha256:32ea63ceeae870f1a62e87f9727359174089f7b4b01e4999750827bf10e15d60", - "sha256:351db02c1938c8e6b1fee8a78d6b15c5ccceca7a36b5ce48390479143da3b411", - "sha256:430100abed6d3652208ae1dd410c8396213baee2e01a003a4449357db7dc9e14", - "sha256:4d84673c012aa698555d4710dcfe5f8a0ad76ea9dde8ef803128cc669640a2e0", - "sha256:50aecd93676bcca78379604ed664c45da82bc1241ffb6f97f6b7392ed5bc6f04", - "sha256:6ac8924085ed8287545cba89dc472fc224c10cc634cdf2c3e2866fe868108e77", - "sha256:6bfd823b336fdcd8e06285ae8883d3d2624d3bdef312a0e2ef905f332f8e9302", - "sha256:727387886c9c8de927c360a396c5edcb9340d9e960cda145fca75bdafdabd24c", - "sha256:7911586fc69d06cd0ab3f874a169433db1bc2f0e40988661408ac06c4527a986", - "sha256:802d6f83233cf9696b59b09eb067e6b4d5ae40942feeb8e13b213c8fad47f1aa", - "sha256:8d7efb6bf427d2add2f40b6e1e8e476c17508fa8907234775214b153e69c2e11", - "sha256:9544492e8024f29919eac2117edd8c950165e74eb551a22c53f6fdf6ba5f4cb8", - "sha256:95d900d19a370ae36087cc728e6e7be9c964ffd8cbcb517fd1efb9c9284a6abc", - "sha256:9d61fcdf37647765086030d81872488e4cb3fafe1d2dda1d487875c3709c0a49", - "sha256:ab6b302d51fbb1dd339abc6f139a480de14d49d50f65fdc7dff782aa8631d035", - "sha256:b512f33c6ab195852595187af5440d01bb5f8dd57cb7a91e1e009a17f1b7ebca", - "sha256:cb2861a9364fa27d24832c718150fdbf9ce6781d7dc246a516435f57cfa31fe7", - "sha256:d3594947d2507d4ef7a180a7f49a6db41f75fb874c2fd0e94f36b89bfd678bf2", - "sha256:d3902c779a92151f134f68e555dd0b17c658e13429f270d8a847399b99235a3f", - "sha256:d50718dd574a49d3ef3f7ef7ece66ef281b527951eb2267ce570425459f6a404", - "sha256:e5edf189431b4d51f5c6fb4a95084a75cef6b4646c934eb6e32304fc720e1453", - "sha256:e6edc3a568667daf7d349d7e820783426ee4f1c0feab86c29bd1d6fe2755e009", - "sha256:ed1b2130f5456a09a134cc505a17fc2830a1a48ed53efd37dcc904a23d7b82fa", - "sha256:fd33f53809bb363cf126bebe7a99d97735988d9b0131a2be59fbf83e1259a5b7" + "sha256:087887e55e0b9c8724cf05361357875adb5c20dec27e5816b653492980d20380", + "sha256:09a77e5b2e8ca732a19a90c5bca2d124621a1edb5438c5daa2d2738bfeb02589", + "sha256:130c0f77022b2b9c99d8cebcdd834d81705f61c68e91ddd614ce74c657f8b3ea", + "sha256:141e2aa5ba100d3788c0ad7919b288f89d1fe015878b9659b307c9ef867d3a65", + "sha256:28cb2c41f131a5758d6ba6a0504150d644054fd9f3203a1e8e8d7ac3aea7f73a", + "sha256:2f9f14185962e6a04ab32d1abe34eae8a9001569ee4edb64d2304bf0d65c53f3", + "sha256:320948ab49883557a256eab46149df79435a22d2fefd6a66fe6946f1b9d9d008", + "sha256:36d4b7c4be6411f58f60d9ce555a73df8406d484ba12a63549c88bd64f7967f1", + "sha256:3b15c678f27d66d247132cbf13df2f75255627bcc9b6a570f7d2fd08e8c081d2", + "sha256:3dbd37e14ce795b4af61b89b037d4bc157f2cb23e676fa16932185a04dfbf635", + "sha256:4383b47f45b14459cab66048d384614019965ba6c1a1a141f11b5a551cace1b2", + "sha256:44c95c0e96b3cb628e8452ec060413a49002a247b2b9938989e23a2c8291fc90", + "sha256:4b063d3413f853e056161eb0c7724822a9740ad3caa24b8424d776cebf98e7ee", + "sha256:52ed9ebf8ac602385126c9a2fe951db36f2cb0c2538d22971487f89d0de4065a", + "sha256:55d1580e2d7e17f45d19d3b12098e352f3a37fe86d380bf45846ef257054b242", + "sha256:5ef9bc3d046ce83c4bbf4c25e1e0547b9c441c01d30922d812e887dc5f125c12", + "sha256:5fa82a26f92871eca593b53359c12ad7949772462f887c35edaf36f87953c0e2", + "sha256:61321672b3ac7aade25c40449ccedbc6db72c7f5f0fdf34def5e2f8b51ca530d", + "sha256:701171f825dcab90969596ce2af253143b93b08f1a716d4b2a9d2db5084ef7be", + "sha256:841ec8af7a8491ac76ec5a9522226e287187a3107e12b7d686ad354bb78facee", + "sha256:8a06641fb07d4e8f6c7dda4fc3f8871d327803ab6542e33831c7ccfdcb4d0ad6", + "sha256:8e88bb9eafbf6a4014d55fb222e7360eef53e613215085e65a13290577394529", + "sha256:a00aee5d1b6c20620161984f8ab2ab69134466c51f58c052c11b076715e72929", + "sha256:a047682d324ba56e61b7ea7c7299d51e61fd3bca7dad2ccc39b72bd0118d60a1", + "sha256:a7ef8dd0bf2e1d0a27042b231a3baac6883cdd5557036f5e8df7139255feaac6", + "sha256:ad28cff53f60d99a928dfcf1e861e0b2ceb2bc1f08a074fdd601b314e1cc9e0a", + "sha256:b9097a208875fc7bbeb1286d0125d90bdfed961f61f214d3f5be62cd4ed8a446", + "sha256:b97fe7d7991c25e6a31e5d5e795986b18fbbb3107b873d5f3ae6dc9a103278e9", + "sha256:e0ec52ba3c7f1b7d813cd52649a5b3ef1fc0d433219dc8c93827c57eab6cf888", + "sha256:ea2c3ffb662fec8bbbfce5602e2c159ff097a4631d96235fcf0fb00e59e3ece4", + "sha256:fa3dec4ba8fb6e662770b74f62f1a0c7d4e37e25b58b2bf2c1be4c95372b4a33", + "sha256:fbeb725c9dc799a574518109336acccaf1303c30d45c075c665c0793c2f79a7f" ], "markers": "python_version >= '3.7'", - "version": "==42.0.1" + "version": "==42.0.2" }, "dateparser": { "hashes": [ @@ -700,11 +700,11 @@ }, "griffe": { "hashes": [ - "sha256:6ce4ecffcf0d2f96362c5974b3f7df812da8f8d4cfcc5ebc8202ef72656fc087", - "sha256:ead8dfede6e6531cce6bf69090a4f3c6d36fdf923c43f8e85aa530552cef0c09" + "sha256:76c4439eaa2737af46ae003c331ab6ca79c5365b552f7b5aed263a3b4125735b", + "sha256:db1da6d1d8e08cbb20f1a7dee8c09da940540c2d4c1bfa26a9091cf6fc36a9ec" ], "markers": "python_version >= '3.8'", - "version": "==0.39.1" + "version": "==0.40.0" }, "h11": { "hashes": [ @@ -815,10 +815,10 @@ }, "kaggle": { "hashes": [ - "sha256:27614ecd72613b9f586b872313af1638ad8c0a17d0c78ad9d4a71879becd72e4" + "sha256:6a91a7bacb461d2682edf4ca7163f1811ed8ca8a84492263c468ffe7703f101f" ], "index": "pypi", - "version": "==1.6.3" + "version": "==1.6.4" }, "kubernetes": { "hashes": [ @@ -915,11 +915,11 @@ }, "mako": { "hashes": [ - "sha256:57d4e997349f1a92035aa25c17ace371a4213f2ca42f99bee9a602500cfd54d9", - "sha256:e3a9d388fd00e87043edbe8792f45880ac0114e9c4adc69f6e9bfb2c55e3b11b" + "sha256:2a0c8ad7f6274271b3bb7467dd37cf9cc6dab4bc19cb69a4ef10669402de698e", + "sha256:32a99d70754dfce237019d17ffe4a282d2d3351b9c476e90d8a60e63f133b80c" ], "markers": "python_version >= '3.8'", - "version": "==1.3.0" + "version": "==1.3.2" }, "markdown": { "hashes": [ @@ -1229,12 +1229,12 @@ }, "prefect": { "hashes": [ - "sha256:c0f8fb8ae64b1f3b59f8fda68982519cb21dc10ddb5636640c4cfa17a8eda2c6", - "sha256:e1c2283bc065ea6f0343fe0811b89198828ee69aacf3139c0a415cce0e00d6b8" + "sha256:36868cf84d9621d8140492ab94ea19e44b88f82edd65c048a8a4ede0fc46d71d", + "sha256:b06df359a77fb684db1dd99f52f0c719d5f8148104ef8613f1ebfd4b7b25eaee" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==2.14.17" + "version": "==2.14.18" }, "prefect-aws": { "hashes": [ @@ -1291,122 +1291,96 @@ "email" ], "hashes": [ - "sha256:b3ef57c62535b0941697cce638c08900d87fcb67e29cfa99e8a68f747f393f7a", - "sha256:d0caf5954bee831b6bfe7e338c32b9e30c85dfe080c843680783ac2b631673b4" + "sha256:1440966574e1b5b99cf75a13bec7b20e3512e8a61b894ae252f56275e2c465ae", + "sha256:ae887bd94eb404b09d86e4d12f93893bdca79d766e738528c6fa1c849f3c6bcf" ], - "markers": "python_version >= '3.7'", - "version": "==2.5.3" + "markers": "python_version >= '3.8'", + "version": "==2.6.0" }, "pydantic-core": { "hashes": [ - "sha256:00646784f6cd993b1e1c0e7b0fdcbccc375d539db95555477771c27555e3c556", - "sha256:00b1087dabcee0b0ffd104f9f53d7d3eaddfaa314cdd6726143af6bc713aa27e", - "sha256:0348b1dc6b76041516e8a854ff95b21c55f5a411c3297d2ca52f5528e49d8411", - "sha256:036137b5ad0cb0004c75b579445a1efccd072387a36c7f217bb8efd1afbe5245", - "sha256:095b707bb287bfd534044166ab767bec70a9bba3175dcdc3371782175c14e43c", - "sha256:0c08de15d50fa190d577e8591f0329a643eeaed696d7771760295998aca6bc66", - "sha256:1302a54f87b5cd8528e4d6d1bf2133b6aa7c6122ff8e9dc5220fbc1e07bffebd", - "sha256:172de779e2a153d36ee690dbc49c6db568d7b33b18dc56b69a7514aecbcf380d", - "sha256:1b027c86c66b8627eb90e57aee1f526df77dc6d8b354ec498be9a757d513b92b", - "sha256:1ce830e480f6774608dedfd4a90c42aac4a7af0a711f1b52f807130c2e434c06", - "sha256:1fd0c1d395372843fba13a51c28e3bb9d59bd7aebfeb17358ffaaa1e4dbbe948", - "sha256:23598acb8ccaa3d1d875ef3b35cb6376535095e9405d91a3d57a8c7db5d29341", - "sha256:24368e31be2c88bd69340fbfe741b405302993242ccb476c5c3ff48aeee1afe0", - "sha256:26a92ae76f75d1915806b77cf459811e772d8f71fd1e4339c99750f0e7f6324f", - "sha256:27e524624eace5c59af499cd97dc18bb201dc6a7a2da24bfc66ef151c69a5f2a", - "sha256:2b8719037e570639e6b665a4050add43134d80b687288ba3ade18b22bbb29dd2", - "sha256:2c5bcf3414367e29f83fd66f7de64509a8fd2368b1edf4351e862910727d3e51", - "sha256:2dbe357bc4ddda078f79d2a36fc1dd0494a7f2fad83a0a684465b6f24b46fe80", - "sha256:2f5fa187bde8524b1e37ba894db13aadd64faa884657473b03a019f625cee9a8", - "sha256:2f6ffc6701a0eb28648c845f4945a194dc7ab3c651f535b81793251e1185ac3d", - "sha256:314ccc4264ce7d854941231cf71b592e30d8d368a71e50197c905874feacc8a8", - "sha256:36026d8f99c58d7044413e1b819a67ca0e0b8ebe0f25e775e6c3d1fabb3c38fb", - "sha256:36099c69f6b14fc2c49d7996cbf4f87ec4f0e66d1c74aa05228583225a07b590", - "sha256:36fa402dcdc8ea7f1b0ddcf0df4254cc6b2e08f8cd80e7010d4c4ae6e86b2a87", - "sha256:370ffecb5316ed23b667d99ce4debe53ea664b99cc37bfa2af47bc769056d534", - "sha256:3860c62057acd95cc84044e758e47b18dcd8871a328ebc8ccdefd18b0d26a21b", - "sha256:399ac0891c284fa8eb998bcfa323f2234858f5d2efca3950ae58c8f88830f145", - "sha256:3a0b5db001b98e1c649dd55afa928e75aa4087e587b9524a4992316fa23c9fba", - "sha256:3dcf1978be02153c6a31692d4fbcc2a3f1db9da36039ead23173bc256ee3b91b", - "sha256:4241204e4b36ab5ae466ecec5c4c16527a054c69f99bba20f6f75232a6a534e2", - "sha256:438027a975cc213a47c5d70672e0d29776082155cfae540c4e225716586be75e", - "sha256:43e166ad47ba900f2542a80d83f9fc65fe99eb63ceec4debec160ae729824052", - "sha256:478e9e7b360dfec451daafe286998d4a1eeaecf6d69c427b834ae771cad4b622", - "sha256:4ce8299b481bcb68e5c82002b96e411796b844d72b3e92a3fbedfe8e19813eab", - "sha256:4f86f1f318e56f5cbb282fe61eb84767aee743ebe32c7c0834690ebea50c0a6b", - "sha256:55a23dcd98c858c0db44fc5c04fc7ed81c4b4d33c653a7c45ddaebf6563a2f66", - "sha256:599c87d79cab2a6a2a9df4aefe0455e61e7d2aeede2f8577c1b7c0aec643ee8e", - "sha256:5aa90562bc079c6c290f0512b21768967f9968e4cfea84ea4ff5af5d917016e4", - "sha256:64634ccf9d671c6be242a664a33c4acf12882670b09b3f163cd00a24cffbd74e", - "sha256:667aa2eac9cd0700af1ddb38b7b1ef246d8cf94c85637cbb03d7757ca4c3fdec", - "sha256:6a31d98c0d69776c2576dda4b77b8e0c69ad08e8b539c25c7d0ca0dc19a50d6c", - "sha256:6af4b3f52cc65f8a0bc8b1cd9676f8c21ef3e9132f21fed250f6958bd7223bed", - "sha256:6c8edaea3089bf908dd27da8f5d9e395c5b4dc092dbcce9b65e7156099b4b937", - "sha256:71d72ca5eaaa8d38c8df16b7deb1a2da4f650c41b58bb142f3fb75d5ad4a611f", - "sha256:72f9a942d739f09cd42fffe5dc759928217649f070056f03c70df14f5770acf9", - "sha256:747265448cb57a9f37572a488a57d873fd96bf51e5bb7edb52cfb37124516da4", - "sha256:75ec284328b60a4e91010c1acade0c30584f28a1f345bc8f72fe8b9e46ec6a96", - "sha256:78d0768ee59baa3de0f4adac9e3748b4b1fffc52143caebddfd5ea2961595277", - "sha256:78ee52ecc088c61cce32b2d30a826f929e1708f7b9247dc3b921aec367dc1b23", - "sha256:7be719e4d2ae6c314f72844ba9d69e38dff342bc360379f7c8537c48e23034b7", - "sha256:7e1f4744eea1501404b20b0ac059ff7e3f96a97d3e3f48ce27a139e053bb370b", - "sha256:7e90d6cc4aad2cc1f5e16ed56e46cebf4877c62403a311af20459c15da76fd91", - "sha256:7ebe3416785f65c28f4f9441e916bfc8a54179c8dea73c23023f7086fa601c5d", - "sha256:7f41533d7e3cf9520065f610b41ac1c76bc2161415955fbcead4981b22c7611e", - "sha256:7f5025db12fc6de7bc1104d826d5aee1d172f9ba6ca936bf6474c2148ac336c1", - "sha256:86c963186ca5e50d5c8287b1d1c9d3f8f024cbe343d048c5bd282aec2d8641f2", - "sha256:86ce5fcfc3accf3a07a729779d0b86c5d0309a4764c897d86c11089be61da160", - "sha256:8a14c192c1d724c3acbfb3f10a958c55a2638391319ce8078cb36c02283959b9", - "sha256:8b93785eadaef932e4fe9c6e12ba67beb1b3f1e5495631419c784ab87e975670", - "sha256:8ed1af8692bd8d2a29d702f1a2e6065416d76897d726e45a1775b1444f5928a7", - "sha256:92879bce89f91f4b2416eba4429c7b5ca22c45ef4a499c39f0c5c69257522c7c", - "sha256:94fc0e6621e07d1e91c44e016cc0b189b48db053061cc22d6298a611de8071bb", - "sha256:982487f8931067a32e72d40ab6b47b1628a9c5d344be7f1a4e668fb462d2da42", - "sha256:9862bf828112e19685b76ca499b379338fd4c5c269d897e218b2ae8fcb80139d", - "sha256:99b14dbea2fdb563d8b5a57c9badfcd72083f6006caf8e126b491519c7d64ca8", - "sha256:9c6a5c79b28003543db3ba67d1df336f253a87d3112dac3a51b94f7d48e4c0e1", - "sha256:a19b794f8fe6569472ff77602437ec4430f9b2b9ec7a1105cfd2232f9ba355e6", - "sha256:a306cdd2ad3a7d795d8e617a58c3a2ed0f76c8496fb7621b6cd514eb1532cae8", - "sha256:a3dde6cac75e0b0902778978d3b1646ca9f438654395a362cb21d9ad34b24acf", - "sha256:a874f21f87c485310944b2b2734cd6d318765bcbb7515eead33af9641816506e", - "sha256:a983cca5ed1dd9a35e9e42ebf9f278d344603bfcb174ff99a5815f953925140a", - "sha256:aca48506a9c20f68ee61c87f2008f81f8ee99f8d7f0104bff3c47e2d148f89d9", - "sha256:b2602177668f89b38b9f84b7b3435d0a72511ddef45dc14446811759b82235a1", - "sha256:b3e5fe4538001bb82e2295b8d2a39356a84694c97cb73a566dc36328b9f83b40", - "sha256:b6ca36c12a5120bad343eef193cc0122928c5c7466121da7c20f41160ba00ba2", - "sha256:b89f4477d915ea43b4ceea6756f63f0288941b6443a2b28c69004fe07fde0d0d", - "sha256:b9a9d92f10772d2a181b5ca339dee066ab7d1c9a34ae2421b2a52556e719756f", - "sha256:c99462ffc538717b3e60151dfaf91125f637e801f5ab008f81c402f1dff0cd0f", - "sha256:cb92f9061657287eded380d7dc455bbf115430b3aa4741bdc662d02977e7d0af", - "sha256:cdee837710ef6b56ebd20245b83799fce40b265b3b406e51e8ccc5b85b9099b7", - "sha256:cf10b7d58ae4a1f07fccbf4a0a956d705356fea05fb4c70608bb6fa81d103cda", - "sha256:d15687d7d7f40333bd8266f3814c591c2e2cd263fa2116e314f60d82086e353a", - "sha256:d5c28525c19f5bb1e09511669bb57353d22b94cf8b65f3a8d141c389a55dec95", - "sha256:d5f916acf8afbcab6bacbb376ba7dc61f845367901ecd5e328fc4d4aef2fcab0", - "sha256:dab03ed811ed1c71d700ed08bde8431cf429bbe59e423394f0f4055f1ca0ea60", - "sha256:db453f2da3f59a348f514cfbfeb042393b68720787bbef2b4c6068ea362c8149", - "sha256:de2a0645a923ba57c5527497daf8ec5df69c6eadf869e9cd46e86349146e5975", - "sha256:dea7fcd62915fb150cdc373212141a30037e11b761fbced340e9db3379b892d4", - "sha256:dfcbebdb3c4b6f739a91769aea5ed615023f3c88cb70df812849aef634c25fbe", - "sha256:dfcebb950aa7e667ec226a442722134539e77c575f6cfaa423f24371bb8d2e94", - "sha256:e0641b506486f0b4cd1500a2a65740243e8670a2549bb02bc4556a83af84ae03", - "sha256:e33b0834f1cf779aa839975f9d8755a7c2420510c0fa1e9fa0497de77cd35d2c", - "sha256:e4ace1e220b078c8e48e82c081e35002038657e4b37d403ce940fa679e57113b", - "sha256:e4cf2d5829f6963a5483ec01578ee76d329eb5caf330ecd05b3edd697e7d768a", - "sha256:e574de99d735b3fc8364cba9912c2bec2da78775eba95cbb225ef7dda6acea24", - "sha256:e646c0e282e960345314f42f2cea5e0b5f56938c093541ea6dbf11aec2862391", - "sha256:e8a5ac97ea521d7bde7621d86c30e86b798cdecd985723c4ed737a2aa9e77d0c", - "sha256:eedf97be7bc3dbc8addcef4142f4b4164066df0c6f36397ae4aaed3eb187d8ab", - "sha256:ef633add81832f4b56d3b4c9408b43d530dfca29e68fb1b797dcb861a2c734cd", - "sha256:f27207e8ca3e5e021e2402ba942e5b4c629718e665c81b8b306f3c8b1ddbb786", - "sha256:f85f3843bdb1fe80e8c206fe6eed7a1caeae897e496542cee499c374a85c6e08", - "sha256:f8e81e4b55930e5ffab4a68db1af431629cf2e4066dbdbfef65348b8ab804ea8", - "sha256:f96ae96a060a8072ceff4cfde89d261837b4294a4f28b84a28765470d502ccc6", - "sha256:fd9e98b408384989ea4ab60206b8e100d8687da18b5c813c11e92fd8212a98e0", - "sha256:ffff855100bc066ff2cd3aa4a60bc9534661816b110f0243e59503ec2df38421" + "sha256:06f0d5a1d9e1b7932477c172cc720b3b23c18762ed7a8efa8398298a59d177c7", + "sha256:07982b82d121ed3fc1c51faf6e8f57ff09b1325d2efccaa257dd8c0dd937acca", + "sha256:0f478ec204772a5c8218e30eb813ca43e34005dff2eafa03931b3d8caef87d51", + "sha256:102569d371fadc40d8f8598a59379c37ec60164315884467052830b28cc4e9da", + "sha256:10dca874e35bb60ce4f9f6665bfbfad050dd7573596608aeb9e098621ac331dc", + "sha256:150ba5c86f502c040b822777e2e519b5625b47813bd05f9273a8ed169c97d9ae", + "sha256:1661c668c1bb67b7cec96914329d9ab66755911d093bb9063c4c8914188af6d4", + "sha256:1a2fe7b00a49b51047334d84aafd7e39f80b7675cad0083678c58983662da89b", + "sha256:1ae8048cba95f382dba56766525abca438328455e35c283bb202964f41a780b0", + "sha256:20f724a023042588d0f4396bbbcf4cffd0ddd0ad3ed4f0d8e6d4ac4264bae81e", + "sha256:2133b0e412a47868a358713287ff9f9a328879da547dc88be67481cdac529118", + "sha256:21e3298486c4ea4e4d5cc6fb69e06fb02a4e22089304308817035ac006a7f506", + "sha256:21ebaa4bf6386a3b22eec518da7d679c8363fb7fb70cf6972161e5542f470798", + "sha256:23632132f1fd608034f1a56cc3e484be00854db845b3a4a508834be5a6435a6f", + "sha256:2d5bea8012df5bb6dda1e67d0563ac50b7f64a5d5858348b5c8cb5043811c19d", + "sha256:300616102fb71241ff477a2cbbc847321dbec49428434a2f17f37528721c4948", + "sha256:30a8259569fbeec49cfac7fda3ec8123486ef1b729225222f0d41d5f840b476f", + "sha256:399166f24c33a0c5759ecc4801f040dbc87d412c1a6d6292b2349b4c505effc9", + "sha256:3fac641bbfa43d5a1bed99d28aa1fded1984d31c670a95aac1bf1d36ac6ce137", + "sha256:42c29d54ed4501a30cd71015bf982fa95e4a60117b44e1a200290ce687d3e640", + "sha256:462d599299c5971f03c676e2b63aa80fec5ebc572d89ce766cd11ca8bcb56f3f", + "sha256:4eebbd049008eb800f519578e944b8dc8e0f7d59a5abb5924cc2d4ed3a1834ff", + "sha256:502c062a18d84452858f8aea1e520e12a4d5228fc3621ea5061409d666ea1706", + "sha256:5317c04349472e683803da262c781c42c5628a9be73f4750ac7d13040efb5d2d", + "sha256:5511f962dd1b9b553e9534c3b9c6a4b0c9ded3d8c2be96e61d56f933feef9e1f", + "sha256:561be4e3e952c2f9056fba5267b99be4ec2afadc27261505d4992c50b33c513c", + "sha256:601d3e42452cd4f2891c13fa8c70366d71851c1593ed42f57bf37f40f7dca3c8", + "sha256:644904600c15816a1f9a1bafa6aab0d21db2788abcdf4e2a77951280473f33e1", + "sha256:653a5dfd00f601a0ed6654a8b877b18d65ac32c9d9997456e0ab240807be6cf7", + "sha256:694a5e9f1f2c124a17ff2d0be613fd53ba0c26de588eb4bdab8bca855e550d95", + "sha256:71b4a48a7427f14679f0015b13c712863d28bb1ab700bd11776a5368135c7d60", + "sha256:72bf9308a82b75039b8c8edd2be2924c352eda5da14a920551a8b65d5ee89253", + "sha256:735dceec50fa907a3c314b84ed609dec54b76a814aa14eb90da31d1d36873a5e", + "sha256:73802194f10c394c2bedce7a135ba1d8ba6cff23adf4217612bfc5cf060de34c", + "sha256:780daad9e35b18d10d7219d24bfb30148ca2afc309928e1d4d53de86822593dc", + "sha256:8655f55fe68c4685673265a650ef71beb2d31871c049c8b80262026f23605ee3", + "sha256:877045a7969ace04d59516d5d6a7dee13106822f99a5d8df5e6822941f7bedc8", + "sha256:87bce04f09f0552b66fca0c4e10da78d17cb0e71c205864bab4e9595122cb9d9", + "sha256:8d4dfc66abea3ec6d9f83e837a8f8a7d9d3a76d25c9911735c76d6745950e62c", + "sha256:8ec364e280db4235389b5e1e6ee924723c693cbc98e9d28dc1767041ff9bc388", + "sha256:8fa00fa24ffd8c31fac081bf7be7eb495be6d248db127f8776575a746fa55c95", + "sha256:920c4897e55e2881db6a6da151198e5001552c3777cd42b8a4c2f72eedc2ee91", + "sha256:920f4633bee43d7a2818e1a1a788906df5a17b7ab6fe411220ed92b42940f818", + "sha256:9795f56aa6b2296f05ac79d8a424e94056730c0b860a62b0fdcfe6340b658cc8", + "sha256:98f0edee7ee9cc7f9221af2e1b95bd02810e1c7a6d115cfd82698803d385b28f", + "sha256:99c095457eea8550c9fa9a7a992e842aeae1429dab6b6b378710f62bfb70b394", + "sha256:99d3a433ef5dc3021c9534a58a3686c88363c591974c16c54a01af7efd741f13", + "sha256:99f9a50b56713a598d33bc23a9912224fc5d7f9f292444e6664236ae471ddf17", + "sha256:9c46e556ee266ed3fb7b7a882b53df3c76b45e872fdab8d9cf49ae5e91147fd7", + "sha256:9f5d37ff01edcbace53a402e80793640c25798fb7208f105d87a25e6fcc9ea06", + "sha256:a0b4cfe408cd84c53bab7d83e4209458de676a6ec5e9c623ae914ce1cb79b96f", + "sha256:a497be217818c318d93f07e14502ef93d44e6a20c72b04c530611e45e54c2196", + "sha256:ac89ccc39cd1d556cc72d6752f252dc869dde41c7c936e86beac5eb555041b66", + "sha256:adf28099d061a25fbcc6531febb7a091e027605385de9fe14dd6a97319d614cf", + "sha256:afa01d25769af33a8dac0d905d5c7bb2d73c7c3d5161b2dd6f8b5b5eea6a3c4c", + "sha256:b1fc07896fc1851558f532dffc8987e526b682ec73140886c831d773cef44b76", + "sha256:b49c604ace7a7aa8af31196abbf8f2193be605db6739ed905ecaf62af31ccae0", + "sha256:b9f3e0bffad6e238f7acc20c393c1ed8fab4371e3b3bc311020dfa6020d99212", + "sha256:ba07646f35e4e49376c9831130039d1b478fbfa1215ae62ad62d2ee63cf9c18f", + "sha256:bd88f40f2294440d3f3c6308e50d96a0d3d0973d6f1a5732875d10f569acef49", + "sha256:c0be58529d43d38ae849a91932391eb93275a06b93b79a8ab828b012e916a206", + "sha256:c45f62e4107ebd05166717ac58f6feb44471ed450d07fecd90e5f69d9bf03c48", + "sha256:c56da23034fe66221f2208c813d8aa509eea34d97328ce2add56e219c3a9f41c", + "sha256:c94b5537bf6ce66e4d7830c6993152940a188600f6ae044435287753044a8fe2", + "sha256:cebf8d56fee3b08ad40d332a807ecccd4153d3f1ba8231e111d9759f02edfd05", + "sha256:d0bf6f93a55d3fa7a079d811b29100b019784e2ee6bc06b0bb839538272a5610", + "sha256:d195add190abccefc70ad0f9a0141ad7da53e16183048380e688b466702195dd", + "sha256:d25ef0c33f22649b7a088035fd65ac1ce6464fa2876578df1adad9472f918a76", + "sha256:d6cbdf12ef967a6aa401cf5cdf47850559e59eedad10e781471c960583f25aa1", + "sha256:d8c032ccee90b37b44e05948b449a2d6baed7e614df3d3f47fe432c952c21b60", + "sha256:daff04257b49ab7f4b3f73f98283d3dbb1a65bf3500d55c7beac3c66c310fe34", + "sha256:e83ebbf020be727d6e0991c1b192a5c2e7113eb66e3def0cd0c62f9f266247e4", + "sha256:ed3025a8a7e5a59817b7494686d449ebfbe301f3e757b852c8d0d1961d6be864", + "sha256:f1936ef138bed2165dd8573aa65e3095ef7c2b6247faccd0e15186aabdda7f66", + "sha256:f5247a3d74355f8b1d780d0f3b32a23dd9f6d3ff43ef2037c6dcd249f35ecf4c", + "sha256:fa496cd45cda0165d597e9d6f01e36c33c9508f75cf03c0a650018c5048f578e", + "sha256:fb4363e6c9fc87365c2bc777a1f585a22f2f56642501885ffc7942138499bf54", + "sha256:fb4370b15111905bf8b5ba2129b926af9470f014cb0493a67d23e9d7a48348e8", + "sha256:fbec2af0ebafa57eb82c18c304b37c86a8abddf7022955d1742b3d5471a6339e" ], - "markers": "python_version >= '3.7'", - "version": "==2.14.6" + "markers": "python_version >= '3.8'", + "version": "==2.16.1" }, "pygments": { "hashes": [ @@ -1434,10 +1408,10 @@ }, "pytz": { "hashes": [ - "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b", - "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7" + "sha256:31d4583c4ed539cd037956140d695e42c033a19e984bfce9964a3f7d59bc2b40", + "sha256:f90ef520d95e7c46951105338d918664ebfd6f1d995bd7d153127ce90efafa6a" ], - "version": "==2023.3.post1" + "version": "==2023.4" }, "pytzdata": { "hashes": [ @@ -2070,11 +2044,11 @@ }, "uvicorn": { "hashes": [ - "sha256:890b00f6c537d58695d3bb1f28e23db9d9e7a17cbcc76d7457c499935f933e24", - "sha256:c855578045d45625fd027367f7653d249f7c49f9361ba15cf9624186b26b8eb6" + "sha256:4b85ba02b8a20429b9b205d015cbeb788a12da527f731811b643fd739ef90d5f", + "sha256:54898fcd80c13ff1cd28bf77b04ec9dbd8ff60c5259b499b4b12bb0917f22907" ], "markers": "python_version >= '3.8'", - "version": "==0.27.0" + "version": "==0.27.0.post1" }, "webencodings": { "hashes": [ @@ -2386,6 +2360,14 @@ "markers": "python_version >= '3.7'", "version": "==23.2.0" }, + "babel": { + "hashes": [ + "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363", + "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287" + ], + "markers": "python_version >= '3.7'", + "version": "==2.14.0" + }, "black": { "hashes": [ "sha256:0269dfdea12442022e88043d2910429bed717b2d04523867a85dacce535916b8", @@ -2417,19 +2399,19 @@ }, "boto3": { "hashes": [ - "sha256:34b2b404bd2bec869ec2fc6aeeeeb884c72a9b895e2c7716b95381ab8deb9069", - "sha256:50776db195a73533f4f2c9d000c69f9d0e9fb9810f9f81584adc283e9516ad0d" + "sha256:0d800130e43a5d4e71300cc6f91aabcef6fe6f26bc206bc61374bf695049587a", + "sha256:c4dec7ea9bc9210ec783d39b56d332f5a266b0d1e31a96c5092f6bd5252361ba" ], "markers": "python_version >= '3.8'", - "version": "==1.34.29" + "version": "==1.34.31" }, "botocore": { "hashes": [ - "sha256:34223fdb8ebd47d1fce5724bb1bcb164e81853ea9ca532b50639c749fc347458", - "sha256:44d918b91a1c1085d99266f8bf6ecc087c8a73a8efbb8e829f0c2dcd1ddf9963" + "sha256:6ee1ba451ce3d640dccd485906f68a55d9e7f3534553876e4adc75d6060a05ac", + "sha256:d5a2153dbe9687f510f179e03913bc9b4e266c865cabebe440c4d05ab923faa7" ], "markers": "python_version >= '3.8'", - "version": "==1.34.29" + "version": "==1.34.31" }, "cachetools": { "hashes": [ @@ -2659,41 +2641,41 @@ }, "cryptography": { "hashes": [ - "sha256:0b7cacc142260ada944de070ce810c3e2a438963ee3deb45aa26fd2cee94c9a4", - "sha256:126e0ba3cc754b200a2fb88f67d66de0d9b9e94070c5bc548318c8dab6383cb6", - "sha256:160fa08dfa6dca9cb8ad9bd84e080c0db6414ba5ad9a7470bc60fb154f60111e", - "sha256:16b9260d04a0bfc8952b00335ff54f471309d3eb9d7e8dbfe9b0bd9e26e67881", - "sha256:25ec6e9e81de5d39f111a4114193dbd39167cc4bbd31c30471cebedc2a92c323", - "sha256:265bdc693570b895eb641410b8fc9e8ddbce723a669236162b9d9cfb70bd8d77", - "sha256:2dff7a32880a51321f5de7869ac9dde6b1fca00fc1fef89d60e93f215468e824", - "sha256:2fe16624637d6e3e765530bc55caa786ff2cbca67371d306e5d0a72e7c3d0407", - "sha256:32ea63ceeae870f1a62e87f9727359174089f7b4b01e4999750827bf10e15d60", - "sha256:351db02c1938c8e6b1fee8a78d6b15c5ccceca7a36b5ce48390479143da3b411", - "sha256:430100abed6d3652208ae1dd410c8396213baee2e01a003a4449357db7dc9e14", - "sha256:4d84673c012aa698555d4710dcfe5f8a0ad76ea9dde8ef803128cc669640a2e0", - "sha256:50aecd93676bcca78379604ed664c45da82bc1241ffb6f97f6b7392ed5bc6f04", - "sha256:6ac8924085ed8287545cba89dc472fc224c10cc634cdf2c3e2866fe868108e77", - "sha256:6bfd823b336fdcd8e06285ae8883d3d2624d3bdef312a0e2ef905f332f8e9302", - "sha256:727387886c9c8de927c360a396c5edcb9340d9e960cda145fca75bdafdabd24c", - "sha256:7911586fc69d06cd0ab3f874a169433db1bc2f0e40988661408ac06c4527a986", - "sha256:802d6f83233cf9696b59b09eb067e6b4d5ae40942feeb8e13b213c8fad47f1aa", - "sha256:8d7efb6bf427d2add2f40b6e1e8e476c17508fa8907234775214b153e69c2e11", - "sha256:9544492e8024f29919eac2117edd8c950165e74eb551a22c53f6fdf6ba5f4cb8", - "sha256:95d900d19a370ae36087cc728e6e7be9c964ffd8cbcb517fd1efb9c9284a6abc", - "sha256:9d61fcdf37647765086030d81872488e4cb3fafe1d2dda1d487875c3709c0a49", - "sha256:ab6b302d51fbb1dd339abc6f139a480de14d49d50f65fdc7dff782aa8631d035", - "sha256:b512f33c6ab195852595187af5440d01bb5f8dd57cb7a91e1e009a17f1b7ebca", - "sha256:cb2861a9364fa27d24832c718150fdbf9ce6781d7dc246a516435f57cfa31fe7", - "sha256:d3594947d2507d4ef7a180a7f49a6db41f75fb874c2fd0e94f36b89bfd678bf2", - "sha256:d3902c779a92151f134f68e555dd0b17c658e13429f270d8a847399b99235a3f", - "sha256:d50718dd574a49d3ef3f7ef7ece66ef281b527951eb2267ce570425459f6a404", - "sha256:e5edf189431b4d51f5c6fb4a95084a75cef6b4646c934eb6e32304fc720e1453", - "sha256:e6edc3a568667daf7d349d7e820783426ee4f1c0feab86c29bd1d6fe2755e009", - "sha256:ed1b2130f5456a09a134cc505a17fc2830a1a48ed53efd37dcc904a23d7b82fa", - "sha256:fd33f53809bb363cf126bebe7a99d97735988d9b0131a2be59fbf83e1259a5b7" + "sha256:087887e55e0b9c8724cf05361357875adb5c20dec27e5816b653492980d20380", + "sha256:09a77e5b2e8ca732a19a90c5bca2d124621a1edb5438c5daa2d2738bfeb02589", + "sha256:130c0f77022b2b9c99d8cebcdd834d81705f61c68e91ddd614ce74c657f8b3ea", + "sha256:141e2aa5ba100d3788c0ad7919b288f89d1fe015878b9659b307c9ef867d3a65", + "sha256:28cb2c41f131a5758d6ba6a0504150d644054fd9f3203a1e8e8d7ac3aea7f73a", + "sha256:2f9f14185962e6a04ab32d1abe34eae8a9001569ee4edb64d2304bf0d65c53f3", + "sha256:320948ab49883557a256eab46149df79435a22d2fefd6a66fe6946f1b9d9d008", + "sha256:36d4b7c4be6411f58f60d9ce555a73df8406d484ba12a63549c88bd64f7967f1", + "sha256:3b15c678f27d66d247132cbf13df2f75255627bcc9b6a570f7d2fd08e8c081d2", + "sha256:3dbd37e14ce795b4af61b89b037d4bc157f2cb23e676fa16932185a04dfbf635", + "sha256:4383b47f45b14459cab66048d384614019965ba6c1a1a141f11b5a551cace1b2", + "sha256:44c95c0e96b3cb628e8452ec060413a49002a247b2b9938989e23a2c8291fc90", + "sha256:4b063d3413f853e056161eb0c7724822a9740ad3caa24b8424d776cebf98e7ee", + "sha256:52ed9ebf8ac602385126c9a2fe951db36f2cb0c2538d22971487f89d0de4065a", + "sha256:55d1580e2d7e17f45d19d3b12098e352f3a37fe86d380bf45846ef257054b242", + "sha256:5ef9bc3d046ce83c4bbf4c25e1e0547b9c441c01d30922d812e887dc5f125c12", + "sha256:5fa82a26f92871eca593b53359c12ad7949772462f887c35edaf36f87953c0e2", + "sha256:61321672b3ac7aade25c40449ccedbc6db72c7f5f0fdf34def5e2f8b51ca530d", + "sha256:701171f825dcab90969596ce2af253143b93b08f1a716d4b2a9d2db5084ef7be", + "sha256:841ec8af7a8491ac76ec5a9522226e287187a3107e12b7d686ad354bb78facee", + "sha256:8a06641fb07d4e8f6c7dda4fc3f8871d327803ab6542e33831c7ccfdcb4d0ad6", + "sha256:8e88bb9eafbf6a4014d55fb222e7360eef53e613215085e65a13290577394529", + "sha256:a00aee5d1b6c20620161984f8ab2ab69134466c51f58c052c11b076715e72929", + "sha256:a047682d324ba56e61b7ea7c7299d51e61fd3bca7dad2ccc39b72bd0118d60a1", + "sha256:a7ef8dd0bf2e1d0a27042b231a3baac6883cdd5557036f5e8df7139255feaac6", + "sha256:ad28cff53f60d99a928dfcf1e861e0b2ceb2bc1f08a074fdd601b314e1cc9e0a", + "sha256:b9097a208875fc7bbeb1286d0125d90bdfed961f61f214d3f5be62cd4ed8a446", + "sha256:b97fe7d7991c25e6a31e5d5e795986b18fbbb3107b873d5f3ae6dc9a103278e9", + "sha256:e0ec52ba3c7f1b7d813cd52649a5b3ef1fc0d433219dc8c93827c57eab6cf888", + "sha256:ea2c3ffb662fec8bbbfce5602e2c159ff097a4631d96235fcf0fb00e59e3ece4", + "sha256:fa3dec4ba8fb6e662770b74f62f1a0c7d4e37e25b58b2bf2c1be4c95372b4a33", + "sha256:fbeb725c9dc799a574518109336acccaf1303c30d45c075c665c0793c2f79a7f" ], "markers": "python_version >= '3.7'", - "version": "==42.0.1" + "version": "==42.0.2" }, "dateparser": { "hashes": [ @@ -2741,6 +2723,21 @@ ], "version": "==2.1.0.post1" }, + "essentials": { + "hashes": [ + "sha256:8736f738bb2c51d5069b2de2cf9146f7d402f25f9f95636781e59a422c908c46", + "sha256:905fa4a69fcd2b2cf41ecc6cc65827e30c87ef91f3f5c71540bcc5e984fa8360" + ], + "version": "==1.1.5" + }, + "essentials-openapi": { + "hashes": [ + "sha256:1431e98ef0a442f1919fd9833385bf44d832c355fd05919dc06d43d4da0f8ef4", + "sha256:ebc46aac41c0b917a658f77caaa0ca93a6e4a4519de8a272f82c1538ccd5619f" + ], + "markers": "python_version >= '3.8'", + "version": "==1.0.9" + }, "filelock": { "hashes": [ "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e", @@ -2766,6 +2763,13 @@ "markers": "python_version >= '3.8'", "version": "==2023.12.2" }, + "ghp-import": { + "hashes": [ + "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", + "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343" + ], + "version": "==2.1.0" + }, "google-auth": { "hashes": [ "sha256:8e4bad367015430ff253fe49d500fdc3396c1a434db5740828c728e45bcce245", @@ -2855,11 +2859,11 @@ }, "griffe": { "hashes": [ - "sha256:6ce4ecffcf0d2f96362c5974b3f7df812da8f8d4cfcc5ebc8202ef72656fc087", - "sha256:ead8dfede6e6531cce6bf69090a4f3c6d36fdf923c43f8e85aa530552cef0c09" + "sha256:76c4439eaa2737af46ae003c331ab6ca79c5365b552f7b5aed263a3b4125735b", + "sha256:db1da6d1d8e08cbb20f1a7dee8c09da940540c2d4c1bfa26a9091cf6fc36a9ec" ], "markers": "python_version >= '3.8'", - "version": "==0.39.1" + "version": "==0.40.0" }, "h11": { "hashes": [ @@ -3013,11 +3017,11 @@ }, "mako": { "hashes": [ - "sha256:57d4e997349f1a92035aa25c17ace371a4213f2ca42f99bee9a602500cfd54d9", - "sha256:e3a9d388fd00e87043edbe8792f45880ac0114e9c4adc69f6e9bfb2c55e3b11b" + "sha256:2a0c8ad7f6274271b3bb7467dd37cf9cc6dab4bc19cb69a4ef10669402de698e", + "sha256:32a99d70754dfce237019d17ffe4a282d2d3351b9c476e90d8a60e63f133b80c" ], "markers": "python_version >= '3.8'", - "version": "==1.3.0" + "version": "==1.3.2" }, "markdown": { "hashes": [ @@ -3117,6 +3121,40 @@ "markers": "python_version >= '3.7'", "version": "==0.1.2" }, + "mergedeep": { + "hashes": [ + "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", + "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307" + ], + "markers": "python_version >= '3.6'", + "version": "==1.3.4" + }, + "mkdocs": { + "hashes": [ + "sha256:3b3a78e736b31158d64dbb2f8ba29bd46a379d0c6e324c2246c3bc3d2189cfc1", + "sha256:eb7c99214dcb945313ba30426c2451b735992c73c2e10838f76d09e39ff4d0e2" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==1.5.3" + }, + "mkdocs-material": { + "hashes": [ + "sha256:5b24df36d8ac6cecd611241ce6f6423ccde3e1ad89f8360c3f76d5565fc2d82a", + "sha256:e115b90fccf5cd7f5d15b0c2f8e6246b21041628b8f590630e7fca66ed7fcf6c" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==9.5.6" + }, + "mkdocs-material-extensions": { + "hashes": [ + "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", + "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31" + ], + "markers": "python_version >= '3.8'", + "version": "==1.3.1" + }, "moto": { "extras": [ "s3" @@ -3136,6 +3174,15 @@ "markers": "python_version >= '3.5'", "version": "==1.0.0" }, + "neoteroi-mkdocs": { + "hashes": [ + "sha256:3825bcecc4b2c7755ef6adbf96d754762dafd76db508fdd3a23533c88e744228", + "sha256:ed2b93a206173b10cd5635e050ce0d8e83df0e51cfd5ee6d41751bfcaa4fe197" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==1.0.4" + }, "nodeenv": { "hashes": [ "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2", @@ -3216,6 +3263,12 @@ "markers": "python_version >= '3.7'", "version": "==23.2" }, + "paginate": { + "hashes": [ + "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d" + ], + "version": "==0.5.6" + }, "pathspec": { "hashes": [ "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", @@ -3262,11 +3315,11 @@ }, "platformdirs": { "hashes": [ - "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380", - "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420" + "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068", + "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768" ], "markers": "python_version >= '3.8'", - "version": "==4.1.0" + "version": "==4.2.0" }, "pluggy": { "hashes": [ @@ -3287,12 +3340,12 @@ }, "prefect": { "hashes": [ - "sha256:c0f8fb8ae64b1f3b59f8fda68982519cb21dc10ddb5636640c4cfa17a8eda2c6", - "sha256:e1c2283bc065ea6f0343fe0811b89198828ee69aacf3139c0a415cce0e00d6b8" + "sha256:36868cf84d9621d8140492ab94ea19e44b88f82edd65c048a8a4ede0fc46d71d", + "sha256:b06df359a77fb684db1dd99f52f0c719d5f8148104ef8613f1ebfd4b7b25eaee" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==2.14.17" + "version": "==2.14.18" }, "prefect-github": { "hashes": [ @@ -3363,122 +3416,96 @@ "email" ], "hashes": [ - "sha256:b3ef57c62535b0941697cce638c08900d87fcb67e29cfa99e8a68f747f393f7a", - "sha256:d0caf5954bee831b6bfe7e338c32b9e30c85dfe080c843680783ac2b631673b4" + "sha256:1440966574e1b5b99cf75a13bec7b20e3512e8a61b894ae252f56275e2c465ae", + "sha256:ae887bd94eb404b09d86e4d12f93893bdca79d766e738528c6fa1c849f3c6bcf" ], - "markers": "python_version >= '3.7'", - "version": "==2.5.3" + "markers": "python_version >= '3.8'", + "version": "==2.6.0" }, "pydantic-core": { "hashes": [ - "sha256:00646784f6cd993b1e1c0e7b0fdcbccc375d539db95555477771c27555e3c556", - "sha256:00b1087dabcee0b0ffd104f9f53d7d3eaddfaa314cdd6726143af6bc713aa27e", - "sha256:0348b1dc6b76041516e8a854ff95b21c55f5a411c3297d2ca52f5528e49d8411", - "sha256:036137b5ad0cb0004c75b579445a1efccd072387a36c7f217bb8efd1afbe5245", - "sha256:095b707bb287bfd534044166ab767bec70a9bba3175dcdc3371782175c14e43c", - "sha256:0c08de15d50fa190d577e8591f0329a643eeaed696d7771760295998aca6bc66", - "sha256:1302a54f87b5cd8528e4d6d1bf2133b6aa7c6122ff8e9dc5220fbc1e07bffebd", - "sha256:172de779e2a153d36ee690dbc49c6db568d7b33b18dc56b69a7514aecbcf380d", - "sha256:1b027c86c66b8627eb90e57aee1f526df77dc6d8b354ec498be9a757d513b92b", - "sha256:1ce830e480f6774608dedfd4a90c42aac4a7af0a711f1b52f807130c2e434c06", - "sha256:1fd0c1d395372843fba13a51c28e3bb9d59bd7aebfeb17358ffaaa1e4dbbe948", - "sha256:23598acb8ccaa3d1d875ef3b35cb6376535095e9405d91a3d57a8c7db5d29341", - "sha256:24368e31be2c88bd69340fbfe741b405302993242ccb476c5c3ff48aeee1afe0", - "sha256:26a92ae76f75d1915806b77cf459811e772d8f71fd1e4339c99750f0e7f6324f", - "sha256:27e524624eace5c59af499cd97dc18bb201dc6a7a2da24bfc66ef151c69a5f2a", - "sha256:2b8719037e570639e6b665a4050add43134d80b687288ba3ade18b22bbb29dd2", - "sha256:2c5bcf3414367e29f83fd66f7de64509a8fd2368b1edf4351e862910727d3e51", - "sha256:2dbe357bc4ddda078f79d2a36fc1dd0494a7f2fad83a0a684465b6f24b46fe80", - "sha256:2f5fa187bde8524b1e37ba894db13aadd64faa884657473b03a019f625cee9a8", - "sha256:2f6ffc6701a0eb28648c845f4945a194dc7ab3c651f535b81793251e1185ac3d", - "sha256:314ccc4264ce7d854941231cf71b592e30d8d368a71e50197c905874feacc8a8", - "sha256:36026d8f99c58d7044413e1b819a67ca0e0b8ebe0f25e775e6c3d1fabb3c38fb", - "sha256:36099c69f6b14fc2c49d7996cbf4f87ec4f0e66d1c74aa05228583225a07b590", - "sha256:36fa402dcdc8ea7f1b0ddcf0df4254cc6b2e08f8cd80e7010d4c4ae6e86b2a87", - "sha256:370ffecb5316ed23b667d99ce4debe53ea664b99cc37bfa2af47bc769056d534", - "sha256:3860c62057acd95cc84044e758e47b18dcd8871a328ebc8ccdefd18b0d26a21b", - "sha256:399ac0891c284fa8eb998bcfa323f2234858f5d2efca3950ae58c8f88830f145", - "sha256:3a0b5db001b98e1c649dd55afa928e75aa4087e587b9524a4992316fa23c9fba", - "sha256:3dcf1978be02153c6a31692d4fbcc2a3f1db9da36039ead23173bc256ee3b91b", - "sha256:4241204e4b36ab5ae466ecec5c4c16527a054c69f99bba20f6f75232a6a534e2", - "sha256:438027a975cc213a47c5d70672e0d29776082155cfae540c4e225716586be75e", - "sha256:43e166ad47ba900f2542a80d83f9fc65fe99eb63ceec4debec160ae729824052", - "sha256:478e9e7b360dfec451daafe286998d4a1eeaecf6d69c427b834ae771cad4b622", - "sha256:4ce8299b481bcb68e5c82002b96e411796b844d72b3e92a3fbedfe8e19813eab", - "sha256:4f86f1f318e56f5cbb282fe61eb84767aee743ebe32c7c0834690ebea50c0a6b", - "sha256:55a23dcd98c858c0db44fc5c04fc7ed81c4b4d33c653a7c45ddaebf6563a2f66", - "sha256:599c87d79cab2a6a2a9df4aefe0455e61e7d2aeede2f8577c1b7c0aec643ee8e", - "sha256:5aa90562bc079c6c290f0512b21768967f9968e4cfea84ea4ff5af5d917016e4", - "sha256:64634ccf9d671c6be242a664a33c4acf12882670b09b3f163cd00a24cffbd74e", - "sha256:667aa2eac9cd0700af1ddb38b7b1ef246d8cf94c85637cbb03d7757ca4c3fdec", - "sha256:6a31d98c0d69776c2576dda4b77b8e0c69ad08e8b539c25c7d0ca0dc19a50d6c", - "sha256:6af4b3f52cc65f8a0bc8b1cd9676f8c21ef3e9132f21fed250f6958bd7223bed", - "sha256:6c8edaea3089bf908dd27da8f5d9e395c5b4dc092dbcce9b65e7156099b4b937", - "sha256:71d72ca5eaaa8d38c8df16b7deb1a2da4f650c41b58bb142f3fb75d5ad4a611f", - "sha256:72f9a942d739f09cd42fffe5dc759928217649f070056f03c70df14f5770acf9", - "sha256:747265448cb57a9f37572a488a57d873fd96bf51e5bb7edb52cfb37124516da4", - "sha256:75ec284328b60a4e91010c1acade0c30584f28a1f345bc8f72fe8b9e46ec6a96", - "sha256:78d0768ee59baa3de0f4adac9e3748b4b1fffc52143caebddfd5ea2961595277", - "sha256:78ee52ecc088c61cce32b2d30a826f929e1708f7b9247dc3b921aec367dc1b23", - "sha256:7be719e4d2ae6c314f72844ba9d69e38dff342bc360379f7c8537c48e23034b7", - "sha256:7e1f4744eea1501404b20b0ac059ff7e3f96a97d3e3f48ce27a139e053bb370b", - "sha256:7e90d6cc4aad2cc1f5e16ed56e46cebf4877c62403a311af20459c15da76fd91", - "sha256:7ebe3416785f65c28f4f9441e916bfc8a54179c8dea73c23023f7086fa601c5d", - "sha256:7f41533d7e3cf9520065f610b41ac1c76bc2161415955fbcead4981b22c7611e", - "sha256:7f5025db12fc6de7bc1104d826d5aee1d172f9ba6ca936bf6474c2148ac336c1", - "sha256:86c963186ca5e50d5c8287b1d1c9d3f8f024cbe343d048c5bd282aec2d8641f2", - "sha256:86ce5fcfc3accf3a07a729779d0b86c5d0309a4764c897d86c11089be61da160", - "sha256:8a14c192c1d724c3acbfb3f10a958c55a2638391319ce8078cb36c02283959b9", - "sha256:8b93785eadaef932e4fe9c6e12ba67beb1b3f1e5495631419c784ab87e975670", - "sha256:8ed1af8692bd8d2a29d702f1a2e6065416d76897d726e45a1775b1444f5928a7", - "sha256:92879bce89f91f4b2416eba4429c7b5ca22c45ef4a499c39f0c5c69257522c7c", - "sha256:94fc0e6621e07d1e91c44e016cc0b189b48db053061cc22d6298a611de8071bb", - "sha256:982487f8931067a32e72d40ab6b47b1628a9c5d344be7f1a4e668fb462d2da42", - "sha256:9862bf828112e19685b76ca499b379338fd4c5c269d897e218b2ae8fcb80139d", - "sha256:99b14dbea2fdb563d8b5a57c9badfcd72083f6006caf8e126b491519c7d64ca8", - "sha256:9c6a5c79b28003543db3ba67d1df336f253a87d3112dac3a51b94f7d48e4c0e1", - "sha256:a19b794f8fe6569472ff77602437ec4430f9b2b9ec7a1105cfd2232f9ba355e6", - "sha256:a306cdd2ad3a7d795d8e617a58c3a2ed0f76c8496fb7621b6cd514eb1532cae8", - "sha256:a3dde6cac75e0b0902778978d3b1646ca9f438654395a362cb21d9ad34b24acf", - "sha256:a874f21f87c485310944b2b2734cd6d318765bcbb7515eead33af9641816506e", - "sha256:a983cca5ed1dd9a35e9e42ebf9f278d344603bfcb174ff99a5815f953925140a", - "sha256:aca48506a9c20f68ee61c87f2008f81f8ee99f8d7f0104bff3c47e2d148f89d9", - "sha256:b2602177668f89b38b9f84b7b3435d0a72511ddef45dc14446811759b82235a1", - "sha256:b3e5fe4538001bb82e2295b8d2a39356a84694c97cb73a566dc36328b9f83b40", - "sha256:b6ca36c12a5120bad343eef193cc0122928c5c7466121da7c20f41160ba00ba2", - "sha256:b89f4477d915ea43b4ceea6756f63f0288941b6443a2b28c69004fe07fde0d0d", - "sha256:b9a9d92f10772d2a181b5ca339dee066ab7d1c9a34ae2421b2a52556e719756f", - "sha256:c99462ffc538717b3e60151dfaf91125f637e801f5ab008f81c402f1dff0cd0f", - "sha256:cb92f9061657287eded380d7dc455bbf115430b3aa4741bdc662d02977e7d0af", - "sha256:cdee837710ef6b56ebd20245b83799fce40b265b3b406e51e8ccc5b85b9099b7", - "sha256:cf10b7d58ae4a1f07fccbf4a0a956d705356fea05fb4c70608bb6fa81d103cda", - "sha256:d15687d7d7f40333bd8266f3814c591c2e2cd263fa2116e314f60d82086e353a", - "sha256:d5c28525c19f5bb1e09511669bb57353d22b94cf8b65f3a8d141c389a55dec95", - "sha256:d5f916acf8afbcab6bacbb376ba7dc61f845367901ecd5e328fc4d4aef2fcab0", - "sha256:dab03ed811ed1c71d700ed08bde8431cf429bbe59e423394f0f4055f1ca0ea60", - "sha256:db453f2da3f59a348f514cfbfeb042393b68720787bbef2b4c6068ea362c8149", - "sha256:de2a0645a923ba57c5527497daf8ec5df69c6eadf869e9cd46e86349146e5975", - "sha256:dea7fcd62915fb150cdc373212141a30037e11b761fbced340e9db3379b892d4", - "sha256:dfcbebdb3c4b6f739a91769aea5ed615023f3c88cb70df812849aef634c25fbe", - "sha256:dfcebb950aa7e667ec226a442722134539e77c575f6cfaa423f24371bb8d2e94", - "sha256:e0641b506486f0b4cd1500a2a65740243e8670a2549bb02bc4556a83af84ae03", - "sha256:e33b0834f1cf779aa839975f9d8755a7c2420510c0fa1e9fa0497de77cd35d2c", - "sha256:e4ace1e220b078c8e48e82c081e35002038657e4b37d403ce940fa679e57113b", - "sha256:e4cf2d5829f6963a5483ec01578ee76d329eb5caf330ecd05b3edd697e7d768a", - "sha256:e574de99d735b3fc8364cba9912c2bec2da78775eba95cbb225ef7dda6acea24", - "sha256:e646c0e282e960345314f42f2cea5e0b5f56938c093541ea6dbf11aec2862391", - "sha256:e8a5ac97ea521d7bde7621d86c30e86b798cdecd985723c4ed737a2aa9e77d0c", - "sha256:eedf97be7bc3dbc8addcef4142f4b4164066df0c6f36397ae4aaed3eb187d8ab", - "sha256:ef633add81832f4b56d3b4c9408b43d530dfca29e68fb1b797dcb861a2c734cd", - "sha256:f27207e8ca3e5e021e2402ba942e5b4c629718e665c81b8b306f3c8b1ddbb786", - "sha256:f85f3843bdb1fe80e8c206fe6eed7a1caeae897e496542cee499c374a85c6e08", - "sha256:f8e81e4b55930e5ffab4a68db1af431629cf2e4066dbdbfef65348b8ab804ea8", - "sha256:f96ae96a060a8072ceff4cfde89d261837b4294a4f28b84a28765470d502ccc6", - "sha256:fd9e98b408384989ea4ab60206b8e100d8687da18b5c813c11e92fd8212a98e0", - "sha256:ffff855100bc066ff2cd3aa4a60bc9534661816b110f0243e59503ec2df38421" + "sha256:06f0d5a1d9e1b7932477c172cc720b3b23c18762ed7a8efa8398298a59d177c7", + "sha256:07982b82d121ed3fc1c51faf6e8f57ff09b1325d2efccaa257dd8c0dd937acca", + "sha256:0f478ec204772a5c8218e30eb813ca43e34005dff2eafa03931b3d8caef87d51", + "sha256:102569d371fadc40d8f8598a59379c37ec60164315884467052830b28cc4e9da", + "sha256:10dca874e35bb60ce4f9f6665bfbfad050dd7573596608aeb9e098621ac331dc", + "sha256:150ba5c86f502c040b822777e2e519b5625b47813bd05f9273a8ed169c97d9ae", + "sha256:1661c668c1bb67b7cec96914329d9ab66755911d093bb9063c4c8914188af6d4", + "sha256:1a2fe7b00a49b51047334d84aafd7e39f80b7675cad0083678c58983662da89b", + "sha256:1ae8048cba95f382dba56766525abca438328455e35c283bb202964f41a780b0", + "sha256:20f724a023042588d0f4396bbbcf4cffd0ddd0ad3ed4f0d8e6d4ac4264bae81e", + "sha256:2133b0e412a47868a358713287ff9f9a328879da547dc88be67481cdac529118", + "sha256:21e3298486c4ea4e4d5cc6fb69e06fb02a4e22089304308817035ac006a7f506", + "sha256:21ebaa4bf6386a3b22eec518da7d679c8363fb7fb70cf6972161e5542f470798", + "sha256:23632132f1fd608034f1a56cc3e484be00854db845b3a4a508834be5a6435a6f", + "sha256:2d5bea8012df5bb6dda1e67d0563ac50b7f64a5d5858348b5c8cb5043811c19d", + "sha256:300616102fb71241ff477a2cbbc847321dbec49428434a2f17f37528721c4948", + "sha256:30a8259569fbeec49cfac7fda3ec8123486ef1b729225222f0d41d5f840b476f", + "sha256:399166f24c33a0c5759ecc4801f040dbc87d412c1a6d6292b2349b4c505effc9", + "sha256:3fac641bbfa43d5a1bed99d28aa1fded1984d31c670a95aac1bf1d36ac6ce137", + "sha256:42c29d54ed4501a30cd71015bf982fa95e4a60117b44e1a200290ce687d3e640", + "sha256:462d599299c5971f03c676e2b63aa80fec5ebc572d89ce766cd11ca8bcb56f3f", + "sha256:4eebbd049008eb800f519578e944b8dc8e0f7d59a5abb5924cc2d4ed3a1834ff", + "sha256:502c062a18d84452858f8aea1e520e12a4d5228fc3621ea5061409d666ea1706", + "sha256:5317c04349472e683803da262c781c42c5628a9be73f4750ac7d13040efb5d2d", + "sha256:5511f962dd1b9b553e9534c3b9c6a4b0c9ded3d8c2be96e61d56f933feef9e1f", + "sha256:561be4e3e952c2f9056fba5267b99be4ec2afadc27261505d4992c50b33c513c", + "sha256:601d3e42452cd4f2891c13fa8c70366d71851c1593ed42f57bf37f40f7dca3c8", + "sha256:644904600c15816a1f9a1bafa6aab0d21db2788abcdf4e2a77951280473f33e1", + "sha256:653a5dfd00f601a0ed6654a8b877b18d65ac32c9d9997456e0ab240807be6cf7", + "sha256:694a5e9f1f2c124a17ff2d0be613fd53ba0c26de588eb4bdab8bca855e550d95", + "sha256:71b4a48a7427f14679f0015b13c712863d28bb1ab700bd11776a5368135c7d60", + "sha256:72bf9308a82b75039b8c8edd2be2924c352eda5da14a920551a8b65d5ee89253", + "sha256:735dceec50fa907a3c314b84ed609dec54b76a814aa14eb90da31d1d36873a5e", + "sha256:73802194f10c394c2bedce7a135ba1d8ba6cff23adf4217612bfc5cf060de34c", + "sha256:780daad9e35b18d10d7219d24bfb30148ca2afc309928e1d4d53de86822593dc", + "sha256:8655f55fe68c4685673265a650ef71beb2d31871c049c8b80262026f23605ee3", + "sha256:877045a7969ace04d59516d5d6a7dee13106822f99a5d8df5e6822941f7bedc8", + "sha256:87bce04f09f0552b66fca0c4e10da78d17cb0e71c205864bab4e9595122cb9d9", + "sha256:8d4dfc66abea3ec6d9f83e837a8f8a7d9d3a76d25c9911735c76d6745950e62c", + "sha256:8ec364e280db4235389b5e1e6ee924723c693cbc98e9d28dc1767041ff9bc388", + "sha256:8fa00fa24ffd8c31fac081bf7be7eb495be6d248db127f8776575a746fa55c95", + "sha256:920c4897e55e2881db6a6da151198e5001552c3777cd42b8a4c2f72eedc2ee91", + "sha256:920f4633bee43d7a2818e1a1a788906df5a17b7ab6fe411220ed92b42940f818", + "sha256:9795f56aa6b2296f05ac79d8a424e94056730c0b860a62b0fdcfe6340b658cc8", + "sha256:98f0edee7ee9cc7f9221af2e1b95bd02810e1c7a6d115cfd82698803d385b28f", + "sha256:99c095457eea8550c9fa9a7a992e842aeae1429dab6b6b378710f62bfb70b394", + "sha256:99d3a433ef5dc3021c9534a58a3686c88363c591974c16c54a01af7efd741f13", + "sha256:99f9a50b56713a598d33bc23a9912224fc5d7f9f292444e6664236ae471ddf17", + "sha256:9c46e556ee266ed3fb7b7a882b53df3c76b45e872fdab8d9cf49ae5e91147fd7", + "sha256:9f5d37ff01edcbace53a402e80793640c25798fb7208f105d87a25e6fcc9ea06", + "sha256:a0b4cfe408cd84c53bab7d83e4209458de676a6ec5e9c623ae914ce1cb79b96f", + "sha256:a497be217818c318d93f07e14502ef93d44e6a20c72b04c530611e45e54c2196", + "sha256:ac89ccc39cd1d556cc72d6752f252dc869dde41c7c936e86beac5eb555041b66", + "sha256:adf28099d061a25fbcc6531febb7a091e027605385de9fe14dd6a97319d614cf", + "sha256:afa01d25769af33a8dac0d905d5c7bb2d73c7c3d5161b2dd6f8b5b5eea6a3c4c", + "sha256:b1fc07896fc1851558f532dffc8987e526b682ec73140886c831d773cef44b76", + "sha256:b49c604ace7a7aa8af31196abbf8f2193be605db6739ed905ecaf62af31ccae0", + "sha256:b9f3e0bffad6e238f7acc20c393c1ed8fab4371e3b3bc311020dfa6020d99212", + "sha256:ba07646f35e4e49376c9831130039d1b478fbfa1215ae62ad62d2ee63cf9c18f", + "sha256:bd88f40f2294440d3f3c6308e50d96a0d3d0973d6f1a5732875d10f569acef49", + "sha256:c0be58529d43d38ae849a91932391eb93275a06b93b79a8ab828b012e916a206", + "sha256:c45f62e4107ebd05166717ac58f6feb44471ed450d07fecd90e5f69d9bf03c48", + "sha256:c56da23034fe66221f2208c813d8aa509eea34d97328ce2add56e219c3a9f41c", + "sha256:c94b5537bf6ce66e4d7830c6993152940a188600f6ae044435287753044a8fe2", + "sha256:cebf8d56fee3b08ad40d332a807ecccd4153d3f1ba8231e111d9759f02edfd05", + "sha256:d0bf6f93a55d3fa7a079d811b29100b019784e2ee6bc06b0bb839538272a5610", + "sha256:d195add190abccefc70ad0f9a0141ad7da53e16183048380e688b466702195dd", + "sha256:d25ef0c33f22649b7a088035fd65ac1ce6464fa2876578df1adad9472f918a76", + "sha256:d6cbdf12ef967a6aa401cf5cdf47850559e59eedad10e781471c960583f25aa1", + "sha256:d8c032ccee90b37b44e05948b449a2d6baed7e614df3d3f47fe432c952c21b60", + "sha256:daff04257b49ab7f4b3f73f98283d3dbb1a65bf3500d55c7beac3c66c310fe34", + "sha256:e83ebbf020be727d6e0991c1b192a5c2e7113eb66e3def0cd0c62f9f266247e4", + "sha256:ed3025a8a7e5a59817b7494686d449ebfbe301f3e757b852c8d0d1961d6be864", + "sha256:f1936ef138bed2165dd8573aa65e3095ef7c2b6247faccd0e15186aabdda7f66", + "sha256:f5247a3d74355f8b1d780d0f3b32a23dd9f6d3ff43ef2037c6dcd249f35ecf4c", + "sha256:fa496cd45cda0165d597e9d6f01e36c33c9508f75cf03c0a650018c5048f578e", + "sha256:fb4363e6c9fc87365c2bc777a1f585a22f2f56642501885ffc7942138499bf54", + "sha256:fb4370b15111905bf8b5ba2129b926af9470f014cb0493a67d23e9d7a48348e8", + "sha256:fbec2af0ebafa57eb82c18c304b37c86a8abddf7022955d1742b3d5471a6339e" ], - "markers": "python_version >= '3.7'", - "version": "==2.14.6" + "markers": "python_version >= '3.8'", + "version": "==2.16.1" }, "pyflakes": { "hashes": [ @@ -3528,6 +3555,14 @@ "markers": "python_version >= '3.7'", "version": "==2.17.2" }, + "pymdown-extensions": { + "hashes": [ + "sha256:6ca215bc57bc12bf32b414887a68b810637d039124ed9b2e5bd3325cbb2c050c", + "sha256:c0d64d5cf62566f59e6b2b690a4095c931107c250a8c8e1351c1de5f6b036deb" + ], + "markers": "python_version >= '3.8'", + "version": "==10.7" + }, "pytest": { "hashes": [ "sha256:249b1b0864530ba251b7438274c4d251c58d868edaaec8762893ad4a0d71c36c", @@ -3564,10 +3599,10 @@ }, "pytz": { "hashes": [ - "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b", - "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7" + "sha256:31d4583c4ed539cd037956140d695e42c033a19e984bfce9964a3f7d59bc2b40", + "sha256:f90ef520d95e7c46951105338d918664ebfd6f1d995bd7d153127ce90efafa6a" ], - "version": "==2023.3.post1" + "version": "==2023.4" }, "pytzdata": { "hashes": [ @@ -3634,6 +3669,14 @@ "markers": "python_version >= '3.6'", "version": "==6.0.1" }, + "pyyaml-env-tag": { + "hashes": [ + "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb", + "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069" + ], + "markers": "python_version >= '3.6'", + "version": "==0.1" + }, "questionary": { "hashes": [ "sha256:8ab9a01d0b91b68444dff7f6652c1e754105533f083cbe27597c8110ecc230a2", @@ -4072,6 +4115,15 @@ "markers": "python_version >= '3.8'", "version": "==0.32.0.post1" }, + "tabulate": { + "hashes": [ + "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", + "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==0.9.0" + }, "termcolor": { "hashes": [ "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63", @@ -4208,11 +4260,11 @@ }, "uvicorn": { "hashes": [ - "sha256:890b00f6c537d58695d3bb1f28e23db9d9e7a17cbcc76d7457c499935f933e24", - "sha256:c855578045d45625fd027367f7653d249f7c49f9361ba15cf9624186b26b8eb6" + "sha256:4b85ba02b8a20429b9b205d015cbeb788a12da527f731811b643fd739ef90d5f", + "sha256:54898fcd80c13ff1cd28bf77b04ec9dbd8ff60c5259b499b4b12bb0917f22907" ], "markers": "python_version >= '3.8'", - "version": "==0.27.0" + "version": "==0.27.0.post1" }, "virtualenv": { "hashes": [ @@ -4222,6 +4274,39 @@ "markers": "python_version >= '3.7'", "version": "==20.25.0" }, + "watchdog": { + "hashes": [ + "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a", + "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100", + "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8", + "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc", + "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae", + "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41", + "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0", + "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f", + "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c", + "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9", + "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3", + "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709", + "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83", + "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759", + "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9", + "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3", + "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7", + "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f", + "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346", + "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674", + "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397", + "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96", + "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d", + "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a", + "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64", + "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44", + "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33" + ], + "markers": "python_version >= '3.7'", + "version": "==3.0.0" + }, "wcwidth": { "hashes": [ "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", diff --git a/docs/Datasets/Media Inventory.md b/docs/Datasets/Media Inventory.md new file mode 100644 index 0000000..e08db2b --- /dev/null +++ b/docs/Datasets/Media Inventory.md @@ -0,0 +1,35 @@ +# Media Inventory + +!!! warning + + **This dataset is currently private.** + +The Media Inventory is a collection of evidence files that were extracted from the [Oryx](./Oryx.md) dataset. + +## Sources + +- [Postimages](https://postimg.cc/) + +## Schema + + + +| Name | Type | Description | +|:----------------|:---------|:--------------------------------| +| url_hash | string | A SHA-256 hash of the `url`. | +| url | string | The URL to the evidence. | +| evidence_source | string | The source of the evidence. | +| media_key | string | The S3 Object Key to the media. | +| file_type | string | The file type/extension. | +| media_type | string | The media classification. | +| as_of_date | datetime | The date the row was generated. | + + + +## Examples + +Evidence is largely composed of JPEGs and PNGs. + +| JPEG | PNG | +| --- | --- | +| ![Example of an image in Oryx media dataset.](../_static/example-oryx-media.jpeg) | ![Example of an image in Oryx media dataset.](../_static/example-oryx-media.png) | diff --git a/docs/Datasets/Oryx.md b/docs/Datasets/Oryx.md new file mode 100644 index 0000000..ad96bf7 --- /dev/null +++ b/docs/Datasets/Oryx.md @@ -0,0 +1,74 @@ +# Oryx + +The Oryx dataset is a complete collection of the equipment losses in the Oryx database. The loss cases have been cleaned and transformed into JSON objects. + +## Sources + +- [Attack On Europe: Documenting Ukrainian Equipment Losses During The 2022 Russian Invasion Of Ukraine](https://www.oryxspioenkop.com/2022/02/attack-on-europe-documenting-ukrainian.html) +- [Attack On Europe: Documenting Russian Equipment Losses During The 2022 Russian Invasion Of Ukraine](https://www.oryxspioenkop.com/2022/02/attack-on-europe-documenting-equipment.html) +- [List Of Naval Losses During The Russian Invasion Of Ukraine](https://www.oryxspioenkop.com/2022/03/list-of-naval-losses-during-2022.html) +- [List Of Aircraft Losses During The Russian Invasion Of Ukraine](https://www.oryxspioenkop.com/2022/03/list-of-aircraft-losses-during-2022.html) + +## Schema + + + +| Name | Type | Description | +|:-------------------------------|:-------------|:-------------------------------------------------------------------------------------------------------------------------| +| country | string | The country that suffered the equipment loss. | +| category | string | The equipment category. | +| model | string | The equipment model. | +| url_hash | string | A SHA-256 hash of the `evidence_url`. | +| case_id | numeric | A special ID for discriminating equipment losses when their `country`, `category`, `model`, and `url_hash` are the same. | +| status | list(string) | The statuses of the equipment loss. | +| evidence_url | string | The URL to the evidence of the equipment loss. | +| country_of_production | string | The ISO Alpha-3 code of the country that produces the `model`. | +| country_of_production_flag_url | string | The URL to the flag of the country that produces the `model`. | +| evidence_source | string | The source of the evidence. | +| description | string | The Oryx description the equipment loss was extracted from. | +| id_ | numeric | The Oryx ID the equipment loss was labeled with. | +| as_of_date | datetime | The date the row was generated. | + + + +The `url_hash` is used as a file name and identifier for downloaded media from the [Media Inventory](./Media%20Inventory.md) dataset. + +## Examples + +```json +{ + "as_of_date": "2023-05-05T06:27:55.585531+00:00", + "case_id": 1, + "category": "Tanks", + "country": "Russia", + "country_of_production": "SUN", + "country_of_production_flag_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/Flag_of_the_Soviet_Union.svg/23px-Flag_of_the_Soviet_Union.svg.png", + "description": "1, captured", + "evidence_source": "postimg", + "evidence_url": "https://i.postimg.cc/yxw0SFD6/1001-T-62-Obr-1967-capt.jpg", + "id_": 1, + "model": "T-62 Obr. 1967", + "status": [ + "captured" + ], + "url_hash": "e32852f22ee32db27b3733229e1e518a67443adf4c6fc40ce60690f1ac6f3b6a" +} +``` + +The [Kaggle](https://www.kaggle.com/dominictarro/borderlands) dataset only contains the essential fields. + +```json +{ + "country": "Russia", + "category": "Aircraft", + "model": "Beriev A-50", + "url_hash": "b77d72f5bef846998d2b2be6226865a16cf3741f7fb5d6992dd77f93d31130bc", + "case_id": 1, + "status": [ + "destroyed" + ], + "evidence_url": "https://i.postimg.cc/g2Xg4dgw/1032-a50-awacs-destr-14-01-24.jpg", + "country_of_production": "SUN", + "evidence_source": "postimg" +} +``` diff --git a/docs/License.md b/docs/License.md new file mode 100644 index 0000000..d685469 --- /dev/null +++ b/docs/License.md @@ -0,0 +1,23 @@ +# License + +MIT License + +Copyright (c) 2023 dominictarro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/docs/Media Inventory.md b/docs/Media Inventory.md deleted file mode 100644 index 8d6df92..0000000 --- a/docs/Media Inventory.md +++ /dev/null @@ -1,40 +0,0 @@ -![Borderlands](https://raw.githubusercontent.com/dominictarro/Borderlands/719584af68326f8263f5935743d3c86cc62e2515/assets/borderlands%20soldier%20header.png) - - - - -The *Borderlands* project is a public collection of high-granularity datasets related to the Russo-Ukrainian War. - -*This dataset is currently private.* - - - -## Media Inventory - -The Media Inventory is a collection of evidence files that were extracted from the Oryx dataset. - -### Supported Sources - - - [Postimages](https://postimg.cc/) - -### Schema - -| Name | Type | Description | -| :--- | :--- | :----------- | -| url_hash | string | A SHA-256 hash of the `url`. | -| url | string | The URL to the evidence. | -| evidence_source | string | The source of the evidence. | -| media_key | string | The S3 Object Key to the media. | -| file_type | string | The file type/extension. | -| media_type | string | The media classification. | -| as_of_date | datetime | The date the row was generated. | - - - -### Evidence Media - -Evidence is largely composed of JPEGs and PNGs. - -| 1 | 2 | -| --- | --- | -| ![Example of an image in Oryx media dataset.](../assets/example%20oryx%20media.jpeg) | ![Example of an image in Oryx media dataset.](../assets/example%20oryx%20media.png) | diff --git a/docs/Oryx.md b/docs/Oryx.md deleted file mode 100644 index 01e0b67..0000000 --- a/docs/Oryx.md +++ /dev/null @@ -1,62 +0,0 @@ -![Borderlands](https://raw.githubusercontent.com/dominictarro/Borderlands/719584af68326f8263f5935743d3c86cc62e2515/assets/borderlands%20soldier%20header.png) - - - - - -The *Borderlands* project is a public collection of high-granularity datasets related to the Russo-Ukrainian War. - - - -## Oryx - -The Oryx dataset is a complete collection of the equipment losses in the Oryx database. The loss cases have been cleaned and transformed into JSON objects. - -### Sources - - - [Attack On Europe: Documenting Ukrainian Equipment Losses During The 2022 Russian Invasion Of Ukraine](https://www.oryxspioenkop.com/2022/02/attack-on-europe-documenting-ukrainian.html) - - [Attack On Europe: Documenting Russian Equipment Losses During The 2022 Russian Invasion Of Ukraine](https://www.oryxspioenkop.com/2022/02/attack-on-europe-documenting-equipment.html) - - [List Of Naval Losses During The Russian Invasion Of Ukraine](https://www.oryxspioenkop.com/2022/03/list-of-naval-losses-during-2022.html) - - [List Of Aircraft Losses During The Russian Invasion Of Ukraine](https://www.oryxspioenkop.com/2022/03/list-of-aircraft-losses-during-2022.html) - -### Schema - -| Name | Type | Description | -| :--- | :--- | :----------- | -| country | string | The country that suffered the equipment loss. | -| category | string | The equipment category. | -| model | string | The equipment model. | -| url_hash | string | A SHA-256 hash of the `evidence_url`. | -| case_id | numeric | A special ID for discriminating equipment losses when their `country`, `category`, `model`, and `url_hash` are the same. | -| status | list(string) | The statuses of the equipment loss. | -| evidence_url | string | The URL to the evidence of the equipment loss. | -| country_of_production | string | The ISO Alpha-3 code of the country that produces the `model`. | -| country_of_production_flag_url | string | The URL to the flag of the country that produces the `model`. | -| evidence_source | string | The source of the evidence. | -| description | string | The Oryx description the equipment loss was extracted from. | -| id_ | numeric | The Oryx ID the equipment loss was labeled with. | -| as_of_date | datetime | The date the row was generated. | - - - -### **Examples** - -```json -{ - "as_of_date": "2023-05-05T06:27:55.585531+00:00", - "case_id": 1, - "category": "Tanks", - "country": "Russia", - "country_of_production": "SUN", - "country_of_production_flag_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/Flag_of_the_Soviet_Union.svg/23px-Flag_of_the_Soviet_Union.svg.png", - "description": "1, captured", - "evidence_source": "postimg", - "evidence_url": "https://i.postimg.cc/yxw0SFD6/1001-T-62-Obr-1967-capt.jpg", - "id_": 1, - "model": "T-62 Obr. 1967", - "status": [ - "captured" - ], - "url_hash": "e32852f22ee32db27b3733229e1e518a67443adf4c6fc40ce60690f1ac6f3b6a" -} -``` diff --git a/docs/_static/bracket-curly.png b/docs/_static/bracket-curly.png new file mode 100644 index 0000000000000000000000000000000000000000..9f828420219f049685b7c133e26ece9beb615521 GIT binary patch literal 9386 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 literal 0 HcmV?d00001 diff --git a/docs/_static/cloud-computing.png b/docs/_static/cloud-computing.png new file mode 100644 index 0000000000000000000000000000000000000000..84263a47057f62e8e4699a3f8edca37cce77e3e4 GIT binary patch literal 14196 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 div { + min-width: 400px; + margin-right: 50px; +} +.nt-timeline.horizontal.reverse .nt-timeline-items { + flex-direction: row-reverse; +} +.nt-timeline.horizontal.center .nt-timeline-before { + background-image: linear-gradient(rgba(252, 70, 107, 0) 0%, rgb(252, 70, 107) 100%); + background-repeat: no-repeat; + background-size: 100% 2px; + background-position: 0 center; +} +.nt-timeline.horizontal.center .nt-timeline-after { + background-image: linear-gradient(180deg, rgb(252, 70, 107) 0%, rgba(252, 70, 107, 0) 100%); + background-repeat: no-repeat; + background-size: 100% 2px; + background-position: 0 center; +} +.nt-timeline.horizontal.center .nt-timeline-items { + background-image: radial-gradient(circle, rgb(63, 94, 251) 0%, rgb(252, 70, 107) 100%); + background-repeat: no-repeat; + background-size: 100% 2px; + background-position: 0 center; +} +.nt-timeline.horizontal .nt-timeline-dot { + left: 50%; +} +.nt-timeline.horizontal .nt-timeline-dot:not(.bigger) { + top: calc(50% - 4px); +} +.nt-timeline.horizontal .nt-timeline-dot.bigger { + top: calc(50% - 15px); +} +.nt-timeline.vertical .nt-timeline-items { + flex-direction: column; +} +.nt-timeline.vertical.reverse .nt-timeline-items { + flex-direction: column-reverse; +} +.nt-timeline.vertical.center .nt-timeline-before { + background: linear-gradient(rgba(252, 70, 107, 0) 0%, rgb(252, 70, 107) 100%) no-repeat center/2px 100%; +} +.nt-timeline.vertical.center .nt-timeline-after { + background: linear-gradient(rgb(252, 70, 107) 0%, rgba(252, 70, 107, 0) 100%) no-repeat center/2px 100%; +} +.nt-timeline.vertical.center .nt-timeline-items { + background: radial-gradient(circle, rgb(63, 94, 251) 0%, rgb(252, 70, 107) 100%) no-repeat center/2px 100%; +} +.nt-timeline.vertical.center .nt-timeline-dot { + left: calc(50% - 10px); +} +.nt-timeline.vertical.center .nt-timeline-dot:not(.bigger) { + top: 10px; +} +.nt-timeline.vertical.center .nt-timeline-dot.bigger { + left: calc(50% - 20px); +} +.nt-timeline.vertical.left { + padding-left: 100px; +} +.nt-timeline.vertical.left .nt-timeline-item { + padding-left: 70px; +} +.nt-timeline.vertical.left .nt-timeline-sub-title { + left: -100px; + width: 100px; +} +.nt-timeline.vertical.left .nt-timeline-before { + background: linear-gradient(rgba(252, 70, 107, 0) 0%, rgb(252, 70, 107) 100%) no-repeat 30px/2px 100%; +} +.nt-timeline.vertical.left .nt-timeline-after { + background: linear-gradient(rgb(252, 70, 107) 0%, rgba(252, 70, 107, 0) 100%) no-repeat 30px/2px 100%; +} +.nt-timeline.vertical.left .nt-timeline-items { + background: radial-gradient(circle, rgb(63, 94, 251) 0%, rgb(252, 70, 107) 100%) no-repeat 30px/2px 100%; +} +.nt-timeline.vertical.left .nt-timeline-dot { + left: 21px; + top: 8px; +} +.nt-timeline.vertical.left .nt-timeline-dot.bigger { + top: 0px; + left: 10px; +} +.nt-timeline.vertical.right { + padding-right: 100px; +} +.nt-timeline.vertical.right .nt-timeline-sub-title { + right: -100px; + text-align: left; + width: 100px; +} +.nt-timeline.vertical.right .nt-timeline-item { + padding-right: 70px; +} +.nt-timeline.vertical.right .nt-timeline-before { + background: linear-gradient(rgba(252, 70, 107, 0) 0%, rgb(252, 70, 107) 100%) no-repeat calc(100% - 30px)/2px 100%; +} +.nt-timeline.vertical.right .nt-timeline-after { + background: linear-gradient(rgb(252, 70, 107) 0%, rgba(252, 70, 107, 0) 100%) no-repeat calc(100% - 30px)/2px 100%; +} +.nt-timeline.vertical.right .nt-timeline-items { + background: radial-gradient(circle, rgb(63, 94, 251) 0%, rgb(252, 70, 107) 100%) no-repeat calc(100% - 30px)/2px 100%; +} +.nt-timeline.vertical.right .nt-timeline-dot { + right: 21px; + top: 8px; +} +.nt-timeline.vertical.right .nt-timeline-dot.bigger { + top: 10px; + right: 10px; +} + +.nt-timeline-items { + display: flex; + position: relative; +} +.nt-timeline-items > div { + min-height: 100px; + padding-top: 2px; + padding-bottom: 20px; +} + +.nt-timeline-before { + content: ""; + height: 15px; +} + +.nt-timeline-after { + content: ""; + height: 60px; + margin-bottom: 20px; +} + +.nt-timeline-sub-title { + position: absolute; + width: 50%; + top: 4px; + font-size: 18px; + color: var(--nt-color-50); +} + +[data-md-color-scheme=slate] .nt-timeline-sub-title { + color: var(--nt-color-51); +} + +.nt-timeline-item { + position: relative; +} + +.nt-timeline.vertical.center:not(.alternate) .nt-timeline-item { + padding-left: calc(50% + 40px); +} +.nt-timeline.vertical.center:not(.alternate) .nt-timeline-item .nt-timeline-sub-title { + left: 0; + padding-right: 40px; + text-align: right; +} +.nt-timeline.vertical.center.alternate .nt-timeline-item:nth-child(odd) { + padding-left: calc(50% + 40px); +} +.nt-timeline.vertical.center.alternate .nt-timeline-item:nth-child(odd) .nt-timeline-sub-title { + left: 0; + padding-right: 40px; + text-align: right; +} +.nt-timeline.vertical.center.alternate .nt-timeline-item:nth-child(even) { + text-align: right; + padding-right: calc(50% + 40px); +} +.nt-timeline.vertical.center.alternate .nt-timeline-item:nth-child(even) .nt-timeline-sub-title { + right: 0; + padding-left: 40px; + text-align: left; +} + +.nt-timeline-dot { + position: relative; + width: 20px; + height: 20px; + border-radius: 100%; + background-color: #fc5b5b; + position: absolute; + top: 0px; + z-index: 2; + display: flex; + justify-content: center; + align-items: center; + box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); + border: 3px solid white; +} +.nt-timeline-dot:not(.bigger) .icon { + font-size: 10px; +} +.nt-timeline-dot.bigger { + width: 40px; + height: 40px; + padding: 3px; +} +.nt-timeline-dot .icon { + color: white; +} + +/* Fix for webkit (Chrome, Safari) */ +@supports not (-moz-appearance: none) { + /* + This fix is necessary, for some reason, to render the timeline properly + inside `details` elements used by pymdownx. Firefox doesn't need this fix, + it renders elements properly. + */ + details .nt-timeline.vertical.center.alternate .nt-timeline-item:nth-child(odd) .nt-timeline-sub-title, +details .nt-timeline.vertical.center:not(.alternate) .nt-timeline-item .nt-timeline-sub-title { + left: -40px; + } + details .nt-timeline.vertical.center.alternate .nt-timeline-item:nth-child(even) .nt-timeline-sub-title { + right: -40px; + } + details .nt-timeline.vertical.center .nt-timeline-dot { + left: calc(50% - 12px); + } + details .nt-timeline-dot.bigger { + font-size: 1rem !important; + } +} +/* default colors */ +.nt-timeline-item:nth-child(0) .nt-timeline-dot { + background-color: var(--nt-color-0); +} + +.nt-timeline-item:nth-child(1) .nt-timeline-dot { + background-color: var(--nt-color-1); +} + +.nt-timeline-item:nth-child(2) .nt-timeline-dot { + background-color: var(--nt-color-2); +} + +.nt-timeline-item:nth-child(3) .nt-timeline-dot { + background-color: var(--nt-color-3); +} + +.nt-timeline-item:nth-child(4) .nt-timeline-dot { + background-color: var(--nt-color-4); +} + +.nt-timeline-item:nth-child(5) .nt-timeline-dot { + background-color: var(--nt-color-5); +} + +.nt-timeline-item:nth-child(6) .nt-timeline-dot { + background-color: var(--nt-color-6); +} + +.nt-timeline-item:nth-child(7) .nt-timeline-dot { + background-color: var(--nt-color-7); +} + +.nt-timeline-item:nth-child(8) .nt-timeline-dot { + background-color: var(--nt-color-8); +} + +.nt-timeline-item:nth-child(9) .nt-timeline-dot { + background-color: var(--nt-color-9); +} + +.nt-timeline-item:nth-child(10) .nt-timeline-dot { + background-color: var(--nt-color-10); +} + +.nt-timeline-item:nth-child(11) .nt-timeline-dot { + background-color: var(--nt-color-11); +} + +.nt-timeline-item:nth-child(12) .nt-timeline-dot { + background-color: var(--nt-color-12); +} + +.nt-timeline-item:nth-child(13) .nt-timeline-dot { + background-color: var(--nt-color-13); +} + +.nt-timeline-item:nth-child(14) .nt-timeline-dot { + background-color: var(--nt-color-14); +} + +.nt-timeline-item:nth-child(15) .nt-timeline-dot { + background-color: var(--nt-color-15); +} + +.nt-timeline-item:nth-child(16) .nt-timeline-dot { + background-color: var(--nt-color-16); +} + +.nt-timeline-item:nth-child(17) .nt-timeline-dot { + background-color: var(--nt-color-17); +} + +.nt-timeline-item:nth-child(18) .nt-timeline-dot { + background-color: var(--nt-color-18); +} + +.nt-timeline-item:nth-child(19) .nt-timeline-dot { + background-color: var(--nt-color-19); +} + +.nt-timeline-item:nth-child(20) .nt-timeline-dot { + background-color: var(--nt-color-20); +} + +/** + * Extra CSS for the neoteroi.projects.gantt extension. + * + * https://github.com/Neoteroi/mkdocs-plugins +**/ +:root { + --nt-scrollbar-color: #2751b0; + --nt-plan-actions-height: 24px; + --nt-units-background: #ff9800; + --nt-months-background: #2751b0; + --nt-plan-vertical-line-color: #a3a3a3ad; +} + +.nt-pastello { + --nt-scrollbar-color: #9fb8f4; + --nt-units-background: #f5dc82; + --nt-months-background: #5b7fd1; +} + +[data-md-color-scheme=slate] { + --nt-units-background: #003773; +} +[data-md-color-scheme=slate] .nt-pastello { + --nt-units-background: #3f4997; +} + +.nt-plan-root { + min-height: 200px; + scrollbar-width: 20px; + scrollbar-color: var(--nt-scrollbar-color); + display: flex; +} +.nt-plan-root ::-webkit-scrollbar { + width: 20px; +} +.nt-plan-root ::-webkit-scrollbar-track { + box-shadow: inset 0 0 5px grey; + border-radius: 10px; +} +.nt-plan-root ::-webkit-scrollbar-thumb { + background: var(--nt-scrollbar-color); + border-radius: 10px; +} +.nt-plan-root .nt-plan { + flex: 80%; +} +.nt-plan-root.no-groups .nt-plan-periods { + padding-left: 0; +} +.nt-plan-root.no-groups .nt-plan-group-summary { + display: none; +} +.nt-plan-root .nt-timeline-dot.bigger { + top: -10px; +} +.nt-plan-root .nt-timeline-dot.bigger[title] { + cursor: help; +} + +.nt-plan { + white-space: nowrap; + overflow-x: auto; + display: flex; +} +.nt-plan .ug-timeline-dot { + left: 368px; + top: -8px; + cursor: help; +} + +.months { + display: flex; +} + +.month { + flex: auto; + display: inline-block; + box-shadow: rgba(0, 0, 0, 0.2) 0px 3px 1px -2px, rgba(0, 0, 0, 0.14) 0px 2px 2px 0px, rgba(0, 0, 0, 0.12) 0px 1px 5px 0px inset; + background-color: var(--nt-months-background); + color: white; + text-transform: uppercase; + font-family: Roboto, Helvetica, Arial, sans-serif; + padding: 2px 5px; + font-size: 12px; + border: 1px solid #000; + width: 150px; + border-radius: 8px; +} + +.nt-plan-group-activities { + flex: auto; + position: relative; +} + +.nt-vline { + border-left: 1px dashed var(--nt-plan-vertical-line-color); + height: 100%; + left: 0; + position: absolute; + margin-left: -0.5px; + top: 0; + -webkit-transition: all 0.5s linear !important; + -moz-transition: all 0.5s linear !important; + -ms-transition: all 0.5s linear !important; + -o-transition: all 0.5s linear !important; + transition: all 0.5s linear !important; + z-index: -2; +} + +.nt-plan-activity { + display: flex; + margin: 2px 0; + background-color: rgba(187, 187, 187, 0.2509803922); +} + +.actions { + height: var(--nt-plan-actions-height); +} + +.actions { + position: relative; +} + +.period { + display: inline-block; + height: var(--nt-plan-actions-height); + width: 120px; + position: absolute; + left: 0px; + background: #1da1f2; + border-radius: 5px; + transition: all 0.5s; + cursor: help; + -webkit-transition: width 1s ease-in-out; + -moz-transition: width 1s ease-in-out; + -o-transition: width 1s ease-in-out; + transition: width 1s ease-in-out; +} +.period .nt-tooltip { + display: none; + top: 30px; + position: relative; + padding: 1rem; + text-align: center; + font-size: 12px; +} +.period:hover .nt-tooltip { + display: inline-block; +} + +.period-0 { + left: 340px; + visibility: visible; + background-color: rgb(69, 97, 101); +} + +.period-1 { + left: 40px; + visibility: visible; + background-color: green; +} + +.period-2 { + left: 120px; + visibility: visible; + background-color: pink; + width: 80px; +} + +.period-3 { + left: 190px; + visibility: visible; + background-color: darkred; + width: 150px; +} + +.weeks > span, +.days > span { + height: 25px; +} + +.weeks > span { + display: inline-block; + margin: 0; + padding: 0; + font-weight: bold; +} +.weeks > span .week-text { + font-size: 10px; + position: absolute; + display: inline-block; + padding: 3px 4px; +} + +.days { + z-index: -2; + position: relative; +} + +.day-text { + font-size: 10px; + position: absolute; + display: inline-block; + padding: 3px 4px; +} + +.period span { + font-size: 12px; + vertical-align: top; + margin-left: 4px; + color: black; + background: rgba(255, 255, 255, 0.6588235294); + border-radius: 6px; + padding: 0 4px; +} + +.weeks, +.days { + height: 20px; + display: flex; + box-sizing: content-box; +} + +.months { + display: flex; +} + +.week, +.day { + height: 20px; + position: relative; + border: 1; + flex: auto; + border: 2px solid white; + border-radius: 4px; + background-color: var(--nt-units-background); + cursor: help; +} + +.years { + display: flex; +} + +.year { + text-align: center; + border-right: 1px solid var(--nt-plan-vertical-line-color); + font-weight: bold; +} +.year:first-child { + border-left: 1px solid var(--nt-plan-vertical-line-color); +} +.year:first-child:last-child { + width: 100%; +} + +.quarters { + display: flex; +} + +.quarter { + width: 12.5%; + text-align: center; + border-right: 1px solid var(--nt-plan-vertical-line-color); + font-weight: bold; +} +.quarter:first-child { + border-left: 1px solid var(--nt-plan-vertical-line-color); +} + +.nt-plan-group { + margin: 20px 0; + position: relative; +} + +.nt-plan-group { + display: flex; +} + +.nt-plan-group-summary { + background: #2751b0; + width: 150px; + white-space: normal; + padding: 0.1rem 0.5rem; + border-radius: 5px; + color: #fff; + z-index: 3; +} +.nt-plan-group-summary p { + margin: 0; + padding: 0; + font-size: 0.6rem; + color: #fff; +} + +.nt-plan-group-summary, +.month, +.period, +.week, +.day, +.nt-tooltip { + border: 3px solid white; + box-shadow: 0 2px 3px -1px rgba(0, 0, 0, 0.2), 0 3px 3px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); +} + +.nt-plan-periods { + padding-left: 150px; +} + +.months { + z-index: 2; + position: relative; +} + +.weeks { + position: relative; + top: -2px; + z-index: 0; +} + +.month, +.quarter, +.year, +.week, +.day, +.nt-tooltip { + font-family: Roboto, Helvetica, Arial, sans-serif; + box-sizing: border-box; +} + +.nt-cards.nt-grid { + display: grid; + grid-auto-columns: 1fr; + gap: 0.5rem; + max-width: 100vw; + overflow-x: auto; + padding: 1px; +} +.nt-cards.nt-grid.cols-1 { + grid-template-columns: repeat(1, 1fr); +} +.nt-cards.nt-grid.cols-2 { + grid-template-columns: repeat(2, 1fr); +} +.nt-cards.nt-grid.cols-3 { + grid-template-columns: repeat(3, 1fr); +} +.nt-cards.nt-grid.cols-4 { + grid-template-columns: repeat(4, 1fr); +} +.nt-cards.nt-grid.cols-5 { + grid-template-columns: repeat(5, 1fr); +} +.nt-cards.nt-grid.cols-6 { + grid-template-columns: repeat(6, 1fr); +} + +@media only screen and (max-width: 400px) { + .nt-cards.nt-grid { + grid-template-columns: repeat(1, 1fr) !important; + } +} +.nt-card { + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); +} +.nt-card:hover { + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.24), 0 3px 1px -2px rgba(0, 0, 0, 0.3), 0 1px 5px 0 rgba(0, 0, 0, 0.22); +} + +[data-md-color-scheme=slate] .nt-card { + box-shadow: 0 2px 2px 0 rgba(4, 40, 33, 0.14), 0 3px 1px -2px rgba(40, 86, 94, 0.47), 0 1px 5px 0 rgba(139, 252, 255, 0.64); +} +[data-md-color-scheme=slate] .nt-card:hover { + box-shadow: 0 2px 2px 0 rgba(0, 255, 206, 0.14), 0 3px 1px -2px rgba(33, 156, 177, 0.47), 0 1px 5px 0 rgba(96, 251, 255, 0.64); +} + +.nt-card > a { + color: var(--md-default-fg-color); +} + +.nt-card > a > div { + cursor: pointer; +} + +.nt-card { + padding: 5px; + margin-bottom: 0.5rem; +} + +.nt-card-title { + font-size: 1rem; + font-weight: bold; + margin: 4px 0 8px 0; + line-height: 22px; +} + +.nt-card-content { + padding: 0.4rem 0.8rem 0.8rem 0.8rem; +} + +.nt-card-text { + font-size: 14px; + padding: 0; + margin: 0; +} + +.nt-card .nt-card-image { + text-align: center; + border-radius: 2px; + background-position: center center; + background-size: cover; + background-repeat: no-repeat; + min-height: 120px; +} + +.nt-card .nt-card-image.tags img { + margin-top: 12px; +} + +.nt-card .nt-card-image img { + height: 105px; + margin-top: 5px; +} + +.nt-card a:hover, +.nt-card a:focus { + color: var(--md-accent-fg-color); +} + +.nt-card h2 { + margin: 0; +} + +/** + * Extra CSS file recommended for MkDocs and neoteroi.spantable extension. + * + * https://github.com/Neoteroi/mkdocs-plugins +**/ +.span-table-wrapper table { + border-collapse: collapse; + margin-bottom: 2rem; + border-radius: 0.1rem; +} + +.span-table td, +.span-table th { + padding: 0.2rem; + background-color: var(--md-default-bg-color); + font-size: 0.64rem; + max-width: 100%; + overflow: auto; + touch-action: auto; + border-top: 0.05rem solid var(--md-typeset-table-color); + padding: 0.9375em 1.25em; + vertical-align: top; +} + +.span-table tr:first-child td { + font-weight: 700; + min-width: 5rem; + padding: 0.9375em 1.25em; + vertical-align: top; +} + +.span-table td:first-child { + border-left: 0.05rem solid var(--md-typeset-table-color); +} + +.span-table td:last-child { + border-right: 0.05rem solid var(--md-typeset-table-color); +} + +.span-table tr:last-child { + border-bottom: 0.05rem solid var(--md-typeset-table-color); +} + +.span-table [colspan], +.span-table [rowspan] { + font-weight: bold; + border: 0.05rem solid var(--md-typeset-table-color); +} + +.span-table tr:not(:first-child):hover td:not([colspan]):not([rowspan]), +.span-table td[colspan]:hover, +.span-table td[rowspan]:hover { + background-color: rgba(0, 0, 0, 0.035); + box-shadow: 0 0.05rem 0 var(--md-default-bg-color) inset; + transition: background-color 125ms; +} diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..54bb4d9 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,20 @@ +![Borderlands](https://raw.githubusercontent.com/dominictarro/Borderlands/719584af68326f8263f5935743d3c86cc62e2515/assets/borderlands%20soldier%20header.png) + +The *Borderlands* project is a publicized collection of high-granularity datasets related to the Russo-Ukrainian War. + +[Download from Kaggle :material-download:](https://www.kaggle.com/dominictarro/borderlands){ .md-button .md-button--primary } + +# Datasets + +::cards:: + +- title: Media Inventory + content: Media files from the Oryx dataset. + image: _static/gallery.png + url: datasets/Media%20Inventory.md +- title: Oryx + content: Equipment losses in the Russo-Ukrainian War. + image: _static/bracket-curly.png + url: datasets/Oryx.md + +::/cards:: diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..533e48b --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,35 @@ +site_name: Borderlands +site_description: The Borderlands project is a publicized collection of high-granularity datasets related to the Russo-Ukrainian War. +repo_url: https://github.com/dominictarro/Borderlands +repo_name: dominictarro/Borderlands + + +theme: + name: "material" + features: + - navigation.instant + - navigation.tabs + icon: + repo: fontawesome/brands/github + palette: + primary: indigo + accent: amber + +extra_css: + - css/neoteroi-mkdocs.css + +markdown_extensions: + - admonition + - neoteroi.cards + - attr_list + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + +nav: + - index.md + - About: about.md + - Datasets: + - datasets/Media Inventory.md + - datasets/Oryx.md + - License.md diff --git a/src/borderlands/schema/dataset.py b/src/borderlands/schema/dataset.py index f76ebfb..0b69cb7 100644 --- a/src/borderlands/schema/dataset.py +++ b/src/borderlands/schema/dataset.py @@ -8,13 +8,13 @@ import polars as pl -from .. import blocks +from ..blocks import blocks from .formatter import Formatter from .schema import FieldFilter, Schema @dc.dataclass -class Dataset: +class Dataset(Formatter): """Dataset class for storing dataset information. Attributes: @@ -64,5 +64,10 @@ def to_markdown( Returns: str: The dataset described in markdown. """ - f = Formatter(self, level) - return f.format(include=include, exclude=exclude) + return "\n\n".join( + ( + self._format_header(level), + self.description, + self._format_schema(include, exclude), + ) + ) diff --git a/src/borderlands/schema/formatter.py b/src/borderlands/schema/formatter.py index 8d01c1c..8770ec6 100644 --- a/src/borderlands/schema/formatter.py +++ b/src/borderlands/schema/formatter.py @@ -7,10 +7,10 @@ from typing import TYPE_CHECKING import polars as pl +import tabulate if TYPE_CHECKING: from .dataset import Dataset - from .fields import Field from .schema import FieldFilter @@ -59,119 +59,35 @@ def format_type(dtype: pl.DataType) -> str: class Formatter: - """Object to create documentation from a dataset. + """Mixin to generate documention for a dataset.""" - Args: - dataset (Dataset): The dataset to generate documentation for. - level (int, optional): The header level of the documentation. Defaults to 2. - """ - - def __init__(self, dataset: Dataset, level: int = 2) -> None: - self.dataset = dataset - self.level = level - assert self.level in range(1, 5), "Level must be between in range [1, 4]." - - def format( - self, include: FieldFilter | None = None, exclude: FieldFilter | None = None - ) -> str: - """Formats the schema into markdown. - - Args: - schema (Schema): The schema to format. - include (FieldFilter, optional): A list of conditions to require for fields to be included. Performs an OR operation. - exclude (FieldFilter, optional): A list of conditions to exclude fields with. Performs an OR operation. - - Returns: - str: The formatted schema. - """ - return "\n\n".join( - [ - self._format_header(), - self._format_description(), - self._format_schema(include, exclude), - ] - ) - - def _format_header(self) -> str: + def _format_header(self: Dataset, level: int) -> str: """Formats the header of the schema. Args: - schema (Schema): The schema to format. + level (int): The level of the header. Returns: str: The formatted header. """ - return f"{'#' * self.level} {self.dataset.label}" - - def _format_description(self) -> str: - """Formats the description of the schema. - - Args: - schema (Schema): The schema to format. - - Returns: - str: The formatted description. - """ - return self.dataset.description + return f"{'#' * level} {self.label}" def _format_schema( - self, include: FieldFilter | None = None, exclude: FieldFilter | None = None + self: Dataset, + include: FieldFilter | None = None, + exclude: FieldFilter | None = None, ) -> str: - """Formats the schema. + """Format the schema into markdown. Args: - schema (Schema): The schema to format. include (FieldFilter, optional): A list of conditions to require for fields to be included. Performs an OR operation. exclude (FieldFilter, optional): A list of conditions to exclude fields with. Performs an OR operation. Returns: str: The formatted schema. """ - return ( - f"{'#' * (self.level + 1)} Schema" - + "\n\n" - + self._format_fields(include=include, exclude=exclude) - ) - - def _format_fields( - self, include: FieldFilter | None = None, exclude: FieldFilter | None = None - ) -> str: - """Formats the fields of the schema. - - Args: - schema (Schema): The schema to format. - include (FieldFilter, optional): A list of conditions to require for fields to be included. Performs an OR operation. - exclude (FieldFilter, optional): A list of conditions to exclude fields with. Performs an OR operation. - - Returns: - str: The formatted fields. - """ - return ( - self._create_field_header() - + "\n" - + "\n".join( - [ - self._format_field(f) - for f in self.dataset.schema.iter(include=include, exclude=exclude) - ] - ) - ) - - def _create_field_header(self) -> str: - """Creates the field header. - - Returns: - str: The field header. - """ - return "| Name | Type | Description |" "\n" "| :--- | :--- | :----------- |" - - def _format_field(self, field: Field) -> str: - """Creates a markdown row for the `field`. - - Args: - field (Field): The field to format. - - Returns: - str: The formatted field. - """ - return f"| {field.name} | {format_type(field.dtype)} | {field.description} |" + fields = [ + {"Name": f.name, "Type": format_type(f.dtype), "Description": f.description} + for f in self.schema.iter(include=include, exclude=exclude) + ] + return tabulate.tabulate(fields, headers="keys", tablefmt="pipe") diff --git a/src/scripts/docs.py b/src/scripts/docs.py index 9f20a45..e7c7a62 100644 --- a/src/scripts/docs.py +++ b/src/scripts/docs.py @@ -5,9 +5,10 @@ import re from pathlib import Path +from borderlands.definitions import media_inventory, oryx from borderlands.schema.dataset import Dataset -PROJECT_ROOT = Path(__file__).parent.parent +PROJECT_ROOT = Path(__file__).parent.parent.parent START_INDICATOR = "" END_INDICATOR = "" @@ -18,7 +19,7 @@ def insert_to_docs(dataset: Dataset, markdown: str) -> str: - """Add a dataset to the markdown text. + """Add a dataset's schema to the markdown text. Args: markdown (str): The markdown text to insert the dataset within. @@ -28,10 +29,9 @@ def insert_to_docs(dataset: Dataset, markdown: str) -> str: """ match: re.Match = SCHEMA_SECTION_REGEX.search(markdown) if match is None: - print(markdown) raise ValueError("Could not find schema section in markdown.") return SCHEMA_SECTION_REGEX.sub( - "\n\n".join((START_INDICATOR, dataset.to_markdown(), END_INDICATOR)), + "\n\n".join((START_INDICATOR, dataset._format_schema(), END_INDICATOR)), markdown, ) @@ -45,8 +45,13 @@ def update_dataset_docs(dataset: Dataset) -> str: Returns: str: The dataset documentation. """ - path = PROJECT_ROOT / "docs" / f"{dataset.label}.md" + path = PROJECT_ROOT / "docs" / "Datasets" / f"{dataset.label}.md" markdown = path.read_text() markdown = insert_to_docs(dataset, markdown) path.write_text(markdown) print(f"Updated {dataset.label} docs.\n'{path!s}'") + + +if __name__ == "__main__": + for dataset in (oryx, media_inventory): + update_dataset_docs(dataset) diff --git a/tests/schema/test_dataset.py b/tests/schema/test_dataset.py new file mode 100644 index 0000000..05a0355 --- /dev/null +++ b/tests/schema/test_dataset.py @@ -0,0 +1,63 @@ +import io + +import polars as pl +import pytest +from prefect_aws import S3Bucket + +from borderlands.schema.dataset import Dataset +from borderlands.schema.schema import Field, Schema + + +class TestDataset: + + @pytest.fixture + def test_schema(self) -> type[Schema]: + return type( + "TestSchema", + (Schema,), + { + "foo": Field(pl.Int32, description="test foo"), + "bar": Field(pl.Float64, description="test bar"), + }, + ) + + def test_read(self, mock_buckets, core_bucket: S3Bucket, test_schema: type[Schema]): + + with io.BytesIO() as f: + pl.DataFrame({"foo": [1, 2, 3], "bar": [1.0, 2.0, 3.0]}).write_parquet(f) + f.seek(0) + core_bucket.upload_from_file_object(f, "test.parquet") + + dataset = Dataset( + label="test", + host_bucket=core_bucket.bucket_name, + release_path="test.parquet", + schema=test_schema, + description="test dataset desc", + ) + df = dataset.read() + assert isinstance(df, pl.DataFrame) + assert df.shape == (3, 2) + + def test_to_markdown(self, test_schema: type[Schema]): + dataset = Dataset( + label="test", + host_bucket="test-bucket", + release_path="test.parquet", + schema=test_schema, + description="test dataset desc", + ) + md = dataset.to_markdown() + + print(md) + + assert isinstance(md, str) + + assert md == ( + "## test\n\n" + "test dataset desc\n\n" + "| Name | Type | Description |\n" + "|:-------|:--------|:--------------|\n" + "| foo | numeric | test foo |\n" + "| bar | numeric | test bar |" + ) diff --git a/tool.py b/tool.py deleted file mode 100644 index 2a285aa..0000000 --- a/tool.py +++ /dev/null @@ -1,24 +0,0 @@ -""" -Entrypoint for scripts. -""" - -import click - - -@click.group() -def cli(): - """Tool for managing the project.""" - - -@cli.command() -def docs(): - """Generate docs for the datasets.""" - from src.borderlands.definitions import media_inventory, oryx - from src.scripts.docs import update_dataset_docs - - for dataset in (oryx, media_inventory): - update_dataset_docs(dataset) - - -if __name__ == "__main__": - cli()