From 266964f62b723a890c0b932e4110e3c69861c56f Mon Sep 17 00:00:00 2001 From: root Date: Fri, 3 Jan 2025 15:36:16 +0100 Subject: [PATCH 01/18] added test to write fcopy-newtype-inst --- Makefile | 26 +- examples/bounded_wrapped_ints.py | 4 +- examples/mutable.py | 28 ++ examples/newtype_enums.py | 137 ++++++ newtype/newtype.py | 4 +- poetry.lock | 714 +++++++++++++++---------------- pyproject.toml | 3 + requirements-docs.txt | 229 +++++----- 8 files changed, 660 insertions(+), 485 deletions(-) create mode 100644 examples/mutable.py create mode 100644 examples/newtype_enums.py diff --git a/Makefile b/Makefile index e9f8058..abbbe9d 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ PYD_FILES := newtypemethod.*-*.pyd newtypeinit.*-*.pyd $(PROJECT_DIR)/$(EXTENSIO BUILD_DIR := build PYTEST_FLAGS := -s -vv -.PHONY: all clean build test test-all test-debug test-custom test-free test-slots test-init test-leak install lint format check venv-poetry clean-deps docker-build docker-run docker-clean docker-demo dist-contents +.PHONY: all clean build test test-all test-debug test-custom test-free test-slots test-init test-leak install lint format check venv-poetry clean-deps docker-build docker-run docker-clean docker-demo dist-contents check-version # Default target all: clean build test format check venv-poetry clean-deps @@ -154,6 +154,30 @@ install-test: install-dev-deps dev list-packaged: build tar -tf $(shell ls -1 dist/*.tar.gz | sort -V | tail -n 1) +# Version verification +check-version: + @echo "Checking version consistency..." + @DIST_FILE=$$(ls dist/python_newtype-*.tar.gz | sort -V | tail -n1); \ + if [ ! -f "$$DIST_FILE" ]; then \ + echo "Error: No distribution package found in dist/"; \ + exit 1; \ + fi; \ + DIST_BASE=$$(basename "$$DIST_FILE" .tar.gz); \ + DIST_VERSION=$$(tar -xOf "$$DIST_FILE" "$$DIST_BASE/newtype/__init__.py" | grep "__version__" | cut -d'"' -f2); \ + GIT_VERSION=$$(git describe --tags --abbrev=0 | sed 's/^v//'); \ + if [ -z "$$DIST_VERSION" ] || [ -z "$$GIT_VERSION" ]; then \ + echo "Error: Could not extract version information"; \ + exit 1; \ + fi; \ + if [ "$$DIST_VERSION" != "$$GIT_VERSION" ]; then \ + echo "Version mismatch:"; \ + echo " Distribution version: $$DIST_VERSION"; \ + echo " Git tag version: $$GIT_VERSION"; \ + exit 1; \ + else \ + echo "Version consistency check passed (version: $$DIST_VERSION)"; \ + fi + # Help target help: @echo "Available targets:" diff --git a/examples/bounded_wrapped_ints.py b/examples/bounded_wrapped_ints.py index eccf0b4..6aa79b6 100644 --- a/examples/bounded_wrapped_ints.py +++ b/examples/bounded_wrapped_ints.py @@ -10,8 +10,8 @@ class GenericWrappedBoundedInt_WithNewType(NewType(int)): # never mind about th __CONCRETE_BOUNDED_INTS__ = WeakValueDictionary() - def __new__(self, value: int): - inst = super().__new__(self, value % self.MAX_VALUE) + def __new__(cls, value: int): + inst = super().__new__(cls, value % cls.MAX_VALUE) return inst def __repr__(self) -> str: diff --git a/examples/mutable.py b/examples/mutable.py new file mode 100644 index 0000000..0593893 --- /dev/null +++ b/examples/mutable.py @@ -0,0 +1,28 @@ +from newtype import NewType + + +class Mutable: + def __init__(self, inner: int): + self.inner = inner + + def copy(self): + return Mutable(self.inner) + + +class MutableSubType(NewType(Mutable)): + def __init__(self, mutable: Mutable, inner2: int): + self.inner2 = inner2 + + +def test_mutable_and_subtype(): + mutable_sub_type = MutableSubType(Mutable(1), 2) + assert mutable_sub_type.inner == 1 + assert mutable_sub_type.inner2 == 2 + + mutable_sub_type.inner2 = 3 + mutable_sub_type_copy = mutable_sub_type.copy() + assert mutable_sub_type.inner == 1 + assert mutable_sub_type.inner2 == 3 + + assert mutable_sub_type_copy.inner == 1 + assert mutable_sub_type_copy.inner2 == 3 diff --git a/examples/newtype_enums.py b/examples/newtype_enums.py new file mode 100644 index 0000000..04bd069 --- /dev/null +++ b/examples/newtype_enums.py @@ -0,0 +1,137 @@ +from enum import Enum + +import pytest + +from newtype import NewType, newtype_exclude + + +class ENV(NewType(str), Enum): + + LOCAL = "LOCAL" + DEV = "DEV" + SIT = "SIT" + UAT = "UAT" + PREPROD = "PREPROD" + PROD = "PROD" + +class RegularENV(str, Enum): + + LOCAL = "LOCAL" + DEV = "DEV" + SIT = "SIT" + UAT = "UAT" + PREPROD = "PREPROD" + PROD = "PROD" + +class ENVVariant(str): + + __VALID_MEMBERS__ = ["LOCAL", "DEV", "SIT", "UAT", "PREPROD", "PROD"] + + def __new__(cls, value: str): + members = ENVVariant.__VALID_MEMBERS__ + # if isinstance(value, RollYourOwnNewTypeEnum): + # value_as_str = str(value.value) + # else: + value_as_str = str(value) + if value_as_str not in members: + raise ValueError(f"`value` = {value} must be one of `{members}`; `value_as_str` = {value_as_str}") + return super().__new__(cls, value_as_str) + + # why not i write my own `.replace(..)` + # yes, you can but how? + def my_replace(self, old: "ENVVariant", new: "ENVVariant", count: int=-1): + return ENVVariant(str(self).replace(str(old), str(new), count)) + +class RollYourOwnNewTypeEnum(ENVVariant, Enum): + + LOCAL = "LOCAL" + DEV = "DEV" + SIT = "SIT" + UAT = "UAT" + PREPROD = "PREPROD" + PROD = "PROD" + + +def test_nt_env_replace(): + + env = ENV.LOCAL + + assert env is ENV.LOCAL + assert env is not ENV.DEV + assert isinstance(env, ENV) + + # let's say now we want to replace the environment + # nevermind about the reason why we want to do so + env = env.replace(ENV.LOCAL, ENV.DEV) + + # replacement is successful + assert env is ENV.DEV + assert env is not ENV.LOCAL + + # still an `ENV` + assert isinstance(env, ENV) + assert isinstance(env, str) + + with pytest.raises(ValueError): + # cannot replace with something that is not a `ENV` + env = env.replace(ENV.DEV, "NotAnEnv") + + with pytest.raises(ValueError): + # cannot even make 'DEV' -> 'dev' + env = env.lower() + +def test_reg_env_replace(): + + env = RegularENV.LOCAL + + # expected outcomes + assert env is RegularENV.LOCAL # pass + assert env is not RegularENV.DEV # pass + assert isinstance(env, RegularENV) # pass + + # now we try to replace + env = env.replace(RegularENV.LOCAL, RegularENV.DEV) + + # we are hoping that it will continue to be a `RegularENV.DEV` but it is not + assert env is not RegularENV.DEV # pass, no longer a `RegularENV` + assert env is not RegularENV.LOCAL # pass, no longer a `RegularENV` + assert not isinstance(env, RegularENV) + assert isinstance(env, str) # 'downcast' (?) to `str` + +def test_ryont_env_replace(): + + env = RollYourOwnNewTypeEnum.LOCAL + + # expected outcomes + assert env is RollYourOwnNewTypeEnum.LOCAL # pass + assert env is not RollYourOwnNewTypeEnum.DEV # pass + assert isinstance(env, RollYourOwnNewTypeEnum) # pass + + # now we try to replace + env = env.replace(RollYourOwnNewTypeEnum.LOCAL, RollYourOwnNewTypeEnum.DEV) + + # we are hoping that it will continue to be a `RollYourOwnNewTypeEnum.DEV` but it is not + assert env is not RollYourOwnNewTypeEnum.DEV # pass, no longer a `RollYourOwnNewTypeEnum` + assert env is not RollYourOwnNewTypeEnum.LOCAL # pass, no longer a `RollYourOwnNewTypeEnum` + assert not isinstance(env, RollYourOwnNewTypeEnum) + assert isinstance(env, str) # 'downcast' (?) to `str` + + with pytest.raises(AssertionError): + assert env is RollYourOwnNewTypeEnum.DEV + + with pytest.raises(AssertionError): + assert env is RollYourOwnNewTypeEnum.DEV + + with pytest.raises(AssertionError): + assert isinstance(env, RollYourOwnNewTypeEnum) + + env = env.replace("DEV", "NotAnEnv") + assert env == "NotAnEnv" # this 'shouldn't' pass but it does + + env = RollYourOwnNewTypeEnum.LOCAL + + # env = env.my_replace(RollYourOwnNewTypeEnum.LOCAL, RollYourOwnNewTypeEnum.PREPROD) + + assert isinstance(env, str) + assert env is not RollYourOwnNewTypeEnum.PREPROD + assert isinstance(env, RollYourOwnNewTypeEnum) diff --git a/newtype/newtype.py b/newtype/newtype.py index d2bb803..cca92bf 100644 --- a/newtype/newtype.py +++ b/newtype/newtype.py @@ -122,7 +122,7 @@ class _Test(base_type): # type: ignore[valid-type, misc] return True -def NewType(base_type: T, **_context: "Dict[str, Any]") -> T: # noqa: N802, C901 +def NewType(base_type: T, **_context: "Dict[str, Any]") -> "T": # noqa: N802, C901 """Create a new type that preserves type information through all operations. This is the main factory function for creating new types. It wraps an existing @@ -280,7 +280,7 @@ def __init__(self, _value=None, *_args, **_kwargs): # we try to store it in a cache, if it fails, no problem either if base_type not in __GLOBAL_INTERNAL_TYPE_CACHE__: __GLOBAL_INTERNAL_TYPE_CACHE__[base_type] = BaseNewType - except Exception: # noqa: S110 + except KeyError: # noqa: S110 pass return cast(T, BaseNewType) diff --git a/poetry.lock b/poetry.lock index 60387c2..17a15e9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -31,19 +31,19 @@ wheel = ">=0.23.0,<1.0" [[package]] name = "attrs" -version = "24.2.0" +version = "24.3.0" description = "Classes Without Boilerplate" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, - {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, + {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, + {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, ] [package.extras] benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] @@ -145,6 +145,7 @@ files = [ [package.dependencies] six = ">=1.9.0" +tinycss2 = {version = ">=1.1.0,<1.3", optional = true, markers = "extra == \"css\""} webencodings = "*" [package.extras] @@ -152,13 +153,13 @@ css = ["tinycss2 (>=1.1.0,<1.3)"] [[package]] name = "certifi" -version = "2024.8.30" +version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, - {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, + {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, + {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, ] [[package]] @@ -253,127 +254,114 @@ files = [ [[package]] name = "charset-normalizer" -version = "3.4.0" +version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.7" files = [ - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, - {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, - {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, - {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, - {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, - {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, - {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, - {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, - {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, - {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, + {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, + {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, ] [[package]] name = "click" -version = "8.1.7" +version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, + {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, + {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, ] [package.dependencies] @@ -724,13 +712,13 @@ colors = ["colorama (>=0.4.6)"] [[package]] name = "jinja2" -version = "3.1.4" +version = "3.1.5" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, - {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, + {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, + {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, ] [package.dependencies] @@ -1156,15 +1144,18 @@ files = [ [[package]] name = "mistune" -version = "3.0.2" +version = "3.1.0" description = "A sane and fast Markdown parser with useful plugins and renderers" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, - {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, + {file = "mistune-3.1.0-py3-none-any.whl", hash = "sha256:b05198cf6d671b3deba6c87ec6cf0d4eb7b72c524636eddb6dbf13823b52cee1"}, + {file = "mistune-3.1.0.tar.gz", hash = "sha256:dbcac2f78292b9dc066cd03b7a3a26b62d85f8159f2ea5fd28e55df79908d667"}, ] +[package.dependencies] +typing-extensions = {version = "*", markers = "python_version < \"3.11\""} + [[package]] name = "mkdocs" version = "1.6.1" @@ -1231,13 +1222,13 @@ pyyaml = ">=5.1" [[package]] name = "mkdocs-material" -version = "9.5.48" +version = "9.5.49" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.48-py3-none-any.whl", hash = "sha256:b695c998f4b939ce748adbc0d3bff73fa886a670ece948cf27818fa115dc16f8"}, - {file = "mkdocs_material-9.5.48.tar.gz", hash = "sha256:a582531e8b34f4c7ed38c29d5c44763053832cf2a32f7409567e0c74749a47db"}, + {file = "mkdocs_material-9.5.49-py3-none-any.whl", hash = "sha256:c3c2d8176b18198435d3a3e119011922f3e11424074645c24019c2dcf08a360e"}, + {file = "mkdocs_material-9.5.49.tar.gz", hash = "sha256:3671bb282b4f53a1c72e08adbe04d2481a98f85fed392530051f80ff94a9621d"}, ] [package.dependencies] @@ -1316,49 +1307,55 @@ mkdocstrings = ">=0.26" [[package]] name = "mypy" -version = "1.13.0" +version = "1.14.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"}, - {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"}, - {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"}, - {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"}, - {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, - {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, - {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, - {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, - {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, - {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, - {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"}, - {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"}, - {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"}, - {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"}, - {file = "mypy-1.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a"}, - {file = "mypy-1.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb"}, - {file = "mypy-1.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b"}, - {file = "mypy-1.13.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74"}, - {file = "mypy-1.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6"}, - {file = "mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc"}, - {file = "mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732"}, - {file = "mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc"}, - {file = "mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d"}, - {file = "mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24"}, - {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, - {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, + {file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, + {file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, + {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90716d8b2d1f4cd503309788e51366f07c56635a3309b0f6a32547eaaa36a64d"}, + {file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae753f5c9fef278bcf12e1a564351764f2a6da579d4a81347e1d5a15819997b"}, + {file = "mypy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0fe0f5feaafcb04505bcf439e991c6d8f1bf8b15f12b05feeed96e9e7bf1427"}, + {file = "mypy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d54bd85b925e501c555a3227f3ec0cfc54ee8b6930bd6141ec872d1c572f81f"}, + {file = "mypy-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f995e511de847791c3b11ed90084a7a0aafdc074ab88c5a9711622fe4751138c"}, + {file = "mypy-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d64169ec3b8461311f8ce2fd2eb5d33e2d0f2c7b49116259c51d0d96edee48d1"}, + {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba24549de7b89b6381b91fbc068d798192b1b5201987070319889e93038967a8"}, + {file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:183cf0a45457d28ff9d758730cd0210419ac27d4d3f285beda038c9083363b1f"}, + {file = "mypy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f2a0ecc86378f45347f586e4163d1769dd81c5a223d577fe351f26b179e148b1"}, + {file = "mypy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:ad3301ebebec9e8ee7135d8e3109ca76c23752bac1e717bc84cd3836b4bf3eae"}, + {file = "mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14"}, + {file = "mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9"}, + {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11"}, + {file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e"}, + {file = "mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89"}, + {file = "mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b"}, + {file = "mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255"}, + {file = "mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34"}, + {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a"}, + {file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9"}, + {file = "mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd"}, + {file = "mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107"}, + {file = "mypy-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7084fb8f1128c76cd9cf68fe5971b37072598e7c31b2f9f95586b65c741a9d31"}, + {file = "mypy-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f845a00b4f420f693f870eaee5f3e2692fa84cc8514496114649cfa8fd5e2c6"}, + {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44bf464499f0e3a2d14d58b54674dee25c031703b2ffc35064bd0df2e0fac319"}, + {file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c99f27732c0b7dc847adb21c9d47ce57eb48fa33a17bc6d7d5c5e9f9e7ae5bac"}, + {file = "mypy-1.14.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:bce23c7377b43602baa0bd22ea3265c49b9ff0b76eb315d6c34721af4cdf1d9b"}, + {file = "mypy-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:8edc07eeade7ebc771ff9cf6b211b9a7d93687ff892150cb5692e4f4272b0837"}, + {file = "mypy-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3888a1816d69f7ab92092f785a462944b3ca16d7c470d564165fe703b0970c35"}, + {file = "mypy-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46c756a444117c43ee984bd055db99e498bc613a70bbbc120272bd13ca579fbc"}, + {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27fc248022907e72abfd8e22ab1f10e903915ff69961174784a3900a8cba9ad9"}, + {file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:499d6a72fb7e5de92218db961f1a66d5f11783f9ae549d214617edab5d4dbdbb"}, + {file = "mypy-1.14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57961db9795eb566dc1d1b4e9139ebc4c6b0cb6e7254ecde69d1552bf7613f60"}, + {file = "mypy-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:07ba89fdcc9451f2ebb02853deb6aaaa3d2239a236669a63ab3801bbf923ef5c"}, + {file = "mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1"}, + {file = "mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6"}, ] [package.dependencies] -mypy-extensions = ">=1.0.0" +mypy_extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.6.0" +typing_extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] @@ -1402,18 +1399,18 @@ test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>= [[package]] name = "nbconvert" -version = "7.16.4" +version = "7.16.5" description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." optional = false python-versions = ">=3.8" files = [ - {file = "nbconvert-7.16.4-py3-none-any.whl", hash = "sha256:05873c620fe520b6322bf8a5ad562692343fe3452abda5765c7a34b7d1aa3eb3"}, - {file = "nbconvert-7.16.4.tar.gz", hash = "sha256:86ca91ba266b0a448dc96fa6c5b9d98affabde2867b363258703536807f9f7f4"}, + {file = "nbconvert-7.16.5-py3-none-any.whl", hash = "sha256:e12eac052d6fd03040af4166c563d76e7aeead2e9aadf5356db552a1784bd547"}, + {file = "nbconvert-7.16.5.tar.gz", hash = "sha256:c83467bb5777fdfaac5ebbb8e864f300b277f68692ecc04d6dab72f2d8442344"}, ] [package.dependencies] beautifulsoup4 = "*" -bleach = "!=5.0.0" +bleach = {version = "!=5.0.0", extras = ["css"]} defusedxml = "*" importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} jinja2 = ">=3.0" @@ -1426,7 +1423,6 @@ nbformat = ">=5.7" packaging = "*" pandocfilters = ">=1.4.1" pygments = ">=2.4.1" -tinycss2 = "*" traitlets = ">=5.1" [package.extras] @@ -1509,66 +1505,66 @@ files = [ [[package]] name = "numpy" -version = "2.2.0" +version = "2.2.1" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" files = [ - {file = "numpy-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1e25507d85da11ff5066269d0bd25d06e0a0f2e908415534f3e603d2a78e4ffa"}, - {file = "numpy-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a62eb442011776e4036af5c8b1a00b706c5bc02dc15eb5344b0c750428c94219"}, - {file = "numpy-2.2.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:b606b1aaf802e6468c2608c65ff7ece53eae1a6874b3765f69b8ceb20c5fa78e"}, - {file = "numpy-2.2.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:36b2b43146f646642b425dd2027730f99bac962618ec2052932157e213a040e9"}, - {file = "numpy-2.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fe8f3583e0607ad4e43a954e35c1748b553bfe9fdac8635c02058023277d1b3"}, - {file = "numpy-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:122fd2fcfafdefc889c64ad99c228d5a1f9692c3a83f56c292618a59aa60ae83"}, - {file = "numpy-2.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3f2f5cddeaa4424a0a118924b988746db6ffa8565e5829b1841a8a3bd73eb59a"}, - {file = "numpy-2.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7fe4bb0695fe986a9e4deec3b6857003b4cfe5c5e4aac0b95f6a658c14635e31"}, - {file = "numpy-2.2.0-cp310-cp310-win32.whl", hash = "sha256:b30042fe92dbd79f1ba7f6898fada10bdaad1847c44f2dff9a16147e00a93661"}, - {file = "numpy-2.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:54dc1d6d66f8d37843ed281773c7174f03bf7ad826523f73435deb88ba60d2d4"}, - {file = "numpy-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9874bc2ff574c40ab7a5cbb7464bf9b045d617e36754a7bc93f933d52bd9ffc6"}, - {file = "numpy-2.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0da8495970f6b101ddd0c38ace92edea30e7e12b9a926b57f5fabb1ecc25bb90"}, - {file = "numpy-2.2.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:0557eebc699c1c34cccdd8c3778c9294e8196df27d713706895edc6f57d29608"}, - {file = "numpy-2.2.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:3579eaeb5e07f3ded59298ce22b65f877a86ba8e9fe701f5576c99bb17c283da"}, - {file = "numpy-2.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40deb10198bbaa531509aad0cd2f9fadb26c8b94070831e2208e7df543562b74"}, - {file = "numpy-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2aed8fcf8abc3020d6a9ccb31dbc9e7d7819c56a348cc88fd44be269b37427e"}, - {file = "numpy-2.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a222d764352c773aa5ebde02dd84dba3279c81c6db2e482d62a3fa54e5ece69b"}, - {file = "numpy-2.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4e58666988605e251d42c2818c7d3d8991555381be26399303053b58a5bbf30d"}, - {file = "numpy-2.2.0-cp311-cp311-win32.whl", hash = "sha256:4723a50e1523e1de4fccd1b9a6dcea750c2102461e9a02b2ac55ffeae09a4410"}, - {file = "numpy-2.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:16757cf28621e43e252c560d25b15f18a2f11da94fea344bf26c599b9cf54b73"}, - {file = "numpy-2.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cff210198bb4cae3f3c100444c5eaa573a823f05c253e7188e1362a5555235b3"}, - {file = "numpy-2.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58b92a5828bd4d9aa0952492b7de803135038de47343b2aa3cc23f3b71a3dc4e"}, - {file = "numpy-2.2.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:ebe5e59545401fbb1b24da76f006ab19734ae71e703cdb4a8b347e84a0cece67"}, - {file = "numpy-2.2.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e2b8cd48a9942ed3f85b95ca4105c45758438c7ed28fff1e4ce3e57c3b589d8e"}, - {file = "numpy-2.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57fcc997ffc0bef234b8875a54d4058afa92b0b0c4223fc1f62f24b3b5e86038"}, - {file = "numpy-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ad7d11b309bd132d74397fcf2920933c9d1dc865487128f5c03d580f2c3d03"}, - {file = "numpy-2.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cb24cca1968b21355cc6f3da1a20cd1cebd8a023e3c5b09b432444617949085a"}, - {file = "numpy-2.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0798b138c291d792f8ea40fe3768610f3c7dd2574389e37c3f26573757c8f7ef"}, - {file = "numpy-2.2.0-cp312-cp312-win32.whl", hash = "sha256:afe8fb968743d40435c3827632fd36c5fbde633b0423da7692e426529b1759b1"}, - {file = "numpy-2.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:3a4199f519e57d517ebd48cb76b36c82da0360781c6a0353e64c0cac30ecaad3"}, - {file = "numpy-2.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f8c8b141ef9699ae777c6278b52c706b653bf15d135d302754f6b2e90eb30367"}, - {file = "numpy-2.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f0986e917aca18f7a567b812ef7ca9391288e2acb7a4308aa9d265bd724bdae"}, - {file = "numpy-2.2.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:1c92113619f7b272838b8d6702a7f8ebe5edea0df48166c47929611d0b4dea69"}, - {file = "numpy-2.2.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5a145e956b374e72ad1dff82779177d4a3c62bc8248f41b80cb5122e68f22d13"}, - {file = "numpy-2.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18142b497d70a34b01642b9feabb70156311b326fdddd875a9981f34a369b671"}, - {file = "numpy-2.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7d41d1612c1a82b64697e894b75db6758d4f21c3ec069d841e60ebe54b5b571"}, - {file = "numpy-2.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a98f6f20465e7618c83252c02041517bd2f7ea29be5378f09667a8f654a5918d"}, - {file = "numpy-2.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e09d40edfdb4e260cb1567d8ae770ccf3b8b7e9f0d9b5c2a9992696b30ce2742"}, - {file = "numpy-2.2.0-cp313-cp313-win32.whl", hash = "sha256:3905a5fffcc23e597ee4d9fb3fcd209bd658c352657548db7316e810ca80458e"}, - {file = "numpy-2.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:a184288538e6ad699cbe6b24859206e38ce5fba28f3bcfa51c90d0502c1582b2"}, - {file = "numpy-2.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7832f9e8eb00be32f15fdfb9a981d6955ea9adc8574c521d48710171b6c55e95"}, - {file = "numpy-2.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0dd071b95bbca244f4cb7f70b77d2ff3aaaba7fa16dc41f58d14854a6204e6c"}, - {file = "numpy-2.2.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:b0b227dcff8cdc3efbce66d4e50891f04d0a387cce282fe1e66199146a6a8fca"}, - {file = "numpy-2.2.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6ab153263a7c5ccaf6dfe7e53447b74f77789f28ecb278c3b5d49db7ece10d6d"}, - {file = "numpy-2.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e500aba968a48e9019e42c0c199b7ec0696a97fa69037bea163b55398e390529"}, - {file = "numpy-2.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:440cfb3db4c5029775803794f8638fbdbf71ec702caf32735f53b008e1eaece3"}, - {file = "numpy-2.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a55dc7a7f0b6198b07ec0cd445fbb98b05234e8b00c5ac4874a63372ba98d4ab"}, - {file = "numpy-2.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4bddbaa30d78c86329b26bd6aaaea06b1e47444da99eddac7bf1e2fab717bd72"}, - {file = "numpy-2.2.0-cp313-cp313t-win32.whl", hash = "sha256:30bf971c12e4365153afb31fc73f441d4da157153f3400b82db32d04de1e4066"}, - {file = "numpy-2.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d35717333b39d1b6bb8433fa758a55f1081543de527171543a2b710551d40881"}, - {file = "numpy-2.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e12c6c1ce84628c52d6367863773f7c8c8241be554e8b79686e91a43f1733773"}, - {file = "numpy-2.2.0-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:b6207dc8fb3c8cb5668e885cef9ec7f70189bec4e276f0ff70d5aa078d32c88e"}, - {file = "numpy-2.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a50aeff71d0f97b6450d33940c7181b08be1441c6c193e678211bff11aa725e7"}, - {file = "numpy-2.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:df12a1f99b99f569a7c2ae59aa2d31724e8d835fc7f33e14f4792e3071d11221"}, - {file = "numpy-2.2.0.tar.gz", hash = "sha256:140dd80ff8981a583a60980be1a655068f8adebf7a45a06a6858c873fcdcd4a0"}, + {file = "numpy-2.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5edb4e4caf751c1518e6a26a83501fda79bff41cc59dac48d70e6d65d4ec4440"}, + {file = "numpy-2.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa3017c40d513ccac9621a2364f939d39e550c542eb2a894b4c8da92b38896ab"}, + {file = "numpy-2.2.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:61048b4a49b1c93fe13426e04e04fdf5a03f456616f6e98c7576144677598675"}, + {file = "numpy-2.2.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:7671dc19c7019103ca44e8d94917eba8534c76133523ca8406822efdd19c9308"}, + {file = "numpy-2.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4250888bcb96617e00bfa28ac24850a83c9f3a16db471eca2ee1f1714df0f957"}, + {file = "numpy-2.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7746f235c47abc72b102d3bce9977714c2444bdfaea7888d241b4c4bb6a78bf"}, + {file = "numpy-2.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:059e6a747ae84fce488c3ee397cee7e5f905fd1bda5fb18c66bc41807ff119b2"}, + {file = "numpy-2.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f62aa6ee4eb43b024b0e5a01cf65a0bb078ef8c395e8713c6e8a12a697144528"}, + {file = "numpy-2.2.1-cp310-cp310-win32.whl", hash = "sha256:48fd472630715e1c1c89bf1feab55c29098cb403cc184b4859f9c86d4fcb6a95"}, + {file = "numpy-2.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:b541032178a718c165a49638d28272b771053f628382d5e9d1c93df23ff58dbf"}, + {file = "numpy-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40f9e544c1c56ba8f1cf7686a8c9b5bb249e665d40d626a23899ba6d5d9e1484"}, + {file = "numpy-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9b57eaa3b0cd8db52049ed0330747b0364e899e8a606a624813452b8203d5f7"}, + {file = "numpy-2.2.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bc8a37ad5b22c08e2dbd27df2b3ef7e5c0864235805b1e718a235bcb200cf1cb"}, + {file = "numpy-2.2.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:9036d6365d13b6cbe8f27a0eaf73ddcc070cae584e5ff94bb45e3e9d729feab5"}, + {file = "numpy-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51faf345324db860b515d3f364eaa93d0e0551a88d6218a7d61286554d190d73"}, + {file = "numpy-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38efc1e56b73cc9b182fe55e56e63b044dd26a72128fd2fbd502f75555d92591"}, + {file = "numpy-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:31b89fa67a8042e96715c68e071a1200c4e172f93b0fbe01a14c0ff3ff820fc8"}, + {file = "numpy-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4c86e2a209199ead7ee0af65e1d9992d1dce7e1f63c4b9a616500f93820658d0"}, + {file = "numpy-2.2.1-cp311-cp311-win32.whl", hash = "sha256:b34d87e8a3090ea626003f87f9392b3929a7bbf4104a05b6667348b6bd4bf1cd"}, + {file = "numpy-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:360137f8fb1b753c5cde3ac388597ad680eccbbbb3865ab65efea062c4a1fd16"}, + {file = "numpy-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:694f9e921a0c8f252980e85bce61ebbd07ed2b7d4fa72d0e4246f2f8aa6642ab"}, + {file = "numpy-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3683a8d166f2692664262fd4900f207791d005fb088d7fdb973cc8d663626faa"}, + {file = "numpy-2.2.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:780077d95eafc2ccc3ced969db22377b3864e5b9a0ea5eb347cc93b3ea900315"}, + {file = "numpy-2.2.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:55ba24ebe208344aa7a00e4482f65742969a039c2acfcb910bc6fcd776eb4355"}, + {file = "numpy-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b1d07b53b78bf84a96898c1bc139ad7f10fda7423f5fd158fd0f47ec5e01ac7"}, + {file = "numpy-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5062dc1a4e32a10dc2b8b13cedd58988261416e811c1dc4dbdea4f57eea61b0d"}, + {file = "numpy-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fce4f615f8ca31b2e61aa0eb5865a21e14f5629515c9151850aa936c02a1ee51"}, + {file = "numpy-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:67d4cda6fa6ffa073b08c8372aa5fa767ceb10c9a0587c707505a6d426f4e046"}, + {file = "numpy-2.2.1-cp312-cp312-win32.whl", hash = "sha256:32cb94448be47c500d2c7a95f93e2f21a01f1fd05dd2beea1ccd049bb6001cd2"}, + {file = "numpy-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:ba5511d8f31c033a5fcbda22dd5c813630af98c70b2661f2d2c654ae3cdfcfc8"}, + {file = "numpy-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f1d09e520217618e76396377c81fba6f290d5f926f50c35f3a5f72b01a0da780"}, + {file = "numpy-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3ecc47cd7f6ea0336042be87d9e7da378e5c7e9b3c8ad0f7c966f714fc10d821"}, + {file = "numpy-2.2.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f419290bc8968a46c4933158c91a0012b7a99bb2e465d5ef5293879742f8797e"}, + {file = "numpy-2.2.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5b6c390bfaef8c45a260554888966618328d30e72173697e5cabe6b285fb2348"}, + {file = "numpy-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:526fc406ab991a340744aad7e25251dd47a6720a685fa3331e5c59fef5282a59"}, + {file = "numpy-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74e6fdeb9a265624ec3a3918430205dff1df7e95a230779746a6af78bc615af"}, + {file = "numpy-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:53c09385ff0b72ba79d8715683c1168c12e0b6e84fb0372e97553d1ea91efe51"}, + {file = "numpy-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f3eac17d9ec51be534685ba877b6ab5edc3ab7ec95c8f163e5d7b39859524716"}, + {file = "numpy-2.2.1-cp313-cp313-win32.whl", hash = "sha256:9ad014faa93dbb52c80d8f4d3dcf855865c876c9660cb9bd7553843dd03a4b1e"}, + {file = "numpy-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:164a829b6aacf79ca47ba4814b130c4020b202522a93d7bff2202bfb33b61c60"}, + {file = "numpy-2.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4dfda918a13cc4f81e9118dea249e192ab167a0bb1966272d5503e39234d694e"}, + {file = "numpy-2.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:733585f9f4b62e9b3528dd1070ec4f52b8acf64215b60a845fa13ebd73cd0712"}, + {file = "numpy-2.2.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:89b16a18e7bba224ce5114db863e7029803c179979e1af6ad6a6b11f70545008"}, + {file = "numpy-2.2.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:676f4eebf6b2d430300f1f4f4c2461685f8269f94c89698d832cdf9277f30b84"}, + {file = "numpy-2.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27f5cdf9f493b35f7e41e8368e7d7b4bbafaf9660cba53fb21d2cd174ec09631"}, + {file = "numpy-2.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1ad395cf254c4fbb5b2132fee391f361a6e8c1adbd28f2cd8e79308a615fe9d"}, + {file = "numpy-2.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:08ef779aed40dbc52729d6ffe7dd51df85796a702afbf68a4f4e41fafdc8bda5"}, + {file = "numpy-2.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:26c9c4382b19fcfbbed3238a14abf7ff223890ea1936b8890f058e7ba35e8d71"}, + {file = "numpy-2.2.1-cp313-cp313t-win32.whl", hash = "sha256:93cf4e045bae74c90ca833cba583c14b62cb4ba2cba0abd2b141ab52548247e2"}, + {file = "numpy-2.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bff7d8ec20f5f42607599f9994770fa65d76edca264a87b5e4ea5629bce12268"}, + {file = "numpy-2.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7ba9cc93a91d86365a5d270dee221fdc04fb68d7478e6bf6af650de78a8339e3"}, + {file = "numpy-2.2.1-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:3d03883435a19794e41f147612a77a8f56d4e52822337844fff3d4040a142964"}, + {file = "numpy-2.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4511d9e6071452b944207c8ce46ad2f897307910b402ea5fa975da32e0102800"}, + {file = "numpy-2.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5c5cc0cbabe9452038ed984d05ac87910f89370b9242371bd9079cb4af61811e"}, + {file = "numpy-2.2.1.tar.gz", hash = "sha256:45681fd7128c8ad1c379f0ca0776a8b0c6583d2f69889ddac01559dfe4390918"}, ] [[package]] @@ -1879,18 +1875,18 @@ files = [ [[package]] name = "pydantic" -version = "2.10.3" +version = "2.10.4" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.10.3-py3-none-any.whl", hash = "sha256:be04d85bbc7b65651c5f8e6b9976ed9c6f41782a55524cef079a34a0bb82144d"}, - {file = "pydantic-2.10.3.tar.gz", hash = "sha256:cb5ac360ce894ceacd69c403187900a02c4b20b693a9dd1d643e1effab9eadf9"}, + {file = "pydantic-2.10.4-py3-none-any.whl", hash = "sha256:597e135ea68be3a37552fb524bc7d0d66dcf93d395acd93a00682f1efcb8ee3d"}, + {file = "pydantic-2.10.4.tar.gz", hash = "sha256:82f12e9723da6de4fe2ba888b5971157b3be7ad914267dea8f05f82b28254f06"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.27.1" +pydantic-core = "2.27.2" typing-extensions = ">=4.12.2" [package.extras] @@ -1899,111 +1895,111 @@ timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.27.1" +version = "2.27.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.27.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:71a5e35c75c021aaf400ac048dacc855f000bdfed91614b4a726f7432f1f3d6a"}, - {file = "pydantic_core-2.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f82d068a2d6ecfc6e054726080af69a6764a10015467d7d7b9f66d6ed5afa23b"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:121ceb0e822f79163dd4699e4c54f5ad38b157084d97b34de8b232bcaad70278"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4603137322c18eaf2e06a4495f426aa8d8388940f3c457e7548145011bb68e05"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a33cd6ad9017bbeaa9ed78a2e0752c5e250eafb9534f308e7a5f7849b0b1bfb4"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15cc53a3179ba0fcefe1e3ae50beb2784dede4003ad2dfd24f81bba4b23a454f"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45d9c5eb9273aa50999ad6adc6be5e0ecea7e09dbd0d31bd0c65a55a2592ca08"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8bf7b66ce12a2ac52d16f776b31d16d91033150266eb796967a7e4621707e4f6"}, - {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:655d7dd86f26cb15ce8a431036f66ce0318648f8853d709b4167786ec2fa4807"}, - {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:5556470f1a2157031e676f776c2bc20acd34c1990ca5f7e56f1ebf938b9ab57c"}, - {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f69ed81ab24d5a3bd93861c8c4436f54afdf8e8cc421562b0c7504cf3be58206"}, - {file = "pydantic_core-2.27.1-cp310-none-win32.whl", hash = "sha256:f5a823165e6d04ccea61a9f0576f345f8ce40ed533013580e087bd4d7442b52c"}, - {file = "pydantic_core-2.27.1-cp310-none-win_amd64.whl", hash = "sha256:57866a76e0b3823e0b56692d1a0bf722bffb324839bb5b7226a7dbd6c9a40b17"}, - {file = "pydantic_core-2.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac3b20653bdbe160febbea8aa6c079d3df19310d50ac314911ed8cc4eb7f8cb8"}, - {file = "pydantic_core-2.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a5a8e19d7c707c4cadb8c18f5f60c843052ae83c20fa7d44f41594c644a1d330"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f7059ca8d64fea7f238994c97d91f75965216bcbe5f695bb44f354893f11d52"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bed0f8a0eeea9fb72937ba118f9db0cb7e90773462af7962d382445f3005e5a4"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3cb37038123447cf0f3ea4c74751f6a9d7afef0eb71aa07bf5f652b5e6a132c"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84286494f6c5d05243456e04223d5a9417d7f443c3b76065e75001beb26f88de"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acc07b2cfc5b835444b44a9956846b578d27beeacd4b52e45489e93276241025"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fefee876e07a6e9aad7a8c8c9f85b0cdbe7df52b8a9552307b09050f7512c7e"}, - {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:258c57abf1188926c774a4c94dd29237e77eda19462e5bb901d88adcab6af919"}, - {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:35c14ac45fcfdf7167ca76cc80b2001205a8d5d16d80524e13508371fb8cdd9c"}, - {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d1b26e1dff225c31897696cab7d4f0a315d4c0d9e8666dbffdb28216f3b17fdc"}, - {file = "pydantic_core-2.27.1-cp311-none-win32.whl", hash = "sha256:2cdf7d86886bc6982354862204ae3b2f7f96f21a3eb0ba5ca0ac42c7b38598b9"}, - {file = "pydantic_core-2.27.1-cp311-none-win_amd64.whl", hash = "sha256:3af385b0cee8df3746c3f406f38bcbfdc9041b5c2d5ce3e5fc6637256e60bbc5"}, - {file = "pydantic_core-2.27.1-cp311-none-win_arm64.whl", hash = "sha256:81f2ec23ddc1b476ff96563f2e8d723830b06dceae348ce02914a37cb4e74b89"}, - {file = "pydantic_core-2.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9cbd94fc661d2bab2bc702cddd2d3370bbdcc4cd0f8f57488a81bcce90c7a54f"}, - {file = "pydantic_core-2.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f8c4718cd44ec1580e180cb739713ecda2bdee1341084c1467802a417fe0f02"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15aae984e46de8d376df515f00450d1522077254ef6b7ce189b38ecee7c9677c"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ba5e3963344ff25fc8c40da90f44b0afca8cfd89d12964feb79ac1411a260ac"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:992cea5f4f3b29d6b4f7f1726ed8ee46c8331c6b4eed6db5b40134c6fe1768bb"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0325336f348dbee6550d129b1627cb8f5351a9dc91aad141ffb96d4937bd9529"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7597c07fbd11515f654d6ece3d0e4e5093edc30a436c63142d9a4b8e22f19c35"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3bbd5d8cc692616d5ef6fbbbd50dbec142c7e6ad9beb66b78a96e9c16729b089"}, - {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:dc61505e73298a84a2f317255fcc72b710b72980f3a1f670447a21efc88f8381"}, - {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:e1f735dc43da318cad19b4173dd1ffce1d84aafd6c9b782b3abc04a0d5a6f5bb"}, - {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f4e5658dbffe8843a0f12366a4c2d1c316dbe09bb4dfbdc9d2d9cd6031de8aae"}, - {file = "pydantic_core-2.27.1-cp312-none-win32.whl", hash = "sha256:672ebbe820bb37988c4d136eca2652ee114992d5d41c7e4858cdd90ea94ffe5c"}, - {file = "pydantic_core-2.27.1-cp312-none-win_amd64.whl", hash = "sha256:66ff044fd0bb1768688aecbe28b6190f6e799349221fb0de0e6f4048eca14c16"}, - {file = "pydantic_core-2.27.1-cp312-none-win_arm64.whl", hash = "sha256:9a3b0793b1bbfd4146304e23d90045f2a9b5fd5823aa682665fbdaf2a6c28f3e"}, - {file = "pydantic_core-2.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f216dbce0e60e4d03e0c4353c7023b202d95cbaeff12e5fd2e82ea0a66905073"}, - {file = "pydantic_core-2.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a2e02889071850bbfd36b56fd6bc98945e23670773bc7a76657e90e6b6603c08"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b0e23f119b2b456d07ca91b307ae167cc3f6c846a7b169fca5326e32fdc6cf"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:764be71193f87d460a03f1f7385a82e226639732214b402f9aa61f0d025f0737"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c00666a3bd2f84920a4e94434f5974d7bbc57e461318d6bb34ce9cdbbc1f6b2"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ccaa88b24eebc0f849ce0a4d09e8a408ec5a94afff395eb69baf868f5183107"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c65af9088ac534313e1963443d0ec360bb2b9cba6c2909478d22c2e363d98a51"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:206b5cf6f0c513baffaeae7bd817717140770c74528f3e4c3e1cec7871ddd61a"}, - {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:062f60e512fc7fff8b8a9d680ff0ddaaef0193dba9fa83e679c0c5f5fbd018bc"}, - {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:a0697803ed7d4af5e4c1adf1670af078f8fcab7a86350e969f454daf598c4960"}, - {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:58ca98a950171f3151c603aeea9303ef6c235f692fe555e883591103da709b23"}, - {file = "pydantic_core-2.27.1-cp313-none-win32.whl", hash = "sha256:8065914ff79f7eab1599bd80406681f0ad08f8e47c880f17b416c9f8f7a26d05"}, - {file = "pydantic_core-2.27.1-cp313-none-win_amd64.whl", hash = "sha256:ba630d5e3db74c79300d9a5bdaaf6200172b107f263c98a0539eeecb857b2337"}, - {file = "pydantic_core-2.27.1-cp313-none-win_arm64.whl", hash = "sha256:45cf8588c066860b623cd11c4ba687f8d7175d5f7ef65f7129df8a394c502de5"}, - {file = "pydantic_core-2.27.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:5897bec80a09b4084aee23f9b73a9477a46c3304ad1d2d07acca19723fb1de62"}, - {file = "pydantic_core-2.27.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d0165ab2914379bd56908c02294ed8405c252250668ebcb438a55494c69f44ab"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b9af86e1d8e4cfc82c2022bfaa6f459381a50b94a29e95dcdda8442d6d83864"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f6c8a66741c5f5447e047ab0ba7a1c61d1e95580d64bce852e3df1f895c4067"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a42d6a8156ff78981f8aa56eb6394114e0dedb217cf8b729f438f643608cbcd"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64c65f40b4cd8b0e049a8edde07e38b476da7e3aaebe63287c899d2cff253fa5"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdcf339322a3fae5cbd504edcefddd5a50d9ee00d968696846f089b4432cf78"}, - {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bf99c8404f008750c846cb4ac4667b798a9f7de673ff719d705d9b2d6de49c5f"}, - {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8f1edcea27918d748c7e5e4d917297b2a0ab80cad10f86631e488b7cddf76a36"}, - {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:159cac0a3d096f79ab6a44d77a961917219707e2a130739c64d4dd46281f5c2a"}, - {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:029d9757eb621cc6e1848fa0b0310310de7301057f623985698ed7ebb014391b"}, - {file = "pydantic_core-2.27.1-cp38-none-win32.whl", hash = "sha256:a28af0695a45f7060e6f9b7092558a928a28553366519f64083c63a44f70e618"}, - {file = "pydantic_core-2.27.1-cp38-none-win_amd64.whl", hash = "sha256:2d4567c850905d5eaaed2f7a404e61012a51caf288292e016360aa2b96ff38d4"}, - {file = "pydantic_core-2.27.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e9386266798d64eeb19dd3677051f5705bf873e98e15897ddb7d76f477131967"}, - {file = "pydantic_core-2.27.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4228b5b646caa73f119b1ae756216b59cc6e2267201c27d3912b592c5e323b60"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3dfe500de26c52abe0477dde16192ac39c98f05bf2d80e76102d394bd13854"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aee66be87825cdf72ac64cb03ad4c15ffef4143dbf5c113f64a5ff4f81477bf9"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b748c44bb9f53031c8cbc99a8a061bc181c1000c60a30f55393b6e9c45cc5bd"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ca038c7f6a0afd0b2448941b6ef9d5e1949e999f9e5517692eb6da58e9d44be"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e0bd57539da59a3e4671b90a502da9a28c72322a4f17866ba3ac63a82c4498e"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ac6c2c45c847bbf8f91930d88716a0fb924b51e0c6dad329b793d670ec5db792"}, - {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b94d4ba43739bbe8b0ce4262bcc3b7b9f31459ad120fb595627eaeb7f9b9ca01"}, - {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:00e6424f4b26fe82d44577b4c842d7df97c20be6439e8e685d0d715feceb9fb9"}, - {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:38de0a70160dd97540335b7ad3a74571b24f1dc3ed33f815f0880682e6880131"}, - {file = "pydantic_core-2.27.1-cp39-none-win32.whl", hash = "sha256:7ccebf51efc61634f6c2344da73e366c75e735960b5654b63d7e6f69a5885fa3"}, - {file = "pydantic_core-2.27.1-cp39-none-win_amd64.whl", hash = "sha256:a57847b090d7892f123726202b7daa20df6694cbd583b67a592e856bff603d6c"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3fa80ac2bd5856580e242dbc202db873c60a01b20309c8319b5c5986fbe53ce6"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d950caa237bb1954f1b8c9227b5065ba6875ac9771bb8ec790d956a699b78676"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e4216e64d203e39c62df627aa882f02a2438d18a5f21d7f721621f7a5d3611d"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02a3d637bd387c41d46b002f0e49c52642281edacd2740e5a42f7017feea3f2c"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:161c27ccce13b6b0c8689418da3885d3220ed2eae2ea5e9b2f7f3d48f1d52c27"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:19910754e4cc9c63bc1c7f6d73aa1cfee82f42007e407c0f413695c2f7ed777f"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:e173486019cc283dc9778315fa29a363579372fe67045e971e89b6365cc035ed"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:af52d26579b308921b73b956153066481f064875140ccd1dfd4e77db89dbb12f"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:981fb88516bd1ae8b0cbbd2034678a39dedc98752f264ac9bc5839d3923fa04c"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5fde892e6c697ce3e30c61b239330fc5d569a71fefd4eb6512fc6caec9dd9e2f"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:816f5aa087094099fff7edabb5e01cc370eb21aa1a1d44fe2d2aefdfb5599b31"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c10c309e18e443ddb108f0ef64e8729363adbfd92d6d57beec680f6261556f3"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98476c98b02c8e9b2eec76ac4156fd006628b1b2d0ef27e548ffa978393fd154"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c3027001c28434e7ca5a6e1e527487051136aa81803ac812be51802150d880dd"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:7699b1df36a48169cdebda7ab5a2bac265204003f153b4bd17276153d997670a"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1c39b07d90be6b48968ddc8c19e7585052088fd7ec8d568bb31ff64c70ae3c97"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:46ccfe3032b3915586e469d4972973f893c0a2bb65669194a5bdea9bacc088c2"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:62ba45e21cf6571d7f716d903b5b7b6d2617e2d5d67c0923dc47b9d41369f840"}, - {file = "pydantic_core-2.27.1.tar.gz", hash = "sha256:62a763352879b84aa31058fc931884055fd75089cccbd9d58bb6afd01141b235"}, + {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, + {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"}, + {file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"}, + {file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"}, + {file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"}, + {file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"}, + {file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"}, + {file = "pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b"}, + {file = "pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"}, + {file = "pydantic_core-2.27.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506"}, + {file = "pydantic_core-2.27.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da"}, + {file = "pydantic_core-2.27.2-cp38-cp38-win32.whl", hash = "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b"}, + {file = "pydantic_core-2.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad"}, + {file = "pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993"}, + {file = "pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96"}, + {file = "pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e"}, + {file = "pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, + {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, ] [package.dependencies] @@ -2025,13 +2021,13 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pymdown-extensions" -version = "10.12" +version = "10.13" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.12-py3-none-any.whl", hash = "sha256:49f81412242d3527b8b4967b990df395c89563043bc51a3d2d7d500e52123b77"}, - {file = "pymdown_extensions-10.12.tar.gz", hash = "sha256:b0ee1e0b2bef1071a47891ab17003bfe5bf824a398e13f49f8ed653b699369a7"}, + {file = "pymdown_extensions-10.13-py3-none-any.whl", hash = "sha256:80bc33d715eec68e683e04298946d47d78c7739e79d808203df278ee8ef89428"}, + {file = "pymdown_extensions-10.13.tar.gz", hash = "sha256:e0b351494dc0d8d14a1f52b39b1499a00ef1566b4ba23dc74f1eba75c736f5dd"}, ] [package.dependencies] @@ -2671,29 +2667,29 @@ files = [ [[package]] name = "ruff" -version = "0.8.3" +version = "0.8.5" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.8.3-py3-none-linux_armv6l.whl", hash = "sha256:8d5d273ffffff0acd3db5bf626d4b131aa5a5ada1276126231c4174543ce20d6"}, - {file = "ruff-0.8.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e4d66a21de39f15c9757d00c50c8cdd20ac84f55684ca56def7891a025d7e939"}, - {file = "ruff-0.8.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c356e770811858bd20832af696ff6c7e884701115094f427b64b25093d6d932d"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c0a60a825e3e177116c84009d5ebaa90cf40dfab56e1358d1df4e29a9a14b13"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:75fb782f4db39501210ac093c79c3de581d306624575eddd7e4e13747e61ba18"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f26bc76a133ecb09a38b7868737eded6941b70a6d34ef53a4027e83913b6502"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:01b14b2f72a37390c1b13477c1c02d53184f728be2f3ffc3ace5b44e9e87b90d"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53babd6e63e31f4e96ec95ea0d962298f9f0d9cc5990a1bbb023a6baf2503a82"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ae441ce4cf925b7f363d33cd6570c51435972d697e3e58928973994e56e1452"}, - {file = "ruff-0.8.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7c65bc0cadce32255e93c57d57ecc2cca23149edd52714c0c5d6fa11ec328cd"}, - {file = "ruff-0.8.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5be450bb18f23f0edc5a4e5585c17a56ba88920d598f04a06bd9fd76d324cb20"}, - {file = "ruff-0.8.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8faeae3827eaa77f5721f09b9472a18c749139c891dbc17f45e72d8f2ca1f8fc"}, - {file = "ruff-0.8.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:db503486e1cf074b9808403991663e4277f5c664d3fe237ee0d994d1305bb060"}, - {file = "ruff-0.8.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6567be9fb62fbd7a099209257fef4ad2c3153b60579818b31a23c886ed4147ea"}, - {file = "ruff-0.8.3-py3-none-win32.whl", hash = "sha256:19048f2f878f3ee4583fc6cb23fb636e48c2635e30fb2022b3a1cd293402f964"}, - {file = "ruff-0.8.3-py3-none-win_amd64.whl", hash = "sha256:f7df94f57d7418fa7c3ffb650757e0c2b96cf2501a0b192c18e4fb5571dfada9"}, - {file = "ruff-0.8.3-py3-none-win_arm64.whl", hash = "sha256:fe2756edf68ea79707c8d68b78ca9a58ed9af22e430430491ee03e718b5e4936"}, - {file = "ruff-0.8.3.tar.gz", hash = "sha256:5e7558304353b84279042fc584a4f4cb8a07ae79b2bf3da1a7551d960b5626d3"}, + {file = "ruff-0.8.5-py3-none-linux_armv6l.whl", hash = "sha256:5ad11a5e3868a73ca1fa4727fe7e33735ea78b416313f4368c504dbeb69c0f88"}, + {file = "ruff-0.8.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f69ab37771ea7e0715fead8624ec42996d101269a96e31f4d31be6fc33aa19b7"}, + {file = "ruff-0.8.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b5462d7804558ccff9c08fe8cbf6c14b7efe67404316696a2dde48297b1925bb"}, + {file = "ruff-0.8.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d56de7220a35607f9fe59f8a6d018e14504f7b71d784d980835e20fc0611cd50"}, + {file = "ruff-0.8.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9d99cf80b0429cbebf31cbbf6f24f05a29706f0437c40413d950e67e2d4faca4"}, + {file = "ruff-0.8.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b75ac29715ac60d554a049dbb0ef3b55259076181c3369d79466cb130eb5afd"}, + {file = "ruff-0.8.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c9d526a62c9eda211b38463528768fd0ada25dad524cb33c0e99fcff1c67b5dc"}, + {file = "ruff-0.8.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:587c5e95007612c26509f30acc506c874dab4c4abbacd0357400bd1aa799931b"}, + {file = "ruff-0.8.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:622b82bf3429ff0e346835ec213aec0a04d9730480cbffbb6ad9372014e31bbd"}, + {file = "ruff-0.8.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f99be814d77a5dac8a8957104bdd8c359e85c86b0ee0e38dca447cb1095f70fb"}, + {file = "ruff-0.8.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c01c048f9c3385e0fd7822ad0fd519afb282af9cf1778f3580e540629df89725"}, + {file = "ruff-0.8.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7512e8cb038db7f5db6aae0e24735ff9ea03bb0ed6ae2ce534e9baa23c1dc9ea"}, + {file = "ruff-0.8.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:762f113232acd5b768d6b875d16aad6b00082add40ec91c927f0673a8ec4ede8"}, + {file = "ruff-0.8.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:03a90200c5dfff49e4c967b405f27fdfa81594cbb7c5ff5609e42d7fe9680da5"}, + {file = "ruff-0.8.5-py3-none-win32.whl", hash = "sha256:8710ffd57bdaa6690cbf6ecff19884b8629ec2a2a2a2f783aa94b1cc795139ed"}, + {file = "ruff-0.8.5-py3-none-win_amd64.whl", hash = "sha256:4020d8bf8d3a32325c77af452a9976a9ad6455773bcb94991cf15bd66b347e47"}, + {file = "ruff-0.8.5-py3-none-win_arm64.whl", hash = "sha256:134ae019ef13e1b060ab7136e7828a6d83ea727ba123381307eb37c6bd5e01cb"}, + {file = "ruff-0.8.5.tar.gz", hash = "sha256:1098d36f69831f7ff2a1da3e6407d5fbd6dfa2559e4f74ff2d260c5588900317"}, ] [[package]] @@ -2739,13 +2735,13 @@ syntax = ["tree-sitter (>=0.20.1,<0.21.0)", "tree-sitter-languages (==1.10.2)"] [[package]] name = "tinycss2" -version = "1.4.0" +version = "1.2.1" description = "A tiny CSS parser" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" files = [ - {file = "tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289"}, - {file = "tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7"}, + {file = "tinycss2-1.2.1-py3-none-any.whl", hash = "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847"}, + {file = "tinycss2-1.2.1.tar.gz", hash = "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627"}, ] [package.dependencies] @@ -2753,7 +2749,7 @@ webencodings = ">=0.4" [package.extras] doc = ["sphinx", "sphinx_rtd_theme"] -test = ["pytest", "ruff"] +test = ["flake8", "isort", "pytest"] [[package]] name = "tomli" @@ -2897,13 +2893,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.28.0" +version = "20.28.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" files = [ - {file = "virtualenv-20.28.0-py3-none-any.whl", hash = "sha256:23eae1b4516ecd610481eda647f3a7c09aea295055337331bb4e6892ecce47b0"}, - {file = "virtualenv-20.28.0.tar.gz", hash = "sha256:2c9c3262bb8e7b87ea801d715fae4495e6032450c71d2309be9550e7364049aa"}, + {file = "virtualenv-20.28.1-py3-none-any.whl", hash = "sha256:412773c85d4dab0409b83ec36f7a6499e72eaf08c80e81e9576bca61831c71cb"}, + {file = "virtualenv-20.28.1.tar.gz", hash = "sha256:5d34ab240fdb5d21549b76f9e8ff3af28252f5499fb6d6f031adac4e5a8c5329"}, ] [package.dependencies] diff --git a/pyproject.toml b/pyproject.toml index 4510de3..d03bb5d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -140,6 +140,8 @@ exclude = [ "tests/", "examples/email_str.py", "examples/bounded_wrapped_ints.py", + "examples/newtype_enums.py", + "examples/mutable.py", ] [tool.ruff.format] @@ -368,4 +370,5 @@ exclude = [ ".env", "build.py", "docs/*.py", + "examples/*.py", ] diff --git a/requirements-docs.txt b/requirements-docs.txt index f2a17a3..5161661 100644 --- a/requirements-docs.txt +++ b/requirements-docs.txt @@ -4,118 +4,105 @@ astunparse==1.6.3 ; python_version >= "3.8" and python_version < "3.9" \ babel==2.16.0 ; python_version >= "3.8" and python_version < "4.0" \ --hash=sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b \ --hash=sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316 -certifi==2024.8.30 ; python_version >= "3.8" and python_version < "4.0" \ - --hash=sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8 \ - --hash=sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9 -charset-normalizer==3.4.0 ; python_version >= "3.8" and python_version < "4.0" \ - --hash=sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621 \ - --hash=sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6 \ - --hash=sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8 \ - --hash=sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912 \ - --hash=sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c \ - --hash=sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b \ - --hash=sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d \ - --hash=sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d \ - --hash=sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95 \ - --hash=sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e \ - --hash=sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565 \ - --hash=sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64 \ - --hash=sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab \ - --hash=sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be \ - --hash=sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e \ - --hash=sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907 \ - --hash=sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0 \ - --hash=sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2 \ - --hash=sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62 \ - --hash=sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62 \ - --hash=sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23 \ - --hash=sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc \ - --hash=sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284 \ - --hash=sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca \ - --hash=sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455 \ - --hash=sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858 \ - --hash=sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b \ - --hash=sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594 \ - --hash=sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc \ - --hash=sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db \ - --hash=sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b \ - --hash=sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea \ - --hash=sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6 \ - --hash=sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920 \ - --hash=sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749 \ - --hash=sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7 \ - --hash=sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd \ - --hash=sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99 \ - --hash=sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242 \ - --hash=sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee \ - --hash=sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129 \ - --hash=sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2 \ - --hash=sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51 \ - --hash=sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee \ - --hash=sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8 \ - --hash=sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b \ - --hash=sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613 \ - --hash=sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742 \ - --hash=sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe \ - --hash=sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3 \ - --hash=sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5 \ - --hash=sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631 \ - --hash=sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7 \ - --hash=sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15 \ - --hash=sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c \ - --hash=sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea \ - --hash=sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417 \ - --hash=sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250 \ - --hash=sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88 \ - --hash=sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca \ - --hash=sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa \ - --hash=sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99 \ - --hash=sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149 \ - --hash=sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41 \ - --hash=sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574 \ - --hash=sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0 \ - --hash=sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f \ - --hash=sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d \ - --hash=sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654 \ - --hash=sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3 \ - --hash=sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19 \ - --hash=sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90 \ - --hash=sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578 \ - --hash=sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9 \ - --hash=sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1 \ - --hash=sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51 \ - --hash=sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719 \ - --hash=sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236 \ - --hash=sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a \ - --hash=sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c \ - --hash=sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade \ - --hash=sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944 \ - --hash=sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc \ - --hash=sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6 \ - --hash=sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6 \ - --hash=sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27 \ - --hash=sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6 \ - --hash=sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2 \ - --hash=sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12 \ - --hash=sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf \ - --hash=sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114 \ - --hash=sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7 \ - --hash=sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf \ - --hash=sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d \ - --hash=sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b \ - --hash=sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed \ - --hash=sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03 \ - --hash=sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4 \ - --hash=sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67 \ - --hash=sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365 \ - --hash=sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a \ - --hash=sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748 \ - --hash=sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b \ - --hash=sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079 \ - --hash=sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482 -click==8.1.7 ; python_version >= "3.8" and python_version < "4.0" \ - --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ - --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de +certifi==2024.12.14 ; python_version >= "3.8" and python_version < "4.0" \ + --hash=sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56 \ + --hash=sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db +charset-normalizer==3.4.1 ; python_version >= "3.8" and python_version < "4.0" \ + --hash=sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537 \ + --hash=sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa \ + --hash=sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a \ + --hash=sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294 \ + --hash=sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b \ + --hash=sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd \ + --hash=sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601 \ + --hash=sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd \ + --hash=sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4 \ + --hash=sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d \ + --hash=sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2 \ + --hash=sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313 \ + --hash=sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd \ + --hash=sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa \ + --hash=sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8 \ + --hash=sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1 \ + --hash=sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2 \ + --hash=sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496 \ + --hash=sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d \ + --hash=sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b \ + --hash=sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e \ + --hash=sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a \ + --hash=sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4 \ + --hash=sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca \ + --hash=sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78 \ + --hash=sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408 \ + --hash=sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5 \ + --hash=sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3 \ + --hash=sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f \ + --hash=sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a \ + --hash=sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765 \ + --hash=sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6 \ + --hash=sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146 \ + --hash=sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6 \ + --hash=sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9 \ + --hash=sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd \ + --hash=sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c \ + --hash=sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f \ + --hash=sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545 \ + --hash=sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176 \ + --hash=sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770 \ + --hash=sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824 \ + --hash=sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f \ + --hash=sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf \ + --hash=sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487 \ + --hash=sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d \ + --hash=sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd \ + --hash=sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b \ + --hash=sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534 \ + --hash=sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f \ + --hash=sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b \ + --hash=sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9 \ + --hash=sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd \ + --hash=sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125 \ + --hash=sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9 \ + --hash=sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de \ + --hash=sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11 \ + --hash=sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d \ + --hash=sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35 \ + --hash=sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f \ + --hash=sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda \ + --hash=sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7 \ + --hash=sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a \ + --hash=sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971 \ + --hash=sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8 \ + --hash=sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41 \ + --hash=sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d \ + --hash=sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f \ + --hash=sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757 \ + --hash=sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a \ + --hash=sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886 \ + --hash=sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77 \ + --hash=sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76 \ + --hash=sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247 \ + --hash=sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85 \ + --hash=sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb \ + --hash=sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7 \ + --hash=sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e \ + --hash=sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6 \ + --hash=sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037 \ + --hash=sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1 \ + --hash=sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e \ + --hash=sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807 \ + --hash=sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407 \ + --hash=sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c \ + --hash=sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12 \ + --hash=sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3 \ + --hash=sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089 \ + --hash=sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd \ + --hash=sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e \ + --hash=sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00 \ + --hash=sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616 +click==8.1.8 ; python_version >= "3.8" and python_version < "4.0" \ + --hash=sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2 \ + --hash=sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a colorama==0.4.6 ; python_version >= "3.8" and python_version < "4.0" \ --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 @@ -131,9 +118,9 @@ idna==3.10 ; python_version >= "3.8" and python_version < "4.0" \ importlib-metadata==8.5.0 ; python_version >= "3.8" and python_version < "3.10" \ --hash=sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b \ --hash=sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7 -jinja2==3.1.4 ; python_version >= "3.8" and python_version < "4.0" \ - --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ - --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d +jinja2==3.1.5 ; python_version >= "3.8" and python_version < "4.0" \ + --hash=sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb \ + --hash=sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb markdown==3.7 ; python_version >= "3.8" and python_version < "4.0" \ --hash=sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2 \ --hash=sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803 @@ -210,9 +197,9 @@ mkdocs-get-deps==0.2.0 ; python_version >= "3.8" and python_version < "4.0" \ mkdocs-material-extensions==1.3.1 ; python_version >= "3.8" and python_version < "4.0" \ --hash=sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443 \ --hash=sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31 -mkdocs-material==9.5.48 ; python_version >= "3.8" and python_version < "4.0" \ - --hash=sha256:a582531e8b34f4c7ed38c29d5c44763053832cf2a32f7409567e0c74749a47db \ - --hash=sha256:b695c998f4b939ce748adbc0d3bff73fa886a670ece948cf27818fa115dc16f8 +mkdocs-material==9.5.49 ; python_version >= "3.8" and python_version < "4.0" \ + --hash=sha256:3671bb282b4f53a1c72e08adbe04d2481a98f85fed392530051f80ff94a9621d \ + --hash=sha256:c3c2d8176b18198435d3a3e119011922f3e11424074645c24019c2dcf08a360e mkdocs==1.6.1 ; python_version >= "3.8" and python_version < "4.0" \ --hash=sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2 \ --hash=sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e @@ -240,9 +227,9 @@ platformdirs==4.3.6 ; python_version >= "3.8" and python_version < "4.0" \ pygments==2.18.0 ; python_version >= "3.8" and python_version < "4.0" \ --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a -pymdown-extensions==10.12 ; python_version >= "3.8" and python_version < "4.0" \ - --hash=sha256:49f81412242d3527b8b4967b990df395c89563043bc51a3d2d7d500e52123b77 \ - --hash=sha256:b0ee1e0b2bef1071a47891ab17003bfe5bf824a398e13f49f8ed653b699369a7 +pymdown-extensions==10.13 ; python_version >= "3.8" and python_version < "4.0" \ + --hash=sha256:80bc33d715eec68e683e04298946d47d78c7739e79d808203df278ee8ef89428 \ + --hash=sha256:e0b351494dc0d8d14a1f52b39b1499a00ef1566b4ba23dc74f1eba75c736f5dd python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "4.0" \ --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 From 70f8ad1bc2b08f31f323320cbf6d3ef3f5162d56 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 7 Jan 2025 16:11:21 +0100 Subject: [PATCH 02/18] all tests passed --- Makefile | 5 +- newtype/extensions/newtype_meth.c | 81 +++++++++++++++++++- newtype/{extensions => }/py.typed | 0 poetry.lock | 63 +++++++-------- requirements-docs.txt | 6 +- tests/test_advanced_examples.py | 2 +- examples/mutable.py => tests/test_mutable.py | 4 + tests/test_newtype.py | 16 ++++ 8 files changed, 135 insertions(+), 42 deletions(-) rename newtype/{extensions => }/py.typed (100%) rename examples/mutable.py => tests/test_mutable.py (85%) diff --git a/Makefile b/Makefile index abbbe9d..bd981bd 100644 --- a/Makefile +++ b/Makefile @@ -89,8 +89,7 @@ build: clean # Build with debug printing enabled build-debug: clean - export __PYNT_DEBUG__="true" && make build - poetry lock && poetry export -f requirements.txt --output requirements-docs.txt --with docs + export __PYNT_DEBUG__="true" && $(POETRY) build && unset __PYNT_DEBUG__ # Install dependencies install: build @@ -102,7 +101,7 @@ test: # Run all tests with debug build test-debug: build-debug - $(PYTHON) -m pytest . $(PYTEST_FLAGS) && unset __PYNT_DEBUG__ + $(PYTHON) -m pytest . $(PYTEST_FLAGS) # Run specific test suites test-custom: diff --git a/newtype/extensions/newtype_meth.c b/newtype/extensions/newtype_meth.c index 530dbeb..367b5db 100644 --- a/newtype/extensions/newtype_meth.c +++ b/newtype/extensions/newtype_meth.c @@ -117,12 +117,21 @@ static PyObject* NewTypeMethod_call(NewTypeMethodObject* self, return NULL; DEBUG_PRINT("`result` = %s\n", PyUnicode_AsUTF8(PyObject_Repr(result))); + // Need to save `result.__dict__` so that we can copy over the attributes + // from `self->obj` to `new_inst`, if `self->obj` is not NULL because + // constructor will remove the `__dict__` attribute from `result` + PyObject* result_dict = NULL; + if (PyObject_HasAttrString(result, "__dict__")) { + result_dict = PyObject_GetAttrString(result, "__dict__"); + } + if (self->obj == NULL && self->cls == NULL) { - // free standing function is being wrapped + Py_XDECREF(result_dict); // Clean up before goto goto done; } if (self->cls && PyObject_TypeCheck(result, self->cls)) { + Py_XDECREF(result_dict); // Clean up before goto goto done; } @@ -211,6 +220,76 @@ static PyObject* NewTypeMethod_call(NewTypeMethodObject* self, if (new_inst == NULL) { return NULL; } + + // Only proceed if we have all required objects and dictionaries + if (self->obj != NULL && result != NULL && new_inst != NULL + && result_dict != NULL) + { + PyObject* new_dict = NULL; + PyObject* new_keys = NULL; + PyObject* iter = NULL; + PyObject* key = NULL; + PyObject* value = NULL; + + // Get new_inst's dictionary + if (!PyObject_HasAttrString(new_inst, "__dict__")) { + goto cleanup; + } + new_dict = PyObject_GetAttrString(new_inst, "__dict__"); + if (new_dict == NULL) { + goto cleanup; + } + + DEBUG_PRINT("`new_dict`: %s\n", + PyUnicode_AsUTF8(PyObject_Repr(new_dict))); + DEBUG_PRINT("`result_dict`: %s\n", + PyUnicode_AsUTF8(PyObject_Repr(result_dict))); + + // Get the keys from new_dict + new_keys = PyDict_Keys(new_dict); + if (new_keys == NULL) { + goto cleanup; + } + + DEBUG_PRINT("`new_keys`: %s\n", + PyUnicode_AsUTF8(PyObject_Repr(new_keys))); + + iter = PyObject_GetIter(new_keys); + if (iter == NULL) { + goto cleanup; + } + + while ((key = PyIter_Next(iter)) != NULL) { + DEBUG_PRINT("`key`: %s\n", PyUnicode_AsUTF8(PyObject_Repr(key))); + + if (PyDict_GetItem(result_dict, key) == NULL) { + DEBUG_PRINT("Key: %s is not in result_dict\n", + PyUnicode_AsUTF8(PyObject_Repr(key))); + + if (PyObject_HasAttr(self->obj, key)) { + value = PyObject_GetAttr(self->obj, key); + if (value != NULL) { + if (PyObject_SetAttr(new_inst, key, value) >= 0) { + DEBUG_PRINT("`key` = `%s`, `value` = `%s` has been set\n", + PyUnicode_AsUTF8(PyObject_Repr(key)), + PyUnicode_AsUTF8(PyObject_Repr(value))); + } + Py_DECREF(value); + } + } + } + Py_DECREF(key); + key = NULL; // Reset for next iteration + } + + cleanup: + Py_XDECREF(key); // In case loop exited with error + Py_XDECREF(iter); + Py_XDECREF(new_keys); + Py_XDECREF(new_dict); + } + + Py_XDECREF(result_dict); DEBUG_PRINT("`new_inst`: %s\n", PyUnicode_AsUTF8(PyObject_Repr(new_inst))); return new_inst; } diff --git a/newtype/extensions/py.typed b/newtype/py.typed similarity index 100% rename from newtype/extensions/py.typed rename to newtype/py.typed diff --git a/poetry.lock b/poetry.lock index 17a15e9..8301d75 100644 --- a/poetry.lock +++ b/poetry.lock @@ -467,12 +467,12 @@ toml = ["tomli"] [[package]] name = "creosote" -version = "3.2.0" +version = "3.2.1" description = "Identify unused dependencies and avoid a bloated virtual environment." optional = false python-versions = ">=3.8" files = [ - {file = "creosote-3.2.0-py3-none-any.whl", hash = "sha256:2b0c3ddabf2bbfc97eaea858df372dff6aa73c4c992a0fac643ef5e87354e733"}, + {file = "creosote-3.2.1-py3-none-any.whl", hash = "sha256:d9e2ad0472fa7be2ab201415bd146057f8ab74b67b3afd8cdeda758547b591f3"}, ] [package.dependencies] @@ -482,12 +482,7 @@ nbconvert = ">=7.16.4,<8.0" nbformat = ">=5.10.4,<6.0" pip-requirements-parser = ">=32.0.1,<33.1" tomli = {version = ">=2.1.0,<3.0.0", markers = "python_version < \"3.11\""} - -[package.extras] -dev = ["coverage", "loguru-mypy", "mypy", "pytest", "pytest-mock", "ruff (>=0.5.0,<0.8)"] -lint = ["ruff (>=0.5.0,<0.8)"] -test = ["coverage", "pytest", "pytest-mock"] -types = ["loguru-mypy", "mypy"] +typing-extensions = ">=4.12.2" [[package]] name = "defusedxml" @@ -1827,13 +1822,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "poetry-dynamic-versioning" -version = "1.4.1" +version = "1.5.0" description = "Plugin for Poetry to enable dynamic versioning based on VCS tags" optional = false python-versions = "<4.0,>=3.7" files = [ - {file = "poetry_dynamic_versioning-1.4.1-py3-none-any.whl", hash = "sha256:44866ccbf869849d32baed4fc5fadf97f786180d8efa1719c88bf17a471bd663"}, - {file = "poetry_dynamic_versioning-1.4.1.tar.gz", hash = "sha256:21584d21ca405aa7d83d23d38372e3c11da664a8742995bdd517577e8676d0e1"}, + {file = "poetry_dynamic_versioning-1.5.0-py3-none-any.whl", hash = "sha256:d111952266a5a6963bf3a44b757ff034810e09ff1580098022964e78a097765b"}, + {file = "poetry_dynamic_versioning-1.5.0.tar.gz", hash = "sha256:68b25c26407cf0d13d51d5dc7fc45667bc041032fda42ce89401c4ce82917837"}, ] [package.dependencies] @@ -1842,7 +1837,7 @@ jinja2 = ">=2.11.1,<4" tomlkit = ">=0.4" [package.extras] -plugin = ["poetry (>=1.2.0,<2.0.0)"] +plugin = ["poetry (>=1.2.0)"] [[package]] name = "pre-commit" @@ -2007,13 +2002,13 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pygments" -version = "2.18.0" +version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" files = [ - {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, - {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, + {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, + {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, ] [package.extras] @@ -2667,29 +2662,29 @@ files = [ [[package]] name = "ruff" -version = "0.8.5" +version = "0.8.6" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.8.5-py3-none-linux_armv6l.whl", hash = "sha256:5ad11a5e3868a73ca1fa4727fe7e33735ea78b416313f4368c504dbeb69c0f88"}, - {file = "ruff-0.8.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f69ab37771ea7e0715fead8624ec42996d101269a96e31f4d31be6fc33aa19b7"}, - {file = "ruff-0.8.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b5462d7804558ccff9c08fe8cbf6c14b7efe67404316696a2dde48297b1925bb"}, - {file = "ruff-0.8.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d56de7220a35607f9fe59f8a6d018e14504f7b71d784d980835e20fc0611cd50"}, - {file = "ruff-0.8.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9d99cf80b0429cbebf31cbbf6f24f05a29706f0437c40413d950e67e2d4faca4"}, - {file = "ruff-0.8.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b75ac29715ac60d554a049dbb0ef3b55259076181c3369d79466cb130eb5afd"}, - {file = "ruff-0.8.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c9d526a62c9eda211b38463528768fd0ada25dad524cb33c0e99fcff1c67b5dc"}, - {file = "ruff-0.8.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:587c5e95007612c26509f30acc506c874dab4c4abbacd0357400bd1aa799931b"}, - {file = "ruff-0.8.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:622b82bf3429ff0e346835ec213aec0a04d9730480cbffbb6ad9372014e31bbd"}, - {file = "ruff-0.8.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f99be814d77a5dac8a8957104bdd8c359e85c86b0ee0e38dca447cb1095f70fb"}, - {file = "ruff-0.8.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c01c048f9c3385e0fd7822ad0fd519afb282af9cf1778f3580e540629df89725"}, - {file = "ruff-0.8.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7512e8cb038db7f5db6aae0e24735ff9ea03bb0ed6ae2ce534e9baa23c1dc9ea"}, - {file = "ruff-0.8.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:762f113232acd5b768d6b875d16aad6b00082add40ec91c927f0673a8ec4ede8"}, - {file = "ruff-0.8.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:03a90200c5dfff49e4c967b405f27fdfa81594cbb7c5ff5609e42d7fe9680da5"}, - {file = "ruff-0.8.5-py3-none-win32.whl", hash = "sha256:8710ffd57bdaa6690cbf6ecff19884b8629ec2a2a2a2f783aa94b1cc795139ed"}, - {file = "ruff-0.8.5-py3-none-win_amd64.whl", hash = "sha256:4020d8bf8d3a32325c77af452a9976a9ad6455773bcb94991cf15bd66b347e47"}, - {file = "ruff-0.8.5-py3-none-win_arm64.whl", hash = "sha256:134ae019ef13e1b060ab7136e7828a6d83ea727ba123381307eb37c6bd5e01cb"}, - {file = "ruff-0.8.5.tar.gz", hash = "sha256:1098d36f69831f7ff2a1da3e6407d5fbd6dfa2559e4f74ff2d260c5588900317"}, + {file = "ruff-0.8.6-py3-none-linux_armv6l.whl", hash = "sha256:defed167955d42c68b407e8f2e6f56ba52520e790aba4ca707a9c88619e580e3"}, + {file = "ruff-0.8.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:54799ca3d67ae5e0b7a7ac234baa657a9c1784b48ec954a094da7c206e0365b1"}, + {file = "ruff-0.8.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e88b8f6d901477c41559ba540beeb5a671e14cd29ebd5683903572f4b40a9807"}, + {file = "ruff-0.8.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0509e8da430228236a18a677fcdb0c1f102dd26d5520f71f79b094963322ed25"}, + {file = "ruff-0.8.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:91a7ddb221779871cf226100e677b5ea38c2d54e9e2c8ed847450ebbdf99b32d"}, + {file = "ruff-0.8.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:248b1fb3f739d01d528cc50b35ee9c4812aa58cc5935998e776bf8ed5b251e75"}, + {file = "ruff-0.8.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:bc3c083c50390cf69e7e1b5a5a7303898966be973664ec0c4a4acea82c1d4315"}, + {file = "ruff-0.8.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52d587092ab8df308635762386f45f4638badb0866355b2b86760f6d3c076188"}, + {file = "ruff-0.8.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:61323159cf21bc3897674e5adb27cd9e7700bab6b84de40d7be28c3d46dc67cf"}, + {file = "ruff-0.8.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ae4478b1471fc0c44ed52a6fb787e641a2ac58b1c1f91763bafbc2faddc5117"}, + {file = "ruff-0.8.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0c000a471d519b3e6cfc9c6680025d923b4ca140ce3e4612d1a2ef58e11f11fe"}, + {file = "ruff-0.8.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9257aa841e9e8d9b727423086f0fa9a86b6b420fbf4bf9e1465d1250ce8e4d8d"}, + {file = "ruff-0.8.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:45a56f61b24682f6f6709636949ae8cc82ae229d8d773b4c76c09ec83964a95a"}, + {file = "ruff-0.8.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:496dd38a53aa173481a7d8866bcd6451bd934d06976a2505028a50583e001b76"}, + {file = "ruff-0.8.6-py3-none-win32.whl", hash = "sha256:e169ea1b9eae61c99b257dc83b9ee6c76f89042752cb2d83486a7d6e48e8f764"}, + {file = "ruff-0.8.6-py3-none-win_amd64.whl", hash = "sha256:f1d70bef3d16fdc897ee290d7d20da3cbe4e26349f62e8a0274e7a3f4ce7a905"}, + {file = "ruff-0.8.6-py3-none-win_arm64.whl", hash = "sha256:7d7fc2377a04b6e04ffe588caad613d0c460eb2ecba4c0ccbbfe2bc973cbc162"}, + {file = "ruff-0.8.6.tar.gz", hash = "sha256:dcad24b81b62650b0eb8814f576fc65cfee8674772a6e24c9b747911801eeaa5"}, ] [[package]] diff --git a/requirements-docs.txt b/requirements-docs.txt index 5161661..d32480c 100644 --- a/requirements-docs.txt +++ b/requirements-docs.txt @@ -224,9 +224,9 @@ pathspec==0.12.1 ; python_version >= "3.8" and python_version < "4.0" \ platformdirs==4.3.6 ; python_version >= "3.8" and python_version < "4.0" \ --hash=sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907 \ --hash=sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb -pygments==2.18.0 ; python_version >= "3.8" and python_version < "4.0" \ - --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ - --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a +pygments==2.19.1 ; python_version >= "3.8" and python_version < "4.0" \ + --hash=sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f \ + --hash=sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c pymdown-extensions==10.13 ; python_version >= "3.8" and python_version < "4.0" \ --hash=sha256:80bc33d715eec68e683e04298946d47d78c7739e79d808203df278ee8ef89428 \ --hash=sha256:e0b351494dc0d8d14a1f52b39b1499a00ef1566b4ba23dc74f1eba75c736f5dd diff --git a/tests/test_advanced_examples.py b/tests/test_advanced_examples.py index d4f3a2f..ab147d7 100644 --- a/tests/test_advanced_examples.py +++ b/tests/test_advanced_examples.py @@ -126,7 +126,7 @@ def test_email_str(): new_email = email.replace("user@example.com", "user1@example.com") assert isinstance(new_email, EmailStr) - assert new_email.name == "user1" + assert new_email.name == "user1" # name is not updated because it's cached assert new_email.domain == "example.com" # Test invalid email with non-strict mode diff --git a/examples/mutable.py b/tests/test_mutable.py similarity index 85% rename from examples/mutable.py rename to tests/test_mutable.py index 0593893..53e4ecd 100644 --- a/examples/mutable.py +++ b/tests/test_mutable.py @@ -26,3 +26,7 @@ def test_mutable_and_subtype(): assert mutable_sub_type_copy.inner == 1 assert mutable_sub_type_copy.inner2 == 3 + + mutable_sub_type_copy.inner2 = 4 + assert mutable_sub_type.inner2 == 3 + assert mutable_sub_type_copy.inner2 == 4 diff --git a/tests/test_newtype.py b/tests/test_newtype.py index 06c0ba1..0743ad3 100644 --- a/tests/test_newtype.py +++ b/tests/test_newtype.py @@ -120,6 +120,11 @@ def test_my_dataframe(): df = pd.DataFrame({"A": [1, 2], "B": [4, 5]}) my_df = MyDataFrame(df, 1, 2, 3) + assert df.at[0, "A"] == 1 + assert df.at[1, "A"] == 2 + assert df.at[0, "B"] == 4 + assert df.at[1, "B"] == 5 + assert my_df.a == 1 assert my_df.b == 2 assert my_df.c == 3 @@ -130,6 +135,8 @@ def test_my_dataframe(): assert my_df.b == 2 assert my_df.c == 3 + assert my_df.shape == (2, 2) + assert my_df.at["A", 0] == 1 assert my_df.at["A", 1] == 2 assert my_df.at["B", 0] == 4 @@ -139,5 +146,14 @@ def test_my_dataframe(): assert my_df.at["A", 1] == 69 my_df = my_df.T + + assert my_df.at[1, "A"] == 69 + assert my_df.at[1, "B"] == 5 + + assert my_df.at[0, "A"] == 1 + assert my_df.at[0, "B"] == 4 + + assert my_df.shape == (2, 2) + with pytest.raises(AssertionError): my_df.drop("A", axis=1) From b0c9bc456ac0f3a139b765f392fcb207a5e28df2 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 7 Jan 2025 17:50:53 +0100 Subject: [PATCH 03/18] codes for slots were gone but gotten back already --- newtype/extensions/newtype_meth.c | 66 ++++++++++++++++++++++++++++++- poetry.lock | 8 ++-- requirements-docs.txt | 6 +-- tests/_test_mixed_slots_dict.py | 48 ++++++++++++++++++++++ tests/test_slots.py | 46 +++++++++++++++++++++ 5 files changed, 166 insertions(+), 8 deletions(-) create mode 100644 tests/_test_mixed_slots_dict.py diff --git a/newtype/extensions/newtype_meth.c b/newtype/extensions/newtype_meth.c index 367b5db..3feabf2 100644 --- a/newtype/extensions/newtype_meth.c +++ b/newtype/extensions/newtype_meth.c @@ -125,6 +125,11 @@ static PyObject* NewTypeMethod_call(NewTypeMethodObject* self, result_dict = PyObject_GetAttrString(result, "__dict__"); } + PyObject* result_slots = NULL; + if (PyObject_HasAttrString(result, "__slots__")) { + result_slots = PyObject_GetAttrString(result, "__slots__"); + } + if (self->obj == NULL && self->cls == NULL) { Py_XDECREF(result_dict); // Clean up before goto goto done; @@ -287,7 +292,66 @@ static PyObject* NewTypeMethod_call(NewTypeMethodObject* self, Py_XDECREF(iter); Py_XDECREF(new_keys); Py_XDECREF(new_dict); - } + } // end of if (self->obj != NULL && result != NULL && new_inst != NULL + // && result_dict != NULL) + + if (self->obj != NULL && result != NULL && new_inst != NULL + && result_slots != NULL) + { + PyObject* new_slots = NULL; + PyObject* iter = NULL; + PyObject* key = NULL; + PyObject* value = NULL; + + // Get new_inst's dictionary + if (!PyObject_HasAttrString(new_inst, "__slots__")) { + goto cleanup_for_slots; + } + new_slots = PyObject_GetAttrString(new_inst, "__slots__"); + if (new_slots == NULL) { + goto cleanup_for_slots; + } + + DEBUG_PRINT("`new_slots`: %s\n", + PyUnicode_AsUTF8(PyObject_Repr(new_slots))); + DEBUG_PRINT("`result_dict`: %s\n", + PyUnicode_AsUTF8(PyObject_Repr(result_slots))); + + DEBUG_PRINT("`new_slots`: %s\n", + PyUnicode_AsUTF8(PyObject_Repr(new_slots))); + + iter = PyObject_GetIter(new_slots); + if (iter == NULL) { + goto cleanup_for_slots; + } + + while ((key = PyIter_Next(iter)) != NULL) { + DEBUG_PRINT("`key`: %s\n", PyUnicode_AsUTF8(PyObject_Repr(key))); + + DEBUG_PRINT("Key: %s is not in result_slots\n", + PyUnicode_AsUTF8(PyObject_Repr(key))); + + if (PyObject_HasAttr(self->obj, key)) { + value = PyObject_GetAttr(self->obj, key); + if (value != NULL) { + if (PyObject_SetAttr(new_inst, key, value) >= 0) { + DEBUG_PRINT("`key` = `%s`, `value` = `%s` has been set\n", + PyUnicode_AsUTF8(PyObject_Repr(key)), + PyUnicode_AsUTF8(PyObject_Repr(value))); + } + Py_DECREF(value); + } + } + Py_DECREF(key); + key = NULL; // Reset for next iteration + } + + cleanup_for_slots: + Py_XDECREF(key); // In case loop exited with error + Py_XDECREF(iter); + Py_XDECREF(new_slots); + } // end of if (self->obj != NULL && result != NULL && new_inst != NULL + // && result_slots != NULL) Py_XDECREF(result_dict); DEBUG_PRINT("`new_inst`: %s\n", PyUnicode_AsUTF8(PyObject_Repr(new_inst))); diff --git a/poetry.lock b/poetry.lock index 8301d75..908edd6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2016,13 +2016,13 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pymdown-extensions" -version = "10.13" +version = "10.14" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.13-py3-none-any.whl", hash = "sha256:80bc33d715eec68e683e04298946d47d78c7739e79d808203df278ee8ef89428"}, - {file = "pymdown_extensions-10.13.tar.gz", hash = "sha256:e0b351494dc0d8d14a1f52b39b1499a00ef1566b4ba23dc74f1eba75c736f5dd"}, + {file = "pymdown_extensions-10.14-py3-none-any.whl", hash = "sha256:202481f716cc8250e4be8fce997781ebf7917701b59652458ee47f2401f818b5"}, + {file = "pymdown_extensions-10.14.tar.gz", hash = "sha256:741bd7c4ff961ba40b7528d32284c53bc436b8b1645e8e37c3e57770b8700a34"}, ] [package.dependencies] @@ -2030,7 +2030,7 @@ markdown = ">=3.6" pyyaml = "*" [package.extras] -extra = ["pygments (>=2.12)"] +extra = ["pygments (>=2.19.1)"] [[package]] name = "pyparsing" diff --git a/requirements-docs.txt b/requirements-docs.txt index d32480c..4e36bca 100644 --- a/requirements-docs.txt +++ b/requirements-docs.txt @@ -227,9 +227,9 @@ platformdirs==4.3.6 ; python_version >= "3.8" and python_version < "4.0" \ pygments==2.19.1 ; python_version >= "3.8" and python_version < "4.0" \ --hash=sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f \ --hash=sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c -pymdown-extensions==10.13 ; python_version >= "3.8" and python_version < "4.0" \ - --hash=sha256:80bc33d715eec68e683e04298946d47d78c7739e79d808203df278ee8ef89428 \ - --hash=sha256:e0b351494dc0d8d14a1f52b39b1499a00ef1566b4ba23dc74f1eba75c736f5dd +pymdown-extensions==10.14 ; python_version >= "3.8" and python_version < "4.0" \ + --hash=sha256:202481f716cc8250e4be8fce997781ebf7917701b59652458ee47f2401f818b5 \ + --hash=sha256:741bd7c4ff961ba40b7528d32284c53bc436b8b1645e8e37c3e57770b8700a34 python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "4.0" \ --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 diff --git a/tests/_test_mixed_slots_dict.py b/tests/_test_mixed_slots_dict.py new file mode 100644 index 0000000..abd5fa4 --- /dev/null +++ b/tests/_test_mixed_slots_dict.py @@ -0,0 +1,48 @@ +from newtype import NewType + + +class MixedBase: + __slots__ = ['slot_val'] + + def __init__(self, slot_val: int): + self.slot_val = slot_val + + def copy(self): + return MixedBase(self.slot_val) + + +class MixedSubType(NewType(MixedBase)): + # No __slots__, so will use __dict__ + def __init__(self, base: MixedBase, dict_val: str): + self.dict_val = dict_val + + +def test_mixed_slots_dict(): + # Create instances + mixed_sub = MixedSubType(MixedBase(1), "test") + assert mixed_sub.slot_val == 1 + assert mixed_sub.dict_val == "test" + + # Modify and copy + mixed_sub.dict_val = "modified" + mixed_copy = mixed_sub.copy() + + # Verify copy has correct values + assert mixed_copy.slot_val == 1 + assert mixed_copy.dict_val == "modified" + + # Verify modifications don't affect original + mixed_copy.dict_val = "new value" + assert mixed_sub.dict_val == "modified" + assert mixed_copy.dict_val == "new value" + + # Verify slot behavior + try: + mixed_sub.slot_val = 2 # Should work + assert mixed_sub.slot_val == 2 + except AttributeError: + assert False, "Should be able to modify slot values" + + # Verify dict behavior + mixed_sub.new_attr = "dynamic" # Should work + assert mixed_sub.new_attr == "dynamic" diff --git a/tests/test_slots.py b/tests/test_slots.py index b3d3bc6..42c851d 100644 --- a/tests/test_slots.py +++ b/tests/test_slots.py @@ -157,3 +157,49 @@ def __init__(self): d = Derived() d.attr3 = "hey" assert d.attr3 == "hey" + + +class SlottedBase: + __slots__ = ['inner'] + + def __init__(self, inner: int): + self.inner = inner + + def copy(self): + return SlottedBase(self.inner) + + +class SlottedSubType(NewType(SlottedBase)): + __slots__ = ['inner2'] + + def __init__(self, base: SlottedBase, inner2: int): + self.inner2 = inner2 + + +def test_slotted_types(): + # Create instances + slotted_sub = SlottedSubType(SlottedBase(1), 2) + assert slotted_sub.inner == 1 + assert slotted_sub.inner2 == 2 + + # Modify and copy + slotted_sub.inner2 = 3 + slotted_copy = slotted_sub.copy() + assert slotted_sub.inner == 1 + assert slotted_sub.inner2 == 3 + + # Verify copy has correct values + assert slotted_copy.inner == 1 + assert slotted_copy.inner2 == 3 + + # Verify modifications don't affect original + slotted_copy.inner2 = 4 + assert slotted_sub.inner2 == 3 + assert slotted_copy.inner2 == 4 + + # Verify __slots__ are working + try: + slotted_sub.new_attr = 5 # Should raise AttributeError + assert False, "Should not be able to add new attributes" + except AttributeError: + pass From f00759684ee45973221c1ec7e624726f52b69ac5 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 7 Jan 2025 17:53:38 +0100 Subject: [PATCH 04/18] changed a command in makefile --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index bd981bd..92da1c0 100644 --- a/Makefile +++ b/Makefile @@ -85,6 +85,8 @@ clean-deps: # Build extensions build: clean $(POETRY) build + +update-docs-deps: poetry lock && poetry export -f requirements.txt --output requirements-docs.txt --with docs # Build with debug printing enabled From b75b375dd6877bfd7d9641774066ceed4c58b134 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 8 Jan 2025 16:17:50 +0100 Subject: [PATCH 05/18] all tests still passed --- newtype/extensions/newtype_meth.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/newtype/extensions/newtype_meth.c b/newtype/extensions/newtype_meth.c index 3feabf2..ac11091 100644 --- a/newtype/extensions/newtype_meth.c +++ b/newtype/extensions/newtype_meth.c @@ -295,11 +295,17 @@ static PyObject* NewTypeMethod_call(NewTypeMethodObject* self, } // end of if (self->obj != NULL && result != NULL && new_inst != NULL // && result_dict != NULL) + // if instance of the subtype has `__slots__` (and/or has `__dict__`) + // but result does not if (self->obj != NULL && result != NULL && new_inst != NULL && result_slots != NULL) { PyObject* new_slots = NULL; - PyObject* iter = NULL; + PyObject* new_dict = NULL; + PyObject* new_keys = NULL; + + PyObject* iter_slots = NULL; + PyObject* iter_dict = NULL; PyObject* key = NULL; PyObject* value = NULL; @@ -320,12 +326,12 @@ static PyObject* NewTypeMethod_call(NewTypeMethodObject* self, DEBUG_PRINT("`new_slots`: %s\n", PyUnicode_AsUTF8(PyObject_Repr(new_slots))); - iter = PyObject_GetIter(new_slots); - if (iter == NULL) { + iter_slots = PyObject_GetIter(new_slots); + if (iter_slots == NULL) { goto cleanup_for_slots; } - while ((key = PyIter_Next(iter)) != NULL) { + while ((key = PyIter_Next(iter_slots)) != NULL) { DEBUG_PRINT("`key`: %s\n", PyUnicode_AsUTF8(PyObject_Repr(key))); DEBUG_PRINT("Key: %s is not in result_slots\n", @@ -347,9 +353,13 @@ static PyObject* NewTypeMethod_call(NewTypeMethodObject* self, } cleanup_for_slots: - Py_XDECREF(key); // In case loop exited with error - Py_XDECREF(iter); + Py_XDECREF(new_dict); + Py_XDECREF(new_keys); Py_XDECREF(new_slots); + + Py_XDECREF(key); // In case loop exited with error + Py_XDECREF(iter_slots); + Py_XDECREF(iter_dict); } // end of if (self->obj != NULL && result != NULL && new_inst != NULL // && result_slots != NULL) From 4f880aa064f0ad0939b42fef579fbf8b2f994c94 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 9 Jan 2025 15:43:50 +0100 Subject: [PATCH 06/18] all py-vers tests passed --- newtype/extensions/newtype_meth.c | 93 +++++++++++++++---- ...slots_dict.py => test_mixed_slots_dict.py} | 0 2 files changed, 75 insertions(+), 18 deletions(-) rename tests/{_test_mixed_slots_dict.py => test_mixed_slots_dict.py} (100%) diff --git a/newtype/extensions/newtype_meth.c b/newtype/extensions/newtype_meth.c index ac11091..6a62537 100644 --- a/newtype/extensions/newtype_meth.c +++ b/newtype/extensions/newtype_meth.c @@ -230,9 +230,6 @@ static PyObject* NewTypeMethod_call(NewTypeMethodObject* self, if (self->obj != NULL && result != NULL && new_inst != NULL && result_dict != NULL) { - PyObject* new_dict = NULL; - PyObject* new_keys = NULL; - PyObject* iter = NULL; PyObject* key = NULL; PyObject* value = NULL; @@ -240,8 +237,11 @@ static PyObject* NewTypeMethod_call(NewTypeMethodObject* self, if (!PyObject_HasAttrString(new_inst, "__dict__")) { goto cleanup; } + + PyObject* new_dict = NULL; new_dict = PyObject_GetAttrString(new_inst, "__dict__"); if (new_dict == NULL) { + Py_XDECREF(new_dict); goto cleanup; } @@ -251,16 +251,20 @@ static PyObject* NewTypeMethod_call(NewTypeMethodObject* self, PyUnicode_AsUTF8(PyObject_Repr(result_dict))); // Get the keys from new_dict + PyObject* new_keys = NULL; new_keys = PyDict_Keys(new_dict); if (new_keys == NULL) { + Py_XDECREF(new_keys); goto cleanup; } DEBUG_PRINT("`new_keys`: %s\n", PyUnicode_AsUTF8(PyObject_Repr(new_keys))); + PyObject* iter = NULL; iter = PyObject_GetIter(new_keys); if (iter == NULL) { + Py_XDECREF(iter); goto cleanup; } @@ -289,9 +293,6 @@ static PyObject* NewTypeMethod_call(NewTypeMethodObject* self, cleanup: Py_XDECREF(key); // In case loop exited with error - Py_XDECREF(iter); - Py_XDECREF(new_keys); - Py_XDECREF(new_dict); } // end of if (self->obj != NULL && result != NULL && new_inst != NULL // && result_dict != NULL) @@ -309,7 +310,7 @@ static PyObject* NewTypeMethod_call(NewTypeMethodObject* self, PyObject* key = NULL; PyObject* value = NULL; - // Get new_inst's dictionary + // Get new_inst's slots if (!PyObject_HasAttrString(new_inst, "__slots__")) { goto cleanup_for_slots; } @@ -334,24 +335,80 @@ static PyObject* NewTypeMethod_call(NewTypeMethodObject* self, while ((key = PyIter_Next(iter_slots)) != NULL) { DEBUG_PRINT("`key`: %s\n", PyUnicode_AsUTF8(PyObject_Repr(key))); - DEBUG_PRINT("Key: %s is not in result_slots\n", - PyUnicode_AsUTF8(PyObject_Repr(key))); + // Check if key is not in result_slots + if (PySequence_Contains(result_slots, key) == 0) { + DEBUG_PRINT("Key: %s is not in result_slots = %s\n", + PyUnicode_AsUTF8(PyObject_Repr(key)), + PyUnicode_AsUTF8(PyObject_Repr(result_slots))); - if (PyObject_HasAttr(self->obj, key)) { - value = PyObject_GetAttr(self->obj, key); - if (value != NULL) { - if (PyObject_SetAttr(new_inst, key, value) >= 0) { - DEBUG_PRINT("`key` = `%s`, `value` = `%s` has been set\n", - PyUnicode_AsUTF8(PyObject_Repr(key)), - PyUnicode_AsUTF8(PyObject_Repr(value))); + if (PyObject_HasAttr(self->obj, key)) { + value = PyObject_GetAttr(self->obj, key); + if (value != NULL) { + if (PyObject_SetAttr(new_inst, key, value) >= 0) { + DEBUG_PRINT("`key` = `%s`, `value` = `%s` has been set\n", + PyUnicode_AsUTF8(PyObject_Repr(key)), + PyUnicode_AsUTF8(PyObject_Repr(value))); + } + Py_DECREF(value); + value = NULL; // Reset value for next iteration } - Py_DECREF(value); } } Py_DECREF(key); - key = NULL; // Reset for next iteration + key = NULL; // Reset key for next iteration + } // end of while ((key = PyIter_Next(iter_slots)) != NULL), slots are + // successfully copied + + // Get `new_inst`'s dictionary + if (!PyObject_HasAttrString(new_inst, "__dict__")) { + goto cleanup_for_slots; + } + new_dict = PyObject_GetAttrString(new_inst, "__dict__"); + if (new_dict == NULL) { + goto cleanup_for_slots; + } + + DEBUG_PRINT("`new_dict`: %s\n", + PyUnicode_AsUTF8(PyObject_Repr(new_dict))); + + // Get the keys from new_dict + new_keys = PyDict_Keys(new_dict); + if (new_keys == NULL) { + goto cleanup_for_slots; + } + + DEBUG_PRINT("`new_keys`: %s\n", + PyUnicode_AsUTF8(PyObject_Repr(new_keys))); + + iter_dict = PyObject_GetIter(new_keys); + if (iter_dict == NULL) { + goto cleanup_for_slots; } + while ((key = PyIter_Next(iter_dict)) != NULL) { + DEBUG_PRINT("`key`: %s\n", PyUnicode_AsUTF8(PyObject_Repr(key))); + + if (PySequence_Contains(result_slots, key) == 0) { + DEBUG_PRINT("Key: %s is not in result_dict\n", + PyUnicode_AsUTF8(PyObject_Repr(key))); + + if (PyObject_HasAttr(self->obj, key)) { + value = PyObject_GetAttr(self->obj, key); + if (value != NULL) { + if (PyObject_SetAttr(new_inst, key, value) >= 0) { + DEBUG_PRINT("`key` = `%s`, `value` = `%s` has been set\n", + PyUnicode_AsUTF8(PyObject_Repr(key)), + PyUnicode_AsUTF8(PyObject_Repr(value))); + } + Py_DECREF(value); + } + } + } + Py_DECREF(key); + key = NULL; // Reset for next iteration + } // end of while ((key = PyIter_Next(iter_dict)) != NULL), dict is + // successfully copied + cleanup_for_slots: Py_XDECREF(new_dict); Py_XDECREF(new_keys); diff --git a/tests/_test_mixed_slots_dict.py b/tests/test_mixed_slots_dict.py similarity index 100% rename from tests/_test_mixed_slots_dict.py rename to tests/test_mixed_slots_dict.py From 9c74407ed19986d1478b7a6437acaabe3a9d15c0 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 9 Jan 2025 16:01:45 +0100 Subject: [PATCH 07/18] add new gh action and fix poetry version in gh actions --- .github/workflows/build_wheels.yaml | 272 ++++++++++++++++++++++++++++ .github/workflows/tests.yml | 1 + 2 files changed, 273 insertions(+) create mode 100644 .github/workflows/build_wheels.yaml diff --git a/.github/workflows/build_wheels.yaml b/.github/workflows/build_wheels.yaml new file mode 100644 index 0000000..4408ecc --- /dev/null +++ b/.github/workflows/build_wheels.yaml @@ -0,0 +1,272 @@ +name: Build Wheels + +on: + workflow_dispatch: + pull_request: + push: + tags: + - "v*.*.*" + +jobs: + build_sdist: + name: "sdist" + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest] + steps: + - name: Check out repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up python 3.12 + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install poetry + uses: snok/install-poetry@v1 + + - name: Build sdist + run: | + poetry self add "poetry-dynamic-versioning[plugin]" + poetry build --format=sdist + + - uses: actions/upload-artifact@v4 + with: + name: wheels-sdist + path: dist/*.tar.gz + + build_wheels_windows: + name: "${{ matrix.os }} ${{ matrix.cibw_archs }} ${{ matrix.cibw_build }}" + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [windows-latest] + cibw_build: ["cp38-*", "cp39-*", "cp310-*", "cp311-*", "cp312-*"] + cibw_archs: ["AMD64", "x86", "ARM64"] + exclude: + - os: windows-latest + cibw_build: "cp38-*" + cibw_archs: "ARM64" + + steps: + - name: "Set environment variables (Windows)" + shell: pwsh + run: | + (Get-ItemProperty "HKLM:System\CurrentControlSet\Control\FileSystem").LongPathsEnabled + + - name: Sanitize matrix.cibw_build + id: sanitize_build + run: echo "CIBW_BUILD_SANITIZED=$(echo '${{ matrix.cibw_build }}' | sed 's/\*/_/g')" >> $GITHUB_ENV + shell: bash + + - name: Check out repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up python 3.12 + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install poetry + uses: snok/install-poetry@v1 + with: + virtualenvs-create: false + virtualenvs-in-project: false + installer-parallel: false # Currently there seems to be some race-condition in windows + + - name: Build wheels + uses: pypa/cibuildwheel@v2.16.5 + env: + CIBW_ARCHS: ${{ matrix.cibw_archs }} + CIBW_BUILD: ${{ matrix.cibw_build }} + CIBW_TEST_SKIP: "*-win_arm64" + CIBW_TEST_REQUIRES: pytest + CIBW_TEST_COMMAND: pytest {package}/tests + + - uses: actions/upload-artifact@v4 + with: + name: wheels-${{ matrix.os }}-${{ env.CIBW_BUILD_SANITIZED }}-${{ matrix.cibw_archs }} + path: wheelhouse/*.whl + + build_wheels_linux: + name: "${{ matrix.os }} ${{ matrix.cibw_archs }} ${{ matrix.cibw_build }}" + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest] + cibw_build: ["cp38-*", "cp39-*", "cp310-*", "cp311-*", "cp312-*"] + cibw_archs: ["x86_64", "i686", "aarch64", "ppc64le"] + + steps: + - name: Check out repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Sanitize matrix.cibw_build + id: sanitize_build + run: echo "CIBW_BUILD_SANITIZED=$(echo '${{ matrix.cibw_build }}' | sed 's/\*/_/g')" >> $GITHUB_ENV + shell: bash + + - name: Set up QEMU + if: matrix.cibw_archs != 'x86_64' + uses: docker/setup-qemu-action@v3 + with: + platforms: all + + - name: Set up python 3.12 + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install poetry + uses: snok/install-poetry@v1 + with: + virtualenvs-create: false + virtualenvs-in-project: false + + - name: Build wheels + uses: pypa/cibuildwheel@v2.16.5 + env: + CIBW_ARCHS: ${{ matrix.cibw_archs }} + CIBW_BUILD: ${{ matrix.cibw_build }} + CIBW_TEST_REQUIRES: pytest + CIBW_TEST_COMMAND: pytest {package}/tests + + - uses: actions/upload-artifact@v4 + with: + name: wheels-${{ matrix.os }}-${{ env.CIBW_BUILD_SANITIZED }}-${{ matrix.cibw_archs }} + path: wheelhouse/*.whl + + build_wheels_macos: + name: "${{ matrix.os }} ${{ matrix.cibw_archs }} ${{ matrix.cibw_build }}" + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [macos-13] + cibw_build: ["cp38-*", "cp39-*", "cp310-*", "cp311-*", "cp312-*"] + cibw_archs: ["x86_64"] + env: + SYSTEM_VERSION_COMPAT: 0 # https://github.com/actions/setup-python/issues/469#issuecomment-1192522949 + steps: + - name: Check out repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Sanitize matrix.cibw_build + id: sanitize_build + run: echo "CIBW_BUILD_SANITIZED=$(echo '${{ matrix.cibw_build }}' | sed 's/\*/_/g')" >> $GITHUB_ENV + shell: bash + + - name: Set up python 3.12 + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install poetry + uses: snok/install-poetry@v1 + with: + virtualenvs-create: false + virtualenvs-in-project: false + + - name: Build wheels + uses: pypa/cibuildwheel@v2.16.5 + env: + CIBW_ARCHS: ${{ matrix.cibw_archs }} + CIBW_BUILD: ${{ matrix.cibw_build }} + CIBW_TEST_REQUIRES: pytest + CIBW_TEST_COMMAND: pytest {package}/tests + + - uses: actions/upload-artifact@v4 + with: + name: wheels-${{ matrix.os }}-${{ env.CIBW_BUILD_SANITIZED }}-${{ matrix.cibw_archs }} + path: wheelhouse/*.whl + + build_wheels_macos_arm64: + name: "${{ matrix.os }} ${{ matrix.cibw_archs }} ${{ matrix.cibw_build }}" + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [macos-13] + cibw_build: ["cp38-*", "cp39-*", "cp310-*", "cp311-*", "cp312-*"] + cibw_archs: ["arm64"] + + steps: + - name: Check out repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Build wheels + uses: pypa/cibuildwheel@v2.16.5 + env: + CIBW_BUILD: ${{ matrix.cibw_build }} + CIBW_ARCHS: ${{ matrix.cibw_archs }} + CIBW_TEST_SKIP: "*-macosx_arm64" + CIBW_TEST_REQUIRES: pytest + CIBW_TEST_COMMAND: pytest {package}/tests + CIBW_REPAIR_WHEEL_COMMAND: | + echo "Target delocate archs: {delocate_archs}" + + ORIGINAL_WHEEL={wheel} + + echo "Running delocate-listdeps to list linked original wheel dependencies" + delocate-listdeps --all $ORIGINAL_WHEEL + + echo "Renaming .whl file when architecture is 'macosx_arm64'" + RENAMED_WHEEL=${ORIGINAL_WHEEL//x86_64/arm64} + + echo "Wheel will be renamed to $RENAMED_WHEEL" + mv $ORIGINAL_WHEEL $RENAMED_WHEEL + + echo "Running delocate-wheel command on $RENAMED_WHEEL" + delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v $RENAMED_WHEEL + + echo "Running delocate-listdeps to list linked wheel dependencies" + WHEEL_SIMPLE_FILENAME="${RENAMED_WHEEL##*/}" + delocate-listdeps --all {dest_dir}/$WHEEL_SIMPLE_FILENAME + + echo "DONE." + + - uses: actions/upload-artifact@v4 + with: + name: wheels-${{ matrix.os }}-${{ matrix.cibw_build }}-${{ matrix.cibw_archs }} + path: ./wheelhouse/*.whl + + upload_to_pypi: + if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/v') + needs: + [ + "build_sdist", + "build_wheels_windows", + "build_wheels_linux", + "build_wheels_macos", + "build_wheels_macos_arm64", + ] + runs-on: ubuntu-latest + steps: + - uses: actions/download-artifact@v4 + with: + path: wheels + pattern: wheels-* + merge-multiple: true + + - uses: pypa/gh-action-pypi-publish@release/v1 + with: + password: ${{ secrets.PYPI_TOKEN }} + packages_dir: wheels/ + skip_existing: true diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index a9c654c..715b003 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -77,6 +77,7 @@ jobs: - name: Install poetry uses: snok/install-poetry@v1 with: + version: 1.8.5 virtualenvs-create: true virtualenvs-in-project: true installer-parallel: false # Currently there seems to be some race-condition in windows From 2f7260cb16a041d6f76ddc4437fd379fd743a34a Mon Sep 17 00:00:00 2001 From: root Date: Thu, 9 Jan 2025 16:04:31 +0100 Subject: [PATCH 08/18] add new gh action and fix poetry version in gh actions --- .github/workflows/build_wheels.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build_wheels.yaml b/.github/workflows/build_wheels.yaml index 4408ecc..822a650 100644 --- a/.github/workflows/build_wheels.yaml +++ b/.github/workflows/build_wheels.yaml @@ -176,6 +176,8 @@ jobs: - name: Install poetry uses: snok/install-poetry@v1 with: + version: 1.8.5 + installer-parallel: false # Currently there seems to be some race-condition in windows virtualenvs-create: false virtualenvs-in-project: false From fbd72533f85d52b03746f4b5e3fcada637556218 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 9 Jan 2025 16:07:56 +0100 Subject: [PATCH 09/18] try to fix wheels building failures --- .github/workflows/build_wheels.yaml | 42 +++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/.github/workflows/build_wheels.yaml b/.github/workflows/build_wheels.yaml index 822a650..44dc83d 100644 --- a/.github/workflows/build_wheels.yaml +++ b/.github/workflows/build_wheels.yaml @@ -140,6 +140,48 @@ jobs: CIBW_BUILD: ${{ matrix.cibw_build }} CIBW_TEST_REQUIRES: pytest CIBW_TEST_COMMAND: pytest {package}/tests + CIBW_REPAIR_WHEEL_COMMAND_LINUX: | + # Print system information + echo "=== System Information ===" + uname -a + ldd --version + + # Print wheel information + echo "=== Wheel Information ===" + ls -l {wheel} + unzip -l {wheel} + + # Print detailed wheel dependencies + echo "=== Original Wheel Dependencies ===" + auditwheel show {wheel} + ldd $(find {wheel} -name "*.so") + + echo "=== Attempting wheel repair ===" + # Try repair with maximum verbosity + auditwheel -v repair -w {dest_dir} {wheel} || true + + echo "=== Repaired Wheel Information ===" + ls -l {dest_dir} + + echo "=== Repaired Wheel Dependencies ===" + for whl in {dest_dir}/*.whl; do + echo "Checking $whl:" + auditwheel show "$whl" + unzip -l "$whl" + done + + # Copy the wheel even if repair failed + cp {wheel} {dest_dir}/ || true + CIBW_BEFORE_BUILD: | + python -m pip install --upgrade pip + python -m pip install setuptools wheel + # Print Python environment info + python --version + pip list + echo "=== Build Environment ===" + env | sort + CIBW_BUILD_VERBOSITY: 3 + CIBW_ENVIRONMENT: PYTHONVERBOSE=1 CFLAGS="-v" LDFLAGS="-v" - uses: actions/upload-artifact@v4 with: From 80b076f0cb993b923872c60b6551a67f361b2708 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 9 Jan 2025 16:22:21 +0100 Subject: [PATCH 10/18] try to fix wheels building failures --- .github/workflows/build_wheels.yaml | 141 ++++++++++++++++++---------- 1 file changed, 89 insertions(+), 52 deletions(-) diff --git a/.github/workflows/build_wheels.yaml b/.github/workflows/build_wheels.yaml index 44dc83d..893fdfb 100644 --- a/.github/workflows/build_wheels.yaml +++ b/.github/workflows/build_wheels.yaml @@ -54,16 +54,6 @@ jobs: cibw_archs: "ARM64" steps: - - name: "Set environment variables (Windows)" - shell: pwsh - run: | - (Get-ItemProperty "HKLM:System\CurrentControlSet\Control\FileSystem").LongPathsEnabled - - - name: Sanitize matrix.cibw_build - id: sanitize_build - run: echo "CIBW_BUILD_SANITIZED=$(echo '${{ matrix.cibw_build }}' | sed 's/\*/_/g')" >> $GITHUB_ENV - shell: bash - - name: Check out repository uses: actions/checkout@v4 with: @@ -79,7 +69,15 @@ jobs: with: virtualenvs-create: false virtualenvs-in-project: false - installer-parallel: false # Currently there seems to be some race-condition in windows + + # Add Visual Studio build tools + - name: Install Visual Studio Build Tools + uses: microsoft/setup-msbuild@v2 + + - name: Add MSBuild to PATH + uses: microsoft/setup-msbuild@v2 + with: + msbuild-architecture: x64 - name: Build wheels uses: pypa/cibuildwheel@v2.16.5 @@ -87,8 +85,19 @@ jobs: CIBW_ARCHS: ${{ matrix.cibw_archs }} CIBW_BUILD: ${{ matrix.cibw_build }} CIBW_TEST_SKIP: "*-win_arm64" - CIBW_TEST_REQUIRES: pytest - CIBW_TEST_COMMAND: pytest {package}/tests + CIBW_TEST_REQUIRES: pytest pandas + CIBW_TEST_COMMAND: | + dir /s {package} + pytest {package}/tests -v + CIBW_BEFORE_BUILD: | + python -m pip install --upgrade pip + python -m pip install setuptools wheel + python -m pip list + CIBW_BUILD_VERBOSITY: 3 + CIBW_ENVIRONMENT: | + DISTUTILS_USE_SDK=1 + MSSdk=1 + PYTHONVERBOSE=1 - uses: actions/upload-artifact@v4 with: @@ -122,6 +131,14 @@ jobs: with: platforms: all + # Add Docker debug info + - name: Docker Info + run: | + docker info + docker version + docker ps + docker system df + - name: Set up python 3.12 uses: actions/setup-python@v5 with: @@ -133,18 +150,34 @@ jobs: virtualenvs-create: false virtualenvs-in-project: false + # Add system dependencies + - name: Install system dependencies + run: | + sudo apt-get update + sudo apt-get install -y build-essential python3-dev + - name: Build wheels uses: pypa/cibuildwheel@v2.16.5 env: CIBW_ARCHS: ${{ matrix.cibw_archs }} CIBW_BUILD: ${{ matrix.cibw_build }} - CIBW_TEST_REQUIRES: pytest - CIBW_TEST_COMMAND: pytest {package}/tests + CIBW_TEST_REQUIRES: pytest pandas + CIBW_TEST_COMMAND: | + ls -la {package} + python -c "import sys; print('Python:', sys.version)" + python -c "import newtype; print('newtype:', newtype.__file__)" + pytest {package}/tests -v + CIBW_BEFORE_BUILD: | + python -m pip install --upgrade pip + python -m pip install setuptools wheel + python -m pip list + echo "=== Environment ===" + env | sort CIBW_REPAIR_WHEEL_COMMAND_LINUX: | # Print system information echo "=== System Information ===" uname -a - ldd --version + cat /etc/os-release # Print wheel information echo "=== Wheel Information ===" @@ -154,34 +187,18 @@ jobs: # Print detailed wheel dependencies echo "=== Original Wheel Dependencies ===" auditwheel show {wheel} - ldd $(find {wheel} -name "*.so") + find {wheel} -name "*.so" -exec ldd {} \; echo "=== Attempting wheel repair ===" # Try repair with maximum verbosity - auditwheel -v repair -w {dest_dir} {wheel} || true - - echo "=== Repaired Wheel Information ===" - ls -l {dest_dir} - - echo "=== Repaired Wheel Dependencies ===" - for whl in {dest_dir}/*.whl; do - echo "Checking $whl:" - auditwheel show "$whl" - unzip -l "$whl" - done - - # Copy the wheel even if repair failed - cp {wheel} {dest_dir}/ || true - CIBW_BEFORE_BUILD: | - python -m pip install --upgrade pip - python -m pip install setuptools wheel - # Print Python environment info - python --version - pip list - echo "=== Build Environment ===" - env | sort + auditwheel -v repair -w {dest_dir} {wheel} || cp {wheel} {dest_dir}/ CIBW_BUILD_VERBOSITY: 3 - CIBW_ENVIRONMENT: PYTHONVERBOSE=1 CFLAGS="-v" LDFLAGS="-v" + CIBW_ENVIRONMENT: | + PYTHONVERBOSE=1 + CFLAGS="-v" + LDFLAGS="-v" + LD_LIBRARY_PATH="/usr/local/lib" + PYTHONPATH="/usr/local/lib/python3/dist-packages" - uses: actions/upload-artifact@v4 with: @@ -198,7 +215,8 @@ jobs: cibw_build: ["cp38-*", "cp39-*", "cp310-*", "cp311-*", "cp312-*"] cibw_archs: ["x86_64"] env: - SYSTEM_VERSION_COMPAT: 0 # https://github.com/actions/setup-python/issues/469#issuecomment-1192522949 + SYSTEM_VERSION_COMPAT: 0 + steps: - name: Check out repository uses: actions/checkout@v4 @@ -219,7 +237,6 @@ jobs: uses: snok/install-poetry@v1 with: version: 1.8.5 - installer-parallel: false # Currently there seems to be some race-condition in windows virtualenvs-create: false virtualenvs-in-project: false @@ -228,8 +245,30 @@ jobs: env: CIBW_ARCHS: ${{ matrix.cibw_archs }} CIBW_BUILD: ${{ matrix.cibw_build }} - CIBW_TEST_REQUIRES: pytest - CIBW_TEST_COMMAND: pytest {package}/tests + CIBW_TEST_REQUIRES: pytest pandas + CIBW_TEST_COMMAND: | + ls -R {package} + python -c "import newtype; print('newtype location:', newtype.__file__)" + python -c "from newtype.extensions import newtypeinit; print('newtypeinit exists')" + pytest {package}/tests -v + CIBW_BEFORE_BUILD: | + python -m pip install --upgrade pip + python -m pip install setuptools wheel + python -m pip list + CIBW_REPAIR_WHEEL_COMMAND: | + echo "=== Wheel Contents Before Repair ===" + unzip -l {wheel} + delocate-listdeps --all {wheel} + delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v {wheel} + echo "=== Wheel Contents After Repair ===" + unzip -l {dest_dir}/*.whl + CIBW_BUILD_VERBOSITY: 3 + CIBW_ENVIRONMENT: | + MACOSX_DEPLOYMENT_TARGET=10.14 + ARCHFLAGS="-arch x86_64" + PYTHONVERBOSE=1 + CFLAGS="-v" + LDFLAGS="-v" - uses: actions/upload-artifact@v4 with: @@ -251,6 +290,11 @@ jobs: with: fetch-depth: 0 + - name: Sanitize matrix.cibw_build + id: sanitize_build + run: echo "CIBW_BUILD_SANITIZED=$(echo '${{ matrix.cibw_build }}' | sed 's/\*/_/g')" >> $GITHUB_ENV + shell: bash + - uses: actions/setup-python@v5 with: python-version: "3.12" @@ -265,30 +309,23 @@ jobs: CIBW_TEST_COMMAND: pytest {package}/tests CIBW_REPAIR_WHEEL_COMMAND: | echo "Target delocate archs: {delocate_archs}" - ORIGINAL_WHEEL={wheel} - echo "Running delocate-listdeps to list linked original wheel dependencies" delocate-listdeps --all $ORIGINAL_WHEEL - echo "Renaming .whl file when architecture is 'macosx_arm64'" RENAMED_WHEEL=${ORIGINAL_WHEEL//x86_64/arm64} - echo "Wheel will be renamed to $RENAMED_WHEEL" mv $ORIGINAL_WHEEL $RENAMED_WHEEL - echo "Running delocate-wheel command on $RENAMED_WHEEL" delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v $RENAMED_WHEEL - echo "Running delocate-listdeps to list linked wheel dependencies" WHEEL_SIMPLE_FILENAME="${RENAMED_WHEEL##*/}" delocate-listdeps --all {dest_dir}/$WHEEL_SIMPLE_FILENAME - echo "DONE." - uses: actions/upload-artifact@v4 with: - name: wheels-${{ matrix.os }}-${{ matrix.cibw_build }}-${{ matrix.cibw_archs }} + name: wheels-${{ matrix.os }}-${{ env.CIBW_BUILD_SANITIZED }}-${{ matrix.cibw_archs }} path: ./wheelhouse/*.whl upload_to_pypi: From 9f8ca7cb45c36f6666277b8db453d4e204069549 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 9 Jan 2025 16:31:39 +0100 Subject: [PATCH 11/18] try to fix wheels building failures --- .github/workflows/build_wheels.yaml | 67 +++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build_wheels.yaml b/.github/workflows/build_wheels.yaml index 893fdfb..5c92f41 100644 --- a/.github/workflows/build_wheels.yaml +++ b/.github/workflows/build_wheels.yaml @@ -59,10 +59,32 @@ jobs: with: fetch-depth: 0 + - name: Sanitize matrix.cibw_build + id: sanitize_build + run: echo "CIBW_BUILD_SANITIZED=$(echo '${{ matrix.cibw_build }}' | sed 's/\*/_/g')" >> $GITHUB_ENV + shell: bash + - name: Set up python 3.12 uses: actions/setup-python@v5 with: python-version: "3.12" + architecture: ${{ matrix.cibw_archs == 'x86' && 'x86' || 'x64' }} + + # Install Visual Studio components + - name: Install Visual Studio Components + shell: powershell + run: | + $VS_PATH = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\2022\BuildTools" + if (-not (Test-Path $VS_PATH)) { + Write-Host "Installing Visual Studio Build Tools..." + Invoke-WebRequest -Uri https://aka.ms/vs/17/release/vs_buildtools.exe -OutFile vs_buildtools.exe + Start-Process -FilePath .\vs_buildtools.exe -ArgumentList "--quiet", "--wait", "--norestart", "--nocache", ` + "--installPath", "$VS_PATH", ` + "--add", "Microsoft.VisualStudio.Component.VC.Tools.x86.x64", ` + "--add", "Microsoft.VisualStudio.Component.Windows10SDK.19041", ` + "--add", "Microsoft.VisualStudio.Component.VC.14.29.CLI.Support", ` + "--add", "Microsoft.VisualStudio.Component.VC.14.29.ARM64" -Wait + } - name: Install poetry uses: snok/install-poetry@v1 @@ -70,15 +92,6 @@ jobs: virtualenvs-create: false virtualenvs-in-project: false - # Add Visual Studio build tools - - name: Install Visual Studio Build Tools - uses: microsoft/setup-msbuild@v2 - - - name: Add MSBuild to PATH - uses: microsoft/setup-msbuild@v2 - with: - msbuild-architecture: x64 - - name: Build wheels uses: pypa/cibuildwheel@v2.16.5 env: @@ -88,16 +101,26 @@ jobs: CIBW_TEST_REQUIRES: pytest pandas CIBW_TEST_COMMAND: | dir /s {package} + python -c "import sys; print('Python:', sys.executable, sys.version)" + python -c "import platform; print('Platform:', platform.machine(), platform.architecture())" + python -c "import os; print('PATH:', os.environ.get('PATH'))" + python -c "import newtype; print('newtype location:', newtype.__file__)" pytest {package}/tests -v CIBW_BEFORE_BUILD: | python -m pip install --upgrade pip python -m pip install setuptools wheel + python -m pip install poetry-core python -m pip list CIBW_BUILD_VERBOSITY: 3 CIBW_ENVIRONMENT: | DISTUTILS_USE_SDK=1 MSSdk=1 - PYTHONVERBOSE=1 + PYTHONVERBOSITY=1 + VS160COMNTOOLS="C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\Common7\Tools" + VSCMD_ARG_TGT_ARCH=${{ matrix.cibw_archs == 'x86' && 'x86' || (matrix.cibw_archs == 'ARM64' && 'arm64' || 'x64') }} + VCVARSALL_ARCH=${{ matrix.cibw_archs == 'x86' && 'x86' || (matrix.cibw_archs == 'ARM64' && 'arm64' || 'amd64') }} + PY_VCRUNTIME_REDIST=true + _PYTHON_HOST_PLATFORM=win-${{ matrix.cibw_archs == 'x86' && '32' || '64' }} - uses: actions/upload-artifact@v4 with: @@ -248,27 +271,47 @@ jobs: CIBW_TEST_REQUIRES: pytest pandas CIBW_TEST_COMMAND: | ls -R {package} + python -c "import sys; print('Python:', sys.executable, sys.version)" + python -c "import platform; print('Platform:', platform.machine(), platform.architecture())" + python -c "import os; print('PATH:', os.environ.get('PATH'))" python -c "import newtype; print('newtype location:', newtype.__file__)" + python -c "import glob; print('SO files:', glob.glob('{package}/**/*.so', recursive=True))" python -c "from newtype.extensions import newtypeinit; print('newtypeinit exists')" pytest {package}/tests -v CIBW_BEFORE_BUILD: | python -m pip install --upgrade pip python -m pip install setuptools wheel + python -m pip install poetry-core python -m pip list CIBW_REPAIR_WHEEL_COMMAND: | echo "=== Wheel Contents Before Repair ===" unzip -l {wheel} delocate-listdeps --all {wheel} + echo "=== Running delocate-wheel ===" delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v {wheel} echo "=== Wheel Contents After Repair ===" unzip -l {dest_dir}/*.whl + echo "=== Checking SO files ===" + find {dest_dir} -name "*.so" -exec otool -L {} \; CIBW_BUILD_VERBOSITY: 3 CIBW_ENVIRONMENT: | MACOSX_DEPLOYMENT_TARGET=10.14 ARCHFLAGS="-arch x86_64" PYTHONVERBOSE=1 - CFLAGS="-v" - LDFLAGS="-v" + CFLAGS="-v -arch x86_64" + LDFLAGS="-v -arch x86_64" + _PYTHON_HOST_PLATFORM="macosx-10.14-x86_64" + SETUPTOOLS_USE_DISTUTILS=stdlib + + - name: Debug wheel contents + run: | + echo "=== Listing wheelhouse contents ===" + ls -R wheelhouse/ + echo "=== Examining wheel files ===" + for whl in wheelhouse/*.whl; do + echo "=== Contents of $whl ===" + unzip -l "$whl" + done - uses: actions/upload-artifact@v4 with: From 2bd0f0e13529e620b3fa0885349c5ea71cf3a1ce Mon Sep 17 00:00:00 2001 From: root Date: Thu, 9 Jan 2025 16:46:49 +0100 Subject: [PATCH 12/18] try to fix wheels building failures --- .github/workflows/build_wheels.yaml | 158 ++++++++++++++++++---------- 1 file changed, 103 insertions(+), 55 deletions(-) diff --git a/.github/workflows/build_wheels.yaml b/.github/workflows/build_wheels.yaml index 5c92f41..d80898a 100644 --- a/.github/workflows/build_wheels.yaml +++ b/.github/workflows/build_wheels.yaml @@ -59,31 +59,62 @@ jobs: with: fetch-depth: 0 - - name: Sanitize matrix.cibw_build - id: sanitize_build - run: echo "CIBW_BUILD_SANITIZED=$(echo '${{ matrix.cibw_build }}' | sed 's/\*/_/g')" >> $GITHUB_ENV - shell: bash - - name: Set up python 3.12 uses: actions/setup-python@v5 with: python-version: "3.12" architecture: ${{ matrix.cibw_archs == 'x86' && 'x86' || 'x64' }} - # Install Visual Studio components - - name: Install Visual Studio Components + # Install Visual Studio Build Tools + - name: Install Visual Studio Build Tools shell: powershell run: | - $VS_PATH = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\2022\BuildTools" - if (-not (Test-Path $VS_PATH)) { - Write-Host "Installing Visual Studio Build Tools..." - Invoke-WebRequest -Uri https://aka.ms/vs/17/release/vs_buildtools.exe -OutFile vs_buildtools.exe - Start-Process -FilePath .\vs_buildtools.exe -ArgumentList "--quiet", "--wait", "--norestart", "--nocache", ` - "--installPath", "$VS_PATH", ` - "--add", "Microsoft.VisualStudio.Component.VC.Tools.x86.x64", ` - "--add", "Microsoft.VisualStudio.Component.Windows10SDK.19041", ` - "--add", "Microsoft.VisualStudio.Component.VC.14.29.CLI.Support", ` - "--add", "Microsoft.VisualStudio.Component.VC.14.29.ARM64" -Wait + # Download the Visual Studio Build Tools bootstrapper + Invoke-WebRequest -Uri https://aka.ms/vs/17/release/vs_buildtools.exe -OutFile vs_buildtools.exe + + # Install Build Tools with required components + Start-Process -FilePath .\vs_buildtools.exe -ArgumentList ` + "--quiet", "--wait", "--norestart", "--nocache", ` + "--installPath", "C:\BuildTools", ` + "--add", "Microsoft.VisualStudio.Component.VC.Tools.x86.x64", ` + "--add", "Microsoft.VisualStudio.Component.Windows10SDK.19041", ` + "--add", "Microsoft.VisualStudio.Component.VC.14.29.CLI.Support", ` + "--add", "Microsoft.VisualStudio.Component.VC.14.29.ARM64", ` + "--add", "Microsoft.VisualStudio.Component.VC.Redist.14.Latest", ` + "--add", "Microsoft.VisualStudio.Component.Windows11SDK.22621" ` + -Wait -PassThru + + # Set up Visual Studio environment + - name: Set up Visual Studio environment + shell: powershell + run: | + $arch = "${{ matrix.cibw_archs }}" + $vsPath = "C:\BuildTools" + $vcvarsall = "$vsPath\VC\Auxiliary\Build\vcvarsall.bat" + + # Create a batch file to set up environment + @" + @echo off + call "$vcvarsall" $($arch.ToLower()) || exit /b 1 + set > %TEMP%\vcvars.txt + "@ | Out-File -FilePath setup_env.bat -Encoding ASCII + + # Run the batch file and import environment variables + cmd /c "setup_env.bat && set > %TEMP%\vcvars.txt" + Get-Content "$env:TEMP\vcvars.txt" | ForEach-Object { + if ($_ -match '^([^=]+)=(.*)$') { + $name = $matches[1] + $value = $matches[2] + [System.Environment]::SetEnvironmentVariable($name, $value) + } + } + + # Verify compiler is available + Write-Host "Checking cl.exe..." + where.exe cl.exe + if ($LASTEXITCODE -ne 0) { + Write-Host "cl.exe not found in PATH!" + exit 1 } - name: Install poetry @@ -111,12 +142,13 @@ jobs: python -m pip install setuptools wheel python -m pip install poetry-core python -m pip list + where cl.exe CIBW_BUILD_VERBOSITY: 3 CIBW_ENVIRONMENT: | DISTUTILS_USE_SDK=1 MSSdk=1 PYTHONVERBOSITY=1 - VS160COMNTOOLS="C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\Common7\Tools" + VS160COMNTOOLS="C:\BuildTools\Common7\Tools" VSCMD_ARG_TGT_ARCH=${{ matrix.cibw_archs == 'x86' && 'x86' || (matrix.cibw_archs == 'ARM64' && 'arm64' || 'x64') }} VCVARSALL_ARCH=${{ matrix.cibw_archs == 'x86' && 'x86' || (matrix.cibw_archs == 'ARM64' && 'arm64' || 'amd64') }} PY_VCRUNTIME_REDIST=true @@ -143,25 +175,12 @@ jobs: with: fetch-depth: 0 - - name: Sanitize matrix.cibw_build - id: sanitize_build - run: echo "CIBW_BUILD_SANITIZED=$(echo '${{ matrix.cibw_build }}' | sed 's/\*/_/g')" >> $GITHUB_ENV - shell: bash - - name: Set up QEMU if: matrix.cibw_archs != 'x86_64' uses: docker/setup-qemu-action@v3 with: platforms: all - # Add Docker debug info - - name: Docker Info - run: | - docker info - docker version - docker ps - docker system df - - name: Set up python 3.12 uses: actions/setup-python@v5 with: @@ -177,7 +196,8 @@ jobs: - name: Install system dependencies run: | sudo apt-get update - sudo apt-get install -y build-essential python3-dev + sudo apt-get install -y build-essential python3-dev patchelf + sudo apt-get install -y gcc g++ gfortran - name: Build wheels uses: pypa/cibuildwheel@v2.16.5 @@ -186,46 +206,68 @@ jobs: CIBW_BUILD: ${{ matrix.cibw_build }} CIBW_TEST_REQUIRES: pytest pandas CIBW_TEST_COMMAND: | - ls -la {package} python -c "import sys; print('Python:', sys.version)" - python -c "import newtype; print('newtype:', newtype.__file__)" - pytest {package}/tests -v + python -c "import platform; print('Platform:', platform.machine(), platform.architecture())" + python -c "import os; print('PATH:', os.environ.get('PATH'))" + python -c "import glob; print('SO files:', glob.glob('/project/**/*.so', recursive=True))" + python -c "import newtype; print('newtype location:', newtype.__file__)" + python -c "from newtype.extensions import newtypeinit; print('newtypeinit exists')" + pytest /project/tests -v CIBW_BEFORE_BUILD: | python -m pip install --upgrade pip python -m pip install setuptools wheel + python -m pip install poetry-core python -m pip list - echo "=== Environment ===" - env | sort + python -c "import sys; print('Python location:', sys.executable)" + python -c "import sysconfig; print('Platform:', sysconfig.get_platform())" CIBW_REPAIR_WHEEL_COMMAND_LINUX: | - # Print system information echo "=== System Information ===" uname -a cat /etc/os-release - # Print wheel information echo "=== Wheel Information ===" ls -l {wheel} unzip -l {wheel} - # Print detailed wheel dependencies echo "=== Original Wheel Dependencies ===" auditwheel show {wheel} - find {wheel} -name "*.so" -exec ldd {} \; + find . -name "*.so" -exec ldd {} \; 2>/dev/null || true + + echo "=== Repairing Wheel ===" + auditwheel repair -w {dest_dir} {wheel} || cp {wheel} {dest_dir}/ - echo "=== Attempting wheel repair ===" - # Try repair with maximum verbosity - auditwheel -v repair -w {dest_dir} {wheel} || cp {wheel} {dest_dir}/ + echo "=== Final Wheel Dependencies ===" + auditwheel show {dest_dir}/*.whl CIBW_BUILD_VERBOSITY: 3 CIBW_ENVIRONMENT: | PYTHONVERBOSE=1 - CFLAGS="-v" + CFLAGS="-v -fPIC" LDFLAGS="-v" - LD_LIBRARY_PATH="/usr/local/lib" - PYTHONPATH="/usr/local/lib/python3/dist-packages" + LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH" + PYTHONPATH="/usr/local/lib/python3/dist-packages:$PYTHONPATH" + SETUPTOOLS_USE_DISTUTILS=stdlib + _PYTHON_HOST_PLATFORM="linux-${{ matrix.cibw_archs }}" + + - name: Debug wheel contents + run: | + echo "=== Listing wheelhouse contents ===" + ls -R wheelhouse/ + echo "=== Examining wheel files ===" + for whl in wheelhouse/*.whl; do + echo "=== Contents of $whl ===" + unzip -l "$whl" + echo "=== Extracting wheel to check SO files ===" + TMP_DIR=$(mktemp -d) + unzip -d "$TMP_DIR" "$whl" + echo "=== SO files in wheel ===" + find "$TMP_DIR" -name "*.so" -ls + echo "=== SO file dependencies ===" + find "$TMP_DIR" -name "*.so" -exec ldd {} \; 2>/dev/null || true + done - uses: actions/upload-artifact@v4 with: - name: wheels-${{ matrix.os }}-${{ env.CIBW_BUILD_SANITIZED }}-${{ matrix.cibw_archs }} + name: wheels-${{ matrix.os }}-${{ matrix.cibw_build }}-${{ matrix.cibw_archs }} path: wheelhouse/*.whl build_wheels_macos: @@ -246,11 +288,6 @@ jobs: with: fetch-depth: 0 - - name: Sanitize matrix.cibw_build - id: sanitize_build - run: echo "CIBW_BUILD_SANITIZED=$(echo '${{ matrix.cibw_build }}' | sed 's/\*/_/g')" >> $GITHUB_ENV - shell: bash - - name: Set up python 3.12 uses: actions/setup-python@v5 with: @@ -270,12 +307,13 @@ jobs: CIBW_BUILD: ${{ matrix.cibw_build }} CIBW_TEST_REQUIRES: pytest pandas CIBW_TEST_COMMAND: | - ls -R {package} + ls -la {package} + ls -la {package}/newtype/extensions/ python -c "import sys; print('Python:', sys.executable, sys.version)" python -c "import platform; print('Platform:', platform.machine(), platform.architecture())" python -c "import os; print('PATH:', os.environ.get('PATH'))" - python -c "import newtype; print('newtype location:', newtype.__file__)" python -c "import glob; print('SO files:', glob.glob('{package}/**/*.so', recursive=True))" + python -c "import newtype; print('newtype location:', newtype.__file__)" python -c "from newtype.extensions import newtypeinit; print('newtypeinit exists')" pytest {package}/tests -v CIBW_BEFORE_BUILD: | @@ -302,6 +340,9 @@ jobs: LDFLAGS="-v -arch x86_64" _PYTHON_HOST_PLATFORM="macosx-10.14-x86_64" SETUPTOOLS_USE_DISTUTILS=stdlib + DYLD_LIBRARY_PATH="/usr/local/lib:$DYLD_LIBRARY_PATH" + DYLD_PRINT_LIBRARIES=1 + DYLD_PRINT_LIBRARIES_POST_LAUNCH=1 - name: Debug wheel contents run: | @@ -311,6 +352,13 @@ jobs: for whl in wheelhouse/*.whl; do echo "=== Contents of $whl ===" unzip -l "$whl" + echo "=== Extracting wheel to check SO files ===" + TMP_DIR=$(mktemp -d) + unzip -d "$TMP_DIR" "$whl" + echo "=== SO files in wheel ===" + find "$TMP_DIR" -name "*.so" -ls + echo "=== SO file dependencies ===" + find "$TMP_DIR" -name "*.so" -exec otool -L {} \; done - uses: actions/upload-artifact@v4 From cab98ca0cc8be0a36a9b084758a334ab2a0245c0 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 9 Jan 2025 16:55:54 +0100 Subject: [PATCH 13/18] simply the build_wheels.yaml --- .github/workflows/build_wheels.yaml | 515 ++++++++-------------------- 1 file changed, 141 insertions(+), 374 deletions(-) diff --git a/.github/workflows/build_wheels.yaml b/.github/workflows/build_wheels.yaml index d80898a..42e51d5 100644 --- a/.github/workflows/build_wheels.yaml +++ b/.github/workflows/build_wheels.yaml @@ -9,436 +9,203 @@ on: jobs: build_sdist: - name: "sdist" - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest] + name: "Build Source Distribution" + runs-on: ubuntu-latest steps: - - name: Check out repository - uses: actions/checkout@v4 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - - name: Set up python 3.12 - uses: actions/setup-python@v5 + - uses: actions/setup-python@v5 with: python-version: "3.12" - - - name: Install poetry - uses: snok/install-poetry@v1 - - - name: Build sdist - run: | + - uses: snok/install-poetry@v1 + - run: | poetry self add "poetry-dynamic-versioning[plugin]" poetry build --format=sdist - - uses: actions/upload-artifact@v4 with: - name: wheels-sdist + name: sdist path: dist/*.tar.gz - build_wheels_windows: - name: "${{ matrix.os }} ${{ matrix.cibw_archs }} ${{ matrix.cibw_build }}" + build_wheels: + name: ${{ matrix.os }} ${{ matrix.python }} ${{ matrix.arch }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: - os: [windows-latest] - cibw_build: ["cp38-*", "cp39-*", "cp310-*", "cp311-*", "cp312-*"] - cibw_archs: ["AMD64", "x86", "ARM64"] - exclude: + include: + # Windows builds - os: windows-latest - cibw_build: "cp38-*" - cibw_archs: "ARM64" - - steps: - - name: Check out repository - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Set up python 3.12 - uses: actions/setup-python@v5 - with: - python-version: "3.12" - architecture: ${{ matrix.cibw_archs == 'x86' && 'x86' || 'x64' }} - - # Install Visual Studio Build Tools - - name: Install Visual Studio Build Tools - shell: powershell - run: | - # Download the Visual Studio Build Tools bootstrapper - Invoke-WebRequest -Uri https://aka.ms/vs/17/release/vs_buildtools.exe -OutFile vs_buildtools.exe - - # Install Build Tools with required components - Start-Process -FilePath .\vs_buildtools.exe -ArgumentList ` - "--quiet", "--wait", "--norestart", "--nocache", ` - "--installPath", "C:\BuildTools", ` - "--add", "Microsoft.VisualStudio.Component.VC.Tools.x86.x64", ` - "--add", "Microsoft.VisualStudio.Component.Windows10SDK.19041", ` - "--add", "Microsoft.VisualStudio.Component.VC.14.29.CLI.Support", ` - "--add", "Microsoft.VisualStudio.Component.VC.14.29.ARM64", ` - "--add", "Microsoft.VisualStudio.Component.VC.Redist.14.Latest", ` - "--add", "Microsoft.VisualStudio.Component.Windows11SDK.22621" ` - -Wait -PassThru - - # Set up Visual Studio environment - - name: Set up Visual Studio environment - shell: powershell - run: | - $arch = "${{ matrix.cibw_archs }}" - $vsPath = "C:\BuildTools" - $vcvarsall = "$vsPath\VC\Auxiliary\Build\vcvarsall.bat" - - # Create a batch file to set up environment - @" - @echo off - call "$vcvarsall" $($arch.ToLower()) || exit /b 1 - set > %TEMP%\vcvars.txt - "@ | Out-File -FilePath setup_env.bat -Encoding ASCII - - # Run the batch file and import environment variables - cmd /c "setup_env.bat && set > %TEMP%\vcvars.txt" - Get-Content "$env:TEMP\vcvars.txt" | ForEach-Object { - if ($_ -match '^([^=]+)=(.*)$') { - $name = $matches[1] - $value = $matches[2] - [System.Environment]::SetEnvironmentVariable($name, $value) - } - } - - # Verify compiler is available - Write-Host "Checking cl.exe..." - where.exe cl.exe - if ($LASTEXITCODE -ne 0) { - Write-Host "cl.exe not found in PATH!" - exit 1 - } - - - name: Install poetry - uses: snok/install-poetry@v1 - with: - virtualenvs-create: false - virtualenvs-in-project: false - - - name: Build wheels - uses: pypa/cibuildwheel@v2.16.5 - env: - CIBW_ARCHS: ${{ matrix.cibw_archs }} - CIBW_BUILD: ${{ matrix.cibw_build }} - CIBW_TEST_SKIP: "*-win_arm64" - CIBW_TEST_REQUIRES: pytest pandas - CIBW_TEST_COMMAND: | - dir /s {package} - python -c "import sys; print('Python:', sys.executable, sys.version)" - python -c "import platform; print('Platform:', platform.machine(), platform.architecture())" - python -c "import os; print('PATH:', os.environ.get('PATH'))" - python -c "import newtype; print('newtype location:', newtype.__file__)" - pytest {package}/tests -v - CIBW_BEFORE_BUILD: | - python -m pip install --upgrade pip - python -m pip install setuptools wheel - python -m pip install poetry-core - python -m pip list - where cl.exe - CIBW_BUILD_VERBOSITY: 3 - CIBW_ENVIRONMENT: | - DISTUTILS_USE_SDK=1 - MSSdk=1 - PYTHONVERBOSITY=1 - VS160COMNTOOLS="C:\BuildTools\Common7\Tools" - VSCMD_ARG_TGT_ARCH=${{ matrix.cibw_archs == 'x86' && 'x86' || (matrix.cibw_archs == 'ARM64' && 'arm64' || 'x64') }} - VCVARSALL_ARCH=${{ matrix.cibw_archs == 'x86' && 'x86' || (matrix.cibw_archs == 'ARM64' && 'arm64' || 'amd64') }} - PY_VCRUNTIME_REDIST=true - _PYTHON_HOST_PLATFORM=win-${{ matrix.cibw_archs == 'x86' && '32' || '64' }} - - - uses: actions/upload-artifact@v4 - with: - name: wheels-${{ matrix.os }}-${{ env.CIBW_BUILD_SANITIZED }}-${{ matrix.cibw_archs }} - path: wheelhouse/*.whl - - build_wheels_linux: - name: "${{ matrix.os }} ${{ matrix.cibw_archs }} ${{ matrix.cibw_build }}" - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest] - cibw_build: ["cp38-*", "cp39-*", "cp310-*", "cp311-*", "cp312-*"] - cibw_archs: ["x86_64", "i686", "aarch64", "ppc64le"] + python: cp38 + arch: x86 + - os: windows-latest + python: cp38 + arch: AMD64 + - os: windows-latest + python: cp39 + arch: x86 + - os: windows-latest + python: cp39 + arch: AMD64 + - os: windows-latest + python: cp39 + arch: ARM64 + - os: windows-latest + python: cp310 + arch: x86 + - os: windows-latest + python: cp310 + arch: AMD64 + - os: windows-latest + python: cp310 + arch: ARM64 + - os: windows-latest + python: cp311 + arch: x86 + - os: windows-latest + python: cp311 + arch: AMD64 + - os: windows-latest + python: cp311 + arch: ARM64 + - os: windows-latest + python: cp312 + arch: x86 + - os: windows-latest + python: cp312 + arch: AMD64 + - os: windows-latest + python: cp312 + arch: ARM64 + + # Linux builds + - os: ubuntu-latest + python: cp38 + arch: x86_64 + - os: ubuntu-latest + python: cp39 + arch: x86_64 + - os: ubuntu-latest + python: cp310 + arch: x86_64 + - os: ubuntu-latest + python: cp311 + arch: x86_64 + - os: ubuntu-latest + python: cp312 + arch: x86_64 + + # macOS builds + - os: macos-13 + python: cp38 + arch: x86_64 + - os: macos-13 + python: cp39 + arch: x86_64 + - os: macos-13 + python: cp310 + arch: x86_64 + - os: macos-13 + python: cp311 + arch: x86_64 + - os: macos-13 + python: cp312 + arch: x86_64 + - os: macos-13 + python: cp38 + arch: arm64 + - os: macos-13 + python: cp39 + arch: arm64 + - os: macos-13 + python: cp310 + arch: arm64 + - os: macos-13 + python: cp311 + arch: arm64 + - os: macos-13 + python: cp312 + arch: arm64 steps: - - name: Check out repository - uses: actions/checkout@v4 + - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up QEMU - if: matrix.cibw_archs != 'x86_64' + if: runner.os == 'Linux' && matrix.arch != 'x86_64' uses: docker/setup-qemu-action@v3 with: platforms: all - - name: Set up python 3.12 - uses: actions/setup-python@v5 + - uses: actions/setup-python@v5 with: python-version: "3.12" + architecture: ${{ matrix.arch == 'x86' && 'x86' || 'x64' }} - - name: Install poetry - uses: snok/install-poetry@v1 + # Windows-specific setup + - name: Setup Windows + if: runner.os == 'Windows' + uses: microsoft/setup-msbuild@v2 with: - virtualenvs-create: false - virtualenvs-in-project: false + msbuild-architecture: x64 + vs-version: '[17.0,18.0)' - # Add system dependencies - - name: Install system dependencies + # Linux-specific setup + - name: Setup Linux + if: runner.os == 'Linux' run: | sudo apt-get update sudo apt-get install -y build-essential python3-dev patchelf - sudo apt-get install -y gcc g++ gfortran - - name: Build wheels - uses: pypa/cibuildwheel@v2.16.5 - env: - CIBW_ARCHS: ${{ matrix.cibw_archs }} - CIBW_BUILD: ${{ matrix.cibw_build }} - CIBW_TEST_REQUIRES: pytest pandas - CIBW_TEST_COMMAND: | - python -c "import sys; print('Python:', sys.version)" - python -c "import platform; print('Platform:', platform.machine(), platform.architecture())" - python -c "import os; print('PATH:', os.environ.get('PATH'))" - python -c "import glob; print('SO files:', glob.glob('/project/**/*.so', recursive=True))" - python -c "import newtype; print('newtype location:', newtype.__file__)" - python -c "from newtype.extensions import newtypeinit; print('newtypeinit exists')" - pytest /project/tests -v - CIBW_BEFORE_BUILD: | - python -m pip install --upgrade pip - python -m pip install setuptools wheel - python -m pip install poetry-core - python -m pip list - python -c "import sys; print('Python location:', sys.executable)" - python -c "import sysconfig; print('Platform:', sysconfig.get_platform())" - CIBW_REPAIR_WHEEL_COMMAND_LINUX: | - echo "=== System Information ===" - uname -a - cat /etc/os-release - - echo "=== Wheel Information ===" - ls -l {wheel} - unzip -l {wheel} - - echo "=== Original Wheel Dependencies ===" - auditwheel show {wheel} - find . -name "*.so" -exec ldd {} \; 2>/dev/null || true - - echo "=== Repairing Wheel ===" - auditwheel repair -w {dest_dir} {wheel} || cp {wheel} {dest_dir}/ - - echo "=== Final Wheel Dependencies ===" - auditwheel show {dest_dir}/*.whl - CIBW_BUILD_VERBOSITY: 3 - CIBW_ENVIRONMENT: | - PYTHONVERBOSE=1 - CFLAGS="-v -fPIC" - LDFLAGS="-v" - LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH" - PYTHONPATH="/usr/local/lib/python3/dist-packages:$PYTHONPATH" - SETUPTOOLS_USE_DISTUTILS=stdlib - _PYTHON_HOST_PLATFORM="linux-${{ matrix.cibw_archs }}" - - - name: Debug wheel contents - run: | - echo "=== Listing wheelhouse contents ===" - ls -R wheelhouse/ - echo "=== Examining wheel files ===" - for whl in wheelhouse/*.whl; do - echo "=== Contents of $whl ===" - unzip -l "$whl" - echo "=== Extracting wheel to check SO files ===" - TMP_DIR=$(mktemp -d) - unzip -d "$TMP_DIR" "$whl" - echo "=== SO files in wheel ===" - find "$TMP_DIR" -name "*.so" -ls - echo "=== SO file dependencies ===" - find "$TMP_DIR" -name "*.so" -exec ldd {} \; 2>/dev/null || true - done - - - uses: actions/upload-artifact@v4 - with: - name: wheels-${{ matrix.os }}-${{ matrix.cibw_build }}-${{ matrix.cibw_archs }} - path: wheelhouse/*.whl - - build_wheels_macos: - name: "${{ matrix.os }} ${{ matrix.cibw_archs }} ${{ matrix.cibw_build }}" - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [macos-13] - cibw_build: ["cp38-*", "cp39-*", "cp310-*", "cp311-*", "cp312-*"] - cibw_archs: ["x86_64"] - env: - SYSTEM_VERSION_COMPAT: 0 - - steps: - - name: Check out repository - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Set up python 3.12 - uses: actions/setup-python@v5 - with: - python-version: "3.12" - - - name: Install poetry - uses: snok/install-poetry@v1 + - uses: snok/install-poetry@v1 with: version: 1.8.5 virtualenvs-create: false - virtualenvs-in-project: false - name: Build wheels uses: pypa/cibuildwheel@v2.16.5 env: - CIBW_ARCHS: ${{ matrix.cibw_archs }} - CIBW_BUILD: ${{ matrix.cibw_build }} + CIBW_BUILD: ${{ matrix.python }}-* + CIBW_ARCHS: ${{ matrix.arch }} CIBW_TEST_REQUIRES: pytest pandas - CIBW_TEST_COMMAND: | - ls -la {package} - ls -la {package}/newtype/extensions/ - python -c "import sys; print('Python:', sys.executable, sys.version)" - python -c "import platform; print('Platform:', platform.machine(), platform.architecture())" - python -c "import os; print('PATH:', os.environ.get('PATH'))" - python -c "import glob; print('SO files:', glob.glob('{package}/**/*.so', recursive=True))" - python -c "import newtype; print('newtype location:', newtype.__file__)" - python -c "from newtype.extensions import newtypeinit; print('newtypeinit exists')" - pytest {package}/tests -v - CIBW_BEFORE_BUILD: | - python -m pip install --upgrade pip - python -m pip install setuptools wheel - python -m pip install poetry-core - python -m pip list - CIBW_REPAIR_WHEEL_COMMAND: | - echo "=== Wheel Contents Before Repair ===" - unzip -l {wheel} - delocate-listdeps --all {wheel} - echo "=== Running delocate-wheel ===" - delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v {wheel} - echo "=== Wheel Contents After Repair ===" - unzip -l {dest_dir}/*.whl - echo "=== Checking SO files ===" - find {dest_dir} -name "*.so" -exec otool -L {} \; - CIBW_BUILD_VERBOSITY: 3 - CIBW_ENVIRONMENT: | - MACOSX_DEPLOYMENT_TARGET=10.14 - ARCHFLAGS="-arch x86_64" + CIBW_TEST_SKIP: "*-win_arm64 *-macosx_arm64" + CIBW_BUILD_VERBOSITY: 1 + # Common environment variables + CIBW_ENVIRONMENT: >- PYTHONVERBOSE=1 - CFLAGS="-v -arch x86_64" - LDFLAGS="-v -arch x86_64" - _PYTHON_HOST_PLATFORM="macosx-10.14-x86_64" SETUPTOOLS_USE_DISTUTILS=stdlib - DYLD_LIBRARY_PATH="/usr/local/lib:$DYLD_LIBRARY_PATH" - DYLD_PRINT_LIBRARIES=1 - DYLD_PRINT_LIBRARIES_POST_LAUNCH=1 - - - name: Debug wheel contents - run: | - echo "=== Listing wheelhouse contents ===" - ls -R wheelhouse/ - echo "=== Examining wheel files ===" - for whl in wheelhouse/*.whl; do - echo "=== Contents of $whl ===" - unzip -l "$whl" - echo "=== Extracting wheel to check SO files ===" - TMP_DIR=$(mktemp -d) - unzip -d "$TMP_DIR" "$whl" - echo "=== SO files in wheel ===" - find "$TMP_DIR" -name "*.so" -ls - echo "=== SO file dependencies ===" - find "$TMP_DIR" -name "*.so" -exec otool -L {} \; - done + # OS-specific environment variables + CIBW_ENVIRONMENT_WINDOWS: >- + DISTUTILS_USE_SDK=1 + MSSdk=1 + CIBW_ENVIRONMENT_MACOS: >- + MACOSX_DEPLOYMENT_TARGET=10.14 + ARCHFLAGS="-arch ${{ matrix.arch }}" + CIBW_ENVIRONMENT_LINUX: >- + CFLAGS="-fPIC" - uses: actions/upload-artifact@v4 with: - name: wheels-${{ matrix.os }}-${{ env.CIBW_BUILD_SANITIZED }}-${{ matrix.cibw_archs }} + name: wheel-${{ matrix.os }}-${{ matrix.python }}-${{ matrix.arch }} path: wheelhouse/*.whl - build_wheels_macos_arm64: - name: "${{ matrix.os }} ${{ matrix.cibw_archs }} ${{ matrix.cibw_build }}" - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [macos-13] - cibw_build: ["cp38-*", "cp39-*", "cp310-*", "cp311-*", "cp312-*"] - cibw_archs: ["arm64"] - - steps: - - name: Check out repository - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Sanitize matrix.cibw_build - id: sanitize_build - run: echo "CIBW_BUILD_SANITIZED=$(echo '${{ matrix.cibw_build }}' | sed 's/\*/_/g')" >> $GITHUB_ENV - shell: bash - - - uses: actions/setup-python@v5 - with: - python-version: "3.12" - - - name: Build wheels - uses: pypa/cibuildwheel@v2.16.5 - env: - CIBW_BUILD: ${{ matrix.cibw_build }} - CIBW_ARCHS: ${{ matrix.cibw_archs }} - CIBW_TEST_SKIP: "*-macosx_arm64" - CIBW_TEST_REQUIRES: pytest - CIBW_TEST_COMMAND: pytest {package}/tests - CIBW_REPAIR_WHEEL_COMMAND: | - echo "Target delocate archs: {delocate_archs}" - ORIGINAL_WHEEL={wheel} - echo "Running delocate-listdeps to list linked original wheel dependencies" - delocate-listdeps --all $ORIGINAL_WHEEL - echo "Renaming .whl file when architecture is 'macosx_arm64'" - RENAMED_WHEEL=${ORIGINAL_WHEEL//x86_64/arm64} - echo "Wheel will be renamed to $RENAMED_WHEEL" - mv $ORIGINAL_WHEEL $RENAMED_WHEEL - echo "Running delocate-wheel command on $RENAMED_WHEEL" - delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v $RENAMED_WHEEL - echo "Running delocate-listdeps to list linked wheel dependencies" - WHEEL_SIMPLE_FILENAME="${RENAMED_WHEEL##*/}" - delocate-listdeps --all {dest_dir}/$WHEEL_SIMPLE_FILENAME - echo "DONE." - - - uses: actions/upload-artifact@v4 - with: - name: wheels-${{ matrix.os }}-${{ env.CIBW_BUILD_SANITIZED }}-${{ matrix.cibw_archs }} - path: ./wheelhouse/*.whl - - upload_to_pypi: - if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/v') - needs: - [ - "build_sdist", - "build_wheels_windows", - "build_wheels_linux", - "build_wheels_macos", - "build_wheels_macos_arm64", - ] + upload_pypi: + needs: [build_sdist, build_wheels] runs-on: ubuntu-latest + if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/v') steps: - uses: actions/download-artifact@v4 with: - path: wheels - pattern: wheels-* + path: dist + pattern: wheel-* merge-multiple: true - + - uses: actions/download-artifact@v4 + with: + path: dist + name: sdist - uses: pypa/gh-action-pypi-publish@release/v1 with: password: ${{ secrets.PYPI_TOKEN }} - packages_dir: wheels/ + packages_dir: dist/ skip_existing: true From e9471b3b99dca6b1438dac6f3035b2d50c2c10f4 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 9 Jan 2025 17:01:41 +0100 Subject: [PATCH 14/18] simply the build_wheels.yaml --- .github/workflows/build_wheels.yaml | 78 ++++++++--------------------- 1 file changed, 20 insertions(+), 58 deletions(-) diff --git a/.github/workflows/build_wheels.yaml b/.github/workflows/build_wheels.yaml index 42e51d5..49d4db8 100644 --- a/.github/workflows/build_wheels.yaml +++ b/.github/workflows/build_wheels.yaml @@ -34,51 +34,24 @@ jobs: fail-fast: false matrix: include: - # Windows builds - - os: windows-latest - python: cp38 - arch: x86 + # Windows builds (x64 only for now) - os: windows-latest python: cp38 arch: AMD64 - - os: windows-latest - python: cp39 - arch: x86 - os: windows-latest python: cp39 arch: AMD64 - - os: windows-latest - python: cp39 - arch: ARM64 - - os: windows-latest - python: cp310 - arch: x86 - os: windows-latest python: cp310 arch: AMD64 - - os: windows-latest - python: cp310 - arch: ARM64 - - os: windows-latest - python: cp311 - arch: x86 - os: windows-latest python: cp311 arch: AMD64 - - os: windows-latest - python: cp311 - arch: ARM64 - - os: windows-latest - python: cp312 - arch: x86 - os: windows-latest python: cp312 arch: AMD64 - - os: windows-latest - python: cp312 - arch: ARM64 - # Linux builds + # Linux builds (x86_64 only) - os: ubuntu-latest python: cp38 arch: x86_64 @@ -95,7 +68,7 @@ jobs: python: cp312 arch: x86_64 - # macOS builds + # macOS builds (x86_64 only) - os: macos-13 python: cp38 arch: x86_64 @@ -111,45 +84,22 @@ jobs: - os: macos-13 python: cp312 arch: x86_64 - - os: macos-13 - python: cp38 - arch: arm64 - - os: macos-13 - python: cp39 - arch: arm64 - - os: macos-13 - python: cp310 - arch: arm64 - - os: macos-13 - python: cp311 - arch: arm64 - - os: macos-13 - python: cp312 - arch: arm64 steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Set up QEMU - if: runner.os == 'Linux' && matrix.arch != 'x86_64' - uses: docker/setup-qemu-action@v3 - with: - platforms: all - - uses: actions/setup-python@v5 with: python-version: "3.12" - architecture: ${{ matrix.arch == 'x86' && 'x86' || 'x64' }} # Windows-specific setup - - name: Setup Windows + - name: Setup Visual Studio (Windows) if: runner.os == 'Windows' - uses: microsoft/setup-msbuild@v2 + uses: ilammy/msvc-dev-cmd@v1 with: - msbuild-architecture: x64 - vs-version: '[17.0,18.0)' + arch: x64 # Linux-specific setup - name: Setup Linux @@ -169,8 +119,19 @@ jobs: CIBW_BUILD: ${{ matrix.python }}-* CIBW_ARCHS: ${{ matrix.arch }} CIBW_TEST_REQUIRES: pytest pandas - CIBW_TEST_SKIP: "*-win_arm64 *-macosx_arm64" + CIBW_TEST_COMMAND: | + python -c "import sys; print('Python:', sys.executable, sys.version)" + python -c "import platform; print('Platform:', platform.machine(), platform.architecture())" + python -c "import os; print('PATH:', os.environ.get('PATH'))" + python -c "import glob; print('SO files:', glob.glob('**/*.so', recursive=True))" + python -c "import newtype; print('newtype location:', newtype.__file__)" + python -c "from newtype.extensions import newtypeinit; print('newtypeinit exists')" + python -c "from newtype.extensions import newtypemethod; print('newtypemethod exists')" + pytest {package}/tests -v CIBW_BUILD_VERBOSITY: 1 + CIBW_BEFORE_BUILD: | + python -m pip install --upgrade pip + python -m pip install setuptools wheel poetry-core # Common environment variables CIBW_ENVIRONMENT: >- PYTHONVERBOSE=1 @@ -181,9 +142,10 @@ jobs: MSSdk=1 CIBW_ENVIRONMENT_MACOS: >- MACOSX_DEPLOYMENT_TARGET=10.14 - ARCHFLAGS="-arch ${{ matrix.arch }}" + ARCHFLAGS="-arch x86_64" CIBW_ENVIRONMENT_LINUX: >- CFLAGS="-fPIC" + _PYTHON_HOST_PLATFORM="linux-x86_64" - uses: actions/upload-artifact@v4 with: From 9c2313748a7583af7aaf4207db9b450365786be6 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 9 Jan 2025 17:09:50 +0100 Subject: [PATCH 15/18] simply the build_wheels.yaml --- .github/workflows/build_wheels.yaml | 180 +++++++++------------------- 1 file changed, 58 insertions(+), 122 deletions(-) diff --git a/.github/workflows/build_wheels.yaml b/.github/workflows/build_wheels.yaml index 49d4db8..7afcfae 100644 --- a/.github/workflows/build_wheels.yaml +++ b/.github/workflows/build_wheels.yaml @@ -9,165 +9,101 @@ on: jobs: build_sdist: - name: "Build Source Distribution" - runs-on: ubuntu-latest + name: "sdist" + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest] steps: - - uses: actions/checkout@v4 + - name: Check out repository + uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: actions/setup-python@v5 + + - name: Set up python 3.12 + uses: actions/setup-python@v5 with: python-version: "3.12" - - uses: snok/install-poetry@v1 - - run: | + + - name: Install poetry + uses: snok/install-poetry@v1 + + - name: Build sdist + run: | poetry self add "poetry-dynamic-versioning[plugin]" poetry build --format=sdist + - uses: actions/upload-artifact@v4 with: - name: sdist + name: wheels-sdist path: dist/*.tar.gz build_wheels: - name: ${{ matrix.os }} ${{ matrix.python }} ${{ matrix.arch }} + name: "${{ matrix.os }} py${{ matrix.python-version }}" runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] include: - # Windows builds (x64 only for now) - - os: windows-latest - python: cp38 - arch: AMD64 - - os: windows-latest - python: cp39 - arch: AMD64 - - os: windows-latest - python: cp310 - arch: AMD64 - - os: windows-latest - python: cp311 - arch: AMD64 - - os: windows-latest - python: cp312 - arch: AMD64 - - # Linux builds (x86_64 only) - - os: ubuntu-latest - python: cp38 - arch: x86_64 - - os: ubuntu-latest - python: cp39 - arch: x86_64 - - os: ubuntu-latest - python: cp310 - arch: x86_64 - - os: ubuntu-latest - python: cp311 - arch: x86_64 - - os: ubuntu-latest - python: cp312 - arch: x86_64 - - # macOS builds (x86_64 only) - - os: macos-13 - python: cp38 - arch: x86_64 - - os: macos-13 - python: cp39 - arch: x86_64 - - os: macos-13 - python: cp310 - arch: x86_64 - - os: macos-13 - python: cp311 - arch: x86_64 - os: macos-13 - python: cp312 - arch: x86_64 + python-version: "3.12" + target: arm64 steps: - - uses: actions/checkout@v4 + - name: Check out repository + uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: actions/setup-python@v5 + - name: Set up python ${{ matrix.python-version }} + uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: ${{ matrix.python-version }} - # Windows-specific setup - - name: Setup Visual Studio (Windows) - if: runner.os == 'Windows' - uses: ilammy/msvc-dev-cmd@v1 - with: - arch: x64 + - name: Install poetry + uses: snok/install-poetry@v1 - # Linux-specific setup - - name: Setup Linux - if: runner.os == 'Linux' + - name: Install dependencies run: | - sudo apt-get update - sudo apt-get install -y build-essential python3-dev patchelf + poetry self add "poetry-dynamic-versioning[plugin]" + poetry install --only main - - uses: snok/install-poetry@v1 - with: - version: 1.8.5 - virtualenvs-create: false - - - name: Build wheels - uses: pypa/cibuildwheel@v2.16.5 - env: - CIBW_BUILD: ${{ matrix.python }}-* - CIBW_ARCHS: ${{ matrix.arch }} - CIBW_TEST_REQUIRES: pytest pandas - CIBW_TEST_COMMAND: | - python -c "import sys; print('Python:', sys.executable, sys.version)" - python -c "import platform; print('Platform:', platform.machine(), platform.architecture())" - python -c "import os; print('PATH:', os.environ.get('PATH'))" - python -c "import glob; print('SO files:', glob.glob('**/*.so', recursive=True))" - python -c "import newtype; print('newtype location:', newtype.__file__)" - python -c "from newtype.extensions import newtypeinit; print('newtypeinit exists')" - python -c "from newtype.extensions import newtypemethod; print('newtypemethod exists')" - pytest {package}/tests -v - CIBW_BUILD_VERBOSITY: 1 - CIBW_BEFORE_BUILD: | - python -m pip install --upgrade pip - python -m pip install setuptools wheel poetry-core - # Common environment variables - CIBW_ENVIRONMENT: >- - PYTHONVERBOSE=1 - SETUPTOOLS_USE_DISTUTILS=stdlib - # OS-specific environment variables - CIBW_ENVIRONMENT_WINDOWS: >- - DISTUTILS_USE_SDK=1 - MSSdk=1 - CIBW_ENVIRONMENT_MACOS: >- - MACOSX_DEPLOYMENT_TARGET=10.14 - ARCHFLAGS="-arch x86_64" - CIBW_ENVIRONMENT_LINUX: >- - CFLAGS="-fPIC" - _PYTHON_HOST_PLATFORM="linux-x86_64" + - name: Build wheel + run: poetry build --format=wheel - - uses: actions/upload-artifact@v4 + - name: Setup test environment + run: | + python -m pip install --upgrade pip + python -m pip install pytest pandas + python -m pip install dist/*.whl + + - name: Run tests + run: | + cd tests + python -m pytest + + - name: Upload wheel + uses: actions/upload-artifact@v4 with: - name: wheel-${{ matrix.os }}-${{ matrix.python }}-${{ matrix.arch }} - path: wheelhouse/*.whl + name: wheels-${{ matrix.os }}-py${{ matrix.python-version }}${{ matrix.target && format('-{0}', matrix.target) || '' }} + path: dist/*.whl - upload_pypi: - needs: [build_sdist, build_wheels] - runs-on: ubuntu-latest + upload_to_pypi: if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/v') + needs: ["build_sdist", "build_wheels"] + runs-on: ubuntu-latest steps: - uses: actions/download-artifact@v4 with: - path: dist - pattern: wheel-* + path: wheels + pattern: wheels-* merge-multiple: true - - uses: actions/download-artifact@v4 - with: - path: dist - name: sdist + - uses: pypa/gh-action-pypi-publish@release/v1 with: password: ${{ secrets.PYPI_TOKEN }} - packages_dir: dist/ + packages_dir: wheels/ skip_existing: true From f0ef2b271e3c6d4d783d9c3db0324ffedec115a0 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 9 Jan 2025 17:14:46 +0100 Subject: [PATCH 16/18] simply the build_wheels.yaml --- .github/workflows/build_wheels.yaml | 72 +++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build_wheels.yaml b/.github/workflows/build_wheels.yaml index 7afcfae..9b54fad 100644 --- a/.github/workflows/build_wheels.yaml +++ b/.github/workflows/build_wheels.yaml @@ -28,6 +28,8 @@ jobs: - name: Install poetry uses: snok/install-poetry@v1 + with: + version: 1.8.5 - name: Build sdist run: | @@ -40,17 +42,47 @@ jobs: path: dist/*.tar.gz build_wheels: - name: "${{ matrix.os }} py${{ matrix.python-version }}" + name: "${{ matrix.os }} ${{ matrix.arch }} py${{ matrix.python-version }}" runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-latest] + os: [ubuntu-20.04, windows-latest, macos-11, macos-13] python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] - include: + arch: [x86_64, x86, arm64, aarch64, ppc64le, s390x] + exclude: + # Windows exclusions + - os: windows-latest + arch: aarch64 + - os: windows-latest + arch: ppc64le + - os: windows-latest + arch: s390x + - os: windows-latest + python-version: "3.8" + arch: arm64 + # macOS exclusions + - os: macos-11 + arch: x86 + - os: macos-11 + arch: aarch64 + - os: macos-11 + arch: ppc64le + - os: macos-11 + arch: s390x + - os: macos-13 + arch: x86 + - os: macos-13 + arch: aarch64 + - os: macos-13 + arch: ppc64le - os: macos-13 - python-version: "3.12" - target: arm64 + arch: s390x + # Ubuntu exclusions + - os: ubuntu-20.04 + arch: arm64 + - os: ubuntu-20.04 + arch: x86 steps: - name: Check out repository @@ -58,6 +90,12 @@ jobs: with: fetch-depth: 0 + - name: Set up QEMU + if: runner.os == 'Linux' && matrix.arch != 'x86_64' + uses: docker/setup-qemu-action@v3 + with: + platforms: all + - name: Set up python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: @@ -65,6 +103,8 @@ jobs: - name: Install poetry uses: snok/install-poetry@v1 + with: + version: 1.8.5 - name: Install dependencies run: | @@ -72,23 +112,37 @@ jobs: poetry install --only main - name: Build wheel + env: + CIBW_ARCHS: ${{ matrix.arch }} run: poetry build --format=wheel - - name: Setup test environment + - name: Setup clean test environment + shell: bash run: | + python -m venv venv + if [ "${{ runner.os }}" = "Windows" ]; then + source venv/Scripts/activate + else + source venv/bin/activate + fi python -m pip install --upgrade pip python -m pip install pytest pandas python -m pip install dist/*.whl - name: Run tests + shell: bash run: | - cd tests - python -m pytest + if [ "${{ runner.os }}" = "Windows" ]; then + source venv/Scripts/activate + else + source venv/bin/activate + fi + python -m pytest tests/ - name: Upload wheel uses: actions/upload-artifact@v4 with: - name: wheels-${{ matrix.os }}-py${{ matrix.python-version }}${{ matrix.target && format('-{0}', matrix.target) || '' }} + name: wheels-${{ matrix.os }}-${{ matrix.arch }}-py${{ matrix.python-version }} path: dist/*.whl upload_to_pypi: From 519a220bda76d7b5ad4cf3f83f36b1397cf82879 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 9 Jan 2025 17:28:27 +0100 Subject: [PATCH 17/18] simply the build_wheels.yaml --- .github/workflows/build_wheels.yaml | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build_wheels.yaml b/.github/workflows/build_wheels.yaml index 9b54fad..e0deddc 100644 --- a/.github/workflows/build_wheels.yaml +++ b/.github/workflows/build_wheels.yaml @@ -32,6 +32,7 @@ jobs: version: 1.8.5 - name: Build sdist + shell: bash run: | poetry self add "poetry-dynamic-versioning[plugin]" poetry build --format=sdist @@ -47,7 +48,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-20.04, windows-latest, macos-11, macos-13] + os: [ubuntu-latest, windows-latest, macos-latest] python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] arch: [x86_64, x86, arm64, aarch64, ppc64le, s390x] exclude: @@ -62,26 +63,26 @@ jobs: python-version: "3.8" arch: arm64 # macOS exclusions - - os: macos-11 + - os: macos-latest arch: x86 - - os: macos-11 + - os: macos-latest arch: aarch64 - - os: macos-11 + - os: macos-latest arch: ppc64le - - os: macos-11 + - os: macos-latest arch: s390x - - os: macos-13 + - os: macos-latest arch: x86 - - os: macos-13 + - os: macos-latest arch: aarch64 - - os: macos-13 + - os: macos-latest arch: ppc64le - - os: macos-13 + - os: macos-latest arch: s390x # Ubuntu exclusions - - os: ubuntu-20.04 + - os: ubuntu-latest arch: arm64 - - os: ubuntu-20.04 + - os: ubuntu-latest arch: x86 steps: @@ -106,12 +107,18 @@ jobs: with: version: 1.8.5 + - name: Add Poetry to path + shell: bash + run: echo "$HOME/.local/bin" >> $GITHUB_PATH + - name: Install dependencies + shell: bash run: | poetry self add "poetry-dynamic-versioning[plugin]" poetry install --only main - name: Build wheel + shell: bash env: CIBW_ARCHS: ${{ matrix.arch }} run: poetry build --format=wheel From 0b45771ad098921706329f1dde7409469137bb21 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 9 Jan 2025 17:42:53 +0100 Subject: [PATCH 18/18] update to v0.1.3 --- .github/workflows/build_wheels.yaml | 14 ++++---------- pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build_wheels.yaml b/.github/workflows/build_wheels.yaml index e0deddc..392c796 100644 --- a/.github/workflows/build_wheels.yaml +++ b/.github/workflows/build_wheels.yaml @@ -5,7 +5,7 @@ on: pull_request: push: tags: - - "v*.*.*" + - "v*" jobs: build_sdist: @@ -20,6 +20,7 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + fetch-tags: true - name: Set up python 3.12 uses: actions/setup-python@v5 @@ -63,14 +64,6 @@ jobs: python-version: "3.8" arch: arm64 # macOS exclusions - - os: macos-latest - arch: x86 - - os: macos-latest - arch: aarch64 - - os: macos-latest - arch: ppc64le - - os: macos-latest - arch: s390x - os: macos-latest arch: x86 - os: macos-latest @@ -90,6 +83,7 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + fetch-tags: true - name: Set up QEMU if: runner.os == 'Linux' && matrix.arch != 'x86_64' @@ -153,7 +147,7 @@ jobs: path: dist/*.whl upload_to_pypi: - if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/v') + if: startsWith(github.ref, 'refs/tags/v') needs: ["build_sdist", "build_wheels"] runs-on: ubuntu-latest steps: diff --git a/pyproject.toml b/pyproject.toml index d03bb5d..d6edbb8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "poetry_dynamic_versioning.backend" [tool.poetry] name = "python-newtype" -version = "v0.1.2" +version = "0.1.3" homepage = "https://github.com/jymchng/python-newtype-dev" repository = "https://github.com/jymchng/python-newtype-dev" license = "Apache-2.0"