From fac25085acfe82ccd4461e56f931ba2f9df9b12f Mon Sep 17 00:00:00 2001 From: James Souter Date: Wed, 10 Jul 2024 13:20:52 +0100 Subject: [PATCH] Add autosave units tests add pytest-mock to dev dependencies rename AutosavePV to _AutosavePV --- Pipfile.lock | 598 ++++++++++++++++++++++++++++++++++------- setup.cfg | 1 + softioc/autosave.py | 10 +- tests/test_autosave.py | 167 ++++++++++++ 4 files changed, 679 insertions(+), 97 deletions(-) create mode 100644 tests/test_autosave.py diff --git a/Pipfile.lock b/Pipfile.lock index a8382301..2755c182 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "0dc2ee4f16946e2652598d50c70ca9822672fbadaa49b968e2273f22a29554d7" + "sha256": "dde1a273489b708245f7c8cf8a1ec7d4df6e33b3813ca2dea01b9899d3f9037f" }, "pipfile-spec": 6, "requires": {}, @@ -21,6 +21,41 @@ ], "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", @@ -37,8 +72,75 @@ "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", @@ -81,6 +183,116 @@ ], "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", @@ -117,40 +329,160 @@ ], "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: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" + "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" }, "pyyaml": { "hashes": [ @@ -195,32 +527,14 @@ "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174", "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5" ], - "index": "pypi", "version": "==6.0" }, - "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" + "requests": { + "hashes": [ + "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983", + "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349" + ], + "version": "==2.28.1" }, "setuptools-dso": { "hashes": [ @@ -229,19 +543,111 @@ ], "version": "==2.10" }, + "snowballstemmer": { + "hashes": [ + "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", + "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" + ], + "version": "==2.2.0" + }, "softioc": { "editable": true, "extras": [ - "useful" + "dev" ], "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": { @@ -303,6 +709,7 @@ "sha256:f0f57697eee1b87cf2bad4683e0deda5b3fe4505400084369274393999fcc3d0", "sha256:fb12d99088ce073412fb0f84930d2b08a134ba4eeb441d3beac1fe62b2e5f9e5" ], + "markers": "sys_platform != 'win32'", "version": "==2.19.1" }, "coverage": { @@ -618,38 +1025,38 @@ }, "pvxslibs": { "hashes": [ - "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" + "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": [ @@ -700,6 +1107,13 @@ ], "version": "==1.1.1" }, + "pytest-mock": { + "hashes": [ + "sha256:30c2f2cc9759e76eee674b81ea28c9f0b94f8f0445a1b87762cadf774f0df7e3", + "sha256:40217a058c52a63f1042f0784f62009e976ba824c418cced42e88d5f40ab0e62" + ], + "version": "==3.6.1" + }, "pytz": { "hashes": [ "sha256:2c0784747071402c6e99f0bafdb7da0fa22645f06554c7ae06bf6358897e9c91", @@ -750,7 +1164,6 @@ "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174", "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5" ], - "index": "pypi", "version": "==6.0" }, "requests": { @@ -777,7 +1190,7 @@ "softioc": { "editable": true, "extras": [ - "useful" + "dev" ], "path": "." }, @@ -856,6 +1269,7 @@ "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb", "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4" ], + "markers": "python_version < '3.8'", "version": "==4.5.0" }, "urllib3": { diff --git a/setup.cfg b/setup.cfg index 5bf9577e..f76dc749 100644 --- a/setup.cfg +++ b/setup.cfg @@ -45,6 +45,7 @@ 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 be5f9869..d5301205 100644 --- a/softioc/autosave.py +++ b/softioc/autosave.py @@ -63,10 +63,10 @@ def _shutdown_autosave_thread(autosaver, worker): def add_pv_to_autosave(pv, name, field=None): - Autosave._pvs[name] = AutosavePV(pv, field) + Autosave._pvs[name] = _AutosavePV(pv, field) -class AutosavePV: +class _AutosavePV: def __init__(self, pv, field = None): if not field or field == "VAL": self.get = pv.get @@ -127,20 +127,20 @@ def _get_timestamped_backup_sav_path(self): sav_path.name + self._last_saved_time.strftime("_%y%m%d-%H%M%S") ) - def _get_backup_save_path(self): + def _get_backup_sav_path(self): return self.directory / f"{self.device_name}.{SAVB_SUFFIX}" def _get_current_sav_path(self): return self.directory / f"{self.device_name}.{SAV_SUFFIX}" def _get_state(self): - # state = {pv_field: pv.get() for pv_field, pv in self._pvs.items()} state = {} for pv_field, pv in self._pvs.items(): try: state[pv_field] = pv.get() except Exception as e: sys.stderr.write("Exception getting {pv_field}: {e}\n") + sys.stderr.write(f"Exception getting {pv_field}: {e}\n") sys.stderr.flush() return state @@ -161,7 +161,7 @@ def _save(self): if state != self._last_saved_state: for path in [ self._get_current_sav_path(), - self._get_backup_save_path() + self._get_backup_sav_path() ]: with open(path, "w") as f: yaml.dump(state, f, indent=4) diff --git a/tests/test_autosave.py b/tests/test_autosave.py new file mode 100644 index 00000000..a9f699cc --- /dev/null +++ b/tests/test_autosave.py @@ -0,0 +1,167 @@ +from softioc import autosave, builder +from pathlib import Path +import pytest +import threading +import shutil +import numpy +import yaml + +DEVICE_NAME = "MY-DEVICE" + + +@pytest.fixture(autouse=True) +def reset_autosave_setup_teardown(): + default_pvs = autosave.Autosave._pvs.copy() + default_state = autosave.Autosave._last_saved_state.copy() + default_save_period = autosave.Autosave.save_period + default_device_name = autosave.Autosave.device_name + default_directory = autosave.Autosave.directory + default_enabled = autosave.Autosave.enabled + default_bor = autosave.Autosave.backup_on_restart + yield + autosave.Autosave._pvs = default_pvs + autosave.Autosave._last_saved_state = default_state + autosave.Autosave._stop_event = threading.Event() + autosave.Autosave.save_period = default_save_period + autosave.Autosave.device_name = default_device_name + autosave.Autosave.directory = default_directory + autosave.Autosave.enabled = default_enabled + autosave.Autosave.backup_on_restart = default_bor + if builder.GetRecordNames().prefix: # reset device name to empty if set + builder.SetDeviceName("") + + +@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) + state = {f"{DEVICE_NAME}:ALREADYSAVED": 20.0} + with open(dir / f"{DEVICE_NAME}.softsav", "w") as f: + yaml.dump(state, f, indent=4) + yield dir + shutil.rmtree(dir, ignore_errors=True) + + +def test_configure(autosave_dir): + assert autosave.Autosave.enabled is False # this is problematic, gets reset + autosave.configure(autosave_dir, device=DEVICE_NAME) + assert autosave.Autosave.device_name == DEVICE_NAME + assert autosave.Autosave.directory == autosave_dir + assert autosave.Autosave.enabled is True + + +def test_autosave_defaults(): + assert autosave.Autosave._pvs == {} + assert autosave.Autosave._last_saved_state == {} + assert isinstance(autosave.Autosave._stop_event, threading.Event) + assert not autosave.Autosave._stop_event.is_set() + assert autosave.Autosave.save_period == 30.0 + assert autosave.Autosave.device_name is None + assert autosave.Autosave.directory is None + assert autosave.Autosave.enabled is False + assert autosave.Autosave.backup_on_restart is True + + +def test_configure_dir_doesnt_exist(): + autosave_dir = Path("/tmp/autosave-doesnt-exist") + shutil.rmtree(autosave_dir, ignore_errors=True) + DEVICE_NAME = "MY_DEVICE" + autosave.configure(autosave_dir, device=DEVICE_NAME) + with pytest.raises(FileNotFoundError): + autosaver = autosave.Autosave() + + +def test_returns_if_init_called_before_configure(): + autosave.Autosave() + assert autosave.Autosave.enabled is False + + +def test_runtime_error_if_dir_not_configured(): + autosave.configure(device="MY-DEVICE") + with pytest.raises(RuntimeError): + autosave.Autosave() + + +def test_device_name_from_builder(autosave_dir): + builder.SetDeviceName(DEVICE_NAME) + autosave.configure(autosave_dir) + autosaver = autosave.Autosave() + assert autosaver.device_name == DEVICE_NAME + +def test_all_record_types_saveable(autosave_dir): + builder.SetDeviceName(DEVICE_NAME) + autosave.configure(autosave_dir) + + number_types = ["aIn", "aOut", "boolIn", "boolOut", "longIn", "longOut", + "int64In", "int64Out", "mbbIn", "mbbOut", "Action"] + string_types = ["stringIn", "stringOut", "longStringIn", "longStringOut"] + waveform_types = ["WaveformIn", "WaveformOut"] + for pv_type in number_types: + pv = getattr(builder, pv_type)(pv_type, autosave=True) + for pv_type in string_types: + pv = getattr(builder, pv_type)(pv_type, autosave=True) + pv.set("test string") + for pv_type in waveform_types: + getattr(builder, pv_type)(pv_type, numpy.zeros((100)), autosave=True) + autosaver = autosave.Autosave() + autosaver._save() + + with open(autosave_dir / f"{DEVICE_NAME}.softsav", "r") as f: + saved = yaml.full_load(f) + for pv_type in number_types + string_types + waveform_types: + assert f"{DEVICE_NAME}:{pv_type}" in saved + +def test_can_save_fields(mocker, autosave_dir): + 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) + autosaver = autosave.Autosave() + assert f"{DEVICE_NAME}:SAVEVAL" in autosaver._pvs + assert f"{DEVICE_NAME}:SAVEVAL.DISA" in autosaver._pvs + assert f"{DEVICE_NAME}:DONTSAVEVAL" not in autosaver._pvs + assert f"{DEVICE_NAME}:DONTSAVEVAL.SCAN" in autosaver._pvs + autosaver._save() + with open(autosave_dir / f"{DEVICE_NAME}.softsav", "r") as f: + saved = yaml.full_load(f) + assert f"{DEVICE_NAME}:SAVEVAL" in saved + assert f"{DEVICE_NAME}:SAVEVAL.DISA" in saved + assert f"{DEVICE_NAME}:DONTSAVEVAL" not in saved + assert f"{DEVICE_NAME}:DONTSAVEVAL.SCAN" in saved + +def test_stop_event(autosave_dir): + autosave.configure(autosave_dir, device=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) + +def test_load_autosave(existing_autosave_dir): + builder.SetDeviceName(DEVICE_NAME) + autosave.configure(existing_autosave_dir) + pv = builder.aOut("ALREADYSAVED", autosave=True) + assert pv.get() == 0.0 + autosaver = autosave.Autosave() + autosaver._load() + assert pv.get() == 20.0