diff --git a/Makefile b/Makefile index c2c0399..94084e2 100644 --- a/Makefile +++ b/Makefile @@ -82,7 +82,6 @@ vulture: ## check unused code darglint: ## check docstrings darglint pddl scripts/whitelist.py - darglint aea test: ## run tests quickly with the default Python pytest tests --doctest-modules \ diff --git a/Pipfile b/Pipfile index 3d655a4..e7eba40 100644 --- a/Pipfile +++ b/Pipfile @@ -22,6 +22,7 @@ mistune = "==2.0.0a4" mkdocs-material = "*" types-click = "*" vulture = "*" +darglint = "==1.8.0" [requires] python_version = "3.7" diff --git a/Pipfile.lock b/Pipfile.lock index 3894dc6..ff49680 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "cb313d6166b86be19e72fc56c7e7e7f40867b1a784a866aa04f28ad86a22d85b" + "sha256": "79835d7ee7aab87cb4f7445490d12c5afe8d0e94f0ca077809a01afb9d04b1e2" }, "pipfile-spec": 6, "requires": { @@ -39,6 +39,14 @@ ], "version": "==0.2.0" }, + "backports.entry-points-selectable": { + "hashes": [ + "sha256:7fceed9532a7aa2bd888654a7314f864a3c16a4e710b34a58cfc0f08114c663b", + "sha256:914b21a479fde881635f7af5adc7f6e38d6b274be32269070c53b698c60d5386" + ], + "markers": "python_version >= '2.7'", + "version": "==1.1.1" + }, "black": { "hashes": [ "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b", @@ -49,123 +57,129 @@ }, "certifi": { "hashes": [ - "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee", - "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8" + "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872", + "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569" ], - "version": "==2021.5.30" + "version": "==2021.10.8" }, - "chardet": { + "charset-normalizer": { "hashes": [ - "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa", - "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5" + "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0", + "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==4.0.0" + "markers": "python_version >= '3'", + "version": "==2.0.7" }, "click": { "hashes": [ - "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a", - "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6" + "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3", + "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b" ], "markers": "python_version >= '3.6'", - "version": "==8.0.1" + "version": "==8.0.3" }, "codecov": { "hashes": [ - "sha256:6cde272454009d27355f9434f4e49f238c0273b216beda8472a65dc4957f473b", - "sha256:ba8553a82942ce37d4da92b70ffd6d54cf635fc1793ab0a7dc3fecd6ebfb3df8", - "sha256:e95901d4350e99fc39c8353efa450050d2446c55bac91d90fcfd2354e19a6aef" + "sha256:585dc217dc3d8185198ceb402f85d5cb5dbfa0c5f350a5abcdf9e347776a5b47", + "sha256:782a8e5352f22593cbc5427a35320b99490eb24d9dcfa2155fd99d2b75cfb635", + "sha256:a0da46bb5025426da895af90938def8ee12d37fcbcbbbc15b6dc64cf7ebc51c1" ], "index": "pypi", - "version": "==2.1.11" + "version": "==2.1.12" }, "coverage": { + "extras": [ + "toml" + ], + "hashes": [ + "sha256:0147f7833c41927d84f5af9219d9b32f875c0689e5e74ac8ca3cb61e73a698f9", + "sha256:04a92a6cf9afd99f9979c61348ec79725a9f9342fb45e63c889e33c04610d97b", + "sha256:10ab138b153e4cc408b43792cb7f518f9ee02f4ff55cd1ab67ad6fd7e9905c7e", + "sha256:2e5b9c17a56b8bf0c0a9477fcd30d357deb486e4e1b389ed154f608f18556c8a", + "sha256:326d944aad0189603733d646e8d4a7d952f7145684da973c463ec2eefe1387c2", + "sha256:359a32515e94e398a5c0fa057e5887a42e647a9502d8e41165cf5cb8d3d1ca67", + "sha256:35cd2230e1ed76df7d0081a997f0fe705be1f7d8696264eb508076e0d0b5a685", + "sha256:3b270c6b48d3ff5a35deb3648028ba2643ad8434b07836782b1139cf9c66313f", + "sha256:42a1fb5dee3355df90b635906bb99126faa7936d87dfc97eacc5293397618cb7", + "sha256:479228e1b798d3c246ac89b09897ee706c51b3e5f8f8d778067f38db73ccc717", + "sha256:4cd919057636f63ab299ccb86ea0e78b87812400c76abab245ca385f17d19fb5", + "sha256:4d8b453764b9b26b0dd2afb83086a7c3f9379134e340288d2a52f8a91592394b", + "sha256:51a441011a30d693e71dea198b2a6f53ba029afc39f8e2aeb5b77245c1b282ef", + "sha256:557594a50bfe3fb0b1b57460f6789affe8850ad19c1acf2d14a3e12b2757d489", + "sha256:572f917267f363101eec375c109c9c1118037c7cc98041440b5eabda3185ac7b", + "sha256:62512c0ec5d307f56d86504c58eace11c1bc2afcdf44e3ff20de8ca427ca1d0e", + "sha256:65ad3ff837c89a229d626b8004f0ee32110f9bfdb6a88b76a80df36ccc60d926", + "sha256:666c6b32b69e56221ad1551d377f718ed00e6167c7a1b9257f780b105a101271", + "sha256:6e994003e719458420e14ffb43c08f4c14990e20d9e077cb5cad7a3e419bbb54", + "sha256:72bf437d54186d104388cbae73c9f2b0f8a3e11b6e8d7deb593bd14625c96026", + "sha256:738e823a746841248b56f0f3bd6abf3b73af191d1fd65e4c723b9c456216f0ad", + "sha256:78287731e3601ea5ce9d6468c82d88a12ef8fe625d6b7bdec9b45d96c1ad6533", + "sha256:7833c872718dc913f18e51ee97ea0dece61d9930893a58b20b3daf09bb1af6b6", + "sha256:7e083d32965d2eb6638a77e65b622be32a094fdc0250f28ce6039b0732fbcaa8", + "sha256:8186b5a4730c896cbe1e4b645bdc524e62d874351ae50e1db7c3e9f5dc81dc26", + "sha256:8605add58e6a960729aa40c0fd9a20a55909dd9b586d3e8104cc7f45869e4c6b", + "sha256:977ce557d79577a3dd510844904d5d968bfef9489f512be65e2882e1c6eed7d8", + "sha256:994ce5a7b3d20981b81d83618aa4882f955bfa573efdbef033d5632b58597ba9", + "sha256:9ad5895938a894c368d49d8470fe9f519909e5ebc6b8f8ea5190bd0df6aa4271", + "sha256:9eb0a1923354e0fdd1c8a6f53f5db2e6180d670e2b587914bf2e79fa8acfd003", + "sha256:a00284dbfb53b42e35c7dd99fc0e26ef89b4a34efff68078ed29d03ccb28402a", + "sha256:a11a2c019324fc111485e79d55907e7289e53d0031275a6c8daed30690bc50c0", + "sha256:ab6a0fe4c96f8058d41948ddf134420d3ef8c42d5508b5a341a440cce7a37a1d", + "sha256:b1d0a1bce919de0dd8da5cff4e616b2d9e6ebf3bd1410ff645318c3dd615010a", + "sha256:b8e4f15b672c9156c1154249a9c5746e86ac9ae9edc3799ee3afebc323d9d9e0", + "sha256:bbca34dca5a2d60f81326d908d77313816fad23d11b6069031a3d6b8c97a54f9", + "sha256:bf656cd74ff7b4ed7006cdb2a6728150aaad69c7242b42a2a532f77b63ea233f", + "sha256:c95257aa2ccf75d3d91d772060538d5fea7f625e48157f8ca44594f94d41cb33", + "sha256:dc5023be1c2a8b0a0ab5e31389e62c28b2453eb31dd069f4b8d1a0f9814d951a", + "sha256:e14bceb1f3ae8a14374be2b2d7bc12a59226872285f91d66d301e5f41705d4d6", + "sha256:e3c4f5211394cd0bf6874ac5d29684a495f9c374919833dcfff0bd6d37f96201", + "sha256:e76f017b6d4140a038c5ff12be1581183d7874e41f1c0af58ecf07748d36a336", + "sha256:e7d5606b9240ed4def9cbdf35be4308047d11e858b9c88a6c26974758d6225ce", + "sha256:f0f80e323a17af63eac6a9db0c9188c10f1fd815c3ab299727150cc0eb92c7a4", + "sha256:fb2fa2f6506c03c48ca42e3fe5a692d7470d290c047ee6de7c0f3e5fa7639ac9", + "sha256:ffa8fee2b1b9e60b531c4c27cf528d6b5d5da46b1730db1f4d6eee56ff282e07" + ], + "markers": "python_version >= '3.6'", + "version": "==6.1.1" + }, + "darglint": { "hashes": [ - "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c", - "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6", - "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45", - "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a", - "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03", - "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529", - "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a", - "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a", - "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2", - "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6", - "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759", - "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53", - "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a", - "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4", - "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff", - "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502", - "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793", - "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb", - "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905", - "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821", - "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b", - "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81", - "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0", - "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b", - "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3", - "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184", - "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701", - "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a", - "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82", - "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638", - "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5", - "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083", - "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6", - "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90", - "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465", - "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a", - "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3", - "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e", - "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066", - "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf", - "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b", - "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae", - "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669", - "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873", - "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b", - "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6", - "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb", - "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160", - "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c", - "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079", - "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d", - "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6" + "sha256:aa605ef47817a6d14797d32b390466edab621768ea4ca5cc0f3c54f6d8dcaec8", + "sha256:ac6797bcc918cd8d8f14c168a4a364f54e1aeb4ced59db58e7e4c6dfec2fe15c" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==5.5" + "index": "pypi", + "version": "==1.8.0" }, "decorator": { "hashes": [ - "sha256:6e5c199c16f7a9f0e3a61a4a54b3d27e7dad0dbdde92b944426cb20914376323", - "sha256:72ecfba4320a893c53f9706bebb2d55c270c1e51a28789361aa93e4a21319ed5" + "sha256:7b12e7c3c6ab203a29e157335e9122cb03de9ab7264b137594103fd4a683b374", + "sha256:e59913af105b9860aa2c8d3272d9de5a56a4e608db9a2f167a8480b323d529a7" ], "markers": "python_version >= '3.5'", - "version": "==5.0.9" + "version": "==5.1.0" }, "distlib": { "hashes": [ - "sha256:106fef6dc37dd8c0e2c0a60d3fca3e77460a48907f335fa28420463a6f799736", - "sha256:23e223426b28491b1ced97dc3bbe183027419dfc7982b4fa2f05d5f3ff10711c" + "sha256:c8b54e8454e5bf6237cc84c20e8264c3e991e824ef27e8f1e81049867d861e31", + "sha256:d982d0751ff6eaaab5e2ec8e691d949ee80eddf01a62eaa96ddb11531fe16b05" ], - "version": "==0.3.2" + "version": "==0.3.3" }, "filelock": { "hashes": [ - "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59", - "sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836" + "sha256:7afc856f74fa7006a289fd10fa840e1eebd8bbff6bffb69c26c54a0512ea8cf8", + "sha256:bb2a1c717df74c48a2d00ed625e5a66f8572a3a30baacb7657add1d7bac4097b" ], - "version": "==3.0.12" + "markers": "python_version >= '3.6'", + "version": "==3.3.2" }, "flake8": { "hashes": [ - "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b", - "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907" + "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d", + "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d" ], "index": "pypi", - "version": "==3.9.2" + "version": "==4.0.1" }, "flake8-docstrings": { "hashes": [ @@ -177,25 +191,26 @@ }, "ghp-import": { "hashes": [ - "sha256:753de2eace6e0f7d4edfb3cce5e3c3b98cd52aadb80163303d1d036bda7b4483" + "sha256:5f8962b30b20652cdffa9c5a9812f7de6bcb56ec475acac579807719bf242c46", + "sha256:947b3771f11be850c852c64b561c600fdddf794bab363060854c1ee7ad05e071" ], - "version": "==2.0.1" + "version": "==2.0.2" }, "idna": { "hashes": [ - "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", - "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" + "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff", + "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.10" + "markers": "python_version >= '3'", + "version": "==3.3" }, "importlib-metadata": { "hashes": [ - "sha256:833b26fb89d5de469b24a390e9df088d4e52e4ba33b01dc5e0e4f41b81a16c00", - "sha256:b142cc1dd1342f31ff04bb7d022492b09920cb64fed867cd3ea6f80fe3ebd139" + "sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b", + "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31" ], "markers": "python_version < '3.8'", - "version": "==4.5.0" + "version": "==4.2.0" }, "iniconfig": { "hashes": [ @@ -206,26 +221,19 @@ }, "ipython": { "hashes": [ - "sha256:9bc24a99f5d19721fb8a2d1408908e9c0520a17fff2233ffe82620847f17f1b6", - "sha256:d513e93327cf8657d6467c81f1f894adc125334ffe0e4ddd1abbb1c78d828703" + "sha256:4f69d7423a5a1972f6347ff233e38bbf4df6a150ef20fbb00c635442ac3060aa", + "sha256:a658beaf856ce46bc453366d5dc6b2ddc6c481efd3540cb28aa3943819caac9f" ], "index": "pypi", - "version": "==7.24.1" - }, - "ipython-genutils": { - "hashes": [ - "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8", - "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8" - ], - "version": "==0.2.0" + "version": "==7.29.0" }, "isort": { "hashes": [ - "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6", - "sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d" + "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7", + "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951" ], "index": "pypi", - "version": "==5.8.0" + "version": "==5.10.1" }, "jedi": { "hashes": [ @@ -237,11 +245,11 @@ }, "jinja2": { "hashes": [ - "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4", - "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4" + "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8", + "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7" ], "markers": "python_version >= '3.6'", - "version": "==3.0.1" + "version": "==3.0.3" }, "markdown": { "hashes": [ @@ -263,32 +271,67 @@ "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298", "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64", "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b", + "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194", "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567", "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff", + "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724", "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74", + "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646", "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35", + "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6", + "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a", + "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6", + "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad", "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26", + "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38", + "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac", "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7", + "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6", + "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047", "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75", "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f", + "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b", "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135", "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8", + "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a", "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a", + "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1", + "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9", + "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864", "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914", + "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee", + "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f", "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18", "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8", "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2", "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d", + "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b", "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b", + "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86", + "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6", "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f", "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb", "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833", + "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28", + "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e", "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415", "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902", + "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f", + "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d", "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9", "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d", + "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145", "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066", + "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c", + "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1", + "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a", + "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207", "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f", + "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53", + "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd", + "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134", + "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85", + "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9", "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5", "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94", "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509", @@ -300,11 +343,11 @@ }, "matplotlib-inline": { "hashes": [ - "sha256:5cf1176f554abb4fa98cb362aa2b55c500147e4bdbb07e3fda359143e1da0811", - "sha256:f41d5ff73c9f5385775d5c0bc13b424535c8402fe70ea8210f93e11f3683993e" + "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee", + "sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c" ], "markers": "python_version >= '3.5'", - "version": "==0.1.2" + "version": "==0.1.3" }, "mccabe": { "hashes": [ @@ -331,56 +374,56 @@ }, "mkdocs": { "hashes": [ - "sha256:11141126e5896dd9d279b3e4814eb488e409a0990fb638856255020406a8e2e7", - "sha256:6e0ea175366e3a50d334597b0bc042b8cebd512398cdd3f6f34842d0ef524905" + "sha256:89f5a094764381cda656af4298727c9f53dc3e602983087e1fe96ea1df24f4c1", + "sha256:a1fa8c2d0c1305d7fc2b9d9f607c71778572a8b110fb26642aa00296c9e6d072" ], "index": "pypi", - "version": "==1.2.1" + "version": "==1.2.3" }, "mkdocs-material": { "hashes": [ - "sha256:08eaf9f77c6d026706397bae2c50d202cfe3a81ef984027b671b4acd365dfc5b", - "sha256:e555c66ece5eab7023c4733270dc7627280e707e5082dab278d6a7a4881d2435" + "sha256:1b1dbd8ef2508b358d93af55a5c5db3f141c95667fad802301ec621c40c7c217", + "sha256:1b6b3e9e09f922c2d7f1160fe15c8f43d4adc0d6fb81aa6ff0cbc7ef5b78ec75" ], "index": "pypi", - "version": "==7.1.8" + "version": "==7.3.6" }, "mkdocs-material-extensions": { "hashes": [ - "sha256:6947fb7f5e4291e3c61405bad3539d81e0b3cd62ae0d66ced018128af509c68f", - "sha256:d90c807a88348aa6d1805657ec5c0b2d8d609c110e62b9dce4daf7fa981fa338" + "sha256:a82b70e533ce060b2a5d9eb2bc2e1be201cf61f901f93704b4acf6e3d5983a44", + "sha256:bfd24dfdef7b41c312ede42648f9eb83476ea168ec163b613f9abd12bbfddba2" ], - "markers": "python_version >= '3.5'", - "version": "==1.0.1" + "markers": "python_version >= '3.6'", + "version": "==1.0.3" }, "mypy": { "hashes": [ - "sha256:0190fb77e93ce971954c9e54ea61de2802065174e5e990c9d4c1d0f54fbeeca2", - "sha256:0756529da2dd4d53d26096b7969ce0a47997123261a5432b48cc6848a2cb0bd4", - "sha256:2f9fedc1f186697fda191e634ac1d02f03d4c260212ccb018fabbb6d4b03eee8", - "sha256:353aac2ce41ddeaf7599f1c73fed2b75750bef3b44b6ad12985a991bc002a0da", - "sha256:3f12705eabdd274b98f676e3e5a89f247ea86dc1af48a2d5a2b080abac4e1243", - "sha256:4efc67b9b3e2fddbe395700f91d5b8deb5980bfaaccb77b306310bd0b9e002eb", - "sha256:517e7528d1be7e187a5db7f0a3e479747307c1b897d9706b1c662014faba3116", - "sha256:68a098c104ae2b75e946b107ef69dd8398d54cb52ad57580dfb9fc78f7f997f0", - "sha256:746e0b0101b8efec34902810047f26a8c80e1efbb4fc554956d848c05ef85d76", - "sha256:8be7bbd091886bde9fcafed8dd089a766fa76eb223135fe5c9e9798f78023a20", - "sha256:9236c21194fde5df1b4d8ebc2ef2c1f2a5dc7f18bcbea54274937cae2e20a01c", - "sha256:9ef5355eaaf7a23ab157c21a44c614365238a7bdb3552ec3b80c393697d974e1", - "sha256:9f1d74eeb3f58c7bd3f3f92b8f63cb1678466a55e2c4612bf36909105d0724ab", - "sha256:a26d0e53e90815c765f91966442775cf03b8a7514a4e960de7b5320208b07269", - "sha256:ae94c31bb556ddb2310e4f913b706696ccbd43c62d3331cd3511caef466871d2", - "sha256:b5ba1f0d5f9087e03bf5958c28d421a03a4c1ad260bf81556195dffeccd979c4", - "sha256:b5dfcd22c6bab08dfeded8d5b44bdcb68c6f1ab261861e35c470b89074f78a70", - "sha256:cd01c599cf9f897b6b6c6b5d8b182557fb7d99326bcdf5d449a0fbbb4ccee4b9", - "sha256:e89880168c67cf4fde4506b80ee42f1537ad66ad366c101d388b3fd7d7ce2afd", - "sha256:ebe2bc9cb638475f5d39068d2dbe8ae1d605bb8d8d3ff281c695df1670ab3987", - "sha256:f89bfda7f0f66b789792ab64ce0978e4a991a0e4dd6197349d0767b0f1095b21", - "sha256:fc4d63da57ef0e8cd4ab45131f3fe5c286ce7dd7f032650d0fbc239c6190e167", - "sha256:fd634bc17b1e2d6ce716f0e43446d0d61cdadb1efcad5c56ca211c22b246ebc8" + "sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9", + "sha256:0aadfb2d3935988ec3815952e44058a3100499f5be5b28c34ac9d79f002a4a9a", + "sha256:119bed3832d961f3a880787bf621634ba042cb8dc850a7429f643508eeac97b9", + "sha256:1a85e280d4d217150ce8cb1a6dddffd14e753a4e0c3cf90baabb32cefa41b59e", + "sha256:3c4b8ca36877fc75339253721f69603a9c7fdb5d4d5a95a1a1b899d8b86a4de2", + "sha256:3e382b29f8e0ccf19a2df2b29a167591245df90c0b5a2542249873b5c1d78212", + "sha256:42c266ced41b65ed40a282c575705325fa7991af370036d3f134518336636f5b", + "sha256:53fd2eb27a8ee2892614370896956af2ff61254c275aaee4c230ae771cadd885", + "sha256:704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150", + "sha256:7df1ead20c81371ccd6091fa3e2878559b5c4d4caadaf1a484cf88d93ca06703", + "sha256:866c41f28cee548475f146aa4d39a51cf3b6a84246969f3759cb3e9c742fc072", + "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457", + "sha256:adaeee09bfde366d2c13fe6093a7df5df83c9a2ba98638c7d76b010694db760e", + "sha256:b6fb13123aeef4a3abbcfd7e71773ff3ff1526a7d3dc538f3929a49b42be03f0", + "sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb", + "sha256:c0df2d30ed496a08de5daed2a9ea807d07c21ae0ab23acf541ab88c24b26ab97", + "sha256:c6c2602dffb74867498f86e6129fd52a2770c48b7cd3ece77ada4fa38f94eba8", + "sha256:ceb6e0a6e27fb364fb3853389607cf7eb3a126ad335790fa1e14ed02fba50811", + "sha256:d9dd839eb0dc1bbe866a288ba3c1afc33a202015d2ad83b31e875b5905a079b6", + "sha256:e4dab234478e3bd3ce83bac4193b2ecd9cf94e720ddd95ce69840273bf44f6de", + "sha256:ec4e0cd079db280b6bdabdc807047ff3e199f334050db5cbb91ba3e959a67504", + "sha256:ecd2c3fe726758037234c93df7e98deb257fd15c24c9180dacf1ef829da5f921", + "sha256:ef565033fa5a958e62796867b1df10c40263ea9ded87164d67572834e57a174d" ], "index": "pypi", - "version": "==0.902" + "version": "==0.910" }, "mypy-extensions": { "hashes": [ @@ -391,11 +434,11 @@ }, "packaging": { "hashes": [ - "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5", - "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a" + "sha256:096d689d78ca690e4cd8a89568ba06d07ca097e3306a4381635073ca91479966", + "sha256:14317396d1e8cdb122989b916fa2c7e9ca8e2be9e8060a6eff75b6b7b4d8a7e0" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==20.9" + "markers": "python_version >= '3.6'", + "version": "==21.2" }, "parso": { "hashes": [ @@ -407,10 +450,10 @@ }, "pathspec": { "hashes": [ - "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd", - "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d" + "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a", + "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1" ], - "version": "==0.8.1" + "version": "==0.9.0" }, "pexpect": { "hashes": [ @@ -427,21 +470,29 @@ ], "version": "==0.7.5" }, + "platformdirs": { + "hashes": [ + "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2", + "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d" + ], + "markers": "python_version >= '3.6'", + "version": "==2.4.0" + }, "pluggy": { "hashes": [ - "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", - "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" + "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", + "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.13.1" + "markers": "python_version >= '3.6'", + "version": "==1.0.0" }, "prompt-toolkit": { "hashes": [ - "sha256:08360ee3a3148bdb5163621709ee322ec34fc4375099afa4bbf751e9b7b7fa4f", - "sha256:7089d8d2938043508aa9420ec18ce0922885304cddae87fb96eebca942299f88" + "sha256:449f333dd120bd01f5d296a8ce1452114ba3a71fae7288d2f0ae2c918764fa72", + "sha256:48d85cdca8b6c4f16480c7ce03fd193666b62b0a21667ca56b4bb5ad679d1170" ], - "markers": "python_full_version >= '3.6.1'", - "version": "==3.0.19" + "markers": "python_full_version >= '3.6.2'", + "version": "==3.0.22" }, "ptyprocess": { "hashes": [ @@ -452,19 +503,19 @@ }, "py": { "hashes": [ - "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3", - "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a" + "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719", + "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.10.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==1.11.0" }, "pycodestyle": { "hashes": [ - "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068", - "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef" + "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20", + "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.7.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==2.8.0" }, "pydocstyle": { "hashes": [ @@ -476,27 +527,27 @@ }, "pyflakes": { "hashes": [ - "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3", - "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db" + "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c", + "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.3.1" + "version": "==2.4.0" }, "pygments": { "hashes": [ - "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f", - "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e" + "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380", + "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6" ], "markers": "python_version >= '3.5'", - "version": "==2.9.0" + "version": "==2.10.0" }, "pymdown-extensions": { "hashes": [ - "sha256:141452d8ed61165518f2c923454bf054866b85cf466feedb0eb68f04acdc2560", - "sha256:b6daa94aad9e1310f9c64c8b1f01e4ce82937ab7eb53bfc92876a97aca02a6f4" + "sha256:01e4bec7f4b16beaba0087a74496401cf11afd69e3a11fe95cb593e5c698ef40", + "sha256:430cc2fbb30cef2df70edac0b4f62614a6a4d2b06462e32da4ca96098b7c1dfb" ], "markers": "python_version >= '3.6'", - "version": "==8.2" + "version": "==9.0" }, "pyparsing": { "hashes": [ @@ -508,19 +559,19 @@ }, "pytest": { "hashes": [ - "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b", - "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890" + "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89", + "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134" ], "index": "pypi", - "version": "==6.2.4" + "version": "==6.2.5" }, "pytest-cov": { "hashes": [ - "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a", - "sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7" + "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6", + "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470" ], "index": "pypi", - "version": "==2.12.1" + "version": "==3.0.0" }, "pytest-lazy-fixture": { "hashes": [ @@ -532,46 +583,50 @@ }, "python-dateutil": { "hashes": [ - "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", - "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a" + "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", + "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.1" + "version": "==2.8.2" }, "pyyaml": { "hashes": [ - "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf", - "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696", - "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393", - "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77", - "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922", - "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5", - "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8", - "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10", - "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc", - "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018", - "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e", - "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253", - "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347", - "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183", - "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541", - "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb", - "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185", - "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc", - "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db", - "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa", - "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46", - "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122", - "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b", - "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63", - "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df", - "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc", - "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247", - "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6", - "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0" + "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293", + "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b", + "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57", + "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b", + "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4", + "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07", + "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba", + "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9", + "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287", + "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513", + "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0", + "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0", + "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92", + "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f", + "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2", + "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc", + "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c", + "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86", + "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4", + "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c", + "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34", + "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b", + "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c", + "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb", + "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737", + "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3", + "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d", + "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53", + "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78", + "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803", + "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a", + "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174", + "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==5.4.1" + "markers": "python_version >= '3.6'", + "version": "==6.0" }, "pyyaml-env-tag": { "hashes": [ @@ -583,57 +638,65 @@ }, "regex": { "hashes": [ - "sha256:01afaf2ec48e196ba91b37451aa353cb7eda77efe518e481707e0515025f0cd5", - "sha256:11d773d75fa650cd36f68d7ca936e3c7afaae41b863b8c387a22aaa78d3c5c79", - "sha256:18c071c3eb09c30a264879f0d310d37fe5d3a3111662438889ae2eb6fc570c31", - "sha256:1e1c20e29358165242928c2de1482fb2cf4ea54a6a6dea2bd7a0e0d8ee321500", - "sha256:281d2fd05555079448537fe108d79eb031b403dac622621c78944c235f3fcf11", - "sha256:314d66636c494ed9c148a42731b3834496cc9a2c4251b1661e40936814542b14", - "sha256:32e65442138b7b76dd8173ffa2cf67356b7bc1768851dded39a7a13bf9223da3", - "sha256:339456e7d8c06dd36a22e451d58ef72cef293112b559010db3d054d5560ef439", - "sha256:3916d08be28a1149fb97f7728fca1f7c15d309a9f9682d89d79db75d5e52091c", - "sha256:3a9cd17e6e5c7eb328517969e0cb0c3d31fd329298dd0c04af99ebf42e904f82", - "sha256:47bf5bf60cf04d72bf6055ae5927a0bd9016096bf3d742fa50d9bf9f45aa0711", - "sha256:4c46e22a0933dd783467cf32b3516299fb98cfebd895817d685130cc50cd1093", - "sha256:4c557a7b470908b1712fe27fb1ef20772b78079808c87d20a90d051660b1d69a", - "sha256:52ba3d3f9b942c49d7e4bc105bb28551c44065f139a65062ab7912bef10c9afb", - "sha256:563085e55b0d4fb8f746f6a335893bda5c2cef43b2f0258fe1020ab1dd874df8", - "sha256:598585c9f0af8374c28edd609eb291b5726d7cbce16be6a8b95aa074d252ee17", - "sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000", - "sha256:67bdb9702427ceddc6ef3dc382455e90f785af4c13d495f9626861763ee13f9d", - "sha256:6d1b01031dedf2503631d0903cb563743f397ccaf6607a5e3b19a3d76fc10480", - "sha256:741a9647fcf2e45f3a1cf0e24f5e17febf3efe8d4ba1281dcc3aa0459ef424dc", - "sha256:7c2a1af393fcc09e898beba5dd59196edaa3116191cc7257f9224beaed3e1aa0", - "sha256:7d9884d86dd4dd489e981d94a65cd30d6f07203d90e98f6f657f05170f6324c9", - "sha256:90f11ff637fe8798933fb29f5ae1148c978cccb0452005bf4c69e13db951e765", - "sha256:919859aa909429fb5aa9cf8807f6045592c85ef56fdd30a9a3747e513db2536e", - "sha256:96fcd1888ab4d03adfc9303a7b3c0bd78c5412b2bfbe76db5b56d9eae004907a", - "sha256:97f29f57d5b84e73fbaf99ab3e26134e6687348e95ef6b48cfd2c06807005a07", - "sha256:980d7be47c84979d9136328d882f67ec5e50008681d94ecc8afa8a65ed1f4a6f", - "sha256:a91aa8619b23b79bcbeb37abe286f2f408d2f2d6f29a17237afda55bb54e7aac", - "sha256:ade17eb5d643b7fead300a1641e9f45401c98eee23763e9ed66a43f92f20b4a7", - "sha256:b9c3db21af35e3b3c05764461b262d6f05bbca08a71a7849fd79d47ba7bc33ed", - "sha256:bd28bc2e3a772acbb07787c6308e00d9626ff89e3bfcdebe87fa5afbfdedf968", - "sha256:bf5824bfac591ddb2c1f0a5f4ab72da28994548c708d2191e3b87dd207eb3ad7", - "sha256:c0502c0fadef0d23b128605d69b58edb2c681c25d44574fc673b0e52dce71ee2", - "sha256:c38c71df845e2aabb7fb0b920d11a1b5ac8526005e533a8920aea97efb8ec6a4", - "sha256:ce15b6d103daff8e9fee13cf7f0add05245a05d866e73926c358e871221eae87", - "sha256:d3029c340cfbb3ac0a71798100ccc13b97dddf373a4ae56b6a72cf70dfd53bc8", - "sha256:e512d8ef5ad7b898cdb2d8ee1cb09a8339e4f8be706d27eaa180c2f177248a10", - "sha256:e8e5b509d5c2ff12f8418006d5a90e9436766133b564db0abaec92fd27fcee29", - "sha256:ee54ff27bf0afaf4c3b3a62bcd016c12c3fdb4ec4f413391a90bd38bc3624605", - "sha256:fa4537fb4a98fe8fde99626e4681cc644bdcf2a795038533f9f711513a862ae6", - "sha256:fd45ff9293d9274c5008a2054ecef86a9bfe819a67c7be1afb65e69b405b3042" - ], - "version": "==2021.4.4" + "sha256:05b7d6d7e64efe309972adab77fc2af8907bb93217ec60aa9fe12a0dad35874f", + "sha256:0617383e2fe465732af4509e61648b77cbe3aee68b6ac8c0b6fe934db90be5cc", + "sha256:07856afef5ffcc052e7eccf3213317fbb94e4a5cd8177a2caa69c980657b3cb4", + "sha256:162abfd74e88001d20cb73ceaffbfe601469923e875caf9118333b1a4aaafdc4", + "sha256:2207ae4f64ad3af399e2d30dde66f0b36ae5c3129b52885f1bffc2f05ec505c8", + "sha256:30ab804ea73972049b7a2a5c62d97687d69b5a60a67adca07eb73a0ddbc9e29f", + "sha256:3b5df18db1fccd66de15aa59c41e4f853b5df7550723d26aa6cb7f40e5d9da5a", + "sha256:3c5fb32cc6077abad3bbf0323067636d93307c9fa93e072771cf9a64d1c0f3ef", + "sha256:416c5f1a188c91e3eb41e9c8787288e707f7d2ebe66e0a6563af280d9b68478f", + "sha256:432bd15d40ed835a51617521d60d0125867f7b88acf653e4ed994a1f8e4995dc", + "sha256:4aaa4e0705ef2b73dd8e36eeb4c868f80f8393f5f4d855e94025ce7ad8525f50", + "sha256:537ca6a3586931b16a85ac38c08cc48f10fc870a5b25e51794c74df843e9966d", + "sha256:53db2c6be8a2710b359bfd3d3aa17ba38f8aa72a82309a12ae99d3c0c3dcd74d", + "sha256:5537f71b6d646f7f5f340562ec4c77b6e1c915f8baae822ea0b7e46c1f09b733", + "sha256:6650f16365f1924d6014d2ea770bde8555b4a39dc9576abb95e3cd1ff0263b36", + "sha256:666abff54e474d28ff42756d94544cdfd42e2ee97065857413b72e8a2d6a6345", + "sha256:68a067c11463de2a37157930d8b153005085e42bcb7ad9ca562d77ba7d1404e0", + "sha256:780b48456a0f0ba4d390e8b5f7c661fdd218934388cde1a974010a965e200e12", + "sha256:788aef3549f1924d5c38263104dae7395bf020a42776d5ec5ea2b0d3d85d6646", + "sha256:7ee1227cf08b6716c85504aebc49ac827eb88fcc6e51564f010f11a406c0a667", + "sha256:7f301b11b9d214f83ddaf689181051e7f48905568b0c7017c04c06dfd065e244", + "sha256:83ee89483672b11f8952b158640d0c0ff02dc43d9cb1b70c1564b49abe92ce29", + "sha256:85bfa6a5413be0ee6c5c4a663668a2cad2cbecdee367630d097d7823041bdeec", + "sha256:9345b6f7ee578bad8e475129ed40123d265464c4cfead6c261fd60fc9de00bcf", + "sha256:93a5051fcf5fad72de73b96f07d30bc29665697fb8ecdfbc474f3452c78adcf4", + "sha256:962b9a917dd7ceacbe5cd424556914cb0d636001e393b43dc886ba31d2a1e449", + "sha256:98ba568e8ae26beb726aeea2273053c717641933836568c2a0278a84987b2a1a", + "sha256:a3feefd5e95871872673b08636f96b61ebef62971eab044f5124fb4dea39919d", + "sha256:b43c2b8a330a490daaef5a47ab114935002b13b3f9dc5da56d5322ff218eeadb", + "sha256:b483c9d00a565633c87abd0aaf27eb5016de23fed952e054ecc19ce32f6a9e7e", + "sha256:ba05430e819e58544e840a68b03b28b6d328aff2e41579037e8bab7653b37d83", + "sha256:ca5f18a75e1256ce07494e245cdb146f5a9267d3c702ebf9b65c7f8bd843431e", + "sha256:d5ca078bb666c4a9d1287a379fe617a6dccd18c3e8a7e6c7e1eb8974330c626a", + "sha256:da1a90c1ddb7531b1d5ff1e171b4ee61f6345119be7351104b67ff413843fe94", + "sha256:dba70f30fd81f8ce6d32ddeef37d91c8948e5d5a4c63242d16a2b2df8143aafc", + "sha256:dd33eb9bdcfbabab3459c9ee651d94c842bc8a05fabc95edf4ee0c15a072495e", + "sha256:e0538c43565ee6e703d3a7c3bdfe4037a5209250e8502c98f20fea6f5fdf2965", + "sha256:e1f54b9b4b6c53369f40028d2dd07a8c374583417ee6ec0ea304e710a20f80a0", + "sha256:e32d2a2b02ccbef10145df9135751abea1f9f076e67a4e261b05f24b94219e36", + "sha256:e71255ba42567d34a13c03968736c5d39bb4a97ce98188fafb27ce981115beec", + "sha256:ed2e07c6a26ed4bea91b897ee2b0835c21716d9a469a96c3e878dc5f8c55bb23", + "sha256:eef2afb0fd1747f33f1ee3e209bce1ed582d1896b240ccc5e2697e3275f037c7", + "sha256:f23222527b307970e383433daec128d769ff778d9b29343fb3496472dc20dabe", + "sha256:f341ee2df0999bfdf7a95e448075effe0db212a59387de1a70690e4acb03d4c6", + "sha256:f7f325be2804246a75a4f45c72d4ce80d2443ab815063cdf70ee8fb2ca59ee1b", + "sha256:f8af619e3be812a2059b212064ea7a640aff0568d972cd1b9e920837469eb3cb", + "sha256:fa8c626d6441e2d04b6ee703ef2d1e17608ad44c7cb75258c09dd42bacdfc64b", + "sha256:fbb9dc00e39f3e6c0ef48edee202f9520dafb233e8b51b06b8428cfcb92abd30", + "sha256:fff55f3ce50a3ff63ec8e2a8d3dd924f1941b250b0aac3d3d42b687eeff07a8e" + ], + "version": "==2021.11.10" }, "requests": { "hashes": [ - "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804", - "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e" + "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24", + "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==2.25.1" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", + "version": "==2.26.0" }, "six": { "hashes": [ @@ -658,13 +721,20 @@ "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==0.10.2" }, + "tomli": { + "hashes": [ + "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee", + "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade" + ], + "version": "==1.2.2" + }, "tox": { "hashes": [ - "sha256:307a81ddb82bd463971a273f33e9533a24ed22185f27db8ce3386bff27d324e3", - "sha256:b0b5818049a1c1997599d42012a637a33f24c62ab8187223fdd318fa8522637b" + "sha256:5e274227a53dc9ef856767c21867377ba395992549f02ce55eb549f9fb9a8d10", + "sha256:c30b57fa2477f1fb7c36aa1d83292d5c2336cd0018119e1b1c17340e2c2708ca" ], "index": "pypi", - "version": "==3.23.1" + "version": "==3.24.4" }, "tox-travis": { "hashes": [ @@ -676,11 +746,11 @@ }, "traitlets": { "hashes": [ - "sha256:178f4ce988f69189f7e523337a3e11d91c786ded9360174a3d9ca83e79bc5396", - "sha256:69ff3f9d5351f31a7ad80443c2674b7099df13cc41fc5fa6e2f6d3b0330b0426" + "sha256:059f456c5a7c1c82b98c2e8c799f39c9b8128f6d0d46941ee118daace9eb70c7", + "sha256:2d313cc50a42cd6c277e7d7dc8d4d7fedd06a2c215f78766ae7b1a66277e0033" ], "markers": "python_version >= '3.7'", - "version": "==5.0.5" + "version": "==5.1.1" }, "typed-ast": { "hashes": [ @@ -720,36 +790,36 @@ }, "types-click": { "hashes": [ - "sha256:040897284e4f9466825c3865f708a985a8e7ba4d8e22cb9198ffb7b522160850", - "sha256:4722746f1ec9fd3fc8b1d7fb8c840604dc22f9e32bcc7a31a36d6d85cc2bce24" + "sha256:64dd3dc1fe5ed7e105b7a0479a6aebdd3c132c474c54f42a744af1bfba1989fd", + "sha256:fff7ea52619581401a90cb9247e1a7e95c29084cfdbc26b7a49ed94c40fcd3d8" ], "index": "pypi", - "version": "==7.1.2" + "version": "==7.1.7" }, "typing-extensions": { "hashes": [ - "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497", - "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342", - "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84" + "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e", + "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7", + "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34" ], "markers": "python_version < '3.8'", - "version": "==3.10.0.0" + "version": "==3.10.0.2" }, "urllib3": { "hashes": [ - "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c", - "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098" + "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece", + "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==1.26.5" + "version": "==1.26.7" }, "virtualenv": { "hashes": [ - "sha256:14fdf849f80dbb29a4eb6caa9875d476ee2a5cf76a5f5415fa2f1606010ab467", - "sha256:2b0126166ea7c9c3661f5b8e06773d28f83322de7a3ff7d06f0aed18c9de6a76" + "sha256:4b02e52a624336eece99c96e3ab7111f469c24ba226a53ec474e8e787b365814", + "sha256:576d05b46eace16a9c348085f7d0dc8ef28713a2cabaa1cf0aea41e8f12c9218" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==20.4.7" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==20.10.0" }, "vulture": { "hashes": [ @@ -761,26 +831,32 @@ }, "watchdog": { "hashes": [ - "sha256:0237db4d9024859bea27d0efb59fe75eef290833fd988b8ead7a879b0308c2db", - "sha256:104266a778906ae0e971368d368a65c4cd032a490a9fca5ba0b78c6c7ae11720", - "sha256:188145185c08c73c56f1478ccf1f0f0f85101191439679b35b6b100886ce0b39", - "sha256:1a62a4671796dc93d1a7262286217d9e75823c63d4c42782912d39a506d30046", - "sha256:255a32d44bbbe62e52874ff755e2eefe271b150e0ec240ad7718a62a7a7a73c4", - "sha256:3d6405681471ebe0beb3aa083998c4870e48b57f8afdb45ea1b5957cc5cf1014", - "sha256:4b219d46d89cfa49af1d73175487c14a318a74cb8c5442603fd13c6a5b418c86", - "sha256:581e3548159fe7d2a9f377a1fbcb41bdcee46849cca8ab803c7ac2e5e04ec77c", - "sha256:58ebb1095ee493008a7789d47dd62e4999505d82be89fc884d473086fccc6ebd", - "sha256:598d772beeaf9c98d0df946fbabf0c8365dd95ea46a250c224c725fe0c4730bc", - "sha256:668391e6c32742d76e5be5db6bf95c455fa4b3d11e76a77c13b39bccb3a47a72", - "sha256:6ef9fe57162c4c361692620e1d9167574ba1975ee468b24051ca11c9bba6438e", - "sha256:91387ee2421f30b75f7ff632c9d48f76648e56bf346a7c805c0a34187a93aab4", - "sha256:a42e6d652f820b2b94cd03156c62559a2ea68d476476dfcd77d931e7f1012d4a", - "sha256:a6471517315a8541a943c00b45f1d252e36898a3ae963d2d52509b89a50cb2b9", - "sha256:d34ce2261f118ecd57eedeef95fc2a495fc4a40b3ed7b3bf0bd7a8ccc1ab4f8f", - "sha256:edcd9ef3fd460bb8a98eb1fcf99941e9fd9f275f45f1a82cb1359ec92975d647" + "sha256:25fb5240b195d17de949588628fdf93032ebf163524ef08933db0ea1f99bd685", + "sha256:3386b367e950a11b0568062b70cc026c6f645428a698d33d39e013aaeda4cc04", + "sha256:3becdb380d8916c873ad512f1701f8a92ce79ec6978ffde92919fd18d41da7fb", + "sha256:4ae38bf8ba6f39d5b83f78661273216e7db5b00f08be7592062cb1fc8b8ba542", + "sha256:8047da932432aa32c515ec1447ea79ce578d0559362ca3605f8e9568f844e3c6", + "sha256:8f1c00aa35f504197561060ca4c21d3cc079ba29cf6dd2fe61024c70160c990b", + "sha256:922a69fa533cb0c793b483becaaa0845f655151e7256ec73630a1b2e9ebcb660", + "sha256:9693f35162dc6208d10b10ddf0458cc09ad70c30ba689d9206e02cd836ce28a3", + "sha256:a0f1c7edf116a12f7245be06120b1852275f9506a7d90227648b250755a03923", + "sha256:a36e75df6c767cbf46f61a91c70b3ba71811dfa0aca4a324d9407a06a8b7a2e7", + "sha256:aba5c812f8ee8a3ff3be51887ca2d55fb8e268439ed44110d3846e4229eb0e8b", + "sha256:ad6f1796e37db2223d2a3f302f586f74c72c630b48a9872c1e7ae8e92e0ab669", + "sha256:ae67501c95606072aafa865b6ed47343ac6484472a2f95490ba151f6347acfc2", + "sha256:b2fcf9402fde2672545b139694284dc3b665fd1be660d73eca6805197ef776a3", + "sha256:b52b88021b9541a60531142b0a451baca08d28b74a723d0c99b13c8c8d48d604", + "sha256:b7d336912853d7b77f9b2c24eeed6a5065d0a0cc0d3b6a5a45ad6d1d05fb8cd8", + "sha256:bd9ba4f332cf57b2c1f698be0728c020399ef3040577cde2939f2e045b39c1e5", + "sha256:be9be735f827820a06340dff2ddea1fb7234561fa5e6300a62fe7f54d40546a0", + "sha256:cca7741c0fcc765568350cb139e92b7f9f3c9a08c4f32591d18ab0a6ac9e71b6", + "sha256:d0d19fb2441947b58fbf91336638c2b9f4cc98e05e1045404d7a4cb7cddc7a65", + "sha256:e02794ac791662a5eafc6ffeaf9bcc149035a0e48eb0a9d40a8feb4622605a3d", + "sha256:e0f30db709c939cabf64a6dc5babb276e6d823fd84464ab916f9b9ba5623ca15", + "sha256:e92c2d33858c8f560671b448205a268096e17870dcf60a9bb3ac7bfbafb7f5f9" ], "markers": "python_version >= '3.6'", - "version": "==2.1.2" + "version": "==2.1.6" }, "wcwidth": { "hashes": [ @@ -791,11 +867,11 @@ }, "zipp": { "hashes": [ - "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76", - "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098" + "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832", + "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc" ], "markers": "python_version >= '3.6'", - "version": "==3.4.1" + "version": "==3.6.0" } } } diff --git a/README.md b/README.md index fd648c2..ecb6ee2 100644 --- a/README.md +++ b/README.md @@ -166,14 +166,14 @@ requirements: - [ ] `:existential-preconditions` - [ ] `:universal-preconditions` - [ ] `:quantified-preconditions` -- [ ] `:conditional-effects` +- [x] `:conditional-effects` - [ ] `:fluents` - [ ] `:numeric-fluents` - [x] `:non-deterministic` (see [6th IPC: Uncertainty Part](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.163.7140&rep=rep1&type=pdf)) - [ ] `:adl` - [ ] `:durative-actions` - [ ] `:duration-inequalities` -- [ ] `:derived-predicates` +- [x] `:derived-predicates` - [ ] `:timed-initial-literals` - [ ] `:preferences` - [ ] `:constraints` diff --git a/pddl/core.py b/pddl/core.py index 177fafc..7238445 100644 --- a/pddl/core.py +++ b/pddl/core.py @@ -27,14 +27,15 @@ """ import functools from enum import Enum -from typing import AbstractSet, Collection, Optional, Sequence, cast +from typing import AbstractSet, Collection, Optional, Sequence, Set, cast from pddl.custom_types import name as name_type from pddl.custom_types import namelike, to_names from pddl.helpers.base import assert_, ensure, ensure_sequence, ensure_set from pddl.logic.base import FalseFormula, Formula, TrueFormula, is_literal -from pddl.logic.predicates import Predicate +from pddl.logic.predicates import DerivedPredicate, Predicate from pddl.logic.terms import Constant, Variable +from pddl.parser.symbols import RequirementSymbols as RS class Domain: @@ -47,6 +48,9 @@ def __init__( types: Optional[Collection[namelike]] = None, constants: Optional[Collection[Constant]] = None, predicates: Optional[Collection[Predicate]] = None, # TODO cannot be empty + derived_predicates: Optional[ + Collection[DerivedPredicate] + ] = None, # TODO cannot be empty actions: Optional[Collection["Action"]] = None, ): """ @@ -57,6 +61,7 @@ def __init__( :param types: the list of supported types. :param constants: the constants. :param predicates: the predicates. + :param derived_predicates: the derived predicates. :param actions: the actions. """ self._name = name_type(name) @@ -64,6 +69,7 @@ def __init__( self._types = set(to_names(ensure_set(types))) self._constants = ensure_set(constants) self._predicates = ensure_set(predicates) + self._derived_predicates = ensure_set(derived_predicates) self._actions = ensure_set(actions) @property @@ -86,6 +92,11 @@ def predicates(self) -> AbstractSet[Predicate]: """Get the predicates.""" return self._predicates + @property + def derived_predicates(self) -> AbstractSet[DerivedPredicate]: + """Get the derived predicates.""" + return self._derived_predicates + @property def actions(self) -> AbstractSet["Action"]: """Get the actions.""" @@ -105,6 +116,7 @@ def __eq__(self, other): and self.types == other.types and self.constants == other.constants and self.predicates == other.predicates + and self.derived_predicates == other.derived_predicates and self.actions == other.actions ) @@ -127,7 +139,7 @@ def __init__( :param name: the name of the PDDL problem. :param domain: the PDDL domain. - :param domain: the domain name. Must match with the domain object. + :param domain_name: the domain name. Must match with the domain object. :param requirements: the set of PDDL requirements. :param objects: the set of objects. :param init: the initial condition. @@ -242,8 +254,8 @@ def __init__( """ self._name: str = name_type(name) self._parameters: Sequence[Variable] = ensure_sequence(parameters) - self._precondition: Formula = ensure(precondition, FalseFormula()) - self._effect: Formula = ensure(effect, FalseFormula()) + self._precondition = precondition + self._effect = effect @property def name(self) -> str: @@ -256,12 +268,12 @@ def parameters(self) -> Sequence[Variable]: return self._parameters @property - def precondition(self) -> Formula: + def precondition(self) -> Optional[Formula]: """Get the precondition.""" return self._precondition @property - def effect(self) -> Formula: + def effect(self) -> Optional[Formula]: """Get the effect.""" return self._effect @@ -269,8 +281,10 @@ def __str__(self): """Get the string.""" operator_str = "(:action {0}\n".format(self.name) operator_str += f" :parameters ({' '.join(map(str, self.parameters))})\n" - operator_str += f" :precondition {str(self.precondition)}\n" - operator_str += f" :effect {str(self.effect)}\n" + if self.precondition is not None: + operator_str += f" :precondition {str(self.precondition)}\n" + if self.effect is not None: + operator_str += f" :effect {str(self.effect)}\n" operator_str += ")" return operator_str @@ -293,13 +307,26 @@ def __hash__(self): class Requirements(Enum): """Enum class for the requirements.""" - STRIPS = "strips" - EQUALITY = "equality" - TYPING = "typing" - ADL = "adl" - NON_DETERMINISTIC = "non-deterministic" - NEG_PRECONDITION = "negative-preconditions" - DIS_PRECONDITION = "disjunctive-preconditions" + STRIPS = RS.STRIPS.strip() + TYPING = RS.TYPING.strip() + NEG_PRECONDITION = RS.NEG_PRECONDITION.strip() + DIS_PRECONDITION = RS.DIS_PRECONDITION.strip() + EQUALITY = RS.EQUALITY.strip() + CONDITIONAL_EFFECTS = RS.CONDITIONAL_EFFECTS.strip() + ADL = RS.ADL.strip() + DERIVED_PREDICATES = RS.DERIVED_PREDICATES.strip() + NON_DETERMINISTIC = RS.NON_DETERMINISTIC.strip() + + @classmethod + def strips_requirements(cls) -> Set["Requirements"]: + """Get the STRIPS requirements.""" + return { + Requirements.TYPING, + Requirements.NEG_PRECONDITION, + Requirements.DIS_PRECONDITION, + Requirements.EQUALITY, + Requirements.CONDITIONAL_EFFECTS, + } def __str__(self) -> str: """Get the string representation.""" diff --git a/pddl/formatter.py b/pddl/formatter.py index 0a5e64f..afb663e 100644 --- a/pddl/formatter.py +++ b/pddl/formatter.py @@ -52,7 +52,16 @@ def domain_to_string(domain: Domain) -> str: body += _sort_and_print_collection("(:constants ", domain.constants, ")\n") body += _sort_and_print_collection("(:predicates ", domain.predicates, ")\n") body += _sort_and_print_collection( - "", domain.actions, "", to_string=lambda obj: str(obj) + "\n", + "", + domain.derived_predicates, + "", + to_string=lambda obj: str(obj) + "\n", + ) + body += _sort_and_print_collection( + "", + domain.actions, + "", + to_string=lambda obj: str(obj) + "\n", ) result = result + "\n" + indent(body, indentation) + "\n)" result = _remove_empty_lines(result) diff --git a/pddl/helpers/base.py b/pddl/helpers/base.py index d916a4e..8b20b91 100644 --- a/pddl/helpers/base.py +++ b/pddl/helpers/base.py @@ -85,7 +85,7 @@ def safe_get(seq: Sequence, index: int, default=None): def find(seq: Sequence, condition: Callable[[Any], bool]) -> int: """ - Find the index of the first element that safisfies a condition. + Find the index of the first element that satisfies a condition. :param seq: the sequence. :param condition: the condition. diff --git a/pddl/helpers/cache_hash.py b/pddl/helpers/cache_hash.py index d039f8d..347cd0d 100644 --- a/pddl/helpers/cache_hash.py +++ b/pddl/helpers/cache_hash.py @@ -55,6 +55,9 @@ def _getstate(fn): with another instance of the interpreter, the stored hash might be inconsistent with the PYTHONHASHSEED initialization of the new interpreter. + + :param fn: the getstate function. + :return: the new getstate function. """ @wraps(fn) @@ -84,6 +87,9 @@ def _setstate(fn): as the state might be restored in another interpreter in which the old hash value might not be consistent anymore. + + :param fn: the setstate function. + :return: the new setstate function. """ @wraps(fn) @@ -103,6 +109,9 @@ def cache_hash(cls): __hash__ __getstate__ __setstate__ + + :param cls: the class to wrap + :return: the wrapped class """ cls.__hash__ = _cache_hash(cls.__hash__) diff --git a/pddl/logic/base.py b/pddl/logic/base.py index e7dd851..7f7c3e7 100644 --- a/pddl/logic/base.py +++ b/pddl/logic/base.py @@ -239,7 +239,7 @@ def is_literal(formula: Formula) -> bool: - a Not formula whose argument is an atomic formula. :param formula: the formula. - :return True if the formula is a literal; False otherwise. + :return: True if the formula is a literal; False otherwise. """ return ( isinstance(formula, Atomic) diff --git a/pddl/logic/effects.py b/pddl/logic/effects.py new file mode 100644 index 0000000..7696fbe --- /dev/null +++ b/pddl/logic/effects.py @@ -0,0 +1,181 @@ +# -*- coding: utf-8 -*- +# +# Copyright 2021 WhiteMech +# +# ------------------------------ +# +# This file is part of pddl. +# +# pddl is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# pddl is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with pddl. If not, see . +# + +"""This modules implements PDDL effects.""" +import functools +from typing import AbstractSet, Collection, Generic, Optional, Sequence, TypeVar, Union + +from pddl.helpers.base import ensure_set +from pddl.helpers.cache_hash import cache_hash +from pddl.logic import Variable +from pddl.logic.base import Atomic, Formula, Not, OneOf, MonotoneOp, BinaryOp +from pddl.parser.symbols import Symbols + +EffectType = TypeVar("EffectType") + + +@cache_hash +@functools.total_ordering +class AndEffect(Generic[EffectType]): + """Conjunction of effects.""" + + def __init__(self, *operands: EffectType): + """ + Initialize a conjunction of (conditional) effects. + + :param operands: the operands. + """ + self._operands = list(operands) + + @property + def operands(self) -> Sequence[EffectType]: + """Get the operands.""" + return tuple(self._operands) + + def __str__(self) -> str: + """Get the string representation.""" + return f"({Symbols.AND.value} {' '.join(map(str, self.operands))})" + + def __repr__(self) -> str: + """Get an unambiguous string representation.""" + return f"{type(self).__name__}({repr(self._operands)})" + + def __eq__(self, other): + """Compare with another object.""" + return isinstance(other, type(self)) and self.operands == other.operands + + def __lt__(self, other) -> bool: + """Compare with another object.""" + if isinstance(other, AndEffect): + return tuple(self.operands) < tuple(other.operands) + return super().__lt__(other) # type: ignore + + def __hash__(self) -> int: + """Compute the hash of the object.""" + return hash((type(self), self.operands)) + + +@cache_hash +@functools.total_ordering +class When: + """Represent the 'When' effect.""" + + def __init__(self, condition: Formula, effect: "CondEffect") -> None: + """ + Initialize the effect. + + :param condition: the condition + :param effect: the effect + """ + self._condition = condition + self._effect = effect + + @property + def condition(self) -> Formula: + """Get the condition.""" + return self._condition + + @property + def effect(self) -> "CondEffect": + """Get the effect.""" + return self._effect + + def __str__(self) -> str: + """Get the string representation.""" + return f"({Symbols.WHEN.value} {self._condition} {self.effect})" + + def __repr__(self) -> str: + """Get an unambiguous string representation.""" + return f"{type(self).__name__}({self.condition}, {self.effect})" + + def __eq__(self, other) -> bool: + """Compare with another object.""" + return ( + isinstance(other, type(self)) + and self.condition == other.condition + and self.effect == other.effect + ) + + def __hash__(self) -> int: + """Compute the hash of the object.""" + return hash((type(self), self.condition, self.effect)) + + def __lt__(self, other): + """Compare with another object.""" + if isinstance(other, When): + return (self.condition, self.effect) < (other.condition, other.effect) + return super().__lt__(other) + + +@cache_hash +@functools.total_ordering +class Forall: + """Represent the 'Forall' effect.""" + + def __init__( + self, effect: "Effect", variables: Optional[Collection[Variable]] = None + ) -> None: + """Initialize the 'forall' effect.""" + self._effect = effect + self._variables = ensure_set(variables) + + @property + def effect(self) -> "Effect": + """Get the effect.""" + return self._effect + + @property + def variables(self) -> AbstractSet[Variable]: + """Get the variables.""" + return self._variables + + def __str__(self) -> str: + """Get the string representation.""" + return f"({Symbols.FORALL.value} ({' '.join(map(str, self.variables))}) {self.effect})" + + def __repr__(self) -> str: + """Get an unambiguous string representation.""" + return f"{type(self).__name__}({self.variables}, {self.effect})" + + def __eq__(self, other) -> bool: + """Compare with another object.""" + return ( + isinstance(other, type(self)) + and self.variables == other.variables + and self.effect == other.effect + ) + + def __hash__(self) -> int: + """Compute the hash of the object.""" + return hash((type(self), self.variables, self.effect)) + + def __lt__(self, other): + """Compare with another object.""" + if isinstance(other, Forall): + return (self.variables, self.effect) < (other.variables, other.effect) + return super().__lt__(other) + + +PEffect = Union[Atomic, Not] +CEffect = Union[Forall, When, OneOf, "PEffect"] +Effect = Union[AndEffect["CEffect"], CEffect] +CondEffect = Union[AndEffect["PEffect"], "PEffect"] diff --git a/pddl/logic/predicates.py b/pddl/logic/predicates.py index af3dcae..2045ba0 100644 --- a/pddl/logic/predicates.py +++ b/pddl/logic/predicates.py @@ -28,8 +28,9 @@ from pddl.custom_types import namelike from pddl.helpers.base import assert_ from pddl.helpers.cache_hash import cache_hash -from pddl.logic.base import Atomic +from pddl.logic.base import Atomic, Formula from pddl.logic.terms import Term +from pddl.parser.symbols import Symbols @cache_hash @@ -136,8 +137,55 @@ def __hash__(self) -> int: def __str__(self) -> str: """Get the string representation.""" - return f"(= {self.left} {self.right})" + return f"({Symbols.EQUAL} {self.left} {self.right})" def __repr__(self) -> str: """Get the string representation.""" return f"{type(self).__name__}({self.left}, {self.right})" + + +@cache_hash +@functools.total_ordering +class DerivedPredicate(Atomic): + """A class for a Derived Predicates in PDDL.""" + + def __init__(self, predicate: Predicate, condition: Formula) -> None: + """ + Initialize the derived predicate. + + :param predicate: the predicate + :param condition: the condition + """ + self._predicate = predicate + self._condition = condition + + @property + def predicate(self) -> Predicate: + """Get the predicate.""" + return self._predicate + + @property + def condition(self) -> Formula: + """Get the condition.""" + return self._condition + + def __hash__(self) -> int: + """Get the hash.""" + return hash((DerivedPredicate, self.predicate, self.condition)) + + def __str__(self) -> str: + """Get the string representation.""" + return f"({Symbols.DERIVED.value} {self.predicate} {self.condition})" + + def __repr__(self) -> str: + """Get the string representation.""" + return f"{type(self).__name__}({self.predicate}, {self.condition})" + + def __lt__(self, other): + """Compare with another object.""" + if isinstance(other, DerivedPredicate): + return (self.predicate, self._predicate) < ( + other.predicate, + other.condition, + ) + return super().__lt__(other) diff --git a/pddl/logic/terms.py b/pddl/logic/terms.py index 134e04a..89860c4 100644 --- a/pddl/logic/terms.py +++ b/pddl/logic/terms.py @@ -80,6 +80,7 @@ def __init__( Initialize a constant. :param name: the name. + :param type_tags: the type tags """ super().__init__(name, type_tags=type_tags) @@ -110,6 +111,7 @@ def __init__( Initialize the variable. :param name: the name. + :param type_tags: the type tags """ super().__init__(name, type_tags=type_tags) diff --git a/pddl/parser/common.lark b/pddl/parser/common.lark index 683103a..25fa351 100644 --- a/pddl/parser/common.lark +++ b/pddl/parser/common.lark @@ -1,12 +1,14 @@ NAME: /[a-zA-Z][a-zA-Z0-9-_]*/ -?require_key: TYPING - | STRIPS - | EQUALITY - | NON_DETERMINISTIC - | NEG_PRECONDITION - | DIS_PRECONDITION - | ADL +?require_key: TYPING + | STRIPS + | EQUALITY + | NON_DETERMINISTIC + | NEG_PRECONDITION + | DIS_PRECONDITION + | ADL + | DERIVED_PREDICATES + | CONDITIONAL_EFFECTS COMMENT: /;[^\n]*/ @@ -20,6 +22,9 @@ ACTION: ":action" PARAMETERS: ":parameters" PRECONDITION: ":precondition" EFFECT: ":effect" +DERIVED: ":derived" +FORALL: "forall" +WHEN: "when" OBJECT: "object" AND: "and" OR: "or" @@ -37,6 +42,8 @@ ADL: ":adl" NON_DETERMINISTIC: ":non-deterministic" NEG_PRECONDITION: ":negative-preconditions" DIS_PRECONDITION: ":disjunctive-preconditions" +DERIVED_PREDICATES: ":derived-predicates" +CONDITIONAL_EFFECTS: ":conditional-effects" // others LPAR : "(" diff --git a/pddl/parser/domain.lark b/pddl/parser/domain.lark index ff60c01..0f716df 100644 --- a/pddl/parser/domain.lark +++ b/pddl/parser/domain.lark @@ -11,10 +11,11 @@ predicates: LPAR PREDICATES atomic_formula_skeleton+ RPAR atomic_formula_skeleton: LPAR NAME typed_list_variable RPAR -?structure_def: action_def +?structure_def: action_def | derived_predicates action_def: LPAR ACTION NAME PARAMETERS action_parameters action_body_def RPAR action_parameters: LPAR typed_list_variable RPAR ?action_body_def: [PRECONDITION emptyor_pregd] [EFFECT emptyor_effect] +derived_predicates: LPAR DERIVED atomic_formula_skeleton gd RPAR // preconditions emptyor_pregd: LPAR RPAR @@ -28,11 +29,16 @@ gd: atomic_formula_term // effects emptyor_effect: LPAR RPAR | effect -effect: LPAR AND effect* RPAR - | LPAR ONEOF effect+ RPAR - | p_effect +effect: LPAR AND c_effect* RPAR + | c_effect +c_effect: LPAR FORALL LPAR typed_list_variable RPAR effect RPAR + | LPAR WHEN gd cond_effect RPAR + | LPAR ONEOF effect+ RPAR + | p_effect p_effect: LPAR NOT atomic_formula_term RPAR | atomic_formula_term +cond_effect: LPAR AND p_effect* RPAR + | p_effect atomic_formula_term: LPAR predicate term* RPAR | LPAR EQUAL_OP term term RPAR @@ -68,6 +74,9 @@ type_def: LPAR EITHER primitive_type+ RPAR %import .common.PARAMETERS -> PARAMETERS %import .common.PRECONDITION -> PRECONDITION %import .common.EFFECT -> EFFECT +%import .common.DERIVED -> DERIVED +%import .common.FORALL -> FORALL +%import .common.WHEN -> WHEN %import .common.OBJECT -> OBJECT %import .common.AND -> AND %import .common.OR -> OR diff --git a/pddl/parser/domain.py b/pddl/parser/domain.py index 0da3ab4..f791687 100644 --- a/pddl/parser/domain.py +++ b/pddl/parser/domain.py @@ -27,9 +27,10 @@ from pddl.core import Action, Domain, Requirements from pddl.exceptions import PDDLMissingRequirementError -from pddl.helpers.base import assert_, find, safe_get, safe_index +from pddl.helpers.base import assert_, safe_get, safe_index from pddl.logic.base import And, FalseFormula, Imply, Not, OneOf, Or -from pddl.logic.predicates import EqualTo, Predicate +from pddl.logic.effects import AndEffect, Forall, When +from pddl.logic.predicates import DerivedPredicate, EqualTo, Predicate from pddl.logic.terms import Constant, Variable from pddl.parser import DOMAIN_GRAMMAR_FILE, PARSERS_DIRECTORY from pddl.parser.symbols import Symbols @@ -46,6 +47,7 @@ def __init__(self, *args, **kwargs): self._predicates_by_name: Dict[str, Predicate] = {} self._current_parameters_by_name: Dict[str, Variable] = {} self._requirements: Set[str] = set() + self._extended_requirements: Set[str] = set() def start(self, args): """Entry point.""" @@ -53,38 +55,52 @@ def start(self, args): def domain(self, args): """Process the 'domain' rule.""" - first_action_index = find(args, lambda x: isinstance(x, Action)) - return Domain( - **dict(args[2:first_action_index]), actions=args[first_action_index:-1] - ) + kwargs = {} + actions = [] + derived_predicates = [] + for arg in args[2:-1]: + if isinstance(arg, Action): + actions.append(arg) + elif isinstance(arg, DerivedPredicate): + derived_predicates.append(arg) + else: + assert isinstance(arg, dict) + kwargs.update(arg) + kwargs.update(actions=actions, derived_predicates=derived_predicates) + return Domain(**kwargs) def domain_def(self, args): """Process the 'domain_def' rule.""" - return "name", args[2] + return dict(name=args[2]) def requirements(self, args): """Process the 'requirements' rule.""" self._requirements = {Requirements(r[1:]) for r in args[2:-1]} - return "requirements", self._requirements + + self._extended_requirements = set(self._requirements) + if Requirements.STRIPS in self._requirements: + self._extended_requirements.update(Requirements.strips_requirements()) + + return dict(requirements=self._requirements) def types(self, args): """Parse the 'types' rule.""" - if not bool({Requirements.TYPING} & self._requirements): + if not bool({Requirements.TYPING} & self._extended_requirements): raise PDDLMissingRequirementError(Requirements.TYPING) - return "types", list(args[2].keys()) + return dict(types=list(args[2].keys())) def constants(self, args): """Process the 'constant_def' rule.""" self._constants_by_name = { name: Constant(name, type_tags) for name, type_tags in args[2].items() } - return "constants", list(self._constants_by_name.values()) + return dict(constants=list(self._constants_by_name.values())) def predicates(self, args): """Process the 'predicates' rule.""" predicates = args[2:-1] self._predicates_by_name = {p.name: p for p in predicates} - return "predicates", predicates + return dict(predicates=predicates) def action_def(self, args): """Process the 'action_def' rule.""" @@ -98,6 +114,12 @@ def action_def(self, args): } return Action(name, variables, **action_body) + def derived_predicates(self, args): + """Process the 'derived_predicates' rule.""" + predicate = args[2] + condition = args[3] + return DerivedPredicate(predicate, condition) + def action_parameters(self, args): """Process the 'action_parameters' rule.""" self._current_parameters_by_name = { @@ -119,23 +141,28 @@ def gd(self, args): return args[0] elif args[1] == Symbols.NOT.value: if not bool( - {Requirements.NEG_PRECONDITION, Requirements.ADL} & self._requirements + {Requirements.NEG_PRECONDITION, Requirements.ADL} + & self._extended_requirements ): - raise PDDLMissingRequirementError(Requirements.NEG_PRECONDITION) + # raise PDDLMissingRequirementError(Requirements.NEG_PRECONDITION) + # TODO temporary change; remove + pass return Not(args[2]) elif args[1] == Symbols.AND.value: operands = args[2:-1] return And(*operands) elif args[1] == Symbols.OR.value: if not bool( - {Requirements.DIS_PRECONDITION, Requirements.ADL} & self._requirements + {Requirements.DIS_PRECONDITION, Requirements.ADL} + & self._extended_requirements ): raise PDDLMissingRequirementError(Requirements.DIS_PRECONDITION) operands = args[2:-1] return Or(*operands) elif args[1] == Symbols.IMPLY.value: if not bool( - {Requirements.DIS_PRECONDITION, Requirements.ADL} & self._requirements + {Requirements.DIS_PRECONDITION, Requirements.ADL} + & self._extended_requirements ): raise PDDLMissingRequirementError(Requirements.DIS_PRECONDITION) return Imply(args[2], args[3]) @@ -151,12 +178,23 @@ def effect(self, args): """Process the 'effect' rule.""" if len(args) == 1: return args[0] - elif args[1] == Symbols.AND.value: - return And(*args[2:-1]) - elif args[1] == Symbols.ONEOF.value: - if not bool({Requirements.NON_DETERMINISTIC} & self._requirements): + if args[1] == Symbols.AND.value: + return AndEffect(*args[2:-1]) + raise ValueError("case not recognized") + + def c_effect(self, args): + """Process the 'c_effect' rule.""" + if len(args) == 1: + return args[0] + if args[1] == Symbols.FORALL.value: + return Forall(effects=args[-2], variables=args[3]) + if args[1] == Symbols.WHEN.value: + return When(args[2], args[3]) + if args[1] == Symbols.ONEOF.value: + if not bool({Requirements.NON_DETERMINISTIC} & self._extended_requirements): raise PDDLMissingRequirementError(Requirements.NON_DETERMINISTIC) return OneOf(*args[2:-1]) + raise ValueError() def p_effect(self, args): """Process the 'p_effect' rule.""" @@ -165,6 +203,14 @@ def p_effect(self, args): else: return Not(args[2]) + def cond_effect(self, args): + """Process the 'cond_effect' rule.""" + if len(args) >= 3 and args[1] == Symbols.AND.value: + p_effects = args[2:-1] + return AndEffect(p_effects) + assert len(args) == 1 + return args[0] + def atomic_formula_term(self, args): """Process the 'atomic_formula_term' rule.""" @@ -172,7 +218,7 @@ def constant_or_variable(t): return t if isinstance(t, Constant) else self._current_parameters_by_name[t] if args[1] == Symbols.EQUAL.value: - if not bool({Requirements.EQUALITY} & self._requirements): + if not bool({Requirements.EQUALITY} & self._extended_requirements): raise PDDLMissingRequirementError(Requirements.EQUALITY) left = constant_or_variable(args[2]) right = constant_or_variable(args[3]) @@ -202,6 +248,9 @@ def typed_list_name(self, args): Process the 'typed_list_name' rule. Return a dictionary with as keys the names and as value a set of types for each name. + + :param args: the argument of this grammar rule + :return: a typed list (name) """ return self._typed_list_x(args) @@ -210,6 +259,9 @@ def typed_list_variable(self, args): Process the 'typed_list_variable' rule. Return a dictionary with as keys the terms and as value a set of types for each name. + + :param args: the argument of this grammar rule + :return: a typed list (variable) """ return self._typed_list_x(args) diff --git a/pddl/parser/problem.py b/pddl/parser/problem.py index 0f1bf0a..7344415 100644 --- a/pddl/parser/problem.py +++ b/pddl/parser/problem.py @@ -78,6 +78,9 @@ def typed_list_name(self, args): Process the 'typed_list_name' rule. Return a dictionary with as keys the names and as value a set of types for each name. + + :param args: the argument of this grammar rule + :return: a typed list (name) """ return self._domain_transformer._typed_list_x(args) diff --git a/pddl/parser/symbols.py b/pddl/parser/symbols.py index 65b5a31..dfcebc9 100644 --- a/pddl/parser/symbols.py +++ b/pddl/parser/symbols.py @@ -42,6 +42,7 @@ class Symbols(Enum): FORALL = "forall" EXISTS = "exists" WHEN = "when" + DERIVED = ":derived" DOMAIN_P = ":domain" OBJECTS = ":objects" INIT = ":init" @@ -63,16 +64,22 @@ class Symbols(Enum): ALL_SYMBOLS = {v.value for v in Symbols} # type: Set[str] -class Requirements(Enum): +class RequirementSymbols(Enum): """A set of requirements that can be used in PDDL.""" STRIPS = ":strips" - ADL = ":adl" - NON_DETERMINISTIC = ":non-deterministic" + TYPING = ":typing" NEG_PRECONDITION = ":negative-preconditions" DIS_PRECONDITION = ":disjunctive-preconditions" EQUALITY = ":equality" - TYPING = ":typing" + CONDITIONAL_EFFECTS = ":conditional-effects" + ADL = ":adl" + DERIVED_PREDICATES = ":derived-predicates" + NON_DETERMINISTIC = ":non-deterministic" + + def strip(self) -> str: + """Strip the leading colon.""" + return self.value[1:] -ALL_REQUIREMENTS = {v.value for v in Requirements} # type: Set[str] +ALL_REQUIREMENTS = {v.value for v in RequirementSymbols} # type: Set[str] diff --git a/scripts/whitelist.py b/scripts/whitelist.py index 63298e9..e0db5fa 100644 --- a/scripts/whitelist.py +++ b/scripts/whitelist.py @@ -1,67 +1,55 @@ -STRIPS # unused variable (/home/marcofavorito/workfolder/pddl/pddl/core.py:296) -EQUALITY # unused variable (/home/marcofavorito/workfolder/pddl/pddl/core.py:297) -TYPING # unused variable (/home/marcofavorito/workfolder/pddl/pddl/core.py:298) -NON_DETERMINISTIC # unused variable (/home/marcofavorito/workfolder/pddl/pddl/core.py:299) -ensure_formula # unused function (/home/marcofavorito/workfolder/pddl/pddl/logic/base.py:213) -_._predicates_by_name # unused attribute (/home/marcofavorito/workfolder/pddl/pddl/parser/domain.py:45) -_.start # unused method (/home/marcofavorito/workfolder/pddl/pddl/parser/domain.py:48) -_.domain_def # unused method (/home/marcofavorito/workfolder/pddl/pddl/parser/domain.py:59) -_._predicates_by_name # unused attribute (/home/marcofavorito/workfolder/pddl/pddl/parser/domain.py:81) -_.action_def # unused method (/home/marcofavorito/workfolder/pddl/pddl/parser/domain.py:84) -_.action_parameters # unused method (/home/marcofavorito/workfolder/pddl/pddl/parser/domain.py:96) -_.emptyor_pregd # unused method (/home/marcofavorito/workfolder/pddl/pddl/parser/domain.py:103) -_.gd # unused method (/home/marcofavorito/workfolder/pddl/pddl/parser/domain.py:111) -_.emptyor_effect # unused method (/home/marcofavorito/workfolder/pddl/pddl/parser/domain.py:121) -_.oneof_effect # unused method (/home/marcofavorito/workfolder/pddl/pddl/parser/domain.py:128) -_.p_effect # unused method (/home/marcofavorito/workfolder/pddl/pddl/parser/domain.py:142) -_.atomic_formula_term # unused method (/home/marcofavorito/workfolder/pddl/pddl/parser/domain.py:149) -_.atomic_formula_skeleton # unused method (/home/marcofavorito/workfolder/pddl/pddl/parser/domain.py:172) -_.typed_list_name # unused method (/home/marcofavorito/workfolder/pddl/pddl/parser/domain.py:179) -_.typed_list_variable # unused method (/home/marcofavorito/workfolder/pddl/pddl/parser/domain.py:187) -_.type_def # unused method (/home/marcofavorito/workfolder/pddl/pddl/parser/domain.py:210) -_.start # unused method (/home/marcofavorito/workfolder/pddl/pddl/parser/problem.py:47) -_.problem_def # unused method (/home/marcofavorito/workfolder/pddl/pddl/parser/problem.py:55) -_.problem_domain # unused method (/home/marcofavorito/workfolder/pddl/pddl/parser/problem.py:59) -_.typed_list_name # unused method (/home/marcofavorito/workfolder/pddl/pddl/parser/problem.py:76) -_.domain__type_def # unused method (/home/marcofavorito/workfolder/pddl/pddl/parser/problem.py:84) -_.literal_name # unused method (/home/marcofavorito/workfolder/pddl/pddl/parser/problem.py:93) -_.gd_name # unused method (/home/marcofavorito/workfolder/pddl/pddl/parser/problem.py:106) -_.atomic_formula_name # unused method (/home/marcofavorito/workfolder/pddl/pddl/parser/problem.py:117) -OpSymbol # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:27) -OpRequirement # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:28) -DEFINE # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:34) -DOMAIN # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:35) -PROBLEM # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:36) -OR # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:38) -IMPLY # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:40) -ONEOF # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:41) -FORALL # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:42) -EXISTS # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:43) -WHEN # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:44) -DOMAIN_P # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:45) -OBJECTS # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:46) -INIT # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:47) -GOAL # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:48) -REQUIREMENTS # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:49) -CONSTANTS # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:50) -STRIPS # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:51) -ADL # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:52) -NON_DETERMINISTIC # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:53) -EQUALITY # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:54) -TYPING # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:55) -TYPES # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:56) -PREDICATES # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:57) -ACTION # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:58) -PARAMETERS # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:59) -PRECONDITION # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:60) -EFFECT # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:61) -ROUND_BRACKET_LEFT # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:62) -ROUND_BRACKET_RIGHT # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:63) -ALL_SYMBOLS # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:68) -STRIPS # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:74) -ADL # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:75) -NON_DETERMINISTIC # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:76) -NEG_PRECONDITION # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:77) -EQUALITY # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:78) -TYPING # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:79) -ALL_REQUIREMENTS # unused variable (/home/marcofavorito/workfolder/pddl/pddl/parser/symbols.py:82) +# flake8: noqa +# type: ignore +# pylint: skip-file +find # unused function (pddl/helpers/base.py:86) +ensure_formula # unused function (pddl/logic/base.py:222) +PEffect # unused variable (pddl/logic/effects.py:180) +Effect # unused variable (pddl/logic/effects.py:182) +CondEffect # unused variable (pddl/logic/effects.py:183) +_._predicates_by_name # unused attribute (pddl/parser/domain.py:47) +_.start # unused method (pddl/parser/domain.py:52) +_.domain_def # unused method (pddl/parser/domain.py:72) +_._predicates_by_name # unused attribute (pddl/parser/domain.py:102) +_.action_def # unused method (pddl/parser/domain.py:105) +_.action_parameters # unused method (pddl/parser/domain.py:123) +_.emptyor_pregd # unused method (pddl/parser/domain.py:130) +_.gd # unused method (pddl/parser/domain.py:138) +_.emptyor_effect # unused method (pddl/parser/domain.py:168) +_.c_effect # unused method (pddl/parser/domain.py:187) +_.p_effect # unused method (pddl/parser/domain.py:197) +_.cond_effect # unused method (pddl/parser/domain.py:204) +_.atomic_formula_term # unused method (pddl/parser/domain.py:212) +_.atomic_formula_skeleton # unused method (pddl/parser/domain.py:237) +_.typed_list_name # unused method (pddl/parser/domain.py:244) +_.typed_list_variable # unused method (pddl/parser/domain.py:255) +_.type_def # unused method (pddl/parser/domain.py:282) +_.start # unused method (pddl/parser/problem.py:47) +_.problem_def # unused method (pddl/parser/problem.py:55) +_.problem_domain # unused method (pddl/parser/problem.py:59) +_.typed_list_name # unused method (pddl/parser/problem.py:76) +_.domain__type_def # unused method (pddl/parser/problem.py:87) +_.literal_name # unused method (pddl/parser/problem.py:96) +_.gd_name # unused method (pddl/parser/problem.py:109) +_.atomic_formula_name # unused method (pddl/parser/problem.py:120) +OpSymbol # unused variable (pddl/parser/symbols.py:27) +OpRequirement # unused variable (pddl/parser/symbols.py:28) +DEFINE # unused variable (pddl/parser/symbols.py:34) +DOMAIN # unused variable (pddl/parser/symbols.py:35) +PROBLEM # unused variable (pddl/parser/symbols.py:36) +EXISTS # unused variable (pddl/parser/symbols.py:43) +DOMAIN_P # unused variable (pddl/parser/symbols.py:46) +OBJECTS # unused variable (pddl/parser/symbols.py:47) +INIT # unused variable (pddl/parser/symbols.py:48) +GOAL # unused variable (pddl/parser/symbols.py:49) +REQUIREMENTS # unused variable (pddl/parser/symbols.py:50) +CONSTANTS # unused variable (pddl/parser/symbols.py:51) +TYPES # unused variable (pddl/parser/symbols.py:52) +PREDICATES # unused variable (pddl/parser/symbols.py:53) +ACTION # unused variable (pddl/parser/symbols.py:54) +PARAMETERS # unused variable (pddl/parser/symbols.py:55) +PRECONDITION # unused variable (pddl/parser/symbols.py:56) +EFFECT # unused variable (pddl/parser/symbols.py:57) +ROUND_BRACKET_LEFT # unused variable (pddl/parser/symbols.py:58) +ROUND_BRACKET_RIGHT # unused variable (pddl/parser/symbols.py:59) +ALL_SYMBOLS # unused variable (pddl/parser/symbols.py:64) +ALL_REQUIREMENTS # unused variable (pddl/parser/symbols.py:85)