From 0049305493ac1a050d567828864b8adfa942c45e Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Fri, 27 Oct 2023 09:34:01 -0600 Subject: [PATCH 01/35] adds docker package --- Pipfile.lock | 1552 +++++++++++++++++++++++++++----------------------- setup.cfg | 1 + 2 files changed, 842 insertions(+), 711 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index f58c89c..9b43038 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -25,100 +25,115 @@ }, "certifi": { "hashes": [ - "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3", - "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18" + "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", + "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" ], "markers": "python_version >= '3.6'", - "version": "==2022.12.7" + "version": "==2023.7.22" }, "charset-normalizer": { "hashes": [ - "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6", - "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1", - "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e", - "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373", - "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62", - "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230", - "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be", - "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c", - "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0", - "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448", - "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f", - "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649", - "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d", - "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0", - "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706", - "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a", - "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59", - "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23", - "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5", - "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb", - "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e", - "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e", - "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c", - "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28", - "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d", - "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41", - "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974", - "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce", - "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f", - "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1", - "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d", - "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8", - "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017", - "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31", - "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7", - "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8", - "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e", - "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14", - "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd", - "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d", - "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795", - "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b", - "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b", - "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b", - "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203", - "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f", - "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19", - "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1", - "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a", - "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac", - "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9", - "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0", - "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137", - "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f", - "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6", - "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5", - "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909", - "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f", - "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0", - "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324", - "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755", - "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb", - "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854", - "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c", - "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60", - "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84", - "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0", - "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b", - "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1", - "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531", - "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1", - "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11", - "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326", - "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df", - "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab" + "sha256:06cf46bdff72f58645434d467bf5228080801298fbba19fe268a01b4534467f5", + "sha256:0c8c61fb505c7dad1d251c284e712d4e0372cef3b067f7ddf82a7fa82e1e9a93", + "sha256:10b8dd31e10f32410751b3430996f9807fc4d1587ca69772e2aa940a82ab571a", + "sha256:1171ef1fc5ab4693c5d151ae0fdad7f7349920eabbaca6271f95969fa0756c2d", + "sha256:17a866d61259c7de1bdadef418a37755050ddb4b922df8b356503234fff7932c", + "sha256:1d6bfc32a68bc0933819cfdfe45f9abc3cae3877e1d90aac7259d57e6e0f85b1", + "sha256:1ec937546cad86d0dce5396748bf392bb7b62a9eeb8c66efac60e947697f0e58", + "sha256:223b4d54561c01048f657fa6ce41461d5ad8ff128b9678cfe8b2ecd951e3f8a2", + "sha256:2465aa50c9299d615d757c1c888bc6fef384b7c4aec81c05a0172b4400f98557", + "sha256:28f512b9a33235545fbbdac6a330a510b63be278a50071a336afc1b78781b147", + "sha256:2c092be3885a1b7899cd85ce24acedc1034199d6fca1483fa2c3a35c86e43041", + "sha256:2c4c99f98fc3a1835af8179dcc9013f93594d0670e2fa80c83aa36346ee763d2", + "sha256:31445f38053476a0c4e6d12b047b08ced81e2c7c712e5a1ad97bc913256f91b2", + "sha256:31bbaba7218904d2eabecf4feec0d07469284e952a27400f23b6628439439fa7", + "sha256:34d95638ff3613849f473afc33f65c401a89f3b9528d0d213c7037c398a51296", + "sha256:352a88c3df0d1fa886562384b86f9a9e27563d4704ee0e9d56ec6fcd270ea690", + "sha256:39b70a6f88eebe239fa775190796d55a33cfb6d36b9ffdd37843f7c4c1b5dc67", + "sha256:3c66df3f41abee950d6638adc7eac4730a306b022570f71dd0bd6ba53503ab57", + "sha256:3f70fd716855cd3b855316b226a1ac8bdb3caf4f7ea96edcccc6f484217c9597", + "sha256:3f9bc2ce123637a60ebe819f9fccc614da1bcc05798bbbaf2dd4ec91f3e08846", + "sha256:3fb765362688821404ad6cf86772fc54993ec11577cd5a92ac44b4c2ba52155b", + "sha256:45f053a0ece92c734d874861ffe6e3cc92150e32136dd59ab1fb070575189c97", + "sha256:46fb9970aa5eeca547d7aa0de5d4b124a288b42eaefac677bde805013c95725c", + "sha256:4cb50a0335382aac15c31b61d8531bc9bb657cfd848b1d7158009472189f3d62", + "sha256:4e12f8ee80aa35e746230a2af83e81bd6b52daa92a8afaef4fea4a2ce9b9f4fa", + "sha256:4f3100d86dcd03c03f7e9c3fdb23d92e32abbca07e7c13ebd7ddfbcb06f5991f", + "sha256:4f6e2a839f83a6a76854d12dbebde50e4b1afa63e27761549d006fa53e9aa80e", + "sha256:4f861d94c2a450b974b86093c6c027888627b8082f1299dfd5a4bae8e2292821", + "sha256:501adc5eb6cd5f40a6f77fbd90e5ab915c8fd6e8c614af2db5561e16c600d6f3", + "sha256:520b7a142d2524f999447b3a0cf95115df81c4f33003c51a6ab637cbda9d0bf4", + "sha256:548eefad783ed787b38cb6f9a574bd8664468cc76d1538215d510a3cd41406cb", + "sha256:555fe186da0068d3354cdf4bbcbc609b0ecae4d04c921cc13e209eece7720727", + "sha256:55602981b2dbf8184c098bc10287e8c245e351cd4fdcad050bd7199d5a8bf514", + "sha256:58e875eb7016fd014c0eea46c6fa92b87b62c0cb31b9feae25cbbe62c919f54d", + "sha256:5a3580a4fdc4ac05f9e53c57f965e3594b2f99796231380adb2baaab96e22761", + "sha256:5b70bab78accbc672f50e878a5b73ca692f45f5b5e25c8066d748c09405e6a55", + "sha256:5ceca5876032362ae73b83347be8b5dbd2d1faf3358deb38c9c88776779b2e2f", + "sha256:61f1e3fb621f5420523abb71f5771a204b33c21d31e7d9d86881b2cffe92c47c", + "sha256:633968254f8d421e70f91c6ebe71ed0ab140220469cf87a9857e21c16687c034", + "sha256:63a6f59e2d01310f754c270e4a257426fe5a591dc487f1983b3bbe793cf6bac6", + "sha256:63accd11149c0f9a99e3bc095bbdb5a464862d77a7e309ad5938fbc8721235ae", + "sha256:6db3cfb9b4fcecb4390db154e75b49578c87a3b9979b40cdf90d7e4b945656e1", + "sha256:71ef3b9be10070360f289aea4838c784f8b851be3ba58cf796262b57775c2f14", + "sha256:7ae8e5142dcc7a49168f4055255dbcced01dc1714a90a21f87448dc8d90617d1", + "sha256:7b6cefa579e1237ce198619b76eaa148b71894fb0d6bcf9024460f9bf30fd228", + "sha256:800561453acdecedaac137bf09cd719c7a440b6800ec182f077bb8e7025fb708", + "sha256:82ca51ff0fc5b641a2d4e1cc8c5ff108699b7a56d7f3ad6f6da9dbb6f0145b48", + "sha256:851cf693fb3aaef71031237cd68699dded198657ec1e76a76eb8be58c03a5d1f", + "sha256:854cc74367180beb327ab9d00f964f6d91da06450b0855cbbb09187bcdb02de5", + "sha256:87071618d3d8ec8b186d53cb6e66955ef2a0e4fa63ccd3709c0c90ac5a43520f", + "sha256:871d045d6ccc181fd863a3cd66ee8e395523ebfbc57f85f91f035f50cee8e3d4", + "sha256:8aee051c89e13565c6bd366813c386939f8e928af93c29fda4af86d25b73d8f8", + "sha256:8af5a8917b8af42295e86b64903156b4f110a30dca5f3b5aedea123fbd638bff", + "sha256:8ec8ef42c6cd5856a7613dcd1eaf21e5573b2185263d87d27c8edcae33b62a61", + "sha256:91e43805ccafa0a91831f9cd5443aa34528c0c3f2cc48c4cb3d9a7721053874b", + "sha256:9505dc359edb6a330efcd2be825fdb73ee3e628d9010597aa1aee5aa63442e97", + "sha256:985c7965f62f6f32bf432e2681173db41336a9c2611693247069288bcb0c7f8b", + "sha256:9a74041ba0bfa9bc9b9bb2cd3238a6ab3b7618e759b41bd15b5f6ad958d17605", + "sha256:9edbe6a5bf8b56a4a84533ba2b2f489d0046e755c29616ef8830f9e7d9cf5728", + "sha256:a15c1fe6d26e83fd2e5972425a772cca158eae58b05d4a25a4e474c221053e2d", + "sha256:a66bcdf19c1a523e41b8e9d53d0cedbfbac2e93c649a2e9502cb26c014d0980c", + "sha256:ae4070f741f8d809075ef697877fd350ecf0b7c5837ed68738607ee0a2c572cf", + "sha256:ae55d592b02c4349525b6ed8f74c692509e5adffa842e582c0f861751701a673", + "sha256:b578cbe580e3b41ad17b1c428f382c814b32a6ce90f2d8e39e2e635d49e498d1", + "sha256:b891a2f68e09c5ef989007fac11476ed33c5c9994449a4e2c3386529d703dc8b", + "sha256:baec8148d6b8bd5cee1ae138ba658c71f5b03e0d69d5907703e3e1df96db5e41", + "sha256:bb06098d019766ca16fc915ecaa455c1f1cd594204e7f840cd6258237b5079a8", + "sha256:bc791ec3fd0c4309a753f95bb6c749ef0d8ea3aea91f07ee1cf06b7b02118f2f", + "sha256:bd28b31730f0e982ace8663d108e01199098432a30a4c410d06fe08fdb9e93f4", + "sha256:be4d9c2770044a59715eb57c1144dedea7c5d5ae80c68fb9959515037cde2008", + "sha256:c0c72d34e7de5604df0fde3644cc079feee5e55464967d10b24b1de268deceb9", + "sha256:c0e842112fe3f1a4ffcf64b06dc4c61a88441c2f02f373367f7b4c1aa9be2ad5", + "sha256:c15070ebf11b8b7fd1bfff7217e9324963c82dbdf6182ff7050519e350e7ad9f", + "sha256:c2000c54c395d9e5e44c99dc7c20a64dc371f777faf8bae4919ad3e99ce5253e", + "sha256:c30187840d36d0ba2893bc3271a36a517a717f9fd383a98e2697ee890a37c273", + "sha256:cb7cd68814308aade9d0c93c5bd2ade9f9441666f8ba5aa9c2d4b389cb5e2a45", + "sha256:cd805513198304026bd379d1d516afbf6c3c13f4382134a2c526b8b854da1c2e", + "sha256:d0bf89afcbcf4d1bb2652f6580e5e55a840fdf87384f6063c4a4f0c95e378656", + "sha256:d9137a876020661972ca6eec0766d81aef8a5627df628b664b234b73396e727e", + "sha256:dbd95e300367aa0827496fe75a1766d198d34385a58f97683fe6e07f89ca3e3c", + "sha256:dced27917823df984fe0c80a5c4ad75cf58df0fbfae890bc08004cd3888922a2", + "sha256:de0b4caa1c8a21394e8ce971997614a17648f94e1cd0640fbd6b4d14cab13a72", + "sha256:debb633f3f7856f95ad957d9b9c781f8e2c6303ef21724ec94bea2ce2fcbd056", + "sha256:e372d7dfd154009142631de2d316adad3cc1c36c32a38b16a4751ba78da2a397", + "sha256:ecd26be9f112c4f96718290c10f4caea6cc798459a3a76636b817a0ed7874e42", + "sha256:edc0202099ea1d82844316604e17d2b175044f9bcb6b398aab781eba957224bd", + "sha256:f194cce575e59ffe442c10a360182a986535fd90b57f7debfaa5c845c409ecc3", + "sha256:f5fb672c396d826ca16a022ac04c9dce74e00a1c344f6ad1a0fdc1ba1f332213", + "sha256:f6a02a3c7950cafaadcd46a226ad9e12fc9744652cc69f9e5534f98b47f3bbcf", + "sha256:fe81b35c33772e56f4b6cf62cf4aedc1762ef7162a31e6ac7fe5e40d0149eb67" ], "markers": "python_full_version >= '3.7.0'", - "version": "==3.1.0" + "version": "==3.3.1" }, "click": { "hashes": [ - "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e", - "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48" + "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" ], "markers": "python_version >= '3.7'", - "version": "==8.1.3" + "version": "==8.1.7" }, "dcqc": { "editable": true, @@ -129,11 +144,11 @@ }, "deprecated": { "hashes": [ - "sha256:43ac5335da90c31c24ba028af536a91d41d53f9e6901ddb021bcc572ce44e38d", - "sha256:64756e3e14c8c5eea9795d93c524551432a0be75629f8f29e67ab8caf076c76d" + "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c", + "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.2.13" + "version": "==1.2.14" }, "fs": { "hashes": [ @@ -160,11 +175,11 @@ }, "importlib-metadata": { "hashes": [ - "sha256:43ce9281e097583d758c2c708c4376371261a02c34682491a8e98352365aad20", - "sha256:ff80f3b5394912eb1b108fcfd444dc78b7f1f3e16b16188054bd01cb9cb86f09" + "sha256:8a8a81bcf996e74fee46f0d16bd3eaa382a7eb20fd82445c3ad11f4090334116", + "sha256:dd0173e8f150d6815e098fd354f6414b0f079af4644ddfe90c71e2fc6174346d" ], "markers": "python_version >= '3.7'", - "version": "==6.1.0" + "version": "==4.13.0" }, "isodate": { "hashes": [ @@ -183,11 +198,11 @@ }, "pyparsing": { "hashes": [ - "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb", - "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc" + "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb", + "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db" ], "markers": "python_full_version >= '3.6.8'", - "version": "==3.0.9" + "version": "==3.1.1" }, "rdflib": { "hashes": [ @@ -199,19 +214,19 @@ }, "requests": { "hashes": [ - "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa", - "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf" + "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", + "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" ], - "markers": "python_version >= '3.7' and python_version < '4'", - "version": "==2.28.2" + "markers": "python_version >= '3.7'", + "version": "==2.31.0" }, "setuptools": { "hashes": [ - "sha256:257de92a9d50a60b8e22abfcbb771571fde0dbf3ec234463212027a4eeecbe9a", - "sha256:e728ca814a823bf7bf60162daf9db95b93d532948c4c0bea762ce62f60189078" + "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87", + "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a" ], - "markers": "python_version >= '3.7'", - "version": "==67.6.1" + "markers": "python_version >= '3.8'", + "version": "==68.2.2" }, "six": { "hashes": [ @@ -223,11 +238,11 @@ }, "synapseclient": { "hashes": [ - "sha256:241f170f0e8c8c3735cd73f81711e592a581c55f7a5c4566be7bee82d72a56bc", - "sha256:29f5e3c87474cb2629e9ce77c97e81e80a08f24ec2c5889f9fba14530b8c4bf7" + "sha256:dc5a61f9f495109a0c89aa7d42b641b6ff278280d7961fb450dd5015704fe15b", + "sha256:dd8b1a1b4667d08311bb651469431f43fe2eeab83c0ef1fe5a03c2929aeb26cd" ], "markers": "python_version >= '3.7'", - "version": "==2.7.0" + "version": "==2.7.2" }, "typer": { "hashes": [ @@ -239,11 +254,11 @@ }, "urllib3": { "hashes": [ - "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305", - "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42" + "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07", + "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0" ], "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.15" + "version": "==1.26.18" }, "wrapt": { "hashes": [ @@ -328,11 +343,11 @@ }, "zipp": { "hashes": [ - "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b", - "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556" + "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31", + "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0" ], - "markers": "python_version >= '3.7'", - "version": "==3.15.0" + "markers": "python_version >= '3.8'", + "version": "==3.17.0" } }, "develop": { @@ -361,26 +376,26 @@ }, "asttokens": { "hashes": [ - "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3", - "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c" + "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", + "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0" ], - "version": "==2.2.1" + "version": "==2.4.1" }, "attrs": { "hashes": [ - "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836", - "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99" + "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", + "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015" ], - "markers": "python_version >= '3.6'", - "version": "==22.2.0" + "markers": "python_version >= '3.7'", + "version": "==23.1.0" }, "babel": { "hashes": [ - "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610", - "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455" + "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900", + "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed" ], "markers": "python_version >= '3.7'", - "version": "==2.12.1" + "version": "==2.13.1" }, "backcall": { "hashes": [ @@ -409,108 +424,123 @@ }, "certifi": { "hashes": [ - "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3", - "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18" + "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", + "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" ], "markers": "python_version >= '3.6'", - "version": "==2022.12.7" + "version": "==2023.7.22" }, "cfgv": { "hashes": [ - "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426", - "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736" + "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", + "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560" ], - "markers": "python_full_version >= '3.6.1'", - "version": "==3.3.1" + "markers": "python_version >= '3.8'", + "version": "==3.4.0" }, "charset-normalizer": { "hashes": [ - "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6", - "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1", - "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e", - "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373", - "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62", - "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230", - "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be", - "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c", - "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0", - "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448", - "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f", - "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649", - "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d", - "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0", - "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706", - "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a", - "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59", - "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23", - "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5", - "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb", - "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e", - "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e", - "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c", - "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28", - "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d", - "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41", - "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974", - "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce", - "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f", - "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1", - "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d", - "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8", - "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017", - "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31", - "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7", - "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8", - "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e", - "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14", - "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd", - "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d", - "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795", - "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b", - "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b", - "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b", - "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203", - "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f", - "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19", - "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1", - "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a", - "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac", - "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9", - "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0", - "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137", - "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f", - "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6", - "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5", - "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909", - "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f", - "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0", - "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324", - "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755", - "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb", - "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854", - "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c", - "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60", - "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84", - "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0", - "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b", - "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1", - "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531", - "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1", - "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11", - "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326", - "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df", - "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab" + "sha256:06cf46bdff72f58645434d467bf5228080801298fbba19fe268a01b4534467f5", + "sha256:0c8c61fb505c7dad1d251c284e712d4e0372cef3b067f7ddf82a7fa82e1e9a93", + "sha256:10b8dd31e10f32410751b3430996f9807fc4d1587ca69772e2aa940a82ab571a", + "sha256:1171ef1fc5ab4693c5d151ae0fdad7f7349920eabbaca6271f95969fa0756c2d", + "sha256:17a866d61259c7de1bdadef418a37755050ddb4b922df8b356503234fff7932c", + "sha256:1d6bfc32a68bc0933819cfdfe45f9abc3cae3877e1d90aac7259d57e6e0f85b1", + "sha256:1ec937546cad86d0dce5396748bf392bb7b62a9eeb8c66efac60e947697f0e58", + "sha256:223b4d54561c01048f657fa6ce41461d5ad8ff128b9678cfe8b2ecd951e3f8a2", + "sha256:2465aa50c9299d615d757c1c888bc6fef384b7c4aec81c05a0172b4400f98557", + "sha256:28f512b9a33235545fbbdac6a330a510b63be278a50071a336afc1b78781b147", + "sha256:2c092be3885a1b7899cd85ce24acedc1034199d6fca1483fa2c3a35c86e43041", + "sha256:2c4c99f98fc3a1835af8179dcc9013f93594d0670e2fa80c83aa36346ee763d2", + "sha256:31445f38053476a0c4e6d12b047b08ced81e2c7c712e5a1ad97bc913256f91b2", + "sha256:31bbaba7218904d2eabecf4feec0d07469284e952a27400f23b6628439439fa7", + "sha256:34d95638ff3613849f473afc33f65c401a89f3b9528d0d213c7037c398a51296", + "sha256:352a88c3df0d1fa886562384b86f9a9e27563d4704ee0e9d56ec6fcd270ea690", + "sha256:39b70a6f88eebe239fa775190796d55a33cfb6d36b9ffdd37843f7c4c1b5dc67", + "sha256:3c66df3f41abee950d6638adc7eac4730a306b022570f71dd0bd6ba53503ab57", + "sha256:3f70fd716855cd3b855316b226a1ac8bdb3caf4f7ea96edcccc6f484217c9597", + "sha256:3f9bc2ce123637a60ebe819f9fccc614da1bcc05798bbbaf2dd4ec91f3e08846", + "sha256:3fb765362688821404ad6cf86772fc54993ec11577cd5a92ac44b4c2ba52155b", + "sha256:45f053a0ece92c734d874861ffe6e3cc92150e32136dd59ab1fb070575189c97", + "sha256:46fb9970aa5eeca547d7aa0de5d4b124a288b42eaefac677bde805013c95725c", + "sha256:4cb50a0335382aac15c31b61d8531bc9bb657cfd848b1d7158009472189f3d62", + "sha256:4e12f8ee80aa35e746230a2af83e81bd6b52daa92a8afaef4fea4a2ce9b9f4fa", + "sha256:4f3100d86dcd03c03f7e9c3fdb23d92e32abbca07e7c13ebd7ddfbcb06f5991f", + "sha256:4f6e2a839f83a6a76854d12dbebde50e4b1afa63e27761549d006fa53e9aa80e", + "sha256:4f861d94c2a450b974b86093c6c027888627b8082f1299dfd5a4bae8e2292821", + "sha256:501adc5eb6cd5f40a6f77fbd90e5ab915c8fd6e8c614af2db5561e16c600d6f3", + "sha256:520b7a142d2524f999447b3a0cf95115df81c4f33003c51a6ab637cbda9d0bf4", + "sha256:548eefad783ed787b38cb6f9a574bd8664468cc76d1538215d510a3cd41406cb", + "sha256:555fe186da0068d3354cdf4bbcbc609b0ecae4d04c921cc13e209eece7720727", + "sha256:55602981b2dbf8184c098bc10287e8c245e351cd4fdcad050bd7199d5a8bf514", + "sha256:58e875eb7016fd014c0eea46c6fa92b87b62c0cb31b9feae25cbbe62c919f54d", + "sha256:5a3580a4fdc4ac05f9e53c57f965e3594b2f99796231380adb2baaab96e22761", + "sha256:5b70bab78accbc672f50e878a5b73ca692f45f5b5e25c8066d748c09405e6a55", + "sha256:5ceca5876032362ae73b83347be8b5dbd2d1faf3358deb38c9c88776779b2e2f", + "sha256:61f1e3fb621f5420523abb71f5771a204b33c21d31e7d9d86881b2cffe92c47c", + "sha256:633968254f8d421e70f91c6ebe71ed0ab140220469cf87a9857e21c16687c034", + "sha256:63a6f59e2d01310f754c270e4a257426fe5a591dc487f1983b3bbe793cf6bac6", + "sha256:63accd11149c0f9a99e3bc095bbdb5a464862d77a7e309ad5938fbc8721235ae", + "sha256:6db3cfb9b4fcecb4390db154e75b49578c87a3b9979b40cdf90d7e4b945656e1", + "sha256:71ef3b9be10070360f289aea4838c784f8b851be3ba58cf796262b57775c2f14", + "sha256:7ae8e5142dcc7a49168f4055255dbcced01dc1714a90a21f87448dc8d90617d1", + "sha256:7b6cefa579e1237ce198619b76eaa148b71894fb0d6bcf9024460f9bf30fd228", + "sha256:800561453acdecedaac137bf09cd719c7a440b6800ec182f077bb8e7025fb708", + "sha256:82ca51ff0fc5b641a2d4e1cc8c5ff108699b7a56d7f3ad6f6da9dbb6f0145b48", + "sha256:851cf693fb3aaef71031237cd68699dded198657ec1e76a76eb8be58c03a5d1f", + "sha256:854cc74367180beb327ab9d00f964f6d91da06450b0855cbbb09187bcdb02de5", + "sha256:87071618d3d8ec8b186d53cb6e66955ef2a0e4fa63ccd3709c0c90ac5a43520f", + "sha256:871d045d6ccc181fd863a3cd66ee8e395523ebfbc57f85f91f035f50cee8e3d4", + "sha256:8aee051c89e13565c6bd366813c386939f8e928af93c29fda4af86d25b73d8f8", + "sha256:8af5a8917b8af42295e86b64903156b4f110a30dca5f3b5aedea123fbd638bff", + "sha256:8ec8ef42c6cd5856a7613dcd1eaf21e5573b2185263d87d27c8edcae33b62a61", + "sha256:91e43805ccafa0a91831f9cd5443aa34528c0c3f2cc48c4cb3d9a7721053874b", + "sha256:9505dc359edb6a330efcd2be825fdb73ee3e628d9010597aa1aee5aa63442e97", + "sha256:985c7965f62f6f32bf432e2681173db41336a9c2611693247069288bcb0c7f8b", + "sha256:9a74041ba0bfa9bc9b9bb2cd3238a6ab3b7618e759b41bd15b5f6ad958d17605", + "sha256:9edbe6a5bf8b56a4a84533ba2b2f489d0046e755c29616ef8830f9e7d9cf5728", + "sha256:a15c1fe6d26e83fd2e5972425a772cca158eae58b05d4a25a4e474c221053e2d", + "sha256:a66bcdf19c1a523e41b8e9d53d0cedbfbac2e93c649a2e9502cb26c014d0980c", + "sha256:ae4070f741f8d809075ef697877fd350ecf0b7c5837ed68738607ee0a2c572cf", + "sha256:ae55d592b02c4349525b6ed8f74c692509e5adffa842e582c0f861751701a673", + "sha256:b578cbe580e3b41ad17b1c428f382c814b32a6ce90f2d8e39e2e635d49e498d1", + "sha256:b891a2f68e09c5ef989007fac11476ed33c5c9994449a4e2c3386529d703dc8b", + "sha256:baec8148d6b8bd5cee1ae138ba658c71f5b03e0d69d5907703e3e1df96db5e41", + "sha256:bb06098d019766ca16fc915ecaa455c1f1cd594204e7f840cd6258237b5079a8", + "sha256:bc791ec3fd0c4309a753f95bb6c749ef0d8ea3aea91f07ee1cf06b7b02118f2f", + "sha256:bd28b31730f0e982ace8663d108e01199098432a30a4c410d06fe08fdb9e93f4", + "sha256:be4d9c2770044a59715eb57c1144dedea7c5d5ae80c68fb9959515037cde2008", + "sha256:c0c72d34e7de5604df0fde3644cc079feee5e55464967d10b24b1de268deceb9", + "sha256:c0e842112fe3f1a4ffcf64b06dc4c61a88441c2f02f373367f7b4c1aa9be2ad5", + "sha256:c15070ebf11b8b7fd1bfff7217e9324963c82dbdf6182ff7050519e350e7ad9f", + "sha256:c2000c54c395d9e5e44c99dc7c20a64dc371f777faf8bae4919ad3e99ce5253e", + "sha256:c30187840d36d0ba2893bc3271a36a517a717f9fd383a98e2697ee890a37c273", + "sha256:cb7cd68814308aade9d0c93c5bd2ade9f9441666f8ba5aa9c2d4b389cb5e2a45", + "sha256:cd805513198304026bd379d1d516afbf6c3c13f4382134a2c526b8b854da1c2e", + "sha256:d0bf89afcbcf4d1bb2652f6580e5e55a840fdf87384f6063c4a4f0c95e378656", + "sha256:d9137a876020661972ca6eec0766d81aef8a5627df628b664b234b73396e727e", + "sha256:dbd95e300367aa0827496fe75a1766d198d34385a58f97683fe6e07f89ca3e3c", + "sha256:dced27917823df984fe0c80a5c4ad75cf58df0fbfae890bc08004cd3888922a2", + "sha256:de0b4caa1c8a21394e8ce971997614a17648f94e1cd0640fbd6b4d14cab13a72", + "sha256:debb633f3f7856f95ad957d9b9c781f8e2c6303ef21724ec94bea2ce2fcbd056", + "sha256:e372d7dfd154009142631de2d316adad3cc1c36c32a38b16a4751ba78da2a397", + "sha256:ecd26be9f112c4f96718290c10f4caea6cc798459a3a76636b817a0ed7874e42", + "sha256:edc0202099ea1d82844316604e17d2b175044f9bcb6b398aab781eba957224bd", + "sha256:f194cce575e59ffe442c10a360182a986535fd90b57f7debfaa5c845c409ecc3", + "sha256:f5fb672c396d826ca16a022ac04c9dce74e00a1c344f6ad1a0fdc1ba1f332213", + "sha256:f6a02a3c7950cafaadcd46a226ad9e12fc9744652cc69f9e5534f98b47f3bbcf", + "sha256:fe81b35c33772e56f4b6cf62cf4aedc1762ef7162a31e6ac7fe5e40d0149eb67" ], "markers": "python_full_version >= '3.7.0'", - "version": "==3.1.0" + "version": "==3.3.1" }, "click": { "hashes": [ - "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e", - "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48" + "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" ], "markers": "python_version >= '3.7'", - "version": "==8.1.3" + "version": "==8.1.7" }, "colorama": { "hashes": [ @@ -522,71 +552,72 @@ }, "comm": { "hashes": [ - "sha256:16613c6211e20223f215fc6d3b266a247b6e2641bf4e0a3ad34cb1aff2aa3f37", - "sha256:a61efa9daffcfbe66fd643ba966f846a624e4e6d6767eda9cf6e993aadaab93e" + "sha256:354e40a59c9dd6db50c5cc6b4acc887d82e9603787f83b68c01a80a923984d15", + "sha256:6d52794cba11b36ed9860999cd10fd02d6b2eac177068fdd585e1e2f8a96e67a" ], "markers": "python_version >= '3.6'", - "version": "==0.1.3" + "version": "==0.1.4" }, "coverage": { "extras": [ "toml" ], "hashes": [ - "sha256:006ed5582e9cbc8115d2e22d6d2144a0725db542f654d9d4fda86793832f873d", - "sha256:046936ab032a2810dcaafd39cc4ef6dd295df1a7cbead08fe996d4765fca9fe4", - "sha256:0484d9dd1e6f481b24070c87561c8d7151bdd8b044c93ac99faafd01f695c78e", - "sha256:0ce383d5f56d0729d2dd40e53fe3afeb8f2237244b0975e1427bfb2cf0d32bab", - "sha256:186e0fc9cf497365036d51d4d2ab76113fb74f729bd25da0975daab2e107fd90", - "sha256:2199988e0bc8325d941b209f4fd1c6fa007024b1442c5576f1a32ca2e48941e6", - "sha256:299bc75cb2a41e6741b5e470b8c9fb78d931edbd0cd009c58e5c84de57c06731", - "sha256:3668291b50b69a0c1ef9f462c7df2c235da3c4073f49543b01e7eb1dee7dd540", - "sha256:36dd42da34fe94ed98c39887b86db9d06777b1c8f860520e21126a75507024f2", - "sha256:38004671848b5745bb05d4d621526fca30cee164db42a1f185615f39dc997292", - "sha256:387fb46cb8e53ba7304d80aadca5dca84a2fbf6fe3faf6951d8cf2d46485d1e5", - "sha256:3eb55b7b26389dd4f8ae911ba9bc8c027411163839dea4c8b8be54c4ee9ae10b", - "sha256:420f94a35e3e00a2b43ad5740f935358e24478354ce41c99407cddd283be00d2", - "sha256:4ac0f522c3b6109c4b764ffec71bf04ebc0523e926ca7cbe6c5ac88f84faced0", - "sha256:4c752d5264053a7cf2fe81c9e14f8a4fb261370a7bb344c2a011836a96fb3f57", - "sha256:4f01911c010122f49a3e9bdc730eccc66f9b72bd410a3a9d3cb8448bb50d65d3", - "sha256:4f68ee32d7c4164f1e2c8797535a6d0a3733355f5861e0f667e37df2d4b07140", - "sha256:4fa54fb483decc45f94011898727802309a109d89446a3c76387d016057d2c84", - "sha256:507e4720791977934bba016101579b8c500fb21c5fa3cd4cf256477331ddd988", - "sha256:53d0fd4c17175aded9c633e319360d41a1f3c6e352ba94edcb0fa5167e2bad67", - "sha256:55272f33da9a5d7cccd3774aeca7a01e500a614eaea2a77091e9be000ecd401d", - "sha256:5764e1f7471cb8f64b8cda0554f3d4c4085ae4b417bfeab236799863703e5de2", - "sha256:57b77b9099f172804e695a40ebaa374f79e4fb8b92f3e167f66facbf92e8e7f5", - "sha256:5afdad4cc4cc199fdf3e18088812edcf8f4c5a3c8e6cb69127513ad4cb7471a9", - "sha256:5cc0783844c84af2522e3a99b9b761a979a3ef10fb87fc4048d1ee174e18a7d8", - "sha256:5e1df45c23d4230e3d56d04414f9057eba501f78db60d4eeecfcb940501b08fd", - "sha256:6146910231ece63facfc5984234ad1b06a36cecc9fd0c028e59ac7c9b18c38c6", - "sha256:797aad79e7b6182cb49c08cc5d2f7aa7b2128133b0926060d0a8889ac43843be", - "sha256:7c20b731211261dc9739bbe080c579a1835b0c2d9b274e5fcd903c3a7821cf88", - "sha256:817295f06eacdc8623dc4df7d8b49cea65925030d4e1e2a7c7218380c0072c25", - "sha256:81f63e0fb74effd5be736cfe07d710307cc0a3ccb8f4741f7f053c057615a137", - "sha256:872d6ce1f5be73f05bea4df498c140b9e7ee5418bfa2cc8204e7f9b817caa968", - "sha256:8c99cb7c26a3039a8a4ee3ca1efdde471e61b4837108847fb7d5be7789ed8fd9", - "sha256:8dbe2647bf58d2c5a6c5bcc685f23b5f371909a5624e9f5cd51436d6a9f6c6ef", - "sha256:8efb48fa743d1c1a65ee8787b5b552681610f06c40a40b7ef94a5b517d885c54", - "sha256:92ebc1619650409da324d001b3a36f14f63644c7f0a588e331f3b0f67491f512", - "sha256:9d22e94e6dc86de981b1b684b342bec5e331401599ce652900ec59db52940005", - "sha256:ba279aae162b20444881fc3ed4e4f934c1cf8620f3dab3b531480cf602c76b7f", - "sha256:bc4803779f0e4b06a2361f666e76f5c2e3715e8e379889d02251ec911befd149", - "sha256:bfe7085783cda55e53510482fa7b5efc761fad1abe4d653b32710eb548ebdd2d", - "sha256:c448b5c9e3df5448a362208b8d4b9ed85305528313fca1b479f14f9fe0d873b8", - "sha256:c90e73bdecb7b0d1cea65a08cb41e9d672ac6d7995603d6465ed4914b98b9ad7", - "sha256:d2b96123a453a2d7f3995ddb9f28d01fd112319a7a4d5ca99796a7ff43f02af5", - "sha256:d52f0a114b6a58305b11a5cdecd42b2e7f1ec77eb20e2b33969d702feafdd016", - "sha256:d530191aa9c66ab4f190be8ac8cc7cfd8f4f3217da379606f3dd4e3d83feba69", - "sha256:d683d230b5774816e7d784d7ed8444f2a40e7a450e5720d58af593cb0b94a212", - "sha256:db45eec1dfccdadb179b0f9ca616872c6f700d23945ecc8f21bb105d74b1c5fc", - "sha256:db8c2c5ace167fd25ab5dd732714c51d4633f58bac21fb0ff63b0349f62755a8", - "sha256:e2926b8abedf750c2ecf5035c07515770944acf02e1c46ab08f6348d24c5f94d", - "sha256:e627dee428a176ffb13697a2c4318d3f60b2ccdde3acdc9b3f304206ec130ccd", - "sha256:efe1c0adad110bf0ad7fb59f833880e489a61e39d699d37249bdf42f80590169" + "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" ], - "markers": "python_version >= '3.7'", - "version": "==7.2.2" + "markers": "python_version >= '3.8'", + "version": "==7.3.2" }, "dcqc": { "editable": true, @@ -597,27 +628,27 @@ }, "debugpy": { "hashes": [ - "sha256:0ea1011e94416e90fb3598cc3ef5e08b0a4dd6ce6b9b33ccd436c1dffc8cd664", - "sha256:11a0f3a106f69901e4a9a5683ce943a7a5605696024134b522aa1bfda25b5fec", - "sha256:23363e6d2a04d726bbc1400bd4e9898d54419b36b2cdf7020e3e215e1dcd0f8e", - "sha256:23c29e40e39ad7d869d408ded414f6d46d82f8a93b5857ac3ac1e915893139ca", - "sha256:549ae0cb2d34fc09d1675f9b01942499751d174381b6082279cf19cdb3c47cbe", - "sha256:70ab53918fd907a3ade01909b3ed783287ede362c80c75f41e79596d5ccacd32", - "sha256:72687b62a54d9d9e3fb85e7a37ea67f0e803aaa31be700e61d2f3742a5683917", - "sha256:78739f77c58048ec006e2b3eb2e0cd5a06d5f48c915e2fc7911a337354508110", - "sha256:7aa7e103610e5867d19a7d069e02e72eb2b3045b124d051cfd1538f1d8832d1b", - "sha256:87755e173fcf2ec45f584bb9d61aa7686bb665d861b81faa366d59808bbd3494", - "sha256:9b5d1b13d7c7bf5d7cf700e33c0b8ddb7baf030fcf502f76fc061ddd9405d16c", - "sha256:a771739902b1ae22a120dbbb6bd91b2cae6696c0e318b5007c5348519a4211c6", - "sha256:b9c2130e1c632540fbf9c2c88341493797ddf58016e7cba02e311de9b0a96b67", - "sha256:be596b44448aac14eb3614248c91586e2bc1728e020e82ef3197189aae556115", - "sha256:c05349890804d846eca32ce0623ab66c06f8800db881af7a876dc073ac1c2225", - "sha256:de4a045fbf388e120bb6ec66501458d3134f4729faed26ff95de52a754abddb1", - "sha256:dff595686178b0e75580c24d316aa45a8f4d56e2418063865c114eef651a982e", - "sha256:f6383c29e796203a0bba74a250615ad262c4279d398e89d895a69d3069498305" + "sha256:125b9a637e013f9faac0a3d6a82bd17c8b5d2c875fb6b7e2772c5aba6d082332", + "sha256:12af2c55b419521e33d5fb21bd022df0b5eb267c3e178f1d374a63a2a6bdccd0", + "sha256:3c6fb41c98ec51dd010d7ed650accfd07a87fe5e93eca9d5f584d0578f28f35f", + "sha256:46ab6780159eeabb43c1495d9c84cf85d62975e48b6ec21ee10c95767c0590aa", + "sha256:57161629133113c97b387382045649a2b985a348f0c9366e22217c87b68b73c6", + "sha256:5d9de202f5d42e62f932507ee8b21e30d49aae7e46d5b1dd5c908db1d7068637", + "sha256:60009b132c91951354f54363f8ebdf7457aeb150e84abba5ae251b8e9f29a8a6", + "sha256:61eab4a4c8b6125d41a34bad4e5fe3d2cc145caecd63c3fe953be4cc53e65bf8", + "sha256:7fb95ca78f7ac43393cd0e0f2b6deda438ec7c5e47fa5d38553340897d2fbdfb", + "sha256:8cd0197141eb9e8a4566794550cfdcdb8b3db0818bdf8c49a8e8f8053e56e38b", + "sha256:9c9b0ac1ce2a42888199df1a1906e45e6f3c9555497643a85e0bf2406e3ffbc4", + "sha256:a64093656c4c64dc6a438e11d59369875d200bd5abb8f9b26c1f5f723622e153", + "sha256:a8b7a2fd27cd9f3553ac112f356ad4ca93338feadd8910277aff71ab24d8775f", + "sha256:b05a6b503ed520ad58c8dc682749113d2fd9f41ffd45daec16e558ca884008cd", + "sha256:bdc5ef99d14b9c0fcb35351b4fbfc06ac0ee576aeab6b2511702e5a648a2e595", + "sha256:e3412f9faa9ade82aa64a50b602544efcba848c91384e9f93497a458767e6926", + "sha256:ef54404365fae8d45cf450d0544ee40cefbcb9cb85ea7afe89a963c27028261e", + "sha256:ef9ab7df0b9a42ed9c878afd3eaaff471fce3fa73df96022e1f5c9f8f8c87ada" ], - "markers": "python_version >= '3.7'", - "version": "==1.6.6" + "markers": "python_version >= '3.8'", + "version": "==1.8.0" }, "decorator": { "hashes": [ @@ -629,18 +660,25 @@ }, "deprecated": { "hashes": [ - "sha256:43ac5335da90c31c24ba028af536a91d41d53f9e6901ddb021bcc572ce44e38d", - "sha256:64756e3e14c8c5eea9795d93c524551432a0be75629f8f29e67ab8caf076c76d" + "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c", + "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.2.13" + "version": "==1.2.14" }, "distlib": { "hashes": [ - "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46", - "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e" + "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057", + "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8" ], - "version": "==0.3.6" + "version": "==0.3.7" + }, + "docker": { + "hashes": [ + "sha256:aa6d17830045ba5ef0168d5eaa34d37beeb113948c413affe1d5991fc11f9a20", + "sha256:aecd2277b8bf8e506e484f6ab7aec39abe0038e29fa4a6d3ba86c3fe01844ed9" + ], + "version": "==6.1.3" }, "docutils": { "hashes": [ @@ -652,33 +690,33 @@ }, "execnet": { "hashes": [ - "sha256:8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5", - "sha256:a295f7cc774947aac58dde7fdc85f4aa00c42adf5d8f5468fc630c1acf30a142" + "sha256:88256416ae766bc9e8895c76a87928c0012183da3cc4fc18016e6f050e025f41", + "sha256:cc59bc4423742fd71ad227122eb0dd44db51efb3dc4095b45ac9a08c770096af" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.9.0" + "markers": "python_version >= '3.7'", + "version": "==2.0.2" }, "executing": { "hashes": [ - "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc", - "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107" + "sha256:06df6183df67389625f4e763921c6cf978944721abf3e714000200aab95b0657", + "sha256:0ff053696fdeef426cda5bd18eacd94f82c91f49823a2e9090124212ceea9b08" ], - "version": "==1.2.0" + "version": "==2.0.0" }, "fastjsonschema": { "hashes": [ - "sha256:04fbecc94300436f628517b05741b7ea009506ce8f946d40996567c669318490", - "sha256:4a30d6315a68c253cfa8f963b9697246315aa3db89f98b97235e345dedfb0b8e" + "sha256:06dc8680d937628e993fa0cd278f196d20449a1adc087640710846b324d422ea", + "sha256:aec6a19e9f66e9810ab371cc913ad5f4e9e479b63a7072a2cd060a9369e329a8" ], - "version": "==2.16.3" + "version": "==2.18.1" }, "filelock": { "hashes": [ - "sha256:892be14aa8efc01673b5ed6589dbccb95f9a8596f0507e232626155495c18105", - "sha256:bde48477b15fde2c7e5a0713cbe72721cb5a5ad32ee0b8f419907960b9d75536" + "sha256:08c21d87ded6e2b9da6728c3dff51baf1dcecf973b768ef35bcbc3447edb9ad4", + "sha256:2e6f249f1f3654291606e046b09f1fd5eac39b360664c27f5aad072012f8bcbd" ], - "markers": "python_version >= '3.7'", - "version": "==3.10.7" + "markers": "python_version >= '3.8'", + "version": "==3.12.4" }, "flake8": { "hashes": [ @@ -720,11 +758,11 @@ }, "identify": { "hashes": [ - "sha256:f0faad595a4687053669c112004178149f6c326db71ee999ae4636685753ad2f", - "sha256:f7a93d6cf98e29bd07663c60728e7a4057615068d7a639d132dc883b2d54d31e" + "sha256:afe67f26ae29bab007ec21b03d4114f41316ab9dd15aa8736a167481e108da54", + "sha256:f302a4256a15c849b91cfcdcec052a8ce914634b2f77ae87dad29cd749f2d88d" ], - "markers": "python_version >= '3.7'", - "version": "==2.5.22" + "markers": "python_version >= '3.8'", + "version": "==2.5.30" }, "idna": { "hashes": [ @@ -744,11 +782,11 @@ }, "importlib-metadata": { "hashes": [ - "sha256:43ce9281e097583d758c2c708c4376371261a02c34682491a8e98352365aad20", - "sha256:ff80f3b5394912eb1b108fcfd444dc78b7f1f3e16b16188054bd01cb9cb86f09" + "sha256:8a8a81bcf996e74fee46f0d16bd3eaa382a7eb20fd82445c3ad11f4090334116", + "sha256:dd0173e8f150d6815e098fd354f6414b0f079af4644ddfe90c71e2fc6174346d" ], "markers": "python_version >= '3.7'", - "version": "==6.1.0" + "version": "==4.13.0" }, "iniconfig": { "hashes": [ @@ -768,19 +806,19 @@ }, "ipykernel": { "hashes": [ - "sha256:1ae6047c1277508933078163721bbb479c3e7292778a04b4bacf0874550977d6", - "sha256:302558b81f1bc22dc259fb2a0c5c7cf2f4c0bdb21b50484348f7bafe7fb71421" + "sha256:3ba3dc97424b87b31bb46586b5167b3161b32d7820b9201a9e698c71e271602c", + "sha256:553856658eb8430bbe9653ea041a41bff63e9606fc4628873fc92a6cf3abd404" ], "markers": "python_version >= '3.8'", - "version": "==6.22.0" + "version": "==6.26.0" }, "ipython": { "hashes": [ - "sha256:1c183bf61b148b00bcebfa5d9b39312733ae97f6dad90d7e9b4d86c8647f498c", - "sha256:a950236df04ad75b5bc7f816f9af3d74dc118fd42f2ff7e80e8e60ca1f182e2d" + "sha256:0852469d4d579d9cd613c220af7bf0c9cc251813e12be647cb9d463939db9b1e", + "sha256:ad52f58fca8f9f848e256c629eff888efc0528c12fe0f8ec14f33205f23ef938" ], - "markers": "python_version >= '3.8'", - "version": "==8.12.0" + "markers": "python_version >= '3.9'", + "version": "==8.16.1" }, "isort": { "hashes": [ @@ -792,11 +830,11 @@ }, "jedi": { "hashes": [ - "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e", - "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612" + "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd", + "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0" ], "markers": "python_version >= '3.6'", - "version": "==0.18.2" + "version": "==0.19.1" }, "jinja2": { "hashes": [ @@ -808,27 +846,35 @@ }, "jsonschema": { "hashes": [ - "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d", - "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6" + "sha256:cd5f1f9ed9444e554b38ba003af06c0a8c2868131e56bfbef0550fb450c0330e", + "sha256:ec84cc37cfa703ef7cd4928db24f9cb31428a5d0fa77747b8b51a847458e0bbf" ], - "markers": "python_version >= '3.7'", - "version": "==4.17.3" + "markers": "python_version >= '3.8'", + "version": "==4.19.1" + }, + "jsonschema-specifications": { + "hashes": [ + "sha256:05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1", + "sha256:c91a50404e88a1f6ba40636778e2ee08f6e24c5613fe4c53ac24578a5a7f72bb" + ], + "markers": "python_version >= '3.8'", + "version": "==2023.7.1" }, "jupyter-client": { "hashes": [ - "sha256:3fbab64100a0dcac7701b1e0f1a4412f1ccb45546ff2ad9bc4fcbe4e19804811", - "sha256:d5b8e739d7816944be50f81121a109788a3d92732ecf1ad1e4dadebc948818fe" + "sha256:c3877aac7257ec68d79b5c622ce986bd2a992ca42f6ddc9b4dd1da50e89f7028", + "sha256:e8754066510ce456358df363f97eae64b50860f30dc1fe8c6771440db3be9a63" ], "markers": "python_version >= '3.8'", - "version": "==8.1.0" + "version": "==8.5.0" }, "jupyter-core": { "hashes": [ - "sha256:6db75be0c83edbf1b7c9f91ec266a9a24ef945da630f3120e1a0046dc13713fc", - "sha256:d4201af84559bc8c70cead287e1ab94aeef3c512848dde077b7684b54d67730d" + "sha256:66e252f675ac04dcf2feb6ed4afb3cd7f68cf92f483607522dc251f32d471571", + "sha256:e4b98344bb94ee2e3e6c4519a97d001656009f9cb2b7f2baf15b3c205770011d" ], "markers": "python_version >= '3.8'", - "version": "==5.3.0" + "version": "==5.4.0" }, "keyring": { "hashes": [ @@ -840,59 +886,69 @@ }, "markupsafe": { "hashes": [ - "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed", - "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc", - "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2", - "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460", - "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7", - "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0", - "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1", - "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa", - "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03", - "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323", - "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65", - "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013", - "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036", - "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f", - "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4", - "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419", - "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2", - "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619", - "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a", - "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a", - "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd", - "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7", - "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666", - "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65", - "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859", - "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625", - "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff", - "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156", - "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd", - "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba", - "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f", - "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1", - "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094", - "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a", - "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513", - "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed", - "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d", - "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3", - "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147", - "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c", - "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603", - "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601", - "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a", - "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1", - "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d", - "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3", - "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54", - "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2", - "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6", - "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58" + "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e", + "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e", + "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431", + "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686", + "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c", + "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559", + "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc", + "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb", + "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939", + "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c", + "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0", + "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4", + "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9", + "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575", + "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba", + "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d", + "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd", + "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3", + "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00", + "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155", + "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac", + "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52", + "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f", + "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8", + "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b", + "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007", + "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24", + "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea", + "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198", + "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0", + "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee", + "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be", + "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2", + "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1", + "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707", + "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6", + "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c", + "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58", + "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823", + "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779", + "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636", + "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c", + "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad", + "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee", + "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc", + "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2", + "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48", + "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7", + "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e", + "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b", + "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa", + "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5", + "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e", + "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb", + "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9", + "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57", + "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc", + "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc", + "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2", + "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11" ], "markers": "python_version >= '3.7'", - "version": "==2.1.2" + "version": "==2.1.3" }, "matplotlib-inline": { "hashes": [ @@ -964,43 +1020,43 @@ }, "nbformat": { "hashes": [ - "sha256:46dac64c781f1c34dfd8acba16547024110348f9fc7eab0f31981c2a3dc48d1f", - "sha256:d910082bd3e0bffcf07eabf3683ed7dda0727a326c446eeb2922abe102e65162" + "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9", + "sha256:5f98b5ba1997dff175e77e0c17d5c10a96eaed2cbd1de3533d1fc35d5e111192" ], - "markers": "python_version >= '3.7'", - "version": "==5.8.0" + "markers": "python_version >= '3.8'", + "version": "==5.9.2" }, "nbmake": { "hashes": [ - "sha256:1c1619fc54a2fb64bfd84acbdf13b2ffba0e4a03bfea1684f4648f28ca850ada", - "sha256:7f602ba5195e80e4f2527944bb06d3b4df0d1520e73ba66126b51132b1f646ea" + "sha256:233603c9186c659cb42524de36b556197c352ede1f9daeaa1b1141dfad226218", + "sha256:874c5b9d99922f88bf0c92a3b869e75bff154edba2538efef0a1d7ad2263f5fb" ], "markers": "python_full_version >= '3.7.0' and python_full_version < '4.0.0'", - "version": "==1.4.1" + "version": "==1.4.6" }, "nest-asyncio": { "hashes": [ - "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8", - "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290" + "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb", + "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d" ], "markers": "python_version >= '3.5'", - "version": "==1.5.6" + "version": "==1.5.8" }, "nodeenv": { "hashes": [ - "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e", - "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b" + "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2", + "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==1.7.0" + "version": "==1.8.0" }, "packaging": { "hashes": [ - "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2", - "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97" + "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", + "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" ], "markers": "python_version >= '3.7'", - "version": "==23.0" + "version": "==23.2" }, "parso": { "hashes": [ @@ -1012,11 +1068,11 @@ }, "pathspec": { "hashes": [ - "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687", - "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293" + "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20", + "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3" ], "markers": "python_version >= '3.7'", - "version": "==0.11.1" + "version": "==0.11.2" }, "pexpect": { "hashes": [ @@ -1035,19 +1091,19 @@ }, "platformdirs": { "hashes": [ - "sha256:d5b638ca397f25f979350ff789db335903d7ea010ab28903f57b27e1b16c2b08", - "sha256:ebe11c0d7a805086e99506aa331612429a72ca7cd52a1f0d277dc4adc20cb10e" + "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3", + "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e" ], "markers": "python_version >= '3.7'", - "version": "==3.2.0" + "version": "==3.11.0" }, "pluggy": { "hashes": [ - "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", - "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" + "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12", + "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7" ], - "markers": "python_version >= '3.6'", - "version": "==1.0.0" + "markers": "python_version >= '3.8'", + "version": "==1.3.0" }, "pre-commit": { "hashes": [ @@ -1059,31 +1115,33 @@ }, "prompt-toolkit": { "hashes": [ - "sha256:23ac5d50538a9a38c8bde05fecb47d0b403ecd0662857a86f886f798563d5b9b", - "sha256:45ea77a2f7c60418850331366c81cf6b5b9cf4c7fd34616f733c5427e6abbb1f" + "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac", + "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88" ], "markers": "python_full_version >= '3.7.0'", - "version": "==3.0.38" + "version": "==3.0.39" }, "psutil": { "hashes": [ - "sha256:149555f59a69b33f056ba1c4eb22bb7bf24332ce631c44a319cec09f876aaeff", - "sha256:16653106f3b59386ffe10e0bad3bb6299e169d5327d3f187614b1cb8f24cf2e1", - "sha256:3d7f9739eb435d4b1338944abe23f49584bde5395f27487d2ee25ad9a8774a62", - "sha256:3ff89f9b835100a825b14c2808a106b6fdcc4b15483141482a12c725e7f78549", - "sha256:54c0d3d8e0078b7666984e11b12b88af2db11d11249a8ac8920dd5ef68a66e08", - "sha256:54d5b184728298f2ca8567bf83c422b706200bcbbfafdc06718264f9393cfeb7", - "sha256:6001c809253a29599bc0dfd5179d9f8a5779f9dffea1da0f13c53ee568115e1e", - "sha256:68908971daf802203f3d37e78d3f8831b6d1014864d7a85937941bb35f09aefe", - "sha256:6b92c532979bafc2df23ddc785ed116fced1f492ad90a6830cf24f4d1ea27d24", - "sha256:852dd5d9f8a47169fe62fd4a971aa07859476c2ba22c2254d4a1baa4e10b95ad", - "sha256:9120cd39dca5c5e1c54b59a41d205023d436799b1c8c4d3ff71af18535728e94", - "sha256:c1ca331af862803a42677c120aff8a814a804e09832f166f226bfd22b56feee8", - "sha256:efeae04f9516907be44904cc7ce08defb6b665128992a56957abc9b61dca94b7", - "sha256:fd8522436a6ada7b4aad6638662966de0d61d241cb821239b2ae7013d41a43d4" + "sha256:10e8c17b4f898d64b121149afb136c53ea8b68c7531155147867b7b1ac9e7e28", + "sha256:18cd22c5db486f33998f37e2bb054cc62fd06646995285e02a51b1e08da97017", + "sha256:3ebf2158c16cc69db777e3c7decb3c0f43a7af94a60d72e87b2823aebac3d602", + "sha256:51dc3d54607c73148f63732c727856f5febec1c7c336f8f41fcbd6315cce76ac", + "sha256:6e5fb8dc711a514da83098bc5234264e551ad980cec5f85dabf4d38ed6f15e9a", + "sha256:70cb3beb98bc3fd5ac9ac617a327af7e7f826373ee64c80efd4eb2856e5051e9", + "sha256:748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4", + "sha256:91ecd2d9c00db9817a4b4192107cf6954addb5d9d67a969a4f436dbc9200f88c", + "sha256:92e0cc43c524834af53e9d3369245e6cc3b130e78e26100d1f63cdb0abeb3d3c", + "sha256:a6f01f03bf1843280f4ad16f4bde26b817847b4c1a0db59bf6419807bc5ce05c", + "sha256:c69596f9fc2f8acd574a12d5f8b7b1ba3765a641ea5d60fb4736bf3c08a8214a", + "sha256:ca2780f5e038379e520281e4c032dddd086906ddff9ef0d1b9dcf00710e5071c", + "sha256:daecbcbd29b289aac14ece28eca6a3e60aa361754cf6da3dfb20d4d32b6c7f57", + "sha256:e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a", + "sha256:fb8a697f11b0f5994550555fcfe3e69799e5b060c8ecf9e2f75c69302cc35c0d", + "sha256:ff18b8d1a784b810df0b0fff3bcb50ab941c3b8e2c8de5726f9c71c601c611aa" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==5.9.4" + "version": "==5.9.6" }, "ptyprocess": { "hashes": [ @@ -1115,48 +1173,6 @@ "markers": "python_version >= '3.6'", "version": "==2.9.1" }, - "pydantic": { - "hashes": [ - "sha256:01aea3a42c13f2602b7ecbbea484a98169fb568ebd9e247593ea05f01b884b2e", - "sha256:0cd181f1d0b1d00e2b705f1bf1ac7799a2d938cce3376b8007df62b29be3c2c6", - "sha256:10a86d8c8db68086f1e30a530f7d5f83eb0685e632e411dbbcf2d5c0150e8dcd", - "sha256:193924c563fae6ddcb71d3f06fa153866423ac1b793a47936656e806b64e24ca", - "sha256:464855a7ff7f2cc2cf537ecc421291b9132aa9c79aef44e917ad711b4a93163b", - "sha256:516f1ed9bc2406a0467dd777afc636c7091d71f214d5e413d64fef45174cfc7a", - "sha256:6434b49c0b03a51021ade5c4daa7d70c98f7a79e95b551201fff682fc1661245", - "sha256:64d34ab766fa056df49013bb6e79921a0265204c071984e75a09cbceacbbdd5d", - "sha256:670bb4683ad1e48b0ecb06f0cfe2178dcf74ff27921cdf1606e527d2617a81ee", - "sha256:68792151e174a4aa9e9fc1b4e653e65a354a2fa0fed169f7b3d09902ad2cb6f1", - "sha256:701daea9ffe9d26f97b52f1d157e0d4121644f0fcf80b443248434958fd03dc3", - "sha256:7d45fc99d64af9aaf7e308054a0067fdcd87ffe974f2442312372dfa66e1001d", - "sha256:80b1fab4deb08a8292d15e43a6edccdffa5377a36a4597bb545b93e79c5ff0a5", - "sha256:82dffb306dd20bd5268fd6379bc4bfe75242a9c2b79fec58e1041fbbdb1f7914", - "sha256:8c7f51861d73e8b9ddcb9916ae7ac39fb52761d9ea0df41128e81e2ba42886cd", - "sha256:950ce33857841f9a337ce07ddf46bc84e1c4946d2a3bba18f8280297157a3fd1", - "sha256:976cae77ba6a49d80f461fd8bba183ff7ba79f44aa5cfa82f1346b5626542f8e", - "sha256:9f6f0fd68d73257ad6685419478c5aece46432f4bdd8d32c7345f1986496171e", - "sha256:a7cd2251439988b413cb0a985c4ed82b6c6aac382dbaff53ae03c4b23a70e80a", - "sha256:abfb7d4a7cd5cc4e1d1887c43503a7c5dd608eadf8bc615413fc498d3e4645cd", - "sha256:ae150a63564929c675d7f2303008d88426a0add46efd76c3fc797cd71cb1b46f", - "sha256:b0f85904f73161817b80781cc150f8b906d521fa11e3cdabae19a581c3606209", - "sha256:b4a849d10f211389502059c33332e91327bc154acc1845f375a99eca3afa802d", - "sha256:c15582f9055fbc1bfe50266a19771bbbef33dd28c45e78afbe1996fd70966c2a", - "sha256:c230c0d8a322276d6e7b88c3f7ce885f9ed16e0910354510e0bae84d54991143", - "sha256:cc1dde4e50a5fc1336ee0581c1612215bc64ed6d28d2c7c6f25d2fe3e7c3e918", - "sha256:cf135c46099ff3f919d2150a948ce94b9ce545598ef2c6c7bf55dca98a304b52", - "sha256:cfc83c0678b6ba51b0532bea66860617c4cd4251ecf76e9846fa5a9f3454e97e", - "sha256:d2a5ebb48958754d386195fe9e9c5106f11275867051bf017a8059410e9abf1f", - "sha256:d71e69699498b020ea198468e2480a2f1e7433e32a3a99760058c6520e2bea7e", - "sha256:d75ae19d2a3dbb146b6f324031c24f8a3f52ff5d6a9f22f0683694b3afcb16fb", - "sha256:dfe2507b8ef209da71b6fb5f4e597b50c5a34b78d7e857c4f8f3115effaef5fe", - "sha256:e0cfe895a504c060e5d36b287ee696e2fdad02d89e0d895f83037245218a87fe", - "sha256:e79e999e539872e903767c417c897e729e015872040e56b96e67968c3b918b2d", - "sha256:ecbbc51391248116c0a055899e6c3e7ffbb11fb5e2a4cd6f2d0b93272118a209", - "sha256:f4a2b50e2b03d5776e7f21af73e2070e1b5c0d0df255a827e7c632962f8315af" - ], - "markers": "python_version >= '3.7'", - "version": "==1.10.7" - }, "pyflakes": { "hashes": [ "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2", @@ -1167,79 +1183,46 @@ }, "pygments": { "hashes": [ - "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297", - "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717" - ], - "markers": "python_version >= '3.6'", - "version": "==2.14.0" - }, - "pyrsistent": { - "hashes": [ - "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8", - "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440", - "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a", - "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c", - "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3", - "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393", - "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9", - "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da", - "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf", - "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64", - "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a", - "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3", - "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98", - "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2", - "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8", - "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf", - "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc", - "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7", - "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28", - "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2", - "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b", - "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a", - "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64", - "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19", - "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1", - "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9", - "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c" + "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692", + "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29" ], "markers": "python_version >= '3.7'", - "version": "==0.19.3" + "version": "==2.16.1" }, "pytest": { "hashes": [ - "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e", - "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4" + "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac", + "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5" ], "markers": "python_version >= '3.7'", - "version": "==7.2.2" + "version": "==7.4.3" }, "pytest-cov": { "hashes": [ - "sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b", - "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470" + "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6", + "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a" ], "markers": "python_version >= '3.6'", - "version": "==4.0.0" + "version": "==4.1.0" }, "pytest-mock": { "hashes": [ - "sha256:f4c973eeae0282963eb293eb173ce91b091a79c1334455acfac9ddee8a1c784b", - "sha256:fbbdb085ef7c252a326fd8cdcac0aa3b1333d8811f131bdcc701002e1be7ed4f" + "sha256:0972719a7263072da3a21c7f4773069bcc7486027d7e8e1f81d98a47e701bc4f", + "sha256:31a40f038c22cad32287bb43932054451ff5583ff094bca6f675df2f8bc1a6e9" ], "markers": "python_version >= '3.7'", - "version": "==3.10.0" + "version": "==3.12.0" }, "pytest-xdist": { "extras": [ "psutil" ], "hashes": [ - "sha256:1849bd98d8b242b948e472db7478e090bf3361912a8fed87992ed94085f54727", - "sha256:37290d161638a20b672401deef1cba812d110ac27e35d213f091d15b8beb40c9" + "sha256:d5ee0520eb1b7bcca50a60a518ab7a7707992812c578198f8b44fdfac78e8c93", + "sha256:ff9daa7793569e6a68544850fd3927cd257cc03a7ef76c95e86915355e82b5f2" ], "markers": "python_version >= '3.7'", - "version": "==3.2.1" + "version": "==3.3.1" }, "python-dateutil": { "hashes": [ @@ -1251,148 +1234,287 @@ }, "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" }, "pyzmq": { "hashes": [ - "sha256:032f5c8483c85bf9c9ca0593a11c7c749d734ce68d435e38c3f72e759b98b3c9", - "sha256:08bfcc21b5997a9be4fefa405341320d8e7f19b4d684fb9c0580255c5bd6d695", - "sha256:1a843d26a8da1b752c74bc019c7b20e6791ee813cd6877449e6a1415589d22ff", - "sha256:1f124cb73f1aa6654d31b183810febc8505fd0c597afa127c4f40076be4574e0", - "sha256:1f82906a2d8e4ee310f30487b165e7cc8ed09c009e4502da67178b03083c4ce0", - "sha256:21ec0bf4831988af43c8d66ba3ccd81af2c5e793e1bf6790eb2d50e27b3c570a", - "sha256:24683285cc6b7bf18ad37d75b9db0e0fefe58404e7001f1d82bf9e721806daa7", - "sha256:24abbfdbb75ac5039205e72d6c75f10fc39d925f2df8ff21ebc74179488ebfca", - "sha256:25e6873a70ad5aa31e4a7c41e5e8c709296edef4a92313e1cd5fc87bbd1874e2", - "sha256:269968f2a76c0513490aeb3ba0dc3c77b7c7a11daa894f9d1da88d4a0db09835", - "sha256:26b0358e8933990502f4513c991c9935b6c06af01787a36d133b7c39b1df37fa", - "sha256:28fdb9224a258134784a9cf009b59265a9dde79582fb750d4e88a6bcbc6fa3dc", - "sha256:2b9c9cc965cdf28381e36da525dcb89fc1571d9c54800fdcd73e3f73a2fc29bd", - "sha256:2da6813b7995b6b1d1307329c73d3e3be2fd2d78e19acfc4eff2e27262732388", - "sha256:3059a6a534c910e1d5d068df42f60d434f79e6cc6285aa469b384fa921f78cf8", - "sha256:312b3f0f066b4f1d17383aae509bacf833ccaf591184a1f3c7a1661c085063ae", - "sha256:34a6fddd159ff38aa9497b2e342a559f142ab365576284bc8f77cb3ead1f79c5", - "sha256:374b55516393bfd4d7a7daa6c3b36d6dd6a31ff9d2adad0838cd6a203125e714", - "sha256:38d9f78d69bcdeec0c11e0feb3bc70f36f9b8c44fc06e5d06d91dc0a21b453c7", - "sha256:4a31992a8f8d51663ebf79df0df6a04ffb905063083d682d4380ab8d2c67257c", - "sha256:4a4b4261eb8f9ed71f63b9eb0198dd7c934aa3b3972dac586d0ef502ba9ab08b", - "sha256:510d8e55b3a7cd13f8d3e9121edf0a8730b87d925d25298bace29a7e7bc82810", - "sha256:531e36d9fcd66f18de27434a25b51d137eb546931033f392e85674c7a7cea853", - "sha256:54a96cf77684a3a537b76acfa7237b1e79a8f8d14e7f00e0171a94b346c5293e", - "sha256:56a94ab1d12af982b55ca96c6853db6ac85505e820d9458ac76364c1998972f4", - "sha256:5c5fbb229e40a89a2fe73d0c1181916f31e30f253cb2d6d91bea7927c2e18413", - "sha256:5d496815074e3e3d183fe2c7fcea2109ad67b74084c254481f87b64e04e9a471", - "sha256:5eaeae038c68748082137d6896d5c4db7927e9349237ded08ee1bbd94f7361c9", - "sha256:62ec8d979f56c0053a92b2b6a10ff54b9ec8a4f187db2b6ec31ee3dd6d3ca6e2", - "sha256:64812f29d6eee565e129ca14b0c785744bfff679a4727137484101b34602d1a7", - "sha256:6526d097b75192f228c09d48420854d53dfbc7abbb41b0e26f363ccb26fbc177", - "sha256:659e62e1cbb063151c52f5b01a38e1df6b54feccfa3e2509d44c35ca6d7962ee", - "sha256:65c19a63b4a83ae45d62178b70223adeee5f12f3032726b897431b6553aa25af", - "sha256:67da1c213fbd208906ab3470cfff1ee0048838365135a9bddc7b40b11e6d6c89", - "sha256:6a821a506822fac55d2df2085a52530f68ab15ceed12d63539adc32bd4410f6e", - "sha256:6a979e59d2184a0c8f2ede4b0810cbdd86b64d99d9cc8a023929e40dce7c86cc", - "sha256:6b8c1bbb70e868dc88801aa532cae6bd4e3b5233784692b786f17ad2962e5149", - "sha256:6fadc60970714d86eff27821f8fb01f8328dd36bebd496b0564a500fe4a9e354", - "sha256:715cff7644a80a7795953c11b067a75f16eb9fc695a5a53316891ebee7f3c9d5", - "sha256:77942243ff4d14d90c11b2afd8ee6c039b45a0be4e53fb6fa7f5e4fd0b59da39", - "sha256:7b504ae43d37e282301da586529e2ded8b36d4ee2cd5e6db4386724ddeaa6bbc", - "sha256:827bf60e749e78acb408a6c5af6688efbc9993e44ecc792b036ec2f4b4acf485", - "sha256:8280ada89010735a12b968ec3ea9a468ac2e04fddcc1cede59cb7f5178783b9c", - "sha256:83d822e8687621bed87404afc1c03d83fa2ce39733d54c2fd52d8829edb8a7ff", - "sha256:8560756318ec7c4c49d2c341012167e704b5a46d9034905853c3d1ade4f55bee", - "sha256:85762712b74c7bd18e340c3639d1bf2f23735a998d63f46bb6584d904b5e401d", - "sha256:88649b19ede1cab03b96b66c364cbbf17c953615cdbc844f7f6e5f14c5e5261c", - "sha256:9a2e5fe42dfe6b73ca120b97ac9f34bfa8414feb15e00e37415dbd51cf227ef6", - "sha256:9af0bb0277e92f41af35e991c242c9c71920169d6aa53ade7e444f338f4c8128", - "sha256:9bdc40efb679b9dcc39c06d25629e55581e4c4f7870a5e88db4f1c51ce25e20d", - "sha256:9e1d2f2d86fc75ed7f8845a992c5f6f1ab5db99747fb0d78b5e4046d041164d2", - "sha256:a2e92ff20ad5d13266bc999a29ed29a3b5b101c21fdf4b2cf420c09db9fb690e", - "sha256:a35960c8b2f63e4ef67fd6731851030df68e4b617a6715dd11b4b10312d19fef", - "sha256:a6f6ae12478fdc26a6d5fdb21f806b08fa5403cd02fd312e4cb5f72df078f96f", - "sha256:a9b5eeb5278a8a636bb0abdd9ff5076bcbb836cd2302565df53ff1fa7d106d54", - "sha256:ab046e9cb902d1f62c9cc0eca055b1d11108bdc271caf7c2171487298f229b56", - "sha256:ab2c056ac503f25a63f6c8c6771373e2a711b98b304614151dfb552d3d6c81f6", - "sha256:abbce982a17c88d2312ec2cf7673985d444f1beaac6e8189424e0a0e0448dbb3", - "sha256:ac178e666c097c8d3deb5097b58cd1316092fc43e8ef5b5fdb259b51da7e7315", - "sha256:ad761cfbe477236802a7ab2c080d268c95e784fe30cafa7e055aacd1ca877eb0", - "sha256:affec1470351178e892121b3414c8ef7803269f207bf9bef85f9a6dd11cde264", - "sha256:b164cc3c8acb3d102e311f2eb6f3c305865ecb377e56adc015cb51f721f1dda6", - "sha256:b48616a09d7df9dbae2f45a0256eee7b794b903ddc6d8657a9948669b345f220", - "sha256:b491998ef886662c1f3d49ea2198055a9a536ddf7430b051b21054f2a5831800", - "sha256:b733076ff46e7db5504c5e7284f04a9852c63214c74688bdb6135808531755a3", - "sha256:c8fedc3ccd62c6b77dfe6f43802057a803a411ee96f14e946f4a76ec4ed0e117", - "sha256:cb1f69a0a2a2b1aae8412979dd6293cc6bcddd4439bf07e4758d864ddb112354", - "sha256:cca8524b61c0eaaa3505382dc9b9a3bc8165f1d6c010fdd1452c224225a26689", - "sha256:cfb9f7eae02d3ac42fbedad30006b7407c984a0eb4189a1322241a20944d61e5", - "sha256:d4427b4a136e3b7f85516c76dd2e0756c22eec4026afb76ca1397152b0ca8145", - "sha256:d488c5c8630f7e782e800869f82744c3aca4aca62c63232e5d8c490d3d66956a", - "sha256:dd771a440effa1c36d3523bc6ba4e54ff5d2e54b4adcc1e060d8f3ca3721d228", - "sha256:ed15e3a2c3c2398e6ae5ce86d6a31b452dfd6ad4cd5d312596b30929c4b6e182", - "sha256:edbbf06cc2719889470a8d2bf5072bb00f423e12de0eb9ffec946c2c9748e149", - "sha256:eef2a0b880ab40aca5a878933376cb6c1ec483fba72f7f34e015c0f675c90b20", - "sha256:f7c8b8368e84381ae7c57f1f5283b029c888504aaf4949c32e6e6fb256ec9bf0", - "sha256:ffc71111433bd6ec8607a37b9211f4ef42e3d3b271c6d76c813669834764b248" + "sha256:019e59ef5c5256a2c7378f2fb8560fc2a9ff1d315755204295b2eab96b254d0a", + "sha256:034239843541ef7a1aee0c7b2cb7f6aafffb005ede965ae9cbd49d5ff4ff73cf", + "sha256:03b3f49b57264909aacd0741892f2aecf2f51fb053e7d8ac6767f6c700832f45", + "sha256:047a640f5c9c6ade7b1cc6680a0e28c9dd5a0825135acbd3569cc96ea00b2505", + "sha256:04ccbed567171579ec2cebb9c8a3e30801723c575601f9a990ab25bcac6b51e2", + "sha256:057e824b2aae50accc0f9a0570998adc021b372478a921506fddd6c02e60308e", + "sha256:11baebdd5fc5b475d484195e49bae2dc64b94a5208f7c89954e9e354fc609d8f", + "sha256:11c1d2aed9079c6b0c9550a7257a836b4a637feb334904610f06d70eb44c56d2", + "sha256:11d58723d44d6ed4dd677c5615b2ffb19d5c426636345567d6af82be4dff8a55", + "sha256:12720a53e61c3b99d87262294e2b375c915fea93c31fc2336898c26d7aed34cd", + "sha256:17ef5f01d25b67ca8f98120d5fa1d21efe9611604e8eb03a5147360f517dd1e2", + "sha256:18d43df3f2302d836f2a56f17e5663e398416e9dd74b205b179065e61f1a6edf", + "sha256:1a5d26fe8f32f137e784f768143728438877d69a586ddeaad898558dc971a5ae", + "sha256:1af379b33ef33757224da93e9da62e6471cf4a66d10078cf32bae8127d3d0d4a", + "sha256:1ccf825981640b8c34ae54231b7ed00271822ea1c6d8ba1090ebd4943759abf5", + "sha256:21eb4e609a154a57c520e3d5bfa0d97e49b6872ea057b7c85257b11e78068222", + "sha256:2243700cc5548cff20963f0ca92d3e5e436394375ab8a354bbea2b12911b20b0", + "sha256:255ca2b219f9e5a3a9ef3081512e1358bd4760ce77828e1028b818ff5610b87b", + "sha256:259c22485b71abacdfa8bf79720cd7bcf4b9d128b30ea554f01ae71fdbfdaa23", + "sha256:25f0e6b78220aba09815cd1f3a32b9c7cb3e02cb846d1cfc526b6595f6046618", + "sha256:273bc3959bcbff3f48606b28229b4721716598d76b5aaea2b4a9d0ab454ec062", + "sha256:292fe3fc5ad4a75bc8df0dfaee7d0babe8b1f4ceb596437213821f761b4589f9", + "sha256:2ca57a5be0389f2a65e6d3bb2962a971688cbdd30b4c0bd188c99e39c234f414", + "sha256:2d163a18819277e49911f7461567bda923461c50b19d169a062536fffe7cd9d2", + "sha256:2d81f1ddae3858b8299d1da72dd7d19dd36aab654c19671aa8a7e7fb02f6638a", + "sha256:2f957ce63d13c28730f7fd6b72333814221c84ca2421298f66e5143f81c9f91f", + "sha256:330f9e188d0d89080cde66dc7470f57d1926ff2fb5576227f14d5be7ab30b9fa", + "sha256:34c850ce7976d19ebe7b9d4b9bb8c9dfc7aac336c0958e2651b88cbd46682123", + "sha256:35b5ab8c28978fbbb86ea54958cd89f5176ce747c1fb3d87356cf698048a7790", + "sha256:3669cf8ee3520c2f13b2e0351c41fea919852b220988d2049249db10046a7afb", + "sha256:381469297409c5adf9a0e884c5eb5186ed33137badcbbb0560b86e910a2f1e76", + "sha256:3d0a409d3b28607cc427aa5c30a6f1e4452cc44e311f843e05edb28ab5e36da0", + "sha256:44e58a0554b21fc662f2712814a746635ed668d0fbc98b7cb9d74cb798d202e6", + "sha256:458dea649f2f02a0b244ae6aef8dc29325a2810aa26b07af8374dc2a9faf57e3", + "sha256:48e466162a24daf86f6b5ca72444d2bf39a5e58da5f96370078be67c67adc978", + "sha256:49d238cf4b69652257db66d0c623cd3e09b5d2e9576b56bc067a396133a00d4a", + "sha256:4ca1ed0bb2d850aa8471387882247c68f1e62a4af0ce9c8a1dbe0d2bf69e41fb", + "sha256:52533489f28d62eb1258a965f2aba28a82aa747202c8fa5a1c7a43b5db0e85c1", + "sha256:548d6482dc8aadbe7e79d1b5806585c8120bafa1ef841167bc9090522b610fa6", + "sha256:5619f3f5a4db5dbb572b095ea3cb5cc035335159d9da950830c9c4db2fbb6995", + "sha256:57459b68e5cd85b0be8184382cefd91959cafe79ae019e6b1ae6e2ba8a12cda7", + "sha256:5a34d2395073ef862b4032343cf0c32a712f3ab49d7ec4f42c9661e0294d106f", + "sha256:61706a6b6c24bdece85ff177fec393545a3191eeda35b07aaa1458a027ad1304", + "sha256:724c292bb26365659fc434e9567b3f1adbdb5e8d640c936ed901f49e03e5d32e", + "sha256:73461eed88a88c866656e08f89299720a38cb4e9d34ae6bf5df6f71102570f2e", + "sha256:76705c9325d72a81155bb6ab48d4312e0032bf045fb0754889133200f7a0d849", + "sha256:76c1c8efb3ca3a1818b837aea423ff8a07bbf7aafe9f2f6582b61a0458b1a329", + "sha256:77a41c26205d2353a4c94d02be51d6cbdf63c06fbc1295ea57dad7e2d3381b71", + "sha256:79986f3b4af059777111409ee517da24a529bdbd46da578b33f25580adcff728", + "sha256:7cff25c5b315e63b07a36f0c2bab32c58eafbe57d0dce61b614ef4c76058c115", + "sha256:7f7e58effd14b641c5e4dec8c7dab02fb67a13df90329e61c869b9cc607ef752", + "sha256:820c4a08195a681252f46926de10e29b6bbf3e17b30037bd4250d72dd3ddaab8", + "sha256:87e34f31ca8f168c56d6fbf99692cc8d3b445abb5bfd08c229ae992d7547a92a", + "sha256:8f03d3f0d01cb5a018debeb412441996a517b11c5c17ab2001aa0597c6d6882c", + "sha256:90f26dc6d5f241ba358bef79be9ce06de58d477ca8485e3291675436d3827cf8", + "sha256:955215ed0604dac5b01907424dfa28b40f2b2292d6493445dd34d0dfa72586a8", + "sha256:985bbb1316192b98f32e25e7b9958088431d853ac63aca1d2c236f40afb17c83", + "sha256:a382372898a07479bd34bda781008e4a954ed8750f17891e794521c3e21c2e1c", + "sha256:a882ac0a351288dd18ecae3326b8a49d10c61a68b01419f3a0b9a306190baf69", + "sha256:aa8d6cdc8b8aa19ceb319aaa2b660cdaccc533ec477eeb1309e2a291eaacc43a", + "sha256:abc719161780932c4e11aaebb203be3d6acc6b38d2f26c0f523b5b59d2fc1996", + "sha256:abf34e43c531bbb510ae7e8f5b2b1f2a8ab93219510e2b287a944432fad135f3", + "sha256:ade6d25bb29c4555d718ac6d1443a7386595528c33d6b133b258f65f963bb0f6", + "sha256:afea96f64efa98df4da6958bae37f1cbea7932c35878b185e5982821bc883369", + "sha256:b1579413ae492b05de5a6174574f8c44c2b9b122a42015c5292afa4be2507f28", + "sha256:b3451108ab861040754fa5208bca4a5496c65875710f76789a9ad27c801a0075", + "sha256:b9af3757495c1ee3b5c4e945c1df7be95562277c6e5bccc20a39aec50f826cd0", + "sha256:bc16ac425cc927d0a57d242589f87ee093884ea4804c05a13834d07c20db203c", + "sha256:c2910967e6ab16bf6fbeb1f771c89a7050947221ae12a5b0b60f3bca2ee19bca", + "sha256:c2b92812bd214018e50b6380ea3ac0c8bb01ac07fcc14c5f86a5bb25e74026e9", + "sha256:c2f20ce161ebdb0091a10c9ca0372e023ce24980d0e1f810f519da6f79c60800", + "sha256:c56d748ea50215abef7030c72b60dd723ed5b5c7e65e7bc2504e77843631c1a6", + "sha256:c7c133e93b405eb0d36fa430c94185bdd13c36204a8635470cccc200723c13bb", + "sha256:c9c6c9b2c2f80747a98f34ef491c4d7b1a8d4853937bb1492774992a120f475d", + "sha256:cbc8df5c6a88ba5ae385d8930da02201165408dde8d8322072e3e5ddd4f68e22", + "sha256:cff084c6933680d1f8b2f3b4ff5bbb88538a4aac00d199ac13f49d0698727ecb", + "sha256:d2045d6d9439a0078f2a34b57c7b18c4a6aef0bee37f22e4ec9f32456c852c71", + "sha256:d20a0ddb3e989e8807d83225a27e5c2eb2260eaa851532086e9e0fa0d5287d83", + "sha256:d457aed310f2670f59cc5b57dcfced452aeeed77f9da2b9763616bd57e4dbaae", + "sha256:d89528b4943d27029a2818f847c10c2cecc79fa9590f3cb1860459a5be7933eb", + "sha256:db0b2af416ba735c6304c47f75d348f498b92952f5e3e8bff449336d2728795d", + "sha256:deee9ca4727f53464daf089536e68b13e6104e84a37820a88b0a057b97bba2d2", + "sha256:df27ffddff4190667d40de7beba4a950b5ce78fe28a7dcc41d6f8a700a80a3c0", + "sha256:e0c95ddd4f6e9fca4e9e3afaa4f9df8552f0ba5d1004e89ef0a68e1f1f9807c7", + "sha256:e1c1be77bc5fb77d923850f82e55a928f8638f64a61f00ff18a67c7404faf008", + "sha256:e1ffa1c924e8c72778b9ccd386a7067cddf626884fd8277f503c48bb5f51c762", + "sha256:e2400a94f7dd9cb20cd012951a0cbf8249e3d554c63a9c0cdfd5cbb6c01d2dec", + "sha256:e61f091c3ba0c3578411ef505992d356a812fb200643eab27f4f70eed34a29ef", + "sha256:e8a701123029cc240cea61dd2d16ad57cab4691804143ce80ecd9286b464d180", + "sha256:eadbefd5e92ef8a345f0525b5cfd01cf4e4cc651a2cffb8f23c0dd184975d787", + "sha256:f32260e556a983bc5c7ed588d04c942c9a8f9c2e99213fec11a031e316874c7e", + "sha256:f8115e303280ba09f3898194791a153862cbf9eef722ad8f7f741987ee2a97c7", + "sha256:fedbdc753827cf014c01dbbee9c3be17e5a208dcd1bf8641ce2cd29580d1f0d4" ], "markers": "python_version >= '3.6'", - "version": "==25.0.2" + "version": "==25.1.1" + }, + "referencing": { + "hashes": [ + "sha256:449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf", + "sha256:794ad8003c65938edcdbc027f1933215e0d0ccc0291e3ce20a4d87432b59efc0" + ], + "markers": "python_version >= '3.8'", + "version": "==0.30.2" }, "requests": { "hashes": [ - "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa", - "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf" + "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", + "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" ], - "markers": "python_version >= '3.7' and python_version < '4'", - "version": "==2.28.2" + "markers": "python_version >= '3.7'", + "version": "==2.31.0" + }, + "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" + ], + "markers": "python_version >= '3.8'", + "version": "==0.10.6" }, "setuptools": { "hashes": [ - "sha256:257de92a9d50a60b8e22abfcbb771571fde0dbf3ec234463212027a4eeecbe9a", - "sha256:e728ca814a823bf7bf60162daf9db95b93d532948c4c0bea762ce62f60189078" + "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87", + "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a" ], - "markers": "python_version >= '3.7'", - "version": "==67.6.1" + "markers": "python_version >= '3.8'", + "version": "==68.2.2" }, "six": { "hashes": [ @@ -1418,58 +1540,58 @@ }, "sphinx": { "hashes": [ - "sha256:0dac3b698538ffef41716cf97ba26c1c7788dba73ce6f150c1ff5b4720786dd2", - "sha256:807d1cb3d6be87eb78a381c3e70ebd8d346b9a25f3753e9947e866b2786865fc" + "sha256:1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560", + "sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5" ], - "markers": "python_version >= '3.8'", - "version": "==6.1.3" + "markers": "python_version >= '3.9'", + "version": "==7.2.6" }, "sphinx-autodoc-typehints": { "hashes": [ - "sha256:71fca2d5eee9b034204e4c686ab20b4d8f5eb9409396216bcae6c87c38e18ea6", - "sha256:ef4a8b9d52de66065aa7d3adfabf5a436feb8a2eff07c2ddc31625d8807f2b69" + "sha256:6a73c0c61a9144ce2ed5ef2bed99d615254e5005c1cc32002017d72d69fb70e6", + "sha256:94e440066941bb237704bb880785e2d05e8ae5406c88674feefbb938ad0dc6af" ], "markers": "python_version >= '3.7'", - "version": "==1.22" + "version": "==1.24.0" }, "sphinx-rtd-theme": { "hashes": [ - "sha256:a0d8bd1a2ed52e0b338cbe19c4b2eef3c5e7a048769753dac6a9f059c7b641b8", - "sha256:f823f7e71890abe0ac6aaa6013361ea2696fc8d3e1fa798f463e82bdb77eeff2" + "sha256:46ddef89cc2416a81ecfbeaceab1881948c014b1b6e4450b815311a89fb977b0", + "sha256:590b030c7abb9cf038ec053b95e5380b5c70d61591eb0b552063fbe7c41f0931" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.2.0" + "version": "==1.3.0" }, "sphinxcontrib-applehelp": { "hashes": [ - "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228", - "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e" + "sha256:094c4d56209d1734e7d252f6e0b3ccc090bd52ee56807a5d9315b19c122ab15d", + "sha256:39fdc8d762d33b01a7d8f026a3b7d71563ea3b72787d5f00ad8465bd9d6dfbfa" ], - "markers": "python_version >= '3.8'", - "version": "==1.0.4" + "markers": "python_version >= '3.9'", + "version": "==1.0.7" }, "sphinxcontrib-devhelp": { "hashes": [ - "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e", - "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4" + "sha256:63b41e0d38207ca40ebbeabcf4d8e51f76c03e78cd61abe118cf4435c73d4212", + "sha256:fe8009aed765188f08fcaadbb3ea0d90ce8ae2d76710b7e29ea7d047177dae2f" ], - "markers": "python_version >= '3.5'", - "version": "==1.0.2" + "markers": "python_version >= '3.9'", + "version": "==1.0.5" }, "sphinxcontrib-htmlhelp": { "hashes": [ - "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff", - "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903" + "sha256:6c26a118a05b76000738429b724a0568dbde5b72391a688577da08f11891092a", + "sha256:8001661c077a73c29beaf4a79968d0726103c5605e27db92b9ebed8bab1359e9" ], - "markers": "python_version >= '3.8'", - "version": "==2.0.1" + "markers": "python_version >= '3.9'", + "version": "==2.0.4" }, "sphinxcontrib-jquery": { "hashes": [ "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a", "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae" ], - "markers": "python_version >= '3.1'", + "markers": "python_version >= '2.7'", "version": "==4.1" }, "sphinxcontrib-jsmath": { @@ -1482,34 +1604,34 @@ }, "sphinxcontrib-qthelp": { "hashes": [ - "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72", - "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6" + "sha256:62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d", + "sha256:bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4" ], - "markers": "python_version >= '3.5'", - "version": "==1.0.3" + "markers": "python_version >= '3.9'", + "version": "==1.0.6" }, "sphinxcontrib-serializinghtml": { "hashes": [ - "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd", - "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952" + "sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54", + "sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1" ], - "markers": "python_version >= '3.5'", - "version": "==1.1.5" + "markers": "python_version >= '3.9'", + "version": "==1.1.9" }, "stack-data": { "hashes": [ - "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815", - "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8" + "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", + "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695" ], - "version": "==0.6.2" + "version": "==0.6.3" }, "synapseclient": { "hashes": [ - "sha256:241f170f0e8c8c3735cd73f81711e592a581c55f7a5c4566be7bee82d72a56bc", - "sha256:29f5e3c87474cb2629e9ce77c97e81e80a08f24ec2c5889f9fba14530b8c4bf7" + "sha256:dc5a61f9f495109a0c89aa7d42b641b6ff278280d7961fb450dd5015704fe15b", + "sha256:dd8b1a1b4667d08311bb651469431f43fe2eeab83c0ef1fe5a03c2929aeb26cd" ], "markers": "python_version >= '3.7'", - "version": "==2.7.0" + "version": "==2.7.2" }, "tabulate": { "hashes": [ @@ -1529,20 +1651,20 @@ }, "tornado": { "hashes": [ - "sha256:1d54d13ab8414ed44de07efecb97d4ef7c39f7438cf5e976ccd356bebb1b5fca", - "sha256:20f638fd8cc85f3cbae3c732326e96addff0a15e22d80f049e00121651e82e72", - "sha256:5c87076709343557ef8032934ce5f637dbb552efa7b21d08e89ae7619ed0eb23", - "sha256:5f8c52d219d4995388119af7ccaa0bcec289535747620116a58d830e7c25d8a8", - "sha256:6fdfabffd8dfcb6cf887428849d30cf19a3ea34c2c248461e1f7d718ad30b66b", - "sha256:87dcafae3e884462f90c90ecc200defe5e580a7fbbb4365eda7c7c1eb809ebc9", - "sha256:9b630419bde84ec666bfd7ea0a4cb2a8a651c2d5cccdbdd1972a0c859dfc3c13", - "sha256:b8150f721c101abdef99073bf66d3903e292d851bee51910839831caba341a75", - "sha256:ba09ef14ca9893954244fd872798b4ccb2367c165946ce2dd7376aebdde8e3ac", - "sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e", - "sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b" + "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f", + "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5", + "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d", + "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3", + "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2", + "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a", + "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16", + "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a", + "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17", + "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0", + "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe" ], - "markers": "python_version >= '3.7'", - "version": "==6.2" + "markers": "python_version >= '3.8'", + "version": "==6.3.3" }, "tox": { "hashes": [ @@ -1554,11 +1676,11 @@ }, "traitlets": { "hashes": [ - "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8", - "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9" + "sha256:81539f07f7aebcde2e4b5ab76727f53eabf18ad155c6ed7979a681411602fa47", + "sha256:833273bf645d8ce31dcb613c56999e2e055b1ffe6d09168a164bcd91c36d5d35" ], - "markers": "python_version >= '3.7'", - "version": "==5.9.0" + "markers": "python_version >= '3.8'", + "version": "==5.12.0" }, "typer": { "hashes": [ @@ -1570,34 +1692,42 @@ }, "typing-extensions": { "hashes": [ - "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb", - "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4" + "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0", + "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef" ], - "markers": "python_version >= '3.7'", - "version": "==4.5.0" + "markers": "python_version >= '3.8'", + "version": "==4.8.0" }, "urllib3": { "hashes": [ - "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305", - "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42" + "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07", + "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0" ], "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.15" + "version": "==1.26.18" }, "virtualenv": { "hashes": [ - "sha256:31712f8f2a17bd06234fa97fdf19609e789dd4e3e4bf108c3da71d710651adbc", - "sha256:f50e3e60f990a0757c9b68333c9fdaa72d7188caa417f96af9e52407831a3b68" + "sha256:02ece4f56fbf939dbbc33c0715159951d6bf14aaf5457b092e4548e1382455af", + "sha256:520d056652454c5098a00c0f073611ccbea4c79089331f60bf9d7ba247bb7381" ], "markers": "python_version >= '3.7'", - "version": "==20.21.0" + "version": "==20.24.6" }, "wcwidth": { "hashes": [ - "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e", - "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0" + "sha256:77f719e01648ed600dfa5402c347481c0992263b81a027344f3e1ba25493a704", + "sha256:8705c569999ffbb4f6a87c6d1b80f324bd6db952f5eb0b95bc07517f4c1813d4" ], - "version": "==0.2.6" + "version": "==0.2.8" + }, + "websocket-client": { + "hashes": [ + "sha256:084072e0a7f5f347ef2ac3d8698a5e0b4ffbfcab607628cadabc650fc9a83a24", + "sha256:b3324019b3c28572086c4a319f91d1dcd44e6e11cd340232978c684a7650d0df" + ], + "markers": "python_version >= '3.8'", + "version": "==1.6.4" }, "wrapt": { "hashes": [ @@ -1682,11 +1812,11 @@ }, "zipp": { "hashes": [ - "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b", - "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556" + "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31", + "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0" ], - "markers": "python_version >= '3.7'", - "version": "==3.15.0" + "markers": "python_version >= '3.8'", + "version": "==3.17.0" } } } diff --git a/setup.cfg b/setup.cfg index 19f281a..a90390e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -77,6 +77,7 @@ testing = hypothesis~=4.0 nbmake~=1.3 pytest-xdist[psutil]~=3.1 + docker~=6.1.3 # Dependencies for development (used by Pipenv) dev = From 1b22eca38a4cf24b9c963943495b5c54adbe52f9 Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Fri, 27 Oct 2023 09:42:55 -0600 Subject: [PATCH 02/35] adds grep fail case --- tests/data/date.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 tests/data/date.txt diff --git a/tests/data/date.txt b/tests/data/date.txt new file mode 100644 index 0000000..60fffd1 --- /dev/null +++ b/tests/data/date.txt @@ -0,0 +1 @@ +date From 6356999ad5f1634ffc7e24765d706d97feaf7933 Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Fri, 27 Oct 2023 09:43:05 -0600 Subject: [PATCH 03/35] splits test_tests --- .../{test_tests.py => test_external_tests.py} | 140 +++--------------- tests/test_internal_tests.py | 129 ++++++++++++++++ 2 files changed, 148 insertions(+), 121 deletions(-) rename tests/{test_tests.py => test_external_tests.py} (68%) create mode 100644 tests/test_internal_tests.py diff --git a/tests/test_tests.py b/tests/test_external_tests.py similarity index 68% rename from tests/test_tests.py rename to tests/test_external_tests.py index 6d8fb6e..0ee613a 100644 --- a/tests/test_tests.py +++ b/tests/test_external_tests.py @@ -1,6 +1,7 @@ from pathlib import Path from tempfile import TemporaryDirectory +import docker import pytest from dcqc import tests @@ -8,73 +9,25 @@ from dcqc.tests import BaseTest, ExternalTestMixin, Process, TestStatus -def test_that_the_file_extension_test_works_on_correct_files(test_targets): - target = test_targets["good"] - test = tests.FileExtensionTest(target) - test_status = test.get_status() - assert test_status == TestStatus.PASS +class DockerExecutor: + def __init__(self, image, command, file_path): + self.image = image + self.command = command + self.file_path = file_path - -def test_that_the_file_extension_test_works_on_correct_remote_file(test_targets): - target = test_targets["remote"] - test = tests.FileExtensionTest(target) - test_status = test.get_status() - assert test_status == TestStatus.PASS - - -def test_that_a_tiff_file_with_good_extensions_is_passed(test_targets): - target = test_targets["tiff"] - test = tests.FileExtensionTest(target) - assert test.get_status() == TestStatus.PASS - - -def test_that_the_file_extension_test_works_on_incorrect_files(test_targets): - target = test_targets["bad"] - test = tests.FileExtensionTest(target) - test_status = test.get_status() - assert test_status == TestStatus.FAIL - - -def test_that_the_md5_checksum_test_works_on_a_correct_file(test_targets): - target = test_targets["good"] - test = tests.Md5ChecksumTest(target) - test_status = test.get_status() - assert test_status == TestStatus.PASS - - -def test_that_the_md5_checksum_test_works_on_incorrect_files(test_targets): - target = test_targets["bad"] - test = tests.Md5ChecksumTest(target) - test_status = test.get_status() - assert test_status == TestStatus.FAIL - - -def test_that_the_json_load_test_works_on_a_correct_file(test_targets): - target = test_targets["jsonld"] - test = tests.JsonLoadTest(target) - test_status = test.get_status() - assert test_status == TestStatus.PASS - - -def test_that_the_json_load_test_works_on_incorrect_files(test_targets): - target = test_targets["good"] - test = tests.JsonLoadTest(target) - test_status = test.get_status() - assert test_status == TestStatus.FAIL - - -def test_that_the_jsonld_load_test_works_on_a_correct_file(test_targets): - target = test_targets["jsonld"] - test = tests.JsonLdLoadTest(target) - test_status = test.get_status() - assert test_status == TestStatus.PASS - - -def test_that_the_jsonld_load_test_works_on_incorrect_files(test_targets): - target = test_targets["good"] - test = tests.JsonLdLoadTest(target) - test_status = test.get_status() - assert test_status == TestStatus.FAIL + def execute(self): + client = docker.from_env() + container = client.containers.run( + image=self.image, + command=self.command, + detach=True, + stdout=True, + stderr=True, + volumes={self.file_path: {"bind": self.file_path, "mode": "ro"}}, + ) + self.exit_code = str(container.wait()["StatusCode"]) + self.std_out = container.logs(stdout=True, stderr=False).decode("utf-8") + self.std_err = container.logs(stdout=False, stderr=True).decode("utf-8") def test_that_all_external_tests_inherit_from_the_mixin_first(): @@ -183,16 +136,6 @@ def test_that_the_ome_xml_info_test_correctly_interprets_exit_code_0_and_1( assert test_status == TestStatus.FAIL -def test_that_the_md5_checksum_test_can_be_retrieved_by_name(): - test = BaseTest.get_subclass_by_name("Md5ChecksumTest") - assert test is tests.Md5ChecksumTest - - -def test_for_an_error_when_retrieving_a_random_test_by_name(): - with pytest.raises(ValueError): - BaseTest.get_subclass_by_name("FooBar") - - def test_that_process_output_files_can_be_found(get_data): std_out = get_data("tiffinfo/std_out.txt") std_err = get_data("tiffinfo/std_err.txt") @@ -210,20 +153,6 @@ def test_that_process_output_files_can_be_found(get_data): ExternalTestMixin._find_process_outputs(tmp_path) -def test_for_error_when_importing_unavailable_module(test_targets): - target = test_targets["good"] - test = tests.FileExtensionTest(target) - with pytest.raises(ModuleNotFoundError): - test.import_module("foobar") - - -def test_that_an_existing_module_can_be_imported(test_targets): - target = test_targets["good"] - test = tests.FileExtensionTest(target) - imported = test.import_module("pytest") - assert imported is pytest - - def test_that_a_process_can_be_serialized_and_deserialized(): process = Process("foo:bar", ["python"]) process_dict = process.to_dict() @@ -325,34 +254,3 @@ def test_that_the_tiffdatetimetest_correctly_interprets_exit_code_0_and_1( mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) test_status = test.get_status() assert test_status == TestStatus.FAIL - - -def test_that_paired_fastq_parity_test_correctly_passes_identical_fastq_files( - test_files, -): - fastq1 = test_files["fastq1"] - target = PairedTarget([fastq1, fastq1]) - test = tests.PairedFastqParityTest(target) - test_status = test.get_status() - assert test_status == TestStatus.PASS - - -def test_that_paired_fastq_parity_test_correctly_fails_different_fastq_files( - test_files, -): - fastq1 = test_files["fastq1"] - fastq2 = test_files["fastq2"] - target = PairedTarget([fastq1, fastq2]) - test = tests.PairedFastqParityTest(target) - test_status = test.get_status() - assert test_status == TestStatus.FAIL - - -def test_that_paired_fastq_parity_test_correctly_handles_compressed_fastq_files( - test_files, -): - fastq2 = test_files["fastq2"] - target = PairedTarget([fastq2, fastq2]) - test = tests.PairedFastqParityTest(target) - test_status = test.get_status() - assert test_status == TestStatus.PASS diff --git a/tests/test_internal_tests.py b/tests/test_internal_tests.py new file mode 100644 index 0000000..72ba701 --- /dev/null +++ b/tests/test_internal_tests.py @@ -0,0 +1,129 @@ +import pytest + +from dcqc import tests +from dcqc.target import PairedTarget +from dcqc.tests import BaseTest, TestStatus + + +def test_that_the_file_extension_test_works_on_correct_files(test_targets): + target = test_targets["good"] + test = tests.FileExtensionTest(target) + test_status = test.get_status() + assert test_status == TestStatus.PASS + + +def test_that_the_file_extension_test_works_on_correct_remote_file(test_targets): + target = test_targets["remote"] + test = tests.FileExtensionTest(target) + test_status = test.get_status() + assert test_status == TestStatus.PASS + + +def test_that_a_tiff_file_with_good_extensions_is_passed(test_targets): + target = test_targets["tiff"] + test = tests.FileExtensionTest(target) + assert test.get_status() == TestStatus.PASS + + +def test_that_the_file_extension_test_works_on_incorrect_files(test_targets): + target = test_targets["bad"] + test = tests.FileExtensionTest(target) + test_status = test.get_status() + assert test_status == TestStatus.FAIL + + +def test_that_the_md5_checksum_test_works_on_a_correct_file(test_targets): + target = test_targets["good"] + test = tests.Md5ChecksumTest(target) + test_status = test.get_status() + assert test_status == TestStatus.PASS + + +def test_that_the_md5_checksum_test_works_on_incorrect_files(test_targets): + target = test_targets["bad"] + test = tests.Md5ChecksumTest(target) + test_status = test.get_status() + assert test_status == TestStatus.FAIL + + +def test_that_the_json_load_test_works_on_a_correct_file(test_targets): + target = test_targets["jsonld"] + test = tests.JsonLoadTest(target) + test_status = test.get_status() + assert test_status == TestStatus.PASS + + +def test_that_the_json_load_test_works_on_incorrect_files(test_targets): + target = test_targets["good"] + test = tests.JsonLoadTest(target) + test_status = test.get_status() + assert test_status == TestStatus.FAIL + + +def test_that_the_jsonld_load_test_works_on_a_correct_file(test_targets): + target = test_targets["jsonld"] + test = tests.JsonLdLoadTest(target) + test_status = test.get_status() + assert test_status == TestStatus.PASS + + +def test_that_the_jsonld_load_test_works_on_incorrect_files(test_targets): + target = test_targets["good"] + test = tests.JsonLdLoadTest(target) + test_status = test.get_status() + assert test_status == TestStatus.FAIL + + +def test_that_the_md5_checksum_test_can_be_retrieved_by_name(): + test = BaseTest.get_subclass_by_name("Md5ChecksumTest") + assert test is tests.Md5ChecksumTest + + +def test_for_an_error_when_retrieving_a_random_test_by_name(): + with pytest.raises(ValueError): + BaseTest.get_subclass_by_name("FooBar") + + +def test_for_error_when_importing_unavailable_module(test_targets): + target = test_targets["good"] + test = tests.FileExtensionTest(target) + with pytest.raises(ModuleNotFoundError): + test.import_module("foobar") + + +def test_that_an_existing_module_can_be_imported(test_targets): + target = test_targets["good"] + test = tests.FileExtensionTest(target) + imported = test.import_module("pytest") + assert imported is pytest + + +def test_that_paired_fastq_parity_test_correctly_passes_identical_fastq_files( + test_files, +): + fastq1 = test_files["fastq1"] + target = PairedTarget([fastq1, fastq1]) + test = tests.PairedFastqParityTest(target) + test_status = test.get_status() + assert test_status == TestStatus.PASS + + +def test_that_paired_fastq_parity_test_correctly_fails_different_fastq_files( + test_files, +): + fastq1 = test_files["fastq1"] + fastq2 = test_files["fastq2"] + target = PairedTarget([fastq1, fastq2]) + test = tests.PairedFastqParityTest(target) + test_status = test.get_status() + assert test_status == TestStatus.FAIL + + +def test_that_paired_fastq_parity_test_correctly_handles_compressed_fastq_files( + test_files, +): + fastq2 = test_files["fastq2"] + target = PairedTarget([fastq2, fastq2]) + test = tests.PairedFastqParityTest(target) + test_status = test.get_status() + assert test_status == TestStatus.PASS From 8d16c69e886bf6a6d1984c68bdec3fd905b1b850 Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Mon, 30 Oct 2023 10:03:54 -0600 Subject: [PATCH 04/35] adds small example ome-tiff file --- tests/data/ome_tiff.ome.tiff | Bin 0 -> 269568 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/data/ome_tiff.ome.tiff diff --git a/tests/data/ome_tiff.ome.tiff b/tests/data/ome_tiff.ome.tiff new file mode 100644 index 0000000000000000000000000000000000000000..9cec9f460b1b899fbf2bc8c4af9fecb22a09f3f4 GIT binary patch literal 269568 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 z⋘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%0Dd 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 z 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 F^H1{E93KDx literal 0 HcmV?d00001 From d28b94e6f5d3c443e5c7ef6db9d9a8c07b7bebf8 Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Mon, 30 Oct 2023 10:04:24 -0600 Subject: [PATCH 05/35] removes redundant example file --- tests/data/date.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 tests/data/date.txt diff --git a/tests/data/date.txt b/tests/data/date.txt deleted file mode 100644 index 60fffd1..0000000 --- a/tests/data/date.txt +++ /dev/null @@ -1 +0,0 @@ -date From 8e6c4a9661c56cd655d2fdceefaa6a3926cfbe45 Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Mon, 30 Oct 2023 10:04:45 -0600 Subject: [PATCH 06/35] adds new fixtures --- tests/conftest.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index 69a6736..dabf786 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -55,6 +55,8 @@ def _get_data(filename: str) -> Path: @pytest.fixture def test_files(get_data): txt_path = get_data("test.txt") + date_path = get_data("test_contains_word_date.txt") + ome_tiff_path = get_data("ome_tiff.ome.tiff") jsonld_path = get_data("example.jsonld") tiff_path = get_data("circuit.tif") fastq1_path = get_data("fastq1.fastq") @@ -65,6 +67,14 @@ def test_files(get_data): "file_type": "txt", "md5_checksum": "14758f1afd44c09b7992073ccf00b43d", } + date_txt_metadata = { + "file_type": "txt", + "md5_checksum": "9cee1b0e8c4d051fabea82b62ae69404", + } + ome_tiff_metadata = { + "file_type": "ome-tiff", + "md5_checksum": "293e46687fa6543a2e8189f1698cc5d0", + } bad_metadata = { "file_type": "tiff", "md5_checksum": "definitelynottherightmd5checksum", @@ -84,6 +94,8 @@ def test_files(get_data): } test_files = { "good": File(txt_path.as_posix(), good_metadata), + "date_txt": File(date_path.as_posix(), date_txt_metadata), + "ome_tiff": File(ome_tiff_path.as_posix(), ome_tiff_metadata), "bad": File(txt_path.as_posix(), bad_metadata), "tiff": File(tiff_path.as_posix(), tiff_metadata), "fastq1": File(fastq1_path.as_posix(), fastq_metadata), From 459a90373ff754ea6464396820446297bc86b0db Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Mon, 30 Oct 2023 10:05:18 -0600 Subject: [PATCH 07/35] adds docker-enabled testing example --- tests/test_external_tests.py | 493 +++++++++++++++++++---------------- 1 file changed, 271 insertions(+), 222 deletions(-) diff --git a/tests/test_external_tests.py b/tests/test_external_tests.py index 0ee613a..66d8f93 100644 --- a/tests/test_external_tests.py +++ b/tests/test_external_tests.py @@ -1,21 +1,53 @@ -from pathlib import Path -from tempfile import TemporaryDirectory - import docker -import pytest - from dcqc import tests -from dcqc.target import PairedTarget, SingleTarget -from dcqc.tests import BaseTest, ExternalTestMixin, Process, TestStatus +from dcqc.target import SingleTarget + +# def test_that_all_external_tests_inherit_from_the_mixin_first(): +# tests = BaseTest.list_subclasses() +# for test in tests: +# if issubclass(test, ExternalTestMixin): +# mro = test.__mro__ +# mixin_index = mro.index(ExternalTestMixin) +# abc_index = mro.index(BaseTest) +# assert mixin_index < abc_index + + +# def test_that_process_output_files_can_be_found(get_data): +# std_out = get_data("tiffinfo/std_out.txt") +# std_err = get_data("tiffinfo/std_err.txt") +# exit_code = get_data("tiffinfo/exit_code.txt") +# with TemporaryDirectory() as tmp_dir: +# tmp_path = Path(tmp_dir) + +# (tmp_path / std_out.name).symlink_to(std_out) +# (tmp_path / std_err.name).symlink_to(std_err) + +# with pytest.raises(FileNotFoundError): +# ExternalTestMixin._find_process_outputs(tmp_path) + +# (tmp_path / exit_code.name).symlink_to(exit_code) +# ExternalTestMixin._find_process_outputs(tmp_path) + + +# def test_that_a_process_can_be_serialized_and_deserialized(): +# process = Process("foo:bar", ["python"]) +# process_dict = process.to_dict() +# process_from_dict = Process.from_dict(process_dict) +# assert process_dict == process_from_dict.to_dict() class DockerExecutor: - def __init__(self, image, command, file_path): + """Class for executing a command in a docker container.""" + + def __init__(self, image: str, command: str, file_path: str): + """Initialize the class.""" self.image = image self.command = command - self.file_path = file_path + self.local_path = file_path + self.container_path = "/" + file_path.split("/")[-1] def execute(self): + """Execute the command in a docker container.""" client = docker.from_env() container = client.containers.run( image=self.image, @@ -23,168 +55,14 @@ def execute(self): detach=True, stdout=True, stderr=True, - volumes={self.file_path: {"bind": self.file_path, "mode": "ro"}}, + volumes={self.local_path: {"bind": self.container_path, "mode": "ro"}}, + # remove=True, UNCOMMENT THIS WHEN READY TO COMMIT ) self.exit_code = str(container.wait()["StatusCode"]) self.std_out = container.logs(stdout=True, stderr=False).decode("utf-8") self.std_err = container.logs(stdout=False, stderr=True).decode("utf-8") -def test_that_all_external_tests_inherit_from_the_mixin_first(): - tests = BaseTest.list_subclasses() - for test in tests: - if issubclass(test, ExternalTestMixin): - mro = test.__mro__ - mixin_index = mro.index(ExternalTestMixin) - abc_index = mro.index(BaseTest) - assert mixin_index < abc_index - - -def test_that_the_libtiff_info_test_correctly_interprets_exit_code_0_and_1( - test_files, mocker -): - # 0 is pass, 1 is fail - tiff_file = test_files["tiff"] - target = SingleTarget(tiff_file) - with TemporaryDirectory() as tmp_dir: - path_0 = Path(tmp_dir, "code_0.txt") - path_1 = Path(tmp_dir, "code_1.txt") - path_0.write_text("0") - path_1.write_text("1") - pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} - fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} - - test = tests.LibTiffInfoTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) - test_status = test.get_status() - assert test_status == TestStatus.PASS - - test = tests.LibTiffInfoTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) - test_status = test.get_status() - assert test_status == TestStatus.FAIL - - -def test_that_the_libtiff_info_test_command_is_produced(test_targets): - target = test_targets["tiff"] - test = tests.LibTiffInfoTest(target) - process = test.generate_process() - assert "tiffinfo" in process.command - - -def test_that_the_bioformats_info_test_command_is_produced(test_targets): - target = test_targets["tiff"] - test = tests.BioFormatsInfoTest(target) - process = test.generate_process() - assert "showinf" in process.command - - -def test_that_the_bioformats_info_test_correctly_interprets_exit_code_0_and_1( - test_files, mocker -): - # 0 is pass, 1 is fail - tiff_file = test_files["tiff"] - target = SingleTarget(tiff_file) - with TemporaryDirectory() as tmp_dir: - path_0 = Path(tmp_dir, "code_0.txt") - path_1 = Path(tmp_dir, "code_1.txt") - path_0.write_text("0") - path_1.write_text("1") - pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} - fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} - - test = tests.BioFormatsInfoTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) - test_status = test.get_status() - assert test_status == TestStatus.PASS - - test = tests.BioFormatsInfoTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) - test_status = test.get_status() - assert test_status == TestStatus.FAIL - - -def test_that_the_ome_xml_schema_test_command_is_produced(test_targets): - target = test_targets["tiff"] - test = tests.OmeXmlSchemaTest(target) - process = test.generate_process() - assert "xmlvalid" in process.command - - -def test_that_the_ome_xml_info_test_correctly_interprets_exit_code_0_and_1( - test_files, mocker -): - # 0 is pass, 1 is fail - tiff_file = test_files["tiff"] - target = SingleTarget(tiff_file) - with TemporaryDirectory() as tmp_dir: - path_0 = Path(tmp_dir, "code_0.txt") - path_1 = Path(tmp_dir, "code_1.txt") - path_0.write_text("0") - path_1.write_text("1") - pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} - fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} - - test = tests.OmeXmlSchemaTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) - test_status = test.get_status() - assert test_status == TestStatus.PASS - - test = tests.OmeXmlSchemaTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) - test_status = test.get_status() - assert test_status == TestStatus.FAIL - - -def test_that_process_output_files_can_be_found(get_data): - std_out = get_data("tiffinfo/std_out.txt") - std_err = get_data("tiffinfo/std_err.txt") - exit_code = get_data("tiffinfo/exit_code.txt") - with TemporaryDirectory() as tmp_dir: - tmp_path = Path(tmp_dir) - - (tmp_path / std_out.name).symlink_to(std_out) - (tmp_path / std_err.name).symlink_to(std_err) - - with pytest.raises(FileNotFoundError): - ExternalTestMixin._find_process_outputs(tmp_path) - - (tmp_path / exit_code.name).symlink_to(exit_code) - ExternalTestMixin._find_process_outputs(tmp_path) - - -def test_that_a_process_can_be_serialized_and_deserialized(): - process = Process("foo:bar", ["python"]) - process_dict = process.to_dict() - process_from_dict = Process.from_dict(process_dict) - assert process_dict == process_from_dict.to_dict() - - -def test_that_the_grep_date_test_correctly_interprets_exit_code_0_and_1( - test_files, mocker -): - # 1 is pass, 0 is fail - tiff_file = test_files["tiff"] - target = SingleTarget(tiff_file) - with TemporaryDirectory() as tmp_dir: - path_0 = Path(tmp_dir, "code_0.txt") - path_1 = Path(tmp_dir, "code_1.txt") - path_0.write_text("0") - path_1.write_text("1") - fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} - pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} - - test = tests.GrepDateTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) - test_status = test.get_status() - assert test_status == TestStatus.PASS - - test = tests.GrepDateTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) - test_status = test.get_status() - assert test_status == TestStatus.FAIL - - def test_that_the_grep_date_test_command_is_produced(test_targets): target = test_targets["tiff"] test = tests.GrepDateTest(target) @@ -192,65 +70,236 @@ def test_that_the_grep_date_test_command_is_produced(test_targets): assert "grep" in process.command -def test_that_the_tifftag306datetimetest_command_is_produced(test_targets): - target = test_targets["tiff"] - test = tests.TiffTag306DateTimeTest(target) +def test_that_the_grep_date_test_exit_code_is_0_when_it_should_be(test_files): + date_file = test_files["date_txt"] + target = SingleTarget(date_file) + test = tests.GrepDateTest(target) process = test.generate_process() - assert "jq" in process.command + executor = DockerExecutor(process.container, process.command, target.file.url) + executor.execute() + assert executor.exit_code == "0" -def test_that_the_tifftag306datetimetest_correctly_interprets_exit_code_0_and_1( - test_files, mocker -): - # 1 is pass, 0 is fail - tiff_file = test_files["tiff"] +def test_that_the_grep_date_test_exit_code_is_1_when_it_should_be(test_files): + tiff_file = test_files["good"] target = SingleTarget(tiff_file) - with TemporaryDirectory() as tmp_dir: - path_0 = Path(tmp_dir, "code_0.txt") - path_1 = Path(tmp_dir, "code_1.txt") - path_0.write_text("0") - path_1.write_text("1") - fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} - pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} - - test = tests.TiffTag306DateTimeTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) - test_status = test.get_status() - assert test_status == TestStatus.PASS - - test = tests.TiffTag306DateTimeTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) - test_status = test.get_status() - assert test_status == TestStatus.FAIL - - -def test_that_the_tiffdatetimetest_command_is_produced(test_targets): - target = test_targets["tiff"] - test = tests.TiffDateTimeTest(target) + test = tests.GrepDateTest(target) process = test.generate_process() - assert "grep" in process.command - - -def test_that_the_tiffdatetimetest_correctly_interprets_exit_code_0_and_1( - test_files, mocker -): - # 1 is pass, 0 is fail - tiff_file = test_files["tiff"] - target = SingleTarget(tiff_file) - with TemporaryDirectory() as tmp_dir: - path_0 = Path(tmp_dir, "code_0.txt") - path_1 = Path(tmp_dir, "code_1.txt") - path_0.write_text("0") - path_1.write_text("1") - fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} - pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} - - test = tests.TiffDateTimeTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) - test_status = test.get_status() - assert test_status == TestStatus.PASS - - test = tests.TiffDateTimeTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) - test_status = test.get_status() - assert test_status == TestStatus.FAIL + executor = DockerExecutor(process.container, process.command, target.file.url) + executor.execute() + assert executor.exit_code == "1" + + +# def test_that_the_grep_date_test_correctly_interprets_exit_code_0_and_1( +# test_files, mocker +# ): +# # 1 is pass, 0 is fail +# tiff_file = test_files["tiff"] +# target = SingleTarget(tiff_file) +# with TemporaryDirectory() as tmp_dir: +# path_0 = Path(tmp_dir, "code_0.txt") +# path_1 = Path(tmp_dir, "code_1.txt") +# path_0.write_text("0") +# path_1.write_text("1") +# fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} +# pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} + +# test = tests.GrepDateTest(target) +# mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) +# test_status = test.get_status() +# assert test_status == TestStatus.PASS + +# test = tests.GrepDateTest(target) +# mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) +# test_status = test.get_status() +# assert test_status == TestStatus.FAIL + + +# def test_that_the_libtiff_info_test_command_is_produced(test_targets): +# target = test_targets["tiff"] +# test = tests.LibTiffInfoTest(target) +# process = test.generate_process() +# assert "tiffinfo" in process.command + + +# def test_that_the_libtiff_info_test_exit_code_is_0_when_it_should_be(test_files): +# tiff_file = test_files["tiff"] +# target = SingleTarget(tiff_file) +# test = tests.LibTiffInfoTest(target) +# process = test.generate_process() +# executor = DockerExecutor(process.container, process.command, target.file.url) +# executor.execute() +# assert executor.exit_code == "0" + + +# def test_that_the_libtiff_info_test_exit_code_is_1_when_it_should_be(test_files): +# tiff_file = test_files["bad"] +# target = SingleTarget(tiff_file) +# test = tests.LibTiffInfoTest(target) +# process = test.generate_process() +# executor = DockerExecutor(process.container, process.command, target.file.url) +# executor.execute() +# assert executor.exit_code == "1" + + +# def test_that_the_libtiff_info_test_correctly_interprets_exit_code_0_and_1( +# test_files, mocker +# ): +# # 0 is pass, 1 is fail +# tiff_file = test_files["tiff"] +# target = SingleTarget(tiff_file) +# with TemporaryDirectory() as tmp_dir: +# path_0 = Path(tmp_dir, "code_0.txt") +# path_1 = Path(tmp_dir, "code_1.txt") +# path_0.write_text("0") +# path_1.write_text("1") +# pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} +# fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} + +# test = tests.LibTiffInfoTest(target) +# mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) +# test_status = test.get_status() +# assert test_status == TestStatus.PASS + +# test = tests.LibTiffInfoTest(target) +# mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) +# test_status = test.get_status() +# assert test_status == TestStatus.FAIL + + +# def test_that_the_bioformats_info_test_command_is_produced(test_targets): +# target = test_targets["tiff"] +# test = tests.BioFormatsInfoTest(target) +# process = test.generate_process() +# assert "showinf" in process.command + + +# def test_that_the_bioformats_info_test_exit_code_is_0_when_it_should_be(test_files): +# one_tiff_file = test_files["ome_tiff"] +# target = SingleTarget(one_tiff_file) +# test = tests.BioFormatsInfoTest(target) +# process = test.generate_process() +# executor = DockerExecutor(process.container, process.command, target.file.url) +# executor.execute() +# assert executor.exit_code == "0" + + +# def test_that_the_bioformats_info_test_correctly_interprets_exit_code_0_and_1( +# test_files, mocker +# ): +# # 0 is pass, 1 is fail +# tiff_file = test_files["tiff"] +# target = SingleTarget(tiff_file) +# with TemporaryDirectory() as tmp_dir: +# path_0 = Path(tmp_dir, "code_0.txt") +# path_1 = Path(tmp_dir, "code_1.txt") +# path_0.write_text("0") +# path_1.write_text("1") +# pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} +# fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} + +# test = tests.BioFormatsInfoTest(target) +# mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) +# test_status = test.get_status() +# assert test_status == TestStatus.PASS + +# test = tests.BioFormatsInfoTest(target) +# mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) +# test_status = test.get_status() +# assert test_status == TestStatus.FAIL + + +# def test_that_the_ome_xml_schema_test_command_is_produced(test_targets): +# target = test_targets["tiff"] +# test = tests.OmeXmlSchemaTest(target) +# process = test.generate_process() +# assert "xmlvalid" in process.command + + +# def test_that_the_ome_xml_info_test_correctly_interprets_exit_code_0_and_1( +# test_files, mocker +# ): +# # 0 is pass, 1 is fail +# tiff_file = test_files["tiff"] +# target = SingleTarget(tiff_file) +# with TemporaryDirectory() as tmp_dir: +# path_0 = Path(tmp_dir, "code_0.txt") +# path_1 = Path(tmp_dir, "code_1.txt") +# path_0.write_text("0") +# path_1.write_text("1") +# pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} +# fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} + +# test = tests.OmeXmlSchemaTest(target) +# mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) +# test_status = test.get_status() +# assert test_status == TestStatus.PASS + +# test = tests.OmeXmlSchemaTest(target) +# mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) +# test_status = test.get_status() +# assert test_status == TestStatus.FAIL + + +# def test_that_the_tifftag306datetimetest_command_is_produced(test_targets): +# target = test_targets["tiff"] +# test = tests.TiffTag306DateTimeTest(target) +# process = test.generate_process() +# assert "jq" in process.command + + +# def test_that_the_tifftag306datetimetest_correctly_interprets_exit_code_0_and_1( +# test_files, mocker +# ): +# # 1 is pass, 0 is fail +# tiff_file = test_files["tiff"] +# target = SingleTarget(tiff_file) +# with TemporaryDirectory() as tmp_dir: +# path_0 = Path(tmp_dir, "code_0.txt") +# path_1 = Path(tmp_dir, "code_1.txt") +# path_0.write_text("0") +# path_1.write_text("1") +# fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} +# pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} + +# test = tests.TiffTag306DateTimeTest(target) +# mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) +# test_status = test.get_status() +# assert test_status == TestStatus.PASS + +# test = tests.TiffTag306DateTimeTest(target) +# mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) +# test_status = test.get_status() +# assert test_status == TestStatus.FAIL + + +# def test_that_the_tiffdatetimetest_command_is_produced(test_targets): +# target = test_targets["tiff"] +# test = tests.TiffDateTimeTest(target) +# process = test.generate_process() +# assert "grep" in process.command + + +# def test_that_the_tiffdatetimetest_correctly_interprets_exit_code_0_and_1( +# test_files, mocker +# ): +# # 1 is pass, 0 is fail +# tiff_file = test_files["tiff"] +# target = SingleTarget(tiff_file) +# with TemporaryDirectory() as tmp_dir: +# path_0 = Path(tmp_dir, "code_0.txt") +# path_1 = Path(tmp_dir, "code_1.txt") +# path_0.write_text("0") +# path_1.write_text("1") +# fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} +# pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} + +# test = tests.TiffDateTimeTest(target) +# mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) +# test_status = test.get_status() +# assert test_status == TestStatus.PASS + +# test = tests.TiffDateTimeTest(target) +# mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) +# test_status = test.get_status() +# assert test_status == TestStatus.FAIL From 3e0f7f2efde03efcda0a3bb8efcf46c19d41d5b2 Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Mon, 30 Oct 2023 10:13:20 -0600 Subject: [PATCH 08/35] remmove macOS for testing --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3b46253..c9ec443 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -62,7 +62,7 @@ jobs: - "3.11" # newest Python that is stable platform: - ubuntu-latest - - macos-latest + # - macos-latest # TODO: Debug the Windows issues # - windows-latest env: From cd92ff7976a4358ad875c87ba6c7fee755bd8640 Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Mon, 30 Oct 2023 10:55:42 -0600 Subject: [PATCH 09/35] enable docker in macos runner --- .github/workflows/ci.yml | 7 +- tests/test_external_tests.py | 209 ++++++++++++++++++----------------- 2 files changed, 114 insertions(+), 102 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c9ec443..167b203 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -62,7 +62,7 @@ jobs: - "3.11" # newest Python that is stable platform: - ubuntu-latest - # - macos-latest + - macos-latest # TODO: Debug the Windows issues # - windows-latest env: @@ -76,6 +76,11 @@ jobs: python-version: ${{ matrix.python }} - uses: actions/download-artifact@v3 with: {name: python-distribution-files, path: dist/} + - name: Setup docker (missing on MacOS) + if: runner.os == 'macos' + run: | + brew install docker + colima start - name: Run tests env: SYNAPSE_AUTH_TOKEN: ${{ secrets.SYNAPSE_AUTH_TOKEN }} diff --git a/tests/test_external_tests.py b/tests/test_external_tests.py index 66d8f93..c51d2f2 100644 --- a/tests/test_external_tests.py +++ b/tests/test_external_tests.py @@ -1,39 +1,46 @@ +from pathlib import Path +from tempfile import TemporaryDirectory + +import pytest + import docker from dcqc import tests from dcqc.target import SingleTarget +from dcqc.tests import BaseTest, ExternalTestMixin, Process, TestStatus -# def test_that_all_external_tests_inherit_from_the_mixin_first(): -# tests = BaseTest.list_subclasses() -# for test in tests: -# if issubclass(test, ExternalTestMixin): -# mro = test.__mro__ -# mixin_index = mro.index(ExternalTestMixin) -# abc_index = mro.index(BaseTest) -# assert mixin_index < abc_index +def test_that_all_external_tests_inherit_from_the_mixin_first(): + tests = BaseTest.list_subclasses() + for test in tests: + if issubclass(test, ExternalTestMixin): + mro = test.__mro__ + mixin_index = mro.index(ExternalTestMixin) + abc_index = mro.index(BaseTest) + assert mixin_index < abc_index -# def test_that_process_output_files_can_be_found(get_data): -# std_out = get_data("tiffinfo/std_out.txt") -# std_err = get_data("tiffinfo/std_err.txt") -# exit_code = get_data("tiffinfo/exit_code.txt") -# with TemporaryDirectory() as tmp_dir: -# tmp_path = Path(tmp_dir) -# (tmp_path / std_out.name).symlink_to(std_out) -# (tmp_path / std_err.name).symlink_to(std_err) +def test_that_process_output_files_can_be_found(get_data): + std_out = get_data("tiffinfo/std_out.txt") + std_err = get_data("tiffinfo/std_err.txt") + exit_code = get_data("tiffinfo/exit_code.txt") + with TemporaryDirectory() as tmp_dir: + tmp_path = Path(tmp_dir) -# with pytest.raises(FileNotFoundError): -# ExternalTestMixin._find_process_outputs(tmp_path) + (tmp_path / std_out.name).symlink_to(std_out) + (tmp_path / std_err.name).symlink_to(std_err) -# (tmp_path / exit_code.name).symlink_to(exit_code) -# ExternalTestMixin._find_process_outputs(tmp_path) + with pytest.raises(FileNotFoundError): + ExternalTestMixin._find_process_outputs(tmp_path) + (tmp_path / exit_code.name).symlink_to(exit_code) + ExternalTestMixin._find_process_outputs(tmp_path) -# def test_that_a_process_can_be_serialized_and_deserialized(): -# process = Process("foo:bar", ["python"]) -# process_dict = process.to_dict() -# process_from_dict = Process.from_dict(process_dict) -# assert process_dict == process_from_dict.to_dict() + +def test_that_a_process_can_be_serialized_and_deserialized(): + process = Process("foo:bar", ["python"]) + process_dict = process.to_dict() + process_from_dict = Process.from_dict(process_dict) + assert process_dict == process_from_dict.to_dict() class DockerExecutor: @@ -90,88 +97,88 @@ def test_that_the_grep_date_test_exit_code_is_1_when_it_should_be(test_files): assert executor.exit_code == "1" -# def test_that_the_grep_date_test_correctly_interprets_exit_code_0_and_1( -# test_files, mocker -# ): -# # 1 is pass, 0 is fail -# tiff_file = test_files["tiff"] -# target = SingleTarget(tiff_file) -# with TemporaryDirectory() as tmp_dir: -# path_0 = Path(tmp_dir, "code_0.txt") -# path_1 = Path(tmp_dir, "code_1.txt") -# path_0.write_text("0") -# path_1.write_text("1") -# fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} -# pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} - -# test = tests.GrepDateTest(target) -# mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) -# test_status = test.get_status() -# assert test_status == TestStatus.PASS - -# test = tests.GrepDateTest(target) -# mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) -# test_status = test.get_status() -# assert test_status == TestStatus.FAIL - - -# def test_that_the_libtiff_info_test_command_is_produced(test_targets): -# target = test_targets["tiff"] -# test = tests.LibTiffInfoTest(target) -# process = test.generate_process() -# assert "tiffinfo" in process.command - - -# def test_that_the_libtiff_info_test_exit_code_is_0_when_it_should_be(test_files): -# tiff_file = test_files["tiff"] -# target = SingleTarget(tiff_file) -# test = tests.LibTiffInfoTest(target) -# process = test.generate_process() -# executor = DockerExecutor(process.container, process.command, target.file.url) -# executor.execute() -# assert executor.exit_code == "0" - - -# def test_that_the_libtiff_info_test_exit_code_is_1_when_it_should_be(test_files): -# tiff_file = test_files["bad"] -# target = SingleTarget(tiff_file) -# test = tests.LibTiffInfoTest(target) -# process = test.generate_process() -# executor = DockerExecutor(process.container, process.command, target.file.url) -# executor.execute() -# assert executor.exit_code == "1" +def test_that_the_grep_date_test_correctly_interprets_exit_code_0_and_1( + test_files, mocker +): + # 1 is pass, 0 is fail + tiff_file = test_files["tiff"] + target = SingleTarget(tiff_file) + with TemporaryDirectory() as tmp_dir: + path_0 = Path(tmp_dir, "code_0.txt") + path_1 = Path(tmp_dir, "code_1.txt") + path_0.write_text("0") + path_1.write_text("1") + fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} + pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} + + test = tests.GrepDateTest(target) + mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) + test_status = test.get_status() + assert test_status == TestStatus.PASS + + test = tests.GrepDateTest(target) + mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) + test_status = test.get_status() + assert test_status == TestStatus.FAIL + + +def test_that_the_libtiff_info_test_command_is_produced(test_targets): + target = test_targets["tiff"] + test = tests.LibTiffInfoTest(target) + process = test.generate_process() + assert "tiffinfo" in process.command -# def test_that_the_libtiff_info_test_correctly_interprets_exit_code_0_and_1( -# test_files, mocker -# ): -# # 0 is pass, 1 is fail -# tiff_file = test_files["tiff"] -# target = SingleTarget(tiff_file) -# with TemporaryDirectory() as tmp_dir: -# path_0 = Path(tmp_dir, "code_0.txt") -# path_1 = Path(tmp_dir, "code_1.txt") -# path_0.write_text("0") -# path_1.write_text("1") -# pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} -# fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} +def test_that_the_libtiff_info_test_exit_code_is_0_when_it_should_be(test_files): + tiff_file = test_files["tiff"] + target = SingleTarget(tiff_file) + test = tests.LibTiffInfoTest(target) + process = test.generate_process() + executor = DockerExecutor(process.container, process.command, target.file.url) + executor.execute() + assert executor.exit_code == "0" -# test = tests.LibTiffInfoTest(target) -# mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) -# test_status = test.get_status() -# assert test_status == TestStatus.PASS -# test = tests.LibTiffInfoTest(target) -# mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) -# test_status = test.get_status() -# assert test_status == TestStatus.FAIL +def test_that_the_libtiff_info_test_exit_code_is_1_when_it_should_be(test_files): + tiff_file = test_files["bad"] + target = SingleTarget(tiff_file) + test = tests.LibTiffInfoTest(target) + process = test.generate_process() + executor = DockerExecutor(process.container, process.command, target.file.url) + executor.execute() + assert executor.exit_code == "1" -# def test_that_the_bioformats_info_test_command_is_produced(test_targets): -# target = test_targets["tiff"] -# test = tests.BioFormatsInfoTest(target) -# process = test.generate_process() -# assert "showinf" in process.command +def test_that_the_libtiff_info_test_correctly_interprets_exit_code_0_and_1( + test_files, mocker +): + # 0 is pass, 1 is fail + tiff_file = test_files["tiff"] + target = SingleTarget(tiff_file) + with TemporaryDirectory() as tmp_dir: + path_0 = Path(tmp_dir, "code_0.txt") + path_1 = Path(tmp_dir, "code_1.txt") + path_0.write_text("0") + path_1.write_text("1") + pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} + fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} + + test = tests.LibTiffInfoTest(target) + mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) + test_status = test.get_status() + assert test_status == TestStatus.PASS + + test = tests.LibTiffInfoTest(target) + mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) + test_status = test.get_status() + assert test_status == TestStatus.FAIL + + +def test_that_the_bioformats_info_test_command_is_produced(test_targets): + target = test_targets["tiff"] + test = tests.BioFormatsInfoTest(target) + process = test.generate_process() + assert "showinf" in process.command # def test_that_the_bioformats_info_test_exit_code_is_0_when_it_should_be(test_files): From 15a86a6058f2dfa5ec1805704d7ebc9c7c1b250d Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Mon, 30 Oct 2023 11:26:21 -0600 Subject: [PATCH 10/35] wait for docker daemon --- .github/workflows/ci.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 167b203..6fdd45f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,7 +61,7 @@ jobs: - "3.8" - "3.11" # newest Python that is stable platform: - - ubuntu-latest + #- ubuntu-latest - macos-latest # TODO: Debug the Windows issues # - windows-latest @@ -78,9 +78,14 @@ jobs: with: {name: python-distribution-files, path: dist/} - name: Setup docker (missing on MacOS) if: runner.os == 'macos' + # Install docker and colima, make sure the docker daemon is running run: | - brew install docker + brew install docker colima colima start + while ! docker info > /dev/null 2>&1; do + echo "Waiting for docker daemon to start..." + sleep 5 + done - name: Run tests env: SYNAPSE_AUTH_TOKEN: ${{ secrets.SYNAPSE_AUTH_TOKEN }} From e9ac01b3bb8ee5e46191dd9f1c34d826558cf036 Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Mon, 30 Oct 2023 12:12:32 -0600 Subject: [PATCH 11/35] add prints --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6fdd45f..2459607 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -85,7 +85,8 @@ jobs: while ! docker info > /dev/null 2>&1; do echo "Waiting for docker daemon to start..." sleep 5 - done + done + echo "Docker daemon is running" - name: Run tests env: SYNAPSE_AUTH_TOKEN: ${{ secrets.SYNAPSE_AUTH_TOKEN }} From cf9714b414bd3f4775b50a7b66f8bd58d019c748 Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Mon, 30 Oct 2023 13:00:05 -0600 Subject: [PATCH 12/35] try to run tests in same step as start --- .github/workflows/ci.yml | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2459607..acb9bc8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -87,23 +87,24 @@ jobs: sleep 5 done echo "Docker daemon is running" - - name: Run tests - env: - SYNAPSE_AUTH_TOKEN: ${{ secrets.SYNAPSE_AUTH_TOKEN }} - run: >- - pipx run --spec 'tox~=3.0' tox - --installpkg '${{ needs.prepare.outputs.wheel-path }}' - -- -rFEx --durations 10 --color yes - - name: Upload coverage to Codecov - uses: codecov/codecov-action@v3 - with: - # CodeCov can be flaky, so this step is not required for success - fail_ci_if_error: false - files: coverage.xml - # Using matrix pattern from `codecov/codecov-action` README: - # https://github.com/codecov/codecov-action#example-workflowyml-with-codecov-action - env_vars: OS,PYTHON - verbose: true + pytest tests + # - name: Run tests + # env: + # SYNAPSE_AUTH_TOKEN: ${{ secrets.SYNAPSE_AUTH_TOKEN }} + # run: >- + # pipx run --spec 'tox~=3.0' tox + # --installpkg '${{ needs.prepare.outputs.wheel-path }}' + # -- -rFEx --durations 10 --color yes + # - name: Upload coverage to Codecov + # uses: codecov/codecov-action@v3 + # with: + # # CodeCov can be flaky, so this step is not required for success + # fail_ci_if_error: false + # files: coverage.xml + # # Using matrix pattern from `codecov/codecov-action` README: + # # https://github.com/codecov/codecov-action#example-workflowyml-with-codecov-action + # env_vars: OS,PYTHON + # verbose: true pypi-publish: needs: [prepare, test] From 15109661b243ecff90c86061690b7c8f61f77716 Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Mon, 30 Oct 2023 13:51:31 -0600 Subject: [PATCH 13/35] test docker install --- .github/workflows/ci.yml | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index acb9bc8..af22ba4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -76,9 +76,9 @@ jobs: python-version: ${{ matrix.python }} - uses: actions/download-artifact@v3 with: {name: python-distribution-files, path: dist/} - - name: Setup docker (missing on MacOS) - if: runner.os == 'macos' - # Install docker and colima, make sure the docker daemon is running + - name: Run tests + env: + SYNAPSE_AUTH_TOKEN: ${{ secrets.SYNAPSE_AUTH_TOKEN }} run: | brew install docker colima colima start @@ -87,24 +87,19 @@ jobs: sleep 5 done echo "Docker daemon is running" - pytest tests - # - name: Run tests - # env: - # SYNAPSE_AUTH_TOKEN: ${{ secrets.SYNAPSE_AUTH_TOKEN }} - # run: >- - # pipx run --spec 'tox~=3.0' tox - # --installpkg '${{ needs.prepare.outputs.wheel-path }}' - # -- -rFEx --durations 10 --color yes - # - name: Upload coverage to Codecov - # uses: codecov/codecov-action@v3 - # with: - # # CodeCov can be flaky, so this step is not required for success - # fail_ci_if_error: false - # files: coverage.xml - # # Using matrix pattern from `codecov/codecov-action` README: - # # https://github.com/codecov/codecov-action#example-workflowyml-with-codecov-action - # env_vars: OS,PYTHON - # verbose: true + pipx run --spec 'tox~=3.0' tox \ + --installpkg '${{ needs.prepare.outputs.wheel-path }}' \ + -- -rFEx --durations 10 --color yes + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v3 + with: + # CodeCov can be flaky, so this step is not required for success + fail_ci_if_error: false + files: coverage.xml + # Using matrix pattern from `codecov/codecov-action` README: + # https://github.com/codecov/codecov-action#example-workflowyml-with-codecov-action + env_vars: OS,PYTHON + verbose: true pypi-publish: needs: [prepare, test] From 2d1332bc3cd34008c902e36e06b9997e84dd96e7 Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Mon, 30 Oct 2023 14:03:25 -0600 Subject: [PATCH 14/35] add codesign --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index af22ba4..e319384 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -80,6 +80,8 @@ jobs: env: SYNAPSE_AUTH_TOKEN: ${{ secrets.SYNAPSE_AUTH_TOKEN }} run: | + codesign --sign - --entitlements entitlements.xml \ + --force /usr/local/bin/qemu-system-x86_64 brew install docker colima colima start while ! docker info > /dev/null 2>&1; do From 54929553c3ad4db4b63d5ddd90818db5efdc1cb6 Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Mon, 30 Oct 2023 14:06:43 -0600 Subject: [PATCH 15/35] adds entitlements --- entitlements.xml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 entitlements.xml diff --git a/entitlements.xml b/entitlements.xml new file mode 100644 index 0000000..154f330 --- /dev/null +++ b/entitlements.xml @@ -0,0 +1,8 @@ + + + + + com.apple.security.hypervisor + + + From 2cda95ce59070103716d52d78d1a2a183a669342 Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Mon, 30 Oct 2023 14:13:54 -0600 Subject: [PATCH 16/35] switch to ubuntu only for test --- .github/workflows/ci.yml | 15 ++---- tests/test_external_tests.py | 96 ++++++++++++++++++++++-------------- 2 files changed, 61 insertions(+), 50 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e319384..33af5b4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,8 +61,8 @@ jobs: - "3.8" - "3.11" # newest Python that is stable platform: - #- ubuntu-latest - - macos-latest + - ubuntu-latest + # - macos-latest # TODO: Debug the Windows issues # - windows-latest env: @@ -79,16 +79,7 @@ jobs: - name: Run tests env: SYNAPSE_AUTH_TOKEN: ${{ secrets.SYNAPSE_AUTH_TOKEN }} - run: | - codesign --sign - --entitlements entitlements.xml \ - --force /usr/local/bin/qemu-system-x86_64 - brew install docker colima - colima start - while ! docker info > /dev/null 2>&1; do - echo "Waiting for docker daemon to start..." - sleep 5 - done - echo "Docker daemon is running" + run: >- pipx run --spec 'tox~=3.0' tox \ --installpkg '${{ needs.prepare.outputs.wheel-path }}' \ -- -rFEx --durations 10 --color yes diff --git a/tests/test_external_tests.py b/tests/test_external_tests.py index c51d2f2..91999f7 100644 --- a/tests/test_external_tests.py +++ b/tests/test_external_tests.py @@ -181,20 +181,27 @@ def test_that_the_bioformats_info_test_command_is_produced(test_targets): assert "showinf" in process.command -# def test_that_the_bioformats_info_test_exit_code_is_0_when_it_should_be(test_files): -# one_tiff_file = test_files["ome_tiff"] -# target = SingleTarget(one_tiff_file) -# test = tests.BioFormatsInfoTest(target) +# def test_that_the_tifftag306datetimetest_command_is_produced(test_targets): +# target = test_targets["tiff"] +# test = tests.TiffTag306DateTimeTest(target) +# process = test.generate_process() +# assert "jq" in process.command + + +# def test_that_the_tifftag306datetimetest_exit_code_is_0_when_it_should_be(test_files): +# tiff_file = test_files["tiff"] +# target = SingleTarget(tiff_file) +# test = tests.TiffTag306DateTimeTest(target) # process = test.generate_process() # executor = DockerExecutor(process.container, process.command, target.file.url) # executor.execute() # assert executor.exit_code == "0" -# def test_that_the_bioformats_info_test_correctly_interprets_exit_code_0_and_1( +# def test_that_the_tifftag306datetimetest_correctly_interprets_exit_code_0_and_1( # test_files, mocker # ): -# # 0 is pass, 1 is fail +# # 1 is pass, 0 is fail # tiff_file = test_files["tiff"] # target = SingleTarget(tiff_file) # with TemporaryDirectory() as tmp_dir: @@ -202,31 +209,31 @@ def test_that_the_bioformats_info_test_command_is_produced(test_targets): # path_1 = Path(tmp_dir, "code_1.txt") # path_0.write_text("0") # path_1.write_text("1") -# pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} -# fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} +# fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} +# pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} -# test = tests.BioFormatsInfoTest(target) +# test = tests.TiffTag306DateTimeTest(target) # mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) # test_status = test.get_status() # assert test_status == TestStatus.PASS -# test = tests.BioFormatsInfoTest(target) +# test = tests.TiffTag306DateTimeTest(target) # mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) # test_status = test.get_status() # assert test_status == TestStatus.FAIL -# def test_that_the_ome_xml_schema_test_command_is_produced(test_targets): +# def test_that_the_tiffdatetimetest_command_is_produced(test_targets): # target = test_targets["tiff"] -# test = tests.OmeXmlSchemaTest(target) +# test = tests.TiffDateTimeTest(target) # process = test.generate_process() -# assert "xmlvalid" in process.command +# assert "grep" in process.command -# def test_that_the_ome_xml_info_test_correctly_interprets_exit_code_0_and_1( +# def test_that_the_tiffdatetimetest_correctly_interprets_exit_code_0_and_1( # test_files, mocker # ): -# # 0 is pass, 1 is fail +# # 1 is pass, 0 is fail # tiff_file = test_files["tiff"] # target = SingleTarget(tiff_file) # with TemporaryDirectory() as tmp_dir: @@ -234,31 +241,34 @@ def test_that_the_bioformats_info_test_command_is_produced(test_targets): # path_1 = Path(tmp_dir, "code_1.txt") # path_0.write_text("0") # path_1.write_text("1") -# pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} -# fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} +# fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} +# pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} -# test = tests.OmeXmlSchemaTest(target) +# test = tests.TiffDateTimeTest(target) # mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) # test_status = test.get_status() # assert test_status == TestStatus.PASS -# test = tests.OmeXmlSchemaTest(target) +# test = tests.TiffDateTimeTest(target) # mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) # test_status = test.get_status() # assert test_status == TestStatus.FAIL -# def test_that_the_tifftag306datetimetest_command_is_produced(test_targets): -# target = test_targets["tiff"] -# test = tests.TiffTag306DateTimeTest(target) +# def test_that_the_bioformats_info_test_exit_code_is_0_when_it_should_be(test_files): +# one_tiff_file = test_files["ome_tiff"] +# target = SingleTarget(one_tiff_file) +# test = tests.BioFormatsInfoTest(target) # process = test.generate_process() -# assert "jq" in process.command +# executor = DockerExecutor(process.container, process.command, target.file.url) +# executor.execute() +# assert executor.exit_code == "0" -# def test_that_the_tifftag306datetimetest_correctly_interprets_exit_code_0_and_1( +# def test_that_the_bioformats_info_test_correctly_interprets_exit_code_0_and_1( # test_files, mocker # ): -# # 1 is pass, 0 is fail +# # 0 is pass, 1 is fail # tiff_file = test_files["tiff"] # target = SingleTarget(tiff_file) # with TemporaryDirectory() as tmp_dir: @@ -266,31 +276,41 @@ def test_that_the_bioformats_info_test_command_is_produced(test_targets): # path_1 = Path(tmp_dir, "code_1.txt") # path_0.write_text("0") # path_1.write_text("1") -# fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} -# pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} +# pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} +# fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} -# test = tests.TiffTag306DateTimeTest(target) +# test = tests.BioFormatsInfoTest(target) # mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) # test_status = test.get_status() # assert test_status == TestStatus.PASS -# test = tests.TiffTag306DateTimeTest(target) +# test = tests.BioFormatsInfoTest(target) # mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) # test_status = test.get_status() # assert test_status == TestStatus.FAIL -# def test_that_the_tiffdatetimetest_command_is_produced(test_targets): +# def test_that_the_ome_xml_schema_test_command_is_produced(test_targets): # target = test_targets["tiff"] -# test = tests.TiffDateTimeTest(target) +# test = tests.OmeXmlSchemaTest(target) # process = test.generate_process() -# assert "grep" in process.command +# assert "xmlvalid" in process.command -# def test_that_the_tiffdatetimetest_correctly_interprets_exit_code_0_and_1( +# def test_that_the_ome_xml_schema_test_exit_code_is_0_when_it_should_be(test_files): +# tiff_file = test_files["ome_tiff"] +# target = SingleTarget(tiff_file) +# test = tests.OmeXmlSchemaTest(target) +# process = test.generate_process() +# executor = DockerExecutor(process.container, process.command, target.file.url) +# executor.execute() +# assert executor.exit_code == "0" + + +# def test_that_the_ome_xml_info_test_correctly_interprets_exit_code_0_and_1( # test_files, mocker # ): -# # 1 is pass, 0 is fail +# # 0 is pass, 1 is fail # tiff_file = test_files["tiff"] # target = SingleTarget(tiff_file) # with TemporaryDirectory() as tmp_dir: @@ -298,15 +318,15 @@ def test_that_the_bioformats_info_test_command_is_produced(test_targets): # path_1 = Path(tmp_dir, "code_1.txt") # path_0.write_text("0") # path_1.write_text("1") -# fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} -# pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} +# pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} +# fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} -# test = tests.TiffDateTimeTest(target) +# test = tests.OmeXmlSchemaTest(target) # mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) # test_status = test.get_status() # assert test_status == TestStatus.PASS -# test = tests.TiffDateTimeTest(target) +# test = tests.OmeXmlSchemaTest(target) # mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) # test_status = test.get_status() # assert test_status == TestStatus.FAIL From 8b8debc3c8f9cf7ad9df9f6f8eeb4ab281b252bf Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Mon, 30 Oct 2023 14:23:54 -0600 Subject: [PATCH 17/35] remove macos for now --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 33af5b4..c9ec443 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -80,8 +80,8 @@ jobs: env: SYNAPSE_AUTH_TOKEN: ${{ secrets.SYNAPSE_AUTH_TOKEN }} run: >- - pipx run --spec 'tox~=3.0' tox \ - --installpkg '${{ needs.prepare.outputs.wheel-path }}' \ + pipx run --spec 'tox~=3.0' tox + --installpkg '${{ needs.prepare.outputs.wheel-path }}' -- -rFEx --durations 10 --color yes - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 From 9aea7bbdd421d1d0a914082cb71b55677001dc1c Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Tue, 31 Oct 2023 11:10:28 -0600 Subject: [PATCH 18/35] updates OmeXmlSchemaTest to fix exit codes --- src/dcqc/tests/ome_xml_schema_test.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dcqc/tests/ome_xml_schema_test.py b/src/dcqc/tests/ome_xml_schema_test.py index ae285e0..d351b10 100644 --- a/src/dcqc/tests/ome_xml_schema_test.py +++ b/src/dcqc/tests/ome_xml_schema_test.py @@ -13,6 +13,9 @@ def generate_process(self) -> Process: command_args = [ "/opt/bftools/xmlvalid", f"'{path.name}'", + "|", + "grep", + "'No validation errors found.'", # check for this string in stdout ] process = Process( container="quay.io/sagebionetworks/bftools:latest", From deae186a0ceee034777025c370495ad07299af54 Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Tue, 31 Oct 2023 11:10:45 -0600 Subject: [PATCH 19/35] updates external test tests --- tests/conftest.py | 10 + tests/data/invalid_xml.ome.tif | Bin 0 -> 76095 bytes tests/test_external_tests.py | 326 +++++++++++++++++++-------------- 3 files changed, 203 insertions(+), 133 deletions(-) create mode 100644 tests/data/invalid_xml.ome.tif diff --git a/tests/conftest.py b/tests/conftest.py index dabf786..9edb938 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -63,6 +63,12 @@ def test_files(get_data): fastq2_path = get_data("fastq2.fastq.gz") syn_path = "syn://syn50555279" tiff_dirty_datetime_path = get_data("test_image_dirty_datetime.tif") + tiff_date_in_tag_path = get_data("date_tag.tif") + invalid_xml_ome_tiff_path = get_data("invalid_xml.ome.tif") + invalid_xml_metadata = { + "file_type": "tiff", + "md5_checksum": "a2550a887091d51351d547c8beae8f0c", + } good_metadata = { "file_type": "txt", "md5_checksum": "14758f1afd44c09b7992073ccf00b43d", @@ -93,9 +99,13 @@ def test_files(get_data): "md5_checksum": "28a9ee7d0e994d494068ce8d6cda0268", } test_files = { + "date_in_tag_tiff": File(tiff_date_in_tag_path.as_posix(), tiff_metadata), "good": File(txt_path.as_posix(), good_metadata), "date_txt": File(date_path.as_posix(), date_txt_metadata), "ome_tiff": File(ome_tiff_path.as_posix(), ome_tiff_metadata), + "invalid_xml_tiff": File( + invalid_xml_ome_tiff_path.as_posix(), invalid_xml_metadata + ), "bad": File(txt_path.as_posix(), bad_metadata), "tiff": File(tiff_path.as_posix(), tiff_metadata), "fastq1": File(fastq1_path.as_posix(), fastq_metadata), diff --git a/tests/data/invalid_xml.ome.tif b/tests/data/invalid_xml.ome.tif new file mode 100644 index 0000000000000000000000000000000000000000..2ffaf6a2549faf843fe07777b9d90ebab9a2f916 GIT binary patch literal 76095 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 Date: Tue, 31 Oct 2023 13:20:34 -0600 Subject: [PATCH 20/35] adds bioformats tests --- src/dcqc/tests/ome_xml_schema_test.py | 2 +- tests/test_external_tests.py | 44 +++++++++++++-------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/dcqc/tests/ome_xml_schema_test.py b/src/dcqc/tests/ome_xml_schema_test.py index d351b10..f8e246a 100644 --- a/src/dcqc/tests/ome_xml_schema_test.py +++ b/src/dcqc/tests/ome_xml_schema_test.py @@ -15,7 +15,7 @@ def generate_process(self) -> Process: f"'{path.name}'", "|", "grep", - "'No validation errors found.'", # check for this string in stdout + "'No validation errors found.'", ] process = Process( container="quay.io/sagebionetworks/bftools:latest", diff --git a/tests/test_external_tests.py b/tests/test_external_tests.py index 759a158..32a6a4a 100644 --- a/tests/test_external_tests.py +++ b/tests/test_external_tests.py @@ -1,9 +1,9 @@ +import os +import shlex from pathlib import Path from tempfile import TemporaryDirectory import pytest -import shlex -import os import docker from dcqc import tests @@ -56,9 +56,9 @@ def __init__(self, image: str, command: str, file_path: str): self.container_path = os.path.join("/", file_path.split("/")[-1]) def format_command_for_sh(self, command): - # Escape special characters in the command + """Format the command for sh -c. + Standardizes command execution across containers.""" escaped_command = shlex.quote(command) - # Add the sh -c prefix formatted_command = f"sh -c {escaped_command}" return formatted_command @@ -295,24 +295,24 @@ def test_that_the_bioformats_info_test_command_is_produced(test_targets): assert "showinf" in process.command -# def test_that_the_bioformats_info_test_exit_code_is_0_when_it_should_be(test_files): -# one_tiff_file = test_files["ome_tiff"] -# target = SingleTarget(one_tiff_file) -# test = tests.BioFormatsInfoTest(target) -# process = test.generate_process() -# executor = DockerExecutor(process.container, process.command, target.file.url) -# executor.execute() -# assert executor.exit_code == "0" - - -# def test_that_the_bioformats_info_test_exit_code_is_1_when_it_should_be(test_files): -# one_tiff_file = test_files["good"] -# target = SingleTarget(one_tiff_file) -# test = tests.BioFormatsInfoTest(target) -# process = test.generate_process() -# executor = DockerExecutor(process.container, process.command, target.file.url) -# executor.execute() -# assert executor.exit_code == "1" +def test_that_the_bioformats_info_test_exit_code_is_0_when_it_should_be(test_files): + one_tiff_file = test_files["ome_tiff"] + target = SingleTarget(one_tiff_file) + test = tests.BioFormatsInfoTest(target) + process = test.generate_process() + executor = DockerExecutor(process.container, process.command, target.file.url) + executor.execute() + assert executor.exit_code == "0" + + +def test_that_the_bioformats_info_test_exit_code_is_1_when_it_should_be(test_files): + one_tiff_file = test_files["good"] + target = SingleTarget(one_tiff_file) + test = tests.BioFormatsInfoTest(target) + process = test.generate_process() + executor = DockerExecutor(process.container, process.command, target.file.url) + executor.execute() + assert executor.exit_code == "1" def test_that_the_bioformats_info_test_correctly_interprets_exit_code_0_and_1( From cbb2feef78e6d929175e35d52b58eb8e5b948e1a Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Tue, 31 Oct 2023 14:09:45 -0600 Subject: [PATCH 21/35] finish external docker tests --- src/dcqc/tests/bioformats_info_test.py | 2 ++ tests/conftest.py | 2 +- tests/data/single-channel.ome.tif | Bin 0 -> 76095 bytes 3 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 tests/data/single-channel.ome.tif diff --git a/src/dcqc/tests/bioformats_info_test.py b/src/dcqc/tests/bioformats_info_test.py index af2b124..40144f7 100644 --- a/src/dcqc/tests/bioformats_info_test.py +++ b/src/dcqc/tests/bioformats_info_test.py @@ -15,6 +15,8 @@ def generate_process(self) -> Process: "-nopix", "-novalid", "-nocore", + "-format", + "OMETiff", f"'{path.name}'", ] process = Process( diff --git a/tests/conftest.py b/tests/conftest.py index 9edb938..de6c907 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -56,7 +56,7 @@ def _get_data(filename: str) -> Path: def test_files(get_data): txt_path = get_data("test.txt") date_path = get_data("test_contains_word_date.txt") - ome_tiff_path = get_data("ome_tiff.ome.tiff") + ome_tiff_path = get_data("single-channel.ome.tif") jsonld_path = get_data("example.jsonld") tiff_path = get_data("circuit.tif") fastq1_path = get_data("fastq1.fastq") diff --git a/tests/data/single-channel.ome.tif b/tests/data/single-channel.ome.tif new file mode 100644 index 0000000000000000000000000000000000000000..ac006314bcb8e606db123c7bccbda2cdb4c9830b GIT binary patch literal 76095 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 GjsFKFLi#=c literal 0 HcmV?d00001 From fe47855f3db1db6d30c6c08a3a111e78a59b8c70 Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Tue, 31 Oct 2023 15:10:13 -0600 Subject: [PATCH 22/35] adds platform to docker build script --- src/docker/build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/docker/build.sh b/src/docker/build.sh index 8f77a3a..b317a16 100644 --- a/src/docker/build.sh +++ b/src/docker/build.sh @@ -11,4 +11,5 @@ docker build \ -t dcqc \ -f "${SCRIPT_DIR}/Dockerfile" \ --build-arg TARBALL_PATH \ + --platform linux/amd64 \ "${SCRIPT_DIR}/../.." From e3afe0c8ab0d35d917116d6c48dc060a31c0c925 Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Tue, 31 Oct 2023 15:32:18 -0600 Subject: [PATCH 23/35] test system check --- tests/test_external_tests.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_external_tests.py b/tests/test_external_tests.py index 32a6a4a..32bd877 100644 --- a/tests/test_external_tests.py +++ b/tests/test_external_tests.py @@ -4,6 +4,7 @@ from tempfile import TemporaryDirectory import pytest +import sys import docker from dcqc import tests @@ -11,6 +12,7 @@ from dcqc.tests import BaseTest, ExternalTestMixin, Process, TestStatus +@pytest.mark.skipif(sys.platform != "linux", reason="Linux tests") def test_that_all_external_tests_inherit_from_the_mixin_first(): tests = BaseTest.list_subclasses() for test in tests: @@ -22,6 +24,7 @@ def test_that_all_external_tests_inherit_from_the_mixin_first(): def test_that_process_output_files_can_be_found(get_data): + print(f"--------SYSTEM: {sys.platform}-------------") std_out = get_data("tiffinfo/std_out.txt") std_err = get_data("tiffinfo/std_err.txt") exit_code = get_data("tiffinfo/exit_code.txt") From 15a5a3c7c16957641ab7b4ea6370d24481ce7eee Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Tue, 31 Oct 2023 15:33:57 -0600 Subject: [PATCH 24/35] pre-commit fix --- tests/test_external_tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_external_tests.py b/tests/test_external_tests.py index 32bd877..d9f0b5b 100644 --- a/tests/test_external_tests.py +++ b/tests/test_external_tests.py @@ -1,10 +1,10 @@ import os import shlex +import sys from pathlib import Path from tempfile import TemporaryDirectory import pytest -import sys import docker from dcqc import tests From 6e91c26f1cd9fc1c97f793d6978f005f199799ba Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Tue, 31 Oct 2023 15:48:52 -0600 Subject: [PATCH 25/35] adds skipping decorator and macos back --- .github/workflows/ci.yml | 2 +- tests/test_external_tests.py | 21 +++++++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c9ec443..3b46253 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -62,7 +62,7 @@ jobs: - "3.11" # newest Python that is stable platform: - ubuntu-latest - # - macos-latest + - macos-latest # TODO: Debug the Windows issues # - windows-latest env: diff --git a/tests/test_external_tests.py b/tests/test_external_tests.py index d9f0b5b..3866988 100644 --- a/tests/test_external_tests.py +++ b/tests/test_external_tests.py @@ -12,7 +12,13 @@ from dcqc.tests import BaseTest, ExternalTestMixin, Process, TestStatus -@pytest.mark.skipif(sys.platform != "linux", reason="Linux tests") +def docker_enabled_test(func): + return pytest.mark.skipif( + "linux" not in sys.platform.lower(), + reason="Docker-enabled tests only run on Linux", + )(func) + + def test_that_all_external_tests_inherit_from_the_mixin_first(): tests = BaseTest.list_subclasses() for test in tests: @@ -24,7 +30,6 @@ def test_that_all_external_tests_inherit_from_the_mixin_first(): def test_that_process_output_files_can_be_found(get_data): - print(f"--------SYSTEM: {sys.platform}-------------") std_out = get_data("tiffinfo/std_out.txt") std_err = get_data("tiffinfo/std_err.txt") exit_code = get_data("tiffinfo/exit_code.txt") @@ -90,6 +95,7 @@ def test_that_the_grep_date_test_command_is_produced(test_targets): assert "grep" in process.command +@docker_enabled_test def test_that_the_grep_date_test_exit_code_is_0_when_it_should_be(test_files): date_file = test_files["date_txt"] target = SingleTarget(date_file) @@ -100,6 +106,7 @@ def test_that_the_grep_date_test_exit_code_is_0_when_it_should_be(test_files): assert executor.exit_code == "0" +@docker_enabled_test def test_that_the_grep_date_test_exit_code_is_1_when_it_should_be(test_files): tiff_file = test_files["good"] target = SingleTarget(tiff_file) @@ -142,6 +149,7 @@ def test_that_the_libtiff_info_test_command_is_produced(test_targets): assert "tiffinfo" in process.command +@docker_enabled_test def test_that_the_libtiff_info_test_exit_code_is_0_when_it_should_be(test_files): tiff_file = test_files["tiff"] target = SingleTarget(tiff_file) @@ -152,6 +160,7 @@ def test_that_the_libtiff_info_test_exit_code_is_0_when_it_should_be(test_files) assert executor.exit_code == "0" +@docker_enabled_test def test_that_the_libtiff_info_test_exit_code_is_1_when_it_should_be(test_files): tiff_file = test_files["bad"] target = SingleTarget(tiff_file) @@ -194,6 +203,7 @@ def test_that_the_tiffdatetimetest_command_is_produced(test_targets): assert "grep" in process.command +@docker_enabled_test def test_that_the_tiffdatetimetest_exit_code_is_1_when_it_should_be(test_files): tiff_file = test_files["tiff"] target = SingleTarget(tiff_file) @@ -204,6 +214,7 @@ def test_that_the_tiffdatetimetest_exit_code_is_1_when_it_should_be(test_files): assert executor.exit_code == "1" +@docker_enabled_test def test_that_the_tiffdatetimetest_exit_code_is_0_when_it_should_be(test_files): tiff_file = test_files["date_in_tag_tiff"] target = SingleTarget(tiff_file) @@ -246,6 +257,7 @@ def test_that_the_tifftag306datetimetest_command_is_produced(test_targets): assert "jq" in process.command +@docker_enabled_test def test_that_the_tifftag306datetimetest_exit_code_is_1_when_it_should_be(test_files): tiff_file = test_files["tiff"] target = SingleTarget(tiff_file) @@ -256,6 +268,7 @@ def test_that_the_tifftag306datetimetest_exit_code_is_1_when_it_should_be(test_f assert executor.exit_code == "1" +@docker_enabled_test def test_that_the_tifftag306datetimetest_exit_code_is_0_when_it_should_be(test_files): tiff_file = test_files["tiff_dirty_datetime"] target = SingleTarget(tiff_file) @@ -298,6 +311,7 @@ def test_that_the_bioformats_info_test_command_is_produced(test_targets): assert "showinf" in process.command +@docker_enabled_test def test_that_the_bioformats_info_test_exit_code_is_0_when_it_should_be(test_files): one_tiff_file = test_files["ome_tiff"] target = SingleTarget(one_tiff_file) @@ -308,6 +322,7 @@ def test_that_the_bioformats_info_test_exit_code_is_0_when_it_should_be(test_fil assert executor.exit_code == "0" +@docker_enabled_test def test_that_the_bioformats_info_test_exit_code_is_1_when_it_should_be(test_files): one_tiff_file = test_files["good"] target = SingleTarget(one_tiff_file) @@ -350,6 +365,7 @@ def test_that_the_ome_xml_schema_test_command_is_produced(test_targets): assert "xmlvalid" in process.command +@docker_enabled_test def test_that_the_ome_xml_schema_test_exit_code_is_0_when_it_should_be(test_files): tiff_file = test_files["ome_tiff"] target = SingleTarget(tiff_file) @@ -360,6 +376,7 @@ def test_that_the_ome_xml_schema_test_exit_code_is_0_when_it_should_be(test_file assert executor.exit_code == "0" +@docker_enabled_test def test_that_the_ome_xml_schema_test_exit_code_is_1_when_it_should_be(test_files): tiff_file = test_files["good"] target = SingleTarget(tiff_file) From c82dae48fa32ee11a4ce9dcb98efa6e5d02ce71c Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Tue, 31 Oct 2023 15:54:23 -0600 Subject: [PATCH 26/35] removes entitlements xml --- entitlements.xml | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 entitlements.xml diff --git a/entitlements.xml b/entitlements.xml deleted file mode 100644 index 154f330..0000000 --- a/entitlements.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - com.apple.security.hypervisor - - - From a5cf1cbb9367de9c80d51977a4cbbd2bff41b9cd Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Tue, 31 Oct 2023 15:57:46 -0600 Subject: [PATCH 27/35] adds todo --- tests/test_external_tests.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_external_tests.py b/tests/test_external_tests.py index 3866988..5f573bc 100644 --- a/tests/test_external_tests.py +++ b/tests/test_external_tests.py @@ -12,6 +12,7 @@ from dcqc.tests import BaseTest, ExternalTestMixin, Process, TestStatus +# TODO Make changes to fully support Docker-enabled tests in macOS def docker_enabled_test(func): return pytest.mark.skipif( "linux" not in sys.platform.lower(), From 169cfb73d9c9fa09cfc5dda5ec4985e03dab5dfd Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Tue, 31 Oct 2023 16:06:28 -0600 Subject: [PATCH 28/35] move decorator --- tests/test_external_tests.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/test_external_tests.py b/tests/test_external_tests.py index 5f573bc..0603a51 100644 --- a/tests/test_external_tests.py +++ b/tests/test_external_tests.py @@ -12,14 +12,6 @@ from dcqc.tests import BaseTest, ExternalTestMixin, Process, TestStatus -# TODO Make changes to fully support Docker-enabled tests in macOS -def docker_enabled_test(func): - return pytest.mark.skipif( - "linux" not in sys.platform.lower(), - reason="Docker-enabled tests only run on Linux", - )(func) - - def test_that_all_external_tests_inherit_from_the_mixin_first(): tests = BaseTest.list_subclasses() for test in tests: @@ -54,6 +46,14 @@ def test_that_a_process_can_be_serialized_and_deserialized(): assert process_dict == process_from_dict.to_dict() +# TODO Make changes to fully support Docker-enabled tests in macOS +def docker_enabled_test(func): + return pytest.mark.skipif( + "linux" not in sys.platform.lower(), + reason="Docker-enabled tests only run in Linux", + )(func) + + class DockerExecutor: """Class for executing a command in a docker container.""" From 230a3dd4de99b0a519270a46fd0d99356f10d21b Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Wed, 1 Nov 2023 08:24:47 -0600 Subject: [PATCH 29/35] removes unneeded example file --- tests/data/ome_tiff.ome.tiff | Bin 269568 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tests/data/ome_tiff.ome.tiff diff --git a/tests/data/ome_tiff.ome.tiff b/tests/data/ome_tiff.ome.tiff deleted file mode 100644 index 9cec9f460b1b899fbf2bc8c4af9fecb22a09f3f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 269568 zcmeF)i_3OzThRIY+Hdduv;S@0ov)h-a~$U-A|#q{#0im*5Q&HvaZJpdGzp1_h=_=Y zh=_=Yh=_=YhzN;@h!7Exh=>S@h-e}rLP8><`FxLc|6cqb#`QeseXVP)b90=>{y5Ha zt?RqK>wmd9-rU?g+}y0TH!Ej1Yp1{Be7)Mt^=fTi&a1co73X)W_07*+Zf?HvxV?GQ zwmz;Zz5W$--n{f#+qa+9Io;fRSna0&>*LMMM=$5EoPYc)+J589`9|AsHP(BdAFK1d zzoL#yH{bQ6U;UvU{J*~a{JVbY|M|fm|B2uC)gSngZ~uKi{*ym={^73w#JB%%=O6f8 zU;RD5=Ldgxr$6z#fA|Mn`_}XS{o`N#(M~{b2G7cC<*j0vuY9C@qI^#Ig7PKh%gQ$> z-=zE+<(rjnQNC6AHsveIuTy@#@*9+ISAL`No0Q+Ie24O#%6BQhMfq;!dz9a*e6RA` zlS&rlpj=nNcmyqN0c8`eoXnj%1hw?v_)#~Oe8)c^) zl#_B%Zk2oGQF&HgD{qze%16p4%IB0XC|^>(tbBv=P0FuPzFGMeR{n|dGs@2@Kd1b>@(ap8RsNas&y|0n{7dCuDZi-vYvtc4|5o{T%D-3sgYqAh z|D^n9<-aJur2JRqmzDpf{CDMlDF0KTIli({cFI9HDHr8dxmO;QXXUl>R(Y>{qiIx@}0_eDZfSe zZsmKF->Q7C^4pZ}Q@&sM?aJ>^ey8$PRDMYLVdY1ZA60%#`Mt_dC_kzEe&wf> zKcM_U0!Chm;>yenk0E<;RrYtNeuWlgjT`eoFZR${$qzkn)F>Kcf6m<&PUFGj7 zKdtrzoh(E<(HNJru=v1e<=S`;dOjvqwJJ}a#AkJt#ZG3EqN}# zT7DG=zsdu@$^*a31HZ}xzsdvuKjHyX{eL(9ynKGocYnv{|BoO3v2XrAf9%J9^sB$` zCqDm`U;DrP+W+;NfAoLv{y~n!$8NXUY*zcd)AMG%+uhtqqO5l7Zg&4>f3sgZ+1#uz z-8$Ut)|>VDQA%aCJ*?MT?uOc%%|?}j`rGXQ;QJZtZFShOx>;|B6Hn{a{<6B+ovO8V zcGKYN+OBU->(g4*Lr|2nDUoxU_M6@Ed9&FV{)#{ z*ZbZ6X0_Sh95(km6S>)~&S&n@q1kNmlRA#a)n4lrD2%$jx!kN*>uS%Tqy6f%l`AsW z<8Hm(tx7ko;OMY{ke$Aaab7R5ZZ>doa~l@7SHP{oyE<%FyUkJW+wINfyfVUZb+g$W zeFJa9Y}Z$vZeSPQrH~L~wYhE%=k5Nq)7M3<+`BytuePuqvZF>|&P3L?Iy@e>hauX{ zWqos8*O4(+KwdckvuUj!ZY~XA!WstRR(HOxZw|-lYu8+cmPSz_Ozm_6X|>zjoQ#1^ z>m6)q7Ol1}?Y76$3MD%Z@kNax^9BXB8${KE?@!BAHm`hJZFc9=%@&26qvUOag&5x& zVm@aKmyLolaM-=o3OxpHv+GJ2n*q!eu2*maPH=68QC2q(AiCgJw+*}2#VPzR^D~z< zOf|eJT|U9WX8o|;uJ*g#oeNEL-*gGY_U6>2ac3Q2jn#Q`G8>2nyIW*x6Le9S6(=N15-;t;ru;jol zXt|A_4l^a!7RcO2wZsC{Lr{|@aT*`jyFGwbH@E1uui0JLm^p;mk>$Gt_;@?;tFqmO z8m$41M_|nCh;cJtA1|vtY~v?G&e80Xz30KBTE47Ep59M&)G#xz^iHr)EnCCjAe@DP zH#IyGu+=$khK$Ax8Uh#MhfW9$)w)BS7xcPu*d4T9E#y7WUIx)gD3d&{;VphY#xs}W zehuN~ek5V&O{@Wls%ld|AUDUj>`ZIbc*Z9}`{D8X91;+U~A89Rh`so7LkY zFsa=nxQT^lqSaT&!veN%c(_?nA*-v8fdeWwn=6!zP)5hmUSaHdvp$?P+u)wzqj0mR zv)w_HTRhekGc`mlX~_@>$|gzsF4EUchpu+1vxPI6~j~7aZ z0JnA+sk(i+*&lIadLHzqyvG;o&Fy+qzh{WlZ8|^ki#WR4piN-RaP>@ArIX^f%>cR{ z(ZZTrki-#Vxkd_J8ba#QhemYaPV9WbPgm-@A$D}ZA*eSCDO?WyQ2JI4<6SYsUyy?Xo^R#?-M;Qt@&O+S7-lC7Z?=8l5x< zne=CtN_MH5hS?Gq_z$s-PP9`<)z(@^h{P=3jLF$zACkFcFV_c_KqUy+Zn680;-j@$ zFa5+}SiPbB*F;aQ4V0!bod@{nzAa%RFt;JHxm4MlH>(spEJ80a>yAI`?3rV~f1354 zOKf#KLT~Y;g3+}d?@t?|0jxgGdNYvK;2!Cj4`$p zq7E1WN-*iK#)iM)XeKxN>v6ZgE>hs;_O#4bH8s>-bG%3kQy+YddEBn+l#ZRA^?4Z` zK)`ZRGy+?*HEtJ7fDUy9dbn8T>zk27N!+QH1C0j75Q2?%+qkG>q3wL!;1XEAuE^gI zH-zl-jc5VtV3S1%sN9w@{%OB6@JFC$M)3p3(wJ%gSZl9uP^294r*_vnfDOGG-U-P# z;RohA4~lm-+WJJCvzrSlo5kv0U$Ja-2lj;;*8nNk>xEg?x1lnU1AKuZhjR~{)%LO* z0R>ysRf(v?p<490KC%ty9olyL<2oFW{o`YJGTFgGQtZ%b9E05o#?Cq5E{4bwYmAmn zXg1KjJslRWcxLJL0G*{KoH`joT~?@RlJx_hnkFpgVTbLx$v1^H2Wt_X%;+>+qKZ9t zPJiP(A>lE9JR+QFz`pfX)R2d<$+u&K zhm`>suwac_<~YaKdK^N7jCW_4Mei<3=76bI$Bgtbne)Gqk2^Wqz&amMI*{{|++1AA z`bGid$Ja@dMdwD@VIm(};R1#j&nBxh0n;FF;g{)dFsT{$7%%uXrggQ8D0 z@kO&KdYB2ah6{`8)`{Ex6ANV9?b#CF=KhF3Y^TkG7uSZ->?a8lJa*CL*azn(Q@-+` ze8k^f>%uynnl9@|{VxB**R&`?7@9ZH+A0RX&^6&YMhd>!`UZ}HPKMGAx;bvR8G&KA z!^AZp+&;`$`y1}i*j`*4Gpsj|t1jk8j(nd*H&KbugDkpCjSPPqAe6dt$_yU&cpRpL zbwO7gal8?fkxYsTNc$~RVk}7JRv^j(G}F00uZ%lPyEz@XFOgkm156N@U0hwabl`;| zF@2*@cI1Kr&3J-Gr~)3d)qxSQoKqv2Ezxmtlv5+R@q%s4A)XjXVL{M4r>1V2!+fa8 z7)}&)I5Ojej45<=gon7~^I-@0F(rVk1Z(N4kVu#8%zKU)7(nc59p}ddhBU+2eOC+v zn@y$r;DzzXxKyO##9Ijn9S$8P;T$Rx=F%=eul5>BEViKR}Z&UT@KUd zG(hI)dpHo1-#qHmSg1Ex7@%IPxpRFDE;US)hS^-)T+qCH!k*{6I{ULtf9k!z_zA!O zOE3gdCa^w$J0?Cl3kJN>#B^o;St{3GHQtNt?8R3GKxzzgDELvQnNbg`#Dp9%klQ^1 zZE1q7h&kzl3gbuV^#AH^mre_&yO$nZH`_6jak7*T{H^wZK$>>zJ^auZ3D{%>7^~EZ zKz|(axN{JNYw!X`X(nv&=)jaO!7Mml%){#9Dh-sQmRIUd$(}%!b;0L!=FJT#7X+vJ zvFC^~-ynrw&D0K^G=`Yw4%p#BA49CQ3d4PP?kt|6VN+x|?d$v-5r|bQElmePShyJti<+OH=G6XPf^Uk^-X2T z0E{v_jDx)8T^WR=61eRJvj&7YQ{B#aYA}Uk`ZvcQj{L1y7&tiwEg@YpQdQd1^W>h~ zR8=6Jr?wNy9`y=Fv)u0PXzqKrmxG?lX^+AK9?)&<6USttv4qw2)4(SA_i>=^#=0Y<`BbRpEX%55$F5`5~kJJ1QnEk zz=j#^5cZ0uYh>s#Qb0}RZ_Z&VxmJt5#1V^XlQD`^Jj%O3++VgsT#yY3RgXpx6|Qii zPG(mA`T~MQvmx?T`~Im(>f;&Wo0b=mu*`a**55R2*~&6~>j^TQL%d5xp8g^bKEScp zCXwCLI(&*#poYqi8Zkq03rUg68?73Jx5xD*Pj|OyW);PShjZV6vx~4sN}v#9_-3?0 zeyZ6+3O*&wr#yGZb~mXy8n^EZ92bkL073#7%Y%G$R-AmvJw(O@K+|$dZ@LB0_Of)j z9rv)S{loeZruAy>*33yl}&XvTHix*z#%0;h5)Mu%QnE8uJRXtSuiKL|ZPv`F>q?$HA;dYnOYtTpBby-H$i(UVQB)U>hegjBUdY`4IGnJVjMV<0E{7%B+OHmLPrTx95#qa z63Sz)vj&dCX41TS8ajcX9kI`Jj7~5*=lpnLKr2CSLJVE9!{!Smz&>Vy^HF(y-Nf~= z%QAIZrYkpR@;|fh3rDevC2l7EHr6>^87mq*i~w;=%#fxj>48H!1xAAcR)MzK zor{c^YS-1DcvT!aIlM(2@iYY#FPsFk`zzg=2^*ba3#-r#XiEZ`Whd|hD5{1T4hQjV z(m^zT^r17hG@p>F-KJ~8f+qK-l5nMebLps;LcB>#=q)3Z5*{?nC%7lr8&nnIsEkC0 zg-G765s$6qaHl!LhtriVcz7iCOxL#6BJ!johX#eZq&X3a6h0PoLI8fJUcz=akv|-& zKJ*;h;f5<^{sxz{5jwmJ2bUNYEN27diqwNE+oLH$v8&)HK5)@jU#JZr!b<8r)silw z7?)I=Yb{af$<@#yTz**`2%#~|1VEWTY!m1pz=ba=ad^9>tntA&w+9k_kNJYw6sUK) zS-0_1%n6Qx*`L$?%wIgn9;8yJDQ=ra>D=Uhosx&p0zo0xgVmo!h9+=$ps#Ij_G&C5)!w$f;D2MA!T->QddS{~9TCcglr1FmPQ zuOhhPQAX$<`rx^R(}AJc1z75-k)7sUU(h%UeVz!33f#3EgaFnIYH}jrbY+=n%uoGF zE}D3WKGm`S{!+vzt&j#CnF^|7SSQSeZKI0c7yD;mjneuzyW29Brl%p;lZX1tk7aR0 zY{gQi`>kcLf!?kCIZHqG8Hky7SP?1!XX28XVoJr3AjbgC*Ee^Iq)0kyktr$*x8UVG z(*%S0a8J1LnsTTU7L6nFIP8LVbxZBSH``kTNUx(s7;RB)M3%Ut(~#ddB=xYn z22^&j`Qylzb+O2}Ix}xy33h;>->Dp4JX;X%sD@;K35pv&yO1kmPITVb$rGDQq+lz^ z7q4XUxYK>PxVkay3p#NDOq-*t(0PvzN$iH#L&2S9xH_u8d{Rd{2gq=8C+VoGA|TF1 zP|v8r_SkZ!TC3f=lDC65{Bu8DKzu44(EhA$$6>fT)fKuJL+ARClQ>VV@@+~ihi7}> zpQRNcH6Rm**bJNG+9x0;A*QO6lkSXsY-UZ!jZP>4B;x812DzLCw1~0Y+)r+XR&ys6 zvpKE~*D*gjbMzd46-6v+$|)kr zDPnI|uON;y1d-4>O`|{V9K#5Hb^t&l>xet3)1}Xrs>Id_JFLMvdB^+#&_05h2%v(h zkwCK*C5*Lnp$Iprg5XPHGDkd^VjN5?ms)-W4f&ZRTIWNsMgi?YJXOq*xQ>9D3N{>X zXC`$cvzlO730ZW}nDs!ie5XIGWM@D+fa18jtgiSkOzX4^YRWAqzyK~zzItY*X^h@d zh*T6adMhz`+-zpMhMI>G#Hl3Bz|}}FPi=5p>ph?&rr^X8xF#7>c9Wuq`j^myzAO`G zSw8ge{u289^@y=QH%eW&Xg31O%G7}Ry1y8QN*SWMm{OFpYq>{X#=qP=H?uK#hIEa6 z)#tE*Y>n3F!zZYEp)PCI1Y)Lu>_}uYLdlyW5rh_?EU}8lSc3yT^?^K4k_6-H8G_!D$}w<8B%92%axR(~v^ zXir0q0lb1|wiaav=NJH+%-)jx?7&#R+CJnQY5gKNb^pQ%11lCApf^HTEl+#?L+0K1 z1S*3fi{g@zXu}1P2GeKBim3D%GXgNHgeaMC>y$4!XN#1D0NorRYbLds+VyoWtI>j_ z%yl!tri?y+ToaNcdw53DL0=h6ZMRm=RSXFc9+din8ZBRIsQDvFa z_p{(yKB)9#v&OX`o;1xN$%(cdxZL&&GYza4N*5XB5a6Gf#Cml6yyeVmHA@AbX&Yv4 znAor+lbsHrdK!e~o&ZMghnqXVU_;x89Ix2w)L*`MY9yxT{nEVX7;`7Jeo( zU=Jp_9MXeM?q|3TcT}+nX>5WVaxV4`R2Ce0Aj0kNPkR)sV@r6vV|U8_^BY*;9c@x5!&mrPtzOJiw{y7#WUn z%B#a*%us5iyBW6Sa22g4pFdoP?}u%swt6qMBFiMVhe31!Kt$846H{)|x-LR;h$kcA zv~8EmL;J~EykKntIj+H_Fq-yUu|&un)#6(_;Bu3vm-#+D%vKuJ z>#$qlsn3|VV760+YRQTC0(i?}sOL^K^t3q-66i+!#{bZE&@DH%&9@a`90X=Ba*{?< z&%7a0x46!lOI_(nj8>Wx9YTwvfWLods5PFT2&bBa-HPg;+Zh4krsJrk8FNf$;Sf)3 z?oz;sZFD=t{y@G5XlkC&G{roe=2aIjqmB{)xGN|lH~@WZLlo;yI9FxTx)75Zl$7H) z+kTuHNGjUqEj|aab+oY#hXqUriEI<0>oeY7Un4Zj7&zty3@9Ulr~H;|4c0M3!|P$j zX7iR6_0|j>2^%oXX}*K3WR4hcCKnbo#h)c^Mm^0P!8HeX;d;K~g&(T^*8c-PK8EyAzwlABUPc?hlRza03a3WTg(vD4U4+~XHS z!z!H>l}{Xy7ooF#^<@@rjJK4E!$ve46PVKynwz5*;WdK<2Q%sUoVdX>^8Vf2wsKSe z)<}(VF6HICq`JHV?p~;2W~Xrj>DE!%VYAubL=9#;hqTRtr_IfC(J41na{er=pG@CE zY^W-L!j$EL?YlKDJbvfO~xl-9Wr%nv4{}*Jy zkh`h%ncf(`84}3%!>SNT66=!2P=IV{_ZmfG2s;RjF-Z~+0sEcPbjI;z>F z*(*Wh0Ij!_R!14uRQ~~?Pl9lrO_S8@x*xZ*hTPnFpXcgr(}suEn8m)RKs0o>Cq8Z1Zr{i4l|C+RZI zV=N{=R1s%9p)L>5aHl^xV05sP2ryH*-OVP}`grcUyZ+pU)I2LWlXeZ&ZEx~;8n z+7Q4+TBf@f*ThW60)@0iSrN@7fC!evGml)(+#k1fsW0>z{Fs5%5r_jq754>6kZdB{ z&(ZGS(pRyI6|Ai#A*ls4Us5-E52kn^f2!p#5LX76_T{AJ33cwAn>KiuBZ^z3HTd$q z+VG6UNHV_PpWCd()>@S1C65L%w}pr;5=7s=l?@AV&XEDbCl#(2Gxsr;WwgKo(+~>m z9I%vBe2bIR9Hm>7%Qb~2mep#ZIb}HFx;g`StO1R~)D0l@0RWY{&CjVG#aAY+WAGhG z&!#kFjeK@xc1>N3Fd{XTyAW>;k`6adb($A1gA;rAb#Mx4n2k-GD=wOZJA8d`w>Fv= z*h0WuuFsT9kac`5uo1F%FW$?$04fo}?sBHl+EKK{15<}<6P@Q`?2~YfXW317Su%@M zG}#M*%XoHT%${X265e?UG@En)FB_s#G;zjwy}=k+@kMq91?gay@+&54h|fYreB*k( z44~l!e7fb@B8X1*E!6_LNF>k`EfL9(#gN0(l!~oF)bjKO)7j6I4+B0B8u01pRk!fXS;VD(~JSnpYf;me~;pEJ7fYvgXX$b$YEGtCRB*U?EbP#QKO zlB`N7)>@*2$6@s;twtwPw21(LHC@0`A)M=E(C8x^eU9cUvFXdC`MWj*-&>37H7#ue z4CrBdDr8aQa2b&UBkaE-s59vvYlvpcHv0h5xa5oQYI@ey;uIzrt}HP*+}k6{aWi!D z%E%jtB_eo@y_7K6xlSb?f~v(-2QO>c>l#M(r|};$Vy2Y~R*waCccN!sBn0e(LJLnH z)q6Q{mn@m!*IduBux%LV$ZH?n^;tBV#D7gpP%dOD{y_ybiu+zd&6)>t+J6py-wXU& zfXn1eFlO+6GK?)RrY8KrOue#4A(&HWD@6$o3`X-38_vs;u!xV7m@%OyddgoM4X+DG zYIz3|QJ`UF4l{ilv#~cwW^Y)dBpHKdvu#BoZ_nipW5Aj!>h#53P~uyAN9wgJC8X=m zMA_04cS*$@iRJKVG9rVn&fk|CH*4=C(r^1QG6stv0ltvO0V*k7pILg0X-#}!m|0IM zv+0)=>cHeBhbh`w61M#V=wTd8dHfqIh6yJgu#5jisZj_ROt%Kq&EjBBcSSV1UslW) zW=Hd|^)&8#LzB7Pg5sIe zdHZXXB<9G&ma8UsPIQ&IUzC@f4b^q0&95jSi^?rSNZ0x9ODLf$ycQLL$1#7m*On>+ zh+p=k>-<<|Qg_`S-tREP{f85jxzNO$_&GEUuFtDPtuV}>_%arXbx)NKDKMU zgnks1jRb;18enndmr>Df?|HrylazM3UMiIu;LpqohJMh@5$V<$7bBYjPPS1J0=V)C z*dlys5Kt#wWgg-9v$+i-Cs5lZaobid!MPQZrUm8>42jqdQ;m5wEY?US-~W58vXW)q{^_T)Fh zXX`G(VzN=p+;umOjKqOcz}ln~$s4HXUN8WcaT_IvuCP&9)N&rV1IJ_nNMa)6Avi~1 zEk@Q!YxHrc*ge;3^o+5Qw3%dM4rMD#FG2g@$z{rslhX-LJKNamVvPpo>BZ7a+S;&` zz1@$)=7LiSj}=_f1BMuj-kvR+an<$5Lv0xIMcw3}g|T>t(Mi-JKeg423svBtllf~5 zUAHPs&mANYx-|z->Kp~j@Tg7v>3+D2<;VM3!a^}^$?wuLvtiRCDV#y8v1cBlT_l6O z6l>inz`_izDD#N@Ns+WsvF~QyF|?t+`UhN^alf`?Fo_bD#3ci!2k>GVr`Oh&uU7e;eBONQlh4chwAtodt@FcCUEr+qbat+f;GQ(@YuToBH55@Sz7 zHLKeU#^g3@pH>;#=4I14T-atpY)1f?`Ea*7w&@O-VOqyMyY8T`OElHMLdmSTgtnP; z7YC$JWNVWwczfLrS0-sh-WWhL$|c>jeMqb~xpbGf$}nM9W0klEuDCYCCO&K302Wu- z+|w`(H}qcFKu}%$9Beunffa-Bua|)Zr!%=Mi{NOsRm=cOEYWU3=BgRO#=?D3VQAU( z^$IxNHrEp5kA|8trfPiZelphR3la#b%_H*Mi!Sb=i^Q7WLq-Ob(V}kCYIfxg{J@!o zX>4suwyqDmwf!z)`)GhCfGsI~*FoFJL+s5#T5K)$BV z@`fZ~7mWp4XK2u;PhPmj@vNpPsAk;=jW`g$QmpSP9f?@&T5W z7!8D1#xy3f-BURtJ4PEVX46!Mj@_iMBC^VS?(IAWUVQr6u=cs?U`-1)CbFqCR7Q$L zw3bPl$6cZLXo7kEBDZ%`cSz19%np|gytx|@gOipkio0=>JUWgwd$TJo69#OVA{44X zW?@BCof*xHn@)2ZbG3l!FTAAZQfD9Dco(=cVHfH zTuBqUh1(~E;)_fPHBGU0xvr?gLE&JPjd490t-mliD{Oj!xZPuOm{Dwo%r11e$IJ%? zlgmp8MG1GtnuzSYTA@174u03eqpoGM;AN~pbz#KTqlJ}dNgZheJh8RR9e856`^Eas zWQ(ZEeINywZ2+DIh>&p@GZ}`OEPsKj{l!Mn*}x^ zQKxKFnOM~DgnS*Q$_8~whY!1PalpM zH38_$?8wY!=FBZpod~I<)1w{s(Ob==xVCgoH#@j=n#_#bujlH-y~(4mOvB4Sqr)LN zB7|2y&L9OZ43=wozPXiBbpItjM$W=m7r2j4%VrTeW#Pl(J+#K$qc_4Kgyam9cFTN= zuSOC)p2f%uV@_+LW>Gf>0F{zNj1Acc9EQpl;+o8Rvjw@7LuPpCdtbwZEeavRlD-@6 zv;7^M(_H06i`zqMw|BC&zj?T>zGx6TJ!V~Gh6*TH14%O9Y1}dxi2Bt``#~sPJbIQ-6 zY6xvf9HI+$NLty=t9o&4_}0gx<=HvRf!DD(jW9k89>0{G1m@T)_vK2{6xq=^M$Nsb zi74-tJFX8smJd&>n^Uvj7l6RSn7Ks>xav7sj+v8az(FrUR|$N>Ei+s9jFV>ZJkip( zdZ4EbLT1;}4MnXwUL9_i1VSn?LS>BdAtxO%&*;?Pk(y}9u_I)zE(KdUXqC8EzznV= zbY{eml?o(qXxF-uX1ndx%YAA;X~beZ7?VB zmSY)!`$ChfhL4>l2hrmW-B&E}~w z<_Jmc2c9WI2mTtyO|1F$tyn~4)99ZOTrLyPd7jF=U1G4=rKrH$(uhF=2OQ#sj;cT@ zYj5vEX^R(|9a_g0a4n;P0Zg}m4+7#aE6QWbOgmyNu0isPwM5FIGCZpPQdaqFn-d95 z6pWB)=+fdJBkjz2f7<3f?-N=WmtCF>PGUN@BVH`yLlas-#-s?ch7@)06lfh!;KQAT zET|)b-F5H+=iW3oNKcET$;oF`kN`asBCwO;wDUx=e65M+VZbxmaI$${Z-cc~r71<$ z2opFUf;H|ob={2g2U3_FTOE}uAzCXbATrd&EP zxp^XA=x|B%Xo!zsq%lu4dM#i_L6NTl&v9$pP2g|QrIQ>jRmCSL zV-rOZRkaz!L`u)}3;4p>xF%M?$Bo&QxN|!^PJEZ9+tO;O61N!UlwFTm#(F-gh!?!+ zhT@VmXf%0p@D~$+2x}Y4;Ba2I!*Te*-Zr5D&Zi(0U>GBo6>F6V7~~KJLhEWSDax0b z4QU?Otj0pzsi|MEb^!$NCT*7rsdAl8b+YSOeI!V9;)FJf8=8Sn9(ucC!Gk8PuO{$K zd+8(u>XzVW?0?Phw`ZN(JvH3DUoYOj2BFm?9_*RqtB*cbTc^u$?-hR`-nhdWMkzny zKCvCG79={EtwyaeLgP!#c84!e<&(s|f!YL3K5m`W8Jk8ob|5#Lj#Fky?Q-}GlHq6D zbh7yMKnALz#IH6~Ktl0@P9~R7mEKJVf#kxi)>&!0aWyc7Hj>TLK^4XHIB0=%@;=~0 znP6GS7Egp?&x^yu+Ory5`#i4LvK|zW=5EYhndOqJ1}^y-!{Wez_Wxz7=!iu;`(2$> zBMR5ObAzS1ZypRWVBfV1okgofuIa>Rpqqa+bJPqW_OG+8`r?^bYQi^kz`)9Omha47 zVGuKhd9Wna5ptPC+c7viQ2+|^KDw?u-_W_u0Z3e&$9d>h+^&gTGmNNf&2Dt_3+}33 z2e}hv5)8MS$31E`uBA`I=sYxN90x4Jhq1h;p zkZehayX(46^(7;dKvc*6bUNI0(ow^jm^J>>XC^nbk;&jkSSDHJgT(m$CPBl!fkO9r z{~}`LnN&k(y%sA0=?J%{>&p{QRbZ7^-@JGBIJtEgYZ3rvT^LZN--C9kqVdlY+Lt3$ zi)OP2oH9d58KZ^Eylf#sJhe+{tW0<$VVjfcl3%&ti;RXMsLgOYm4{kPS8Js+ zwH&{#+xap4si1L zwYJ!VU90K3MLSb$dE&EeFf*PU6?d8Earm%Os_t+5gW# z*qkZVoHQL;8t^yXrfl(yrVVqVP!1kn@y({8bZG=!M=>PW?oYGv$NDS zIU)x#l}+IoyA&r^r-{V@wJtMbZZqt>m!(s>VRj;TCd%g>IcKLSKiAJSO-E;?hr2f_1I5HAM~8 zi)90O4y}zoN_j9m!i%XTTE>Lpe{U!=1QS1Te;8=@)Qr^=SIk7y$ko{IZ#|e7>o3za zJlNZ}V65KPHd_mK4>Oa%npJ9~(HY+y_fy9piqFZd8#d4YZyTU-8(TuTYUy? z$cfL1b|i=H{MPg-j|cq5)+N_lLmLkLX=ilz`JiG1z9D6(CrLO{%}F&TB|zxtpanN| zGDxGCXfgLFXP#4Q25ni)!#C>FqCityUUoCPDl%6lFlMb$P`9BS#0Omp9ela7aVvY4ol=F$QF4b+E&>p+kYRZ_5<7Jh?HQW~W zB4mO3OW(QQF`c*BpiS^&sM}erJ$cu)Fn8a3mf3+omHmM*)F^sYo6|FtPrFFzqOgj( zIL}sk_-Joioi>_nS)d-)3|Fr7;7JbJf`+-1{N}39gFUKm$6PXl z{!d2>Zgr}M#=J{Rs2Er3MBRzebUblY?r7MTM6AdVDhr#6U=dP)@X7*Y7M2`~d;b`tI zbX@nY?pdiwuz{}QZquQ&no;1mzIkm1h6E8`*pA1-vP}ja$1y?KLg15I^QJUaJoPvQ z$ZJ!M1%E=pGO2`u#Ae+MDk&QOxTd@L@1zx!gkixV6rL>kawJL%s7t}g1uSo63Md_q zfizxi^Wq%h-?mJdufJp=+C+DYZwZAbAG!cN6Gj0DmLUZ>o?1IHiH>L**m-Yu*9A9d zT2e&#j8LjX2=1i%lWqeF!C9ULNt)(JX^f^rY=bP<`paWT)-5b@BZgIR4^5JC!q5ES zjb(JbBaBKuy2Jd02L%qR<(?ON*X#f}q zVd%w!t0lb>D0a(KbKgT#8Z(kDcc21lh`h9hrGtGnG)B>j2LAg*COEW04N1z8!bHDZ zr~Qec4K|M&0)Y_1@Es4J{=ANl z=~^&NF9f)^5k-xg?UR=HbXdgo+U8;+%*p$14!liz@?f&4@?Y zt=MECy*uO9?4`=+bWbi#EgD#}aIxFmFTg&UlLa9ofT^tQ0>_;ddZz+Oi3DfMWZX-c zRq@>31vM6#wSs5J5wqL^R?;$3+HhsF(7&*Y)Yl)a!Fgab?ATzZ3#*jinh->6#1`q(HyZv`XPTqugkqm^-Y z?Vq{yxI2}ygx%Ul{{DxDK=9}=^D?i~Vr1dJI>mw55S*jIM+e1sh97@B*SXyhW1g6f z%S>m&a4!r}t%bkg@7^ho%WFC#H|SzY%B zqG<=3Pzw|;+P=5B#fh;=n{EifJlIy6X`JmST-LUbJAAQsi>uZePa;ucjYew?z+G`< zI6wP-;pgjcksXol%ieJtL!*M@$mu|_;Gi*IfPB#upke{y^MX%RFc4A7>NfkK%Hq(Z zj1t&+5nNjkrd1JxeoHS0uGFuS77$~j@(JA?P)~P$AEo{s6a53&GvuR*@Sa*;Sf_gI zJc`!BuM$G*}M*})r5is zA`6{g?jMi~s&vF+$Gq^2*yCBc*{jr=SMj_L_x(#eb9H91Ma-GgE^sU`5B-zdnYtj< zr^l7>07wsqd8tbj(rwiCQvmQ=ZmW;%trS+{we^1N;Lt8~My6%khvuQ{Vh3rENp=n+ zgo+k<>SM5hFf&g3bHLlM8~cu7J17^?Z%$mvAz84-RLhZ*I6Vv)ycL7H1m;P1)P?#} z-IE;Ql+2fSH4!GD@VHe)ZV1ld7iWDw>l}^7A(?Al%MF(q5>KyrK-GiIu z$B*Q2(9;9*B(aM8*7|)+W!gBw)R&iZn!gc!P2Gb4^HHV+#iU7lmmVQglIJncGYJ{ks z+X~9wTMC9u&#d@t*Itq8=Qhk}Gz_-N6B`8Bn8Q3gl>BI-IFw?X=O(7=kR}I(3dNeH zmucoaA!rF7eTJ^F*GA0G&3U=^>ZXA%wWm5lF0Vb}>IHW}SMH4eNiuoGur>Fm9ltPe z<0p80jcwYFK$EhMZqIXLF7i_%K_o10ZhHlg43_zDK1RggB4E_tc`5B^=H6tqVKccM zv=#Bu!Z6V~lsPPmID7dL9D&<=MTswHcskbX%*d}!89h%!FX4aMgrR2P>mogiIQS{M)Dbj-NGs%cwF)UpBC}Cr4~M8y`!|XnzQ1)x&=x- zvVb!;q_7`uIA=(fWR31cgIyx_-$E1h!B$? z3ASESQM)C&ZxP+K0;>4k5kP6=BFc;e<*17P?%svtg)(E$>NsNqNH|`&x_P0gAsQuH zn)d6MhYI28v2BHI4Y5Ss007Q(8nc<@SLiZnk0W^Jwm2?ROIr0Fc_F%O>5Wfq z_3%eS&C?R`O?FC%u1~2Mf_FPAZ65Vv^0PgWd&xC}NalBX;CX)X}bR`p4Dfh$eH zWg7B&mroT2*52qtQQb+G6&Xa0>jnPW)`?kP9xj+r39`Pnw8{>!=hJ}a?PaL^?2HV) z&KuqPxjBk+w2iMQgQ$1&`h<`~Mf~bu-K6-k5Qr7L&J?@ak&&Z6?z*Jj;L?1TiOn=e<*t;Btj< zx{-tKNJfdc`5Jm0met|O970aK=q4fW9b3yX%0U)(%p?NUHe=+Ng^bwH!WY!koybB6 z⋘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%0Dd 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 z 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 F^H1{E93KDx From 18cdd3be0477ac95704495f14ad3c5e6261ca042 Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Wed, 1 Nov 2023 08:28:06 -0600 Subject: [PATCH 30/35] adds missing docstring --- tests/test_external_tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_external_tests.py b/tests/test_external_tests.py index 0603a51..cfc3a1e 100644 --- a/tests/test_external_tests.py +++ b/tests/test_external_tests.py @@ -48,6 +48,7 @@ def test_that_a_process_can_be_serialized_and_deserialized(): # TODO Make changes to fully support Docker-enabled tests in macOS def docker_enabled_test(func): + """Marks Docker-enabled tests to only run in Linux environments.""" return pytest.mark.skipif( "linux" not in sys.platform.lower(), reason="Docker-enabled tests only run in Linux", @@ -82,7 +83,6 @@ def execute(self): stderr=True, volumes={self.local_path: {"bind": self.container_path, "mode": "ro"}}, working_dir="/", - # remove=True, UNCOMMENT THIS WHEN READY TO COMMIT ) self.exit_code = str(container.wait()["StatusCode"]) self.std_out = container.logs(stdout=True, stderr=False).decode("utf-8") From a0a57c468b5849dd6dad85931f9862ffd7778a23 Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Wed, 1 Nov 2023 08:40:50 -0600 Subject: [PATCH 31/35] removes platform from build.sh --- src/docker/build.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/src/docker/build.sh b/src/docker/build.sh index b317a16..8f77a3a 100644 --- a/src/docker/build.sh +++ b/src/docker/build.sh @@ -11,5 +11,4 @@ docker build \ -t dcqc \ -f "${SCRIPT_DIR}/Dockerfile" \ --build-arg TARBALL_PATH \ - --platform linux/amd64 \ "${SCRIPT_DIR}/../.." From 2659bc6c31a7a8dabce57d12712e4079ea58c861 Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Wed, 1 Nov 2023 09:02:05 -0600 Subject: [PATCH 32/35] reorder external tests --- tests/test_external_tests.py | 198 +++++++++++++++++------------------ 1 file changed, 99 insertions(+), 99 deletions(-) diff --git a/tests/test_external_tests.py b/tests/test_external_tests.py index cfc3a1e..65da031 100644 --- a/tests/test_external_tests.py +++ b/tests/test_external_tests.py @@ -46,7 +46,7 @@ def test_that_a_process_can_be_serialized_and_deserialized(): assert process_dict == process_from_dict.to_dict() -# TODO Make changes to fully support Docker-enabled tests in macOS +# TODO Make changes to fully support Docker-enabled tests in macOS once it is possile def docker_enabled_test(func): """Marks Docker-enabled tests to only run in Linux environments.""" return pytest.mark.skipif( @@ -89,18 +89,18 @@ def execute(self): self.std_err = container.logs(stdout=False, stderr=True).decode("utf-8") -def test_that_the_grep_date_test_command_is_produced(test_targets): +def test_that_the_libtiff_info_test_command_is_produced(test_targets): target = test_targets["tiff"] - test = tests.GrepDateTest(target) + test = tests.LibTiffInfoTest(target) process = test.generate_process() - assert "grep" in process.command + assert "tiffinfo" in process.command @docker_enabled_test -def test_that_the_grep_date_test_exit_code_is_0_when_it_should_be(test_files): - date_file = test_files["date_txt"] - target = SingleTarget(date_file) - test = tests.GrepDateTest(target) +def test_that_the_libtiff_info_test_exit_code_is_0_when_it_should_be(test_files): + tiff_file = test_files["tiff"] + target = SingleTarget(tiff_file) + test = tests.LibTiffInfoTest(target) process = test.generate_process() executor = DockerExecutor(process.container, process.command, target.file.url) executor.execute() @@ -108,20 +108,20 @@ def test_that_the_grep_date_test_exit_code_is_0_when_it_should_be(test_files): @docker_enabled_test -def test_that_the_grep_date_test_exit_code_is_1_when_it_should_be(test_files): - tiff_file = test_files["good"] +def test_that_the_libtiff_info_test_exit_code_is_1_when_it_should_be(test_files): + tiff_file = test_files["bad"] target = SingleTarget(tiff_file) - test = tests.GrepDateTest(target) + test = tests.LibTiffInfoTest(target) process = test.generate_process() executor = DockerExecutor(process.container, process.command, target.file.url) executor.execute() assert executor.exit_code == "1" -def test_that_the_grep_date_test_correctly_interprets_exit_code_0_and_1( +def test_that_the_libtiff_info_test_correctly_interprets_exit_code_0_and_1( test_files, mocker ): - # 1 is pass, 0 is fail + # 0 is pass, 1 is fail tiff_file = test_files["tiff"] target = SingleTarget(tiff_file) with TemporaryDirectory() as tmp_dir: @@ -129,32 +129,32 @@ def test_that_the_grep_date_test_correctly_interprets_exit_code_0_and_1( path_1 = Path(tmp_dir, "code_1.txt") path_0.write_text("0") path_1.write_text("1") - fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} - pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} + pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} + fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} - test = tests.GrepDateTest(target) + test = tests.LibTiffInfoTest(target) mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) test_status = test.get_status() assert test_status == TestStatus.PASS - test = tests.GrepDateTest(target) + test = tests.LibTiffInfoTest(target) mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) test_status = test.get_status() assert test_status == TestStatus.FAIL -def test_that_the_libtiff_info_test_command_is_produced(test_targets): +def test_that_the_bioformats_info_test_command_is_produced(test_targets): target = test_targets["tiff"] - test = tests.LibTiffInfoTest(target) + test = tests.BioFormatsInfoTest(target) process = test.generate_process() - assert "tiffinfo" in process.command + assert "showinf" in process.command @docker_enabled_test -def test_that_the_libtiff_info_test_exit_code_is_0_when_it_should_be(test_files): - tiff_file = test_files["tiff"] - target = SingleTarget(tiff_file) - test = tests.LibTiffInfoTest(target) +def test_that_the_bioformats_info_test_exit_code_is_0_when_it_should_be(test_files): + one_tiff_file = test_files["ome_tiff"] + target = SingleTarget(one_tiff_file) + test = tests.BioFormatsInfoTest(target) process = test.generate_process() executor = DockerExecutor(process.container, process.command, target.file.url) executor.execute() @@ -162,17 +162,17 @@ def test_that_the_libtiff_info_test_exit_code_is_0_when_it_should_be(test_files) @docker_enabled_test -def test_that_the_libtiff_info_test_exit_code_is_1_when_it_should_be(test_files): - tiff_file = test_files["bad"] - target = SingleTarget(tiff_file) - test = tests.LibTiffInfoTest(target) +def test_that_the_bioformats_info_test_exit_code_is_1_when_it_should_be(test_files): + one_tiff_file = test_files["good"] + target = SingleTarget(one_tiff_file) + test = tests.BioFormatsInfoTest(target) process = test.generate_process() executor = DockerExecutor(process.container, process.command, target.file.url) executor.execute() assert executor.exit_code == "1" -def test_that_the_libtiff_info_test_correctly_interprets_exit_code_0_and_1( +def test_that_the_bioformats_info_test_correctly_interprets_exit_code_0_and_1( test_files, mocker ): # 0 is pass, 1 is fail @@ -186,50 +186,50 @@ def test_that_the_libtiff_info_test_correctly_interprets_exit_code_0_and_1( pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} - test = tests.LibTiffInfoTest(target) + test = tests.BioFormatsInfoTest(target) mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) test_status = test.get_status() assert test_status == TestStatus.PASS - test = tests.LibTiffInfoTest(target) + test = tests.BioFormatsInfoTest(target) mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) test_status = test.get_status() assert test_status == TestStatus.FAIL -def test_that_the_tiffdatetimetest_command_is_produced(test_targets): +def test_that_the_ome_xml_schema_test_command_is_produced(test_targets): target = test_targets["tiff"] - test = tests.TiffDateTimeTest(target) + test = tests.OmeXmlSchemaTest(target) process = test.generate_process() - assert "grep" in process.command + assert "xmlvalid" in process.command @docker_enabled_test -def test_that_the_tiffdatetimetest_exit_code_is_1_when_it_should_be(test_files): - tiff_file = test_files["tiff"] +def test_that_the_ome_xml_schema_test_exit_code_is_0_when_it_should_be(test_files): + tiff_file = test_files["ome_tiff"] target = SingleTarget(tiff_file) - test = tests.TiffDateTimeTest(target) + test = tests.OmeXmlSchemaTest(target) process = test.generate_process() executor = DockerExecutor(process.container, process.command, target.file.url) executor.execute() - assert executor.exit_code == "1" + assert executor.exit_code == "0" @docker_enabled_test -def test_that_the_tiffdatetimetest_exit_code_is_0_when_it_should_be(test_files): - tiff_file = test_files["date_in_tag_tiff"] +def test_that_the_ome_xml_schema_test_exit_code_is_1_when_it_should_be(test_files): + tiff_file = test_files["good"] target = SingleTarget(tiff_file) - test = tests.TiffDateTimeTest(target) + test = tests.OmeXmlSchemaTest(target) process = test.generate_process() executor = DockerExecutor(process.container, process.command, target.file.url) executor.execute() - assert executor.exit_code == "0" + assert executor.exit_code == "1" -def test_that_the_tiffdatetimetest_correctly_interprets_exit_code_0_and_1( +def test_that_the_ome_xml_info_test_correctly_interprets_exit_code_0_and_1( test_files, mocker ): - # 1 is pass, 0 is fail + # 0 is pass, 1 is fail tiff_file = test_files["tiff"] target = SingleTarget(tiff_file) with TemporaryDirectory() as tmp_dir: @@ -237,50 +237,50 @@ def test_that_the_tiffdatetimetest_correctly_interprets_exit_code_0_and_1( path_1 = Path(tmp_dir, "code_1.txt") path_0.write_text("0") path_1.write_text("1") - fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} - pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} + pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} + fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} - test = tests.TiffDateTimeTest(target) + test = tests.OmeXmlSchemaTest(target) mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) test_status = test.get_status() assert test_status == TestStatus.PASS - test = tests.TiffDateTimeTest(target) + test = tests.OmeXmlSchemaTest(target) mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) test_status = test.get_status() assert test_status == TestStatus.FAIL -def test_that_the_tifftag306datetimetest_command_is_produced(test_targets): +def test_that_the_grep_date_test_command_is_produced(test_targets): target = test_targets["tiff"] - test = tests.TiffTag306DateTimeTest(target) + test = tests.GrepDateTest(target) process = test.generate_process() - assert "jq" in process.command + assert "grep" in process.command @docker_enabled_test -def test_that_the_tifftag306datetimetest_exit_code_is_1_when_it_should_be(test_files): - tiff_file = test_files["tiff"] - target = SingleTarget(tiff_file) - test = tests.TiffTag306DateTimeTest(target) +def test_that_the_grep_date_test_exit_code_is_0_when_it_should_be(test_files): + date_file = test_files["date_txt"] + target = SingleTarget(date_file) + test = tests.GrepDateTest(target) process = test.generate_process() executor = DockerExecutor(process.container, process.command, target.file.url) executor.execute() - assert executor.exit_code == "1" + assert executor.exit_code == "0" @docker_enabled_test -def test_that_the_tifftag306datetimetest_exit_code_is_0_when_it_should_be(test_files): - tiff_file = test_files["tiff_dirty_datetime"] +def test_that_the_grep_date_test_exit_code_is_1_when_it_should_be(test_files): + tiff_file = test_files["good"] target = SingleTarget(tiff_file) - test = tests.TiffTag306DateTimeTest(target) + test = tests.GrepDateTest(target) process = test.generate_process() executor = DockerExecutor(process.container, process.command, target.file.url) executor.execute() - assert executor.exit_code == "0" + assert executor.exit_code == "1" -def test_that_the_tifftag306datetimetest_correctly_interprets_exit_code_0_and_1( +def test_that_the_grep_date_test_correctly_interprets_exit_code_0_and_1( test_files, mocker ): # 1 is pass, 0 is fail @@ -294,50 +294,50 @@ def test_that_the_tifftag306datetimetest_correctly_interprets_exit_code_0_and_1( fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} - test = tests.TiffTag306DateTimeTest(target) + test = tests.GrepDateTest(target) mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) test_status = test.get_status() assert test_status == TestStatus.PASS - test = tests.TiffTag306DateTimeTest(target) + test = tests.GrepDateTest(target) mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) test_status = test.get_status() assert test_status == TestStatus.FAIL -def test_that_the_bioformats_info_test_command_is_produced(test_targets): +def test_that_the_tifftag306datetimetest_command_is_produced(test_targets): target = test_targets["tiff"] - test = tests.BioFormatsInfoTest(target) + test = tests.TiffTag306DateTimeTest(target) process = test.generate_process() - assert "showinf" in process.command + assert "jq" in process.command @docker_enabled_test -def test_that_the_bioformats_info_test_exit_code_is_0_when_it_should_be(test_files): - one_tiff_file = test_files["ome_tiff"] - target = SingleTarget(one_tiff_file) - test = tests.BioFormatsInfoTest(target) +def test_that_the_tifftag306datetimetest_exit_code_is_1_when_it_should_be(test_files): + tiff_file = test_files["tiff"] + target = SingleTarget(tiff_file) + test = tests.TiffTag306DateTimeTest(target) process = test.generate_process() executor = DockerExecutor(process.container, process.command, target.file.url) executor.execute() - assert executor.exit_code == "0" + assert executor.exit_code == "1" @docker_enabled_test -def test_that_the_bioformats_info_test_exit_code_is_1_when_it_should_be(test_files): - one_tiff_file = test_files["good"] - target = SingleTarget(one_tiff_file) - test = tests.BioFormatsInfoTest(target) +def test_that_the_tifftag306datetimetest_exit_code_is_0_when_it_should_be(test_files): + tiff_file = test_files["tiff_dirty_datetime"] + target = SingleTarget(tiff_file) + test = tests.TiffTag306DateTimeTest(target) process = test.generate_process() executor = DockerExecutor(process.container, process.command, target.file.url) executor.execute() - assert executor.exit_code == "1" + assert executor.exit_code == "0" -def test_that_the_bioformats_info_test_correctly_interprets_exit_code_0_and_1( +def test_that_the_tifftag306datetimetest_correctly_interprets_exit_code_0_and_1( test_files, mocker ): - # 0 is pass, 1 is fail + # 1 is pass, 0 is fail tiff_file = test_files["tiff"] target = SingleTarget(tiff_file) with TemporaryDirectory() as tmp_dir: @@ -345,53 +345,53 @@ def test_that_the_bioformats_info_test_correctly_interprets_exit_code_0_and_1( path_1 = Path(tmp_dir, "code_1.txt") path_0.write_text("0") path_1.write_text("1") - pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} - fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} + fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} + pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} - test = tests.BioFormatsInfoTest(target) + test = tests.TiffTag306DateTimeTest(target) mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) test_status = test.get_status() assert test_status == TestStatus.PASS - test = tests.BioFormatsInfoTest(target) + test = tests.TiffTag306DateTimeTest(target) mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) test_status = test.get_status() assert test_status == TestStatus.FAIL -def test_that_the_ome_xml_schema_test_command_is_produced(test_targets): +def test_that_the_tiffdatetimetest_command_is_produced(test_targets): target = test_targets["tiff"] - test = tests.OmeXmlSchemaTest(target) + test = tests.TiffDateTimeTest(target) process = test.generate_process() - assert "xmlvalid" in process.command + assert "grep" in process.command @docker_enabled_test -def test_that_the_ome_xml_schema_test_exit_code_is_0_when_it_should_be(test_files): - tiff_file = test_files["ome_tiff"] +def test_that_the_tiffdatetimetest_exit_code_is_1_when_it_should_be(test_files): + tiff_file = test_files["tiff"] target = SingleTarget(tiff_file) - test = tests.OmeXmlSchemaTest(target) + test = tests.TiffDateTimeTest(target) process = test.generate_process() executor = DockerExecutor(process.container, process.command, target.file.url) executor.execute() - assert executor.exit_code == "0" + assert executor.exit_code == "1" @docker_enabled_test -def test_that_the_ome_xml_schema_test_exit_code_is_1_when_it_should_be(test_files): - tiff_file = test_files["good"] +def test_that_the_tiffdatetimetest_exit_code_is_0_when_it_should_be(test_files): + tiff_file = test_files["date_in_tag_tiff"] target = SingleTarget(tiff_file) - test = tests.OmeXmlSchemaTest(target) + test = tests.TiffDateTimeTest(target) process = test.generate_process() executor = DockerExecutor(process.container, process.command, target.file.url) executor.execute() - assert executor.exit_code == "1" + assert executor.exit_code == "0" -def test_that_the_ome_xml_info_test_correctly_interprets_exit_code_0_and_1( +def test_that_the_tiffdatetimetest_correctly_interprets_exit_code_0_and_1( test_files, mocker ): - # 0 is pass, 1 is fail + # 1 is pass, 0 is fail tiff_file = test_files["tiff"] target = SingleTarget(tiff_file) with TemporaryDirectory() as tmp_dir: @@ -399,15 +399,15 @@ def test_that_the_ome_xml_info_test_correctly_interprets_exit_code_0_and_1( path_1 = Path(tmp_dir, "code_1.txt") path_0.write_text("0") path_1.write_text("1") - pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} - fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} + fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} + pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} - test = tests.OmeXmlSchemaTest(target) + test = tests.TiffDateTimeTest(target) mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) test_status = test.get_status() assert test_status == TestStatus.PASS - test = tests.OmeXmlSchemaTest(target) + test = tests.TiffDateTimeTest(target) mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) test_status = test.get_status() assert test_status == TestStatus.FAIL From 4844bcb6849f32e4813aafeb79cc83d0dcbf0d52 Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Wed, 1 Nov 2023 09:03:16 -0600 Subject: [PATCH 33/35] remove test_external_tests --- tests/test_external_tests.py | 413 ----------------------------------- 1 file changed, 413 deletions(-) delete mode 100644 tests/test_external_tests.py diff --git a/tests/test_external_tests.py b/tests/test_external_tests.py deleted file mode 100644 index 65da031..0000000 --- a/tests/test_external_tests.py +++ /dev/null @@ -1,413 +0,0 @@ -import os -import shlex -import sys -from pathlib import Path -from tempfile import TemporaryDirectory - -import pytest - -import docker -from dcqc import tests -from dcqc.target import SingleTarget -from dcqc.tests import BaseTest, ExternalTestMixin, Process, TestStatus - - -def test_that_all_external_tests_inherit_from_the_mixin_first(): - tests = BaseTest.list_subclasses() - for test in tests: - if issubclass(test, ExternalTestMixin): - mro = test.__mro__ - mixin_index = mro.index(ExternalTestMixin) - abc_index = mro.index(BaseTest) - assert mixin_index < abc_index - - -def test_that_process_output_files_can_be_found(get_data): - std_out = get_data("tiffinfo/std_out.txt") - std_err = get_data("tiffinfo/std_err.txt") - exit_code = get_data("tiffinfo/exit_code.txt") - with TemporaryDirectory() as tmp_dir: - tmp_path = Path(tmp_dir) - - (tmp_path / std_out.name).symlink_to(std_out) - (tmp_path / std_err.name).symlink_to(std_err) - - with pytest.raises(FileNotFoundError): - ExternalTestMixin._find_process_outputs(tmp_path) - - (tmp_path / exit_code.name).symlink_to(exit_code) - ExternalTestMixin._find_process_outputs(tmp_path) - - -def test_that_a_process_can_be_serialized_and_deserialized(): - process = Process("foo:bar", ["python"]) - process_dict = process.to_dict() - process_from_dict = Process.from_dict(process_dict) - assert process_dict == process_from_dict.to_dict() - - -# TODO Make changes to fully support Docker-enabled tests in macOS once it is possile -def docker_enabled_test(func): - """Marks Docker-enabled tests to only run in Linux environments.""" - return pytest.mark.skipif( - "linux" not in sys.platform.lower(), - reason="Docker-enabled tests only run in Linux", - )(func) - - -class DockerExecutor: - """Class for executing a command in a docker container.""" - - def __init__(self, image: str, command: str, file_path: str): - """Initialize the class.""" - self.image = image - self.command = self.format_command_for_sh(command) - self.local_path = file_path - self.container_path = os.path.join("/", file_path.split("/")[-1]) - - def format_command_for_sh(self, command): - """Format the command for sh -c. - Standardizes command execution across containers.""" - escaped_command = shlex.quote(command) - formatted_command = f"sh -c {escaped_command}" - return formatted_command - - def execute(self): - """Execute the command in a docker container.""" - client = docker.from_env() - container = client.containers.run( - image=self.image, - command=self.command, - detach=True, - stdout=True, - stderr=True, - volumes={self.local_path: {"bind": self.container_path, "mode": "ro"}}, - working_dir="/", - ) - self.exit_code = str(container.wait()["StatusCode"]) - self.std_out = container.logs(stdout=True, stderr=False).decode("utf-8") - self.std_err = container.logs(stdout=False, stderr=True).decode("utf-8") - - -def test_that_the_libtiff_info_test_command_is_produced(test_targets): - target = test_targets["tiff"] - test = tests.LibTiffInfoTest(target) - process = test.generate_process() - assert "tiffinfo" in process.command - - -@docker_enabled_test -def test_that_the_libtiff_info_test_exit_code_is_0_when_it_should_be(test_files): - tiff_file = test_files["tiff"] - target = SingleTarget(tiff_file) - test = tests.LibTiffInfoTest(target) - process = test.generate_process() - executor = DockerExecutor(process.container, process.command, target.file.url) - executor.execute() - assert executor.exit_code == "0" - - -@docker_enabled_test -def test_that_the_libtiff_info_test_exit_code_is_1_when_it_should_be(test_files): - tiff_file = test_files["bad"] - target = SingleTarget(tiff_file) - test = tests.LibTiffInfoTest(target) - process = test.generate_process() - executor = DockerExecutor(process.container, process.command, target.file.url) - executor.execute() - assert executor.exit_code == "1" - - -def test_that_the_libtiff_info_test_correctly_interprets_exit_code_0_and_1( - test_files, mocker -): - # 0 is pass, 1 is fail - tiff_file = test_files["tiff"] - target = SingleTarget(tiff_file) - with TemporaryDirectory() as tmp_dir: - path_0 = Path(tmp_dir, "code_0.txt") - path_1 = Path(tmp_dir, "code_1.txt") - path_0.write_text("0") - path_1.write_text("1") - pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} - fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} - - test = tests.LibTiffInfoTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) - test_status = test.get_status() - assert test_status == TestStatus.PASS - - test = tests.LibTiffInfoTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) - test_status = test.get_status() - assert test_status == TestStatus.FAIL - - -def test_that_the_bioformats_info_test_command_is_produced(test_targets): - target = test_targets["tiff"] - test = tests.BioFormatsInfoTest(target) - process = test.generate_process() - assert "showinf" in process.command - - -@docker_enabled_test -def test_that_the_bioformats_info_test_exit_code_is_0_when_it_should_be(test_files): - one_tiff_file = test_files["ome_tiff"] - target = SingleTarget(one_tiff_file) - test = tests.BioFormatsInfoTest(target) - process = test.generate_process() - executor = DockerExecutor(process.container, process.command, target.file.url) - executor.execute() - assert executor.exit_code == "0" - - -@docker_enabled_test -def test_that_the_bioformats_info_test_exit_code_is_1_when_it_should_be(test_files): - one_tiff_file = test_files["good"] - target = SingleTarget(one_tiff_file) - test = tests.BioFormatsInfoTest(target) - process = test.generate_process() - executor = DockerExecutor(process.container, process.command, target.file.url) - executor.execute() - assert executor.exit_code == "1" - - -def test_that_the_bioformats_info_test_correctly_interprets_exit_code_0_and_1( - test_files, mocker -): - # 0 is pass, 1 is fail - tiff_file = test_files["tiff"] - target = SingleTarget(tiff_file) - with TemporaryDirectory() as tmp_dir: - path_0 = Path(tmp_dir, "code_0.txt") - path_1 = Path(tmp_dir, "code_1.txt") - path_0.write_text("0") - path_1.write_text("1") - pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} - fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} - - test = tests.BioFormatsInfoTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) - test_status = test.get_status() - assert test_status == TestStatus.PASS - - test = tests.BioFormatsInfoTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) - test_status = test.get_status() - assert test_status == TestStatus.FAIL - - -def test_that_the_ome_xml_schema_test_command_is_produced(test_targets): - target = test_targets["tiff"] - test = tests.OmeXmlSchemaTest(target) - process = test.generate_process() - assert "xmlvalid" in process.command - - -@docker_enabled_test -def test_that_the_ome_xml_schema_test_exit_code_is_0_when_it_should_be(test_files): - tiff_file = test_files["ome_tiff"] - target = SingleTarget(tiff_file) - test = tests.OmeXmlSchemaTest(target) - process = test.generate_process() - executor = DockerExecutor(process.container, process.command, target.file.url) - executor.execute() - assert executor.exit_code == "0" - - -@docker_enabled_test -def test_that_the_ome_xml_schema_test_exit_code_is_1_when_it_should_be(test_files): - tiff_file = test_files["good"] - target = SingleTarget(tiff_file) - test = tests.OmeXmlSchemaTest(target) - process = test.generate_process() - executor = DockerExecutor(process.container, process.command, target.file.url) - executor.execute() - assert executor.exit_code == "1" - - -def test_that_the_ome_xml_info_test_correctly_interprets_exit_code_0_and_1( - test_files, mocker -): - # 0 is pass, 1 is fail - tiff_file = test_files["tiff"] - target = SingleTarget(tiff_file) - with TemporaryDirectory() as tmp_dir: - path_0 = Path(tmp_dir, "code_0.txt") - path_1 = Path(tmp_dir, "code_1.txt") - path_0.write_text("0") - path_1.write_text("1") - pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} - fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} - - test = tests.OmeXmlSchemaTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) - test_status = test.get_status() - assert test_status == TestStatus.PASS - - test = tests.OmeXmlSchemaTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) - test_status = test.get_status() - assert test_status == TestStatus.FAIL - - -def test_that_the_grep_date_test_command_is_produced(test_targets): - target = test_targets["tiff"] - test = tests.GrepDateTest(target) - process = test.generate_process() - assert "grep" in process.command - - -@docker_enabled_test -def test_that_the_grep_date_test_exit_code_is_0_when_it_should_be(test_files): - date_file = test_files["date_txt"] - target = SingleTarget(date_file) - test = tests.GrepDateTest(target) - process = test.generate_process() - executor = DockerExecutor(process.container, process.command, target.file.url) - executor.execute() - assert executor.exit_code == "0" - - -@docker_enabled_test -def test_that_the_grep_date_test_exit_code_is_1_when_it_should_be(test_files): - tiff_file = test_files["good"] - target = SingleTarget(tiff_file) - test = tests.GrepDateTest(target) - process = test.generate_process() - executor = DockerExecutor(process.container, process.command, target.file.url) - executor.execute() - assert executor.exit_code == "1" - - -def test_that_the_grep_date_test_correctly_interprets_exit_code_0_and_1( - test_files, mocker -): - # 1 is pass, 0 is fail - tiff_file = test_files["tiff"] - target = SingleTarget(tiff_file) - with TemporaryDirectory() as tmp_dir: - path_0 = Path(tmp_dir, "code_0.txt") - path_1 = Path(tmp_dir, "code_1.txt") - path_0.write_text("0") - path_1.write_text("1") - fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} - pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} - - test = tests.GrepDateTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) - test_status = test.get_status() - assert test_status == TestStatus.PASS - - test = tests.GrepDateTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) - test_status = test.get_status() - assert test_status == TestStatus.FAIL - - -def test_that_the_tifftag306datetimetest_command_is_produced(test_targets): - target = test_targets["tiff"] - test = tests.TiffTag306DateTimeTest(target) - process = test.generate_process() - assert "jq" in process.command - - -@docker_enabled_test -def test_that_the_tifftag306datetimetest_exit_code_is_1_when_it_should_be(test_files): - tiff_file = test_files["tiff"] - target = SingleTarget(tiff_file) - test = tests.TiffTag306DateTimeTest(target) - process = test.generate_process() - executor = DockerExecutor(process.container, process.command, target.file.url) - executor.execute() - assert executor.exit_code == "1" - - -@docker_enabled_test -def test_that_the_tifftag306datetimetest_exit_code_is_0_when_it_should_be(test_files): - tiff_file = test_files["tiff_dirty_datetime"] - target = SingleTarget(tiff_file) - test = tests.TiffTag306DateTimeTest(target) - process = test.generate_process() - executor = DockerExecutor(process.container, process.command, target.file.url) - executor.execute() - assert executor.exit_code == "0" - - -def test_that_the_tifftag306datetimetest_correctly_interprets_exit_code_0_and_1( - test_files, mocker -): - # 1 is pass, 0 is fail - tiff_file = test_files["tiff"] - target = SingleTarget(tiff_file) - with TemporaryDirectory() as tmp_dir: - path_0 = Path(tmp_dir, "code_0.txt") - path_1 = Path(tmp_dir, "code_1.txt") - path_0.write_text("0") - path_1.write_text("1") - fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} - pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} - - test = tests.TiffTag306DateTimeTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) - test_status = test.get_status() - assert test_status == TestStatus.PASS - - test = tests.TiffTag306DateTimeTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) - test_status = test.get_status() - assert test_status == TestStatus.FAIL - - -def test_that_the_tiffdatetimetest_command_is_produced(test_targets): - target = test_targets["tiff"] - test = tests.TiffDateTimeTest(target) - process = test.generate_process() - assert "grep" in process.command - - -@docker_enabled_test -def test_that_the_tiffdatetimetest_exit_code_is_1_when_it_should_be(test_files): - tiff_file = test_files["tiff"] - target = SingleTarget(tiff_file) - test = tests.TiffDateTimeTest(target) - process = test.generate_process() - executor = DockerExecutor(process.container, process.command, target.file.url) - executor.execute() - assert executor.exit_code == "1" - - -@docker_enabled_test -def test_that_the_tiffdatetimetest_exit_code_is_0_when_it_should_be(test_files): - tiff_file = test_files["date_in_tag_tiff"] - target = SingleTarget(tiff_file) - test = tests.TiffDateTimeTest(target) - process = test.generate_process() - executor = DockerExecutor(process.container, process.command, target.file.url) - executor.execute() - assert executor.exit_code == "0" - - -def test_that_the_tiffdatetimetest_correctly_interprets_exit_code_0_and_1( - test_files, mocker -): - # 1 is pass, 0 is fail - tiff_file = test_files["tiff"] - target = SingleTarget(tiff_file) - with TemporaryDirectory() as tmp_dir: - path_0 = Path(tmp_dir, "code_0.txt") - path_1 = Path(tmp_dir, "code_1.txt") - path_0.write_text("0") - path_1.write_text("1") - fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} - pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} - - test = tests.TiffDateTimeTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) - test_status = test.get_status() - assert test_status == TestStatus.PASS - - test = tests.TiffDateTimeTest(target) - mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) - test_status = test.get_status() - assert test_status == TestStatus.FAIL From 640029b3c2d8c0847a976a8bb2bd62e27e2ea63e Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Wed, 1 Nov 2023 09:03:46 -0600 Subject: [PATCH 34/35] re-add test_external_tests hopefully fix diff --- tests/test_external_tests.py | 413 +++++++++++++++++++++++++++++++++++ 1 file changed, 413 insertions(+) create mode 100644 tests/test_external_tests.py diff --git a/tests/test_external_tests.py b/tests/test_external_tests.py new file mode 100644 index 0000000..65da031 --- /dev/null +++ b/tests/test_external_tests.py @@ -0,0 +1,413 @@ +import os +import shlex +import sys +from pathlib import Path +from tempfile import TemporaryDirectory + +import pytest + +import docker +from dcqc import tests +from dcqc.target import SingleTarget +from dcqc.tests import BaseTest, ExternalTestMixin, Process, TestStatus + + +def test_that_all_external_tests_inherit_from_the_mixin_first(): + tests = BaseTest.list_subclasses() + for test in tests: + if issubclass(test, ExternalTestMixin): + mro = test.__mro__ + mixin_index = mro.index(ExternalTestMixin) + abc_index = mro.index(BaseTest) + assert mixin_index < abc_index + + +def test_that_process_output_files_can_be_found(get_data): + std_out = get_data("tiffinfo/std_out.txt") + std_err = get_data("tiffinfo/std_err.txt") + exit_code = get_data("tiffinfo/exit_code.txt") + with TemporaryDirectory() as tmp_dir: + tmp_path = Path(tmp_dir) + + (tmp_path / std_out.name).symlink_to(std_out) + (tmp_path / std_err.name).symlink_to(std_err) + + with pytest.raises(FileNotFoundError): + ExternalTestMixin._find_process_outputs(tmp_path) + + (tmp_path / exit_code.name).symlink_to(exit_code) + ExternalTestMixin._find_process_outputs(tmp_path) + + +def test_that_a_process_can_be_serialized_and_deserialized(): + process = Process("foo:bar", ["python"]) + process_dict = process.to_dict() + process_from_dict = Process.from_dict(process_dict) + assert process_dict == process_from_dict.to_dict() + + +# TODO Make changes to fully support Docker-enabled tests in macOS once it is possile +def docker_enabled_test(func): + """Marks Docker-enabled tests to only run in Linux environments.""" + return pytest.mark.skipif( + "linux" not in sys.platform.lower(), + reason="Docker-enabled tests only run in Linux", + )(func) + + +class DockerExecutor: + """Class for executing a command in a docker container.""" + + def __init__(self, image: str, command: str, file_path: str): + """Initialize the class.""" + self.image = image + self.command = self.format_command_for_sh(command) + self.local_path = file_path + self.container_path = os.path.join("/", file_path.split("/")[-1]) + + def format_command_for_sh(self, command): + """Format the command for sh -c. + Standardizes command execution across containers.""" + escaped_command = shlex.quote(command) + formatted_command = f"sh -c {escaped_command}" + return formatted_command + + def execute(self): + """Execute the command in a docker container.""" + client = docker.from_env() + container = client.containers.run( + image=self.image, + command=self.command, + detach=True, + stdout=True, + stderr=True, + volumes={self.local_path: {"bind": self.container_path, "mode": "ro"}}, + working_dir="/", + ) + self.exit_code = str(container.wait()["StatusCode"]) + self.std_out = container.logs(stdout=True, stderr=False).decode("utf-8") + self.std_err = container.logs(stdout=False, stderr=True).decode("utf-8") + + +def test_that_the_libtiff_info_test_command_is_produced(test_targets): + target = test_targets["tiff"] + test = tests.LibTiffInfoTest(target) + process = test.generate_process() + assert "tiffinfo" in process.command + + +@docker_enabled_test +def test_that_the_libtiff_info_test_exit_code_is_0_when_it_should_be(test_files): + tiff_file = test_files["tiff"] + target = SingleTarget(tiff_file) + test = tests.LibTiffInfoTest(target) + process = test.generate_process() + executor = DockerExecutor(process.container, process.command, target.file.url) + executor.execute() + assert executor.exit_code == "0" + + +@docker_enabled_test +def test_that_the_libtiff_info_test_exit_code_is_1_when_it_should_be(test_files): + tiff_file = test_files["bad"] + target = SingleTarget(tiff_file) + test = tests.LibTiffInfoTest(target) + process = test.generate_process() + executor = DockerExecutor(process.container, process.command, target.file.url) + executor.execute() + assert executor.exit_code == "1" + + +def test_that_the_libtiff_info_test_correctly_interprets_exit_code_0_and_1( + test_files, mocker +): + # 0 is pass, 1 is fail + tiff_file = test_files["tiff"] + target = SingleTarget(tiff_file) + with TemporaryDirectory() as tmp_dir: + path_0 = Path(tmp_dir, "code_0.txt") + path_1 = Path(tmp_dir, "code_1.txt") + path_0.write_text("0") + path_1.write_text("1") + pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} + fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} + + test = tests.LibTiffInfoTest(target) + mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) + test_status = test.get_status() + assert test_status == TestStatus.PASS + + test = tests.LibTiffInfoTest(target) + mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) + test_status = test.get_status() + assert test_status == TestStatus.FAIL + + +def test_that_the_bioformats_info_test_command_is_produced(test_targets): + target = test_targets["tiff"] + test = tests.BioFormatsInfoTest(target) + process = test.generate_process() + assert "showinf" in process.command + + +@docker_enabled_test +def test_that_the_bioformats_info_test_exit_code_is_0_when_it_should_be(test_files): + one_tiff_file = test_files["ome_tiff"] + target = SingleTarget(one_tiff_file) + test = tests.BioFormatsInfoTest(target) + process = test.generate_process() + executor = DockerExecutor(process.container, process.command, target.file.url) + executor.execute() + assert executor.exit_code == "0" + + +@docker_enabled_test +def test_that_the_bioformats_info_test_exit_code_is_1_when_it_should_be(test_files): + one_tiff_file = test_files["good"] + target = SingleTarget(one_tiff_file) + test = tests.BioFormatsInfoTest(target) + process = test.generate_process() + executor = DockerExecutor(process.container, process.command, target.file.url) + executor.execute() + assert executor.exit_code == "1" + + +def test_that_the_bioformats_info_test_correctly_interprets_exit_code_0_and_1( + test_files, mocker +): + # 0 is pass, 1 is fail + tiff_file = test_files["tiff"] + target = SingleTarget(tiff_file) + with TemporaryDirectory() as tmp_dir: + path_0 = Path(tmp_dir, "code_0.txt") + path_1 = Path(tmp_dir, "code_1.txt") + path_0.write_text("0") + path_1.write_text("1") + pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} + fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} + + test = tests.BioFormatsInfoTest(target) + mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) + test_status = test.get_status() + assert test_status == TestStatus.PASS + + test = tests.BioFormatsInfoTest(target) + mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) + test_status = test.get_status() + assert test_status == TestStatus.FAIL + + +def test_that_the_ome_xml_schema_test_command_is_produced(test_targets): + target = test_targets["tiff"] + test = tests.OmeXmlSchemaTest(target) + process = test.generate_process() + assert "xmlvalid" in process.command + + +@docker_enabled_test +def test_that_the_ome_xml_schema_test_exit_code_is_0_when_it_should_be(test_files): + tiff_file = test_files["ome_tiff"] + target = SingleTarget(tiff_file) + test = tests.OmeXmlSchemaTest(target) + process = test.generate_process() + executor = DockerExecutor(process.container, process.command, target.file.url) + executor.execute() + assert executor.exit_code == "0" + + +@docker_enabled_test +def test_that_the_ome_xml_schema_test_exit_code_is_1_when_it_should_be(test_files): + tiff_file = test_files["good"] + target = SingleTarget(tiff_file) + test = tests.OmeXmlSchemaTest(target) + process = test.generate_process() + executor = DockerExecutor(process.container, process.command, target.file.url) + executor.execute() + assert executor.exit_code == "1" + + +def test_that_the_ome_xml_info_test_correctly_interprets_exit_code_0_and_1( + test_files, mocker +): + # 0 is pass, 1 is fail + tiff_file = test_files["tiff"] + target = SingleTarget(tiff_file) + with TemporaryDirectory() as tmp_dir: + path_0 = Path(tmp_dir, "code_0.txt") + path_1 = Path(tmp_dir, "code_1.txt") + path_0.write_text("0") + path_1.write_text("1") + pass_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} + fail_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} + + test = tests.OmeXmlSchemaTest(target) + mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) + test_status = test.get_status() + assert test_status == TestStatus.PASS + + test = tests.OmeXmlSchemaTest(target) + mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) + test_status = test.get_status() + assert test_status == TestStatus.FAIL + + +def test_that_the_grep_date_test_command_is_produced(test_targets): + target = test_targets["tiff"] + test = tests.GrepDateTest(target) + process = test.generate_process() + assert "grep" in process.command + + +@docker_enabled_test +def test_that_the_grep_date_test_exit_code_is_0_when_it_should_be(test_files): + date_file = test_files["date_txt"] + target = SingleTarget(date_file) + test = tests.GrepDateTest(target) + process = test.generate_process() + executor = DockerExecutor(process.container, process.command, target.file.url) + executor.execute() + assert executor.exit_code == "0" + + +@docker_enabled_test +def test_that_the_grep_date_test_exit_code_is_1_when_it_should_be(test_files): + tiff_file = test_files["good"] + target = SingleTarget(tiff_file) + test = tests.GrepDateTest(target) + process = test.generate_process() + executor = DockerExecutor(process.container, process.command, target.file.url) + executor.execute() + assert executor.exit_code == "1" + + +def test_that_the_grep_date_test_correctly_interprets_exit_code_0_and_1( + test_files, mocker +): + # 1 is pass, 0 is fail + tiff_file = test_files["tiff"] + target = SingleTarget(tiff_file) + with TemporaryDirectory() as tmp_dir: + path_0 = Path(tmp_dir, "code_0.txt") + path_1 = Path(tmp_dir, "code_1.txt") + path_0.write_text("0") + path_1.write_text("1") + fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} + pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} + + test = tests.GrepDateTest(target) + mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) + test_status = test.get_status() + assert test_status == TestStatus.PASS + + test = tests.GrepDateTest(target) + mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) + test_status = test.get_status() + assert test_status == TestStatus.FAIL + + +def test_that_the_tifftag306datetimetest_command_is_produced(test_targets): + target = test_targets["tiff"] + test = tests.TiffTag306DateTimeTest(target) + process = test.generate_process() + assert "jq" in process.command + + +@docker_enabled_test +def test_that_the_tifftag306datetimetest_exit_code_is_1_when_it_should_be(test_files): + tiff_file = test_files["tiff"] + target = SingleTarget(tiff_file) + test = tests.TiffTag306DateTimeTest(target) + process = test.generate_process() + executor = DockerExecutor(process.container, process.command, target.file.url) + executor.execute() + assert executor.exit_code == "1" + + +@docker_enabled_test +def test_that_the_tifftag306datetimetest_exit_code_is_0_when_it_should_be(test_files): + tiff_file = test_files["tiff_dirty_datetime"] + target = SingleTarget(tiff_file) + test = tests.TiffTag306DateTimeTest(target) + process = test.generate_process() + executor = DockerExecutor(process.container, process.command, target.file.url) + executor.execute() + assert executor.exit_code == "0" + + +def test_that_the_tifftag306datetimetest_correctly_interprets_exit_code_0_and_1( + test_files, mocker +): + # 1 is pass, 0 is fail + tiff_file = test_files["tiff"] + target = SingleTarget(tiff_file) + with TemporaryDirectory() as tmp_dir: + path_0 = Path(tmp_dir, "code_0.txt") + path_1 = Path(tmp_dir, "code_1.txt") + path_0.write_text("0") + path_1.write_text("1") + fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} + pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} + + test = tests.TiffTag306DateTimeTest(target) + mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) + test_status = test.get_status() + assert test_status == TestStatus.PASS + + test = tests.TiffTag306DateTimeTest(target) + mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) + test_status = test.get_status() + assert test_status == TestStatus.FAIL + + +def test_that_the_tiffdatetimetest_command_is_produced(test_targets): + target = test_targets["tiff"] + test = tests.TiffDateTimeTest(target) + process = test.generate_process() + assert "grep" in process.command + + +@docker_enabled_test +def test_that_the_tiffdatetimetest_exit_code_is_1_when_it_should_be(test_files): + tiff_file = test_files["tiff"] + target = SingleTarget(tiff_file) + test = tests.TiffDateTimeTest(target) + process = test.generate_process() + executor = DockerExecutor(process.container, process.command, target.file.url) + executor.execute() + assert executor.exit_code == "1" + + +@docker_enabled_test +def test_that_the_tiffdatetimetest_exit_code_is_0_when_it_should_be(test_files): + tiff_file = test_files["date_in_tag_tiff"] + target = SingleTarget(tiff_file) + test = tests.TiffDateTimeTest(target) + process = test.generate_process() + executor = DockerExecutor(process.container, process.command, target.file.url) + executor.execute() + assert executor.exit_code == "0" + + +def test_that_the_tiffdatetimetest_correctly_interprets_exit_code_0_and_1( + test_files, mocker +): + # 1 is pass, 0 is fail + tiff_file = test_files["tiff"] + target = SingleTarget(tiff_file) + with TemporaryDirectory() as tmp_dir: + path_0 = Path(tmp_dir, "code_0.txt") + path_1 = Path(tmp_dir, "code_1.txt") + path_0.write_text("0") + path_1.write_text("1") + fail_outputs = {"std_out": path_1, "std_err": path_1, "exit_code": path_0} + pass_outputs = {"std_out": path_0, "std_err": path_0, "exit_code": path_1} + + test = tests.TiffDateTimeTest(target) + mocker.patch.object(test, "_find_process_outputs", return_value=pass_outputs) + test_status = test.get_status() + assert test_status == TestStatus.PASS + + test = tests.TiffDateTimeTest(target) + mocker.patch.object(test, "_find_process_outputs", return_value=fail_outputs) + test_status = test.get_status() + assert test_status == TestStatus.FAIL From 52e22bb0a7474906d2e0e09f1bad89bc0f708572 Mon Sep 17 00:00:00 2001 From: Brad Macdonald Date: Wed, 1 Nov 2023 12:47:48 -0600 Subject: [PATCH 35/35] changes test variable --- tests/test_external_tests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_external_tests.py b/tests/test_external_tests.py index 65da031..2d2ae58 100644 --- a/tests/test_external_tests.py +++ b/tests/test_external_tests.py @@ -13,8 +13,8 @@ def test_that_all_external_tests_inherit_from_the_mixin_first(): - tests = BaseTest.list_subclasses() - for test in tests: + tests_list = BaseTest.list_subclasses() + for test in tests_list: if issubclass(test, ExternalTestMixin): mro = test.__mro__ mixin_index = mro.index(ExternalTestMixin)