diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f753527..6ecf140 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -11,26 +11,33 @@ jobs: FUNCTION_SCHEMA_FILE_NAME: functionSchema.json runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4.2.2 - - uses: actions/setup-python@v5 + # Step 1: Checkout the repository + - name: Checkout Repository + uses: actions/checkout@v4.2.2 + + # Step 2: Set up Python + - name: Setup Python + uses: actions/setup-python@v5 with: python-version: '3.11' - - name: Install poetry + + # Step 3: Install dependencies using pip + - name: Install Dependencies run: | - pip install poetry==1.8.4 && - poetry config virtualenvs.create false && - poetry config virtualenvs.in-project false && - poetry config installer.parallel true - - name: Restore dependencies - run: poetry install --no-root + python -m pip install --upgrade pip + pip install -r requirements.txt + + # Step 4: Generate the schema - name: Extract functionInputSchema id: extract_schema run: | - python main.py generate_schema ${HOME}/${{ env.FUNCTION_SCHEMA_FILE_NAME }} + python main.py generate_schema "${{ env.FUNCTION_SCHEMA_FILE_NAME }}" + + # Step 5: Build and publish the Speckle function - name: Speckle Automate Function - Build and Publish uses: specklesystems/speckle-automate-github-composite-action@0.9.0 with: - speckle_automate_url: ${{ env.SPECKLE_AUTOMATE_URL || vars.SPECKLE_AUTOMATE_URL || 'https://automate.speckle.dev' }} + speckle_automate_url: ${{ env.SPECKLE_AUTOMATE_URL || 'https://automate.speckle.dev' }} speckle_token: ${{ secrets.SPECKLE_FUNCTION_TOKEN }} speckle_function_id: ${{ secrets.SPECKLE_FUNCTION_ID }} speckle_function_input_schema_file_path: ${{ env.FUNCTION_SCHEMA_FILE_NAME }} diff --git a/.idea/Checker.iml b/.idea/Checker.iml index de5ac07..7d26e2f 100644 --- a/.idea/Checker.iml +++ b/.idea/Checker.iml @@ -1,12 +1,19 @@ - - + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 217df23..379246e 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,7 +1,7 @@ - - + \ No newline at end of file diff --git a/.idea/ruff.xml b/.idea/ruff.xml index 5a28fc5..67c9b85 100644 --- a/.idea/ruff.xml +++ b/.idea/ruff.xml @@ -1,7 +1,9 @@ + \ No newline at end of file diff --git a/.idea/webResources.xml b/.idea/webResources.xml new file mode 100644 index 0000000..f752b54 --- /dev/null +++ b/.idea/webResources.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..e4fba21 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.12 diff --git a/DEVELOPER_README.md b/DEVELOPER_README.md index 2e28c90..6ceae07 100644 --- a/DEVELOPER_README.md +++ b/DEVELOPER_README.md @@ -3,11 +3,13 @@ ## Setup 1. Install dependencies: + ```bash poetry shell && poetry install ``` 2. Configure `.env`: + ``` SPECKLE_TOKEN=your_speckle_token SPECKLE_SERVER_URL=app.speckle.systems @@ -32,7 +34,7 @@ poetry run pytest ## Extending Rules 1. Add new predicate to `input_predicate_mapping` in `rules.py` -2. Create corresponding method in `RevitRules` class +2. Create corresponding method in `PropertyRules` class 3. Update tests ## Building diff --git a/example.function_inputs.json b/example.function_inputs.json deleted file mode 100644 index 71f3160..0000000 --- a/example.function_inputs.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "speckleToken": "YOUR SPEKCLE TOKEN", - "functionInputs": { - "whisperMessage": "you are doing something weird", - "forbiddenSpeckleType": "wall" - }, - "automationRunData": { - "project_id": "project id", - "speckle_server_url": "https://latest.speckle.systems", - "automation_id": "automation id", - "automation_run_id": "automation run id", - "function_run_id": "function run id", - "triggers": [ - { - "payload": { "modelId": "model id", "versionId": "version id" }, - "triggerType": "versionCreation" - } - ] - } -} diff --git a/flatten.py b/flatten.py deleted file mode 100644 index 574c118..0000000 --- a/flatten.py +++ /dev/null @@ -1,27 +0,0 @@ -"""Helper module for a simple speckle object tree flattening.""" - -from collections.abc import Iterable - -from specklepy.objects import Base - - -def flatten_base(base: Base) -> Iterable[Base]: - """Flatten a base object into an iterable of bases. - - This function recursively traverses the `elements` or `@elements` attribute of the - base object, yielding each nested base object. - - Args: - base (Base): The base object to flatten. - - Yields: - Base: Each nested base object in the hierarchy. - """ - # Attempt to get the elements attribute, fallback to @elements if necessary - elements = getattr(base, "elements", getattr(base, "@elements", None)) - - if elements is not None: - for element in elements: - yield from flatten_base(element) - - yield base diff --git a/hooks/pre-commit b/hooks/pre-commit new file mode 100644 index 0000000..efdb38a --- /dev/null +++ b/hooks/pre-commit @@ -0,0 +1,13 @@ +#!/bin/bash +echo "Running pre-commit hook..." + +# Ensure dependencies are installed with uv +uv pip install --requirement requirements.txt + +# Export dependencies with uv (and overwrite requirements.txt) +uv pip freeze > requirements.txt + +# Add generated requirements.txt to git +git add requirements.txt + +echo "Pre-commit hook completed successfully!" diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index d038864..0000000 --- a/poetry.lock +++ /dev/null @@ -1,1797 +0,0 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. - -[[package]] -name = "annotated-types" -version = "0.7.0" -description = "Reusable constraint types to use with typing.Annotated" -optional = false -python-versions = ">=3.8" -files = [ - {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, - {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, -] - -[[package]] -name = "anyio" -version = "4.8.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.9" -files = [ - {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"}, - {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"}, -] - -[package.dependencies] -idna = ">=2.8" -sniffio = ">=1.1" -typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} - -[package.extras] -doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] -trio = ["trio (>=0.26.1)"] - -[[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -optional = false -python-versions = "*" -files = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] - -[[package]] -name = "attrs" -version = "23.2.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.7" -files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, -] - -[package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] - -[[package]] -name = "backoff" -version = "2.2.1" -description = "Function decoration for backoff and retry" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, - {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, -] - -[[package]] -name = "black" -version = "25.1.0" -description = "The uncompromising code formatter." -optional = false -python-versions = ">=3.9" -files = [ - {file = "black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32"}, - {file = "black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da"}, - {file = "black-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7"}, - {file = "black-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9"}, - {file = "black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0"}, - {file = "black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299"}, - {file = "black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096"}, - {file = "black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2"}, - {file = "black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b"}, - {file = "black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc"}, - {file = "black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f"}, - {file = "black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba"}, - {file = "black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f"}, - {file = "black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3"}, - {file = "black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171"}, - {file = "black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18"}, - {file = "black-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0"}, - {file = "black-25.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f"}, - {file = "black-25.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e"}, - {file = "black-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355"}, - {file = "black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717"}, - {file = "black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666"}, -] - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.10)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "certifi" -version = "2025.1.31" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -files = [ - {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, - {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, -] - -[[package]] -name = "charset-normalizer" -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" -files = [ - {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.8" -description = "Composable command line interface toolkit" -optional = false -python-versions = ">=3.7" -files = [ - {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, - {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "deprecated" -version = "1.2.18" -description = "Python @deprecated decorator to deprecate old python classes, functions or methods." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -files = [ - {file = "Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec"}, - {file = "deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d"}, -] - -[package.dependencies] -wrapt = ">=1.10,<2" - -[package.extras] -dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "setuptools", "tox"] - -[[package]] -name = "gql" -version = "3.5.0" -description = "GraphQL client for Python" -optional = false -python-versions = "*" -files = [ - {file = "gql-3.5.0-py2.py3-none-any.whl", hash = "sha256:70dda5694a5b194a8441f077aa5fb70cc94e4ec08016117523f013680901ecb7"}, - {file = "gql-3.5.0.tar.gz", hash = "sha256:ccb9c5db543682b28f577069950488218ed65d4ac70bb03b6929aaadaf636de9"}, -] - -[package.dependencies] -anyio = ">=3.0,<5" -backoff = ">=1.11.1,<3.0" -graphql-core = ">=3.2,<3.3" -requests = {version = ">=2.26,<3", optional = true, markers = "extra == \"requests\""} -requests-toolbelt = {version = ">=1.0.0,<2", optional = true, markers = "extra == \"requests\""} -websockets = {version = ">=10,<12", optional = true, markers = "extra == \"websockets\""} -yarl = ">=1.6,<2.0" - -[package.extras] -aiohttp = ["aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)"] -all = ["aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)", "botocore (>=1.21,<2)", "httpx (>=0.23.1,<1)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "websockets (>=10,<12)"] -botocore = ["botocore (>=1.21,<2)"] -dev = ["aiofiles", "aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)", "black (==22.3.0)", "botocore (>=1.21,<2)", "check-manifest (>=0.42,<1)", "flake8 (==3.8.1)", "httpx (>=0.23.1,<1)", "isort (==4.3.21)", "mock (==4.0.2)", "mypy (==0.910)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "sphinx (>=5.3.0,<6)", "sphinx-argparse (==0.2.5)", "sphinx-rtd-theme (>=0.4,<1)", "types-aiofiles", "types-mock", "types-requests", "vcrpy (==4.4.0)", "websockets (>=10,<12)"] -httpx = ["httpx (>=0.23.1,<1)"] -requests = ["requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)"] -test = ["aiofiles", "aiohttp (>=3.8.0,<4)", "aiohttp (>=3.9.0b0,<4)", "botocore (>=1.21,<2)", "httpx (>=0.23.1,<1)", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "requests (>=2.26,<3)", "requests-toolbelt (>=1.0.0,<2)", "vcrpy (==4.4.0)", "websockets (>=10,<12)"] -test-no-transport = ["aiofiles", "mock (==4.0.2)", "parse (==1.15.0)", "pytest (==7.4.2)", "pytest-asyncio (==0.21.1)", "pytest-console-scripts (==1.3.1)", "pytest-cov (==3.0.0)", "vcrpy (==4.4.0)"] -websockets = ["websockets (>=10,<12)"] - -[[package]] -name = "graphql-core" -version = "3.2.6" -description = "GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL." -optional = false -python-versions = "<4,>=3.6" -files = [ - {file = "graphql_core-3.2.6-py3-none-any.whl", hash = "sha256:78b016718c161a6fb20a7d97bbf107f331cd1afe53e45566c59f776ed7f0b45f"}, - {file = "graphql_core-3.2.6.tar.gz", hash = "sha256:c08eec22f9e40f0bd61d805907e3b3b1b9a320bc606e23dc145eebca07c8fbab"}, -] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "httpcore" -version = "1.0.7" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, - {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, -] - -[package.dependencies] -certifi = "*" -h11 = ">=0.13,<0.15" - -[package.extras] -asyncio = ["anyio (>=4.0,<5.0)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<1.0)"] - -[[package]] -name = "httpx" -version = "0.25.2" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpx-0.25.2-py3-none-any.whl", hash = "sha256:a05d3d052d9b2dfce0e3896636467f8a5342fb2b902c819428e1ac65413ca118"}, - {file = "httpx-0.25.2.tar.gz", hash = "sha256:8b8fcaa0c8ea7b05edd69a094e63a2094c4efcb48129fb757361bc423c0ad9e8"}, -] - -[package.dependencies] -anyio = "*" -certifi = "*" -httpcore = "==1.*" -idna = "*" -sniffio = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] - -[[package]] -name = "idna" -version = "3.10" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.6" -files = [ - {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, - {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, -] - -[package.extras] -all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] - -[[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - -[[package]] -name = "levenshtein" -version = "0.26.1" -description = "Python extension for computing string edit distances and similarities." -optional = false -python-versions = ">=3.9" -files = [ - {file = "levenshtein-0.26.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8dc4a4aecad538d944a1264c12769c99e3c0bf8e741fc5e454cc954913befb2e"}, - {file = "levenshtein-0.26.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec108f368c12b25787c8b1a4537a1452bc53861c3ee4abc810cc74098278edcd"}, - {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69229d651c97ed5b55b7ce92481ed00635cdbb80fbfb282a22636e6945dc52d5"}, - {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79dcd157046d62482a7719b08ba9e3ce9ed3fc5b015af8ea989c734c702aedd4"}, - {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f53f9173ae21b650b4ed8aef1d0ad0c37821f367c221a982f4d2922b3044e0d"}, - {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3956f3c5c229257dbeabe0b6aacd2c083ebcc1e335842a6ff2217fe6cc03b6b"}, - {file = "levenshtein-0.26.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1e83af732726987d2c4cd736f415dae8b966ba17b7a2239c8b7ffe70bfb5543"}, - {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4f052c55046c2a9c9b5f742f39e02fa6e8db8039048b8c1c9e9fdd27c8a240a1"}, - {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9895b3a98f6709e293615fde0dcd1bb0982364278fa2072361a1a31b3e388b7a"}, - {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a3777de1d8bfca054465229beed23994f926311ce666f5a392c8859bb2722f16"}, - {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:81c57e1135c38c5e6e3675b5e2077d8a8d3be32bf0a46c57276c092b1dffc697"}, - {file = "levenshtein-0.26.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:91d5e7d984891df3eff7ea9fec8cf06fdfacc03cd074fd1a410435706f73b079"}, - {file = "levenshtein-0.26.1-cp310-cp310-win32.whl", hash = "sha256:f48abff54054b4142ad03b323e80aa89b1d15cabc48ff49eb7a6ff7621829a56"}, - {file = "levenshtein-0.26.1-cp310-cp310-win_amd64.whl", hash = "sha256:79dd6ad799784ea7b23edd56e3bf94b3ca866c4c6dee845658ee75bb4aefdabf"}, - {file = "levenshtein-0.26.1-cp310-cp310-win_arm64.whl", hash = "sha256:3351ddb105ef010cc2ce474894c5d213c83dddb7abb96400beaa4926b0b745bd"}, - {file = "levenshtein-0.26.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:44c51f5d33b3cfb9db518b36f1288437a509edd82da94c4400f6a681758e0cb6"}, - {file = "levenshtein-0.26.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56b93203e725f9df660e2afe3d26ba07d71871b6d6e05b8b767e688e23dfb076"}, - {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:270d36c5da04a0d89990660aea8542227cbd8f5bc34e9fdfadd34916ff904520"}, - {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:480674c05077eeb0b0f748546d4fcbb386d7c737f9fff0010400da3e8b552942"}, - {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13946e37323728695ba7a22f3345c2e907d23f4600bc700bf9b4352fb0c72a48"}, - {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ceb673f572d1d0dc9b1cd75792bb8bad2ae8eb78a7c6721e23a3867d318cb6f2"}, - {file = "levenshtein-0.26.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42d6fa242e3b310ce6bfd5af0c83e65ef10b608b885b3bb69863c01fb2fcff98"}, - {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b8b68295808893a81e0a1dbc2274c30dd90880f14d23078e8eb4325ee615fc68"}, - {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b01061d377d1944eb67bc40bef5d4d2f762c6ab01598efd9297ce5d0047eb1b5"}, - {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9d12c8390f156745e533d01b30773b9753e41d8bbf8bf9dac4b97628cdf16314"}, - {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:48825c9f967f922061329d1481b70e9fee937fc68322d6979bc623f69f75bc91"}, - {file = "levenshtein-0.26.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d8ec137170b95736842f99c0e7a9fd8f5641d0c1b63b08ce027198545d983e2b"}, - {file = "levenshtein-0.26.1-cp311-cp311-win32.whl", hash = "sha256:798f2b525a2e90562f1ba9da21010dde0d73730e277acaa5c52d2a6364fd3e2a"}, - {file = "levenshtein-0.26.1-cp311-cp311-win_amd64.whl", hash = "sha256:55b1024516c59df55f1cf1a8651659a568f2c5929d863d3da1ce8893753153bd"}, - {file = "levenshtein-0.26.1-cp311-cp311-win_arm64.whl", hash = "sha256:e52575cbc6b9764ea138a6f82d73d3b1bc685fe62e207ff46a963d4c773799f6"}, - {file = "levenshtein-0.26.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cc741ca406d3704dc331a69c04b061fc952509a069b79cab8287413f434684bd"}, - {file = "levenshtein-0.26.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:821ace3b4e1c2e02b43cf5dc61aac2ea43bdb39837ac890919c225a2c3f2fea4"}, - {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92694c9396f55d4c91087efacf81297bef152893806fc54c289fc0254b45384"}, - {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51ba374de7a1797d04a14a4f0ad3602d2d71fef4206bb20a6baaa6b6a502da58"}, - {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7aa5c3327dda4ef952769bacec09c09ff5bf426e07fdc94478c37955681885b"}, - {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33e2517e8d3c221de2d1183f400aed64211fcfc77077b291ed9f3bb64f141cdc"}, - {file = "levenshtein-0.26.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9092b622765c7649dd1d8af0f43354723dd6f4e570ac079ffd90b41033957438"}, - {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fc16796c85d7d8b259881d59cc8b5e22e940901928c2ff6924b2c967924e8a0b"}, - {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4370733967f5994ceeed8dc211089bedd45832ee688cecea17bfd35a9eb22b9"}, - {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3535ecfd88c9b283976b5bc61265855f59bba361881e92ed2b5367b6990c93fe"}, - {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:90236e93d98bdfd708883a6767826fafd976dac8af8fc4a0fb423d4fa08e1bf0"}, - {file = "levenshtein-0.26.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:04b7cabb82edf566b1579b3ed60aac0eec116655af75a3c551fee8754ffce2ea"}, - {file = "levenshtein-0.26.1-cp312-cp312-win32.whl", hash = "sha256:ae382af8c76f6d2a040c0d9ca978baf461702ceb3f79a0a3f6da8d596a484c5b"}, - {file = "levenshtein-0.26.1-cp312-cp312-win_amd64.whl", hash = "sha256:fd091209798cfdce53746f5769987b4108fe941c54fb2e058c016ffc47872918"}, - {file = "levenshtein-0.26.1-cp312-cp312-win_arm64.whl", hash = "sha256:7e82f2ea44a81ad6b30d92a110e04cd3c8c7c6034b629aca30a3067fa174ae89"}, - {file = "levenshtein-0.26.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:790374a9f5d2cbdb30ee780403a62e59bef51453ac020668c1564d1e43438f0e"}, - {file = "levenshtein-0.26.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7b05c0415c386d00efda83d48db9db68edd02878d6dbc6df01194f12062be1bb"}, - {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3114586032361722ddededf28401ce5baf1cf617f9f49fb86b8766a45a423ff"}, - {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2532f8a13b68bf09f152d906f118a88da2063da22f44c90e904b142b0a53d534"}, - {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:219c30be6aa734bf927188d1208b7d78d202a3eb017b1c5f01ab2034d2d4ccca"}, - {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397e245e77f87836308bd56305bba630010cd8298c34c4c44bd94990cdb3b7b1"}, - {file = "levenshtein-0.26.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeff6ea3576f72e26901544c6c55c72a7b79b9983b6f913cba0e9edbf2f87a97"}, - {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a19862e3539a697df722a08793994e334cd12791e8144851e8a1dee95a17ff63"}, - {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:dc3b5a64f57c3c078d58b1e447f7d68cad7ae1b23abe689215d03fc434f8f176"}, - {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bb6c7347424a91317c5e1b68041677e4c8ed3e7823b5bbaedb95bffb3c3497ea"}, - {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b817376de4195a207cc0e4ca37754c0e1e1078c2a2d35a6ae502afde87212f9e"}, - {file = "levenshtein-0.26.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7b50c3620ff47c9887debbb4c154aaaac3e46be7fc2e5789ee8dbe128bce6a17"}, - {file = "levenshtein-0.26.1-cp313-cp313-win32.whl", hash = "sha256:9fb859da90262eb474c190b3ca1e61dee83add022c676520f5c05fdd60df902a"}, - {file = "levenshtein-0.26.1-cp313-cp313-win_amd64.whl", hash = "sha256:8adcc90e3a5bfb0a463581d85e599d950fe3c2938ac6247b29388b64997f6e2d"}, - {file = "levenshtein-0.26.1-cp313-cp313-win_arm64.whl", hash = "sha256:c2599407e029865dc66d210b8804c7768cbdbf60f061d993bb488d5242b0b73e"}, - {file = "levenshtein-0.26.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc54ced948fc3feafce8ad4ba4239d8ffc733a0d70e40c0363ac2a7ab2b7251e"}, - {file = "levenshtein-0.26.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e6516f69213ae393a220e904332f1a6bfc299ba22cf27a6520a1663a08eba0fb"}, - {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4cfea4eada1746d0c75a864bc7e9e63d4a6e987c852d6cec8d9cb0c83afe25b"}, - {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a323161dfeeac6800eb13cfe76a8194aec589cd948bcf1cdc03f66cc3ec26b72"}, - {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c23e749b68ebc9a20b9047317b5cd2053b5856315bc8636037a8adcbb98bed1"}, - {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f80dd7432d4b6cf493d012d22148db7af769017deb31273e43406b1fb7f091c"}, - {file = "levenshtein-0.26.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ae7cd6e4312c6ef34b2e273836d18f9fff518d84d823feff5ad7c49668256e0"}, - {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dcdad740e841d791b805421c2b20e859b4ed556396d3063b3aa64cd055be648c"}, - {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e07afb1613d6f5fd99abd4e53ad3b446b4efaa0f0d8e9dfb1d6d1b9f3f884d32"}, - {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:f1add8f1d83099a98ae4ac472d896b7e36db48c39d3db25adf12b373823cdeff"}, - {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:1010814b1d7a60833a951f2756dfc5c10b61d09976ce96a0edae8fecdfb0ea7c"}, - {file = "levenshtein-0.26.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:33fa329d1bb65ce85e83ceda281aea31cee9f2f6e167092cea54f922080bcc66"}, - {file = "levenshtein-0.26.1-cp39-cp39-win32.whl", hash = "sha256:488a945312f2f16460ab61df5b4beb1ea2254c521668fd142ce6298006296c98"}, - {file = "levenshtein-0.26.1-cp39-cp39-win_amd64.whl", hash = "sha256:9f942104adfddd4b336c3997050121328c39479f69de702d7d144abb69ea7ab9"}, - {file = "levenshtein-0.26.1-cp39-cp39-win_arm64.whl", hash = "sha256:c1d8f85b2672939f85086ed75effcf768f6077516a3e299c2ba1f91bc4644c22"}, - {file = "levenshtein-0.26.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6cf8f1efaf90ca585640c5d418c30b7d66d9ac215cee114593957161f63acde0"}, - {file = "levenshtein-0.26.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d5b2953978b8c158dd5cd93af8216a5cfddbf9de66cf5481c2955f44bb20767a"}, - {file = "levenshtein-0.26.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b952b3732c4631c49917d4b15d78cb4a2aa006c1d5c12e2a23ba8e18a307a055"}, - {file = "levenshtein-0.26.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07227281e12071168e6ae59238918a56d2a0682e529f747b5431664f302c0b42"}, - {file = "levenshtein-0.26.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8191241cd8934feaf4d05d0cc0e5e72877cbb17c53bbf8c92af9f1aedaa247e9"}, - {file = "levenshtein-0.26.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9e70d7ee157a9b698c73014f6e2b160830e7d2d64d2e342fefc3079af3c356fc"}, - {file = "levenshtein-0.26.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0eb3059f826f6cb0a5bca4a85928070f01e8202e7ccafcba94453470f83e49d4"}, - {file = "levenshtein-0.26.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:6c389e44da12d6fb1d7ba0a709a32a96c9391e9be4160ccb9269f37e040599ee"}, - {file = "levenshtein-0.26.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e9de292f2c51a7d34a0ae23bec05391b8f61f35781cd3e4c6d0533e06250c55"}, - {file = "levenshtein-0.26.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d87215113259efdca8716e53b6d59ab6d6009e119d95d45eccc083148855f33"}, - {file = "levenshtein-0.26.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f00a3eebf68a82fb651d8d0e810c10bfaa60c555d21dde3ff81350c74fb4c2"}, - {file = "levenshtein-0.26.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b3554c1b59de63d05075577380340c185ff41b028e541c0888fddab3c259a2b4"}, - {file = "levenshtein-0.26.1.tar.gz", hash = "sha256:0d19ba22330d50609b2349021ec3cf7d905c6fe21195a2d0d876a146e7ed2575"}, -] - -[package.dependencies] -rapidfuzz = ">=3.9.0,<4.0.0" - -[[package]] -name = "more-itertools" -version = "10.6.0" -description = "More routines for operating on iterables, beyond itertools" -optional = false -python-versions = ">=3.9" -files = [ - {file = "more-itertools-10.6.0.tar.gz", hash = "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b"}, - {file = "more_itertools-10.6.0-py3-none-any.whl", hash = "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89"}, -] - -[[package]] -name = "multidict" -version = "6.1.0" -description = "multidict implementation" -optional = false -python-versions = ">=3.8" -files = [ - {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, - {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, - {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, - {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, - {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, - {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, - {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, - {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, - {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, - {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, - {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, - {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, - {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, - {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, - {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, - {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, - {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, - {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, - {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, - {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, - {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, - {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, - {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, - {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, - {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, - {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, - {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, - {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, - {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, - {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, - {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, - {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, - {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, - {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, - {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, - {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, - {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, - {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, - {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, - {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, - {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, - {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, - {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, - {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, -] - -[[package]] -name = "mypy" -version = "1.15.0" -description = "Optional static typing for Python" -optional = false -python-versions = ">=3.9" -files = [ - {file = "mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13"}, - {file = "mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559"}, - {file = "mypy-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be68172e9fd9ad8fb876c6389f16d1c1b5f100ffa779f77b1fb2176fcc9ab95b"}, - {file = "mypy-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7be1e46525adfa0d97681432ee9fcd61a3964c2446795714699a998d193f1a3"}, - {file = "mypy-1.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2e2c2e6d3593f6451b18588848e66260ff62ccca522dd231cd4dd59b0160668b"}, - {file = "mypy-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:6983aae8b2f653e098edb77f893f7b6aca69f6cffb19b2cc7443f23cce5f4828"}, - {file = "mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f"}, - {file = "mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5"}, - {file = "mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e"}, - {file = "mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c"}, - {file = "mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f"}, - {file = "mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f"}, - {file = "mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd"}, - {file = "mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f"}, - {file = "mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464"}, - {file = "mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee"}, - {file = "mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e"}, - {file = "mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22"}, - {file = "mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445"}, - {file = "mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d"}, - {file = "mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5"}, - {file = "mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036"}, - {file = "mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357"}, - {file = "mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf"}, - {file = "mypy-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e601a7fa172c2131bff456bb3ee08a88360760d0d2f8cbd7a75a65497e2df078"}, - {file = "mypy-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:712e962a6357634fef20412699a3655c610110e01cdaa6180acec7fc9f8513ba"}, - {file = "mypy-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95579473af29ab73a10bada2f9722856792a36ec5af5399b653aa28360290a5"}, - {file = "mypy-1.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f8722560a14cde92fdb1e31597760dc35f9f5524cce17836c0d22841830fd5b"}, - {file = "mypy-1.15.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fbb8da62dc352133d7d7ca90ed2fb0e9d42bb1a32724c287d3c76c58cbaa9c2"}, - {file = "mypy-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:d10d994b41fb3497719bbf866f227b3489048ea4bbbb5015357db306249f7980"}, - {file = "mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e"}, - {file = "mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43"}, -] - -[package.dependencies] -mypy_extensions = ">=1.0.0" -typing_extensions = ">=4.6.0" - -[package.extras] -dmypy = ["psutil (>=4.0)"] -faster-cache = ["orjson"] -install-types = ["pip"] -mypyc = ["setuptools (>=50)"] -reports = ["lxml"] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - -[[package]] -name = "numpy" -version = "2.2.2" -description = "Fundamental package for array computing in Python" -optional = false -python-versions = ">=3.10" -files = [ - {file = "numpy-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7079129b64cb78bdc8d611d1fd7e8002c0a2565da6a47c4df8062349fee90e3e"}, - {file = "numpy-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ec6c689c61df613b783aeb21f945c4cbe6c51c28cb70aae8430577ab39f163e"}, - {file = "numpy-2.2.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:40c7ff5da22cd391944a28c6a9c638a5eef77fcf71d6e3a79e1d9d9e82752715"}, - {file = "numpy-2.2.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:995f9e8181723852ca458e22de5d9b7d3ba4da3f11cc1cb113f093b271d7965a"}, - {file = "numpy-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78ea78450fd96a498f50ee096f69c75379af5138f7881a51355ab0e11286c97"}, - {file = "numpy-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fbe72d347fbc59f94124125e73fc4976a06927ebc503ec5afbfb35f193cd957"}, - {file = "numpy-2.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8e6da5cffbbe571f93588f562ed130ea63ee206d12851b60819512dd3e1ba50d"}, - {file = "numpy-2.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:09d6a2032faf25e8d0cadde7fd6145118ac55d2740132c1d845f98721b5ebcfd"}, - {file = "numpy-2.2.2-cp310-cp310-win32.whl", hash = "sha256:159ff6ee4c4a36a23fe01b7c3d07bd8c14cc433d9720f977fcd52c13c0098160"}, - {file = "numpy-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:64bd6e1762cd7f0986a740fee4dff927b9ec2c5e4d9a28d056eb17d332158014"}, - {file = "numpy-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:642199e98af1bd2b6aeb8ecf726972d238c9877b0f6e8221ee5ab945ec8a2189"}, - {file = "numpy-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6d9fc9d812c81e6168b6d405bf00b8d6739a7f72ef22a9214c4241e0dc70b323"}, - {file = "numpy-2.2.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:c7d1fd447e33ee20c1f33f2c8e6634211124a9aabde3c617687d8b739aa69eac"}, - {file = "numpy-2.2.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:451e854cfae0febe723077bd0cf0a4302a5d84ff25f0bfece8f29206c7bed02e"}, - {file = "numpy-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd249bc894af67cbd8bad2c22e7cbcd46cf87ddfca1f1289d1e7e54868cc785c"}, - {file = "numpy-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02935e2c3c0c6cbe9c7955a8efa8908dd4221d7755644c59d1bba28b94fd334f"}, - {file = "numpy-2.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a972cec723e0563aa0823ee2ab1df0cb196ed0778f173b381c871a03719d4826"}, - {file = "numpy-2.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d6d6a0910c3b4368d89dde073e630882cdb266755565155bc33520283b2d9df8"}, - {file = "numpy-2.2.2-cp311-cp311-win32.whl", hash = "sha256:860fd59990c37c3ef913c3ae390b3929d005243acca1a86facb0773e2d8d9e50"}, - {file = "numpy-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:da1eeb460ecce8d5b8608826595c777728cdf28ce7b5a5a8c8ac8d949beadcf2"}, - {file = "numpy-2.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ac9bea18d6d58a995fac1b2cb4488e17eceeac413af014b1dd26170b766d8467"}, - {file = "numpy-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23ae9f0c2d889b7b2d88a3791f6c09e2ef827c2446f1c4a3e3e76328ee4afd9a"}, - {file = "numpy-2.2.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3074634ea4d6df66be04f6728ee1d173cfded75d002c75fac79503a880bf3825"}, - {file = "numpy-2.2.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ec0636d3f7d68520afc6ac2dc4b8341ddb725039de042faf0e311599f54eb37"}, - {file = "numpy-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ffbb1acd69fdf8e89dd60ef6182ca90a743620957afb7066385a7bbe88dc748"}, - {file = "numpy-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0349b025e15ea9d05c3d63f9657707a4e1d471128a3b1d876c095f328f8ff7f0"}, - {file = "numpy-2.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:463247edcee4a5537841d5350bc87fe8e92d7dd0e8c71c995d2c6eecb8208278"}, - {file = "numpy-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9dd47ff0cb2a656ad69c38da850df3454da88ee9a6fde0ba79acceee0e79daba"}, - {file = "numpy-2.2.2-cp312-cp312-win32.whl", hash = "sha256:4525b88c11906d5ab1b0ec1f290996c0020dd318af8b49acaa46f198b1ffc283"}, - {file = "numpy-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:5acea83b801e98541619af398cc0109ff48016955cc0818f478ee9ef1c5c3dcb"}, - {file = "numpy-2.2.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b208cfd4f5fe34e1535c08983a1a6803fdbc7a1e86cf13dd0c61de0b51a0aadc"}, - {file = "numpy-2.2.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d0bbe7dd86dca64854f4b6ce2ea5c60b51e36dfd597300057cf473d3615f2369"}, - {file = "numpy-2.2.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:22ea3bb552ade325530e72a0c557cdf2dea8914d3a5e1fecf58fa5dbcc6f43cd"}, - {file = "numpy-2.2.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:128c41c085cab8a85dc29e66ed88c05613dccf6bc28b3866cd16050a2f5448be"}, - {file = "numpy-2.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:250c16b277e3b809ac20d1f590716597481061b514223c7badb7a0f9993c7f84"}, - {file = "numpy-2.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0c8854b09bc4de7b041148d8550d3bd712b5c21ff6a8ed308085f190235d7ff"}, - {file = "numpy-2.2.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b6fb9c32a91ec32a689ec6410def76443e3c750e7cfc3fb2206b985ffb2b85f0"}, - {file = "numpy-2.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:57b4012e04cc12b78590a334907e01b3a85efb2107df2b8733ff1ed05fce71de"}, - {file = "numpy-2.2.2-cp313-cp313-win32.whl", hash = "sha256:4dbd80e453bd34bd003b16bd802fac70ad76bd463f81f0c518d1245b1c55e3d9"}, - {file = "numpy-2.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:5a8c863ceacae696aff37d1fd636121f1a512117652e5dfb86031c8d84836369"}, - {file = "numpy-2.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b3482cb7b3325faa5f6bc179649406058253d91ceda359c104dac0ad320e1391"}, - {file = "numpy-2.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9491100aba630910489c1d0158034e1c9a6546f0b1340f716d522dc103788e39"}, - {file = "numpy-2.2.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:41184c416143defa34cc8eb9d070b0a5ba4f13a0fa96a709e20584638254b317"}, - {file = "numpy-2.2.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7dca87ca328f5ea7dafc907c5ec100d187911f94825f8700caac0b3f4c384b49"}, - {file = "numpy-2.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bc61b307655d1a7f9f4b043628b9f2b721e80839914ede634e3d485913e1fb2"}, - {file = "numpy-2.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fad446ad0bc886855ddf5909cbf8cb5d0faa637aaa6277fb4b19ade134ab3c7"}, - {file = "numpy-2.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:149d1113ac15005652e8d0d3f6fd599360e1a708a4f98e43c9c77834a28238cb"}, - {file = "numpy-2.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:106397dbbb1896f99e044efc90360d098b3335060375c26aa89c0d8a97c5f648"}, - {file = "numpy-2.2.2-cp313-cp313t-win32.whl", hash = "sha256:0eec19f8af947a61e968d5429f0bd92fec46d92b0008d0a6685b40d6adf8a4f4"}, - {file = "numpy-2.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:97b974d3ba0fb4612b77ed35d7627490e8e3dff56ab41454d9e8b23448940576"}, - {file = "numpy-2.2.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b0531f0b0e07643eb089df4c509d30d72c9ef40defa53e41363eca8a8cc61495"}, - {file = "numpy-2.2.2-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:e9e82dcb3f2ebbc8cb5ce1102d5f1c5ed236bf8a11730fb45ba82e2841ec21df"}, - {file = "numpy-2.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0d4142eb40ca6f94539e4db929410f2a46052a0fe7a2c1c59f6179c39938d2a"}, - {file = "numpy-2.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:356ca982c188acbfa6af0d694284d8cf20e95b1c3d0aefa8929376fea9146f60"}, - {file = "numpy-2.2.2.tar.gz", hash = "sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f"}, -] - -[[package]] -name = "packaging" -version = "24.2" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, - {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, -] - -[[package]] -name = "pandas" -version = "2.2.3" -description = "Powerful data structures for data analysis, time series, and statistics" -optional = false -python-versions = ">=3.9" -files = [ - {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"}, - {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"}, - {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"}, - {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"}, - {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"}, - {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"}, - {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"}, - {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"}, - {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"}, - {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"}, - {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"}, - {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"}, - {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"}, - {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"}, - {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"}, - {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"}, - {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"}, - {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"}, - {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"}, - {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"}, - {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"}, - {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"}, - {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"}, - {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"}, - {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"}, - {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"}, - {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"}, - {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"}, - {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"}, - {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"}, - {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"}, - {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"}, - {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"}, - {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"}, - {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"}, - {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"}, - {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"}, - {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"}, - {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"}, - {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"}, - {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"}, - {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"}, -] - -[package.dependencies] -numpy = [ - {version = ">=1.23.2", markers = "python_version == \"3.11\""}, - {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, -] -python-dateutil = ">=2.8.2" -pytz = ">=2020.1" -tzdata = ">=2022.7" - -[package.extras] -all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] -aws = ["s3fs (>=2022.11.0)"] -clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] -compression = ["zstandard (>=0.19.0)"] -computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] -consortium-standard = ["dataframe-api-compat (>=0.1.7)"] -excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] -feather = ["pyarrow (>=10.0.1)"] -fss = ["fsspec (>=2022.11.0)"] -gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] -hdf5 = ["tables (>=3.8.0)"] -html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] -mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] -output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] -parquet = ["pyarrow (>=10.0.1)"] -performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] -plot = ["matplotlib (>=3.6.3)"] -postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] -pyarrow = ["pyarrow (>=10.0.1)"] -spss = ["pyreadstat (>=1.2.0)"] -sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] -test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] -xml = ["lxml (>=4.9.2)"] - -[[package]] -name = "pathspec" -version = "0.12.1" -description = "Utility library for gitignore style pattern matching of file paths." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, -] - -[[package]] -name = "platformdirs" -version = "4.3.6" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -optional = false -python-versions = ">=3.8" -files = [ - {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, - {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, -] - -[package.extras] -docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] -type = ["mypy (>=1.11.2)"] - -[[package]] -name = "pluggy" -version = "1.5.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, - {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "propcache" -version = "0.2.1" -description = "Accelerated property cache" -optional = false -python-versions = ">=3.9" -files = [ - {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6b3f39a85d671436ee3d12c017f8fdea38509e4f25b28eb25877293c98c243f6"}, - {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d51fbe4285d5db5d92a929e3e21536ea3dd43732c5b177c7ef03f918dff9f2"}, - {file = "propcache-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6445804cf4ec763dc70de65a3b0d9954e868609e83850a47ca4f0cb64bd79fea"}, - {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9479aa06a793c5aeba49ce5c5692ffb51fcd9a7016e017d555d5e2b0045d212"}, - {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9631c5e8b5b3a0fda99cb0d29c18133bca1e18aea9effe55adb3da1adef80d3"}, - {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3156628250f46a0895f1f36e1d4fbe062a1af8718ec3ebeb746f1d23f0c5dc4d"}, - {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b6fb63ae352e13748289f04f37868099e69dba4c2b3e271c46061e82c745634"}, - {file = "propcache-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:887d9b0a65404929641a9fabb6452b07fe4572b269d901d622d8a34a4e9043b2"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a96dc1fa45bd8c407a0af03b2d5218392729e1822b0c32e62c5bf7eeb5fb3958"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a7e65eb5c003a303b94aa2c3852ef130230ec79e349632d030e9571b87c4698c"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:999779addc413181912e984b942fbcc951be1f5b3663cd80b2687758f434c583"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:19a0f89a7bb9d8048d9c4370c9c543c396e894c76be5525f5e1ad287f1750ddf"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1ac2f5fe02fa75f56e1ad473f1175e11f475606ec9bd0be2e78e4734ad575034"}, - {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:574faa3b79e8ebac7cb1d7930f51184ba1ccf69adfdec53a12f319a06030a68b"}, - {file = "propcache-0.2.1-cp310-cp310-win32.whl", hash = "sha256:03ff9d3f665769b2a85e6157ac8b439644f2d7fd17615a82fa55739bc97863f4"}, - {file = "propcache-0.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2d3af2e79991102678f53e0dbf4c35de99b6b8b58f29a27ca0325816364caaba"}, - {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ffc3cca89bb438fb9c95c13fc874012f7b9466b89328c3c8b1aa93cdcfadd16"}, - {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f174bbd484294ed9fdf09437f889f95807e5f229d5d93588d34e92106fbf6717"}, - {file = "propcache-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70693319e0b8fd35dd863e3e29513875eb15c51945bf32519ef52927ca883bc3"}, - {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b480c6a4e1138e1aa137c0079b9b6305ec6dcc1098a8ca5196283e8a49df95a9"}, - {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d27b84d5880f6d8aa9ae3edb253c59d9f6642ffbb2c889b78b60361eed449787"}, - {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:857112b22acd417c40fa4595db2fe28ab900c8c5fe4670c7989b1c0230955465"}, - {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf6c4150f8c0e32d241436526f3c3f9cbd34429492abddbada2ffcff506c51af"}, - {file = "propcache-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d4cfda1d8ed687daa4bc0274fcfd5267873db9a5bc0418c2da19273040eeb7"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2f992c07c0fca81655066705beae35fc95a2fa7366467366db627d9f2ee097f"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:4a571d97dbe66ef38e472703067021b1467025ec85707d57e78711c085984e54"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bb6178c241278d5fe853b3de743087be7f5f4c6f7d6d22a3b524d323eecec505"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ad1af54a62ffe39cf34db1aa6ed1a1873bd548f6401db39d8e7cd060b9211f82"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e7048abd75fe40712005bcfc06bb44b9dfcd8e101dda2ecf2f5aa46115ad07ca"}, - {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:160291c60081f23ee43d44b08a7e5fb76681221a8e10b3139618c5a9a291b84e"}, - {file = "propcache-0.2.1-cp311-cp311-win32.whl", hash = "sha256:819ce3b883b7576ca28da3861c7e1a88afd08cc8c96908e08a3f4dd64a228034"}, - {file = "propcache-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:edc9fc7051e3350643ad929df55c451899bb9ae6d24998a949d2e4c87fb596d3"}, - {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a"}, - {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0"}, - {file = "propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d"}, - {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4"}, - {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d"}, - {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5"}, - {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24"}, - {file = "propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6"}, - {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518"}, - {file = "propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246"}, - {file = "propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1"}, - {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc"}, - {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9"}, - {file = "propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439"}, - {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536"}, - {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629"}, - {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b"}, - {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052"}, - {file = "propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f"}, - {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30"}, - {file = "propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6"}, - {file = "propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1"}, - {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6a9a8c34fb7bb609419a211e59da8887eeca40d300b5ea8e56af98f6fbbb1541"}, - {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae1aa1cd222c6d205853b3013c69cd04515f9d6ab6de4b0603e2e1c33221303e"}, - {file = "propcache-0.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:accb6150ce61c9c4b7738d45550806aa2b71c7668c6942f17b0ac182b6142fd4"}, - {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eee736daafa7af6d0a2dc15cc75e05c64f37fc37bafef2e00d77c14171c2097"}, - {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7a31fc1e1bd362874863fdeed71aed92d348f5336fd84f2197ba40c59f061bd"}, - {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba4cfa1052819d16699e1d55d18c92b6e094d4517c41dd231a8b9f87b6fa681"}, - {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f089118d584e859c62b3da0892b88a83d611c2033ac410e929cb6754eec0ed16"}, - {file = "propcache-0.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:781e65134efaf88feb447e8c97a51772aa75e48b794352f94cb7ea717dedda0d"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31f5af773530fd3c658b32b6bdc2d0838543de70eb9a2156c03e410f7b0d3aae"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:a7a078f5d37bee6690959c813977da5291b24286e7b962e62a94cec31aa5188b"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cea7daf9fc7ae6687cf1e2c049752f19f146fdc37c2cc376e7d0032cf4f25347"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:8b3489ff1ed1e8315674d0775dc7d2195fb13ca17b3808721b54dbe9fd020faf"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9403db39be1393618dd80c746cb22ccda168efce239c73af13c3763ef56ffc04"}, - {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5d97151bc92d2b2578ff7ce779cdb9174337390a535953cbb9452fb65164c587"}, - {file = "propcache-0.2.1-cp39-cp39-win32.whl", hash = "sha256:9caac6b54914bdf41bcc91e7eb9147d331d29235a7c967c150ef5df6464fd1bb"}, - {file = "propcache-0.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:92fc4500fcb33899b05ba73276dfb684a20d31caa567b7cb5252d48f896a91b1"}, - {file = "propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54"}, - {file = "propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64"}, -] - -[[package]] -name = "pydantic" -version = "2.10.6" -description = "Data validation using Python type hints" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, - {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, -] - -[package.dependencies] -annotated-types = ">=0.6.0" -pydantic-core = "2.27.2" -typing-extensions = ">=4.12.2" - -[package.extras] -email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata"] - -[[package]] -name = "pydantic-core" -version = "2.27.2" -description = "Core functionality for Pydantic validation and serialization" -optional = false -python-versions = ">=3.8" -files = [ - {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] -typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" - -[[package]] -name = "pydantic-settings" -version = "2.7.1" -description = "Settings management using Pydantic" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pydantic_settings-2.7.1-py3-none-any.whl", hash = "sha256:590be9e6e24d06db33a4262829edef682500ef008565a969c73d39d5f8bfb3fd"}, - {file = "pydantic_settings-2.7.1.tar.gz", hash = "sha256:10c9caad35e64bfb3c2fbf70a078c0e25cc92499782e5200747f942a065dec93"}, -] - -[package.dependencies] -pydantic = ">=2.7.0" -python-dotenv = ">=0.21.0" - -[package.extras] -azure-key-vault = ["azure-identity (>=1.16.0)", "azure-keyvault-secrets (>=4.8.0)"] -toml = ["tomli (>=2.0.1)"] -yaml = ["pyyaml (>=6.0.1)"] - -[[package]] -name = "pytest" -version = "8.3.4" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, - {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=1.5,<2" - -[package.extras] -dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] - -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -description = "Extensions to the standard Python datetime module" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, - {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "python-dotenv" -version = "1.0.1" -description = "Read key-value pairs from a .env file and set them as environment variables" -optional = false -python-versions = ">=3.8" -files = [ - {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, - {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, -] - -[package.extras] -cli = ["click (>=5.0)"] - -[[package]] -name = "python-levenshtein" -version = "0.26.1" -description = "Python extension for computing string edit distances and similarities." -optional = false -python-versions = ">=3.9" -files = [ - {file = "python_Levenshtein-0.26.1-py3-none-any.whl", hash = "sha256:8ef5e529dd640fb00f05ee62d998d2ee862f19566b641ace775d5ae16167b2ef"}, - {file = "python_levenshtein-0.26.1.tar.gz", hash = "sha256:24ba578e28058ebb4afa2700057e1678d7adf27e43cd1f17700c09a9009d5d3a"}, -] - -[package.dependencies] -Levenshtein = "0.26.1" - -[[package]] -name = "pytz" -version = "2025.1" -description = "World timezone definitions, modern and historical" -optional = false -python-versions = "*" -files = [ - {file = "pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57"}, - {file = "pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"}, -] - -[[package]] -name = "rapidfuzz" -version = "3.12.1" -description = "rapid fuzzy string matching" -optional = false -python-versions = ">=3.9" -files = [ - {file = "rapidfuzz-3.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dbb7ea2fd786e6d66f225ef6eef1728832314f47e82fee877cb2a793ebda9579"}, - {file = "rapidfuzz-3.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1ae41361de05762c1eaa3955e5355de7c4c6f30d1ef1ea23d29bf738a35809ab"}, - {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc3c39e0317e7f68ba01bac056e210dd13c7a0abf823e7b6a5fe7e451ddfc496"}, - {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69f2520296f1ae1165b724a3aad28c56fd0ac7dd2e4cff101a5d986e840f02d4"}, - {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34dcbf5a7daecebc242f72e2500665f0bde9dd11b779246c6d64d106a7d57c99"}, - {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:773ab37fccf6e0513891f8eb4393961ddd1053c6eb7e62eaa876e94668fc6d31"}, - {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ecf0e6de84c0bc2c0f48bc03ba23cef2c5f1245db7b26bc860c11c6fd7a097c"}, - {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4dc2ebad4adb29d84a661f6a42494df48ad2b72993ff43fad2b9794804f91e45"}, - {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8389d98b9f54cb4f8a95f1fa34bf0ceee639e919807bb931ca479c7a5f2930bf"}, - {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:165bcdecbfed9978962da1d3ec9c191b2ff9f1ccc2668fbaf0613a975b9aa326"}, - {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:129d536740ab0048c1a06ccff73c683f282a2347c68069affae8dbc423a37c50"}, - {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b67e390261ffe98ec86c771b89425a78b60ccb610c3b5874660216fcdbded4b"}, - {file = "rapidfuzz-3.12.1-cp310-cp310-win32.whl", hash = "sha256:a66520180d3426b9dc2f8d312f38e19bc1fc5601f374bae5c916f53fa3534a7d"}, - {file = "rapidfuzz-3.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:82260b20bc7a76556cecb0c063c87dad19246a570425d38f8107b8404ca3ac97"}, - {file = "rapidfuzz-3.12.1-cp310-cp310-win_arm64.whl", hash = "sha256:3a860d103bbb25c69c2e995fdf4fac8cb9f77fb69ec0a00469d7fd87ff148f46"}, - {file = "rapidfuzz-3.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6d9afad7b16d01c9e8929b6a205a18163c7e61b6cd9bcf9c81be77d5afc1067a"}, - {file = "rapidfuzz-3.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bb424ae7240f2d2f7d8dda66a61ebf603f74d92f109452c63b0dbf400204a437"}, - {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42149e6d13bd6d06437d2a954dae2184dadbbdec0fdb82dafe92860d99f80519"}, - {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:760ac95d788f2964b73da01e0bdffbe1bf2ad8273d0437565ce9092ae6ad1fbc"}, - {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2cf27e8e4bf7bf9d92ef04f3d2b769e91c3f30ba99208c29f5b41e77271a2614"}, - {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00ceb8ff3c44ab0d6014106c71709c85dee9feedd6890eff77c814aa3798952b"}, - {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b61c558574fbc093d85940c3264c08c2b857b8916f8e8f222e7b86b0bb7d12"}, - {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:346a2d8f17224e99f9ef988606c83d809d5917d17ad00207237e0965e54f9730"}, - {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d60d1db1b7e470e71ae096b6456e20ec56b52bde6198e2dbbc5e6769fa6797dc"}, - {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2477da227e266f9c712f11393182c69a99d3c8007ea27f68c5afc3faf401cc43"}, - {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8499c7d963ddea8adb6cffac2861ee39a1053e22ca8a5ee9de1197f8dc0275a5"}, - {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:12802e5c4d8ae104fb6efeeb436098325ce0dca33b461c46e8df015c84fbef26"}, - {file = "rapidfuzz-3.12.1-cp311-cp311-win32.whl", hash = "sha256:e1061311d07e7cdcffa92c9b50c2ab4192907e70ca01b2e8e1c0b6b4495faa37"}, - {file = "rapidfuzz-3.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:c6e4ed63e204daa863a802eec09feea5448617981ba5d150f843ad8e3ae071a4"}, - {file = "rapidfuzz-3.12.1-cp311-cp311-win_arm64.whl", hash = "sha256:920733a28c3af47870835d59ca9879579f66238f10de91d2b4b3f809d1ebfc5b"}, - {file = "rapidfuzz-3.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f6235b57ae3faa3f85cb3f90c9fee49b21bd671b76e90fc99e8ca2bdf0b5e4a3"}, - {file = "rapidfuzz-3.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af4585e5812632c357fee5ab781c29f00cd06bea58f8882ff244cc4906ba6c9e"}, - {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5942dc4460e5030c5f9e1d4c9383de2f3564a2503fe25e13e89021bcbfea2f44"}, - {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b31ab59e1a0df5afc21f3109b6cfd77b34040dbf54f1bad3989f885cfae1e60"}, - {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97c885a7a480b21164f57a706418c9bbc9a496ec6da087e554424358cadde445"}, - {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d844c0587d969ce36fbf4b7cbf0860380ffeafc9ac5e17a7cbe8abf528d07bb"}, - {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93c95dce8917bf428064c64024de43ffd34ec5949dd4425780c72bd41f9d969"}, - {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:834f6113d538af358f39296604a1953e55f8eeffc20cb4caf82250edbb8bf679"}, - {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a940aa71a7f37d7f0daac186066bf6668d4d3b7e7ef464cb50bc7ba89eae1f51"}, - {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ec9eaf73501c9a7de2c6938cb3050392e2ee0c5ca3921482acf01476b85a7226"}, - {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3c5ec360694ac14bfaeb6aea95737cf1a6cf805b5fe8ea7fd28814706c7fa838"}, - {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6b5e176524653ac46f1802bdd273a4b44a5f8d0054ed5013a8e8a4b72f254599"}, - {file = "rapidfuzz-3.12.1-cp312-cp312-win32.whl", hash = "sha256:6f463c6f1c42ec90e45d12a6379e18eddd5cdf74138804d8215619b6f4d31cea"}, - {file = "rapidfuzz-3.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:b894fa2b30cd6498a29e5c470cb01c6ea898540b7e048a0342775a5000531334"}, - {file = "rapidfuzz-3.12.1-cp312-cp312-win_arm64.whl", hash = "sha256:43bb17056c5d1332f517b888c4e57846c4b5f936ed304917eeb5c9ac85d940d4"}, - {file = "rapidfuzz-3.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:97f824c15bc6933a31d6e3cbfa90188ba0e5043cf2b6dd342c2b90ee8b3fd47c"}, - {file = "rapidfuzz-3.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a973b3f5cabf931029a3ae4a0f72e3222e53d412ea85fc37ddc49e1774f00fbf"}, - {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df7880e012228722dec1be02b9ef3898ed023388b8a24d6fa8213d7581932510"}, - {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c78582f50e75e6c2bc38c791ed291cb89cf26a3148c47860c1a04d6e5379c8e"}, - {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d7d9e6a04d8344b0198c96394c28874086888d0a2b2f605f30d1b27b9377b7d"}, - {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5620001fd4d6644a2f56880388179cc8f3767670f0670160fcb97c3b46c828af"}, - {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0666ab4c52e500af7ba5cc17389f5d15c0cdad06412c80312088519fdc25686d"}, - {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:27b4d440fa50b50c515a91a01ee17e8ede719dca06eef4c0cccf1a111a4cfad3"}, - {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83dccfd5a754f2a0e8555b23dde31f0f7920601bfa807aa76829391ea81e7c67"}, - {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b572b634740e047c53743ed27a1bb3b4f93cf4abbac258cd7af377b2c4a9ba5b"}, - {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7fa7b81fb52902d5f78dac42b3d6c835a6633b01ddf9b202a3ca8443be4b2d6a"}, - {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b1d4fbff980cb6baef4ee675963c081f7b5d6580a105d6a4962b20f1f880e1fb"}, - {file = "rapidfuzz-3.12.1-cp313-cp313-win32.whl", hash = "sha256:3fe8da12ea77271097b303fa7624cfaf5afd90261002314e3b0047d36f4afd8d"}, - {file = "rapidfuzz-3.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:6f7e92fc7d2a7f02e1e01fe4f539324dfab80f27cb70a30dd63a95445566946b"}, - {file = "rapidfuzz-3.12.1-cp313-cp313-win_arm64.whl", hash = "sha256:e31be53d7f4905a6a038296d8b773a79da9ee9f0cd19af9490c5c5a22e37d2e5"}, - {file = "rapidfuzz-3.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bef5c91d5db776523530073cda5b2a276283258d2f86764be4a008c83caf7acd"}, - {file = "rapidfuzz-3.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:841e0c2a5fbe8fc8b9b1a56e924c871899932c0ece7fbd970aa1c32bfd12d4bf"}, - {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:046fc67f3885d94693a2151dd913aaf08b10931639cbb953dfeef3151cb1027c"}, - {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4d2d39b2e76c17f92edd6d384dc21fa020871c73251cdfa017149358937a41d"}, - {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5857dda85165b986c26a474b22907db6b93932c99397c818bcdec96340a76d5"}, - {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c26cd1b9969ea70dbf0dbda3d2b54ab4b2e683d0fd0f17282169a19563efeb1"}, - {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf56ea4edd69005786e6c80a9049d95003aeb5798803e7a2906194e7a3cb6472"}, - {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fbe7580b5fb2db8ebd53819171ff671124237a55ada3f64d20fc9a149d133960"}, - {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:018506a53c3b20dcbda8c93d4484b9eb1764c93d5ea16be103cf6b0d8b11d860"}, - {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:325c9c71b737fcd32e2a4e634c430c07dd3d374cfe134eded3fe46e4c6f9bf5d"}, - {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:930756639643e3aa02d3136b6fec74e5b9370a24f8796e1065cd8a857a6a6c50"}, - {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0acbd27543b158cb915fde03877383816a9e83257832818f1e803bac9b394900"}, - {file = "rapidfuzz-3.12.1-cp39-cp39-win32.whl", hash = "sha256:80ff9283c54d7d29b2d954181e137deee89bec62f4a54675d8b6dbb6b15d3e03"}, - {file = "rapidfuzz-3.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:fd37e53f0ed239d0cec27b250cec958982a8ba252ce64aa5e6052de3a82fa8db"}, - {file = "rapidfuzz-3.12.1-cp39-cp39-win_arm64.whl", hash = "sha256:4a4422e4f73a579755ab60abccb3ff148b5c224b3c7454a13ca217dfbad54da6"}, - {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b7cba636c32a6fc3a402d1cb2c70c6c9f8e6319380aaf15559db09d868a23e56"}, - {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b79286738a43e8df8420c4b30a92712dec6247430b130f8e015c3a78b6d61ac2"}, - {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dc1937198e7ff67e217e60bfa339f05da268d91bb15fec710452d11fe2fdf60"}, - {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b85817a57cf8db32dd5d2d66ccfba656d299b09eaf86234295f89f91be1a0db2"}, - {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04283c6f3e79f13a784f844cd5b1df4f518ad0f70c789aea733d106c26e1b4fb"}, - {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a718f740553aad5f4daef790191511da9c6eae893ee1fc2677627e4b624ae2db"}, - {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cbdf145c7e4ebf2e81c794ed7a582c4acad19e886d5ad6676086369bd6760753"}, - {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:0d03ad14a26a477be221fddc002954ae68a9e2402b9d85433f2d0a6af01aa2bb"}, - {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1187aeae9c89e838d2a0a2b954b4052e4897e5f62e5794ef42527bf039d469e"}, - {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd47dfb1bca9673a48b923b3d988b7668ee8efd0562027f58b0f2b7abf27144c"}, - {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:187cdb402e223264eebed2fe671e367e636a499a7a9c82090b8d4b75aa416c2a"}, - {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6899b41bf6c30282179f77096c1939f1454836440a8ab05b48ebf7026a3b590"}, - {file = "rapidfuzz-3.12.1.tar.gz", hash = "sha256:6a98bbca18b4a37adddf2d8201856441c26e9c981d8895491b5bc857b5f780eb"}, -] - -[package.extras] -all = ["numpy"] - -[[package]] -name = "requests" -version = "2.32.3" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.8" -files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "requests-toolbelt" -version = "1.0.0" -description = "A utility belt for advanced users of python-requests" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, - {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, -] - -[package.dependencies] -requests = ">=2.0.1,<3.0.0" - -[[package]] -name = "ruff" -version = "0.9.5" -description = "An extremely fast Python linter and code formatter, written in Rust." -optional = false -python-versions = ">=3.7" -files = [ - {file = "ruff-0.9.5-py3-none-linux_armv6l.whl", hash = "sha256:d466d2abc05f39018d53f681fa1c0ffe9570e6d73cde1b65d23bb557c846f442"}, - {file = "ruff-0.9.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:38840dbcef63948657fa7605ca363194d2fe8c26ce8f9ae12eee7f098c85ac8a"}, - {file = "ruff-0.9.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d56ba06da53536b575fbd2b56517f6f95774ff7be0f62c80b9e67430391eeb36"}, - {file = "ruff-0.9.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f7cb2a01da08244c50b20ccfaeb5972e4228c3c3a1989d3ece2bc4b1f996001"}, - {file = "ruff-0.9.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:96d5c76358419bc63a671caac70c18732d4fd0341646ecd01641ddda5c39ca0b"}, - {file = "ruff-0.9.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:deb8304636ed394211f3a6d46c0e7d9535b016f53adaa8340139859b2359a070"}, - {file = "ruff-0.9.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:df455000bf59e62b3e8c7ba5ed88a4a2bc64896f900f311dc23ff2dc38156440"}, - {file = "ruff-0.9.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de92170dfa50c32a2b8206a647949590e752aca8100a0f6b8cefa02ae29dce80"}, - {file = "ruff-0.9.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d28532d73b1f3f627ba88e1456f50748b37f3a345d2be76e4c653bec6c3e393"}, - {file = "ruff-0.9.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c746d7d1df64f31d90503ece5cc34d7007c06751a7a3bbeee10e5f2463d52d2"}, - {file = "ruff-0.9.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:11417521d6f2d121fda376f0d2169fb529976c544d653d1d6044f4c5562516ee"}, - {file = "ruff-0.9.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5b9d71c3879eb32de700f2f6fac3d46566f644a91d3130119a6378f9312a38e1"}, - {file = "ruff-0.9.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2e36c61145e70febcb78483903c43444c6b9d40f6d2f800b5552fec6e4a7bb9a"}, - {file = "ruff-0.9.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:2f71d09aeba026c922aa7aa19a08d7bd27c867aedb2f74285a2639644c1c12f5"}, - {file = "ruff-0.9.5-py3-none-win32.whl", hash = "sha256:134f958d52aa6fdec3b294b8ebe2320a950d10c041473c4316d2e7d7c2544723"}, - {file = "ruff-0.9.5-py3-none-win_amd64.whl", hash = "sha256:78cc6067f6d80b6745b67498fb84e87d32c6fc34992b52bffefbdae3442967d6"}, - {file = "ruff-0.9.5-py3-none-win_arm64.whl", hash = "sha256:18a29f1a005bddb229e580795627d297dfa99f16b30c7039e73278cf6b5f9fa9"}, - {file = "ruff-0.9.5.tar.gz", hash = "sha256:11aecd7a633932875ab3cb05a484c99970b9d52606ce9ea912b690b02653d56c"}, -] - -[[package]] -name = "six" -version = "1.17.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, - {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -files = [ - {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, - {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, -] - -[[package]] -name = "specklepy" -version = "2.21.2" -description = "The Python SDK for Speckle 2.0" -optional = false -python-versions = "<4.0,>=3.9.0" -files = [ - {file = "specklepy-2.21.2-py3-none-any.whl", hash = "sha256:bb34bb0de56f8731f88ac9a1ada4cddfbf2d71e52d4e9cce07bab95c1dac2b2d"}, - {file = "specklepy-2.21.2.tar.gz", hash = "sha256:ba44bb9167ced32e52ba7e5717d0b1d0ece1aa23ca02243ce75f0eaba08e8107"}, -] - -[package.dependencies] -appdirs = ">=1.4.4,<2.0.0" -attrs = ">=23.1.0,<24.0.0" -Deprecated = ">=1.2.13,<2.0.0" -gql = {version = ">=3.3.0,<4.0.0", extras = ["requests", "websockets"]} -httpx = ">=0.25.0,<0.26.0" -pydantic = ">=2.5,<3.0" -stringcase = ">=1.2.0,<2.0.0" -ujson = ">=5.3.0,<6.0.0" - -[[package]] -name = "stringcase" -version = "1.2.0" -description = "String case converter." -optional = false -python-versions = "*" -files = [ - {file = "stringcase-1.2.0.tar.gz", hash = "sha256:48a06980661908efe8d9d34eab2b6c13aefa2163b3ced26972902e3bdfd87008"}, -] - -[[package]] -name = "typing-extensions" -version = "4.12.2" -description = "Backported and Experimental Type Hints for Python 3.8+" -optional = false -python-versions = ">=3.8" -files = [ - {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, - {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, -] - -[[package]] -name = "tzdata" -version = "2025.1" -description = "Provider of IANA time zone data" -optional = false -python-versions = ">=2" -files = [ - {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"}, - {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"}, -] - -[[package]] -name = "ujson" -version = "5.10.0" -description = "Ultra fast JSON encoder and decoder for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, - {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, - {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6"}, - {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569"}, - {file = "ujson-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770"}, - {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1"}, - {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5"}, - {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51"}, - {file = "ujson-5.10.0-cp310-cp310-win32.whl", hash = "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518"}, - {file = "ujson-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f"}, - {file = "ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00"}, - {file = "ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126"}, - {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8"}, - {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b"}, - {file = "ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9"}, - {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f"}, - {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4"}, - {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1"}, - {file = "ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f"}, - {file = "ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720"}, - {file = "ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5"}, - {file = "ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e"}, - {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043"}, - {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1"}, - {file = "ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3"}, - {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21"}, - {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2"}, - {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e"}, - {file = "ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e"}, - {file = "ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc"}, - {file = "ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287"}, - {file = "ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e"}, - {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557"}, - {file = "ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988"}, - {file = "ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816"}, - {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20"}, - {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0"}, - {file = "ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f"}, - {file = "ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165"}, - {file = "ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539"}, - {file = "ujson-5.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a984a3131da7f07563057db1c3020b1350a3e27a8ec46ccbfbf21e5928a43050"}, - {file = "ujson-5.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73814cd1b9db6fc3270e9d8fe3b19f9f89e78ee9d71e8bd6c9a626aeaeaf16bd"}, - {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61e1591ed9376e5eddda202ec229eddc56c612b61ac6ad07f96b91460bb6c2fb"}, - {file = "ujson-5.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c75269f8205b2690db4572a4a36fe47cd1338e4368bc73a7a0e48789e2e35a"}, - {file = "ujson-5.10.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7223f41e5bf1f919cd8d073e35b229295aa8e0f7b5de07ed1c8fddac63a6bc5d"}, - {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d4dc2fd6b3067c0782e7002ac3b38cf48608ee6366ff176bbd02cf969c9c20fe"}, - {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:232cc85f8ee3c454c115455195a205074a56ff42608fd6b942aa4c378ac14dd7"}, - {file = "ujson-5.10.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cc6139531f13148055d691e442e4bc6601f6dba1e6d521b1585d4788ab0bfad4"}, - {file = "ujson-5.10.0-cp38-cp38-win32.whl", hash = "sha256:e7ce306a42b6b93ca47ac4a3b96683ca554f6d35dd8adc5acfcd55096c8dfcb8"}, - {file = "ujson-5.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:e82d4bb2138ab05e18f089a83b6564fee28048771eb63cdecf4b9b549de8a2cc"}, - {file = "ujson-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b"}, - {file = "ujson-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27"}, - {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76"}, - {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5"}, - {file = "ujson-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0"}, - {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1"}, - {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1"}, - {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996"}, - {file = "ujson-5.10.0-cp39-cp39-win32.whl", hash = "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9"}, - {file = "ujson-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b"}, - {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337"}, - {file = "ujson-5.10.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1"}, - {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753"}, - {file = "ujson-5.10.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6"}, - {file = "ujson-5.10.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7"}, - {file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"}, -] - -[[package]] -name = "urllib3" -version = "2.3.0" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.9" -files = [ - {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, - {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "websockets" -version = "11.0.3" -description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"}, - {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"}, - {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"}, - {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"}, - {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"}, - {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"}, - {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"}, - {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"}, - {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"}, - {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"}, - {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"}, - {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"}, - {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"}, - {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"}, - {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"}, - {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"}, -] - -[[package]] -name = "wrapt" -version = "1.17.2" -description = "Module for decorators, wrappers and monkey patching." -optional = false -python-versions = ">=3.8" -files = [ - {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, - {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, - {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, - {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, - {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, - {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, - {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, - {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, - {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, - {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, - {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, - {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, - {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, - {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, - {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, - {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, - {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, - {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, - {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, - {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, - {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, - {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, - {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, - {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, - {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, - {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, - {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, - {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, - {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, - {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, - {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, - {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, - {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, - {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, - {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, - {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, - {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, - {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, - {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, - {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, - {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, - {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, - {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, - {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, - {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, - {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, - {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, - {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, - {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, - {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, - {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, - {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, - {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, - {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, - {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, - {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, - {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, - {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, - {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, - {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, - {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, - {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, - {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, - {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, - {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, - {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, - {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, - {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, - {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, - {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, - {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, - {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, - {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, - {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, - {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, - {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, - {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, - {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, - {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, -] - -[[package]] -name = "yarl" -version = "1.18.3" -description = "Yet another URL library" -optional = false -python-versions = ">=3.9" -files = [ - {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"}, - {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"}, - {file = "yarl-1.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed"}, - {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde"}, - {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b"}, - {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5"}, - {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc"}, - {file = "yarl-1.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd"}, - {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990"}, - {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db"}, - {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62"}, - {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760"}, - {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b"}, - {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690"}, - {file = "yarl-1.18.3-cp310-cp310-win32.whl", hash = "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6"}, - {file = "yarl-1.18.3-cp310-cp310-win_amd64.whl", hash = "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8"}, - {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069"}, - {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193"}, - {file = "yarl-1.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889"}, - {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8"}, - {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca"}, - {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8"}, - {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae"}, - {file = "yarl-1.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3"}, - {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb"}, - {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e"}, - {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59"}, - {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d"}, - {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e"}, - {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a"}, - {file = "yarl-1.18.3-cp311-cp311-win32.whl", hash = "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1"}, - {file = "yarl-1.18.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5"}, - {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50"}, - {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576"}, - {file = "yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640"}, - {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2"}, - {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75"}, - {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512"}, - {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba"}, - {file = "yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb"}, - {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272"}, - {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6"}, - {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e"}, - {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb"}, - {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393"}, - {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285"}, - {file = "yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2"}, - {file = "yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477"}, - {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb"}, - {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa"}, - {file = "yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782"}, - {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0"}, - {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482"}, - {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186"}, - {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58"}, - {file = "yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53"}, - {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2"}, - {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8"}, - {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1"}, - {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a"}, - {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10"}, - {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8"}, - {file = "yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d"}, - {file = "yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c"}, - {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:61e5e68cb65ac8f547f6b5ef933f510134a6bf31bb178be428994b0cb46c2a04"}, - {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe57328fbc1bfd0bd0514470ac692630f3901c0ee39052ae47acd1d90a436719"}, - {file = "yarl-1.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a440a2a624683108a1b454705ecd7afc1c3438a08e890a1513d468671d90a04e"}, - {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c7907c8548bcd6ab860e5f513e727c53b4a714f459b084f6580b49fa1b9cee"}, - {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4f6450109834af88cb4cc5ecddfc5380ebb9c228695afc11915a0bf82116789"}, - {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9ca04806f3be0ac6d558fffc2fdf8fcef767e0489d2684a21912cc4ed0cd1b8"}, - {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77a6e85b90a7641d2e07184df5557132a337f136250caafc9ccaa4a2a998ca2c"}, - {file = "yarl-1.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6333c5a377c8e2f5fae35e7b8f145c617b02c939d04110c76f29ee3676b5f9a5"}, - {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0b3c92fa08759dbf12b3a59579a4096ba9af8dd344d9a813fc7f5070d86bbab1"}, - {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4ac515b860c36becb81bb84b667466885096b5fc85596948548b667da3bf9f24"}, - {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:045b8482ce9483ada4f3f23b3774f4e1bf4f23a2d5c912ed5170f68efb053318"}, - {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a4bb030cf46a434ec0225bddbebd4b89e6471814ca851abb8696170adb163985"}, - {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:54d6921f07555713b9300bee9c50fb46e57e2e639027089b1d795ecd9f7fa910"}, - {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1d407181cfa6e70077df3377938c08012d18893f9f20e92f7d2f314a437c30b1"}, - {file = "yarl-1.18.3-cp39-cp39-win32.whl", hash = "sha256:ac36703a585e0929b032fbaab0707b75dc12703766d0b53486eabd5139ebadd5"}, - {file = "yarl-1.18.3-cp39-cp39-win_amd64.whl", hash = "sha256:ba87babd629f8af77f557b61e49e7c7cac36f22f871156b91e10a6e9d4f829e9"}, - {file = "yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b"}, - {file = "yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1"}, -] - -[package.dependencies] -idna = ">=2.0" -multidict = ">=4.0" -propcache = ">=0.2.0" - -[metadata] -lock-version = "2.0" -python-versions = "^3.11" -content-hash = "21a0f6e687ee3c43ee58824b834c4dfe3731328c3161270e55924ee4de39dc7d" diff --git a/pyproject.toml b/pyproject.toml index 349478e..7024309 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,39 +1,41 @@ -[tool.poetry] -name = "speckle-automate-py" +[project] +name = "speckle-automate-checker" version = "0.1.0" description = "Allows for QAQC property checking with Speckle" authors = ["Jonathon Broughton "] readme = "README.md" -package-mode = false +requires-python = ">=3.12" +dependencies = [ + "more-itertools>=10.6.0", + "pandas>=2.2.3", + "pydantic==2.10.6", + "python-dotenv>=1.0.1", + "python-levenshtein>=0.26.1", + "specklepy>=2.21.2", +] -[tool.poetry.dependencies] -more-itertools = "^10.6.0" -pandas = "^2.2.3" -python = "^3.11" -python-dotenv = "^1.0.1" -python-levenshtein = "^0.26.1" -specklepy = "^2.21.0" -[tool.poetry.group.dev.dependencies] -black = "^25.0.0" -mypy = "^1.3.0" -pydantic-settings = "^2.3.0" -pytest = "^8.0.0" -ruff = "^0.9.5" -# specklepy = { path = "../specklepy", develop = true } +[dependency-groups] +dev = [ + "pytest-assertcount>=1.0.0", + "black>=25.1.0", + "mypy>=1.15.0", + "pydantic-settings>=2.7.1", + "pytest>=8.3.4", + "ruff>=0.9.6", +] -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" [tool.ruff] select = [ - "E", # pycodestyle - "F", # pyflakes - "UP", # pyupgrade - "D", # pydocstyle - "I", # isort + "E", # pycodestyle + "F", # pyflakes + "UP", # pyupgrade + "D", # pydocstyle + "I", # isort ] +line-length = 120 +ignore = ["F401", "F403"] [tool.ruff.pydocstyle] convention = "google" diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..ea5ee7d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,54 @@ +annotated-types==0.7.0 +anyio==4.8.0 +appdirs==1.4.4 +attrs==23.2.0 +backoff==2.2.1 +black==25.1.0 +certifi==2025.1.31 +charset-normalizer==3.4.1 +click==8.1.8 +colorama==0.4.6 +deprecated==1.2.18 +gql==3.5.0 +graphql-core==3.2.6 +h11==0.14.0 +httpcore==1.0.7 +httpx==0.25.2 +idna==3.10 +iniconfig==2.0.0 +levenshtein==0.26.1 +more-itertools==10.6.0 +multidict==6.1.0 +mypy==1.15.0 +mypy-extensions==1.0.0 +numpy==2.2.2 +packaging==24.2 +pandas==2.2.3 +pathspec==0.12.1 +platformdirs==4.3.6 +pluggy==1.5.0 +propcache==0.2.1 +pydantic==2.10.6 +pydantic-core==2.27.2 +pydantic-settings==2.7.1 +pytest==8.3.4 +pytest-assertcount==1.0.0 +python-dateutil==2.9.0.post0 +python-dotenv==1.0.1 +python-levenshtein==0.26.1 +pytz==2025.1 +rapidfuzz==3.12.1 +requests==2.32.3 +requests-toolbelt==1.0.0 +ruff==0.9.6 +six==1.17.0 +sniffio==1.3.1 +specklepy==2.21.2 +stringcase==1.2.0 +typing-extensions==4.12.2 +tzdata==2025.1 +ujson==5.10.0 +urllib3==2.3.0 +websockets==11.0.3 +wrapt==1.17.2 +yarl==1.18.3 diff --git a/setup.sh b/setup.sh new file mode 100644 index 0000000..e6e5b7c --- /dev/null +++ b/setup.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +# Copy the pre-commit hook to the .git/hooks/ directory +cp hooks/pre-commit .git/hooks/pre-commit + +# Ensure the hook is executable +chmod +x .git/hooks/pre-commit + +echo "Git hooks have been set up!" diff --git a/src/filters.py b/src/filters.py new file mode 100644 index 0000000..3d9dd96 --- /dev/null +++ b/src/filters.py @@ -0,0 +1,31 @@ +from specklepy.objects.base import Base + +from src.rules import PropertyRules + + +def filter_objects_by_category(speckle_objects: list[Base], category_input: str) -> tuple[list[Base], list[Base]]: + """Filters objects by category value and test. + + This function takes a list of Speckle objects, filters out the objects + with a matching category value and satisfies the test, and returns + both the matching and non-matching objects. + + Args: + speckle_objects (List[Base]): The list of Speckle objects to filter. + category_input (str): The category value to match against. + + Returns: + Tuple[List[Base], List[Base]]: A tuple containing two lists: + - The first list contains objects with matching category and test. + - The second list contains objects without matching category or test. + """ + matching_objects = [] + non_matching_objects = [] + + for obj in speckle_objects: + if PropertyRules.is_category(obj, category_input): + matching_objects.append(obj) + else: + non_matching_objects.append(obj) + + return matching_objects, non_matching_objects diff --git a/src/function.py b/src/function.py index fb17b85..1a2973d 100644 --- a/src/function.py +++ b/src/function.py @@ -1,21 +1,24 @@ -"""This module contains the function's business logic. +# This is the main function that will be executed when the automation is triggered. +# It will receive the inputs from the user, and the context of the run. +# It will then apply the rules to the objects in the model, and report back the results. -Use the automation_context module to wrap your function in an Automate context helper. -""" +from pandas import DataFrame +from speckle_automate import AutomationContext +from specklepy.objects.base import Base -from speckle_automate import AutomationContext, AutomateBase - -from src.rules import apply_rules_to_objects -from src.inputs import FunctionInputs from src.helpers import flatten_base +from src.inputs import FunctionInputs +from src.rule_processor import apply_rules_to_objects from src.spreadsheet import read_rules_from_spreadsheet +VERSION: int = 2 + def automate_function( - automate_context: AutomationContext, - function_inputs: FunctionInputs, + automate_context: AutomationContext, + function_inputs: FunctionInputs, ) -> None: - """This version of the function will add a check for the new provide inputs. + """This VERSION of the function will add a check for the new provide inputs. Args: automate_context: A context helper object, that carries relevant information @@ -24,23 +27,32 @@ def automate_function( It also has convenience methods attach result data to the Speckle model. function_inputs: An instance object matching the defined schema. """ - - # the context provides a convenient way, to receive the triggering version - version_root_object = automate_context.receive_version() + # the context provides a convenient way, to receive the triggering VERSION + version_root_object: Base = automate_context.receive_version() # We can continue to work with a flattened list of objects. flat_list_of_objects = list(flatten_base(version_root_object)) + # If it is a next_gen model, we can get the VERSION from the root object + # This function's rules don't make use of this check, but it is here for reference if you want to. + global VERSION + VERSION = getattr(version_root_object, "version", 2) # noqa: F841SION = getattr(version_root_object,"version", 2) # noqa: F841 # noqa: F841 + # read the rules from the spreadsheet - rules = read_rules_from_spreadsheet(function_inputs.spreadsheet_url) + rules: DataFrame = read_rules_from_spreadsheet(function_inputs.spreadsheet_url) + + if (rules is None) or (len(rules) == 0): + automate_context.mark_run_exception("No rules defined") + + grouped_rules = rules.groupby("Rule Number") # apply the rules to the objects - apply_rules_to_objects(flat_list_of_objects, rules, automate_context) + apply_rules_to_objects(flat_list_of_objects, grouped_rules, automate_context) - # set the automation context view, to the original model / version view + # set the automation context view, to the original model / VERSION view automate_context.set_context_view() # report success automate_context.mark_run_success( - f"Successfully applied rules to {len(flat_list_of_objects)} objects." + f"Successfully applied {len(grouped_rules)} rules to {len(flat_list_of_objects)} version {VERSION} objects." ) diff --git a/src/helpers.py b/src/helpers.py index 9f28bb0..9d6632a 100644 --- a/src/helpers.py +++ b/src/helpers.py @@ -1,14 +1,14 @@ """Helper module for a speckle object tree flattening.""" -from collections.abc import Iterable -from typing import Optional, Tuple, List +from collections.abc import Generator, Iterable +from typing import Any from specklepy.objects import Base from specklepy.objects.other import Instance, Transform def speckle_print(log_string: str = "banana") -> None: - + """Print a string to the console with a green color.""" print("\033[92m" + str(log_string) + "\033[0m") @@ -21,6 +21,24 @@ def flatten_base(base: Base) -> Iterable[Base]: yield base +def get_item(obj: Base | dict[str, Any], key, default=None): + """Get an item from a dictionary or an object with a default value.""" + if isinstance(obj, dict): # If it's a dictionary + return obj.get(key, default) + elif hasattr(obj, key): # If it's an object with the attribute + return getattr(obj, key, default) + return default # Return default if it's neither a dict nor an object with the attribute + + +def has_item(obj: Base | dict[str, Any], key: str) -> bool: + """Check if an object has a key or an attribute.""" + if isinstance(obj, dict): + return key in obj + elif hasattr(obj, key): + return True + return False + + def flatten_base_thorough(base: Base, parent_type: str = None) -> Iterable[Base]: """Take a base and flatten it to an iterable of bases. @@ -51,9 +69,7 @@ def flatten_base_thorough(base: Base, parent_type: str = None) -> Iterable[Base] print(category) if category.startswith("@"): category_object: Base = getattr(base, category)[0] - yield from flatten_base_thorough( - category_object, category_object.speckle_type - ) + yield from flatten_base_thorough(category_object, category_object.speckle_type) except KeyError: pass @@ -63,11 +79,13 @@ def flatten_base_thorough(base: Base, parent_type: str = None) -> Iterable[Base] def extract_base_and_transform( base: Base, - inherited_instance_id: Optional[str] = None, - transform_list: Optional[List[Transform]] = None, -) -> Tuple[Base, str, Optional[List[Transform]]]: - """ - Traverses Speckle object hierarchies to yield `Base` objects and their transformations. + inherited_instance_id: str | None = None, + transform_list: list[Transform] | None = None, +) -> Generator[ + Base | str | list[Transform] | None | tuple[Base, Any | None, list[Transform] | None | list[Any]], Any | None, None +]: + """Traverses Speckle object hierarchies to yield `Base` objects and their transformations. + Tailored to Speckle's AEC data structures, it covers the newer hierarchical structures with Collections and also with patterns found in older Revit specific data. @@ -91,9 +109,7 @@ def extract_base_and_transform( if base.transform: transform_list.append(base.transform) if base.definition: - yield from extract_base_and_transform( - base.definition, current_id, transform_list.copy() - ) + yield from extract_base_and_transform(base.definition, current_id, transform_list.copy()) else: # Initial yield for the current `Base` object. yield base, current_id, transform_list @@ -103,9 +119,7 @@ def extract_base_and_transform( for element in elements_attr: if isinstance(element, Base): # Recurse into each `Base` object within 'elements' or '@elements'. - yield from extract_base_and_transform( - element, current_id, transform_list.copy() - ) + yield from extract_base_and_transform(element, current_id, transform_list.copy()) # Recursively process '@'-prefixed properties that are Base objects with 'elements'. # This is a common pattern in older Speckle data models, such as those used for Revit commits. @@ -114,6 +128,4 @@ def extract_base_and_transform( attr_value = getattr(base, attr_name) # If the attribute is a Base object containing 'elements', recurse into it. if isinstance(attr_value, Base) and hasattr(attr_value, "elements"): - yield from extract_base_and_transform( - attr_value, current_id, transform_list.copy() - ) + yield from extract_base_and_transform(attr_value, current_id, transform_list.copy()) diff --git a/src/inputs.py b/src/inputs.py index f11ec33..45bd24d 100644 --- a/src/inputs.py +++ b/src/inputs.py @@ -1,7 +1,14 @@ +from enum import Enum + from pydantic import Field from speckle_automate import AutomateBase +class PropertyMatchMode(Enum): + STRICT = "strict" # Exact parameter path match + FUZZY = "fuzzy" # Search all parameters ignoring hierarchy + MIXED = "mixed" # Exact match first, fuzzy fallback + class FunctionInputs(AutomateBase): """These are function author defined values. @@ -10,8 +17,23 @@ class FunctionInputs(AutomateBase): https://docs.pydantic.dev/latest/usage/models/ """ + + + + + + # In this exercise, we will move rules to an external source so not to hardcode them. spreadsheet_url: str = Field( title="Spreadsheet URL", description="This is the URL of the spreadsheet to check. It should be a TSV format data source.", ) + + property_match_mode: PropertyMatchMode = Field( + default=PropertyMatchMode.MIXED, + title="Property Match Mode", + description='Controls how strictly parameter names must match. ' + + 'STRICT will only match exact parameter paths, ' + + 'FUZZY will search all parameters ignoring hierarchy, ' + + 'MIXED will exact match first, fuzzy fallback.' + ) diff --git a/src/predicates.py b/src/predicates.py new file mode 100644 index 0000000..8f3108e --- /dev/null +++ b/src/predicates.py @@ -0,0 +1,19 @@ +"""Configuration module defining mappings between spreadsheet predicates and rule methods.""" + +from src.rules import PropertyRules + +# Mapping of input predicates to the corresponding methods in PropertyRules +PREDICATE_METHOD_MAP = { + "exists": PropertyRules.has_parameter.__name__, + "matches": PropertyRules.is_parameter_value.__name__, + "greater than": PropertyRules.is_parameter_value_greater_than.__name__, + "less than": PropertyRules.is_parameter_value_less_than.__name__, + "in range": PropertyRules.is_parameter_value_in_range.__name__, + "in list": PropertyRules.is_parameter_value_in_list.__name__, + "equal to": PropertyRules.is_equal_value.__name__, + "is true": PropertyRules.is_parameter_value_true.__name__, + "is false": PropertyRules.is_parameter_value_false.__name__, + "is like": PropertyRules.is_parameter_value_like.__name__, + "identical to": PropertyRules.is_identical_value.__name__, + "not equal": PropertyRules.is_not_equal_value.__name__, +} diff --git a/src/rule_processor.py b/src/rule_processor.py new file mode 100644 index 0000000..dcf2701 --- /dev/null +++ b/src/rule_processor.py @@ -0,0 +1,244 @@ +from enum import Enum +from typing import Any + +import pandas as pd +from pandas.core.groupby import DataFrameGroupBy +from speckle_automate import AutomationContext, ObjectResultLevel +from specklepy.objects.base import Base + +from src.helpers import speckle_print +from src.predicates import PREDICATE_METHOD_MAP +from src.rules import PropertyRules + + +def evaluate_condition( + speckle_object: Base, condition: pd.Series, rule_number: str | None = None, case_number: int | None = None +) -> bool: + """Given a Speckle object and a condition, evaluates the condition and returns a boolean value. + + A condition is a pandas Series object with the following keys: + - 'Property Name': The name of the property to evaluate. + - 'Predicate': The predicate to use for evaluation. + - 'Value': The value to compare against. + + Args: + rule_number (string): For information the rule number. + case_number (int): For information the rule clause number. + speckle_object (Base): The Speckle object to evaluate. + condition (pd.Series): The condition to evaluate. + + Returns: + bool: The result of the evaluation. True if the condition is met, False otherwise. + """ + property_name = condition["Property Name"] + predicate_key = condition["Predicate"] + value = condition["Value"] + + _ = rule_number + _ = case_number + + if predicate_key in PREDICATE_METHOD_MAP: + method_name = PREDICATE_METHOD_MAP[predicate_key] + method = getattr(PropertyRules, method_name, None) + + if method: + check_answer = method(speckle_object, property_name, value) + + return check_answer + return False + + +def process_rule( + speckle_objects: list[Base], rule_group: pd.DataFrame +) -> tuple[list[Any], list[Any]] | tuple[list[Base], list[Base]]: + """Processes a set of rules against Speckle objects, returning those that pass and fail. + + The first rule is used as a filter ('WHERE'), and subsequent rules as conditions ('AND'). + + Args: + speckle_objects: List of Speckle objects to be processed. + rule_group: DataFrame defining the filter and conditions. + + Returns: + A tuple of lists containing objects that passed and failed the rule. + """ + # Extract the 'WHERE' condition and subsequent 'AND' conditions + filter_condition = rule_group.iloc[0] + subsequent_conditions = rule_group.iloc[1:] + + # get the last row of the rule_group and get the Message and Report Severity + rule_info = rule_group.iloc[-1] + rule_number = rule_info["Rule Number"] + + # Filter objects based on the 'WHERE' condition + filtered_objects = [ + speckle_object for speckle_object in speckle_objects if evaluate_condition(speckle_object, filter_condition) + ] + + if not filtered_objects or len(list(filtered_objects)) == 0: + return [], [] + + # Initialize lists for passed and failed objects + pass_objects, fail_objects = [], [] + + # Evaluate each filtered object against the 'AND' conditions + for speckle_object in filtered_objects: + if all( + evaluate_condition( + speckle_object=speckle_object, condition=condition, rule_number=rule_number, case_number=index + ) + for index, condition in subsequent_conditions.iterrows() + ): + pass_objects.append(speckle_object) + else: + fail_objects.append(speckle_object) + + return pass_objects, fail_objects + + +def apply_rules_to_objects( + speckle_objects: list[Base], + grouped_rules: DataFrameGroupBy, + automate_context: AutomationContext, +) -> dict[str, tuple[list[Base], list[Base]]]: + """Applies defined rules to a list of objects and updates the automate context based on the results. + + Args: + speckle_objects (List[Base]): The list of objects to which rules are applied. + grouped_rules (pd.DataFrameGroupBy): The DataFrame containing rule definitions. + automate_context (Any): Context manager for attaching rule results. + """ + grouped_results = {} + + rules_processed = 0 + + for rule_id, rule_group in grouped_rules: + rule_id_str = str(rule_id) # Convert rule_id to string + + rules_processed += 1 + + # Ensure rule_group has necessary columns + if "Message" not in rule_group.columns or "Report Severity" not in rule_group.columns: + continue # Or raise an exception if these columns are mandatory + + pass_objects, fail_objects = process_rule(speckle_objects, rule_group) + + attach_results(pass_objects, rule_group.iloc[-1], rule_id_str, automate_context, True) + attach_results(fail_objects, rule_group.iloc[-1], rule_id_str, automate_context, False) + + if len(pass_objects) == 0 and len(fail_objects) == 0: + automate_context.attach_info_to_objects( + category=f"Rule {rule_id_str} Skipped", + object_ids=["0"], # This is a hack to get a rule to report with no valid objects + message=f"No objects found for rule {rule_id_str}", + metadata={}, + ) + # pass + + grouped_results[rule_id_str] = (pass_objects, fail_objects) + + # return pass_objects, fail_objects for each rule + return grouped_results + + +class SeverityLevel(Enum): + """Enum for severity levels.""" + + INFO = "Info" + WARNING = "Warning" + ERROR = "Error" + + +def get_severity(rule_info: pd.Series) -> SeverityLevel: + """Convert a string severity level to the corresponding SeverityLevel enum. + + This function normalizes input strings (because processing user entered dead is hard), handling: + - Case insensitivity (e.g., "info", "WARNING" → "Info", "Warning") + - Shorthand mappings (e.g., "WARN" → "Warning") + - Stripping whitespace + - Defaults to SeverityLevel.ERROR if the input is invalid + """ + severity = rule_info.get("Report Severity") # Extract severity from input data + + # If severity is None or not a string (e.g., numeric input), default to ERROR + if not isinstance(severity, str): + return SeverityLevel.ERROR + + severity = severity.strip().upper() # Remove leading/trailing spaces & normalize case + + # Define a mapping for shorthand or alternate spellings + alias_map = { + "WARN": "WARNING", # Treat "WARN" as "WARNING" + } + + # Replace shorthand values if applicable + severity = alias_map.get(severity, severity) + + # Attempt to match with an existing SeverityLevel enum value (case-insensitive) + return next( + (level for level in SeverityLevel if level.value.upper() == severity), + SeverityLevel.ERROR, # Default to ERROR if no match is found + ) + + +def get_metadata( + rule_id: str, rule_info: pd.Series, passed: bool, speckle_objects: list[Base] +) -> dict[str, str | int | Any]: + """Function that generates metadata with severity validation.""" + metadata = { + "rule_id": rule_id, + "status": "PASS" if passed else "FAIL", + "severity": get_severity(rule_info).value, # Keep proper casing + "rule_message": rule_info["Message"], + "object_count": len(speckle_objects), + } + return metadata + + +def attach_results( + speckle_objects: list[Base], + rule_info: pd.Series, + rule_id: str, + context: AutomationContext, + passed: bool, +) -> None: + """Attaches the results of a rule to the objects in the context. + + Args: + speckle_objects (List[Base]): The list of objects to which the rule was applied. + rule_info (pd.Series): The information about the rule. + rule_id (str): The ID of the rule. + context (AutomationContext): The context manager for attaching results. + passed (bool): Whether the rule passed or failed. + """ + if not speckle_objects: + return + + # Create structured metadata for onward data analysis uses + + metadata = get_metadata(rule_id, rule_info, passed, speckle_objects) + + message = f"{rule_info['Message']}" + + if not passed: + speckle_print(rule_info["Report Severity"]) + + severity = ( + ObjectResultLevel.WARNING + if rule_info["Report Severity"].capitalize() in ["Warning", "Warn"] + else ObjectResultLevel.ERROR + ) + context.attach_result_to_objects( + category=f"Rule {rule_id}", + object_ids=[speckle_object.id for speckle_object in speckle_objects], + message=message, + level=severity, + metadata=metadata, + ) + else: + context.attach_info_to_objects( + category=f"Rule {rule_id}", + object_ids=[speckle_object.id for speckle_object in speckle_objects], + message=message, + metadata=metadata, + ) diff --git a/src/rules.py b/src/rules.py index ba6e39c..08c07cb 100644 --- a/src/rules.py +++ b/src/rules.py @@ -1,59 +1,30 @@ +import math import re -from typing import Any, cast +from typing import Any -import pandas as pd from Levenshtein import ratio -from speckle_automate import AutomationContext, ObjectResultLevel from specklepy.objects.base import Base -from src.helpers import speckle_print - -# We're going to define a set of rules that will allow us to filter and -# process parameters in our Speckle objects. These rules will be encapsulated -# in a class called `ParameterRules`. +PRIMITIVE_TYPES = (bool, int, float, str, type(None)) class Rules: - """A collection of rules for processing properties in Speckle objects. - - Simple rules can be straightforwardly implemented as static methods that - return boolean value to be used either as a filter or a condition. - These can then be abstracted into returning lambda functions that we can - use in our main processing logic. By encapsulating these rules, we can easily - extend or modify them in the future. - """ + """A collection of rules for processing properties in Speckle objects.""" @staticmethod def try_get_display_value( - speckle_object: Base, + speckle_object: Base, ) -> list[Base] | None: - """Try fetching the display value from a Speckle object. - - This method encapsulates the logic for attempting to retrieve the display value from a Speckle object. - It returns a list containing the display values if found, otherwise it returns None. - - Args: - speckle_object (Base): The Speckle object to extract the display value from. - - Returns: - Optional[List[Base]]: A list containing the display values. If no display value is found, - returns None. - """ - # Attempt to get the display value from the speckle_object + """Try fetching the display value from a Speckle object.""" raw_display_value = getattr(speckle_object, "displayValue", None) or getattr( speckle_object, "@displayValue", None ) - # If no display value found, return None if raw_display_value is None: return None - # If display value found, filter out non-Base objects - display_values = [ - value for value in raw_display_value if isinstance(value, Base) - ] + display_values = [value for value in raw_display_value if isinstance(value, Base)] - # If no valid display values found, return None if not display_values: return None @@ -61,231 +32,260 @@ class Rules: @staticmethod def is_displayable_object(speckle_object: Base) -> bool: - """Determines if a given Speckle object is displayable. - - This method encapsulates the logic for determining if a Speckle object is displayable. - It checks if the speckle_object has a display value and returns True if it does, otherwise it returns False. - - Args: - speckle_object (Base): The Speckle object to check. - - Returns: - bool: True if the object has a display value, False otherwise. - """ - # Check for direct displayable state using try_get_display_value + """Determines if a given Speckle object is displayable.""" display_values = Rules.try_get_display_value(speckle_object) if display_values and getattr(speckle_object, "id", None) is not None: return True - # Check for displayable state via definition, using try_get_display_value on the definition object definition = getattr(speckle_object, "definition", None) if definition: definition_display_values = Rules.try_get_display_value(definition) - if ( - definition_display_values - and getattr(definition, "id", None) is not None - ): + if definition_display_values and getattr(definition, "id", None) is not None: return True return False - -def get_displayable_objects(flat_list_of_objects: list[Base]) -> list[Base]: - # modify this lambda from before to use the static method from the Checks class - return [ - speckle_object - for speckle_object in flat_list_of_objects - if Rules.is_displayable_object(speckle_object) - and getattr(speckle_object, "id", None) - ] - - # and the same logic that could be modified to traverse a tree of objects - - -def filter_objects_by_category( - speckle_objects: list[Base], category_input: str -) -> tuple[list[Base], list[Base]]: - """Filters objects by category value and test. - - This function takes a list of Speckle objects, filters out the objects - with a matching category value and satisfies the test, and returns - both the matching and non-matching objects. - - Args: - speckle_objects (List[Base]): The list of Speckle objects to filter. - category_input (str): The category value to match against. - - Returns: - Tuple[List[Base], List[Base]]: A tuple containing two lists: - - The first list contains objects with matching category and test. - - The second list contains objects without matching category or test. - """ - matching_objects = [] - non_matching_objects = [] - - for obj in speckle_objects: - if RevitRules.is_category(obj, category_input): - matching_objects.append(obj) - else: - non_matching_objects.append(obj) - - return matching_objects, non_matching_objects - - -class RevitRules: @staticmethod - def has_parameter( - speckle_object: Base, parameter_name: str, *_args, **_kwargs - ) -> bool: - """Checks if the speckle_object has a Revit parameter with the given name. + def get_displayable_objects(flat_list_of_objects: list[Base]) -> list[Base]: + """Filters a list of Speckle objects to only include displayable objects.""" + return [ + speckle_object + for speckle_object in flat_list_of_objects + if Rules.is_displayable_object(speckle_object) and getattr(speckle_object, "id", None) + ] - This method checks if the speckle_object has a parameter with the specified name, - considering the following cases: - 1. The parameter is a named property at the root object level. - 2. The parameter is stored as a key in the "parameters" dictionary. - 3. The parameter is stored as a nested dictionary within the "parameters" property, - and the parameter name is stored as the value of the "name" property within each nested dictionary. - If the parameter exists, it returns True; otherwise, it returns False. +class PropertyRules: + """A collection of rules for processing parameters in Speckle objects.""" + + @staticmethod + def normalize_path(path: str) -> str: + """Remove technical path prefixes like 'properties' and 'parameters'.""" + parts = path.split(".") + filtered = [p for p in parts if p.lower() not in ("properties", "parameters")] + return ".".join(filtered) + + @staticmethod + def convert_revit_boolean(value: Any) -> Any: + """Convert Revit-style Yes/No strings to boolean values.""" + # Handle None case + if value is None: + return None + + # Already a boolean + if isinstance(value, bool): + return value + + # Handle string case with proper type checking + if isinstance(value, str): + value_lower = value.lower() + if value_lower == "yes": + return True + if value_lower == "no": + return False + + # Return original value if no conversion applied + return value + + @staticmethod + def get_obj_value(obj: Any, get_raw: bool = False) -> Any: + """Extract appropriate value from an object, handling special cases.""" + if get_raw: + return obj + + # Handle primitive types directly + if isinstance(obj, PRIMITIVE_TYPES): + return PropertyRules.convert_revit_boolean(obj) + + # Handle dict + if isinstance(obj, dict): + if "value" in obj: + return PropertyRules.convert_revit_boolean(obj["value"]) + return obj + + # Handle Base object + if isinstance(obj, Base): + if hasattr(obj, "value"): + return PropertyRules.convert_revit_boolean(obj.value) + return obj + + return obj + + @staticmethod + def search_obj(obj: Any, parts: list[str]) -> tuple[bool, Any]: + """Recursively search an object following a path.""" + if not parts: + return True, obj + + current = parts[0] + remaining = parts[1:] + + # Handle dict + if isinstance(obj, dict): + for key in obj: + if key.lower() == current.lower(): + if remaining: + return PropertyRules.search_obj(obj[key], remaining) + return True, obj[key] + + # Handle Base + elif isinstance(obj, Base): + for key in obj.get_member_names(): + if key.lower() == current.lower(): + if remaining: + return PropertyRules.search_obj(getattr(obj, key), remaining) + return True, getattr(obj, key) + + return False, None + + @staticmethod + def find_property(root: Any, search_path: str, get_raw: bool = False) -> tuple[bool, Any]: + """Find a property by searching through nested objects. Args: - speckle_object (Base): The Speckle object to check. - parameter_name (str): The name of the parameter to check for. - *_args: Extra positional arguments which are ignored. - **_kwargs: Extra keyword arguments which are ignored. + root: The root object to search + search_path: Path to the property to find + get_raw: Whether to return raw values without conversion Returns: - bool: True if the object has the parameter, False otherwise. + Tuple of (found: bool, value: Any) """ - if hasattr(speckle_object, parameter_name): - return True + # Normalize the search path + norm_path = PropertyRules.normalize_path(search_path) + parts = norm_path.split(".") - parameters = cast(Base, getattr(speckle_object, "parameters", None)) + # Search through object hierarchy + def traverse(obj: Any, visited: set[int] | None = None) -> tuple[bool, Any]: + if visited is None: + visited = set() - if parameters is None: - return False + # Skip if already visited or not a container type + if not isinstance(obj, dict | Base): + return False, None - # the parameters object can function like a dict but isn't one. - # convert a Base object to a dict - parameters_dict = {} + obj_id = id(obj) + if obj_id in visited: + return False, None - for parameter_key in parameters.get_dynamic_member_names(): - parameters_dict[parameter_key] = getattr(parameters, parameter_key, None) + visited.add(obj_id) - if parameter_name in parameters_dict: - return True + # Try direct path match + found, value = PropertyRules.search_obj(obj, parts) + if found: + return True, PropertyRules.get_obj_value(value, get_raw) - return any( - getattr(param_value, "name", None) == parameter_name - for param_value in parameters_dict.values() - ) + # Handle dict + if isinstance(obj, dict): + for key, val in obj.items(): + if isinstance(val, dict | Base): + found, value = traverse(val, visited) + if found: + return True, value + + # Handle Base + elif isinstance(obj, Base): + for key in obj.get_member_names(): + if not key.startswith("_"): + val = getattr(obj, key) + if isinstance(val, dict | Base): + found, value = traverse(val, visited) + if found: + return True, value + + visited.remove(obj_id) # Clean up visited set + return False, None + + return traverse(root) + + @staticmethod + def has_parameter(speckle_object: Base, parameter_name: str, *_args, **_kwargs) -> bool: + """Check if a parameter exists in the Speckle object.""" + found, _ = PropertyRules.find_property(speckle_object, parameter_name) + return found @staticmethod def get_parameter_value( - speckle_object: Base, - parameter_name: str, - default_value: Any = None, - ) -> Any | None: - """Retrieves the value of the specified Revit parameter from the speckle_object. - - This method checks if the speckle_object has a parameter with the specified name, - considering the following cases: - 1. The parameter is a named property at the root object level. - 2. The parameter is stored as a key in the "parameters" dictionary. - 3. The parameter is stored as a nested dictionary within the "parameters" property, - and the parameter name is stored as the value of the "name" property within each nested dictionary. - - If the parameter exists and its value is not None or the specified default_value, it returns the value. - If the parameter does not exist or its value is None or the specified default_value, it returns None. + speckle_object: Base, + parameter_name: str, + default_value: Any = None, + get_raw: bool = False, + ) -> Any: + """Get a parameter value from the Speckle object using strict path matching. Args: - speckle_object (Base): The Speckle object to retrieve the parameter value from. - parameter_name (str): The name of the parameter to retrieve the value for. - default_value: The default value to compare against. If the parameter value matches this value, - it will be treated the same as None. + speckle_object: The Speckle object to search + parameter_name: Exact parameter path to find + default_value: Value to return if parameter not found + get_raw: Whether to return raw values without conversion Returns: - The value of the parameter if it exists and is not None or the specified default_value, or None otherwise. + The parameter value if found using exact path matching, otherwise default_value """ - # Attempt to retrieve the parameter from the root object level - value = getattr(speckle_object, parameter_name, None) - if value not in [None, default_value]: - return value - - # If the "parameters" attribute is a Base object, extract its dynamic members - parameters = getattr(speckle_object, "parameters", None) - if parameters is None: - return None - - # Prepare a dictionary of parameter values from the dynamic members of the parameters attribute - parameters_dict = { - key: getattr(parameters, key) - for key in parameters.get_dynamic_member_names() - } - - # Search for a direct match or a nested match in the parameters dictionary - param_value = parameters_dict.get(parameter_name) - if param_value is not None: - if isinstance(param_value, Base): - # Extract the nested value from a Base object if available - nested_value = getattr(param_value, "value", None) - if nested_value not in [None, default_value]: - return nested_value - elif param_value not in [None, default_value]: - return param_value - - # Use a generator to find the first matching 'value' for shared parameters stored in Base objects - return next( - ( - getattr(p, "value", None) - for p in parameters_dict.values() - if isinstance(p, Base) and getattr(p, "name", None) == parameter_name - ), - None, - ) - - from typing import Any + found, value = PropertyRules.find_property(speckle_object, parameter_name, get_raw) + return value if found else default_value @staticmethod - def is_parameter_value( - speckle_object: Base, parameter_name: str, value_to_match: Any - ) -> bool: - """Checks if the value of the specified parameter matches the given value. - - Args: - speckle_object (Base): The Speckle object to check. - parameter_name (str): The name of the parameter to check. - value_to_match (Any): The value to match against. - - Returns: - bool: True if the parameter value matches the given value, False otherwise. - """ - parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name) + def is_parameter_value(speckle_object: Base, parameter_name: str, value_to_match: Any) -> bool: + """Checks if the value of the specified parameter matches the given value.""" + parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name) return parameter_value == value_to_match + @staticmethod + def parse_number_from_string(input_string: str): + """Attempts to parse a number from a string.""" + try: + return int(input_string) + except ValueError: + try: + return float(input_string) + except ValueError: + raise ValueError("Input string is not a valid integer or float") + + @staticmethod + def is_parameter_value_greater_than(speckle_object: Base, parameter_name: str, threshold: str) -> bool: + """Checks if parameter value is greater than threshold.""" + parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name) + if parameter_value is None: + return False + if not isinstance(parameter_value, int | float): + raise ValueError(f"Parameter value must be a number, got {type(parameter_value)}") + return parameter_value > PropertyRules.parse_number_from_string(threshold) + + @staticmethod + def is_parameter_value_less_than(speckle_object: Base, parameter_name: str, threshold: str) -> bool: + """Checks if parameter value is less than threshold.""" + parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name) + if parameter_value is None: + return False + if not isinstance(parameter_value, int | float): + raise ValueError(f"Parameter value must be a number, got {type(parameter_value)}") + return parameter_value < PropertyRules.parse_number_from_string(threshold) + + @staticmethod + def is_parameter_value_in_range(speckle_object: Base, parameter_name: str, value_range: str) -> bool: + """Checks if parameter value falls within range.""" + min_value, max_value = value_range.split(",") + min_value = PropertyRules.parse_number_from_string(min_value) + max_value = PropertyRules.parse_number_from_string(max_value) + + parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name) + if parameter_value is None: + return False + if not isinstance(parameter_value, int | float): + raise ValueError(f"Parameter value must be a number, got {type(parameter_value)}") + + return min_value <= parameter_value <= max_value + @staticmethod def is_parameter_value_like( - speckle_object: Base, - parameter_name: str, - pattern: str, - fuzzy: bool = False, - threshold: float = 0.8, + speckle_object: Base, + parameter_name: str, + pattern: str, + fuzzy: bool = False, + threshold: float = 0.8, ) -> bool: - """Checks if the value of the specified parameter matches the given pattern. - - Args: - speckle_object (Base): The Speckle object to check. - parameter_name (str): The name of the parameter to check. - pattern (str): The pattern to match against. - fuzzy (bool): If True, performs fuzzy matching using Levenshtein distance. - If False (default), performs exact pattern matching using regular expressions. - threshold (float): The similarity threshold for fuzzy matching (default: 0.8). - Only applicable when fuzzy=True. - - Returns: - bool: True if the parameter value matches the pattern (exact or fuzzy), False otherwise. - """ - parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name) + """Checks if parameter value matches pattern.""" + parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name) if parameter_value is None: return False @@ -296,434 +296,210 @@ class RevitRules: return bool(re.match(pattern, str(parameter_value))) @staticmethod - def parse_number_from_string(input_string: str): - """Attempts to parse an integer or float from a given string. - - Args: - input_string (str): The string containing the number to be parsed. - - Returns: - int or float: The parsed number, or raises ValueError if parsing is not possible. - """ - try: - # First try to convert it to an integer - return int(input_string) - except ValueError: - # If it fails to convert to an integer, try to convert to a float - try: - return float(input_string) - except ValueError: - # Raise an error if neither conversion is possible - raise ValueError("Input string is not a valid integer or float") - - @staticmethod - def is_parameter_value_greater_than( - speckle_object: Base, parameter_name: str, threshold: str - ) -> bool: - """Checks if the value of the specified parameter is greater than the given threshold. - - Args: - speckle_object (Base): The Speckle object to check. - parameter_name (str): The name of the parameter to check. - threshold (Union[int, float]): The threshold value to compare against. - - Returns: - bool: True if the parameter value is greater than the threshold, False otherwise. - """ - parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name) - if parameter_value is None: - return False - - if not isinstance(parameter_value, int | float): - raise ValueError( - f"Parameter value must be a number, got {type(parameter_value)}" - ) - return parameter_value > RevitRules.parse_number_from_string(threshold) - - @staticmethod - def is_parameter_value_less_than( - speckle_object: Base, parameter_name: str, threshold: str - ) -> bool: - """Checks if the value of the specified parameter is less than the given threshold. - - Args: - speckle_object (Base): The Speckle object to check. - parameter_name (str): The name of the parameter to check. - threshold (Union[int, float]): The threshold value to compare against. - - Returns: - bool: True if the parameter value is less than the threshold, False otherwise. - """ - parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name) - if parameter_value is None: - return False - if not isinstance(parameter_value, int | float): - raise ValueError( - f"Parameter value must be a number, got {type(parameter_value)}" - ) - return parameter_value < RevitRules.parse_number_from_string(threshold) - - @staticmethod - def is_parameter_value_in_range( - speckle_object: Base, parameter_name: str, range: str - ) -> bool: - """Checks if the value of the specified parameter falls within the given range. - - Args: - speckle_object (Base): The Speckle object to check. - parameter_name (str): The name of the parameter to check. - range (str): The range to check against, in the format "min_value, max_value". - - Returns: - bool: True if the parameter value falls within the range (inclusive), False otherwise. - """ - min_value, max_value = range.split(",") - min_value = RevitRules.parse_number_from_string(min_value) - max_value = RevitRules.parse_number_from_string(max_value) - - parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name) - if parameter_value is None: - return False - if not isinstance(parameter_value, int | float): - raise ValueError( - f"Parameter value must be a number, got {type(parameter_value)}" - ) - - return min_value <= parameter_value <= max_value - - @staticmethod - def is_parameter_value_in_range_expanded( - speckle_object: Base, - parameter_name: str, - min_value: int | float, - max_value: int | float, - inclusive: bool = True, - ) -> bool: - """Checks if the value of the specified parameter falls within the given range. - - Args: - speckle_object (Base): The Speckle object to check. - parameter_name (str): The name of the parameter to check. - min_value (Union[int, float]): The minimum value of the range. - max_value (Union[int, float]): The maximum value of the range. - inclusive (bool): If True (default), the range is inclusive (min <= value <= max). - If False, the range is exclusive (min < value < max). - - Returns: - bool: True if the parameter value falls within the range (inclusive), False otherwise. - """ - parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name) - if parameter_value is None: - return False - if not isinstance(parameter_value, int | float): - raise ValueError( - f"Parameter value must be a number, got {type(parameter_value)}" - ) - - return ( - min_value <= parameter_value <= max_value - if inclusive - else min_value < parameter_value < max_value - ) - - @staticmethod - def is_parameter_value_in_list( - speckle_object: Base, parameter_name: str, value_list: list[Any] - ) -> bool: - """Checks if the value of the specified parameter is present in the given list of values. - - Args: - speckle_object (Base): The Speckle object to check. - parameter_name (str): The name of the parameter to check. - value_list (List[Any]): The list of values to check against. - - Returns: - bool: True if the parameter value is found in the list, False otherwise. - """ - parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name) + def is_parameter_value_in_list(speckle_object: Base, parameter_name: str, value_list: list[Any] | str) -> bool: + """Checks if parameter value is in list.""" + parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name) if isinstance(value_list, str): - value_list = [value.strip() for value in value_list.split(",")] + value_list = [v.strip() for v in value_list.split(",") if v.strip()] - # parameter_value is effectively Any type, so to find its value in the value_list def is_value_in_list(value: Any, my_list: Any) -> bool: - # Ensure that my_list is actually a list if isinstance(my_list, list): return value in my_list or str(value) in my_list - else: - speckle_print(f"Expected a list, got {type(my_list)} instead.") - return False + return False return is_value_in_list(parameter_value, value_list) + @staticmethod + def _check_boolean_value(value: Any, values_to_match: tuple[str, ...]) -> bool: + """Check if a value matches any target value in expected format.""" + if isinstance(value, bool): + return value is (True if "true" in values_to_match else False) + + if isinstance(value, str): + return value.lower() in values_to_match + + return False + @staticmethod def is_parameter_value_true(speckle_object: Base, parameter_name: str) -> bool: - """Checks if the value of the specified parameter is True. - - Args: - speckle_object (Base): The Speckle object to check. - parameter_name (str): The name of the parameter to check. - - Returns: - bool: True if the parameter value is True, False otherwise. - """ - parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name) - return parameter_value is True + """Check if parameter value represents true.""" + parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name) + return PropertyRules._check_boolean_value(parameter_value, ("yes", "true", "1")) @staticmethod def is_parameter_value_false(speckle_object: Base, parameter_name: str) -> bool: - """Checks if the value of the specified parameter is False. - - Args: - speckle_object (Base): The Speckle object to check. - parameter_name (str): The name of the parameter to check. - - Returns: - bool: True if the parameter value is False, False otherwise. - """ - parameter_value = RevitRules.get_parameter_value(speckle_object, parameter_name) - return parameter_value is False + """Check if parameter value represents false.""" + parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name) + return PropertyRules._check_boolean_value(parameter_value, ("no", "false", "0")) @staticmethod def has_category(speckle_object: Base) -> bool: - """Checks if the speckle_object has a 'category' parameter. - - This method checks if the speckle_object has a 'category' parameter. - If the 'category' parameter exists, it returns True; otherwise, it returns False. - - Args: - speckle_object (Base): The Speckle object to check. - - Returns: - bool: True if the object has the 'category' parameter, False otherwise. - """ - return RevitRules.has_parameter(speckle_object, "category") + """Check if object has category.""" + return PropertyRules.has_parameter(speckle_object, "category") @staticmethod def is_category(speckle_object: Base, category_input: str) -> bool: - """Checks if the value of the 'category' property matches the given input. - - This method checks if the 'category' property of the speckle_object - matches the given category_input. If they match, it returns True; - otherwise, it returns False. - - Args: - speckle_object (Base): The Speckle object to check. - category_input (str): The category value to compare against. - - Returns: - bool: True if the 'category' property matches the input, False otherwise. - """ - category_value = RevitRules.get_parameter_value(speckle_object, "category") + """Check if object matches category.""" + category_value = PropertyRules.get_parameter_value(speckle_object, "category") return category_value == category_input @staticmethod def get_category_value(speckle_object: Base) -> str: - """Retrieves the value of the 'category' parameter from the speckle_object. + """Get object's category value.""" + return PropertyRules.get_parameter_value(speckle_object, "category") - This method retrieves the value of the 'category' parameter from the speckle_object. - If the 'category' parameter exists and its value is not None, it returns the value. - If the 'category' parameter does not exist or its value is None, it returns an empty string. + @staticmethod + def _try_boolean_comparison(value1: Any, value2: Any, allow_yes_no: bool) -> tuple[bool, bool]: + """Attempts to compare two values as booleans.""" + + def strict_convert_boolean(value: Any) -> Any: + """Convert 'True'/'False' strings to booleans, and use `convert_revit_boolean` for Yes/No.""" + if value is None: + return None + if isinstance(value, bool): + return value + if isinstance(value, str): + value_lower = value.strip().lower() + if value_lower == "true": + return True + if value_lower == "false": + return False + # Use convert_revit_boolean for Yes/No conversion + return PropertyRules.convert_revit_boolean(value) if allow_yes_no else value + + return value + + bool1 = strict_convert_boolean(value1) + bool2 = strict_convert_boolean(value2) + + # If both are valid booleans, compare them + if isinstance(bool1, bool) and isinstance(bool2, bool): + return True, bool1 == bool2 + + return False, False + + @staticmethod + def _compare_values( + value1: Any, + value2: Any, + case_sensitive: bool = False, + tolerance: float = 1e-6, + allow_yes_no_bools: bool = True, + use_exact: bool = False, + ) -> bool: + """Core logic for comparing two values with type handling and tolerance. Args: - speckle_object (Base): The Speckle object to retrieve the 'category' parameter value from. + value1: First value to compare + value2: Second value to compare + case_sensitive: Whether to perform case-sensitive string comparison + tolerance: Tolerance for floating point comparisons + allow_yes_no_bools: Whether to convert Yes/No strings to booleans when comparing with boolean values + use_exact: Whether to use exact equality for numeric comparisons + Returns: + bool: True if values are considered equal, False otherwise + """ + # Try boolean comparison first + can_compare, result = PropertyRules._try_boolean_comparison(value1, value2, allow_yes_no_bools) + if can_compare: + return result + + # Handle case where one value is a string that can be interpreted as a number + if isinstance(value1, str) and value1.replace(".", "", 1).isdigit(): + value1 = float(value1) + if isinstance(value2, str) and value2.replace(".", "", 1).isdigit(): + value2 = float(value2) + + # For strings: Allow case insensitivity if specified + if isinstance(value1, str) and isinstance(value2, str): + if not case_sensitive: + return value1.lower() == value2.lower() + return value1 == value2 + + # For floats and ints, check using math.isclose for floating-point precision + if isinstance(value1, float | int) and isinstance(value2, float | int): + if use_exact: + return value1 == value2 # Strict equality for identical comparisons + return math.isclose(value1, value2, abs_tol=tolerance) + + # Fallback: Use regular equality for other cases + return value1 == value2 + + @staticmethod + def is_equal_value( + speckle_object: Base, + parameter_name: str, + value_to_match: Any, + case_sensitive: bool = False, + tolerance: float = 1e-6, + ) -> bool: + """Compares a parameter value from a Speckle object with the provided value. + + Args: + speckle_object (Base): The Speckle object containing the parameter + parameter_name (str): Name of the parameter to compare + value_to_match: The value to compare against (float, string, int, etc.) + case_sensitive (bool): Whether to perform case-sensitive comparison for strings + tolerance (float): Tolerance for floating point comparisons Returns: - str: The value of the 'category' parameter if it exists and is not None, or an empty string otherwise. + bool: True if values are considered equal, False otherwise """ - return RevitRules.get_parameter_value(speckle_object, "category") + parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name) + if parameter_value is None: + return False - -# Mapping of input predicates to the corresponding methods in RevitRules -input_predicate_mapping = { - "exists": "has_parameter", - "matches": "is_parameter_value", - "greater than": "is_parameter_value_greater_than", - "less than": "is_parameter_value_less_than", - "in range": "is_parameter_value_in_range", - "in list": "is_parameter_value_in_list", - "equals": "is_parameter_value", - "true": "is_parameter_value_true", - "false": "is_parameter_value_false", - "is like": "is_parameter_value_like", -} - - -def evaluate_condition(speckle_object: Base, condition: pd.Series) -> bool: - """Given a Speckle object and a condition, evaluates the condition and returns a boolean value. - A condition is a pandas Series object with the following keys: - - 'Property Name': The name of the property to evaluate. - - 'Predicate': The predicate to use for evaluation. - - 'Value': The value to compare against. - - Args: - speckle_object (Base): The Speckle object to evaluate. - condition (pd.Series): The condition to evaluate. - - Returns: - bool: The result of the evaluation. True if the condition is met, False otherwise. - """ - property_name = condition["Property Name"] - predicate_key = condition["Predicate"] - value = condition["Value"] - - if predicate_key in input_predicate_mapping: - method_name = input_predicate_mapping[predicate_key] - method = getattr(RevitRules, method_name, None) - - # speckle_print(f"Checking {property_name} {predicate_key} {value}") - - if method: - check_answer = method(speckle_object, property_name, value) - - return check_answer - return False - - -def process_rule( - speckle_objects: list[Base], rule_group: pd.DataFrame -) -> tuple[list[Base], list[Base]]: - """Processes a set of rules against Speckle objects, returning those that pass and fail. - The first rule is used as a filter ('WHERE'), and subsequent rules as conditions ('AND'). - - Args: - speckle_objects: List of Speckle objects to be processed. - rule_group: DataFrame defining the filter and conditions. - - Returns: - A tuple of lists containing objects that passed and failed the rule. - """ - # Extract the 'WHERE' condition and subsequent 'AND' conditions - filter_condition = rule_group.iloc[0] - subsequent_conditions = rule_group.iloc[1:] - - # get the last row of the rule_group and get the Message and Report Severity - rule_info = rule_group.iloc[-1] - - # Filter objects based on the 'WHERE' condition - filtered_objects = [ - speckle_object - for speckle_object in speckle_objects - if evaluate_condition(speckle_object, filter_condition) - ] - - rule_number = rule_info["Rule Number"] - - speckle_print( - f"{filter_condition['Logic']} {filter_condition['Property Name']} " - f"{filter_condition['Predicate']} {filter_condition['Value']}" - ) - - speckle_print( - f"{rule_number}: {len(list(filtered_objects))} objects passed the filter." - ) - - # Initialize lists for passed and failed objects - pass_objects, fail_objects = [], [] - - # Evaluate each filtered object against the 'AND' conditions - for speckle_object in filtered_objects: - if all( - evaluate_condition(speckle_object, cond) - for _, cond in subsequent_conditions.iterrows() - ): - pass_objects.append(speckle_object) - else: - fail_objects.append(speckle_object) - - return pass_objects, fail_objects - - -def apply_rules_to_objects( - speckle_objects: list[Base], - rules_df: pd.DataFrame, - automate_context: AutomationContext, -) -> dict[str, tuple[list[Base], list[Base]]]: - """Applies defined rules to a list of objects and updates the automate context based on the results. - - Args: - speckle_objects (List[Base]): The list of objects to which rules are applied. - rules_df (pd.DataFrame): The DataFrame containing rule definitions. - automate_context (Any): Context manager for attaching rule results. - """ - grouped_rules = rules_df.groupby("Rule Number") - - grouped_results = {} - - for rule_id, rule_group in grouped_rules: - rule_id_str = str(rule_id) # Convert rule_id to string - - # Ensure rule_group has necessary columns - if ( - "Message" not in rule_group.columns - or "Report Severity" not in rule_group.columns - ): - continue # Or raise an exception if these columns are mandatory - - pass_objects, fail_objects = process_rule(speckle_objects, rule_group) - - attach_results( - pass_objects, rule_group.iloc[-1], rule_id_str, automate_context, True - ) - attach_results( - fail_objects, rule_group.iloc[-1], rule_id_str, automate_context, False + return PropertyRules._compare_values( + parameter_value, value_to_match, case_sensitive, tolerance, allow_yes_no_bools=True ) - grouped_results[rule_id_str] = (pass_objects, fail_objects) + @staticmethod + def is_not_equal_value( + speckle_object: Base, + parameter_name: str, + value_to_match: Any, + case_sensitive: bool = False, + tolerance: float = 1e-6, + ) -> bool: + """Checks if a parameter value from a Speckle object is not equal to the provided value. - # return pass_objects, fail_objects for each rule - return grouped_results + Args: + speckle_object (Base): The Speckle object containing the parameter + parameter_name (str): Name of the parameter to compare + value_to_match: The value to compare against (float, string, int, etc.) + case_sensitive (bool): Whether to perform case-sensitive comparison for strings + tolerance (float): Tolerance for floating point comparisons + Returns: + bool: True if values are not equal or parameter doesn't exist, False if they are equal + """ + parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name) + if parameter_value is None: + return True # Non-existent parameters are considered not equal -def attach_results( - speckle_objects: list[Base], - rule_info: pd.Series, - rule_id: str, - context: AutomationContext, - passed: bool, -) -> None: - """Attaches the results of a rule to the objects in the context. - - Args: - speckle_objects (List[Base]): The list of objects to which the rule was applied. - rule_info (pd.Series): The information about the rule. - rule_id (str): The ID of the rule. - context (AutomationContext): The context manager for attaching results. - passed (bool): Whether the rule passed or failed. - """ - if not speckle_objects: - return - - # Create structured metadata for onward data analysis uses - metadata = { - "rule_id": rule_id, - "status": "PASS" if passed else "FAIL", - "severity": rule_info["Report Severity"], - "rule_message": rule_info["Message"], - "object_count": len(speckle_objects) - } - - message = f"{rule_info['Message']}" - - if not passed: - speckle_print(rule_info["Report Severity"]) - - severity = ( - ObjectResultLevel.WARNING - if rule_info["Report Severity"].capitalize() in ["Warning", "Warn"] - else ObjectResultLevel.ERROR + return not PropertyRules._compare_values( + parameter_value, value_to_match, case_sensitive, tolerance, allow_yes_no_bools=True ) - context.attach_result_to_objects( - category=f"Rule {rule_id}", - object_ids=[speckle_object.id for speckle_object in speckle_objects], - message=message, - level=severity, - metadata=metadata, - ) - else: - context.attach_info_to_objects( - category=f"Rule {rule_id}", - object_ids=[speckle_object.id for speckle_object in speckle_objects], - message=message, - metadata=metadata, + + @staticmethod + def is_identical_value(speckle_object: Base, parameter_name: str, value_to_match: Any) -> bool: + """Checks if a parameter value from a Speckle object is exactly identical to the provided value. + + Uses strict comparison with no type coercion, case sensitivity, or Yes/No conversion. + + Args: + speckle_object (Base): The Speckle object containing the parameter + parameter_name (str): Name of the parameter to compare + value_to_match: The value to compare against + + Returns: + bool: True if values are identical, False otherwise + """ + parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name, get_raw=True) + if parameter_value is None: + return False + + return PropertyRules._compare_values( + parameter_value, value_to_match, case_sensitive=True, tolerance=0, allow_yes_no_bools=False, use_exact=True ) diff --git a/src/rules_old.py b/src/rules_old.py new file mode 100644 index 0000000..e445931 --- /dev/null +++ b/src/rules_old.py @@ -0,0 +1,756 @@ +# import re +# from typing import Any +# +# from Levenshtein import ratio +# from specklepy.objects.base import Base +# +# from src.helpers import get_item, has_item, speckle_print +# from src.inputs import PropertyMatchMode + +# We're going to define a set of rules that will allow us to filter and +# process parameters in our Speckle objects. These rules will be encapsulated +# in a class called `ParameterRules`. + + +# class Rules: +# """A collection of rules for processing properties in Speckle objects. +# +# Simple rules can be straightforwardly implemented as static methods that +# return boolean value to be used either as a filter or a condition. +# These can then be abstracted into returning lambda functions that we can +# use in our main processing logic. By encapsulating these rules, we can easily +# extend or modify them in the future. +# """ +# +# @staticmethod +# def try_get_display_value( +# speckle_object: Base, +# ) -> list[Base] | None: +# """Try fetching the display value from a Speckle object. +# +# This method encapsulates the logic for attempting to retrieve the display value from a +# Speckle object. It returns a list containing the display values if found, +# otherwise it returns None. +# +# Args: +# speckle_object (Base): The Speckle object to extract the display value from. +# +# Returns: +# Optional[List[Base]]: A list containing the display values. +# If no display value is found, returns None. +# """ +# # Attempt to get the display value from the speckle_object +# raw_display_value = getattr(speckle_object, "displayValue", None) or getattr( +# speckle_object, "@displayValue", None +# ) +# +# # If no display value found, return None +# if raw_display_value is None: +# return None +# +# # If display value found, filter out non-Base objects +# display_values = [value for value in raw_display_value if isinstance(value, Base)] +# +# # If no valid display values found, return None +# if not display_values: +# return None +# +# return display_values +# +# @staticmethod +# def is_displayable_object(speckle_object: Base) -> bool: +# """Determines if a given Speckle object is displayable. +# +# This method encapsulates the logic for determining if a Speckle object is displayable. +# It checks if the speckle_object has a display value and returns True if it does, otherwise it returns False. +# +# Args: +# speckle_object (Base): The Speckle object to check. +# +# Returns: +# bool: True if the object has a display value, False otherwise. +# """ +# # Check for direct displayable state using try_get_display_value +# display_values = Rules.try_get_display_value(speckle_object) +# if display_values and getattr(speckle_object, "id", None) is not None: +# return True +# +# # Check for displayable state via definition, using try_get_display_value on the definition object +# definition = getattr(speckle_object, "definition", None) +# if definition: +# definition_display_values = Rules.try_get_display_value(definition) +# if definition_display_values and getattr(definition, "id", None) is not None: +# return True +# +# return False +# +# @staticmethod +# def get_displayable_objects(flat_list_of_objects: list[Base]) -> list[Base]: +# """Filters a list of Speckle objects to only include displayable objects. +# +# This function takes a list of Speckle objects and filters out the objects that are displayable. +# It returns a list containing only the displayable objects. +# +# Args: +# flat_list_of_objects (List[Base]): The list of Speckle objects to filter. +# """ +# return [ +# speckle_object +# for speckle_object in flat_list_of_objects +# if Rules.is_displayable_object(speckle_object) and getattr(speckle_object, "id", None) +# ] +# +# +# class PropertyRules: +# """A collection of rules for processing Revit parameters in Speckle objects.""" +# +# @staticmethod +# def has_parameter(speckle_object: Base, parameter_name: str, *_args, **_kwargs) -> bool: +# """Checks if the speckle_object has a parameter with the given name.""" +# found, _ = ParameterSearch.lookup_parameter(speckle_object, parameter_name) +# return found +# +# @staticmethod +# def get_parameter_value( +# speckle_object: Base, +# parameter_name: str, +# match_mode: PropertyMatchMode = PropertyMatchMode.MIXED, +# default_value: Any = None, +# ) -> Any: +# """Gets the value of a parameter if it exists.""" +# found, value = ParameterSearch.lookup_parameter(speckle_object, parameter_name, match_mode) +# return value if found else default_value +# +# @staticmethod +# def is_v3(speckle_object: Base) -> bool: +# """Determines if a Speckle object uses v3 parameter structure. +# +# Args: +# speckle_object (Base): The Speckle object to check +# +# Returns: +# bool: True if object uses v3 structure, False otherwise +# """ +# properties = get_item(speckle_object, "properties") +# return bool(properties and has_item(properties, "Parameters")) +# +# # @staticmethod +# # def has_parameter(speckle_object: Base, parameter_name: str, *_args, **_kwargs) -> bool: +# # """Checks if the speckle_object has a Revit parameter with the given name. +# # +# # First checks direct properties, then determines if it's a v2 or v3 object structure +# # and searches in the appropriate parameter hierarchy. +# # +# # Args: +# # speckle_object (Base): The Speckle object to check. +# # parameter_name (str): The name of the parameter to check for. +# # *_args: Extra positional arguments which are ignored. +# # **_kwargs: Extra keyword arguments which are ignored. +# # +# # Returns: +# # bool: True if the object has the parameter, False otherwise. +# # """ +# # # Check direct property first regardless of version +# # if has_item(speckle_object, parameter_name): +# # return True +# # +# # if PropertyRules.is_v3(speckle_object): +# # properties = get_item(speckle_object, "properties") +# # parameters = get_item(properties, "Parameters") +# # if parameters: +# # +# # def search_v3_params(params: dict, search_name: str) -> bool: +# # for key, value in params.items(): +# # if isinstance(value, dict): +# # # Check direct name match +# # if key.lower() == search_name.lower(): +# # return True +# # # Check nested parameters +# # if search_v3_params(value, search_name): +# # return True +# # return False +# # +# # return search_v3_params(parameters, parameter_name) +# # else: +# # # Handle v2 structure +# # parameters = get_item(speckle_object, "parameters") +# # if not parameters: +# # return False +# # +# # # Check direct parameter name match +# # if has_item(parameters, parameter_name): +# # return True +# # +# # # Check nested parameters with name property +# # def check_nested_name(value: Any) -> bool: +# # if isinstance(value, dict): +# # return get_item(value, "name") == parameter_name +# # return get_item(value, "name") == parameter_name if hasattr(value, "name") else False +# # +# # return any(check_nested_name(param_value) for param_value in parameters.values() if param_value is not None) +# # +# # return False +# # +# # @staticmethod +# # def get_parameter_value( +# # speckle_object: Base, +# # parameter_name: str, +# # match_mode: PropertyMatchMode = PropertyMatchMode.MIXED, +# # default_value: Any = None, +# # ) -> Any | None: +# # """Retrieves the value of the specified parameter from the speckle_object. +# # +# # First checks direct properties, then determines if it's a v2 or v3 object structure +# # and retrieves from the appropriate parameter hierarchy. +# # +# # Args: +# # speckle_object (Base): The Speckle object to retrieve the parameter value from. +# # parameter_name (str): The name of the parameter to retrieve the value for. +# # match_mode (PropertyMatchMode): The matching mode to use for parameter lookup +# # default_value: The default value to return if parameter not found. +# # +# # Returns: +# # The value of the parameter if found, else default_value. +# # """ +# # # Check direct property first regardless of version +# # if has_item(speckle_object, parameter_name): +# # value = get_item(speckle_object, parameter_name) +# # return value if value is not None else default_value +# # +# # if PropertyRules.is_v3(speckle_object): +# # return PropertyRules.get_v3_parameter(speckle_object, parameter_name, match_mode, default_value) +# # else: +# # return PropertyRules.get_v2_parameter(speckle_object, parameter_name, match_mode, default_value) +# +# # @staticmethod +# # def get_v2_parameter(obj: Base, name: str, mode: PropertyMatchMode, default: Any) -> Any: +# # """Get parameter value from v2 Speckle object structure. +# # +# # Args: +# # obj: Speckle object to get parameter from +# # name: Parameter name to retrieve +# # mode: Match mode for parameter lookup +# # default: Default value if parameter not found +# # +# # Returns: +# # Parameter value if found, else default +# # """ +# # parameters = get_item(obj, "parameters") +# # if not parameters: +# # return default +# # +# # if mode == PropertyMatchMode.STRICT: +# # return PropertyRules.strict_parameter_lookup(name, parameters, default) +# # +# # def search_params(param_dict: dict, search_name: str, fuzzy: bool) -> Any: +# # for key, value in param_dict.items(): +# # key_match = (key.lower() == search_name.lower()) or (fuzzy and search_name.lower() in key.lower()) +# # if key_match: +# # # Handle both direct values and nested parameter objects +# # return get_item(value, "value", value) +# # return None +# # +# # result = search_params(parameters, name, mode == PropertyMatchMode.FUZZY) +# # return result if result is not None else default +# # +# # @staticmethod +# # def get_v3_parameter(obj: Base, name: str, mode: PropertyMatchMode, default: Any) -> Any: +# # """Get parameter value from v3 Speckle object structure. +# # +# # Args: +# # obj: Speckle object to get parameter from +# # name: Parameter name to retrieve +# # mode: Match mode for parameter lookup +# # default: Default value if parameter not found +# # +# # Returns: +# # Parameter value if found, else default +# # """ +# # properties = get_item(obj, "properties") +# # if not properties or not has_item(properties, "Parameters"): +# # return default +# # +# # parameters = get_item(properties, "Parameters") +# # if not parameters: +# # return default +# # +# # if mode == PropertyMatchMode.STRICT: +# # return PropertyRules.strict_parameter_lookup(name, parameters, default) +# # +# # def search_nested(data: dict, search_name: str, fuzzy: bool) -> Any: +# # for nested_key, value in data.items(): +# # if isinstance(value, dict): +# # key_match = (nested_key.lower() == search_name.lower()) or ( +# # fuzzy and search_name.lower() in nested_key.lower() +# # ) +# # +# # if key_match and has_item(value, "value"): +# # return get_item(value, "value") +# # +# # nested_result = search_nested(value, search_name, fuzzy) +# # if nested_result is not None: +# # return nested_result +# # return None +# # +# # result = search_nested(parameters, name, mode == PropertyMatchMode.FUZZY) +# # return result if result is not None else default +# # +# # @staticmethod +# # def strict_parameter_lookup(name: str, parameters: dict, default: Any) -> Any: +# # """Perform strict parameter lookup following exact path. +# # +# # Args: +# # name: Parameter path (dot separated) +# # parameters: Parameters dictionary +# # default: Default value if not found +# # +# # Returns: +# # Parameter value if found, else default +# # """ +# # path_parts = name.split(".") +# # current = parameters +# # +# # for part in path_parts: +# # if not current or not isinstance(current, dict): +# # return default +# # +# # # Find exact case-insensitive match +# # key = next((k for k in current.keys() if k.lower() == part.lower()), None) +# # if not key: +# # return default +# # +# # current = get_item(current, key) +# # +# # # Handle both direct values and parameter objects +# # if isinstance(current, dict): +# # return get_item(current, "value", current) +# # return current +# +# @staticmethod +# def is_parameter_value(speckle_object: Base, parameter_name: str, value_to_match: Any) -> bool: +# """Checks if the value of the specified parameter matches the given value. +# +# Args: +# speckle_object (Base): The Speckle object to check. +# parameter_name (str): The name of the parameter to check. +# value_to_match (Any): The value to match against. +# +# Returns: +# bool: True if the parameter value matches the given value, False otherwise. +# """ +# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name) +# return parameter_value == value_to_match +# +# @staticmethod +# def is_parameter_value_like( +# speckle_object: Base, +# parameter_name: str, +# pattern: str, +# fuzzy: bool = False, +# threshold: float = 0.8, +# ) -> bool: +# """Checks if the value of the specified parameter matches the given pattern. +# +# Args: +# speckle_object (Base): The Speckle object to check. +# parameter_name (str): The name of the parameter to check. +# pattern (str): The pattern to match against. +# fuzzy (bool): If True, performs fuzzy matching using Levenshtein distance. +# If False (default), performs exact pattern matching using regular expressions. +# threshold (float): The similarity threshold for fuzzy matching (default: 0.8). +# Only applicable when fuzzy=True. +# +# Returns: +# bool: True if the parameter value matches the pattern (exact or fuzzy), False otherwise. +# """ +# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name) +# if parameter_value is None: +# return False +# +# if fuzzy: +# similarity = ratio(str(parameter_value), pattern) +# return similarity >= threshold +# else: +# return bool(re.match(pattern, str(parameter_value))) +# +# @staticmethod +# def parse_number_from_string(input_string: str): +# """Attempts to parse an integer or float from a given string. +# +# Args: +# input_string (str): The string containing the number to be parsed. +# +# Returns: +# int or float: The parsed number, or raises ValueError if parsing is not possible. +# """ +# try: +# # First try to convert it to an integer +# return int(input_string) +# except ValueError: +# # If it fails to convert to an integer, try to convert to a float +# try: +# return float(input_string) +# except ValueError: +# # Raise an error if neither conversion is possible +# raise ValueError("Input string is not a valid integer or float") +# +# @staticmethod +# def is_parameter_value_greater_than(speckle_object: Base, parameter_name: str, threshold: str) -> bool: +# """Checks if the value of the specified parameter is greater than the given threshold. +# +# Args: +# speckle_object (Base): The Speckle object to check. +# parameter_name (str): The name of the parameter to check. +# threshold (Union[int, float]): The threshold value to compare against. +# +# Returns: +# bool: True if the parameter value is greater than the threshold, False otherwise. +# """ +# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name) +# if parameter_value is None: +# return False +# +# if not isinstance(parameter_value, int | float): +# raise ValueError(f"Parameter value must be a number, got {type(parameter_value)}") +# return parameter_value > PropertyRules.parse_number_from_string(threshold) +# +# @staticmethod +# def is_parameter_value_less_than(speckle_object: Base, parameter_name: str, threshold: str) -> bool: +# """Checks if the value of the specified parameter is less than the given threshold. +# +# Args: +# speckle_object (Base): The Speckle object to check. +# parameter_name (str): The name of the parameter to check. +# threshold (Union[int, float]): The threshold value to compare against. +# +# Returns: +# bool: True if the parameter value is less than the threshold, False otherwise. +# """ +# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name) +# if parameter_value is None: +# return False +# if not isinstance(parameter_value, int | float): +# raise ValueError(f"Parameter value must be a number, got {type(parameter_value)}") +# return parameter_value < PropertyRules.parse_number_from_string(threshold) +# +# @staticmethod +# def is_parameter_value_in_range(speckle_object: Base, parameter_name: str, value_range: str) -> bool: +# """Checks if the value of the specified parameter falls within the given range. +# +# Args: +# speckle_object (Base): The Speckle object to check. +# parameter_name (str): The name of the parameter to check. +# value_range (str): The range to check against, in the format "min_value, max_value". +# +# Returns: +# bool: True if the parameter value falls within the range (inclusive), False otherwise. +# """ +# min_value, max_value = value_range.split(",") +# min_value = PropertyRules.parse_number_from_string(min_value) +# max_value = PropertyRules.parse_number_from_string(max_value) +# +# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name) +# if parameter_value is None: +# return False +# if not isinstance(parameter_value, int | float): +# raise ValueError(f"Parameter value must be a number, got {type(parameter_value)}") +# +# return min_value <= parameter_value <= max_value +# +# @staticmethod +# def is_parameter_value_in_range_expanded( +# speckle_object: Base, +# parameter_name: str, +# min_value: int | float, +# max_value: int | float, +# inclusive: bool = True, +# ) -> bool: +# """Checks if the value of the specified parameter falls within the given range. +# +# Args: +# speckle_object (Base): The Speckle object to check. +# parameter_name (str): The name of the parameter to check. +# min_value (Union[int, float]): The minimum value of the range. +# max_value (Union[int, float]): The maximum value of the range. +# inclusive (bool): If True (default), the range is inclusive (min <= value <= max). +# If False, the range is exclusive (min < value < max). +# +# Returns: +# bool: True if the parameter value falls within the range (inclusive), False otherwise. +# """ +# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name) +# if parameter_value is None: +# return False +# if not isinstance(parameter_value, int | float): +# raise ValueError(f"Parameter value must be a number, got {type(parameter_value)}") +# +# return min_value <= parameter_value <= max_value if inclusive else min_value < parameter_value < max_value +# +# @staticmethod +# def is_parameter_value_in_list(speckle_object: Base, parameter_name: str, value_list: list[Any] | str) -> bool: +# """Checks if the value of the specified parameter is present in the given list of values. +# +# Args: +# speckle_object (Base): The Speckle object to check. +# parameter_name (str): The name of the parameter to check. +# value_list (List[Any]): The list of values to check against. +# +# Returns: +# bool: True if the parameter value is found in the list, False otherwise. +# """ +# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name) +# +# if isinstance(value_list, str): +# value_list = [value.strip() for value in value_list.split(",")] +# +# # parameter_value is effectively Any type, so to find its value in the value_list +# def is_value_in_list(value: Any, my_list: Any) -> bool: +# # Ensure that my_list is actually a list +# if isinstance(my_list, list): +# return value in my_list or str(value) in my_list +# else: +# speckle_print(f"Expected a list, got {type(my_list)} instead.") +# return False +# +# return is_value_in_list(parameter_value, value_list) +# +# @staticmethod +# def _check_boolean_value(value: Any, values_to_match: tuple[str, ...]) -> bool: +# """Check if a value matches any target value in expected format.""" +# if isinstance(value, bool): +# return value is (True if "true" in values_to_match else False) +# +# if isinstance(value, str): +# return value.lower() in values_to_match +# +# return False +# +# @staticmethod +# def is_parameter_value_true(speckle_object: Base, parameter_name: str) -> bool: +# """Check if parameter value represents true (boolean True, 'yes', 'true', '1').""" +# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name) +# return PropertyRules._check_boolean_value(parameter_value, ("yes", "true", "1")) +# +# @staticmethod +# def is_parameter_value_false(speckle_object: Base, parameter_name: str) -> bool: +# """Check if parameter value represents false (boolean False, 'no', 'false', '0').""" +# parameter_value = PropertyRules.get_parameter_value(speckle_object, parameter_name) +# return PropertyRules._check_boolean_value(parameter_value, ("no", "false", "0")) +# +# @staticmethod +# def has_category(speckle_object: Base) -> bool: +# """Checks if the speckle_object has a 'category' parameter. +# +# This method checks if the speckle_object has a 'category' parameter. +# If the 'category' parameter exists, it returns True; otherwise, it returns False. +# +# Args: +# speckle_object (Base): The Speckle object to check. +# +# Returns: +# bool: True if the object has the 'category' parameter, False otherwise. +# """ +# return PropertyRules.has_parameter(speckle_object, "category") +# +# @staticmethod +# def is_category(speckle_object: Base, category_input: str) -> bool: +# """Checks if the value of the 'category' property matches the given input. +# +# This method checks if the 'category' property of the speckle_object +# matches the given category_input. If they match, it returns True; +# otherwise, it returns False. +# +# Args: +# speckle_object (Base): The Speckle object to check. +# category_input (str): The category value to compare against. +# +# Returns: +# bool: True if the 'category' property matches the input, False otherwise. +# """ +# category_value = PropertyRules.get_parameter_value(speckle_object, "category") +# return category_value == category_input +# +# @staticmethod +# def get_category_value(speckle_object: Base) -> str: +# """Retrieves the value of the 'category' parameter from the speckle_object. +# +# This method retrieves the value of the 'category' parameter from the speckle_object. +# If the 'category' parameter exists and its value is not None, it returns the value. +# If the 'category' parameter does not exist or its value is None, it returns an empty string. +# +# Args: +# speckle_object (Base): The Speckle object to retrieve the 'category' parameter value from. +# +# Returns: +# str: The value of the 'category' parameter if it exists and is not None, or an empty string otherwise. +# """ +# return PropertyRules.get_parameter_value(speckle_object, "category") +# +# +# class ParameterSearch: +# """Unified parameter search functionality for Speckle objects.""" +# +# @staticmethod +# def convert_revit_boolean(value: Any) -> Any: +# """Convert Revit-style Yes/No strings to boolean values. +# +# Args: +# value: The value to potentially convert +# +# Returns: +# bool if value is a Revit boolean string, original value otherwise +# """ +# if isinstance(value, str): +# if value.lower() == "yes": +# return True +# if value.lower() == "no": +# return False +# return value +# +# @staticmethod +# def search_parameters( +# params: dict, search_name: str, mode: PropertyMatchMode = PropertyMatchMode.STRICT +# ) -> tuple[bool, Any]: +# """Search for parameters using consistent matching logic. +# +# Supports flexible property chain matching that can find paths like "Instance Parameters.Dimensions.Length" +# within longer chains like "properties.Parameters.Instance Parameters.Dimensions.Length.value". +# Uses STRICT matching by default for more predictable results. +# +# Args: +# params: Parameter dictionary to search +# search_name: Name of parameter to find, can be dot-separated chain +# mode: Matching mode to use (STRICT by default, or FUZZY/MIXED for looser matching) +# +# Returns: +# Tuple of (value_found: bool, value: Any) +# """ +# +# def matches_name(match_key: str, target: str, match_mode: PropertyMatchMode) -> bool: +# if match_mode == PropertyMatchMode.STRICT: +# return match_key.lower() == target.lower() +# elif match_mode == PropertyMatchMode.FUZZY: +# return target.lower() in match_key.lower() +# else: # MIXED mode +# return match_key.lower() == target.lower() or target.lower() in match_key.lower() +# +# def try_get_value(obj: Any) -> Any: +# """Extract value from parameter object or return as is. +# +# Handles both dict and Base objects, checking for 'value' property in both cases. +# Returns the 'value' if found, otherwise returns the original object. +# """ +# # Handle dictionary objects +# if isinstance(obj, dict): +# return obj.get("value", obj) +# +# # Handle Base objects +# if isinstance(obj, Base): +# return getattr(obj, "value", obj) +# +# # For all other types, return as is +# return obj +# +# # First try property chain lookup +# if "." in search_name: +# search_parts = search_name.split(".") +# +# def try_match_path(current: dict, remaining_search_parts: list[str], depth: int = 0) -> tuple[bool, Any]: +# if not isinstance(current, dict): +# return False, None +# +# if not remaining_search_parts: # We've matched all parts +# return True, try_get_value(current) +# +# current_search = remaining_search_parts[0] +# +# # Try each key at current level +# for key, item_value in current.items(): +# if matches_name(key, current_search, mode): +# # Found a match for current part, recurse with rest +# match_found, result = try_match_path(item_value, remaining_search_parts[1:], depth + 1) +# if match_found: +# return True, result +# +# # If no match found and value is a dict, try searching deeper +# if isinstance(item_value, dict): +# match_found, result = try_match_path(item_value, remaining_search_parts, depth) +# if match_found: +# return True, result +# +# return False, None +# +# try: +# found, value = try_match_path(params, search_parts) +# if found: +# return True, value +# except Exception: +# pass # Fall through to recursive search if chain lookup fails +# +# # Recursive search through nested dictionaries +# def recursive_search(data: dict | Base, target: str) -> tuple[bool, Any]: +# if not isinstance(data, dict | Base): +# return False, None +# +# # Handle both dict and Base objects for iteration +# if isinstance(data, dict): +# items = data.items() +# else: +# items = [(k, getattr(data, k)) for k in dir(data) if not k.startswith("_")] +# +# # First check current level +# for key, item_value in items: +# if matches_name(key, target, mode): +# return True, try_get_value(item_value) +# +# # Then check nested levels +# for _, item_value in items: +# if isinstance(item_value, dict | Base): +# item_found, result = recursive_search(item_value, target) +# if item_found: +# return True, result +# +# return False, None +# +# return recursive_search(params, search_name.split(".")[-1] if "." in search_name else search_name) +# +# @staticmethod +# def lookup_parameter( +# obj: Base, param_name: str, mode: PropertyMatchMode = PropertyMatchMode.MIXED +# ) -> tuple[bool, Any]: +# """Unified parameter lookup for both checking existence and getting values. +# +# Args: +# obj: Speckle object to search +# param_name: Parameter name to find +# mode: Matching mode to use +# +# Returns: +# Tuple of (found: bool, value: Any) +# """ +# # Check direct property first +# if has_item(obj, param_name): +# value = get_item(obj, param_name) +# # Check if the direct property has a value field +# if isinstance(value, dict) and "value" in value: +# return True, value["value"] +# return True, value +# +# # Handle v3 structure +# if PropertyRules.is_v3(obj): +# properties = get_item(obj, "properties") +# if not properties or not has_item(properties, "Parameters"): +# return False, None +# +# parameters = get_item(properties, "Parameters") +# if not parameters: +# return False, None +# +# return ParameterSearch.search_parameters(parameters, param_name, mode) +# +# # Handle v2 structure +# parameters = get_item(obj, "parameters") +# if not parameters: +# return False, None +# +# return ParameterSearch.search_parameters(parameters, param_name, mode) diff --git a/src/spreadsheet.py b/src/spreadsheet.py index 265d683..f9880a3 100644 --- a/src/spreadsheet.py +++ b/src/spreadsheet.py @@ -1,7 +1,8 @@ import pandas as pd +from pandas import DataFrame -def read_rules_from_spreadsheet(url): +def read_rules_from_spreadsheet(url: str) -> DataFrame | None: """Reads a TSV file from a provided URL and returns a DataFrame. Args: @@ -12,7 +13,26 @@ def read_rules_from_spreadsheet(url): """ try: # Since the output is a TSV, we use `pd.read_csv` with `sep='\t'` to specify tab-separated values. - return pd.read_csv(url, sep="\t") + df = pd.read_csv(url, sep="\t") + df = convert_mixed_columns(df) + + # Convert columns to appropriate types based on their content. + return df + except Exception as e: print(f"Failed to read the TSV from the URL: {e}") return None + + +def convert_mixed_columns(df): + """Converts columns in a DataFrame to appropriate types based on their content. + + Args: + df (DataFrame): The DataFrame whose columns are to be converted. + + Returns: + DataFrame: The DataFrame with columns converted to appropriate types. + """ + df = df.apply(lambda c: c.astype(object) if any(str(x).replace(".", "", 1).isdigit() for x in c) else c.astype(str)) + + return df diff --git a/test_data/v2_object.json b/test_data/v2_object.json new file mode 100644 index 0000000..204eb94 --- /dev/null +++ b/test_data/v2_object.json @@ -0,0 +1,3085 @@ +[ + { + "id": "cdb18060dc48281909e94f0f1d8d3cc0", + "type": "W30(Fc24)", + "level": { + "id": "83f0777fe353eb77263ca71578e12dcf", + "name": "1FL", + "units": "mm", + "category": "Levels", + "elementId": "3150442", + "elevation": 0, + "worksetId": "0", + "createView": true, + "parameters": { + "id": "43d0efa83cf272385e920a560e7e9ebf", + "IFC_GUID": { + "id": "ceb8ed674bbdf0e139c95a628bca09e5", + "name": "IfcGUID", + "units": null, + "value": "3xtuTNAO5BSg6cTEbLBATq", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "IFC_GUID" + }, + "DATUM_TEXT": { + "id": "32f5ba880945a5bc78419171ea58cfa6", + "name": "Name", + "units": null, + "value": "1FL", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "DATUM_TEXT" + }, + "LEVEL_ELEV": { + "id": "4e81dd4ac0c395974f54245b438ae147", + "name": "Elevation", + "units": "mm", + "value": 0, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "LEVEL_ELEV" + }, + "speckle_type": "Base", + "applicationId": null, + "ELEM_TYPE_PARAM": { + "id": "cb42b32c7f51cde44a287ca1bff0982b", + "name": "Type", + "units": null, + "value": "レベル 上表示", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ELEM_TYPE_PARAM" + }, + "SYMBOL_ID_PARAM": { + "id": "51f0ee3d4bdbed11d72db3d53cdf3706", + "name": "Type Id", + "units": null, + "value": "レベル 上表示", + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "SYMBOL_ID_PARAM" + }, + "DESIGN_OPTION_ID": { + "id": "88f4af03d8e3506766765215a5b87813", + "name": "Design Option", + "units": null, + "value": "-1", + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "DESIGN_OPTION_ID" + }, + "ELEM_FAMILY_PARAM": { + "id": "5c94a45c58d4bbfd90819146fb5174a8", + "name": "Family", + "units": null, + "value": "レベル 上表示", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ELEM_FAMILY_PARAM" + }, + "LEVEL_UP_TO_LEVEL": { + "id": "688a38b54fd75e52da54c164508aeb0f", + "name": "Story Above", + "units": null, + "value": "-1", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "LEVEL_UP_TO_LEVEL" + }, + "SYMBOL_NAME_PARAM": { + "id": "fe43cb940741f29b6cd508611db70c0a", + "name": "Type Name", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "SYMBOL_NAME_PARAM" + }, + "IFC_EXPORT_ELEMENT": { + "id": "ac8493ea527ffedf1d7bcf5826dab455", + "name": "Export to IFC", + "units": null, + "value": 0, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "IFC_EXPORT_ELEMENT" + }, + "totalChildrenCount": 0, + "ELEM_CATEGORY_PARAM": { + "id": "9ed3143148c3e478c4d5fa4aad0f84cb", + "name": "Category", + "units": null, + "value": "-2000240", + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ELEM_CATEGORY_PARAM" + }, + "LEVEL_IS_STRUCTURAL": { + "id": "7d81c0e17bc7d3826774591634ee068b", + "name": "Structural", + "units": null, + "value": true, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "LEVEL_IS_STRUCTURAL" + }, + "ELEM_CATEGORY_PARAM_MT": { + "id": "73cbfffc73fd323071a9111d157f9a18", + "name": "Category", + "units": null, + "value": "-2000240", + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ELEM_CATEGORY_PARAM_MT" + }, + "SPECKLE_Classification": { + "id": "2138dca3e3a7c852aeaa3fa65e5a5e8c", + "name": "SPECKLE_Classification", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "SPECKLE_Classification" + }, + "LEVEL_IS_BUILDING_STORY": { + "id": "231a4045f2fd0e013b9b45e71ddb653c", + "name": "Building Story", + "units": null, + "value": true, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "LEVEL_IS_BUILDING_STORY" + }, + "DATUM_VOLUME_OF_INTEREST": { + "id": "695f0dbc445b52836935ac062f46de41", + "name": "Scope Box", + "units": null, + "value": "-1", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "DATUM_VOLUME_OF_INTEREST" + }, + "SYMBOL_FAMILY_NAME_PARAM": { + "id": "a52788d3716a07ca198833a2024a2f04", + "name": "Family Name", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "SYMBOL_FAMILY_NAME_PARAM" + }, + "ELEM_FAMILY_AND_TYPE_PARAM": { + "id": "1bbc8fadc19823adb9a9c99e725102c1", + "name": "Family and Type", + "units": null, + "value": "レベル 上表示", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ELEM_FAMILY_AND_TYPE_PARAM" + }, + "LEVEL_ROOM_COMPUTATION_HEIGHT": { + "id": "e54df704e19c7a0c73431dc943ce4fc3", + "name": "Computation Height", + "units": "mm", + "value": 0, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "LEVEL_ROOM_COMPUTATION_HEIGHT" + } + }, + "speckle_type": "Objects.BuiltElements.Level:Objects.BuiltElements.Revit.RevitLevel", + "applicationId": "fbdf8757-2981-4b72-a1a6-74e9551cb51e-0030126a", + "referenceOnly": false, + "builtInCategory": "OST_Levels", + "isRevitLinkedModel": false, + "materialQuantities": [], + "totalChildrenCount": 0, + "revitLinkedModelPath": "C:\\Program Files\\Autodesk\\Revit 2024\\Samples\\サンプル構造.rvt" + }, + "units": "mm", + "family": "Basic Wall", + "height": 1400, + "flipped": false, + "baseLine": { + "id": "f1e5d19719cd0c6dd7f95cb68e710696", + "end": { + "x": 22400.000000000015, + "y": 20500, + "z": -2000.0000000000002, + "id": "e95624f6dede918858ee2ac26d04e0ea", + "units": "mm", + "speckle_type": "Objects.Geometry.Point", + "applicationId": null, + "totalChildrenCount": 0 + }, + "area": 0, + "bbox": null, + "start": { + "x": 22400.000000000007, + "y": 15199.999999999998, + "z": -2000.0000000000002, + "id": "243d9fbf9c56cc8964b0808af2ca6ec5", + "units": "mm", + "speckle_type": "Objects.Geometry.Point", + "applicationId": null, + "totalChildrenCount": 0 + }, + "units": "mm", + "domain": { + "id": "88c63fda9f81bcce66810de695592b69", + "end": 17.388451443569522, + "start": -3.552713668866051e-14, + "speckle_type": "Objects.Primitive.Interval", + "applicationId": null, + "totalChildrenCount": 0 + }, + "length": 5300.000000000002, + "speckle_type": "Objects.Geometry.Line", + "applicationId": null, + "totalChildrenCount": 0 + }, + "category": "Walls", + "elements": null, + "topLevel": { + "id": "83f0777fe353eb77263ca71578e12dcf", + "name": "1FL", + "units": "mm", + "category": "Levels", + "elementId": "3150442", + "elevation": 0, + "worksetId": "0", + "createView": true, + "parameters": { + "id": "43d0efa83cf272385e920a560e7e9ebf", + "IFC_GUID": { + "id": "ceb8ed674bbdf0e139c95a628bca09e5", + "name": "IfcGUID", + "units": null, + "value": "3xtuTNAO5BSg6cTEbLBATq", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "IFC_GUID" + }, + "DATUM_TEXT": { + "id": "32f5ba880945a5bc78419171ea58cfa6", + "name": "Name", + "units": null, + "value": "1FL", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "DATUM_TEXT" + }, + "LEVEL_ELEV": { + "id": "4e81dd4ac0c395974f54245b438ae147", + "name": "Elevation", + "units": "mm", + "value": 0, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "LEVEL_ELEV" + }, + "speckle_type": "Base", + "applicationId": null, + "ELEM_TYPE_PARAM": { + "id": "cb42b32c7f51cde44a287ca1bff0982b", + "name": "Type", + "units": null, + "value": "レベル 上表示", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ELEM_TYPE_PARAM" + }, + "SYMBOL_ID_PARAM": { + "id": "51f0ee3d4bdbed11d72db3d53cdf3706", + "name": "Type Id", + "units": null, + "value": "レベル 上表示", + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "SYMBOL_ID_PARAM" + }, + "DESIGN_OPTION_ID": { + "id": "88f4af03d8e3506766765215a5b87813", + "name": "Design Option", + "units": null, + "value": "-1", + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "DESIGN_OPTION_ID" + }, + "ELEM_FAMILY_PARAM": { + "id": "5c94a45c58d4bbfd90819146fb5174a8", + "name": "Family", + "units": null, + "value": "レベル 上表示", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ELEM_FAMILY_PARAM" + }, + "LEVEL_UP_TO_LEVEL": { + "id": "688a38b54fd75e52da54c164508aeb0f", + "name": "Story Above", + "units": null, + "value": "-1", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "LEVEL_UP_TO_LEVEL" + }, + "SYMBOL_NAME_PARAM": { + "id": "fe43cb940741f29b6cd508611db70c0a", + "name": "Type Name", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "SYMBOL_NAME_PARAM" + }, + "IFC_EXPORT_ELEMENT": { + "id": "ac8493ea527ffedf1d7bcf5826dab455", + "name": "Export to IFC", + "units": null, + "value": 0, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "IFC_EXPORT_ELEMENT" + }, + "totalChildrenCount": 0, + "ELEM_CATEGORY_PARAM": { + "id": "9ed3143148c3e478c4d5fa4aad0f84cb", + "name": "Category", + "units": null, + "value": "-2000240", + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ELEM_CATEGORY_PARAM" + }, + "LEVEL_IS_STRUCTURAL": { + "id": "7d81c0e17bc7d3826774591634ee068b", + "name": "Structural", + "units": null, + "value": true, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "LEVEL_IS_STRUCTURAL" + }, + "ELEM_CATEGORY_PARAM_MT": { + "id": "73cbfffc73fd323071a9111d157f9a18", + "name": "Category", + "units": null, + "value": "-2000240", + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ELEM_CATEGORY_PARAM_MT" + }, + "SPECKLE_Classification": { + "id": "2138dca3e3a7c852aeaa3fa65e5a5e8c", + "name": "SPECKLE_Classification", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "SPECKLE_Classification" + }, + "LEVEL_IS_BUILDING_STORY": { + "id": "231a4045f2fd0e013b9b45e71ddb653c", + "name": "Building Story", + "units": null, + "value": true, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "LEVEL_IS_BUILDING_STORY" + }, + "DATUM_VOLUME_OF_INTEREST": { + "id": "695f0dbc445b52836935ac062f46de41", + "name": "Scope Box", + "units": null, + "value": "-1", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "DATUM_VOLUME_OF_INTEREST" + }, + "SYMBOL_FAMILY_NAME_PARAM": { + "id": "a52788d3716a07ca198833a2024a2f04", + "name": "Family Name", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "SYMBOL_FAMILY_NAME_PARAM" + }, + "ELEM_FAMILY_AND_TYPE_PARAM": { + "id": "1bbc8fadc19823adb9a9c99e725102c1", + "name": "Family and Type", + "units": null, + "value": "レベル 上表示", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ELEM_FAMILY_AND_TYPE_PARAM" + }, + "LEVEL_ROOM_COMPUTATION_HEIGHT": { + "id": "e54df704e19c7a0c73431dc943ce4fc3", + "name": "Computation Height", + "units": "mm", + "value": 0, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "LEVEL_ROOM_COMPUTATION_HEIGHT" + } + }, + "speckle_type": "Objects.BuiltElements.Level:Objects.BuiltElements.Revit.RevitLevel", + "applicationId": "fbdf8757-2981-4b72-a1a6-74e9551cb51e-0030126a", + "referenceOnly": false, + "builtInCategory": "OST_Levels", + "isRevitLinkedModel": false, + "materialQuantities": [], + "totalChildrenCount": 0, + "revitLinkedModelPath": "C:\\Program Files\\Autodesk\\Revit 2024\\Samples\\サンプル構造.rvt" + }, + "__closure": { + "210e0ea727c735970c576cd0beab0493": 2, + "30ba0a6aba886a2e800b12bb37656ab3": 2, + "78b63dbbe244fafafc0a95cf61f1cbc1": 1, + "d1b4feed8d71926a25a42d86f9a81209": 1 + }, + "elementId": "4479852", + "topOffset": -600, + "worksetId": "0", + "baseOffset": -2000, + "parameters": { + "id": "8c69297da2b6fb17718cf44fe2388878", + "IFC_GUID": { + "id": "4cabbecef7398cbdf463f847708318c6", + "name": "IfcGUID", + "units": null, + "value": "0oqavz9$zDZxycDyfZdYsW", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "IFC_GUID" + }, + "speckle_type": "Base", + "幅止筋径": { + "id": "51840c4a0fffeac7376571395296647e", + "name": "幅止筋径", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "幅止筋径" + }, + "鉄筋種別": { + "id": "3e5981bc5228393fdc84574037bfb9be", + "name": "鉄筋種別", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "鉄筋種別" + }, + "ALL_MODEL_URL": { + "id": "a261c811f92fec62c296a2265435f559", + "name": "URL", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ALL_MODEL_URL" + }, + "IFC_TYPE_GUID": { + "id": "5215d1101225d3415a966c4788774948", + "name": "Type IfcGUID", + "units": null, + "value": "0oqavz9$zDZxycDyfZdYh0", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "IFC_TYPE_GUID" + }, + "KEYNOTE_PARAM": { + "id": "bf39776cf4e2104a4622d209b0b26e4b", + "name": "Keynote", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "KEYNOTE_PARAM" + }, + "PHASE_CREATED": { + "id": "17ebb53fa91f8f8ada5c558038c48cc0", + "name": "Phase Created", + "units": null, + "value": "フェーズ1", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "PHASE_CREATED" + }, + "applicationId": null, + "ALL_MODEL_COST": { + "id": "8e9a24da6f88b5899ce25d3cd5c5a8ba", + "name": "Cost", + "units": "฿", + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:currency-1.0.0", + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ALL_MODEL_COST" + }, + "ALL_MODEL_MARK": { + "id": "336e23f6debcf6df695750fa4ee20180", + "name": "Mark", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ALL_MODEL_MARK" + }, + "FUNCTION_PARAM": { + "id": "4b63739868e772bb7da43d201a3800ea", + "name": "Function", + "units": null, + "value": 0, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "FUNCTION_PARAM" + }, + "UNIFORMAT_CODE": { + "id": "ccb23a319130de9a96ecc397b365e278", + "name": "Assembly Code", + "units": null, + "value": "", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "UNIFORMAT_CODE" + }, + "WINDOW_TYPE_ID": { + "id": "b505347b6abc4073e7c35bc42dcdc6ad", + "name": "Type Mark", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "WINDOW_TYPE_ID" + }, + "ALL_MODEL_IMAGE": { + "id": "0bbd2950d953cd6769260720039799ce", + "name": "Image", + "units": null, + "value": "-1", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ALL_MODEL_IMAGE" + }, + "ALL_MODEL_MODEL": { + "id": "ed0938df07a2290e25d65b5b300d2552", + "name": "Model", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ALL_MODEL_MODEL" + }, + "ELEM_TYPE_PARAM": { + "id": "f16829ce4a87b686dcf3aebd8399c93a", + "name": "Type", + "units": null, + "value": "W30(Fc24)", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ELEM_TYPE_PARAM" + }, + "RELATED_TO_MASS": { + "id": "566cb4feb80d5a985cbdf2eb64f8cce3", + "name": "Related to Mass", + "units": null, + "value": false, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "RELATED_TO_MASS" + }, + "SYMBOL_ID_PARAM": { + "id": "5d10f05ef6db71c2ead565b0a5061af0", + "name": "Type Id", + "units": null, + "value": "W30(Fc24)", + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "SYMBOL_ID_PARAM" + }, + "DESIGN_OPTION_ID": { + "id": "88f4af03d8e3506766765215a5b87813", + "name": "Design Option", + "units": null, + "value": "-1", + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "DESIGN_OPTION_ID" + }, + "DOOR_FIRE_RATING": { + "id": "879b74bf9a25a16ff9e86ce673536b90", + "name": "Fire Rating", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "DOOR_FIRE_RATING" + }, + "PHASE_DEMOLISHED": { + "id": "49ca987163ba4376ad129ff75ec6921e", + "name": "Phase Demolished", + "units": null, + "value": "-1", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "PHASE_DEMOLISHED" + }, + "CLEAR_COVER_OTHER": { + "id": "e7fe31274592f7688e3b7aed5f49efac", + "name": "Rebar Cover - Other Faces", + "units": null, + "value": "内壁(フレーム、柱、および耐力壁)", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "CLEAR_COVER_OTHER" + }, + "CURVE_ELEM_LENGTH": { + "id": "2068c7dfb9911a544963580bc57701e4", + "name": "Length", + "units": "mm", + "value": 5300.000000000001, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "CURVE_ELEM_LENGTH" + }, + "ELEM_FAMILY_PARAM": { + "id": "d6d47e2729a7d1df6f74acd2bfe10d07", + "name": "Family", + "units": null, + "value": "W30(Fc24)", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ELEM_FAMILY_PARAM" + }, + "SYMBOL_NAME_PARAM": { + "id": "fe43cb940741f29b6cd508611db70c0a", + "name": "Type Name", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "SYMBOL_NAME_PARAM" + }, + "横筋 主筋径1": { + "id": "d379ca5a49a082cc8ac8b63edb16fae4", + "name": "横筋 主筋径1", + "units": null, + "value": "D13", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "横筋 主筋径1" + }, + "横筋 主筋径2": { + "id": "b38afc05d4877b9a36e4663160e12f51", + "name": "横筋 主筋径2", + "units": null, + "value": "D16", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "横筋 主筋径2" + }, + "縦筋 主筋径1": { + "id": "54201159455aa6bbca506518e4b2ab4e", + "name": "縦筋 主筋径1", + "units": null, + "value": "D13", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "縦筋 主筋径1" + }, + "縦筋 主筋径2": { + "id": "8271e5b08899d0360b78f00413f3d54d", + "name": "縦筋 主筋径2", + "units": null, + "value": "D16", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "縦筋 主筋径2" + }, + "HOST_AREA_COMPUTED": { + "id": "d6a8c04bf4df2b3778c3675963ffe31a", + "name": "Area", + "units": "m²", + "value": 7.630000000000015, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:squareMeters-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "HOST_AREA_COMPUTED" + }, + "IFC_EXPORT_ELEMENT": { + "id": "ac8493ea527ffedf1d7bcf5826dab455", + "name": "Export to IFC", + "units": null, + "value": 0, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "IFC_EXPORT_ELEMENT" + }, + "WALL_CROSS_SECTION": { + "id": "698002bd237038be0e85c9f9f97e3bb5", + "name": "Cross-Section", + "units": null, + "value": 1, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "WALL_CROSS_SECTION" + }, + "WALL_KEY_REF_PARAM": { + "id": "3f331fae4795eec71ea562f7482c4902", + "name": "Location Line", + "units": null, + "value": 1, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "WALL_KEY_REF_PARAM" + }, + "totalChildrenCount": 0, + "幅止筋ピッチ": { + "id": "34242c23582387b0fe4c654e71bec03f", + "name": "幅止筋ピッチ", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "幅止筋ピッチ" + }, + "ELEM_CATEGORY_PARAM": { + "id": "e2466248896b57cb44bd84d8e03acc85", + "name": "Category", + "units": null, + "value": "-2000011", + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ELEM_CATEGORY_PARAM" + }, + "ALL_MODEL_TYPE_IMAGE": { + "id": "22e221a13bd5fcb3f9a549813cf136ae", + "name": "Type Image", + "units": null, + "value": "-1", + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ALL_MODEL_TYPE_IMAGE" + }, + "ANALYTICAL_ROUGHNESS": { + "id": "fdaeba96e8698f1032f90bd219038cd1", + "name": "Roughness", + "units": null, + "value": 1, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ANALYTICAL_ROUGHNESS" + }, + "CLEAR_COVER_EXTERIOR": { + "id": "cb380885a1464f46ed4e6eca5ce0903e", + "name": "Rebar Cover - Exterior Face", + "units": null, + "value": "内壁(フレーム、柱、および耐力壁)", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "CLEAR_COVER_EXTERIOR" + }, + "CLEAR_COVER_INTERIOR": { + "id": "72c0b38414d91d0a4c15e4cc55273791", + "name": "Rebar Cover - Interior Face", + "units": null, + "value": "内壁(フレーム、柱、および耐力壁)", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "CLEAR_COVER_INTERIOR" + }, + "HOST_VOLUME_COMPUTED": { + "id": "a58e3bbee4814e42c6f27dd04ec4b2c4", + "name": "Volume", + "units": "m³", + "value": 2.2890000000000135, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:cubicMeters-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "HOST_VOLUME_COMPUTED" + }, + "WALL_TOP_IS_ATTACHED": { + "id": "bb79e6923a9a1a5ad7776fcd687e9948", + "name": "Top is Attached", + "units": null, + "value": false, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "WALL_TOP_IS_ATTACHED" + }, + "ALL_MODEL_DESCRIPTION": { + "id": "c674714a0e0f8f3ace46457be507bde7", + "name": "Description", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ALL_MODEL_DESCRIPTION" + }, + "IFC_EXPORT_ELEMENT_AS": { + "id": "beab0eef32c6a433e7c996a75f6d46d9", + "name": "Export to IFC As", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "IFC_EXPORT_ELEMENT_AS" + }, + "UNIFORMAT_DESCRIPTION": { + "id": "8e056ac453940541c2d6f1b84560967e", + "name": "Assembly Description", + "units": null, + "value": "", + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "UNIFORMAT_DESCRIPTION" + }, + "WALL_ATTR_WIDTH_PARAM": { + "id": "6ca4606560c24174ba9e8c29fd8aaa2b", + "name": "Width", + "units": "mm", + "value": 300, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1", + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "WALL_ATTR_WIDTH_PARAM" + }, + "ALL_MODEL_MANUFACTURER": { + "id": "6bf6926a1116ba2e3bf17fa8456cc1b1", + "name": "Manufacturer", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ALL_MODEL_MANUFACTURER" + }, + "ANALYTICAL_ABSORPTANCE": { + "id": "5a8796dffbd22a111b19fc15413c50d9", + "name": "Absorptance", + "units": null, + "value": 0.1, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:general-1.0.1", + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ANALYTICAL_ABSORPTANCE" + }, + "ELEM_CATEGORY_PARAM_MT": { + "id": "c251e0548d16c42db1af0881126d5691", + "name": "Category", + "units": null, + "value": "-2000011", + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ELEM_CATEGORY_PARAM_MT" + }, + "SPECKLE_Classification": { + "id": "29dc1191e21fa4dceda0ed60881f32bf", + "name": "SPECKLE_Classification", + "units": null, + "value": "Wall", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "SPECKLE_Classification" + }, + "WRAPPING_AT_ENDS_PARAM": { + "id": "91f83fbeb00a751ed03bcf251aeb0474", + "name": "Wrapping at Ends", + "units": null, + "value": 0, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "WRAPPING_AT_ENDS_PARAM" + }, + "横筋 主筋ピッチ": { + "id": "ad6a3787ecba15b3d8356d970d5d8b2e", + "name": "横筋 主筋ピッチ", + "units": null, + "value": "200", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "横筋 主筋ピッチ" + }, + "縦筋 主筋ピッチ": { + "id": "0381ecfe263b4b47be4fdf1e24d3eb92", + "name": "縦筋 主筋ピッチ", + "units": null, + "value": "200", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "縦筋 主筋ピッチ" + }, + "ALL_MODEL_TYPE_COMMENTS": { + "id": "66ccc5a8cdfe28320bf955039e82d179", + "name": "Type Comments", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ALL_MODEL_TYPE_COMMENTS" + }, + "ANALYTICAL_THERMAL_MASS": { + "id": "af19fd7af543d723026757132eaaf0e0", + "name": "Thermal Mass", + "units": "kJ/(m²·K)", + "value": null, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:kilojoulesPerSquareMeterKelvin-1.0.0", + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ANALYTICAL_THERMAL_MASS" + }, + "IFC_EXPORT_ELEMENT_TYPE": { + "id": "9ec1631edc0b1ea8989dbaadace6f99a", + "name": "Export Type to IFC", + "units": null, + "value": 0, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "IFC_EXPORT_ELEMENT_TYPE" + }, + "WALL_ATTR_ROOM_BOUNDING": { + "id": "392a751844d378da83ff7b7b52350c2f", + "name": "Room Bounding", + "units": null, + "value": true, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "WALL_ATTR_ROOM_BOUNDING" + }, + "WALL_BOTTOM_IS_ATTACHED": { + "id": "bf83fa521e6b4772698625a616b564d6", + "name": "Base is Attached", + "units": null, + "value": false, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "WALL_BOTTOM_IS_ATTACHED" + }, + "WALL_STRUCTURE_ID_PARAM": { + "id": "3f264fcd24517cc263b25c00c67dcb3a", + "name": "Structure", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "WALL_STRUCTURE_ID_PARAM" + }, + "SYMBOL_FAMILY_NAME_PARAM": { + "id": "a52788d3716a07ca198833a2024a2f04", + "name": "Family Name", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "SYMBOL_FAMILY_NAME_PARAM" + }, + "IFC_EXPORT_PREDEFINEDTYPE": { + "id": "bef8079e3ea573218fef71b15b7a3b3d", + "name": "IFC Predefined Type", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "IFC_EXPORT_PREDEFINEDTYPE" + }, + "STRUCTURAL_MATERIAL_PARAM": { + "id": "121e411a45f3bea248cc2f765d8675bb", + "name": "Structural Material", + "units": null, + "value": "Fc24", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "STRUCTURAL_MATERIAL_PARAM" + }, + "WRAPPING_AT_INSERTS_PARAM": { + "id": "6eba8d341daac476193f20335df00061", + "name": "Wrapping at Inserts", + "units": null, + "value": 0, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "WRAPPING_AT_INSERTS_PARAM" + }, + "開口補強筋 斜筋径": { + "id": "31066a58041f9df55276aae87d6cf5ad", + "name": "開口補強筋 斜筋径", + "units": null, + "value": "", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "開口補強筋 斜筋径" + }, + "開口補強筋 横筋径": { + "id": "982eb88059ea7999e47e8f9b8fece66b", + "name": "開口補強筋 横筋径", + "units": null, + "value": "", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "開口補強筋 横筋径" + }, + "開口補強筋 縦筋径": { + "id": "95ce337d39eb9cd006358b01bc3f3867", + "name": "開口補強筋 縦筋径", + "units": null, + "value": "", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "開口補強筋 縦筋径" + }, + "ELEM_FAMILY_AND_TYPE_PARAM": { + "id": "8df6a5d7d61a24f5760864d4ebcccc5a", + "name": "Family and Type", + "units": null, + "value": "W30(Fc24)", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ELEM_FAMILY_AND_TYPE_PARAM" + }, + "IFC_EXPORT_ELEMENT_TYPE_AS": { + "id": "08ef7fe13e19f78ee030301957ed685f", + "name": "Export Type to IFC As", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "IFC_EXPORT_ELEMENT_TYPE_AS" + }, + "ALL_MODEL_INSTANCE_COMMENTS": { + "id": "a6151cb13456ef39b86fd79c833dd574", + "name": "Comments", + "units": null, + "value": "", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ALL_MODEL_INSTANCE_COMMENTS" + }, + "WALL_STRUCTURAL_USAGE_PARAM": { + "id": "b8bb8937c07a425ab818632ed1103491", + "name": "Structural Usage", + "units": null, + "value": 1, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "WALL_STRUCTURAL_USAGE_PARAM" + }, + "横筋 主筋配列タイプ": { + "id": "f3e191564aa79490e296764e28f3549d", + "name": "横筋 主筋配列タイプ", + "units": null, + "value": "", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "横筋 主筋配列タイプ" + }, + "縦筋 主筋配列タイプ": { + "id": "134feeab85c34c7c4282287266ada0d3", + "name": "縦筋 主筋配列タイプ", + "units": null, + "value": "", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "縦筋 主筋配列タイプ" + }, + "ANALYTICAL_THERMAL_RESISTANCE": { + "id": "7245343997d68e458c6b381dd279f15c", + "name": "Thermal Resistance (R)", + "units": "(m²·K)/W", + "value": null, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:squareMeterKelvinsPerWatt-1.0.1", + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ANALYTICAL_THERMAL_RESISTANCE" + }, + "WALL_TOP_EXTENSION_DIST_PARAM": { + "id": "9b78bb419c97b74813b28719a9bfcaf4", + "name": "Top Extension Distance", + "units": "mm", + "value": 0, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "WALL_TOP_EXTENSION_DIST_PARAM" + }, + "開口補強筋 斜筋 本数": { + "id": "2d4fd7106ab9c96557e51ee988bed498", + "name": "開口補強筋 斜筋 本数", + "units": null, + "value": "―", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "開口補強筋 斜筋 本数" + }, + "開口補強筋 横筋 本数": { + "id": "dc3b743b5b31f35e0f003260dbab5ab7", + "name": "開口補強筋 横筋 本数", + "units": null, + "value": "―", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "開口補強筋 横筋 本数" + }, + "開口補強筋 縦筋 本数": { + "id": "259c67c82b4bda585ee2d63becad3f32", + "name": "開口補強筋 縦筋 本数", + "units": null, + "value": "―", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "開口補強筋 縦筋 本数" + }, + "IFC_EXPORT_PREDEFINEDTYPE_TYPE": { + "id": "f13c388136536408dacc5e0ee89fd9e0", + "name": "Type IFC Predefined Type", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "IFC_EXPORT_PREDEFINEDTYPE_TYPE" + }, + "COARSE_SCALE_FILL_PATTERN_COLOR": { + "id": "cc2dc46bbd456ed85ceae83affbc8d1d", + "name": "Coarse Scale Fill Color", + "units": null, + "value": 0, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "COARSE_SCALE_FILL_PATTERN_COLOR" + }, + "WALL_BOTTOM_EXTENSION_DIST_PARAM": { + "id": "94108dc85de8611fee053504bee85812", + "name": "Base Extension Distance", + "units": "mm", + "value": 0, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:millimeters-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "WALL_BOTTOM_EXTENSION_DIST_PARAM" + }, + "ANALYTICAL_ELEMENT_HAS_ASSOCIATION": { + "id": "7b62e323ef4e0c70504e5da33355a8cf", + "name": "Has Association", + "units": null, + "value": true, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ANALYTICAL_ELEMENT_HAS_ASSOCIATION" + }, + "COARSE_SCALE_FILL_PATTERN_ID_PARAM": { + "id": "04fc11a30d5cee03c44ad04ff8efa3c8", + "name": "Coarse Scale Fill Pattern", + "units": null, + "value": "-1", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "COARSE_SCALE_FILL_PATTERN_ID_PARAM" + }, + "031a6ed6-93a1-44a6-a9ce-ccb9d550178c": { + "id": "3eee0f1c3b6af014e4826800611fe4df", + "name": "横筋径1", + "units": null, + "value": null, + "isShared": true, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "031a6ed6-93a1-44a6-a9ce-ccb9d550178c" + }, + "03a6aadb-5f60-4d1e-9664-3a0dfa8a903c": { + "id": "f889e20acb8e539be4ec203b7027f253", + "name": "配筋タイプ", + "units": null, + "value": null, + "isShared": true, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "03a6aadb-5f60-4d1e-9664-3a0dfa8a903c" + }, + "0560d1bb-007b-45e4-b8c3-87f9c6a3d73c": { + "id": "9808b00361e296ccb7e5770c6eed5d56", + "name": "構造スリット 下端", + "units": null, + "value": false, + "isShared": true, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "0560d1bb-007b-45e4-b8c3-87f9c6a3d73c" + }, + "3750828c-ca7b-4501-8866-2912e0f9c9c9": { + "id": "64254415a3dfb963d9ca89878168e237", + "name": "構造スリット 上端", + "units": null, + "value": null, + "isShared": true, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "3750828c-ca7b-4501-8866-2912e0f9c9c9" + }, + "60795a90-8c91-4e11-90a0-b77b819c2403": { + "id": "cf84f8413f59389326154a5e3aa72a8c", + "name": "構造スリット 始端", + "units": null, + "value": false, + "isShared": true, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "60795a90-8c91-4e11-90a0-b77b819c2403" + }, + "65e579b4-1073-4d12-80da-a40b34734cc0": { + "id": "b276b69010e7d152a3afe6826e548d5f", + "name": "配置位置情報", + "units": null, + "value": null, + "isShared": true, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "65e579b4-1073-4d12-80da-a40b34734cc0" + }, + "6796d143-ef09-4441-9ecc-3411fe837a65": { + "id": "817ec1a0d32f3de0fcca6d7eb5b446d6", + "name": "縦筋ピッチ", + "units": null, + "value": null, + "isShared": true, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:general-1.0.1", + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "6796d143-ef09-4441-9ecc-3411fe837a65" + }, + "99066c2f-d804-4cf9-a413-4d558c2c2c11": { + "id": "5703496021b5efda82b890c3f8539ea8", + "name": "横筋径2", + "units": null, + "value": null, + "isShared": true, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "99066c2f-d804-4cf9-a413-4d558c2c2c11" + }, + "ANALYTICAL_HEAT_TRANSFER_COEFFICIENT": { + "id": "18ca50476c9acc7270223f29480df80d", + "name": "Heat Transfer Coefficient (U)", + "units": "W/(m²·K)", + "value": null, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:wattsPerSquareMeterKelvin-1.0.1", + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ANALYTICAL_HEAT_TRANSFER_COEFFICIENT" + }, + "bd6a1903-5430-45a0-a493-703ff58a94d5": { + "id": "4a2083826f7fe05eb467138bef859f6f", + "name": "縦筋径2", + "units": null, + "value": null, + "isShared": true, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "bd6a1903-5430-45a0-a493-703ff58a94d5" + }, + "cc4ea676-5014-4905-ae83-a9508800fa35": { + "id": "a48e39f9b6ef12235c45e762fdc8dd7d", + "name": "縦筋径1", + "units": null, + "value": null, + "isShared": true, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "cc4ea676-5014-4905-ae83-a9508800fa35" + }, + "cd19c040-0788-4424-8a67-7127427e311f": { + "id": "67b1bf6c3e8202d72527c2215076e408", + "name": "横筋ピッチ", + "units": null, + "value": null, + "isShared": true, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:general-1.0.1", + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "cd19c040-0788-4424-8a67-7127427e311f" + }, + "e3223f14-6158-4d4f-8697-0de2bcc7f737": { + "id": "760ab37568b5c8ade3fbddd92500420c", + "name": "構造スリット 終端", + "units": null, + "value": false, + "isShared": true, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "e3223f14-6158-4d4f-8697-0de2bcc7f737" + }, + "ee1f33e1-5506-4a64-b87b-7b98d30aea52": { + "id": "27cb51ebdf21d4fe5cb4da8874b801f3", + "name": "符号", + "units": null, + "value": "W30", + "isShared": true, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ee1f33e1-5506-4a64-b87b-7b98d30aea52" + } + }, + "structural": true, + "displayValue": [ + { + "referencedId": "d1b4feed8d71926a25a42d86f9a81209", + "speckle_type": "reference" + } + ], + "phaseCreated": "フェーズ1", + "speckle_type": "Objects.BuiltElements.Wall:Objects.BuiltElements.Revit.RevitWall", + "applicationId": "32d24e7d-27ff-4d8f-bf26-37ca63da76cc-00445b6c", + "builtInCategory": "OST_Walls", + "isRevitLinkedModel": false, + "materialQuantities": [ + { + "id": "cbc89c0323c9555b9770a1510587a145", + "area": 7630000.000000016, + "units": "mm", + "length": 5300.000000000002, + "volume": 2289000000.0000134, + "material": { + "referencedId": "78b63dbbe244fafafc0a95cf61f1cbc1", + "speckle_type": "reference" + }, + "speckle_type": "Objects.Other.MaterialQuantity", + "applicationId": null, + "totalChildrenCount": 0 + } + ], + "totalChildrenCount": null, + "revitLinkedModelPath": "C:\\Program Files\\Autodesk\\Revit 2024\\Samples\\サンプル構造.rvt" + }, + { + "id": "210e0ea727c735970c576cd0beab0493", + "data": [ + 22550.00031738281, + 15049.999969482422, + -2000.000015258789, + 22550.00031738281, + 20274.999645996093, + -2000.000015258789, + 22550.00031738281, + 20499.999865722657, + -2000.000015258789, + 22550.00031738281, + 20499.999865722657, + -600.0000045776368, + 22550.00031738281, + 20274.999645996093, + -600.0000045776368, + 22550.00031738281, + 15049.999969482422, + -600.0000045776368, + 22250.000024414065, + 15049.999969482422, + -2000.000015258789, + 22250.000024414065, + 15049.999969482422, + -600.0000045776368, + 22250.000024414065, + 15350.000262451173, + -600.0000045776368, + 22250.000024414065, + 20274.999645996093, + -600.0000045776368, + 22250.000024414065, + 20499.999865722657, + -600.0000045776368, + 22250.000024414065, + 20499.999865722657, + -2000.000015258789, + 22250.000024414065, + 20274.999645996093, + -2000.000015258789, + 22250.000024414065, + 15350.000262451173, + -2000.000015258789, + 22550.00031738281, + 20499.999865722657, + -2000.000015258789, + 22550.00031738281, + 20274.999645996093, + -2000.000015258789, + 22550.00031738281, + 15049.999969482422, + -2000.000015258789, + 22250.000024414065, + 15049.999969482422, + -2000.000015258789, + 22250.000024414065, + 15350.000262451173, + -2000.000015258789, + 22250.000024414065, + 20274.999645996093, + -2000.000015258789, + 22250.000024414065, + 20499.999865722657, + -2000.000015258789, + 22550.00031738281, + 20499.999865722657, + -2000.000015258789, + 22250.000024414065, + 20499.999865722657, + -2000.000015258789, + 22250.000024414065, + 20499.999865722657, + -600.0000045776368, + 22550.00031738281, + 20499.999865722657, + -600.0000045776368, + 22550.00031738281, + 15049.999969482422, + -600.0000045776368, + 22550.00031738281, + 20274.999645996093, + -600.0000045776368, + 22550.00031738281, + 20499.999865722657, + -600.0000045776368, + 22250.000024414065, + 20499.999865722657, + -600.0000045776368, + 22250.000024414065, + 20274.999645996093, + -600.0000045776368, + 22250.000024414065, + 15350.000262451173, + -600.0000045776368, + 22250.000024414065, + 15049.999969482422, + -600.0000045776368, + 22550.00031738281, + 15049.999969482422, + -600.0000045776368, + 22250.000024414065, + 15049.999969482422, + -600.0000045776368, + 22250.000024414065, + 15049.999969482422, + -2000.000015258789, + 22550.00031738281, + 15049.999969482422, + -2000.000015258789 + ], + "speckle_type": "Speckle.Core.Models.DataChunk", + "applicationId": null, + "totalChildrenCount": 0 + }, + { + "id": "30ba0a6aba886a2e800b12bb37656ab3", + "data": [ + 3, + 5, + 0, + 1, + 3, + 5, + 1, + 4, + 3, + 4, + 2, + 3, + 3, + 2, + 4, + 1, + 3, + 11, + 12, + 9, + 3, + 9, + 10, + 11, + 3, + 12, + 13, + 9, + 3, + 13, + 6, + 8, + 3, + 7, + 8, + 6, + 3, + 13, + 8, + 9, + 3, + 15, + 16, + 18, + 3, + 14, + 15, + 19, + 3, + 17, + 18, + 16, + 3, + 19, + 20, + 14, + 3, + 18, + 19, + 15, + 3, + 21, + 22, + 23, + 3, + 23, + 24, + 21, + 3, + 26, + 27, + 29, + 3, + 25, + 26, + 30, + 3, + 28, + 29, + 27, + 3, + 30, + 31, + 25, + 3, + 29, + 30, + 26, + 3, + 32, + 33, + 34, + 3, + 34, + 35, + 32 + ], + "speckle_type": "Speckle.Core.Models.DataChunk", + "applicationId": null, + "totalChildrenCount": 0 + }, + { + "id": "78b63dbbe244fafafc0a95cf61f1cbc1", + "name": "Fc24", + "units": "mm", + "category": "Materials", + "elementId": "3536906", + "shininess": 64, + "worksetId": "0", + "parameters": { + "id": "e12bca490aebaff501c5b406919d815f", + "IFC_GUID": { + "id": "17c3bf4d76621a920526f6575976399f", + "name": "IfcGUID", + "units": null, + "value": "3Fptj$rfjDy8TIvUXScHaX", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "IFC_GUID" + }, + "speckle_type": "Base", + "ALL_MODEL_URL": { + "id": "77d61973d49275f7d998a3571a0a25fa", + "name": "URL", + "units": null, + "value": "", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ALL_MODEL_URL" + }, + "KEYNOTE_PARAM": { + "id": "914f16b47a4a306b6e82cca879a470d7", + "name": "Keynote", + "units": null, + "value": "", + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "KEYNOTE_PARAM" + }, + "MATERIAL_NAME": { + "id": "b8c8d905ba449a911e8be72271a9ed85", + "name": "Name", + "units": null, + "value": "Fc24", + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "MATERIAL_NAME" + }, + "applicationId": null, + "ALL_MODEL_COST": { + "id": "5f73704463c7c1506d06d8440bc587a9", + "name": "Cost", + "units": "฿", + "value": 0, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:currency-1.0.0", + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ALL_MODEL_COST" + }, + "ALL_MODEL_MARK": { + "id": "790542e881b00e4ab74d4901c8c34357", + "name": "Mark", + "units": null, + "value": "", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ALL_MODEL_MARK" + }, + "ALL_MODEL_IMAGE": { + "id": "0bbd2950d953cd6769260720039799ce", + "name": "Image", + "units": null, + "value": "-1", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ALL_MODEL_IMAGE" + }, + "ALL_MODEL_MODEL": { + "id": "dda0363a01f2ec975cc16cfba9a53274", + "name": "Model", + "units": null, + "value": "", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ALL_MODEL_MODEL" + }, + "DESIGN_OPTION_ID": { + "id": "88f4af03d8e3506766765215a5b87813", + "name": "Design Option", + "units": null, + "value": "-1", + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "DESIGN_OPTION_ID" + }, + "SYMBOL_NAME_PARAM": { + "id": "fe43cb940741f29b6cd508611db70c0a", + "name": "Type Name", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "SYMBOL_NAME_PARAM" + }, + "IFC_EXPORT_ELEMENT": { + "id": "ac8493ea527ffedf1d7bcf5826dab455", + "name": "Export to IFC", + "units": null, + "value": 0, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "IFC_EXPORT_ELEMENT" + }, + "totalChildrenCount": 0, + "ELEM_CATEGORY_PARAM": { + "id": "9afb27a0af34166ffc2fdadfa999b71d", + "name": "Category", + "units": null, + "value": "-2000700", + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ELEM_CATEGORY_PARAM" + }, + "MATERIAL_PARAM_GLOW": { + "id": "07ce2bab8200d4c162d967a56c012b7b", + "name": "Glow", + "units": null, + "value": false, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "MATERIAL_PARAM_GLOW" + }, + "MATERIAL_PARAM_COLOR": { + "id": "249d80bc79d53c21f7a7d90eec4591bc", + "name": "Color", + "units": null, + "value": 13816530, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "MATERIAL_PARAM_COLOR" + }, + "ALL_MODEL_DESCRIPTION": { + "id": "9176e6b7f2fb3fc5e6ec34323ed39851", + "name": "Description", + "units": null, + "value": "", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ALL_MODEL_DESCRIPTION" + }, + "IFC_EXPORT_ELEMENT_AS": { + "id": "beab0eef32c6a433e7c996a75f6d46d9", + "name": "Export to IFC As", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "IFC_EXPORT_ELEMENT_AS" + }, + "ALL_MODEL_MANUFACTURER": { + "id": "4f80f3bdf4c9fb907121b3514b073700", + "name": "Manufacturer", + "units": null, + "value": "", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": true, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ALL_MODEL_MANUFACTURER" + }, + "ELEM_CATEGORY_PARAM_MT": { + "id": "9b0b5169fad84379d3744cbf899a827b", + "name": "Category", + "units": null, + "value": "-2000700", + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ELEM_CATEGORY_PARAM_MT" + }, + "SPECKLE_Classification": { + "id": "2138dca3e3a7c852aeaa3fa65e5a5e8c", + "name": "SPECKLE_Classification", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "SPECKLE_Classification" + }, + "PHY_MATERIAL_PARAM_TYPE": { + "id": "3a2b1c0217cdf12101ff2d4730ed29a3", + "name": "Material Type", + "units": null, + "value": 2, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "PHY_MATERIAL_PARAM_TYPE" + }, + "MATERIAL_PARAM_SHININESS": { + "id": "048455a2c06efa01c8f54b1ac6ae9d6c", + "name": "Shininess", + "units": null, + "value": 64, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "MATERIAL_PARAM_SHININESS" + }, + "PHY_MATERIAL_PARAM_CLASS": { + "id": "9e21d1a407f3eeb3fa18350d9bdec69d", + "name": "Class", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "PHY_MATERIAL_PARAM_CLASS" + }, + "SYMBOL_FAMILY_NAME_PARAM": { + "id": "a52788d3716a07ca198833a2024a2f04", + "name": "Family Name", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "SYMBOL_FAMILY_NAME_PARAM" + }, + "IFC_EXPORT_PREDEFINEDTYPE": { + "id": "bef8079e3ea573218fef71b15b7a3b3d", + "name": "IFC Predefined Type", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "IFC_EXPORT_PREDEFINEDTYPE" + }, + "MATERIAL_PARAM_SMOOTHNESS": { + "id": "1b829d7baefd372729cd0ffffcc1428b", + "name": "Smoothness", + "units": null, + "value": 50, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "MATERIAL_PARAM_SMOOTHNESS" + }, + "ALL_MODEL_INSTANCE_COMMENTS": { + "id": "a6151cb13456ef39b86fd79c833dd574", + "name": "Comments", + "units": null, + "value": "", + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "ALL_MODEL_INSTANCE_COMMENTS" + }, + "MATERIAL_PARAM_TRANSPARENCY": { + "id": "e87ecc901cb24535734c4ec126c3ff42", + "name": "Transparency", + "units": null, + "value": 0, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "MATERIAL_PARAM_TRANSPARENCY" + }, + "PHY_MATERIAL_PARAM_BEHAVIOR": { + "id": "80e17a634518cc49f2395e87276a988a", + "name": "Behavior", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "PHY_MATERIAL_PARAM_BEHAVIOR" + }, + "PHY_MATERIAL_PARAM_SUBCLASS": { + "id": "f6596da11827db5d37f43d8305faa368", + "name": "Subclass", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "PHY_MATERIAL_PARAM_SUBCLASS" + }, + "PHY_MATERIAL_PARAM_EXP_COEFF1": { + "id": "0c7b51a7d39920fbffa32b1f6a227a79", + "name": "Thermal expansion coefficient X", + "units": "1/°C", + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:inverseDegreesCelsius-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "PHY_MATERIAL_PARAM_EXP_COEFF1" + }, + "PHY_MATERIAL_PARAM_EXP_COEFF2": { + "id": "2f09b81f7ae8a11b9f86cf0d15487b32", + "name": "Thermal expansion coefficient Y", + "units": "1/°C", + "value": null, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:inverseDegreesCelsius-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "PHY_MATERIAL_PARAM_EXP_COEFF2" + }, + "PHY_MATERIAL_PARAM_EXP_COEFF3": { + "id": "4bc9d38a99eb309b5a905cf5e012d9ca", + "name": "Thermal expansion coefficient Z", + "units": "1/°C", + "value": null, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:inverseDegreesCelsius-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "PHY_MATERIAL_PARAM_EXP_COEFF3" + }, + "PHY_MATERIAL_PARAM_SHEAR_MOD1": { + "id": "89395fb2129a5376c0b3361ca5467a32", + "name": "Shear modulus X", + "units": "MPa", + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:megapascals-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "PHY_MATERIAL_PARAM_SHEAR_MOD1" + }, + "PHY_MATERIAL_PARAM_SHEAR_MOD2": { + "id": "c716c6a5f3a3ae95c457e65322d983b6", + "name": "Shear modulus Y", + "units": "MPa", + "value": null, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:megapascals-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "PHY_MATERIAL_PARAM_SHEAR_MOD2" + }, + "PHY_MATERIAL_PARAM_SHEAR_MOD3": { + "id": "fdfedb97c328d8c33b589aa1f963e7e5", + "name": "Shear modulus Z", + "units": "MPa", + "value": null, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:megapascals-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "PHY_MATERIAL_PARAM_SHEAR_MOD3" + }, + "PHY_MATERIAL_PARAM_YOUNG_MOD1": { + "id": "8e6aa66401295da7acd0937d8fd60bf0", + "name": "Young modulus X", + "units": "MPa", + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:megapascals-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "PHY_MATERIAL_PARAM_YOUNG_MOD1" + }, + "PHY_MATERIAL_PARAM_YOUNG_MOD2": { + "id": "3f397a6665eba57524da0f5710001fd3", + "name": "Young modulus Y", + "units": "MPa", + "value": null, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:megapascals-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "PHY_MATERIAL_PARAM_YOUNG_MOD2" + }, + "PHY_MATERIAL_PARAM_YOUNG_MOD3": { + "id": "1ef77b2612c40e2f1c3fbeb60dabaf8c", + "name": "Young modulus Z", + "units": "MPa", + "value": null, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:megapascals-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "PHY_MATERIAL_PARAM_YOUNG_MOD3" + }, + "PHY_MATERIAL_PARAM_UNIT_WEIGHT": { + "id": "b896141f21ada1a1b1ef36f2992dec16", + "name": "Unit weight", + "units": "kN/m³", + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:kilonewtonsPerCubicMeter-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "PHY_MATERIAL_PARAM_UNIT_WEIGHT" + }, + "PHY_MATERIAL_PARAM_LIGHT_WEIGHT": { + "id": "b94f75bc88fb5b1c30d82c9c20de648b", + "name": "Lightweight", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": null, + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "PHY_MATERIAL_PARAM_LIGHT_WEIGHT" + }, + "PHY_MATERIAL_PARAM_POISSON_MOD1": { + "id": "0c963ab07b678e7a50996ef93eb62523", + "name": "Poisson ratio X", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:general-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "PHY_MATERIAL_PARAM_POISSON_MOD1" + }, + "PHY_MATERIAL_PARAM_POISSON_MOD2": { + "id": "86eff39b70fafdf2cc4543e954557118", + "name": "Poisson ratio Y", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:general-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "PHY_MATERIAL_PARAM_POISSON_MOD2" + }, + "PHY_MATERIAL_PARAM_POISSON_MOD3": { + "id": "4aa2bc74b0de7c770e2a52eba3334039", + "name": "Poisson ratio Z", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:general-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "PHY_MATERIAL_PARAM_POISSON_MOD3" + }, + "PHY_MATERIAL_PARAM_CONCRETE_COMPRESSION": { + "id": "9843373c83b401049b8377f35e518a70", + "name": "Concrete compression", + "units": "MPa", + "value": null, + "isShared": false, + "isReadOnly": false, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:megapascals-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "PHY_MATERIAL_PARAM_CONCRETE_COMPRESSION" + }, + "PHY_MATERIAL_PARAM_SHEAR_STRENGTH_REDUCTION": { + "id": "487360a05edba93fcddd9e901bd8032b", + "name": "Shear strength modification", + "units": null, + "value": null, + "isShared": false, + "isReadOnly": true, + "speckle_type": "Objects.BuiltElements.Revit.Parameter", + "applicationId": null, + "applicationUnit": "autodesk.unit.unit:general-1.0.1", + "isTypeParameter": false, + "totalChildrenCount": 0, + "applicationUnitType": null, + "applicationInternalName": "PHY_MATERIAL_PARAM_SHEAR_STRENGTH_REDUCTION" + } + }, + "smoothness": 50, + "speckle_type": "Objects.Other.Material:Objects.Other.Revit.RevitMaterial", + "transparency": 0, + "applicationId": "cfcf7b7f-d69b-4df0-8752-e5e85cace12b-0035f80a", + "materialClass": "コンクリート", + "builtInCategory": "OST_Materials", + "materialCategory": "コンクリート", + "isRevitLinkedModel": false, + "materialQuantities": [], + "totalChildrenCount": 0, + "revitLinkedModelPath": "C:\\Program Files\\Autodesk\\Revit 2024\\Samples\\サンプル構造.rvt" + }, + { + "id": "d1b4feed8d71926a25a42d86f9a81209", + "area": 0, + "bbox": null, + "faces": [ + { + "referencedId": "30ba0a6aba886a2e800b12bb37656ab3", + "speckle_type": "reference" + } + ], + "units": "mm", + "colors": [], + "volume": 0, + "vertices": [ + { + "referencedId": "210e0ea727c735970c576cd0beab0493", + "speckle_type": "reference" + } + ], + "__closure": { + "210e0ea727c735970c576cd0beab0493": 1, + "30ba0a6aba886a2e800b12bb37656ab3": 1 + }, + "speckle_type": "Objects.Geometry.Mesh", + "applicationId": null, + "renderMaterial": { + "id": "91b55219af0a40a47f0213b231f149e2", + "name": "Fc24", + "diffuse": -2960686, + "opacity": 1, + "emissive": -16777216, + "metalness": 0, + "roughness": 1, + "speckle_type": "Objects.Other.RenderMaterial", + "applicationId": null, + "totalChildrenCount": 0 + }, + "textureCoordinates": [], + "totalChildrenCount": 0 + } +] \ No newline at end of file diff --git a/test_data/v3_object.json b/test_data/v3_object.json new file mode 100644 index 0000000..55b259f --- /dev/null +++ b/test_data/v3_object.json @@ -0,0 +1,696 @@ +[ + { + "id": "46f06fef727d64a0bbcbd7ced51e0cd2", + "name": "Walls - W30(Fc24)", + "type": "W30(Fc24)", + "level": { + "name": "1FL", + "units": "mm", + "elevation": 0 + }, + "units": "mm", + "family": "Basic Wall", + "flipped": false, + "category": "Walls", + "elements": [], + "location": { + "id": "9c76b8de34382c9052965ee463f8374b", + "end": { + "x": 22400.000000000015, + "y": 20500, + "z": 0, + "id": "3455575bfd8939f264d295b61e74156f", + "units": "mm", + "speckle_type": "Objects.Geometry.Point", + "applicationId": null + }, + "bbox": null, + "start": { + "x": 22400.000000000007, + "y": 15199.999999999998, + "z": 0, + "id": "d0c4fdb2e11cc825e7f05f9dc88a0be1", + "units": "mm", + "speckle_type": "Objects.Geometry.Point", + "applicationId": null + }, + "units": "mm", + "domain": { + "id": "3b97feaad2dbcc2d894c9cec024a9bf2", + "end": 17.388451443569522, + "start": -3.552713668866051e-14, + "speckle_type": "Objects.Primitive.Interval", + "applicationId": null + }, + "length": 5300.000000000002, + "speckle_type": "Objects.Geometry.Line", + "applicationId": null + }, + "topLevel": { + "name": "1FL", + "units": "mm", + "elevation": 0 + }, + "__closure": { + "0ad4db1fe261a5b640ad9f315a46a6fc": 100, + "0d5518a7a3e63fe345e198ad5d6acc4e": 100, + "ec2040af4bd9c8619f9029a43df61a2e": 100 + }, + "elementId": "4479852", + "worksetId": "0", + "properties": { + "Parameters": { + "Type Parameters": { + "Text": { + "符号": { + "name": "符号", + "value": "W30", + "internalDefinitionName": "ee1f33e1-5506-4a64-b87b-7b98d30aea52" + } + }, + "Other": { + "Family Name": { + "name": "Family Name", + "value": "Basic Wall", + "internalDefinitionName": "SYMBOL_FAMILY_NAME_PARAM" + }, + "横筋ピッチ": { + "name": "横筋ピッチ", + "units": "General", + "value": 0, + "internalDefinitionName": "cd19c040-0788-4424-8a67-7127427e311f" + }, + "縦筋ピッチ": { + "name": "縦筋ピッチ", + "units": "General", + "value": 0, + "internalDefinitionName": "6796d143-ef09-4441-9ecc-3411fe837a65" + } + }, + "Rebar Set": { + "横筋 主筋径1": { + "name": "横筋 主筋径1", + "value": "D13", + "internalDefinitionName": "横筋 主筋径1" + }, + "横筋 主筋径2": { + "name": "横筋 主筋径2", + "value": "D16", + "internalDefinitionName": "横筋 主筋径2" + }, + "縦筋 主筋径1": { + "name": "縦筋 主筋径1", + "value": "D13", + "internalDefinitionName": "縦筋 主筋径1" + }, + "縦筋 主筋径2": { + "name": "縦筋 主筋径2", + "value": "D16", + "internalDefinitionName": "縦筋 主筋径2" + }, + "横筋 主筋ピッチ": { + "name": "横筋 主筋ピッチ", + "value": "200", + "internalDefinitionName": "横筋 主筋ピッチ" + }, + "縦筋 主筋ピッチ": { + "name": "縦筋 主筋ピッチ", + "value": "200", + "internalDefinitionName": "縦筋 主筋ピッチ" + }, + "開口補強筋 斜筋 本数": { + "name": "開口補強筋 斜筋 本数", + "value": "―", + "internalDefinitionName": "開口補強筋 斜筋 本数" + }, + "開口補強筋 横筋 本数": { + "name": "開口補強筋 横筋 本数", + "value": "―", + "internalDefinitionName": "開口補強筋 横筋 本数" + }, + "開口補強筋 縦筋 本数": { + "name": "開口補強筋 縦筋 本数", + "value": "―", + "internalDefinitionName": "開口補強筋 縦筋 本数" + } + }, + "Structure": { + "Fc24 (0)": { + "units": "mm", + "function": "Structure", + "material": "Fc24", + "thickness": 300 + } + }, + "Construction": { + "Width": { + "name": "Width", + "units": "Millimeters", + "value": 300, + "internalDefinitionName": "WALL_ATTR_WIDTH_PARAM" + }, + "Function": { + "name": "Function", + "value": "Interior", + "internalDefinitionName": "FUNCTION_PARAM" + }, + "Wrapping at Ends": { + "name": "Wrapping at Ends", + "value": "None", + "internalDefinitionName": "WRAPPING_AT_ENDS_PARAM" + }, + "Wrapping at Inserts": { + "name": "Wrapping at Inserts", + "value": "Do not wrap", + "internalDefinitionName": "WRAPPING_AT_INSERTS_PARAM" + } + }, + "Identity Data": { + "Cost": { + "name": "Cost", + "units": "Currency", + "value": 0, + "internalDefinitionName": "ALL_MODEL_COST" + }, + "Type Name": { + "name": "Type Name", + "value": "W30(Fc24)", + "internalDefinitionName": "SYMBOL_NAME_PARAM" + } + }, + "IFC Parameters": { + "Type IfcGUID": { + "name": "Type IfcGUID", + "value": "0oqavz9$zDZxycDyfZdYh0", + "internalDefinitionName": "IFC_TYPE_GUID" + }, + "Export Type to IFC": { + "name": "Export Type to IFC", + "value": "Default", + "internalDefinitionName": "IFC_EXPORT_ELEMENT_TYPE" + } + }, + "Analytical Properties": { + "Roughness": { + "name": "Roughness", + "value": 1, + "internalDefinitionName": "ANALYTICAL_ROUGHNESS" + }, + "Absorptance": { + "name": "Absorptance", + "units": "General", + "value": 0.1, + "internalDefinitionName": "ANALYTICAL_ABSORPTANCE" + }, + "Thermal Mass": { + "name": "Thermal Mass", + "units": "Kilojoules per square meter Kelvin", + "value": 0, + "internalDefinitionName": "ANALYTICAL_THERMAL_MASS" + }, + "Thermal Resistance (R)": { + "name": "Thermal Resistance (R)", + "units": "Square meter kelvins per watt", + "value": 0, + "internalDefinitionName": "ANALYTICAL_THERMAL_RESISTANCE" + }, + "Heat Transfer Coefficient (U)": { + "name": "Heat Transfer Coefficient (U)", + "units": "Watts per square meter kelvin", + "value": 0, + "internalDefinitionName": "ANALYTICAL_HEAT_TRANSFER_COEFFICIENT" + } + }, + "Materials and Finishes": { + "Structural Material": { + "name": "Structural Material", + "value": "Fc24", + "internalDefinitionName": "STRUCTURAL_MATERIAL_PARAM" + } + } + }, + "Instance Parameters": { + "Other": { + "Type": { + "name": "Type", + "value": "W30(Fc24)", + "internalDefinitionName": "ELEM_TYPE_PARAM" + }, + "Family": { + "name": "Family", + "value": "Basic Wall", + "internalDefinitionName": "ELEM_FAMILY_PARAM" + }, + "Type Id": { + "name": "Type Id", + "value": "Basic Wall W30(Fc24)", + "internalDefinitionName": "SYMBOL_ID_PARAM" + }, + "Family and Type": { + "name": "Family and Type", + "value": "Basic Wall W30(Fc24)", + "internalDefinitionName": "ELEM_FAMILY_AND_TYPE_PARAM" + } + }, + "Phasing": { + "Phase Created": { + "name": "Phase Created", + "value": "フェーズ1", + "internalDefinitionName": "PHASE_CREATED" + } + }, + "Dimensions": { + "Area": { + "name": "Area", + "units": "Square meters", + "value": 7.630000000000015, + "internalDefinitionName": "HOST_AREA_COMPUTED" + }, + "Length": { + "name": "Length", + "units": "Millimeters", + "value": 5300.000000000001, + "internalDefinitionName": "CURVE_ELEM_LENGTH" + }, + "Volume": { + "name": "Volume", + "units": "Cubic meters", + "value": 2.2890000000000135, + "internalDefinitionName": "HOST_VOLUME_COMPUTED" + } + }, + "Structural": { + "Structural": { + "name": "Structural", + "value": "Yes", + "internalDefinitionName": "WALL_STRUCTURAL_SIGNIFICANT" + }, + "Structural Usage": { + "name": "Structural Usage", + "value": "Bearing", + "internalDefinitionName": "WALL_STRUCTURAL_USAGE_PARAM" + }, + "Rebar Cover - Other Faces": { + "name": "Rebar Cover - Other Faces", + "value": "Rebar Cover Settings 内壁(フレーム、柱、および耐力壁)", + "internalDefinitionName": "CLEAR_COVER_OTHER" + }, + "Rebar Cover - Exterior Face": { + "name": "Rebar Cover - Exterior Face", + "value": "Rebar Cover Settings 内壁(フレーム、柱、および耐力壁)", + "internalDefinitionName": "CLEAR_COVER_EXTERIOR" + }, + "Rebar Cover - Interior Face": { + "name": "Rebar Cover - Interior Face", + "value": "Rebar Cover Settings 内壁(フレーム、柱、および耐力壁)", + "internalDefinitionName": "CLEAR_COVER_INTERIOR" + }, + "構造スリット 下端": { + "name": "構造スリット 下端", + "value": "No", + "internalDefinitionName": "0560d1bb-007b-45e4-b8c3-87f9c6a3d73c" + }, + "構造スリット 始端": { + "name": "構造スリット 始端", + "value": "No", + "internalDefinitionName": "60795a90-8c91-4e11-90a0-b77b819c2403" + }, + "構造スリット 終端": { + "name": "構造スリット 終端", + "value": "No", + "internalDefinitionName": "e3223f14-6158-4d4f-8697-0de2bcc7f737" + } + }, + "Constraints": { + "Top Offset": { + "name": "Top Offset", + "units": "Millimeters", + "value": -600, + "internalDefinitionName": "WALL_TOP_OFFSET" + }, + "Base Offset": { + "name": "Base Offset", + "units": "Millimeters", + "value": -2000, + "internalDefinitionName": "WALL_BASE_OFFSET" + }, + "Location Line": { + "name": "Location Line", + "value": "Core Centerline", + "internalDefinitionName": "WALL_KEY_REF_PARAM" + }, + "Room Bounding": { + "name": "Room Bounding", + "value": "Yes", + "internalDefinitionName": "WALL_ATTR_ROOM_BOUNDING" + }, + "Top Constraint": { + "name": "Top Constraint", + "value": "1FL", + "internalDefinitionName": "WALL_HEIGHT_TYPE" + }, + "Base Constraint": { + "name": "Base Constraint", + "value": "1FL", + "internalDefinitionName": "WALL_BASE_CONSTRAINT" + }, + "Related to Mass": { + "name": "Related to Mass", + "value": "No", + "internalDefinitionName": "RELATED_TO_MASS" + }, + "Top is Attached": { + "name": "Top is Attached", + "value": "No", + "internalDefinitionName": "WALL_TOP_IS_ATTACHED" + }, + "Base is Attached": { + "name": "Base is Attached", + "value": "No", + "internalDefinitionName": "WALL_BOTTOM_IS_ATTACHED" + }, + "Unconnected Height": { + "name": "Unconnected Height", + "units": "Millimeters", + "value": 1400, + "internalDefinitionName": "WALL_USER_HEIGHT_PARAM" + }, + "Top Extension Distance": { + "name": "Top Extension Distance", + "units": "Millimeters", + "value": 0, + "internalDefinitionName": "WALL_TOP_EXTENSION_DIST_PARAM" + }, + "Base Extension Distance": { + "name": "Base Extension Distance", + "units": "Millimeters", + "value": 0, + "internalDefinitionName": "WALL_BOTTOM_EXTENSION_DIST_PARAM" + } + }, + "Identity Data": { + "Has Association": { + "name": "Has Association", + "value": "Yes", + "internalDefinitionName": "ANALYTICAL_ELEMENT_HAS_ASSOCIATION" + }, + "SPECKLE_Classification": { + "name": "SPECKLE_Classification", + "value": "Wall", + "internalDefinitionName": "SPECKLE_Classification" + } + }, + "IFC Parameters": { + "IfcGUID": { + "name": "IfcGUID", + "value": "0oqavz9$zDZxycDyfZdYsW", + "internalDefinitionName": "IFC_GUID" + }, + "Export to IFC": { + "name": "Export to IFC", + "value": "By Type", + "internalDefinitionName": "IFC_EXPORT_ELEMENT" + } + }, + "Cross-Section Definition": { + "Cross-Section": { + "name": "Cross-Section", + "value": "Vertical", + "internalDefinitionName": "WALL_CROSS_SECTION" + } + } + } + }, + "Material Quantities": { + "Fc24": { + "area": 7630000.000000016, + "units": "mm", + "volume": 2289000000.0000134, + "materialName": "Fc24", + "materialClass": "コンクリート", + "materialCategory": "コンクリート" + } + } + }, + "worksetName": "ワークセット1", + "displayValue": [ + { + "__closure": null, + "referencedId": "ec2040af4bd9c8619f9029a43df61a2e", + "speckle_type": "reference" + } + ], + "isStructural": true, + "speckle_type": "Objects.Data.DataObject:Objects.Data.RevitObject", + "applicationId": "32d24e7d-27ff-4d8f-bf26-37ca63da76cc-00445b6c", + "builtInCategory": "OST_Walls", + "totalChildrenCount": null + }, + { + "id": "0ad4db1fe261a5b640ad9f315a46a6fc", + "data": [ + 3, + 5, + 0, + 1, + 3, + 5, + 1, + 4, + 3, + 4, + 2, + 3, + 3, + 2, + 4, + 1, + 3, + 11, + 12, + 9, + 3, + 9, + 10, + 11, + 3, + 12, + 13, + 9, + 3, + 13, + 6, + 8, + 3, + 7, + 8, + 6, + 3, + 13, + 8, + 9, + 3, + 15, + 16, + 18, + 3, + 14, + 15, + 19, + 3, + 17, + 18, + 16, + 3, + 19, + 20, + 14, + 3, + 18, + 19, + 15, + 3, + 21, + 22, + 23, + 3, + 23, + 24, + 21, + 3, + 26, + 27, + 29, + 3, + 25, + 26, + 30, + 3, + 28, + 29, + 27, + 3, + 30, + 31, + 25, + 3, + 29, + 30, + 26, + 3, + 32, + 33, + 34, + 3, + 34, + 35, + 32 + ], + "speckle_type": "Speckle.Core.Models.DataChunk", + "applicationId": null + }, + { + "id": "0d5518a7a3e63fe345e198ad5d6acc4e", + "data": [ + 22550.00031738281, + 15049.999969482422, + -2000.000015258789, + 22550.00031738281, + 20274.999645996093, + -2000.000015258789, + 22550.00031738281, + 20499.999865722657, + -2000.000015258789, + 22550.00031738281, + 20499.999865722657, + -600.0000045776368, + 22550.00031738281, + 20274.999645996093, + -600.0000045776368, + 22550.00031738281, + 15049.999969482422, + -600.0000045776368, + 22250.000024414065, + 15049.999969482422, + -2000.000015258789, + 22250.000024414065, + 15049.999969482422, + -600.0000045776368, + 22250.000024414065, + 15350.000262451173, + -600.0000045776368, + 22250.000024414065, + 20274.999645996093, + -600.0000045776368, + 22250.000024414065, + 20499.999865722657, + -600.0000045776368, + 22250.000024414065, + 20499.999865722657, + -2000.000015258789, + 22250.000024414065, + 20274.999645996093, + -2000.000015258789, + 22250.000024414065, + 15350.000262451173, + -2000.000015258789, + 22550.00031738281, + 20499.999865722657, + -2000.000015258789, + 22550.00031738281, + 20274.999645996093, + -2000.000015258789, + 22550.00031738281, + 15049.999969482422, + -2000.000015258789, + 22250.000024414065, + 15049.999969482422, + -2000.000015258789, + 22250.000024414065, + 15350.000262451173, + -2000.000015258789, + 22250.000024414065, + 20274.999645996093, + -2000.000015258789, + 22250.000024414065, + 20499.999865722657, + -2000.000015258789, + 22550.00031738281, + 20499.999865722657, + -2000.000015258789, + 22250.000024414065, + 20499.999865722657, + -2000.000015258789, + 22250.000024414065, + 20499.999865722657, + -600.0000045776368, + 22550.00031738281, + 20499.999865722657, + -600.0000045776368, + 22550.00031738281, + 15049.999969482422, + -600.0000045776368, + 22550.00031738281, + 20274.999645996093, + -600.0000045776368, + 22550.00031738281, + 20499.999865722657, + -600.0000045776368, + 22250.000024414065, + 20499.999865722657, + -600.0000045776368, + 22250.000024414065, + 20274.999645996093, + -600.0000045776368, + 22250.000024414065, + 15350.000262451173, + -600.0000045776368, + 22250.000024414065, + 15049.999969482422, + -600.0000045776368, + 22550.00031738281, + 15049.999969482422, + -600.0000045776368, + 22250.000024414065, + 15049.999969482422, + -600.0000045776368, + 22250.000024414065, + 15049.999969482422, + -2000.000015258789, + 22550.00031738281, + 15049.999969482422, + -2000.000015258789 + ], + "speckle_type": "Speckle.Core.Models.DataChunk", + "applicationId": null + }, + { + "id": "ec2040af4bd9c8619f9029a43df61a2e", + "area": 0, + "bbox": null, + "faces": [ + { + "__closure": null, + "referencedId": "0ad4db1fe261a5b640ad9f315a46a6fc", + "speckle_type": "reference" + } + ], + "units": "mm", + "colors": [], + "volume": 0, + "vertices": [ + { + "__closure": null, + "referencedId": "0d5518a7a3e63fe345e198ad5d6acc4e", + "speckle_type": "reference" + } + ], + "__closure": { + "0ad4db1fe261a5b640ad9f315a46a6fc": 100, + "0d5518a7a3e63fe345e198ad5d6acc4e": 100 + }, + "speckle_type": "Objects.Geometry.Mesh", + "applicationId": "d2c33253-d0ed-4682-9633-e083daaa87db", + "textureCoordinates": [] + } +] \ No newline at end of file diff --git a/tests/conftest.py b/tests/conftest.py index 3fbff20..4ba9f26 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,24 +1,132 @@ -import os - -from dotenv import load_dotenv +import pytest +from specklepy.objects.base import Base -def pytest_configure(config): - load_dotenv(dotenv_path=".env") +@pytest.fixture +def v2_wall(): + """Creates a v2-style Speckle wall object.""" + wall = Base() + wall.id = "cdb18060dc48281909e94f0f1d8d3cc0" + wall.type = "W30(Fc24)" + wall.units = "mm" + wall.family = "Basic Wall" + wall.height = 1400 + wall.flipped = False + wall.category = "Walls" + wall.elementId = "4479852" + wall.worksetId = "0" + wall.structural = True + wall.baseOffset = -2000 + wall.topOffset = -600 - token_var = "SPECKLE_TOKEN" - server_var = "SPECKLE_SERVER_URL" - token = os.getenv(token_var) - server = os.getenv(server_var) + # Create base line geometry + wall.baseLine = Base() + wall.baseLine.start = Base() + wall.baseLine.start.x = 22400.000000000007 + wall.baseLine.start.y = 15199.999999999998 + wall.baseLine.start.z = -2000.0000000000002 + wall.baseLine.end = Base() + wall.baseLine.end.x = 22400.000000000015 + wall.baseLine.end.y = 20500 + wall.baseLine.end.z = -2000.0000000000002 + wall.baseLine.units = "mm" + wall.baseLine.length = 5300.000000000002 - if not token: - raise ValueError(f"Cannot run tests without a {token_var} environment variable") + # Create parameters structure + wall.parameters = Base() - if not server: - raise ValueError( - f"Cannot run tests without a {server_var} environment variable" - ) + # Standard parameter + wall.parameters["WALL_ATTR_WIDTH_PARAM"] = Base() + wall.parameters["WALL_ATTR_WIDTH_PARAM"].name = "Width" + wall.parameters["WALL_ATTR_WIDTH_PARAM"].value = 300 + wall.parameters["WALL_ATTR_WIDTH_PARAM"].units = "mm" - # Set the token as an attribute on the config object - config.SPECKLE_TOKEN = token - config.SPECKLE_SERVER_URL = server + # Parameter with GUID key + wall.parameters["ee1f33e1-5506-4a64-b87b-7b98d30aea52"] = Base() + wall.parameters["ee1f33e1-5506-4a64-b87b-7b98d30aea52"].name = "符号" + wall.parameters["ee1f33e1-5506-4a64-b87b-7b98d30aea52"].value = "W30" + wall.parameters["ee1f33e1-5506-4a64-b87b-7b98d30aea52"].isShared = True + wall.parameters[ + "ee1f33e1-5506-4a64-b87b-7b98d30aea52" + ].internalDefinitionName = "ee1f33e1-5506-4a64-b87b-7b98d30aea52" + + wall.parameters["STRUCTURAL_MATERIAL_PARAM"] = Base() + wall.parameters["STRUCTURAL_MATERIAL_PARAM"].name = "Structural Material" + wall.parameters["STRUCTURAL_MATERIAL_PARAM"].value = "Fc24" + + # Create basic level reference + wall.level = Base() + wall.level.name = "1FL" + wall.level.elevation = 0 + wall.level.units = "mm" + + return wall + + +@pytest.fixture +def v3_wall(): + """Creates a v3-style Speckle wall object.""" + wall = Base() + wall.id = "46f06fef727d64a0bbcbd7ced51e0cd2" + wall.name = "Walls - W30(Fc24)" + wall.type = "W30(Fc24)" + wall.units = "mm" + wall.family = "Basic Wall" + wall.flipped = False + wall.category = "Walls" + wall.elementId = "4479852" + wall.worksetId = "0" + + # Create location geometry + wall.location = Base() + wall.location.start = Base() + wall.location.start.x = 22400.000000000007 + wall.location.start.y = 15199.999999999998 + wall.location.start.z = 0 + wall.location.end = Base() + wall.location.end.x = 22400.000000000015 + wall.location.end.y = 20500 + wall.location.end.z = 0 + wall.location.units = "mm" + wall.location.length = 5300.000000000002 + + # Create nested properties structure + wall.properties = Base() + wall.properties.Parameters = Base() + + # Type Parameters + wall.properties.Parameters["Type Parameters"] = Base() + + # Add Text section with GUID parameter + wall.properties.Parameters["Type Parameters"].Text = Base() + wall.properties.Parameters["Type Parameters"].Text["符号"] = { + "name": "符号", + "value": "W30", + "internalDefinitionName": "ee1f33e1-5506-4a64-b87b-7b98d30aea52", + } + + wall.properties.Parameters["Type Parameters"].Structure = Base() + wall.properties.Parameters["Type Parameters"].Structure["Fc24 (0)"] = { + "units": "mm", + "function": "Structure", + "material": "Fc24", + "thickness": 300, + } + + # Instance Parameters + wall.properties.Parameters["Instance Parameters"] = Base() + wall.properties.Parameters["Instance Parameters"].Structural = Base() + wall.properties.Parameters["Instance Parameters"].Structural.Structural = {"name": "Structural", "value": "Yes"} + + # Create basic level references + wall.level = Base() + wall.level.name = "1FL" + wall.level.elevation = 0 + wall.level.units = "mm" + + wall.topLevel = Base() + wall.topLevel.name = "1FL" + wall.topLevel.elevation = 0 + wall.topLevel.units = "mm" + + return wall diff --git a/tests/localtest.py b/tests/localtest.py deleted file mode 100644 index e1fbeca..0000000 --- a/tests/localtest.py +++ /dev/null @@ -1,32 +0,0 @@ -"""Run integration tests with a speckle server.""" - -from speckle_automate import ( - AutomationContext, - AutomationRunData, - AutomationStatus, - run_function -) - -from src.inputs import FunctionInputs -from src.function import automate_function - - -def test_function_run(test_automation_run_data: AutomationRunData, test_automation_token: str): - """Run an integration test for the automate function.""" - automation_context = AutomationContext.initialize( - test_automation_run_data, test_automation_token - ) - default_url: str = ( - "https://docs.google.com/spreadsheets/d/e/2PACX-1vSFmjLfqxPKXJHg-wEs1cp_nJEJJhESGVTLCvWLG_" - "IgIuRZ4CmMDCSceOYFvuo8IqcmT4sj9qPiLfCx/pub?gid=0&single=true&output=tsv" - ) - - automate_sdk = run_function( - automation_context, - automate_function, - FunctionInputs(spreadsheet_url=default_url), - ) - - assert automate_sdk.run_status == AutomationStatus.SUCCEEDED - -# cli command to run just this test with pytest: pytest tests/local_test_exercise2.py::test_function_run diff --git a/tests/test_function.py b/tests/test_function.py index dbc33b1..73ae814 100644 --- a/tests/test_function.py +++ b/tests/test_function.py @@ -1,31 +1,41 @@ """Run integration tests with a speckle server.""" -from pydantic import SecretStr - from speckle_automate import ( AutomationContext, AutomationRunData, AutomationStatus, - run_function + run_function, ) +from speckle_automate.fixtures import * # noqa: F401, F403 -from main import FunctionInputs, automate_function - -from speckle_automate.fixtures import * +from src.function import automate_function +from src.helpers import speckle_print +from src.inputs import FunctionInputs def test_function_run(test_automation_run_data: AutomationRunData, test_automation_token: str): + """Run an integration test for the automate function. + + Args: + test_automation_run_data (AutomationRunData): The automation run data provided by sdk. + test_automation_token (str): The automation token. + + """ + speckle_print(str(test_automation_run_data)) + speckle_print(str(test_automation_token)) + """Run an integration test for the automate function.""" automation_context = AutomationContext.initialize( test_automation_run_data, test_automation_token ) + default_url: str = ( + "https://drive.google.com/uc?export=download&id=1hiPSw23eOaqd27QD_YsXvZg9PWm7_XBx" + ) + automate_sdk = run_function( automation_context, automate_function, - FunctionInputs( - forbidden_speckle_type="None", - whisper_message=SecretStr("testing automatically"), - ), + FunctionInputs(spreadsheet_url=default_url), ) assert automate_sdk.run_status == AutomationStatus.SUCCEEDED diff --git a/tests/test_parameters.py b/tests/test_parameters.py new file mode 100644 index 0000000..15f4f88 --- /dev/null +++ b/tests/test_parameters.py @@ -0,0 +1,404 @@ +import os +from typing import Any + +import pytest +from dotenv import load_dotenv +from speckle_automate import AutomationContext, AutomationRunData # noqa: F401, F403 + +# from speckle_automate.fixtures import * # noqa: F401, F403 +from specklepy.api.client import SpeckleClient +from specklepy.core.api import operations +from specklepy.objects.base import Base +from specklepy.transports.server import ServerTransport + +from helpers import speckle_print +from src.rules import PropertyRules + + +def load_test_objects(v2_wall: Any, v3_wall: Any) -> tuple[Base, Base]: + """Load test objects from a Speckle server.""" + client = SpeckleClient(host="https://app.speckle.systems", use_ssl=True) + + load_dotenv(dotenv_path="../.env") + + client.authenticate_with_token(os.getenv("SPECKLE_TOKEN")) + + transport = ServerTransport(client=client, stream_id=os.getenv("SPECKLE_PROJECT_ID")) + + speckle_print(v2_wall) + v2_obj = operations.receive("cdb18060dc48281909e94f0f1d8d3cc0", transport) + v3_obj = operations.receive("46f06fef727d64a0bbcbd7ced51e0cd2", transport) + + # return v2_wall, v3_wall + return v2_obj, v3_obj + + +@pytest.fixture +def test_objects(v2_wall: Any, v3_wall: Any) -> tuple[Base, Base]: + """Pytest fixture to provide test objects.""" + return load_test_objects(v2_wall, v3_wall) + + +def test_deserialization_structure(test_objects): + """Test that objects are properly deserialized with correct structure.""" + v2_obj, v3_obj = test_objects + + # Check base class type + for obj in [v2_obj, v3_obj]: + assert isinstance(obj, Base), f"Expected {obj} to be an instance of Base" + + # Check v2 structure + assert hasattr(v2_obj, "parameters"), "v2_obj should have 'parameters' attribute" + assert v2_obj["parameters"] is not None, "v2_obj['parameters'] should not be None" + + # Check v3 structure + assert hasattr(v3_obj, "properties"), "v3_obj should have 'properties' attribute" + assert v3_obj["properties"] is not None, "v3_obj['properties'] should not be None" + assert "Parameters" in v3_obj["properties"], "'Parameters' key should exist in v3_obj['properties']" + + +@pytest.mark.parametrize( + "param_name, expected_result", + [ + ("category", True), # Test parameters that should exist + ("WALL_ATTR_WIDTH_PARAM", True), # Test nested parameters + ("WALL_ATTR_WIDTH_PARAM.value", True), + ("WALL_ATTR_WIDTH_PARAM.id", True), + ("WALL_ATTR_WIDTH_PARAM.units", True), + ("non_existent_param", False), # Test non-existent parameters + ], +) +def test_v2_parameter_exists(test_objects, param_name, expected_result): + """Test parameter existence checking in v2 objects.""" + v2_obj, _ = test_objects + assert PropertyRules.has_parameter(v2_obj, param_name) == expected_result + + +@pytest.mark.parametrize( + "param_name", + [ + "WALL_ATTR_WIDTH_PARAM.id", + "WALL_ATTR_WIDTH_PARAM.value", + "WALL_ATTR_WIDTH_PARAM", + "WALL_ATTR_WIDTH_PARAM.units", + ], +) +def test_v2_parameter_value_retrieval(test_objects, param_name): + """Test parameter value retrieval in v2 objects.""" + v2_obj, _ = test_objects + assert PropertyRules.get_parameter_value(v2_obj, param_name) + + +@pytest.mark.parametrize( + "param_name, expected_result", + [ + ("category", True), # Test parameters that should exist + ("Width", True), # Test nested parameters + ("non_existent_param", False), # Test non-existent parameters + ], +) +def test_v3_parameter_exists(test_objects, param_name, expected_result): + """Test parameter existence checking in v3 objects.""" + _, v3_obj = test_objects + assert PropertyRules.has_parameter(v3_obj, param_name) == expected_result + + +@pytest.mark.parametrize( + "param_name_1, param_name_2", + [ + ( + "properties.Parameters.Instance Parameters.Dimensions.Length.value", + "Instance Parameters.Dimensions.Length", + ), + ], +) +def test_v3_parameter_search_equivalence(test_objects, param_name_1, param_name_2): + """Test parameter existence checking equivalence in v3 objects.""" + _, v3_obj = test_objects + assert PropertyRules.get_parameter_value(v3_obj, param_name_1) == PropertyRules.get_parameter_value( + v3_obj, param_name_2 + ) + + +@pytest.mark.parametrize( + "obj_version, param_name, expected_value, default_value", + [ + # Test direct parameters + ("v2", "category", "Walls", None), + ("v3", "category", "Walls", None), + # Test nested parameters - using both internal and friendly names + ("v2", "WALL_ATTR_WIDTH_PARAM", 300, None), + ("v3", "Construction.Width", 300, None), + # Test parameters with units + ("v2", "CURVE_ELEM_LENGTH", 5300.000000000001, None), + ("v3", "Instance Parameters.Dimensions.Length", 5300.000000000001, None), + # Test non-existent parameters with a default value + ("v2", "parameters.non_existent", "default", "default"), + ("v3", "properties.Parameters.non_existent", "default", "default"), + ], +) +def test_parameter_value_retrieval(test_objects, obj_version, param_name, expected_value, default_value): + """Test parameter value retrieval from both v2 and v3 objects.""" + v2_obj, v3_obj = test_objects + obj = v2_obj if obj_version == "v2" else v3_obj + result = PropertyRules.get_parameter_value(obj, param_name, default_value=default_value) + assert result == expected_value + + +@pytest.mark.parametrize( + "param_name, expected_value, expected_result", + [ + ("category", "Walls", True), # Test exact match + ("WALL_ATTR_WIDTH_PARAM", 300, True), # Test numeric match + ("category", "Windows", False), # Test non-match + ], +) +def test_v2_parameter_value_matching(test_objects, param_name, expected_value, expected_result): + """Test parameter value matching in v2 objects.""" + v2_obj, _ = test_objects + assert PropertyRules.is_parameter_value(v2_obj, param_name, expected_value) == expected_result + + +@pytest.mark.parametrize( + "param_name, expected_value, expected_result", + [ + ("category", "Walls", True), # Test exact match + ("Width", 300, True), # Test numeric match + ("category", "Windows", False), # Test non-match + ], +) +def test_v3_parameter_value_matching(test_objects, param_name, expected_value, expected_result): + """Test parameter value matching in v3 objects.""" + _, v3_obj = test_objects + assert PropertyRules.is_parameter_value(v3_obj, param_name, expected_value) == expected_result + + +@pytest.mark.parametrize( + "comparison_func, param_name, value, expected_result", + [ + (PropertyRules.is_parameter_value_greater_than, "WALL_ATTR_WIDTH_PARAM", "200", True), # Test greater than + (PropertyRules.is_parameter_value_less_than, "WALL_ATTR_WIDTH_PARAM", "400", True), # Test less than + (PropertyRules.is_parameter_value_in_range, "WALL_ATTR_WIDTH_PARAM", "200,400", True), # Test in range + ], +) +def test_v2_parameter_numeric_comparisons(test_objects, comparison_func, param_name, value, expected_result): + """Test numeric parameter comparisons in v2 objects.""" + v2_obj, _ = test_objects + assert comparison_func(v2_obj, param_name, value) == expected_result + + +@pytest.mark.parametrize( + "comparison_func, param_name, value, expected_result", + [ + (PropertyRules.is_parameter_value_greater_than, "Width", "200", True), # Test greater than + (PropertyRules.is_parameter_value_less_than, "Width", "400", True), # Test less than + (PropertyRules.is_parameter_value_in_range, "Width", "200,400", True), # Test in range + ], +) +def test_v3_parameter_numeric_comparisons(test_objects, comparison_func, param_name, value, expected_result): + """Test numeric parameter comparisons in v3 objects.""" + _, v3_obj = test_objects + assert comparison_func(v3_obj, param_name, value) == expected_result + + +@pytest.mark.parametrize( + "param_name, pattern, fuzzy, expected_result", + [ + ("category", "^Walls$", False, True), # Test exact pattern matches + ("category", "Walls", True, True), # Test fuzzy matches + ("category", "Wall", False, True), # Test partial pattern matches + ("category", "^Windows$", False, False), # Test non-matches + ], +) +def test_v2_parameter_value_like(test_objects, param_name, pattern, fuzzy, expected_result): + """Test pattern matching on parameter values in v2 objects.""" + v2_obj, _ = test_objects + assert PropertyRules.is_parameter_value_like(v2_obj, param_name, pattern, fuzzy=fuzzy) == expected_result + + +@pytest.mark.parametrize( + "param_name, pattern, fuzzy, expected_result", + [ + ("category", "^Walls$", False, True), # Test exact pattern matches + ("category", "Walls", True, True), # Test fuzzy matches + ("category", "Wall", False, True), # Test partial pattern matches + ("category", "^Windows$", False, False), # Test non-matches + ], +) +def test_v3_parameter_value_like(test_objects, param_name, pattern, fuzzy, expected_result): + """Test pattern matching on parameter values in v3 objects.""" + _, v3_obj = test_objects + assert PropertyRules.is_parameter_value_like(v3_obj, param_name, pattern, fuzzy=fuzzy) == expected_result + + +@pytest.mark.parametrize( + "param_name, valid_list, expected_result", + [ + ("category", ["Walls", "Windows", "Doors"], True), # Test value in list + ("category", "Walls,Windows,Doors", True), # Test comma-separated string list + ("category", ["Windows", "Doors"], False), # Test value not in list + ], +) +def test_v2_parameter_lists(test_objects, param_name, valid_list, expected_result): + """Test list-based parameter checks in v2 objects.""" + v2_obj, _ = test_objects + assert PropertyRules.is_parameter_value_in_list(v2_obj, param_name, valid_list) == expected_result + + +@pytest.mark.parametrize( + "param_name, valid_list, expected_result", + [ + ("category", ["Walls", "Windows", "Doors"], True), # Test value in list + ("category", "Walls,Windows,Doors", True), # Test comma-separated string list + ("category", ["Windows", "Doors"], False), # Test value not in list + ], +) +def test_v3_parameter_lists(test_objects, param_name, valid_list, expected_result): + """Test list-based parameter checks in v3 objects.""" + _, v3_obj = test_objects + assert PropertyRules.is_parameter_value_in_list(v3_obj, param_name, valid_list) == expected_result + + +@pytest.mark.parametrize( + "param_name, expected_result", + [ + ("WALL_ATTR_ROOM_BOUNDING.value", True), # Test true values + ("wall_top_is_attached", False), # Test false values + ], +) +def test_v2_boolean_parameters(test_objects, param_name, expected_result): + """Test boolean parameter checks in v2 objects.""" + v2_obj, _ = test_objects + if expected_result: + assert PropertyRules.is_parameter_value_true(v2_obj, param_name) + else: + assert PropertyRules.is_parameter_value_false(v2_obj, param_name) + + +@pytest.mark.parametrize( + "param_name, expected_result", + [ + ("Room Bounding", True), # Test true values + ("top is attached", False), # Test false values + ("Top is Attached", False), # Case sensitivity test + ], +) +def test_v3_boolean_parameters(test_objects, param_name, expected_result): + """Test boolean parameter checks in v3 objects.""" + _, v3_obj = test_objects + if expected_result: + assert PropertyRules.is_parameter_value_true(v3_obj, param_name) + else: + assert PropertyRules.is_parameter_value_false(v3_obj, param_name) + + +@pytest.mark.parametrize( + "param_name, expected_value, expected_result", + [ + # Test numeric value comparisons + ("WALL_ATTR_WIDTH_PARAM", 300, True), + ("WALL_ATTR_WIDTH_PARAM.value", 300, True), + ("baseLine.length", 5300.000000000002, True), + # Test string value comparisons + ("STRUCTURAL_MATERIAL_PARAM.value", "Fc24", True), + ("ee1f33e1-5506-4a64-b87b-7b98d30aea52.value", "W30", True), + # Test non-matches + ("WALL_ATTR_WIDTH_PARAM", 301, False), + ("nonexistent_param", "any_value", False), + ], +) +def test_v2_parameter_value_comparisons(v2_wall, param_name, expected_value, expected_result): + """Test value comparisons using v2 wall parameters.""" + assert PropertyRules.is_equal_value(v2_wall, param_name, expected_value) == expected_result + + +@pytest.mark.parametrize( + "attribute, value, expected", + [ + # Test numeric value comparisons + ("Type Parameters.Structure.Fc24 (0).thickness", 300, True), + ("location.length", 5300.000000000002, True), + ("location.length", 5300, True), + # Test string value comparisons + ("Type Parameters.Text.符号.value", "W30", True), + ("Instance Parameters.Structural.Structural.value", "Yes", True), + # Test non-matches + ("Type Parameters.Structure.Fc24 (0).thickness", 301, False), + ("nonexistent_param", "any_value", False), + ], +) +def test_v3_parameter_value_comparisons(v3_wall, attribute, value, expected): + """Test value comparisons using v3 wall parameters.""" + assert PropertyRules.is_equal_value(v3_wall, attribute, value) == expected + + +@pytest.mark.parametrize( + "wall, attribute, value, expected", + [ + # V2 wall tests + ("v2_wall", "WALL_ATTR_WIDTH_PARAM.value", 300, True), + ("v2_wall", "type", "W30(Fc24)", True), + ("v2_wall", "WALL_ATTR_WIDTH_PARAM.value", 300.0001, False), + # V3 wall tests + ("v3_wall", "Type Parameters.Structure.Fc24 (0).thickness", 300, True), + ("v3_wall", "type", "W30(Fc24)", True), + ("v3_wall", "Type Parameters.Structure.Fc24 (0).thickness", 300.0001, False), + ("v3_wall", "location.length", 5300.000000000002, True), + ("v3_wall", "location.length", 5300, False), + ], +) +def test_identical_comparisons(request, wall, attribute, value, expected): + """Test identical value comparisons on both wall versions.""" + wall_instance = request.getfixturevalue(wall) + assert PropertyRules.is_identical_value(wall_instance, attribute, value) == expected + + +@pytest.mark.parametrize( + "wall, attribute, value", + [ + # V2 wall tests + ("v2_wall", "WALL_ATTR_WIDTH_PARAM.value", 301), + ("v2_wall", "STRUCTURAL_MATERIAL_PARAM.value", "Fc25"), + ("v2_wall", "nonexistent_param", "any_value"), + # V3 wall tests + ("v3_wall", "Type Parameters.Structure.Fc24 (0).thickness", 301), + ("v3_wall", "Type Parameters.Text.符号.value", "W31"), + ("v3_wall", "nonexistent_param", "any_value"), + ], +) +def test_not_equal_comparisons(request, wall, attribute, value): + """Test not equal comparisons on both wall versions.""" + wall_instance = request.getfixturevalue(wall) + assert PropertyRules.is_not_equal_value(wall_instance, attribute, value) + + +@pytest.mark.parametrize( + "attribute, value, expected_equal, expected_identical", + [ + # Test Yes/No conversion in equals (should convert) + ("Instance Parameters.Structural.Structural.value", True, True, False), # Yes vs True + ("Instance Parameters.Structural.Structural.value", "Yes", True, True), # Yes vs "Yes" + ("Instance Parameters.Structural.Structural.value", "yes", True, False), # Yes vs "yes" + ], +) +def test_boolean_conversions(v3_wall, attribute, value, expected_equal, expected_identical): + """Test conversion of Yes/No strings to boolean values.""" + assert PropertyRules.is_equal_value(v3_wall, attribute, value) == expected_equal + assert PropertyRules.is_identical_value(v3_wall, attribute, value) == expected_identical + + +@pytest.mark.parametrize( + "wall, attribute, expected_value", + [ + # V2 wall tests + ("v2_wall", "WALL_ATTR_WIDTH_PARAM.value", "300"), + ("v2_wall", "baseLine.length", "5300.000000000002"), + # V3 wall tests + ("v3_wall", "Type Parameters.Structure.Fc24 (0).thickness", "300"), + ("v3_wall", "location.length", "5300.000000000002"), + ], +) +def test_numeric_string_handling(wall, attribute, expected_value, request): + """Test handling of numeric strings in both wall versions.""" + wall_instance = request.getfixturevalue(wall) # Retrieve fixture dynamically + assert PropertyRules.is_equal_value(wall_instance, attribute, expected_value) diff --git a/tests/test_user_entry.py b/tests/test_user_entry.py new file mode 100644 index 0000000..ca91c3d --- /dev/null +++ b/tests/test_user_entry.py @@ -0,0 +1,33 @@ +import pandas as pd +import pytest + +from src.rule_processor import SeverityLevel, get_severity + + +@pytest.mark.parametrize( + "input_severity, expected_enum", + [ + ("INFO", SeverityLevel.INFO), + ("info", SeverityLevel.INFO), + ("Info", SeverityLevel.INFO), + ("WARNING", SeverityLevel.WARNING), + ("warning", SeverityLevel.WARNING), + ("Warning", SeverityLevel.WARNING), + ("ERROR", SeverityLevel.ERROR), + ("error", SeverityLevel.ERROR), + ("Error", SeverityLevel.ERROR), + ("WARN", SeverityLevel.WARNING), # Invalid → Defaults to ERROR + ("warn", SeverityLevel.WARNING), # Invalid → Defaults to ERROR + ("Critical", SeverityLevel.ERROR), # Invalid → Defaults to ERROR + ("Severe", SeverityLevel.ERROR), # Invalid → Defaults to ERROR + ("", SeverityLevel.ERROR), # Empty string → Defaults to ERROR + (None, SeverityLevel.ERROR), # None → Defaults to ERROR + (1.0, SeverityLevel.ERROR), # None → Defaults to ERROR + ], +) +def test_severity_conversion(input_severity, expected_enum): + """Test various user inputs for severity and check expected outputs.""" + rule_info = pd.Series({"Report Severity": input_severity}) + severity = get_severity(rule_info) + + assert severity == expected_enum, f"Failed for input: {input_severity}" diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..4f978b9 --- /dev/null +++ b/uv.lock @@ -0,0 +1,977 @@ +version = 1 +requires-python = ">=3.12" + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, +] + +[[package]] +name = "anyio" +version = "4.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "sniffio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 }, +] + +[[package]] +name = "appdirs" +version = "1.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566 }, +] + +[[package]] +name = "attrs" +version = "23.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/fc/f800d51204003fa8ae392c4e8278f256206e7a919b708eef054f5f4b650d/attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", size = 780820 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/44/827b2a91a5816512fcaf3cc4ebc465ccd5d598c45cefa6703fcf4a79018f/attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1", size = 60752 }, +] + +[[package]] +name = "backoff" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/d7/5bbeb12c44d7c4f2fb5b56abce497eb5ed9f34d85701de869acedd602619/backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba", size = 17001 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8", size = 15148 }, +] + +[[package]] +name = "black" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "mypy-extensions" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/94/49/26a7b0f3f35da4b5a65f081943b7bcd22d7002f5f0fb8098ec1ff21cb6ef/black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", size = 649449 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/71/3fe4741df7adf015ad8dfa082dd36c94ca86bb21f25608eb247b4afb15b2/black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", size = 1650988 }, + { url = "https://files.pythonhosted.org/packages/13/f3/89aac8a83d73937ccd39bbe8fc6ac8860c11cfa0af5b1c96d081facac844/black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", size = 1453985 }, + { url = "https://files.pythonhosted.org/packages/6f/22/b99efca33f1f3a1d2552c714b1e1b5ae92efac6c43e790ad539a163d1754/black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", size = 1783816 }, + { url = "https://files.pythonhosted.org/packages/18/7e/a27c3ad3822b6f2e0e00d63d58ff6299a99a5b3aee69fa77cd4b0076b261/black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", size = 1440860 }, + { url = "https://files.pythonhosted.org/packages/98/87/0edf98916640efa5d0696e1abb0a8357b52e69e82322628f25bf14d263d1/black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", size = 1650673 }, + { url = "https://files.pythonhosted.org/packages/52/e5/f7bf17207cf87fa6e9b676576749c6b6ed0d70f179a3d812c997870291c3/black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", size = 1453190 }, + { url = "https://files.pythonhosted.org/packages/e3/ee/adda3d46d4a9120772fae6de454c8495603c37c4c3b9c60f25b1ab6401fe/black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", size = 1782926 }, + { url = "https://files.pythonhosted.org/packages/cc/64/94eb5f45dcb997d2082f097a3944cfc7fe87e071907f677e80788a2d7b7a/black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", size = 1442613 }, + { url = "https://files.pythonhosted.org/packages/09/71/54e999902aed72baf26bca0d50781b01838251a462612966e9fc4891eadd/black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", size = 207646 }, +] + +[[package]] +name = "certifi" +version = "2025.1.31" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, + { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, + { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, + { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, + { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, + { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, + { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, + { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, + { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, + { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, + { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, + { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, + { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, + { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, + { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, + { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, + { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, + { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, + { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, + { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, + { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, + { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, + { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, + { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, + { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, + { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, + { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, +] + +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "deprecated" +version = "1.2.18" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/97/06afe62762c9a8a86af0cfb7bfdab22a43ad17138b07af5b1a58442690a2/deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d", size = 2928744 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998 }, +] + +[[package]] +name = "gql" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "backoff" }, + { name = "graphql-core" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/85/feda24b33adcc6c8463a62a8e2ca2cc3425dc6d687388ff728ceae231204/gql-3.5.0.tar.gz", hash = "sha256:ccb9c5db543682b28f577069950488218ed65d4ac70bb03b6929aaadaf636de9", size = 179939 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/74/fb/01a200e1c31b79690427c8e983014e4220d2652b4372a46fe4598e1d7a8e/gql-3.5.0-py2.py3-none-any.whl", hash = "sha256:70dda5694a5b194a8441f077aa5fb70cc94e4ec08016117523f013680901ecb7", size = 74001 }, +] + +[package.optional-dependencies] +requests = [ + { name = "requests" }, + { name = "requests-toolbelt" }, +] +websockets = [ + { name = "websockets" }, +] + +[[package]] +name = "graphql-core" +version = "3.2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/16/7574029da84834349b60ed71614d66ca3afe46e9bf9c7b9562102acb7d4f/graphql_core-3.2.6.tar.gz", hash = "sha256:c08eec22f9e40f0bd61d805907e3b3b1b9a320bc606e23dc145eebca07c8fbab", size = 505353 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/4f/7297663840621022bc73c22d7d9d80dbc78b4db6297f764b545cd5dd462d/graphql_core-3.2.6-py3-none-any.whl", hash = "sha256:78b016718c161a6fb20a7d97bbf107f331cd1afe53e45566c59f776ed7f0b45f", size = 203416 }, +] + +[[package]] +name = "h11" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, +] + +[[package]] +name = "httpcore" +version = "1.0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, +] + +[[package]] +name = "httpx" +version = "0.25.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, + { name = "sniffio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8c/23/911d93a022979d3ea295f659fbe7edb07b3f4561a477e83b3a6d0e0c914e/httpx-0.25.2.tar.gz", hash = "sha256:8b8fcaa0c8ea7b05edd69a094e63a2094c4efcb48129fb757361bc423c0ad9e8", size = 123889 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/65/6940eeb21dcb2953778a6895281c179efd9100463ff08cb6232bb6480da7/httpx-0.25.2-py3-none-any.whl", hash = "sha256:a05d3d052d9b2dfce0e3896636467f8a5342fb2b902c819428e1ac65413ca118", size = 74980 }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, +] + +[[package]] +name = "levenshtein" +version = "0.26.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "rapidfuzz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/97/e6/79807d3b59a67dd78bb77072ca6a28d8db0935161fecf935e6c38c5f6825/levenshtein-0.26.1.tar.gz", hash = "sha256:0d19ba22330d50609b2349021ec3cf7d905c6fe21195a2d0d876a146e7ed2575", size = 374307 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/53/3685ee7fbe9b8eb4b82d8045255e59dd6943f94e8091697ef3808e7ecf63/levenshtein-0.26.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cc741ca406d3704dc331a69c04b061fc952509a069b79cab8287413f434684bd", size = 176447 }, + { url = "https://files.pythonhosted.org/packages/82/7f/7d6fe9b76bd030200f8f9b162f3de862d597804d292af292ec3ce9ae8bee/levenshtein-0.26.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:821ace3b4e1c2e02b43cf5dc61aac2ea43bdb39837ac890919c225a2c3f2fea4", size = 157589 }, + { url = "https://files.pythonhosted.org/packages/bc/d3/44539e952df93c5d88a95a0edff34af38e4f87330a76e8335bfe2c0f31bf/levenshtein-0.26.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92694c9396f55d4c91087efacf81297bef152893806fc54c289fc0254b45384", size = 153306 }, + { url = "https://files.pythonhosted.org/packages/ba/fe/21443c0c50824314e2d2ce7e1e9cd11d21b3643f3c14da156b15b4d399c7/levenshtein-0.26.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51ba374de7a1797d04a14a4f0ad3602d2d71fef4206bb20a6baaa6b6a502da58", size = 184409 }, + { url = "https://files.pythonhosted.org/packages/f0/7b/c95066c64bb18628cf7488e0dd6aec2b7cbda307d93ba9ede68a21af2a7b/levenshtein-0.26.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7aa5c3327dda4ef952769bacec09c09ff5bf426e07fdc94478c37955681885b", size = 193134 }, + { url = "https://files.pythonhosted.org/packages/36/22/5f9760b135bdefb8cf8d663890756136754db03214f929b73185dfa33f05/levenshtein-0.26.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33e2517e8d3c221de2d1183f400aed64211fcfc77077b291ed9f3bb64f141cdc", size = 162266 }, + { url = "https://files.pythonhosted.org/packages/11/50/6b1a5f3600caae40db0928f6775d7efc62c13dec2407d3d540bc4afdb72c/levenshtein-0.26.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9092b622765c7649dd1d8af0f43354723dd6f4e570ac079ffd90b41033957438", size = 246339 }, + { url = "https://files.pythonhosted.org/packages/26/eb/ede282fcb495570898b39a0d2f21bbc9be5587d604c93a518ece80f3e7dc/levenshtein-0.26.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fc16796c85d7d8b259881d59cc8b5e22e940901928c2ff6924b2c967924e8a0b", size = 1077937 }, + { url = "https://files.pythonhosted.org/packages/35/41/eebe1c4a75f592d9bdc3c2595418f083bcad747e0aec52a1a9ffaae93f5c/levenshtein-0.26.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4370733967f5994ceeed8dc211089bedd45832ee688cecea17bfd35a9eb22b9", size = 1330607 }, + { url = "https://files.pythonhosted.org/packages/12/8e/4d34b1857adfd69c2a72d84bca1b8538d4cfaaf6fddd8599573f4281a9d1/levenshtein-0.26.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3535ecfd88c9b283976b5bc61265855f59bba361881e92ed2b5367b6990c93fe", size = 1197505 }, + { url = "https://files.pythonhosted.org/packages/c0/7b/6afcda1b0a0622cedaa4f7a5b3507c2384a7358fc051ccf619e5d2453bf2/levenshtein-0.26.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:90236e93d98bdfd708883a6767826fafd976dac8af8fc4a0fb423d4fa08e1bf0", size = 1352832 }, + { url = "https://files.pythonhosted.org/packages/21/5e/0ed4e7b5c820b6bc40e2c391633292c3666400339042a3d306f0dc8fdcb4/levenshtein-0.26.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:04b7cabb82edf566b1579b3ed60aac0eec116655af75a3c551fee8754ffce2ea", size = 1135970 }, + { url = "https://files.pythonhosted.org/packages/c9/91/3ff1abacb58642749dfd130ad855370e01b9c7aeaa73801964361f6e355f/levenshtein-0.26.1-cp312-cp312-win32.whl", hash = "sha256:ae382af8c76f6d2a040c0d9ca978baf461702ceb3f79a0a3f6da8d596a484c5b", size = 87599 }, + { url = "https://files.pythonhosted.org/packages/7d/f9/727f3ba7843a3fb2a0f3db825358beea2a52bc96258874ee80cb2e5ecabb/levenshtein-0.26.1-cp312-cp312-win_amd64.whl", hash = "sha256:fd091209798cfdce53746f5769987b4108fe941c54fb2e058c016ffc47872918", size = 98809 }, + { url = "https://files.pythonhosted.org/packages/d4/f4/f87f19222d279dbac429b9bc7ccae271d900fd9c48a581b8bc180ba6cd09/levenshtein-0.26.1-cp312-cp312-win_arm64.whl", hash = "sha256:7e82f2ea44a81ad6b30d92a110e04cd3c8c7c6034b629aca30a3067fa174ae89", size = 88227 }, + { url = "https://files.pythonhosted.org/packages/7e/d6/b4b522b94d7b387c023d22944590befc0ac6b766ac6d197afd879ddd77fc/levenshtein-0.26.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:790374a9f5d2cbdb30ee780403a62e59bef51453ac020668c1564d1e43438f0e", size = 175836 }, + { url = "https://files.pythonhosted.org/packages/25/76/06d1e26a8e6d0de68ef4a157dd57f6b342413c03550309e4aa095a453b28/levenshtein-0.26.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7b05c0415c386d00efda83d48db9db68edd02878d6dbc6df01194f12062be1bb", size = 157036 }, + { url = "https://files.pythonhosted.org/packages/7e/23/21209a9e96b878aede3bea104533866762ba621e36fc344aa080db5feb02/levenshtein-0.26.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3114586032361722ddededf28401ce5baf1cf617f9f49fb86b8766a45a423ff", size = 153326 }, + { url = "https://files.pythonhosted.org/packages/06/38/9fc68685fffd8863b13864552eba8f3eb6a82a4dc558bf2c6553c2347d6c/levenshtein-0.26.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2532f8a13b68bf09f152d906f118a88da2063da22f44c90e904b142b0a53d534", size = 183693 }, + { url = "https://files.pythonhosted.org/packages/f6/82/ccd7bdd7d431329da025e649c63b731df44f8cf31b957e269ae1c1dc9a8e/levenshtein-0.26.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:219c30be6aa734bf927188d1208b7d78d202a3eb017b1c5f01ab2034d2d4ccca", size = 190581 }, + { url = "https://files.pythonhosted.org/packages/6e/c5/57f90b4aea1f89f853872b27a5a5dbce37b89ffeae42c02060b3e82038b2/levenshtein-0.26.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397e245e77f87836308bd56305bba630010cd8298c34c4c44bd94990cdb3b7b1", size = 162446 }, + { url = "https://files.pythonhosted.org/packages/fc/da/df6acca738921f896ce2d178821be866b43a583f85e2d1de63a4f8f78080/levenshtein-0.26.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeff6ea3576f72e26901544c6c55c72a7b79b9983b6f913cba0e9edbf2f87a97", size = 247123 }, + { url = "https://files.pythonhosted.org/packages/22/fb/f44a4c0d7784ccd32e4166714fea61e50f62b232162ae16332f45cb55ab2/levenshtein-0.26.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a19862e3539a697df722a08793994e334cd12791e8144851e8a1dee95a17ff63", size = 1077437 }, + { url = "https://files.pythonhosted.org/packages/f0/5e/d9b9e7daa13cc7e2184a3c2422bb847f05d354ce15ba113b20d83e9ab366/levenshtein-0.26.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:dc3b5a64f57c3c078d58b1e447f7d68cad7ae1b23abe689215d03fc434f8f176", size = 1330362 }, + { url = "https://files.pythonhosted.org/packages/bf/67/480d85bb516798014a6849be0225b246f35df4b54499c348c9c9e311f936/levenshtein-0.26.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bb6c7347424a91317c5e1b68041677e4c8ed3e7823b5bbaedb95bffb3c3497ea", size = 1198721 }, + { url = "https://files.pythonhosted.org/packages/9a/7d/889ff7d86903b6545665655627113d263c88c6d596c68fb09a640ee4f0a7/levenshtein-0.26.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b817376de4195a207cc0e4ca37754c0e1e1078c2a2d35a6ae502afde87212f9e", size = 1351820 }, + { url = "https://files.pythonhosted.org/packages/b9/29/cd42273150f08c200ed2d1879486d73502ee35265f162a77952f101d93a0/levenshtein-0.26.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7b50c3620ff47c9887debbb4c154aaaac3e46be7fc2e5789ee8dbe128bce6a17", size = 1135747 }, + { url = "https://files.pythonhosted.org/packages/1d/90/cbcfa3dd86023e82036662a19fec2fcb48782d3f9fa322d44dc898d95a5d/levenshtein-0.26.1-cp313-cp313-win32.whl", hash = "sha256:9fb859da90262eb474c190b3ca1e61dee83add022c676520f5c05fdd60df902a", size = 87318 }, + { url = "https://files.pythonhosted.org/packages/83/73/372edebc79fd09a8b2382cf1244d279ada5b795124f1e1c4fc73d9fbb00f/levenshtein-0.26.1-cp313-cp313-win_amd64.whl", hash = "sha256:8adcc90e3a5bfb0a463581d85e599d950fe3c2938ac6247b29388b64997f6e2d", size = 98418 }, + { url = "https://files.pythonhosted.org/packages/b2/6d/f0160ea5a7bb7a62b3b3d56e9fc5024b440cb59555a90be2347abf2e7888/levenshtein-0.26.1-cp313-cp313-win_arm64.whl", hash = "sha256:c2599407e029865dc66d210b8804c7768cbdbf60f061d993bb488d5242b0b73e", size = 87792 }, +] + +[[package]] +name = "more-itertools" +version = "10.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/88/3b/7fa1fe835e2e93fd6d7b52b2f95ae810cf5ba133e1845f726f5a992d62c2/more-itertools-10.6.0.tar.gz", hash = "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b", size = 125009 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/62/0fe302c6d1be1c777cab0616e6302478251dfbf9055ad426f5d0def75c89/more_itertools-10.6.0-py3-none-any.whl", hash = "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89", size = 63038 }, +] + +[[package]] +name = "multidict" +version = "6.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/be/504b89a5e9ca731cd47487e91c469064f8ae5af93b7259758dcfc2b9c848/multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a", size = 64002 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/16/92057c74ba3b96d5e211b553895cd6dc7cc4d1e43d9ab8fafc727681ef71/multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa", size = 48713 }, + { url = "https://files.pythonhosted.org/packages/94/3d/37d1b8893ae79716179540b89fc6a0ee56b4a65fcc0d63535c6f5d96f217/multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436", size = 29516 }, + { url = "https://files.pythonhosted.org/packages/a2/12/adb6b3200c363062f805275b4c1e656be2b3681aada66c80129932ff0bae/multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761", size = 29557 }, + { url = "https://files.pythonhosted.org/packages/47/e9/604bb05e6e5bce1e6a5cf80a474e0f072e80d8ac105f1b994a53e0b28c42/multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e", size = 130170 }, + { url = "https://files.pythonhosted.org/packages/7e/13/9efa50801785eccbf7086b3c83b71a4fb501a4d43549c2f2f80b8787d69f/multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef", size = 134836 }, + { url = "https://files.pythonhosted.org/packages/bf/0f/93808b765192780d117814a6dfcc2e75de6dcc610009ad408b8814dca3ba/multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95", size = 133475 }, + { url = "https://files.pythonhosted.org/packages/d3/c8/529101d7176fe7dfe1d99604e48d69c5dfdcadb4f06561f465c8ef12b4df/multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925", size = 131049 }, + { url = "https://files.pythonhosted.org/packages/ca/0c/fc85b439014d5a58063e19c3a158a889deec399d47b5269a0f3b6a2e28bc/multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966", size = 120370 }, + { url = "https://files.pythonhosted.org/packages/db/46/d4416eb20176492d2258fbd47b4abe729ff3b6e9c829ea4236f93c865089/multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305", size = 125178 }, + { url = "https://files.pythonhosted.org/packages/5b/46/73697ad7ec521df7de5531a32780bbfd908ded0643cbe457f981a701457c/multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2", size = 119567 }, + { url = "https://files.pythonhosted.org/packages/cd/ed/51f060e2cb0e7635329fa6ff930aa5cffa17f4c7f5c6c3ddc3500708e2f2/multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2", size = 129822 }, + { url = "https://files.pythonhosted.org/packages/df/9e/ee7d1954b1331da3eddea0c4e08d9142da5f14b1321c7301f5014f49d492/multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6", size = 128656 }, + { url = "https://files.pythonhosted.org/packages/77/00/8538f11e3356b5d95fa4b024aa566cde7a38aa7a5f08f4912b32a037c5dc/multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3", size = 125360 }, + { url = "https://files.pythonhosted.org/packages/be/05/5d334c1f2462d43fec2363cd00b1c44c93a78c3925d952e9a71caf662e96/multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133", size = 26382 }, + { url = "https://files.pythonhosted.org/packages/a3/bf/f332a13486b1ed0496d624bcc7e8357bb8053823e8cd4b9a18edc1d97e73/multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1", size = 28529 }, + { url = "https://files.pythonhosted.org/packages/22/67/1c7c0f39fe069aa4e5d794f323be24bf4d33d62d2a348acdb7991f8f30db/multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008", size = 48771 }, + { url = "https://files.pythonhosted.org/packages/3c/25/c186ee7b212bdf0df2519eacfb1981a017bda34392c67542c274651daf23/multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f", size = 29533 }, + { url = "https://files.pythonhosted.org/packages/67/5e/04575fd837e0958e324ca035b339cea174554f6f641d3fb2b4f2e7ff44a2/multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28", size = 29595 }, + { url = "https://files.pythonhosted.org/packages/d3/b2/e56388f86663810c07cfe4a3c3d87227f3811eeb2d08450b9e5d19d78876/multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b", size = 130094 }, + { url = "https://files.pythonhosted.org/packages/6c/ee/30ae9b4186a644d284543d55d491fbd4239b015d36b23fea43b4c94f7052/multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c", size = 134876 }, + { url = "https://files.pythonhosted.org/packages/84/c7/70461c13ba8ce3c779503c70ec9d0345ae84de04521c1f45a04d5f48943d/multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3", size = 133500 }, + { url = "https://files.pythonhosted.org/packages/4a/9f/002af221253f10f99959561123fae676148dd730e2daa2cd053846a58507/multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44", size = 131099 }, + { url = "https://files.pythonhosted.org/packages/82/42/d1c7a7301d52af79d88548a97e297f9d99c961ad76bbe6f67442bb77f097/multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2", size = 120403 }, + { url = "https://files.pythonhosted.org/packages/68/f3/471985c2c7ac707547553e8f37cff5158030d36bdec4414cb825fbaa5327/multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3", size = 125348 }, + { url = "https://files.pythonhosted.org/packages/67/2c/e6df05c77e0e433c214ec1d21ddd203d9a4770a1f2866a8ca40a545869a0/multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa", size = 119673 }, + { url = "https://files.pythonhosted.org/packages/c5/cd/bc8608fff06239c9fb333f9db7743a1b2eafe98c2666c9a196e867a3a0a4/multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa", size = 129927 }, + { url = "https://files.pythonhosted.org/packages/44/8e/281b69b7bc84fc963a44dc6e0bbcc7150e517b91df368a27834299a526ac/multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4", size = 128711 }, + { url = "https://files.pythonhosted.org/packages/12/a4/63e7cd38ed29dd9f1881d5119f272c898ca92536cdb53ffe0843197f6c85/multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6", size = 125519 }, + { url = "https://files.pythonhosted.org/packages/38/e0/4f5855037a72cd8a7a2f60a3952d9aa45feedb37ae7831642102604e8a37/multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81", size = 26426 }, + { url = "https://files.pythonhosted.org/packages/7e/a5/17ee3a4db1e310b7405f5d25834460073a8ccd86198ce044dfaf69eac073/multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774", size = 28531 }, + { url = "https://files.pythonhosted.org/packages/99/b7/b9e70fde2c0f0c9af4cc5277782a89b66d35948ea3369ec9f598358c3ac5/multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", size = 10051 }, +] + +[[package]] +name = "mypy" +version = "1.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mypy-extensions" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/43/d5e49a86afa64bd3839ea0d5b9c7103487007d728e1293f52525d6d5486a/mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", size = 3239717 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/3a/03c74331c5eb8bd025734e04c9840532226775c47a2c39b56a0c8d4f128d/mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd", size = 10793981 }, + { url = "https://files.pythonhosted.org/packages/f0/1a/41759b18f2cfd568848a37c89030aeb03534411eef981df621d8fad08a1d/mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f", size = 9749175 }, + { url = "https://files.pythonhosted.org/packages/12/7e/873481abf1ef112c582db832740f4c11b2bfa510e829d6da29b0ab8c3f9c/mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464", size = 11455675 }, + { url = "https://files.pythonhosted.org/packages/b3/d0/92ae4cde706923a2d3f2d6c39629134063ff64b9dedca9c1388363da072d/mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee", size = 12410020 }, + { url = "https://files.pythonhosted.org/packages/46/8b/df49974b337cce35f828ba6fda228152d6db45fed4c86ba56ffe442434fd/mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e", size = 12498582 }, + { url = "https://files.pythonhosted.org/packages/13/50/da5203fcf6c53044a0b699939f31075c45ae8a4cadf538a9069b165c1050/mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22", size = 9366614 }, + { url = "https://files.pythonhosted.org/packages/6a/9b/fd2e05d6ffff24d912f150b87db9e364fa8282045c875654ce7e32fffa66/mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445", size = 10788592 }, + { url = "https://files.pythonhosted.org/packages/74/37/b246d711c28a03ead1fd906bbc7106659aed7c089d55fe40dd58db812628/mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d", size = 9753611 }, + { url = "https://files.pythonhosted.org/packages/a6/ac/395808a92e10cfdac8003c3de9a2ab6dc7cde6c0d2a4df3df1b815ffd067/mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5", size = 11438443 }, + { url = "https://files.pythonhosted.org/packages/d2/8b/801aa06445d2de3895f59e476f38f3f8d610ef5d6908245f07d002676cbf/mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036", size = 12402541 }, + { url = "https://files.pythonhosted.org/packages/c7/67/5a4268782eb77344cc613a4cf23540928e41f018a9a1ec4c6882baf20ab8/mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357", size = 12494348 }, + { url = "https://files.pythonhosted.org/packages/83/3e/57bb447f7bbbfaabf1712d96f9df142624a386d98fb026a761532526057e/mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf", size = 9373648 }, + { url = "https://files.pythonhosted.org/packages/09/4e/a7d65c7322c510de2c409ff3828b03354a7c43f5a8ed458a7a131b41c7b9/mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e", size = 2221777 }, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 }, +] + +[[package]] +name = "numpy" +version = "2.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/d0/c12ddfd3a02274be06ffc71f3efc6d0e457b0409c4481596881e748cb264/numpy-2.2.2.tar.gz", hash = "sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f", size = 20233295 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/e6/847d15770ab7a01e807bdfcd4ead5bdae57c0092b7dc83878171b6af97bb/numpy-2.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ac9bea18d6d58a995fac1b2cb4488e17eceeac413af014b1dd26170b766d8467", size = 20912636 }, + { url = "https://files.pythonhosted.org/packages/d1/af/f83580891577b13bd7e261416120e036d0d8fb508c8a43a73e38928b794b/numpy-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23ae9f0c2d889b7b2d88a3791f6c09e2ef827c2446f1c4a3e3e76328ee4afd9a", size = 14098403 }, + { url = "https://files.pythonhosted.org/packages/2b/86/d019fb60a9d0f1d4cf04b014fe88a9135090adfadcc31c1fadbb071d7fa7/numpy-2.2.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3074634ea4d6df66be04f6728ee1d173cfded75d002c75fac79503a880bf3825", size = 5128938 }, + { url = "https://files.pythonhosted.org/packages/7a/1b/50985edb6f1ec495a1c36452e860476f5b7ecdc3fc59ea89ccad3c4926c5/numpy-2.2.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ec0636d3f7d68520afc6ac2dc4b8341ddb725039de042faf0e311599f54eb37", size = 6661937 }, + { url = "https://files.pythonhosted.org/packages/f4/1b/17efd94cad1b9d605c3f8907fb06bcffc4ce4d1d14d46b95316cccccf2b9/numpy-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ffbb1acd69fdf8e89dd60ef6182ca90a743620957afb7066385a7bbe88dc748", size = 14049518 }, + { url = "https://files.pythonhosted.org/packages/5b/73/65d2f0b698df1731e851e3295eb29a5ab8aa06f763f7e4188647a809578d/numpy-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0349b025e15ea9d05c3d63f9657707a4e1d471128a3b1d876c095f328f8ff7f0", size = 16099146 }, + { url = "https://files.pythonhosted.org/packages/d5/69/308f55c0e19d4b5057b5df286c5433822e3c8039ede06d4051d96f1c2c4e/numpy-2.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:463247edcee4a5537841d5350bc87fe8e92d7dd0e8c71c995d2c6eecb8208278", size = 15246336 }, + { url = "https://files.pythonhosted.org/packages/f0/d8/d8d333ad0d8518d077a21aeea7b7c826eff766a2b1ce1194dea95ca0bacf/numpy-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9dd47ff0cb2a656ad69c38da850df3454da88ee9a6fde0ba79acceee0e79daba", size = 17863507 }, + { url = "https://files.pythonhosted.org/packages/82/6e/0b84ad3103ffc16d6673e63b5acbe7901b2af96c2837174c6318c98e27ab/numpy-2.2.2-cp312-cp312-win32.whl", hash = "sha256:4525b88c11906d5ab1b0ec1f290996c0020dd318af8b49acaa46f198b1ffc283", size = 6276491 }, + { url = "https://files.pythonhosted.org/packages/fc/84/7f801a42a67b9772a883223a0a1e12069a14626c81a732bd70aac57aebc1/numpy-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:5acea83b801e98541619af398cc0109ff48016955cc0818f478ee9ef1c5c3dcb", size = 12616372 }, + { url = "https://files.pythonhosted.org/packages/e1/fe/df5624001f4f5c3e0b78e9017bfab7fdc18a8d3b3d3161da3d64924dd659/numpy-2.2.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b208cfd4f5fe34e1535c08983a1a6803fdbc7a1e86cf13dd0c61de0b51a0aadc", size = 20899188 }, + { url = "https://files.pythonhosted.org/packages/a9/80/d349c3b5ed66bd3cb0214be60c27e32b90a506946857b866838adbe84040/numpy-2.2.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d0bbe7dd86dca64854f4b6ce2ea5c60b51e36dfd597300057cf473d3615f2369", size = 14113972 }, + { url = "https://files.pythonhosted.org/packages/9d/50/949ec9cbb28c4b751edfa64503f0913cbfa8d795b4a251e7980f13a8a655/numpy-2.2.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:22ea3bb552ade325530e72a0c557cdf2dea8914d3a5e1fecf58fa5dbcc6f43cd", size = 5114294 }, + { url = "https://files.pythonhosted.org/packages/8d/f3/399c15629d5a0c68ef2aa7621d430b2be22034f01dd7f3c65a9c9666c445/numpy-2.2.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:128c41c085cab8a85dc29e66ed88c05613dccf6bc28b3866cd16050a2f5448be", size = 6648426 }, + { url = "https://files.pythonhosted.org/packages/2c/03/c72474c13772e30e1bc2e558cdffd9123c7872b731263d5648b5c49dd459/numpy-2.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:250c16b277e3b809ac20d1f590716597481061b514223c7badb7a0f9993c7f84", size = 14045990 }, + { url = "https://files.pythonhosted.org/packages/83/9c/96a9ab62274ffafb023f8ee08c88d3d31ee74ca58869f859db6845494fa6/numpy-2.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0c8854b09bc4de7b041148d8550d3bd712b5c21ff6a8ed308085f190235d7ff", size = 16096614 }, + { url = "https://files.pythonhosted.org/packages/d5/34/cd0a735534c29bec7093544b3a509febc9b0df77718a9b41ffb0809c9f46/numpy-2.2.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b6fb9c32a91ec32a689ec6410def76443e3c750e7cfc3fb2206b985ffb2b85f0", size = 15242123 }, + { url = "https://files.pythonhosted.org/packages/5e/6d/541717a554a8f56fa75e91886d9b79ade2e595918690eb5d0d3dbd3accb9/numpy-2.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:57b4012e04cc12b78590a334907e01b3a85efb2107df2b8733ff1ed05fce71de", size = 17859160 }, + { url = "https://files.pythonhosted.org/packages/b9/a5/fbf1f2b54adab31510728edd06a05c1b30839f37cf8c9747cb85831aaf1b/numpy-2.2.2-cp313-cp313-win32.whl", hash = "sha256:4dbd80e453bd34bd003b16bd802fac70ad76bd463f81f0c518d1245b1c55e3d9", size = 6273337 }, + { url = "https://files.pythonhosted.org/packages/56/e5/01106b9291ef1d680f82bc47d0c5b5e26dfed15b0754928e8f856c82c881/numpy-2.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:5a8c863ceacae696aff37d1fd636121f1a512117652e5dfb86031c8d84836369", size = 12609010 }, + { url = "https://files.pythonhosted.org/packages/9f/30/f23d9876de0f08dceb707c4dcf7f8dd7588266745029debb12a3cdd40be6/numpy-2.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b3482cb7b3325faa5f6bc179649406058253d91ceda359c104dac0ad320e1391", size = 20924451 }, + { url = "https://files.pythonhosted.org/packages/6a/ec/6ea85b2da9d5dfa1dbb4cb3c76587fc8ddcae580cb1262303ab21c0926c4/numpy-2.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9491100aba630910489c1d0158034e1c9a6546f0b1340f716d522dc103788e39", size = 14122390 }, + { url = "https://files.pythonhosted.org/packages/68/05/bfbdf490414a7dbaf65b10c78bc243f312c4553234b6d91c94eb7c4b53c2/numpy-2.2.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:41184c416143defa34cc8eb9d070b0a5ba4f13a0fa96a709e20584638254b317", size = 5156590 }, + { url = "https://files.pythonhosted.org/packages/f7/ec/fe2e91b2642b9d6544518388a441bcd65c904cea38d9ff998e2e8ebf808e/numpy-2.2.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7dca87ca328f5ea7dafc907c5ec100d187911f94825f8700caac0b3f4c384b49", size = 6671958 }, + { url = "https://files.pythonhosted.org/packages/b1/6f/6531a78e182f194d33ee17e59d67d03d0d5a1ce7f6be7343787828d1bd4a/numpy-2.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bc61b307655d1a7f9f4b043628b9f2b721e80839914ede634e3d485913e1fb2", size = 14019950 }, + { url = "https://files.pythonhosted.org/packages/e1/fb/13c58591d0b6294a08cc40fcc6b9552d239d773d520858ae27f39997f2ae/numpy-2.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fad446ad0bc886855ddf5909cbf8cb5d0faa637aaa6277fb4b19ade134ab3c7", size = 16079759 }, + { url = "https://files.pythonhosted.org/packages/2c/f2/f2f8edd62abb4b289f65a7f6d1f3650273af00b91b7267a2431be7f1aec6/numpy-2.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:149d1113ac15005652e8d0d3f6fd599360e1a708a4f98e43c9c77834a28238cb", size = 15226139 }, + { url = "https://files.pythonhosted.org/packages/aa/29/14a177f1a90b8ad8a592ca32124ac06af5eff32889874e53a308f850290f/numpy-2.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:106397dbbb1896f99e044efc90360d098b3335060375c26aa89c0d8a97c5f648", size = 17856316 }, + { url = "https://files.pythonhosted.org/packages/95/03/242ae8d7b97f4e0e4ab8dd51231465fb23ed5e802680d629149722e3faf1/numpy-2.2.2-cp313-cp313t-win32.whl", hash = "sha256:0eec19f8af947a61e968d5429f0bd92fec46d92b0008d0a6685b40d6adf8a4f4", size = 6329134 }, + { url = "https://files.pythonhosted.org/packages/80/94/cd9e9b04012c015cb6320ab3bf43bc615e248dddfeb163728e800a5d96f0/numpy-2.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:97b974d3ba0fb4612b77ed35d7627490e8e3dff56ab41454d9e8b23448940576", size = 12696208 }, +] + +[[package]] +name = "packaging" +version = "24.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, +] + +[[package]] +name = "pandas" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893 }, + { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475 }, + { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645 }, + { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445 }, + { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235 }, + { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756 }, + { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248 }, + { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643 }, + { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573 }, + { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085 }, + { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809 }, + { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316 }, + { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055 }, + { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175 }, + { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650 }, + { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177 }, + { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526 }, + { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013 }, + { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620 }, + { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 }, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, +] + +[[package]] +name = "platformdirs" +version = "4.3.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 }, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, +] + +[[package]] +name = "propcache" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/c8/2a13f78d82211490855b2fb303b6721348d0787fdd9a12ac46d99d3acde1/propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64", size = 41735 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/28/1d205fe49be8b1b4df4c50024e62480a442b1a7b818e734308bb0d17e7fb/propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a", size = 79588 }, + { url = "https://files.pythonhosted.org/packages/21/ee/fc4d893f8d81cd4971affef2a6cb542b36617cd1d8ce56b406112cb80bf7/propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0", size = 45825 }, + { url = "https://files.pythonhosted.org/packages/4a/de/bbe712f94d088da1d237c35d735f675e494a816fd6f54e9db2f61ef4d03f/propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d", size = 45357 }, + { url = "https://files.pythonhosted.org/packages/7f/14/7ae06a6cf2a2f1cb382586d5a99efe66b0b3d0c6f9ac2f759e6f7af9d7cf/propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4", size = 241869 }, + { url = "https://files.pythonhosted.org/packages/cc/59/227a78be960b54a41124e639e2c39e8807ac0c751c735a900e21315f8c2b/propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d", size = 247884 }, + { url = "https://files.pythonhosted.org/packages/84/58/f62b4ffaedf88dc1b17f04d57d8536601e4e030feb26617228ef930c3279/propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5", size = 248486 }, + { url = "https://files.pythonhosted.org/packages/1c/07/ebe102777a830bca91bbb93e3479cd34c2ca5d0361b83be9dbd93104865e/propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24", size = 243649 }, + { url = "https://files.pythonhosted.org/packages/ed/bc/4f7aba7f08f520376c4bb6a20b9a981a581b7f2e385fa0ec9f789bb2d362/propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff", size = 229103 }, + { url = "https://files.pythonhosted.org/packages/fe/d5/04ac9cd4e51a57a96f78795e03c5a0ddb8f23ec098b86f92de028d7f2a6b/propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f", size = 226607 }, + { url = "https://files.pythonhosted.org/packages/e3/f0/24060d959ea41d7a7cc7fdbf68b31852331aabda914a0c63bdb0e22e96d6/propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec", size = 221153 }, + { url = "https://files.pythonhosted.org/packages/77/a7/3ac76045a077b3e4de4859a0753010765e45749bdf53bd02bc4d372da1a0/propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348", size = 222151 }, + { url = "https://files.pythonhosted.org/packages/e7/af/5e29da6f80cebab3f5a4dcd2a3240e7f56f2c4abf51cbfcc99be34e17f0b/propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6", size = 233812 }, + { url = "https://files.pythonhosted.org/packages/8c/89/ebe3ad52642cc5509eaa453e9f4b94b374d81bae3265c59d5c2d98efa1b4/propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6", size = 238829 }, + { url = "https://files.pythonhosted.org/packages/e9/2f/6b32f273fa02e978b7577159eae7471b3cfb88b48563b1c2578b2d7ca0bb/propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518", size = 230704 }, + { url = "https://files.pythonhosted.org/packages/5c/2e/f40ae6ff5624a5f77edd7b8359b208b5455ea113f68309e2b00a2e1426b6/propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246", size = 40050 }, + { url = "https://files.pythonhosted.org/packages/3b/77/a92c3ef994e47180862b9d7d11e37624fb1c00a16d61faf55115d970628b/propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1", size = 44117 }, + { url = "https://files.pythonhosted.org/packages/0f/2a/329e0547cf2def8857157f9477669043e75524cc3e6251cef332b3ff256f/propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc", size = 77002 }, + { url = "https://files.pythonhosted.org/packages/12/2d/c4df5415e2382f840dc2ecbca0eeb2293024bc28e57a80392f2012b4708c/propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9", size = 44639 }, + { url = "https://files.pythonhosted.org/packages/d0/5a/21aaa4ea2f326edaa4e240959ac8b8386ea31dedfdaa636a3544d9e7a408/propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439", size = 44049 }, + { url = "https://files.pythonhosted.org/packages/4e/3e/021b6cd86c0acc90d74784ccbb66808b0bd36067a1bf3e2deb0f3845f618/propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536", size = 224819 }, + { url = "https://files.pythonhosted.org/packages/3c/57/c2fdeed1b3b8918b1770a133ba5c43ad3d78e18285b0c06364861ef5cc38/propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629", size = 229625 }, + { url = "https://files.pythonhosted.org/packages/9d/81/70d4ff57bf2877b5780b466471bebf5892f851a7e2ca0ae7ffd728220281/propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b", size = 232934 }, + { url = "https://files.pythonhosted.org/packages/3c/b9/bb51ea95d73b3fb4100cb95adbd4e1acaf2cbb1fd1083f5468eeb4a099a8/propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052", size = 227361 }, + { url = "https://files.pythonhosted.org/packages/f1/20/3c6d696cd6fd70b29445960cc803b1851a1131e7a2e4ee261ee48e002bcd/propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce", size = 213904 }, + { url = "https://files.pythonhosted.org/packages/a1/cb/1593bfc5ac6d40c010fa823f128056d6bc25b667f5393781e37d62f12005/propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d", size = 212632 }, + { url = "https://files.pythonhosted.org/packages/6d/5c/e95617e222be14a34c709442a0ec179f3207f8a2b900273720501a70ec5e/propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce", size = 207897 }, + { url = "https://files.pythonhosted.org/packages/8e/3b/56c5ab3dc00f6375fbcdeefdede5adf9bee94f1fab04adc8db118f0f9e25/propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95", size = 208118 }, + { url = "https://files.pythonhosted.org/packages/86/25/d7ef738323fbc6ebcbce33eb2a19c5e07a89a3df2fded206065bd5e868a9/propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf", size = 217851 }, + { url = "https://files.pythonhosted.org/packages/b3/77/763e6cef1852cf1ba740590364ec50309b89d1c818e3256d3929eb92fabf/propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f", size = 222630 }, + { url = "https://files.pythonhosted.org/packages/4f/e9/0f86be33602089c701696fbed8d8c4c07b6ee9605c5b7536fd27ed540c5b/propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30", size = 216269 }, + { url = "https://files.pythonhosted.org/packages/cc/02/5ac83217d522394b6a2e81a2e888167e7ca629ef6569a3f09852d6dcb01a/propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6", size = 39472 }, + { url = "https://files.pythonhosted.org/packages/f4/33/d6f5420252a36034bc8a3a01171bc55b4bff5df50d1c63d9caa50693662f/propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1", size = 43363 }, + { url = "https://files.pythonhosted.org/packages/41/b6/c5319caea262f4821995dca2107483b94a3345d4607ad797c76cb9c36bcc/propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54", size = 11818 }, +] + +[[package]] +name = "pydantic" +version = "2.10.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 }, +] + +[[package]] +name = "pydantic-core" +version = "2.27.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 }, + { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 }, + { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 }, + { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 }, + { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 }, + { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 }, + { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 }, + { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 }, + { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 }, + { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 }, + { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 }, + { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 }, + { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 }, + { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 }, + { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, + { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, + { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, + { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, + { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, + { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, + { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, + { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, + { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, + { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, + { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, + { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, + { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, + { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, +] + +[[package]] +name = "pydantic-settings" +version = "2.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/73/7b/c58a586cd7d9ac66d2ee4ba60ca2d241fa837c02bca9bea80a9a8c3d22a9/pydantic_settings-2.7.1.tar.gz", hash = "sha256:10c9caad35e64bfb3c2fbf70a078c0e25cc92499782e5200747f942a065dec93", size = 79920 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/46/93416fdae86d40879714f72956ac14df9c7b76f7d41a4d68aa9f71a0028b/pydantic_settings-2.7.1-py3-none-any.whl", hash = "sha256:590be9e6e24d06db33a4262829edef682500ef008565a969c73d39d5f8bfb3fd", size = 29718 }, +] + +[[package]] +name = "pytest" +version = "8.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/05/35/30e0d83068951d90a01852cb1cef56e5d8a09d20c7f511634cc2f7e0372a/pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761", size = 1445919 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/92/76a1c94d3afee238333bc0a42b82935dd8f9cf8ce9e336ff87ee14d9e1cf/pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6", size = 343083 }, +] + +[[package]] +name = "pytest-assertcount" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/84/9f/e6eee30903096887e2fa359163a4ed0969dfd81b301400f5c46fe3e99a41/pytest-assertcount-1.0.0.tar.gz", hash = "sha256:e8271a284e337f89a28789790e68faa18ab8d5e1ca9aad5bd439a672b836a76b", size = 2652 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/8d/4415383d305c7d79271e8e349dedc62d7a2a00f997d894b12a18b3ec487a/pytest_assertcount-1.0.0-py3-none-any.whl", hash = "sha256:08a2945248f666787ee1413736fff91875e355aee23bf03900d1438bd4bf81ec", size = 3287 }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, +] + +[[package]] +name = "python-dotenv" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 }, +] + +[[package]] +name = "python-levenshtein" +version = "0.26.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "levenshtein" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/31/72/58d77cb80b3c130d94f53a8204ffad9acfddb925b2fb5818ff9af0b3c832/python_levenshtein-0.26.1.tar.gz", hash = "sha256:24ba578e28058ebb4afa2700057e1678d7adf27e43cd1f17700c09a9009d5d3a", size = 12276 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/d7/03e0453719ed89724664f781f0255949408118093dbf77a2aa2a1198b38e/python_Levenshtein-0.26.1-py3-none-any.whl", hash = "sha256:8ef5e529dd640fb00f05ee62d998d2ee862f19566b641ace775d5ae16167b2ef", size = 9426 }, +] + +[[package]] +name = "pytz" +version = "2025.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/57/df1c9157c8d5a05117e455d66fd7cf6dbc46974f832b1058ed4856785d8a/pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e", size = 319617 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57", size = 507930 }, +] + +[[package]] +name = "rapidfuzz" +version = "3.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/df/c300ead8c2962f54ad87872e6372a6836f0181a7f20b433c987bd106bfce/rapidfuzz-3.12.1.tar.gz", hash = "sha256:6a98bbca18b4a37adddf2d8201856441c26e9c981d8895491b5bc857b5f780eb", size = 57907552 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/20/6049061411df87f2814a2677db0f15e673bb9795bfeff57dc9708121374d/rapidfuzz-3.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f6235b57ae3faa3f85cb3f90c9fee49b21bd671b76e90fc99e8ca2bdf0b5e4a3", size = 1944328 }, + { url = "https://files.pythonhosted.org/packages/25/73/199383c4c21ae3b4b6ea6951c6896ab38e9dc96942462fa01f9d3fb047da/rapidfuzz-3.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af4585e5812632c357fee5ab781c29f00cd06bea58f8882ff244cc4906ba6c9e", size = 1430203 }, + { url = "https://files.pythonhosted.org/packages/7b/51/77ebaeec5413c53c3e6d8b800f2b979551adbed7b5efa094d1fad5c5b751/rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5942dc4460e5030c5f9e1d4c9383de2f3564a2503fe25e13e89021bcbfea2f44", size = 1403662 }, + { url = "https://files.pythonhosted.org/packages/54/06/1fadd2704db0a7eecf78de812e2f4fab37c4ae105a5ce4578c9fc66bb0c5/rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b31ab59e1a0df5afc21f3109b6cfd77b34040dbf54f1bad3989f885cfae1e60", size = 5555849 }, + { url = "https://files.pythonhosted.org/packages/19/45/da128c3952bd09cef2935df58db5273fc4eb67f04a69dcbf9e25af9e4432/rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97c885a7a480b21164f57a706418c9bbc9a496ec6da087e554424358cadde445", size = 1655273 }, + { url = "https://files.pythonhosted.org/packages/03/ee/bf2b2a95b5af4e6d36105dd9284dc5335fdcc7f0326186d4ab0b5aa4721e/rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d844c0587d969ce36fbf4b7cbf0860380ffeafc9ac5e17a7cbe8abf528d07bb", size = 1678041 }, + { url = "https://files.pythonhosted.org/packages/7f/4f/36ea4d7f306a23e30ea1a6cabf545d2a794e8ca9603d2ee48384314cde3a/rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93c95dce8917bf428064c64024de43ffd34ec5949dd4425780c72bd41f9d969", size = 3137099 }, + { url = "https://files.pythonhosted.org/packages/70/ef/48195d94b018e7340a60c9a642ab0081bf9dc64fb0bd01dfafd93757d2a2/rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:834f6113d538af358f39296604a1953e55f8eeffc20cb4caf82250edbb8bf679", size = 2307388 }, + { url = "https://files.pythonhosted.org/packages/e5/cd/53d5dbc4791df3e1a8640fc4ad5e328ebb040cc01c10c66f891aa6b83ed5/rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a940aa71a7f37d7f0daac186066bf6668d4d3b7e7ef464cb50bc7ba89eae1f51", size = 6906504 }, + { url = "https://files.pythonhosted.org/packages/1b/99/c27e7db1d49cfd77780cb73978f81092682c2bdbc6de75363df6aaa086d6/rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ec9eaf73501c9a7de2c6938cb3050392e2ee0c5ca3921482acf01476b85a7226", size = 2684757 }, + { url = "https://files.pythonhosted.org/packages/02/8c/2474d6282fdd4aae386a6b16272e544a3f9ea2dcdcf2f3b0b286549bc3d5/rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3c5ec360694ac14bfaeb6aea95737cf1a6cf805b5fe8ea7fd28814706c7fa838", size = 3229940 }, + { url = "https://files.pythonhosted.org/packages/ac/27/95d5a8ebe5fcc5462dd0fd265553c8a2ec4a770e079afabcff978442bcb3/rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6b5e176524653ac46f1802bdd273a4b44a5f8d0054ed5013a8e8a4b72f254599", size = 4148489 }, + { url = "https://files.pythonhosted.org/packages/8d/2c/e509bc24b6514de4d6f2c5480201568e1d9a3c7e4692cc969ef899227ba5/rapidfuzz-3.12.1-cp312-cp312-win32.whl", hash = "sha256:6f463c6f1c42ec90e45d12a6379e18eddd5cdf74138804d8215619b6f4d31cea", size = 1834110 }, + { url = "https://files.pythonhosted.org/packages/cc/ab/900b8d57090b30269258e3ae31752ec9c31042cd58660fcc96d50728487d/rapidfuzz-3.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:b894fa2b30cd6498a29e5c470cb01c6ea898540b7e048a0342775a5000531334", size = 1612461 }, + { url = "https://files.pythonhosted.org/packages/a0/df/3f51a0a277185b3f28b2941e071aff62908a6b81527efc67a643bcb59fb8/rapidfuzz-3.12.1-cp312-cp312-win_arm64.whl", hash = "sha256:43bb17056c5d1332f517b888c4e57846c4b5f936ed304917eeb5c9ac85d940d4", size = 864251 }, + { url = "https://files.pythonhosted.org/packages/62/d2/ceebc2446d1f3d3f2cae2597116982e50c2eed9ff2f5a322a51736981405/rapidfuzz-3.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:97f824c15bc6933a31d6e3cbfa90188ba0e5043cf2b6dd342c2b90ee8b3fd47c", size = 1936794 }, + { url = "https://files.pythonhosted.org/packages/88/38/37f7ea800aa959a4f7a63477fc9ad7f3cd024e46bfadce5d23420af6c7e5/rapidfuzz-3.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a973b3f5cabf931029a3ae4a0f72e3222e53d412ea85fc37ddc49e1774f00fbf", size = 1424155 }, + { url = "https://files.pythonhosted.org/packages/3f/14/409d0aa84430451488177fcc5cba8babcdf5a45cee772a2a265b9b5f4c7e/rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df7880e012228722dec1be02b9ef3898ed023388b8a24d6fa8213d7581932510", size = 1398013 }, + { url = "https://files.pythonhosted.org/packages/4b/2c/601e3ad0bbe61e65f99e72c8cefed9713606cf4b297cc4c3876051db7722/rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c78582f50e75e6c2bc38c791ed291cb89cf26a3148c47860c1a04d6e5379c8e", size = 5526157 }, + { url = "https://files.pythonhosted.org/packages/97/ce/deb7b00ce6e06713fc4df81336402b7fa062f2393c8a47401c228ee906c3/rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d7d9e6a04d8344b0198c96394c28874086888d0a2b2f605f30d1b27b9377b7d", size = 1648446 }, + { url = "https://files.pythonhosted.org/packages/ec/6f/2b8eae1748a022290815999594b438dbc1e072c38c76178ea996920a6253/rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5620001fd4d6644a2f56880388179cc8f3767670f0670160fcb97c3b46c828af", size = 1676038 }, + { url = "https://files.pythonhosted.org/packages/b9/6c/5c831197aca7148ed85c86bbe940e66073fea0fa97f30307bb5850ed8858/rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0666ab4c52e500af7ba5cc17389f5d15c0cdad06412c80312088519fdc25686d", size = 3114137 }, + { url = "https://files.pythonhosted.org/packages/fc/f2/d66ac185eeb0ee3fc0fe208dab1e72feece2c883bc0ab2097570a8159a7b/rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:27b4d440fa50b50c515a91a01ee17e8ede719dca06eef4c0cccf1a111a4cfad3", size = 2305754 }, + { url = "https://files.pythonhosted.org/packages/6c/61/9bf74d7ea9bebc7a1bed707591617bba7901fce414d346a7c5532ef02dbd/rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83dccfd5a754f2a0e8555b23dde31f0f7920601bfa807aa76829391ea81e7c67", size = 6901746 }, + { url = "https://files.pythonhosted.org/packages/81/73/d8dddf73e168f723ef21272e8abb7d34d9244da395eb90ed5a617f870678/rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b572b634740e047c53743ed27a1bb3b4f93cf4abbac258cd7af377b2c4a9ba5b", size = 2673947 }, + { url = "https://files.pythonhosted.org/packages/2e/31/3c473cea7d76af162819a5b84f5e7bdcf53b9e19568fc37cfbdab4f4512a/rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7fa7b81fb52902d5f78dac42b3d6c835a6633b01ddf9b202a3ca8443be4b2d6a", size = 3233070 }, + { url = "https://files.pythonhosted.org/packages/c0/b7/73227dcbf8586f0ca4a77be2720311367288e2db142ae00a1404f42e712d/rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b1d4fbff980cb6baef4ee675963c081f7b5d6580a105d6a4962b20f1f880e1fb", size = 4146828 }, + { url = "https://files.pythonhosted.org/packages/3a/c8/fea749c662e268d348a77501995b51ac95cdc3624f3f95ba261f30b000ff/rapidfuzz-3.12.1-cp313-cp313-win32.whl", hash = "sha256:3fe8da12ea77271097b303fa7624cfaf5afd90261002314e3b0047d36f4afd8d", size = 1831797 }, + { url = "https://files.pythonhosted.org/packages/66/18/11052be5984d9972eb04a52e2931e19e95b2e87731d179f60b79707b7efd/rapidfuzz-3.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:6f7e92fc7d2a7f02e1e01fe4f539324dfab80f27cb70a30dd63a95445566946b", size = 1610169 }, + { url = "https://files.pythonhosted.org/packages/db/c1/66427c618f000298edbd24e46dd3dd2d3fa441a602701ba6a260d41dd62b/rapidfuzz-3.12.1-cp313-cp313-win_arm64.whl", hash = "sha256:e31be53d7f4905a6a038296d8b773a79da9ee9f0cd19af9490c5c5a22e37d2e5", size = 863036 }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, +] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481 }, +] + +[[package]] +name = "ruff" +version = "0.9.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/e1/e265aba384343dd8ddd3083f5e33536cd17e1566c41453a5517b5dd443be/ruff-0.9.6.tar.gz", hash = "sha256:81761592f72b620ec8fa1068a6fd00e98a5ebee342a3642efd84454f3031dca9", size = 3639454 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/e3/3d2c022e687e18cf5d93d6bfa2722d46afc64eaa438c7fbbdd603b3597be/ruff-0.9.6-py3-none-linux_armv6l.whl", hash = "sha256:2f218f356dd2d995839f1941322ff021c72a492c470f0b26a34f844c29cdf5ba", size = 11714128 }, + { url = "https://files.pythonhosted.org/packages/e1/22/aff073b70f95c052e5c58153cba735748c9e70107a77d03420d7850710a0/ruff-0.9.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b908ff4df65dad7b251c9968a2e4560836d8f5487c2f0cc238321ed951ea0504", size = 11682539 }, + { url = "https://files.pythonhosted.org/packages/75/a7/f5b7390afd98a7918582a3d256cd3e78ba0a26165a467c1820084587cbf9/ruff-0.9.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b109c0ad2ececf42e75fa99dc4043ff72a357436bb171900714a9ea581ddef83", size = 11132512 }, + { url = "https://files.pythonhosted.org/packages/a6/e3/45de13ef65047fea2e33f7e573d848206e15c715e5cd56095589a7733d04/ruff-0.9.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1de4367cca3dac99bcbd15c161404e849bb0bfd543664db39232648dc00112dc", size = 11929275 }, + { url = "https://files.pythonhosted.org/packages/7d/f2/23d04cd6c43b2e641ab961ade8d0b5edb212ecebd112506188c91f2a6e6c/ruff-0.9.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac3ee4d7c2c92ddfdaedf0bf31b2b176fa7aa8950efc454628d477394d35638b", size = 11466502 }, + { url = "https://files.pythonhosted.org/packages/b5/6f/3a8cf166f2d7f1627dd2201e6cbc4cb81f8b7d58099348f0c1ff7b733792/ruff-0.9.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dc1edd1775270e6aa2386119aea692039781429f0be1e0949ea5884e011aa8e", size = 12676364 }, + { url = "https://files.pythonhosted.org/packages/f5/c4/db52e2189983c70114ff2b7e3997e48c8318af44fe83e1ce9517570a50c6/ruff-0.9.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:4a091729086dffa4bd070aa5dab7e39cc6b9d62eb2bef8f3d91172d30d599666", size = 13335518 }, + { url = "https://files.pythonhosted.org/packages/66/44/545f8a4d136830f08f4d24324e7db957c5374bf3a3f7a6c0bc7be4623a37/ruff-0.9.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1bbc6808bf7b15796cef0815e1dfb796fbd383e7dbd4334709642649625e7c5", size = 12823287 }, + { url = "https://files.pythonhosted.org/packages/c5/26/8208ef9ee7431032c143649a9967c3ae1aae4257d95e6f8519f07309aa66/ruff-0.9.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:589d1d9f25b5754ff230dce914a174a7c951a85a4e9270613a2b74231fdac2f5", size = 14592374 }, + { url = "https://files.pythonhosted.org/packages/31/70/e917781e55ff39c5b5208bda384fd397ffd76605e68544d71a7e40944945/ruff-0.9.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc61dd5131742e21103fbbdcad683a8813be0e3c204472d520d9a5021ca8b217", size = 12500173 }, + { url = "https://files.pythonhosted.org/packages/84/f5/e4ddee07660f5a9622a9c2b639afd8f3104988dc4f6ba0b73ffacffa9a8c/ruff-0.9.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5e2d9126161d0357e5c8f30b0bd6168d2c3872372f14481136d13de9937f79b6", size = 11906555 }, + { url = "https://files.pythonhosted.org/packages/f1/2b/6ff2fe383667075eef8656b9892e73dd9b119b5e3add51298628b87f6429/ruff-0.9.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:68660eab1a8e65babb5229a1f97b46e3120923757a68b5413d8561f8a85d4897", size = 11538958 }, + { url = "https://files.pythonhosted.org/packages/3c/db/98e59e90de45d1eb46649151c10a062d5707b5b7f76f64eb1e29edf6ebb1/ruff-0.9.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c4cae6c4cc7b9b4017c71114115db0445b00a16de3bcde0946273e8392856f08", size = 12117247 }, + { url = "https://files.pythonhosted.org/packages/ec/bc/54e38f6d219013a9204a5a2015c09e7a8c36cedcd50a4b01ac69a550b9d9/ruff-0.9.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:19f505b643228b417c1111a2a536424ddde0db4ef9023b9e04a46ed8a1cb4656", size = 12554647 }, + { url = "https://files.pythonhosted.org/packages/a5/7d/7b461ab0e2404293c0627125bb70ac642c2e8d55bf590f6fce85f508f1b2/ruff-0.9.6-py3-none-win32.whl", hash = "sha256:194d8402bceef1b31164909540a597e0d913c0e4952015a5b40e28c146121b5d", size = 9949214 }, + { url = "https://files.pythonhosted.org/packages/ee/30/c3cee10f915ed75a5c29c1e57311282d1a15855551a64795c1b2bbe5cf37/ruff-0.9.6-py3-none-win_amd64.whl", hash = "sha256:03482d5c09d90d4ee3f40d97578423698ad895c87314c4de39ed2af945633caa", size = 10999914 }, + { url = "https://files.pythonhosted.org/packages/e8/a8/d71f44b93e3aa86ae232af1f2126ca7b95c0f515ec135462b3e1f351441c/ruff-0.9.6-py3-none-win_arm64.whl", hash = "sha256:0e2bb706a2be7ddfea4a4af918562fdc1bcb16df255e5fa595bbd800ce322a5a", size = 10177499 }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, +] + +[[package]] +name = "speckle-automate-checker" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "more-itertools" }, + { name = "pandas" }, + { name = "pydantic" }, + { name = "pytest-assertcount" }, + { name = "python-dotenv" }, + { name = "python-levenshtein" }, + { name = "specklepy" }, +] + +[package.dev-dependencies] +dev = [ + { name = "black" }, + { name = "mypy" }, + { name = "pydantic-settings" }, + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "more-itertools", specifier = ">=10.6.0" }, + { name = "pandas", specifier = ">=2.2.3" }, + { name = "pydantic", specifier = "==2.10.6" }, + { name = "pytest-assertcount", specifier = ">=1.0.0" }, + { name = "python-dotenv", specifier = ">=1.0.1" }, + { name = "python-levenshtein", specifier = ">=0.26.1" }, + { name = "specklepy", specifier = ">=2.21.2" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "black", specifier = ">=25.1.0" }, + { name = "mypy", specifier = ">=1.15.0" }, + { name = "pydantic-settings", specifier = ">=2.7.1" }, + { name = "pytest", specifier = ">=8.3.4" }, + { name = "ruff", specifier = ">=0.9.6" }, +] + +[[package]] +name = "specklepy" +version = "2.21.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appdirs" }, + { name = "attrs" }, + { name = "deprecated" }, + { name = "gql", extra = ["requests", "websockets"] }, + { name = "httpx" }, + { name = "pydantic" }, + { name = "stringcase" }, + { name = "ujson" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/79/58269be683ca06194a464deaac3655989b094c6a0df0f8dccb24eeb47031/specklepy-2.21.2.tar.gz", hash = "sha256:ba44bb9167ced32e52ba7e5717d0b1d0ece1aa23ca02243ce75f0eaba08e8107", size = 93326 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/89/78eb05af38fc455c695c2ab882db2cca0ef518313c49f73b6536d0cad9e7/specklepy-2.21.2-py3-none-any.whl", hash = "sha256:bb34bb0de56f8731f88ac9a1ada4cddfbf2d71e52d4e9cce07bab95c1dac2b2d", size = 136495 }, +] + +[[package]] +name = "stringcase" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/1f/1241aa3d66e8dc1612427b17885f5fcd9c9ee3079fc0d28e9a3aeeb36fa3/stringcase-1.2.0.tar.gz", hash = "sha256:48a06980661908efe8d9d34eab2b6c13aefa2163b3ced26972902e3bdfd87008", size = 2958 } + +[[package]] +name = "typing-extensions" +version = "4.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, +] + +[[package]] +name = "tzdata" +version = "2025.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/0f/fa4723f22942480be4ca9527bbde8d43f6c3f2fe8412f00e7f5f6746bc8b/tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694", size = 194950 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639", size = 346762 }, +] + +[[package]] +name = "ujson" +version = "5.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f0/00/3110fd566786bfa542adb7932d62035e0c0ef662a8ff6544b6643b3d6fd7/ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1", size = 7154885 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/a6/fd3f8bbd80842267e2d06c3583279555e8354c5986c952385199d57a5b6c/ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5", size = 55642 }, + { url = "https://files.pythonhosted.org/packages/a8/47/dd03fd2b5ae727e16d5d18919b383959c6d269c7b948a380fdd879518640/ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e", size = 51807 }, + { url = "https://files.pythonhosted.org/packages/25/23/079a4cc6fd7e2655a473ed9e776ddbb7144e27f04e8fc484a0fb45fe6f71/ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043", size = 51972 }, + { url = "https://files.pythonhosted.org/packages/04/81/668707e5f2177791869b624be4c06fb2473bf97ee33296b18d1cf3092af7/ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1", size = 53686 }, + { url = "https://files.pythonhosted.org/packages/bd/50/056d518a386d80aaf4505ccf3cee1c40d312a46901ed494d5711dd939bc3/ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3", size = 58591 }, + { url = "https://files.pythonhosted.org/packages/fc/d6/aeaf3e2d6fb1f4cfb6bf25f454d60490ed8146ddc0600fae44bfe7eb5a72/ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21", size = 997853 }, + { url = "https://files.pythonhosted.org/packages/f8/d5/1f2a5d2699f447f7d990334ca96e90065ea7f99b142ce96e85f26d7e78e2/ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2", size = 1140689 }, + { url = "https://files.pythonhosted.org/packages/f2/2c/6990f4ccb41ed93744aaaa3786394bca0875503f97690622f3cafc0adfde/ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e", size = 1043576 }, + { url = "https://files.pythonhosted.org/packages/14/f5/a2368463dbb09fbdbf6a696062d0c0f62e4ae6fa65f38f829611da2e8fdd/ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e", size = 38764 }, + { url = "https://files.pythonhosted.org/packages/59/2d/691f741ffd72b6c84438a93749ac57bf1a3f217ac4b0ea4fd0e96119e118/ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc", size = 42211 }, + { url = "https://files.pythonhosted.org/packages/0d/69/b3e3f924bb0e8820bb46671979770c5be6a7d51c77a66324cdb09f1acddb/ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287", size = 55646 }, + { url = "https://files.pythonhosted.org/packages/32/8a/9b748eb543c6cabc54ebeaa1f28035b1bd09c0800235b08e85990734c41e/ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e", size = 51806 }, + { url = "https://files.pythonhosted.org/packages/39/50/4b53ea234413b710a18b305f465b328e306ba9592e13a791a6a6b378869b/ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557", size = 51975 }, + { url = "https://files.pythonhosted.org/packages/b4/9d/8061934f960cdb6dd55f0b3ceeff207fcc48c64f58b43403777ad5623d9e/ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988", size = 53693 }, + { url = "https://files.pythonhosted.org/packages/f5/be/7bfa84b28519ddbb67efc8410765ca7da55e6b93aba84d97764cd5794dbc/ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816", size = 58594 }, + { url = "https://files.pythonhosted.org/packages/48/eb/85d465abafb2c69d9699cfa5520e6e96561db787d36c677370e066c7e2e7/ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20", size = 997853 }, + { url = "https://files.pythonhosted.org/packages/9f/76/2a63409fc05d34dd7d929357b7a45e3a2c96f22b4225cd74becd2ba6c4cb/ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0", size = 1140694 }, + { url = "https://files.pythonhosted.org/packages/45/ed/582c4daba0f3e1688d923b5cb914ada1f9defa702df38a1916c899f7c4d1/ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f", size = 1043580 }, + { url = "https://files.pythonhosted.org/packages/d7/0c/9837fece153051e19c7bade9f88f9b409e026b9525927824cdf16293b43b/ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165", size = 38766 }, + { url = "https://files.pythonhosted.org/packages/d7/72/6cb6728e2738c05bbe9bd522d6fc79f86b9a28402f38663e85a28fddd4a0/ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539", size = 42212 }, +] + +[[package]] +name = "urllib3" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, +] + +[[package]] +name = "websockets" +version = "11.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/3b/2ed38e52eed4cf277f9df5f0463a99199a04d9e29c9e227cfafa57bd3993/websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016", size = 104235 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/96/9d5749106ff57629b54360664ae7eb9afd8302fad1680ead385383e33746/websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6", size = 118056 }, +] + +[[package]] +name = "wrapt" +version = "1.17.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/fc/e91cc220803d7bc4db93fb02facd8461c37364151b8494762cc88b0fbcef/wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3", size = 55531 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/bd/ab55f849fd1f9a58ed7ea47f5559ff09741b25f00c191231f9f059c83949/wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925", size = 53799 }, + { url = "https://files.pythonhosted.org/packages/53/18/75ddc64c3f63988f5a1d7e10fb204ffe5762bc663f8023f18ecaf31a332e/wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392", size = 38821 }, + { url = "https://files.pythonhosted.org/packages/48/2a/97928387d6ed1c1ebbfd4efc4133a0633546bec8481a2dd5ec961313a1c7/wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40", size = 38919 }, + { url = "https://files.pythonhosted.org/packages/73/54/3bfe5a1febbbccb7a2f77de47b989c0b85ed3a6a41614b104204a788c20e/wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d", size = 88721 }, + { url = "https://files.pythonhosted.org/packages/25/cb/7262bc1b0300b4b64af50c2720ef958c2c1917525238d661c3e9a2b71b7b/wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b", size = 80899 }, + { url = "https://files.pythonhosted.org/packages/2a/5a/04cde32b07a7431d4ed0553a76fdb7a61270e78c5fd5a603e190ac389f14/wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98", size = 89222 }, + { url = "https://files.pythonhosted.org/packages/09/28/2e45a4f4771fcfb109e244d5dbe54259e970362a311b67a965555ba65026/wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82", size = 86707 }, + { url = "https://files.pythonhosted.org/packages/c6/d2/dcb56bf5f32fcd4bd9aacc77b50a539abdd5b6536872413fd3f428b21bed/wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae", size = 79685 }, + { url = "https://files.pythonhosted.org/packages/80/4e/eb8b353e36711347893f502ce91c770b0b0929f8f0bed2670a6856e667a9/wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9", size = 87567 }, + { url = "https://files.pythonhosted.org/packages/17/27/4fe749a54e7fae6e7146f1c7d914d28ef599dacd4416566c055564080fe2/wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9", size = 36672 }, + { url = "https://files.pythonhosted.org/packages/15/06/1dbf478ea45c03e78a6a8c4be4fdc3c3bddea5c8de8a93bc971415e47f0f/wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991", size = 38865 }, + { url = "https://files.pythonhosted.org/packages/ce/b9/0ffd557a92f3b11d4c5d5e0c5e4ad057bd9eb8586615cdaf901409920b14/wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125", size = 53800 }, + { url = "https://files.pythonhosted.org/packages/c0/ef/8be90a0b7e73c32e550c73cfb2fa09db62234227ece47b0e80a05073b375/wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998", size = 38824 }, + { url = "https://files.pythonhosted.org/packages/36/89/0aae34c10fe524cce30fe5fc433210376bce94cf74d05b0d68344c8ba46e/wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5", size = 38920 }, + { url = "https://files.pythonhosted.org/packages/3b/24/11c4510de906d77e0cfb5197f1b1445d4fec42c9a39ea853d482698ac681/wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8", size = 88690 }, + { url = "https://files.pythonhosted.org/packages/71/d7/cfcf842291267bf455b3e266c0c29dcb675b5540ee8b50ba1699abf3af45/wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6", size = 80861 }, + { url = "https://files.pythonhosted.org/packages/d5/66/5d973e9f3e7370fd686fb47a9af3319418ed925c27d72ce16b791231576d/wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc", size = 89174 }, + { url = "https://files.pythonhosted.org/packages/a7/d3/8e17bb70f6ae25dabc1aaf990f86824e4fd98ee9cadf197054e068500d27/wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2", size = 86721 }, + { url = "https://files.pythonhosted.org/packages/6f/54/f170dfb278fe1c30d0ff864513cff526d624ab8de3254b20abb9cffedc24/wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b", size = 79763 }, + { url = "https://files.pythonhosted.org/packages/4a/98/de07243751f1c4a9b15c76019250210dd3486ce098c3d80d5f729cba029c/wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504", size = 87585 }, + { url = "https://files.pythonhosted.org/packages/f9/f0/13925f4bd6548013038cdeb11ee2cbd4e37c30f8bfd5db9e5a2a370d6e20/wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a", size = 36676 }, + { url = "https://files.pythonhosted.org/packages/bf/ae/743f16ef8c2e3628df3ddfd652b7d4c555d12c84b53f3d8218498f4ade9b/wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845", size = 38871 }, + { url = "https://files.pythonhosted.org/packages/3d/bc/30f903f891a82d402ffb5fda27ec1d621cc97cb74c16fea0b6141f1d4e87/wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192", size = 56312 }, + { url = "https://files.pythonhosted.org/packages/8a/04/c97273eb491b5f1c918857cd26f314b74fc9b29224521f5b83f872253725/wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b", size = 40062 }, + { url = "https://files.pythonhosted.org/packages/4e/ca/3b7afa1eae3a9e7fefe499db9b96813f41828b9fdb016ee836c4c379dadb/wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0", size = 40155 }, + { url = "https://files.pythonhosted.org/packages/89/be/7c1baed43290775cb9030c774bc53c860db140397047cc49aedaf0a15477/wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306", size = 113471 }, + { url = "https://files.pythonhosted.org/packages/32/98/4ed894cf012b6d6aae5f5cc974006bdeb92f0241775addad3f8cd6ab71c8/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb", size = 101208 }, + { url = "https://files.pythonhosted.org/packages/ea/fd/0c30f2301ca94e655e5e057012e83284ce8c545df7661a78d8bfca2fac7a/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681", size = 109339 }, + { url = "https://files.pythonhosted.org/packages/75/56/05d000de894c4cfcb84bcd6b1df6214297b8089a7bd324c21a4765e49b14/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6", size = 110232 }, + { url = "https://files.pythonhosted.org/packages/53/f8/c3f6b2cf9b9277fb0813418e1503e68414cd036b3b099c823379c9575e6d/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6", size = 100476 }, + { url = "https://files.pythonhosted.org/packages/a7/b1/0bb11e29aa5139d90b770ebbfa167267b1fc548d2302c30c8f7572851738/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f", size = 106377 }, + { url = "https://files.pythonhosted.org/packages/6a/e1/0122853035b40b3f333bbb25f1939fc1045e21dd518f7f0922b60c156f7c/wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555", size = 37986 }, + { url = "https://files.pythonhosted.org/packages/09/5e/1655cf481e079c1f22d0cabdd4e51733679932718dc23bf2db175f329b76/wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c", size = 40750 }, + { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594 }, +] + +[[package]] +name = "yarl" +version = "1.18.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/9d/4b94a8e6d2b51b599516a5cb88e5bc99b4d8d4583e468057eaa29d5f0918/yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1", size = 181062 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/85/bd2e2729752ff4c77338e0102914897512e92496375e079ce0150a6dc306/yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50", size = 142644 }, + { url = "https://files.pythonhosted.org/packages/ff/74/1178322cc0f10288d7eefa6e4a85d8d2e28187ccab13d5b844e8b5d7c88d/yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576", size = 94962 }, + { url = "https://files.pythonhosted.org/packages/be/75/79c6acc0261e2c2ae8a1c41cf12265e91628c8c58ae91f5ff59e29c0787f/yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640", size = 92795 }, + { url = "https://files.pythonhosted.org/packages/6b/32/927b2d67a412c31199e83fefdce6e645247b4fb164aa1ecb35a0f9eb2058/yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2", size = 332368 }, + { url = "https://files.pythonhosted.org/packages/19/e5/859fca07169d6eceeaa4fde1997c91d8abde4e9a7c018e371640c2da2b71/yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75", size = 342314 }, + { url = "https://files.pythonhosted.org/packages/08/75/76b63ccd91c9e03ab213ef27ae6add2e3400e77e5cdddf8ed2dbc36e3f21/yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512", size = 341987 }, + { url = "https://files.pythonhosted.org/packages/1a/e1/a097d5755d3ea8479a42856f51d97eeff7a3a7160593332d98f2709b3580/yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba", size = 336914 }, + { url = "https://files.pythonhosted.org/packages/0b/42/e1b4d0e396b7987feceebe565286c27bc085bf07d61a59508cdaf2d45e63/yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb", size = 325765 }, + { url = "https://files.pythonhosted.org/packages/7e/18/03a5834ccc9177f97ca1bbb245b93c13e58e8225276f01eedc4cc98ab820/yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272", size = 344444 }, + { url = "https://files.pythonhosted.org/packages/c8/03/a713633bdde0640b0472aa197b5b86e90fbc4c5bc05b727b714cd8a40e6d/yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6", size = 340760 }, + { url = "https://files.pythonhosted.org/packages/eb/99/f6567e3f3bbad8fd101886ea0276c68ecb86a2b58be0f64077396cd4b95e/yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e", size = 346484 }, + { url = "https://files.pythonhosted.org/packages/8e/a9/84717c896b2fc6cb15bd4eecd64e34a2f0a9fd6669e69170c73a8b46795a/yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb", size = 359864 }, + { url = "https://files.pythonhosted.org/packages/1e/2e/d0f5f1bef7ee93ed17e739ec8dbcb47794af891f7d165fa6014517b48169/yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393", size = 364537 }, + { url = "https://files.pythonhosted.org/packages/97/8a/568d07c5d4964da5b02621a517532adb8ec5ba181ad1687191fffeda0ab6/yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285", size = 357861 }, + { url = "https://files.pythonhosted.org/packages/7d/e3/924c3f64b6b3077889df9a1ece1ed8947e7b61b0a933f2ec93041990a677/yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2", size = 84097 }, + { url = "https://files.pythonhosted.org/packages/34/45/0e055320daaabfc169b21ff6174567b2c910c45617b0d79c68d7ab349b02/yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477", size = 90399 }, + { url = "https://files.pythonhosted.org/packages/30/c7/c790513d5328a8390be8f47be5d52e141f78b66c6c48f48d241ca6bd5265/yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb", size = 140789 }, + { url = "https://files.pythonhosted.org/packages/30/aa/a2f84e93554a578463e2edaaf2300faa61c8701f0898725842c704ba5444/yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa", size = 94144 }, + { url = "https://files.pythonhosted.org/packages/c6/fc/d68d8f83714b221a85ce7866832cba36d7c04a68fa6a960b908c2c84f325/yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782", size = 91974 }, + { url = "https://files.pythonhosted.org/packages/56/4e/d2563d8323a7e9a414b5b25341b3942af5902a2263d36d20fb17c40411e2/yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0", size = 333587 }, + { url = "https://files.pythonhosted.org/packages/25/c9/cfec0bc0cac8d054be223e9f2c7909d3e8442a856af9dbce7e3442a8ec8d/yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482", size = 344386 }, + { url = "https://files.pythonhosted.org/packages/ab/5d/4c532190113b25f1364d25f4c319322e86232d69175b91f27e3ebc2caf9a/yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186", size = 345421 }, + { url = "https://files.pythonhosted.org/packages/23/d1/6cdd1632da013aa6ba18cee4d750d953104a5e7aac44e249d9410a972bf5/yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58", size = 339384 }, + { url = "https://files.pythonhosted.org/packages/9a/c4/6b3c39bec352e441bd30f432cda6ba51681ab19bb8abe023f0d19777aad1/yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53", size = 326689 }, + { url = "https://files.pythonhosted.org/packages/23/30/07fb088f2eefdc0aa4fc1af4e3ca4eb1a3aadd1ce7d866d74c0f124e6a85/yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2", size = 345453 }, + { url = "https://files.pythonhosted.org/packages/63/09/d54befb48f9cd8eec43797f624ec37783a0266855f4930a91e3d5c7717f8/yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8", size = 341872 }, + { url = "https://files.pythonhosted.org/packages/91/26/fd0ef9bf29dd906a84b59f0cd1281e65b0c3e08c6aa94b57f7d11f593518/yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1", size = 347497 }, + { url = "https://files.pythonhosted.org/packages/d9/b5/14ac7a256d0511b2ac168d50d4b7d744aea1c1aa20c79f620d1059aab8b2/yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a", size = 359981 }, + { url = "https://files.pythonhosted.org/packages/ca/b3/d493221ad5cbd18bc07e642894030437e405e1413c4236dd5db6e46bcec9/yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10", size = 366229 }, + { url = "https://files.pythonhosted.org/packages/04/56/6a3e2a5d9152c56c346df9b8fb8edd2c8888b1e03f96324d457e5cf06d34/yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8", size = 360383 }, + { url = "https://files.pythonhosted.org/packages/fd/b7/4b3c7c7913a278d445cc6284e59b2e62fa25e72758f888b7a7a39eb8423f/yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d", size = 310152 }, + { url = "https://files.pythonhosted.org/packages/f5/d5/688db678e987c3e0fb17867970700b92603cadf36c56e5fb08f23e822a0c/yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c", size = 315723 }, + { url = "https://files.pythonhosted.org/packages/f5/4b/a06e0ec3d155924f77835ed2d167ebd3b211a7b0853da1cf8d8414d784ef/yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b", size = 45109 }, +]