diff --git a/.vscode/settings.json b/.vscode/settings.json index c627269..f383e81 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -28,6 +28,5 @@ "[python]": { "editor.defaultFormatter": "ms-python.black-formatter" }, - "esbonio.sphinx.confDir": "", "cmake.configureOnOpen": false } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 9ce77c8..d7fa270 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -39,7 +39,7 @@ }, { "label": "clean build docs", - "command": "pipenv run sphinx-build -a docs out/docs/html", + "command": "pipenv run sphinx-build -E docs out/docs/html", "type": "shell", "presentation": { "reveal": "always" diff --git a/Pipfile b/Pipfile index 262af4e..d6aaa8d 100644 --- a/Pipfile +++ b/Pipfile @@ -4,16 +4,21 @@ verify_ssl = true name = "pypi" [packages] -conan = {version="==1.59.0"} cookiecutter = {version="==2.1.1"} gcovr = "*" hammocking = "*" kconfiglib = "*" [dev-packages] +jinja2 = "*" pytest = "*" +pytest-env = "*" pytest-cov = "*" -pipenv = "*" +testfixtures = "*" +junitparser = "*" +mashumaro = "*" +loguru = "*" +black = "*" m2r = "*" flake8 = "*" sphinx = "*" @@ -21,11 +26,13 @@ sphinx-rtd-theme = "*" sphinxcontrib-mermaid = "*" sphinx-needs = "*" sphinx-test-reports = "*" -sphinxcontrib-plantuml = "*" doxysphinx = "*" sphinx-rtd-size = "*" +sphinxcontrib-datatemplates = "*" +sphinxcontrib-plantuml = "*" sphinx-copybutton = "*" sphinx-new-tab-link = "*" +pipenv = "*" [requires] python_version = "3.11" diff --git a/Pipfile.lock b/Pipfile.lock index 49a118e..117b5ba 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "322698f80ba1adb0efb075363a9ffc3fd3314ea6c8c15100953e3660144a74bb" + "sha256": "53a6ff06e4960c4496235b12b67a2599297db8e6cfb622c247f442ece1ac172b" }, "pipfile-spec": 6, "requires": { @@ -31,20 +31,13 @@ ], "version": "==0.4.4" }, - "bottle": { - "hashes": [ - "sha256:d6f15f9d422670b7c073d63bd8d287b135388da187a0f3e3c19293626ce034ea", - "sha256:e1a9c94970ae6d710b3fb4526294dfeb86f2cb4a81eff3a4b98dc40fb0e5e021" - ], - "version": "==0.12.25" - }, "certifi": { "hashes": [ - "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", - "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" + "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", + "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474" ], "markers": "python_version >= '3.6'", - "version": "==2023.7.22" + "version": "==2023.11.17" }, "chardet": { "hashes": [ @@ -163,38 +156,24 @@ "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", + "markers": "platform_system == 'Windows'", "version": "==0.4.6" }, - "conan": { - "hashes": [ - "sha256:161c8f2d3193c209a1e9525fe7d6c600688da529a9864e6ef557133e93131952" - ], - "index": "pypi", - "version": "==1.59.0" - }, "cookiecutter": { "hashes": [ "sha256:9f3ab027cec4f70916e28f03470bdb41e637a3ad354b4d65c765d93aad160022", "sha256:f3982be8d9c53dac1261864013fdec7f83afd2e42ede6f6dd069c5e149c540d5" ], - "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==2.1.1" }, - "fasteners": { - "hashes": [ - "sha256:758819cb5d94cdedf4e836988b74de396ceacb8e2794d21f82d131fd9ee77237", - "sha256:b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c" - ], - "markers": "python_version >= '3.6'", - "version": "==0.19" - }, "gcovr": { "hashes": [ "sha256:2e52019fdb76c6e327f48c2a2d8555fb5e362570b79cc74c5498804d1ce54a60", "sha256:8638d5f44def10e38e3166c8a33bef6643ec204687e0ac7d345ce41a98c5750b" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==6.0" }, "hammocking": { @@ -207,18 +186,18 @@ }, "idna": { "hashes": [ - "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", - "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", + "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" ], "markers": "python_version >= '3.5'", - "version": "==3.4" + "version": "==3.6" }, "jinja2": { "hashes": [ "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" ], - "markers": "python_version >= '3'", + "markers": "python_version >= '3.7'", "version": "==3.1.2" }, "jinja2-time": { @@ -234,6 +213,7 @@ "sha256:edcd35a20e7e138a9a9e96149027f805f785e818d2eae400b6fa8b0c8845114a" ], "index": "pypi", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1'", "version": "==14.1.0" }, "libclang": { @@ -254,101 +234,97 @@ }, "lxml": { "hashes": [ - "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3", - "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d", - "sha256:081d32421db5df44c41b7f08a334a090a545c54ba977e47fd7cc2deece78809a", - "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120", - "sha256:0bfd0767c5c1de2551a120673b72e5d4b628737cb05414f03c3277bf9bed3305", - "sha256:0c0850c8b02c298d3c7006b23e98249515ac57430e16a166873fc47a5d549287", - "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23", - "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52", - "sha256:1247694b26342a7bf47c02e513d32225ededd18045264d40758abeb3c838a51f", - "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4", - "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584", - "sha256:1509dd12b773c02acd154582088820893109f6ca27ef7291b003d0e81666109f", - "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693", - "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef", - "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5", - "sha256:23eed6d7b1a3336ad92d8e39d4bfe09073c31bfe502f20ca5116b2a334f8ec02", - "sha256:25f32acefac14ef7bd53e4218fe93b804ef6f6b92ffdb4322bb6d49d94cad2bc", - "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7", - "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da", - "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a", - "sha256:3e9bdd30efde2b9ccfa9cb5768ba04fe71b018a25ea093379c857c9dad262c40", - "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8", - "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd", - "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601", - "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c", - "sha256:48d6ed886b343d11493129e019da91d4039826794a3e3027321c56d9e71505be", - "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2", - "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c", - "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129", - "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc", - "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2", - "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1", - "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7", - "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d", - "sha256:50baa9c1c47efcaef189f31e3d00d697c6d4afda5c3cde0302d063492ff9b477", - "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d", - "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e", - "sha256:56dc1f1ebccc656d1b3ed288f11e27172a01503fc016bcabdcbc0978b19352b7", - "sha256:578695735c5a3f51569810dfebd05dd6f888147a34f0f98d4bb27e92b76e05c2", - "sha256:57aba1bbdf450b726d58b2aea5fe47c7875f5afb2c4a23784ed78f19a0462574", - "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf", - "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b", - "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98", - "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12", - "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42", - "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35", - "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d", - "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce", - "sha256:704f61ba8c1283c71b16135caf697557f5ecf3e74d9e453233e4771d68a1f42d", - "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f", - "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db", - "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4", - "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694", - "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac", - "sha256:8df133a2ea5e74eef5e8fc6f19b9e085f758768a16e9877a60aec455ed2609b2", - "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7", - "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96", - "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d", - "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b", - "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a", - "sha256:9a92d3faef50658dd2c5470af249985782bf754c4e18e15afb67d3ab06233f13", - "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340", - "sha256:9e28c51fa0ce5674be9f560c6761c1b441631901993f76700b1b30ca6c8378d6", - "sha256:aca086dc5f9ef98c512bac8efea4483eb84abbf926eaeedf7b91479feb092458", - "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c", - "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c", - "sha256:b4e4bc18382088514ebde9328da057775055940a1f2e18f6ad2d78aa0f3ec5b9", - "sha256:b6420a005548ad52154c8ceab4a1290ff78d757f9e5cbc68f8c77089acd3c432", - "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991", - "sha256:bb3bb49c7a6ad9d981d734ef7c7193bc349ac338776a0360cc671eaee89bcf69", - "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf", - "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb", - "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b", - "sha256:c41bfca0bd3532d53d16fd34d20806d5c2b1ace22a2f2e4c0008570bf2c58833", - "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76", - "sha256:cdb650fc86227eba20de1a29d4b2c1bfe139dc75a0669270033cb2ea3d391b85", - "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e", - "sha256:d27be7405547d1f958b60837dc4c1007da90b8b23f54ba1f8b728c78fdb19d50", - "sha256:d37017287a7adb6ab77e1c5bee9bcf9660f90ff445042b790402a654d2ad81d8", - "sha256:d3ff32724f98fbbbfa9f49d82852b159e9784d6094983d9a8b7f2ddaebb063d4", - "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b", - "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5", - "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190", - "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7", - "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa", - "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0", - "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9", - "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0", - "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b", - "sha256:fc9b106a1bf918db68619fdcd6d5ad4f972fdd19c01d19bdb6bf63f3589a9ec5", - "sha256:fcdd00edfd0a3001e0181eab3e63bd5c74ad3e67152c84f93f13769a40e073a7", - "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4" + "sha256:016de3b29a262655fc3d2075dc1b2611f84f4c3d97a71d579c883d45e201eee4", + "sha256:0326e9b8176ea77269fb39e7af4010906e73e9496a9f8eaf06d253b1b1231ceb", + "sha256:03290e2f714f2e7431c8430c08b48167f657da7bc689c6248e828ff3c66d5b1b", + "sha256:049fef98d02513c34f5babd07569fc1cf1ed14c0f2fbff18fe72597f977ef3c2", + "sha256:07a900735bad9af7be3085480bf384f68ed5580ba465b39a098e6a882c060d6b", + "sha256:0d277d4717756fe8816f0beeff229cb72f9dd02a43b70e1d3f07c8efadfb9fe1", + "sha256:173bcead3af5d87c7bca9a030675073ddaad8e0a9f0b04be07cd9390453e7226", + "sha256:1ef0793e1e2dd221fce7c142177008725680f7b9e4a184ab108d90d5d3ab69b7", + "sha256:21af2c3862db6f4f486cddf73ec1157b40d5828876c47cd880edcbad8240ea1b", + "sha256:2219cbf790e701acf9a21a31ead75f983e73daf0eceb9da6990212e4d20ebefe", + "sha256:2992591e2294bb07faf7f5f6d5cb60710c046404f4bfce09fb488b85d2a8f58f", + "sha256:3663542aee845129a981889c19b366beab0b1dadcf5ca164696aabfe1aa51667", + "sha256:3e6cbb68bf70081f036bfc018649cf4b46c4e7eaf7860a277cae92dee2a57f69", + "sha256:3f908afd0477cace17f941d1b9cfa10b769fe1464770abe4cfb3d9f35378d0f8", + "sha256:3ffa066db40b0347e48334bd4465de768e295a3525b9a59831228b5f4f93162d", + "sha256:405e3760f83a8ba3bdb6e622ec79595cdc20db916ce37377bbcb95b5711fa4ca", + "sha256:44fa9afd632210f1eeda51cf284ed8dbab0c7ec8b008dd39ba02818e0e114e69", + "sha256:4786b0af7511ea614fd86407a52a7bc161aa5772d311d97df2591ed2351de768", + "sha256:4a45a278518e4308865c1e9dbb2c42ce84fb154efb03adeb16fdae3c1687c7c9", + "sha256:4b9d5b01900a760eb3acf6cef50aead4ef2fa79e7ddb927084244e41dfe37b65", + "sha256:4e69c36c8618707a90ed3fb6f48a6cc9254ffcdbf7b259e439a5ae5fbf9c5206", + "sha256:52a9ab31853d3808e7cf0183b3a5f7e8ffd622ea4aee1deb5252dbeaefd5b40d", + "sha256:52c0acc2f29b0a204efc11a5ed911a74f50a25eb7d7d5069c2b1fd3b3346ce11", + "sha256:5382612ba2424cea5d2c89e2c29077023d8de88f8d60d5ceff5f76334516df9e", + "sha256:581a78f299a9f5448b2c3aea904bfcd17c59bf83016d221d7f93f83633bb2ab2", + "sha256:583c0e15ae06adc81035346ae2abb2e748f0b5197e7740d8af31222db41bbf7b", + "sha256:59cea9ba1c675fbd6867ca1078fc717a113e7f5b7644943b74137b7cc55abebf", + "sha256:5b39f63edbe7e018c2ac1cf0259ee0dd2355274e8a3003d404699b040782e55e", + "sha256:5eff173f0ff408bfa578cbdafd35a7e0ca94d1a9ffe09a8a48e0572d0904d486", + "sha256:5fb988e15378d6e905ca8f60813950a0c56da9469d0e8e5d8fe785b282684ec5", + "sha256:6507c58431dbd95b50654b3313c5ad54f90e54e5f2cdacf733de61eae478eec5", + "sha256:6a2de85deabf939b0af89e2e1ea46bfb1239545e2da6f8ac96522755a388025f", + "sha256:6a5501438dd521bb7e0dde5008c40c7bfcfaafaf86eccb3f9bd27509abb793da", + "sha256:6bba06d8982be0f0f6432d289a8d104417a0ab9ed04114446c4ceb6d4a40c65d", + "sha256:70ab4e02f7aa5fb4131c8b222a111ce7676f3767e36084fba3a4e7338dc82dcd", + "sha256:7188495c1bf71bfda87d78ed50601e72d252119ce11710d6e71ff36e35fea5a0", + "sha256:71a7cee869578bc17b18050532bb2f0bc682a7b97dda77041741a1bd2febe6c7", + "sha256:73bfab795d354aaf2f4eb7a5b0db513031734fd371047342d5803834ce19ec18", + "sha256:766868f729f3ab84125350f1a0ea2594d8b1628a608a574542a5aff7355b9941", + "sha256:77b73952534967a4497d9e4f26fbeebfba19950cbc66b7cc3a706214429d8106", + "sha256:78d6d8e5b54ed89dc0f0901eaaa579c384ad8d59fa43cc7fb06e9bb89115f8f4", + "sha256:793be9b4945c2dfd69828fb5948d7d9569b78e0599e4a2e88d92affeb0ff3aa3", + "sha256:7ba26a7dc929a1b3487d51bbcb0099afed2fc06e891b82845c8f37a2d7d7fbbd", + "sha256:7df433d08d4587dc3932f7fcfc3194519a6824824104854e76441fd3bc000d29", + "sha256:80209b31dd3908bc5b014f540fd192c97ea52ab179713a730456c5baf7ce80c1", + "sha256:8134d5441d1ed6a682e3de3d7a98717a328dce619ee9c4c8b3b91f0cb0eb3e28", + "sha256:81509dffd8aba3bdb43e90cbd218c9c068a1f4047d97bc9546b3ac9e3a4ae81d", + "sha256:88f559f8beb6b90e41a7faae4aca4c8173a4819874a9bf8e74c8d7c1d51f3162", + "sha256:894c5f71186b410679aaab5774543fcb9cbabe8893f0b31d11cf28a0740e80be", + "sha256:8cc0a951e5616ac626f7036309c41fb9774adcd4aa7db0886463da1ce5b65edb", + "sha256:8ce8b468ab50f9e944719d1134709ec11fe0d2840891a6cae369e22141b1094c", + "sha256:904d36165848b59c4e04ae5b969072e602bd987485076fca8ec42c6cd7a7aedc", + "sha256:96095bfc0c02072fc89afa67626013a253596ea5118b8a7f4daaae049dafa096", + "sha256:980ba47c8db4b9d870014c7040edb230825b79017a6a27aa54cdb6fcc02d8cc0", + "sha256:992029258ed719f130d5a9c443d142c32843046f1263f2c492862b2a853be570", + "sha256:99cad5c912f359e59e921689c04e54662cdd80835d80eeaa931e22612f515df7", + "sha256:9b59c429e1a2246da86ae237ffc3565efcdc71c281cd38ca8b44d5fb6a3b993a", + "sha256:9ca498f8554a09fbc3a2f8fc4b23261e07bc27bef99b3df98e2570688033f6fc", + "sha256:9cd3d6c2c67d4fdcd795e4945e2ba5434909c96640b4cc09453bd0dc7e8e1bac", + "sha256:a85136d0ee18a41c91cc3e2844c683be0e72e6dda4cb58da9e15fcaef3726af7", + "sha256:ac21aace6712472e77ea9dfc38329f53830c4259ece54c786107105ebb069053", + "sha256:aebd8fd378e074b22e79cad329dcccd243c40ff1cafaa512d19276c5bb9554e1", + "sha256:affdd833f82334fdb10fc9a1c7b35cdb5a86d0b672b4e14dd542e1fe7bcea894", + "sha256:b6d4e148edee59c2ad38af15810dbcb8b5d7b13e5de3509d8cf3edfe74c0adca", + "sha256:bb58e8f4b2cfe012cd312239b8d5139995fe8f5945c7c26d5fbbbb1ddb9acd47", + "sha256:bfdc4668ac56687a89ca3eca44231144a2e9d02ba3b877558db74ba20e2bd9fa", + "sha256:c1249aa4eaced30b59ecf8b8cae0b1ccede04583c74ca7d10b6f8bbead908b2c", + "sha256:c7cfb6af73602c8d288581df8a225989d7e9d5aab0a174be0e19fcfa800b6797", + "sha256:c7fe19abb3d3c55a9e65d289b12ad73b3a31a3f0bda3c539a890329ae9973bd6", + "sha256:c8954da15403db1acfc0544b3c3f963a6ef4e428283ab6555e3e298bbbff1cf6", + "sha256:c90c593aa8dd57d5dab0ef6d7d64af894008971d98e6a41b320fdd75258fbc6e", + "sha256:cb564bbe55ff0897d9cf1225041a44576d7ae87f06fd60163544c91de2623d3f", + "sha256:cfa8a4cdc3765574b7fd0c7cfa5fbd1e2108014c9dfd299c679e5152bea9a55e", + "sha256:d1bb64646480c36a4aa1b6a44a5b6e33d0fcbeab9f53f1b39072cd3bb2c6243a", + "sha256:dac2733fe4e159b0aae0439db6813b7b1d23ff96d0b34c0107b87faf79208c4e", + "sha256:db40e85cffd22f7d65dcce30e85af565a66401a6ed22fc0c56ed342cfa4ffc43", + "sha256:dd39ef87fd1f7bb5c4aa53454936e6135cbfe03fe3744e8218be193f9e4fef16", + "sha256:de1a8b54170024cf1c0c2718c82412bca42cd82e390556e3d8031af9541b416f", + "sha256:e675a4b95208e74c34ac0751cc4bab9170e7728b61601fb0f4746892c2bb7e0b", + "sha256:e6bb39d91bf932e7520cb5718ae3c2f498052aca53294d5d59fdd9068fe1a7f2", + "sha256:e8c63f5c7d87e7044880b01851ac4e863c3349e6f6b6ab456fe218d9346e816d", + "sha256:ea56825c1e23c9c8ea385a191dac75f9160477057285b88c88736d9305e6118f", + "sha256:ee60f33456ff34b2dd1d048a740a2572798356208e4c494301c931de3a0ab3a2", + "sha256:f15844a1b93dcaa09c2b22e22a73384f3ae4502347c3881cfdd674e14ac04e21", + "sha256:f298ac9149037d6a3d5c74991bded39ac46292520b9c7c182cb102486cc87677", + "sha256:f30e697b6215e759d0824768b2c5b0618d2dc19abe6c67eeed2b0460f52470d1", + "sha256:f92d73faa0b1a76d1932429d684b7ce95829e93c3eef3715ec9b98ab192c9d31", + "sha256:fef10f27d6318d2d7c88680e113511ddecf09ee4f9559b3623b73ee89fa8f6cc" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==4.9.3" + "version": "==5.0.0" }, "markupsafe": { "hashes": [ @@ -416,40 +392,13 @@ "markers": "python_version >= '3.7'", "version": "==2.1.3" }, - "node-semver": { - "hashes": [ - "sha256:4016f7c1071b0493f18db69ea02d3763e98a633606d7c7beca811e53b5ac66b7", - "sha256:d4bf83873894591a0cbb6591910d96917fbadc9731e8e39e782d3a2fbc2b841e" - ], - "version": "==0.6.1" - }, - "patch-ng": { - "hashes": [ - "sha256:627abc5bd723c8b481e96849b9734b10065426224d4d22cd44137004ac0d4ace" - ], - "version": "==1.17.4" - }, - "pluginbase": { - "hashes": [ - "sha256:ff6c33a98fce232e9c73841d787a643de574937069f0d18147028d70d7dee287" - ], - "version": "==1.0.1" - }, "pygments": { "hashes": [ - "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692", - "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29" + "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", + "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367" ], "markers": "python_version >= '3.7'", - "version": "==2.16.1" - }, - "pyjwt": { - "hashes": [ - "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de", - "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320" - ], - "markers": "python_version >= '3.7'", - "version": "==2.8.0" + "version": "==2.17.2" }, "python-dateutil": { "hashes": [ @@ -469,49 +418,59 @@ }, "pyyaml": { "hashes": [ - "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf", - "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293", - "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b", - "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57", - "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b", - "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4", - "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07", - "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba", - "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9", - "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287", - "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513", - "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0", - "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782", - "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0", - "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92", - "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f", - "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2", - "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc", - "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1", - "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c", - "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86", - "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4", - "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c", - "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34", - "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b", - "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d", - "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c", - "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb", - "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7", - "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737", - "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3", - "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d", - "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358", - "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53", - "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78", - "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803", - "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a", - "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f", - "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174", - "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5" + "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: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" ], "markers": "python_version >= '3.6'", - "version": "==6.0" + "version": "==6.0.1" }, "requests": { "hashes": [ @@ -536,14 +495,6 @@ ], "version": "==1.3" }, - "tqdm": { - "hashes": [ - "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386", - "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7" - ], - "markers": "python_version >= '3.7'", - "version": "==4.66.1" - }, "types-python-dateutil": { "hashes": [ "sha256:1f4f10ac98bb8b16ade9dbee3518d9ace017821d94b057a425b069f834737f4b", @@ -553,11 +504,11 @@ }, "urllib3": { "hashes": [ - "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07", - "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0" + "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3", + "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.26.18" + "markers": "python_version >= '3.8'", + "version": "==2.1.0" } }, "develop": { @@ -571,27 +522,56 @@ }, "attrs": { "hashes": [ - "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", - "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015" + "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", + "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" ], "markers": "python_version >= '3.7'", - "version": "==23.1.0" + "version": "==23.2.0" }, "babel": { "hashes": [ - "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900", - "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed" + "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363", + "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287" ], "markers": "python_version >= '3.7'", - "version": "==2.13.1" + "version": "==2.14.0" + }, + "black": { + "hashes": [ + "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50", + "sha256:1fa88a0f74e50e4487477bc0bb900c6781dbddfdfa32691e780bf854c3b4a47f", + "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e", + "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec", + "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055", + "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3", + "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5", + "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54", + "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b", + "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e", + "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e", + "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba", + "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea", + "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59", + "sha256:a4d6a9668e45ad99d2f8ec70d5c8c04ef4f32f648ef39048d010b0689832ec6d", + "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0", + "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9", + "sha256:b18fb2ae6c4bb63eebe5be6bd869ba2f14fd0259bda7d18a46b764d8fb86298a", + "sha256:c04b6d9d20e9c13f43eee8ea87d44156b8505ca8a3c878773f68b4e4812a421e", + "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba", + "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2", + "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==23.12.1" }, "certifi": { "hashes": [ - "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", - "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" + "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", + "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474" ], "markers": "python_version >= '3.6'", - "version": "==2023.7.22" + "version": "==2023.11.17" }, "charset-normalizer": { "hashes": [ @@ -709,150 +689,92 @@ "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", + "markers": "platform_system == 'Windows'", "version": "==0.4.6" }, - "contourpy": { - "hashes": [ - "sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6", - "sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33", - "sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8", - "sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d", - "sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d", - "sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c", - "sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf", - "sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e", - "sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e", - "sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163", - "sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532", - "sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2", - "sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8", - "sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1", - "sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b", - "sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9", - "sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916", - "sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23", - "sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb", - "sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a", - "sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e", - "sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442", - "sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684", - "sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34", - "sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d", - "sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d", - "sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9", - "sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45", - "sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718", - "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab", - "sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3", - "sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae", - "sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb", - "sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5", - "sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba", - "sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0", - "sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217", - "sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887", - "sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887", - "sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62", - "sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431", - "sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b", - "sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce", - "sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b", - "sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f", - "sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85", - "sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e", - "sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7", - "sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251", - "sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970", - "sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0", - "sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7" - ], - "markers": "python_version >= '3.8'", - "version": "==1.1.1" - }, "coverage": { "extras": [ "toml" ], "hashes": [ - "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1", - "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63", - "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9", - "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312", - "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3", - "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb", - "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25", - "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92", - "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda", - "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148", - "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6", - "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216", - "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a", - "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640", - "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836", - "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c", - "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f", - "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2", - "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901", - "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed", - "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a", - "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074", - "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc", - "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84", - "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083", - "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f", - "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c", - "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c", - "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637", - "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2", - "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82", - "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f", - "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce", - "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef", - "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f", - "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611", - "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c", - "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76", - "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9", - "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce", - "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9", - "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf", - "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf", - "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9", - "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6", - "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2", - "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a", - "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a", - "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf", - "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738", - "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a", - "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4" + "sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca", + "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471", + "sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a", + "sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058", + "sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85", + "sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143", + "sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446", + "sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590", + "sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a", + "sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105", + "sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9", + "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a", + "sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac", + "sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25", + "sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2", + "sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450", + "sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932", + "sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba", + "sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137", + "sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae", + "sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614", + "sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70", + "sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e", + "sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505", + "sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870", + "sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc", + "sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451", + "sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7", + "sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e", + "sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566", + "sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5", + "sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26", + "sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2", + "sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42", + "sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555", + "sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43", + "sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed", + "sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa", + "sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516", + "sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952", + "sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd", + "sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09", + "sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c", + "sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f", + "sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6", + "sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1", + "sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0", + "sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e", + "sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9", + "sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9", + "sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e", + "sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06" ], "markers": "python_version >= '3.8'", - "version": "==7.3.2" + "version": "==7.4.0" }, - "cycler": { + "defusedxml": { "hashes": [ - "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", - "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c" + "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", + "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61" ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==0.7.1" }, "distlib": { "hashes": [ - "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057", - "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8" + "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784", + "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64" ], - "version": "==0.3.7" + "version": "==0.3.8" }, "docutils": { "hashes": [ - "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c", - "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06" + "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6", + "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==0.18.1" + "markers": "python_version >= '3.7'", + "version": "==0.20.1" }, "doxysphinx": { "hashes": [ @@ -860,6 +782,7 @@ "sha256:e3d8dd39dd2610717149765371085ab83a8c8c769d0292d2d2a29f8346b34c5d" ], "index": "pypi", + "markers": "python_version < '3.12' and python_version >= '3.8'", "version": "==3.3.7" }, "filelock": { @@ -876,63 +799,16 @@ "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5" ], "index": "pypi", + "markers": "python_full_version >= '3.8.1'", "version": "==6.1.0" }, - "fonttools": { - "hashes": [ - "sha256:10003ebd81fec0192c889e63a9c8c63f88c7d72ae0460b7ba0cd2a1db246e5ad", - "sha256:10b3922875ffcba636674f406f9ab9a559564fdbaa253d66222019d569db869c", - "sha256:13a9a185259ed144def3682f74fdcf6596f2294e56fe62dfd2be736674500dba", - "sha256:17dbc2eeafb38d5d0e865dcce16e313c58265a6d2d20081c435f84dc5a9d8212", - "sha256:18a2477c62a728f4d6e88c45ee9ee0229405e7267d7d79ce1f5ce0f3e9f8ab86", - "sha256:18eefac1b247049a3a44bcd6e8c8fd8b97f3cad6f728173b5d81dced12d6c477", - "sha256:1952c89a45caceedf2ab2506d9a95756e12b235c7182a7a0fff4f5e52227204f", - "sha256:1cf9e974f63b1080b1d2686180fc1fbfd3bfcfa3e1128695b5de337eb9075cef", - "sha256:1e09da7e8519e336239fbd375156488a4c4945f11c4c5792ee086dd84f784d02", - "sha256:2062542a7565091cea4cc14dd99feff473268b5b8afdee564f7067dd9fff5860", - "sha256:25d3da8a01442cbc1106490eddb6d31d7dffb38c1edbfabbcc8db371b3386d72", - "sha256:34f713dad41aa21c637b4e04fe507c36b986a40f7179dcc86402237e2d39dcd3", - "sha256:360201d46165fc0753229afe785900bc9596ee6974833124f4e5e9f98d0f592b", - "sha256:3b7ad05b2beeebafb86aa01982e9768d61c2232f16470f9d0d8e385798e37184", - "sha256:4c54466f642d2116686268c3e5f35ebb10e49b0d48d41a847f0e171c785f7ac7", - "sha256:4d9740e3783c748521e77d3c397dc0662062c88fd93600a3c2087d3d627cd5e5", - "sha256:4f88cae635bfe4bbbdc29d479a297bb525a94889184bb69fa9560c2d4834ddb9", - "sha256:51669b60ee2a4ad6c7fc17539a43ffffc8ef69fd5dbed186a38a79c0ac1f5db7", - "sha256:5db46659cfe4e321158de74c6f71617e65dc92e54980086823a207f1c1c0e24b", - "sha256:5f37e31291bf99a63328668bb83b0669f2688f329c4c0d80643acee6e63cd933", - "sha256:6bb5ea9076e0e39defa2c325fc086593ae582088e91c0746bee7a5a197be3da0", - "sha256:748015d6f28f704e7d95cd3c808b483c5fb87fd3eefe172a9da54746ad56bfb6", - "sha256:7bbbf8174501285049e64d174e29f9578495e1b3b16c07c31910d55ad57683d8", - "sha256:884ef38a5a2fd47b0c1291647b15f4e88b9de5338ffa24ee52c77d52b4dfd09c", - "sha256:8da417431bfc9885a505e86ba706f03f598c85f5a9c54f67d63e84b9948ce590", - "sha256:95e974d70238fc2be5f444fa91f6347191d0e914d5d8ae002c9aa189572cc215", - "sha256:9648518ef687ba818db3fcc5d9aae27a369253ac09a81ed25c3867e8657a0680", - "sha256:9a2f0aa6ca7c9bc1058a9d0b35483d4216e0c1bbe3962bc62ce112749954c7b8", - "sha256:9c36da88422e0270fbc7fd959dc9749d31a958506c1d000e16703c2fce43e3d0", - "sha256:9c60ecfa62839f7184f741d0509b5c039d391c3aff71dc5bc57b87cc305cff3b", - "sha256:9f727c3e3d08fd25352ed76cc3cb61486f8ed3f46109edf39e5a60fc9fecf6ca", - "sha256:a7a06f8d95b7496e53af80d974d63516ffb263a468e614978f3899a6df52d4b3", - "sha256:ad0b3f6342cfa14be996971ea2b28b125ad681c6277c4cd0fbdb50340220dfb6", - "sha256:b2adca1b46d69dce4a37eecc096fe01a65d81a2f5c13b25ad54d5430ae430b13", - "sha256:b84a1c00f832feb9d0585ca8432fba104c819e42ff685fcce83537e2e7e91204", - "sha256:bb6d2f8ef81ea076877d76acfb6f9534a9c5f31dc94ba70ad001267ac3a8e56f", - "sha256:bf11e2cca121df35e295bd34b309046c29476ee739753bc6bc9d5050de319273", - "sha256:d21099b411e2006d3c3e1f9aaf339e12037dbf7bf9337faf0e93ec915991f43b", - "sha256:d4071bd1c183b8d0b368cc9ed3c07a0f6eb1bdfc4941c4c024c49a35429ac7cd", - "sha256:e117a92b07407a061cde48158c03587ab97e74e7d73cb65e6aadb17af191162a", - "sha256:f7a58eb5e736d7cf198eee94844b81c9573102ae5989ebcaa1d1a37acd04b33d", - "sha256:fe9b1ec799b6086460a7480e0f55c447b1aca0a4eecc53e444f639e967348896" - ], - "markers": "python_version >= '3.8'", - "version": "==4.43.1" - }, "idna": { "hashes": [ - "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", - "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", + "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" ], "markers": "python_version >= '3.5'", - "version": "==3.4" + "version": "==3.6" }, "imagesize": { "hashes": [ @@ -955,139 +831,38 @@ "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" ], - "markers": "python_version >= '3'", + "markers": "python_version >= '3.7'", "version": "==3.1.2" }, "jsonschema": { "hashes": [ - "sha256:c9ff4d7447eed9592c23a12ccee508baf0dd0d59650615e847feb6cdca74f392", - "sha256:eee9e502c788e89cb166d4d37f43084e3b64ab405c795c03d343a4dbc2c810fc" + "sha256:4f614fd46d8d61258610998997743ec5492a648b33cf478c1ddc23ed4598a5fa", + "sha256:ed6231f0429ecf966f5bc8dfef245998220549cbbcf140f913b7464c52c3b6b3" ], "markers": "python_version >= '3.8'", - "version": "==4.19.2" + "version": "==4.20.0" }, "jsonschema-specifications": { "hashes": [ - "sha256:05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1", - "sha256:c91a50404e88a1f6ba40636778e2ee08f6e24c5613fe4c53ac24578a5a7f72bb" + "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc", + "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c" ], "markers": "python_version >= '3.8'", - "version": "==2023.7.1" - }, - "kiwisolver": { - "hashes": [ - "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf", - "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e", - "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af", - "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f", - "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046", - "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3", - "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5", - "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71", - "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee", - "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3", - "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9", - "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b", - "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985", - "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea", - "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16", - "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89", - "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c", - "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9", - "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712", - "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342", - "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a", - "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958", - "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d", - "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a", - "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130", - "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff", - "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898", - "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b", - "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f", - "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265", - "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93", - "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929", - "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635", - "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709", - "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b", - "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb", - "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a", - "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920", - "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e", - "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544", - "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45", - "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390", - "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77", - "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355", - "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff", - "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4", - "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7", - "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20", - "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c", - "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162", - "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228", - "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437", - "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc", - "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a", - "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901", - "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4", - "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770", - "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525", - "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad", - "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a", - "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29", - "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90", - "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250", - "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d", - "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3", - "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54", - "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f", - "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1", - "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da", - "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238", - "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa", - "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523", - "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0", - "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205", - "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3", - "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4", - "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac", - "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9", - "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb", - "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced", - "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd", - "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0", - "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da", - "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18", - "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9", - "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276", - "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333", - "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b", - "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db", - "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126", - "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9", - "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09", - "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0", - "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec", - "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7", - "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff", - "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9", - "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192", - "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8", - "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d", - "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6", - "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797", - "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892", - "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f" + "version": "==2023.12.1" + }, + "junitparser": { + "hashes": [ + "sha256:9e053d7df3f425481a0e61fc2db99e348f14858af0390cc2e533006954b1cf15", + "sha256:c9f00e286493a077088d5c44d819702fbb2dda9f55323b607a68d62d646fe659" ], - "markers": "python_version >= '3.7'", - "version": "==1.4.5" + "index": "pypi", + "version": "==3.1.1" }, "libsass": { "hashes": [ "sha256:081e256ab3c5f3f09c7b8dea3bf3bf5e64a97c6995fd9eea880639b3f93a9f9a", "sha256:3ab5ad18e47db560f4f0c09e3d28cf3bb1a44711257488ac2adad69f4f7f8425", + "sha256:5fb2297a4754a6c8e25cfe5c015a3b51a2b6b9021b333f989bb8ce9d60eb5828", "sha256:65455a2728b696b62100eb5932604aa13a29f4ac9a305d95773c14aaa7200aaf", "sha256:89c5ce497fcf3aba1dd1b19aae93b99f68257e5f2026b731b00a872f13324c7f", "sha256:f1efc1b612299c88aec9e39d6ca0c266d360daa5b19d9430bdeaffffa86993f9" @@ -1095,103 +870,108 @@ "markers": "python_version >= '3.6'", "version": "==0.22.0" }, + "loguru": { + "hashes": [ + "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb", + "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac" + ], + "index": "pypi", + "markers": "python_version >= '3.5'", + "version": "==0.7.2" + }, "lxml": { "hashes": [ - "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3", - "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d", - "sha256:081d32421db5df44c41b7f08a334a090a545c54ba977e47fd7cc2deece78809a", - "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120", - "sha256:0bfd0767c5c1de2551a120673b72e5d4b628737cb05414f03c3277bf9bed3305", - "sha256:0c0850c8b02c298d3c7006b23e98249515ac57430e16a166873fc47a5d549287", - "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23", - "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52", - "sha256:1247694b26342a7bf47c02e513d32225ededd18045264d40758abeb3c838a51f", - "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4", - "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584", - "sha256:1509dd12b773c02acd154582088820893109f6ca27ef7291b003d0e81666109f", - "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693", - "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef", - "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5", - "sha256:23eed6d7b1a3336ad92d8e39d4bfe09073c31bfe502f20ca5116b2a334f8ec02", - "sha256:25f32acefac14ef7bd53e4218fe93b804ef6f6b92ffdb4322bb6d49d94cad2bc", - "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7", - "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da", - "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a", - "sha256:3e9bdd30efde2b9ccfa9cb5768ba04fe71b018a25ea093379c857c9dad262c40", - "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8", - "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd", - "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601", - "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c", - "sha256:48d6ed886b343d11493129e019da91d4039826794a3e3027321c56d9e71505be", - "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2", - "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c", - "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129", - "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc", - "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2", - "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1", - "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7", - "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d", - "sha256:50baa9c1c47efcaef189f31e3d00d697c6d4afda5c3cde0302d063492ff9b477", - "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d", - "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e", - "sha256:56dc1f1ebccc656d1b3ed288f11e27172a01503fc016bcabdcbc0978b19352b7", - "sha256:578695735c5a3f51569810dfebd05dd6f888147a34f0f98d4bb27e92b76e05c2", - "sha256:57aba1bbdf450b726d58b2aea5fe47c7875f5afb2c4a23784ed78f19a0462574", - "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf", - "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b", - "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98", - "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12", - "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42", - "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35", - "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d", - "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce", - "sha256:704f61ba8c1283c71b16135caf697557f5ecf3e74d9e453233e4771d68a1f42d", - "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f", - "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db", - "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4", - "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694", - "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac", - "sha256:8df133a2ea5e74eef5e8fc6f19b9e085f758768a16e9877a60aec455ed2609b2", - "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7", - "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96", - "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d", - "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b", - "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a", - "sha256:9a92d3faef50658dd2c5470af249985782bf754c4e18e15afb67d3ab06233f13", - "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340", - "sha256:9e28c51fa0ce5674be9f560c6761c1b441631901993f76700b1b30ca6c8378d6", - "sha256:aca086dc5f9ef98c512bac8efea4483eb84abbf926eaeedf7b91479feb092458", - "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c", - "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c", - "sha256:b4e4bc18382088514ebde9328da057775055940a1f2e18f6ad2d78aa0f3ec5b9", - "sha256:b6420a005548ad52154c8ceab4a1290ff78d757f9e5cbc68f8c77089acd3c432", - "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991", - "sha256:bb3bb49c7a6ad9d981d734ef7c7193bc349ac338776a0360cc671eaee89bcf69", - "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf", - "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb", - "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b", - "sha256:c41bfca0bd3532d53d16fd34d20806d5c2b1ace22a2f2e4c0008570bf2c58833", - "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76", - "sha256:cdb650fc86227eba20de1a29d4b2c1bfe139dc75a0669270033cb2ea3d391b85", - "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e", - "sha256:d27be7405547d1f958b60837dc4c1007da90b8b23f54ba1f8b728c78fdb19d50", - "sha256:d37017287a7adb6ab77e1c5bee9bcf9660f90ff445042b790402a654d2ad81d8", - "sha256:d3ff32724f98fbbbfa9f49d82852b159e9784d6094983d9a8b7f2ddaebb063d4", - "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b", - "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5", - "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190", - "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7", - "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa", - "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0", - "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9", - "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0", - "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b", - "sha256:fc9b106a1bf918db68619fdcd6d5ad4f972fdd19c01d19bdb6bf63f3589a9ec5", - "sha256:fcdd00edfd0a3001e0181eab3e63bd5c74ad3e67152c84f93f13769a40e073a7", - "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4" + "sha256:016de3b29a262655fc3d2075dc1b2611f84f4c3d97a71d579c883d45e201eee4", + "sha256:0326e9b8176ea77269fb39e7af4010906e73e9496a9f8eaf06d253b1b1231ceb", + "sha256:03290e2f714f2e7431c8430c08b48167f657da7bc689c6248e828ff3c66d5b1b", + "sha256:049fef98d02513c34f5babd07569fc1cf1ed14c0f2fbff18fe72597f977ef3c2", + "sha256:07a900735bad9af7be3085480bf384f68ed5580ba465b39a098e6a882c060d6b", + "sha256:0d277d4717756fe8816f0beeff229cb72f9dd02a43b70e1d3f07c8efadfb9fe1", + "sha256:173bcead3af5d87c7bca9a030675073ddaad8e0a9f0b04be07cd9390453e7226", + "sha256:1ef0793e1e2dd221fce7c142177008725680f7b9e4a184ab108d90d5d3ab69b7", + "sha256:21af2c3862db6f4f486cddf73ec1157b40d5828876c47cd880edcbad8240ea1b", + "sha256:2219cbf790e701acf9a21a31ead75f983e73daf0eceb9da6990212e4d20ebefe", + "sha256:2992591e2294bb07faf7f5f6d5cb60710c046404f4bfce09fb488b85d2a8f58f", + "sha256:3663542aee845129a981889c19b366beab0b1dadcf5ca164696aabfe1aa51667", + "sha256:3e6cbb68bf70081f036bfc018649cf4b46c4e7eaf7860a277cae92dee2a57f69", + "sha256:3f908afd0477cace17f941d1b9cfa10b769fe1464770abe4cfb3d9f35378d0f8", + "sha256:3ffa066db40b0347e48334bd4465de768e295a3525b9a59831228b5f4f93162d", + "sha256:405e3760f83a8ba3bdb6e622ec79595cdc20db916ce37377bbcb95b5711fa4ca", + "sha256:44fa9afd632210f1eeda51cf284ed8dbab0c7ec8b008dd39ba02818e0e114e69", + "sha256:4786b0af7511ea614fd86407a52a7bc161aa5772d311d97df2591ed2351de768", + "sha256:4a45a278518e4308865c1e9dbb2c42ce84fb154efb03adeb16fdae3c1687c7c9", + "sha256:4b9d5b01900a760eb3acf6cef50aead4ef2fa79e7ddb927084244e41dfe37b65", + "sha256:4e69c36c8618707a90ed3fb6f48a6cc9254ffcdbf7b259e439a5ae5fbf9c5206", + "sha256:52a9ab31853d3808e7cf0183b3a5f7e8ffd622ea4aee1deb5252dbeaefd5b40d", + "sha256:52c0acc2f29b0a204efc11a5ed911a74f50a25eb7d7d5069c2b1fd3b3346ce11", + "sha256:5382612ba2424cea5d2c89e2c29077023d8de88f8d60d5ceff5f76334516df9e", + "sha256:581a78f299a9f5448b2c3aea904bfcd17c59bf83016d221d7f93f83633bb2ab2", + "sha256:583c0e15ae06adc81035346ae2abb2e748f0b5197e7740d8af31222db41bbf7b", + "sha256:59cea9ba1c675fbd6867ca1078fc717a113e7f5b7644943b74137b7cc55abebf", + "sha256:5b39f63edbe7e018c2ac1cf0259ee0dd2355274e8a3003d404699b040782e55e", + "sha256:5eff173f0ff408bfa578cbdafd35a7e0ca94d1a9ffe09a8a48e0572d0904d486", + "sha256:5fb988e15378d6e905ca8f60813950a0c56da9469d0e8e5d8fe785b282684ec5", + "sha256:6507c58431dbd95b50654b3313c5ad54f90e54e5f2cdacf733de61eae478eec5", + "sha256:6a2de85deabf939b0af89e2e1ea46bfb1239545e2da6f8ac96522755a388025f", + "sha256:6a5501438dd521bb7e0dde5008c40c7bfcfaafaf86eccb3f9bd27509abb793da", + "sha256:6bba06d8982be0f0f6432d289a8d104417a0ab9ed04114446c4ceb6d4a40c65d", + "sha256:70ab4e02f7aa5fb4131c8b222a111ce7676f3767e36084fba3a4e7338dc82dcd", + "sha256:7188495c1bf71bfda87d78ed50601e72d252119ce11710d6e71ff36e35fea5a0", + "sha256:71a7cee869578bc17b18050532bb2f0bc682a7b97dda77041741a1bd2febe6c7", + "sha256:73bfab795d354aaf2f4eb7a5b0db513031734fd371047342d5803834ce19ec18", + "sha256:766868f729f3ab84125350f1a0ea2594d8b1628a608a574542a5aff7355b9941", + "sha256:77b73952534967a4497d9e4f26fbeebfba19950cbc66b7cc3a706214429d8106", + "sha256:78d6d8e5b54ed89dc0f0901eaaa579c384ad8d59fa43cc7fb06e9bb89115f8f4", + "sha256:793be9b4945c2dfd69828fb5948d7d9569b78e0599e4a2e88d92affeb0ff3aa3", + "sha256:7ba26a7dc929a1b3487d51bbcb0099afed2fc06e891b82845c8f37a2d7d7fbbd", + "sha256:7df433d08d4587dc3932f7fcfc3194519a6824824104854e76441fd3bc000d29", + "sha256:80209b31dd3908bc5b014f540fd192c97ea52ab179713a730456c5baf7ce80c1", + "sha256:8134d5441d1ed6a682e3de3d7a98717a328dce619ee9c4c8b3b91f0cb0eb3e28", + "sha256:81509dffd8aba3bdb43e90cbd218c9c068a1f4047d97bc9546b3ac9e3a4ae81d", + "sha256:88f559f8beb6b90e41a7faae4aca4c8173a4819874a9bf8e74c8d7c1d51f3162", + "sha256:894c5f71186b410679aaab5774543fcb9cbabe8893f0b31d11cf28a0740e80be", + "sha256:8cc0a951e5616ac626f7036309c41fb9774adcd4aa7db0886463da1ce5b65edb", + "sha256:8ce8b468ab50f9e944719d1134709ec11fe0d2840891a6cae369e22141b1094c", + "sha256:904d36165848b59c4e04ae5b969072e602bd987485076fca8ec42c6cd7a7aedc", + "sha256:96095bfc0c02072fc89afa67626013a253596ea5118b8a7f4daaae049dafa096", + "sha256:980ba47c8db4b9d870014c7040edb230825b79017a6a27aa54cdb6fcc02d8cc0", + "sha256:992029258ed719f130d5a9c443d142c32843046f1263f2c492862b2a853be570", + "sha256:99cad5c912f359e59e921689c04e54662cdd80835d80eeaa931e22612f515df7", + "sha256:9b59c429e1a2246da86ae237ffc3565efcdc71c281cd38ca8b44d5fb6a3b993a", + "sha256:9ca498f8554a09fbc3a2f8fc4b23261e07bc27bef99b3df98e2570688033f6fc", + "sha256:9cd3d6c2c67d4fdcd795e4945e2ba5434909c96640b4cc09453bd0dc7e8e1bac", + "sha256:a85136d0ee18a41c91cc3e2844c683be0e72e6dda4cb58da9e15fcaef3726af7", + "sha256:ac21aace6712472e77ea9dfc38329f53830c4259ece54c786107105ebb069053", + "sha256:aebd8fd378e074b22e79cad329dcccd243c40ff1cafaa512d19276c5bb9554e1", + "sha256:affdd833f82334fdb10fc9a1c7b35cdb5a86d0b672b4e14dd542e1fe7bcea894", + "sha256:b6d4e148edee59c2ad38af15810dbcb8b5d7b13e5de3509d8cf3edfe74c0adca", + "sha256:bb58e8f4b2cfe012cd312239b8d5139995fe8f5945c7c26d5fbbbb1ddb9acd47", + "sha256:bfdc4668ac56687a89ca3eca44231144a2e9d02ba3b877558db74ba20e2bd9fa", + "sha256:c1249aa4eaced30b59ecf8b8cae0b1ccede04583c74ca7d10b6f8bbead908b2c", + "sha256:c7cfb6af73602c8d288581df8a225989d7e9d5aab0a174be0e19fcfa800b6797", + "sha256:c7fe19abb3d3c55a9e65d289b12ad73b3a31a3f0bda3c539a890329ae9973bd6", + "sha256:c8954da15403db1acfc0544b3c3f963a6ef4e428283ab6555e3e298bbbff1cf6", + "sha256:c90c593aa8dd57d5dab0ef6d7d64af894008971d98e6a41b320fdd75258fbc6e", + "sha256:cb564bbe55ff0897d9cf1225041a44576d7ae87f06fd60163544c91de2623d3f", + "sha256:cfa8a4cdc3765574b7fd0c7cfa5fbd1e2108014c9dfd299c679e5152bea9a55e", + "sha256:d1bb64646480c36a4aa1b6a44a5b6e33d0fcbeab9f53f1b39072cd3bb2c6243a", + "sha256:dac2733fe4e159b0aae0439db6813b7b1d23ff96d0b34c0107b87faf79208c4e", + "sha256:db40e85cffd22f7d65dcce30e85af565a66401a6ed22fc0c56ed342cfa4ffc43", + "sha256:dd39ef87fd1f7bb5c4aa53454936e6135cbfe03fe3744e8218be193f9e4fef16", + "sha256:de1a8b54170024cf1c0c2718c82412bca42cd82e390556e3d8031af9541b416f", + "sha256:e675a4b95208e74c34ac0751cc4bab9170e7728b61601fb0f4746892c2bb7e0b", + "sha256:e6bb39d91bf932e7520cb5718ae3c2f498052aca53294d5d59fdd9068fe1a7f2", + "sha256:e8c63f5c7d87e7044880b01851ac4e863c3349e6f6b6ab456fe218d9346e816d", + "sha256:ea56825c1e23c9c8ea385a191dac75f9160477057285b88c88736d9305e6118f", + "sha256:ee60f33456ff34b2dd1d048a740a2572798356208e4c494301c931de3a0ab3a2", + "sha256:f15844a1b93dcaa09c2b22e22a73384f3ae4502347c3881cfdd674e14ac04e21", + "sha256:f298ac9149037d6a3d5c74991bded39ac46292520b9c7c182cb102486cc87677", + "sha256:f30e697b6215e759d0824768b2c5b0618d2dc19abe6c67eeed2b0460f52470d1", + "sha256:f92d73faa0b1a76d1932429d684b7ce95829e93c3eef3715ec9b98ab192c9d31", + "sha256:fef10f27d6318d2d7c88680e113511ddecf09ee4f9559b3623b73ee89fa8f6cc" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==4.9.3" + "version": "==5.0.0" }, "m2r": { "hashes": [ @@ -1266,39 +1046,14 @@ "markers": "python_version >= '3.7'", "version": "==2.1.3" }, - "matplotlib": { - "hashes": [ - "sha256:044df81c1f6f3a8e52d70c4cfcb44e77ea9632a10929932870dfaa90de94365d", - "sha256:0d24c47a1bb47e392fbcd26fe322e4ff3431653ac1e8718e4e147d450ae97a44", - "sha256:1fcb49b6baf0375281979cbf26695ec10bd1cada1e311893e89533b3b70143e7", - "sha256:20a0fdfd3ee836179047f3782be060057b878ad37f5abe29edf006a1ff3ecd73", - "sha256:27502d2452208ae784c19504644f09f83742809143bbeae147617640930aa344", - "sha256:2afe7d2f8c9e35e94fbcfcfd9b28f29cb32f0a9068cba469cf907428379c8db9", - "sha256:43a9d40feb63c9e31a0b8b069dcbd74a912f59bdc0095d187126694cd26977e4", - "sha256:43cf368a4a1d8cbc426944806e5e183cead746647a64d2cdb786441546235967", - "sha256:608ea2951838d391e45dec2e644888db6899c752d3c29e157af9dcefb3d7d8d5", - "sha256:7658b7073c1d6a2922ecc0ed41602410fae88586cb8a54f7a2063d537b6beaf7", - "sha256:7f99d07c0e753717775be7be39ab383453b4d8b629c9fa174596b970c6555890", - "sha256:82ec95b02e894561c21e066bd0c716e4b410df141ce9441aa5af6cd937e4ade2", - "sha256:afb72822ae410d62aa1a2920c6563cb5680de9078358f0e9474396c6c3e06be2", - "sha256:bf6889643d4560fcc56f9f0941f078e4df0d72a6c3e4ca548841fc13c5642664", - "sha256:c1b0ecaa0d1f4fe1e30f625a2347f0034a89a7d17c39efbb502e554d92ee2f61", - "sha256:c54c55457c7f5ea4dfdba0020004fc7667f5c10c8d9b8010d735345acc06c9b8", - "sha256:ca84deaa38cb64b7dd160ca2046b45f7b5dbff2b0179642e1339fadc337446c9", - "sha256:cd54bbf089953140905768ed4626d7223e1ad1d7e2a138410a9c4d3b865ccd80", - "sha256:d921c0270647ab11c3ef283efaaa3d46fd005ba233bfb3aea75231cdf3656de8", - "sha256:e11ab864323fa73ac1b7849688d9671c47a2665242e899785b4db1a375b547e1", - "sha256:e17674ee127f78f26fea237e7f4d5cf910a8be82beb6260fedf358b88075b823", - "sha256:e3ad1759ad4a5245172c6d32b8ada603a6020d03211524c39d78d25c9a7dc0d2", - "sha256:e3bb809b743653b5aab5d72ee45c8c937c28e147b0846b0826a54bece898608c", - "sha256:e5a504ff40f81d6233603475a45497a6dca37a873393fa20ae6f7dd6596ef72b", - "sha256:ed3b29f54f6bbf3eaca4cbd23bc260155153ace63b7f597c474fa6fc6f386530", - "sha256:f34b46dbb1db1f09bfa937cd5853e5f2af232caeeff509c3ab6e43fd33780eae", - "sha256:f55fb5ff02d999a100be28bf6ffe826e1867a54c7b465409685332c9dd48ffa5", - "sha256:ff842e27bc6a80de08c40e0bfdce460bd08080e8a94af131162b6a1b8948f2cc" + "mashumaro": { + "hashes": [ + "sha256:8f858bdb33790db6d9f3087dce793a26d109aeae38bed3ca9c2d7f16f19db412", + "sha256:b0b2443be4bdad29bb209d91fe4a2a918fbd7b63cccfeb457c7eeb567db02f5e" ], - "markers": "python_version >= '3.9'", - "version": "==3.8.1" + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==3.11" }, "mccabe": { "hashes": [ @@ -1317,48 +1072,18 @@ }, "mpire": { "hashes": [ - "sha256:bbc07d642fdfdfde11e3edb3e1217236c944fb84b43dd90134182e5c9f13a9ad", - "sha256:da3d4fc84710762e490870289dd91b6487d0e21dbea9dcc3178e00948d71d9db" - ], - "version": "==2.8.0" - }, - "numpy": { - "hashes": [ - "sha256:06934e1a22c54636a059215d6da99e23286424f316fddd979f5071093b648668", - "sha256:1c59c046c31a43310ad0199d6299e59f57a289e22f0f36951ced1c9eac3665b9", - "sha256:1d1bd82d539607951cac963388534da3b7ea0e18b149a53cf883d8f699178c0f", - "sha256:1e11668d6f756ca5ef534b5be8653d16c5352cbb210a5c2a79ff288e937010d5", - "sha256:3649d566e2fc067597125428db15d60eb42a4e0897fc48d28cb75dc2e0454e53", - "sha256:59227c981d43425ca5e5c01094d59eb14e8772ce6975d4b2fc1e106a833d5ae2", - "sha256:6081aed64714a18c72b168a9276095ef9155dd7888b9e74b5987808f0dd0a974", - "sha256:6965888d65d2848e8768824ca8288db0a81263c1efccec881cb35a0d805fcd2f", - "sha256:76ff661a867d9272cd2a99eed002470f46dbe0943a5ffd140f49be84f68ffc42", - "sha256:78ca54b2f9daffa5f323f34cdf21e1d9779a54073f0018a3094ab907938331a2", - "sha256:82e871307a6331b5f09efda3c22e03c095d957f04bf6bc1804f30048d0e5e7af", - "sha256:8ab9163ca8aeb7fd32fe93866490654d2f7dda4e61bc6297bf72ce07fdc02f67", - "sha256:9696aa2e35cc41e398a6d42d147cf326f8f9d81befcb399bc1ed7ffea339b64e", - "sha256:97e5d6a9f0702c2863aaabf19f0d1b6c2628fbe476438ce0b5ce06e83085064c", - "sha256:9f42284ebf91bdf32fafac29d29d4c07e5e9d1af862ea73686581773ef9e73a7", - "sha256:a03fb25610ef560a6201ff06df4f8105292ba56e7cdd196ea350d123fc32e24e", - "sha256:a5b411040beead47a228bde3b2241100454a6abde9df139ed087bd73fc0a4908", - "sha256:af22f3d8e228d84d1c0c44c1fbdeb80f97a15a0abe4f080960393a00db733b66", - "sha256:afd5ced4e5a96dac6725daeb5242a35494243f2239244fad10a90ce58b071d24", - "sha256:b9d45d1dbb9de84894cc50efece5b09939752a2d75aab3a8b0cef6f3a35ecd6b", - "sha256:bb894accfd16b867d8643fc2ba6c8617c78ba2828051e9a69511644ce86ce83e", - "sha256:c8c6c72d4a9f831f328efb1312642a1cafafaa88981d9ab76368d50d07d93cbe", - "sha256:cd7837b2b734ca72959a1caf3309457a318c934abef7a43a14bb984e574bbb9a", - "sha256:cdd9ec98f0063d93baeb01aad472a1a0840dee302842a2746a7a8e92968f9575", - "sha256:d1cfc92db6af1fd37a7bb58e55c8383b4aa1ba23d012bdbba26b4bcca45ac297", - "sha256:d1d2c6b7dd618c41e202c59c1413ef9b2c8e8a15f5039e344af64195459e3104", - "sha256:d2984cb6caaf05294b8466966627e80bf6c7afd273279077679cb010acb0e5ab", - "sha256:d58e8c51a7cf43090d124d5073bc29ab2755822181fcad978b12e144e5e5a4b3", - "sha256:d78f269e0c4fd365fc2992c00353e4530d274ba68f15e968d8bc3c69ce5f5244", - "sha256:dcfaf015b79d1f9f9c9fd0731a907407dc3e45769262d657d754c3a028586124", - "sha256:e44ccb93f30c75dfc0c3aa3ce38f33486a75ec9abadabd4e59f114994a9c4617", - "sha256:e509cbc488c735b43b5ffea175235cec24bbc57b227ef1acc691725beb230d1c" - ], - "markers": "python_version < '3.13' and python_version >= '3.9'", - "version": "==1.26.1" + "sha256:47a82a7057453acb0939d45e5ba585b8fdb6efdaf41730e3b6fc4751506c3482", + "sha256:81ae6141a1e9ec38107c0ecfab50a8f3ba42b0041ed86dde6e0af447a063b8d5" + ], + "version": "==2.8.1" + }, + "mypy-extensions": { + "hashes": [ + "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", + "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" + ], + "markers": "python_version >= '3.5'", + "version": "==1.0.0" }, "packaging": { "hashes": [ @@ -1368,81 +1093,30 @@ "markers": "python_version >= '3.7'", "version": "==23.2" }, - "pillow": { - "hashes": [ - "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d", - "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de", - "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616", - "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839", - "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099", - "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a", - "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219", - "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106", - "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b", - "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412", - "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b", - "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7", - "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2", - "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7", - "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14", - "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f", - "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27", - "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57", - "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262", - "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28", - "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610", - "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172", - "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273", - "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e", - "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d", - "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818", - "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f", - "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9", - "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01", - "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7", - "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651", - "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312", - "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80", - "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666", - "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061", - "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b", - "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992", - "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593", - "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4", - "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db", - "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba", - "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd", - "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e", - "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212", - "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb", - "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2", - "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34", - "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256", - "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f", - "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2", - "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38", - "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996", - "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a", - "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793" + "pathspec": { + "hashes": [ + "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", + "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" ], "markers": "python_version >= '3.8'", - "version": "==10.1.0" + "version": "==0.12.1" }, "pipenv": { "hashes": [ - "sha256:82ca27a60511c5cedbe1c5938b9f1bc4d786394e37c2b5a67edd1623fa4c090f", - "sha256:a28a93ef66e5ce204cc33cab6df30cca80ceda1f0074f25cc251ee46da85ab39" + "sha256:6eb537da5a27671f71dc596ea96a5b341aae9a1695413beeb95364467409bb3d", + "sha256:f587ffff47e8aa76f17803d571f64cf5a24b2bdfb9334435e6528b22ad5e304f" ], "index": "pypi", - "version": "==2023.10.24" + "markers": "python_version >= '3.8'", + "version": "==2023.11.15" }, "platformdirs": { "hashes": [ - "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3", - "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e" + "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380", + "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420" ], - "markers": "python_version >= '3.7'", - "version": "==3.11.0" + "markers": "python_version >= '3.8'", + "version": "==4.1.0" }, "pluggy": { "hashes": [ @@ -1470,129 +1144,129 @@ }, "pygments": { "hashes": [ - "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692", - "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29" + "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", + "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367" ], "markers": "python_version >= '3.7'", - "version": "==2.16.1" + "version": "==2.17.2" }, "pyjson5": { "hashes": [ - "sha256:003040f5bf600bbe498cebe6c0630675d4333ce9911cadf3631b9421219e9cc3", - "sha256:00da46d7ddff6299660a0dc8d7fda00150feb42d5ba1ace082542637f171888d", - "sha256:028758f37c907698e35ab410b1a1620e97a3de967e131c34a6a216bcc9721471", - "sha256:04554b8e8b94b6c2f888ef22eafea98c0e861b3737594e1de241e8102e7bf1ba", - "sha256:04baf868b24daa92f4d13b5c6ce43c93702befac992b77eacf38e934e8ae414e", - "sha256:04ff31f28a9285f017658b9641b91a1684cc787f8f4a89c322000c3c6fefa663", - "sha256:05260db8a211d5221e399e6a4d848d23efcc751a8cf0456faa5436df1a775f35", - "sha256:055d81b42ebcc05c80fee3c3e8e6e2fc79441b1a2682dcb71065b4c806da11e8", - "sha256:0b10a796416ea6c3bc6db7bfd108abc0e34149d2ce5e68f15effaa401929f5c0", - "sha256:0b9a9e4af14299f829a758e7be0d4d483104d6e47378dd31f7d2c46caf401977", - "sha256:0d6cf4ec3bb66f1800d6714dae45eb0ea85212cd7311fda3090dbf3135eeef09", - "sha256:0e3dd6358f395a8337e2d0b03f9359493bf9fda21f1cd9d10cfa80b9bc74a85a", - "sha256:0f710b2f33d3867fcdf8d5fdfc8ec09c799eb066f1e60bdb32fc8ee46a0a643b", - "sha256:14f7069b01212fed4031caba3a77a1f6c59386562bd37ed2a779c1d95b14adb0", - "sha256:15263d53eefb1ca20eaf9c60d588d76e638af99ae63bdec1db10d390e111b77d", - "sha256:167550e2679c876485d25de04971be5c21f4a23d868504920a6a1a36b86d02fc", - "sha256:16b6783139a64571b4b62afa5ff0caac563fe41fb95da0add1e01edfcd99fa98", - "sha256:173629b88f76affbd748fa284072fc77e3d1943473f032bfca14475ed6eec0a9", - "sha256:18b116ffedf7458e418106383508c68abd0c0f24e319651006d60e39c79b1e8d", - "sha256:1a68726ed4af1e1e9f97420232f03d3fe73f1df0187bce18133d8eb5d8bb600b", - "sha256:1b3645b3bfacc53b69f786855b184185dbd347df209fc9ba9a9974f45a973b9b", - "sha256:1d436b4d9e99bf5b04b916c850a4ad4c46e38c6ffe115d21332869e3b9f5acff", - "sha256:1e1dbbe16cfc7d4d3b93243763129e46486d6a341a842dcc68dc459eff1efef8", - "sha256:23e66c568be56964a33fae39cf945977c679dec85b58c934780d87d80b189e26", - "sha256:25d266f96c954af0a00d766c7d96c576086dfa53b74d3f71a9f287781d4e8b20", - "sha256:2906523d57e0921e53ede805bc0bbac905e82862ceb0372d5e9739096debcc2a", - "sha256:2a52eeacc8ab78c86cc79f0f6e74614e8fd4d5e751a1d63c41e2a93385706212", - "sha256:30c037abda717592e2b5de6cb2e067e3dba254c46e7baaec948d539b821e7718", - "sha256:324c81af84169c3c23cc4b3bb2b6d75f6c61b22abc9a4327697545469836e230", - "sha256:35564845611192fbd11646e85317298cf3e21770178c2223c002675223dc4431", - "sha256:35d8953a301df3089155989a6be68e6fc426e3aad88d6d9e4d97a1da8d00729e", - "sha256:363e6e11de0248e68d498b73ce7ad3b62b78e72ef30a8341aa3f8a192f64f3bd", - "sha256:372c6b05259ef1ed039dbc99a854ac24a43f8d1ea0ce8e344a04d9173ba1116d", - "sha256:377808c728c93a5733f5efc426d82e42a2067ac2d6435b284616f75f5c096ff4", - "sha256:41d044f46b80a7645bcf6486fd7509878a47f21328cef477a87fe0d0b8e27163", - "sha256:4224c8aa03655309bc4e37f240c03049324e3ca9cf500a27624d1aa10aa2a403", - "sha256:439b7dcddfe4702a8521d74d9c78db3146e6904234a088532ddc5db91710bfb5", - "sha256:44dc43f8223e2ff58fdc51e1f4794615e447a08d742203fe93be065e2daeb5fb", - "sha256:46a31a13e5f2eb9c4fabd5cee9384c76eabfa6e773c895872ee25227c4803589", - "sha256:46b2489ef39adeff8bf6c2d34b17fc2644eedd2a858f1dc2a7ec71d226f0a23c", - "sha256:475835e36c79e2b898afc2ec44d13916856213d01ca4c2f47ebce9f7b347e19c", - "sha256:4872da0daa57cec5429b7495d84c252198eec3d54370cfea6fe00bec1570ebf6", - "sha256:4c2e466f9b86de06ce123061e228b8b152d012a85a06e076274f31e6765c9973", - "sha256:4fa740cd672133dc8f32003bd6d8dbc57cbaf60f3dd3cfb30f92c9a65640e93c", - "sha256:5614cf5b91bc62adc98f6494557ea53bd62800796a946c97b89e307da7b9ccfa", - "sha256:5910060a25b0d16fb69acf6666dac7f9af8ccce194281472283866f5ae069964", - "sha256:638db2e1e63d28448fef41478c6cc1702f62b0dcb90f49743a7c0214143ab8be", - "sha256:6830a9f026162961dd1dbfd3994441cbfda3e80c72060acdf320142126de40df", - "sha256:6a6c7104203ea2b7d81f8b1e59293896e55b07cae54787cb72b8335746b32cb1", - "sha256:6e4d30287dd86c592a40f3411f5a0ef283f40b959eb9f1ccf4f924303db0f51b", - "sha256:6f54254f9e34c6693a7c885c3a246dbca307ffc1a3d50335fdf37ce4d2242a13", - "sha256:7029332222ca9462f8eac296034e49ebac4dd630a28256365db3384565aa89ad", - "sha256:704f24630414bb996963e5e8863b6518a11184f6f578f63a00a86eb149fc9826", - "sha256:706729996fd3af13e369d32defec07da74d7c5840d5144ba5315656564de0392", - "sha256:71a2723e3b70fdc14d2b514caf7ad5df3a4b1ed63386de53aecd06998bbb5d81", - "sha256:71f800376e530898c8bd04490f965950ece81b5f038c427d208a9ab64ebff815", - "sha256:72b973258efea4e5c5b028cd3e90f1baba44ec8e28ec5134fc90e260f09f6be2", - "sha256:79174109960905f0dea7f1e65a85fc8721fefcfdcffdffaba82406dc9e440a30", - "sha256:7f2633a6e8bc69271baea6563f16b18e542d4ee9c3b9f66201d0a4ca38686eb3", - "sha256:80dca57131f697a5f5031e9bc9d6aea583421d3625f584e7b73a294724aa98d1", - "sha256:81f8d30fce7fa7742296b97330e288a7df6cb82073af4b69991911417def58f4", - "sha256:83dd3177fb8dc0362745039975fa5f33dbbe7258a52897ed8281182453a1dc67", - "sha256:8a92f8d891994f9096e058604f1d969eb5a9cd20db7b70d134e0388015a13214", - "sha256:8d2f105e894aaa1046406790d72393bae5d6cb15e5ee70e94dedb52b612e084c", - "sha256:8d6f77016719714dce69a1023198bcce3640c8df0b7f66e42efde064850bcc12", - "sha256:904cf3511c742d1922a9a67db40876dd201a45e253cb5a45b96fc50f8b959e6e", - "sha256:9184257db7ab8af1cfd8422f802f0833d59ba849efc373a144fb35a921d7bf20", - "sha256:921cc2f99af1595216ca1c078f6279792eb1b28783a0acc57213b5078d29c5b9", - "sha256:930771fdf650246e9656fc5d0806b70ec3a9b4660a8a125bc42a8d24a5954343", - "sha256:944884e7fd23a7afe6a07236906e072692a4636074bce144df540891649a468d", - "sha256:95954d332093cb66bb4f663da31607770228e3c9a3d3d55d0d8aa9772266f8b2", - "sha256:973dfe75dac6cab3601674e6ce793e36dc12139e64b86d6cf255677b42d340d2", - "sha256:99a71c350a1e857e41b2a81b686559a395065b90d54993ae160372ed85d7cacb", - "sha256:9f397308dffbb6bf9b0fb928453d6d37416851b6413e25dce94752c3a7d32c70", - "sha256:a5be0df20ce0a08ec6f78823f7aeb4be778a3ae4cdf3bcb1b6d3f3627039c5e1", - "sha256:a89bdc6d13f8286f4d150857b6fb3e232670dadfd44f6a1f8464c18dc2d8dea5", - "sha256:a9c1e457ee9949ab4da6e45635c9764692123d4c6439bd67f8437a7c3398bb1b", - "sha256:aa1bf4eae0d1bbb60db07457b75b29e2b51c8c2180538a995ea1513d01028061", - "sha256:b31a2d394a20de747eb4cd04ab73648391e7db0f6067e9a35fff03f94608b7e2", - "sha256:b62ec9860147a0e8e0568a94e9bb34b14a9786ad2cb7927c83a9e58dbdcc715f", - "sha256:b70b359439958a5340141a303b46431b8c683c3e6404035785a9dcd19a6ca966", - "sha256:b7b3ef86d0304521c3191e20761c9e0d958f556d9bc7489d82aad0e2362dda1e", - "sha256:b80b289b92009c5144e52db16dfc46133c95add282058d55d52c06e7e85514d1", - "sha256:b8465c48ac3933ac0c15e21d12089298d27462a3c26f8f00e848f8e566c20b66", - "sha256:b94aabef2aeed8fe1c7655bd8992963cc47dd106e16146a8eb2b638a1c46da5b", - "sha256:b991e8eb8a543b522d72c7ece22c00b2fc1d00e32ff1243dfb163ff7a2a22af9", - "sha256:b9ce4b44a0bacc456f1c804821468a39845bdfcd338d9f9864494c02a890e4f5", - "sha256:ba82aa9405f1f24805eb0073a7b10016ce2f192cd667e4cb58fc4802477392c6", - "sha256:bc84d98e4cb64c2f9c64b45eb2ffde404f916d0a360674e1b77803edfe2f457d", - "sha256:c10f91e9c0c88fd5da13f54afbb526a0315627210746a4aa21a7b88056dc24c0", - "sha256:c2af56df51001e1aebafdd8d8d4680c8922d8d516acb46bd6b35da87fec4cce5", - "sha256:c8a9768dcdc77097d7d2742e1bcffd982d01b2d72a73807d7b4d21ae606237f1", - "sha256:c952e7a62935f9c117303ffed90691377e3383faf4a953ce853bdca37aad7e28", - "sha256:ca746c9d52b4aacef35da775e59abdeeb9d536d20a8a90929502740833d5ab1a", - "sha256:caf147a350b0a3d9102e98104b18c88d26b38aa9b942f42faea851d45e5194d3", - "sha256:d284c09fe2bd07ca974e64e947c9ee926b31ae9ec500994a12add42c89733279", - "sha256:d28e8243de16e8894d8bf26ae11938481224ecf22cccab0ef8227f74843eb916", - "sha256:d323c3222242e5c22bce33666777507acfef156e68736289444f44f9713d8fee", - "sha256:d32ca3ec90121371f73c52658e472c41458feaf1860781ef73c73d3acbda7dba", - "sha256:d9a2bd16a3246c2704f2f20a97495a991685bbd387e3960cad700cdc7c7f9f26", - "sha256:de71315a82e772e71b4c265c7fb43993fdefb4cb9b788aa760beb81ff0113deb", - "sha256:e2dd209d77e3bb5c5b0dca4fdb0aa73034d75549a7c9f780cfb812133ba94a34", - "sha256:e35718c621022b9d8b9f69637b5c9712c173d315ee13c411a2b6908cfb709e85", - "sha256:e56a0804b72976f017b7379d0fbcc5c139d82f99f8f511f85a35f1192f742489", - "sha256:e7f3c4be2baf0f0254f04f0850bad344df060202d350a014223f3bdfd4af72f9", - "sha256:e9edd7a0cb24bdf8d9ff3437f2c5b1efd70741bc4141d0770c6e035c3ec6d01d", - "sha256:ebc2bcf18740520f26dfe2494df927e482fc0e00676f93d32a730589aaf6965f", - "sha256:ec5022651945b32a679f1cf9825c7b552d26ec8461041210ec7572f8bfc9f2ca", - "sha256:ed0073c925dc02cbda1ea1f2bf4f502440fcb51c105803c6d0318e33553ba2e3", - "sha256:ee8ef9428d180fceb4dd90b0caeb5a3ddca01a7f5ca17f3984a38ac6c50cd4ca", - "sha256:f5433346568e05de0c3a5d377f85143bcf7b1bd1cb6c6fb5302e12ceb24bc3af", - "sha256:fce987ed3eaa33efe4a9ae5b5d1e8f70c3a9385cb85bd50ed92b585a7bea8e43" + "sha256:02ab4e3212692abd14b24cab7802c00689849253a63052f534fff3b1652f0004", + "sha256:06ce5ff671684762ad1d653ef194d65a25c5acb63c5819246c57302b5cad920a", + "sha256:09464db395fd42c7c437d69c2d8c38e117706326b754035c0395c2afa0ad5d20", + "sha256:0b9da1c81f37c163fa85d0ee8359e0ceaf82f4e11b2ac2446335605b97be8a7b", + "sha256:13d72d691e1470ae234929142640e5b5564b0e17323c617be1f5c53dc4dc863e", + "sha256:14cdd2a3ba6bd8fae6addbc5d519bf468f4a612eb0561bbe1494c8561a6c8002", + "sha256:19d2ae8deb9c618682ff8ea9635b7395315ee3e4cafe75ad4b486d1d39c20fba", + "sha256:1ccac5f139ca8137a72861b6f99a1c8733e35d1e97a8c4bfe2fcae607ae7d76e", + "sha256:1f042aaa6dd73eaac21965ad1bfeb37d7305b2dca1b0763a72fc9a922f24e4b7", + "sha256:1f76c4147ac6b2803b1d573f50abae73810c678ea6e38bb7629d4860274f34b9", + "sha256:20dc400dd92e79c5266ac1a3f1c649049491fb1ac293b168827e5858e4e24973", + "sha256:216e02be78e61883953a7abb2e93c2fb56c5031cbfddbf758ab9a64a02566367", + "sha256:21b8bc08e0de20e37c0a6d9064721600f5cdea01b997829635e38408869d5340", + "sha256:239322dc098dee771ec6c13aa64dd6d8785619790a160af6fbcfa6f907ea4580", + "sha256:23f15dc206e30c3d9be131daa9027d6c62507937db9765245453700a44e3a7dd", + "sha256:253b580bbd6876bd426f1dedc25d89726998bdc97dcc5b188f67a767280c5dff", + "sha256:2baf8fde91a06504ed47268b80906013b56d06f2ce7447567c8f2117ab7918df", + "sha256:2c34fecb6a4a9be26795e90ff7663e973c2f64540c6e48759ea23e7d0bd44715", + "sha256:2caa14c8e115654fdec7bd8510537ef2641e783becea2c3bf6e90e4b9f34cda2", + "sha256:353e8ef40e12ddebbf831eb5240266844ace0636ae16c37c5fd51127994883e8", + "sha256:36a578a7ee518ae2e4f69e8993beead31d1bdc931924a84da49957028b00ecae", + "sha256:36ad48f3eebe386a0bb7892991adabc7801a996106e985242b7f83e2badf6c12", + "sha256:387af9af929fbe5de3f131e57dc2e3c81713a804b6e90a05acfabadbf5ffab80", + "sha256:38f65b682e0717bc3cb4d7540720f69196869e4f6aaff93ad3929c367b29e351", + "sha256:3a6d2557ee3fff345b8d06461eb0f9934eb014abe7354d9937f1f20f9599e9fe", + "sha256:417d05d7e12877b071b4dd5d924efab15eb4f06f8e4bfa421be05dd28a524cce", + "sha256:435d88ad7802c327d7a7d7cff7100fa452d062b88f766bf62ec7d964fadf687e", + "sha256:4575935ea0cf55fb41bfa02f65721d984903887606ad39f30f2ea759534d6ede", + "sha256:45d1ce92ea635209c45509aaa311ee95beccdcb2a108fd6afe57c04b33d0a972", + "sha256:474bca5bde27a858591d34a3b6f26e3a9fb5d021c5a8a39d0555c9290b00e4cf", + "sha256:4d07ab21644d7410c56f468fc3d48cfdb9f3e3d7088bb8259685afd61554f366", + "sha256:4d16d33af39bfd8431bc76e4e3b544088d90418213035ca65f3bcbc77166281f", + "sha256:4f33b88eb3eb06b477d09dd53adff5bb5566d371cbbaaaa91d1ef9aca313d987", + "sha256:5430432667e5282e49a8cb12be19af0bc76438f7483153be57f2d25b9ab091d2", + "sha256:55625e0d67c43fe6f9e8777b7473b9b95c8646832e7b2c6a3c5c56ddd5d1340a", + "sha256:55a75e34b278e0b83484a78d7710e9b4ff91a240756c7ce3495f5e759c7ece86", + "sha256:55a9e38d760ef7e47bd13c8539aea0e4aa74bc30b08d637a08674492d3963999", + "sha256:565f9cedf2e77af956bbc67aa9fcc192d62d5d14cafe7ffc4e421d660fd2f366", + "sha256:57ee96d4567640ad13eafa4cea38d735e56eab14f53cc2bfe650f80c11cdc0f7", + "sha256:5bb4111fbf7795b985cf7d3382188baa7a158db81602c39ba44251d51210349f", + "sha256:614e806004fb0fbd5a2cdf3a00113141ec14ee33381f1a3a1c5d6b6153b76332", + "sha256:626c4be7bc8560ee7e4730c404cd2137d791002c4639544fa71f4fcdb6872bb0", + "sha256:636f0ec09ce925974a82614cf13062401b85ca8897c2efb063d1ba5a8d4fc3e0", + "sha256:6519a5bff8b4f9c9752028affd8a8c917907868c1c33a4550d4d9676362acc28", + "sha256:65b9140378c5e4010d0adf35611d502128e5d6fe6d588835966fd9432aa9456c", + "sha256:68f489fc858501cd2375817009f88e733c06cb100e5c9aa5da1be4a62809de34", + "sha256:6a63712d19bfb583deed22f1284f88b85b26d396512dbd99cff2a0b8fcc9ef23", + "sha256:6a6bf3a38f74f77f63299b1dd7ea7d54bd34467f6c84e24346974c516ab6225d", + "sha256:6d101a3b4982b05178b0e5e14ccecd02ef79f6922f13d6fdbd8fb649ffce5759", + "sha256:6e31fb125383e46e8c85783f3982bc7a7f0c94fb23ec9177d007a3391d02292b", + "sha256:6e6c0d294d0dfe75b29db207eca592a266ce5029ece488cda909c1baed9a9704", + "sha256:708c51fdad8ae25cd6d508b196e8cc3ecb1b9b0e75178cabd213c21cf5c3103c", + "sha256:70d6bf97f6a642bb649ac87c24e25ded7f287fb0b4382d9065e49895992c49fc", + "sha256:764812c463201a2ff307555f04f316bcd623b8a6568acbc34543f9e7bfba19f3", + "sha256:764b5661d7a349ae9b598d9ee05bf9a09a1ffd5d83defbef8eff4934c6a507e7", + "sha256:766d8f486a99eeaf3b9e0f1e318d4f518bf382054922b3275a40b03fb9cf2fb8", + "sha256:768ee4cfedab3df0c02a9fde2ff49308a3713d30a35644324a3ee4a7b63d6192", + "sha256:79b971cde2205f0961fac05c96eec5993a3ce586682b7efafdca93468f2f838d", + "sha256:7d0901610e660619572f60874b487e6319ebf7d72240cd4e3c89a7acb0623e54", + "sha256:7e8f61a69155bfce9ae71d5497a3e01ee964df93b7086f1488193c92b8f6e9b8", + "sha256:815ca341eeba68175a618734c4fd276ca12ecfae6225c0d11a0fba490d66917a", + "sha256:81841cbcc8e4983dc7e74cd179b7302a30fa843b56d10fd51dd8b53f7e77b000", + "sha256:887f22ceecfae487ae58c0b060658e32315806afc7fba736c1d0fe62368db1d4", + "sha256:8995ca0218ee2742b8ec543dabc8e8b92699bbca089cdf34cc5ed62f7821ae99", + "sha256:8bdfe6e9ca9cb7ee98fd7a5f6c0c92d9ba700358f1305f51b44fa2ebd15bfb17", + "sha256:8cd1afaa0742f00e0e95e2cdc34651267d2c97d8150745c8acc86b2cb80f5586", + "sha256:8fcfea4f4faebbceb71877dba476b06a2810f52d8606bdbe32f0100dae84572d", + "sha256:97738b28eee61cde189021302ce45d1b2f968854dd84c20e8dbd2c0d7b50b1f5", + "sha256:99484bdd0c3ab4a0b00c3bb562a3fc7e62e002d37dd5605584363ca606cff7d1", + "sha256:9b09ea0501e273b85f3103e805bbdad7c2e146269362f8827abac3a5cb98e8bc", + "sha256:9beccb0c773127ebdd294a4c7dc05e45fac853d249aacb32e78ef0f6055f02af", + "sha256:a0e40483a88ff421a227e56efcb394934436bbfcc577e9de279a18a7dd21d096", + "sha256:a525baef6c8a9533bbc955087224f85def191c3c5cbd7f2901a5ed69a516a832", + "sha256:a53d0f8236600a1a577ff99e3be687868e96f14e87f170cd1a38972e3596e912", + "sha256:ad19db49ba9a0f3738577049760ce650aeddaeb6916b2e7884d8cc9e6b76234e", + "sha256:adee4d563f68e7aafb138549fdcd4d8276d3d0005d8e8d9f0a0ef46423ac3333", + "sha256:af8b97640e205279704b263c0c77bce23c8e367694c039b94ae2a8417f14ffaf", + "sha256:aff8eab8f394c046534abd345c28ef411e7e78537276246666ab478a0929e5f3", + "sha256:b2fa26f2ec2f5efe0d836ac15c96a7e9753b4091478cab7d54d22202fa96ede3", + "sha256:b792e7e1dca1f1a2f615fe38369dde3c529eab36a7b30fae970ae50ce252c8ff", + "sha256:b9840fc6e82c6923e113b0fb70ae95ae6e05a5aa0b2c21c766f380bf9a629568", + "sha256:bcb7cde1e0f72ea51b75f14d926eed7c860dff1379c32745211fcc6fc9edbef3", + "sha256:c589747ea8c32736a85061615d7c1a9e2668b0d76f21f9e71b6204706e8bd66e", + "sha256:c7caf77839b8748613e9810bf9b28e6611a2d6f7aa91a4a381d0b500317f21f2", + "sha256:cab011e51bfe537cd6b438c4a8779777c64f58959e89df47f58bfdfb929c395c", + "sha256:cc11f6f7f260d6a442ce321f6d315a253953449a8a0dfa8fab60d93aa2b1a05c", + "sha256:cc498c4498c236bbdb86dde1c40d17847bbefbe5db5091a7e0f317e14a584f0c", + "sha256:cdb5c73bc5e263f36e1413b29a6aec7518321bd3f95a24076377488339d84b36", + "sha256:cef4ab7136420e52205c1a2faaf43f1e30a94ecfbad32fcc0ff825f6b1c3e424", + "sha256:cff78f2cc6b77f85d9d4503fc57727c3875b8019fd20ce58d53cd687ff68ced8", + "sha256:d29047b6a96083ed3e0c0f00c1a51a2c223fc21cbf91ffb9e267d6223a7c978a", + "sha256:d3023b06170ffc55d68d287f822a4a8f43bbb889ac62dca8d2aa6cf8b07e9e84", + "sha256:d4fceb028caf3134e26b9680d4b8051203312bf3a0e01e64660f07da02af10ce", + "sha256:d7120d1b3f24293d1e7e5bb5f185a2f971189602d860c182fe92a0707e122246", + "sha256:d7262896703c1c8629e5e64c55be45710f9ea178ddc9d9553e682491d459e140", + "sha256:dae33d5272ef4c6f71890a03f3f3ea608ab73e36483a9aa9d2ce170ea9a2a5f3", + "sha256:daf5a4950b1edb35ee848298885aef398f193aa7cbea1751a52cd1950c9fb38a", + "sha256:dcc0757fcf0776367aebf0f44472da4f965e3c1c0b99e39a3ae164c163a9330b", + "sha256:dd15332515e9d4146c55a97add93aa27c84ad180deaa013f20365b3e239be0a4", + "sha256:ddde5091bd73e94e2b93b62b3c7a3e6141cb29cce7f81e05dc51460e03190b00", + "sha256:e36580975088a979adc35172d32d8c1ef3be66f1e6b4c6a3548aea0b8b6df3f9", + "sha256:e6096344c21136a249ee01084aafe63f8b729771d39f7f78f9c37b1535ea9182", + "sha256:e8809b603b83453b53a54acb7ab866f362bafc34f2e7e1cf91f2c47fcb04f322", + "sha256:e9cf5234beba6516173037a862d66367a3ef68083e5d80e130c7f764068c0aaf", + "sha256:ea50766442771d0e742077b54dcb0f9e6b146fe10bd5fe024aebc3155c916974", + "sha256:eae917198f96b1d481838fba1324d4e9b84826a77c63aca683306a06595045e1", + "sha256:ee675b30375c56cb43218fec7450be0f2403d150d73ffca38c845484495c8955", + "sha256:eeeb41afc09b95688c230aecb288e98388dbb63d16786dba493350e689f84ccd", + "sha256:ef6c07f888779057918660773bae8122e9b107191865a9eedd247373eedb53b2", + "sha256:f55b4908e66425f11b959d65a6269447d5c850dbcdb85febedce5ecac391e41a", + "sha256:fa66fe2b4e66f2ff7e22a3cfcb1c09cb57697adf228e6e44c11500bcf5fd1dae", + "sha256:fd5721d163dea5fc54240495fad9261749087d79565b1b116af021c43d268fb7" ], "markers": "python_version ~= '3.5'", - "version": "==1.6.4" + "version": "==1.6.5" }, "pyparsing": { "hashes": [ @@ -1604,11 +1278,12 @@ }, "pytest": { "hashes": [ - "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac", - "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5" + "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280", + "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8" ], "index": "pypi", - "version": "==7.4.3" + "markers": "python_version >= '3.7'", + "version": "==7.4.4" }, "pytest-cov": { "hashes": [ @@ -1616,15 +1291,17 @@ "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==4.1.0" }, - "python-dateutil": { + "pytest-env": { "hashes": [ - "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", - "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + "sha256:aada77e6d09fcfb04540a6e462c58533c37df35fa853da78707b17ec04d17dfc", + "sha256:fcd7dc23bb71efd3d35632bde1bbe5ee8c8dc4489d6617fb010674880d96216b" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==2.8.2" + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==1.1.3" }, "pywin32": { "hashes": [ @@ -1646,13 +1323,69 @@ "markers": "platform_system == 'Windows' and python_version > '3.6'", "version": "==306" }, + "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: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" + ], + "markers": "python_version >= '3.6'", + "version": "==6.0.1" + }, "referencing": { "hashes": [ - "sha256:449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf", - "sha256:794ad8003c65938edcdbc027f1933215e0d0ccc0291e3ce20a4d87432b59efc0" + "sha256:689e64fe121843dcfd57b71933318ef1f91188ffb45367332700a86ac8fd6161", + "sha256:bdcd3efb936f82ff86f993093f6da7435c7de69a3b3a5a06678a6050184bee99" ], "markers": "python_version >= '3.8'", - "version": "==0.30.2" + "version": "==0.32.0" }, "requests": { "hashes": [ @@ -1671,116 +1404,116 @@ }, "rpds-py": { "hashes": [ - "sha256:023574366002bf1bd751ebaf3e580aef4a468b3d3c216d2f3f7e16fdabd885ed", - "sha256:031f76fc87644a234883b51145e43985aa2d0c19b063e91d44379cd2786144f8", - "sha256:052a832078943d2b2627aea0d19381f607fe331cc0eb5df01991268253af8417", - "sha256:0699ab6b8c98df998c3eacf51a3b25864ca93dab157abe358af46dc95ecd9801", - "sha256:0713631d6e2d6c316c2f7b9320a34f44abb644fc487b77161d1724d883662e31", - "sha256:0774a46b38e70fdde0c6ded8d6d73115a7c39d7839a164cc833f170bbf539116", - "sha256:0898173249141ee99ffcd45e3829abe7bcee47d941af7434ccbf97717df020e5", - "sha256:09586f51a215d17efdb3a5f090d7cbf1633b7f3708f60a044757a5d48a83b393", - "sha256:102eac53bb0bf0f9a275b438e6cf6904904908562a1463a6fc3323cf47d7a532", - "sha256:10f32b53f424fc75ff7b713b2edb286fdbfc94bf16317890260a81c2c00385dc", - "sha256:150eec465dbc9cbca943c8e557a21afdcf9bab8aaabf386c44b794c2f94143d2", - "sha256:1d7360573f1e046cb3b0dceeb8864025aa78d98be4bb69f067ec1c40a9e2d9df", - "sha256:1f36a9d751f86455dc5278517e8b65580eeee37d61606183897f122c9e51cef3", - "sha256:24656dc36f866c33856baa3ab309da0b6a60f37d25d14be916bd3e79d9f3afcf", - "sha256:25860ed5c4e7f5e10c496ea78af46ae8d8468e0be745bd233bab9ca99bfd2647", - "sha256:26857f0f44f0e791f4a266595a7a09d21f6b589580ee0585f330aaccccb836e3", - "sha256:2bb2e4826be25e72013916eecd3d30f66fd076110de09f0e750163b416500721", - "sha256:2f6da6d842195fddc1cd34c3da8a40f6e99e4a113918faa5e60bf132f917c247", - "sha256:30adb75ecd7c2a52f5e76af50644b3e0b5ba036321c390b8e7ec1bb2a16dd43c", - "sha256:3339eca941568ed52d9ad0f1b8eb9fe0958fa245381747cecf2e9a78a5539c42", - "sha256:34ad87a831940521d462ac11f1774edf867c34172010f5390b2f06b85dcc6014", - "sha256:3777cc9dea0e6c464e4b24760664bd8831738cc582c1d8aacf1c3f546bef3f65", - "sha256:3953c6926a63f8ea5514644b7afb42659b505ece4183fdaaa8f61d978754349e", - "sha256:3c4eff26eddac49d52697a98ea01b0246e44ca82ab09354e94aae8823e8bda02", - "sha256:40578a6469e5d1df71b006936ce95804edb5df47b520c69cf5af264d462f2cbb", - "sha256:40f93086eef235623aa14dbddef1b9fb4b22b99454cb39a8d2e04c994fb9868c", - "sha256:4134aa2342f9b2ab6c33d5c172e40f9ef802c61bb9ca30d21782f6e035ed0043", - "sha256:442626328600bde1d09dc3bb00434f5374948838ce75c41a52152615689f9403", - "sha256:4a5ee600477b918ab345209eddafde9f91c0acd931f3776369585a1c55b04c57", - "sha256:4ce5a708d65a8dbf3748d2474b580d606b1b9f91b5c6ab2a316e0b0cf7a4ba50", - "sha256:516a611a2de12fbea70c78271e558f725c660ce38e0006f75139ba337d56b1f6", - "sha256:52c215eb46307c25f9fd2771cac8135d14b11a92ae48d17968eda5aa9aaf5071", - "sha256:53c43e10d398e365da2d4cc0bcaf0854b79b4c50ee9689652cdc72948e86f487", - "sha256:5752b761902cd15073a527b51de76bbae63d938dc7c5c4ad1e7d8df10e765138", - "sha256:5e8a78bd4879bff82daef48c14d5d4057f6856149094848c3ed0ecaf49f5aec2", - "sha256:5ed505ec6305abd2c2c9586a7b04fbd4baf42d4d684a9c12ec6110deefe2a063", - "sha256:5ee97c683eaface61d38ec9a489e353d36444cdebb128a27fe486a291647aff6", - "sha256:61fa268da6e2e1cd350739bb61011121fa550aa2545762e3dc02ea177ee4de35", - "sha256:64ccc28683666672d7c166ed465c09cee36e306c156e787acef3c0c62f90da5a", - "sha256:66414dafe4326bca200e165c2e789976cab2587ec71beb80f59f4796b786a238", - "sha256:68fe9199184c18d997d2e4293b34327c0009a78599ce703e15cd9a0f47349bba", - "sha256:6a555ae3d2e61118a9d3e549737bb4a56ff0cec88a22bd1dfcad5b4e04759175", - "sha256:6bdc11f9623870d75692cc33c59804b5a18d7b8a4b79ef0b00b773a27397d1f6", - "sha256:6cf4393c7b41abbf07c88eb83e8af5013606b1cdb7f6bc96b1b3536b53a574b8", - "sha256:6eef672de005736a6efd565577101277db6057f65640a813de6c2707dc69f396", - "sha256:734c41f9f57cc28658d98270d3436dba65bed0cfc730d115b290e970150c540d", - "sha256:73e0a78a9b843b8c2128028864901f55190401ba38aae685350cf69b98d9f7c9", - "sha256:775049dfa63fb58293990fc59473e659fcafd953bba1d00fc5f0631a8fd61977", - "sha256:7854a207ef77319ec457c1eb79c361b48807d252d94348305db4f4b62f40f7f3", - "sha256:78ca33811e1d95cac8c2e49cb86c0fb71f4d8409d8cbea0cb495b6dbddb30a55", - "sha256:79edd779cfc46b2e15b0830eecd8b4b93f1a96649bcb502453df471a54ce7977", - "sha256:7bf347b495b197992efc81a7408e9a83b931b2f056728529956a4d0858608b80", - "sha256:7fde6d0e00b2fd0dbbb40c0eeec463ef147819f23725eda58105ba9ca48744f4", - "sha256:81de24a1c51cfb32e1fbf018ab0bdbc79c04c035986526f76c33e3f9e0f3356c", - "sha256:879fb24304ead6b62dbe5034e7b644b71def53c70e19363f3c3be2705c17a3b4", - "sha256:8e7f2219cb72474571974d29a191714d822e58be1eb171f229732bc6fdedf0ac", - "sha256:9164ec8010327ab9af931d7ccd12ab8d8b5dc2f4c6a16cbdd9d087861eaaefa1", - "sha256:945eb4b6bb8144909b203a88a35e0a03d22b57aefb06c9b26c6e16d72e5eb0f0", - "sha256:99a57006b4ec39dbfb3ed67e5b27192792ffb0553206a107e4aadb39c5004cd5", - "sha256:9e9184fa6c52a74a5521e3e87badbf9692549c0fcced47443585876fcc47e469", - "sha256:9ff93d3aedef11f9c4540cf347f8bb135dd9323a2fc705633d83210d464c579d", - "sha256:a360cfd0881d36c6dc271992ce1eda65dba5e9368575663de993eeb4523d895f", - "sha256:a5d7ed104d158c0042a6a73799cf0eb576dfd5fc1ace9c47996e52320c37cb7c", - "sha256:ac17044876e64a8ea20ab132080ddc73b895b4abe9976e263b0e30ee5be7b9c2", - "sha256:ad857f42831e5b8d41a32437f88d86ead6c191455a3499c4b6d15e007936d4cf", - "sha256:b2039f8d545f20c4e52713eea51a275e62153ee96c8035a32b2abb772b6fc9e5", - "sha256:b455492cab07107bfe8711e20cd920cc96003e0da3c1f91297235b1603d2aca7", - "sha256:b4a9fe992887ac68256c930a2011255bae0bf5ec837475bc6f7edd7c8dfa254e", - "sha256:b5a53f5998b4bbff1cb2e967e66ab2addc67326a274567697379dd1e326bded7", - "sha256:b788276a3c114e9f51e257f2a6f544c32c02dab4aa7a5816b96444e3f9ffc336", - "sha256:bddd4f91eede9ca5275e70479ed3656e76c8cdaaa1b354e544cbcf94c6fc8ac4", - "sha256:c0503c5b681566e8b722fe8c4c47cce5c7a51f6935d5c7012c4aefe952a35eed", - "sha256:c1b3cd23d905589cb205710b3988fc8f46d4a198cf12862887b09d7aaa6bf9b9", - "sha256:c48f3fbc3e92c7dd6681a258d22f23adc2eb183c8cb1557d2fcc5a024e80b094", - "sha256:c63c3ef43f0b3fb00571cff6c3967cc261c0ebd14a0a134a12e83bdb8f49f21f", - "sha256:c6c45a2d2b68c51fe3d9352733fe048291e483376c94f7723458cfd7b473136b", - "sha256:caa1afc70a02645809c744eefb7d6ee8fef7e2fad170ffdeacca267fd2674f13", - "sha256:cc435d059f926fdc5b05822b1be4ff2a3a040f3ae0a7bbbe672babb468944722", - "sha256:cf693eb4a08eccc1a1b636e4392322582db2a47470d52e824b25eca7a3977b53", - "sha256:cf71343646756a072b85f228d35b1d7407da1669a3de3cf47f8bbafe0c8183a4", - "sha256:d08f63561c8a695afec4975fae445245386d645e3e446e6f260e81663bfd2e38", - "sha256:d29ddefeab1791e3c751e0189d5f4b3dbc0bbe033b06e9c333dca1f99e1d523e", - "sha256:d7f5e15c953ace2e8dde9824bdab4bec50adb91a5663df08d7d994240ae6fa31", - "sha256:d858532212f0650be12b6042ff4378dc2efbb7792a286bee4489eaa7ba010586", - "sha256:d97dd44683802000277bbf142fd9f6b271746b4846d0acaf0cefa6b2eaf2a7ad", - "sha256:dcdc88b6b01015da066da3fb76545e8bb9a6880a5ebf89e0f0b2e3ca557b3ab7", - "sha256:dd609fafdcdde6e67a139898196698af37438b035b25ad63704fd9097d9a3482", - "sha256:defa2c0c68734f4a82028c26bcc85e6b92cced99866af118cd6a89b734ad8e0d", - "sha256:e22260a4741a0e7a206e175232867b48a16e0401ef5bce3c67ca5b9705879066", - "sha256:e225a6a14ecf44499aadea165299092ab0cba918bb9ccd9304eab1138844490b", - "sha256:e3df0bc35e746cce42579826b89579d13fd27c3d5319a6afca9893a9b784ff1b", - "sha256:e6fcc026a3f27c1282c7ed24b7fcac82cdd70a0e84cc848c0841a3ab1e3dea2d", - "sha256:e782379c2028a3611285a795b89b99a52722946d19fc06f002f8b53e3ea26ea9", - "sha256:e8cdd52744f680346ff8c1ecdad5f4d11117e1724d4f4e1874f3a67598821069", - "sha256:e9616f5bd2595f7f4a04b67039d890348ab826e943a9bfdbe4938d0eba606971", - "sha256:e98c4c07ee4c4b3acf787e91b27688409d918212dfd34c872201273fdd5a0e18", - "sha256:ebdab79f42c5961682654b851f3f0fc68e6cc7cd8727c2ac4ffff955154123c1", - "sha256:f0f17f2ce0f3529177a5fff5525204fad7b43dd437d017dd0317f2746773443d", - "sha256:f4e56860a5af16a0fcfa070a0a20c42fbb2012eed1eb5ceeddcc7f8079214281" + "sha256:0474df4ade9a3b4af96c3d36eb81856cb9462e4c6657d4caecfd840d2a13f3c9", + "sha256:071980663c273bf3d388fe5c794c547e6f35ba3335477072c713a3176bf14a60", + "sha256:07aab64e2808c3ebac2a44f67e9dc0543812b715126dfd6fe4264df527556cb6", + "sha256:088396c7c70e59872f67462fcac3ecbded5233385797021976a09ebd55961dfe", + "sha256:162d7cd9cd311c1b0ff1c55a024b8f38bd8aad1876b648821da08adc40e95734", + "sha256:19f00f57fdd38db4bb5ad09f9ead1b535332dbf624200e9029a45f1f35527ebb", + "sha256:1bdbc5fcb04a7309074de6b67fa9bc4b418ab3fc435fec1f2779a0eced688d04", + "sha256:1be2f033df1b8be8c3167ba3c29d5dca425592ee31e35eac52050623afba5772", + "sha256:24f7a2eb3866a9e91f4599851e0c8d39878a470044875c49bd528d2b9b88361c", + "sha256:290a81cfbe4673285cdf140ec5cd1658ffbf63ab359f2b352ebe172e7cfa5bf0", + "sha256:2946b120718eba9af2b4dd103affc1164a87b9e9ebff8c3e4c05d7b7a7e274e2", + "sha256:2bd82db36cd70b3628c0c57d81d2438e8dd4b7b32a6a9f25f24ab0e657cb6c4e", + "sha256:2ddef620e70eaffebed5932ce754d539c0930f676aae6212f8e16cd9743dd365", + "sha256:2e53b9b25cac9065328901713a7e9e3b12e4f57ef4280b370fbbf6fef2052eef", + "sha256:302bd4983bbd47063e452c38be66153760112f6d3635c7eeefc094299fa400a9", + "sha256:349cb40897fd529ca15317c22c0eab67f5ac5178b5bd2c6adc86172045210acc", + "sha256:358dafc89ce3894c7f486c615ba914609f38277ef67f566abc4c854d23b997fa", + "sha256:35953f4f2b3216421af86fd236b7c0c65935936a94ea83ddbd4904ba60757773", + "sha256:35ae5ece284cf36464eb160880018cf6088a9ac5ddc72292a6092b6ef3f4da53", + "sha256:3b811d182ad17ea294f2ec63c0621e7be92a1141e1012383461872cead87468f", + "sha256:3da5a4c56953bdbf6d04447c3410309616c54433146ccdb4a277b9cb499bc10e", + "sha256:3dc6a7620ba7639a3db6213da61312cb4aa9ac0ca6e00dc1cbbdc21c2aa6eb57", + "sha256:3f91df8e6dbb7360e176d1affd5fb0246d2b88d16aa5ebc7db94fd66b68b61da", + "sha256:4022b9dc620e14f30201a8a73898a873c8e910cb642bcd2f3411123bc527f6ac", + "sha256:413b9c17388bbd0d87a329d8e30c1a4c6e44e2bb25457f43725a8e6fe4161e9e", + "sha256:43d4dd5fb16eb3825742bad8339d454054261ab59fed2fbac84e1d84d5aae7ba", + "sha256:44627b6ca7308680a70766454db5249105fa6344853af6762eaad4158a2feebe", + "sha256:44a54e99a2b9693a37ebf245937fd6e9228b4cbd64b9cc961e1f3391ec6c7391", + "sha256:47713dc4fce213f5c74ca8a1f6a59b622fc1b90868deb8e8e4d993e421b4b39d", + "sha256:495a14b72bbe217f2695dcd9b5ab14d4f8066a00f5d209ed94f0aca307f85f6e", + "sha256:4c46ad6356e1561f2a54f08367d1d2e70a0a1bb2db2282d2c1972c1d38eafc3b", + "sha256:4d6a9f052e72d493efd92a77f861e45bab2f6be63e37fa8ecf0c6fd1a58fedb0", + "sha256:509b617ac787cd1149600e731db9274ebbef094503ca25158e6f23edaba1ca8f", + "sha256:5552f328eaef1a75ff129d4d0c437bf44e43f9436d3996e8eab623ea0f5fcf73", + "sha256:5a80e2f83391ad0808b4646732af2a7b67550b98f0cae056cb3b40622a83dbb3", + "sha256:5cf6af100ffb5c195beec11ffaa8cf8523057f123afa2944e6571d54da84cdc9", + "sha256:5e6caa3809e50690bd92fa490f5c38caa86082c8c3315aa438bce43786d5e90d", + "sha256:5ef00873303d678aaf8b0627e111fd434925ca01c657dbb2641410f1cdaef261", + "sha256:69ac7ea9897ec201ce68b48582f3eb34a3f9924488a5432a93f177bf76a82a7e", + "sha256:6a61226465bda9283686db8f17d02569a98e4b13c637be5a26d44aa1f1e361c2", + "sha256:6d904c5693e08bad240f16d79305edba78276be87061c872a4a15e2c301fa2c0", + "sha256:6dace7b26a13353e24613417ce2239491b40a6ad44e5776a18eaff7733488b44", + "sha256:6df15846ee3fb2e6397fe25d7ca6624af9f89587f3f259d177b556fed6bebe2c", + "sha256:703d95c75a72e902544fda08e965885525e297578317989fd15a6ce58414b41d", + "sha256:726ac36e8a3bb8daef2fd482534cabc5e17334052447008405daca7ca04a3108", + "sha256:781ef8bfc091b19960fc0142a23aedadafa826bc32b433fdfe6fd7f964d7ef44", + "sha256:80443fe2f7b3ea3934c5d75fb0e04a5dbb4a8e943e5ff2de0dec059202b70a8b", + "sha256:83640a5d7cd3bff694747d50436b8b541b5b9b9782b0c8c1688931d6ee1a1f2d", + "sha256:84c5a4d1f9dd7e2d2c44097fb09fffe728629bad31eb56caf97719e55575aa82", + "sha256:882ce6e25e585949c3d9f9abd29202367175e0aab3aba0c58c9abbb37d4982ff", + "sha256:888a97002e986eca10d8546e3c8b97da1d47ad8b69726dcfeb3e56348ebb28a3", + "sha256:8aad80645a011abae487d356e0ceb359f4938dfb6f7bcc410027ed7ae4f7bb8b", + "sha256:8cb6fe8ecdfffa0e711a75c931fb39f4ba382b4b3ccedeca43f18693864fe850", + "sha256:8d6b6937ae9eac6d6c0ca3c42774d89fa311f55adff3970fb364b34abde6ed3d", + "sha256:90123853fc8b1747f80b0d354be3d122b4365a93e50fc3aacc9fb4c2488845d6", + "sha256:96f957d6ab25a78b9e7fc9749d754b98eac825a112b4e666525ce89afcbd9ed5", + "sha256:981d135c7cdaf6cd8eadae1c950de43b976de8f09d8e800feed307140d3d6d00", + "sha256:9b32f742ce5b57201305f19c2ef7a184b52f6f9ba6871cc042c2a61f0d6b49b8", + "sha256:9f0350ef2fba5f34eb0c9000ea328e51b9572b403d2f7f3b19f24085f6f598e8", + "sha256:a297a4d08cc67c7466c873c78039d87840fb50d05473db0ec1b7b03d179bf322", + "sha256:a3d7e2ea25d3517c6d7e5a1cc3702cffa6bd18d9ef8d08d9af6717fc1c700eed", + "sha256:a4b682c5775d6a3d21e314c10124599976809455ee67020e8e72df1769b87bc3", + "sha256:a4ebb8b20bd09c5ce7884c8f0388801100f5e75e7f733b1b6613c713371feefc", + "sha256:a61f659665a39a4d17d699ab3593d7116d66e1e2e3f03ef3fb8f484e91908808", + "sha256:a9880b4656efe36ccad41edc66789e191e5ee19a1ea8811e0aed6f69851a82f4", + "sha256:ac08472f41ea77cd6a5dae36ae7d4ed3951d6602833af87532b556c1b4601d63", + "sha256:adc0c3d6fc6ae35fee3e4917628983f6ce630d513cbaad575b4517d47e81b4bb", + "sha256:af27423662f32d7501a00c5e7342f7dbd1e4a718aea7a239781357d15d437133", + "sha256:b2e75e17bd0bb66ee34a707da677e47c14ee51ccef78ed6a263a4cc965a072a1", + "sha256:b634c5ec0103c5cbebc24ebac4872b045cccb9456fc59efdcf6fe39775365bd2", + "sha256:b6f5549d6ed1da9bfe3631ca9483ae906f21410be2445b73443fa9f017601c6f", + "sha256:bd4b677d929cf1f6bac07ad76e0f2d5de367e6373351c01a9c0a39f6b21b4a8b", + "sha256:bf721ede3eb7b829e4a9b8142bd55db0bdc82902720548a703f7e601ee13bdc3", + "sha256:c647ca87fc0ebe808a41de912e9a1bfef9acb85257e5d63691364ac16b81c1f0", + "sha256:ca57468da2d9a660bcf8961637c85f2fbb2aa64d9bc3f9484e30c3f9f67b1dd7", + "sha256:cad0f59ee3dc35526039f4bc23642d52d5f6616b5f687d846bfc6d0d6d486db0", + "sha256:cc97f0640e91d7776530f06e6836c546c1c752a52de158720c4224c9e8053cad", + "sha256:ccd4e400309e1f34a5095bf9249d371f0fd60f8a3a5c4a791cad7b99ce1fd38d", + "sha256:cffa76b385dfe1e38527662a302b19ffb0e7f5cf7dd5e89186d2c94a22dd9d0c", + "sha256:d0dd7ed2f16df2e129496e7fbe59a34bc2d7fc8db443a606644d069eb69cbd45", + "sha256:d452817e0d9c749c431a1121d56a777bd7099b720b3d1c820f1725cb40928f58", + "sha256:d8dda2a806dfa4a9b795950c4f5cc56d6d6159f7d68080aedaff3bdc9b5032f5", + "sha256:dcbe1f8dd179e4d69b70b1f1d9bb6fd1e7e1bdc9c9aad345cdeb332e29d40748", + "sha256:e0441fb4fdd39a230477b2ca9be90868af64425bfe7b122b57e61e45737a653b", + "sha256:e04e56b4ca7a770593633556e8e9e46579d66ec2ada846b401252a2bdcf70a6d", + "sha256:e061de3b745fe611e23cd7318aec2c8b0e4153939c25c9202a5811ca911fd733", + "sha256:e93ec1b300acf89730cf27975ef574396bc04edecc358e9bd116fb387a123239", + "sha256:e9e557db6a177470316c82f023e5d571811c9a4422b5ea084c85da9aa3c035fc", + "sha256:eab36eae3f3e8e24b05748ec9acc66286662f5d25c52ad70cadab544e034536b", + "sha256:ec23fcad480e77ede06cf4127a25fc440f7489922e17fc058f426b5256ee0edb", + "sha256:ec2e1cf025b2c0f48ec17ff3e642661da7ee332d326f2e6619366ce8e221f018", + "sha256:ed99b4f7179d2111702020fd7d156e88acd533f5a7d3971353e568b6051d5c97", + "sha256:ee94cb58c0ba2c62ee108c2b7c9131b2c66a29e82746e8fa3aa1a1effbd3dcf1", + "sha256:f19afcfc0dd0dca35694df441e9b0f95bc231b512f51bded3c3d8ca32153ec19", + "sha256:f1b9d9260e06ea017feb7172976ab261e011c1dc2f8883c7c274f6b2aabfe01a", + "sha256:f28ac0e8e7242d140f99402a903a2c596ab71550272ae9247ad78f9a932b5698", + "sha256:f42e25c016927e2a6b1ce748112c3ab134261fc2ddc867e92d02006103e1b1b7", + "sha256:f4bd4578e44f26997e9e56c96dedc5f1af43cc9d16c4daa29c771a00b2a26851", + "sha256:f811771019f063bbd0aa7bb72c8a934bc13ebacb4672d712fc1639cfd314cccc" ], "markers": "python_version >= '3.8'", - "version": "==0.10.6" + "version": "==0.16.2" }, "setuptools": { "hashes": [ - "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87", - "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a" + "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05", + "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78" ], "markers": "python_version >= '3.8'", - "version": "==68.2.2" + "version": "==69.0.3" }, "six": { "hashes": [ @@ -1803,6 +1536,7 @@ "sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5" ], "index": "pypi", + "markers": "python_version >= '3.9'", "version": "==7.2.6" }, "sphinx-copybutton": { @@ -1811,6 +1545,7 @@ "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==0.5.2" }, "sphinx-data-viewer": { @@ -1822,11 +1557,12 @@ }, "sphinx-needs": { "hashes": [ - "sha256:5c9836f911ce48e06ebf3fba75dbf9f033d5eb5eaaf743c6e23841ffa77c4c59", - "sha256:9aff78074a199dd3117c4fccf7047f032dbd2346ebefd1b56c6a96b7fad77278" + "sha256:b317bf0d300575018d039a7dff7883aabbc90a9fe27dee561e76af797f1e6ee1", + "sha256:cbb42e919b20cf758f6d0571709fe95ec08b3e2e8f386274ddd738e9e924ceb7" ], "index": "pypi", - "version": "==1.3.0" + "markers": "python_version >= '3.8' and python_version < '4'", + "version": "==2.0.0" }, "sphinx-new-tab-link": { "hashes": [ @@ -1842,15 +1578,17 @@ "sha256:fb1c78fbab1880ae6c2092359aa7401b61716dcb97c8694b7b990f69a98dac62" ], "index": "pypi", + "markers": "python_version >= '3.6' and python_version < '4.0'", "version": "==0.2.0" }, "sphinx-rtd-theme": { "hashes": [ - "sha256:46ddef89cc2416a81ecfbeaceab1881948c014b1b6e4450b815311a89fb977b0", - "sha256:590b030c7abb9cf038ec053b95e5380b5c70d61591eb0b552063fbe7c41f0931" + "sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b", + "sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586" ], "index": "pypi", - "version": "==1.3.0" + "markers": "python_version >= '3.6'", + "version": "==2.0.0" }, "sphinx-test-reports": { "hashes": [ @@ -1867,6 +1605,15 @@ "markers": "python_version >= '3.9'", "version": "==1.0.7" }, + "sphinxcontrib-datatemplates": { + "hashes": [ + "sha256:793222e803430076341509cc167f8d715830b05e418c885313101d60fd442557", + "sha256:88d02f5edab32b88211ebb72a90553e3676a5737877bad1de412f84058ac282e" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==0.11.0" + }, "sphinxcontrib-devhelp": { "hashes": [ "sha256:63b41e0d38207ca40ebbeabcf4d8e51f76c03e78cd61abe118cf4435c73d4212", @@ -1905,6 +1652,7 @@ "sha256:6795a72037ca55e65663d2a2c1a043d636dc3d30d418e56dd6087d1459d98a5d" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==0.9.2" }, "sphinxcontrib-plantuml": { @@ -1922,6 +1670,13 @@ "markers": "python_version >= '3.9'", "version": "==1.0.6" }, + "sphinxcontrib-runcmd": { + "hashes": [ + "sha256:3551c389d9c5fe82d693c7222feb9658b1a1a5a1abcb0063e8385e5528c64c76", + "sha256:7b739b68e27210b4c7c12ba16e5b3da7b313c49991401f896d29bea0f0771934" + ], + "version": "==0.2.0" + }, "sphinxcontrib-serializinghtml": { "hashes": [ "sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54", @@ -1930,6 +1685,15 @@ "markers": "python_version >= '3.9'", "version": "==1.1.9" }, + "testfixtures": { + "hashes": [ + "sha256:80774aecb0249458275ab783f53093fbe75795ff2b3218d22ce3fff0a12c4da6", + "sha256:c72adaf9c7b06882b0ea379dd8159422ca2be0205eedc7c3fee0074cd32f45fa" + ], + "index": "pypi", + "markers": "python_version >= '3.6'", + "version": "==7.2.2" + }, "tqdm": { "hashes": [ "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386", @@ -1938,21 +1702,37 @@ "markers": "python_version >= '3.7'", "version": "==4.66.1" }, + "typing-extensions": { + "hashes": [ + "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", + "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" + ], + "markers": "python_version >= '3.8'", + "version": "==4.9.0" + }, "urllib3": { "hashes": [ - "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07", - "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0" + "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3", + "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.26.18" + "markers": "python_version >= '3.8'", + "version": "==2.1.0" }, "virtualenv": { "hashes": [ - "sha256:02ece4f56fbf939dbbc33c0715159951d6bf14aaf5457b092e4548e1382455af", - "sha256:520d056652454c5098a00c0f073611ccbea4c79089331f60bf9d7ba247bb7381" + "sha256:4238949c5ffe6876362d9c0180fc6c3a824a7b12b80604eeb8085f2ed7460de3", + "sha256:bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b" ], "markers": "python_version >= '3.7'", - "version": "==20.24.6" + "version": "==20.25.0" + }, + "win32-setctime": { + "hashes": [ + "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2", + "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad" + ], + "markers": "sys_platform == 'win32'", + "version": "==1.1.0" } } } diff --git a/cmake/common.cmake b/cmake/common.cmake index 2104316..78afc60 100644 --- a/cmake/common.cmake +++ b/cmake/common.cmake @@ -93,9 +93,12 @@ macro(_spl_get_google_test) endmacro(_spl_get_google_test) macro(spl_create_component) + # The user may define a human readable name for the component by using the LONG_NAME optional argument. + # This name can be used in the documentation. Before the component path was used as component name. + cmake_parse_arguments(CREATE_COMPONENT "" "LONG_NAME" "" ${ARGN}) file(RELATIVE_PATH component_path ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_LIST_DIR}) _spl_slash_to_underscore(component_name ${component_path}) - + # Add debug options based on build configuration (kit) if(BUILD_KIT STREQUAL test) # Exclude all components from the ALL target. @@ -115,6 +118,21 @@ macro(spl_create_component) # Collect all component names for later usage (e.g., in an extension) list(APPEND COMPONENT_NAMES ${component_name}) set(COMPONENT_NAMES ${COMPONENT_NAMES} PARENT_SCOPE) + + # Collect all component information for sphinx documentation + # - We need to keep track of all components and their information to be able to generate the variant reports. + # For the variants reports, one need to loop over all components and generate component variant specific targets. + # - We use json strings because the content will be written in a config.json file during configure. + # Also, CMake supports manipulating JSON strings. See the string(JSON ...) documentation. + set(_component_info "{ +\"name\": \"${component_name}\", +\"long_name\": \"${CREATE_COMPONENT_LONG_NAME}\", +\"path\": \"${component_path}\", +\"has_docs\": \"\", +\"docs_output_dir\": \"\", +\"has_reports\": \"\", +\"reports_output_dir\": \"\" +}") list(APPEND target_include_directories__INCLUDES ${CMAKE_CURRENT_LIST_DIR}/src) list(APPEND target_include_directories__INCLUDES ${CMAKE_CURRENT_BINARY_DIR}) @@ -134,50 +152,51 @@ macro(spl_create_component) set(_component_doc_dir ${_component_dir}/doc) set(_component_doc_file ${_component_doc_dir}/index.rst) set(_component_test_junit_xml ${CMAKE_CURRENT_BINARY_DIR}/junit.xml) - set(_component_reports_dir ${CMAKE_CURRENT_BINARY_DIR}/reports) - set(_autoconf_json_file ${AUTOCONF_JSON}) + set(_component_coverage_json ${CMAKE_CURRENT_BINARY_DIR}/coverage.json) + set(_component_docs_out_dir ${CMAKE_CURRENT_BINARY_DIR}/docs) + set(_component_reports_out_dir ${CMAKE_CURRENT_BINARY_DIR}/reports) + # The Sphinx source directory is ALWAYS the project root + set(_sphinx_source_dir ${PROJECT_SOURCE_DIR}) + # Create component docs target if there is an index.rst file in the component's doc directory if(EXISTS ${_component_doc_file}) - # The Sphinx source directory is always the project root - set(SPHINX_SOURCE_DIR ${PROJECT_SOURCE_DIR}) - set(SPHINX_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/docs) - file(RELATIVE_PATH _rel_sphinx_output_dir ${SPHINX_SOURCE_DIR} ${SPHINX_OUTPUT_DIR}) - set(SPHINX_OUTPUT_HTML_DIR ${SPHINX_OUTPUT_DIR}/html) - set(SPHINX_OUTPUT_INDEX_HTML ${SPHINX_OUTPUT_HTML_DIR}/index.html) + file(RELATIVE_PATH _rel_component_docs_out_dir ${_sphinx_source_dir} ${_component_docs_out_dir}) + string(JSON _component_info SET "${_component_info}" docs_output_dir "\"${_rel_component_docs_out_dir}\"") + string(JSON _component_info SET "${_component_info}" has_docs "\"True\"") + set(_component_docs_html_out_dir ${_component_docs_out_dir}/html) # create the config.json file. This is exported as SPHINX_BUILD_CONFIGURATION_FILE env variable - set(_docs_config_json ${SPHINX_OUTPUT_DIR}/config.json) - file(RELATIVE_PATH _rel_component_doc_dir ${SPHINX_SOURCE_DIR} ${_component_doc_dir}) + set(_docs_config_json ${_component_docs_out_dir}/config.json) + file(RELATIVE_PATH _rel_component_doc_dir ${_sphinx_source_dir} ${_component_doc_dir}) file(WRITE ${_docs_config_json} "{ - \"generated_rst_content\": \".. toctree::\\n :maxdepth: 2\\n\\n /${_rel_component_doc_dir}/index\", - \"component_doc_dir\": \"${_rel_component_doc_dir}\", - \"include_patterns\": [\"${_rel_component_doc_dir}/**\",\"${_rel_sphinx_output_dir}/**\"] + \"component_info\": ${_component_info}, + \"include_patterns\": [\"${_rel_component_doc_dir}/**\",\"${_rel_component_docs_out_dir}/**\"] }") # add the generated files as dependency to cmake configure step set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${_docs_config_json}) add_custom_target( ${component_name}_docs - COMMAND ${CMAKE_COMMAND} -E make_directory ${SPHINX_OUTPUT_DIR} - COMMAND ${CMAKE_COMMAND} -E env SPHINX_BUILD_CONFIGURATION_FILE=${_docs_config_json} AUTOCONF_JSON_FILE=${_autoconf_json_file} VARIANT=${VARIANT} -- sphinx-build -b html ${SPHINX_SOURCE_DIR} ${SPHINX_OUTPUT_HTML_DIR} - BYPRODUCTS ${SPHINX_OUTPUT_INDEX_HTML} + COMMAND ${CMAKE_COMMAND} -E make_directory ${_component_docs_out_dir} + # We do not know all dependencies for generating the docs (apart from the rst files). + # This might cause incremental builds to not update parts of the documentation. + # To avoid this we are using the -E option to make sphinx-build writing all files new. + COMMAND ${CMAKE_COMMAND} -E env SPHINX_BUILD_CONFIGURATION_FILE=${_docs_config_json} AUTOCONF_JSON_FILE=${AUTOCONF_JSON} VARIANT=${VARIANT} -- sphinx-build -E -b html ${_sphinx_source_dir} ${_component_docs_html_out_dir} + BYPRODUCTS ${_component_docs_html_out_dir}/index.html ) - add_dependencies(docs ${component_name}_docs) - if(TEST_SOURCES) - set(SPHINX_OUTPUT_DIR ${_component_reports_dir}) - file(RELATIVE_PATH _rel_sphinx_output_dir ${SPHINX_SOURCE_DIR} ${SPHINX_OUTPUT_DIR}) - set(SPHINX_OUTPUT_HTML_DIR ${SPHINX_OUTPUT_DIR}/html) - set(SPHINX_OUTPUT_INDEX_HTML ${SPHINX_OUTPUT_HTML_DIR}/index.html) + file(RELATIVE_PATH _rel_component_reports_out_dir ${_sphinx_source_dir} ${_component_reports_out_dir}) + string(JSON _component_info SET "${_component_info}" reports_output_dir "\"${_rel_component_reports_out_dir}\"") + string(JSON _component_info SET "${_component_info}" has_reports "\"True\"") + set(_component_reports_html_out_dir ${_component_reports_out_dir}/html) # create the config.json file. This is exported as SPHINX_BUILD_CONFIGURATION_FILE env variable - set(_reports_config_json ${SPHINX_OUTPUT_DIR}/config.json) + set(_reports_config_json ${_component_reports_out_dir}/config.json) - # create the test_spec.rst file - set(_unit_test_spec_rst ${SPHINX_OUTPUT_DIR}/unit_test_spec.rst) - file(RELATIVE_PATH _rel_unit_test_spec_rst ${SPHINX_SOURCE_DIR} ${_unit_test_spec_rst}) + # create the test specification rst file + set(_unit_test_spec_rst ${_component_reports_out_dir}/unit_test_spec.rst) file(WRITE ${_unit_test_spec_rst} " Unit Test Specification ======================= @@ -189,63 +208,203 @@ Unit Test Specification ") - # create the unit_test_results.rst file - set(_unit_test_results_rst ${SPHINX_OUTPUT_DIR}/unit_test_results.rst) - file(RELATIVE_PATH _rel_unit_test_results_rst ${SPHINX_SOURCE_DIR} ${_unit_test_results_rst}) + # create the test results rst file + set(_unit_test_results_rst ${_component_reports_out_dir}/unit_test_results.rst) file(WRITE ${_unit_test_results_rst} " Unit Test Results ================= .. test-report:: Unit Test Results - :id: TEST_RESULT - :file: {{ component_test_junit_xml }} + :id: TEST_RESULT_${component_name} + :file: ${_component_test_junit_xml} + +") + + # create coverate rst file to be able to automatically link to the coverage/index.html + set(_coverage_rst ${_component_reports_out_dir}/coverage.rst) + file(WRITE ${_coverage_rst} " +Code Coverage +============= + +`Report `_ ") - set(_component_doxyfile ${SPHINX_OUTPUT_DIR}/Doxyfile) # generate Doxyfile from template - set(DOXYGEN_PROJECT_NAME "Doxygen Documentation") - set(DOXYGEN_OUTPUT_DIRECTORY ${SPHINX_OUTPUT_DIR}/doxygen) + set(_component_doxyfile ${_component_reports_out_dir}/Doxyfile) + set(DOXYGEN_PROJECT_NAME "${CREATE_COMPONENT_LONG_NAME} Documentation") + set(DOXYGEN_OUTPUT_DIRECTORY ${_component_reports_out_dir}/doxygen) set(DOXYGEN_INPUT "${_component_dir}/src ${_component_dir}/test ${KCONFIG_OUT_DIR}") # We need to add the googletest include directory to the doxygen include path # to be able to resolve the TEST() macros in the test files. - set(DOXYGEN_INCLUDE_PATH "${SPHINX_SOURCE_DIR}/build/modules/googletest-src/googletest/include ${KCONFIG_OUT_DIR}") - set(DOXYGEN_AWESOME_PATH "${SPHINX_SOURCE_DIR}/doc/doxygen-awesome") - configure_file(${SPHINX_SOURCE_DIR}/doc/Doxyfile.in ${_component_doxyfile} @ONLY) + set(DOXYGEN_INCLUDE_PATH "${_sphinx_source_dir}/build/modules/googletest-src/googletest/include ${KCONFIG_OUT_DIR}") + set(DOXYGEN_AWESOME_PATH "${_sphinx_source_dir}/doc/doxygen-awesome") + configure_file(${_sphinx_source_dir}/doc/Doxyfile.in ${_component_doxyfile} @ONLY) file(RELATIVE_PATH _rel_component_doxyfile ${CMAKE_CURRENT_BINARY_DIR} ${_component_doxyfile}) - file(RELATIVE_PATH _rel_component_doxysphinx_index_rst ${SPHINX_SOURCE_DIR} ${DOXYGEN_OUTPUT_DIRECTORY}/html/index) + file(RELATIVE_PATH _rel_component_doxysphinx_index_rst ${_sphinx_source_dir} ${DOXYGEN_OUTPUT_DIRECTORY}/html/index) file(WRITE ${_reports_config_json} "{ - \"generated_rst_content\": \".. toctree::\\n :maxdepth: 2\\n\\n /${_rel_component_doc_dir}/index\\n /${_rel_unit_test_spec_rst}\\n /${_rel_unit_test_results_rst}\\n /${_rel_component_doxysphinx_index_rst}\", - \"component_doc_dir\": \"${_rel_component_doc_dir}\", - \"component_test_junit_xml\": \"${_component_test_junit_xml}\", - \"include_patterns\": [\"${_rel_component_doc_dir}/**\",\"${_rel_sphinx_output_dir}/**\"] - }") + \"component_info\": ${_component_info}, + \"include_patterns\": [\"${_rel_component_doc_dir}/**\",\"${_rel_component_reports_out_dir}/**\"] +}") # add the generated files as dependency to cmake configure step set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${_reports_config_json} ${_unit_test_spec_rst} ${_unit_test_results_rst} ${_component_doxyfile}) + set(_cov_out_html reports/html/${_rel_component_reports_out_dir}/coverage/index.html) + file(RELATIVE_PATH _cov_out_json ${CMAKE_CURRENT_BINARY_DIR} ${_component_coverage_json}) + # For the component report, one needs to generate the coverage/index.html inside the component report sphinx output directory. + # This will avoid the need to copy the coverage/** directory inside the component report sphinx output directory. + add_custom_command( + OUTPUT ${_cov_out_html} + COMMAND gcovr --root ${PROJECT_SOURCE_DIR} --add-tracefile ${_cov_out_json} --html --html-details --output ${_cov_out_html} ${GCOVR_ADDITIONAL_OPTIONS} + DEPENDS ${_cov_out_json} + COMMENT "Generating component coverage html report ${_cov_out_html} ..." + ) + + # We need to have a separate component doxygen generation target because it is required + # by both the component and variant reports. + add_custom_target( + # No OUTPUT is defined to force execution of this target every time + ${component_name}_doxygen + COMMAND ${CMAKE_COMMAND} -E make_directory ${_component_reports_out_dir} + COMMAND ${CMAKE_COMMAND} -E remove_directory ${DOXYGEN_OUTPUT_DIRECTORY} + COMMAND ${CMAKE_COMMAND} -E make_directory ${DOXYGEN_OUTPUT_DIRECTORY} + COMMAND doxygen ${_rel_component_doxyfile} + ) # No OUTPUT is defined to force execution of this target every time # TODO: list of dependencies is not complete add_custom_target( ${component_name}_report - ALL - COMMAND ${CMAKE_COMMAND} -E make_directory ${SPHINX_OUTPUT_DIR} - COMMAND ${CMAKE_COMMAND} -E remove_directory ${SPHINX_OUTPUT_DIR}/html - COMMAND ${CMAKE_COMMAND} -E remove_directory ${SPHINX_OUTPUT_DIR}/doxygen - COMMAND ${CMAKE_COMMAND} -E make_directory ${SPHINX_OUTPUT_DIR}/doxygen - COMMAND doxygen ${_rel_component_doxyfile} - COMMAND doxysphinx build ${SPHINX_SOURCE_DIR} ${SPHINX_OUTPUT_HTML_DIR} ${_rel_component_doxyfile} - COMMAND ${CMAKE_COMMAND} -E env SPHINX_BUILD_CONFIGURATION_FILE=${_reports_config_json} AUTOCONF_JSON_FILE=${_autoconf_json_file} VARIANT=${VARIANT} -- sphinx-build -b html ${SPHINX_SOURCE_DIR} ${SPHINX_OUTPUT_HTML_DIR} - BYPRODUCTS ${SPHINX_OUTPUT_INDEX_HTML} - DEPENDS ${TEST_OUT_JUNIT} ${COV_OUT_HTML} + COMMAND ${CMAKE_COMMAND} -E make_directory ${_component_reports_out_dir} + COMMAND doxysphinx build ${_sphinx_source_dir} ${_component_reports_html_out_dir} ${_rel_component_doxyfile} + COMMAND ${CMAKE_COMMAND} -E env SPHINX_BUILD_CONFIGURATION_FILE=${_reports_config_json} AUTOCONF_JSON_FILE=${AUTOCONF_JSON} VARIANT=${VARIANT} -- sphinx-build -E -b html ${_sphinx_source_dir} ${_component_reports_html_out_dir} + BYPRODUCTS ${_component_reports_html_out_dir}/index.html + DEPENDS ${TEST_OUT_JUNIT} ${component_name}_doxygen ${_cov_out_html} ) - - add_dependencies(reports ${component_name}_report) endif(TEST_SOURCES) + # Collect all component sphinx include pattern to be used in the variant targets (docs, reports) + list(APPEND COMPONENTS_SPHINX_INCLUDE_PATTERNS "${_rel_component_doc_dir}/**" "${_rel_component_docs_out_dir}/**" "${_rel_component_reports_out_dir}/**") + set(COMPONENTS_SPHINX_INCLUDE_PATTERNS ${COMPONENTS_SPHINX_INCLUDE_PATTERNS} PARENT_SCOPE) + endif(EXISTS ${_component_doc_file}) + endif(BUILD_KIT STREQUAL test) + # Collect all component info for later usage (e.g., in an extension) + list(APPEND COMPONENTS_INFO ${_component_info}) + set(COMPONENTS_INFO ${COMPONENTS_INFO} PARENT_SCOPE) +endmacro() + +macro(_spl_create_docs_target) + set(_docs_out_dir ${CMAKE_CURRENT_BINARY_DIR}/docs) + set(_docs_html_out_dir ${_docs_out_dir}/html) + set(_docs_config_json ${_docs_out_dir}/config.json) + + # create the config.json file. This is exported as SPHINX_BUILD_CONFIGURATION_FILE env variable + list(JOIN COMPONENTS_INFO "," _components_info_json) + set(_components_info_json "[${_components_info_json}]") + list(JOIN COMPONENTS_SPHINX_INCLUDE_PATTERNS "\",\"" _components_sphinx_include_patterns_json) + set(_components_sphinx_include_patterns_json "[\"${_components_sphinx_include_patterns_json}\"]") + file(WRITE ${_docs_config_json} "{ + \"target\": \"docs\", + \"include_patterns\": ${_components_sphinx_include_patterns_json}, + \"components_info\": ${_components_info_json} +}") + + # add the generated files as dependency to cmake configure step + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${_docs_config_json}) + add_custom_target( + docs + COMMAND ${CMAKE_COMMAND} -E make_directory ${_docs_out_dir} + COMMAND ${CMAKE_COMMAND} -E env SPHINX_BUILD_CONFIGURATION_FILE=${_docs_config_json} AUTOCONF_JSON_FILE=${AUTOCONF_JSON} VARIANT=${VARIANT} -- sphinx-build -E -b html ${PROJECT_SOURCE_DIR} ${_docs_html_out_dir} + BYPRODUCTS ${_docs_html_out_dir}/index.html + ) +endmacro() + +macro(_spl_create_reports_target) + set(_reports_output_dir ${CMAKE_CURRENT_BINARY_DIR}/reports) + file(RELATIVE_PATH _rel_reports_output_dir ${PROJECT_SOURCE_DIR} ${_reports_output_dir}) + set(_reports_html_output_dir ${_reports_output_dir}/html) + + # create the config.json file. This is exported as SPHINX_BUILD_CONFIGURATION_FILE env variable + set(_reports_config_json ${_reports_output_dir}/config.json) + list(JOIN COMPONENTS_INFO "," _components_info_json) + set(_components_info_json "[${_components_info_json}]") + # Add the variant specific rst files (e.g, coverage.rst) to the include patterns + list(APPEND COMPONENTS_SPHINX_INCLUDE_PATTERNS "${_rel_reports_output_dir}/**") + list(JOIN COMPONENTS_SPHINX_INCLUDE_PATTERNS "\",\"" _components_sphinx_include_patterns_json) + set(_components_sphinx_include_patterns_json "[\"${_components_sphinx_include_patterns_json}\"]") + file(WRITE ${_reports_config_json} "{ + \"target\": \"reports\", + \"include_patterns\": ${_components_sphinx_include_patterns_json}, + \"reports_output_dir\": \"${_rel_reports_output_dir}\", + \"components_info\": ${_components_info_json} +}") + + # create the variant code coverage rst file + set(_coverage_rst ${_reports_output_dir}/coverage.rst) + file(WRITE ${_coverage_rst} " +Code Coverage +============= + +`Report `_ + +") + + # For every component we need to create specific coverage and doxysphinx targets to make sure + # the output files are generated in the overall variant sphinx output directory. + # This will avoid the need to copy all the component coverage and doxygen files from the component + # directories to the variant directory. + foreach(component_info ${COMPONENTS_INFO}) + string(JSON component_name GET ${component_info} name) + string(JSON component_path GET ${component_info} path) + string(JSON component_reports_output_dir GET ${component_info} reports_output_dir) + if (component_reports_output_dir) + set(_variant_component_reports_out_dir reports/html/${component_reports_output_dir}) + set(_cov_out_html ${_variant_component_reports_out_dir}/coverage/index.html) + set(_cov_out_json ${component_path}/coverage.json) + add_custom_command( + OUTPUT ${_cov_out_html} + COMMAND gcovr --root ${PROJECT_SOURCE_DIR} --add-tracefile ${_cov_out_json} --html --html-details --output ${_cov_out_html} ${GCOVR_ADDITIONAL_OPTIONS} + DEPENDS ${_cov_out_json} + COMMENT "Generating variant component coverage html report ${_cov_out_html} ..." + ) + list(APPEND _components_coverage_html ${_cov_out_html}) + + set(_rel_component_doxyfile ${component_path}/reports/Doxyfile) + add_custom_target( + ${component_name}_doxysphinx + COMMAND ${CMAKE_COMMAND} -E make_directory ${_variant_component_reports_out_dir} + COMMAND doxysphinx build ${PROJECT_SOURCE_DIR} ${_reports_html_output_dir} ${_rel_component_doxyfile} + DEPENDS ${component_name}_doxygen + COMMENT "Generating variant component doxysphinx report ${component_name}_doxysphinx ..." + ) + list(APPEND _components_variant_doxysphinx_targets ${component_name}_doxysphinx) endif() - endif() + endforeach() + + set(_cov_out_variant_html reports/html/${_rel_reports_output_dir}/coverage/index.html) + add_custom_command( + OUTPUT ${_cov_out_variant_html} + COMMAND gcovr --root ${CMAKE_SOURCE_DIR} --add-tracefile \"${CMAKE_CURRENT_BINARY_DIR}/**/${COV_OUT_JSON}\" --html --html-details --output ${_cov_out_variant_html} + DEPENDS ${GLOBAL_COMPONENTS_COVERAGE_JSON_LIST} + COMMENT "Generating overall code coverage report ${_cov_out_variant_html} ..." + ) + + add_custom_target( + _components_variant_coverage_html_target + DEPENDS ${_components_coverage_html} ${_cov_out_variant_html} + ) + # add the generated files as dependency to cmake configure step + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${_reports_config_json}) + add_custom_target( + reports + ALL + COMMAND ${CMAKE_COMMAND} -E make_directory ${_reports_output_dir} + # We need to call sphinx-build with -E to make sure all files are regenerated. + COMMAND ${CMAKE_COMMAND} -E env SPHINX_BUILD_CONFIGURATION_FILE=${_reports_config_json} AUTOCONF_JSON_FILE=${AUTOCONF_JSON} VARIANT=${VARIANT} -- sphinx-build -E -b html ${PROJECT_SOURCE_DIR} ${_reports_html_output_dir} + BYPRODUCTS ${_reports_html_output_dir}/index.html + DEPENDS _components_variant_coverage_html_target ${_components_variant_doxysphinx_targets} + ) endmacro() macro(_spl_set_coverage_create_overall_report_is_necessary) @@ -253,6 +412,7 @@ macro(_spl_set_coverage_create_overall_report_is_necessary) endmacro(_spl_set_coverage_create_overall_report_is_necessary) set(COV_OUT_JSON coverage.json) + function(_spl_coverage_create_overall_report) if(_SPL_COVERAGE_CREATE_OVERALL_REPORT_IS_NECESSARY) set(COV_OUT_VARIANT_HTML reports/coverage/index.html) @@ -268,7 +428,6 @@ function(_spl_coverage_create_overall_report) ) add_custom_target( coverage_overall_report - ALL DEPENDS ${COV_OUT_VARIANT_HTML} ) else(_SPL_COVERAGE_CREATE_OVERALL_REPORT_IS_NECESSARY) @@ -318,20 +477,24 @@ macro(_spl_add_test_suite PROD_SRC TEST_SOURCES) set(TEST_OUT_JUNIT junit.xml) add_custom_command( OUTPUT ${TEST_OUT_JUNIT} + # Wipe all gcda files before the test executable recreates them COMMAND python ${SPL_CORE_PYTHON_DIRECTORY}/gcov_maid/gcov_maid.py --working-dir . --wipe-all-gcda + # Run the test executable, generate JUnit report and return 0 independent of the test result COMMAND ${CMAKE_CTEST_COMMAND} ${CMAKE_CTEST_ARGUMENTS} --output-junit ${TEST_OUT_JUNIT} || ${CMAKE_COMMAND} -E true DEPENDS ${exe_name} ) set(GLOBAL_COMPONENTS_COVERAGE_JSON_LIST "${GLOBAL_COMPONENTS_COVERAGE_JSON_LIST};${CMAKE_CURRENT_BINARY_DIR}/${COV_OUT_JSON}" CACHE INTERNAL "List of all ${COV_OUT_JSON} files") - + # Create coverage report add_custom_command( OUTPUT ${COV_OUT_JSON} + # Wipe orphaned gcno files before gcovr searches for them COMMAND python ${SPL_CORE_PYTHON_DIRECTORY}/gcov_maid/gcov_maid.py --working-dir . --wipe-orphaned-gcno + # Run gcovr to generate coverage json for the component COMMAND gcovr --root ${CMAKE_SOURCE_DIR} --json --output ${COV_OUT_JSON} ${GCOVR_ADDITIONAL_OPTIONS} ${CMAKE_CURRENT_BINARY_DIR} DEPENDS ${TEST_OUT_JUNIT} @@ -352,7 +515,6 @@ macro(_spl_add_test_suite PROD_SRC TEST_SOURCES) ) add_custom_target( ${component_name}_unittests - ALL DEPENDS ${component_name}_coverage ) add_dependencies(coverage ${component_name}_coverage) diff --git a/cmake/spl.cmake b/cmake/spl.cmake index e21d5d2..8f4fbb4 100644 --- a/cmake/spl.cmake +++ b/cmake/spl.cmake @@ -71,8 +71,6 @@ elseif(BUILD_KIT STREQUAL test) list(APPEND CMAKE_CTEST_ARGUMENTS "--output-on-failure") add_custom_target(coverage) - add_custom_target(docs) - add_custom_target(reports) else() message(FATAL_ERROR "Invalid BUILD_KIT selected!") endif(BUILD_KIT STREQUAL prod) @@ -81,10 +79,11 @@ endif(BUILD_KIT STREQUAL prod) cmake_language(DEFER DIRECTORY ${CMAKE_SOURCE_DIR} CALL _spl_hook_end_of_configure()) function(_spl_hook_end_of_configure) - _spl_coverage_create_overall_report() - - if(CONAN__REQUIRES OR CONAN__BUILD_REQUIRES) - endif() # CONAN__REQUIRES + if(BUILD_KIT STREQUAL test) + _spl_coverage_create_overall_report() + _spl_create_docs_target() + _spl_create_reports_target() + endif(BUILD_KIT STREQUAL test) endfunction(_spl_hook_end_of_configure) # # This is one possibility to open guiconfig of kconfiglib. VSCode task is the preferred solution diff --git a/docs/changelog/index.rst b/docs/about/index.rst similarity index 57% rename from docs/changelog/index.rst rename to docs/about/index.rst index 6ae006a..ad3ef0a 100644 --- a/docs/changelog/index.rst +++ b/docs/about/index.rst @@ -1 +1,4 @@ +📄 About +******** + .. mdinclude:: ../../CHANGELOG.md diff --git a/docs/features/index.rst b/docs/features/index.rst new file mode 100644 index 0000000..1106e6b --- /dev/null +++ b/docs/features/index.rst @@ -0,0 +1,19 @@ +✨ Features +************ + +Component Report +---------------- + +To support the :ref:`component ` development, SPL Core provides features to: + +- document the component behavior - see :ref:`How to create a component detail design ` +- test the component behavior - see :ref:`How to create a component test cases ` +- generate component report with full traceability between documentation, code and tests - see :ref:`Component relevant CMake Targets ` + + +Variant Report +-------------- + +To support the :ref:`variant ` development, SPL Core provides features to: + +TODO: add variant report description \ No newline at end of file diff --git a/docs/getting_started/concepts.rst b/docs/getting_started/concepts.rst index c0cbaf3..00fd9d6 100644 --- a/docs/getting_started/concepts.rst +++ b/docs/getting_started/concepts.rst @@ -4,25 +4,27 @@ Basic Concepts and Naming Conventions What is a Software Product Line (SPL)? -------------------------------------- -An SPL is a software project that contains shared and configurable source code elements known as `components `_, which are used to develop several versions of a computer program, also known as `variants `_. +An SPL is a software project that contains shared and configurable source code elements known as :ref:`components `, which are used to develop several versions of a computer program, also known as :ref:`variants `. Think of an SPL like an automotive factory that makes different types of cars. Each car is special - some are race cars, some are trucks, and others might be convertibles. -But they all start from some common `components `_ like wheels and engines with different configurations like size and horsepowers. -Thinking this way, making a new program is like building a new car but faster and easier because we already have the `components `_ we need. +But they all start from some common :ref:`components ` like wheels and engines with different configurations like size and horsepowers. +Thinking this way, making a new program is like building a new car but faster and easier because we already have the :ref:`components ` we need. What is SPL Core? ----------------- SPL Core is a tool chain that uses modern `CMake `_. -SPL Core supports the concepts and requirements of an SPL to build various software `variants `_ from a common codebase. +SPL Core supports the concepts and requirements of an SPL to build various software :ref:`variants ` from a common codebase. + +.. _what_is_a_variant: What is a Variant? ------------------ -A variant is a specific version of the software, consisting of a set of `features `_ that meet specific customer requirements. +A variant is a specific version of the software, consisting of a set of :ref:`features ` that meet specific customer requirements. -Think of a variant like choosing different `features `_ for your car. +Think of a variant like choosing different :ref:`features ` for your car. One car might be red with racing stripes and another might be a blue truck. In computer programs, a variant is a version of the program that has something different or special about it, but it's still based on the same basic design. It's like customizing your car or program to make it just the way you want it. @@ -50,8 +52,8 @@ Here is an example of the variants directory with two variants (``my/var1`` and * ``config.cmake`` - variant specific CMake configuration, like the target architecture and toolchain. -* ``parts.cmake`` - contains the list of `components `_ that are part of the variant. -* ``config.txt`` - this is the `feature `_ selection of the variant. It is a KConfig file that contains the selected `features `_ of the variant. +* ``parts.cmake`` - contains the list of :ref:`components ` that are part of the variant. +* ``config.txt`` - this is the :ref:`feature ` selection of the variant. It is a KConfig file that contains the selected :ref:`features ` of the variant. .. _what_is_a_component: @@ -107,12 +109,13 @@ Here is an example of the source directory with two components (``src/comp1`` an * **Component Definition** * The component's ``CMakeLists.txt`` makes the component available using :ref:`spl_create_component `. +.. _what_is_a_feature_model: What is a Feature Model? ------------------------ A feature model represents the organization of all potential features in an SPL, showing how they relate and depend on each other. -This model guides the creation of different SPL `variants `_, ensuring that feature combinations are viable and consistent. +This model guides the creation of different SPL :ref:`variants `, ensuring that feature combinations are viable and consistent. Think of a feature model like a big chart showing all the different features you can choose from to customize your car. It tells you which pieces fit together and how you can combine them to make different types of cars. @@ -123,5 +126,5 @@ In computer programs, a feature model helps us understand all the features (like If a ``KConfig`` file is present in the root directory, SPL Core will automatically parse it and generate the project configuration. -The `variant `_ specific configuration file is expected in the `variant `_ directory. -If a ``config.txt`` file is present in the `variant `_ directory, SPL Core will automatically use it to override the default configuration values defined in the ``KConfig`` file. +The :ref:`variant ` specific configuration file is expected in the :ref:`variant ` directory. +If a ``config.txt`` file is present in the :ref:`variant ` directory, SPL Core will automatically use it to override the default configuration values defined in the ``KConfig`` file. diff --git a/docs/getting_started/index.rst b/docs/getting_started/index.rst index f0baf37..473b8cd 100644 --- a/docs/getting_started/index.rst +++ b/docs/getting_started/index.rst @@ -9,3 +9,4 @@ generate_example_project start_new_component from_legacy_to_configurable_component + start_new_variant diff --git a/docs/getting_started/start_new_component.rst b/docs/getting_started/start_new_component.rst index 173e3ad..30619ed 100644 --- a/docs/getting_started/start_new_component.rst +++ b/docs/getting_started/start_new_component.rst @@ -11,6 +11,8 @@ To support :ref:`component ` development, SPL Core provides `Sphinx `_ is used to generate the component report. See the project `conf.py` file for the configuration details. +.. _how_to_component_detail_design: + Detailed Design *************** @@ -128,6 +130,7 @@ Here is a ``index.rst`` template for getting you started documenting a component STATE_Y --> STATE_OFF : Power State == OFF {% endif %} +.. _how_to_component_test_cases: Test Cases ********** diff --git a/docs/getting_started/start_new_variant.rst b/docs/getting_started/start_new_variant.rst new file mode 100644 index 0000000..a9df260 --- /dev/null +++ b/docs/getting_started/start_new_variant.rst @@ -0,0 +1,4 @@ +How to Start Working on a :ref:`Variant ` +############################################################ + +TODO: write this section \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index 8f085d3..29877c9 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -5,6 +5,7 @@ Software Product Line (SPL) Core Documentation :maxdepth: 2 getting_started/index + features/index reference/index internals/index - changelog/index \ No newline at end of file + about/index diff --git a/docs/internals/index.rst b/docs/internals/index.rst index 3602a8c..fa121c8 100644 --- a/docs/internals/index.rst +++ b/docs/internals/index.rst @@ -71,19 +71,19 @@ Build kit *test* Build kit 'test' shall provide a build target 'unittests', that executes all tests of all SW components. .. req:: Support Creation of Documentation - :status: open + :status: done Build kit 'test' shall provide a build target '_docs', that creates documentation of a SW component. Precondition of this build target is the existence of a doc folder inside the component's folder containing at least a conf.py. .. req:: Support Documentation - :status: open + :status: done Build kit 'test' shall provide a build target 'docs', that creates the documentation of all SW components. .. req:: Support Creation of a Component Report - :status: open + :status: done Build kit 'test' shall provide a build target '_report', that creates a report of a SW component containing the documentation, test specification and all test results. @@ -96,13 +96,13 @@ Build kit *test* SPL Core shall always start the docs target for generating the documentation and let sphinx-build handle the dependencies. .. req:: Configurable Sphinx Output - :status: open + :status: done The documentation shall be configurable. One should be able to generate the variant specific documentation, i.e., only the variant specific components and their features shall be part of the documentation. .. req:: Project Documentation - :status: open + :status: done The project's index.rst file shall be static but changeable and configurable. @@ -220,3 +220,19 @@ Component Reports CMake Target * we need to copy Doxyfile from the docs folder and then we have to update the paths where Doxyfile should find the sources * we need to call sphinx-build "pipenv run sphinx-build -b html . build//test/src//reports/html" * source directory is always a projet root directory and output directory is build//test/src//reports/ + + +Variant ``docs`` CMake Target +----------------------------- + +Variant documentation will be created by the ``docs`` CMake target. +This runs a sphinx-build using the project root index.rst file as input. +Only the files included in the ``doc`` folder and inside each component's ``doc`` folder are part of the overall documentation. Therefore, there will be no traceability to IDs from ``src`` or ``test``. + + +Variant ``reports`` CMake Target +-------------------------------- + +Variant reports will be created by the ``reports`` CMake target. +This runs a sphinx-build using the project root index.rst file as input. +In addition to the variant documentation, the variant report includes the component reports which include not only the docs but also the test results and the test specification. diff --git a/docs/reference/index.rst b/docs/reference/index.rst index f916b14..7b1a539 100644 --- a/docs/reference/index.rst +++ b/docs/reference/index.rst @@ -1,4 +1,4 @@ -🔧 Reference +🛠️ Reference ************ .. toctree:: @@ -6,3 +6,4 @@ macros variables + targets diff --git a/docs/reference/targets.rst b/docs/reference/targets.rst new file mode 100644 index 0000000..4221ceb --- /dev/null +++ b/docs/reference/targets.rst @@ -0,0 +1,31 @@ +CMake Targets +============= + + +reports +------- + +Generates the overall variant report. + +docs +---- + +Generates the variant documentation. + +.. _component_cmake_targets: + +_report +------------------ + +Generate component report with full traceability between documentation, code and tests. + +_docs +---------------- + +Generates the documentation for the given component. + +_unittests +--------------------- + +Runs the unit tests for the given component. + diff --git a/src/common/cmake.py b/src/common/cmake.py index d79e051..cdb8d7c 100644 --- a/src/common/cmake.py +++ b/src/common/cmake.py @@ -26,8 +26,7 @@ def configure(self, variant: Variant, build_kit: str = "prod"): f" -B{self.workspace_artifacts.get_build_dir(variant, build_kit)}" f" -G Ninja " f" -DBUILD_KIT:STRING={build_kit}" - f" -DFLAVOR:STRING={variant.flavor}" - f" -DSUBSYSTEM:STRING={variant.subsystem}" + f" -DVARIANT:STRING={variant.to_string()}" f" -DCMAKE_BUILD_TYPE:STRING={variant.to_string('_')}" ) if build_kit == "test": diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/.gitignore b/src/project_creator/templates/project/{{cookiecutter.name}}/.gitignore index 579409d..875c36a 100644 --- a/src/project_creator/templates/project/{{cookiecutter.name}}/.gitignore +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/.gitignore @@ -17,6 +17,9 @@ __pycache__/ # Any backup file of text editors *.bak +# Any log file +*.log + # Backup files of KConfig *.old @@ -25,3 +28,6 @@ __pycache__/ # bootstrap files are downloaded during installation /.bootstrap + +# Drawio Backup Files +*.drawio.bkp diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/.vscode/extensions.json b/src/project_creator/templates/project/{{cookiecutter.name}}/.vscode/extensions.json index 5979909..f28553f 100644 --- a/src/project_creator/templates/project/{{cookiecutter.name}}/.vscode/extensions.json +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/.vscode/extensions.json @@ -12,6 +12,7 @@ "ms-python.vscode-pylance", "ms-python.python", "donjayamanne.python-environment-manager", - "felipecaputo.git-project-manager" + "felipecaputo.git-project-manager", + "ms-vscode.powershell" ] } diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/.vscode/launch.json b/src/project_creator/templates/project/{{cookiecutter.name}}/.vscode/launch.json index 21f6a72..c006fbb 100644 --- a/src/project_creator/templates/project/{{cookiecutter.name}}/.vscode/launch.json +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/.vscode/launch.json @@ -30,9 +30,7 @@ "debug-test" ], "console": "integratedTerminal", - "env": { - "PYTEST_ADDOPTS": "--no-cov" - }, + "env": {}, "justMyCode": false } ] diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/.vscode/settings.json b/src/project_creator/templates/project/{{cookiecutter.name}}/.vscode/settings.json index 14e2f7b..2057dd7 100644 --- a/src/project_creator/templates/project/{{cookiecutter.name}}/.vscode/settings.json +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/.vscode/settings.json @@ -1,21 +1,17 @@ { "python.testing.pytestEnabled": true, - "python.testing.unittestEnabled": false, - "python.formatting.provider": "black", - "python.formatting.blackArgs": [ - "--line-length", - "240" + "python.testing.pytestArgs": [ + "test" ], - "python.formatting.blackPath": "black", - "python.linting.enabled": true, - "python.linting.flake8Enabled": true, - "python.linting.flake8Args": [ - "--ignore=W293" + "python.testing.unittestEnabled": false, + "python.analysis.extraPaths": [ + "test" ], "cmake.configureOnOpen": false, "cmake.buildDirectory": "${workspaceFolder}/build/${variant:variant}/${buildKit}", "cmake.configureSettings": { - "BUILD_KIT": "${buildKit}" + "BUILD_KIT": "${buildKit}", + "CMAKE_MESSAGE_LOG_LEVEL": "STATUS" }, "cmake.generator": "Ninja", "cmake.debugConfig": { @@ -25,7 +21,10 @@ }, "cmake.configureOnEdit": false, "cmake.buildBeforeRun": false, - "cmake.environment": {}, + "cmake.environment": { + "PIPENV_VERBOSITY": "-1", + "PIPENV_VENV_IN_PROJECT": "1" + }, "cmake.buildToolArgs": [], "git.ignoreLimitWarning": true, "C_Cpp.errorSquiggles": "enabled", @@ -38,11 +37,6 @@ "Jenkinsfile": "groovy", "*.py": "python" }, - "files.exclude": { - "**/.git": true, - "**/.DS_Store": true, - "**/Thumbs.db": true - }, "git.repositoryScanMaxDepth": 3, "git-graph.maxDepthOfRepoSearch": 3, "[python]": { diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/CMakeLists.txt b/src/project_creator/templates/project/{{cookiecutter.name}}/CMakeLists.txt index 5bd2ffa..50166d1 100644 --- a/src/project_creator/templates/project/{{cookiecutter.name}}/CMakeLists.txt +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/CMakeLists.txt @@ -1,15 +1,21 @@ # cmake project definition -cmake_minimum_required(VERSION 3.22.0) +cmake_minimum_required(VERSION 3.24.0) +cmake_policy(VERSION 3.24) -set(VARIANT ${FLAVOR}/${SUBSYSTEM} CACHE STRING "Variant to build.") set(BUILD_KIT prod CACHE STRING "Target Group to build.") include(${CMAKE_SOURCE_DIR}/variants/${VARIANT}/config.cmake) -project(${VARIANT} CXX C ASM) +if(BUILD_KIT STREQUAL prod) + project(${VARIANT} C ASM) +else() + project(${VARIANT} C ASM CXX) + set(VARIANT_ADDITIONAL_COMPILE_C_FLAGS -Dstatic= -save-temps) +endif() -# Fetch all extensions into modules directory +# Fetch all external dependencies into modules directory set(FETCHCONTENT_BASE_DIR ${CMAKE_SOURCE_DIR}/build/modules CACHE INTERNAL "") +set(FETCHCONTENT_QUIET FALSE) include(FetchContent) # Include spl-core @@ -17,6 +23,7 @@ if(DEFINED ENV{SPLCORE_PATH}) message(WARNING "SPLCORE_PATH defined! Use fixed SPL-CORE version from: $ENV{SPLCORE_PATH}") include($ENV{SPLCORE_PATH}/cmake/spl.cmake) else() + # Fetch spl-core FetchContent_Declare( spl-core GIT_REPOSITORY https://github.com/avengineers/spl-core.git @@ -24,6 +31,7 @@ else() ) FetchContent_MakeAvailable(spl-core) + # Include spl-core include(${spl-core_SOURCE_DIR}/cmake/spl.cmake) endif() diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/KConfig b/src/project_creator/templates/project/{{cookiecutter.name}}/KConfig index d2f2154..f024d83 100644 --- a/src/project_creator/templates/project/{{cookiecutter.name}}/KConfig +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/KConfig @@ -1,4 +1,4 @@ -mainmenu "SPL Nano" +mainmenu "SPL Example" menu "Linking" config LINKER_OUTPUT_FILE diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/Pipfile b/src/project_creator/templates/project/{{cookiecutter.name}}/Pipfile index 7a94529..87182d5 100644 --- a/src/project_creator/templates/project/{{cookiecutter.name}}/Pipfile +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/Pipfile @@ -4,25 +4,30 @@ verify_ssl = true name = "pypi" [packages] -conan = {version="==1.59.0"} cookiecutter = "*" gcovr = "*" hammocking = "*" kconfiglib = "*" +jinja2 = "*" pytest = "*" -pytest-cov = "*" -pipenv = "*" +pytest-env = "*" +testfixtures = "*" +junitparser = "*" +mashumaro = "*" +loguru = "*" +black = "*" +flake8 = "*" sphinx = "*" sphinx-rtd-theme = "*" sphinxcontrib-mermaid = "*" sphinx-needs = "*" -sphinxcontrib-plantuml = "*" sphinx-test-reports = "*" doxysphinx = "*" - -[dev-packages] -flake8 = "*" -black = "*" +sphinx-rtd-size = "*" +sphinxcontrib-datatemplates = "*" +pyelftools = "*" +sphinxcontrib-plantuml = "*" +pipenv = "*" [requires] python_version = "3.11" diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/build.bat b/src/project_creator/templates/project/{{cookiecutter.name}}/build.bat index 8279795..b159d6a 100644 --- a/src/project_creator/templates/project/{{cookiecutter.name}}/build.bat +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/build.bat @@ -1,3 +1 @@ -pushd %~dp0 -powershell -ExecutionPolicy Bypass -File .\build.ps1 %* || exit /b 1 -popd +powershell -ExecutionPolicy Bypass -File %~dp0build.ps1 %* || exit /b 1 diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/build.ps1 b/src/project_creator/templates/project/{{cookiecutter.name}}/build.ps1 index f3b3ecf..df7219a 100644 --- a/src/project_creator/templates/project/{{cookiecutter.name}}/build.ps1 +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/build.ps1 @@ -1,9 +1,9 @@ <# .DESCRIPTION - Wrapper for installing dependencies, running and testing the project + Wrapper for installing dependencies and building the product. .Notes -On Windows, it may be required to call this script with the proper execution policy. + On Windows, it may be required to call this script with the proper execution policy. You can do this by issuing the following PowerShell command: PS C:\> powershell -ExecutionPolicy Bypass -File .\build.ps1 @@ -13,24 +13,25 @@ https://go.microsoft.com/fwlink/?LinkID=135170 #> param( + [Parameter(Mandatory = $false, HelpMessage = 'Install all dependencies required to build. (Switch, default: false)')] + [switch]$install = $false, [Parameter(Mandatory = $false, HelpMessage = 'Clean build, wipe out all build artifacts. (Switch, default: false)')] [switch]$clean = $false, - [Parameter(Mandatory = $false, HelpMessage = 'Install mandatory packages. (Switch, default: false)')] - [switch]$install = $false, + [Parameter(Mandatory = $false, HelpMessage = 'Build kit to be used. (String, default: "prod")')] + [string]$buildKit = "prod", [Parameter(Mandatory = $false, HelpMessage = 'Target to be built. (String, default: "all")')] [string]$target = "all", - [Parameter(Mandatory = $false, HelpMessage = 'Variants (projects) to be built (List of strings, leave empty to be asked or "all" for automatic build of all variants)')] - [ValidateNotNullOrEmpty()] - [string[]]$variants, - [Parameter(Mandatory = $false, HelpMessage = 'filter for selftests; define in pytest syntax: https://docs.pytest.org/en/6.2.x/usage.html; e.g. "PYRO_C or test/test_unittests.py"')] + [Parameter(Mandatory = $false, HelpMessage = 'Variants (of the product) to be built (List of strings, leave empty to be asked or "all" for automatic build of all variants)')] + [string[]]$variants = $null, + [Parameter(Mandatory = $false, HelpMessage = 'filter for selftests; define in pytest syntax: https://docs.pytest.org/en/6.2.x/usage.html; e.g. "Disco or test_CustA__Disco.py"')] [string]$filter = "", [Parameter(Mandatory = $false, HelpMessage = 'Additional build arguments for Ninja (e.g., "-d explain -d keepdepfile" for debugging purposes)')] [string]$ninjaArgs = "", - [Parameter(Mandatory = $false, HelpMessage = 'Delete CMake cache and reconfigure')] - [switch]$reconfigure + [Parameter(Mandatory = $false, HelpMessage = 'Delete CMake cache and reconfigure. (Switch, default: false)')] + [switch]$reconfigure = $false ) -# Call a command and handle exit code +# Call a command and handle its exit code Function Invoke-CommandLine { [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingInvokeExpression', '', Justification = 'Usually this statement must be avoided (https://learn.microsoft.com/en-us/powershell/scripting/learn/deep-dives/avoid-using-invoke-expression?view=powershell-7.3), here it is OK as it does not execute unknown code.')] param ( @@ -48,11 +49,11 @@ Function Invoke-CommandLine { Invoke-Expression $CommandLine if ($global:LASTEXITCODE -ne 0) { if ($StopAtError) { - Write-Error "Command line call `"$CommandLine`" failed with exit code $global:LASTEXITCODE" + Write-Error "Command line call '$CommandLine' failed with exit code $global:LASTEXITCODE" } else { if (-Not $Silent) { - Write-Output "Command line call `"$CommandLine`" failed with exit code $global:LASTEXITCODE, continuing ..." + Write-Output "Command line call '$CommandLine' failed with exit code $global:LASTEXITCODE, continuing ..." } } } @@ -73,28 +74,64 @@ function Test-RunningInCIorTestEnvironment { return [Boolean]($Env:JENKINS_URL -or $Env:PYTEST_CURRENT_TEST -or $Env:GITHUB_ACTIONS) } -# start CMake with given targets -Function Invoke-CMake-Build([String] $Target, [String] $Variants, [String] $Filter, [String] $NinjaArgs, [bool] $Clean, [bool] $Reconfigure) { - if ("selftests" -eq $Target) { +# Build with given parameters +Function Invoke-Build { + param ( + [Parameter(Mandatory = $false)] + [bool]$clean = $false, + [Parameter(Mandatory = $false)] + [string]$buildKit = "prod", + [Parameter(Mandatory = $true)] + [string]$target = "all", + [Parameter(Mandatory = $false)] + [string[]]$variants = $null, + [Parameter(Mandatory = $false)] + [string]$filter = "", + [Parameter(Mandatory = $false)] + [string]$ninjaArgs = "", + [Parameter(Mandatory = $false)] + [bool]$reconfigure = $false + ) + if ("selftests" -eq $target) { + # Run python tests to test all relevant variants and platforms (build kits) + # (normally run in CI environment/Jenkins) + Write-Output "Running all selfstests ..." + + # Build folder for CMake builds $buildFolder = "build" - # fresh and clean build - if ($Clean) { + + # fresh and clean CMake builds + if ($clean) { if (Test-Path -Path $buildFolder) { + Write-Output "Removing build folder '$buildFolder' ..." Remove-Item $buildFolder -Force -Recurse } } - # Run test cases to be found in folder test/ - # consider Filter if given + # Filter pytest test cases $filterCmd = '' - if ($Filter) { - $filterCmd = "-k '$Filter'" + # Consider environment variable BRANCH_NAME (e.g. on Jenkins) to filter tests in release branch builds + if ($Env:BRANCH_NAME -and ($Env:BRANCH_NAME -match 'release/([^/]+/[^/]+)(.*)')) { + $filterCmd = "-k " + $Matches[1] + } + # otherwise consider command line option '-filter' if given + elseif ($filter) { + $filterCmd = "-k '$filter'" + } + + # Test result of pytest + $pytestJunitXml = "test/output/test-report.xml" + + # Delete any old pytest result + if (Test-Path -Path $pytestJunitXml) { + Remove-Item $pytestJunitXml -Force } - Invoke-CommandLine -CommandLine "python -m pipenv run python -m pytest test --capture=tee-sys --junitxml=test/output/test-report.xml -o junit_logging=all $filterCmd" + # Finally run pytest + Invoke-CommandLine -CommandLine "python -m pipenv run python -m pytest test --junitxml=$pytestJunitXml $filterCmd" } else { - if ((-Not $Variants) -or ($Variants -eq 'all')) { + if ((-Not $variants) -or ($variants -eq 'all')) { $dirs = Get-Childitem -Include config.cmake -Path variants -Recurse | Resolve-Path -Relative $variantsList = @() Foreach ($dir in $dirs) { @@ -102,8 +139,8 @@ Function Invoke-CMake-Build([String] $Target, [String] $Variants, [String] $Filt $variantsList += $variant } $variantsSelected = @() - if (-Not $Variants) { - # variant selection if not specified + if (-Not $variants) { + # variant selection by user if not specified Write-Information -Tags "Info:" -MessageData "no '--variant ' was given, please select from list:" Foreach ($variant in $variantsList) { Write-Information -Tags "Info:" -MessageData ("(" + [array]::IndexOf($variantsList, $variant) + ") " + $variant) @@ -112,6 +149,7 @@ Function Invoke-CMake-Build([String] $Target, [String] $Variants, [String] $Filt Write-Information -Tags "Info:" -MessageData "Selected variant is: $variantsSelected" } else { + # otherwise build all variants $variantsSelected = $variantsList } } @@ -119,21 +157,25 @@ Function Invoke-CMake-Build([String] $Target, [String] $Variants, [String] $Filt $variantsSelected = $Variants.Replace('\', '/').Replace('./variant/', '').Replace('./variants/', '').Split(',') } + # Select 'test' build kit based on target + if ($target.Contains("unittests") -or $target.Contains("reports")) { + $buildKit = "test" + } + Foreach ($variant in $variantsSelected) { - $buildKit = "prod" - if ($Target.Contains("unittests")) { - $buildKit = "test" - } + Write-Output "Building target '$target' with build kit '$buildKit' for variant '$variant' ..." + $buildFolder = "build/$variant/$buildKit" # fresh and clean build - if ($Clean) { + if ($clean) { if (Test-Path -Path $buildFolder) { + Write-Output "Removing build folder '$buildFolder' ..." Remove-Item $buildFolder -Force -Recurse } } # delete CMake cache and reconfigure - if ($Reconfigure) { + if ($reconfigure) { if (Test-Path -Path "$buildFolder/CMakeCache.txt") { Remove-Item "$buildFolder/CMakeCache.txt" -Force } @@ -142,29 +184,27 @@ Function Invoke-CMake-Build([String] $Target, [String] $Variants, [String] $Filt } } - # CMake configure and generate - $variantDetails = $variant.Split('/') - $platform = $variantDetails[0] - $subsystem = $variantDetails[1] - $additionalConfig = "-DBUILD_KIT=`"$buildKit`"" + # CMake configure + $additionalConfig = "-DBUILD_KIT='$buildKit'" if ($buildKit -eq "test") { - $additionalConfig += " -DCMAKE_TOOLCHAIN_FILE=`"tools/toolchains/gcc/toolchain.cmake`"" + $additionalConfig += " -DCMAKE_TOOLCHAIN_FILE='tools/toolchains/gcc/toolchain.cmake'" } - Invoke-CommandLine -CommandLine "python -m pipenv run cmake -B '$buildFolder' -G Ninja -DFLAVOR=`"$platform`" -DSUBSYSTEM=`"$subsystem`" $additionalConfig" + Invoke-CommandLine -CommandLine "python -m pipenv run cmake -B '$buildFolder' -G Ninja -DVARIANT='$variant' $additionalConfig" # CMake clean all dead artifacts. Required when running incremented builds to delete obsolete artifacts. - Invoke-CommandLine -CommandLine "python -m pipenv run cmake --build '$buildFolder' --target $Target -- -t cleandead" + Invoke-CommandLine -CommandLine "python -m pipenv run cmake --build '$buildFolder' --target $target -- -t cleandead" # CMake build - Invoke-CommandLine -CommandLine "python -m pipenv run cmake --build '$buildFolder' --target $Target -- $NinjaArgs" + Invoke-CommandLine -CommandLine "python -m pipenv run cmake --build '$buildFolder' --target $target -- $ninjaArgs" } } } ## start of script -# Always set the $InformationPreference variable to "Continue" globally, this way it gets printed on execution and continues execution afterwards. +# Always set the $InformationPreference variable to "Continue" globally, +# this way it gets printed on execution and continues execution afterwards. $InformationPreference = "Continue" -# Stop on first PS error +# Stop on first error $ErrorActionPreference = "Stop" Push-Location $PSScriptRoot @@ -172,29 +212,28 @@ Write-Output "Running in ${pwd}" try { if ($install) { + # Installation of Scoop, Python and pipenv via bootstrap if (-Not (Test-Path -Path '.bootstrap')) { New-Item -ItemType Directory '.bootstrap' } - # Installation of Scoop, Python and pipenv via bootstrap - Invoke-RestMethod "https://raw.githubusercontent.com/avengineers/bootstrap/develop/bootstrap.ps1" -OutFile ".\.bootstrap\bootstrap.ps1" + Invoke-RestMethod "https://raw.githubusercontent.com/avengineers/bootstrap/v1.3.0/bootstrap.ps1" -OutFile ".\.bootstrap\bootstrap.ps1" Invoke-CommandLine ". .\.bootstrap\bootstrap.ps1" -Silent $true Write-Output "For installation changes to take effect, please close and re-open your current shell." - - . .\tools\setup\git-config.ps1 } else { - if ($clean) { - # Remove all build artifacts - $buildDir = ".\build" - if (Test-Path -Path $buildDir) { - Remove-Item $buildDir -Force -Recurse - } - } + # Call build system if (Test-RunningInCIorTestEnvironment -or $Env:USER_PATH_FIRST) { Initialize-EnvPath } # Call CMake - Invoke-CMake-Build -Target $target -Variants $variants -Filter $filter -NinjaArgs $ninjaArgs -Clean $clean -Reconfigure $reconfigure + Invoke-Build ` + -target $target ` + -buildKit $buildKit ` + -variants $variants ` + -clean $clean ` + -reconfigure $reconfigure ` + -ninjaArgs $ninjaArgs ` + -filter $filter } } finally { diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/conf.py b/src/project_creator/templates/project/{{cookiecutter.name}}/conf.py index 6c265c6..50ebd2e 100644 --- a/src/project_creator/templates/project/{{cookiecutter.name}}/conf.py +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/conf.py @@ -1,71 +1,46 @@ -# Configuration file for the Sphinx documentation builder. -# -# For the full list of built-in configuration values, see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Project information ----------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information +# -*- coding: utf-8 -*- +""" Configuration """ import json import os +import datetime +import re +day = datetime.date.today() +# meta data ################################################################# project = "Project" -copyright = "2023" -author = "RMT" -release = "0.0.0" - -# -- General configuration --------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration - -extensions = [] -exclude_patterns = [".git", ".venv", "build/modules", "**/.venv"] -include_patterns = ["index.rst", "doc/**"] +copyright = f"{day.year} Avengineers" +release = f"{day}" +# file handling ############################################################# +# @see https://www.sphinx-doc.org/en/master/usage/configuration.html -# mermaid config - @see https://pypi.org/project/sphinxcontrib-mermaid/ -extensions.append("sphinxcontrib.mermaid") - -# sphinx_needs -extensions.append("sphinx_needs") - - -# needs_types - this option allows the setup of own need types like bugs, user_stories and more. - -needs_types = [ - dict(directive="req", title="Requirement", prefix="R_", color="#BFD8D2", style="node"), - dict(directive="spec", title="Specification", prefix="S_", color="#FEDCD2", style="node"), - dict(directive="impl", title="Implementation", prefix="I_", color="#DF744A", style="node"), - dict(directive="test", title="Test Case", prefix="T_", color="#DCB239", style="node"), - # Kept for backwards compatibility - dict(directive="need", title="Need", prefix="N_", color="#9856a5", style="node"), - dict(directive="image", title="Image", prefix="IMG_", color="#FFCC00", style="node"), +templates_path = [ + "doc/_tmpl", ] -# Define own options -needs_extra_options = ["integrity", "assignee", "version"] - -# Define own link types - -needs_extra_links = [ - {"option": "checks", "incoming": "is checked by", "outgoing": "checks"}, - {"option": "implements", "incoming": "is implemented by", "outgoing": "implements"}, - {"option": "tests", "incoming": "is tested by", "outgoing": "tests requirement(s)"}, - {"option": "results", "incoming": "is resulted from", "outgoing": "test results"}, - {"option": "requirement", "incoming": "specification", "outgoing": "requirement"}, - {"option": "specified", "incoming": "tested by", "outgoing": "specified by"}, +exclude_patterns = [ + "README.md", + "build/modules", + "build/deps", + ".venv", + ".git", + "**/test_results.rst", # We renamed this file, but nobody deletes it. ] +include_patterns = ["index.rst", "doc/**"] -# sphinxcontrib-test-reports -extensions.append("sphinxcontrib.test_reports") -tr_report_template = "doc/test_report_template.txt" +# configuration of built-in stuff ########################################### +# @see https://www.sphinx-doc.org/en/master/usage/configuration.html + +numfig = True -# The suffix of source filenames. -source_suffix = [".rst"] +# html config ############################################################### +# @see https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output -# -- Options for HTML output ------------------------------------------------- -# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output +# Omit "documentation" in title +html_title = f"{project} {release}" html_theme = "sphinx_rtd_theme" @@ -88,14 +63,116 @@ "titles_only": False, } +# EXTENSIONS AND THEIR CONFIGS ############################################## +extensions = ["sphinx_rtd_size"] + +sphinx_rtd_size_width = "90%" + +# mermaid config - @see https://pypi.org/project/sphinxcontrib-mermaid/ ##### +extensions.append("sphinxcontrib.mermaid") + +# sphinx_needs ############################################################### +extensions.append("sphinx_needs") + +# test_reports ############################################################### +extensions.append("sphinxcontrib.test_reports") +tr_report_template = "doc/test_report_template.txt" + + +def tr_link(app, need, needs, first_option_name, second_option_name, *args, **kwargs): + """Make links between 'needs'. In comparison to the default 'tr_link' function, + this function supports regular expression pattern matching.""" + if first_option_name not in need: + return "" + # Get the value of the 'first_option_name' + first_option_value = need[first_option_name] + + links = [] + for need_target in needs.values(): + # Skip linking to itself + if need_target["id"] == need["id"]: + continue + if second_option_name not in need_target: + continue + + if first_option_value is not None and len(first_option_value) > 0: + second_option_value = need_target[second_option_name] + if second_option_value is not None and len(second_option_value) > 0: + if first_option_value == second_option_value: + links.append(need_target["id"]) + # if the first option value has a *, use regex matching + elif "*" in first_option_value: + if re.match(first_option_value, second_option_value): + links.append(need_target["id"]) + + return links + + +needs_functions = [tr_link] + +extensions.append("sphinx.ext.todo") + +# Render Your Data Readable ################################################## +# Enables adding Jupyter notebooks to toctree +# @see https://sphinxcontribdatatemplates.readthedocs.io/en/latest/index.html +extensions.append("sphinxcontrib.datatemplates") + +# needs_types - this option allows the setup of own need types like bugs, user_stories and more. +needs_types = [ + dict( + directive="req", title="Requirement", prefix="R_", color="#BFD8D2", style="node" + ), + dict( + directive="spec", + title="Specification", + prefix="S_", + color="#FEDCD2", + style="node", + ), + dict( + directive="impl", + title="Implementation", + prefix="I_", + color="#DF744A", + style="node", + ), + dict( + directive="test", title="Test Case", prefix="T_", color="#DCB239", style="node" + ), +] + + +# Define own options +needs_extra_options = ["integrity", "assignee", "version"] + + +# Define own link types +needs_extra_links = [ + # SWE.3 BP.5: link from Implementation (Software unit) to Specification (Software detailed design) + {"option": "implements", "incoming": "is implemented by", "outgoing": "implements"}, + # SWE.4 BP.5: link from Test Case (Unit test specification) to Specification (Software detailed design) + {"option": "tests", "incoming": "is tested by", "outgoing": "tests"}, + # SWE.4 BP.5: link from Test Case (Unit test specification) to Test Result (Unit test result) + {"option": "results", "incoming": "is resulted from", "outgoing": "results"}, +] + +# Link tests results to the test cases +needs_global_options = { + "results": "[[tr_link('title', 'case')]]", +} + +# Provide all config values to jinja +html_context = { + "build_config": {}, + "config": {}, +} + # Check if the SPHINX_BUILD_CONFIGURATION_FILE environment variable exists # and if so, load the JSON file and set the 'html_context' variable if "SPHINX_BUILD_CONFIGURATION_FILE" in os.environ: with open(os.environ["SPHINX_BUILD_CONFIGURATION_FILE"], "r") as file: - html_context = json.load(file) - include_patterns.extend(html_context.get("include_patterns", [])) - -html_context["config"] = {} + html_context["build_config"] = json.load(file) + include_patterns.extend(html_context["build_config"].get("include_patterns", [])) # Check if the SPHINX_BUILD_CONFIGURATION_FILE environment variable exists # and if so, load the JSON file and set the 'html_context' variable @@ -104,7 +181,7 @@ html_context["config"] = json.load(file)["features"] if "VARIANT" in os.environ: - html_context["config"]["variant"] = os.environ["VARIANT"] + html_context["build_config"]["variant"] = os.environ["VARIANT"] def rstjinja(app, docname, source): diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/doc/Doxyfile.in b/src/project_creator/templates/project/{{cookiecutter.name}}/doc/Doxyfile.in index 4ca24cb..21f6be3 100644 --- a/src/project_creator/templates/project/{{cookiecutter.name}}/doc/Doxyfile.in +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/doc/Doxyfile.in @@ -42,7 +42,7 @@ DOXYFILE_ENCODING = UTF-8 # title of most generated pages and in a few other places. # The default value is: My Project. -PROJECT_NAME = @DOXYGEN_PROJECT_NAME@ +PROJECT_NAME = "Source Code" # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version @@ -2394,7 +2394,7 @@ SKIP_FUNCTION_MACROS = YES # the path). If a tag file is not located in the directory in which doxygen is # run, you must also specify the path to the tagfile here. -TAGFILES = swunit.tag=swunit.tag +# TAGFILES = swunit.tag=swunit.tag # When a file name is specified after GENERATE_TAGFILE, doxygen will create a # tag file that is based on the input files it reads. See section "Linking to diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/doc/components/index.rst b/src/project_creator/templates/project/{{cookiecutter.name}}/doc/components/index.rst new file mode 100644 index 0000000..a536b44 --- /dev/null +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/doc/components/index.rst @@ -0,0 +1,23 @@ +Components +========== + +{% for component_info in build_config.components_info %} +{% if component_info.has_docs %} + +{{ component_info.long_name }} +-------------------- + +.. toctree:: + :maxdepth: 2 + + /{{ component_info.path }}/doc/index +{% if (build_config.target == 'reports') and component_info.has_reports %} + /{{ component_info.reports_output_dir }}/unit_test_spec + /{{ component_info.reports_output_dir }}/unit_test_results + /{{ component_info.reports_output_dir }}/doxygen/html/index + /{{ component_info.reports_output_dir }}/coverage +{% endif %} + + +{% endif %} +{% endfor %} diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/doc/software_architecture/index.rst b/src/project_creator/templates/project/{{cookiecutter.name}}/doc/software_architecture/index.rst new file mode 100644 index 0000000..93fbec1 --- /dev/null +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/doc/software_architecture/index.rst @@ -0,0 +1,2 @@ +Software Architecture +===================== diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/doc/software_requirements/index.rst b/src/project_creator/templates/project/{{cookiecutter.name}}/doc/software_requirements/index.rst new file mode 100644 index 0000000..34482e0 --- /dev/null +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/doc/software_requirements/index.rst @@ -0,0 +1,7 @@ +Software Requirements +##################### + +.. req:: Requirement 001 + :status: open + + ... diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/doc/test_report_template.txt b/src/project_creator/templates/project/{{cookiecutter.name}}/doc/test_report_template.txt index e1fb235..a858ac0 100644 --- a/src/project_creator/templates/project/{{cookiecutter.name}}/doc/test_report_template.txt +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/doc/test_report_template.txt @@ -1,41 +1,38 @@ -**Statistics** - -| Test cases: :need_count:`'{id}' in tags and type=='{case_need}'` -| Failed test cases: :need_count:`'{id}' in tags and 'failure' == result and type=='{case_need}'` -| Passed test cases: :need_count:`'{id}' in tags and 'passed' == result and type=='{case_need}'` -| Skipped test cases: :need_count:`'{id}' in tags and 'skipped' == result and type=='{case_need}'` -| Test suites: :need_count:`'{id}' in tags and type=='{suite_need}'` - -**Failed test cases**: +Passed test cases +----------------- .. needtable:: - :filter: type == '{case_need}' and 'failure' == result + :filter: '{id}' in tags and type == '{case_need}' and 'passed' == result :columns: id, title, is resulted from :style: table -**Passed test cases**: +Failed test cases +----------------- .. needtable:: - :filter: type == '{case_need}' and 'passed' == result + :filter: '{id}' in tags and type == '{case_need}' and 'failure' == result :columns: id, title, is resulted from :style: table -**Skipped test cases**: +Skipped test cases +------------------ .. needtable:: - :filter: type == '{case_need}' and 'skipped' == result + :filter: '{id}' in tags and type == '{case_need}' and 'skipped' == result :columns: id, title, is resulted from :style: table -**New table**: +Statistics +---------- -.. needtable:: - :filter: type == 'test' - :columns: id, title, specified by, test results - :style: table - -**Imported data** +| Test cases: :need_count:`'{id}' in tags and type=='{case_need}'` +| Failed test cases: :need_count:`'{id}' in tags and 'failure' == result and type=='{case_need}'` +| Passed test cases: :need_count:`'{id}' in tags and 'passed' == result and type=='{case_need}'` +| Skipped test cases: :need_count:`'{id}' in tags and 'skipped' == result and type=='{case_need}'` +| Test suites: :need_count:`'{id}' in tags and type=='{suite_need}'` +Details +------- .. {file_type}:: {title} :id: {id}{links_string} diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/index.rst b/src/project_creator/templates/project/{{cookiecutter.name}}/index.rst index 398b1b4..297d666 100644 --- a/src/project_creator/templates/project/{{cookiecutter.name}}/index.rst +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/index.rst @@ -1,6 +1,38 @@ -Table of Contents -================= +{% if build_config.component_info %} -**Variant:** {{ config.variant }} +Software Component Report +######################### -{{ generated_rst_content }} +| **Variant:** {{ build_config.variant }} +| **Component:** {{ build_config.component_info.long_name }} + +.. toctree:: + :maxdepth: 2 + + {{ build_config.component_info.path }}/doc/index +{% if build_config.component_info.has_reports %} + {{ build_config.component_info.reports_output_dir }}/unit_test_spec + {{ build_config.component_info.reports_output_dir }}/unit_test_results + {{ build_config.component_info.reports_output_dir }}/doxygen/html/index + {{ build_config.component_info.reports_output_dir }}/coverage +{% endif %} + +{% else %} + +Variant Report +############## + +**Variant:** {{ build_config.variant }} + +.. toctree:: + :maxdepth: 1 + :caption: Contents + + doc/software_requirements/index + doc/software_architecture/index + doc/components/index +{% if build_config.target == 'reports' %} + {{ build_config.reports_output_dir }}/coverage +{% endif %} + +{% endif %} diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/install-mandatory.bat b/src/project_creator/templates/project/{{cookiecutter.name}}/install-mandatory.bat index 935d73e..2e83f46 100644 --- a/src/project_creator/templates/project/{{cookiecutter.name}}/install-mandatory.bat +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/install-mandatory.bat @@ -1,5 +1 @@ -@echo off - -pushd %~dp0 -call build.bat -install %* || exit /b 1 -popd +call %~dp0build.bat -install %* || exit /b 1 diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/pytest.ini b/src/project_creator/templates/project/{{cookiecutter.name}}/pytest.ini index 142a135..2bdf96e 100644 --- a/src/project_creator/templates/project/{{cookiecutter.name}}/pytest.ini +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/pytest.ini @@ -6,5 +6,4 @@ testpaths = junit_logging = all addopts = --capture=tee-sys - --junitxml=test/output/test-report.xml --verbose diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/scoopfile.json b/src/project_creator/templates/project/{{cookiecutter.name}}/scoopfile.json index a5b8d68..1127d64 100644 --- a/src/project_creator/templates/project/{{cookiecutter.name}}/scoopfile.json +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/scoopfile.json @@ -1,9 +1,5 @@ { "buckets": [ - { - "Name": "versions", - "Source": "https://github.com/ScoopInstaller/Versions" - }, { "Name": "main", "Source": "https://github.com/ScoopInstaller/Main" @@ -11,16 +7,41 @@ { "Name": "extras", "Source": "https://github.com/ScoopInstaller/Extras" + }, + { + "Name": "versions", + "Source": "https://github.com/ScoopInstaller/Versions" } ], "apps": [ + { + "Source": "main", + "Name": "lessmsi" + }, + { + "Source": "main", + "Name": "7zip" + }, + { + "Source": "main", + "Name": "innounp" + }, + { + "Source": "main", + "Name": "dark" + }, + { + "Source": "main", + "Name": "graphviz" + }, { "Source": "versions", "Name": "python311" }, { "Source": "versions", - "Name": "mingw-winlibs-llvm-ucrt" + "Name": "mingw-winlibs-llvm-ucrt", + "Version": "13.2.0-16.0.6-11.0.0-r1" } ] -} +} \ No newline at end of file diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/CMakeLists.txt b/src/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/CMakeLists.txt index 3038b9e..322985f 100644 --- a/src/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/CMakeLists.txt +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/CMakeLists.txt @@ -1,3 +1,3 @@ spl_add_source(src/component.c) spl_add_test_source(test/test_component.cc) -spl_create_component() +spl_create_component(LONG_NAME "Component") diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/doc/index.rst b/src/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/doc/index.rst index c2f95e4..c2a1dfa 100644 --- a/src/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/doc/index.rst +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/doc/index.rst @@ -1,9 +1,8 @@ -Welcome to Component documentation -################################## +Software Detailed Design +======================== -.. toctree:: - :maxdepth: 1 - :caption: Contents: +.. contents:: Table of Contents + :depth: 2 design /doc/common/index \ No newline at end of file diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/test/test_component.cc b/src/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/test/test_component.cc index d424e38..6295bdb 100644 --- a/src/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/test/test_component.cc +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/component/test/test_component.cc @@ -21,7 +21,7 @@ extern "C" * * .. test:: component.test_someInterfaceOfComponent * :id: T_001 -* :specified: S_001, S_002 +* :tests: S_001, S_002 * :results: [[tr_link('title', 'case')]] * * Some test specification @@ -43,7 +43,7 @@ TEST(component, test_someInterfaceOfComponent) * * .. test:: component.test_someInterfaceOfComponent2 * :id: T_002 -* :specified: S_001 +* :tests: S_001 * :results: [[tr_link('title', 'case')]] * * Some test specification 2 diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/main/CMakeLists.txt b/src/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/main/CMakeLists.txt index a4885aa..444f40e 100644 --- a/src/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/main/CMakeLists.txt +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/main/CMakeLists.txt @@ -1,2 +1,2 @@ spl_add_source(src/main.c) -spl_create_component() +spl_create_component(LONG_NAME "Main") diff --git a/src/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/main/doc/index.rst b/src/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/main/doc/index.rst index 99f6473..3f515eb 100644 --- a/src/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/main/doc/index.rst +++ b/src/project_creator/templates/project/{{cookiecutter.name}}/{% if cookiecutter.touch_components -%} components {%- endif %}/main/doc/index.rst @@ -1,5 +1,11 @@ -Welcome to Main documentation -############################# +Software Detailed Design +======================== + +.. contents:: Table of Contents + :depth: 2 + +Introduction +------------ This is the documentation for the ``Main`` component. diff --git a/tests/test_documentation.py b/tests/test_documentation.py index d13315c..d3f46bf 100644 --- a/tests/test_documentation.py +++ b/tests/test_documentation.py @@ -1,4 +1,3 @@ -from os import makedirs from tests.utils import ExecutionTime, TestWorkspace @@ -7,11 +6,13 @@ class TestDocumentation: def setup_class(cls): # create a new test workspace cls.workspace: TestWorkspace = TestWorkspace("test_documentation") + cls.variant_name = "Flv1/Sys1" + cls.component_paths = ["components/main", "components/component"] def test_build_docs(self): - # create build output directory for build_kit "test" - build_dir_test = self.workspace.workspace_artifacts.get_build_dir("Flv1/Sys1", "test") - makedirs(build_dir_test, exist_ok=False) + build_dir_test = self.workspace.workspace_artifacts.get_build_dir( + self.variant_name, "test" + ) "Call IUT" with ExecutionTime("CMake Configure (build_kit: test)"): @@ -22,24 +23,58 @@ def test_build_docs(self): "Call IUT" with ExecutionTime("CMake (build_kit: test, target=docs)"): - assert 0 == self.workspace.run_cmake_build(build_kit="test", target="docs").returncode + assert ( + 0 + == self.workspace.run_cmake_build( + build_kit="test", target="docs" + ).returncode + ) - assert build_dir_test.joinpath("components/component/docs/html/index.html").exists() - assert build_dir_test.joinpath("components/component/docs/html/components/component/doc/index.html").exists() - assert build_dir_test.joinpath("components/component/docs/html/components/component/doc/design.html").exists() - assert build_dir_test.joinpath("components/component/docs/html/_images/screenshot.png").exists() + assert build_dir_test.joinpath("docs/html/index.html").exists() + assert build_dir_test.joinpath( + "docs/html/components/main/doc/index.html" + ).exists() + assert build_dir_test.joinpath( + "docs/html/components/component/doc/index.html" + ).exists() - "Call IUT" - with ExecutionTime("CMake (build_kit: test, target=reports)"): - assert 0 == self.workspace.run_cmake_build(build_kit="test", target="reports").returncode + def test_build_reports(self): + build_dir_test = self.workspace.workspace_artifacts.get_build_dir( + self.variant_name, "test" + ) - assert build_dir_test.joinpath("components/component/reports/html/index.html").exists() - assert build_dir_test.joinpath("components/component/reports/doxygen/html/index.html").exists() - assert build_dir_test.joinpath("components/component/reports/doxygen/html/index.rst").exists() + "Call IUT" + with ExecutionTime("CMake Configure (build_kit: test)"): + assert 0 == self.workspace.run_cmake_configure(build_kit="test").returncode - # Delete the config.json files and run the build again - this should retrigger cmake configure and not fail - build_dir_test.joinpath("components/component/reports/config.json").unlink() + "Expected configuration output" + assert build_dir_test.joinpath("build.ninja").exists() "Call IUT" with ExecutionTime("CMake (build_kit: test, target=reports)"): - assert 0 == self.workspace.run_cmake_build(build_kit="test", target="reports").returncode + assert ( + 0 + == self.workspace.run_cmake_build( + build_kit="test", target="reports" + ).returncode + ) + + assert build_dir_test.joinpath("reports/html/index.html").exists() + + project_root_dir = self.workspace.workspace_artifacts.root_dir + rel_build_dir = build_dir_test.relative_to(project_root_dir) + for component_path in self.component_paths: + assert build_dir_test.joinpath( + f"reports/html/{component_path}/doc/index.html" + ).exists(), "Component documenation expected but not found" + # if there are any files in the component test dir + if len(list(project_root_dir.joinpath(component_path).glob("test/*"))): + for file in [ + "unit_test_spec.html", + "unit_test_results.html", + "coverage.html", + "coverage/index.html", + ]: + assert build_dir_test.joinpath( + f"reports/html/{rel_build_dir}/{component_path}/reports/{file}" + ).exists(), f"Component test {file} expected but not found"