Inital version

This commit is contained in:
Snowsune 2025-09-30 12:26:09 -04:00
commit 4e10407f9f
15 changed files with 9237 additions and 0 deletions

38
.gitignore vendored Normal file
View File

@ -0,0 +1,38 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# Distribution / packaging
.build/
build/
dist/
.eggs/
*.egg-info/
*.egg
# Virtual environments
.venv/
venv/
ENV/
# Test / coverage
.pytest_cache/
.coverage*
htmlcov/
# IDE / editor
.vscode/
*.code-workspace
.idea/
# OS files
.DS_Store
Thumbs.db
# Jupyter
.ipynb_checkpoints/
# Local configs
*.env
.env.*

13
Pipfile Normal file
View File

@ -0,0 +1,13 @@
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
simple-scope-parser = {file = ".", editable = true}
matplotlib = "*"
[dev-packages]
[requires]
python_version = "3.11"

568
Pipfile.lock generated Normal file
View File

@ -0,0 +1,568 @@
{
"_meta": {
"hash": {
"sha256": "608eb6a78a7c634cfeda947bf7bf94e9c248bf9351248f67a75d42c82c850165"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.11"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"contourpy": {
"hashes": [
"sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69",
"sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc",
"sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880",
"sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a",
"sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8",
"sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc",
"sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470",
"sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5",
"sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263",
"sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b",
"sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5",
"sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381",
"sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3",
"sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4",
"sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e",
"sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f",
"sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772",
"sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286",
"sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42",
"sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301",
"sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77",
"sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7",
"sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411",
"sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1",
"sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9",
"sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a",
"sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b",
"sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db",
"sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6",
"sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620",
"sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989",
"sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea",
"sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67",
"sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5",
"sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d",
"sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36",
"sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99",
"sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1",
"sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e",
"sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b",
"sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8",
"sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d",
"sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7",
"sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7",
"sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339",
"sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1",
"sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659",
"sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4",
"sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f",
"sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20",
"sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36",
"sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb",
"sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d",
"sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8",
"sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0",
"sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b",
"sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7",
"sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe",
"sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77",
"sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497",
"sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd",
"sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1",
"sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216",
"sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13",
"sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae",
"sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae",
"sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77",
"sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3",
"sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f",
"sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff",
"sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9",
"sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a"
],
"markers": "python_version >= '3.11'",
"version": "==1.3.3"
},
"cycler": {
"hashes": [
"sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30",
"sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"
],
"markers": "python_version >= '3.8'",
"version": "==0.12.1"
},
"fonttools": {
"hashes": [
"sha256:022beaea4b73a70295b688f817ddc24ed3e3418b5036ffcd5658141184ef0d0c",
"sha256:026290e4ec76583881763fac284aca67365e0be9f13a7fb137257096114cb3bc",
"sha256:0b0835ed15dd5b40d726bb61c846a688f5b4ce2208ec68779bc81860adb5851a",
"sha256:0eae96373e4b7c9e45d099d7a523444e3554360927225c1cdae221a58a45b856",
"sha256:122e1a8ada290423c493491d002f622b1992b1ab0b488c68e31c413390dc7eb2",
"sha256:1410155d0e764a4615774e5c2c6fc516259fe3eca5882f034eb9bfdbee056259",
"sha256:145daa14bf24824b677b9357c5e44fd8895c2a8f53596e1b9ea3496081dc692c",
"sha256:1525796c3ffe27bb6268ed2a1bb0dcf214d561dfaf04728abf01489eb5339dce",
"sha256:154cb6ee417e417bf5f7c42fe25858c9140c26f647c7347c06f0cc2d47eff003",
"sha256:2299df884c11162617a66b7c316957d74a18e3758c0274762d2cc87df7bc0272",
"sha256:2409d5fb7b55fd70f715e6d34e7a6e4f7511b8ad29a49d6df225ee76da76dd77",
"sha256:268ecda8ca6cb5c4f044b1fb9b3b376e8cd1b361cef275082429dc4174907038",
"sha256:282dafa55f9659e8999110bd8ed422ebe1c8aecd0dc396550b038e6c9a08b8ea",
"sha256:2ee06fc57512144d8b0445194c2da9f190f61ad51e230f14836286470c99f854",
"sha256:3630e86c484263eaac71d117085d509cbcf7b18f677906824e4bace598fb70d2",
"sha256:398447f3d8c0c786cbf1209711e79080a40761eb44b27cdafffb48f52bcec258",
"sha256:4ba4bd646e86de16160f0fb72e31c3b9b7d0721c3e5b26b9fa2fc931dfdb2652",
"sha256:5664fd1a9ea7f244487ac8f10340c4e37664675e8667d6fee420766e0fb3cf08",
"sha256:583b7f8e3c49486e4d489ad1deacfb8d5be54a8ef34d6df824f6a171f8511d99",
"sha256:596ecaca36367027d525b3b426d8a8208169d09edcf8c7506aceb3a38bfb55c7",
"sha256:5c1015318e4fec75dd4943ad5f6a206d9727adf97410d58b7e32ab644a807914",
"sha256:66929e2ea2810c6533a5184f938502cfdaea4bc3efb7130d8cc02e1c1b4108d6",
"sha256:6ec722ee589e89a89f5b7574f5c45604030aa6ae24cb2c751e2707193b466fed",
"sha256:6f68576bb4bbf6060c7ab047b1574a1ebe5c50a17de62830079967b211059ebb",
"sha256:7473a8ed9ed09aeaa191301244a5a9dbe46fe0bf54f9d6cd21d83044c3321217",
"sha256:7b0c6d57ab00dae9529f3faf187f2254ea0aa1e04215cf2f1a8ec277c96661bc",
"sha256:7b4c32e232a71f63a5d00259ca3d88345ce2a43295bb049d21061f338124246f",
"sha256:8177ec9676ea6e1793c8a084a90b65a9f778771998eb919d05db6d4b1c0b114c",
"sha256:839565cbf14645952d933853e8ade66a463684ed6ed6c9345d0faf1f0e868877",
"sha256:875cb7764708b3132637f6c5fb385b16eeba0f7ac9fa45a69d35e09b47045801",
"sha256:8a44788d9d91df72d1a5eac49b31aeb887a5f4aab761b4cffc4196c74907ea85",
"sha256:8b4eb332f9501cb1cd3d4d099374a1e1306783ff95489a1026bde9eb02ccc34a",
"sha256:906306ac7afe2156fcf0042173d6ebbb05416af70f6b370967b47f8f00103bbb",
"sha256:992775c9fbe2cf794786fa0ffca7f09f564ba3499b8fe9f2f80bd7197db60383",
"sha256:996a4d1834524adbb423385d5a629b868ef9d774670856c63c9a0408a3063401",
"sha256:9a52f254ce051e196b8fe2af4634c2d2f02c981756c6464dc192f1b6050b4e28",
"sha256:9d0ced62b59e0430b3690dbc5373df1c2aa7585e9a8ce38eff87f0fd993c5b01",
"sha256:a140761c4ff63d0cb9256ac752f230460ee225ccef4ad8f68affc723c88e2036",
"sha256:a184b2ea57b13680ab6d5fbde99ccef152c95c06746cb7718c583abd8f945ccc",
"sha256:a3db56f153bd4c5c2b619ab02c5db5192e222150ce5a1bc10f16164714bc39ac",
"sha256:a46b2f450bc79e06ef3b6394f0c68660529ed51692606ad7f953fc2e448bc903",
"sha256:a884aef09d45ba1206712c7dbda5829562d3fea7726935d3289d343232ecb0d3",
"sha256:b2cf105cee600d2de04ca3cfa1f74f1127f8455b71dbad02b9da6ec266e116d6",
"sha256:b33a7884fabd72bdf5f910d0cf46be50dce86a0362a65cfc746a4168c67eb96c",
"sha256:b42d86938e8dda1cd9a1a87a6d82f1818eaf933348429653559a458d027446da",
"sha256:b6379e7546ba4ae4b18f8ae2b9bc5960936007a1c0e30b342f662577e8bc3299",
"sha256:c7420a2696a44650120cdd269a5d2e56a477e2bfa9d95e86229059beb1c19e15",
"sha256:c8651e0d4b3bdeda6602b85fdc2abbefc1b41e573ecb37b6779c4ca50753a199",
"sha256:d066ea419f719ed87bc2c99a4a4bfd77c2e5949cb724588b9dd58f3fd90b92bf",
"sha256:e6c58beb17380f7c2ea181ea11e7db8c0ceb474c9dd45f48e71e2cb577d146a1",
"sha256:e852d9dda9f93ad3651ae1e3bb770eac544ec93c3807888798eccddf84596537",
"sha256:ec3681a0cb34c255d76dd9d865a55f260164adb9fa02628415cdc2d43ee2c05d",
"sha256:ee0c0b3b35b34f782afc673d503167157094a16f442ace7c6c5e0ca80b08f50c",
"sha256:eedacb5c5d22b7097482fa834bda0dafa3d914a4e829ec83cdea2a01f8c813c4",
"sha256:ef00af0439ebfee806b25f24c8f92109157ff3fac5731dc7867957812e87b8d9",
"sha256:f0e8817c7d1a0c2eedebf57ef9a9896f3ea23324769a9a2061a80fe8852705ed",
"sha256:f3d5be054c461d6a2268831f04091dc82753176f6ea06dc6047a5e168265a987",
"sha256:f4b5c37a5f40e4d733d3bbaaef082149bee5a5ea3156a785ff64d949bd1353fa"
],
"markers": "python_version >= '3.9'",
"version": "==4.60.1"
},
"kiwisolver": {
"hashes": [
"sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c",
"sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7",
"sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21",
"sha256:0a590506f303f512dff6b7f75fd2fd18e16943efee932008fe7140e5fa91d80e",
"sha256:0ab74e19f6a2b027ea4f845a78827969af45ce790e6cb3e1ebab71bdf9f215ff",
"sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7",
"sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c",
"sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26",
"sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa",
"sha256:1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f",
"sha256:1b11d6a633e4ed84fc0ddafd4ebfd8ea49b3f25082c04ad12b8315c11d504dc1",
"sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891",
"sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77",
"sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543",
"sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d",
"sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce",
"sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3",
"sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60",
"sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a",
"sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089",
"sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab",
"sha256:40092754720b174e6ccf9e845d0d8c7d8e12c3d71e7fc35f55f3813e96376f78",
"sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771",
"sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f",
"sha256:497d05f29a1300d14e02e6441cf0f5ee81c1ff5a304b0d9fb77423974684e08b",
"sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14",
"sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32",
"sha256:4d1d9e582ad4d63062d34077a9a1e9f3c34088a2ec5135b1f7190c07cf366527",
"sha256:52a15b0f35dad39862d376df10c5230155243a2c1a436e39eb55623ccbd68185",
"sha256:540c7c72324d864406a009d72f5d6856f49693db95d1fbb46cf86febef873634",
"sha256:5656aa670507437af0207645273ccdfee4f14bacd7f7c67a4306d0dcaeaf6eed",
"sha256:5a0f2724dfd4e3b3ac5a82436a8e6fd16baa7d507117e4279b660fe8ca38a3a1",
"sha256:60c439763a969a6af93b4881db0eed8fadf93ee98e18cbc35bc8da868d0c4f0c",
"sha256:61874cdb0a36016354853593cffc38e56fc9ca5aa97d2c05d3dcf6922cd55a11",
"sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752",
"sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5",
"sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4",
"sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58",
"sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5",
"sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198",
"sha256:7b4da0d01ac866a57dd61ac258c5607b4cd677f63abaec7b148354d2b2cdd536",
"sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134",
"sha256:84fd60810829c27ae375114cd379da1fa65e6918e1da405f356a775d49a62bcf",
"sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2",
"sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2",
"sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370",
"sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1",
"sha256:8fdca1def57a2e88ef339de1737a1449d6dbf5fab184c54a1fca01d541317154",
"sha256:90f47e70293fc3688b71271100a1a5453aa9944a81d27ff779c108372cf5567b",
"sha256:92a2f997387a1b79a75e7803aa7ded2cfbe2823852ccf1ba3bcf613b62ae3197",
"sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386",
"sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a",
"sha256:9cf554f21be770f5111a1690d42313e140355e687e05cf82cb23d0a721a64a48",
"sha256:a30fd6fdef1430fd9e1ba7b3398b5ee4e2887783917a687d86ba69985fb08748",
"sha256:a31d512c812daea6d8b3be3b2bfcbeb091dbb09177706569bcfc6240dcf8b41c",
"sha256:a5d0432ccf1c7ab14f9949eec60c5d1f924f17c037e9f8b33352fa05799359b8",
"sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5",
"sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999",
"sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369",
"sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122",
"sha256:b4b4d74bda2b8ebf4da5bd42af11d02d04428b2c32846e4c2c93219df8a7987b",
"sha256:b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098",
"sha256:b78efa4c6e804ecdf727e580dbb9cba85624d2e1c6b5cb059c66290063bd99a9",
"sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f",
"sha256:bdd1a81a1860476eb41ac4bc1e07b3f07259e6d55bbf739b79c8aaedcf512799",
"sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028",
"sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2",
"sha256:bfc08add558155345129c7803b3671cf195e6a56e7a12f3dde7c57d9b417f525",
"sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d",
"sha256:c9e7cdf45d594ee04d5be1b24dd9d49f3d1590959b2271fb30b5ca2b262c00fb",
"sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872",
"sha256:cc9617b46837c6468197b5945e196ee9ca43057bb7d9d1ae688101e4e1dddf64",
"sha256:ccd09f20ccdbbd341b21a67ab50a119b64a403b09288c27481575105283c1586",
"sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf",
"sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552",
"sha256:d4188e73af84ca82468f09cadc5ac4db578109e52acb4518d8154698d3a87ca2",
"sha256:d4efec7bcf21671db6a3294ff301d2fc861c31faa3c8740d1a94689234d1b415",
"sha256:d75aa530ccfaa593da12834b86a0724f58bff12706659baa9227c2ccaa06264c",
"sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6",
"sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64",
"sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d",
"sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548",
"sha256:dba5ee5d3981160c28d5490f0d1b7ed730c22470ff7f6cc26cfcfaacb9896a07",
"sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61",
"sha256:dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d",
"sha256:deed0c7258ceb4c44ad5ec7d9918f9f14fd05b2be86378d86cf50e63d1e7b771",
"sha256:e09c2279a4d01f099f52d5c4b3d9e208e91edcbd1a175c9662a8b16e000fece9",
"sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c",
"sha256:e6b93f13371d341afee3be9f7c5964e3fe61d5fa30f6a30eb49856935dfe4fc3",
"sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16",
"sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145",
"sha256:ede8c6d533bc6601a47ad4046080d36b8fc99f81e6f1c17b0ac3c2dc91ac7611",
"sha256:efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2",
"sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464",
"sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2",
"sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04",
"sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54",
"sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df",
"sha256:fb3b8132019ea572f4611d770991000d7f58127560c4889729248eb5852a102f",
"sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1",
"sha256:fc1795ac5cd0510207482c3d1d3ed781143383b8cfd36f5c645f3897ce066220"
],
"markers": "python_version >= '3.10'",
"version": "==1.4.9"
},
"matplotlib": {
"hashes": [
"sha256:05be9bdaa8b242bc6ff96330d18c52f1fc59c6fb3a4dd411d953d67e7e1baf98",
"sha256:08f141d55148cd1fc870c3387d70ca4df16dee10e909b3b038782bd4bda6ea07",
"sha256:08fc803293b4e1694ee325896030de97f74c141ccff0be886bb5915269247676",
"sha256:091cea22e059b89f6d7d1a18e2c33a7376c26eee60e401d92a4d6726c4e12706",
"sha256:13fcd07ccf17e354398358e0307a1f53f5325dca22982556ddb9c52837b5af41",
"sha256:1565aae810ab79cb72e402b22facfa6501365e73ebab70a0fdfb98488d2c3c0c",
"sha256:1678bb61d897bb4ac4757b5ecfb02bfb3fddf7f808000fb81e09c510712fda75",
"sha256:1b53bd6337eba483e2e7d29c5ab10eee644bc3a2491ec67cc55f7b44583ffb18",
"sha256:25f7a3eb42d6c1c56e89eacd495661fc815ffc08d9da750bca766771c0fd9110",
"sha256:2adf92d9b7527fbfb8818e050260f0ebaa460f79d61546374ce73506c9421d09",
"sha256:30fdd37edf41a4e6785f9b37969de57aea770696cb637d9946eb37470c94a453",
"sha256:31ca662df6a80bd426f871105fdd69db7543e28e73a9f2afe80de7e531eb2347",
"sha256:376a624a218116461696b27b2bbf7a8945053e6d799f6502fc03226d077807bf",
"sha256:3d80d60d4e54cda462e2cd9a086d85cd9f20943ead92f575ce86885a43a565d5",
"sha256:470fc846d59d1406e34fa4c32ba371039cd12c2fe86801159a965956f2575bd1",
"sha256:491e25e02a23d7207629d942c666924a6b61e007a48177fdd231a0097b7f507e",
"sha256:4d6ca6ef03dfd269f4ead566ec6f3fb9becf8dab146fb999022ed85ee9f6b3eb",
"sha256:4dd83e029f5b4801eeb87c64efd80e732452781c16a9cf7415b7b63ec8f374d7",
"sha256:56cd2d20842f58c03d2d6e6c1f1cf5548ad6f66b91e1e48f814e4fb5abd1cb95",
"sha256:590f5925c2d650b5c9d813c5b3b5fc53f2929c3f8ef463e4ecfa7e052044fb2b",
"sha256:59c8ac8382fefb9cb71308dde16a7c487432f5255d8f1fd32473523abecfecdf",
"sha256:658bc91894adeab669cf4bb4a186d049948262987e80f0857216387d7435d833",
"sha256:662df55604a2f9a45435566d6e2660e41efe83cd94f4288dfbf1e6d1eae4b0bb",
"sha256:6f4a69196e663a41d12a728fab8751177215357906436804217d6d9cf0d4d6cf",
"sha256:70aaf890ce1d0efd482df969b28a5b30ea0b891224bb315810a3940f67182899",
"sha256:7bac38d816637343e53d7185d0c66677ff30ffb131044a81898b5792c956ba76",
"sha256:819e409653c1106c8deaf62e6de6b8611449c2cd9939acb0d7d4e57a3d95cc7a",
"sha256:83847b47f6524c34b4f2d3ce726bb0541c48c8e7692729865c3df75bfa0f495a",
"sha256:84e82d9e0fd70c70bc55739defbd8055c54300750cbacf4740c9673a24d6933a",
"sha256:886f989ccfae63659183173bb3fced7fd65e9eb793c3cc21c273add368536951",
"sha256:8913b7474f6dd83ac444c9459c91f7f0f2859e839f41d642691b104e0af056aa",
"sha256:8fa4c43d6bfdbfec09c733bca8667de11bfa4970e8324c471f3a3632a0301c15",
"sha256:905b60d1cb0ee604ce65b297b61cf8be9f4e6cfecf95a3fe1c388b5266bc8f4f",
"sha256:942a8de2b5bfff1de31d95722f702e2966b8a7e31f4e68f7cd963c7cd8861cf6",
"sha256:94f0b4cacb23763b64b5dace50d5b7bfe98710fed5f0cef5c08135a03399d98b",
"sha256:9df5851b219225731f564e4b9e7f2ac1e13c9e6481f941b5631a0f8e2d9387ce",
"sha256:a3276c85370bc0dfca051ec65c5817d1e0f8f5ce1b7787528ec8ed2d524bbc2f",
"sha256:abb5d9478625dd9c9eb51a06d39aae71eda749ae9b3138afb23eb38824026c7e",
"sha256:acc86dd6e0e695c095001a7fccff158c49e45e0758fdf5dcdbb0103318b59c9f",
"sha256:bc31e693da1c08012c764b053e702c1855378e04102238e6a5ee6a7117c53a47",
"sha256:bc7316c306d97463a9866b89d5cc217824e799fa0de346c8f68f4f3d27c8693d",
"sha256:c7e0518e0d223683532a07f4b512e2e0729b62674f1b3a1a69869f98e6b1c7e3",
"sha256:cbd5eb50b7058b2892ce45c2f4e92557f395c9991f5c886d1bb74a1582e70fd6",
"sha256:cc332891306b9fb39462673d8225d1b824c89783fee82840a709f96714f17a5c",
"sha256:d00932b0d160ef03f59f9c0e16d1e3ac89646f7785165ce6ad40c842db16cc2e",
"sha256:e228cd2ffb8f88b7d0b29e37f68ca9aaf83e33821f24a5ccc4f082dd8396bc27",
"sha256:ea117a9c1627acaa04dbf36265691921b999cbf515a015298e54e1a12c3af837",
"sha256:ec01b645840dd1996df21ee37f208cd8ba57644779fa20464010638013d3203c",
"sha256:ee1d607b3fb1590deb04b69f02ea1d53ed0b0bf75b2b1a5745f269afcbd3cdd3",
"sha256:f2d684c3204fa62421bbf770ddfebc6b50130f9cad65531eeba19236d73bb488",
"sha256:f3b23315a01981689aa4e1a179dbf6ef9fbd17143c3eea77548c2ecfb0499438",
"sha256:f44c8d264a71609c79a78d50349e724f5d5fc3684ead7c2a473665ee63d868aa",
"sha256:f56a0d1ab05d34c628592435781d185cd99630bdfd76822cd686fb5a0aecd43a",
"sha256:f7173f8551b88f4ef810a94adae3128c2530e0d07529f7141be7f8d8c365f051",
"sha256:f9c862d91ec0b7842920a4cfdaaec29662195301914ea54c33e01f1a28d014b2"
],
"index": "pypi",
"markers": "python_version >= '3.10'",
"version": "==3.10.6"
},
"numpy": {
"hashes": [
"sha256:067e3d7159a5d8f8a0b46ee11148fc35ca9b21f61e3c49fbd0a027450e65a33b",
"sha256:0edd58682a399824633b66885d699d7de982800053acf20be1eaa46d92009c54",
"sha256:0ffc4f5caba7dfcbe944ed674b7eef683c7e94874046454bb79ed7ee0236f59d",
"sha256:1250c5d3d2562ec4174bce2e3a1523041595f9b651065e4a4473f5f48a6bc8a5",
"sha256:179a42101b845a816d464b6fe9a845dfaf308fdfc7925387195570789bb2c970",
"sha256:1c02d0629d25d426585fb2e45a66154081b9fa677bc92a881ff1d216bc9919a8",
"sha256:1e02c7159791cd481e1e6d5ddd766b62a4d5acf8df4d4d1afe35ee9c5c33a41e",
"sha256:2990adf06d1ecee3b3dcbb4977dfab6e9f09807598d647f04d385d29e7a3c3d3",
"sha256:2e267c7da5bf7309670523896df97f93f6e469fb931161f483cd6882b3b1a5dc",
"sha256:367ad5d8fbec5d9296d18478804a530f1191e24ab4d75ab408346ae88045d25e",
"sha256:396b254daeb0a57b1fe0ecb5e3cff6fa79a380fa97c8f7781a6d08cd429418fe",
"sha256:3c7cf302ac6e0b76a64c4aecf1a09e51abd9b01fc7feee80f6c43e3ab1b1dbc5",
"sha256:40051003e03db4041aa325da2a0971ba41cf65714e65d296397cc0e32de6018b",
"sha256:414a97499480067d305fcac9716c29cf4d0d76db6ebf0bf3cbce666677f12652",
"sha256:433bf137e338677cebdd5beac0199ac84712ad9d630b74eceeb759eaa45ddf30",
"sha256:4384a169c4d8f97195980815d6fcad04933a7e1ab3b530921c3fef7a1c63426d",
"sha256:497d7cad08e7092dba36e3d296fe4c97708c93daf26643a1ae4b03f6294d30eb",
"sha256:50a5fe69f135f88a2be9b6ca0481a68a136f6febe1916e4920e12f1a34e708a7",
"sha256:533ca5f6d325c80b6007d4d7fb1984c303553534191024ec6a524a4c92a5935a",
"sha256:5534ed6b92f9b7dca6c0a19d6df12d41c68b991cef051d108f6dbff3babc4ebf",
"sha256:5b83648633d46f77039c29078751f80da65aa64d5622a3cd62aaef9d835b6c93",
"sha256:691808c2b26b0f002a032c73255d0bd89751425f379f7bcd22d140db593a96e8",
"sha256:6ee9086235dd6ab7ae75aba5662f582a81ced49f0f1c6de4260a78d8f2d91a19",
"sha256:74c2a948d02f88c11a3c075d9733f1ae67d97c6bdb97f2bb542f980458b257e7",
"sha256:75370986cc0bc66f4ce5110ad35aae6d182cc4ce6433c40ad151f53690130bf1",
"sha256:78c9f6560dc7e6b3990e32df7ea1a50bbd0e2a111e05209963f5ddcab7073b0b",
"sha256:7af05ed4dc19f308e1d9fc759f36f21921eb7bbfc82843eeec6b2a2863a0aefa",
"sha256:7f025652034199c301049296b59fa7d52c7e625017cae4c75d8662e377bf487d",
"sha256:823d04112bc85ef5c4fda73ba24e6096c8f869931405a80aa8b0e604510a26bc",
"sha256:8596ba2f8af5f93b01d97563832686d20206d303024777f6dfc2e7c7c3f1850e",
"sha256:8e9aced64054739037d42fb84c54dd38b81ee238816c948c8f3ed134665dcd86",
"sha256:8f6ac61a217437946a1fa48d24c47c91a0c4f725237871117dea264982128097",
"sha256:901bf6123879b7f251d3631967fd574690734236075082078e0571977c6a8e6a",
"sha256:93d4962d8f82af58f0b2eb85daaf1b3ca23fe0a85d0be8f1f2b7bb46034e56d7",
"sha256:94fcaa68757c3e2e668ddadeaa86ab05499a70725811e582b6a9858dd472fb30",
"sha256:952cfd0748514ea7c3afc729a0fc639e61655ce4c55ab9acfab14bda4f402b4c",
"sha256:9591e1221db3f37751e6442850429b3aabf7026d3b05542d102944ca7f00c8a8",
"sha256:99683cbe0658f8271b333a1b1b4bb3173750ad59c0c61f5bbdc5b318918fffe3",
"sha256:9ad12e976ca7b10f1774b03615a2a4bab8addce37ecc77394d8e986927dc0dfe",
"sha256:9cc48e09feb11e1db00b320e9d30a4151f7369afb96bd0e48d942d09da3a0d00",
"sha256:9dc13c6a5829610cc07422bc74d3ac083bd8323f14e2827d992f9e52e22cd6a6",
"sha256:9e318ee0596d76d4cb3d78535dc005fa60e5ea348cd131a51e99d0bdbe0b54fe",
"sha256:a333b4ed33d8dc2b373cc955ca57babc00cd6f9009991d9edc5ddbc1bac36bcd",
"sha256:afd07d377f478344ec6ca2b8d4ca08ae8bd44706763d1efb56397de606393f48",
"sha256:b001bae8cea1c7dfdb2ae2b017ed0a6f2102d7a70059df1e338e307a4c78a8ae",
"sha256:b37a0b2e5935409daebe82c1e42274d30d9dd355852529eab91dab8dcca7419f",
"sha256:b912f2ed2b67a129e6a601e9d93d4fa37bef67e54cac442a2f588a54afe5c67a",
"sha256:bc92a5dedcc53857249ca51ef29f5e5f2f8c513e22cfb90faeb20343b8c6f7a6",
"sha256:ca0309a18d4dfea6fc6262a66d06c26cfe4640c3926ceec90e57791a82b6eee5",
"sha256:cb248499b0bc3be66ebd6578b83e5acacf1d6cb2a77f2248ce0e40fbec5a76d0",
"sha256:cb32e3cf0f762aee47ad1ddc6672988f7f27045b0783c887190545baba73aa25",
"sha256:cd052f1fa6a78dee696b58a914b7229ecfa41f0a6d96dc663c1220a55e137593",
"sha256:cd4260f64bc794c3390a63bf0728220dd1a68170c169088a1e0dfa2fde1be12f",
"sha256:cd7de500a5b66319db419dc3c345244404a164beae0d0937283b907d8152e6ea",
"sha256:ce020080e4a52426202bdb6f7691c65bb55e49f261f31a8f506c9f6bc7450421",
"sha256:cfdd09f9c84a1a934cde1eec2267f0a43a7cd44b2cca4ff95b7c0d14d144b0bf",
"sha256:d00de139a3324e26ed5b95870ce63be7ec7352171bc69a4cf1f157a48e3eb6b7",
"sha256:d79715d95f1894771eb4e60fb23f065663b2298f7d22945d66877aadf33d00c7",
"sha256:d8f3b1080782469fdc1718c4ed1d22549b5fb12af0d57d35e992158a772a37cf",
"sha256:d9192da52b9745f7f0766531dcfa978b7763916f158bb63bdb8a1eca0068ab20",
"sha256:d9d537a39cc9de668e5cd0e25affb17aec17b577c6b3ae8a3d866b479fbe88d0",
"sha256:da1a74b90e7483d6ce5244053399a614b1d6b7bc30a60d2f570e5071f8959d3e",
"sha256:dca2d0fc80b3893ae72197b39f69d55a3cd8b17ea1b50aa4c62de82419936150",
"sha256:ddc7c39727ba62b80dfdbedf400d1c10ddfa8eefbd7ec8dcb118be8b56d31029",
"sha256:e1ec5615b05369925bd1125f27df33f3b6c8bc10d788d5999ecd8769a1fa04db",
"sha256:e6687dc183aa55dae4a705b35f9c0f8cb178bcaa2f029b241ac5356221d5c021",
"sha256:e7e946c7170858a0295f79a60214424caac2ffdb0063d4d79cb681f9aa0aa569",
"sha256:eb63d443d7b4ffd1e873f8155260d7f58e7e4b095961b01c91062935c2491e57",
"sha256:ec9d249840f6a565f58d8f913bccac2444235025bbb13e9a4681783572ee3caa",
"sha256:ed635ff692483b8e3f0fcaa8e7eb8a75ee71aa6d975388224f70821421800cea",
"sha256:eda59e44957d272846bb407aad19f89dc6f58fecf3504bd144f4c5cf81a7eacc",
"sha256:f0dadeb302887f07431910f67a14d57209ed91130be0adea2f9793f1a4f817cf",
"sha256:f0ddb4b96a87b6728df9362135e764eac3cfa674499943ebc44ce96c478ab125",
"sha256:f5415fb78995644253370985342cd03572ef8620b934da27d77377a2285955bf"
],
"markers": "python_version >= '3.11'",
"version": "==2.3.3"
},
"packaging": {
"hashes": [
"sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484",
"sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"
],
"markers": "python_version >= '3.8'",
"version": "==25.0"
},
"pillow": {
"hashes": [
"sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2",
"sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214",
"sha256:040a5b691b0713e1f6cbe222e0f4f74cd233421e105850ae3b3c0ceda520f42e",
"sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59",
"sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50",
"sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632",
"sha256:092c80c76635f5ecb10f3f83d76716165c96f5229addbd1ec2bdbbda7d496e06",
"sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a",
"sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51",
"sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced",
"sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f",
"sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12",
"sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8",
"sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6",
"sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580",
"sha256:19d2ff547c75b8e3ff46f4d9ef969a06c30ab2d4263a9e287733aa8b2429ce8f",
"sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac",
"sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860",
"sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd",
"sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722",
"sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8",
"sha256:23cff760a9049c502721bdb743a7cb3e03365fafcdfc2ef9784610714166e5a4",
"sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673",
"sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788",
"sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542",
"sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e",
"sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd",
"sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8",
"sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523",
"sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967",
"sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809",
"sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477",
"sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027",
"sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae",
"sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b",
"sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c",
"sha256:48d254f8a4c776de343051023eb61ffe818299eeac478da55227d96e241de53f",
"sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e",
"sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b",
"sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7",
"sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27",
"sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361",
"sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae",
"sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d",
"sha256:6359a3bc43f57d5b375d1ad54a0074318a0844d11b76abccf478c37c986d3cfc",
"sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58",
"sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad",
"sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6",
"sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024",
"sha256:6a418691000f2a418c9135a7cf0d797c1bb7d9a485e61fe8e7722845b95ef978",
"sha256:6abdbfd3aea42be05702a8dd98832329c167ee84400a1d1f61ab11437f1717eb",
"sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d",
"sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0",
"sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9",
"sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f",
"sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874",
"sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa",
"sha256:7aee118e30a4cf54fdd873bd3a29de51e29105ab11f9aad8c32123f58c8f8081",
"sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149",
"sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6",
"sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d",
"sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd",
"sha256:819931d25e57b513242859ce1876c58c59dc31587847bf74cfe06b2e0cb22d2f",
"sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c",
"sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31",
"sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e",
"sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db",
"sha256:89bd777bc6624fe4115e9fac3352c79ed60f3bb18651420635f26e643e3dd1f6",
"sha256:8dc70ca24c110503e16918a658b869019126ecfe03109b754c402daff12b3d9f",
"sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494",
"sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69",
"sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94",
"sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77",
"sha256:97afb3a00b65cc0804d1c7abddbf090a81eaac02768af58cbdcaaa0a931e0b6d",
"sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7",
"sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a",
"sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438",
"sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288",
"sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b",
"sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635",
"sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3",
"sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d",
"sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe",
"sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0",
"sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe",
"sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a",
"sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805",
"sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8",
"sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36",
"sha256:cadc9e0ea0a2431124cde7e1697106471fc4c1da01530e679b2391c37d3fbb3a",
"sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b",
"sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e",
"sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25",
"sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12",
"sha256:e5c5858ad8ec655450a7c7df532e9842cf8df7cc349df7225c60d5d348c8aada",
"sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c",
"sha256:ea944117a7974ae78059fcc1800e5d3295172bb97035c0c1d9345fca1419da71",
"sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d",
"sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c",
"sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6",
"sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1",
"sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50",
"sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653",
"sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c",
"sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4",
"sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3"
],
"markers": "python_version >= '3.9'",
"version": "==11.3.0"
},
"pyparsing": {
"hashes": [
"sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6",
"sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e"
],
"markers": "python_version >= '3.9'",
"version": "==3.2.5"
},
"python-dateutil": {
"hashes": [
"sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3",
"sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
"version": "==2.9.0.post0"
},
"simple-scope-parser": {
"editable": true,
"file": "."
},
"six": {
"hashes": [
"sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274",
"sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
"version": "==1.17.0"
}
},
"develop": {}
}

49
README.md Normal file
View File

@ -0,0 +1,49 @@
# Joe's Really Simple Scope Parser
Got to be enough times in class that we needed to load the data from either my own
owon scope or the Gwinstek scopes at the lab. Both semi-standard CSV style exports.
This package is just neat enough to combine those together.
Supports pulling the metadata, time encoding and etc from each of the loadable
types.
## Instalation
```bash
# Install directly from my server
pip install git+https://git.kitsunehosting.net/Kenwood/simple-scope-parser.git
```
### Local Development
```bash
# Install in development mode
pip install -e .
# Or if you use pipenv
pipenv install -e .
```
## Quick Start
```python
from scope_parser import parse_scope_data
# Parse your oscilloscope data (auto-detects file format)
data = parse_scope_data("your_file.CSV")
# Access channel data
channel = data['CH1']
# Get voltage and time arrays
voltage = channel.voltage_values # in mV
time = channel.time_values # in seconds
# Access metadata
print(f"Frequency: {channel.frequency} Hz")
print(f"Peak-to-Peak: {channel.vpp} mV")
print(f"Average: {channel.average} mV")
```
## License
MIT License

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

55
examples/example_usage.py Normal file
View File

@ -0,0 +1,55 @@
import matplotlib.pyplot as plt
from scope_parser import parse_owon_data, parse_gwinstek_data
# Parse OWON data
print("=== OWON Data ===")
owon_data = parse_owon_data("Example Wave OWON.CSV")
ch1 = owon_data["CH1"]
print(f"Samples: {len(ch1.voltage_values)}")
print(f"Sample interval: {ch1.time_interval} s")
print(f"Frequency (approx): {ch1.frequency} Hz")
print()
# Parse Gwinstek data
print("=== Gwinstek Data ===")
gwinstek_data = parse_gwinstek_data("Example Wave Gwinstek.CSV")
ch1_gw = gwinstek_data["CH1"]
print(f"Samples: {len(ch1_gw.voltage_values)}")
print(f"Average: {ch1_gw.average:.6f} V")
# Plot both waveforms
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8))
# OWON plot
ax1.plot(ch1.time_values * 1000, ch1.voltage_values * 1000, "b-", linewidth=0.8)
ax1.set_title("OWON Oscilloscope Data")
ax1.set_xlabel("Time (ms)")
ax1.set_ylabel("Voltage (mV)")
ax1.grid(True, alpha=0.3)
ax1.text(
0.02,
0.95,
f"Frequency: {ch1.frequency} Hz\nPeak-to-peak: {ch1.vpp*1000:.1f} mV",
transform=ax1.transAxes,
verticalalignment="top",
bbox=dict(boxstyle="round", facecolor="wheat", alpha=0.8),
)
# Gwinstek plot
ax2.plot(ch1_gw.time_values * 1000, ch1_gw.voltage_values, "r-", linewidth=0.8)
ax2.set_title("Gwinstek Oscilloscope Data")
ax2.set_xlabel("Time (ms)")
ax2.set_ylabel("Voltage (V)")
ax2.grid(True, alpha=0.3)
ax2.text(
0.02,
0.95,
f"Average: {ch1_gw.average:.3f} V\nRange: {ch1_gw.voltage_values.min():.3f} to {ch1_gw.voltage_values.max():.3f} V",
transform=ax2.transAxes,
verticalalignment="top",
bbox=dict(boxstyle="round", facecolor="lightcoral", alpha=0.8),
)
plt.tight_layout()
plt.show()

