diff --git a/Pipfile b/Pipfile
index 9f41b6b6..ea3a2b0b 100644
--- a/Pipfile
+++ b/Pipfile
@@ -26,6 +26,9 @@ pandas = "==1.4.4"
setuptools = "==63.4.1"
pyparsing = "==3.0.9"
jmespath = "==0.10.0"
+pydantic = "==2.0.0"
+rapidfuzz = ">=3.13.0"
+databricks-sdk = ">=0.62.0"
[requires]
python_version = "3.10.12"
diff --git a/Pipfile.lock b/Pipfile.lock
index d84b4997..ff11f0e7 100644
--- a/Pipfile.lock
+++ b/Pipfile.lock
@@ -1,11 +1,11 @@
{
"_meta": {
"hash": {
- "sha256": "d8bd2400f4033b6b1de2a8ea04ec4e0fb9da66d94ee61f80542f21ed53e04681"
+ "sha256": "d74fa253aec9b1437ed5128071dfb05b41c6801cb9430a47ac0bc8fa9d2f059c"
},
"pipfile-spec": 6,
"requires": {
- "python_version": "3.8.12"
+ "python_version": "3.10.12"
},
"sources": [
{
@@ -16,13 +16,147 @@
]
},
"default": {
+ "annotated-types": {
+ "hashes": [
+ "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53",
+ "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==0.7.0"
+ },
+ "cachetools": {
+ "hashes": [
+ "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4",
+ "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==5.5.2"
+ },
+ "certifi": {
+ "hashes": [
+ "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407",
+ "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==2025.8.3"
+ },
+ "charset-normalizer": {
+ "hashes": [
+ "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91",
+ "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0",
+ "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154",
+ "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601",
+ "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884",
+ "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07",
+ "sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c",
+ "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64",
+ "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe",
+ "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f",
+ "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432",
+ "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc",
+ "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa",
+ "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9",
+ "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae",
+ "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19",
+ "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d",
+ "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e",
+ "sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4",
+ "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7",
+ "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312",
+ "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92",
+ "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31",
+ "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c",
+ "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f",
+ "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99",
+ "sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b",
+ "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15",
+ "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392",
+ "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f",
+ "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8",
+ "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491",
+ "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0",
+ "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc",
+ "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0",
+ "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f",
+ "sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a",
+ "sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40",
+ "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927",
+ "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849",
+ "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce",
+ "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14",
+ "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05",
+ "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c",
+ "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c",
+ "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a",
+ "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc",
+ "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34",
+ "sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9",
+ "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096",
+ "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14",
+ "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30",
+ "sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b",
+ "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b",
+ "sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942",
+ "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db",
+ "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5",
+ "sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b",
+ "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce",
+ "sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669",
+ "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0",
+ "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018",
+ "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93",
+ "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe",
+ "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049",
+ "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a",
+ "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef",
+ "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2",
+ "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca",
+ "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16",
+ "sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f",
+ "sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb",
+ "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1",
+ "sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557",
+ "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37",
+ "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7",
+ "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72",
+ "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c",
+ "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==3.4.3"
+ },
+ "databricks-sdk": {
+ "hashes": [
+ "sha256:12f8da735f74cba5265dcb0620c30941628f63787e6ea7e57cc5ed22d9e1b987",
+ "sha256:79d4abe60306239985a5b718583923e13316c5417204017b0dadf74bccfcc6e1"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.7'",
+ "version": "==0.62.0"
+ },
+ "google-auth": {
+ "hashes": [
+ "sha256:1370d4593e86213563547f97a92752fc658456fe4514c809544f330fed45a7ca",
+ "sha256:500c3a29adedeb36ea9cf24b8d10858e152f2412e3ca37829b3fa18e33d63b77"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==2.40.3"
+ },
+ "idna": {
+ "hashes": [
+ "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9",
+ "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"
+ ],
+ "markers": "python_version >= '3.6'",
+ "version": "==3.10"
+ },
"jmespath": {
"hashes": [
"sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9",
"sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"
],
"index": "pypi",
- "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+ "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'",
"version": "==0.10.0"
},
"numpy": {
@@ -56,123 +190,378 @@
},
"pandas": {
"hashes": [
- "sha256:167693a80abc8eb28051fbd184c1b7afd13ce2c727a5af47b048f1ea3afefff4",
- "sha256:2111c25e69fa9365ba80bbf4f959400054b2771ac5d041ed19415a8b488dc70a",
- "sha256:298f0553fd3ba8e002c4070a723a59cdb28eda579f3e243bc2ee397773f5398b",
- "sha256:2b063d41803b6a19703b845609c0b700913593de067b552a8b24dd8eeb8c9895",
- "sha256:2cb7e8f4f152f27dc93f30b5c7a98f6c748601ea65da359af734dd0cf3fa733f",
- "sha256:52d2472acbb8a56819a87aafdb8b5b6d2b3386e15c95bde56b281882529a7ded",
- "sha256:612add929bf3ba9d27b436cc8853f5acc337242d6b584203f207e364bb46cb12",
- "sha256:649ecab692fade3cbfcf967ff936496b0cfba0af00a55dfaacd82bdda5cb2279",
- "sha256:68d7baa80c74aaacbed597265ca2308f017859123231542ff8a5266d489e1858",
- "sha256:8d4c74177c26aadcfb4fd1de6c1c43c2bf822b3e0fc7a9b409eeaf84b3e92aaa",
- "sha256:971e2a414fce20cc5331fe791153513d076814d30a60cd7348466943e6e909e4",
- "sha256:9db70ffa8b280bb4de83f9739d514cd0735825e79eef3a61d312420b9f16b758",
- "sha256:b730add5267f873b3383c18cac4df2527ac4f0f0eed1c6cf37fcb437e25cf558",
- "sha256:bd659c11a4578af740782288cac141a322057a2e36920016e0fc7b25c5a4b686",
- "sha256:c601c6fdebc729df4438ec1f62275d6136a0dd14d332fc0e8ce3f7d2aadb4dd6",
- "sha256:d0877407359811f7b853b548a614aacd7dea83b0c0c84620a9a643f180060950"
+ "sha256:050aada67a5ec6699a7879e769825b510018a95fb9ac462bb1867483d0974a97",
+ "sha256:0959c41004e3d2d16f39c828d6da66ebee329836a7ecee49fb777ac9ad8a7501",
+ "sha256:4591cadd06fbbbd16fafc2de6e840c1aaefeae3d5864b688004777ef1bbdede3",
+ "sha256:51c424ca134fdaeac9a4acd719d1ab48046afc60943a489028f0413fdbe9ef1c",
+ "sha256:785e878a6e6d8ddcdb8c181e600855402750052497d7fc6d6b508894f6b8830b",
+ "sha256:799e6a25932df7e6b1f8dabf63de064e2205dc309abb75956126a0453fd88e97",
+ "sha256:7cd1d69a387f7d5e1a5a06a87574d9ef2433847c0e78113ab51c84d3a8bcaeaa",
+ "sha256:87b4194f344dcd14c0f885cecb22005329b38bda10f1aaf7b9596a00ec8a4768",
+ "sha256:8d4d2fe2863ecddb0ba1979bdda26c8bc2ea138f5a979abe3ba80c0fa4015c91",
+ "sha256:94f2ed1fd51e545ebf71da1e942fe1822ee01e10d3dd2a7276d01351333b7c6b",
+ "sha256:9d2a7a3c1fea668d56bd91edbd5f2732e0af8feb9d2bf8d9bfacb2dea5fa9536",
+ "sha256:9d805bce209714b1c1fa29bfb1e42ad87e4c0a825e4b390c56a3e71593b7e8d8",
+ "sha256:a08ceb59db499864c58a9bf85ab6219d527d91f14c0240cc25fa2c261032b2a7",
+ "sha256:a981cfabf51c318a562deb4ae7deec594c07aee7cf18b4594a92c23718ec8275",
+ "sha256:ab6c0d738617b675183e5f28db32b5148b694ad9bba0a40c3ea26d96b431db67",
+ "sha256:afbddad78a98ec4d2ce08b384b81730de1ccc975b99eb663e6dac43703f36d98",
+ "sha256:c4bb8b0ab9f94207d07e401d24baebfc63057246b1a5e0cd9ee50df85a656871",
+ "sha256:ce35f947202b0b99c660221d82beb91d2e6d553d55a40b30128204e3e2c63848",
+ "sha256:d0022fe6a313df1c4869b5edc012d734c6519a6fffa3cf70930f32e6a1078e49",
+ "sha256:e7cc960959be28d064faefc0cb2aef854d46b827c004ebea7e79b5497ed83e7d",
+ "sha256:ee6f1848148ed3204235967613b0a32be2d77f214e9623f554511047705c1e04"
],
"index": "pypi",
- "markers": "python_full_version >= '3.7.1'",
- "version": "==1.2.4"
+ "markers": "python_version >= '3.8'",
+ "version": "==1.4.4"
},
"py4j": {
"hashes": [
- "sha256:36ec57f43ff8ced260a18aa9a4e46c3500a730cac8860e259cbaa546c2b9db2f",
- "sha256:859ba728a7bb43e9c2bf058832759fb97a598bb28cc12f34f5fc4abdec08ede6"
+ "sha256:0b6e5315bb3ada5cf62ac651d107bb2ebc02def3dee9d9548e3baac644ea8dbb",
+ "sha256:85defdfd2b2376eb3abf5ca6474b51ab7e0de341c75a02f46dc9b5976f5a5c1b"
],
- "version": "==0.10.9"
+ "version": "==0.10.9.7"
},
"pyarrow": {
"hashes": [
- "sha256:04be0f7cb9090bd029b5b53bed628548fef569e5d0b5c6cd7f6d0106dbbc782d",
- "sha256:0fde9c7a3d5d37f3fe5d18c4ed015e8f585b68b26d72a10d7012cad61afe43ff",
- "sha256:11517f0b4f4acbab0c37c674b4d1aad3c3dfea0f6b1bb322e921555258101ab3",
- "sha256:150db335143edd00d3ec669c7c8167d401c4aa0a290749351c80bbf146892b2e",
- "sha256:24040a20208e9b16ba7b284624ebfe67e40f5c40b5dc8d874da322ac0053f9d3",
- "sha256:33c457728a1ce825b80aa8c8ed573709f1efe72003d45fa6fdbb444de9cc0b74",
- "sha256:423cd6a14810f4e40cb76e13d4240040fc1594d69fe1c4f2c70be00ad512ade5",
- "sha256:5387db80c6a7b5598884bf4df3fc546b3373771ad614548b782e840b71704877",
- "sha256:5a76ec44af838862b23fb5cfc48765bc7978f7b58a181c96ad92856280de548b",
- "sha256:5f2660f59dfcfd34adac7c08dc7f615920de703f191066ed6277628975f06878",
- "sha256:6b7bd8f5aa327cc32a1b9b02a76502851575f5edb110f93c59a45c70211a5618",
- "sha256:72cf3477538bd8504f14d6299a387cc335444f7a188f548096dfea9533551f02",
- "sha256:76b75a9cfc572e890a1e000fd532bdd2084ec3f1ee94ee51802a477913a21072",
- "sha256:a81adbfbe2f6528d4593b5a8962b2751838517401d14e9d4cab6787478802693",
- "sha256:a968375c66e505f72b421f5864a37f51aad5da61b6396fa283f956e9f2b2b923",
- "sha256:afd4f7c0a225a326d2c0039cdc8631b5e8be30f78f6b7a3e5ce741cf5dd81c72",
- "sha256:b05bdd513f045d43228247ef4d9269c88139788e2d566f4cb3e855e282ad0330",
- "sha256:c2733c9bcd00074ce5497dd0a7b8a10c91d3395ddce322d7021c7fdc4ea6f610",
- "sha256:d0f080b2d9720bec42624cb0df66f60ae66b84a2ccd1fe2c291322df915ac9db",
- "sha256:dcd20ee0240a88772eeb5691102c276f5cdec79527fb3a0679af7f93f93cb4bd",
- "sha256:e1351576877764fb4d5690e4721ce902e987c85f4ab081c70a34e1d24646586e",
- "sha256:e44dfd7e61c9eb6dda59bc49ad69e77945f6d049185a517c130417e3ca0494d8",
- "sha256:ee3d87615876550fee9a523307dd4b00f0f44cf47a94a32a07793da307df31a0",
- "sha256:fa7b165cfa97158c1e6d15c68428317b4f4ae786d1dc2dbab43f1328c1eb43aa",
- "sha256:fe976695318560a97c6d31bba828eeca28c44c6f6401005e54ba476a28ac0a10"
+ "sha256:03a10daad957970e914920b793f6a49416699e791f4c827927fd4e4d892a5d16",
+ "sha256:15511ce2f50343f3fd5e9f7c30e4d004da9134e9597e93e9c96c3985928cbe82",
+ "sha256:1dd482ccb07c96188947ad94d7536ab696afde23ad172df8e18944ec79f55055",
+ "sha256:25a5f7c7f36df520b0b7363ba9f51c3070799d4b05d587c60c0adaba57763479",
+ "sha256:3bd201af6e01f475f02be88cf1f6ee9856ab98c11d8bbb6f58347c58cd07be00",
+ "sha256:3fee786259d986f8c046100ced54d63b0c8c9f7cdb7d1bbe07dc69e0f928141c",
+ "sha256:42b7982301a9ccd06e1dd4fabd2e8e5df74b93ce4c6b87b81eb9e2d86dc79871",
+ "sha256:4a18a211ed888f1ac0b0ebcb99e2d9a3e913a481120ee9b1fe33d3fedb945d4e",
+ "sha256:51e58778fcb8829fca37fbfaea7f208d5ce7ea89ea133dd13d8ce745278ee6f0",
+ "sha256:541e7845ce5f27a861eb5b88ee165d931943347eec17b9ff1e308663531c9647",
+ "sha256:65c7f4cc2be195e3db09296d31a654bb6d8786deebcab00f0e2455fd109d7456",
+ "sha256:69b043a3fce064ebd9fbae6abc30e885680296e5bd5e6f7353e6a87966cf2ad7",
+ "sha256:6ea2c54e6b5ecd64e8299d2abb40770fe83a718f5ddc3825ddd5cd28e352cce1",
+ "sha256:78a6ac39cd793582998dac88ab5c1c1dd1e6503df6672f064f33a21937ec1d8d",
+ "sha256:81b87b782a1366279411f7b235deab07c8c016e13f9af9f7c7b0ee564fedcc8f",
+ "sha256:8392b9a1e837230090fe916415ed4c3433b2ddb1a798e3f6438303c70fbabcfc",
+ "sha256:863be6bad6c53797129610930794a3e797cb7d41c0a30e6794a2ac0e42ce41b8",
+ "sha256:8cd86e04a899bef43e25184f4b934584861d787cf7519851a8c031803d45c6d8",
+ "sha256:95c7822eb37663e073da9892f3499fe28e84f3464711a3e555e0c5463fd53a19",
+ "sha256:98c13b2e28a91b0fbf24b483df54a8d7814c074c2623ecef40dce1fa52f6539b",
+ "sha256:ba2b7aa7efb59156b87987a06f5241932914e4d5bbb74a465306b00a6c808849",
+ "sha256:c9c97c8e288847e091dfbcdf8ce51160e638346f51919a9e74fe038b2e8aee62",
+ "sha256:cb06cacc19f3b426681f2f6803cc06ff481e7fe5b3a533b406bc5b2138843d4f",
+ "sha256:ce64bc1da3109ef5ab9e4c60316945a7239c798098a631358e9ab39f6e5529e9",
+ "sha256:d5ef4372559b191cafe7db8932801eee252bfc35e983304e7d60b6954576a071",
+ "sha256:d6f1e1040413651819074ef5b500835c6c42e6c446532a1ddef8bc5054e8dba5",
+ "sha256:deb400df8f19a90b662babceb6dd12daddda6bb357c216e558b207c0770c7654",
+ "sha256:ea132067ec712d1b1116a841db1c95861508862b21eddbcafefbce8e4b96b867",
+ "sha256:ece333706a94c1221ced8b299042f85fd88b5db802d71be70024433ddf3aecab",
+ "sha256:edad25522ad509e534400d6ab98cf1872d30c31bc5e947712bfd57def7af15bb"
],
"index": "pypi",
- "markers": "python_version >= '3.6'",
- "version": "==4.0.1"
+ "markers": "python_version >= '3.7'",
+ "version": "==8.0.0"
+ },
+ "pyasn1": {
+ "hashes": [
+ "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629",
+ "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==0.6.1"
+ },
+ "pyasn1-modules": {
+ "hashes": [
+ "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a",
+ "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==0.4.2"
+ },
+ "pydantic": {
+ "hashes": [
+ "sha256:6e313661b310eb5b2c45168ce05d8dd79f57563adaf3906162a917585576b846",
+ "sha256:8bf7355be5e1207c756dfbc8046236dadd4ce04101fb482e6c8834a06d9aa04f"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.7'",
+ "version": "==2.0"
+ },
+ "pydantic-core": {
+ "hashes": [
+ "sha256:007cdcee7e1a40951768d0d250e566b603e25d0fa8b8302901e38560bc9badf9",
+ "sha256:03d12c44decb122d5feede5408cc6c67e506b64016ce4b59c825d1a8c90f288a",
+ "sha256:0872a1c52da4cfc494e23c83532c7fc1313de311a14334b7a58216a8dea828e0",
+ "sha256:0b154abef540a76bb2b7a641b3ae1e05e5c4b08eb9ad6c27a217b3c64ffcda0b",
+ "sha256:0c8877d9e0bd128f103a1b0f02899aa7d4be1104eef5dc35e2b633042b64a2d1",
+ "sha256:0fcdb43190588f6219709b43ffa679e562c0d4a44a50aafb6cc88978da4a84b7",
+ "sha256:10736490eacc426d681ae6f00f1d8ce01fc77c45086a597e829c3eed127179b1",
+ "sha256:1672c8c36414c56adf704753b2d7e22e7528d7bd21cd357f24edeff76d4fd4ca",
+ "sha256:16977790d69bac6034baa2349326db2ff465ad346c53b8d54c3674e05b070af2",
+ "sha256:176eb3ec03da4c36da7708d2398139e13d1130b3b3d1af4334a959f46278baa9",
+ "sha256:182a0e5ce9382a0a77aab8407ead303b6e310c673a46b18937fa1a90c22ccbc4",
+ "sha256:1bb6d1057c054056614aefeced05299d3590acf76768538b34ebec9cbbf26953",
+ "sha256:1c318bd2bdaa88ec078dc7932e108a9c43caeabc84d2cf545081fb6a99ed1b90",
+ "sha256:1c855ef11370eacff25556658fb7fa243e8c0bd4235fa20a0f473bded2ede252",
+ "sha256:3a85fde791e6567f879b50b59f1740afc55333060d93548d6bbb46bf1b6a1b49",
+ "sha256:4372e8fcb458aad1e155c04e663ff1840f36b859fb1422578372712a78866051",
+ "sha256:44c8cec1d74d74c29da59c86e8cd472851c85b44d75128096ef3751c5c87c204",
+ "sha256:46bb28295082a22f3c7f5fa5546d669aed7eb43151ec0032e8c352c59f5e36af",
+ "sha256:4eda2b350b02293c7060f2371ad3ce7b00342bd61c8654d2ba374bd10c6b6b66",
+ "sha256:5e4a918eeae2c566fdcad9ee89d8708a59dc5ec3d5083b61a886b19f82f69f5c",
+ "sha256:5e90b99b6aa9fd6eee6d6f86921d38252c6e55c319dc6c5e411922d0dc173825",
+ "sha256:5f3158cb4cda580f3b063b03257c7f5c2d9e66f9c2a93466c76056f7c4d5a3b7",
+ "sha256:6387c2956baf16891e7bc20d864a769c0f9f61799d4895c8f493e2de8f7b88aa",
+ "sha256:659f22427d653769d1b4c672fd2daf53e639a5a93b0dd6fc0b37ef822a6e77d7",
+ "sha256:6cf3e484bc8e8c8a568d572a6619696d7e2e2aef214b0be503f0814f8bafca9f",
+ "sha256:7176ffa02c45d557cceb75f1290a2ddf53da680c6878aae54e69aafb21c52efd",
+ "sha256:71cf43912edeae476f47d16520e48bddbf9af0ebdd98961c38ca8944f4f22b9d",
+ "sha256:722aa193ba1f587226991a789a3f098235b5f04e85cf815af9e8ad823a5a85e1",
+ "sha256:73c464afa0a959472045f242ef7cdaf6a38b76a6d7dfa1ef270de0967c04408d",
+ "sha256:76d5d18ef9065ecbf62d6ec82c45ddbb47174a7400eb780040a7ebdad1c0ead8",
+ "sha256:7727a4fcb93572d4e521b028f1c64f1eda2da49d506b1a6208576faa9e0acd64",
+ "sha256:79225132aa1fe97a5e947da820b323d63372fb3475d94ff81ca6f91669717a01",
+ "sha256:7a4fc3e8c788798739f4aa6772d994e4453a17dadb1b8eea4582a31cdfe683d2",
+ "sha256:7bd78c4f04794a8e527d32c8ec1a26682b35b5c9347bb6e3cc853ba1a43c72a5",
+ "sha256:88b56a4e7480f4f22fa2faefdb0a887d70420d9cd8cb160677e8abe46769e7b0",
+ "sha256:88fc72e60d818924cb3d32948b682bcea0dadd0fd2efae9a4d0b7a55e310908a",
+ "sha256:89123ab11a23fa9c332655933350dc231945ca6b1148c1e1960aad0a5a6de1c0",
+ "sha256:8927c166f20e3933cc9a9a68701acc8de22ee54b70d8c4044ad461b043b3cf9b",
+ "sha256:8945ba48644b45d4e66cc3e56b896e97fb1d7f166dd0ee1eb137bbfdf1285483",
+ "sha256:8ca5a743af642700fc69dc64e0b964dd7499dcabb399e5cc2223fbc9cb33965d",
+ "sha256:8daded5c64811da4bdc7d6792afa10328bff5c3514536f69457596d4a2646b49",
+ "sha256:92b01e166a3b69e8054308709acabec1bae65dae83ba6329f4fcc8448e170a06",
+ "sha256:958964a0ad0cea700b25037b21f5a2da38d19bddaa2f15ce36f51c048a9efe92",
+ "sha256:9cf1ba93657cad863d23ecb09227665c0abe26c131acd24abb5edc6249a36a70",
+ "sha256:9ee1c2d0cf5c92faf722ff366814859c764c82b30af7f91b9b1950e15efecb9e",
+ "sha256:a1dd1b182fde9f95f1cc28964612fb1b180fdd3ca2cac881c108db29906b2e01",
+ "sha256:a7d0de538719feda5cabf19c63cc17345df6a0ab579b95518925d2b25276daaf",
+ "sha256:aad8b177370002f73f08eafefa3d969d9c4498da6d67d8a43ffdeb4b4e560e1c",
+ "sha256:ab7eafb33fdc7aa8667634be58a3d1c8ed3fa8923c6bc5014657bf95b51b4a46",
+ "sha256:ac6a57d01c0b67563dd273f2b71e9aab643573b569a202bfff7dad502b0b8ee0",
+ "sha256:adbfc6c7ddd1cca6efe62a0292cae7cf2d05c9ebb139d0da10b0d44346e253c7",
+ "sha256:adc2efaf0c45135214dff4d18d4aaf2b692249cb369f921fe0fde3a13cf7ddad",
+ "sha256:ae53240f9f92f634b73a3e5ee87b9ec8ac38d5bee96ea65034af58f48d489a65",
+ "sha256:b23ae8b27b6eff72909a9a88123ac28b746d95f25927ce67d3b0f3dabe099a0a",
+ "sha256:b56f3758b82f26414a4dccd76f05c768df7bd2735e0ac43f3dfff2f5603d32a9",
+ "sha256:b83e11a68936f80ee92ef1001bf6b9fedf0602396acc417b16a9c136a9b3b7bd",
+ "sha256:bb2daa4e3d4efbf2e2dedc1a7cea3e48ff12d0c95ab2011e7f731bdc97d16ed0",
+ "sha256:bc99af5be239961d718bbf8e4d6bd1caa6de556e44ed08eb5135cfbefc958728",
+ "sha256:c04aa22ded4baf29c3c1ec3b76d5264dd91794b974a737251fdd0827abcc2c78",
+ "sha256:c3f8fea22690c6c33c4d36d2236732da29da560f815cd9aba1d3b5ab59dcb214",
+ "sha256:c5fef2dc7ed589ea83ac5ce526fcb8e8eb0ab79bfa67f958dafbda0a05ab3018",
+ "sha256:c656b8d4603af6744ed2f2c0be499790f0913a2186ef7214c88d47d42051ae4b",
+ "sha256:c8e53bae6e58a8ff8e93f9a77440cfe8fc017bb9a8430dc03beb6bdd648572d2",
+ "sha256:cbbefd38ef80b37d056592c366a164a37b4e87b12f0aba23c35087d890fb31ba",
+ "sha256:ccb06e1667a9784a96e0fc2500b989b8afbe9ac68a39a3c806c056ee228eff3c",
+ "sha256:d6e21da7f7e3935b24bfd17d7c3eefe4c1edca380edaec854a8593796d8d96f1",
+ "sha256:ddb23eaf427dbbde41b543d98a0c4a7aeb73bf649e3faa75b94a2fd882a669ba",
+ "sha256:ddbad540cba15b5262bd800bb6f0746a4ac719de0fe0a2acab8e0d50eb54ba9a",
+ "sha256:e0dd6bb98271519a309e96e927b52f8ca1323a99762bec87cda8fdaaa221e5cd",
+ "sha256:e0edd3c6762b3ff3fdbd90517a09808e5d67cce86d7c43ec6f5ca3f65bfe7fd9",
+ "sha256:e2e9025e132761e7ea8dab448923ccd8839c60199e863a6348d7e8b1a674edd1",
+ "sha256:e4785a8c5440e410394f88e30c3db862ed05841595311ddc969b3fde377f95ea",
+ "sha256:e4b4c836100e5f07189b0aea8b4afae326f169bfdef91e86fd90a0d3c27f0c75",
+ "sha256:e55fc76ce657208c0d7e21e2e96925993dd4063d5c5ee9227dcdf4e550c02a29",
+ "sha256:e76a9b0c2b2fb29a80764e106b1ea35c1b96a4e62e7ce7dde44f5df153fd5b66",
+ "sha256:ef349e4ac794559c1538787a0fbce378a1beb991ef4f7707a6cde3156294259d",
+ "sha256:f0f90928ed48b91d93add357fb1e81cef729bffaff3ab88882b76549434b4574",
+ "sha256:f9452d470012ee86a00a36f7673843038fd1a88661a28c72e65e7f3f084da8d8",
+ "sha256:f9fffcb5507bff84a1312d1616406cad157806f105d78bd184d1e6b3b00e6417",
+ "sha256:fa5a3d49ddbeaa80bb2a8927b90e9cdd43373616ba0b7b7a74a3ae33b5c9640c",
+ "sha256:ff015389ae4ca6869a2fdd16c21ee1ce7c134503f2148efd46db643ce27ca520"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==2.0.1"
},
"pyparsing": {
"hashes": [
- "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1",
- "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"
+ "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb",
+ "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"
],
"index": "pypi",
- "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==2.4.7"
+ "markers": "python_full_version >= '3.6.8'",
+ "version": "==3.0.9"
},
"pyspark": {
"hashes": [
- "sha256:39ac641ef5559a3d1286154779fc990316e9934520853615ae4785c1af52d14b"
+ "sha256:72cd66ab8cf61a75854e5a753f75bea35ee075c3a96f9de4e2a66d02ec7fc652"
],
"index": "pypi",
- "markers": "python_version >= '3.6'",
- "version": "==3.1.3"
+ "markers": "python_version >= '3.7'",
+ "version": "==3.4.1"
},
"python-dateutil": {
"hashes": [
"sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3",
"sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"
],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
"version": "==2.9.0.post0"
},
"pytz": {
"hashes": [
- "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812",
- "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"
+ "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3",
+ "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"
+ ],
+ "version": "==2025.2"
+ },
+ "rapidfuzz": {
+ "hashes": [
+ "sha256:09e908064d3684c541d312bd4c7b05acb99a2c764f6231bd507d4b4b65226c23",
+ "sha256:0da54aa8547b3c2c188db3d1c7eb4d1bb6dd80baa8cdaeaec3d1da3346ec9caa",
+ "sha256:0e1d08cb884805a543f2de1f6744069495ef527e279e05370dd7c83416af83f8",
+ "sha256:0fd05336db4d0b8348d7eaaf6fa3c517b11a56abaa5e89470ce1714e73e4aca7",
+ "sha256:11b125d8edd67e767b2295eac6eb9afe0b1cdc82ea3d4b9257da4b8e06077798",
+ "sha256:11b47b40650e06147dee5e51a9c9ad73bb7b86968b6f7d30e503b9f8dd1292db",
+ "sha256:1343d745fbf4688e412d8f398c6e6d6f269db99a54456873f232ba2e7aeb4939",
+ "sha256:1a79a2f07786a2070669b4b8e45bd96a01c788e7a3c218f531f3947878e0f956",
+ "sha256:1ba007f4d35a45ee68656b2eb83b8715e11d0f90e5b9f02d615a8a321ff00c27",
+ "sha256:1dc82b6ed01acb536b94a43996a94471a218f4d89f3fdd9185ab496de4b2a981",
+ "sha256:1f219f1e3c3194d7a7de222f54450ce12bc907862ff9a8962d83061c1f923c86",
+ "sha256:200030dfc0a1d5d6ac18e993c5097c870c97c41574e67f227300a1fb74457b1d",
+ "sha256:202a87760f5145140d56153b193a797ae9338f7939eb16652dd7ff96f8faf64c",
+ "sha256:25343ccc589a4579fbde832e6a1e27258bfdd7f2eb0f28cb836d6694ab8591fc",
+ "sha256:2d18228a2390375cf45726ce1af9d36ff3dc1f11dce9775eae1f1b13ac6ec50f",
+ "sha256:2fd0975e015b05c79a97f38883a11236f5a24cca83aa992bd2558ceaa5652b26",
+ "sha256:30fd1451f87ccb6c2f9d18f6caa483116bbb57b5a55d04d3ddbd7b86f5b14998",
+ "sha256:3abe6a4e8eb4cfc4cda04dd650a2dc6d2934cbdeda5def7e6fd1c20f6e7d2a0b",
+ "sha256:3b6f913ee4618ddb6d6f3e387b76e8ec2fc5efee313a128809fbd44e65c2bbb2",
+ "sha256:3f32f15bacd1838c929b35c84b43618481e1b3d7a61b5ed2db0291b70ae88b53",
+ "sha256:435071fd07a085ecbf4d28702a66fd2e676a03369ee497cc38bcb69a46bc77e2",
+ "sha256:45dd4628dd9c21acc5c97627dad0bb791764feea81436fb6e0a06eef4c6dceaa",
+ "sha256:461fd13250a2adf8e90ca9a0e1e166515cbcaa5e9c3b1f37545cbbeff9e77f6b",
+ "sha256:4671ee300d1818d7bdfd8fa0608580d7778ba701817216f0c17fb29e6b972514",
+ "sha256:48719f7dcf62dfb181063b60ee2d0a39d327fa8ad81b05e3e510680c44e1c078",
+ "sha256:4a1a6a906ba62f2556372282b1ef37b26bca67e3d2ea957277cfcefc6275cca7",
+ "sha256:4d9d7f84c8e992a8dbe5a3fdbea73d733da39bf464e62c912ac3ceba9c0cff93",
+ "sha256:5158da7f2ec02a930be13bac53bb5903527c073c90ee37804090614cab83c29e",
+ "sha256:5280be8fd7e2bee5822e254fe0a5763aa0ad57054b85a32a3d9970e9b09bbcbf",
+ "sha256:5435fcac94c9ecf0504bf88a8a60c55482c32e18e108d6079a0089c47f3f8cf6",
+ "sha256:558bf526bcd777de32b7885790a95a9548ffdcce68f704a81207be4a286c1095",
+ "sha256:573ad267eb9b3f6e9b04febce5de55d8538a87c56c64bf8fd2599a48dc9d8b77",
+ "sha256:57c390336cb50d5d3bfb0cfe1467478a15733703af61f6dffb14b1cd312a6fae",
+ "sha256:5d4e13593d298c50c4f94ce453f757b4b398af3fa0fd2fde693c3e51195b7f69",
+ "sha256:5dc71ef23845bb6b62d194c39a97bb30ff171389c9812d83030c1199f319098c",
+ "sha256:624a108122039af89ddda1a2b7ab2a11abe60c1521956f142f5d11bcd42ef138",
+ "sha256:65cc97c2fc2c2fe23586599686f3b1ceeedeca8e598cfcc1b7e56dc8ca7e2aa7",
+ "sha256:694eb531889f71022b2be86f625a4209c4049e74be9ca836919b9e395d5e33b3",
+ "sha256:6af42f2ede8b596a6aaf6d49fdee3066ca578f4856b85ab5c1e2145de367a12d",
+ "sha256:6c0efa73afbc5b265aca0d8a467ae2a3f40d6854cbe1481cb442a62b7bf23c99",
+ "sha256:6e2065f68fb1d0bf65adc289c1bdc45ba7e464e406b319d67bb54441a1b9da9e",
+ "sha256:7ac21489de962a4e2fc1e8f0b0da4aa1adc6ab9512fd845563fecb4b4c52093a",
+ "sha256:7d7cec4242d30dd521ef91c0df872e14449d1dffc2a6990ede33943b0dae56c3",
+ "sha256:85c9a131a44a95f9cac2eb6e65531db014e09d89c4f18c7b1fa54979cb9ff1f3",
+ "sha256:8c99b76b93f7b495eee7dcb0d6a38fb3ce91e72e99d9f78faa5664a881cb2b7d",
+ "sha256:9093cdeb926deb32a4887ebe6910f57fbcdbc9fbfa52252c10b56ef2efb0289f",
+ "sha256:9256218ac8f1a957806ec2fb9a6ddfc6c32ea937c0429e88cf16362a20ed8602",
+ "sha256:9327a4577f65fc3fb712e79f78233815b8a1c94433d0c2c9f6bc5953018b3565",
+ "sha256:93a755266856599be4ab6346273f192acde3102d7aa0735e2f48b456397a041f",
+ "sha256:98b8107ff14f5af0243f27d236bcc6e1ef8e7e3b3c25df114e91e3a99572da73",
+ "sha256:98e0bfa602e1942d542de077baf15d658bd9d5dcfe9b762aff791724c1c38b70",
+ "sha256:9a7c6232be5f809cd39da30ee5d24e6cadd919831e6020ec6c2391f4c3bc9264",
+ "sha256:9f338e71c45b69a482de8b11bf4a029993230760120c8c6e7c9b71760b6825a1",
+ "sha256:9f5fe634c9482ec5d4a6692afb8c45d370ae86755e5f57aa6c50bfe4ca2bdd87",
+ "sha256:a50856f49a4016ef56edd10caabdaf3608993f9faf1e05c3c7f4beeac46bd12a",
+ "sha256:a6dd36d4916cf57ddb05286ed40b09d034ca5d4bca85c17be0cb6a21290597d9",
+ "sha256:a9ad1f37894e3ffb76bbab76256e8a8b789657183870be11aa64e306bb5228fd",
+ "sha256:aafc42a1dc5e1beeba52cd83baa41372228d6d8266f6d803c16dbabbcc156255",
+ "sha256:adb40ca8ddfcd4edd07b0713a860be32bdf632687f656963bcbce84cea04b8d8",
+ "sha256:ae4574cb66cf1e85d32bb7e9ec45af5409c5b3970b7ceb8dea90168024127566",
+ "sha256:b1b065f370d54551dcc785c6f9eeb5bd517ae14c983d2784c064b3aa525896df",
+ "sha256:b5104b62711565e0ff6deab2a8f5dbf1fbe333c5155abe26d2cfd6f1849b6c87",
+ "sha256:b7b3eda607a019169f7187328a8d1648fb9a90265087f6903d7ee3a8eee01805",
+ "sha256:b7f4c65facdb94f44be759bbd9b6dda1fa54d0d6169cdf1a209a5ab97d311a75",
+ "sha256:b836f486dba0aceb2551e838ff3f514a38ee72b015364f739e526d720fdb823a",
+ "sha256:bef86df6d59667d9655905b02770a0c776d2853971c0773767d5ef8077acd624",
+ "sha256:c2b3dd5d206a12deca16870acc0d6e5036abeb70e3cad6549c294eff15591527",
+ "sha256:c33f9c841630b2bb7e69a3fb5c84a854075bb812c47620978bddc591f764da3d",
+ "sha256:c523620d14ebd03a8d473c89e05fa1ae152821920c3ff78b839218ff69e19ca3",
+ "sha256:cc269e74cad6043cb8a46d0ce580031ab642b5930562c2bb79aa7fbf9c858d26",
+ "sha256:cc64da907114d7a18b5e589057e3acaf2fec723d31c49e13fedf043592a3f6a7",
+ "sha256:ccbd0e7ea1a216315f63ffdc7cd09c55f57851afc8fe59a74184cb7316c0598b",
+ "sha256:cdb33ee9f8a8e4742c6b268fa6bd739024f34651a06b26913381b1413ebe7590",
+ "sha256:cfcccc08f671646ccb1e413c773bb92e7bba789e3a1796fd49d23c12539fe2e4",
+ "sha256:d21f188f6fe4fbf422e647ae9d5a68671d00218e187f91859c963d0738ccd88c",
+ "sha256:d25fdbce6459ccbbbf23b4b044f56fbd1158b97ac50994eaae2a1c0baae78301",
+ "sha256:d2eaf3839e52cbcc0accbe9817a67b4b0fcf70aaeb229cfddc1c28061f9ce5d8",
+ "sha256:d395a5cad0c09c7f096433e5fd4224d83b53298d53499945a9b0e5a971a84f3a",
+ "sha256:d7a217310429b43be95b3b8ad7f8fc41aba341109dc91e978cd7c703f928c58f",
+ "sha256:d8cf5f7cd6e4d5eb272baf6a54e182b2c237548d048e2882258336533f3f02b7",
+ "sha256:df8e8c21e67afb9d7fbe18f42c6111fe155e801ab103c81109a61312927cc611",
+ "sha256:e05752418b24bbd411841b256344c26f57da1148c5509e34ea39c7eb5099ab72",
+ "sha256:e1bdd2e6d0c5f9706ef7595773a81ca2b40f3b33fd7f9840b726fb00c6c4eb2e",
+ "sha256:e297c09972698c95649e89121e3550cee761ca3640cd005e24aaa2619175464e",
+ "sha256:e62779c6371bd2b21dbd1fdce89eaec2d93fd98179d36f61130b489f62294a92",
+ "sha256:e8ddb58961401da7d6f55f185512c0d6bd24f529a637078d41dd8ffa5a49c107",
+ "sha256:e9d824de871daa6e443b39ff495a884931970d567eb0dfa213d234337343835f",
+ "sha256:ed6f416bda1c9133000009d84d9409823eb2358df0950231cc936e4bf784eb97",
+ "sha256:ef0f5f03f61b0e5a57b1df7beafd83df993fd5811a09871bad6038d08e526d0d",
+ "sha256:f4797f821dc5d7c2b6fc818b89f8a3f37bcc900dd9e4369e6ebf1e525efce5db",
+ "sha256:f70f646751b6aa9d05be1fb40372f006cc89d6aad54e9d79ae97bd1f5fce5203",
+ "sha256:fd742c03885db1fce798a1cd87a20f47f144ccf26d75d52feb6f2bae3d57af05",
+ "sha256:fe5790a36d33a5d0a6a1f802aa42ecae282bf29ac6f7506d8e12510847b82a45",
+ "sha256:fedd316c165beed6307bf754dee54d3faca2c47e1f3bcbd67595001dfa11e969"
],
- "version": "==2024.1"
+ "index": "pypi",
+ "markers": "python_version >= '3.9'",
+ "version": "==3.13.0"
+ },
+ "requests": {
+ "hashes": [
+ "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c",
+ "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==2.32.4"
+ },
+ "rsa": {
+ "hashes": [
+ "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762",
+ "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75"
+ ],
+ "markers": "python_version >= '3.6' and python_version < '4'",
+ "version": "==4.9.1"
},
"setuptools": {
"hashes": [
- "sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54",
- "sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75"
+ "sha256:7c7854ee1429a240090297628dc9f75b35318d193537968e2dc14010ee2f5bca",
+ "sha256:dc2662692f47d99cb8ae15a784529adeed535bcd7c277fee0beccf961522baf6"
],
"index": "pypi",
"markers": "python_version >= '3.7'",
- "version": "==65.6.3"
+ "version": "==63.4.1"
},
"six": {
"hashes": [
- "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
- "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
+ "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274",
+ "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"
],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==1.16.0"
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
+ "version": "==1.17.0"
+ },
+ "typing-extensions": {
+ "hashes": [
+ "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36",
+ "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==4.14.1"
+ },
+ "urllib3": {
+ "hashes": [
+ "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760",
+ "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==2.5.0"
},
"wheel": {
"hashes": [
- "sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac",
- "sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8"
+ "sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a",
+ "sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4"
],
"index": "pypi",
- "markers": "python_version >= '3.7'",
- "version": "==0.38.4"
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
+ "version": "==0.37.1"
}
},
"develop": {
@@ -189,32 +578,40 @@
"sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee",
"sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"
],
- "markers": "sys_platform == 'darwin'",
+ "markers": "python_version >= '3.6'",
"version": "==0.1.4"
},
"astroid": {
"hashes": [
- "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c",
- "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"
+ "sha256:1e5a5011af2920c7c67a53f65d536d65bfa7116feeaf2354d8b94f29573bb0ce",
+ "sha256:54c760ae8322ece1abd213057c4b5bba7c49818853fc901ef09719a60dbf9dec"
],
- "markers": "python_full_version >= '3.7.2'",
- "version": "==2.15.8"
+ "markers": "python_full_version >= '3.9.0'",
+ "version": "==3.3.11"
+ },
+ "asttokens": {
+ "hashes": [
+ "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7",
+ "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==3.0.0"
},
"attrs": {
"hashes": [
- "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30",
- "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"
+ "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3",
+ "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"
],
- "markers": "python_version >= '3.7'",
- "version": "==23.2.0"
+ "markers": "python_version >= '3.8'",
+ "version": "==25.3.0"
},
"babel": {
"hashes": [
- "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb",
- "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"
+ "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d",
+ "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"
],
"markers": "python_version >= '3.8'",
- "version": "==2.15.0"
+ "version": "==2.17.0"
},
"backcall": {
"hashes": [
@@ -225,19 +622,22 @@
},
"beautifulsoup4": {
"hashes": [
- "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051",
- "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"
+ "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b",
+ "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195"
],
- "markers": "python_full_version >= '3.6.0'",
- "version": "==4.12.3"
+ "markers": "python_full_version >= '3.7.0'",
+ "version": "==4.13.4"
},
"bleach": {
+ "extras": [
+ "css"
+ ],
"hashes": [
- "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe",
- "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"
+ "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e",
+ "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f"
],
- "markers": "python_version >= '3.8'",
- "version": "==6.1.0"
+ "markers": "python_version >= '3.9'",
+ "version": "==6.2.0"
},
"bump2version": {
"hashes": [
@@ -257,107 +657,96 @@
},
"certifi": {
"hashes": [
- "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516",
- "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"
+ "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407",
+ "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5"
],
- "markers": "python_version >= '3.6'",
- "version": "==2024.6.2"
+ "markers": "python_version >= '3.7'",
+ "version": "==2025.8.3"
},
"charset-normalizer": {
"hashes": [
- "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027",
- "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087",
- "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786",
- "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8",
- "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09",
- "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185",
- "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574",
- "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e",
- "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519",
- "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898",
- "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269",
- "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3",
- "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f",
- "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6",
- "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8",
- "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a",
- "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73",
- "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc",
- "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714",
- "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2",
- "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc",
- "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce",
- "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d",
- "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e",
- "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6",
- "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269",
- "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96",
- "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d",
- "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a",
- "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4",
- "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77",
- "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d",
- "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0",
- "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed",
- "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068",
- "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac",
- "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25",
- "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8",
- "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab",
- "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26",
- "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2",
- "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db",
- "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f",
- "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5",
- "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99",
- "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c",
- "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d",
- "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811",
- "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa",
- "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a",
- "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03",
- "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b",
- "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04",
- "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c",
- "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001",
- "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458",
- "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389",
- "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99",
- "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985",
- "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537",
- "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238",
- "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f",
- "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d",
- "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796",
- "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a",
- "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143",
- "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8",
- "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c",
- "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5",
- "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5",
- "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711",
- "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4",
- "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6",
- "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c",
- "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7",
- "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4",
- "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b",
- "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae",
- "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12",
- "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c",
- "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae",
- "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8",
- "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887",
- "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b",
- "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4",
- "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f",
- "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5",
- "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33",
- "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519",
- "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"
+ "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91",
+ "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0",
+ "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154",
+ "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601",
+ "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884",
+ "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07",
+ "sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c",
+ "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64",
+ "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe",
+ "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f",
+ "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432",
+ "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc",
+ "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa",
+ "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9",
+ "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae",
+ "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19",
+ "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d",
+ "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e",
+ "sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4",
+ "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7",
+ "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312",
+ "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92",
+ "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31",
+ "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c",
+ "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f",
+ "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99",
+ "sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b",
+ "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15",
+ "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392",
+ "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f",
+ "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8",
+ "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491",
+ "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0",
+ "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc",
+ "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0",
+ "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f",
+ "sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a",
+ "sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40",
+ "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927",
+ "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849",
+ "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce",
+ "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14",
+ "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05",
+ "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c",
+ "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c",
+ "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a",
+ "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc",
+ "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34",
+ "sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9",
+ "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096",
+ "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14",
+ "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30",
+ "sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b",
+ "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b",
+ "sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942",
+ "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db",
+ "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5",
+ "sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b",
+ "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce",
+ "sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669",
+ "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0",
+ "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018",
+ "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93",
+ "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe",
+ "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049",
+ "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a",
+ "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef",
+ "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2",
+ "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca",
+ "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16",
+ "sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f",
+ "sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb",
+ "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1",
+ "sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557",
+ "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37",
+ "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7",
+ "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72",
+ "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c",
+ "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9"
],
- "markers": "python_full_version >= '3.7.0'",
- "version": "==3.3.2"
+ "markers": "python_version >= '3.7'",
+ "version": "==3.4.3"
},
"commonmark": {
"hashes": [
@@ -371,69 +760,105 @@
"toml"
],
"hashes": [
- "sha256:015eddc5ccd5364dcb902eaecf9515636806fa1e0d5bef5769d06d0f31b54523",
- "sha256:04aefca5190d1dc7a53a4c1a5a7f8568811306d7a8ee231c42fb69215571944f",
- "sha256:05ac5f60faa0c704c0f7e6a5cbfd6f02101ed05e0aee4d2822637a9e672c998d",
- "sha256:0bbddc54bbacfc09b3edaec644d4ac90c08ee8ed4844b0f86227dcda2d428fcb",
- "sha256:1d2a830ade66d3563bb61d1e3c77c8def97b30ed91e166c67d0632c018f380f0",
- "sha256:239a4e75e09c2b12ea478d28815acf83334d32e722e7433471fbf641c606344c",
- "sha256:244f509f126dc71369393ce5fea17c0592c40ee44e607b6d855e9c4ac57aac98",
- "sha256:25a5caf742c6195e08002d3b6c2dd6947e50efc5fc2c2205f61ecb47592d2d83",
- "sha256:296a7d9bbc598e8744c00f7a6cecf1da9b30ae9ad51c566291ff1314e6cbbed8",
- "sha256:2e079c9ec772fedbade9d7ebc36202a1d9ef7291bc9b3a024ca395c4d52853d7",
- "sha256:33ca90a0eb29225f195e30684ba4a6db05dbef03c2ccd50b9077714c48153cac",
- "sha256:33fc65740267222fc02975c061eb7167185fef4cc8f2770267ee8bf7d6a42f84",
- "sha256:341dd8f61c26337c37988345ca5c8ccabeff33093a26953a1ac72e7d0103c4fb",
- "sha256:34d6d21d8795a97b14d503dcaf74226ae51eb1f2bd41015d3ef332a24d0a17b3",
- "sha256:3538d8fb1ee9bdd2e2692b3b18c22bb1c19ffbefd06880f5ac496e42d7bb3884",
- "sha256:38a3b98dae8a7c9057bd91fbf3415c05e700a5114c5f1b5b0ea5f8f429ba6614",
- "sha256:3d5a67f0da401e105753d474369ab034c7bae51a4c31c77d94030d59e41df5bd",
- "sha256:50084d3516aa263791198913a17354bd1dc627d3c1639209640b9cac3fef5807",
- "sha256:55f689f846661e3f26efa535071775d0483388a1ccfab899df72924805e9e7cd",
- "sha256:5bc5a8c87714b0c67cfeb4c7caa82b2d71e8864d1a46aa990b5588fa953673b8",
- "sha256:62bda40da1e68898186f274f832ef3e759ce929da9a9fd9fcf265956de269dbc",
- "sha256:705f3d7c2b098c40f5b81790a5fedb274113373d4d1a69e65f8b68b0cc26f6db",
- "sha256:75e3f4e86804023e991096b29e147e635f5e2568f77883a1e6eed74512659ab0",
- "sha256:7b2a19e13dfb5c8e145c7a6ea959485ee8e2204699903c88c7d25283584bfc08",
- "sha256:7cec2af81f9e7569280822be68bd57e51b86d42e59ea30d10ebdbb22d2cb7232",
- "sha256:8383a6c8cefba1b7cecc0149415046b6fc38836295bc4c84e820872eb5478b3d",
- "sha256:8c836309931839cca658a78a888dab9676b5c988d0dd34ca247f5f3e679f4e7a",
- "sha256:8e317953bb4c074c06c798a11dbdd2cf9979dbcaa8ccc0fa4701d80042d4ebf1",
- "sha256:923b7b1c717bd0f0f92d862d1ff51d9b2b55dbbd133e05680204465f454bb286",
- "sha256:990fb20b32990b2ce2c5f974c3e738c9358b2735bc05075d50a6f36721b8f303",
- "sha256:9aad68c3f2566dfae84bf46295a79e79d904e1c21ccfc66de88cd446f8686341",
- "sha256:a5812840d1d00eafae6585aba38021f90a705a25b8216ec7f66aebe5b619fb84",
- "sha256:a6519d917abb15e12380406d721e37613e2a67d166f9fb7e5a8ce0375744cd45",
- "sha256:ab0b028165eea880af12f66086694768f2c3139b2c31ad5e032c8edbafca6ffc",
- "sha256:aea7da970f1feccf48be7335f8b2ca64baf9b589d79e05b9397a06696ce1a1ec",
- "sha256:b1196e13c45e327d6cd0b6e471530a1882f1017eb83c6229fc613cd1a11b53cd",
- "sha256:b368e1aee1b9b75757942d44d7598dcd22a9dbb126affcbba82d15917f0cc155",
- "sha256:bde997cac85fcac227b27d4fb2c7608a2c5f6558469b0eb704c5726ae49e1c52",
- "sha256:c4c2872b3c91f9baa836147ca33650dc5c172e9273c808c3c3199c75490e709d",
- "sha256:c59d2ad092dc0551d9f79d9d44d005c945ba95832a6798f98f9216ede3d5f485",
- "sha256:d1da0a2e3b37b745a2b2a678a4c796462cf753aebf94edcc87dcc6b8641eae31",
- "sha256:d8b7339180d00de83e930358223c617cc343dd08e1aa5ec7b06c3a121aec4e1d",
- "sha256:dd4b3355b01273a56b20c219e74e7549e14370b31a4ffe42706a8cda91f19f6d",
- "sha256:e08c470c2eb01977d221fd87495b44867a56d4d594f43739a8028f8646a51e0d",
- "sha256:f5102a92855d518b0996eb197772f5ac2a527c0ec617124ad5242a3af5e25f85",
- "sha256:f542287b1489c7a860d43a7d8883e27ca62ab84ca53c965d11dac1d3a1fab7ce",
- "sha256:f78300789a708ac1f17e134593f577407d52d0417305435b134805c4fb135adb",
- "sha256:f81bc26d609bf0fbc622c7122ba6307993c83c795d2d6f6f6fd8c000a770d974",
- "sha256:f836c174c3a7f639bded48ec913f348c4761cbf49de4a20a956d3431a7c9cb24",
- "sha256:fa21a04112c59ad54f69d80e376f7f9d0f5f9123ab87ecd18fbb9ec3a2beed56",
- "sha256:fcf7d1d6f5da887ca04302db8e0e0cf56ce9a5e05f202720e49b3e8157ddb9a9",
- "sha256:fd27d8b49e574e50caa65196d908f80e4dff64d7e592d0c59788b45aad7e8b35"
+ "sha256:03db599f213341e2960430984e04cf35fb179724e052a3ee627a068653cf4a7c",
+ "sha256:07009152f497a0464ffdf2634586787aea0e69ddd023eafb23fc38267db94b84",
+ "sha256:07790b4b37d56608536f7c1079bd1aa511567ac2966d33d5cec9cf520c50a7c8",
+ "sha256:08b989a06eb9dfacf96d42b7fb4c9a22bafa370d245dc22fa839f2168c6f9fa1",
+ "sha256:08e638a93c8acba13c7842953f92a33d52d73e410329acd472280d2a21a6c0e1",
+ "sha256:1007d6a2b3cf197c57105cc1ba390d9ff7f0bee215ced4dea530181e49c65ab4",
+ "sha256:187ecdcac21f9636d570e419773df7bd2fda2e7fa040f812e7f95d0bddf5f79a",
+ "sha256:18ecc5d1b9a8c570f6c9b808fa9a2b16836b3dd5414a6d467ae942208b095f85",
+ "sha256:1ae22b97003c74186e034a93e4f946c75fad8c0ce8d92fbbc168b5e15ee2841f",
+ "sha256:1af4461b25fe92889590d438905e1fc79a95680ec2a1ff69a591bb3fdb6c7157",
+ "sha256:1d4f9ce50b9261ad196dc2b2e9f1fbbee21651b54c3097a25ad783679fd18294",
+ "sha256:1f4e4d8e75f6fd3c6940ebeed29e3d9d632e1f18f6fb65d33086d99d4d073241",
+ "sha256:205a95b87ef4eb303b7bc5118b47b6b6604a644bcbdb33c336a41cfc0a08c06a",
+ "sha256:24581ed69f132b6225a31b0228ae4885731cddc966f8a33fe5987288bdbbbd5e",
+ "sha256:24d0c13de473b04920ddd6e5da3c08831b1170b8f3b17461d7429b61cad59ae0",
+ "sha256:25b902c5e15dea056485d782e420bb84621cc08ee75d5131ecb3dbef8bd1365f",
+ "sha256:2a90dd4505d3cc68b847ab10c5ee81822a968b5191664e8a0801778fa60459fa",
+ "sha256:2ae8e7c56290b908ee817200c0b65929b8050bc28530b131fe7c6dfee3e7d86b",
+ "sha256:30c601610a9b23807c5e9e2e442054b795953ab85d525c3de1b1b27cebeb2117",
+ "sha256:3262d19092771c83f3413831d9904b1ccc5f98da5de4ffa4ad67f5b20c7aaf7b",
+ "sha256:3564aae76bce4b96e2345cf53b4c87e938c4985424a9be6a66ee902626edec4c",
+ "sha256:3966bc9a76b09a40dc6063c8b10375e827ea5dfcaffae402dd65953bef4cba54",
+ "sha256:3da794db13cc27ca40e1ec8127945b97fab78ba548040047d54e7bfa6d442dca",
+ "sha256:416a8d74dc0adfd33944ba2f405897bab87b7e9e84a391e09d241956bd953ce1",
+ "sha256:419d2a0f769f26cb1d05e9ccbc5eab4cb5d70231604d47150867c07822acbdf4",
+ "sha256:424ea93a323aa0f7f01174308ea78bde885c3089ec1bef7143a6d93c3e24ef64",
+ "sha256:449c1e2d3a84d18bd204258a897a87bc57380072eb2aded6a5b5226046207b42",
+ "sha256:46eae7893ba65f53c71284585a262f083ef71594f05ec5c85baf79c402369098",
+ "sha256:488e9b50dc5d2aa9521053cfa706209e5acf5289e81edc28291a24f4e4488f46",
+ "sha256:4a50ad2524ee7e4c2a95e60d2b0b83283bdfc745fe82359d567e4f15d3823eb5",
+ "sha256:4af09c7574d09afbc1ea7da9dcea23665c01f3bc1b1feb061dac135f98ffc53a",
+ "sha256:4dd4564207b160d0d45c36a10bc0a3d12563028e8b48cd6459ea322302a156d7",
+ "sha256:4e27bebbd184ef8d1c1e092b74a2b7109dcbe2618dce6e96b1776d53b14b3fe8",
+ "sha256:53808194afdf948c462215e9403cca27a81cf150d2f9b386aee4dab614ae2ffe",
+ "sha256:54e409dd64e5302b2a8fdf44ec1c26f47abd1f45a2dcf67bd161873ee05a59b8",
+ "sha256:5b3801b79fb2ad61e3c7e2554bab754fc5f105626056980a2b9cf3aef4f13f84",
+ "sha256:5ca3c9530ee072b7cb6a6ea7b640bcdff0ad3b334ae9687e521e59f79b1d0437",
+ "sha256:5fb742309766d7e48e9eb4dc34bc95a424707bc6140c0e7d9726e794f11b92a0",
+ "sha256:669fe0d4e69c575c52148511029b722ba8d26e8a3129840c2ce0522e1452b256",
+ "sha256:6999920bdd73259ce11cabfc1307484f071ecc6abdb2ca58d98facbcefc70f16",
+ "sha256:6b1f91cbc78c7112ab84ed2a8defbccd90f888fcae40a97ddd6466b0bec6ae8a",
+ "sha256:6b4e25e0fa335c8aa26e42a52053f3786a61cc7622b4d54ae2dad994aa754fec",
+ "sha256:812ba9250532e4a823b070b0420a36499859542335af3dca8f47fc6aa1a05619",
+ "sha256:8dd2ba5f0c7e7e8cc418be2f0c14c4d9e3f08b8fb8e4c0f83c2fe87d03eb655e",
+ "sha256:8fd4ee2580b9fefbd301b4f8f85b62ac90d1e848bea54f89a5748cf132782118",
+ "sha256:913ceddb4289cbba3a310704a424e3fb7aac2bc0c3a23ea473193cb290cf17d4",
+ "sha256:992f48bf35b720e174e7fae916d943599f1a66501a2710d06c5f8104e0756ee1",
+ "sha256:9c8916d44d9e0fe6cdb2227dc6b0edd8bc6c8ef13438bbbf69af7482d9bb9833",
+ "sha256:9e92fa1f2bd5a57df9d00cf9ce1eb4ef6fccca4ceabec1c984837de55329db34",
+ "sha256:a181e4c2c896c2ff64c6312db3bda38e9ade2e1aa67f86a5628ae85873786cea",
+ "sha256:a374d4e923814e8b72b205ef6b3d3a647bb50e66f3558582eda074c976923613",
+ "sha256:a83d4f134bab2c7ff758e6bb1541dd72b54ba295ced6a63d93efc2e20cb9b124",
+ "sha256:b0bac054d45af7cd938834b43a9878b36ea92781bcb009eab040a5b09e9927e3",
+ "sha256:b0dc69c60224cda33d384572da945759756e3f06b9cdac27f302f53961e63160",
+ "sha256:b6df359e59fa243c9925ae6507e27f29c46698359f45e568fd51b9315dbbe587",
+ "sha256:b96524d6e4a3ce6a75c56bb15dbd08023b0ae2289c254e15b9fbdddf0c577416",
+ "sha256:b99e87304ffe0eb97c5308447328a584258951853807afdc58b16143a530518a",
+ "sha256:bce8b8180912914032785850d8f3aacb25ec1810f5f54afc4a8b114e7a9b55de",
+ "sha256:bd8df1f83c0703fa3ca781b02d36f9ec67ad9cb725b18d486405924f5e4270bd",
+ "sha256:bdb558a1d97345bde3a9f4d3e8d11c9e5611f748646e9bb61d7d612a796671b5",
+ "sha256:c112f04e075d3495fa3ed2200f71317da99608cbb2e9345bdb6de8819fc30571",
+ "sha256:c1e2e927ab3eadd7c244023927d646e4c15c65bb2ac7ae3c3e9537c013700d21",
+ "sha256:c2079d8cdd6f7373d628e14b3357f24d1db02c9dc22e6a007418ca7a2be0435a",
+ "sha256:c3623f929db885fab100cb88220a5b193321ed37e03af719efdbaf5d10b6e227",
+ "sha256:c5595fc4ad6a39312c786ec3326d7322d0cf10e3ac6a6df70809910026d67cfb",
+ "sha256:c65e2a5b32fbe1e499f1036efa6eb9cb4ea2bf6f7168d0e7a5852f3024f471b1",
+ "sha256:c9e6331a8f09cb1fc8bda032752af03c366870b48cce908875ba2620d20d0ad4",
+ "sha256:cc0ee4b2ccd42cab7ee6be46d8a67d230cb33a0a7cd47a58b587a7063b6c6b0e",
+ "sha256:ce01048199a91f07f96ca3074b0c14021f4fe7ffd29a3e6a188ac60a5c3a4af8",
+ "sha256:d48d2cb07d50f12f4f18d2bb75d9d19e3506c26d96fffabf56d22936e5ed8f7c",
+ "sha256:d52989685ff5bf909c430e6d7f6550937bc6d6f3e6ecb303c97a86100efd4596",
+ "sha256:d7c3d02c2866deb217dce664c71787f4b25420ea3eaf87056f44fb364a3528f5",
+ "sha256:da749daa7e141985487e1ff90a68315b0845930ed53dc397f4ae8f8bab25b551",
+ "sha256:dabe662312a97958e932dee056f2659051d822552c0b866823e8ba1c2fe64770",
+ "sha256:daeefff05993e5e8c6e7499a8508e7bd94502b6b9a9159c84fd1fe6bce3151cb",
+ "sha256:dec0d9bc15ee305e09fe2cd1911d3f0371262d3cfdae05d79515d8cb712b4869",
+ "sha256:e79367ef2cd9166acedcbf136a458dfe9a4a2dd4d1ee95738fb2ee581c56f667",
+ "sha256:eb329f1046888a36b1dc35504d3029e1dd5afe2196d94315d18c45ee380f67d5",
+ "sha256:ebc8791d346410d096818788877d675ca55c91db87d60e8f477bd41c6970ffc6",
+ "sha256:ec151569ddfccbf71bac8c422dce15e176167385a00cd86e887f9a80035ce8a5",
+ "sha256:ee221cf244757cdc2ac882e3062ab414b8464ad9c884c21e878517ea64b3fa26",
+ "sha256:f2ff2e2afdf0d51b9b8301e542d9c21a8d084fd23d4c8ea2b3a1b3c96f5f7397",
+ "sha256:f3126fb6a47d287f461d9b1aa5d1a8c97034d1dffb4f452f2cf211289dae74ef",
+ "sha256:f35580f19f297455f44afcd773c9c7a058e52eb6eb170aa31222e635f2e38b87",
+ "sha256:f4d1b837d1abf72187a61645dbf799e0d7705aa9232924946e1f57eb09a3bf00",
+ "sha256:f5983c132a62d93d71c9ef896a0b9bf6e6828d8d2ea32611f58684fba60bba35",
+ "sha256:f930a4d92b004b643183451fe9c8fe398ccf866ed37d172ebaccfd443a097f61",
+ "sha256:fe72cbdd12d9e0f4aca873fa6d755e103888a7f9085e4a62d282d9d5b9f7928c"
],
- "markers": "python_version >= '3.8'",
- "version": "==7.5.3"
+ "markers": "python_version >= '3.9'",
+ "version": "==7.10.3"
},
"decorator": {
"hashes": [
- "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330",
- "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"
+ "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360",
+ "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"
],
- "markers": "python_version >= '3.5'",
- "version": "==5.1.1"
+ "markers": "python_version >= '3.8'",
+ "version": "==5.2.1"
},
"defusedxml": {
"hashes": [
@@ -445,19 +870,19 @@
},
"dill": {
"hashes": [
- "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca",
- "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"
+ "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0",
+ "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049"
],
- "markers": "python_version < '3.11'",
- "version": "==0.3.8"
+ "markers": "python_version >= '3.8'",
+ "version": "==0.4.0"
},
"docutils": {
"hashes": [
- "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f",
- "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"
+ "sha256:4ed966a0e96a0477d852f7af31bdcb3adc049fbb35ccba358c2ea8a03287615e",
+ "sha256:ba9d57750e92331ebe7c08a1bbf7a7f8143b86c476acd51528b042216a6aad0f"
],
"markers": "python_version >= '3.9'",
- "version": "==0.21.2"
+ "version": "==0.22"
},
"dodgy": {
"hashes": [
@@ -468,26 +893,34 @@
},
"exceptiongroup": {
"hashes": [
- "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad",
- "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"
+ "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10",
+ "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88"
],
- "markers": "python_version < '3.11'",
- "version": "==1.2.1"
+ "markers": "python_version >= '3.7'",
+ "version": "==1.3.0"
+ },
+ "executing": {
+ "hashes": [
+ "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa",
+ "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==2.2.0"
},
"fastjsonschema": {
"hashes": [
- "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0",
- "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"
+ "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4",
+ "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"
],
- "version": "==2.19.1"
+ "version": "==2.21.1"
},
"flake8": {
"hashes": [
- "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db",
- "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"
+ "sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e",
+ "sha256:fe044858146b9fc69b551a4b490d69cf960fcb78ad1edcb84e7fbb1b4a8e3872"
],
- "markers": "python_full_version >= '3.6.1'",
- "version": "==5.0.4"
+ "markers": "python_version >= '3.9'",
+ "version": "==7.3.0"
},
"flake8-polyfill": {
"hashes": [
@@ -498,27 +931,27 @@
},
"gitdb": {
"hashes": [
- "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4",
- "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"
+ "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571",
+ "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"
],
"markers": "python_version >= '3.7'",
- "version": "==4.0.11"
+ "version": "==4.0.12"
},
"gitpython": {
"hashes": [
- "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c",
- "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"
+ "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c",
+ "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77"
],
"markers": "python_version >= '3.7'",
- "version": "==3.1.43"
+ "version": "==3.1.45"
},
"idna": {
"hashes": [
- "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc",
- "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"
+ "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9",
+ "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"
],
- "markers": "python_version >= '3.5'",
- "version": "==3.7"
+ "markers": "python_version >= '3.6'",
+ "version": "==3.10"
},
"imagesize": {
"hashes": [
@@ -530,84 +963,84 @@
},
"importlib-metadata": {
"hashes": [
- "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570",
- "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"
+ "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000",
+ "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"
],
- "markers": "python_version < '3.10'",
- "version": "==7.1.0"
+ "markers": "python_version >= '3.9'",
+ "version": "==8.7.0"
},
"iniconfig": {
"hashes": [
- "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3",
- "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"
+ "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7",
+ "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"
],
- "markers": "python_version >= '3.7'",
- "version": "==2.0.0"
+ "markers": "python_version >= '3.8'",
+ "version": "==2.1.0"
},
"ipython": {
"hashes": [
- "sha256:55df3e0bd0f94e715abd968bedd89d4e8a7bce4bf498fb123fed4f5398fea874",
- "sha256:b5548ec5329a4bcf054a5deed5099b0f9622eb9ea51aaa7104d215fece201d8c"
+ "sha256:b13a1d6c1f5818bd388db53b7107d17454129a70de2b87481d555daede5eb49e",
+ "sha256:b38c31e8fc7eff642fc7c597061fff462537cf2314e3225a19c906b7b0d8a345"
],
"index": "pypi",
- "markers": "python_version >= '3.7'",
- "version": "==7.31.1"
+ "markers": "python_version >= '3.8'",
+ "version": "==8.10.0"
},
"isort": {
"hashes": [
- "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109",
- "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"
+ "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450",
+ "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615"
],
- "markers": "python_full_version >= '3.8.0'",
- "version": "==5.13.2"
+ "markers": "python_full_version >= '3.9.0'",
+ "version": "==6.0.1"
},
"jedi": {
"hashes": [
- "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd",
- "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"
+ "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0",
+ "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"
],
"markers": "python_version >= '3.6'",
- "version": "==0.19.1"
+ "version": "==0.19.2"
},
"jinja2": {
"hashes": [
- "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369",
- "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"
+ "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d",
+ "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"
],
"markers": "python_version >= '3.7'",
- "version": "==3.1.4"
+ "version": "==3.1.6"
},
"jsonschema": {
"hashes": [
- "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7",
- "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"
+ "sha256:24c2e8da302de79c8b9382fee3e76b355e44d2a4364bb207159ce10b517bd716",
+ "sha256:e63acf5c11762c0e6672ffb61482bdf57f0876684d8d249c0fe2d730d48bc55f"
],
- "markers": "python_version >= '3.8'",
- "version": "==4.22.0"
+ "markers": "python_version >= '3.9'",
+ "version": "==4.25.0"
},
"jsonschema-specifications": {
"hashes": [
- "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc",
- "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"
+ "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af",
+ "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608"
],
- "markers": "python_version >= '3.8'",
- "version": "==2023.12.1"
+ "markers": "python_version >= '3.9'",
+ "version": "==2025.4.1"
},
"jupyter-client": {
"hashes": [
- "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df",
- "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f"
+ "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419",
+ "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"
],
"markers": "python_version >= '3.8'",
- "version": "==8.6.2"
+ "version": "==8.6.3"
},
"jupyter-core": {
"hashes": [
- "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409",
- "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"
+ "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941",
+ "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0"
],
"markers": "python_version >= '3.8'",
- "version": "==5.7.2"
+ "version": "==5.8.1"
},
"jupyterlab-pygments": {
"hashes": [
@@ -617,114 +1050,72 @@
"markers": "python_version >= '3.8'",
"version": "==0.3.0"
},
- "lazy-object-proxy": {
- "hashes": [
- "sha256:009e6bb1f1935a62889ddc8541514b6a9e1fcf302667dcb049a0be5c8f613e56",
- "sha256:02c83f957782cbbe8136bee26416686a6ae998c7b6191711a04da776dc9e47d4",
- "sha256:0aefc7591920bbd360d57ea03c995cebc204b424524a5bd78406f6e1b8b2a5d8",
- "sha256:127a789c75151db6af398b8972178afe6bda7d6f68730c057fbbc2e96b08d282",
- "sha256:18dd842b49456aaa9a7cf535b04ca4571a302ff72ed8740d06b5adcd41fe0757",
- "sha256:217138197c170a2a74ca0e05bddcd5f1796c735c37d0eee33e43259b192aa424",
- "sha256:2297f08f08a2bb0d32a4265e98a006643cd7233fb7983032bd61ac7a02956b3b",
- "sha256:2fc0a92c02fa1ca1e84fc60fa258458e5bf89d90a1ddaeb8ed9cc3147f417255",
- "sha256:30b339b2a743c5288405aa79a69e706a06e02958eab31859f7f3c04980853b70",
- "sha256:366c32fe5355ef5fc8a232c5436f4cc66e9d3e8967c01fb2e6302fd6627e3d94",
- "sha256:3ad54b9ddbe20ae9f7c1b29e52f123120772b06dbb18ec6be9101369d63a4074",
- "sha256:5ad9e6ed739285919aa9661a5bbed0aaf410aa60231373c5579c6b4801bd883c",
- "sha256:5faf03a7d8942bb4476e3b62fd0f4cf94eaf4618e304a19865abf89a35c0bbee",
- "sha256:75fc59fc450050b1b3c203c35020bc41bd2695ed692a392924c6ce180c6f1dc9",
- "sha256:76a095cfe6045c7d0ca77db9934e8f7b71b14645f0094ffcd842349ada5c5fb9",
- "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69",
- "sha256:782e2c9b2aab1708ffb07d4bf377d12901d7a1d99e5e410d648d892f8967ab1f",
- "sha256:7ab7004cf2e59f7c2e4345604a3e6ea0d92ac44e1c2375527d56492014e690c3",
- "sha256:80b39d3a151309efc8cc48675918891b865bdf742a8616a337cb0090791a0de9",
- "sha256:80fa48bd89c8f2f456fc0765c11c23bf5af827febacd2f523ca5bc1893fcc09d",
- "sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977",
- "sha256:92f09ff65ecff3108e56526f9e2481b8116c0b9e1425325e13245abfd79bdb1b",
- "sha256:952c81d415b9b80ea261d2372d2a4a2332a3890c2b83e0535f263ddfe43f0d43",
- "sha256:9a3a87cf1e133e5b1994144c12ca4aa3d9698517fe1e2ca82977781b16955658",
- "sha256:9e4ed0518a14dd26092614412936920ad081a424bdcb54cc13349a8e2c6d106a",
- "sha256:a899b10e17743683b293a729d3a11f2f399e8a90c73b089e29f5d0fe3509f0dd",
- "sha256:b1f711e2c6dcd4edd372cf5dec5c5a30d23bba06ee012093267b3376c079ec83",
- "sha256:b4f87d4ed9064b2628da63830986c3d2dca7501e6018347798313fcf028e2fd4",
- "sha256:cb73507defd385b7705c599a94474b1d5222a508e502553ef94114a143ec6696",
- "sha256:dc0d2fc424e54c70c4bc06787e4072c4f3b1aa2f897dfdc34ce1013cf3ceef05",
- "sha256:e221060b701e2aa2ea991542900dd13907a5c90fa80e199dbf5a03359019e7a3",
- "sha256:e271058822765ad5e3bca7f05f2ace0de58a3f4e62045a8c90a0dfd2f8ad8cc6",
- "sha256:e2adb09778797da09d2b5ebdbceebf7dd32e2c96f79da9052b2e87b6ea495895",
- "sha256:e333e2324307a7b5d86adfa835bb500ee70bfcd1447384a822e96495796b0ca4",
- "sha256:e98c8af98d5707dcdecc9ab0863c0ea6e88545d42ca7c3feffb6b4d1e370c7ba",
- "sha256:edb45bb8278574710e68a6b021599a10ce730d156e5b254941754a9cc0b17d03",
- "sha256:fec03caabbc6b59ea4a638bee5fce7117be8e99a4103d9d5ad77f15d6f81020c"
- ],
- "markers": "python_version >= '3.8'",
- "version": "==1.10.0"
- },
"markupsafe": {
"hashes": [
- "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf",
- "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff",
- "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f",
- "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3",
- "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532",
- "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f",
- "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617",
- "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df",
- "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4",
- "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906",
- "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f",
- "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4",
- "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8",
- "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371",
- "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2",
- "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465",
- "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52",
- "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6",
- "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169",
- "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad",
- "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2",
- "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0",
- "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029",
- "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f",
- "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a",
- "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced",
- "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5",
- "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c",
- "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf",
- "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9",
- "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb",
- "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad",
- "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3",
- "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1",
- "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46",
- "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc",
- "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a",
- "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee",
- "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900",
- "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5",
- "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea",
- "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f",
- "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5",
- "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e",
- "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a",
- "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f",
- "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50",
- "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a",
- "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b",
- "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4",
- "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff",
- "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2",
- "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46",
- "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b",
- "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf",
- "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5",
- "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5",
- "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab",
- "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd",
- "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"
+ "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4",
+ "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30",
+ "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0",
+ "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9",
+ "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396",
+ "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13",
+ "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028",
+ "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca",
+ "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557",
+ "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832",
+ "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0",
+ "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b",
+ "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579",
+ "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a",
+ "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c",
+ "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff",
+ "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c",
+ "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22",
+ "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094",
+ "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb",
+ "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e",
+ "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5",
+ "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a",
+ "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d",
+ "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a",
+ "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b",
+ "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8",
+ "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225",
+ "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c",
+ "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144",
+ "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f",
+ "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87",
+ "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d",
+ "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93",
+ "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf",
+ "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158",
+ "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84",
+ "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb",
+ "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48",
+ "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171",
+ "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c",
+ "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6",
+ "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd",
+ "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d",
+ "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1",
+ "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d",
+ "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca",
+ "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a",
+ "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29",
+ "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe",
+ "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798",
+ "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c",
+ "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8",
+ "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f",
+ "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f",
+ "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a",
+ "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178",
+ "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0",
+ "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79",
+ "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430",
+ "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"
],
- "markers": "python_version >= '3.7'",
- "version": "==2.1.5"
+ "markers": "python_version >= '3.9'",
+ "version": "==3.0.2"
},
"matplotlib-inline": {
"hashes": [
@@ -744,27 +1135,27 @@
},
"mistune": {
"hashes": [
- "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205",
- "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"
+ "sha256:1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9",
+ "sha256:a7035c21782b2becb6be62f8f25d3df81ccb4d6fa477a6525b15af06539f02a0"
],
- "markers": "python_version >= '3.7'",
- "version": "==3.0.2"
+ "markers": "python_version >= '3.8'",
+ "version": "==3.1.3"
},
"nbclient": {
"hashes": [
- "sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09",
- "sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f"
+ "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d",
+ "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193"
],
- "markers": "python_full_version >= '3.8.0'",
- "version": "==0.10.0"
+ "markers": "python_full_version >= '3.9.0'",
+ "version": "==0.10.2"
},
"nbconvert": {
"hashes": [
- "sha256:05873c620fe520b6322bf8a5ad562692343fe3452abda5765c7a34b7d1aa3eb3",
- "sha256:86ca91ba266b0a448dc96fa6c5b9d98affabde2867b363258703536807f9f7f4"
+ "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b",
+ "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582"
],
"markers": "python_version >= '3.8'",
- "version": "==7.16.4"
+ "version": "==7.16.6"
},
"nbformat": {
"hashes": [
@@ -776,12 +1167,12 @@
},
"nbsphinx": {
"hashes": [
- "sha256:042a60806fc23d519bc5bef59d95570713913fe442fda759d53e3aaf62104794",
- "sha256:22cb1d974a8300e8118ca71aea1f649553743c0c5830a54129dcd446e6a8ba17"
+ "sha256:7292c3767fea29e405c60743eee5393682a83982ab202ff98f5eb2db02629da8",
+ "sha256:abd298a686d55fa894ef697c51d44f24e53aa312dadae38e82920f250a5456fe"
],
"index": "pypi",
"markers": "python_version >= '3.6'",
- "version": "==0.9.4"
+ "version": "==0.9.7"
},
"numpydoc": {
"hashes": [
@@ -792,11 +1183,11 @@
},
"packaging": {
"hashes": [
- "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5",
- "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"
+ "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484",
+ "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"
],
- "markers": "python_version >= '3.7'",
- "version": "==24.0"
+ "markers": "python_version >= '3.8'",
+ "version": "==25.0"
},
"pandocfilters": {
"hashes": [
@@ -838,36 +1229,36 @@
},
"platformdirs": {
"hashes": [
- "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee",
- "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"
+ "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc",
+ "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"
],
- "markers": "python_version >= '3.8'",
- "version": "==4.2.2"
+ "markers": "python_version >= '3.9'",
+ "version": "==4.3.8"
},
"pluggy": {
"hashes": [
- "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1",
- "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"
+ "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3",
+ "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"
],
- "markers": "python_version >= '3.8'",
- "version": "==1.5.0"
+ "markers": "python_version >= '3.9'",
+ "version": "==1.6.0"
},
"prompt-toolkit": {
"hashes": [
- "sha256:45abe60a8300f3c618b23c16c4bb98c6fc80af8ce8b17c7ae92db48db3ee63c1",
- "sha256:869c50d682152336e23c4db7f74667639b5047494202ffe7670817053fd57795"
+ "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07",
+ "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed"
],
- "markers": "python_full_version >= '3.7.0'",
- "version": "==3.0.46"
+ "markers": "python_version >= '3.8'",
+ "version": "==3.0.51"
},
"prospector": {
"hashes": [
- "sha256:8567df2218cdc97d29f297ee3e3b54b96b3a2dab835931955c3a7bbd95aff6f7",
- "sha256:f29ab19fd430869eb34490761af77406d2cfedd9b50292cf4d8db0288c9d764a"
+ "sha256:44a92f5027bfbac4cc00b2598a773bf2a546067f5a7a6a525e7a1e96a2635a52",
+ "sha256:b99206e7f214c3823cff155cd458f507d45beae86b2dbcead2260eda570ed8db"
],
"index": "pypi",
- "markers": "python_version < '4.0' and python_full_version >= '3.7.2'",
- "version": "==1.10.3"
+ "markers": "python_version >= '3.9'",
+ "version": "==1.17.2"
},
"ptyprocess": {
"hashes": [
@@ -876,13 +1267,20 @@
],
"version": "==0.7.0"
},
+ "pure-eval": {
+ "hashes": [
+ "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0",
+ "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"
+ ],
+ "version": "==0.2.3"
+ },
"pycodestyle": {
"hashes": [
- "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785",
- "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"
+ "sha256:c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783",
+ "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d"
],
- "markers": "python_version >= '3.6'",
- "version": "==2.9.1"
+ "markers": "python_version >= '3.9'",
+ "version": "==2.14.0"
},
"pydata-sphinx-theme": {
"hashes": [
@@ -903,27 +1301,27 @@
},
"pyflakes": {
"hashes": [
- "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2",
- "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"
+ "sha256:b24f96fafb7d2ab0ec5075b7350b3d2d2218eab42003821c06344973d3ea2f58",
+ "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f"
],
- "markers": "python_version >= '3.6'",
- "version": "==2.5.0"
+ "markers": "python_version >= '3.9'",
+ "version": "==3.4.0"
},
"pygments": {
"hashes": [
- "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199",
- "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"
+ "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887",
+ "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"
],
"markers": "python_version >= '3.8'",
- "version": "==2.18.0"
+ "version": "==2.19.2"
},
"pylint": {
"hashes": [
- "sha256:27a8d4c7ddc8c2f8c18aa0050148f89ffc09838142193fdbe98f172781a3ff87",
- "sha256:f4fcac7ae74cfe36bc8451e931d8438e4a476c20314b1101c458ad0f05191fad"
+ "sha256:26698de19941363037e2937d3db9ed94fb3303fdadf7d98847875345a8bb6b05",
+ "sha256:7ef94aa692a600e82fabdd17102b73fc226758218c97473c7ad67bd4cb905d83"
],
- "markers": "python_full_version >= '3.7.2'",
- "version": "==2.17.7"
+ "markers": "python_full_version >= '3.9.0'",
+ "version": "==3.3.8"
},
"pylint-celery": {
"hashes": [
@@ -933,210 +1331,211 @@
},
"pylint-django": {
"hashes": [
- "sha256:0ac090d106c62fe33782a1d01bda1610b761bb1c9bf5035ced9d5f23a13d8591",
- "sha256:56b12b6adf56d548412445bd35483034394a1a94901c3f8571980a13882299d5"
+ "sha256:19e8c85a8573a04e3de7be2ba91e9a7c818ebf05e1b617be2bbae67a906b725f",
+ "sha256:359f68fe8c810ee6bc8e1ab4c83c19b15a43b234a24b08978f47a23462b5ce28"
],
- "version": "==2.5.3"
- },
- "pylint-flask": {
- "hashes": [
- "sha256:f4d97de2216bf7bfce07c9c08b166e978fe9f2725de2a50a9845a97de7e31517"
- ],
- "version": "==0.6"
+ "markers": "python_version >= '3.9' and python_version < '4.0'",
+ "version": "==2.6.1"
},
"pylint-plugin-utils": {
"hashes": [
- "sha256:b3d43e85ab74c4f48bb46ae4ce771e39c3a20f8b3d56982ab17aa73b4f98d535",
- "sha256:ce48bc0516ae9415dd5c752c940dfe601b18fe0f48aa249f2386adfa95a004dd"
+ "sha256:16e9b84e5326ba893a319a0323fcc8b4bcc9c71fc654fcabba0605596c673818",
+ "sha256:5468d763878a18d5cc4db46eaffdda14313b043c962a263a7d78151b90132055"
],
- "markers": "python_full_version >= '3.6.2'",
- "version": "==0.7"
+ "markers": "python_version >= '3.9' and python_version < '4.0'",
+ "version": "==0.9.0"
},
"pypandoc": {
"hashes": [
- "sha256:31652073c7960c2b03570bd1e94f602ca9bc3e70099df5ead4cea98ff5151c1e",
- "sha256:4c7d71bf2f1ed122aac287113b5c4d537a33bbc3c1df5aed11a7d4a7ac074681"
+ "sha256:4ededcc76c8770f27aaca6dff47724578428eca84212a31479403a9731fc2b16",
+ "sha256:ea25beebe712ae41d63f7410c08741a3cab0e420f6703f95bc9b3a749192ce13"
],
"index": "pypi",
- "markers": "python_version >= '3.6'",
- "version": "==1.13"
+ "markers": "python_version >= '3.7'",
+ "version": "==1.15"
},
"pytest": {
"hashes": [
- "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343",
- "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"
+ "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7",
+ "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c"
],
"index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==8.2.2"
+ "markers": "python_version >= '3.9'",
+ "version": "==8.4.1"
},
"pytest-cov": {
"hashes": [
- "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652",
- "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"
+ "sha256:25cc6cc0a5358204b8108ecedc51a9b57b34cc6b8c967cc2c01a4e00d8a67da2",
+ "sha256:f5bc4c23f42f1cdd23c70b1dab1bbaef4fc505ba950d53e0081d0730dd7e86d5"
],
"index": "pypi",
- "markers": "python_version >= '3.8'",
- "version": "==5.0.0"
+ "markers": "python_version >= '3.9'",
+ "version": "==6.2.1"
},
"python-dateutil": {
"hashes": [
"sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3",
"sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"
],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
"version": "==2.9.0.post0"
},
"pyyaml": {
"hashes": [
- "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5",
- "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc",
- "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df",
- "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741",
- "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206",
- "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27",
- "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595",
- "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62",
- "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98",
- "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696",
- "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290",
- "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9",
- "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d",
- "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6",
- "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867",
- "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47",
- "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486",
- "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6",
- "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3",
- "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007",
- "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938",
- "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0",
- "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c",
- "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735",
- "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d",
- "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28",
- "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4",
- "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba",
- "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8",
- "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef",
- "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5",
- "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd",
- "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3",
- "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0",
- "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515",
- "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c",
- "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c",
- "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924",
- "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34",
- "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43",
- "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859",
- "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673",
- "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54",
- "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a",
- "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b",
- "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab",
- "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa",
- "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c",
- "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585",
- "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d",
- "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"
+ "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff",
+ "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48",
+ "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086",
+ "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e",
+ "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133",
+ "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5",
+ "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484",
+ "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee",
+ "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5",
+ "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68",
+ "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a",
+ "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf",
+ "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99",
+ "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8",
+ "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85",
+ "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19",
+ "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc",
+ "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a",
+ "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1",
+ "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317",
+ "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c",
+ "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631",
+ "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d",
+ "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652",
+ "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5",
+ "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e",
+ "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b",
+ "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8",
+ "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476",
+ "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706",
+ "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563",
+ "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237",
+ "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b",
+ "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083",
+ "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180",
+ "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425",
+ "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e",
+ "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f",
+ "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725",
+ "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183",
+ "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab",
+ "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774",
+ "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725",
+ "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e",
+ "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5",
+ "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d",
+ "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290",
+ "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44",
+ "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed",
+ "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4",
+ "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba",
+ "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12",
+ "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"
],
- "markers": "python_version >= '3.6'",
- "version": "==6.0.1"
+ "markers": "python_version >= '3.8'",
+ "version": "==6.0.2"
},
"pyzmq": {
"hashes": [
- "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa",
- "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4",
- "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09",
- "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753",
- "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c",
- "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537",
- "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5",
- "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620",
- "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920",
- "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77",
- "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450",
- "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a",
- "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc",
- "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0",
- "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de",
- "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18",
- "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606",
- "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500",
- "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972",
- "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6",
- "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad",
- "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee",
- "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a",
- "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59",
- "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7",
- "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709",
- "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625",
- "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d",
- "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527",
- "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5",
- "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987",
- "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d",
- "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b",
- "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de",
- "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12",
- "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798",
- "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be",
- "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2",
- "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20",
- "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67",
- "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4",
- "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd",
- "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a",
- "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1",
- "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4",
- "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381",
- "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd",
- "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02",
- "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35",
- "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7",
- "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce",
- "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5",
- "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf",
- "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf",
- "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84",
- "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c",
- "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5",
- "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32",
- "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a",
- "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90",
- "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97",
- "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8",
- "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5",
- "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94",
- "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf",
- "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f",
- "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2",
- "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17",
- "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879",
- "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81",
- "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223",
- "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a",
- "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b",
- "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab",
- "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7",
- "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6",
- "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2",
- "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480",
- "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8",
- "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67",
- "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad",
- "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b",
- "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3",
- "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9",
- "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47",
- "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83",
- "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad",
- "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc"
+ "sha256:05a94233fdde585eb70924a6e4929202a747eea6ed308a6171c4f1c715bbe39e",
+ "sha256:092f4011b26d6b0201002f439bd74b38f23f3aefcb358621bdc3b230afc9b2d5",
+ "sha256:0ec09073ed67ae236785d543df3b322282acc0bdf6d1b748c3e81f3043b21cb5",
+ "sha256:0f772eea55cccce7f45d6ecdd1d5049c12a77ec22404f6b892fae687faa87bee",
+ "sha256:0fc24bf45e4a454e55ef99d7f5c8b8712539200ce98533af25a5bfa954b6b390",
+ "sha256:119ce8590409702394f959c159d048002cbed2f3c0645ec9d6a88087fc70f0f1",
+ "sha256:1843fd0daebcf843fe6d4da53b8bdd3fc906ad3e97d25f51c3fed44436d82a49",
+ "sha256:19dce6c93656f9c469540350d29b128cd8ba55b80b332b431b9a1e9ff74cfd01",
+ "sha256:1c363c6dc66352331d5ad64bb838765c6692766334a6a02fdb05e76bd408ae18",
+ "sha256:1d59dad4173dc2a111f03e59315c7bd6e73da1a9d20a84a25cf08325b0582b1a",
+ "sha256:1da8e645c655d86f0305fb4c65a0d848f461cd90ee07d21f254667287b5dbe50",
+ "sha256:2329f0c87f0466dce45bba32b63f47018dda5ca40a0085cc5c8558fea7d9fc55",
+ "sha256:27a78bdd384dbbe7b357af95f72efe8c494306b5ec0a03c31e2d53d6763e5307",
+ "sha256:2852f67371918705cc18b321695f75c5d653d5d8c4a9b946c1eec4dab2bd6fdf",
+ "sha256:313a7b374e3dc64848644ca348a51004b41726f768b02e17e689f1322366a4d9",
+ "sha256:351bf5d8ca0788ca85327fda45843b6927593ff4c807faee368cc5aaf9f809c2",
+ "sha256:4401649bfa0a38f0f8777f8faba7cd7eb7b5b8ae2abc7542b830dd09ad4aed0d",
+ "sha256:44909aa3ed2234d69fe81e1dade7be336bcfeab106e16bdaa3318dcde4262b93",
+ "sha256:45c3e00ce16896ace2cd770ab9057a7cf97d4613ea5f2a13f815141d8b6894b9",
+ "sha256:45c549204bc20e7484ffd2555f6cf02e572440ecf2f3bdd60d4404b20fddf64b",
+ "sha256:497bd8af534ae55dc4ef67eebd1c149ff2a0b0f1e146db73c8b5a53d83c1a5f5",
+ "sha256:4b9d8e26fb600d0d69cc9933e20af08552e97cc868a183d38a5c0d661e40dfbb",
+ "sha256:4bca8abc31799a6f3652d13f47e0b0e1cab76f9125f2283d085a3754f669b607",
+ "sha256:4c3874344fd5fa6d58bb51919708048ac4cab21099f40a227173cddb76b4c20b",
+ "sha256:4f6886c59ba93ffde09b957d3e857e7950c8fe818bd5494d9b4287bc6d5bc7f1",
+ "sha256:5268a5a9177afff53dc6d70dffe63114ba2a6e7b20d9411cc3adeba09eeda403",
+ "sha256:544b995a6a1976fad5d7ff01409b4588f7608ccc41be72147700af91fd44875d",
+ "sha256:56a3b1853f3954ec1f0e91085f1350cc57d18f11205e4ab6e83e4b7c414120e0",
+ "sha256:571f762aed89025ba8cdcbe355fea56889715ec06d0264fd8b6a3f3fa38154ed",
+ "sha256:57bb92abdb48467b89c2d21da1ab01a07d0745e536d62afd2e30d5acbd0092eb",
+ "sha256:58cca552567423f04d06a075f4b473e78ab5bdb906febe56bf4797633f54aa4e",
+ "sha256:64ca3c7c614aefcdd5e358ecdd41d1237c35fe1417d01ec0160e7cdb0a380edc",
+ "sha256:678e50ec112bdc6df5a83ac259a55a4ba97a8b314c325ab26b3b5b071151bc61",
+ "sha256:696900ef6bc20bef6a242973943574f96c3f97d2183c1bd3da5eea4f559631b1",
+ "sha256:6dcbcb34f5c9b0cefdfc71ff745459241b7d3cda5b27c7ad69d45afc0821d1e1",
+ "sha256:6f02f30a4a6b3efe665ab13a3dd47109d80326c8fd286311d1ba9f397dc5f247",
+ "sha256:70b719a130b81dd130a57ac0ff636dc2c0127c5b35ca5467d1b67057e3c7a4d2",
+ "sha256:72d235d6365ca73d8ce92f7425065d70f5c1e19baa458eb3f0d570e425b73a96",
+ "sha256:7418fb5736d0d39b3ecc6bec4ff549777988feb260f5381636d8bd321b653038",
+ "sha256:77fed80e30fa65708546c4119840a46691290efc231f6bfb2ac2a39b52e15811",
+ "sha256:7ebccf0d760bc92a4a7c751aeb2fef6626144aace76ee8f5a63abeb100cae87f",
+ "sha256:7fb0ee35845bef1e8c4a152d766242164e138c239e3182f558ae15cb4a891f94",
+ "sha256:87aebf4acd7249bdff8d3df03aed4f09e67078e6762cfe0aecf8d0748ff94cde",
+ "sha256:88dc92d9eb5ea4968123e74db146d770b0c8d48f0e2bfb1dbc6c50a8edb12d64",
+ "sha256:8c62297bc7aea2147b472ca5ca2b4389377ad82898c87cabab2a94aedd75e337",
+ "sha256:8f617f60a8b609a13099b313e7e525e67f84ef4524b6acad396d9ff153f6e4cd",
+ "sha256:90a4da42aa322de8a3522461e3b5fe999935763b27f69a02fced40f4e3cf9682",
+ "sha256:95594b2ceeaa94934e3e94dd7bf5f3c3659cf1a26b1fb3edcf6e42dad7e0eaf2",
+ "sha256:9729190bd770314f5fbba42476abf6abe79a746eeda11d1d68fd56dd70e5c296",
+ "sha256:9d16fdfd7d70a6b0ca45d36eb19f7702fa77ef6256652f17594fc9ce534c9da6",
+ "sha256:9d7b6b90da7285642f480b48c9efd1d25302fd628237d8f6f6ee39ba6b2d2d34",
+ "sha256:a066ea6ad6218b4c233906adf0ae67830f451ed238419c0db609310dd781fbe7",
+ "sha256:a27fa11ebaccc099cac4309c799aa33919671a7660e29b3e465b7893bc64ec81",
+ "sha256:a4aca06ba295aa78bec9b33ec028d1ca08744c36294338c41432b7171060c808",
+ "sha256:af2ee67b3688b067e20fea3fe36b823a362609a1966e7e7a21883ae6da248804",
+ "sha256:af7ebce2a1e7caf30c0bb64a845f63a69e76a2fadbc1cac47178f7bb6e657bdd",
+ "sha256:b007e5dcba684e888fbc90554cb12a2f4e492927c8c2761a80b7590209821743",
+ "sha256:b25e72e115399a4441aad322258fa8267b873850dc7c276e3f874042728c2b45",
+ "sha256:b978c0678cffbe8860ec9edc91200e895c29ae1ac8a7085f947f8e8864c489fb",
+ "sha256:b99ea9d330e86ce1ff7f2456b33f1bf81c43862a5590faf4ef4ed3a63504bdab",
+ "sha256:b9fd0fda730461f510cfd9a40fafa5355d65f5e3dbdd8d6dfa342b5b3f5d1949",
+ "sha256:ba068f28028849da725ff9185c24f832ccf9207a40f9b28ac46ab7c04994bd41",
+ "sha256:be45a895f98877271e8a0b6cf40925e0369121ce423421c20fa6d7958dc753c2",
+ "sha256:bee5248d5ec9223545f8cc4f368c2d571477ae828c99409125c3911511d98245",
+ "sha256:c512824360ea7490390566ce00bee880e19b526b312b25cc0bc30a0fe95cb67f",
+ "sha256:c9180d1f5b4b73e28b64e63cc6c4c097690f102aa14935a62d5dd7426a4e5b5a",
+ "sha256:c96702e1082eab62ae583d64c4e19c9b848359196697e536a0c57ae9bd165bd5",
+ "sha256:c9d63d66059114a6756d09169c9209ffceabacb65b9cb0f66e6fc344b20b73e6",
+ "sha256:ce181dd1a7c6c012d0efa8ab603c34b5ee9d86e570c03415bbb1b8772eeb381c",
+ "sha256:d0356a21e58c3e99248930ff73cc05b1d302ff50f41a8a47371aefb04327378a",
+ "sha256:d0b96c30be9f9387b18b18b6133c75a7b1b0065da64e150fe1feb5ebf31ece1c",
+ "sha256:d2976b7079f09f48d59dc123293ed6282fca6ef96a270f4ea0364e4e54c8e855",
+ "sha256:d97b59cbd8a6c8b23524a8ce237ff9504d987dc07156258aa68ae06d2dd5f34d",
+ "sha256:da81512b83032ed6cdf85ca62e020b4c23dda87f1b6c26b932131222ccfdbd27",
+ "sha256:df2c55c958d3766bdb3e9d858b911288acec09a9aab15883f384fc7180df5bed",
+ "sha256:dfb2bb5e0f7198eaacfb6796fb0330afd28f36d985a770745fba554a5903595a",
+ "sha256:e4f22d67756518d71901edf73b38dc0eb4765cce22c8fe122cc81748d425262b",
+ "sha256:e648dca28178fc879c814cf285048dd22fd1f03e1104101106505ec0eea50a4d",
+ "sha256:e971d8680003d0af6020713e52f92109b46fedb463916e988814e04c8133578a",
+ "sha256:ee16906c8025fa464bea1e48128c048d02359fb40bebe5333103228528506530",
+ "sha256:f293a1419266e3bf3557d1f8778f9e1ffe7e6b2c8df5c9dca191caf60831eb74",
+ "sha256:f379f11e138dfd56c3f24a04164f871a08281194dd9ddf656a278d7d080c8ad0",
+ "sha256:f44e7ea288d022d4bf93b9e79dafcb4a7aea45a3cbeae2116792904931cefccf",
+ "sha256:f5b6133c8d313bde8bd0d123c169d22525300ff164c2189f849de495e1344577",
+ "sha256:f65741cc06630652e82aa68ddef4986a3ab9073dd46d59f94ce5f005fa72037c",
+ "sha256:f8c3b74f1cd577a5a9253eae7ed363f88cbb345a990ca3027e9038301d47c7f4",
+ "sha256:f96a63aecec22d3f7fdea3c6c98df9e42973f5856bb6812c3d8d78c262fee808",
+ "sha256:f98f6b7787bd2beb1f0dde03f23a0621a0c978edf673b7d8f5e7bc039cbe1b60",
+ "sha256:fde26267416c8478c95432c81489b53f57b0b5d24cd5c8bfaebf5bbaac4dc90c",
+ "sha256:fe632fa4501154d58dfbe1764a0495734d55f84eaf1feda4549a1f1ca76659e9",
+ "sha256:ff3f8757570e45da7a5bedaa140489846510014f7a9d5ee9301c61f3f1b8a686",
+ "sha256:ffe6b809a97ac6dea524b3b837d5b28743d8c2f121141056d168ff0ba8f614ef"
],
- "markers": "python_version >= '3.7'",
- "version": "==26.0.3"
+ "markers": "python_version >= '3.8'",
+ "version": "==27.0.1"
},
"recommonmark": {
"hashes": [
@@ -1148,140 +1547,196 @@
},
"referencing": {
"hashes": [
- "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c",
- "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"
+ "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa",
+ "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"
],
- "markers": "python_version >= '3.8'",
- "version": "==0.35.1"
+ "markers": "python_version >= '3.9'",
+ "version": "==0.36.2"
},
"requests": {
"hashes": [
- "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760",
- "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"
+ "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c",
+ "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"
],
"markers": "python_version >= '3.8'",
- "version": "==2.32.3"
+ "version": "==2.32.4"
},
"requirements-detector": {
"hashes": [
- "sha256:3642cd7a5b261d79536c36bb7ecacf2adabd902d2e0e42bfb2ba82515da10501",
- "sha256:d7c60493bf166da3dd59de0e6cb25765e0e32a1931aeae92614034e5786d0bd0"
+ "sha256:0326c39269d87504c0e1b75932b86a6fdaa8a9eb3ce82243e5a21b696c2ade76",
+ "sha256:d76592a688e2f4553e6d1eb95ac3be0ec105549bc21348712aa12d714c1cd28f"
],
- "markers": "python_version >= '3.7' and python_version < '4.0'",
- "version": "==1.2.2"
+ "markers": "python_version >= '3.9' and python_version < '4.0'",
+ "version": "==1.4.0"
},
"rpds-py": {
"hashes": [
- "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee",
- "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc",
- "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc",
- "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944",
- "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20",
- "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7",
- "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4",
- "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6",
- "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6",
- "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93",
- "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633",
- "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0",
- "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360",
- "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8",
- "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139",
- "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7",
- "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a",
- "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9",
- "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26",
- "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724",
- "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72",
- "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b",
- "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09",
- "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100",
- "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3",
- "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261",
- "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3",
- "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9",
- "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b",
- "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3",
- "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de",
- "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d",
- "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e",
- "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8",
- "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff",
- "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5",
- "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c",
- "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e",
- "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e",
- "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4",
- "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8",
- "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922",
- "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338",
- "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d",
- "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8",
- "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2",
- "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72",
- "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80",
- "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644",
- "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae",
- "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163",
- "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104",
- "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d",
- "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60",
- "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a",
- "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d",
- "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07",
- "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49",
- "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10",
- "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f",
- "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2",
- "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8",
- "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7",
- "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88",
- "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65",
- "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0",
- "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909",
- "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8",
- "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c",
- "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184",
- "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397",
- "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a",
- "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346",
- "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590",
- "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333",
- "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb",
- "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74",
- "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e",
- "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d",
- "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa",
- "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f",
- "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53",
- "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1",
- "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac",
- "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0",
- "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd",
- "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611",
- "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f",
- "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c",
- "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5",
- "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab",
- "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc",
- "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43",
- "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da",
- "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac",
- "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843",
- "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e",
- "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89",
- "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"
+ "sha256:010c4843a3b92b54373e3d2291a7447d6c3fc29f591772cc2ea0e9f5c1da434b",
+ "sha256:05284439ebe7d9f5f5a668d4d8a0a1d851d16f7d47c78e1fab968c8ad30cab04",
+ "sha256:0665be515767dc727ffa5f74bd2ef60b0ff85dad6bb8f50d91eaa6b5fb226f51",
+ "sha256:069e0384a54f427bd65d7fda83b68a90606a3835901aaff42185fcd94f5a9295",
+ "sha256:08680820d23df1df0a0260f714d12966bc6c42d02e8055a91d61e03f0c47dda0",
+ "sha256:0954e3a92e1d62e83a54ea7b3fdc9efa5d61acef8488a8a3d31fdafbfb00460d",
+ "sha256:09965b314091829b378b60607022048953e25f0b396c2b70e7c4c81bcecf932e",
+ "sha256:0c431bfb91478d7cbe368d0a699978050d3b112d7f1d440a41e90faa325557fd",
+ "sha256:0f401c369186a5743694dd9fc08cba66cf70908757552e1f714bfc5219c655b5",
+ "sha256:0f4f69d7a4300fbf91efb1fb4916421bd57804c01ab938ab50ac9c4aa2212f03",
+ "sha256:11e8e28c0ba0373d052818b600474cfee2fafa6c9f36c8587d217b13ee28ca7d",
+ "sha256:130c1ffa5039a333f5926b09e346ab335f0d4ec393b030a18549a7c7e7c2cea4",
+ "sha256:1321bce595ad70e80f97f998db37356b2e22cf98094eba6fe91782e626da2f71",
+ "sha256:13bbc4846ae4c993f07c93feb21a24d8ec637573d567a924b1001e81c8ae80f9",
+ "sha256:14f028eb47f59e9169bfdf9f7ceafd29dd64902141840633683d0bad5b04ff34",
+ "sha256:15ea4d2e182345dd1b4286593601d766411b43f868924afe297570658c31a62b",
+ "sha256:181bc29e59e5e5e6e9d63b143ff4d5191224d355e246b5a48c88ce6b35c4e466",
+ "sha256:183f5e221ba3e283cd36fdfbe311d95cd87699a083330b4f792543987167eff1",
+ "sha256:184f0d7b342967f6cda94a07d0e1fae177d11d0b8f17d73e06e36ac02889f303",
+ "sha256:190d7285cd3bb6d31d37a0534d7359c1ee191eb194c511c301f32a4afa5a1dd4",
+ "sha256:19c990fdf5acecbf0623e906ae2e09ce1c58947197f9bced6bbd7482662231c4",
+ "sha256:1d66f45b9399036e890fb9c04e9f70c33857fd8f58ac8db9f3278cfa835440c3",
+ "sha256:203f581accef67300a942e49a37d74c12ceeef4514874c7cede21b012613ca2c",
+ "sha256:20e222a44ae9f507d0f2678ee3dd0c45ec1e930f6875d99b8459631c24058aec",
+ "sha256:2406d034635d1497c596c40c85f86ecf2bf9611c1df73d14078af8444fe48031",
+ "sha256:249ab91ceaa6b41abc5f19513cb95b45c6f956f6b89f1fe3d99c81255a849f9e",
+ "sha256:25a4aebf8ca02bbb90a9b3e7a463bbf3bee02ab1c446840ca07b1695a68ce424",
+ "sha256:27bac29bbbf39601b2aab474daf99dbc8e7176ca3389237a23944b17f8913d97",
+ "sha256:299a245537e697f28a7511d01038c310ac74e8ea213c0019e1fc65f52c0dcb23",
+ "sha256:2cff9bdd6c7b906cc562a505c04a57d92e82d37200027e8d362518df427f96cd",
+ "sha256:2e307cb5f66c59ede95c00e93cd84190a5b7f3533d7953690b2036780622ba81",
+ "sha256:2e39169ac6aae06dd79c07c8a69d9da867cef6a6d7883a0186b46bb46ccfb0c3",
+ "sha256:2fe6e18e5c8581f0361b35ae575043c7029d0a92cb3429e6e596c2cdde251432",
+ "sha256:3001013dae10f806380ba739d40dee11db1ecb91684febb8406a87c2ded23dae",
+ "sha256:32196b5a99821476537b3f7732432d64d93a58d680a52c5e12a190ee0135d8b5",
+ "sha256:33ba649a6e55ae3808e4c39e01580dc9a9b0d5b02e77b66bb86ef117922b1264",
+ "sha256:341d8acb6724c0c17bdf714319c393bb27f6d23d39bc74f94221b3e59fc31828",
+ "sha256:343cf24de9ed6c728abefc5d5c851d5de06497caa7ac37e5e65dd572921ed1b5",
+ "sha256:36184b44bf60a480863e51021c26aca3dfe8dd2f5eeabb33622b132b9d8b8b54",
+ "sha256:3841f66c1ffdc6cebce8aed64e36db71466f1dc23c0d9a5592e2a782a3042c79",
+ "sha256:4045e2fc4b37ec4b48e8907a5819bdd3380708c139d7cc358f03a3653abedb89",
+ "sha256:419dd9c98bcc9fb0242be89e0c6e922df333b975d4268faa90d58499fd9c9ebe",
+ "sha256:42894616da0fc0dcb2ec08a77896c3f56e9cb2f4b66acd76fc8992c3557ceb1c",
+ "sha256:42ccc57ff99166a55a59d8c7d14f1a357b7749f9ed3584df74053fd098243451",
+ "sha256:4300e15e7d03660f04be84a125d1bdd0e6b2f674bc0723bc0fd0122f1a4585dc",
+ "sha256:443d239d02d9ae55b74015234f2cd8eb09e59fbba30bf60baeb3123ad4c6d5ff",
+ "sha256:44524b96481a4c9b8e6c46d6afe43fa1fb485c261e359fbe32b63ff60e3884d8",
+ "sha256:45d04a73c54b6a5fd2bab91a4b5bc8b426949586e61340e212a8484919183859",
+ "sha256:46f48482c1a4748ab2773f75fffbdd1951eb59794e32788834b945da857c47a8",
+ "sha256:4790c9d5dd565ddb3e9f656092f57268951398cef52e364c405ed3112dc7c7c1",
+ "sha256:4bc262ace5a1a7dc3e2eac2fa97b8257ae795389f688b5adf22c5db1e2431c43",
+ "sha256:4c3f8a0d4802df34fcdbeb3dfe3a4d8c9a530baea8fafdf80816fcaac5379d83",
+ "sha256:5355527adaa713ab693cbce7c1e0ec71682f599f61b128cf19d07e5c13c9b1f1",
+ "sha256:555ed147cbe8c8f76e72a4c6cd3b7b761cbf9987891b9448808148204aed74a5",
+ "sha256:55d42a0ef2bdf6bc81e1cc2d49d12460f63c6ae1423c4f4851b828e454ccf6f1",
+ "sha256:59195dc244fc183209cf8a93406889cadde47dfd2f0a6b137783aa9c56d67c85",
+ "sha256:59714ab0a5af25d723d8e9816638faf7f4254234decb7d212715c1aa71eee7be",
+ "sha256:5b3a5c8089eed498a3af23ce87a80805ff98f6ef8f7bdb70bd1b7dae5105f6ac",
+ "sha256:5d6790ff400254137b81b8053b34417e2c46921e302d655181d55ea46df58cf7",
+ "sha256:5df559e9e7644d9042f626f2c3997b555f347d7a855a15f170b253f6c5bfe358",
+ "sha256:5fa01b3d5e3b7d97efab65bd3d88f164e289ec323a8c033c5c38e53ee25c007e",
+ "sha256:61490d57e82e23b45c66f96184237994bfafa914433b8cd1a9bb57fecfced59d",
+ "sha256:6168af0be75bba990a39f9431cdfae5f0ad501f4af32ae62e8856307200517b8",
+ "sha256:64a0fe3f334a40b989812de70160de6b0ec7e3c9e4a04c0bbc48d97c5d3600ae",
+ "sha256:64f689ab822f9b5eb6dfc69893b4b9366db1d2420f7db1f6a2adf2a9ca15ad64",
+ "sha256:699c346abc73993962cac7bb4f02f58e438840fa5458a048d3a178a7a670ba86",
+ "sha256:6b96b0b784fe5fd03beffff2b1533dc0d85e92bab8d1b2c24ef3a5dc8fac5669",
+ "sha256:6bde37765564cd22a676dd8101b657839a1854cfaa9c382c5abf6ff7accfd4ae",
+ "sha256:6c135708e987f46053e0a1246a206f53717f9fadfba27174a9769ad4befba5c3",
+ "sha256:6c27a7054b5224710fcfb1a626ec3ff4f28bcb89b899148c72873b18210e446b",
+ "sha256:6de6a7f622860af0146cb9ee148682ff4d0cea0b8fd3ad51ce4d40efb2f061d0",
+ "sha256:737005088449ddd3b3df5a95476ee1c2c5c669f5c30eed909548a92939c0e12d",
+ "sha256:7451ede3560086abe1aa27dcdcf55cd15c96b56f543fb12e5826eee6f721f858",
+ "sha256:7873b65686a6471c0037139aa000d23fe94628e0daaa27b6e40607c90e3f5ec4",
+ "sha256:79af163a4b40bbd8cfd7ca86ec8b54b81121d3b213b4435ea27d6568bcba3e9d",
+ "sha256:7aed8118ae20515974650d08eb724150dc2e20c2814bcc307089569995e88a14",
+ "sha256:7cf9bc4508efb18d8dff6934b602324eb9f8c6644749627ce001d6f38a490889",
+ "sha256:7e57906e38583a2cba67046a09c2637e23297618dc1f3caddbc493f2be97c93f",
+ "sha256:7ec85994f96a58cf7ed288caa344b7fe31fd1d503bdf13d7331ead5f70ab60d5",
+ "sha256:81f81bbd7cdb4bdc418c09a73809abeda8f263a6bf8f9c7f93ed98b5597af39d",
+ "sha256:86aca1616922b40d8ac1b3073a1ead4255a2f13405e5700c01f7c8d29a03972d",
+ "sha256:88051c3b7d5325409f433c5a40328fcb0685fc04e5db49ff936e910901d10114",
+ "sha256:887ab1f12b0d227e9260558a4a2320024b20102207ada65c43e1ffc4546df72e",
+ "sha256:8a06aa1197ec0281eb1d7daf6073e199eb832fe591ffa329b88bae28f25f5fe5",
+ "sha256:8a1dca5507fa1337f75dcd5070218b20bc68cf8844271c923c1b79dfcbc20391",
+ "sha256:8b23cf252f180cda89220b378d917180f29d313cd6a07b2431c0d3b776aae86f",
+ "sha256:8d0e09cf4863c74106b5265c2c310f36146e2b445ff7b3018a56799f28f39f6f",
+ "sha256:8de567dec6d451649a781633d36f5c7501711adee329d76c095be2178855b042",
+ "sha256:90fb790138c1a89a2e58c9282fe1089638401f2f3b8dddd758499041bc6e0774",
+ "sha256:92f3b3ec3e6008a1fe00b7c0946a170f161ac00645cde35e3c9a68c2475e8156",
+ "sha256:935afcdea4751b0ac918047a2df3f720212892347767aea28f5b3bf7be4f27c0",
+ "sha256:9a0ff7ee28583ab30a52f371b40f54e7138c52ca67f8ca17ccb7ccf0b383cb5f",
+ "sha256:9ad08547995a57e74fea6abaf5940d399447935faebbd2612b3b0ca6f987946b",
+ "sha256:9b2a4e17bfd68536c3b801800941c95a1d4a06e3cada11c146093ba939d9638d",
+ "sha256:9b78430703cfcf5f5e86eb74027a1ed03a93509273d7c705babb547f03e60016",
+ "sha256:9d0f92b78cfc3b74a42239fdd8c1266f4715b573204c234d2f9fc3fc7a24f185",
+ "sha256:9da162b718b12c4219eeeeb68a5b7552fbc7aadedf2efee440f88b9c0e54b45d",
+ "sha256:a00c91104c173c9043bc46f7b30ee5e6d2f6b1149f11f545580f5d6fdff42c0b",
+ "sha256:a029be818059870664157194e46ce0e995082ac49926f1423c1f058534d2aaa9",
+ "sha256:a1b3db5fae5cbce2131b7420a3f83553d4d89514c03d67804ced36161fe8b6b2",
+ "sha256:a4cf32a26fa744101b67bfd28c55d992cd19438aff611a46cac7f066afca8fd4",
+ "sha256:aa0bf113d15e8abdfee92aa4db86761b709a09954083afcb5bf0f952d6065fdb",
+ "sha256:ab47fe727c13c09d0e6f508e3a49e545008e23bf762a245b020391b621f5b726",
+ "sha256:af22763a0a1eff106426a6e1f13c4582e0d0ad89c1493ab6c058236174cd6c6a",
+ "sha256:af9d4fd79ee1cc8e7caf693ee02737daabfc0fcf2773ca0a4735b356c8ad6f7c",
+ "sha256:b1fef1f13c842a39a03409e30ca0bf87b39a1e2a305a9924deadb75a43105d23",
+ "sha256:b2eff8ee57c5996b0d2a07c3601fb4ce5fbc37547344a26945dd9e5cbd1ed27a",
+ "sha256:b4c4fbbcff474e1e5f38be1bf04511c03d492d42eec0babda5d03af3b5589374",
+ "sha256:b8a4131698b6992b2a56015f51646711ec5d893a0b314a4b985477868e240c87",
+ "sha256:b8a7acf04fda1f30f1007f3cc96d29d8cf0a53e626e4e1655fdf4eabc082d367",
+ "sha256:ba783541be46f27c8faea5a6645e193943c17ea2f0ffe593639d906a327a9bcc",
+ "sha256:be0744661afbc4099fef7f4e604e7f1ea1be1dd7284f357924af12a705cc7d5c",
+ "sha256:be3964f7312ea05ed283b20f87cb533fdc555b2e428cc7be64612c0b2124f08c",
+ "sha256:be806e2961cd390a89d6c3ce8c2ae34271cfcd05660f716257838bb560f1c3b6",
+ "sha256:bec77545d188f8bdd29d42bccb9191682a46fb2e655e3d1fb446d47c55ac3b8d",
+ "sha256:c10d92fb6d7fd827e44055fcd932ad93dac6a11e832d51534d77b97d1d85400f",
+ "sha256:c3782fb753aa825b4ccabc04292e07897e2fd941448eabf666856c5530277626",
+ "sha256:c9ce7a9e967afc0a2af7caa0d15a3e9c1054815f73d6a8cb9225b61921b419bd",
+ "sha256:cb0702c12983be3b2fab98ead349ac63a98216d28dda6f518f52da5498a27a1b",
+ "sha256:cbc619e84a5e3ab2d452de831c88bdcad824414e9c2d28cd101f94dbdf26329c",
+ "sha256:ce4ed8e0c7dbc5b19352b9c2c6131dd23b95fa8698b5cdd076307a33626b72dc",
+ "sha256:ce96ab0bdfcef1b8c371ada2100767ace6804ea35aacce0aef3aeb4f3f499ca8",
+ "sha256:cf824aceaeffff029ccfba0da637d432ca71ab21f13e7f6f5179cd88ebc77a8a",
+ "sha256:d2a81bdcfde4245468f7030a75a37d50400ac2455c3a4819d9d550c937f90ab5",
+ "sha256:d2cc2b34f9e1d31ce255174da82902ad75bd7c0d88a33df54a77a22f2ef421ee",
+ "sha256:d2f184336bc1d6abfaaa1262ed42739c3789b1e3a65a29916a615307d22ffd2e",
+ "sha256:d3c622c39f04d5751408f5b801ecb527e6e0a471b367f420a877f7a660d583f6",
+ "sha256:d7cf5e726b6fa977e428a61880fb108a62f28b6d0c7ef675b117eaff7076df49",
+ "sha256:d85d784c619370d9329bbd670f41ff5f2ae62ea4519761b679d0f57f0f0ee267",
+ "sha256:d93ebdb82363d2e7bec64eecdc3632b59e84bd270d74fe5be1659f7787052f9b",
+ "sha256:db8a6313dbac934193fc17fe7610f70cd8181c542a91382531bef5ed785e5615",
+ "sha256:dbc2ab5d10544eb485baa76c63c501303b716a5c405ff2469a1d8ceffaabf622",
+ "sha256:dbd749cff1defbde270ca346b69b3baf5f1297213ef322254bf2a28537f0b046",
+ "sha256:dc662bc9375a6a394b62dfd331874c434819f10ee3902123200dbcf116963f89",
+ "sha256:dc6b0d5a1ea0318ef2def2b6a55dccf1dcaf77d605672347271ed7b829860765",
+ "sha256:dc79d192fb76fc0c84f2c58672c17bbbc383fd26c3cdc29daae16ce3d927e8b2",
+ "sha256:dd2c1d27ebfe6a015cfa2005b7fe8c52d5019f7bbdd801bc6f7499aab9ae739e",
+ "sha256:dea0808153f1fbbad772669d906cddd92100277533a03845de6893cadeffc8be",
+ "sha256:e0d7151a1bd5d0a203a5008fc4ae51a159a610cb82ab0a9b2c4d80241745582e",
+ "sha256:e14aab02258cb776a108107bd15f5b5e4a1bbaa61ef33b36693dfab6f89d54f9",
+ "sha256:e24d8031a2c62f34853756d9208eeafa6b940a1efcbfe36e8f57d99d52bb7261",
+ "sha256:e36c80c49853b3ffda7aa1831bf175c13356b210c73128c861f3aa93c3cc4015",
+ "sha256:e377e4cf8795cdbdff75b8f0223d7b6c68ff4fef36799d88ccf3a995a91c0112",
+ "sha256:e3acb9c16530362aeaef4e84d57db357002dc5cbfac9a23414c3e73c08301ab2",
+ "sha256:e3dc8d4ede2dbae6c0fc2b6c958bf51ce9fd7e9b40c0f5b8835c3fde44f5807d",
+ "sha256:e6491658dd2569f05860bad645569145c8626ac231877b0fb2d5f9bcb7054089",
+ "sha256:eb91d252b35004a84670dfeafadb042528b19842a0080d8b53e5ec1128e8f433",
+ "sha256:f0396e894bd1e66c74ecbc08b4f6a03dc331140942c4b1d345dd131b68574a60",
+ "sha256:f09c9d4c26fa79c1bad927efb05aca2391350b8e61c38cbc0d7d3c814e463124",
+ "sha256:f3cd110e02c5bf17d8fb562f6c9df5c20e73029d587cf8602a2da6c5ef1e32cb",
+ "sha256:f7a37dd208f0d658e0487522078b1ed68cd6bce20ef4b5a915d2809b9094b410",
+ "sha256:fae4a01ef8c4cb2bbe92ef2063149596907dc4a881a8d26743b3f6b304713171",
+ "sha256:fc327f4497b7087d06204235199daf208fd01c82d80465dc5efa4ec9df1c5b4e",
+ "sha256:fcc01c57ce6e70b728af02b2401c5bc853a9e14eb07deda30624374f0aebfe42",
+ "sha256:fde355b02934cc6b07200cc3b27ab0c15870a757d1a72fd401aa92e2ea3c6bfe"
],
- "markers": "python_version >= '3.8'",
- "version": "==0.18.1"
+ "markers": "python_version >= '3.9'",
+ "version": "==0.27.0"
},
"semver": {
"hashes": [
- "sha256:6253adb39c70f6e51afed2fa7152bcd414c411286088fb4b9effb133885ab4cc",
- "sha256:b1ea4686fe70b981f85359eda33199d60c53964284e0cfb4977d243e37cf4bf4"
+ "sha256:9c824d87ba7f7ab4a1890799cec8596f15c1241cb473404ea1cb0c55e4b04746",
+ "sha256:afc7d8c584a5ed0a11033af086e8af226a9c0b206f313e0301f8dd7b6b589602"
],
"markers": "python_version >= '3.7'",
- "version": "==3.0.2"
+ "version": "==3.0.4"
},
"setoptconf-tmp": {
"hashes": [
@@ -1292,43 +1747,44 @@
},
"setuptools": {
"hashes": [
- "sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54",
- "sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75"
+ "sha256:7c7854ee1429a240090297628dc9f75b35318d193537968e2dc14010ee2f5bca",
+ "sha256:dc2662692f47d99cb8ae15a784529adeed535bcd7c277fee0beccf961522baf6"
],
"index": "pypi",
"markers": "python_version >= '3.7'",
- "version": "==65.6.3"
+ "version": "==63.4.1"
},
"six": {
"hashes": [
- "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
- "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
+ "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274",
+ "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"
],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==1.16.0"
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
+ "version": "==1.17.0"
},
"smmap": {
"hashes": [
- "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62",
- "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"
+ "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5",
+ "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"
],
"markers": "python_version >= '3.7'",
- "version": "==5.0.1"
+ "version": "==5.0.2"
},
"snowballstemmer": {
"hashes": [
- "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1",
- "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"
+ "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064",
+ "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895"
],
- "version": "==2.2.0"
+ "markers": "python_version not in '3.0, 3.1, 3.2'",
+ "version": "==3.0.1"
},
"soupsieve": {
"hashes": [
- "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690",
- "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"
+ "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4",
+ "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a"
],
"markers": "python_version >= '3.8'",
- "version": "==2.5"
+ "version": "==2.7"
},
"sphinx": {
"hashes": [
@@ -1350,27 +1806,27 @@
},
"sphinxcontrib-applehelp": {
"hashes": [
- "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619",
- "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4"
+ "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1",
+ "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"
],
"markers": "python_version >= '3.9'",
- "version": "==1.0.8"
+ "version": "==2.0.0"
},
"sphinxcontrib-devhelp": {
"hashes": [
- "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f",
- "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3"
+ "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad",
+ "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"
],
"markers": "python_version >= '3.9'",
- "version": "==1.0.6"
+ "version": "==2.0.0"
},
"sphinxcontrib-htmlhelp": {
"hashes": [
- "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015",
- "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04"
+ "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8",
+ "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"
],
"markers": "python_version >= '3.9'",
- "version": "==2.0.5"
+ "version": "==2.1.0"
},
"sphinxcontrib-jsmath": {
"hashes": [
@@ -1382,19 +1838,26 @@
},
"sphinxcontrib-qthelp": {
"hashes": [
- "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6",
- "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182"
+ "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab",
+ "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"
],
"markers": "python_version >= '3.9'",
- "version": "==1.0.7"
+ "version": "==2.0.0"
},
"sphinxcontrib-serializinghtml": {
"hashes": [
- "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7",
- "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f"
+ "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331",
+ "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"
],
"markers": "python_version >= '3.9'",
- "version": "==1.1.10"
+ "version": "==2.0.0"
+ },
+ "stack-data": {
+ "hashes": [
+ "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9",
+ "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"
+ ],
+ "version": "==0.6.3"
},
"tabulate": {
"hashes": [
@@ -1406,52 +1869,83 @@
},
"tinycss2": {
"hashes": [
- "sha256:152f9acabd296a8375fbca5b84c961ff95971fcfc32e79550c8df8e29118c54d",
- "sha256:54a8dbdffb334d536851be0226030e9505965bb2f30f21a4a82c55fb2a80fae7"
+ "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7",
+ "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289"
],
"markers": "python_version >= '3.8'",
- "version": "==1.3.0"
+ "version": "==1.4.0"
},
"toml": {
"hashes": [
"sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b",
"sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"
],
- "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+ "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'",
"version": "==0.10.2"
},
"tomli": {
"hashes": [
- "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc",
- "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"
+ "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6",
+ "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd",
+ "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c",
+ "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b",
+ "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8",
+ "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6",
+ "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77",
+ "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff",
+ "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea",
+ "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192",
+ "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249",
+ "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee",
+ "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4",
+ "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98",
+ "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8",
+ "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4",
+ "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281",
+ "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744",
+ "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69",
+ "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13",
+ "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140",
+ "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e",
+ "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e",
+ "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc",
+ "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff",
+ "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec",
+ "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2",
+ "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222",
+ "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106",
+ "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272",
+ "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a",
+ "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"
],
- "markers": "python_version < '3.11'",
- "version": "==2.0.1"
+ "markers": "python_version >= '3.8'",
+ "version": "==2.2.1"
},
"tomlkit": {
"hashes": [
- "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f",
- "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"
+ "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1",
+ "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0"
],
- "markers": "python_version >= '3.7'",
- "version": "==0.12.5"
+ "markers": "python_version >= '3.8'",
+ "version": "==0.13.3"
},
"tornado": {
"hashes": [
- "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0",
- "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63",
- "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263",
- "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052",
- "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f",
- "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee",
- "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78",
- "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579",
- "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212",
- "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e",
- "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"
+ "sha256:06ceb1300fd70cb20e43b1ad8aaee0266e69e7ced38fa910ad2e03285009ce7c",
+ "sha256:2436822940d37cde62771cff8774f4f00b3c8024fe482e16ca8387b8a2724db6",
+ "sha256:583a52c7aa94ee046854ba81d9ebb6c81ec0fd30386d96f7640c96dad45a03ef",
+ "sha256:74db443e0f5251be86cbf37929f84d8c20c27a355dd452a5cfa2aada0d001ec4",
+ "sha256:ab53c8f9a0fa351e2c0741284e06c7a45da86afb544133201c5cc8578eb076a0",
+ "sha256:b0fe179f28d597deab2842b86ed4060deec7388f1fd9c1b4a41adf8af058907e",
+ "sha256:b186e85d1e3536d69583d2298423744740986018e393d0321df7340e71898882",
+ "sha256:b5e735ab2889d7ed33b32a459cac490eda71a1ba6857b0118de476ab6c366c04",
+ "sha256:c6f29e94d9b37a95013bb669616352ddb82e3bfe8326fccee50583caebc8a5f0",
+ "sha256:d6c33dc3672e3a1f3618eb63b7ef4683a7688e7b9e6e8f0d9aa5726360a004af",
+ "sha256:e56a5af51cc30dd2cae649429af65ca2f6571da29504a07995175df14c18f35f",
+ "sha256:e792706668c87709709c18b353da1f7662317b563ff69f00bab83595940c7108"
],
- "markers": "python_version >= '3.8'",
- "version": "==6.4"
+ "markers": "python_version >= '3.9'",
+ "version": "==6.5.2"
},
"traitlets": {
"hashes": [
@@ -1463,19 +1957,19 @@
},
"typing-extensions": {
"hashes": [
- "sha256:6024b58b69089e5a89c347397254e35f1bf02a907728ec7fee9bf0fe837d203a",
- "sha256:915f5e35ff76f56588223f15fdd5938f9a1cf9195c0de25130c627e4d597f6d1"
+ "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36",
+ "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76"
],
- "markers": "python_version < '3.10'",
- "version": "==4.12.1"
+ "markers": "python_version >= '3.9'",
+ "version": "==4.14.1"
},
"urllib3": {
"hashes": [
- "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d",
- "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"
+ "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760",
+ "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"
],
- "markers": "python_version >= '3.8'",
- "version": "==2.2.1"
+ "markers": "python_version >= '3.9'",
+ "version": "==2.5.0"
},
"wcwidth": {
"hashes": [
@@ -1491,89 +1985,13 @@
],
"version": "==0.5.1"
},
- "wrapt": {
- "hashes": [
- "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc",
- "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81",
- "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09",
- "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e",
- "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca",
- "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0",
- "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb",
- "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487",
- "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40",
- "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c",
- "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060",
- "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202",
- "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41",
- "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9",
- "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b",
- "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664",
- "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d",
- "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362",
- "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00",
- "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc",
- "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1",
- "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267",
- "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956",
- "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966",
- "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1",
- "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228",
- "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72",
- "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d",
- "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292",
- "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0",
- "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0",
- "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36",
- "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c",
- "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5",
- "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f",
- "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73",
- "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b",
- "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2",
- "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593",
- "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39",
- "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389",
- "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf",
- "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf",
- "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89",
- "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c",
- "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c",
- "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f",
- "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440",
- "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465",
- "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136",
- "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b",
- "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8",
- "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3",
- "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8",
- "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6",
- "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e",
- "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f",
- "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c",
- "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e",
- "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8",
- "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2",
- "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020",
- "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35",
- "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d",
- "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3",
- "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537",
- "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809",
- "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d",
- "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a",
- "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"
- ],
- "markers": "python_version < '3.11'",
- "version": "==1.16.0"
- },
"zipp": {
"hashes": [
- "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19",
- "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"
+ "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e",
+ "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"
],
- "markers": "python_version >= '3.8'",
- "version": "==3.19.2"
+ "markers": "python_version >= '3.9'",
+ "version": "==3.23.0"
}
}
}
diff --git a/dbldatagen/extensions/__init__.py b/dbldatagen/extensions/__init__.py
new file mode 100644
index 00000000..a383dd27
--- /dev/null
+++ b/dbldatagen/extensions/__init__.py
@@ -0,0 +1,16 @@
+"""
+Extension modules for dbldatagen.
+
+This package contains optional extensions that can be installed via:
+ pip install dbldatagen[extension]
+"""
+
+__version__ = "0.1.0"
+
+
+try:
+ from .spec_generators.uc_generator import DatabricksUCSpecGenerator
+ from .spec_generators.employee_generator import EmployeeSpecGenerator
+ __all__ = ['DatabricksUCSpecGenerator', 'EmployeeSpecGenerator']
+except ImportError:
+ __all__ = []
\ No newline at end of file
diff --git a/dbldatagen/extensions/data_generator_from_spec.py b/dbldatagen/extensions/data_generator_from_spec.py
new file mode 100644
index 00000000..d477cc20
--- /dev/null
+++ b/dbldatagen/extensions/data_generator_from_spec.py
@@ -0,0 +1,252 @@
+import logging
+from typing import Dict, Union
+import posixpath
+from pyspark.sql import SparkSession
+import dbldatagen as dg
+from .datagen_spec import DatagenSpec, UCSchemaTarget, FilePathTarget, ColumnDefinition
+
+
+logging.basicConfig(
+ level=logging.INFO,
+ format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
+ datefmt="%Y-%m-%d %H:%M:%S",
+)
+logger = logging.getLogger(__name__)
+
+INTERNAL_ID_COLUMN_NAME = "id"
+
+
+class Generator:
+ """
+ Main data generation orchestrator that handles configuration, preparation, and writing of data.
+ """
+
+ def __init__(self, spark: SparkSession, app_name: str = "DataGen_ClassBased"):
+ """
+ Initialize the Generator with a SparkSession.
+ Args:
+ spark: An existing SparkSession instance
+ app_name: Application name for logging purposes
+ Raises:
+ RuntimeError: If spark is None
+ """
+ if not spark:
+ logger.error(
+ "SparkSession cannot be None during Generator initialization")
+ raise RuntimeError("SparkSession cannot be None")
+ self.spark = spark
+ self._created_spark_session = False
+ self.app_name = app_name
+ logger.info("Generator initialized with SparkSession")
+
+ def _columnspec_to_datagen_columnspec(self, col_def: ColumnDefinition) -> Dict[str, str]:
+ """
+ Convert a ColumnDefinition to dbldatagen column specification.
+ Args:
+ col_def: ColumnDefinition object containing column configuration
+ Returns:
+ Dictionary containing dbldatagen column specification
+ """
+ col_name = col_def.name
+ col_type = col_def.type
+ kwargs = col_def.options.copy() if col_def.options is not None else {}
+
+ if col_def.primary:
+ kwargs["colType"] = col_type
+ kwargs["baseColumn"] = INTERNAL_ID_COLUMN_NAME
+
+ if col_type == "string":
+ kwargs["baseColumnType"] = "hash"
+ elif col_type not in ["int", "long", "integer", "bigint", "short"]:
+ kwargs["baseColumnType"] = "auto"
+ logger.warning(
+ f"Primary key '{col_name}' has non-standard type '{col_type}'")
+
+ # Log conflicting options for primary keys
+ conflicting_opts_for_pk = [
+ "distribution", "template", "dataRange", "random", "omit",
+ "min", "max", "uniqueValues", "values", "expr"
+ ]
+
+ for opt_key in conflicting_opts_for_pk:
+ if opt_key in kwargs:
+ logger.warning(
+ f"Primary key '{col_name}': Option '{opt_key}' may be ignored")
+
+ if col_def.omit is not None and col_def.omit:
+ kwargs["omit"] = True
+ else:
+ kwargs = col_def.options.copy() if col_def.options is not None else {}
+
+ if col_type:
+ kwargs["colType"] = col_type
+ if col_def.baseColumn:
+ kwargs["baseColumn"] = col_def.baseColumn
+ if col_def.baseColumnType:
+ kwargs["baseColumnType"] = col_def.baseColumnType
+ if col_def.omit is not None:
+ kwargs["omit"] = col_def.omit
+
+ return kwargs
+
+ def prepare_data_generators(
+ self,
+ config: DatagenSpec,
+ config_source_name: str = "PydanticConfig"
+ ) -> Dict[str, dg.DataGenerator]:
+ """
+ Prepare DataGenerator specifications for each table based on the configuration.
+ Args:
+ config: DatagenSpec Pydantic object containing table configurations
+ config_source_name: Name for the configuration source (for logging)
+ Returns:
+ Dictionary mapping table names to their configured dbldatagen.DataGenerator objects
+ Raises:
+ RuntimeError: If SparkSession is not available
+ ValueError: If any table preparation fails
+ Exception: If any unexpected error occurs during preparation
+ """
+ logger.info(
+ f"Preparing data generators for {len(config.tables)} tables")
+
+ if not self.spark:
+ logger.error(
+ "SparkSession is not available. Cannot prepare data generators")
+ raise RuntimeError(
+ "SparkSession is not available. Cannot prepare data generators")
+
+ tables_config = config.tables
+ global_gen_options = config.generator_options if config.generator_options else {}
+
+ prepared_generators: Dict[str, dg.DataGenerator] = {}
+ generation_order = list(tables_config.keys())
+
+ for table_name in generation_order:
+ table_spec = tables_config[table_name]
+ logger.info(f"Preparing table: {table_name}")
+
+ try:
+ # Create DataGenerator instance
+ data_gen = dg.DataGenerator(
+ sparkSession=self.spark,
+ name=f"{table_name}_spec_from_{config_source_name}",
+ rows=table_spec.number_of_rows,
+ partitions=table_spec.partitions,
+ **global_gen_options,
+ )
+
+ # Process each column
+ for col_def in table_spec.columns:
+ kwargs = self._columnspec_to_datagen_columnspec(col_def)
+ data_gen = data_gen.withColumn(
+ colName=col_def.name, **kwargs)
+
+ prepared_generators[table_name] = data_gen
+ logger.info(f"Successfully prepared table: {table_name}")
+
+ except Exception as e:
+ logger.error(f"Failed to prepare table '{table_name}': {e}")
+ raise RuntimeError(
+ f"Failed to prepare table '{table_name}': {e}") from e
+
+ logger.info("All data generators prepared successfully")
+ return prepared_generators
+
+ def write_prepared_data(
+ self,
+ prepared_generators: Dict[str, dg.DataGenerator],
+ output_destination: Union[UCSchemaTarget, FilePathTarget, None],
+ config_source_name: str = "PydanticConfig",
+ ) -> None:
+ """
+ Write data from prepared generators to the specified output destination.
+
+ Args:
+ prepared_generators: Dictionary of prepared DataGenerator objects
+ output_destination: Target destination for data output
+ config_source_name: Name for the configuration source (for logging)
+
+ Raises:
+ RuntimeError: If any table write fails
+ ValueError: If output destination is not properly configured
+ """
+ logger.info("Starting data writing phase")
+
+ if not prepared_generators:
+ logger.warning("No prepared data generators to write")
+ return
+
+ for table_name, data_gen in prepared_generators.items():
+ logger.info(f"Writing table: {table_name}")
+
+ try:
+ df = data_gen.build()
+ requested_rows = data_gen.rowCount
+ actual_row_count = df.count()
+ logger.info(
+ f"Built DataFrame for '{table_name}':{actual_row_count} rows (requested: {requested_rows})")
+
+ if actual_row_count == 0 and requested_rows > 0:
+ logger.warning(f"Table '{table_name}': Requested {requested_rows} rows but built 0")
+
+ # Write data based on destination type
+ if isinstance(output_destination, FilePathTarget):
+ output_path = posixpath.join(output_destination.base_path, table_name)
+ df.write.format(output_destination.output_format).save(output_path)
+ logger.info(f"Wrote table '{table_name}' to file path")
+
+ elif isinstance(output_destination, UCSchemaTarget):
+ output_table = f"{output_destination.catalog}.{output_destination.schema_}.{table_name}"
+ df.write.mode("overwrite").saveAsTable(output_table)
+ logger.info(f"Wrote table '{table_name}' to Unity Catalog")
+ else:
+ logger.warning("No output destination specified, skipping data write")
+ return
+ except Exception as e:
+ logger.error(f"Failed to write table '{table_name}': {e}")
+ raise RuntimeError(f"Failed to write table '{table_name}': {e}") from e
+ logger.info("All data writes completed successfully")
+
+ def generate_and_write_data(
+ self,
+ config: DatagenSpec,
+ config_source_name: str = "PydanticConfig"
+ ) -> None:
+ """
+ Combined method to prepare data generators and write data in one operation.
+ This method orchestrates the complete data generation workflow:
+ 1. Prepare data generators from configuration
+ 2. Write data to the specified destination
+ Args:
+ config: DatagenSpec Pydantic object containing table configurations
+ config_source_name: Name for the configuration source (for logging)
+ Raises:
+ RuntimeError: If SparkSession is not available or any step fails
+ ValueError: If critical errors occur during preparation or writing
+ """
+ logger.info(f"Starting combined data generation and writing for {len(config.tables)} tables")
+
+ try:
+ # Phase 1: Prepare data generators
+ prepared_generators_map = self.prepare_data_generators(config, config_source_name)
+
+ if not prepared_generators_map and list(config.tables.keys()):
+ logger.warning(
+ "No data generators were successfully prepared, though tables were defined")
+ return
+
+ # Phase 2: Write data
+ self.write_prepared_data(
+ prepared_generators_map,
+ config.output_destination,
+ config_source_name
+ )
+
+ logger.info(
+ "Combined data generation and writing completed successfully")
+
+ except Exception as e:
+ logger.error(
+ f"Error during combined data generation and writing: {e}")
+ raise RuntimeError(
+ f"Error during combined data generation and writing: {e}") from e
diff --git a/dbldatagen/extensions/datagen_spec.py b/dbldatagen/extensions/datagen_spec.py
new file mode 100644
index 00000000..14a9184a
--- /dev/null
+++ b/dbldatagen/extensions/datagen_spec.py
@@ -0,0 +1,190 @@
+import os
+import logging
+from enum import Enum
+from typing import List, Dict, Optional, Any, Literal, Union
+from pydantic import BaseModel, model_validator, field_validator
+import pandas as pd
+from IPython.display import display, HTML
+
+
+logger = logging.getLogger(__name__)
+
+
+class PathType(Enum):
+ UC_TABLE = "Unity Catalog Table"
+ UC_VOLUME = "Unity Catalog Volume"
+ RELATIVE = "Relative Path"
+ ABSOLUTE_NON_UC = "Absolute Non-UC Path"
+ UNKNOWN = "Unknown or Invalid Path Structure"
+
+
+# Allowed (PathType, output_format_lowercase) combinations
+_OFF_DB_STRICT_ALLOWED_COMBINATIONS = {
+ (PathType.RELATIVE, "delta"),
+ (PathType.RELATIVE, "parquet"),
+ (PathType.RELATIVE, "csv"),
+ # Add more formats like orc, json, text as needed
+}
+
+_DATABRICKS_COMPATIBLE_ALLOWED_COMBINATIONS = {
+ (PathType.UC_TABLE, "delta"),
+ (PathType.UC_VOLUME, "parquet"),
+ (PathType.UC_VOLUME, "csv"),
+ # Add more formats like orc, json, text as needed
+}
+
+
+DbldatagenBasicType = Literal[
+ "string",
+ "int",
+ "long",
+ "float",
+ "double",
+ "decimal",
+ "boolean",
+ "date",
+ "timestamp",
+ "short",
+ "byte",
+ "binary",
+ "integer",
+ "bigint",
+ "tinyint",
+]
+
+
+# Note: There is no way to specify the per table output.
+# One will have to create a different config for each schema
+class UCSchemaTarget(BaseModel):
+ catalog: str
+ schema_: str
+ output_format: str = "delta" # Default to delta for UC Schema
+
+ @field_validator("catalog", "schema_", mode="after")
+ def validate_identifiers(cls, v): # noqa: N805, pylint: disable=no-self-argument
+ if not v.strip():
+ raise ValueError("Identifier must be non-empty.")
+ if not v.isidentifier():
+ logger.warning(
+ f"'{v}' is not a basic Python identifier. Ensure validity for Unity Catalog.")
+ return v.strip()
+
+ def __str__(self):
+ return f"{self.catalog}.{self.schema_} (Format: {self.output_format}, Type: UC Table)"
+
+
+class FilePathTarget(BaseModel):
+ base_path: str
+ output_format: Literal["csv", "parquet"] # No default, must be specified
+
+ @field_validator("base_path", mode="after")
+ def validate_base_path(cls, v): # noqa: N805, pylint: disable=no-self-argument
+ if not v.strip():
+ raise ValueError("base_path must be non-empty.")
+ return v.strip()
+
+ def __str__(self):
+ return f"{self.base_path} (Format: {self.output_format}, Type: File Path)"
+
+
+class ColumnDefinition(BaseModel):
+ name: str
+ type: Optional[DbldatagenBasicType] = None
+ primary: bool = False
+ options: Optional[Dict[str, Any]] = {}
+ nullable: Optional[bool] = False
+ omit: Optional[bool] = False
+ baseColumn: Optional[str] = "id"
+ baseColumnType: Optional[str] = "auto"
+
+ @model_validator(mode="after")
+ def check_constraints(self):
+ if self.primary:
+ if "min" in self.options or "max" in self.options:
+ raise ValueError(
+ f"Primary column '{self.name}' cannot have min/max options.")
+ if self.nullable:
+ raise ValueError(
+ f"Primary column '{self.name}' cannot be nullable.")
+ if self.primary and self.type is None:
+ raise ValueError(
+ f"Primary column '{self.name}' must have a type defined.")
+ return self
+
+
+class TableDefinition(BaseModel):
+ number_of_rows: int
+ partitions: Optional[int] = None
+ columns: List[ColumnDefinition]
+
+
+class DatagenSpec(BaseModel):
+ tables: Dict[str, TableDefinition]
+ output_destination: Optional[Union[UCSchemaTarget, FilePathTarget]] = None
+ generator_options: Optional[Dict[str, Any]] = {}
+ intended_for_databricks: Optional[bool] = None
+
+ @staticmethod
+ def _is_running_on_databricks() -> bool:
+ return "DATABRICKS_RUNTIME_VERSION" in os.environ
+
+ @staticmethod
+ def _determine_path_type(path_prefix: str) -> PathType:
+ path = path_prefix.strip()
+ if len(path.split(".")) == 3:
+ return PathType.UC_TABLE
+ if path.startswith("/Volumes/"):
+ return PathType.UC_VOLUME
+ if path.startswith("/") or path.startswith("\\") or (len(path) > 1 and path[1] == ":"):
+ return PathType.ABSOLUTE_NON_UC
+ return PathType.RELATIVE
+
+ @model_validator(mode="before")
+ def validate_paths_and_formats(cls, values: Dict[str, Any]) -> Dict[str, Any]: # noqa: N805, pylint: disable=no-self-argument
+ output = values.get("output_destination")
+ intended = values.get(
+ "intended_for_databricks") or cls._is_running_on_databricks()
+
+ if isinstance(output, FilePathTarget):
+ path_type = cls._determine_path_type(output.base_path)
+ fmt = output.output_format.lower()
+ allowed = {PathType.UC_VOLUME,
+ PathType.RELATIVE, PathType.ABSOLUTE_NON_UC}
+ if path_type not in allowed:
+ raise ValueError(
+ f"Invalid path type '{path_type.value}' for FilePathTarget")
+ values["path_type"] = path_type
+
+ elif isinstance(output, UCSchemaTarget):
+ path_type = PathType.UC_TABLE
+ values["path_type"] = path_type
+
+ return values
+
+ def finalize(self) -> None:
+ if self.output_destination is None:
+ raise ValueError(
+ "output_destination must be specified before finalization.")
+
+ def display_all_tables(self):
+ for table_name, table_def in self.tables.items():
+ print(f"Table: {table_name}")
+
+ if self.output_destination:
+ output = f"{self.output_destination}"
+ display(HTML(f"Output destination: {output}"))
+ else:
+ message = (
+ "Output destination: "
+ "None
"
+ "Set it using the output_destination "
+ "attribute on your DatagenSpec object "
+ "(e.g., my_spec.output_destination = UCSchemaTarget(...))."
+ )
+ display(HTML(message))
+
+ df = pd.DataFrame([col.dict() for col in table_def.columns])
+ try:
+ display(df)
+ except NameError:
+ print(df.to_string())
diff --git a/dbldatagen/extensions/errors.py b/dbldatagen/extensions/errors.py
new file mode 100644
index 00000000..5eb02b4b
--- /dev/null
+++ b/dbldatagen/extensions/errors.py
@@ -0,0 +1,8 @@
+class SpecGenerationError(Exception):
+ """Custom exception for errors during DatagenSpec generation."""
+ pass
+
+
+class DataGenerationError(Exception):
+ """Custom exception for errors during the actual data generation phase."""
+ pass
diff --git a/dbldatagen/extensions/spec_generators/base.py b/dbldatagen/extensions/spec_generators/base.py
new file mode 100644
index 00000000..dc94e850
--- /dev/null
+++ b/dbldatagen/extensions/spec_generators/base.py
@@ -0,0 +1,15 @@
+from abc import ABC, abstractmethod
+from dbldatagen.extensions.datagen_spec import DatagenSpec
+
+
+class AbstractSpecGenerator(ABC):
+ @abstractmethod
+ def generate_spec(self) -> DatagenSpec:
+ """
+ Generates the DatagenSpec from the specific source.
+ Should raise an exception (e.g., SpecGenerationError) if generation fails.
+ """
+ pass
+
+ def __repr__(self):
+ return f"<{self.__class__.__name__}>"
diff --git a/dbldatagen/extensions/spec_generators/employee_generator.py b/dbldatagen/extensions/spec_generators/employee_generator.py
new file mode 100644
index 00000000..8d14c1c5
--- /dev/null
+++ b/dbldatagen/extensions/spec_generators/employee_generator.py
@@ -0,0 +1,120 @@
+from typing import Optional
+from dbldatagen.extensions.datagen_spec import ColumnDefinition, DatagenSpec, TableDefinition
+from dbldatagen.extensions.spec_generators.base import AbstractSpecGenerator
+from dbldatagen.extensions.spec_generators.text_templates import COLUMN_TEMPLATES
+
+
+class EmployeeSpecGenerator(AbstractSpecGenerator):
+ """
+ A static generator for employee dataset that creates a predefined schema
+ with common employee-related fields.
+ """
+
+ def __init__(self, number_of_rows: int = 1000, partitions: Optional[int] = 4):
+ """
+ Initialize the EmployeeSpecGenerator.
+
+ Args:
+ number_of_rows: Number of rows to generate (default: 1000)
+ partitions: Number of partitions for Spark (default: 4)
+ """
+ self.number_of_rows = number_of_rows
+ self.partitions = partitions
+
+ def _get_employee_table_definition(self) -> TableDefinition:
+ """
+ Creates a TableDefinition for the employee dataset with predefined columns.
+ """
+ columns = [
+ ColumnDefinition(name="employee_id", type="int",
+ primary=True, nullable=False),
+ ColumnDefinition(name="first_name", type="string", options={
+ "template": COLUMN_TEMPLATES["first_name"]}),
+ ColumnDefinition(name="last_name", type="string", options={
+ "template": COLUMN_TEMPLATES["last_name"]}),
+ ColumnDefinition(name="email", type="string", options={
+ "template": COLUMN_TEMPLATES["email"]}),
+ ColumnDefinition(
+ name="department",
+ type="string",
+ options={
+ "values": [
+ "Engineering",
+ "Sales",
+ "Marketing",
+ "HR",
+ "Finance",
+ "Operations",
+ ]
+ },
+ ),
+ ColumnDefinition(
+ name="job_title",
+ type="string",
+ options={
+ "values": [
+ "Software Engineer",
+ "Senior Engineer",
+ "Engineering Manager",
+ "Sales Representative",
+ "Sales Manager",
+ "Marketing Specialist",
+ "Marketing Manager",
+ "HR Specialist",
+ "HR Manager",
+ "Financial Analyst",
+ "Finance Manager",
+ "Operations Specialist",
+ "Operations Manager",
+ ]
+ },
+ ),
+ ColumnDefinition(
+ name="salary",
+ type="decimal",
+ options={"min": 50000, "max": 200000, "precision": 2},
+ ),
+ ColumnDefinition(
+ name="hire_date",
+ type="date",
+ options={
+ "begin": "2020-01-01",
+ "end": "2024-12-31",
+ "format": "yyyy-MM-dd",
+ "random": True,
+ },
+ ),
+ ColumnDefinition(
+ name="is_active",
+ type="boolean",
+ options={
+ "values": [True, False],
+ "weights": [9, 1], # 90% active, 10% inactive
+ },
+ ),
+ ColumnDefinition(
+ name="manager_id",
+ type="int",
+ options={
+ "baseColumn": "employee_id",
+ "omit": 0.1, # 10% chance of being null (no manager)
+ },
+ ),
+ ]
+
+ return TableDefinition(
+ number_of_rows=self.number_of_rows,
+ partitions=self.partitions,
+ columns=columns,
+ )
+
+ def generate_spec(self) -> DatagenSpec:
+ """
+ Generates a DatagenSpec for the employee dataset.
+
+ Returns:
+ DatagenSpec: A specification for generating employee data
+ """
+ employee_table = self._get_employee_table_definition()
+ config_obj = DatagenSpec(tables={"employees": employee_table})
+ return config_obj
diff --git a/dbldatagen/extensions/spec_generators/text_templates.py b/dbldatagen/extensions/spec_generators/text_templates.py
new file mode 100644
index 00000000..5a0c635c
--- /dev/null
+++ b/dbldatagen/extensions/spec_generators/text_templates.py
@@ -0,0 +1,257 @@
+from __future__ import annotations
+import re
+import difflib
+from typing import Dict, Optional, Tuple, Sequence
+from rapidfuzz import process, fuzz
+
+_model = None
+_RX_NON_ALNUM = re.compile(r"[^a-z0-9]+")
+
+COLUMN_TEMPLATES = {
+ # Personal Information
+ "first_name": "\\w",
+ "last_name": "\\w",
+ "surname": "\\w",
+ "full_name": "\\w \\w",
+ "username": "kkk_kkk",
+ "email": "\\w.\\w@\\w.com|\\w@\\w.co.u\\k",
+ "email_alt": "\\w@\\w.com",
+ "password_hash": "xxxxxxxxxxxxxxxx",
+ "phone_number": "(ddd)-ddd-dddd",
+ "mobile_number": "ddd-ddd-dddd",
+ "home_phone": "ddd-ddd-dddd",
+ "dob": "yyyy-mm-dd",
+ "gender": "M|F|O",
+ "ssn": "ddd-dd-dddd",
+ "passport_number": "wwdddddd",
+ "drivers_license": "wwdddddd",
+ "national_id": "dddddddddd",
+ "marital_status": "Single|Married|Divorced|Widowed",
+ "age": "dd",
+ "title": "Mr|Ms|Mrs|Dr|Prof",
+ "middle_name": "\\w",
+ "suffix": "Jr|Sr|II|III|IV",
+ "nickname": "\\w",
+ "birthplace": "\\w",
+ "citizenship": "\\w",
+ "ethnicity": "\\w",
+ "language": "\\w",
+ "religion": "\\w",
+ # Address Information
+ "street_address": "n \\w \\w",
+ "address_line1": "n \\w \\w",
+ "address_line2": "Apt n|Unit n",
+ "city": "\\w",
+ "state": "\\w\\w",
+ "province": "\\w",
+ "region": "\\w",
+ "zip_code": "ddddd",
+ "postal_code": "ddddd",
+ "country": "\\w",
+ "country_code": "ww",
+ "timezone": "www/www",
+ # Business/Employment
+ "company_name": "\\w \\w",
+ "business_name": "\\w \\w",
+ "department": "\\w",
+ "job_title": "\\w \\w",
+ "employee_id": "EMPddddd",
+ "manager_id": "EMPddddd",
+ "hire_date": "yyyy-mm-dd",
+ "termination_date": "yyyy-mm-dd",
+ "salary": "dddddd",
+ "bonus": "ddd",
+ "office_phone": "ddd-ddd-dddd",
+ "work_email": "\\w.\\w@\\w.com",
+ "work_location": "\\w",
+ "supervisor": "\\w \\w",
+ "team": "\\w",
+ "shift": "Morning|Evening|Night",
+ # Financial
+ "credit_card": "dddd-dddd-dddd-dddd",
+ "credit_card_expiry": "mm/yy",
+ "credit_card_cvv": "ddd",
+ "account_number": "dddddddddd",
+ "routing_number": "dddddddd",
+ "iban": "wwdddddddddddddddddddddd",
+ "swift_code": "wwwwwwww",
+ "tax_id": "dd-dddddddd",
+ "bank_name": "\\w \\w",
+ "balance": "dddddd",
+ "currency": "www",
+ # Capital Markets
+ "ticker": "WWW|WWWW|WWWWW",
+ "isin": "WWdddddddddd",
+ "cusip": "Wdddddddd",
+ "sedol": "dWWWWdd",
+ "figi": "WWWWWWWWWWWWWW",
+ "ric": "WWWW.WW",
+ "exchange_code": "WWWW",
+ "security_id": "SECdddddd",
+ "instrument_id": "INSdddddd",
+ "asset_class": "Equity|Bond|FX|Commodity|Derivative",
+ "security_type": "Stock|Bond|Option|Future|ETF|ADR|GDR",
+ "market_cap": "dddddddddd",
+ "shares_outstanding": "dddddddddd",
+ "price": "ddd.dd",
+ "volume": "dddddddd",
+ "bid_price": "ddd.dd",
+ "ask_price": "ddd.dd",
+ "last_trade_price": "ddd.dd",
+ "open_price": "ddd.dd",
+ "close_price": "ddd.dd",
+ "high_price": "ddd.dd",
+ "low_price": "ddd.dd",
+ "trade_id": "TRDdddddd",
+ "order_id": "ORDdddddd",
+ "execution_id": "EXCdddddd",
+ "portfolio_id": "PRTdddddd",
+ "fund_id": "FNDdddddd",
+ "index_id": "IDXdddddd",
+ "option_id": "OPTdddddd",
+ "future_id": "FUTdddddd",
+ "bond_id": "BNDdddddd",
+ "etf_id": "ETFdddddd",
+ "mutual_fund_id": "MFdddddd",
+ # Product/Inventory
+ "product_code": "PRDddddd",
+ "sku": "SKUddddd",
+ "upc": "dddddddddddd",
+ "ean": "ddddddddddddd",
+ "isbn": "d-ddd-ddddd-d",
+ "model_number": "MDLddddd",
+ "serial_number": "SNdddddddd",
+ # System/Network
+ "ip_address": "n.n.n.n",
+ "mac_address": "xx:xx:xx:xx:xx:xx",
+ "hostname": "kkkkkk",
+ "domain": "\\w.com|\\w.net|\\w.org",
+ "url": "https://\\w.\\w.com/\\w",
+ "api_key": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
+ "session_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
+ "token": "xxxxxxxxxxxxxxxx",
+ "device_id": "DEVddddd",
+ "machine_id": "MCHddddd",
+ "server_id": "SVRddddd",
+ "cluster_id": "CLSddddd",
+ "node_id": "NODddddd",
+ # Document/File
+ "document_id": "DOCddddd",
+ "file_name": "\\w.\\w",
+ "file_path": "/\\w/\\w/\\w.\\w",
+ "mime_type": "\\w/\\w",
+ "file_extension": ".\\w",
+ # Location/Geo
+ "latitude": "dd.dddddd",
+ "longitude": "ddd.dddddd",
+ "gps_coordinates": "dd.dddddd, ddd.dddddd",
+ # Social Media
+ "twitter_handle": "@\\w",
+ "instagram_username": "@\\w",
+ "facebook_id": "dddddddddd",
+ "linkedin_id": "\\w-\\w-\\w",
+ # Miscellaneous
+ "status": "Active|Inactive|Pending|Closed",
+ "priority": "High|Medium|Low",
+ "category": "\\w",
+ "type": "\\w",
+ "description": "\\w \\w \\w",
+ "notes": "\\w \\w \\w",
+ "comments": "\\w \\w \\w",
+ "reference": "REFddddd",
+ "code": "dddddd",
+ "flag": "Y|N",
+ "is_active": "true|false",
+ "created_at": "yyyy-mm-dd hh:mm:ss",
+ "updated_at": "yyyy-mm-dd hh:mm:ss",
+ "timestamp": "yyyy-mm-dd hh:mm:ss",
+}
+
+
+# def _semantic_match(name: str, candidates: Tuple[str, ...]) -> Tuple[str, float]:
+# """Transformer‑based semantic similarity (0‑1)."""
+# if not _model:
+# return "", 0.0
+# emb_query = _model.encode(name, normalize_embeddings=True)
+# emb_cand = _model.encode(list(candidates), normalize_embeddings=True)
+# sims = util.cos_sim(emb_query, emb_cand)[0].tolist()
+# idx = int(max(range(len(sims)), key=sims.__getitem__))
+# return candidates[idx], sims[idx]
+
+
+def _normalize(s: str) -> str:
+ """Lower‑case, strip accents (if any), collapse to ASCII letters+digits."""
+ s = s.lower()
+ s = _RX_NON_ALNUM.sub("_", s)
+ return re.sub(r"_{2,}", "_", s).strip("_")
+
+
+def _fuzzy_match(name: str, candidates: Sequence[str]) -> Tuple[str, float]:
+ """
+ Return the best fuzzy match among *candidates* for *name* and the score
+ on a 0‑1 scale. If nothing passes, returns ("", 0.0).
+ """
+ # ---- RapidFuzz branch --------------------------------------------------
+ try:
+ result = process.extractOne(
+ name,
+ list(candidates), # cast to list for the stub
+ scorer=fuzz.token_sort_ratio, # kw‑only param -> fine
+ )
+ if result is not None:
+ best, score, _ = result # result = (match, score, idx)
+ return best, score / 100.0
+ except ImportError:
+ pass
+
+ # ---- difflib fallback --------------------------------------------------
+ best = difflib.get_close_matches(name, candidates, n=1, cutoff=0)
+ if best:
+ score = difflib.SequenceMatcher(None, name, best[0]).ratio()
+ return best[0], score
+
+ return "", 0.0
+
+
+def guess_template(col_name: str) -> Optional[str]:
+ """
+ Given an *original* column name from a database, return the most relevant
+ synthetic‑data template (regex / string) from ``column_templates``.
+ If no reasonable match is found, return ``None``.
+
+ Advanced matching stack:
+ 1. Exact key → O(1)
+ 2. Alias map → O(1)
+ 3. Fuzzy match → rapidfuzz or difflib
+ 4. Semantic match → sentence‑transformers
+ """
+ if not col_name:
+ return None
+ norm = _normalize(col_name)
+ # exact match
+ if norm in COLUMN_TEMPLATES:
+ return COLUMN_TEMPLATES[norm]
+
+ # # alias table
+ # if norm in ALIASES:
+ # return column_templates[ALIASES[norm]]
+
+ # candidate keys to consider in later steps
+ keys = tuple(COLUMN_TEMPLATES.keys())
+
+ # fuzzy distance
+ best_fuzzy, fuzzy_score = _fuzzy_match(norm, keys)
+ if fuzzy_score >= 0.9: # very high confidence
+ return COLUMN_TEMPLATES[best_fuzzy]
+
+ # # TODO: semantic similarity
+ # best_sem, sem_score = _semantic_match(col_name, keys)
+ # if sem_score >= 0.6 and sem_score > fuzzy_score:
+ # return COLUMN_TEMPLATES[best_sem]
+
+ # lower‑threshold fuzzy fallback
+ if fuzzy_score >= 0.75:
+ return COLUMN_TEMPLATES[best_fuzzy]
+
+ # Nothing good enough
+ return None
diff --git a/dbldatagen/extensions/spec_generators/uc_generator.py b/dbldatagen/extensions/spec_generators/uc_generator.py
new file mode 100644
index 00000000..9a7dc9d3
--- /dev/null
+++ b/dbldatagen/extensions/spec_generators/uc_generator.py
@@ -0,0 +1,298 @@
+from typing import List, Dict, Optional
+import json
+import logging
+from pydantic import ValidationError
+from databricks.sdk import WorkspaceClient
+from databricks.sdk.service.catalog import TableInfo, ColumnInfo, TableConstraint
+from dbldatagen.extensions.errors import SpecGenerationError
+from dbldatagen.extensions.datagen_spec import (
+ ColumnDefinition,
+ DatagenSpec,
+ TableDefinition,
+ DbldatagenBasicType,
+)
+
+from dbldatagen.extensions.spec_generators.base import AbstractSpecGenerator
+from dbldatagen.extensions.spec_generators.text_templates import guess_template
+
+# Set up logger
+logger = logging.getLogger(__name__)
+
+
+# --- User's custom generator ---
+class DatabricksUCSpecGenerator(AbstractSpecGenerator):
+ def __init__(self, tables: List[str], workspace_client: Optional[WorkspaceClient] = None):
+ try:
+ self.workspace_client = workspace_client or WorkspaceClient()
+ except Exception as e:
+ # Catch potential errors during WorkspaceClient instantiation (e.g., config issues)
+ raise SpecGenerationError(
+ f"Failed to initialize WorkspaceClient: {e}") from e
+ if not tables:
+ raise SpecGenerationError("Fully qualified table name required")
+ self.tables = tables
+
+ @staticmethod
+ def _map_source_type_to_datagen_type(
+ source_type_str: Optional[str], column_name: str = "Unknown"
+ ) -> DbldatagenBasicType:
+ """
+ Maps a source data type string to a DbldatagenBasicType.
+
+ Args:
+ source_type_str: The source data type string (e.g., from UC schema).
+ column_name: The name of the column, for logging purposes.
+
+ Returns:
+ The corresponding DbldatagenBasicType.
+
+ Raises:
+ SchemaParsingError: If the source type cannot be reliably mapped.
+ """
+ if not source_type_str:
+ logger.warning(
+ f"Warning: Source type for column '{column_name}' is None or empty. "
+ f"Defaulting to 'string'.")
+ return "string"
+
+ s_type = source_type_str.lower().strip()
+
+ # Direct matches with DbldatagenBasicType (assuming DbldatagenBasicType is a Literal or Enum)
+ # For Literal, we need to check against its __args__
+ if hasattr(DbldatagenBasicType, "__args__") and s_type in DbldatagenBasicType.__args__: # type: ignore
+ return s_type # type: ignore
+
+ # Handle common variations or alternative names from catalogs
+ type_mapping: Dict[str, DbldatagenBasicType] = {
+ "int": "integer",
+ "integer": "integer",
+ "bigint": "long",
+ "smallint": "short",
+ "tinyint": "byte",
+ "varchar": "string",
+ "char": "string",
+ "text": "string",
+ "character varying": "string",
+ "numeric": "decimal",
+ "number": "decimal",
+ "dec": "decimal",
+ "double precision": "double",
+ "real": "float",
+ "bool": "boolean",
+ "timestamp_ntz": "timestamp", # Specific handling for Databricks
+ "timestamp with local time zone": "timestamp",
+ "timestamp without time zone": "timestamp",
+ "date": "date",
+ "binary": "binary",
+ "varbinary": "binary",
+ }
+
+ # Check direct mapping first
+ if s_type in type_mapping:
+ return type_mapping[s_type]
+
+ # Handle types with parameters like decimal(p,s) or varchar(n)
+ if s_type.startswith(("decimal", "numeric")):
+ return "decimal"
+ if s_type.startswith(("varchar", "char")):
+ return "string"
+
+ # Fallback or raise error if mapping is critical
+ # Consider making this stricter by raising an error if a type is truly unknown
+ logger.warning(
+ f"Warning: Unmapped source type '{source_type_str}' for column '{column_name}'. "
+ f"Defaulting to 'string'.")
+ return "string"
+
+ def _generate_column_definitions(
+ self,
+ raw_column_infos: List[ColumnInfo],
+ primary_key_column_names: List[str],
+ ) -> List[ColumnDefinition]:
+ """
+ Generates a list of Pydantic ColumnDefinition objects from raw column schema information.
+
+ Args:
+ raw_column_infos: A list of ColumnInfo objects from Databricks SDK.
+ primary_key_column_names: A list of column names that are part of the primary key.
+
+ Returns:
+ A list of ColumnDefinition objects.
+
+ Raises:
+ SchemaParsingError: If essential column information is missing or invalid.
+ """
+ pydantic_column_definitions: List[ColumnDefinition] = []
+
+ if not raw_column_infos:
+ raise SpecGenerationError(
+ "_generate_column_definitions: No column information provided.")
+
+ for raw_col_info in raw_column_infos:
+ col_name = getattr(raw_col_info, "name", None)
+ if not col_name:
+ # Or raise SchemaParsingError
+ logger.warning("Warning: Skipping column info object without a 'name' attribute.")
+ continue
+
+ source_type_str: Optional[str] = None
+ type_json_str = getattr(raw_col_info, "type_json", None)
+
+ if type_json_str:
+ try:
+ type_info_dict = json.loads(type_json_str)
+ source_type_str = type_info_dict.get("type")
+ except json.JSONDecodeError:
+ logger.warning(
+ f"Warning: Could not parse type_json for column '{col_name}'. "
+ f"Falling back to type_name/type_text."
+ )
+
+ if not source_type_str: # Fallback to type_name or type_text
+ source_type_str = getattr(raw_col_info, "type_name", None)
+ if not source_type_str: # Further fallback
+ # Default to string if all else fails
+ source_type_str = getattr(raw_col_info, "type_text", None)
+
+ if not source_type_str:
+ logger.warning(
+ f"Warning: Could not determine source type for column '{col_name}'. Defaulting to 'string'.")
+ source_type_str = "string"
+
+ datagen_col_type = self._map_source_type_to_datagen_type(
+ source_type_str, col_name)
+
+ is_primary = col_name in primary_key_column_names
+
+ is_nullable_from_source = getattr(raw_col_info, "nullable", True)
+ if isinstance(is_nullable_from_source, str):
+ is_nullable_from_source = is_nullable_from_source.lower() == "true"
+
+ # Primary keys cannot be nullable.
+ final_nullable = False if is_primary else bool(
+ is_nullable_from_source)
+
+ col_data = {
+ "name": col_name,
+ "type": datagen_col_type,
+ "primary": is_primary,
+ "nullable": final_nullable,
+ }
+
+ if datagen_col_type == "decimal":
+ precision = getattr(raw_col_info, "type_precision", None)
+ scale = getattr(raw_col_info, "type_scale", None)
+
+ # Try to parse from type_json if not directly available
+ if precision is None and type_json_str:
+ try:
+ type_info_dict = json.loads(type_json_str)
+ precision = type_info_dict.get("precision")
+ except (json.JSONDecodeError, TypeError):
+ pass # Ignore if parsing fails or precision not found
+
+ if scale is None and type_json_str:
+ try:
+ type_info_dict = json.loads(type_json_str)
+ scale = type_info_dict.get("scale")
+ except (json.JSONDecodeError, TypeError):
+ pass # Ignore if parsing fails or scale not found
+
+ if precision is not None:
+ col_data["precision"] = int(precision)
+ if scale is not None:
+ col_data["scale"] = int(scale)
+
+ elif datagen_col_type == "string" and not is_primary:
+ template = guess_template(col_name)
+ if template:
+ col_data["options"] = {"template": template}
+
+ try:
+ column_def = ColumnDefinition(**col_data) # type: ignore
+ pydantic_column_definitions.append(column_def)
+ except ValidationError as e:
+ raise SpecGenerationError(
+ f"Validation error for column '{col_name}': {e}") from e
+
+ return pydantic_column_definitions
+
+ def _get_table_definition_from_uc(
+ self,
+ uc_table_full_name: str,
+ default_number_of_rows: int = 1000,
+ default_partitions: Optional[int] = 1,
+ ) -> TableDefinition:
+ """
+ Retrieves table schema from Unity Catalog and generates a TableDefinition.
+
+ Args:
+ uc_table_full_name: The three-part name of the table in Unity Catalog
+ (e.g., "catalog_name.schema_name.table_name").
+ default_number_of_rows: Default number of rows for the TableDefinition.
+ default_partitions: Default number of partitions.
+
+ Returns:
+ A TableDefinition object.
+
+ Raises:
+ WorkspaceError: If the table cannot be found or accessed.
+ SchemaParsingError: If schema information is incomplete or invalid.
+ """
+ try:
+ table_info: TableInfo = self.workspace_client.tables.get(
+ uc_table_full_name)
+ except Exception as e: # Catching generic exception from SDK
+ raise SpecGenerationError(
+ f"Error fetching table '{uc_table_full_name}' from Unity Catalog: {e}") from e
+
+ if not table_info:
+ raise SpecGenerationError(
+ f"Table '{uc_table_full_name}' not found in Unity Catalog.")
+
+ if not table_info.columns:
+ raise SpecGenerationError(
+ f"No columns found for table '{uc_table_full_name}'.")
+
+ primary_key_column_names: List[str] = []
+ if table_info.table_constraints:
+ for constraint in table_info.table_constraints:
+ # Ensure constraint and primary_key_constraint are not None
+ if constraint and constraint.primary_key_constraint:
+ # Ensure child_columns is not None and is iterable
+ if constraint.primary_key_constraint.child_columns:
+ primary_key_column_names.extend(
+ constraint.primary_key_constraint.child_columns)
+
+ column_definitions = self._generate_column_definitions(
+ raw_column_infos=table_info.columns,
+ primary_key_column_names=list(
+ set(primary_key_column_names)), # Ensure uniqueness
+ )
+
+ try:
+ table_def = TableDefinition(
+ number_of_rows=default_number_of_rows,
+ partitions=default_partitions,
+ columns=column_definitions,
+ )
+ return table_def
+ except ValidationError as e:
+ raise SpecGenerationError(
+ f"Validation error creating TableDefinition for '{uc_table_full_name}': {e}"
+ ) from e
+
+ def generate_spec(self) -> DatagenSpec:
+ tables_def = {}
+ for table in self.tables:
+ table_definition_model: TableDefinition = self._get_table_definition_from_uc(
+ uc_table_full_name=table,
+ default_number_of_rows=5000,
+ default_partitions=4,
+ )
+ table_name = table.split(".")[-1]
+ tables_def[table_name] = table_definition_model
+
+ # Note: The destination is left empty so that it does not confuse the user. Find a way to notify user of that
+ config_obj = DatagenSpec(tables=tables_def)
+ return config_obj
diff --git a/pytest.ini b/pytest.ini
index 5ac0c440..32c939c6 100644
--- a/pytest.ini
+++ b/pytest.ini
@@ -5,3 +5,7 @@ log_cli_level = INFO
log_cli_format = [pytest][%(asctime)s][%(levelname)s][%(module)s][%(funcName)s] %(message)s
log_cli_date_format = %Y-%m-%d %H:%M:%S
log_level = INFO
+
+
+markers =
+ extensions: marks tests as extension tests
\ No newline at end of file
diff --git a/setup.py b/setup.py
index 7ee9eeff..9ae75245 100644
--- a/setup.py
+++ b/setup.py
@@ -29,6 +29,16 @@
benchmarking, environment validation and other purposes.
"""
+extras_require = {
+ 'extension': [
+ 'pydantic>=2.0.0',
+ "rapidfuzz>=3.13.0" # Only pydantic as additional dependency
+ ],
+ 'spec-generators': [
+ 'databricks-sdk==0.62.0'
+ ]
+}
+
setuptools.setup(
name="dbldatagen",
version="0.4.0post2",
@@ -45,7 +55,8 @@
packages=['dbldatagen',
'dbldatagen.distributions',
'dbldatagen.constraints',
- 'dbldatagen.datasets'
+ 'dbldatagen.datasets',
+ 'dbldatagen.extensions'
],
license="Databricks License",
classifiers=[
@@ -56,4 +67,5 @@
"Intended Audience :: System Administrators"
],
python_requires='>=3.10.12',
+ extras_require=extras_require,
)
diff --git a/tests/test_dataspec_generator.py b/tests/test_dataspec_generator.py
new file mode 100644
index 00000000..4fff49e7
--- /dev/null
+++ b/tests/test_dataspec_generator.py
@@ -0,0 +1,193 @@
+# from unittest.mock import MagicMock, patch
+# import pytest
+# from pydantic import ValidationError
+# from pyspark.sql import SparkSession
+#
+# from dbldatagen.extensions.datagen_spec import (
+# DatagenSpec,
+# TableDefinition,
+# ColumnDefinition,
+# FilePathTarget,
+# )
+#
+# from dbldatagen.extensions.data_generator_from_spec import Generator
+#
+#
+# @pytest.fixture
+# def spark_session():
+# """Fixture to create a SparkSession for testing."""
+# return SparkSession.builder.appName("TestDataGen").master("local[2]").getOrCreate()
+#
+#
+# @pytest.fixture
+# def sample_config():
+# """Fixture to create a sample DatagenSpec for testing."""
+# return DatagenSpec(
+# tables={
+# "test_table": TableDefinition(
+# number_of_rows=100,
+# partitions=2,
+# columns=[
+# ColumnDefinition(name="id", type="string", primary=True),
+# ColumnDefinition(name="value", type="integer", options={
+# "min": 1, "max": 100}),
+# ],
+# )
+# },
+# output_destination=FilePathTarget(
+# base_path="/Volume/testing",
+# output_format="parquet",
+# ),
+# )
+#
+#
+# def test_init_with_spark(spark_session):
+# """Test Generator initialization with provided SparkSession."""
+# generator = Generator(spark=spark_session)
+# assert generator.spark == spark_session
+#
+#
+# def test_init_without_spark():
+# """Test Generator initialization without SparkSession."""
+# with pytest.raises(RuntimeError, match="SparkSession cannot be None"):
+# Generator(spark=None)
+#
+#
+# def test_prepare_data_generators(spark_session, sample_config):
+# """Test preparing data generators from config."""
+# generator = Generator(spark=spark_session)
+# prepared_generators = generator.prepare_data_generators(sample_config)
+#
+# assert "test_table" in prepared_generators
+# assert prepared_generators["test_table"] is not None
+# assert prepared_generators["test_table"].rowCount == 100
+#
+#
+# def test_prepare_data_generators_with_invalid_config(spark_session):
+# """Test preparing data generators with invalid config."""
+# generator = Generator(spark=spark_session)
+#
+# with pytest.raises(ValidationError, match="Value error, Primary column 'id' must have a type defined"):
+# invalid_config = DatagenSpec(
+# tables={
+# "test_table": TableDefinition(
+# number_of_rows=100,
+# partitions=2,
+# columns=[
+# ColumnDefinition(
+# name="id",
+# primary=True, # Missing type for primary key
+# )
+# ],
+# )
+# },
+# output_destination=FilePathTarget(
+# base_path="/Volume/test_output",
+# output_format="parquet",
+# ),
+# )
+#
+#
+# def test_creating_column_definition_with_nullable_primary_key_fails():
+# """
+# Tests that attempting to create a ColumnDefinition instance with
+# primary=True and nullable=True raises a Pydantic ValidationError.
+# """
+# with pytest.raises(ValidationError, match="Value error, Primary column 'id' cannot be nullable"):
+# # This is the action that should trigger the Pydantic validation error
+# ColumnDefinition(
+# name="id",
+# type="string",
+# primary=True,
+# nullable=True, # This combination is invalid by your model's rules
+# )
+#
+#
+# # Alternatively, if you want to test it through the DatagenSpec creation:
+# def test_creating_datagenspec_with_nullable_primary_key_fails():
+# """
+# Tests that attempting to create a DatagenSpec instance containing
+# a nullable primary key raises a Pydantic ValidationError.
+# """
+# with pytest.raises(ValidationError, match="Value error, Primary column 'id' cannot be nullable"):
+# DatagenSpec(
+# tables={
+# "test_table": TableDefinition(
+# number_of_rows=100,
+# partitions=2,
+# columns=[
+# ColumnDefinition( # This is the invalid part
+# name="id", type="string", primary=True, nullable=True
+# )
+# ],
+# )
+# },
+# output_format="parquet",
+# output_path_prefix="/Volume/test_output",
+# )
+#
+#
+# @patch("dbldatagen.extensions.data_generator_from_spec.Generator.write_prepared_data")
+# def test_generate_and_write_data(mock_write, spark_session, sample_config):
+# """Test combined generation and writing of data."""
+# generator = Generator(spark=spark_session)
+# mock_write.return_value = True
+#
+# result = generator.generate_and_write_data(sample_config)
+# assert result is True
+# mock_write.assert_called_once()
+#
+#
+# def test_write_prepared_data(spark_session, sample_config):
+# """Test writing prepared data to output."""
+# generator = Generator(spark=spark_session)
+# prepared_generators = generator.prepare_data_generators(sample_config)
+#
+# # Mock the DataFrame write operation
+# with patch("pyspark.sql.DataFrame.write") as mock_write:
+# mock_write.format.return_value = mock_write
+# mock_write.mode.return_value = mock_write
+# mock_write.save.return_value = None
+#
+# result = generator.write_prepared_data(
+# prepared_generators=prepared_generators,
+# output_destination=sample_config.output_destination,
+# )
+#
+# assert result is True
+# # mock_write.format.assert_called_with(sample_config.output_format)
+# # mock_write.mode.assert_called_with("overwrite")
+# # mock_write.save.assert_called()
+#
+#
+# def test_write_prepared_data_with_empty_generators(spark_session):
+# """Test writing with empty prepared generators."""
+# generator = Generator(spark=spark_session)
+# result = generator.write_prepared_data({}, "parquet", "/tmp/test_output")
+# assert result is True # Should return True as there's nothing to write
+#
+#
+# def test_write_prepared_data_with_failed_generator(spark_session, sample_config):
+# """Test writing with a failed generator (None value)."""
+# generator = Generator(spark=spark_session)
+# prepared_generators = {"test_table": None} # Simulate a failed generator
+#
+# result = generator.write_prepared_data(prepared_generators, output_destination=sample_config.output_destination)
+# assert result is True # Should return True as we skip failed generators
+#
+#
+# def test_write_prepared_data_with_write_error(spark_session, sample_config):
+# """Test writing with a DataFrame write error."""
+# generator = Generator(spark=spark_session)
+# prepared_generators, _ = generator.prepare_data_generators(sample_config)
+#
+# # Mock the DataFrame write operation to raise an error
+# with patch("pyspark.sql.DataFrame.write") as mock_write:
+# mock_write.format.return_value = mock_write
+# mock_write.mode.return_value = mock_write
+# mock_write.save.side_effect = Exception("Write error")
+#
+# result = generator.write_prepared_data(
+# prepared_generators, output_destination=sample_config.output_destination)
+#
+# assert result is False # Should return False on write error
diff --git a/tests/test_spec.py b/tests/test_spec.py
new file mode 100644
index 00000000..12c85df5
--- /dev/null
+++ b/tests/test_spec.py
@@ -0,0 +1,466 @@
+from dbldatagen.spec.generator_spec import DatagenSpec
+import pytest
+from dbldatagen.spec.generator_spec import (
+ DatagenSpec,
+ TableDefinition,
+ ColumnDefinition,
+ UCSchemaTarget,
+ FilePathTarget,
+ ValidationResult
+)
+
+class TestValidationResult:
+ """Tests for ValidationResult class"""
+
+ def test_empty_result_is_valid(self):
+ result = ValidationResult()
+ assert result.is_valid()
+ assert len(result.errors) == 0
+ assert len(result.warnings) == 0
+
+ def test_result_with_errors_is_invalid(self):
+ result = ValidationResult()
+ result.add_error("Test error")
+ assert not result.is_valid()
+ assert len(result.errors) == 1
+
+ def test_result_with_only_warnings_is_valid(self):
+ result = ValidationResult()
+ result.add_warning("Test warning")
+ assert result.is_valid()
+ assert len(result.warnings) == 1
+
+ def test_result_string_representation(self):
+ result = ValidationResult()
+ result.add_error("Error 1")
+ result.add_error("Error 2")
+ result.add_warning("Warning 1")
+
+ result_str = str(result)
+ assert "✗ Validation failed" in result_str
+ assert "Errors (2)" in result_str
+ assert "Error 1" in result_str
+ assert "Error 2" in result_str
+ assert "Warnings (1)" in result_str
+ assert "Warning 1" in result_str
+
+ def test_valid_result_string_representation(self):
+ result = ValidationResult()
+ result_str = str(result)
+ assert "✓ Validation passed successfully" in result_str
+
+
+class TestColumnDefinitionValidation:
+ """Tests for ColumnDefinition validation"""
+
+ def test_valid_primary_column(self):
+ col = ColumnDefinition(
+ name="id",
+ type="int",
+ primary=True
+ )
+ assert col.primary
+ assert col.type == "int"
+
+ def test_primary_column_with_min_max_raises_error(self):
+ with pytest.raises(ValueError, match="cannot have min/max options"):
+ ColumnDefinition(
+ name="id",
+ type="int",
+ primary=True,
+ options={"min": 1, "max": 100}
+ )
+
+ def test_primary_column_nullable_raises_error(self):
+ with pytest.raises(ValueError, match="cannot be nullable"):
+ ColumnDefinition(
+ name="id",
+ type="int",
+ primary=True,
+ nullable=True
+ )
+
+ def test_primary_column_without_type_raises_error(self):
+ with pytest.raises(ValueError, match="must have a type defined"):
+ ColumnDefinition(
+ name="id",
+ primary=True
+ )
+
+ def test_non_primary_column_without_type(self):
+ # Should not raise
+ col = ColumnDefinition(
+ name="data",
+ options={"values": ["a", "b", "c"]}
+ )
+ assert col.name == "data"
+
+
+class TestDatagenSpecValidation:
+ """Tests for DatagenSpec.validate() method"""
+
+ def test_valid_spec_passes_validation(self):
+ spec = DatagenSpec(
+ tables={
+ "users": TableDefinition(
+ number_of_rows=100,
+ columns=[
+ ColumnDefinition(name="id", type="int", primary=True),
+ ColumnDefinition(name="name", type="string", options={"values": ["Alice", "Bob"]}),
+ ]
+ )
+ },
+ output_destination=UCSchemaTarget(catalog="main", schema_="default")
+ )
+
+ result = spec.validate(strict=False)
+ assert result.is_valid()
+ assert len(result.errors) == 0
+
+ def test_empty_tables_raises_error(self):
+ spec = DatagenSpec(tables={})
+
+ with pytest.raises(ValueError, match="at least one table"):
+ spec.validate(strict=True)
+
+ def test_table_without_columns_raises_error(self):
+ spec = DatagenSpec(
+ tables={
+ "empty_table": TableDefinition(
+ number_of_rows=100,
+ columns=[]
+ )
+ }
+ )
+
+ with pytest.raises(ValueError, match="must have at least one column"):
+ spec.validate()
+
+ def test_negative_row_count_raises_error(self):
+ spec = DatagenSpec(
+ tables={
+ "users": TableDefinition(
+ number_of_rows=-10,
+ columns=[ColumnDefinition(name="id", type="int", primary=True)]
+ )
+ }
+ )
+
+ with pytest.raises(ValueError, match="invalid number_of_rows"):
+ spec.validate()
+
+ def test_zero_row_count_raises_error(self):
+ spec = DatagenSpec(
+ tables={
+ "users": TableDefinition(
+ number_of_rows=0,
+ columns=[ColumnDefinition(name="id", type="int", primary=True)]
+ )
+ }
+ )
+
+ with pytest.raises(ValueError, match="invalid number_of_rows"):
+ spec.validate()
+
+ def test_invalid_partitions_raises_error(self):
+ spec = DatagenSpec(
+ tables={
+ "users": TableDefinition(
+ number_of_rows=100,
+ partitions=-5,
+ columns=[ColumnDefinition(name="id", type="int", primary=True)]
+ )
+ }
+ )
+
+ with pytest.raises(ValueError, match="invalid partitions"):
+ spec.validate()
+
+ def test_duplicate_column_names_raises_error(self):
+ spec = DatagenSpec(
+ tables={
+ "users": TableDefinition(
+ number_of_rows=100,
+ columns=[
+ ColumnDefinition(name="id", type="int", primary=True),
+ ColumnDefinition(name="duplicate", type="string"),
+ ColumnDefinition(name="duplicate", type="int"),
+ ]
+ )
+ }
+ )
+
+ with pytest.raises(ValueError, match="duplicate column names"):
+ spec.validate()
+
+ def test_invalid_base_column_reference_raises_error(self):
+ spec = DatagenSpec(
+ tables={
+ "users": TableDefinition(
+ number_of_rows=100,
+ columns=[
+ ColumnDefinition(name="id", type="int", primary=True),
+ ColumnDefinition(name="email", type="string", baseColumn="nonexistent"),
+ ]
+ )
+ }
+ )
+
+ with pytest.raises(ValueError, match="does not exist"):
+ spec.validate()
+
+ def test_circular_dependency_raises_error(self):
+ spec = DatagenSpec(
+ tables={
+ "users": TableDefinition(
+ number_of_rows=100,
+ columns=[
+ ColumnDefinition(name="id", type="int", primary=True),
+ ColumnDefinition(name="col_a", type="string", baseColumn="col_b"),
+ ColumnDefinition(name="col_b", type="string", baseColumn="col_c"),
+ ColumnDefinition(name="col_c", type="string", baseColumn="col_a"),
+ ]
+ )
+ }
+ )
+
+ with pytest.raises(ValueError, match="Circular dependency"):
+ spec.validate()
+
+ def test_multiple_primary_columns_warning(self):
+ spec = DatagenSpec(
+ tables={
+ "users": TableDefinition(
+ number_of_rows=100,
+ columns=[
+ ColumnDefinition(name="id1", type="int", primary=True),
+ ColumnDefinition(name="id2", type="int", primary=True),
+ ]
+ )
+ }
+ )
+
+ # In strict mode, warnings cause errors
+ with pytest.raises(ValueError, match="multiple primary columns"):
+ spec.validate(strict=True)
+
+ # In non-strict mode, should pass but have warnings
+ result = spec.validate(strict=False)
+ assert result.is_valid()
+ assert len(result.warnings) > 0
+ assert any("multiple primary columns" in w for w in result.warnings)
+
+ def test_column_without_type_or_options_warning(self):
+ spec = DatagenSpec(
+ tables={
+ "users": TableDefinition(
+ number_of_rows=100,
+ columns=[
+ ColumnDefinition(name="id", type="int", primary=True),
+ ColumnDefinition(name="empty_col"),
+ ]
+ )
+ }
+ )
+
+ result = spec.validate(strict=False)
+ assert result.is_valid()
+ assert len(result.warnings) > 0
+ assert any("No type specified" in w for w in result.warnings)
+
+ def test_no_output_destination_warning(self):
+ spec = DatagenSpec(
+ tables={
+ "users": TableDefinition(
+ number_of_rows=100,
+ columns=[ColumnDefinition(name="id", type="int", primary=True)]
+ )
+ }
+ )
+
+ result = spec.validate(strict=False)
+ assert result.is_valid()
+ assert len(result.warnings) > 0
+ assert any("No output_destination" in w for w in result.warnings)
+
+ def test_unknown_generator_option_warning(self):
+ spec = DatagenSpec(
+ tables={
+ "users": TableDefinition(
+ number_of_rows=100,
+ columns=[ColumnDefinition(name="id", type="int", primary=True)]
+ )
+ },
+ generator_options={"unknown_option": "value"}
+ )
+
+ result = spec.validate(strict=False)
+ assert result.is_valid()
+ assert len(result.warnings) > 0
+ assert any("Unknown generator option" in w for w in result.warnings)
+
+ def test_multiple_errors_collected(self):
+ """Test that all errors are collected before raising"""
+ spec = DatagenSpec(
+ tables={
+ "users": TableDefinition(
+ number_of_rows=-10, # Error 1
+ partitions=0, # Error 2
+ columns=[
+ ColumnDefinition(name="id", type="int", primary=True),
+ ColumnDefinition(name="id", type="string"), # Error 3: duplicate
+ ColumnDefinition(name="email", baseColumn="phone"), # Error 4: nonexistent
+ ]
+ )
+ }
+ )
+
+ with pytest.raises(ValueError) as exc_info:
+ spec.validate()
+
+ error_msg = str(exc_info.value)
+ # Should contain all errors
+ assert "invalid number_of_rows" in error_msg
+ assert "invalid partitions" in error_msg
+ assert "duplicate column names" in error_msg
+ assert "does not exist" in error_msg
+
+ def test_strict_mode_raises_on_warnings(self):
+ spec = DatagenSpec(
+ tables={
+ "users": TableDefinition(
+ number_of_rows=100,
+ columns=[ColumnDefinition(name="id", type="int", primary=True)]
+ )
+ }
+ # No output_destination - will generate warning
+ )
+
+ # Strict mode should raise
+ with pytest.raises(ValueError):
+ spec.validate(strict=True)
+
+ # Non-strict mode should pass
+ result = spec.validate(strict=False)
+ assert result.is_valid()
+
+ def test_valid_base_column_chain(self):
+ """Test that valid baseColumn chains work"""
+ spec = DatagenSpec(
+ tables={
+ "users": TableDefinition(
+ number_of_rows=100,
+ columns=[
+ ColumnDefinition(name="id", type="int", primary=True),
+ ColumnDefinition(name="code", type="string", baseColumn="id"),
+ ColumnDefinition(name="hash", type="string", baseColumn="code"),
+ ]
+ )
+ },
+ output_destination=FilePathTarget(base_path="/tmp/data", output_format="parquet")
+ )
+
+ result = spec.validate(strict=False)
+ assert result.is_valid()
+
+ def test_multiple_tables_validation(self):
+ """Test validation across multiple tables"""
+ spec = DatagenSpec(
+ tables={
+ "users": TableDefinition(
+ number_of_rows=100,
+ columns=[ColumnDefinition(name="id", type="int", primary=True)]
+ ),
+ "orders": TableDefinition(
+ number_of_rows=-50, # Error in second table
+ columns=[ColumnDefinition(name="order_id", type="int", primary=True)]
+ ),
+ "products": TableDefinition(
+ number_of_rows=200,
+ columns=[] # Error: no columns
+ )
+ }
+ )
+
+ with pytest.raises(ValueError) as exc_info:
+ spec.validate()
+
+ error_msg = str(exc_info.value)
+ # Should find errors in both tables
+ assert "orders" in error_msg
+ assert "products" in error_msg
+
+
+class TestTargetValidation:
+ """Tests for output target validation"""
+
+ def test_valid_uc_schema_target(self):
+ target = UCSchemaTarget(catalog="main", schema_="default")
+ assert target.catalog == "main"
+ assert target.schema_ == "default"
+
+ def test_uc_schema_empty_catalog_raises_error(self):
+ with pytest.raises(ValueError, match="non-empty"):
+ UCSchemaTarget(catalog="", schema_="default")
+
+ def test_valid_file_path_target(self):
+ target = FilePathTarget(base_path="/tmp/data", output_format="parquet")
+ assert target.base_path == "/tmp/data"
+ assert target.output_format == "parquet"
+
+ def test_file_path_empty_base_path_raises_error(self):
+ with pytest.raises(ValueError, match="non-empty"):
+ FilePathTarget(base_path="", output_format="csv")
+
+ def test_file_path_invalid_format_raises_error(self):
+ with pytest.raises(ValueError):
+ FilePathTarget(base_path="/tmp/data", output_format="json")
+
+
+class TestValidationIntegration:
+ """Integration tests for validation"""
+
+ def test_realistic_valid_spec(self):
+ """Test a realistic, valid specification"""
+ spec = DatagenSpec(
+ tables={
+ "users": TableDefinition(
+ number_of_rows=1000,
+ partitions=4,
+ columns=[
+ ColumnDefinition(name="user_id", type="int", primary=True),
+ ColumnDefinition(name="username", type="string", options={
+ "template": r"\w{8,12}"
+ }),
+ ColumnDefinition(name="email", type="string", options={
+ "template": r"\w.\w@\w.com"
+ }),
+ ColumnDefinition(name="age", type="int", options={
+ "min": 18, "max": 99
+ }),
+ ]
+ ),
+ "orders": TableDefinition(
+ number_of_rows=5000,
+ columns=[
+ ColumnDefinition(name="order_id", type="int", primary=True),
+ ColumnDefinition(name="amount", type="decimal", options={
+ "min": 10.0, "max": 1000.0
+ }),
+ ]
+ )
+ },
+ output_destination=UCSchemaTarget(
+ catalog="main",
+ schema_="synthetic_data"
+ ),
+ generator_options={
+ "random": True,
+ "randomSeed": 42
+ }
+ )
+
+ result = spec.validate(strict=True)
+ assert result.is_valid()
+ assert len(result.errors) == 0
+ assert len(result.warnings) == 0