diff --git a/Pipfile b/Pipfile index 10273b2..eeeb15b 100644 --- a/Pipfile +++ b/Pipfile @@ -8,10 +8,10 @@ pyphantom = {editable = true, path = "."} [dev-packages] "pytest" = "*" -"pcapy" = "*" +"pcapy-ng" = "*" [requires] -python_version = "3.7" +python_version = "3.11" [scripts] test = "py.test -v" diff --git a/Pipfile.lock b/Pipfile.lock index da406f4..1a14d19 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,11 +1,11 @@ { "_meta": { "hash": { - "sha256": "7656605695a281bbbfeee97d12a1a9b3fec6313a99b2d03baf5db39af91b7b72" + "sha256": "600f001f76778c2f36895e479ca42878b7f6d820eab00de06de750f25d33f506" }, "pipfile-spec": 6, "requires": { - "python_version": "3.7" + "python_version": "3.11" }, "sources": [ { @@ -18,67 +18,81 @@ "default": { "cached-property": { "hashes": [ - "sha256:3a026f1a54135677e7da5ce819b0c690f156f37976f3e30c5430740725203d7f", - "sha256:9217a59f14a5682da7c4b8829deadbfc194ac22e9908ccf7c8820234e80a1504" + "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130", + "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0" ], - "version": "==1.5.1" + "version": "==1.5.2" }, "click": { "hashes": [ - "sha256:8a18b4ea89d8820c5d0c7da8a64b2c324b4dabb695804dbfea19b9be9d88c0cc", - "sha256:e345d143d80bf5ee7534056164e5e112ea5e22716bbb1ce727941f4c8b471b9a" + "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e", + "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48" ], - "version": "==7.1.1" + "markers": "python_version >= '3.7'", + "version": "==8.1.3" }, "colorama": { "hashes": [ - "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff", - "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1" + "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", + "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" ], - "version": "==0.4.3" + "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": "==0.4.6" }, "netifaces": { "hashes": [ - "sha256:078986caf4d6a602a4257d3686afe4544ea74362b8928e9f4389b5cd262bc215", - "sha256:0c4304c6d5b33fbd9b20fdc369f3a2fef1a8bbacfb6fd05b9708db01333e9e7b", - "sha256:2dee9ffdd16292878336a58d04a20f0ffe95555465fee7c9bd23b3490ef2abf3", - "sha256:3095218b66d359092b82f07c5422293c2f6559cf8d36b96b379cc4cdc26eeffa", - "sha256:30ed89ab8aff715caf9a9d827aa69cd02ad9f6b1896fd3fb4beb998466ed9a3c", - "sha256:4921ed406386246b84465950d15a4f63480c1458b0979c272364054b29d73084", - "sha256:563a1a366ee0fb3d96caab79b7ac7abd2c0a0577b157cc5a40301373a0501f89", - "sha256:5b3167f923f67924b356c1338eb9ba275b2ba8d64c7c2c47cf5b5db49d574994", - "sha256:6d84e50ec28e5d766c9911dce945412dc5b1ce760757c224c71e1a9759fa80c2", - "sha256:755050799b5d5aedb1396046f270abfc4befca9ccba3074f3dbbb3cb34f13aae", - "sha256:75d3a4ec5035db7478520ac547f7c176e9fd438269e795819b67223c486e5cbe", - "sha256:7a25a8e28281504f0e23e181d7a9ed699c72f061ca6bdfcd96c423c2a89e75fc", - "sha256:7cc6fd1eca65be588f001005446a47981cbe0b2909f5be8feafef3bf351a4e24", - "sha256:86b8a140e891bb23c8b9cb1804f1475eb13eea3dbbebef01fcbbf10fbafbee42", - "sha256:ad10acab2ef691eb29a1cc52c3be5ad1423700e993cc035066049fa72999d0dc", - "sha256:b2ff3a0a4f991d2da5376efd3365064a43909877e9fabfa801df970771161d29", - "sha256:b47e8f9ff6846756be3dc3fb242ca8e86752cd35a08e06d54ffc2e2a2aca70ea", - "sha256:da298241d87bcf468aa0f0705ba14572ad296f24c4fda5055d6988701d6fd8e1", - "sha256:db881478f1170c6dd524175ba1c83b99d3a6f992a35eca756de0ddc4690a1940", - "sha256:f0427755c68571df37dc58835e53a4307884a48dec76f3c01e33eb0d4a3a81d7", - "sha256:f8885cc48c8c7ad51f36c175e462840f163cb4687eeb6c6d7dfaf7197308e36b", - "sha256:f911b7f0083d445c8d24cfa5b42ad4996e33250400492080f5018a28c026db2b" - ], - "version": "==0.10.9" + "sha256:043a79146eb2907edf439899f262b3dfe41717d34124298ed281139a8b93ca32", + "sha256:08e3f102a59f9eaef70948340aeb6c89bd09734e0dca0f3b82720305729f63ea", + "sha256:0f6133ac02521270d9f7c490f0c8c60638ff4aec8338efeff10a1b51506abe85", + "sha256:18917fbbdcb2d4f897153c5ddbb56b31fa6dd7c3fa9608b7e3c3a663df8206b5", + "sha256:2479bb4bb50968089a7c045f24d120f37026d7e802ec134c4490eae994c729b5", + "sha256:2650beee182fed66617e18474b943e72e52f10a24dc8cac1db36c41ee9c041b7", + "sha256:28f4bf3a1361ab3ed93c5ef360c8b7d4a4ae060176a3529e72e5e4ffc4afd8b0", + "sha256:3ecb3f37c31d5d51d2a4d935cfa81c9bc956687c6f5237021b36d6fdc2815b2c", + "sha256:469fc61034f3daf095e02f9f1bbac07927b826c76b745207287bc594884cfd05", + "sha256:48324183af7f1bc44f5f197f3dad54a809ad1ef0c78baee2c88f16a5de02c4c9", + "sha256:50721858c935a76b83dd0dd1ab472cad0a3ef540a1408057624604002fcfb45b", + "sha256:54ff6624eb95b8a07e79aa8817288659af174e954cca24cdb0daeeddfc03c4ff", + "sha256:5be83986100ed1fdfa78f11ccff9e4757297735ac17391b95e17e74335c2047d", + "sha256:5f9ca13babe4d845e400921973f6165a4c2f9f3379c7abfc7478160e25d196a4", + "sha256:73ff21559675150d31deea8f1f8d7e9a9a7e4688732a94d71327082f517fc6b4", + "sha256:7dbb71ea26d304e78ccccf6faccef71bb27ea35e259fb883cfd7fd7b4f17ecb1", + "sha256:815eafdf8b8f2e61370afc6add6194bd5a7252ae44c667e96c4c1ecf418811e4", + "sha256:841aa21110a20dc1621e3dd9f922c64ca64dd1eb213c47267a2c324d823f6c8f", + "sha256:84e4d2e6973eccc52778735befc01638498781ce0e39aa2044ccfd2385c03246", + "sha256:8f7da24eab0d4184715d96208b38d373fd15c37b0dafb74756c638bd619ba150", + "sha256:96c0fe9696398253f93482c84814f0e7290eee0bfec11563bd07d80d701280c3", + "sha256:aab1dbfdc55086c789f0eb37affccf47b895b98d490738b81f3b2360100426be", + "sha256:c03fb2d4ef4e393f2e6ffc6376410a22a3544f164b336b3a355226653e5efd89", + "sha256:c37a1ca83825bc6f54dddf5277e9c65dec2f1b4d0ba44b8fd42bc30c91aa6ea1", + "sha256:c92ff9ac7c2282009fe0dcb67ee3cd17978cffbe0c8f4b471c00fe4325c9b4d4", + "sha256:c9a3a47cd3aaeb71e93e681d9816c56406ed755b9442e981b07e3618fb71d2ac", + "sha256:cb925e1ca024d6f9b4f9b01d83215fd00fe69d095d0255ff3f64bffda74025c8", + "sha256:d07b01c51b0b6ceb0f09fc48ec58debd99d2c8430b09e56651addeaf5de48048", + "sha256:e76c7f351e0444721e85f975ae92718e21c1f361bda946d60a214061de1f00a1", + "sha256:eb4813b77d5df99903af4757ce980a98c4d702bbcb81f32a0b305a1537bdf0b1" + ], + "version": "==0.11.0" }, "psutil": { "hashes": [ - "sha256:1413f4158eb50e110777c4f15d7c759521703bd6beb58926f1d562da40180058", - "sha256:298af2f14b635c3c7118fd9183843f4e73e681bb6f01e12284d4d70d48a60953", - "sha256:60b86f327c198561f101a92be1995f9ae0399736b6eced8f24af41ec64fb88d4", - "sha256:685ec16ca14d079455892f25bd124df26ff9137664af445563c1bd36629b5e0e", - "sha256:73f35ab66c6c7a9ce82ba44b1e9b1050be2a80cd4dcc3352cc108656b115c74f", - "sha256:75e22717d4dbc7ca529ec5063000b2b294fc9a367f9c9ede1f65846c7955fd38", - "sha256:a02f4ac50d4a23253b68233b07e7cdb567bd025b982d5cf0ee78296990c22d9e", - "sha256:d008ddc00c6906ec80040d26dc2d3e3962109e40ad07fd8a12d0284ce5e0e4f8", - "sha256:d84029b190c8a66a946e28b4d3934d2ca1528ec94764b180f7d6ea57b0e75e26", - "sha256:e2d0c5b07c6fe5a87fa27b7855017edb0d52ee73b71e6ee368fae268605cc3f5", - "sha256:f344ca230dd8e8d5eee16827596f1c22ec0876127c28e800d7ae20ed44c4b310" - ], - "version": "==5.7.0" + "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" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==5.9.4" }, "pyphantom": { "editable": true, @@ -86,107 +100,107 @@ }, "pyyaml": { "hashes": [ - "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97", - "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76", - "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2", - "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648", - "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf", - "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f", - "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2", - "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee", - "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d", - "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c", - "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a" - ], - "version": "==5.3.1" + "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" + ], + "markers": "python_version >= '3.6'", + "version": "==6.0" } }, "develop": { "attrs": { "hashes": [ - "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", - "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" - ], - "version": "==19.3.0" - }, - "importlib-metadata": { - "hashes": [ - "sha256:2a688cbaa90e0cc587f1df48bdc97a6eadccdcd9c35fb3f976a09e3b5016d90f", - "sha256:34513a8a0c4962bc66d35b359558fd8a5e10cd472d37aec5f66858addef32c1e" + "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836", + "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99" ], - "markers": "python_version < '3.8'", - "version": "==1.6.0" + "markers": "python_version >= '3.6'", + "version": "==22.2.0" }, - "more-itertools": { + "iniconfig": { "hashes": [ - "sha256:5dd8bcf33e5f9513ffa06d5ad33d78f31e1931ac9a18f33d37e77a180d393a7c", - "sha256:b1ddb932186d8a6ac451e1d95844b382f55e12686d51ca0c68b6f61f2ab7a507" + "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", + "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12" ], - "version": "==8.2.0" + "markers": "python_version >= '3.10'", + "version": "==2.3.0" }, "packaging": { "hashes": [ - "sha256:3c292b474fda1671ec57d46d739d072bfd495a4f51ad01a055121d81e952b7a3", - "sha256:82f77b9bee21c1bafbf35a84905d604d5d1223801d639cf3ed140bd651c08752" + "sha256:5d9c0669c6285e491e0ced2eee587eaf67b670d94a19e94e3984a481aba6802f", + "sha256:f042152b681c4bfac5cae2742a55e103d27ab2ec0f3d88037136b6bfe7c9c5de" ], - "version": "==20.3" + "markers": "python_version >= '3.8'", + "version": "==26.1" }, - "pcapy": { + "pcapy-ng": { "hashes": [ - "sha256:aa239913678d7ba116e66057a37f914de7726aecd11d00db470127df115c4e78" + "sha256:a56656cf069a112a7248e99ac4e85d49de354241483635bc200fa2fc99566da5" ], "index": "pypi", - "version": "==0.11.4" + "version": "==1.0.9" }, "pluggy": { "hashes": [ - "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", - "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" - ], - "version": "==0.13.1" - }, - "py": { - "hashes": [ - "sha256:5e27081401262157467ad6e7f851b7aa402c5852dbcb3dae06768434de5752aa", - "sha256:c20fdd83a5dbc0af9efd622bee9a5564e278f6380fffcacc43ba6f43db2813b0" + "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", + "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" ], - "version": "==1.8.1" + "markers": "python_version >= '3.9'", + "version": "==1.6.0" }, - "pyparsing": { + "pygments": { "hashes": [ - "sha256:4c830582a84fb022400b85429791bc551f1f4871c33f23e44f353119e92f969f", - "sha256:c342dccb5250c08d45fd6f8b4a559613ca603b57498511740e65cd11a2e7dcec" + "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", + "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176" ], - "version": "==2.4.6" + "markers": "python_version >= '3.9'", + "version": "==2.20.0" }, "pytest": { "hashes": [ - "sha256:0e5b30f5cb04e887b91b1ee519fa3d89049595f428c1db76e73bd7f17b09b172", - "sha256:84dde37075b8805f3d1f392cc47e38a0e59518fb46a431cfdaf7cf1ce805f970" + "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", + "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c" ], "index": "pypi", - "version": "==5.4.1" - }, - "six": { - "hashes": [ - "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a", - "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c" - ], - "version": "==1.14.0" - }, - "wcwidth": { - "hashes": [ - "sha256:cafe2186b3c009a04067022ce1dcd79cb38d8d65ee4f4791b8888d6599d1bbe1", - "sha256:ee73862862a156bf77ff92b09034fc4825dd3af9cf81bc5b360668d425f3c5f1" - ], - "version": "==0.1.9" - }, - "zipp": { - "hashes": [ - "sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b", - "sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96" - ], - "version": "==3.1.0" + "markers": "python_version >= '3.10'", + "version": "==9.0.3" } } } diff --git a/README.md b/README.md index 550d56a..0d45d41 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ Communicate with Vision Research Phantom® cameras with python +Flex multi-bracket responses are parsed with a ``FlexLoader`` (YAML 1.2 Core) so values such as ``-2e-06`` resolve as floats, matching real CineStation / camera firmware output. ## Installation diff --git a/pyphantom/fakecam/fakecam-ph7.py b/pyphantom/fakecam/fakecam-ph7.py index d1d7f5e..d21a828 100755 --- a/pyphantom/fakecam/fakecam-ph7.py +++ b/pyphantom/fakecam/fakecam-ph7.py @@ -11,6 +11,8 @@ import yaml +from pyphantom.flex import FlexLoader + from .fakecam_data import state, answers logger = logging.getLogger(__name__) @@ -200,7 +202,7 @@ def load_takes(): if os.path.exists("{}/takes-ph7/{}.raw".format(script_path, take_index)): with open(yaml_file) as y: clean = " ".join(y.read().split()).replace("\\", "") - take_info = yaml.safe_load(clean) + take_info = yaml.load(clean, Loader=FlexLoader) # use first key of take_info because we renumber the takes state["fc{}".format(take_index)] = take_info[list(take_info.keys())[0]] logger.info("Take {} loaded".format(take_index)) diff --git a/pyphantom/fakecam/fakecam.py b/pyphantom/fakecam/fakecam.py index 3c82e08..b071432 100755 --- a/pyphantom/fakecam/fakecam.py +++ b/pyphantom/fakecam/fakecam.py @@ -11,6 +11,7 @@ import yaml +from pyphantom.flex import FlexLoader from pyphantom.fakecam import ximg_send from pyphantom.fakecam.fakecam_data import state, answers @@ -285,7 +286,7 @@ def load_takes(): if os.path.exists("{}/{}.raw".format(takes_path, take_index)): with open(yaml_file) as y: clean = " ".join(y.read().split()).replace("\\", "") - take_info = yaml.safe_load(clean) + take_info = yaml.load(clean, Loader=FlexLoader) # use first key of take_info because we renumber the takes state["fc{}".format(take_index)] = take_info[list(take_info.keys())[0]] logger.info("Take {} loaded".format(take_index)) diff --git a/pyphantom/fakecam/takes/1.data b/pyphantom/fakecam/takes/1.data index cf7e0ee..b7a00c3 100644 --- a/pyphantom/fakecam/takes/1.data +++ b/pyphantom/fakecam/takes/1.data @@ -77,8 +77,8 @@ fc67 : { \ edger : 0, \ edgeth : 0, \ gamma : 2.2, \ - rgamma : 0, \ - bgamma : 0, \ + rgamma : -2e-06, \ + bgamma : -2e-06, \ toe : 1, \ gain : 1, \ offset : 0, \ diff --git a/pyphantom/flex.py b/pyphantom/flex.py index 7fc9b07..fe8a593 100755 --- a/pyphantom/flex.py +++ b/pyphantom/flex.py @@ -1,5 +1,6 @@ import errno import logging +import re import socket import time from multiprocessing import Lock @@ -35,6 +36,33 @@ class FrameOutsideRangeError(Exception): pass +class FlexLoader(yaml.SafeLoader): + """YAML loader matching Phantom Flex wire format: YAML 1.2 Core floats that PyYAML's + SafeLoader (YAML 1.1) leaves as strings — e.g. ``-2e-06`` (scientific without ``.``), + ``.inf``, ``.nan``. + """ + + pass + + +# Integer-mantissa scientific notation (YAML 1.1 does not treat these as floats). +FlexLoader.add_implicit_resolver( + "tag:yaml.org,2002:float", + re.compile(r"^[-+]?\d+[eE][-+]?\d+$"), + list("+-0123456789"), +) +FlexLoader.add_implicit_resolver( + "tag:yaml.org,2002:float", + re.compile(r"^[-+]?\.inf$", re.IGNORECASE), + list("-+."), +) +FlexLoader.add_implicit_resolver( + "tag:yaml.org,2002:float", + re.compile(r"^\.nan$", re.IGNORECASE), + list("."), +) + + def parse_simple(response): clean = response.replace(" ", "").split("{")[1].split("}")[0].split(",") @@ -75,7 +103,7 @@ def parse_response(response): clean = "X :" + clean try: - return yaml.safe_load(clean)["X"] + return yaml.load(clean, Loader=FlexLoader)["X"] except yaml.parser.ParserError: raise diff --git a/tests/fixtures/fc0_flex_response.txt b/tests/fixtures/fc0_flex_response.txt new file mode 100644 index 0000000..27db37d --- /dev/null +++ b/tests/fixtures/fc0_flex_response.txt @@ -0,0 +1,137 @@ +fc0 : { \ + res : 4096 x 2304, \ + bin : 0, \ + rate : 938, \ + exp : 533049, \ + shoff : 0, \ + edrexp : 0, \ + ptframes : 10, \ + bcount : 0, \ + bperiod : 1065142, \ + hqenable : 0, \ + frcount : 9588, \ + ramp : "", \ + state : { STR }, \ + start : 0x1840000, \ + len : 0x7E743000, \ + frsize : 11796480, \ + frspace : 2121543680, \ + firstfr : -2887, \ + lastfr : -1552, \ + format : 266, \ + decimation : 1, \ + in : -2887, \ + out : -1552, \ + aexpmode : 0, \ + aexpcomp : 0, \ + audiopktsize : 0, \ + trigtime : { \ + secs : 1776415322, \ + frac : 336880 \ + }, \ + cam : { \ + syncimg : 0, \ + master : 0, \ + tcmode : 1, \ + trigpol : 0, \ + trigfilt : 32, \ + frdelay : 0, \ + startonacq : 1, \ + aux1mode : 0, \ + aux2mode : 0, \ + aux3mode : 0, \ + memgateen : 0, \ + membpp : 12, \ + tsformat : 1, \ + mode : 0 \ + }, \ + info : { \ + hwver : 4001, \ + sver : 906101034, \ + fver : 169, \ + pver : 16, \ + model : "Phantom Flex4K", \ + sensor : 4000, \ + snsversion : 105, \ + snsserial : 0, \ + kernel : 587, \ + swver : 167360320, \ + xver : 1013571, \ + serial : 16395, \ + cfa : 3, \ + filter : 0, \ + name : "16395", \ + mdepths : 0x1000, \ + genlockstatus : 0, \ + snstemp : 35, \ + camtemp : 54, \ + features : "bref blk4 shtr attach earlyimg notify log dualp aux2 wide mm24 v4k genlock audio prores shtr mag" \ + }, \ + adj : { \ + red : 1, \ + green : 1, \ + blue : 1, \ + wbtemp : 4950, \ + wbcc : 55, \ + wbred : 1.370309432, \ + wbblue : 1.866422519, \ + edgeg : 0, \ + edger : 0, \ + edgeth : 0, \ + gamma : 2.2, \ + rgamma : -2e-06, \ + bgamma : -2e-06, \ + toe : 1, \ + gain : 1, \ + offset : 0, \ + flare : 0, \ + hue : 0, \ + sat : 1, \ + rped : 0, \ + gped : 0, \ + bped : 0, \ + tone : "EI1250 0.024 0.100 0.056 0.200 0.134 0.400 0.224 0.600 0.271 0.700 0.600 0.960", \ + mmsat : "", \ + mmhue : "", \ + chroma : 1, \ + matrix : 1, \ + log : 0, \ + sdimin : 32, \ + sdimax : 960, \ + cmatrix : "cal 2.04935 -0.516239 0.0386356 -0.135381 0.757609 0.636798 -0.0564543 -0.552734 2.97495", \ + umatrix : "", \ + filter : "" \ + }, \ + meta : { \ + name : "", \ + uuid : "00000000-400b-4000-e9e1-f25a000523f0", \ + system : 21, \ + pbrate : 25, \ + tcrate : 25, \ + trigtc : "14:26:54.01", \ + pax : 1296, \ + pay : 2304, \ + paox : 0, \ + paoy : 0, \ + vox : 0, \ + voy : 0, \ + vw : 4096, \ + vh : 2304, \ + vow : 1911, \ + voh : 1075, \ + ox : 0, \ + oy : 0, \ + w : 0, \ + h : 0, \ + ow : 0, \ + oh : 0, \ + crop : 0, \ + resize : 0, \ + lens : "", \ + fstop : 0, \ + flen : 0, \ + gps : "", \ + comment : "", \ + xset : "" \ + } \ +} diff --git a/tests/test_flex.py b/tests/test_flex.py index b0f9ad8..a7437b8 100644 --- a/tests/test_flex.py +++ b/tests/test_flex.py @@ -1,6 +1,11 @@ +import math +import os + import pytest +import yaml from pyphantom import flex +from pyphantom.flex import FlexLoader @pytest.fixture(scope="module") @@ -18,8 +23,9 @@ def fin(): # FIXME: Find a nicer way to test structures than calling `str()` on them def test_flag(cam): - assert cam.ask("get c1.state") == ["RDY"] - assert str(cam.structures.c1.state) == str(["RDY"]) + # c1 is deepcopy(fc1) after load_takes; take YAML uses `state : { STR }` -> dict + assert cam.ask("get c1.state") == {"STR": ""} + assert str(cam.structures.c1.state) == str({"STR": ""}) def test_simple(cam): @@ -34,11 +40,74 @@ def test_simple_with_colon(cam): def test_dict(cam): assert cam.ask("get defc") == { - "exp": 1250000, - "meta": {"crop": 0, "oh": 0, "ow": 0, "resize": 0}, - "rate": 400, - "res": "4096x2304", + "aexpcomp": 0, + "aexpmode": 0, + "bcount": 0, + "bperiod": 10416317, + "decimation": 1, + "edrexp": 0, + "exp": 3333332, + "frcount": 5000, + "frsize": 2949120, + "hqenable": 0, + "meta": {"crop": 1, "h": 1080, "oh": 0, "ow": 0, "ox": 0, "oy": 0, "w": 1920}, + "ptframes": 1, + "ramp": "", + "rate": 150, + "res": "2048 x 1152", + "shoff": 0, } assert str(cam.structures.defc) == str( - {"rate": 400, "res": "4096x2304", "exp": 1250000, "meta": {"crop": 0, "resize": 0, "ow": 0, "oh": 0}} + { + "rate": 150, + "res": "2048 x 1152", + "exp": 3333332, + "edrexp": 0, + "ptframes": 1, + "shoff": 0, + "ramp": "", + "bcount": 0, + "bperiod": 10416317, + "hqenable": 0, + "decimation": 1, + "frcount": 5000, + "frsize": 2949120, + "aexpmode": 0, + "aexpcomp": 0, + "meta": {"ox": 0, "oy": 0, "w": 1920, "h": 1080, "ow": 0, "oh": 0, "crop": 1}, + } + ) + + +def test_parse_response_scientific_without_dot(): + """Multi-bracket Flex replies use yaml.load; -2e-06 must be float (YAML 1.2), not str.""" + r = flex.parse_response( + "Ok! fc0 : { adj : { rgamma : -2e-06, bgamma : -2e-06 } }" ) + assert isinstance(r["adj"]["rgamma"], float) + assert isinstance(r["adj"]["bgamma"], float) + assert math.isclose(r["adj"]["rgamma"], -2e-06, rel_tol=1e-9) + assert math.isclose(r["adj"]["bgamma"], -2e-06, rel_tol=1e-9) + + +def test_flex_loader_inf_nan(): + """FlexLoader extends SafeLoader for YAML 1.2 Core .inf / .nan (not exercised by single-bracket parse_simple).""" + doc = "X : { x : .inf, y : .nan, z : -2e-06 }" + loaded = yaml.load(doc, Loader=FlexLoader)["X"] + assert math.isinf(loaded["x"]) and loaded["x"] > 0 + assert math.isnan(loaded["y"]) + assert isinstance(loaded["z"], float) + assert math.isclose(loaded["z"], -2e-06, rel_tol=1e-9) + + +def test_parse_response_fc0_fixture(): + fixture_path = os.path.join(os.path.dirname(__file__), "fixtures", "fc0_flex_response.txt") + with open(fixture_path, encoding="utf-8") as f: + body = f.read() + r = flex.parse_response("Ok! " + body) + assert isinstance(r, dict) + assert r["adj"]["gamma"] == 2.2 + assert isinstance(r["adj"]["rgamma"], float) + assert isinstance(r["adj"]["bgamma"], float) + assert math.isclose(r["adj"]["rgamma"], -2e-06, rel_tol=1e-9) + assert math.isclose(r["adj"]["bgamma"], -2e-06, rel_tol=1e-9)