16
pyproject.toml Normal file
View File

@ -0,0 +1,16 @@
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[project]
name = "simple-scope-parser"
version = "0.1.0"
description = "Simple oscilloscope CSV parser"
readme = "README.md"
requires-python = ">=3.7"
license = { text = "MIT" }
authors = [{ name = "Joe" }]
dependencies = ["numpy>=1.19.0"]
[tool.setuptools.packages.find]
include = ["scope_parser*"]

9
scope_parser/__init__.py Normal file
View File

@ -0,0 +1,9 @@
"""
Joe's Really Simple Scope Parser
"""
from .parsers import parse_owon_data, parse_gwinstek_data
from .data import ScopeData, ChannelData
__version__ = "0.1.0"
__all__ = ["parse_owon_data", "parse_gwinstek_data", "ScopeData", "ChannelData"]

View File

@ -0,0 +1,72 @@
"""
Base parser class for oscilloscope data parsers.
"""
from abc import ABC, abstractmethod
from typing import Dict, List, Optional
import numpy as np
from .data import ScopeData, ChannelData
class BaseOscilloscopeParser(ABC):
"""Base class for oscilloscope data parsers."""
@abstractmethod
def parse(self, file_path: str) -> ScopeData:
"""Parse oscilloscope data from file."""
pass
@abstractmethod
def can_parse(self, file_path: str) -> bool:
"""Check if this parser can handle the given file."""
pass
def _extract_time_interval(self, metadata: Dict[str, str]) -> float:
"""Extract time interval between samples in seconds."""
# Default implementation - can be overridden by subclasses
interval_str = metadata.get("Time interval", "")
if interval_str:
if "uS" in interval_str:
return float(interval_str.replace("uS", "")) * 1e-6
elif "nS" in interval_str:
return float(interval_str.replace("nS", "")) * 1e-9
elif "mS" in interval_str:
return float(interval_str.replace("mS", "")) * 1e-3
elif "S" in interval_str:
return float(interval_str.replace("S", ""))
return 1e-6 # Default to 1 µs
def _extract_frequency(self, metadata: Dict[str, str]) -> Optional[float]:
"""Extract frequency from metadata if available."""
freq_str = metadata.get("Frequency", "")
if freq_str.startswith("F="):
# Extract frequency value and convert units
freq_value = freq_str[2:]
if "kHz" in freq_value:
return float(freq_value.replace("kHz", "")) * 1000
elif "Hz" in freq_value:
return float(freq_value.replace("Hz", ""))
return None
def _extract_vpp(self, metadata: Dict[str, str]) -> Optional[float]:
"""Extract peak-to-peak voltage from metadata."""
pp_str = metadata.get("PK-PK", "")
if pp_str.startswith("Vpp="):
value = float(pp_str[4:].replace("mV", "").replace("V", ""))
# Convert mV to V if needed
if "mV" in pp_str:
return value / 1000.0
return value
return None
def _extract_average(self, metadata: Dict[str, str]) -> Optional[float]:
"""Extract average voltage from metadata."""
avg_str = metadata.get("Average", "")
if avg_str.startswith("V="):
value = float(avg_str[2:].replace("mV", "").replace("V", ""))
# Convert mV to V if needed
if "mV" in avg_str:
return value / 1000.0
return value
return None

