From d19799abfee9527f094cb57894bdfd6d4b637e5b Mon Sep 17 00:00:00 2001 From: Rory Byrne Date: Wed, 15 Jan 2025 00:45:14 +0000 Subject: [PATCH 1/6] feat: implement initial experiment tracking decorator and domain models The commit adds core functionality for tracking experiments using git, including: - A decorator for auto-committing experimental code with metadata - Domain models for commits and repositories - Service layer for git operations and experiment tracking - Dependency injection setup --- mthd/decorator.py | 51 ++++++++ mthd/domain/commit.py | 7 ++ mthd/domain/experiment.py | 0 mthd/domain/repository.py | 4 + mthd/service/__init__.py | 0 mthd/service/experiment.py | 1 + mthd/service/git.py | 1 + mthd/service/repository.py | 9 ++ mthd/util/__init__.py | 0 mthd/util/di.py | 26 ++++ mthd/util/model.py | 4 + pyproject.toml | 9 +- uv.lock | 247 +++++++++++++++++++++++++++++++++---- 13 files changed, 335 insertions(+), 24 deletions(-) create mode 100644 mthd/decorator.py create mode 100644 mthd/domain/commit.py create mode 100644 mthd/domain/experiment.py create mode 100644 mthd/domain/repository.py create mode 100644 mthd/service/__init__.py create mode 100644 mthd/service/experiment.py create mode 100644 mthd/service/git.py create mode 100644 mthd/service/repository.py create mode 100644 mthd/util/__init__.py create mode 100644 mthd/util/di.py create mode 100644 mthd/util/model.py diff --git a/mthd/decorator.py b/mthd/decorator.py new file mode 100644 index 0000000..3889216 --- /dev/null +++ b/mthd/decorator.py @@ -0,0 +1,51 @@ +from functools import wraps + +from typing import Callable, Optional + +from mthd.domain.commit import CommitMessage +from mthd.domain.repository import Repository +from mthd.service.repository import RepositoryService +from mthd.util.di import DI + + +def commit(fn: Optional[Callable] = None) -> Callable: + """Decorator to auto-commit experimental code with scientific metadata. + + Can be used as @commit or @commit(message="Custom message") + """ + + def decorator(func: Callable) -> Callable: + @wraps(func) + def wrapper(*args, **kwargs): + repository_service = DI().container.get(RepositoryService) + # Set up services + + # Generate commit message + commit_msg = CommitMessage( + summary=f"Experiment: {func.__name__}", + parameters=..., # exp_service.extract_parameters(func, args, kwargs), + annotations=..., # exp_service.extract_annotations(), + ) + + # Run experiment + result = func(*args, **kwargs) + + # Commit changes + repository_service.commit_changes(commit_msg) + + return result + + return wrapper + + if fn is None: + return decorator + return decorator(fn) + + +if __name__ == "__main__": + + @commit + def test(): + print("Hello") + + test() diff --git a/mthd/domain/commit.py b/mthd/domain/commit.py new file mode 100644 index 0000000..c50473c --- /dev/null +++ b/mthd/domain/commit.py @@ -0,0 +1,7 @@ +from mthd.util.model import Model + + +class CommitMessage(Model): + summary: str + parameters: dict + annotations: dict diff --git a/mthd/domain/experiment.py b/mthd/domain/experiment.py new file mode 100644 index 0000000..e69de29 diff --git a/mthd/domain/repository.py b/mthd/domain/repository.py new file mode 100644 index 0000000..d19ea42 --- /dev/null +++ b/mthd/domain/repository.py @@ -0,0 +1,4 @@ +from mthd.util.model import Model + + +class Repository(Model): ... diff --git a/mthd/service/__init__.py b/mthd/service/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mthd/service/experiment.py b/mthd/service/experiment.py new file mode 100644 index 0000000..80e3732 --- /dev/null +++ b/mthd/service/experiment.py @@ -0,0 +1 @@ +class ExperimentService: ... diff --git a/mthd/service/git.py b/mthd/service/git.py new file mode 100644 index 0000000..56a4d5b --- /dev/null +++ b/mthd/service/git.py @@ -0,0 +1 @@ +class GitService: ... diff --git a/mthd/service/repository.py b/mthd/service/repository.py new file mode 100644 index 0000000..a9b1624 --- /dev/null +++ b/mthd/service/repository.py @@ -0,0 +1,9 @@ +from mthd.domain.commit import CommitMessage +from mthd.service.git import GitService + + +class RepositoryService: + def __init__(self, git_service: GitService): + self._git_service = git_service + + def commit(self, message: CommitMessage): ... diff --git a/mthd/util/__init__.py b/mthd/util/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mthd/util/di.py b/mthd/util/di.py new file mode 100644 index 0000000..6613a78 --- /dev/null +++ b/mthd/util/di.py @@ -0,0 +1,26 @@ +from dishka import Provider, Scope, make_container + +from mthd.service.experiment import ExperimentService +from mthd.service.git import GitService +from mthd.service.repository import RepositoryService + + +class DI: + def __init__(self): + self._container = make_container(self.services) + + @property + def container(self): + return self._container + + @property + def core(self) -> Provider: ... + + @property + def services(self) -> Provider: + provider = Provider(scope=Scope.APP) + provider.provide(GitService) + provider.provide(RepositoryService) + provider.provide(ExperimentService) + + return provider diff --git a/mthd/util/model.py b/mthd/util/model.py new file mode 100644 index 0000000..c7ac90a --- /dev/null +++ b/mthd/util/model.py @@ -0,0 +1,4 @@ +from pydantic import BaseModel + + +class Model(BaseModel): ... diff --git a/pyproject.toml b/pyproject.toml index aa2add7..d47e430 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,14 +4,17 @@ description = "Git-based experiment tracking with semantic metadata." authors = [ { name = "Rory Byrne", email = "rory@rory.bio" } ] -requires-python = ">=3.9" -dependencies = [] +requires-python = ">=3.10" +dependencies = [ + "anot>=0.0.3", + "dishka>=1.4.2", + "pydantic>=2.10.5", +] classifiers = [ "Development Status :: 3 - Alpha", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", diff --git a/uv.lock b/uv.lock index e8c6f02..23bae64 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,95 @@ version = 1 -requires-python = ">=3.9" +requires-python = ">=3.10" + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, +] + +[[package]] +name = "anot" +version = "0.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "maturin" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8c/5d/ea040ec30f1a5b55dad20bafc172bc97d83b4199183305ea2a25fe03735b/anot-0.0.3.tar.gz", hash = "sha256:51b7fa1e15ea0943323371af527af8bdaa5e34e23c183236d483e5a38eac9c1a", size = 14114 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/5c/55f187408eca28efdfd36fba54d52af1bea0ade3cfd38092513c482146cd/anot-0.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63ef3b9138493be1f08a849c43802fdf00c4eaa65cf72ff18b7a792bbe323ff7", size = 602851 }, + { url = "https://files.pythonhosted.org/packages/15/6d/711f669358de192bbbba262d59f3f48067a39c83aa5ceb225244d0a878a2/anot-0.0.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:11e605d32911f3dee7b61ce3149ed7a47522c5bd78c27883ead966b6dff9173b", size = 601248 }, + { url = "https://files.pythonhosted.org/packages/a6/4e/f8c0cfd515e6f77ea1cb08e6a028177787af39420fa164ce3d4b702a0c67/anot-0.0.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ab4b51119bc6fce057bc8d9a5884e0f074616fbacee80bf717b55fedc4c6a5c", size = 657510 }, + { url = "https://files.pythonhosted.org/packages/df/2f/d3c12d608927d3be1d8c804ccf36d5037074d25babcd0ea43303de4f84d8/anot-0.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f633562fa80f926d3a45bb0ad3baae0a8af49a38771fc4025057ea712e4c6c74", size = 710119 }, + { url = "https://files.pythonhosted.org/packages/df/cb/a8c577bc184f421c2ba2b68efb99881f066808e382791674eb6ab27e198a/anot-0.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82a3014538f9521f82d2c50f167a7bba9cdea35bf76d0218623eb084ad9fd037", size = 693363 }, + { url = "https://files.pythonhosted.org/packages/bc/a9/be05d9f245e5610dd2de69e54094a0316d589ed00c88d8c7de81251a74af/anot-0.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:285e1c57321c7c71a13ab5246602b0d2c317227ceb93ac249eb6d0cb025d9f32", size = 616247 }, + { url = "https://files.pythonhosted.org/packages/7e/4f/6173eb4b7d64ec64a47cfe4044aa4d9b47d0eba70f95c44ab4de0d915048/anot-0.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6fa8b035a8b6749d7727ec28f2d21ed3ac621c91e17c98e13fade683ffd17a9d", size = 768288 }, + { url = "https://files.pythonhosted.org/packages/3f/89/24dcc56864d1985e7ed30142298399d6617b7bfadd6f00c5b91dad2429f4/anot-0.0.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:544d99acb0a255097dc66367d2fb04d10c2635d2378934767d45ea0c567a02a5", size = 851723 }, + { url = "https://files.pythonhosted.org/packages/49/ea/044ac9588aee40a012a14e70ec17b8f79cfdb864d4e1a7b8c3f871ef418e/anot-0.0.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:7430be6181f7b1640f6900f12d59b2086d3717d438e5d5dd12938b355a868d17", size = 802744 }, + { url = "https://files.pythonhosted.org/packages/62/c1/0e3a9a24a8b1bbea3c97bbc3ddc17da6bfa98a78fcc93040875369279e05/anot-0.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:49d2cae6cd6cffc25af9f149874fe6b1c240ae6e9af840aaf1ddcf40f1f28811", size = 775361 }, + { url = "https://files.pythonhosted.org/packages/3c/4b/1057e86a0445ce6e764deec1a8c7007d410a5c024bc6893f73ff854c83c3/anot-0.0.3-cp310-cp310-win32.whl", hash = "sha256:bda293aefbd6baf2b3fac3897d33e00c9306b50c116f79481470931a0abe28e2", size = 410991 }, + { url = "https://files.pythonhosted.org/packages/7f/01/a3129a2f294ec64b3dd31df7633fb45752c80fb56c7f46c6ddfc51da033f/anot-0.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:2b6548392cb342e0715db094e86d6d6190a4e7f1ec9952b6d1d0ab27718a7fa1", size = 440414 }, + { url = "https://files.pythonhosted.org/packages/be/c2/55ce672247709a701285e4f32083c3f82acf753b7570be21fe629011d4e1/anot-0.0.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3cfbae5a3a8d6e208512bd6e18be229648c7a43875be65376a3491481f37c429", size = 555874 }, + { url = "https://files.pythonhosted.org/packages/5f/5c/09e2eb62849470ba3f7939dd0ca13085d0e147eb9600781a0fc0352b738b/anot-0.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64d82cb3e7bd576d3478cc62dab7d3c2ed7f8150fabdebc5bc07639763df47d5", size = 548629 }, + { url = "https://files.pythonhosted.org/packages/29/74/bea5babbf55144e56c367d40423f23972a7d86224fc6c2e18a235610833d/anot-0.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd21c8e6bddaaa0331a93f4aacfef71851c978bb50330278d7936a06c74486a", size = 602950 }, + { url = "https://files.pythonhosted.org/packages/eb/39/428f9542966aef84d2649ce136d7af644f3b92553a87e45d8f809ed1c39d/anot-0.0.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a06a97beaaa15d2005578b38018d705127530adabc9b9ee0c4f32933180c9b6", size = 601360 }, + { url = "https://files.pythonhosted.org/packages/9e/c5/612b7963ea4f2f837846fc31770b1e1c7e816f0ae489a0dfe774e7e19b93/anot-0.0.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c356fa3975d35e79d4bb006f33f0c7d134599b552de9bf70f7dfbd7f467bf5fb", size = 657271 }, + { url = "https://files.pythonhosted.org/packages/5b/96/5e8dec768e4f69bebb512798b1a9768158d1702ad14bff29345a61b06e87/anot-0.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06c7b6916514814274b1e8dd40ba4d359643158b4facebc2df744789bd3693f2", size = 710093 }, + { url = "https://files.pythonhosted.org/packages/e8/98/dc286eb4ea66d8ce46827d81b7f62161fe99332970a586bb88ac6b409391/anot-0.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5f703f3002a849dabd59102ca90aceb0631ad53e9146535f71225a154d9c6727", size = 693009 }, + { url = "https://files.pythonhosted.org/packages/66/bb/7cc6ee0420c5fc8dc003be1881f7e7656e297c842d268a06f1ad76d2585a/anot-0.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f6a63e064ab6abb7a06baf21c3187b562b9fd2e3cd495f93decda79f71a13ee", size = 616080 }, + { url = "https://files.pythonhosted.org/packages/19/ba/f565e54f3a5013ea1597695b44dc7192b5d215aea36be21b15de786c016c/anot-0.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c89111206f749cb5b2f9cc8d7a6f3e3614425eefd230d9a8f0e1b0d8fddbddae", size = 768264 }, + { url = "https://files.pythonhosted.org/packages/68/0e/92e30a2b334ee511c48d899f5dc37a8e04a7cb2c83e57adcfa34b5e7b695/anot-0.0.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:95fd3c721598ae88c7c36ed1918388cf966eeed765fb487415668f08b69e0734", size = 851535 }, + { url = "https://files.pythonhosted.org/packages/b2/1a/3f8a5d02270fdad056d9c4d6a9916232b2a9308e99e82e2941197ef225f2/anot-0.0.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:05c23bf40e682eba2ed860abe1044041e064c371ce0ac507211d605f09f3856f", size = 802714 }, + { url = "https://files.pythonhosted.org/packages/c0/76/32d2a174c66271e2cbbfc4874996dc7614388e94bf9c491c4e278cbfe312/anot-0.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:573b65f358d731f949155e4aa00a3fd95e54e8a60f9e6b13f314f00e0c5fd907", size = 775294 }, + { url = "https://files.pythonhosted.org/packages/fd/25/42ba1fcb6fb9f3885e3ccf4f8d3ae60b8b01b5cbcde5e7466c10025dfef9/anot-0.0.3-cp311-cp311-win32.whl", hash = "sha256:7618340709f9c1de3de2634ba55a79e512dc0fa2716c00739420e7bb8fc4a8e9", size = 410910 }, + { url = "https://files.pythonhosted.org/packages/11/48/7d64f19c785e1a0a1ed4e08ab69a2e686f7451a174abaa334e8770f9820e/anot-0.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:392352d1f7c9c587b7b7b6d9a81583bb442fb8f3dab8b7ef4fca0387b1e31bc4", size = 440346 }, + { url = "https://files.pythonhosted.org/packages/2a/86/7ed483759487b25ba7f90e1c725fce23535a68141d833606ca2eb32f6889/anot-0.0.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3996399e10bdede8f1f915ae2d50f6fb117c4f8797cda879da3edf9bbbd13e63", size = 554199 }, + { url = "https://files.pythonhosted.org/packages/71/44/e71b3c134ec64e0d3f64addb7f3d35e6e0eb411dff70e66b37d76e6d6df2/anot-0.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:120d0b972f6de378e636e371b052ba2f7a02c221059627cd482bce69f46ddcda", size = 547226 }, + { url = "https://files.pythonhosted.org/packages/d6/fd/f3ba211dd4f87e72fe34986795b3110924ab7f5c7b9881073a14e8c7d87d/anot-0.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f7f3ba4965d6257ae33191653fafcd37b75e640561de85d919fdb469cd034b2", size = 601710 }, + { url = "https://files.pythonhosted.org/packages/d1/f7/d850644e2e0a2e01670de7713f3f139a7e4569edb0d0c7900b81e3b32558/anot-0.0.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:92f6a787fc1cce7d5ba2421917ac6984f71eaf14c680cf6db83d889283ce65d4", size = 600811 }, + { url = "https://files.pythonhosted.org/packages/8e/9a/610667d7dd9d0befbe37555ee988d1c42c4eaaa5a9d8ec2b4713de7efd0b/anot-0.0.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad8743d4bdfb82b4508407a894e958118bfbe46b4c587c1257cff9200d9f48c3", size = 656659 }, + { url = "https://files.pythonhosted.org/packages/bd/b2/a4f386783949ba2dc017b3623311b0ec9ae4717198e8e1dee52e53efd60f/anot-0.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ee6c2d44004b8c256a5419126b4ae9fa8c4b34fb47a49ebfb069396c8380985", size = 709052 }, + { url = "https://files.pythonhosted.org/packages/94/4c/99889c86a9d2e036020fcb9ec205c4980e6baf24be3192b35cc14babd3d2/anot-0.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14ef507f5bdff31aa8ab2ef23031ea78ebc73bef25f28574c90c6ea36c340110", size = 691842 }, + { url = "https://files.pythonhosted.org/packages/55/b1/f85a34affc715275292c752661b049d72e12ee6b0f89865a2fbc56524fed/anot-0.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5da97373faf3bf4450a283b3118d2e17a623eb53910fc75f33682f4796ca9f1", size = 614665 }, + { url = "https://files.pythonhosted.org/packages/29/06/991c3684034205bead42529738657f541d9bf8c49aa1511e831b51582f58/anot-0.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:31d5a7942fdd1b2b3b889ab1ebac1115400ca1fefb4d23a683f3f4daa226b540", size = 767508 }, + { url = "https://files.pythonhosted.org/packages/5c/11/a3691691c4cfda99f7ef472259b0c5ebbc881ff5692f6cacde82e40a415f/anot-0.0.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d2e9550542c8889029f1e636688b629c3f824be7d0589b481d93c7dea2e95b2c", size = 850142 }, + { url = "https://files.pythonhosted.org/packages/5b/74/40cb0f4ce739642618b79b64263fa417cc77ae481febfa447b11ca64633d/anot-0.0.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:98ba2a240a788c18ed61d3291396dc724b44043bf75f68785486e9c1f6a27a43", size = 800285 }, + { url = "https://files.pythonhosted.org/packages/e1/22/8c523ef63130382e0e2b49fdb9497109681fe25f576195512bf7b0ddd6ff/anot-0.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9beec91e193c79107102afd23d975c6d0b1caf205dc336bec9c2ec2c7a2f7bb8", size = 773775 }, + { url = "https://files.pythonhosted.org/packages/06/37/fb1e979119779eabc2354d936258d595322308a6e2cc1e9290b172fcd47f/anot-0.0.3-cp312-cp312-win32.whl", hash = "sha256:60bd2f98d5081efc61ad8a1f672a1c9d9dd558b934b125c0512ab33d0d7853e7", size = 410358 }, + { url = "https://files.pythonhosted.org/packages/64/27/b6eefd8b498543fec6e2b560d7cfd67798f0a86e8b97d078b9f2cd6b11e1/anot-0.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:c76f2553162b546fd348b51f7cb0c565b2db76052b738f80e24ba8d4e04d58e3", size = 440128 }, + { url = "https://files.pythonhosted.org/packages/65/a0/f80853acc86f30b552e5b31c46c71852daad74236a7ce85e7a63409dd5f2/anot-0.0.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3c067a50440ecdb5603c548b2bf794e202cc76605e21789d6ebb80957c336923", size = 554361 }, + { url = "https://files.pythonhosted.org/packages/7a/9c/4191e19c361fb2f3a616ab11914d42d83e283eee22102e0ca78e08f93f1a/anot-0.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5c9e19723262759f4b209a553c638cea109ca9e6883dc3553681b47ed4ca7fc2", size = 547163 }, + { url = "https://files.pythonhosted.org/packages/db/b7/b99e2dc28b04a129eb23bd4584e5b3ad5b0b815faaa1fb03edf3f3c97927/anot-0.0.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9f27f4313d354f708bdd48813d63739353e11f8212f591c60b11cae293ae2a5", size = 602022 }, + { url = "https://files.pythonhosted.org/packages/55/cb/98634bc7dcf7b174ef2631907fc617b36409efa82d6cbb21534c59348698/anot-0.0.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a3d3a02a65bd9d095c224dd1b5c9617105d8023ede0879e15c1457991dfbc432", size = 600120 }, + { url = "https://files.pythonhosted.org/packages/33/e3/b6fcfb179b31c99fdda5d716649e33870b5c1e27cfefefce761f0b9fa5ee/anot-0.0.3-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a04ab9b6b728e721fb4a9902b8a842f3bf8c00ce912b17373bd227f3fa94b051", size = 655911 }, + { url = "https://files.pythonhosted.org/packages/ee/3c/d5c102f6dfa8d286a898aa937d84e5bc2533cd00df1d094df651140552d4/anot-0.0.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f11ebf7eae94851bf6259255fa95ef5f3e8b7a2897ba9e491241f31a95ca6c06", size = 709217 }, + { url = "https://files.pythonhosted.org/packages/5f/30/b37680ea1c6d1c7e42062c55132b7656b69253bfa76622c9d38ffa6b4d93/anot-0.0.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5181037e4f7fe88a292abb65efeeb6742879f68c1b75f4dd8e736a074b093ba2", size = 691631 }, + { url = "https://files.pythonhosted.org/packages/40/e3/dc18ab8ed232d0bc8e8828495d6408aaaa3c22bf079d62e42b03661dcf0e/anot-0.0.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0bb5b8cfd05b53befe9a005ff89f9477c27daa998cadd44aa3aeed8c48d49609", size = 614489 }, + { url = "https://files.pythonhosted.org/packages/2f/90/a4cd8bf149e182f1b30a318efa5a35340a6adf359b71d3f502946064f71a/anot-0.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:aa10ac6f2dbb4ff52520fd30e7ef80a6827665d8c1c2fb394a52a185a1564681", size = 767201 }, + { url = "https://files.pythonhosted.org/packages/2a/ca/6d12734b60cab628576fdc3ec9b82b6a4afbe9db853eb2c8dd5b19fe9ed8/anot-0.0.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:5e350847dbf8e4290c6d119d97daf79955278adedbfc66a1fa7ab99cc8233f43", size = 850854 }, + { url = "https://files.pythonhosted.org/packages/ff/13/e048318e2ceac9c0e9da0b2d2f915c15eec0a15f424fe9d15854238e1850/anot-0.0.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:362995eb0b268ab50ba57e82387887cdcde2e38ad88fcb436b49c1be16eb4843", size = 800816 }, + { url = "https://files.pythonhosted.org/packages/ae/1e/69e912a982b19756b09957b6f394bae2d670b55837549b1e21b0ec92d470/anot-0.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d9cb794d1cdf22cfe2210493c3eb7bc7567aff034abade8f33f3ff654b46e86d", size = 774052 }, + { url = "https://files.pythonhosted.org/packages/a9/95/a7cd7d5323732e647021370e9e99e9d79045301457a50ed3a609120f2bad/anot-0.0.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f3f15786ff57b57054a15ebe034245917a787b5bef0b60777ac670a01e0f8b9", size = 601118 }, + { url = "https://files.pythonhosted.org/packages/f9/20/10b631720fe01f8270bd5ad725d52b9da0059f1aba6373ff553e344228c0/anot-0.0.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ea2c169c5a66705fa754934bff2912bccd78107edecd639f31357bb65fc06932", size = 600090 }, + { url = "https://files.pythonhosted.org/packages/02/e0/59b85282d654680bab0111ee30d44b81e455368584e661c2dedadebcf3d8/anot-0.0.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8177d63e07ecd9a5d2f733471a0a982cb8c42050bb02ee6d52afc632f4ed4c0", size = 708884 }, + { url = "https://files.pythonhosted.org/packages/74/f0/2741c3c62c53488b3298855bad4adfed4022e8ceabe50f14a9cbf694623c/anot-0.0.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c06c43fae2e4c8c95d5408c9479e34ea955e31716daadf6f1f858000624e9ab4", size = 690719 }, + { url = "https://files.pythonhosted.org/packages/91/59/27b0429873b55fe04ee796a1b84bf7b8587d60340d0dc14393fefc26641e/anot-0.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ee4f39cff313fde0a4eab08cb6bd6ef3852bb258f275f090933f52b3c1e93407", size = 766767 }, + { url = "https://files.pythonhosted.org/packages/17/2f/146588dbe4b34ca39182cf5e66a85af0249b8735b049bd343a5589f11033/anot-0.0.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:2a23fde81e6c7eee7b7df5414a08e1fb72466ac6af64cf45fbd23aa63524ed4f", size = 849429 }, + { url = "https://files.pythonhosted.org/packages/b7/d8/2d209f1d7502ca635cde6766f12cf75620411ff494d182f31c3bbc2495c8/anot-0.0.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:803f984018a8d868770675a880d7a71196da8e7c964fc3c32fc0aec332054212", size = 800395 }, + { url = "https://files.pythonhosted.org/packages/b8/66/d5a7cafce69fee640244eb220da0bbdf214884568951b7d2a3261bf83611/anot-0.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:679d896538da1eb4cd72bf0f76f0fa687f5ce23856bbdaaf19a8974c3423ff6e", size = 773113 }, + { url = "https://files.pythonhosted.org/packages/68/af/329d70bd03d28db070371d479b47db4b0dbc37dbe505b9453feee4c7d224/anot-0.0.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:947d59c62ed1e9400296e687596073e1b895311bc261af9823485c7a147068b1", size = 603120 }, + { url = "https://files.pythonhosted.org/packages/e4/f9/38a40fda2aa602f90512ae4ae46c3ebd5608cdceac0b4a015c1b2ce7f5e9/anot-0.0.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bfda195971fce150b855b8a13972fca3f0699ee3c0c7aaac0fda28a5200520ad", size = 601881 }, + { url = "https://files.pythonhosted.org/packages/ba/4e/6c43509f62d045f812741e2d708868ba6486e2e7c974027a13a5ed40f956/anot-0.0.3-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a00a5599dbd9d6190c167cae780c6e769399e6cad7639a30f487c256adab1a4", size = 658831 }, + { url = "https://files.pythonhosted.org/packages/a1/54/ec3a004df50bbb915ca22e5add0149e5a2ffce98b36718689f9dbe04e550/anot-0.0.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4da95df29f710107b8f220c1c535100ad684d11d54d2e30b4f29f01afc31e4d5", size = 710406 }, + { url = "https://files.pythonhosted.org/packages/fd/79/93b3a204577e21f69b6afb3dbb3122c81defc50397933334d9ad6e759e76/anot-0.0.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d73b974bd57f7c8d27191ba21d58611c48f5112cd2eb317457a5f12580036e28", size = 693870 }, + { url = "https://files.pythonhosted.org/packages/bd/10/edc5861f8207b77d13d920d7da15a971283246e8d3bd317dd6c80af72141/anot-0.0.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7f3e8c096aca699ca64a87138c7687e96b4b4db7095222c083492d1f38fdd71", size = 616814 }, + { url = "https://files.pythonhosted.org/packages/90/42/845cabbc43f88e196b21ed4c776bec843ca75d9b25650d172a8c6df280e5/anot-0.0.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:14275ba104bae83f65a1fe963a2f05fc62282d62a1074d8adef42ced7647d6e3", size = 769163 }, + { url = "https://files.pythonhosted.org/packages/9a/3d/86d744da733bf36ed055758e14667dc35b348f0084b7fe4321d293e90b50/anot-0.0.3-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:a9db378e45c906a5d672ef4a5f7c995e18d28316b864c17668a29f18fc346801", size = 851555 }, + { url = "https://files.pythonhosted.org/packages/49/62/6d2b2584228076aeb8e50adff3f64c4cc136212ad019f9a5b44c88360965/anot-0.0.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:77ed9469a52907d09c2f0603635b6ad73fa7fcc1f9cd92619482cd3950603bf9", size = 802657 }, + { url = "https://files.pythonhosted.org/packages/87/55/7500a932eb65a36110f3012a00e85e4e81965edbfc1d1c5899409387eced/anot-0.0.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:f9a74ec1f6342758e08e4c7bf1260be4edd3d93d84bd3e3663e4954afb57868c", size = 775155 }, +] [[package]] name = "cfgv" @@ -75,19 +165,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/50/69/b3f2416725621e9f112e74e8470793d5b5995f146f596f133678a633b77e/coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2", size = 248737 }, { url = "https://files.pythonhosted.org/packages/3c/6e/fe899fb937657db6df31cc3e61c6968cb56d36d7326361847440a430152e/coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312", size = 211611 }, { url = "https://files.pythonhosted.org/packages/1c/55/52f5e66142a9d7bc93a15192eba7a78513d2abf6b3558d77b4ca32f5f424/coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d", size = 212781 }, - { url = "https://files.pythonhosted.org/packages/40/41/473617aadf9a1c15bc2d56be65d90d7c29bfa50a957a67ef96462f7ebf8e/coverage-7.6.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:656c82b8a0ead8bba147de9a89bda95064874c91a3ed43a00e687f23cc19d53a", size = 207978 }, - { url = "https://files.pythonhosted.org/packages/10/f6/480586607768b39a30e6910a3c4522139094ac0f1677028e1f4823688957/coverage-7.6.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccc2b70a7ed475c68ceb548bf69cec1e27305c1c2606a5eb7c3afff56a1b3b27", size = 208415 }, - { url = "https://files.pythonhosted.org/packages/f1/af/439bb760f817deff6f4d38fe7da08d9dd7874a560241f1945bc3b4446550/coverage-7.6.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5e37dc41d57ceba70956fa2fc5b63c26dba863c946ace9705f8eca99daecdc4", size = 236452 }, - { url = "https://files.pythonhosted.org/packages/d0/13/481f4ceffcabe29ee2332e60efb52e4694f54a402f3ada2bcec10bb32e43/coverage-7.6.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0aa9692b4fdd83a4647eeb7db46410ea1322b5ed94cd1715ef09d1d5922ba87f", size = 234374 }, - { url = "https://files.pythonhosted.org/packages/c5/59/4607ea9d6b1b73e905c7656da08d0b00cdf6e59f2293ec259e8914160025/coverage-7.6.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa744da1820678b475e4ba3dfd994c321c5b13381d1041fe9c608620e6676e25", size = 235505 }, - { url = "https://files.pythonhosted.org/packages/85/60/d66365723b9b7f29464b11d024248ed3523ce5aab958e4ad8c43f3f4148b/coverage-7.6.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0b1818063dc9e9d838c09e3a473c1422f517889436dd980f5d721899e66f315", size = 234616 }, - { url = "https://files.pythonhosted.org/packages/74/f8/2cf7a38e7d81b266f47dfcf137fecd8fa66c7bdbd4228d611628d8ca3437/coverage-7.6.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:59af35558ba08b758aec4d56182b222976330ef8d2feacbb93964f576a7e7a90", size = 233099 }, - { url = "https://files.pythonhosted.org/packages/50/2b/bff6c1c6b63c4396ea7ecdbf8db1788b46046c681b8fcc6ec77db9f4ea49/coverage-7.6.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7ed2f37cfce1ce101e6dffdfd1c99e729dd2ffc291d02d3e2d0af8b53d13840d", size = 234089 }, - { url = "https://files.pythonhosted.org/packages/bf/b5/baace1c754d546a67779358341aa8d2f7118baf58cac235db457e1001d1b/coverage-7.6.10-cp39-cp39-win32.whl", hash = "sha256:4bcc276261505d82f0ad426870c3b12cb177752834a633e737ec5ee79bbdff18", size = 210701 }, - { url = "https://files.pythonhosted.org/packages/b1/bf/9e1e95b8b20817398ecc5a1e8d3e05ff404e1b9fb2185cd71561698fe2a2/coverage-7.6.10-cp39-cp39-win_amd64.whl", hash = "sha256:457574f4599d2b00f7f637a0700a6422243b3565509457b2dbd3f50703e11f59", size = 211482 }, { url = "https://files.pythonhosted.org/packages/a1/70/de81bfec9ed38a64fc44a77c7665e20ca507fc3265597c28b0d989e4082e/coverage-7.6.10-pp39.pp310-none-any.whl", hash = "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f", size = 200223 }, ] +[[package]] +name = "dishka" +version = "1.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1e/a8/e78e0d08e9a2e7839d2742527600eb6f55313c6df07774a26848aa6a87b0/dishka-1.4.2.tar.gz", hash = "sha256:fe1e7b2d0df4306b39650cf4c05485aa79ce1fc31507d1f73300dec3c64b2397", size = 57511 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/30/403cbe18d8dda6ce1d95ecd1039e5b01fd39011dd6bf31647e9b61bd5758/dishka-1.4.2-py3-none-any.whl", hash = "sha256:5a59c6bf5ac9f34b3e698093207ddb871c13a0721eeb3948eb29011aee61f69c", size = 79798 }, +] + [[package]] name = "distlib" version = "0.3.9" @@ -133,10 +225,38 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, ] +[[package]] +name = "maturin" +version = "1.8.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9a/08/ccb0f917722a35ab0d758be9bb5edaf645c3a3d6170061f10d396ecd273f/maturin-1.8.1.tar.gz", hash = "sha256:49cd964aabf59f8b0a6969f9860d2cdf194ac331529caae14c884f5659568857", size = 197397 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/00/f34077315f34db8ad2ccf6bfe11b864ca27baab3a1320634da8e3cf89a48/maturin-1.8.1-py3-none-linux_armv6l.whl", hash = "sha256:7e590a23d9076b8a994f2e67bc63dc9a2d1c9a41b1e7b45ac354ba8275254e89", size = 7568415 }, + { url = "https://files.pythonhosted.org/packages/5c/07/9219976135ce0cb32d2fa6ea5c6d0ad709013d9a17967312e149b98153a6/maturin-1.8.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8d8251a95682c83ea60988c804b620c181911cd824aa107b4a49ac5333c92968", size = 14527816 }, + { url = "https://files.pythonhosted.org/packages/e6/04/fa009a00903acdd1785d58322193140bfe358595347c39f315112dabdf9e/maturin-1.8.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b9fc1a4354cac5e32c190410208039812ea88c4a36bd2b6499268ec49ef5de00", size = 7580446 }, + { url = "https://files.pythonhosted.org/packages/9b/d4/414b2aab9bbfe88182b734d3aa1b4fef7d7701e50f6be48500378b8c8721/maturin-1.8.1-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:621e171c6b39f95f1d0df69a118416034fbd59c0f89dcaea8c2ea62019deecba", size = 7650535 }, + { url = "https://files.pythonhosted.org/packages/f0/64/879418a8a0196013ec1fb19eada0781c04a30e8d6d9227e80f91275a4f5b/maturin-1.8.1-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:98f638739a5132962347871b85c91f525c9246ef4d99796ae98a2031e3df029f", size = 8006702 }, + { url = "https://files.pythonhosted.org/packages/39/c2/605829324f8371294f70303aca130682df75318958efed246873d3d604ab/maturin-1.8.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:f9f5c47521924b6e515cbc652a042fe5f17f8747445be9d931048e5d8ddb50a4", size = 7368164 }, + { url = "https://files.pythonhosted.org/packages/be/6c/30e136d397bb146b94b628c0ef7f17708281611b97849e2cf37847025ac7/maturin-1.8.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:0f4407c7353c31bfbb8cdeb82bc2170e474cbfb97b5ba27568f440c9d6c1fdd4", size = 7450889 }, + { url = "https://files.pythonhosted.org/packages/1b/50/e1f5023512696d4e56096f702e2f68d6d9a30afe0a4eec82b0e27b8eb4e4/maturin-1.8.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:ec49cd70cad3c389946c6e2bc0bd50772a7fcb463040dd800720345897eec9bf", size = 9585819 }, + { url = "https://files.pythonhosted.org/packages/b7/80/b24b5248d89d2e5982553900237a337ea098ca9297b8369ca2aa95549e0f/maturin-1.8.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08767d794de8f8a11c5c8b1b47a4ff9fb6ae2d2d97679e27030f2f509c8c2a0", size = 10920801 }, + { url = "https://files.pythonhosted.org/packages/6e/f4/8ede7a662fabf93456b44390a5ad22630e25fb5ddaecf787251071b2e143/maturin-1.8.1-py3-none-win32.whl", hash = "sha256:d678407713f3e10df33c5b3d7a343ec0551eb7f14d8ad9ba6febeb96f4e4c75c", size = 6873556 }, + { url = "https://files.pythonhosted.org/packages/9c/22/757f093ed0e319e9648155b8c9d716765442bea5bc98ebc58ad4ad5b0524/maturin-1.8.1-py3-none-win_amd64.whl", hash = "sha256:a526f90fe0e5cb59ffb81f4ff547ddc42e823bbdeae4a31012c0893ca6dcaf46", size = 7823153 }, + { url = "https://files.pythonhosted.org/packages/a4/f5/051413e04f6da25069db5e76759ecdb8cd2a8ab4a94045b5a3bf548c66fa/maturin-1.8.1-py3-none-win_arm64.whl", hash = "sha256:e95f077fd2ddd2f048182880eed458c308571a534be3eb2add4d3dac55bf57f4", size = 6552131 }, +] + [[package]] name = "mthd" -version = "0.1.dev1+g99bfa6d.d20250114" +version = "0.0.3.dev0+gfb27703.d20250114" source = { editable = "." } +dependencies = [ + { name = "anot" }, + { name = "dishka" }, + { name = "pydantic" }, +] [package.dev-dependencies] dev = [ @@ -149,6 +269,11 @@ dev = [ ] [package.metadata] +requires-dist = [ + { name = "anot", specifier = ">=0.0.3" }, + { name = "dishka", specifier = ">=1.4.2" }, + { name = "pydantic", specifier = ">=2.10.5" }, +] [package.metadata.requires-dev] dev = [ @@ -212,6 +337,95 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/16/8f/496e10d51edd6671ebe0432e33ff800aa86775d2d147ce7d43389324a525/pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878", size = 218713 }, ] +[[package]] +name = "pydantic" +version = "2.10.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/c7/ca334c2ef6f2e046b1144fe4bb2a5da8a4c574e7f2ebf7e16b34a6a2fa92/pydantic-2.10.5.tar.gz", hash = "sha256:278b38dbbaec562011d659ee05f63346951b3a248a6f3642e1bc68894ea2b4ff", size = 761287 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/26/82663c79010b28eddf29dcdd0ea723439535fa917fce5905885c0e9ba562/pydantic-2.10.5-py3-none-any.whl", hash = "sha256:4dd4e322dbe55472cb7ca7e73f4b63574eecccf2835ffa2af9021ce113c83c53", size = 431426 }, +] + +[[package]] +name = "pydantic-core" +version = "2.27.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/bc/fed5f74b5d802cf9a03e83f60f18864e90e3aed7223adaca5ffb7a8d8d64/pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa", size = 1895938 }, + { url = "https://files.pythonhosted.org/packages/71/2a/185aff24ce844e39abb8dd680f4e959f0006944f4a8a0ea372d9f9ae2e53/pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c", size = 1815684 }, + { url = "https://files.pythonhosted.org/packages/c3/43/fafabd3d94d159d4f1ed62e383e264f146a17dd4d48453319fd782e7979e/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a", size = 1829169 }, + { url = "https://files.pythonhosted.org/packages/a2/d1/f2dfe1a2a637ce6800b799aa086d079998959f6f1215eb4497966efd2274/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5", size = 1867227 }, + { url = "https://files.pythonhosted.org/packages/7d/39/e06fcbcc1c785daa3160ccf6c1c38fea31f5754b756e34b65f74e99780b5/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c", size = 2037695 }, + { url = "https://files.pythonhosted.org/packages/7a/67/61291ee98e07f0650eb756d44998214231f50751ba7e13f4f325d95249ab/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7", size = 2741662 }, + { url = "https://files.pythonhosted.org/packages/32/90/3b15e31b88ca39e9e626630b4c4a1f5a0dfd09076366f4219429e6786076/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a", size = 1993370 }, + { url = "https://files.pythonhosted.org/packages/ff/83/c06d333ee3a67e2e13e07794995c1535565132940715931c1c43bfc85b11/pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236", size = 1996813 }, + { url = "https://files.pythonhosted.org/packages/7c/f7/89be1c8deb6e22618a74f0ca0d933fdcb8baa254753b26b25ad3acff8f74/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962", size = 2005287 }, + { url = "https://files.pythonhosted.org/packages/b7/7d/8eb3e23206c00ef7feee17b83a4ffa0a623eb1a9d382e56e4aa46fd15ff2/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9", size = 2128414 }, + { url = "https://files.pythonhosted.org/packages/4e/99/fe80f3ff8dd71a3ea15763878d464476e6cb0a2db95ff1c5c554133b6b83/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af", size = 2155301 }, + { url = "https://files.pythonhosted.org/packages/2b/a3/e50460b9a5789ca1451b70d4f52546fa9e2b420ba3bfa6100105c0559238/pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4", size = 1816685 }, + { url = "https://files.pythonhosted.org/packages/57/4c/a8838731cb0f2c2a39d3535376466de6049034d7b239c0202a64aaa05533/pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31", size = 1982876 }, + { url = "https://files.pythonhosted.org/packages/c2/89/f3450af9d09d44eea1f2c369f49e8f181d742f28220f88cc4dfaae91ea6e/pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", size = 1893421 }, + { url = "https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", size = 1814998 }, + { url = "https://files.pythonhosted.org/packages/a6/3c/724039e0d848fd69dbf5806894e26479577316c6f0f112bacaf67aa889ac/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", size = 1826167 }, + { url = "https://files.pythonhosted.org/packages/2b/5b/1b29e8c1fb5f3199a9a57c1452004ff39f494bbe9bdbe9a81e18172e40d3/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", size = 1865071 }, + { url = "https://files.pythonhosted.org/packages/89/6c/3985203863d76bb7d7266e36970d7e3b6385148c18a68cc8915fd8c84d57/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", size = 2036244 }, + { url = "https://files.pythonhosted.org/packages/0e/41/f15316858a246b5d723f7d7f599f79e37493b2e84bfc789e58d88c209f8a/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", size = 2737470 }, + { url = "https://files.pythonhosted.org/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", size = 1992291 }, + { url = "https://files.pythonhosted.org/packages/bf/73/42c3742a391eccbeab39f15213ecda3104ae8682ba3c0c28069fbcb8c10d/pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", size = 1994613 }, + { url = "https://files.pythonhosted.org/packages/94/7a/941e89096d1175d56f59340f3a8ebaf20762fef222c298ea96d36a6328c5/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", size = 2002355 }, + { url = "https://files.pythonhosted.org/packages/6e/95/2359937a73d49e336a5a19848713555605d4d8d6940c3ec6c6c0ca4dcf25/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", size = 2126661 }, + { url = "https://files.pythonhosted.org/packages/2b/4c/ca02b7bdb6012a1adef21a50625b14f43ed4d11f1fc237f9d7490aa5078c/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", size = 2153261 }, + { url = "https://files.pythonhosted.org/packages/72/9d/a241db83f973049a1092a079272ffe2e3e82e98561ef6214ab53fe53b1c7/pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", size = 1812361 }, + { url = "https://files.pythonhosted.org/packages/e8/ef/013f07248041b74abd48a385e2110aa3a9bbfef0fbd97d4e6d07d2f5b89a/pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", size = 1982484 }, + { url = "https://files.pythonhosted.org/packages/10/1c/16b3a3e3398fd29dca77cea0a1d998d6bde3902fa2706985191e2313cc76/pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", size = 1867102 }, + { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 }, + { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 }, + { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 }, + { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 }, + { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 }, + { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 }, + { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 }, + { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 }, + { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 }, + { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 }, + { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 }, + { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 }, + { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 }, + { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 }, + { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, + { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, + { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, + { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, + { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, + { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, + { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, + { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, + { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, + { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, + { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, + { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, + { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, + { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, + { url = "https://files.pythonhosted.org/packages/46/72/af70981a341500419e67d5cb45abe552a7c74b66326ac8877588488da1ac/pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e", size = 1891159 }, + { url = "https://files.pythonhosted.org/packages/ad/3d/c5913cccdef93e0a6a95c2d057d2c2cba347815c845cda79ddd3c0f5e17d/pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8", size = 1768331 }, + { url = "https://files.pythonhosted.org/packages/f6/f0/a3ae8fbee269e4934f14e2e0e00928f9346c5943174f2811193113e58252/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3", size = 1822467 }, + { url = "https://files.pythonhosted.org/packages/d7/7a/7bbf241a04e9f9ea24cd5874354a83526d639b02674648af3f350554276c/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f", size = 1979797 }, + { url = "https://files.pythonhosted.org/packages/4f/5f/4784c6107731f89e0005a92ecb8a2efeafdb55eb992b8e9d0a2be5199335/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133", size = 1987839 }, + { url = "https://files.pythonhosted.org/packages/6d/a7/61246562b651dff00de86a5f01b6e4befb518df314c54dec187a78d81c84/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc", size = 1998861 }, + { url = "https://files.pythonhosted.org/packages/86/aa/837821ecf0c022bbb74ca132e117c358321e72e7f9702d1b6a03758545e2/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50", size = 2116582 }, + { url = "https://files.pythonhosted.org/packages/81/b0/5e74656e95623cbaa0a6278d16cf15e10a51f6002e3ec126541e95c29ea3/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9", size = 2151985 }, + { url = "https://files.pythonhosted.org/packages/63/37/3e32eeb2a451fddaa3898e2163746b0cffbbdbb4740d38372db0490d67f3/pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151", size = 2004715 }, +] + [[package]] name = "pyright" version = "1.1.391" @@ -296,15 +510,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, - { url = "https://files.pythonhosted.org/packages/65/d8/b7a1db13636d7fb7d4ff431593c510c8b8fca920ade06ca8ef20015493c5/PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", size = 184777 }, - { url = "https://files.pythonhosted.org/packages/0a/02/6ec546cd45143fdf9840b2c6be8d875116a64076218b61d68e12548e5839/PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", size = 172318 }, - { url = "https://files.pythonhosted.org/packages/0e/9a/8cc68be846c972bda34f6c2a93abb644fb2476f4dcc924d52175786932c9/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", size = 720891 }, - { url = "https://files.pythonhosted.org/packages/e9/6c/6e1b7f40181bc4805e2e07f4abc10a88ce4648e7e95ff1abe4ae4014a9b2/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", size = 722614 }, - { url = "https://files.pythonhosted.org/packages/3d/32/e7bd8535d22ea2874cef6a81021ba019474ace0d13a4819c2a4bce79bd6a/PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", size = 737360 }, - { url = "https://files.pythonhosted.org/packages/d7/12/7322c1e30b9be969670b672573d45479edef72c9a0deac3bb2868f5d7469/PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", size = 699006 }, - { url = "https://files.pythonhosted.org/packages/82/72/04fcad41ca56491995076630c3ec1e834be241664c0c09a64c9a2589b507/PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", size = 723577 }, - { url = "https://files.pythonhosted.org/packages/ed/5e/46168b1f2757f1fcd442bc3029cd8767d88a98c9c05770d8b420948743bb/PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", size = 144593 }, - { url = "https://files.pythonhosted.org/packages/19/87/5124b1c1f2412bb95c59ec481eaf936cd32f0fe2a7b16b97b81c4c017a6a/PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", size = 162312 }, ] [[package]] From c08b11244ac700185c80bc44e14b5446a563e8ab Mon Sep 17 00:00:00 2001 From: Rory Byrne Date: Wed, 15 Jan 2025 14:52:04 +0000 Subject: [PATCH 2/6] feat: Add stage_and_commit method to GitService --- mthd/service/git.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mthd/service/git.py b/mthd/service/git.py index 56a4d5b..2a4b274 100644 --- a/mthd/service/git.py +++ b/mthd/service/git.py @@ -1 +1,5 @@ -class GitService: ... +from mthd.domain.commit import CommitMessage + + +class GitService: + def stage_and_commit(self, message: CommitMessage): ... From b7b5f2e245368b3f4d46ea76f8cf196956db74db Mon Sep 17 00:00:00 2001 From: "Rory Byrne (aider)" Date: Wed, 15 Jan 2025 14:52:05 +0000 Subject: [PATCH 3/6] feat: Implement stage_and_commit method in GitService --- mthd/service/git.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/mthd/service/git.py b/mthd/service/git.py index 2a4b274..48534c5 100644 --- a/mthd/service/git.py +++ b/mthd/service/git.py @@ -1,5 +1,24 @@ +import git from mthd.domain.commit import CommitMessage class GitService: - def stage_and_commit(self, message: CommitMessage): ... + def __init__(self): + self.repo = git.Repo(".") + + def stage_and_commit(self, message: CommitMessage): + """Stage all changes and create a commit with the given message. + + Args: + message: CommitMessage object containing commit metadata + """ + # Stage all changes + self.repo.git.add(A=True) + + # Create commit with formatted message + commit_text = ( + f"{message.summary}\n\n" + f"Hyperparameters:\n{message.hyperparameters.model_dump_json(indent=2)}\n\n" + f"Annotations:\n{sorted(message.annotations)}" + ) + self.repo.index.commit(commit_text) From 0bdb96dfa9315c4f0ab93760ca3ab897a640d58e Mon Sep 17 00:00:00 2001 From: Rory Byrne Date: Sat, 18 Jan 2025 15:13:13 +0000 Subject: [PATCH 4/6] refactor: restructure commit decorator and related services The commit decorator now supports hyperparameters and staging strategy, improves error handling, and removes redundant repository service layer. Changes include: - Add rich console output for commit messages - Implement GitService with proper repo initialization - Add StageStrategy enum for commit control - Improve dependency injection setup - Add proper error handling and type hints --- mthd/decorator.py | 56 ++++++-- mthd/domain/commit.py | 15 +- mthd/error.py | 2 + mthd/service/codebase.py | 5 + mthd/service/git.py | 31 +++-- mthd/service/repository.py | 9 -- mthd/util/di.py | 29 +++- mthd/util/model.py | 4 +- pyproject.toml | 15 +- tests/unit/domain/commit_test.py | 17 +++ uv.lock | 231 +++++++++++++++++++++---------- 11 files changed, 294 insertions(+), 120 deletions(-) create mode 100644 mthd/error.py create mode 100644 mthd/service/codebase.py delete mode 100644 mthd/service/repository.py create mode 100644 tests/unit/domain/commit_test.py diff --git a/mthd/decorator.py b/mthd/decorator.py index 3889216..4e38134 100644 --- a/mthd/decorator.py +++ b/mthd/decorator.py @@ -1,14 +1,21 @@ from functools import wraps +from typing import Callable, Optional, cast -from typing import Callable, Optional +from pydantic import BaseModel +from rich.console import Console +from rich.padding import Padding -from mthd.domain.commit import CommitMessage -from mthd.domain.repository import Repository -from mthd.service.repository import RepositoryService +from mthd.domain.commit import CommitMessage, StageStrategy +from mthd.error import MthdError +from mthd.service.git import GitService from mthd.util.di import DI -def commit(fn: Optional[Callable] = None) -> Callable: +def commit( + fn: Optional[Callable] = None, + hypers: str = "hypers", + strategy: StageStrategy = StageStrategy.ALL, +) -> Callable: """Decorator to auto-commit experimental code with scientific metadata. Can be used as @commit or @commit(message="Custom message") @@ -17,21 +24,35 @@ def commit(fn: Optional[Callable] = None) -> Callable: def decorator(func: Callable) -> Callable: @wraps(func) def wrapper(*args, **kwargs): - repository_service = DI().container.get(RepositoryService) - # Set up services + di = DI() + hyperparameters = cast(BaseModel, kwargs.get(hypers, None)) + if not hyperparameters: + raise MthdError( + "Hyperparameters must be provided in the function call." + ) + git_service = di[GitService] + # codebase_service = di[CodebaseService] # Generate commit message commit_msg = CommitMessage( - summary=f"Experiment: {func.__name__}", - parameters=..., # exp_service.extract_parameters(func, args, kwargs), - annotations=..., # exp_service.extract_annotations(), + summary="exp: foo bar baz", + hyperparameters=hyperparameters.model_dump(), + # annotations=codebase_service.get_all_annotations(), ) + # print(hyperparameters.model_dump_json(indent=2)) + # print(commit_msg.format()) # Run experiment result = func(*args, **kwargs) # Commit changes - repository_service.commit_changes(commit_msg) + console = Console() + console.print("Generating commit with message:\n") + console.print( + Padding(commit_msg.format(), pad=(0, 0, 0, 4)) + ) # Indent by 4 spaces. + # if git_service.should_commit(strategy): + # git_service.stage_and_commit(commit_msg) return result @@ -44,8 +65,13 @@ def wrapper(*args, **kwargs): if __name__ == "__main__": - @commit - def test(): - print("Hello") + class Hyperparameters(BaseModel): + a: int + b: float + c: str - test() + @commit(hypers="hypers") + def test(hypers: Hyperparameters): + print("\n") + + test(hypers=Hyperparameters(a=1, b=2.0, c="3")) diff --git a/mthd/domain/commit.py b/mthd/domain/commit.py index c50473c..568cdd8 100644 --- a/mthd/domain/commit.py +++ b/mthd/domain/commit.py @@ -1,7 +1,18 @@ +from enum import Enum, auto + from mthd.util.model import Model class CommitMessage(Model): summary: str - parameters: dict - annotations: dict + hyperparameters: dict + # annotations: set[Annotation] # @todo: fix anot + + def format(self) -> str: + return ( + f"{self.summary}\n\n{self.model_dump_json(indent=2, exclude={'summary'})}" + ) + + +class StageStrategy(Enum): + ALL = auto() diff --git a/mthd/error.py b/mthd/error.py new file mode 100644 index 0000000..b8d7450 --- /dev/null +++ b/mthd/error.py @@ -0,0 +1,2 @@ +class MthdError(Exception): + """Something went wrong.""" diff --git a/mthd/service/codebase.py b/mthd/service/codebase.py new file mode 100644 index 0000000..f87dd70 --- /dev/null +++ b/mthd/service/codebase.py @@ -0,0 +1,5 @@ +from anot import Annotation + + +class CodebaseService: + def get_all_annotations(self) -> set[Annotation]: ... diff --git a/mthd/service/git.py b/mthd/service/git.py index 48534c5..4d67100 100644 --- a/mthd/service/git.py +++ b/mthd/service/git.py @@ -1,24 +1,29 @@ import git -from mthd.domain.commit import CommitMessage + +from mthd.domain.commit import CommitMessage, StageStrategy class GitService: - def __init__(self): - self.repo = git.Repo(".") - + def __init__(self, repo: git.Repo): + self._repo = repo + def stage_and_commit(self, message: CommitMessage): """Stage all changes and create a commit with the given message. - + Args: message: CommitMessage object containing commit metadata """ # Stage all changes - self.repo.git.add(A=True) - + self._repo.git.add(A=True) + # Create commit with formatted message - commit_text = ( - f"{message.summary}\n\n" - f"Hyperparameters:\n{message.hyperparameters.model_dump_json(indent=2)}\n\n" - f"Annotations:\n{sorted(message.annotations)}" - ) - self.repo.index.commit(commit_text) + self._repo.index.commit(message.format()) + + def should_commit(self, strategy: StageStrategy) -> bool: + """Determine if the repo state can be staged and committed + + Returns: + @todo: decide if the unstaged files are suitable for committing + """ + if strategy == StageStrategy.ALL: + return True diff --git a/mthd/service/repository.py b/mthd/service/repository.py deleted file mode 100644 index a9b1624..0000000 --- a/mthd/service/repository.py +++ /dev/null @@ -1,9 +0,0 @@ -from mthd.domain.commit import CommitMessage -from mthd.service.git import GitService - - -class RepositoryService: - def __init__(self, git_service: GitService): - self._git_service = git_service - - def commit(self, message: CommitMessage): ... diff --git a/mthd/util/di.py b/mthd/util/di.py index 6613a78..b1c82f3 100644 --- a/mthd/util/di.py +++ b/mthd/util/di.py @@ -1,13 +1,27 @@ -from dishka import Provider, Scope, make_container +from typing import Type, TypeVar +from dishka import Provider, Scope, make_container, provide +from git import Repo + +from mthd.service.codebase import CodebaseService from mthd.service.experiment import ExperimentService from mthd.service.git import GitService -from mthd.service.repository import RepositoryService + +T = TypeVar("T") + + +class GitProvider(Provider): + @provide(scope=Scope.APP) + def provide_repo(self) -> Repo: + try: + return Repo() + except Exception as e: + raise RuntimeError(f"Failed to initialize Git repository: {e}") class DI: def __init__(self): - self._container = make_container(self.services) + self._container = make_container(self.services, self.git) @property def container(self): @@ -16,11 +30,18 @@ def container(self): @property def core(self) -> Provider: ... + @property + def git(self) -> Provider: + return GitProvider() + @property def services(self) -> Provider: provider = Provider(scope=Scope.APP) provider.provide(GitService) - provider.provide(RepositoryService) provider.provide(ExperimentService) + provider.provide(CodebaseService) return provider + + def __getitem__(self, item: Type[T]) -> T: + return self._container.get(item) diff --git a/mthd/util/model.py b/mthd/util/model.py index c7ac90a..cb8287f 100644 --- a/mthd/util/model.py +++ b/mthd/util/model.py @@ -1,4 +1,6 @@ from pydantic import BaseModel -class Model(BaseModel): ... +class Model(BaseModel): + class Config: + arbitrary_types_allowed = True diff --git a/pyproject.toml b/pyproject.toml index d47e430..3c7aba1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,9 +6,11 @@ authors = [ ] requires-python = ">=3.10" dependencies = [ - "anot>=0.0.3", + "anot>=0.0.6", "dishka>=1.4.2", + "gitpython>=3.1.44", "pydantic>=2.10.5", + "rich>=13.9.4", ] classifiers = [ "Development Status :: 3 - Alpha", @@ -51,3 +53,14 @@ dev-dependencies = [ "pytest>=8.3.4", "ruff>=0.8.2", ] + +[tool.ruff] +src = ["mthd"] + +[tool.ruff.lint] +extend-select = ["I"] + +[tool.ruff.lint.isort] +known-first-party = ["mthd"] +relative-imports-order = "closest-to-furthest" +lines-between-types = 1 diff --git a/tests/unit/domain/commit_test.py b/tests/unit/domain/commit_test.py new file mode 100644 index 0000000..1097da2 --- /dev/null +++ b/tests/unit/domain/commit_test.py @@ -0,0 +1,17 @@ +from pydantic import BaseModel + +from mthd.domain.commit import CommitMessage + + +def test_commitmessage_format_success(): + class Hypers(BaseModel): + a: int + b: float + c: str + + msg = CommitMessage( + summary="test", + hyperparameters=Hypers(a=1, b=2.0, c="3"), + ) + + print(msg.format()) diff --git a/uv.lock b/uv.lock index 23bae64..389f932 100644 --- a/uv.lock +++ b/uv.lock @@ -12,83 +12,83 @@ wheels = [ [[package]] name = "anot" -version = "0.0.3" +version = "0.0.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "maturin" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8c/5d/ea040ec30f1a5b55dad20bafc172bc97d83b4199183305ea2a25fe03735b/anot-0.0.3.tar.gz", hash = "sha256:51b7fa1e15ea0943323371af527af8bdaa5e34e23c183236d483e5a38eac9c1a", size = 14114 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/5c/55f187408eca28efdfd36fba54d52af1bea0ade3cfd38092513c482146cd/anot-0.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63ef3b9138493be1f08a849c43802fdf00c4eaa65cf72ff18b7a792bbe323ff7", size = 602851 }, - { url = "https://files.pythonhosted.org/packages/15/6d/711f669358de192bbbba262d59f3f48067a39c83aa5ceb225244d0a878a2/anot-0.0.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:11e605d32911f3dee7b61ce3149ed7a47522c5bd78c27883ead966b6dff9173b", size = 601248 }, - { url = "https://files.pythonhosted.org/packages/a6/4e/f8c0cfd515e6f77ea1cb08e6a028177787af39420fa164ce3d4b702a0c67/anot-0.0.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ab4b51119bc6fce057bc8d9a5884e0f074616fbacee80bf717b55fedc4c6a5c", size = 657510 }, - { url = "https://files.pythonhosted.org/packages/df/2f/d3c12d608927d3be1d8c804ccf36d5037074d25babcd0ea43303de4f84d8/anot-0.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f633562fa80f926d3a45bb0ad3baae0a8af49a38771fc4025057ea712e4c6c74", size = 710119 }, - { url = "https://files.pythonhosted.org/packages/df/cb/a8c577bc184f421c2ba2b68efb99881f066808e382791674eb6ab27e198a/anot-0.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82a3014538f9521f82d2c50f167a7bba9cdea35bf76d0218623eb084ad9fd037", size = 693363 }, - { url = "https://files.pythonhosted.org/packages/bc/a9/be05d9f245e5610dd2de69e54094a0316d589ed00c88d8c7de81251a74af/anot-0.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:285e1c57321c7c71a13ab5246602b0d2c317227ceb93ac249eb6d0cb025d9f32", size = 616247 }, - { url = "https://files.pythonhosted.org/packages/7e/4f/6173eb4b7d64ec64a47cfe4044aa4d9b47d0eba70f95c44ab4de0d915048/anot-0.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6fa8b035a8b6749d7727ec28f2d21ed3ac621c91e17c98e13fade683ffd17a9d", size = 768288 }, - { url = "https://files.pythonhosted.org/packages/3f/89/24dcc56864d1985e7ed30142298399d6617b7bfadd6f00c5b91dad2429f4/anot-0.0.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:544d99acb0a255097dc66367d2fb04d10c2635d2378934767d45ea0c567a02a5", size = 851723 }, - { url = "https://files.pythonhosted.org/packages/49/ea/044ac9588aee40a012a14e70ec17b8f79cfdb864d4e1a7b8c3f871ef418e/anot-0.0.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:7430be6181f7b1640f6900f12d59b2086d3717d438e5d5dd12938b355a868d17", size = 802744 }, - { url = "https://files.pythonhosted.org/packages/62/c1/0e3a9a24a8b1bbea3c97bbc3ddc17da6bfa98a78fcc93040875369279e05/anot-0.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:49d2cae6cd6cffc25af9f149874fe6b1c240ae6e9af840aaf1ddcf40f1f28811", size = 775361 }, - { url = "https://files.pythonhosted.org/packages/3c/4b/1057e86a0445ce6e764deec1a8c7007d410a5c024bc6893f73ff854c83c3/anot-0.0.3-cp310-cp310-win32.whl", hash = "sha256:bda293aefbd6baf2b3fac3897d33e00c9306b50c116f79481470931a0abe28e2", size = 410991 }, - { url = "https://files.pythonhosted.org/packages/7f/01/a3129a2f294ec64b3dd31df7633fb45752c80fb56c7f46c6ddfc51da033f/anot-0.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:2b6548392cb342e0715db094e86d6d6190a4e7f1ec9952b6d1d0ab27718a7fa1", size = 440414 }, - { url = "https://files.pythonhosted.org/packages/be/c2/55ce672247709a701285e4f32083c3f82acf753b7570be21fe629011d4e1/anot-0.0.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3cfbae5a3a8d6e208512bd6e18be229648c7a43875be65376a3491481f37c429", size = 555874 }, - { url = "https://files.pythonhosted.org/packages/5f/5c/09e2eb62849470ba3f7939dd0ca13085d0e147eb9600781a0fc0352b738b/anot-0.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64d82cb3e7bd576d3478cc62dab7d3c2ed7f8150fabdebc5bc07639763df47d5", size = 548629 }, - { url = "https://files.pythonhosted.org/packages/29/74/bea5babbf55144e56c367d40423f23972a7d86224fc6c2e18a235610833d/anot-0.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd21c8e6bddaaa0331a93f4aacfef71851c978bb50330278d7936a06c74486a", size = 602950 }, - { url = "https://files.pythonhosted.org/packages/eb/39/428f9542966aef84d2649ce136d7af644f3b92553a87e45d8f809ed1c39d/anot-0.0.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a06a97beaaa15d2005578b38018d705127530adabc9b9ee0c4f32933180c9b6", size = 601360 }, - { url = "https://files.pythonhosted.org/packages/9e/c5/612b7963ea4f2f837846fc31770b1e1c7e816f0ae489a0dfe774e7e19b93/anot-0.0.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c356fa3975d35e79d4bb006f33f0c7d134599b552de9bf70f7dfbd7f467bf5fb", size = 657271 }, - { url = "https://files.pythonhosted.org/packages/5b/96/5e8dec768e4f69bebb512798b1a9768158d1702ad14bff29345a61b06e87/anot-0.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06c7b6916514814274b1e8dd40ba4d359643158b4facebc2df744789bd3693f2", size = 710093 }, - { url = "https://files.pythonhosted.org/packages/e8/98/dc286eb4ea66d8ce46827d81b7f62161fe99332970a586bb88ac6b409391/anot-0.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5f703f3002a849dabd59102ca90aceb0631ad53e9146535f71225a154d9c6727", size = 693009 }, - { url = "https://files.pythonhosted.org/packages/66/bb/7cc6ee0420c5fc8dc003be1881f7e7656e297c842d268a06f1ad76d2585a/anot-0.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f6a63e064ab6abb7a06baf21c3187b562b9fd2e3cd495f93decda79f71a13ee", size = 616080 }, - { url = "https://files.pythonhosted.org/packages/19/ba/f565e54f3a5013ea1597695b44dc7192b5d215aea36be21b15de786c016c/anot-0.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c89111206f749cb5b2f9cc8d7a6f3e3614425eefd230d9a8f0e1b0d8fddbddae", size = 768264 }, - { url = "https://files.pythonhosted.org/packages/68/0e/92e30a2b334ee511c48d899f5dc37a8e04a7cb2c83e57adcfa34b5e7b695/anot-0.0.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:95fd3c721598ae88c7c36ed1918388cf966eeed765fb487415668f08b69e0734", size = 851535 }, - { url = "https://files.pythonhosted.org/packages/b2/1a/3f8a5d02270fdad056d9c4d6a9916232b2a9308e99e82e2941197ef225f2/anot-0.0.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:05c23bf40e682eba2ed860abe1044041e064c371ce0ac507211d605f09f3856f", size = 802714 }, - { url = "https://files.pythonhosted.org/packages/c0/76/32d2a174c66271e2cbbfc4874996dc7614388e94bf9c491c4e278cbfe312/anot-0.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:573b65f358d731f949155e4aa00a3fd95e54e8a60f9e6b13f314f00e0c5fd907", size = 775294 }, - { url = "https://files.pythonhosted.org/packages/fd/25/42ba1fcb6fb9f3885e3ccf4f8d3ae60b8b01b5cbcde5e7466c10025dfef9/anot-0.0.3-cp311-cp311-win32.whl", hash = "sha256:7618340709f9c1de3de2634ba55a79e512dc0fa2716c00739420e7bb8fc4a8e9", size = 410910 }, - { url = "https://files.pythonhosted.org/packages/11/48/7d64f19c785e1a0a1ed4e08ab69a2e686f7451a174abaa334e8770f9820e/anot-0.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:392352d1f7c9c587b7b7b6d9a81583bb442fb8f3dab8b7ef4fca0387b1e31bc4", size = 440346 }, - { url = "https://files.pythonhosted.org/packages/2a/86/7ed483759487b25ba7f90e1c725fce23535a68141d833606ca2eb32f6889/anot-0.0.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3996399e10bdede8f1f915ae2d50f6fb117c4f8797cda879da3edf9bbbd13e63", size = 554199 }, - { url = "https://files.pythonhosted.org/packages/71/44/e71b3c134ec64e0d3f64addb7f3d35e6e0eb411dff70e66b37d76e6d6df2/anot-0.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:120d0b972f6de378e636e371b052ba2f7a02c221059627cd482bce69f46ddcda", size = 547226 }, - { url = "https://files.pythonhosted.org/packages/d6/fd/f3ba211dd4f87e72fe34986795b3110924ab7f5c7b9881073a14e8c7d87d/anot-0.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f7f3ba4965d6257ae33191653fafcd37b75e640561de85d919fdb469cd034b2", size = 601710 }, - { url = "https://files.pythonhosted.org/packages/d1/f7/d850644e2e0a2e01670de7713f3f139a7e4569edb0d0c7900b81e3b32558/anot-0.0.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:92f6a787fc1cce7d5ba2421917ac6984f71eaf14c680cf6db83d889283ce65d4", size = 600811 }, - { url = "https://files.pythonhosted.org/packages/8e/9a/610667d7dd9d0befbe37555ee988d1c42c4eaaa5a9d8ec2b4713de7efd0b/anot-0.0.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad8743d4bdfb82b4508407a894e958118bfbe46b4c587c1257cff9200d9f48c3", size = 656659 }, - { url = "https://files.pythonhosted.org/packages/bd/b2/a4f386783949ba2dc017b3623311b0ec9ae4717198e8e1dee52e53efd60f/anot-0.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ee6c2d44004b8c256a5419126b4ae9fa8c4b34fb47a49ebfb069396c8380985", size = 709052 }, - { url = "https://files.pythonhosted.org/packages/94/4c/99889c86a9d2e036020fcb9ec205c4980e6baf24be3192b35cc14babd3d2/anot-0.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14ef507f5bdff31aa8ab2ef23031ea78ebc73bef25f28574c90c6ea36c340110", size = 691842 }, - { url = "https://files.pythonhosted.org/packages/55/b1/f85a34affc715275292c752661b049d72e12ee6b0f89865a2fbc56524fed/anot-0.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5da97373faf3bf4450a283b3118d2e17a623eb53910fc75f33682f4796ca9f1", size = 614665 }, - { url = "https://files.pythonhosted.org/packages/29/06/991c3684034205bead42529738657f541d9bf8c49aa1511e831b51582f58/anot-0.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:31d5a7942fdd1b2b3b889ab1ebac1115400ca1fefb4d23a683f3f4daa226b540", size = 767508 }, - { url = "https://files.pythonhosted.org/packages/5c/11/a3691691c4cfda99f7ef472259b0c5ebbc881ff5692f6cacde82e40a415f/anot-0.0.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d2e9550542c8889029f1e636688b629c3f824be7d0589b481d93c7dea2e95b2c", size = 850142 }, - { url = "https://files.pythonhosted.org/packages/5b/74/40cb0f4ce739642618b79b64263fa417cc77ae481febfa447b11ca64633d/anot-0.0.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:98ba2a240a788c18ed61d3291396dc724b44043bf75f68785486e9c1f6a27a43", size = 800285 }, - { url = "https://files.pythonhosted.org/packages/e1/22/8c523ef63130382e0e2b49fdb9497109681fe25f576195512bf7b0ddd6ff/anot-0.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9beec91e193c79107102afd23d975c6d0b1caf205dc336bec9c2ec2c7a2f7bb8", size = 773775 }, - { url = "https://files.pythonhosted.org/packages/06/37/fb1e979119779eabc2354d936258d595322308a6e2cc1e9290b172fcd47f/anot-0.0.3-cp312-cp312-win32.whl", hash = "sha256:60bd2f98d5081efc61ad8a1f672a1c9d9dd558b934b125c0512ab33d0d7853e7", size = 410358 }, - { url = "https://files.pythonhosted.org/packages/64/27/b6eefd8b498543fec6e2b560d7cfd67798f0a86e8b97d078b9f2cd6b11e1/anot-0.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:c76f2553162b546fd348b51f7cb0c565b2db76052b738f80e24ba8d4e04d58e3", size = 440128 }, - { url = "https://files.pythonhosted.org/packages/65/a0/f80853acc86f30b552e5b31c46c71852daad74236a7ce85e7a63409dd5f2/anot-0.0.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3c067a50440ecdb5603c548b2bf794e202cc76605e21789d6ebb80957c336923", size = 554361 }, - { url = "https://files.pythonhosted.org/packages/7a/9c/4191e19c361fb2f3a616ab11914d42d83e283eee22102e0ca78e08f93f1a/anot-0.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5c9e19723262759f4b209a553c638cea109ca9e6883dc3553681b47ed4ca7fc2", size = 547163 }, - { url = "https://files.pythonhosted.org/packages/db/b7/b99e2dc28b04a129eb23bd4584e5b3ad5b0b815faaa1fb03edf3f3c97927/anot-0.0.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9f27f4313d354f708bdd48813d63739353e11f8212f591c60b11cae293ae2a5", size = 602022 }, - { url = "https://files.pythonhosted.org/packages/55/cb/98634bc7dcf7b174ef2631907fc617b36409efa82d6cbb21534c59348698/anot-0.0.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a3d3a02a65bd9d095c224dd1b5c9617105d8023ede0879e15c1457991dfbc432", size = 600120 }, - { url = "https://files.pythonhosted.org/packages/33/e3/b6fcfb179b31c99fdda5d716649e33870b5c1e27cfefefce761f0b9fa5ee/anot-0.0.3-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a04ab9b6b728e721fb4a9902b8a842f3bf8c00ce912b17373bd227f3fa94b051", size = 655911 }, - { url = "https://files.pythonhosted.org/packages/ee/3c/d5c102f6dfa8d286a898aa937d84e5bc2533cd00df1d094df651140552d4/anot-0.0.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f11ebf7eae94851bf6259255fa95ef5f3e8b7a2897ba9e491241f31a95ca6c06", size = 709217 }, - { url = "https://files.pythonhosted.org/packages/5f/30/b37680ea1c6d1c7e42062c55132b7656b69253bfa76622c9d38ffa6b4d93/anot-0.0.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5181037e4f7fe88a292abb65efeeb6742879f68c1b75f4dd8e736a074b093ba2", size = 691631 }, - { url = "https://files.pythonhosted.org/packages/40/e3/dc18ab8ed232d0bc8e8828495d6408aaaa3c22bf079d62e42b03661dcf0e/anot-0.0.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0bb5b8cfd05b53befe9a005ff89f9477c27daa998cadd44aa3aeed8c48d49609", size = 614489 }, - { url = "https://files.pythonhosted.org/packages/2f/90/a4cd8bf149e182f1b30a318efa5a35340a6adf359b71d3f502946064f71a/anot-0.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:aa10ac6f2dbb4ff52520fd30e7ef80a6827665d8c1c2fb394a52a185a1564681", size = 767201 }, - { url = "https://files.pythonhosted.org/packages/2a/ca/6d12734b60cab628576fdc3ec9b82b6a4afbe9db853eb2c8dd5b19fe9ed8/anot-0.0.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:5e350847dbf8e4290c6d119d97daf79955278adedbfc66a1fa7ab99cc8233f43", size = 850854 }, - { url = "https://files.pythonhosted.org/packages/ff/13/e048318e2ceac9c0e9da0b2d2f915c15eec0a15f424fe9d15854238e1850/anot-0.0.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:362995eb0b268ab50ba57e82387887cdcde2e38ad88fcb436b49c1be16eb4843", size = 800816 }, - { url = "https://files.pythonhosted.org/packages/ae/1e/69e912a982b19756b09957b6f394bae2d670b55837549b1e21b0ec92d470/anot-0.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d9cb794d1cdf22cfe2210493c3eb7bc7567aff034abade8f33f3ff654b46e86d", size = 774052 }, - { url = "https://files.pythonhosted.org/packages/a9/95/a7cd7d5323732e647021370e9e99e9d79045301457a50ed3a609120f2bad/anot-0.0.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f3f15786ff57b57054a15ebe034245917a787b5bef0b60777ac670a01e0f8b9", size = 601118 }, - { url = "https://files.pythonhosted.org/packages/f9/20/10b631720fe01f8270bd5ad725d52b9da0059f1aba6373ff553e344228c0/anot-0.0.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ea2c169c5a66705fa754934bff2912bccd78107edecd639f31357bb65fc06932", size = 600090 }, - { url = "https://files.pythonhosted.org/packages/02/e0/59b85282d654680bab0111ee30d44b81e455368584e661c2dedadebcf3d8/anot-0.0.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8177d63e07ecd9a5d2f733471a0a982cb8c42050bb02ee6d52afc632f4ed4c0", size = 708884 }, - { url = "https://files.pythonhosted.org/packages/74/f0/2741c3c62c53488b3298855bad4adfed4022e8ceabe50f14a9cbf694623c/anot-0.0.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c06c43fae2e4c8c95d5408c9479e34ea955e31716daadf6f1f858000624e9ab4", size = 690719 }, - { url = "https://files.pythonhosted.org/packages/91/59/27b0429873b55fe04ee796a1b84bf7b8587d60340d0dc14393fefc26641e/anot-0.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ee4f39cff313fde0a4eab08cb6bd6ef3852bb258f275f090933f52b3c1e93407", size = 766767 }, - { url = "https://files.pythonhosted.org/packages/17/2f/146588dbe4b34ca39182cf5e66a85af0249b8735b049bd343a5589f11033/anot-0.0.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:2a23fde81e6c7eee7b7df5414a08e1fb72466ac6af64cf45fbd23aa63524ed4f", size = 849429 }, - { url = "https://files.pythonhosted.org/packages/b7/d8/2d209f1d7502ca635cde6766f12cf75620411ff494d182f31c3bbc2495c8/anot-0.0.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:803f984018a8d868770675a880d7a71196da8e7c964fc3c32fc0aec332054212", size = 800395 }, - { url = "https://files.pythonhosted.org/packages/b8/66/d5a7cafce69fee640244eb220da0bbdf214884568951b7d2a3261bf83611/anot-0.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:679d896538da1eb4cd72bf0f76f0fa687f5ce23856bbdaaf19a8974c3423ff6e", size = 773113 }, - { url = "https://files.pythonhosted.org/packages/68/af/329d70bd03d28db070371d479b47db4b0dbc37dbe505b9453feee4c7d224/anot-0.0.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:947d59c62ed1e9400296e687596073e1b895311bc261af9823485c7a147068b1", size = 603120 }, - { url = "https://files.pythonhosted.org/packages/e4/f9/38a40fda2aa602f90512ae4ae46c3ebd5608cdceac0b4a015c1b2ce7f5e9/anot-0.0.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bfda195971fce150b855b8a13972fca3f0699ee3c0c7aaac0fda28a5200520ad", size = 601881 }, - { url = "https://files.pythonhosted.org/packages/ba/4e/6c43509f62d045f812741e2d708868ba6486e2e7c974027a13a5ed40f956/anot-0.0.3-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a00a5599dbd9d6190c167cae780c6e769399e6cad7639a30f487c256adab1a4", size = 658831 }, - { url = "https://files.pythonhosted.org/packages/a1/54/ec3a004df50bbb915ca22e5add0149e5a2ffce98b36718689f9dbe04e550/anot-0.0.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4da95df29f710107b8f220c1c535100ad684d11d54d2e30b4f29f01afc31e4d5", size = 710406 }, - { url = "https://files.pythonhosted.org/packages/fd/79/93b3a204577e21f69b6afb3dbb3122c81defc50397933334d9ad6e759e76/anot-0.0.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d73b974bd57f7c8d27191ba21d58611c48f5112cd2eb317457a5f12580036e28", size = 693870 }, - { url = "https://files.pythonhosted.org/packages/bd/10/edc5861f8207b77d13d920d7da15a971283246e8d3bd317dd6c80af72141/anot-0.0.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7f3e8c096aca699ca64a87138c7687e96b4b4db7095222c083492d1f38fdd71", size = 616814 }, - { url = "https://files.pythonhosted.org/packages/90/42/845cabbc43f88e196b21ed4c776bec843ca75d9b25650d172a8c6df280e5/anot-0.0.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:14275ba104bae83f65a1fe963a2f05fc62282d62a1074d8adef42ced7647d6e3", size = 769163 }, - { url = "https://files.pythonhosted.org/packages/9a/3d/86d744da733bf36ed055758e14667dc35b348f0084b7fe4321d293e90b50/anot-0.0.3-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:a9db378e45c906a5d672ef4a5f7c995e18d28316b864c17668a29f18fc346801", size = 851555 }, - { url = "https://files.pythonhosted.org/packages/49/62/6d2b2584228076aeb8e50adff3f64c4cc136212ad019f9a5b44c88360965/anot-0.0.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:77ed9469a52907d09c2f0603635b6ad73fa7fcc1f9cd92619482cd3950603bf9", size = 802657 }, - { url = "https://files.pythonhosted.org/packages/87/55/7500a932eb65a36110f3012a00e85e4e81965edbfc1d1c5899409387eced/anot-0.0.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:f9a74ec1f6342758e08e4c7bf1260be4edd3d93d84bd3e3663e4954afb57868c", size = 775155 }, +sdist = { url = "https://files.pythonhosted.org/packages/db/24/f1d985e45c376bd5d0afc5285530e23402f463a9313f6683e5e6c0d5002e/anot-0.0.6.tar.gz", hash = "sha256:6b8945f6aa46f247d42186caeb9ab8b117bdadb88a4db05db37381b1d4d69f6d", size = 20436 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/07/84624595095c8921ffb37edac938a7bc154017bd2bd0cefe492c4706ba48/anot-0.0.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4300afaef5fcef77f43c727ebe8eafeef0223c61e0492e04c25dd1d27d8d5875", size = 1626535 }, + { url = "https://files.pythonhosted.org/packages/5f/4b/50230cbea4f83443bf3282e1cf61f6fef58cae42c852b009840522bd50aa/anot-0.0.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:393d1a82a94aa7d2275644ca3cf2c45bc5fb34be338d9fc4762b89bbce24ab69", size = 1578328 }, + { url = "https://files.pythonhosted.org/packages/65/0f/baaeb19309199b2f4780bb740c1f2213c4b877b7971c16cc9224650f1515/anot-0.0.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:320c967d8bc21b92a1a4f1d1eb67a6794328b03223ab73a3ea5018de0a904ad6", size = 1721374 }, + { url = "https://files.pythonhosted.org/packages/a4/47/4317e10f62f738b072dbdeac3dac3176443a23cd7758833a6332a5febec2/anot-0.0.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:720a99afeb01d8b43504b04589aff957d08da516cb11526ac3ffac31dbd10444", size = 1787945 }, + { url = "https://files.pythonhosted.org/packages/fc/63/e787a135707f46bb71276e7a1a2b6eec5d2093e7f5b5c648bd6a5a54ac3f/anot-0.0.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf4486a01ae087783643b39fde1f74c7d02c9301661eafb1369fe57cf625cd2b", size = 1814889 }, + { url = "https://files.pythonhosted.org/packages/b2/04/2706d4b318e535ad12f9502c3a4eab10e45bd2a59f346b962f4f2433521d/anot-0.0.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:305b91b2b6f0fcb741378465dd4404fe53f80150b7e3e1b7483852e004876526", size = 1697310 }, + { url = "https://files.pythonhosted.org/packages/dd/df/75257a4241e0edc3fc0b22f2b3d75457c97b617f319b985e9583de98cc6f/anot-0.0.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fc0705aca4668dee5c1c5abf9c2c1f20eef0f4a359315a087e85573d0cd8ce35", size = 1780551 }, + { url = "https://files.pythonhosted.org/packages/2c/d7/ac5a17534224677265de6d69c514bf4baef890fb7e4c6b7843ce66849078/anot-0.0.6-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:515fd823b6130d5eb87361cfd788d3553225f5ad4f3285cd148275f24efaf9c9", size = 1820258 }, + { url = "https://files.pythonhosted.org/packages/1e/70/edc4196b063ebe9a1441fdf3e1f042c9ade6db355fc3d610852c76ff570f/anot-0.0.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:957dd9dbd14eb557063b6d6b12e2c13ab12476ae4db87455e9ff883e74d1fc2e", size = 1824229 }, + { url = "https://files.pythonhosted.org/packages/a2/04/5881d4c35e1b859d1bd8656b72ca7d062fc09faa1a3001dd742131dca02e/anot-0.0.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:93ce1fba46488176173116d0e2c13d029dde2fa5d3b358aaca22c4e140a30408", size = 1853077 }, + { url = "https://files.pythonhosted.org/packages/fd/48/9f2d389463a5d687e61b18cc8fe0d500afceb7daa027392a712df2fdabff/anot-0.0.6-cp310-cp310-win32.whl", hash = "sha256:452eec300a2bd31fe6c4c555b38fe2c92ea7e63ac03e85beb3d1bd73c1b13eeb", size = 1230050 }, + { url = "https://files.pythonhosted.org/packages/8e/08/bd392fb89e274144019d9f7290e76e3cfa8223abae9e2d7e280b007d87c0/anot-0.0.6-cp310-cp310-win_amd64.whl", hash = "sha256:5000c6c5e4b17ebc8e9ec0f8b2fe8d9609955f9d81b218104d592a6a25c77a4d", size = 1329584 }, + { url = "https://files.pythonhosted.org/packages/90/ec/c22317391750a81784c55abf17e1287827d97c09e9c09c9fb43f7f1cb36e/anot-0.0.6-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8622e155e7a77baeac6c50976a49ef8b0aa2a6269541378686935f67f29a6fe", size = 1531329 }, + { url = "https://files.pythonhosted.org/packages/20/98/23f632b77052f16b62f74b2d849de435ca5a401d4ea1a558da36ad3f246c/anot-0.0.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c7ce93e4404004db3e301dca576cdadfd9a6f4238e38afb6af788405f719ed1f", size = 1459989 }, + { url = "https://files.pythonhosted.org/packages/cf/f8/259f113a4ad3aadf413aa93b983a3098a73e99f2fa88fa61fdbfee9bc8e7/anot-0.0.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:834728f8bf5df60149e59be319ed0b05fa75fea9a218eb740c43e1db6380d974", size = 1625864 }, + { url = "https://files.pythonhosted.org/packages/eb/fc/df0ef8f7cc62fff4859d61e06683337a366da3bbdce00547c2d4947fde39/anot-0.0.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a8aa9605a04595d046c87c117a18650ae4e8ca9d857784c743edf80b67f695e0", size = 1578145 }, + { url = "https://files.pythonhosted.org/packages/d7/53/33ce2f1c52c1cbc1d52bf78ceb654218d010a215397a0a2d7c37299ef555/anot-0.0.6-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d27605c990b47b36096a01d226001ccda2d7b1b71aa352b46bd3271ef799ade", size = 1721188 }, + { url = "https://files.pythonhosted.org/packages/9c/59/5fccc0d897bd15fef1a708482bc5891c4d89c75df5d5356fee66dbdaeadc/anot-0.0.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:594d6f21ac7ee49f310fc42451a364049d777efad4b6312abc3b9260876b0ff4", size = 1788296 }, + { url = "https://files.pythonhosted.org/packages/b5/3c/61d5ecfb472b2030c2535d40d29813617cf56e30daa7e32350f7ab6bdc3b/anot-0.0.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a8200f59031b5e3dbf13705a17d69b78a7c6c96036eb5d0cb3615118046a311", size = 1814519 }, + { url = "https://files.pythonhosted.org/packages/3b/1b/be2b1a19c9bb2f6e56499efc6b538e4fd6d9b1027bd795b745e0e051d6d4/anot-0.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17406f13c99acdc9ac9d735fd384966fdf1f51b7049f336617ce9fdff66b0f3e", size = 1697165 }, + { url = "https://files.pythonhosted.org/packages/59/ae/a457228eca0d58232d3da5447154d24734ae1225b354d745d06fe79ec671/anot-0.0.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d88bf0b117d3a5dc05146a5300d36e2ade540f3a853c8c6243fa524aca791b69", size = 1780634 }, + { url = "https://files.pythonhosted.org/packages/c2/81/6e234712cc10bfdb0e2f98149dfb8825c7072943dacfc497177a587fc842/anot-0.0.6-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:920798ef008db1cda789fe60fd92d171b82c453e8e62da3ce23b434262f0fcf8", size = 1819296 }, + { url = "https://files.pythonhosted.org/packages/5a/bc/78beb577b641cb8da9fa2c3446ddb2add01202dfe7f6125a261608b03929/anot-0.0.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:57d859df3d0ac582aadf938a9c4ee8fbac1da508e80d09f2c41c61116d80d196", size = 1824102 }, + { url = "https://files.pythonhosted.org/packages/42/85/f45c459a41acd4d32f9f7a7f77320787ea85aaf61c716dbd4efd04a5207a/anot-0.0.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ff1367202b43e008299eefb08d815e7e3d29576b1fed6dceddd6c2b325c6cbd1", size = 1853274 }, + { url = "https://files.pythonhosted.org/packages/9c/09/445b08e58ba600d5be3f4aba8d10361bab97c706a27fea4bc7feefee1000/anot-0.0.6-cp311-cp311-win32.whl", hash = "sha256:6b6219f2c404102c70d8e424fdad81e898b0f4698550f9acf114589b83c2247a", size = 1229902 }, + { url = "https://files.pythonhosted.org/packages/a7/66/f1800072651c147ebcbcee5d6a389605a780cf099be839ce4dc07a7b0b1b/anot-0.0.6-cp311-cp311-win_amd64.whl", hash = "sha256:ed476679348c8b1e0b22e75601b8830e0d46bb0ec709ac7744a3fec4c5f02bf0", size = 1329630 }, + { url = "https://files.pythonhosted.org/packages/2b/d4/8985dd4c15e068f1c363d287910deaad122f2e29a89cf1600f75dede5921/anot-0.0.6-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f76db75f3ff8f178f586acfe499a771de8a73bd821c6c11bc3eba190c7ae2d3b", size = 1527300 }, + { url = "https://files.pythonhosted.org/packages/58/3e/4c06c7dfe5a7bb310c452597ae62f3e52d70dafad488868a8bc5337c7aa5/anot-0.0.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a8e75e378eeef5821ca584fe0e48558b6075dac3674c9794814e0a2c21a4af7d", size = 1457146 }, + { url = "https://files.pythonhosted.org/packages/ad/21/571477d637171b0b02c2196b5e5828a95600af7ff95cdb0fb596f8a9e8cc/anot-0.0.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ee95013217c06550e12c6c1d75b94752d379aa3d76b9cdaa7da3b11c95bbb30", size = 1625296 }, + { url = "https://files.pythonhosted.org/packages/8a/c1/68a5d310f3bc2fd1ee2f3e6f204e8f874e70faa9be5aa671db599b27884c/anot-0.0.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b69ad19b8be8fa367ee53f77e4ef5667d726f67e9d4f9de191a0806cae3c477", size = 1576977 }, + { url = "https://files.pythonhosted.org/packages/42/18/7e03ea4770734a4ef1dbae2f0c3cdae38734d54f0a07e4ef70ede1599d15/anot-0.0.6-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96a2dee09bfdf8591d40ce2ee6e6d4bb51b6b57ca818adb6914cf8557ba7e870", size = 1721896 }, + { url = "https://files.pythonhosted.org/packages/e8/5d/8faf12a39cd51249db55f32f204115d8a22387f078d26a2d8542600dd3ab/anot-0.0.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b554e11c5e3f0ebf5d9eb342372c680beab47a61de76b26dd4499c29fad56b5c", size = 1786665 }, + { url = "https://files.pythonhosted.org/packages/32/0e/5d6cfb949d2c0a6f7efd58401f07d156a83a17067f64eb52b749152fdefc/anot-0.0.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74b1867644fee33daf833396e6562fce3486f9d9914498c72521eea8c9464a06", size = 1813283 }, + { url = "https://files.pythonhosted.org/packages/5e/dc/b599ab23e70fc3844007b12566cfdcc91632488ecefd895b6dffe7515413/anot-0.0.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddc0a715b2177497e4f99bfd6e76747155ad6fea4c59b9181c4e239551f9253e", size = 1696290 }, + { url = "https://files.pythonhosted.org/packages/f1/e0/90edf7c672bfb8116a4b77b88a1f3ea4ea4fa3ad47f3c99f6eeb34c6f866/anot-0.0.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e8a7a7db1274d67887af09c4baee35b3247220128a27b87215d2cf7009bccf08", size = 1780026 }, + { url = "https://files.pythonhosted.org/packages/c6/b2/47b2daed43a7f57875987796c86a4d0ba1b8e0590dfe9bb1cd20762df638/anot-0.0.6-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:713aa24e026f1519b541aa02a100939def0ace629617d13ea4e64a9565ac7cab", size = 1818131 }, + { url = "https://files.pythonhosted.org/packages/82/bd/d1f11718ffe7611677e038fabe02cfc0766a0ebe7cbe5a4afa627ae60c87/anot-0.0.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f9e210c4d20e3c9a7c81ab4d7b77b205c9b97ee6ad0e3d073e105d7806e4e24f", size = 1822424 }, + { url = "https://files.pythonhosted.org/packages/fc/ab/b9330d07930753ff8635c0cf269cb20b8c0268b01d5f29c39494684c9d63/anot-0.0.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8a7f83c624e3f63e7546fdce4198dac54859a77a87713909f5fd29b84f651e3c", size = 1851943 }, + { url = "https://files.pythonhosted.org/packages/31/33/6fdcdb5895949c9905f1477cb72cab6edf47f1c8e077be2f84569a5d546d/anot-0.0.6-cp312-cp312-win32.whl", hash = "sha256:54b194d95ab88b16736559ddf7db5cb1b8309ac8319277e10a6843e13955a37c", size = 1229131 }, + { url = "https://files.pythonhosted.org/packages/67/b8/5eb1c0d6917f3693b2ef56726a90b621c52c958cd34f8f44397eabe11e52/anot-0.0.6-cp312-cp312-win_amd64.whl", hash = "sha256:a2078af0e3575d81d277478ca57e880818f96e273ef62ee638433591e347fffe", size = 1329656 }, + { url = "https://files.pythonhosted.org/packages/31/1f/de3c91d7170778b045d9fda0232c43fab48f5a78377258a9320d2bb070da/anot-0.0.6-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d834098e973a4bb2a65c99c4caabdb750b72a9d4f1a938e69002d338bfbd65f", size = 1527646 }, + { url = "https://files.pythonhosted.org/packages/83/ab/8ac1074b370742a530050bc54cadda90ca478796998ac813311e1880e5cc/anot-0.0.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dd82aef0857b17f3d6f6eaaaf5bc340d347a3dccaafa2381373459a8e2c5723b", size = 1456722 }, + { url = "https://files.pythonhosted.org/packages/63/89/ab36fe9fbdbf84452c4f4a50c425798ff7f2d01960f1958d98c887bffa36/anot-0.0.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb8836d282eb5380aee18426881ee7ac05c83d2dbd90dfc44c2c999b8a783a32", size = 1625676 }, + { url = "https://files.pythonhosted.org/packages/12/d5/f9dd3c378cbbba3dd0e7fcb7b348f9a654c760b14d22c9de075c649de4cf/anot-0.0.6-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:86897992cc03181b2d138f51182a74ebcce405e1bce32894e5dea3d9c3166a4e", size = 1576165 }, + { url = "https://files.pythonhosted.org/packages/c1/69/a123d2751774b636d3ebb3f8de8d43616b92cd00e939f56ed6266afd0860/anot-0.0.6-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbfee9189529d86ce4b47e4f4204a7d7e6579cd552a09b0a4b3cfc18219b751f", size = 1721332 }, + { url = "https://files.pythonhosted.org/packages/a1/c9/d8a121dd1b258a88d324685c76f34b9cb39d2e00b96c2e36b52d52856b2b/anot-0.0.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8ed2c8d59fcacc69b817a6f9199b60bd2377bb4a4d22f66bd40410accf1d379", size = 1786818 }, + { url = "https://files.pythonhosted.org/packages/8b/a3/a49443b3dad6f93493c853e21cfc76d06b4d96435e27ae52c5df2b21a109/anot-0.0.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:069f4fe65edc28024dcf6bc3ba5f82f335d1a1a202b84c3f6e4df9ac569a4317", size = 1812661 }, + { url = "https://files.pythonhosted.org/packages/be/75/44fb9e06a799cd3082df363ad52a385e2b9fd12b9aa2eb4be4d9034cb4e6/anot-0.0.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:818dcba4c8f5c8c8cff835faa275bf379061c8c6b1cc5202e01cbc04894918da", size = 1696237 }, + { url = "https://files.pythonhosted.org/packages/cd/73/d19d426da95578d9952d0520149046895b20926840ca8af24abc6399e3a7/anot-0.0.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d17c31982871b8872a16dc3b77ff1155cb410db9f1bbb7d1bd9497b6a151fb9b", size = 1779838 }, + { url = "https://files.pythonhosted.org/packages/6b/6c/fe96c9018abd93077410935c653d692d2a64634a8ea60a23f7be11203096/anot-0.0.6-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:7d4e79d11e9feba7cba7edd61bd267ba2f66dadfff5486e7caa6e3ab48c66f1c", size = 1819184 }, + { url = "https://files.pythonhosted.org/packages/81/d0/489a07012cb0c43bba832f2ffd11b03de6bd361beb44af329adf0c045d78/anot-0.0.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:12cbf223711531e9a0fba98626c3020fd7916f4d930ee139d9901e8183334f96", size = 1823154 }, + { url = "https://files.pythonhosted.org/packages/46/d8/65d271a918f157a91ae250f4bd49ce377f546085a32235defde42df94b0c/anot-0.0.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fba324d367034f87c44255d98c968d70cc1b226a4b0085c9ba040f370eb0f336", size = 1852082 }, + { url = "https://files.pythonhosted.org/packages/77/95/af7299d6902c496f8f6d2d3f0939952883edee0ca1185f25f299d178f6ed/anot-0.0.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4610f80c0e8ad4de5eb59516b6e10520fb4ec1b5b8880bc374851e567ef6bd3e", size = 1624820 }, + { url = "https://files.pythonhosted.org/packages/b4/b5/f273b16c8461b2f6a86a0a16509869dc1b0263895c36ad40fb4f0733ccf0/anot-0.0.6-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04e17f1809e4c6b3de9c369f0d46cabc2f8e07d183a12dfbe9f213843dcba527", size = 1576002 }, + { url = "https://files.pythonhosted.org/packages/fa/f0/91ff8bfe3e42dc18d5444af01777042662f6bdfb3f28bab422441a998bf5/anot-0.0.6-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6997bf1575c80e6836c1845183a0890d0fa892ca1dc34e6db42e3427e21e13b", size = 1787530 }, + { url = "https://files.pythonhosted.org/packages/bc/8c/ef094a1ebf70d9bf949027305188bb1487b1c3808d75ce87394e33baa927/anot-0.0.6-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36b18a6f500c796bc7dcc005d5c4d97b56628976b37b42cff083d48d3ea0778d", size = 1812119 }, + { url = "https://files.pythonhosted.org/packages/1a/d4/d06e737ee5da7419a21b105a7dd8b4180daa8d70c7b0acba63b19bb16db3/anot-0.0.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:32e6d52bcc101f9245b382c884ba170359ed068ac47a89adb58d4b5c3180b8ef", size = 1779358 }, + { url = "https://files.pythonhosted.org/packages/a5/55/ceef2e654ae7b3911020cf887197a0b04a0ce0f802ce7dd0eb6a29de72ad/anot-0.0.6-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:0fe96a294e2b2337aec050e4cd7b645e9e9c9c96f8f966ae402f5710dd789da7", size = 1815862 }, + { url = "https://files.pythonhosted.org/packages/0f/ac/7203b43966fbc851c4bc82677a29f82018045dd86f02d02f12ecd21d46a8/anot-0.0.6-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:cfd766f78a10753db871a0e5a5b8c522cdbbe451d8ca74b3594832fa4da46d08", size = 1822998 }, + { url = "https://files.pythonhosted.org/packages/ff/86/9af59607a8058f8de9b4e3a42460920bf383439cc12f48226039062c1af0/anot-0.0.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:35afe1766fd6ccee8ad1aeb9e7dfed3cba18087368afc85b5a1d45615010e306", size = 1850438 }, + { url = "https://files.pythonhosted.org/packages/7b/43/348f7978ffd4600320f79d678bf059e045d41bf3ebd525f65a4bb113c27f/anot-0.0.6-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9acfb61598fad96d1c9d8d4d772a2db8efc2d45e90531295576a84a505fc33f0", size = 1626493 }, + { url = "https://files.pythonhosted.org/packages/26/2e/3913e924272ae8a7f82b29579b40bed19997cc74761fa07671f43bb5d6fb/anot-0.0.6-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bddaba36f33fe396f1df84b2791e48b4fea4934f14b77634d7bc631241bc86c3", size = 1578847 }, + { url = "https://files.pythonhosted.org/packages/4e/cc/40878f3a7f9d744444225d879793681958d20e86f9e309d2851f322b6833/anot-0.0.6-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e68ee02a83e9b0e5e3d22f0fc7f66deff59d4b1b960da7f27aa6ab87b4c658de", size = 1723092 }, + { url = "https://files.pythonhosted.org/packages/e5/ad/17815593a732628b2b4f431ecbafd06c6f4c584f831b0f33cd02bc654c35/anot-0.0.6-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2aa66f2cc9c1ed908fc44f258844be594f48214a7bde9233fabb3b26ec650f14", size = 1788107 }, + { url = "https://files.pythonhosted.org/packages/ec/a3/3c982f15f23d66e47dbab5b780ce7113a0d8bada4ed9ef6263151479c045/anot-0.0.6-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a3773a9653120f6987f63603bbd8cbd14726aad5ee7ad22cf5a1b31d3a88e76", size = 1816612 }, + { url = "https://files.pythonhosted.org/packages/45/c0/54d4d17ee35175f420ead1bd8c213eda1c06cce13037e111244a66186154/anot-0.0.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed7d32488608144eb87195296a882266ea164db62d5921b15f6576fd4117f8f2", size = 1698287 }, + { url = "https://files.pythonhosted.org/packages/d2/d9/9943c21efdcd80c9a00df6f9a8da8f964a63c135387f58436ba501ec38ac/anot-0.0.6-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:b14fca2f456cdeeb518b4cef5f25eece9e488b70923d37880652496fb818f319", size = 1781981 }, + { url = "https://files.pythonhosted.org/packages/0e/71/1e5adda669d862e3e82e1d453226aaf10b934bab145077227f95fc19958a/anot-0.0.6-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:62064f5c2795c26a110ed0bf01a9480effc7ff7502cff57d61233f4081e46aee", size = 1819104 }, + { url = "https://files.pythonhosted.org/packages/f5/f9/d8e06ac4096384c5c60cfd2f3aae2b8e644559e6ea3456f5ed371462a844/anot-0.0.6-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a45380dfb5708950b050f1b9bb382d1e1e73eff7ed13bbc389e7f2abb5ea007e", size = 1823905 }, + { url = "https://files.pythonhosted.org/packages/df/c0/1b0fc3bfd2675114f218c75e1354cacc9983840416f6ef4a491c8b38bed2/anot-0.0.6-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:1a543a863c3571c3d9d54d8def3852c2e50c9a8e477828463bca1dd0e9d1844e", size = 1852817 }, ] [[package]] @@ -207,6 +207,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", size = 16163 }, ] +[[package]] +name = "gitdb" +version = "4.0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "smmap" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794 }, +] + +[[package]] +name = "gitpython" +version = "3.1.44" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "gitdb" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/89/37df0b71473153574a5cdef8f242de422a0f5d26d7a9e231e6f169b4ad14/gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269", size = 214196 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110", size = 207599 }, +] + [[package]] name = "identify" version = "2.6.5" @@ -225,6 +249,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, ] +[[package]] +name = "markdown-it-py" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, +] + [[package]] name = "maturin" version = "1.8.1" @@ -248,14 +284,25 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a4/f5/051413e04f6da25069db5e76759ecdb8cd2a8ab4a94045b5a3bf548c66fa/maturin-1.8.1-py3-none-win_arm64.whl", hash = "sha256:e95f077fd2ddd2f048182880eed458c308571a534be3eb2add4d3dac55bf57f4", size = 6552131 }, ] +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, +] + [[package]] name = "mthd" -version = "0.0.3.dev0+gfb27703.d20250114" +version = "0.0.3.dev3+gb7b5f2e.d20250118" source = { editable = "." } dependencies = [ { name = "anot" }, { name = "dishka" }, + { name = "gitpython" }, { name = "pydantic" }, + { name = "rich" }, ] [package.dev-dependencies] @@ -270,9 +317,11 @@ dev = [ [package.metadata] requires-dist = [ - { name = "anot", specifier = ">=0.0.3" }, + { name = "anot", specifier = ">=0.0.6" }, { name = "dishka", specifier = ">=1.4.2" }, + { name = "gitpython", specifier = ">=3.1.44" }, { name = "pydantic", specifier = ">=2.10.5" }, + { name = "rich", specifier = ">=13.9.4" }, ] [package.metadata.requires-dev] @@ -426,6 +475,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/63/37/3e32eeb2a451fddaa3898e2163746b0cffbbdbb4740d38372db0490d67f3/pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151", size = 2004715 }, ] +[[package]] +name = "pygments" +version = "2.19.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, +] + [[package]] name = "pyright" version = "1.1.391" @@ -512,6 +570,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, ] +[[package]] +name = "rich" +version = "13.9.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 }, +] + [[package]] name = "ruff" version = "0.9.1" @@ -537,6 +609,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/94/0498cdb7316ed67a1928300dd87d659c933479f44dec51b4f62bfd1f8028/ruff-0.9.1-py3-none-win_arm64.whl", hash = "sha256:1cd76c7f9c679e6e8f2af8f778367dca82b95009bc7b1a85a47f1521ae524fa7", size = 9145708 }, ] +[[package]] +name = "smmap" +version = "5.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303 }, +] + [[package]] name = "tomli" version = "2.2.1" From 5e4b4f79ef4ffd64f6c2143e871faec6b934fd63 Mon Sep 17 00:00:00 2001 From: Rory Byrne Date: Sat, 18 Jan 2025 15:17:43 +0000 Subject: [PATCH 5/6] refactor: remove unused imports and commented out code for better code clarity --- mthd/decorator.py | 6 ++---- pyproject.toml | 2 +- uv.lock | 10 +++++----- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/mthd/decorator.py b/mthd/decorator.py index 4e38134..a67c9ad 100644 --- a/mthd/decorator.py +++ b/mthd/decorator.py @@ -7,8 +7,6 @@ from mthd.domain.commit import CommitMessage, StageStrategy from mthd.error import MthdError -from mthd.service.git import GitService -from mthd.util.di import DI def commit( @@ -24,13 +22,13 @@ def commit( def decorator(func: Callable) -> Callable: @wraps(func) def wrapper(*args, **kwargs): - di = DI() + # di = DI() hyperparameters = cast(BaseModel, kwargs.get(hypers, None)) if not hyperparameters: raise MthdError( "Hyperparameters must be provided in the function call." ) - git_service = di[GitService] + # git_service = di[GitService] # codebase_service = di[CodebaseService] # Generate commit message diff --git a/pyproject.toml b/pyproject.toml index 3c7aba1..c3a2f32 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,10 +48,10 @@ source = "vcs" dev-dependencies = [ "coverage>=7.6.9", "pre-commit>=4.0.1", - "pyright>=1.1.390", "pytest-mock>=3.14.0", "pytest>=8.3.4", "ruff>=0.8.2", + "pyright>=1.1.392.post0", ] [tool.ruff] diff --git a/uv.lock b/uv.lock index 389f932..cde7f66 100644 --- a/uv.lock +++ b/uv.lock @@ -295,7 +295,7 @@ wheels = [ [[package]] name = "mthd" -version = "0.0.3.dev3+gb7b5f2e.d20250118" +version = "0.0.3.dev4+g0bdb96d.d20250118" source = { editable = "." } dependencies = [ { name = "anot" }, @@ -328,7 +328,7 @@ requires-dist = [ dev = [ { name = "coverage", specifier = ">=7.6.9" }, { name = "pre-commit", specifier = ">=4.0.1" }, - { name = "pyright", specifier = ">=1.1.390" }, + { name = "pyright", specifier = ">=1.1.392.post0" }, { name = "pytest", specifier = ">=8.3.4" }, { name = "pytest-mock", specifier = ">=3.14.0" }, { name = "ruff", specifier = ">=0.8.2" }, @@ -486,15 +486,15 @@ wheels = [ [[package]] name = "pyright" -version = "1.1.391" +version = "1.1.392.post0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "nodeenv" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/11/05/4ea52a8a45cc28897edb485b4102d37cbfd5fce8445d679cdeb62bfad221/pyright-1.1.391.tar.gz", hash = "sha256:66b2d42cdf5c3cbab05f2f4b76e8bec8aa78e679bfa0b6ad7b923d9e027cadb2", size = 21965 } +sdist = { url = "https://files.pythonhosted.org/packages/66/df/3c6f6b08fba7ccf49b114dfc4bb33e25c299883fd763f93fad47ef8bc58d/pyright-1.1.392.post0.tar.gz", hash = "sha256:3b7f88de74a28dcfa90c7d90c782b6569a48c2be5f9d4add38472bdaac247ebd", size = 3789911 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/89/66f49552fbeb21944c8077d11834b2201514a56fd1b7747ffff9630f1bd9/pyright-1.1.391-py3-none-any.whl", hash = "sha256:54fa186f8b3e8a55a44ebfa842636635688670c6896dcf6cf4a7fc75062f4d15", size = 18579 }, + { url = "https://files.pythonhosted.org/packages/e7/b1/a18de17f40e4f61ca58856b9ef9b0febf74ff88978c3f7776f910071f567/pyright-1.1.392.post0-py3-none-any.whl", hash = "sha256:252f84458a46fa2f0fd4e2f91fc74f50b9ca52c757062e93f6c250c0d8329eb2", size = 5595487 }, ] [[package]] From 8c8ca9a4c782b9a7587796aff65d45a70a7586fa Mon Sep 17 00:00:00 2001 From: Rory Byrne Date: Sat, 18 Jan 2025 15:24:02 +0000 Subject: [PATCH 6/6] refactor: update pydantic model configuration to v2 syntax for better compatibility --- mthd/util/model.py | 5 ++--- tests/unit/domain/commit_test.py | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/mthd/util/model.py b/mthd/util/model.py index cb8287f..10a4e33 100644 --- a/mthd/util/model.py +++ b/mthd/util/model.py @@ -1,6 +1,5 @@ -from pydantic import BaseModel +from pydantic import BaseModel, ConfigDict class Model(BaseModel): - class Config: - arbitrary_types_allowed = True + model_config = ConfigDict(arbitrary_types_allowed=True) diff --git a/tests/unit/domain/commit_test.py b/tests/unit/domain/commit_test.py index 1097da2..5e5b59f 100644 --- a/tests/unit/domain/commit_test.py +++ b/tests/unit/domain/commit_test.py @@ -11,7 +11,7 @@ class Hypers(BaseModel): msg = CommitMessage( summary="test", - hyperparameters=Hypers(a=1, b=2.0, c="3"), + hyperparameters=Hypers(a=1, b=2.0, c="3").model_dump(), ) print(msg.format())