From b4986d7ff5b1f990d75c03950dac32c283e5d690 Mon Sep 17 00:00:00 2001 From: slowy07 Date: Tue, 27 May 2025 03:02:09 +0700 Subject: [PATCH] docs: adding documentation of benchmark Signed-off-by: slowy07 --- README.md | 8 +- mega/op/arithmethic.pyx | 4 +- pyproject.toml | 8 +- test/bench/sigma_z_benchmark_vertical.png | Bin 0 -> 49843 bytes uv.lock | 250 +++++++++++++++++++++- 5 files changed, 265 insertions(+), 5 deletions(-) create mode 100644 test/bench/sigma_z_benchmark_vertical.png diff --git a/README.md b/README.md index 428e990..7ad0150 100644 --- a/README.md +++ b/README.md @@ -37,5 +37,11 @@ uv pip install -e . import mega.op.function as function number: float = 5.2 -print(function.gamma(number)) +gamma_function = mega.GammaZ(number) +print(gamma_function.compute()) ``` + +## benchmark information + +**Sigma Function** +![sigma_z_benchmark](test/sigma_z_benchmark_vertical.png) diff --git a/mega/op/arithmethic.pyx b/mega/op/arithmethic.pyx index 640faee..8c3bcbe 100644 --- a/mega/op/arithmethic.pyx +++ b/mega/op/arithmethic.pyx @@ -114,7 +114,7 @@ cdef class SigmaZ: """ Return string representation of the object """ - return f"SigmaZ({self.n}, {self.z}) = {SigmaZ(self.n, self.z).compute()}" + return f"SigmaZ({self.n}, {self.z})" cdef class EulerPhi: """ @@ -238,3 +238,5 @@ cdef class EulerPhi: def __repr__(self): return f"EulerPhi({self.n})" + + diff --git a/pyproject.toml b/pyproject.toml index 0e5e40d..02e6052 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,6 +11,12 @@ dependencies = [ "cython>=3.1.0", "numpy>=2.2.6", "pre-commit>=4.2.0", - "pytest>=8.3.5", "setuptools>=80.7.1", ] + +[dependency-groups] +dev = [ + "black>=25.1.0", + "matplotlib>=3.10.3", + "pytest>=8.3.5", +] diff --git a/test/bench/sigma_z_benchmark_vertical.png b/test/bench/sigma_z_benchmark_vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..d08b7f97ad41dd8c08db97781b0e0bc7146cc51a GIT binary patch literal 49843 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 F|6j195U~IN literal 0 HcmV?d00001 diff --git a/uv.lock b/uv.lock index 4ab7a70..7191bc6 100644 --- a/uv.lock +++ b/uv.lock @@ -1,6 +1,26 @@ version = 1 requires-python = ">=3.13" +[[package]] +name = "black" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "mypy-extensions" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/94/49/26a7b0f3f35da4b5a65f081943b7bcd22d7002f5f0fb8098ec1ff21cb6ef/black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", size = 649449 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/87/0edf98916640efa5d0696e1abb0a8357b52e69e82322628f25bf14d263d1/black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", size = 1650673 }, + { url = "https://files.pythonhosted.org/packages/52/e5/f7bf17207cf87fa6e9b676576749c6b6ed0d70f179a3d812c997870291c3/black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", size = 1453190 }, + { url = "https://files.pythonhosted.org/packages/e3/ee/adda3d46d4a9120772fae6de454c8495603c37c4c3b9c60f25b1ab6401fe/black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", size = 1782926 }, + { url = "https://files.pythonhosted.org/packages/cc/64/94eb5f45dcb997d2082f097a3944cfc7fe87e071907f677e80788a2d7b7a/black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", size = 1442613 }, + { url = "https://files.pythonhosted.org/packages/09/71/54e999902aed72baf26bca0d50781b01838251a462612966e9fc4891eadd/black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", size = 207646 }, +] + [[package]] name = "cfgv" version = "3.4.0" @@ -10,6 +30,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249 }, ] +[[package]] +name = "click" +version = "8.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215 }, +] + [[package]] name = "colorama" version = "0.4.6" @@ -19,6 +51,46 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, ] +[[package]] +name = "contourpy" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/61/5673f7e364b31e4e7ef6f61a4b5121c5f170f941895912f773d95270f3a2/contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", size = 271630 }, + { url = "https://files.pythonhosted.org/packages/ff/66/a40badddd1223822c95798c55292844b7e871e50f6bfd9f158cb25e0bd39/contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", size = 255670 }, + { url = "https://files.pythonhosted.org/packages/1e/c7/cf9fdee8200805c9bc3b148f49cb9482a4e3ea2719e772602a425c9b09f8/contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", size = 306694 }, + { url = "https://files.pythonhosted.org/packages/dd/e7/ccb9bec80e1ba121efbffad7f38021021cda5be87532ec16fd96533bb2e0/contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", size = 345986 }, + { url = "https://files.pythonhosted.org/packages/dc/49/ca13bb2da90391fa4219fdb23b078d6065ada886658ac7818e5441448b78/contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", size = 318060 }, + { url = "https://files.pythonhosted.org/packages/c8/65/5245ce8c548a8422236c13ffcdcdada6a2a812c361e9e0c70548bb40b661/contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", size = 322747 }, + { url = "https://files.pythonhosted.org/packages/72/30/669b8eb48e0a01c660ead3752a25b44fdb2e5ebc13a55782f639170772f9/contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", size = 1308895 }, + { url = "https://files.pythonhosted.org/packages/05/5a/b569f4250decee6e8d54498be7bdf29021a4c256e77fe8138c8319ef8eb3/contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", size = 1379098 }, + { url = "https://files.pythonhosted.org/packages/19/ba/b227c3886d120e60e41b28740ac3617b2f2b971b9f601c835661194579f1/contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", size = 178535 }, + { url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", size = 223096 }, + { url = "https://files.pythonhosted.org/packages/54/4c/e76fe2a03014a7c767d79ea35c86a747e9325537a8b7627e0e5b3ba266b4/contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", size = 285090 }, + { url = "https://files.pythonhosted.org/packages/7b/e2/5aba47debd55d668e00baf9651b721e7733975dc9fc27264a62b0dd26eb8/contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", size = 268643 }, + { url = "https://files.pythonhosted.org/packages/a1/37/cd45f1f051fe6230f751cc5cdd2728bb3a203f5619510ef11e732109593c/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", size = 310443 }, + { url = "https://files.pythonhosted.org/packages/8b/a2/36ea6140c306c9ff6dd38e3bcec80b3b018474ef4d17eb68ceecd26675f4/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", size = 349865 }, + { url = "https://files.pythonhosted.org/packages/95/b7/2fc76bc539693180488f7b6cc518da7acbbb9e3b931fd9280504128bf956/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", size = 321162 }, + { url = "https://files.pythonhosted.org/packages/f4/10/76d4f778458b0aa83f96e59d65ece72a060bacb20cfbee46cf6cd5ceba41/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", size = 327355 }, + { url = "https://files.pythonhosted.org/packages/43/a3/10cf483ea683f9f8ab096c24bad3cce20e0d1dd9a4baa0e2093c1c962d9d/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", size = 1307935 }, + { url = "https://files.pythonhosted.org/packages/78/73/69dd9a024444489e22d86108e7b913f3528f56cfc312b5c5727a44188471/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", size = 1372168 }, + { url = "https://files.pythonhosted.org/packages/0f/1b/96d586ccf1b1a9d2004dd519b25fbf104a11589abfd05484ff12199cca21/contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", size = 189550 }, + { url = "https://files.pythonhosted.org/packages/b0/e6/6000d0094e8a5e32ad62591c8609e269febb6e4db83a1c75ff8868b42731/contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", size = 238214 }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321 }, +] + [[package]] name = "cython" version = "3.1.1" @@ -56,6 +128,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215 }, ] +[[package]] +name = "fonttools" +version = "4.58.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/cf/4d037663e2a1fe30fddb655d755d76e18624be44ad467c07412c2319ab97/fonttools-4.58.0.tar.gz", hash = "sha256:27423d0606a2c7b336913254bf0b1193ebd471d5f725d665e875c5e88a011a43", size = 3514522 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/d7/d77cae11c445916d767cace93ba8283b3f360197d95d7470b90a9e984e10/fonttools-4.58.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4809790f2371d8a08e59e1ce2b734c954cf09742e75642d7f4c46cfdac488fdd", size = 2728320 }, + { url = "https://files.pythonhosted.org/packages/77/48/7d8b3c519ef4b48081d40310262224a38785e39a8610ccb92a229a6f085d/fonttools-4.58.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b00f240280f204ce4546b05ff3515bf8ff47a9cae914c718490025ea2bb9b324", size = 2302570 }, + { url = "https://files.pythonhosted.org/packages/2c/48/156b83eb8fb7261056e448bfda1b495b90e761b28ec23cee10e3e19f1967/fonttools-4.58.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a62015ad463e1925544e9159dd6eefe33ebfb80938d5ab15d8b1c4b354ff47b", size = 4790066 }, + { url = "https://files.pythonhosted.org/packages/60/49/aaecb1b3cea2b9b9c7cea6240d6bc8090feb5489a6fbf93cb68003be979b/fonttools-4.58.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ceef6f6ab58061a811967e3e32e630747fcb823dcc33a9a2c80e2d0d17cb292", size = 4861076 }, + { url = "https://files.pythonhosted.org/packages/dc/c8/97cbb41bee81ea9daf6109e0f3f70a274a3c69418e5ac6b0193f5dacf506/fonttools-4.58.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c7be21ac52370b515cdbdd0f400803fd29432a4fa4ddb4244ac8b322e54f36c0", size = 4858394 }, + { url = "https://files.pythonhosted.org/packages/4d/23/c2c231457361f869a7d7374a557208e303b469d48a4a697c0fb249733ea1/fonttools-4.58.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:85836be4c3c4aacf6fcb7a6f263896d0e9ce431da9fa6fe9213d70f221f131c9", size = 5002160 }, + { url = "https://files.pythonhosted.org/packages/a9/e0/c2262f941a43b810c5c192db94b5d1ce8eda91bec2757f7e2416398f4072/fonttools-4.58.0-cp313-cp313-win32.whl", hash = "sha256:2b32b7130277bd742cb8c4379a6a303963597d22adea77a940343f3eadbcaa4c", size = 2171919 }, + { url = "https://files.pythonhosted.org/packages/8f/ee/e4aa7bb4ce510ad57a808d321df1bbed1eeb6e1dfb20aaee1a5d9c076849/fonttools-4.58.0-cp313-cp313-win_amd64.whl", hash = "sha256:75e68ee2ec9aaa173cf5e33f243da1d51d653d5e25090f2722bc644a78db0f1a", size = 2222972 }, + { url = "https://files.pythonhosted.org/packages/9b/1f/4417c26e26a1feab85a27e927f7a73d8aabc84544be8ba108ce4aa90eb1e/fonttools-4.58.0-py3-none-any.whl", hash = "sha256:c96c36880be2268be409df7b08c5b5dacac1827083461a6bc2cb07b8cbcec1d7", size = 1111440 }, +] + [[package]] name = "identify" version = "2.6.12" @@ -74,6 +163,73 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050 }, ] +[[package]] +name = "kiwisolver" +version = "1.4.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", size = 97538 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/b3/e62464a652f4f8cd9006e13d07abad844a47df1e6537f73ddfbf1bc997ec/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09", size = 124156 }, + { url = "https://files.pythonhosted.org/packages/8d/2d/f13d06998b546a2ad4f48607a146e045bbe48030774de29f90bdc573df15/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1", size = 66555 }, + { url = "https://files.pythonhosted.org/packages/59/e3/b8bd14b0a54998a9fd1e8da591c60998dc003618cb19a3f94cb233ec1511/kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c", size = 65071 }, + { url = "https://files.pythonhosted.org/packages/f0/1c/6c86f6d85ffe4d0ce04228d976f00674f1df5dc893bf2dd4f1928748f187/kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b", size = 1378053 }, + { url = "https://files.pythonhosted.org/packages/4e/b9/1c6e9f6dcb103ac5cf87cb695845f5fa71379021500153566d8a8a9fc291/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47", size = 1472278 }, + { url = "https://files.pythonhosted.org/packages/ee/81/aca1eb176de671f8bda479b11acdc42c132b61a2ac861c883907dde6debb/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16", size = 1478139 }, + { url = "https://files.pythonhosted.org/packages/49/f4/e081522473671c97b2687d380e9e4c26f748a86363ce5af48b4a28e48d06/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc", size = 1413517 }, + { url = "https://files.pythonhosted.org/packages/8f/e9/6a7d025d8da8c4931522922cd706105aa32b3291d1add8c5427cdcd66e63/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246", size = 1474952 }, + { url = "https://files.pythonhosted.org/packages/82/13/13fa685ae167bee5d94b415991c4fc7bb0a1b6ebea6e753a87044b209678/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794", size = 2269132 }, + { url = "https://files.pythonhosted.org/packages/ef/92/bb7c9395489b99a6cb41d502d3686bac692586db2045adc19e45ee64ed23/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b", size = 2425997 }, + { url = "https://files.pythonhosted.org/packages/ed/12/87f0e9271e2b63d35d0d8524954145837dd1a6c15b62a2d8c1ebe0f182b4/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3", size = 2376060 }, + { url = "https://files.pythonhosted.org/packages/02/6e/c8af39288edbce8bf0fa35dee427b082758a4b71e9c91ef18fa667782138/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957", size = 2520471 }, + { url = "https://files.pythonhosted.org/packages/13/78/df381bc7b26e535c91469f77f16adcd073beb3e2dd25042efd064af82323/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb", size = 2338793 }, + { url = "https://files.pythonhosted.org/packages/d0/dc/c1abe38c37c071d0fc71c9a474fd0b9ede05d42f5a458d584619cfd2371a/kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2", size = 71855 }, + { url = "https://files.pythonhosted.org/packages/a0/b6/21529d595b126ac298fdd90b705d87d4c5693de60023e0efcb4f387ed99e/kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30", size = 65430 }, + { url = "https://files.pythonhosted.org/packages/34/bd/b89380b7298e3af9b39f49334e3e2a4af0e04819789f04b43d560516c0c8/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c", size = 126294 }, + { url = "https://files.pythonhosted.org/packages/83/41/5857dc72e5e4148eaac5aa76e0703e594e4465f8ab7ec0fc60e3a9bb8fea/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc", size = 67736 }, + { url = "https://files.pythonhosted.org/packages/e1/d1/be059b8db56ac270489fb0b3297fd1e53d195ba76e9bbb30e5401fa6b759/kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712", size = 66194 }, + { url = "https://files.pythonhosted.org/packages/e1/83/4b73975f149819eb7dcf9299ed467eba068ecb16439a98990dcb12e63fdd/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e", size = 1465942 }, + { url = "https://files.pythonhosted.org/packages/c7/2c/30a5cdde5102958e602c07466bce058b9d7cb48734aa7a4327261ac8e002/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880", size = 1595341 }, + { url = "https://files.pythonhosted.org/packages/ff/9b/1e71db1c000385aa069704f5990574b8244cce854ecd83119c19e83c9586/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062", size = 1598455 }, + { url = "https://files.pythonhosted.org/packages/85/92/c8fec52ddf06231b31cbb779af77e99b8253cd96bd135250b9498144c78b/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7", size = 1522138 }, + { url = "https://files.pythonhosted.org/packages/0b/51/9eb7e2cd07a15d8bdd976f6190c0164f92ce1904e5c0c79198c4972926b7/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed", size = 1582857 }, + { url = "https://files.pythonhosted.org/packages/0f/95/c5a00387a5405e68ba32cc64af65ce881a39b98d73cc394b24143bebc5b8/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d", size = 2293129 }, + { url = "https://files.pythonhosted.org/packages/44/83/eeb7af7d706b8347548313fa3a3a15931f404533cc54fe01f39e830dd231/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165", size = 2421538 }, + { url = "https://files.pythonhosted.org/packages/05/f9/27e94c1b3eb29e6933b6986ffc5fa1177d2cd1f0c8efc5f02c91c9ac61de/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6", size = 2390661 }, + { url = "https://files.pythonhosted.org/packages/d9/d4/3c9735faa36ac591a4afcc2980d2691000506050b7a7e80bcfe44048daa7/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90", size = 2546710 }, + { url = "https://files.pythonhosted.org/packages/4c/fa/be89a49c640930180657482a74970cdcf6f7072c8d2471e1babe17a222dc/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85", size = 2349213 }, +] + +[[package]] +name = "matplotlib" +version = "3.10.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/26/91/d49359a21893183ed2a5b6c76bec40e0b1dcbf8ca148f864d134897cfc75/matplotlib-3.10.3.tar.gz", hash = "sha256:2f82d2c5bb7ae93aaaa4cd42aca65d76ce6376f83304fa3a630b569aca274df0", size = 34799811 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/c1/23cfb566a74c696a3b338d8955c549900d18fe2b898b6e94d682ca21e7c2/matplotlib-3.10.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9f2efccc8dcf2b86fc4ee849eea5dcaecedd0773b30f47980dc0cbeabf26ec84", size = 8180318 }, + { url = "https://files.pythonhosted.org/packages/6c/0c/02f1c3b66b30da9ee343c343acbb6251bef5b01d34fad732446eaadcd108/matplotlib-3.10.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3ddbba06a6c126e3301c3d272a99dcbe7f6c24c14024e80307ff03791a5f294e", size = 8051132 }, + { url = "https://files.pythonhosted.org/packages/b4/ab/8db1a5ac9b3a7352fb914133001dae889f9fcecb3146541be46bed41339c/matplotlib-3.10.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748302b33ae9326995b238f606e9ed840bf5886ebafcb233775d946aa8107a15", size = 8457633 }, + { url = "https://files.pythonhosted.org/packages/f5/64/41c4367bcaecbc03ef0d2a3ecee58a7065d0a36ae1aa817fe573a2da66d4/matplotlib-3.10.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a80fcccbef63302c0efd78042ea3c2436104c5b1a4d3ae20f864593696364ac7", size = 8601031 }, + { url = "https://files.pythonhosted.org/packages/12/6f/6cc79e9e5ab89d13ed64da28898e40fe5b105a9ab9c98f83abd24e46d7d7/matplotlib-3.10.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55e46cbfe1f8586adb34f7587c3e4f7dedc59d5226719faf6cb54fc24f2fd52d", size = 9406988 }, + { url = "https://files.pythonhosted.org/packages/b1/0f/eed564407bd4d935ffabf561ed31099ed609e19287409a27b6d336848653/matplotlib-3.10.3-cp313-cp313-win_amd64.whl", hash = "sha256:151d89cb8d33cb23345cd12490c76fd5d18a56581a16d950b48c6ff19bb2ab93", size = 8068034 }, + { url = "https://files.pythonhosted.org/packages/3e/e5/2f14791ff69b12b09e9975e1d116d9578ac684460860ce542c2588cb7a1c/matplotlib-3.10.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c26dd9834e74d164d06433dc7be5d75a1e9890b926b3e57e74fa446e1a62c3e2", size = 8218223 }, + { url = "https://files.pythonhosted.org/packages/5c/08/30a94afd828b6e02d0a52cae4a29d6e9ccfcf4c8b56cc28b021d3588873e/matplotlib-3.10.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:24853dad5b8c84c8c2390fc31ce4858b6df504156893292ce8092d190ef8151d", size = 8094985 }, + { url = "https://files.pythonhosted.org/packages/89/44/f3bc6b53066c889d7a1a3ea8094c13af6a667c5ca6220ec60ecceec2dabe/matplotlib-3.10.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68f7878214d369d7d4215e2a9075fef743be38fa401d32e6020bab2dfabaa566", size = 8483109 }, + { url = "https://files.pythonhosted.org/packages/ba/c7/473bc559beec08ebee9f86ca77a844b65747e1a6c2691e8c92e40b9f42a8/matplotlib-3.10.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6929fc618cb6db9cb75086f73b3219bbb25920cb24cee2ea7a12b04971a4158", size = 8618082 }, + { url = "https://files.pythonhosted.org/packages/d8/e9/6ce8edd264c8819e37bbed8172e0ccdc7107fe86999b76ab5752276357a4/matplotlib-3.10.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6c7818292a5cc372a2dc4c795e5c356942eb8350b98ef913f7fda51fe175ac5d", size = 9413699 }, + { url = "https://files.pythonhosted.org/packages/1b/92/9a45c91089c3cf690b5badd4be81e392ff086ccca8a1d4e3a08463d8a966/matplotlib-3.10.3-cp313-cp313t-win_amd64.whl", hash = "sha256:4f23ffe95c5667ef8a2b56eea9b53db7f43910fa4a2d5472ae0f72b64deab4d5", size = 8139044 }, +] + [[package]] name = "mega" version = "0.1.0" @@ -82,19 +238,40 @@ dependencies = [ { name = "cython" }, { name = "numpy" }, { name = "pre-commit" }, - { name = "pytest" }, { name = "setuptools" }, ] +[package.dev-dependencies] +dev = [ + { name = "black" }, + { name = "matplotlib" }, + { name = "pytest" }, +] + [package.metadata] requires-dist = [ { name = "cython", specifier = ">=3.1.0" }, { name = "numpy", specifier = ">=2.2.6" }, { name = "pre-commit", specifier = ">=4.2.0" }, - { name = "pytest", specifier = ">=8.3.5" }, { name = "setuptools", specifier = ">=80.7.1" }, ] +[package.metadata.requires-dev] +dev = [ + { name = "black", specifier = ">=25.1.0" }, + { name = "matplotlib", specifier = ">=3.10.3" }, + { name = "pytest", specifier = ">=8.3.5" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963 }, +] + [[package]] name = "nodeenv" version = "1.9.1" @@ -141,6 +318,45 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469 }, ] +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, +] + +[[package]] +name = "pillow" +version = "11.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/cb/bb5c01fcd2a69335b86c22142b2bccfc3464087efb7fd382eee5ffc7fdf7/pillow-11.2.1.tar.gz", hash = "sha256:a64dd61998416367b7ef979b73d3a85853ba9bec4c2925f74e588879a58716b6", size = 47026707 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/9c/447528ee3776e7ab8897fe33697a7ff3f0475bb490c5ac1456a03dc57956/pillow-11.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fdec757fea0b793056419bca3e9932eb2b0ceec90ef4813ea4c1e072c389eb28", size = 3190098 }, + { url = "https://files.pythonhosted.org/packages/b5/09/29d5cd052f7566a63e5b506fac9c60526e9ecc553825551333e1e18a4858/pillow-11.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0e130705d568e2f43a17bcbe74d90958e8a16263868a12c3e0d9c8162690830", size = 3030166 }, + { url = "https://files.pythonhosted.org/packages/71/5d/446ee132ad35e7600652133f9c2840b4799bbd8e4adba881284860da0a36/pillow-11.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bdb5e09068332578214cadd9c05e3d64d99e0e87591be22a324bdbc18925be0", size = 4408674 }, + { url = "https://files.pythonhosted.org/packages/69/5f/cbe509c0ddf91cc3a03bbacf40e5c2339c4912d16458fcb797bb47bcb269/pillow-11.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d189ba1bebfbc0c0e529159631ec72bb9e9bc041f01ec6d3233d6d82eb823bc1", size = 4496005 }, + { url = "https://files.pythonhosted.org/packages/f9/b3/dd4338d8fb8a5f312021f2977fb8198a1184893f9b00b02b75d565c33b51/pillow-11.2.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:191955c55d8a712fab8934a42bfefbf99dd0b5875078240943f913bb66d46d9f", size = 4518707 }, + { url = "https://files.pythonhosted.org/packages/13/eb/2552ecebc0b887f539111c2cd241f538b8ff5891b8903dfe672e997529be/pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155", size = 4610008 }, + { url = "https://files.pythonhosted.org/packages/72/d1/924ce51bea494cb6e7959522d69d7b1c7e74f6821d84c63c3dc430cbbf3b/pillow-11.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:750f96efe0597382660d8b53e90dd1dd44568a8edb51cb7f9d5d918b80d4de14", size = 4585420 }, + { url = "https://files.pythonhosted.org/packages/43/ab/8f81312d255d713b99ca37479a4cb4b0f48195e530cdc1611990eb8fd04b/pillow-11.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fe15238d3798788d00716637b3d4e7bb6bde18b26e5d08335a96e88564a36b6b", size = 4667655 }, + { url = "https://files.pythonhosted.org/packages/94/86/8f2e9d2dc3d308dfd137a07fe1cc478df0a23d42a6c4093b087e738e4827/pillow-11.2.1-cp313-cp313-win32.whl", hash = "sha256:3fe735ced9a607fee4f481423a9c36701a39719252a9bb251679635f99d0f7d2", size = 2332329 }, + { url = "https://files.pythonhosted.org/packages/6d/ec/1179083b8d6067a613e4d595359b5fdea65d0a3b7ad623fee906e1b3c4d2/pillow-11.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:74ee3d7ecb3f3c05459ba95eed5efa28d6092d751ce9bf20e3e253a4e497e691", size = 2676388 }, + { url = "https://files.pythonhosted.org/packages/23/f1/2fc1e1e294de897df39fa8622d829b8828ddad938b0eaea256d65b84dd72/pillow-11.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:5119225c622403afb4b44bad4c1ca6c1f98eed79db8d3bc6e4e160fc6339d66c", size = 2414950 }, + { url = "https://files.pythonhosted.org/packages/c4/3e/c328c48b3f0ead7bab765a84b4977acb29f101d10e4ef57a5e3400447c03/pillow-11.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8ce2e8411c7aaef53e6bb29fe98f28cd4fbd9a1d9be2eeea434331aac0536b22", size = 3192759 }, + { url = "https://files.pythonhosted.org/packages/18/0e/1c68532d833fc8b9f404d3a642991441d9058eccd5606eab31617f29b6d4/pillow-11.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9ee66787e095127116d91dea2143db65c7bb1e232f617aa5957c0d9d2a3f23a7", size = 3033284 }, + { url = "https://files.pythonhosted.org/packages/b7/cb/6faf3fb1e7705fd2db74e070f3bf6f88693601b0ed8e81049a8266de4754/pillow-11.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9622e3b6c1d8b551b6e6f21873bdcc55762b4b2126633014cea1803368a9aa16", size = 4445826 }, + { url = "https://files.pythonhosted.org/packages/07/94/8be03d50b70ca47fb434a358919d6a8d6580f282bbb7af7e4aa40103461d/pillow-11.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63b5dff3a68f371ea06025a1a6966c9a1e1ee452fc8020c2cd0ea41b83e9037b", size = 4527329 }, + { url = "https://files.pythonhosted.org/packages/fd/a4/bfe78777076dc405e3bd2080bc32da5ab3945b5a25dc5d8acaa9de64a162/pillow-11.2.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:31df6e2d3d8fc99f993fd253e97fae451a8db2e7207acf97859732273e108406", size = 4549049 }, + { url = "https://files.pythonhosted.org/packages/65/4d/eaf9068dc687c24979e977ce5677e253624bd8b616b286f543f0c1b91662/pillow-11.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:062b7a42d672c45a70fa1f8b43d1d38ff76b63421cbbe7f88146b39e8a558d91", size = 4635408 }, + { url = "https://files.pythonhosted.org/packages/1d/26/0fd443365d9c63bc79feb219f97d935cd4b93af28353cba78d8e77b61719/pillow-11.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4eb92eca2711ef8be42fd3f67533765d9fd043b8c80db204f16c8ea62ee1a751", size = 4614863 }, + { url = "https://files.pythonhosted.org/packages/49/65/dca4d2506be482c2c6641cacdba5c602bc76d8ceb618fd37de855653a419/pillow-11.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f91ebf30830a48c825590aede79376cb40f110b387c17ee9bd59932c961044f9", size = 4692938 }, + { url = "https://files.pythonhosted.org/packages/b3/92/1ca0c3f09233bd7decf8f7105a1c4e3162fb9142128c74adad0fb361b7eb/pillow-11.2.1-cp313-cp313t-win32.whl", hash = "sha256:e0b55f27f584ed623221cfe995c912c61606be8513bfa0e07d2c674b4516d9dd", size = 2335774 }, + { url = "https://files.pythonhosted.org/packages/a5/ac/77525347cb43b83ae905ffe257bbe2cc6fd23acb9796639a1f56aa59d191/pillow-11.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:36d6b82164c39ce5482f649b437382c0fb2395eabc1e2b1702a6deb8ad647d6e", size = 2681895 }, + { url = "https://files.pythonhosted.org/packages/67/32/32dc030cfa91ca0fc52baebbba2e009bb001122a1daa8b6a79ad830b38d3/pillow-11.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:225c832a13326e34f212d2072982bb1adb210e0cc0b153e688743018c94a2681", size = 2417234 }, +] + [[package]] name = "platformdirs" version = "4.3.8" @@ -175,6 +391,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/88/74/a88bf1b1efeae488a0c0b7bdf71429c313722d1fc0f377537fbe554e6180/pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd", size = 220707 }, ] +[[package]] +name = "pyparsing" +version = "3.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120 }, +] + [[package]] name = "pytest" version = "8.3.5" @@ -190,6 +415,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634 }, ] +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, +] + [[package]] name = "pyyaml" version = "6.0.2" @@ -216,6 +453,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/58/29/93c53c098d301132196c3238c312825324740851d77a8500a2462c0fd888/setuptools-80.8.0-py3-none-any.whl", hash = "sha256:95a60484590d24103af13b686121328cc2736bee85de8936383111e421b9edc0", size = 1201470 }, ] +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, +] + [[package]] name = "virtualenv" version = "20.31.2"