100
scope_parser/data.py Normal file
View File

@ -0,0 +1,100 @@
"""
Data structures for oscilloscope measurements.
"""
from dataclasses import dataclass
from typing import List, Dict, Optional
import numpy as np
@dataclass
class ChannelData:
"""Represents data from a single oscilloscope channel."""
channel_name: str
voltage_values: np.ndarray # in volts
time_values: np.ndarray # in seconds
metadata: Dict[str, str]
@property
def frequency(self) -> Optional[float]:
"""Extract frequency from metadata if available."""
freq_str = self.metadata.get("Frequency", "")
if freq_str.startswith("F="):
# Extract frequency value and convert units
freq_value = freq_str[2:]
if "kHz" in freq_value:
return float(freq_value.replace("kHz", "")) * 1000
elif "Hz" in freq_value:
return float(freq_value.replace("Hz", ""))
return None
@property
def vpp(self) -> Optional[float]:
"""Peak-to-peak voltage in volts."""
pp_str = self.metadata.get("PK-PK", "")
if pp_str.startswith("Vpp="):
value = float(pp_str[4:].replace("mV", "").replace("V", ""))
# Convert mV to V if needed
if "mV" in pp_str:
return value / 1000.0
return value
return None
@property
def average(self) -> Optional[float]:
"""Average voltage in volts (computed from data)."""
return float(np.mean(self.voltage_values))
@property
def metadata_average(self) -> Optional[float]:
"""Average voltage from metadata in volts."""
avg_str = self.metadata.get("Average", "")
if avg_str.startswith("V="):
value = float(avg_str[2:].replace("mV", "").replace("V", ""))
# Convert mV to V if needed
if "mV" in avg_str:
return value / 1000.0
return value
return None
@property
def time_interval(self) -> Optional[float]:
"""Time interval between samples in seconds."""
interval_str = self.metadata.get("Time interval", "")
if interval_str:
if "uS" in interval_str:
return float(interval_str.replace("uS", "")) * 1e-6
elif "nS" in interval_str:
return float(interval_str.replace("nS", "")) * 1e-9
elif "mS" in interval_str:
return float(interval_str.replace("mS", "")) * 1e-3
elif "S" in interval_str:
return float(interval_str.replace("S", ""))
return None
@dataclass
class ScopeData:
"""Container for all oscilloscope measurement data."""
channels: Dict[str, ChannelData]
metadata: Dict[str, str]
def __getitem__(self, channel_name: str) -> ChannelData:
"""Allow dictionary-like access to channels."""
return self.channels[channel_name]
def __iter__(self):
"""Allow iteration over channels."""
return iter(self.channels.values())
@property
def channel_names(self) -> List[str]:
"""Get list of all channel names."""
return list(self.channels.keys())
@property
def num_channels(self) -> int:
"""Get number of channels."""
return len(self.channels)

