diff --git a/Pipfile.lock b/Pipfile.lock index 2755c182..a8382301 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "dde1a273489b708245f7c8cf8a1ec7d4df6e33b3813ca2dea01b9899d3f9037f" + "sha256": "0dc2ee4f16946e2652598d50c70ca9822672fbadaa49b968e2273f22a29554d7" }, "pipfile-spec": 6, "requires": {}, @@ -21,41 +21,6 @@ ], "version": "==1.6" }, - "alabaster": { - "hashes": [ - "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359", - "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02" - ], - "version": "==0.7.12" - }, - "attrs": { - "hashes": [ - "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836", - "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99" - ], - "version": "==22.2.0" - }, - "babel": { - "hashes": [ - "sha256:1ad3eca1c885218f6dce2ab67291178944f810a10a9b5f3cb8382a5a232b64fe", - "sha256:5ef4b3226b0180dedded4229651c8b0e1a3a6a2837d45a073272f313e4cf97f6" - ], - "version": "==2.11.0" - }, - "certifi": { - "hashes": [ - "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3", - "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18" - ], - "version": "==2022.12.7" - }, - "charset-normalizer": { - "hashes": [ - "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845", - "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f" - ], - "version": "==2.1.1" - }, "cothread": { "hashes": [ "sha256:15825b3cca1e8b30d02b04aab26dfdf31c0bab5b3ef80a656aff79dc23573db9", @@ -72,75 +37,8 @@ "sha256:f0f57697eee1b87cf2bad4683e0deda5b3fe4505400084369274393999fcc3d0", "sha256:fb12d99088ce073412fb0f84930d2b08a134ba4eeb441d3beac1fe62b2e5f9e5" ], - "markers": "sys_platform != 'win32'", "version": "==2.19.1" }, - "coverage": { - "extras": [ - "toml" - ], - "hashes": [ - "sha256:04481245ef966fbd24ae9b9e537ce899ae584d521dfbe78f89cad003c38ca2ab", - "sha256:0c45948f613d5d18c9ec5eaa203ce06a653334cf1bd47c783a12d0dd4fd9c851", - "sha256:10188fe543560ec4874f974b5305cd1a8bdcfa885ee00ea3a03733464c4ca265", - "sha256:218fe982371ac7387304153ecd51205f14e9d731b34fb0568181abaf7b443ba0", - "sha256:29571503c37f2ef2138a306d23e7270687c0efb9cab4bd8038d609b5c2393a3a", - "sha256:2a60d6513781e87047c3e630b33b4d1e89f39836dac6e069ffee28c4786715f5", - "sha256:2bf1d5f2084c3932b56b962a683074a3692bce7cabd3aa023c987a2a8e7612f6", - "sha256:3164d31078fa9efe406e198aecd2a02d32a62fecbdef74f76dad6a46c7e48311", - "sha256:32df215215f3af2c1617a55dbdfb403b772d463d54d219985ac7cd3bf124cada", - "sha256:33d1ae9d4079e05ac4cc1ef9e20c648f5afabf1a92adfaf2ccf509c50b85717f", - "sha256:33ff26d0f6cc3ca8de13d14fde1ff8efe1456b53e3f0273e63cc8b3c84a063d8", - "sha256:38da2db80cc505a611938d8624801158e409928b136c8916cd2e203970dde4dc", - "sha256:3b155caf3760408d1cb903b21e6a97ad4e2bdad43cbc265e3ce0afb8e0057e73", - "sha256:3b946bbcd5a8231383450b195cfb58cb01cbe7f8949f5758566b881df4b33baf", - "sha256:3baf5f126f30781b5e93dbefcc8271cb2491647f8283f20ac54d12161dff080e", - "sha256:4b14d5e09c656de5038a3f9bfe5228f53439282abcab87317c9f7f1acb280352", - "sha256:51b236e764840a6df0661b67e50697aaa0e7d4124ca95e5058fa3d7cbc240b7c", - "sha256:63ffd21aa133ff48c4dff7adcc46b7ec8b565491bfc371212122dd999812ea1c", - "sha256:6a43c7823cd7427b4ed763aa7fb63901ca8288591323b58c9cd6ec31ad910f3c", - "sha256:755e89e32376c850f826c425ece2c35a4fc266c081490eb0a841e7c1cb0d3bda", - "sha256:7a726d742816cb3a8973c8c9a97539c734b3a309345236cd533c4883dda05b8d", - "sha256:7c7c0d0827e853315c9bbd43c1162c006dd808dbbe297db7ae66cd17b07830f0", - "sha256:7ed681b0f8e8bcbbffa58ba26fcf5dbc8f79e7997595bf071ed5430d8c08d6f3", - "sha256:7ee5c9bb51695f80878faaa5598040dd6c9e172ddcf490382e8aedb8ec3fec8d", - "sha256:8361be1c2c073919500b6601220a6f2f98ea0b6d2fec5014c1d9cfa23dd07038", - "sha256:8ae125d1134bf236acba8b83e74c603d1b30e207266121e76484562bc816344c", - "sha256:9817733f0d3ea91bea80de0f79ef971ae94f81ca52f9b66500c6a2fea8e4b4f8", - "sha256:98b85dd86514d889a2e3dd22ab3c18c9d0019e696478391d86708b805f4ea0fa", - "sha256:9ccb092c9ede70b2517a57382a601619d20981f56f440eae7e4d7eaafd1d1d09", - "sha256:9d58885215094ab4a86a6aef044e42994a2bd76a446dc59b352622655ba6621b", - "sha256:b643cb30821e7570c0aaf54feaf0bfb630b79059f85741843e9dc23f33aaca2c", - "sha256:bc7c85a150501286f8b56bd8ed3aa4093f4b88fb68c0843d21ff9656f0009d6a", - "sha256:beeb129cacea34490ffd4d6153af70509aa3cda20fdda2ea1a2be870dfec8d52", - "sha256:c31b75ae466c053a98bf26843563b3b3517b8f37da4d47b1c582fdc703112bc3", - "sha256:c4e4881fa9e9667afcc742f0c244d9364d197490fbc91d12ac3b5de0bf2df146", - "sha256:c5b15ed7644ae4bee0ecf74fee95808dcc34ba6ace87e8dfbf5cb0dc20eab45a", - "sha256:d12d076582507ea460ea2a89a8c85cb558f83406c8a41dd641d7be9a32e1274f", - "sha256:d248cd4a92065a4d4543b8331660121b31c4148dd00a691bfb7a5cdc7483cfa4", - "sha256:d47dd659a4ee952e90dc56c97d78132573dc5c7b09d61b416a9deef4ebe01a0c", - "sha256:d4a5a5879a939cb84959d86869132b00176197ca561c664fc21478c1eee60d75", - "sha256:da9b41d4539eefd408c46725fb76ecba3a50a3367cafb7dea5f250d0653c1040", - "sha256:db61a79c07331e88b9a9974815c075fbd812bc9dbc4dc44b366b5368a2936063", - "sha256:ddb726cb861c3117a553f940372a495fe1078249ff5f8a5478c0576c7be12050", - "sha256:ded59300d6330be27bc6cf0b74b89ada58069ced87c48eaf9344e5e84b0072f7", - "sha256:e2617759031dae1bf183c16cef8fcfb3de7617f394c813fa5e8e46e9b82d4222", - "sha256:e5cdbb5cafcedea04924568d990e20ce7f1945a1dd54b560f879ee2d57226912", - "sha256:ec8e767f13be637d056f7e07e61d089e555f719b387a7070154ad80a0ff31801", - "sha256:ef382417db92ba23dfb5864a3fc9be27ea4894e86620d342a116b243ade5d35d", - "sha256:f2cba5c6db29ce991029b5e4ac51eb36774458f0a3b8d3137241b32d1bb91f06", - "sha256:f5b4198d85a3755d27e64c52f8c95d6333119e49fd001ae5798dac872c95e0f8", - "sha256:ffeeb38ee4a80a30a6877c5c4c359e5498eec095878f1581453202bfacc8fbc2" - ], - "version": "==7.1.0" - }, - "docutils": { - "hashes": [ - "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125", - "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61" - ], - "version": "==0.17.1" - }, "epicscorelibs": { "hashes": [ "sha256:105eedc19f4e5863851c132725ddcb2c62c16efaa586e98ae711f576cbf01dd6", @@ -183,116 +81,6 @@ ], "version": "==1.5" }, - "exceptiongroup": { - "hashes": [ - "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e", - "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23" - ], - "markers": "python_version < '3.11'", - "version": "==1.1.0" - }, - "flake8": { - "hashes": [ - "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d", - "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d" - ], - "version": "==4.0.1" - }, - "idna": { - "hashes": [ - "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", - "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" - ], - "version": "==3.4" - }, - "imagesize": { - "hashes": [ - "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", - "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a" - ], - "version": "==1.4.1" - }, - "importlib-metadata": { - "hashes": [ - "sha256:8c501196e49fb9df5df43833bdb1e4328f64847763ec8a50703148b73784d581", - "sha256:d7eb1dea6d6a6086f8be21784cc9e3bcfa55872b52309bc5fad53a8ea444465d" - ], - "markers": "python_version < '3.8'", - "version": "==4.0.1" - }, - "iniconfig": { - "hashes": [ - "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", - "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" - ], - "version": "==2.0.0" - }, - "jinja2": { - "hashes": [ - "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", - "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" - ], - "version": "==3.1.2" - }, - "markupsafe": { - "hashes": [ - "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003", - "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88", - "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5", - "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7", - "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a", - "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603", - "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1", - "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135", - "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247", - "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6", - "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601", - "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77", - "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02", - "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e", - "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63", - "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f", - "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980", - "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b", - "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812", - "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff", - "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96", - "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1", - "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925", - "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a", - "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6", - "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e", - "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f", - "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4", - "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f", - "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3", - "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c", - "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a", - "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417", - "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a", - "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a", - "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37", - "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452", - "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933", - "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a", - "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7" - ], - "version": "==2.1.1" - }, - "mccabe": { - "hashes": [ - "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", - "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" - ], - "version": "==0.6.1" - }, - "nose2": { - "hashes": [ - "sha256:956e79b9bd558ee08b6200c05ad2c76465b7e3860c0c0537686089285c320113", - "sha256:da7eb5e3cbe2abb693a053e17b4fbefca98ea9ea79fc729b0b0f41e8b4196304" - ], - "version": "==0.12.0" - }, "numpy": { "hashes": [ "sha256:1dbe1c91269f880e364526649a52eff93ac30035507ae980d2fed33aaee633ac", @@ -329,160 +117,40 @@ ], "version": "==1.21.6" }, - "p4p": { - "hashes": [ - "sha256:06bcd97052bd8d2a103a2799ed6eabe5e666441b51d93c93e933cbc716f136e5", - "sha256:0876f1ec9c14cb090ad0b6bb9bcc591087ad70940a61e168f9389d8d8535d802", - "sha256:0adb9df0ffb50dc9c61068000cc6a4c7f5aa649f288ab4eb908a7f09f7754de7", - "sha256:264603c5c1635cb499ba7c16095dc171ca2e38a4b98f9c955d9f3507e5b646c1", - "sha256:34467b3ba8e93a422f4a8895c343bd6226c9bd14f3d35b829271fadc265a743c", - "sha256:43ae3e430b4bb0c2980846d9c81a0259e78439a5cc79bba59bea14e636292e78", - "sha256:4498bf14d44d416f034c8333ab51acf7799c4dfd35320f729d6ec8d941eb2de0", - "sha256:4abd1e8c01afb46c18dbd251b4f5085f970c9d84b01953bc8ffa3a4c1e0650c1", - "sha256:4d8221f66715c3c187c9685441b0815553c4f0c8e7fb30851130bec7645f318d", - "sha256:5a23b45cac2be75f1d117fb3a36881770c548293af6121cefd0197c34973d9bc", - "sha256:5d9a4003effddac2613ecaddf89fe81720ff1040e79c9fb0ee70ae8cea19c9da", - "sha256:66609b3ef10ec5255f9c6cf6fd1520550132e70e712244f9d4857ff3c8d95a1c", - "sha256:6e3f4c86c326f2ebc4c30f93bf39087885ce0a385c10c95083689a512e4fa130", - "sha256:8215602e636e6192c53a60fb07758f2bd3b3b153c23b8853d5f714deccf25ac7", - "sha256:84414b0e5732e4f71d42aae44984117e11c1447aaf768394cbbcef748aaceb74", - "sha256:8cd4f226ff14afb5b628b38e92db4614ead8109a229acf5119bc76279f5e21bf", - "sha256:956bd0fcfb28ff457af43b34ee510cb678ae1a4263fe2477480bf52da8b815e6", - "sha256:960e36ee030cee04974eaa8c431a788bdce6e57fb152a784915cd8a249e1c5fb", - "sha256:962a53b264302c362f8f21c1d9a0867bf8f6f9674fdd5b7f013f5c01dc73e571", - "sha256:a2f1148862a8033d65440b16889659caccdd56d710a0ce4bff327ff3e952479d", - "sha256:a71007e4afbf35869db5c022718f734ae3ae73350a0fb1dc0284b9da2e1db718", - "sha256:ad0fe2984e658c29f40ab482634489e085a47c39ffd3953240d752f669aaa003", - "sha256:ca2d9c4a5146d606c9dc3acb84f87eb393bf0096e641b0410cfedcd40149bc3c", - "sha256:d2237ef55eff70e1c70a1035edc9c9bba62237164a7880f72a0e87f612ca710f", - "sha256:d8af244a0c90289612b612670c558b0fb5b3f88a2e7cb29b7bdbd9d8e9e188e3", - "sha256:e8bb2cf38c229c6fbd464ece734e577c1d178dd4873865898b3de6b99232ca17", - "sha256:ef7b31ec7f9cdd19825622907b726e4f47d6b25559b687545b4a53bd91fc87ed", - "sha256:f4bc441b19c5a36896b52215a201aa18875f991d658dc0b30edffece3beaf9cb", - "sha256:f96e255c89f6426c29856bd0e4b22d2294fa7eec3ece91be05cb8e453bac13eb", - "sha256:fa0ef3c7f9c4df4b739a42e5b2edddffac9f10127bd501f5d29546f26f9016f2", - "sha256:fccf95d33e985e12a04dc2461a56700401ddb76b6851311df5f19419fd951d54" - ], - "version": "==4.1.7" - }, - "packaging": { - "hashes": [ - "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2", - "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97" - ], - "version": "==23.0" - }, - "pluggy": { - "hashes": [ - "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159", - "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" - ], - "version": "==1.0.0" - }, - "ply": { - "hashes": [ - "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3", - "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce" - ], - "version": "==3.11" - }, "pvxslibs": { "hashes": [ - "sha256:0cbbde97491eb33d3d66827d5ac8583b802b25ef1110a02ac7be3b70fcfc7703", - "sha256:0cee6ea80a0f607f8fd841b33aa4012cb9ddcbe274f3cec813d18c4cc10685c5", - "sha256:187bfac9eb74bd26bfa6a4b67afbfcf16ee208a2f097db9dffa91682c69002b7", - "sha256:1c3060d03fa38fcf40ccdfe9ad4ad2c34d854332ae14e8044d9820eb85489b41", - "sha256:21e3c59afeec98b10eddf2852e88c36a3251000adc6e051d1b74ffc947cb5a8a", - "sha256:278d3836c9dd1bcbb72d2bf7b06bda995448922160f59a78dda964df544d151f", - "sha256:335ffff541b9db30364518bd51b69299c01ebc24275df02a17b51e7405015781", - "sha256:42c2a201464e46dd7e9853085df16640d8c0de4623470ff66fea1e9ae18a2d31", - "sha256:46b0c31aa8e47813dc409d58067acf637650cdcf2ed415cc2c3a8cecf8231e4d", - "sha256:4a08fbb6e7964e582acb9d032b4b4aaef0805461642f4d6bb71f3912d4a68f1c", - "sha256:7079ae13156c8d1c6e8b5ae743f935e577b8687ca11ffbed25b3175f20abfdea", - "sha256:70f6a37c8ab2cf6e7162a998db8e91413da174baeab4f9200ec21986259c9a16", - "sha256:72f4675606ecb78ce7112ae649c919c447bea426ab2c31f15cbee0b858675a9a", - "sha256:772472c4e76ba226b33671c346f5e0cbd5ab94183eae0f64ae4ef479cda51506", - "sha256:94af4f655a0478a5719dda375fd01d7f16f624f958b15176c1a6e283642f7c83", - "sha256:99d2af0e708c909baa6e0cd5fec9a09d86440958c8bde6f9f2bfadfe95f65252", - "sha256:a5f412e875d91b3cd38728b904ec95f34f2b0e4349a1701ec9c5f4a36a9e1356", - "sha256:b571eb4b3cccb7786c52a751bf6fff01557bc859a6986c45089d5a9b22cb0502", - "sha256:bbe7d1ba802297feb98d548ee4ad3eb37310d2e53be8d79f8ad8408aeb61de62", - "sha256:c1d18c672f675c1ad65ae5e599fe50f464c6cc68376b0d8f54ab56f5cd443585", - "sha256:d207a843d2a66306d6ecaf1f6a1ee72f427dde7774140ec24b1d348d2b5bd994", - "sha256:d5fc3fe402d2c56507c99313c7fb1943c75e527351e4ece01a72f24d50a4686e", - "sha256:dcf00ff43d9525a234f334c7198215dc8ebe606875dd48028fc7854a9e4e67b7", - "sha256:e5c63c32efe5d5761932d8c6b470109ae643de68cbcc0140819cd897a5e9e819", - "sha256:e5fd23ab330b2c6a2d9d63065b25ded40d18edfa85a7af0b3632ebb752e2ffd5", - "sha256:e85d0606165d2d15bfaabe1c4ea0aa586f584496230aeae2dd6d7185147a5c82", - "sha256:ebb1c038e27342a1bf6496921d6cc533badeb2c7281b2c2b029473a0a490346e", - "sha256:f0b29c6601d596a4259352cb20f5e5628cdefc87b12002261d2863edb12aac7d", - "sha256:f4147cfb53f3f395cdfe97629e6772706ce16f21e9fc52321324ded2c206c9dd", - "sha256:fe0ab32349a3894717663a700391a5b9ddc4ea0fd25e7c11534c534fd10b2336" - ], - "version": "==1.2.2" - }, - "pycodestyle": { - "hashes": [ - "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20", - "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f" - ], - "version": "==2.8.0" - }, - "pyflakes": { - "hashes": [ - "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c", - "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e" - ], - "version": "==2.4.0" - }, - "pygments": { - "hashes": [ - "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1", - "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42" - ], - "version": "==2.13.0" - }, - "pytest": { - "hashes": [ - "sha256:c7c6ca206e93355074ae32f7403e8ea12163b1163c976fee7d4d84027c162be5", - "sha256:d45e0952f3727241918b8fd0f376f5ff6b301cc0777c6f9a556935c92d8a7d42" - ], - "version": "==7.2.1" - }, - "pytest-asyncio": { - "hashes": [ - "sha256:6d895b02432c028e6957d25fc936494e78c6305736e785d9fee408b1efbc7ff4", - "sha256:e0fe5dbea40516b661ef1bcfe0bd9461c2847c4ef4bb40012324f2454fb7d56d" - ], - "version": "==0.17.2" - }, - "pytest-cov": { - "hashes": [ - "sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b", - "sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470" - ], - "version": "==4.0.0" - }, - "pytest-flake8": { - "hashes": [ - "sha256:ba4f243de3cb4c2486ed9e70752c80dd4b636f7ccb27d4eba763c35ed0cd316e", - "sha256:e0661a786f8cbf976c185f706fdaf5d6df0b1667c3bcff8e823ba263618627e7" - ], - "version": "==1.1.1" - }, - "pytest-mock": { - "hashes": [ - "sha256:30c2f2cc9759e76eee674b81ea28c9f0b94f8f0445a1b87762cadf774f0df7e3", - "sha256:40217a058c52a63f1042f0784f62009e976ba824c418cced42e88d5f40ab0e62" - ], - "version": "==3.6.1" - }, - "pytz": { - "hashes": [ - "sha256:2c0784747071402c6e99f0bafdb7da0fa22645f06554c7ae06bf6358897e9c91", - "sha256:48ce799d83b6f8aab2020e369b627446696619e79645419610b9facd909b3174" - ], - "version": "==2022.4" + "sha256:0290f0c59b30ccb81bb95ef1758bca767e7b2d33d0616515dedd6d77e229556e", + "sha256:0b93dc8f4f4df56c9695b43c915a8e7e400ff97a6e724a2a14ad62fc9ffeb3e7", + "sha256:0d2655ee3341dce1000977ed005b991609df9e60959f98ae95c3fb863597f540", + "sha256:19ce08ed5be7d13f906da3cc1acfe0e3d1d84eb8c7aa35e9736de7f16085374a", + "sha256:1b0bb350b1ade4c357e66f6f3305a372f4a789e020cb8b2b924867a1c8a23a60", + "sha256:2ba3cf405530b0f12345286f31b3fe406772dfd5032a5b8598855b8793b96be3", + "sha256:3330431d9c87eef3604a41fe5162e52a21125ebf0dd3d6c38e17f6e621ae93d7", + "sha256:389543f604b9530192ac48287b8fa64c97eecf3e36856ac697b34402502fdcdd", + "sha256:4091b9505fdfca177edb857cec741a796a156f81825875bd344c991a1ea53325", + "sha256:5116421b48e544d3f5ea0d2ea844e16c2c39584856408f67140ad624dba56051", + "sha256:524a7692c78a99a87349336e785aa640973cbc6d464ef057919b112e87bce09e", + "sha256:5a00f7071853b878a0c30d2c532e487e6d93fd851c1f7f99e5d57de699232cb3", + "sha256:5b308f70427f47bf8bc54ac80646c5d52aef7156a097094916cefa79c9fc4e42", + "sha256:69cada5cb1a1ef7a9ebd0d3b9c96784049390005fa63aa137bbe6b7cc2391e45", + "sha256:6dfd0b67723019c6dff3d091a2d0b59fba50ef5255452f7f3830c2b88b67e0c4", + "sha256:6e3a54eaee71b4717a59d1339a81c1cbd9eb49a47b37b45618195739f48c142c", + "sha256:7a8d7840bd45a000a6c914ab84f861c7120dec5cb1c017babb15f16fdb7db04e", + "sha256:98564812f0efb7594e796acd79ea010a05e08ae01e8ea90039cd61e80b657710", + "sha256:9efd8c874e4c15e8bd962c93c24f9def72de868c466801f47d113bc6680b0e14", + "sha256:9f37b4a185a23fd4faa62103ff66d035f4d8af2a851b3bb5648a32513d4e5ffb", + "sha256:a7d1fa9cafa2609e4c2f8c77c04d02993ab4b11152e2418d82cc8a1193dbd9b5", + "sha256:b5034c0e8069069a54d98bb04d2ecfdb9dba5ad0ba5ab2b9829bd0905a28e982", + "sha256:c53ffb8b17f2c17a69f45ed6f4b3b774b3e309f2ac2c5f5514dc119a176459d2", + "sha256:c7019e5dac7c552747c41d34d39a1bd016d2cc5892f139c37693638436e19b11", + "sha256:cdbc4a4dc6183cafa3ed2dafeec7101bea6a5a592bea1a168bf7ec1018b4b9ce", + "sha256:d7c35e6775a161d0689936bfe54e07de11b6e9b4843a9747137983bdc6e8bd4c", + "sha256:d94e1744f693284bbf3a7c8bf1291e71cd0fefb843b53fd2164ebccae34d2a51", + "sha256:e5445c9bcd6b0f7addfc9500ad98bb86efb4b33b76e9f984bed3142cfa171fa5", + "sha256:f908811a23fd190b02341a197411d24ea767b643ccd48d14bbeae6e47c9a2adf", + "sha256:fa08d2d1f09c40cda091c540f3be0b4c6d064abd0c1bf0b97a3585f6d933551e" + ], + "version": "==1.3.1" }, "pyyaml": { "hashes": [ @@ -527,14 +195,32 @@ "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174", "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5" ], + "index": "pypi", "version": "==6.0" }, - "requests": { - "hashes": [ - "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983", - "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349" - ], - "version": "==2.28.1" + "scipy": { + "hashes": [ + "sha256:01b38dec7e9f897d4db04f8de4e20f0f5be3feac98468188a0f47a991b796055", + "sha256:10dbcc7de03b8d635a1031cb18fd3eaa997969b64fdf78f99f19ac163a825445", + "sha256:19aeac1ad3e57338723f4657ac8520f41714804568f2e30bd547d684d72c392e", + "sha256:1b21c6e0dc97b1762590b70dee0daddb291271be0580384d39f02c480b78290a", + "sha256:1caade0ede6967cc675e235c41451f9fb89ae34319ddf4740194094ab736b88d", + "sha256:23995dfcf269ec3735e5a8c80cfceaf384369a47699df111a6246b83a55da582", + "sha256:2a799714bf1f791fb2650d73222b248d18d53fd40d6af2df2c898db048189606", + "sha256:3274ce145b5dc416c49c0cf8b6119f787f0965cd35e22058fe1932c09fe15d77", + "sha256:33d1677d46111cfa1c84b87472a0274dde9ef4a7ef2e1f155f012f5f1e995d8f", + "sha256:44d452850f77e65e25b1eb1ac01e25770323a782bfe3a1a3e43847ad4266d93d", + "sha256:9e3302149a369697c6aaea18b430b216e3c88f9a61b62869f6104881e5f9ef85", + "sha256:a75b014d3294fce26852a9d04ea27b5671d86736beb34acdfc05859246260707", + "sha256:ad7269254de06743fb4768f658753de47d8b54e4672c5ebe8612a007a088bd48", + "sha256:b30280fbc1fd8082ac822994a98632111810311a9ece71a0e48f739df3c555a2", + "sha256:b79104878003487e2b4639a20b9092b02e1bad07fc4cf924b495cf413748a777", + "sha256:d449d40e830366b4c612692ad19fbebb722b6b847f78a7b701b1e0d6cda3cc13", + "sha256:d647757373985207af3343301d89fe738d5a294435a4f2aafb04c13b4388c896", + "sha256:f68eb46b86b2c246af99fcaa6f6e37c7a7a413e1084a794990b877f2ff71f7b6", + "sha256:fdf606341cd798530b05705c87779606fcdfaf768a8129c348ea94441da15b04" + ], + "version": "==1.6.3" }, "setuptools-dso": { "hashes": [ @@ -543,111 +229,19 @@ ], "version": "==2.10" }, - "snowballstemmer": { - "hashes": [ - "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", - "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" - ], - "version": "==2.2.0" - }, "softioc": { "editable": true, "extras": [ - "dev" + "useful" ], "path": "." }, - "sphinx": { - "hashes": [ - "sha256:0a8836751a68306b3fe97ecbe44db786f8479c3bf4b80e3a7f5c838657b4698c", - "sha256:6a11ea5dd0bdb197f9c2abc2e0ce73e01340464feaece525e64036546d24c851" - ], - "version": "==4.3.2" - }, - "sphinx-rtd-theme": { - "hashes": [ - "sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8", - "sha256:eec6d497e4c2195fa0e8b2016b337532b8a699a68bcb22a512870e16925c6a5c" - ], - "version": "==1.0.0" - }, - "sphinx-rtd-theme-github-versions": { - "hashes": [ - "sha256:0df27ae9a9cd902468c808dbee5a43f4db8ce43cbcf2ecc78d2fe47698bb0ded", - "sha256:23018e51a5d27ef4f69dd86314f73b19088f2cfd91c74a24db1517832233dc07" - ], - "version": "==1.1" - }, - "sphinxcontrib-applehelp": { - "hashes": [ - "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a", - "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58" - ], - "version": "==1.0.2" - }, - "sphinxcontrib-devhelp": { - "hashes": [ - "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e", - "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4" - ], - "version": "==1.0.2" - }, - "sphinxcontrib-htmlhelp": { - "hashes": [ - "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07", - "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2" - ], - "version": "==2.0.0" - }, - "sphinxcontrib-jsmath": { - "hashes": [ - "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", - "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" - ], - "version": "==1.0.1" - }, - "sphinxcontrib-qthelp": { - "hashes": [ - "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72", - "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6" - ], - "version": "==1.0.3" - }, - "sphinxcontrib-serializinghtml": { - "hashes": [ - "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd", - "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952" - ], - "version": "==1.1.5" - }, - "tomli": { - "hashes": [ - "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", - "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" - ], - "version": "==2.0.1" - }, "typing-extensions": { "hashes": [ "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb", "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4" ], - "markers": "python_version < '3.8'", "version": "==4.5.0" - }, - "urllib3": { - "hashes": [ - "sha256:24d6a242c28d29af46c3fae832c36db3bbebcc533dd1bb549172cd739c82df21", - "sha256:94a757d178c9be92ef5539b8840d48dc9cf1b2709c9d6b588232a055c524458b" - ], - "version": "==1.26.17" - }, - "zipp": { - "hashes": [ - "sha256:23f70e964bc11a34cef175bc90ba2914e1e4545ea1e3e2f67c079671883f9cb6", - "sha256:e8b2a36ea17df80ffe9e2c4fda3f693c3dad6df1697d3cd3af232db680950b0b" - ], - "version": "==3.13.0" } }, "develop": { @@ -709,7 +303,6 @@ "sha256:f0f57697eee1b87cf2bad4683e0deda5b3fe4505400084369274393999fcc3d0", "sha256:fb12d99088ce073412fb0f84930d2b08a134ba4eeb441d3beac1fe62b2e5f9e5" ], - "markers": "sys_platform != 'win32'", "version": "==2.19.1" }, "coverage": { @@ -1025,38 +618,38 @@ }, "pvxslibs": { "hashes": [ - "sha256:0cbbde97491eb33d3d66827d5ac8583b802b25ef1110a02ac7be3b70fcfc7703", - "sha256:0cee6ea80a0f607f8fd841b33aa4012cb9ddcbe274f3cec813d18c4cc10685c5", - "sha256:187bfac9eb74bd26bfa6a4b67afbfcf16ee208a2f097db9dffa91682c69002b7", - "sha256:1c3060d03fa38fcf40ccdfe9ad4ad2c34d854332ae14e8044d9820eb85489b41", - "sha256:21e3c59afeec98b10eddf2852e88c36a3251000adc6e051d1b74ffc947cb5a8a", - "sha256:278d3836c9dd1bcbb72d2bf7b06bda995448922160f59a78dda964df544d151f", - "sha256:335ffff541b9db30364518bd51b69299c01ebc24275df02a17b51e7405015781", - "sha256:42c2a201464e46dd7e9853085df16640d8c0de4623470ff66fea1e9ae18a2d31", - "sha256:46b0c31aa8e47813dc409d58067acf637650cdcf2ed415cc2c3a8cecf8231e4d", - "sha256:4a08fbb6e7964e582acb9d032b4b4aaef0805461642f4d6bb71f3912d4a68f1c", - "sha256:7079ae13156c8d1c6e8b5ae743f935e577b8687ca11ffbed25b3175f20abfdea", - "sha256:70f6a37c8ab2cf6e7162a998db8e91413da174baeab4f9200ec21986259c9a16", - "sha256:72f4675606ecb78ce7112ae649c919c447bea426ab2c31f15cbee0b858675a9a", - "sha256:772472c4e76ba226b33671c346f5e0cbd5ab94183eae0f64ae4ef479cda51506", - "sha256:94af4f655a0478a5719dda375fd01d7f16f624f958b15176c1a6e283642f7c83", - "sha256:99d2af0e708c909baa6e0cd5fec9a09d86440958c8bde6f9f2bfadfe95f65252", - "sha256:a5f412e875d91b3cd38728b904ec95f34f2b0e4349a1701ec9c5f4a36a9e1356", - "sha256:b571eb4b3cccb7786c52a751bf6fff01557bc859a6986c45089d5a9b22cb0502", - "sha256:bbe7d1ba802297feb98d548ee4ad3eb37310d2e53be8d79f8ad8408aeb61de62", - "sha256:c1d18c672f675c1ad65ae5e599fe50f464c6cc68376b0d8f54ab56f5cd443585", - "sha256:d207a843d2a66306d6ecaf1f6a1ee72f427dde7774140ec24b1d348d2b5bd994", - "sha256:d5fc3fe402d2c56507c99313c7fb1943c75e527351e4ece01a72f24d50a4686e", - "sha256:dcf00ff43d9525a234f334c7198215dc8ebe606875dd48028fc7854a9e4e67b7", - "sha256:e5c63c32efe5d5761932d8c6b470109ae643de68cbcc0140819cd897a5e9e819", - "sha256:e5fd23ab330b2c6a2d9d63065b25ded40d18edfa85a7af0b3632ebb752e2ffd5", - "sha256:e85d0606165d2d15bfaabe1c4ea0aa586f584496230aeae2dd6d7185147a5c82", - "sha256:ebb1c038e27342a1bf6496921d6cc533badeb2c7281b2c2b029473a0a490346e", - "sha256:f0b29c6601d596a4259352cb20f5e5628cdefc87b12002261d2863edb12aac7d", - "sha256:f4147cfb53f3f395cdfe97629e6772706ce16f21e9fc52321324ded2c206c9dd", - "sha256:fe0ab32349a3894717663a700391a5b9ddc4ea0fd25e7c11534c534fd10b2336" - ], - "version": "==1.2.2" + "sha256:0290f0c59b30ccb81bb95ef1758bca767e7b2d33d0616515dedd6d77e229556e", + "sha256:0b93dc8f4f4df56c9695b43c915a8e7e400ff97a6e724a2a14ad62fc9ffeb3e7", + "sha256:0d2655ee3341dce1000977ed005b991609df9e60959f98ae95c3fb863597f540", + "sha256:19ce08ed5be7d13f906da3cc1acfe0e3d1d84eb8c7aa35e9736de7f16085374a", + "sha256:1b0bb350b1ade4c357e66f6f3305a372f4a789e020cb8b2b924867a1c8a23a60", + "sha256:2ba3cf405530b0f12345286f31b3fe406772dfd5032a5b8598855b8793b96be3", + "sha256:3330431d9c87eef3604a41fe5162e52a21125ebf0dd3d6c38e17f6e621ae93d7", + "sha256:389543f604b9530192ac48287b8fa64c97eecf3e36856ac697b34402502fdcdd", + "sha256:4091b9505fdfca177edb857cec741a796a156f81825875bd344c991a1ea53325", + "sha256:5116421b48e544d3f5ea0d2ea844e16c2c39584856408f67140ad624dba56051", + "sha256:524a7692c78a99a87349336e785aa640973cbc6d464ef057919b112e87bce09e", + "sha256:5a00f7071853b878a0c30d2c532e487e6d93fd851c1f7f99e5d57de699232cb3", + "sha256:5b308f70427f47bf8bc54ac80646c5d52aef7156a097094916cefa79c9fc4e42", + "sha256:69cada5cb1a1ef7a9ebd0d3b9c96784049390005fa63aa137bbe6b7cc2391e45", + "sha256:6dfd0b67723019c6dff3d091a2d0b59fba50ef5255452f7f3830c2b88b67e0c4", + "sha256:6e3a54eaee71b4717a59d1339a81c1cbd9eb49a47b37b45618195739f48c142c", + "sha256:7a8d7840bd45a000a6c914ab84f861c7120dec5cb1c017babb15f16fdb7db04e", + "sha256:98564812f0efb7594e796acd79ea010a05e08ae01e8ea90039cd61e80b657710", + "sha256:9efd8c874e4c15e8bd962c93c24f9def72de868c466801f47d113bc6680b0e14", + "sha256:9f37b4a185a23fd4faa62103ff66d035f4d8af2a851b3bb5648a32513d4e5ffb", + "sha256:a7d1fa9cafa2609e4c2f8c77c04d02993ab4b11152e2418d82cc8a1193dbd9b5", + "sha256:b5034c0e8069069a54d98bb04d2ecfdb9dba5ad0ba5ab2b9829bd0905a28e982", + "sha256:c53ffb8b17f2c17a69f45ed6f4b3b774b3e309f2ac2c5f5514dc119a176459d2", + "sha256:c7019e5dac7c552747c41d34d39a1bd016d2cc5892f139c37693638436e19b11", + "sha256:cdbc4a4dc6183cafa3ed2dafeec7101bea6a5a592bea1a168bf7ec1018b4b9ce", + "sha256:d7c35e6775a161d0689936bfe54e07de11b6e9b4843a9747137983bdc6e8bd4c", + "sha256:d94e1744f693284bbf3a7c8bf1291e71cd0fefb843b53fd2164ebccae34d2a51", + "sha256:e5445c9bcd6b0f7addfc9500ad98bb86efb4b33b76e9f984bed3142cfa171fa5", + "sha256:f908811a23fd190b02341a197411d24ea767b643ccd48d14bbeae6e47c9a2adf", + "sha256:fa08d2d1f09c40cda091c540f3be0b4c6d064abd0c1bf0b97a3585f6d933551e" + ], + "version": "==1.3.1" }, "pycodestyle": { "hashes": [ @@ -1107,13 +700,6 @@ ], "version": "==1.1.1" }, - "pytest-mock": { - "hashes": [ - "sha256:30c2f2cc9759e76eee674b81ea28c9f0b94f8f0445a1b87762cadf774f0df7e3", - "sha256:40217a058c52a63f1042f0784f62009e976ba824c418cced42e88d5f40ab0e62" - ], - "version": "==3.6.1" - }, "pytz": { "hashes": [ "sha256:2c0784747071402c6e99f0bafdb7da0fa22645f06554c7ae06bf6358897e9c91", @@ -1164,6 +750,7 @@ "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174", "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5" ], + "index": "pypi", "version": "==6.0" }, "requests": { @@ -1190,7 +777,7 @@ "softioc": { "editable": true, "extras": [ - "dev" + "useful" ], "path": "." }, @@ -1269,7 +856,6 @@ "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb", "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4" ], - "markers": "python_version < '3.8'", "version": "==4.5.0" }, "urllib3": { diff --git a/setup.cfg b/setup.cfg index f76dc749..5bf9577e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -45,7 +45,6 @@ useful = aioca >=1.6 # Dev and docs dependencies dev = - pytest-mock pytest-cov pytest-flake8 # Flake8 5.0 starts printing error, so pin to avoid it: diff --git a/softioc/autosave.py b/softioc/autosave.py index dbcfee8c..cb32fb66 100644 --- a/softioc/autosave.py +++ b/softioc/autosave.py @@ -3,13 +3,12 @@ import threading import traceback from datetime import datetime +from os import rename from pathlib import Path +from shutil import copy2 import numpy import yaml -from numpy import ndarray -from os import rename -from shutil import copy2 SAV_SUFFIX = "softsav" SAVB_SUFFIX = "softsavB" @@ -28,8 +27,8 @@ def configure(directory, name, save_period=None, backup=True, enabled=True): Args: directory: string or Path giving directory path where autosave backup files are saved and loaded. - nane: string name of the root used for naming backup files, this - could be the same as the device prefix. + name: string name of the root used for naming backup files, this + is usually the same as the device prefix. save_period: time in seconds between backups. Backups are only performed if PV values have changed. backup: creates a backup of the loaded autosave file on load, @@ -59,14 +58,26 @@ def _shutdown_autosave_thread(autosaver, worker): worker.join() -def add_pv_to_autosave(pv, name, val, fields): - if val: +def add_pv_to_autosave(pv, name, save_val, save_fields): + """Configures a PV for autosave + + Args: + pv: a PV object inheriting ProcessDeviceSupportCore + name: the name of the PV which is used to generate the key + by which the PV value is saved to and loaded from a backup, + this is typically the signal name without the device prefix + save_val: a boolean that tracks whether to save the VAL field + in an autosave backup + save_fields: a list of string names of fields associated with the pv + to be saved to and loaded from a backup + """ + if save_val: Autosave._pvs[name] = _AutosavePV(pv) - for field in fields: + for field in save_fields: Autosave._pvs[f"{name}.{field}"] = _AutosavePV(pv, field) -def load(): +def load_autosave(): Autosave._load() @@ -89,16 +100,18 @@ class Autosave: device_name = None directory = None enabled = False - backup_on_load = True + backup_on_load = False def __init__(self): if not self.enabled: return - yaml.add_representer(ndarray, _ndarray_representer, Dumper=yaml.Dumper) + yaml.add_representer( + numpy.ndarray, _ndarray_representer, Dumper=yaml.Dumper + ) if not self.device_name: raise RuntimeError( "Device name is not known to autosave thread, " - "call autosave.configure() with keyword argument device" + "call autosave.configure() with keyword argument name" ) if not self.directory: raise RuntimeError( @@ -114,14 +127,21 @@ def __init__(self): @classmethod def _backup_sav_file(cls): + if not cls.directory and cls.directory.is_dir(): + print( + f"Could not back up autosave as {cls.directory} is" + " not a valid directory", + file=sys.stderr, + ) + return sav_path = cls._get_current_sav_path() if sav_path.is_file(): copy2(sav_path, cls._get_timestamped_backup_sav_path()) else: - sys.stderr.write( - f"Could not back up autosave, {sav_path} is not a file\n" + print( + f"Could not back up autosave, {sav_path} is not a file", + file=sys.stderr, ) - sys.stderr.flush() @classmethod def _get_timestamped_backup_sav_path(cls): @@ -143,9 +163,9 @@ def _get_state(self): for pv_field, pv in self._pvs.items(): try: state[pv_field] = pv.get() - except Exception as e: - sys.stderr.write(f"Exception getting {pv_field}: {e}\n") - sys.stderr.flush() + except Exception: + print(f"Exception getting {pv_field}", file=sys.stderr) + traceback.print_exc() return state @classmethod @@ -154,11 +174,13 @@ def _set_pvs_from_saved_state(cls): try: pv = cls._pvs[pv_field] pv.set(value) - except Exception as e: - sys.stderr.write( - f"Exception setting {pv_field} to {value}: {e}\n" + except Exception: + print( + f"Exception setting {pv_field} to {value}", + file=sys.stderr, ) - sys.stderr.flush() + traceback.print_exc() + def _state_changed(self, state): return self._last_saved_state.keys() != state.keys() or any( @@ -182,16 +204,16 @@ def _save(self): @classmethod def _load(cls, path=None): - if cls.backup_on_load: - cls._backup_sav_file() if not cls.enabled or not cls._pvs: return + if cls.backup_on_load: + cls._backup_sav_file() sav_path = path or cls._get_current_sav_path() if not sav_path or not sav_path.is_file(): - sys.stderr.write( - f"Could not load autosave values from file {sav_path}\n" + print( + f"Could not load autosave values from file {sav_path}", + file=sys.stderr, ) - sys.stderr.flush() return with open(sav_path, "r") as f: cls._last_saved_state = yaml.full_load(f) diff --git a/softioc/builder.py b/softioc/builder.py index 3bad5802..bcbd21d3 100644 --- a/softioc/builder.py +++ b/softioc/builder.py @@ -3,9 +3,9 @@ from .device_core import RecordLookup from .softioc import dbLoadDatabase +from .autosave import load_autosave from epicsdbbuilder import * -from . import autosave InitialiseDbd() LoadDbdFile(os.path.join(os.path.dirname(__file__), 'device.dbd')) @@ -300,7 +300,7 @@ def LoadDatabase(): '''This should be called after all the builder records have been created, but before calling iocInit(). The database is loaded into EPICS memory, ready for operation.''' - autosave.load() + load_autosave() from tempfile import mkstemp fd, database = mkstemp('.db') os.close(fd) diff --git a/tests/test_autosave.py b/tests/test_autosave.py index 02e02b21..c44db1d5 100644 --- a/tests/test_autosave.py +++ b/tests/test_autosave.py @@ -1,5 +1,6 @@ from softioc import autosave, builder from pathlib import Path +from unittest.mock import patch import pytest import threading import shutil @@ -33,29 +34,18 @@ def reset_autosave_setup_teardown(): @pytest.fixture -def autosave_dir(): - autosave_dir = Path("/tmp/autosave") - autosave_dir.mkdir(parents=True, exist_ok=True) - yield autosave_dir - shutil.rmtree(autosave_dir, ignore_errors=True) - - -@pytest.fixture -def existing_autosave_dir(): - dir = Path("/tmp/dummy-autosave") - dir.mkdir(parents=True, exist_ok=True) +def existing_autosave_dir(tmp_path): state = {"ALREADYSAVED": 20.0} - with open(dir / f"{DEVICE_NAME}.softsav", "w") as f: + with open(tmp_path / f"{DEVICE_NAME}.softsav", "w") as f: yaml.dump(state, f, indent=4) - yield dir - shutil.rmtree(dir, ignore_errors=True) + return tmp_path -def test_configure(autosave_dir): - assert autosave.Autosave.enabled is False # this is problematic, gets reset - autosave.configure(autosave_dir, DEVICE_NAME) +def test_configure(tmp_path): + assert autosave.Autosave.enabled is False + autosave.configure(tmp_path, DEVICE_NAME) assert autosave.Autosave.device_name == DEVICE_NAME - assert autosave.Autosave.directory == autosave_dir + assert autosave.Autosave.directory == tmp_path assert autosave.Autosave.enabled is True @@ -68,14 +58,12 @@ def test_autosave_defaults(): assert autosave.Autosave.device_name is None assert autosave.Autosave.directory is None assert autosave.Autosave.enabled is False - assert autosave.Autosave.backup_on_load is True + assert autosave.Autosave.backup_on_load is False -def test_configure_dir_doesnt_exist(): - autosave_dir = Path("/tmp/autosave-doesnt-exist") - shutil.rmtree(autosave_dir, ignore_errors=True) +def test_configure_dir_doesnt_exist(tmp_path): DEVICE_NAME = "MY_DEVICE" - autosave.configure(autosave_dir, DEVICE_NAME) + autosave.configure(tmp_path / "subdir-doesnt-exist", DEVICE_NAME) with pytest.raises(FileNotFoundError): autosave.Autosave() @@ -85,9 +73,9 @@ def test_returns_if_init_called_before_configure(): assert autosave.Autosave.enabled is False -def test_all_record_types_saveable(autosave_dir): +def test_all_record_types_saveable(tmp_path): builder.SetDeviceName(DEVICE_NAME) - autosave.configure(autosave_dir, DEVICE_NAME) + autosave.configure(tmp_path, DEVICE_NAME) number_types = ["aIn", "aOut", "boolIn", "boolOut", "longIn", "longOut", "int64In", "int64Out", "mbbIn", "mbbOut", "Action"] @@ -103,50 +91,52 @@ def test_all_record_types_saveable(autosave_dir): autosaver = autosave.Autosave() autosaver._save() - with open(autosave_dir / f"{DEVICE_NAME}.softsav", "r") as f: + with open(tmp_path / f"{DEVICE_NAME}.softsav", "r") as f: saved = yaml.full_load(f) for pv_type in number_types + string_types + waveform_types: assert pv_type in saved -def test_can_save_fields(mocker, autosave_dir): +def test_can_save_fields(tmp_path): builder.SetDeviceName(DEVICE_NAME) builder.aOut("SAVEVAL", autosave=True, autosave_fields=["DISA"]) builder.aOut("DONTSAVEVAL", autosave_fields=["SCAN"]) - mocker.patch( - 'softioc.device.ProcessDeviceSupportCore.get_field', return_value="0" - ) # we need to patch get_field as we can't call builder.LoadDatabase() # and softioc.iocInit() in unit tests - autosave.configure(autosave_dir, DEVICE_NAME) - autosaver = autosave.Autosave() - assert "SAVEVAL" in autosaver._pvs - assert "SAVEVAL.DISA" in autosaver._pvs - assert "DONTSAVEVAL" not in autosaver._pvs - assert "DONTSAVEVAL.SCAN" in autosaver._pvs - autosaver._save() - with open(autosave_dir / f"{DEVICE_NAME}.softsav", "r") as f: - saved = yaml.full_load(f) - assert "SAVEVAL" in saved - assert "SAVEVAL.DISA" in saved - assert "DONTSAVEVAL" not in saved - assert "DONTSAVEVAL.SCAN" in saved - - -def test_stop_event(autosave_dir): - autosave.configure(autosave_dir, DEVICE_NAME) + with patch( + "softioc.device.ProcessDeviceSupportCore.get_field", return_value="0" + ): + autosave.configure(tmp_path, DEVICE_NAME) + autosaver = autosave.Autosave() + assert "SAVEVAL" in autosaver._pvs + assert "SAVEVAL.DISA" in autosaver._pvs + assert "DONTSAVEVAL" not in autosaver._pvs + assert "DONTSAVEVAL.SCAN" in autosaver._pvs + autosaver._save() + with open(tmp_path / f"{DEVICE_NAME}.softsav", "r") as f: + saved = yaml.full_load(f) + assert "SAVEVAL" in saved + assert "SAVEVAL.DISA" in saved + assert "DONTSAVEVAL" not in saved + assert "DONTSAVEVAL.SCAN" in saved + + +def test_stop_event(tmp_path): + autosave.configure(tmp_path, DEVICE_NAME) builder.aOut("DUMMYRECORD", autosave=True) autosaver = autosave.Autosave() worker = threading.Thread( target=autosaver.loop, ) - worker.daemon = True - worker.start() - assert not autosaver._stop_event.is_set() - assert worker.is_alive() - autosaver.stop() - assert autosaver._stop_event.is_set() - worker.join(timeout=1) + try: + worker.daemon = True + worker.start() + assert not autosaver._stop_event.is_set() + assert worker.is_alive() + autosaver.stop() + assert autosaver._stop_event.is_set() + finally: + worker.join(timeout=1) def test_load_autosave(existing_autosave_dir): @@ -154,28 +144,33 @@ def test_load_autosave(existing_autosave_dir): autosave.configure(existing_autosave_dir, DEVICE_NAME, backup=False) pv = builder.aOut("ALREADYSAVED", autosave=True) assert pv.get() == 0.0 - autosave.load() + autosave.load_autosave() assert pv.get() == 20.0 + def test_backup_on_load(existing_autosave_dir): autosave.configure(existing_autosave_dir, DEVICE_NAME, backup=True) - autosave.load() + # backup only performed if there are any pvs to save + builder.aOut("ALREADYSAVED", autosave=True) + autosave.load_autosave() backup_files = list(existing_autosave_dir.glob("*.softsav_*")) assert len(backup_files) == 1 # assert backup file is named .softsave_yymmdd-HHMMSS for file in backup_files: - assert re.match(r"^" + DEVICE_NAME + r"\.softsav_[0-9]{6}-[0-9]{6}$", - file.name) + assert re.match( + r"^" + DEVICE_NAME + r"\.softsav_[0-9]{6}-[0-9]{6}$", file.name + ) + -def test_autosave_key_names(autosave_dir): +def test_autosave_key_names(tmp_path): builder.aOut("DEFAULTNAME", autosave=True) builder.SetDeviceName(DEVICE_NAME) builder.aOut("DEFAULTNAMEAFTERPREFIXSET", autosave=True) builder.aOut("RENAMEME", autosave=True, autosave_name="CUSTOMNAME") - autosave.configure(autosave_dir, DEVICE_NAME) + autosave.configure(tmp_path, DEVICE_NAME) autosaver = autosave.Autosave() autosaver._save() - with open(autosave_dir / f"{DEVICE_NAME}.softsav", "r") as f: + with open(tmp_path / f"{DEVICE_NAME}.softsav", "r") as f: saved = yaml.full_load(f) assert "DEFAULTNAME" in saved assert "DEFAULTNAMEAFTERPREFIXSET" in saved