View File

@ -0,0 +1,118 @@
"""
Parser for Gwinstek oscilloscope CSV files.
"""
import csv
from typing import Dict, List
import numpy as np
from .base_parser import BaseOscilloscopeParser
from .data import ScopeData, ChannelData
class GwinstekParser(BaseOscilloscopeParser):
"""Parser for Gwinstek oscilloscope CSV files."""
def can_parse(self, file_path: str) -> bool:
"""Check if file is from Gwinstek scope."""
try:
with open(file_path, "r") as f:
first_lines = [f.readline().strip() for _ in range(10)]
# Gwinstek-specific
return any("Memory Length" in line for line in first_lines)
except:
return False
def parse(self, file_path: str) -> ScopeData:
"""Parse Gwinstek oscilloscope CSV file."""
with open(file_path, "r") as f:
# Read header metadata
metadata_lines = []
data_start_line = 0
for i, line in enumerate(f):
line = line.strip()
if line.startswith("Waveform Data"): # Gwinstek uses this as separator
data_start_line = i + 1
break
metadata_lines.append(line)
# Parse metadata
metadata = self._parse_metadata(metadata_lines)
# Reset file pointer to data section
f.seek(0)
for _ in range(data_start_line):
next(f)
# Parse waveform data (just numbers, one per line)
voltage_data = []
time_data = []
for i, line in enumerate(f):
line = line.strip()
if not line: # Skip empty lines
continue
# Remove trailing comma TODO: If 2ch this might not be trailing
if line.endswith(","):
line = line[:-1]
try:
# Gwinstek data is in pixels, yes its dumb
pixel_value = float(line)
# Get volts per division from metadata
volts_per_division = float(metadata.get("Vertical Scale", "1.0"))
vertical_position = float(metadata.get("Vertical Position", "0.0"))
# Convert pixels to voltage: 25 pixels per division
# Pixel 0 is in the middle, so we center around vertical_position
voltage = (
pixel_value / 25.0
) * volts_per_division + vertical_position
voltage_data.append(voltage)
# Calculate time values from sampling period
sampling_period = float(metadata.get("Sampling Period", "2.0E-06"))
time_data.append(i * sampling_period)
except ValueError:
# Skip non-numeric lines
continue
# Create channel data
channel_name = metadata.get("Source", "CH1")
channel_data = ChannelData(
channel_name=channel_name,
voltage_values=np.array(voltage_data),
time_values=np.array(time_data),
metadata=metadata,
)
return ScopeData(channels={channel_name: channel_data}, metadata=metadata)
def _parse_metadata(self, metadata_lines: List[str]) -> Dict[str, str]:
"""Parse metadata from header lines."""
metadata = {}
for line in metadata_lines:
if "," in line:
parts = line.split(",", 2) # Gwinstek has 3 parts: key, value, empty
if len(parts) >= 2:
key = parts[0].strip()
value = parts[1].strip()
if value: # Only add non-empty values
metadata[key] = value
return metadata
def _extract_time_interval(self, metadata: Dict[str, str]) -> float:
"""Extract time interval between samples for Gwinstek format."""
sampling_period = metadata.get("Sampling Period", "2.0E-06")
try:
return float(sampling_period)
except ValueError:
return 2.0e-6 # Default to 2 µs

107
scope_parser/owon_parser.py Normal file
View File

@ -0,0 +1,107 @@
"""
Parser for OWON oscilloscope CSV files.
"""
import csv
from typing import Dict, List
import numpy as np
from .base_parser import BaseOscilloscopeParser
from .data import ScopeData, ChannelData
class OwonParser(BaseOscilloscopeParser):
"""Parser for OWON oscilloscope CSV files."""
def can_parse(self, file_path: str) -> bool:
"""Check if file is from OWON scope."""
try:
with open(file_path, "r") as f:
first_lines = [f.readline().strip() for _ in range(10)]
# Look for OWON-specific patterns
return any("Channel" in line and "CH" in line for line in first_lines)
except:
return False
def parse(self, file_path: str) -> ScopeData:
"""Parse OWON oscilloscope CSV file."""
with open(file_path, "r") as f:
# Read header metadata
metadata_lines = []
data_start_line = 0
for i, line in enumerate(f):
line = line.strip()
if not line: # Empty line indicates end of metadata
data_start_line = i + 1
break
metadata_lines.append(line)
# Parse metadata
metadata = self._parse_metadata(metadata_lines)
# Reset file pointer to data section
f.seek(0)
for _ in range(data_start_line):
next(f)
# Parse CSV data
reader = csv.DictReader(f)
# Extract data columns
voltage_data = []
time_data = []
for row in reader:
# Get voltage data (look for CH*_Voltage column)
voltage_col = None
for col_name in row.keys():
if "Voltage" in col_name:
voltage_col = col_name
break
if voltage_col is None:
raise ValueError("Could not find voltage column in CSV data")
# Convert mV to volts
voltage_mv = float(row[voltage_col])
voltage_data.append(voltage_mv / 1000.0)
# Calculate time values from index and time interval
index = int(row["index"])
time_interval = self._extract_time_interval(metadata)
time_data.append(index * time_interval)
# Create channel data
channel_name = metadata.get("Channel", "CH1").replace(":", "").strip()
channel_data = ChannelData(
channel_name=channel_name,
voltage_values=np.array(voltage_data),
time_values=np.array(time_data),
metadata=metadata,
)
return ScopeData(channels={channel_name: channel_data}, metadata=metadata)
def _parse_metadata(self, metadata_lines: List[str]) -> Dict[str, str]:
"""
Parse metadata from header lines.
You can access the metadata like this:
data = parse_owon_data(".CSV")
print(data.frequency)
print(data.vpp)
"""
metadata = {}
for line in metadata_lines:
if "," in line:
parts = line.split(",", 1)
if len(parts) == 2:
key = parts[0].strip().rstrip(":").strip()
value = parts[1].strip()
metadata[key] = value
return metadata

19
scope_parser/parsers.py Normal file
View File

@ -0,0 +1,19 @@
"""
Main Parsers module
"""
from .owon_parser import OwonParser
from .gwinstek_parser import GwinstekParser
from .data import ScopeData
def parse_owon_data(file_path: str) -> ScopeData:
"""Parse OWON oscilloscope CSV file."""
parser = OwonParser()
return parser.parse(file_path)
def parse_gwinstek_data(file_path: str) -> ScopeData:
"""Parse Gwinstek oscilloscope CSV file."""
parser = GwinstekParser()
return parser.parse(file_path)

46
setup.py Normal file
View File

@ -0,0 +1,46 @@
"""
Setup script for simple-scope-parser package.
"""
from setuptools import setup, find_packages
with open("README.md", "r", encoding="utf-8") as fh:
long_description = fh.read()
setup(
name="simple-scope-parser",
version="0.1.0",
author="Joe",
description="A simple package for parsing oscilloscope CSV data from various manufacturers",
long_description=long_description,
long_description_content_type="text/markdown",
packages=find_packages(),
classifiers=[
"Development Status :: 3 - Alpha",
"Intended Audience :: Science/Research",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Topic :: Scientific/Engineering :: Physics",
],
python_requires=">=3.7",
install_requires=[
"numpy>=1.19.0",
],
extras_require={
"dev": [
"pytest>=6.0",
"black>=21.0",
"flake8>=3.8",
],
"analysis": [
"scipy>=1.7.0",
"matplotlib>=3.3.0",
],
},
)