diff --git a/.flake8 b/.flake8 deleted file mode 100644 index aa8539c..0000000 --- a/.flake8 +++ /dev/null @@ -1,14 +0,0 @@ -[flake8] -max-line-length = 88 -select = C,E,F,W,B,B950 -ignore = E203, E501, W503 -exclude = - .git - __pycache__ - .venv - .tox - .mypy_cache - .pytest_cache - dist - build - diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index a675e46..8a8cb30 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -6,78 +6,70 @@ on: [push] # pull_request: # branches: [ master ] - jobs: - build: - runs-on: ${{ matrix.os }} - continue-on-error: ${{ matrix.experimental }} - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - python-version: - ["3.10", "3.11", "3.12", "3.13", "pypy3.11"] - experimental: [false] - include: - - python-version: "3.13" - os: ubuntu-24.04-arm - experimental: false - - python-version: "3.13" - os: windows-11-arm - experimental: false - - python-version: "3.14" - os: ubuntu-latest - experimental: true - - python-version: "3.14" - os: ubuntu-24.04-arm - experimental: true - - python-version: "3.14" - os: windows-latest - experimental: true - - python-version: "3.14" - os: windows-11-arm - experimental: true - - python-version: "3.14" - os: macos-latest - experimental: true - - python-version: "3.14t" - os: ubuntu-latest - experimental: true - - python-version: "3.14t" - os: ubuntu-24.04-arm - experimental: true - - python-version: "3.14t" - os: windows-latest - experimental: true - - python-version: "3.14t" - os: windows-11-arm - experimental: true - - python-version: "3.14t" - os: macos-latest - experimental: true - steps: - - uses: actions/checkout@v5 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v6 - with: - python-version: ${{ matrix.python-version }} - allow-prereleases: true - cache: pip - - name: tox-gh workaround for freethreaded(!windows) - if: ${{ runner.os != 'Windows' && matrix.python-version == '3.14t' }} - run: echo "TOX_GH_MAJOR_MINOR=3.14t" >> $GITHUB_ENV - - name: tox-gh workaround for freethreaded(windows) - if: ${{ runner.os == 'Windows' && matrix.python-version == '3.14t' }} - run: echo "TOX_GH_MAJOR_MINOR=3.14t" >> $env:GITHUB_ENV - - name: Install dependencies - run: | - python3 -m pip install 'tox' 'tox-gh' - tox --version - - name: Install native deps (Linux) - if: runner.os == 'Linux' - run: | - sudo apt update - sudo apt install -y mecab libmecab-dev mecab-ipadic-utf8 - - name: Test with tox - run: | - tox + build: + runs-on: ${{ matrix.os }} + continue-on-error: ${{ matrix.experimental }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest, ubuntu-24.04-arm] + python-version: + [ + "3.10", + "3.11", + "3.12", + "3.13", + "3.14", + "3.14t", + "pypy3.11", + ] + experimental: [false] + include: + - python-version: "3.14" + os: windows-11-arm + experimental: false + - python-version: "3.14t" + os: windows-11-arm + experimental: false + - python-version: "3.15-dev" + os: ubuntu-latest + experimental: true + - python-version: "3.15-dev" + os: macos-latest + experimental: true + - python-version: "3.15-dev" + os: windows-latest + experimental: true + - python-version: "3.15-dev" + os: ubuntu-24.04-arm + experimental: true + + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + persist-credentials: false + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 + with: + python-version: ${{ matrix.python-version }} + allow-prereleases: true + cache: pip + - name: tox-gh workaround for freethreaded(!windows) + if: ${{ runner.os != 'Windows' && endsWith(matrix.python-version, 't') }} + run: echo "TOX_GH_MAJOR_MINOR=${{ matrix.python-version }}" >> $GITHUB_ENV + - name: tox-gh workaround for freethreaded(windows) + if: ${{ runner.os == 'Windows' && endsWith(matrix.python-version, 't') }} + run: echo "TOX_GH_MAJOR_MINOR=${{ matrix.python-version }}" >> $env:GITHUB_ENV + - name: Install dependencies + run: | + python3 -m pip install 'tox' 'tox-gh' + tox --version + - name: Install native deps (Linux) + if: runner.os == 'Linux' + run: | + sudo apt update + sudo apt install -y mecab libmecab-dev mecab-ipadic-utf8 + - name: Test with tox + run: | + tox diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4efdff4..b2c5966 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,36 +1,38 @@ name: Release on: - push: - tags: - - test-v* - release: - types: - - "published" + push: + tags: + - test-v* + release: + types: + - "published" jobs: - publish: - strategy: - matrix: + publish: + strategy: + matrix: + environment: + - pypi + - testpypi + exclude: + - environment: ${{ !startsWith(github.ref_name, 'v') && 'pypi' }} + - environment: ${{ contains(github.ref_name, 'test') && 'pypi' }} + - environment: ${{ github.event_name == 'release' && 'testpypi' }} + name: Publish to PyPI ${{ matrix.environment }} from ${{ github.ref_name }} + runs-on: ubuntu-latest environment: - - pypi - - testpypi - exclude: - - environment: ${{ !startsWith(github.ref_name, 'v') && 'pypi' }} - - environment: ${{ contains(github.ref_name, 'test') && 'pypi' }} - - environment: ${{ github.event_name == 'release' && 'testpypi' }} - name: Publish to PyPI ${{ matrix.environment }} from ${{ github.ref_name }} - runs-on: ubuntu-latest - environment: - name: ${{ matrix.environment }} - permissions: - id-token: write - steps: - - uses: actions/checkout@v5 - - uses: astral-sh/setup-uv@v7 - - run: uv build - - name: Smoke test (wheel) - run: uv run --isolated --no-project -p 3.13 --with dist/*.whl --with pytest pytest tests/test_base.py - - name: Smoke test (source distribution) - run: uv run --isolated --no-project -p 3.13 --with dist/*.tar.gz --with pytest pytest tests/test_base.py - - run: uv publish --trusted-publishing always ${{ matrix.environment == 'testpypi' && '--index testpypi' || '' }} + name: ${{ matrix.environment }} + permissions: + id-token: write + steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + persist-credentials: false + - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0 + - run: uv build + - name: Smoke test (wheel) + run: uv run --isolated --no-project -p 3.13 --with dist/*.whl --with pytest pytest tests/test_base.py + - name: Smoke test (source distribution) + run: uv run --isolated --no-project -p 3.13 --with dist/*.tar.gz --with pytest pytest tests/test_base.py + - run: uv publish --trusted-publishing always ${{ matrix.environment == 'testpypi' && '--index testpypi' || '' }} diff --git a/.isort.cfg b/.isort.cfg deleted file mode 100644 index ba2778d..0000000 --- a/.isort.cfg +++ /dev/null @@ -1,6 +0,0 @@ -[settings] -multi_line_output=3 -include_trailing_comma=True -force_grid_wrap=0 -use_parentheses=True -line_length=88 diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 5fdb88f..0000000 --- a/MANIFEST.in +++ /dev/null @@ -1,7 +0,0 @@ -include setup.py -include tox.ini -include LICENSE -graft tests - -global-exclude __pycache__/* - diff --git a/pyproject.toml b/pyproject.toml index ffc67b8..cbe3f05 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,16 +1,16 @@ [project] name = "sqlitefts" -version = "1.0.1" +version = "2.0.dev" description = "A Python binding for tokenizers of SQLite Full Text Search" authors = [{ name = "Hideaki Takahashi", email = "mymelo@gmail.com" }] dependencies = [ "cffi>=2.0.0; python_version >= '3.14'", - "cffi>=1.17.0; python_version >= '3.9'", - "cffi>=1.15.1 ; platform_python_implementation != 'PyPy'", + "cffi>=1.17.0 ; platform_python_implementation != 'PyPy'", ] readme = "README.rst" -requires-python = ">=2.7,!=3.0,!=3.1,!=3.2,!=3.3,!=3.4,!=3.5,!=3.6,!=3.7,!=3.8" -license = { text = "MIT" } +requires-python = ">=3.10, <4" +license = "MIT" +license-files = ["LICENSE"] keywords = [ "SQLite", "Full-text", @@ -24,13 +24,12 @@ keywords = [ classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", - "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", - "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Programming Language :: Python :: Implementation :: PyPy", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Database", @@ -39,33 +38,25 @@ classifiers = [ [project.urls] Homepage = "https://github.com/hideaki-t/sqlite-fts-python/" -Repository = "https://github.com/hideaki-t/sqlite-fts-python.git" +Repository = "https://github.com/hideaki-t/sqlite-fts-python" +Issues = "https://github.com/hideaki-t/sqlite-fts-python/issues" [build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" +requires = ["uv_build>=0.11.21,<0.12.0"] +build-backend = "uv_build" -[tool.hatch.metadata] -allow-direct-references = true +[tool.uv.build-backend] +module-name = "sqlitefts" +module-root = "" -[tool.hatch.build.targets.wheel] -packages = ["sqlitefts"] - -[tool.uv] -dev-dependencies = [ - "mypy>=1.11.2 ; python_version >= '3.12'", - "faker>=30.0.0 ; python_full_version >= '3.12'", - "pytest>=8.3.2 ; python_version >= '3.12'", - "types-cffi>=1.16.0.0 ; python_version >= '3.12'", - "ruff>=0.6.2 ; python_version >= '3.12'", -] - -[tool.hatch.build] -include = [ - "sqlitefts/*.py", - "sqlitefts/*.pyi", - "sqlitefts/py.typed", - "tests/**", +[dependency-groups] +dev = [ + "mypy>=1.11.2 ; python_version >= '3.13'", + "faker>=30.0.0 ; python_full_version >= '3.13'", + "pytest>=8.3.2 ; python_version >= '3.13'", + "types-cffi>=1.16.0.0 ; python_version >= '3.13'", + "ruff>=0.6.2 ; python_version >= '3.13'", + "ty>=0.0.1a20 ; python_version >= '3.13'", ] [[tool.uv.index]] @@ -73,3 +64,18 @@ name = "testpypi" url = "https://test.pypi.org/simple/" publish-url = "https://test.pypi.org/legacy/" explicit = true + +[tool.ruff] +line-length = 120 +preview = true + +[tool.ruff.lint] +select = ["E", "F", "W", "C", "B", "I", "UP", "RUF"] +ignore = [] +fixable = ["ALL"] + +[tool.ruff.format] +line-ending = "lf" + +[tool.ruff.lint.isort] +known-first-party = ["sqlitefts", "jajp_common"] diff --git a/sqlitefts/__init__.py b/sqlitefts/__init__.py index 5fddabb..a7df469 100644 --- a/sqlitefts/__init__.py +++ b/sqlitefts/__init__.py @@ -3,10 +3,10 @@ from .fts3 import Tokenizer, make_tokenizer_module, register_tokenizer __all__ = [ + "Error", "Tokenizer", "make_tokenizer_module", + "ranking", "register_tokenizer", "tokenizer", - "ranking", - "Error", ] diff --git a/sqlitefts/fts3.py b/sqlitefts/fts3.py index 5f2bdd3..e5e52ab 100644 --- a/sqlitefts/fts3.py +++ b/sqlitefts/fts3.py @@ -1,7 +1,7 @@ -# coding: utf-8 """ support library to write SQLite FTS3 tokenizer """ + import sqlite3 import struct @@ -41,7 +41,7 @@ ) -class Tokenizer(object): +class Tokenizer: """ Tokenizer base class. """ @@ -65,7 +65,7 @@ def make_tokenizer_module(tokenizer): @ffi.callback("int(int, const char *const*, sqlite3_tokenizer **)") def xcreate(argc, argv, ppTokenizer): - if hasattr(tokenizer, "__call__"): + if callable(tokenizer): args = [ffi.string(x).decode("utf-8") for x in argv[0:argc]] tk = tokenizer(args) else: @@ -83,9 +83,7 @@ def xdestroy(pTokenizer): del tokenizers[tkn] return SQLITE_OK - @ffi.callback( - "int(sqlite3_tokenizer*, const char *, int, sqlite3_tokenizer_cursor **)" - ) + @ffi.callback("int(sqlite3_tokenizer*, const char *, int, sqlite3_tokenizer_cursor **)") def xopen(pTokenizer, pInput, nInput, ppCursor): cur = ffi.new("sqlite3_tokenizer_cursor *") tokenizer = ffi.from_handle(pTokenizer.t) @@ -100,9 +98,7 @@ def xopen(pTokenizer, pInput, nInput, ppCursor): ppCursor[0] = cur return SQLITE_OK - @ffi.callback( - "int(sqlite3_tokenizer_cursor*, const char **, int *, int *, int *, int *)" - ) + @ffi.callback("int(sqlite3_tokenizer_cursor*, const char **, int *, int *, int *, int *)") def xnext(pCursor, ppToken, pnBytes, piStartOffset, piEndOffset, piPosition): try: cur = pCursor[0] @@ -123,15 +119,13 @@ def xnext(pCursor, ppToken, pnBytes, piStartOffset, piEndOffset, piPosition): def xclose(pCursor): tk = ffi.from_handle(pCursor.pTokenizer.t) on_close = getattr(tk, "on_close", None) - if on_close and hasattr(on_close, "__call__"): + if on_close and callable(on_close): on_close() del cursors[pCursor] return SQLITE_OK - tokenizer_module = ffi.new( - "sqlite3_tokenizer_module*", [0, xcreate, xdestroy, xopen, xclose, xnext] - ) + tokenizer_module = ffi.new("sqlite3_tokenizer_module*", [0, xcreate, xdestroy, xopen, xclose, xnext]) tokenizer_modules[tokenizer] = ( tokenizer_module, xcreate, diff --git a/sqlitefts/fts3.pyi b/sqlitefts/fts3.pyi index 8d54a92..98f7522 100644 --- a/sqlitefts/fts3.pyi +++ b/sqlitefts/fts3.pyi @@ -1,16 +1,17 @@ import sqlite3 -from typing import Any, Iterator, List, Tuple, Union +from collections.abc import Iterator +from typing import Any import apsw # type: ignore TokenizerModule = Any class Tokenizer: - def tokenize(self, text: str) -> Iterator[Tuple[str, int, int]]: ... + def tokenize(self, text: str) -> Iterator[tuple[str, int, int]]: ... def make_tokenizer_module(tokenizer: Tokenizer) -> TokenizerModule: ... def register_tokenizer( - conn: Union[sqlite3.Connection, apsw.Connection], + conn: sqlite3.Connection | apsw.Connection, name: str, tokenizer_module: TokenizerModule, -) -> List[Any]: ... +) -> list[Any]: ... diff --git a/sqlitefts/fts5.py b/sqlitefts/fts5.py index 1862a92..43155fd 100644 --- a/sqlitefts/fts5.py +++ b/sqlitefts/fts5.py @@ -1,7 +1,7 @@ -# coding: utf-8 """ support library to write SQLite FTS5 tokenizer """ + import struct from .error import Error @@ -99,7 +99,7 @@ ) -class FTS5Tokenizer(object): +class FTS5Tokenizer: """ Tokenizer base class for FTS5. """ @@ -188,9 +188,7 @@ def _xDestroy(context): xDestroy = _xDestroy - r = fts5api.xCreateTokenizer( - fts5api, name.encode("utf-8"), pContext, tokenizer, xDestroy - ) + r = fts5api.xCreateTokenizer(fts5api, name.encode("utf-8"), pContext, tokenizer, xDestroy) registred_fts5_tokenizers[name] = (tokenizer, pContext, xDestroy) return r == SQLITE_OK @@ -206,7 +204,7 @@ def make_fts5_tokenizer(tokenizer): @ffi.callback("int(void*, const char **, int, Fts5Tokenizer **)") def xcreate(ctx, argv, argc, ppOut): - if hasattr(tokenizer, "__call__"): + if callable(tokenizer): args = [ffi.string(x).decode("utf-8") for x in argv[0:argc]] tk = tokenizer(ffi.from_handle(ctx), args) else: @@ -222,16 +220,13 @@ def xdelete(pTokenizer): th = ffi.cast("void *", pTokenizer) tk = ffi.from_handle(th) on_delete = getattr(tk, "on_delete", None) - if on_delete and hasattr(on_delete, "__call__"): + if on_delete and callable(on_delete): on_delete() tokenizers.remove(th) return None - @ffi.callback( - "int(Fts5Tokenizer *, void *, int, const char *, int, " - "int(void*, int, const char *, int, int, int))" - ) + @ffi.callback("int(Fts5Tokenizer *, void *, int, const char *, int, int(void*, int, const char *, int, int, int))") def xtokenize(pTokenizer, pCtx, flags, pText, nText, xToken): tokenizer = ffi.from_handle(ffi.cast("void *", pTokenizer)) text = ffi.string(pText[0:nText]).decode("utf-8") @@ -241,9 +236,7 @@ def xtokenize(pTokenizer, pCtx, flags, pText, nText, xToken): continue # TODO: Synonym Support - r = xToken( - pCtx, 0, ffi.from_buffer(normalized), len(normalized), begin, end - ) + r = xToken(pCtx, 0, ffi.from_buffer(normalized), len(normalized), begin, end) if r != SQLITE_OK: return r return SQLITE_OK @@ -254,12 +247,12 @@ def xtokenize(pTokenizer, pCtx, flags, pText, nText, xToken): __all__ = [ - "register_tokenizer", - "make_fts5_tokenizer", - "FTS5Tokenizer", - "FTS5_TOKENIZE_QUERY", - "FTS5_TOKENIZE_PREFIX", - "FTS5_TOKENIZE_DOCUMENT", "FTS5_TOKENIZE_AUX", + "FTS5_TOKENIZE_DOCUMENT", + "FTS5_TOKENIZE_PREFIX", + "FTS5_TOKENIZE_QUERY", "FTS5_TOKEN_COLOCATED", + "FTS5Tokenizer", + "make_fts5_tokenizer", + "register_tokenizer", ] diff --git a/sqlitefts/fts5.pyi b/sqlitefts/fts5.pyi index 664ee75..2f79707 100644 --- a/sqlitefts/fts5.pyi +++ b/sqlitefts/fts5.pyi @@ -1,5 +1,6 @@ import sqlite3 -from typing import Any, Callable, Iterable, Optional, Tuple, Union +from collections.abc import Callable, Iterable +from typing import Any import apsw # type: ignore @@ -13,24 +14,20 @@ FTS5_TOKENIZE_AUX: int FTS5_TOKEN_COLOCATED: int class FTS5Tokenizer: - def tokenize( - self, text: str, flags: int = ... - ) -> Iterable[Tuple[str, int, int]]: ... + def tokenize(self, text: str, flags: int = ...) -> Iterable[tuple[str, int, int]]: ... class FTS3TokenizerAdaptor(FTS5Tokenizer): fts3tokenizer: Any = ... def __init__(self, fts3tokenizer: FTS3Tokenizer) -> None: ... - def tokenize( - self, text: str, flags: int = ... - ) -> Iterable[Tuple[str, int, int]]: ... + def tokenize(self, text: str, flags: int = ...) -> Iterable[tuple[str, int, int]]: ... def register_tokenizer( - c: Union[sqlite3.Connection, apsw.Connection], + c: sqlite3.Connection | apsw.Connection, name: str, tokenizer: FTS5TokenizerHandle, context: Any = ..., - on_destroy: Optional[Callable[[Any], None]] = ..., + on_destroy: Callable[[Any], None] | None = ..., ) -> bool: ... def make_fts5_tokenizer( - tokenizer: Union[FTS5Tokenizer, Callable[[], FTS5Tokenizer]] + tokenizer: FTS5Tokenizer | Callable[[], FTS5Tokenizer], ) -> FTS5TokenizerHandle: ... diff --git a/sqlitefts/fts5_aux.py b/sqlitefts/fts5_aux.py index 32abe96..8724454 100644 --- a/sqlitefts/fts5_aux.py +++ b/sqlitefts/fts5_aux.py @@ -7,19 +7,14 @@ """holding references of aux funcs to prevent GC""" -@ffi.callback( - "void(const Fts5ExtensionApi*, Fts5Context*," - "sqlite3_context*, int, sqlite3_value**)" -) +@ffi.callback("void(const Fts5ExtensionApi*, Fts5Context*,sqlite3_context*, int, sqlite3_value**)") def aux_tokenize(pApi, pFts, pCtx, nVal, apVal): - """ FTS5 AUX function to tokenize a column. + """FTS5 AUX function to tokenize a column. this function is a callback function, thus it should not be called directly """ if nVal != 1: - dll.sqlite3_result_error( - pCtx, ffi.new("char[]", "this function accepts only 1 argument") - ) + dll.sqlite3_result_error(pCtx, ffi.new("char[]", "this function accepts only 1 argument")) return col = dll.sqlite3_value_int(apVal[0]) @@ -39,9 +34,7 @@ def token(pCtx, tflags, pToken, nToken, iStart, iEnd): rc = pApi.xTokenize(pFts, pz[0], pn[0], ffi.NULL, token) if rc == SQLITE_OK: - dll.sqlite3_result_text( - pCtx, ffi.new("char []", b", ".join(tokens)), -1, SQLITE_TRANSIENT - ) + dll.sqlite3_result_text(pCtx, ffi.new("char []", b", ".join(tokens)), -1, SQLITE_TRANSIENT) else: dll.sqlite3_result_error_code(pCtx, rc) @@ -71,4 +64,4 @@ def destroy(pCtx): return r -__all__ = ["register_aux_function", "aux_tokenize"] +__all__ = ["aux_tokenize", "register_aux_function"] diff --git a/sqlitefts/fts5_aux.pyi b/sqlitefts/fts5_aux.pyi index 69c1ed8..a77fbb5 100644 --- a/sqlitefts/fts5_aux.pyi +++ b/sqlitefts/fts5_aux.pyi @@ -1,11 +1,12 @@ import sqlite3 -from typing import Any, Callable, Union +from collections.abc import Callable +from typing import Any import apsw # type: ignore def aux_tokenize(pApi: Any, pFts: Any, pCtx: Any, nVal: Any, apVal: Any): ... def register_aux_function( - con: Union[sqlite3.Connection, apsw.Connection], + con: sqlite3.Connection | apsw.Connection, name: str, f: Callable, ref_ctrl: bool = ..., diff --git a/sqlitefts/ranking.py b/sqlitefts/ranking.py index 1225947..e668b77 100644 --- a/sqlitefts/ranking.py +++ b/sqlitefts/ranking.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """ Ranking code based on: https://github.com/coleifer/peewee/blob/master/playhouse/sqlite_ext.py @@ -73,7 +72,7 @@ def bm25(raw_match_info, *args): else: weights = [0] * col_count for i, weight in enumerate(args): - weights[i] = args[i] + weights[i] = weight for i in range(term_count): for j in range(col_count): @@ -107,4 +106,4 @@ def bm25(raw_match_info, *args): return -score -__all__ = ["bm25", "simple", "rank"] +__all__ = ["bm25", "rank", "simple"] diff --git a/sqlitefts/tokenizer.py b/sqlitefts/tokenizer.py index 0fdfab5..4d25398 100644 --- a/sqlitefts/tokenizer.py +++ b/sqlitefts/tokenizer.py @@ -1,4 +1,3 @@ -# coding: utf-8 """ a proof of concept implementation of SQLite FTS tokenizers in Python """ @@ -22,10 +21,10 @@ try: # try to use _sqlite3.so first - import _sqlite3 # noqa + import _sqlite3 dll = ffi.dlopen(_sqlite3.__file__) - except: + except (ImportError, AttributeError, OSError): dll = ffi.dlopen(find_library("sqlite3")) if sysconfig.get_config_var("Py_GIL_DISABLED") == 1: @@ -82,4 +81,4 @@ def get_db_from_connection(c): return db -__all__ = ["get_db_from_connection", "SQLITE_OK", "SQLITE_DONE"] +__all__ = ["SQLITE_DONE", "SQLITE_OK", "get_db_from_connection"] diff --git a/sqlitefts/tokenizer.pyi b/sqlitefts/tokenizer.pyi index 8d9444d..bcc1f5a 100644 --- a/sqlitefts/tokenizer.pyi +++ b/sqlitefts/tokenizer.pyi @@ -1,5 +1,5 @@ import sqlite3 -from typing import Any, Union +from typing import Any import apsw # type: ignore @@ -8,5 +8,5 @@ SQLITE_OK: int SQLITE_DONE: int def get_db_from_connection( - c: Union[sqlite3.Connection, apsw.Connection] + c: sqlite3.Connection | apsw.Connection, ) -> SQLITE3DBHandle: ... diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..04e1674 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,31 @@ +import sqlite3 + +import pytest + + +@pytest.fixture +def test_docs(): + return [ + ( + "README", + "sqlitefts-python provides binding for tokenizer of SQLite " + "Full-Text search(FTS3/4). It allows you to write tokenizers in Python.", + ), + ( + "LICENSE", + """Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions:""", + ), + ("日本語", "あいうえお かきくけこ さしすせそ たちつてと なにぬねの"), + ] + + +@pytest.fixture +def c(): + conn = sqlite3.connect(":memory:") + conn.row_factory = sqlite3.Row + return conn diff --git a/tests/jajp_common.py b/tests/jajp_common.py index 38104a7..0c85c28 100644 --- a/tests/jajp_common.py +++ b/tests/jajp_common.py @@ -1,5 +1,3 @@ -# coding: utf-8 -from __future__ import print_function, unicode_literals import sqlite3 @@ -9,19 +7,13 @@ def test_createtable(name, t): c = sqlite3.connect(":memory:") c.row_factory = sqlite3.Row - sql = "CREATE VIRTUAL TABLE fts USING FTS4(tokenize={})".format(name) + sql = f"CREATE VIRTUAL TABLE fts USING FTS4(tokenize={name})" fts.register_tokenizer(c, name, fts.make_tokenizer_module(t)) c.execute(sql) - r = c.execute( - "SELECT * FROM sqlite_master WHERE type='table' AND name='fts'" - ).fetchone() + r = c.execute("SELECT * FROM sqlite_master WHERE type='table' AND name='fts'").fetchone() assert r - assert ( - r[str("type")] == "table" - and r[str("name")] == "fts" - and r[str("tbl_name")] == "fts" - ) - assert r[str("sql")].upper() == sql.upper() + assert r["type"] == "table" and r["name"] == "fts" and r["tbl_name"] == "fts" + assert r["sql"].upper() == sql.upper() c.close() @@ -30,21 +22,24 @@ def test_insert(name, t): c.row_factory = sqlite3.Row content = "これは日本語で書かれています" fts.register_tokenizer(c, name, fts.make_tokenizer_module(t)) - c.execute("CREATE VIRTUAL TABLE fts USING FTS4(tokenize={})".format(name)) + c.execute(f"CREATE VIRTUAL TABLE fts USING FTS4(tokenize={name})") r = c.execute("INSERT INTO fts VALUES(?)", (content,)) assert r.rowcount == 1 r = c.execute("SELECT * FROM fts").fetchone() assert r - assert r[str("content")] == content + assert r["content"] == content c.close() def test_match(name, t): c = sqlite3.connect(":memory:") c.row_factory = sqlite3.Row - contents = [("これは日本語で書かれています",), (" これは 日本語の文章を 全文検索するテストです",)] + contents = [ + ("これは日本語で書かれています",), + (" これは 日本語の文章を 全文検索するテストです",), + ] fts.register_tokenizer(c, name, fts.make_tokenizer_module(t)) - c.execute("CREATE VIRTUAL TABLE fts USING FTS4(tokenize={})".format(name)) + c.execute(f"CREATE VIRTUAL TABLE fts USING FTS4(tokenize={name})") r = c.executemany("INSERT INTO fts VALUES(?)", contents) assert r.rowcount == 2 r = c.execute("SELECT * FROM fts").fetchall() @@ -52,9 +47,9 @@ def test_match(name, t): r = c.execute("SELECT * FROM fts WHERE fts MATCH '日本語'").fetchall() assert len(r) == 2 r = c.execute("SELECT * FROM fts WHERE fts MATCH 'ます'").fetchall() - assert len(r) == 1 and r[0][str("content")] == contents[0][0] + assert len(r) == 1 and r[0]["content"] == contents[0][0] r = c.execute("SELECT * FROM fts WHERE fts MATCH 'テスト'").fetchall() - assert len(r) == 1 and r[0][str("content")] == contents[1][0] + assert len(r) == 1 and r[0]["content"] == contents[1][0] r = c.execute("SELECT * FROM fts WHERE fts MATCH 'コレは'").fetchall() assert len(r) == 0 c.close() @@ -63,7 +58,7 @@ def test_match(name, t): def test_tokenizer_output(name, t): with sqlite3.connect(":memory:") as c: fts.register_tokenizer(c, name, fts.make_tokenizer_module(t)) - c.execute("CREATE VIRTUAL TABLE tok1 USING fts3tokenize({})".format(name)) + c.execute(f"CREATE VIRTUAL TABLE tok1 USING fts3tokenize({name})") expect = [ ("This", 0, 4, 0), ("is", 5, 7, 1), @@ -72,27 +67,24 @@ def test_tokenizer_output(name, t): ("sentence", 15, 23, 4), ] for a, e in zip( - c.execute( - "SELECT token, start, end, position " - "FROM tok1 WHERE input='This is a test sentence.'" - ), + c.execute("SELECT token, start, end, position FROM tok1 WHERE input='This is a test sentence.'"), expect, + strict=False, ): assert e == a s = "これ は テスト の 文 です" expect = [(None, 0, 0, 0)] for i, txt in enumerate(s.split()): - expect.append( - (txt, expect[-1][2], expect[-1][2] + len(txt.encode("utf-8")), i) - ) + expect.append((txt, expect[-1][2], expect[-1][2] + len(txt.encode("utf-8")), i)) expect = expect[1:] for a, e in zip( c.execute( - "SELECT token, start, end, position " "FROM tok1 WHERE input=?", + "SELECT token, start, end, position FROM tok1 WHERE input=?", [s.replace(" ", "")], ), expect, + strict=False, ): assert e == a diff --git a/tests/test_apsw.py b/tests/test_apsw.py index c9d4af0..baaa69c 100644 --- a/tests/test_apsw.py +++ b/tests/test_apsw.py @@ -1,5 +1,3 @@ -# coding: utf-8 -from __future__ import print_function, unicode_literals import re @@ -18,9 +16,9 @@ def tokenize(self, text): for m in self._p.finditer(text): s, e = m.span() t = text[s:e] - l = len(t.encode("utf-8")) + token_len = len(t.encode("utf-8")) p = len(text[:s].encode("utf-8")) - yield t, p, p + l + yield t, p, p + token_len class SimpleFTS5Tokenizer(fts5.FTS5Tokenizer): @@ -30,23 +28,21 @@ def tokenize(self, text, flags): for m in self._p.finditer(text): s, e = m.span() t = text[s:e] - l = len(t.encode("utf-8")) + token_len = len(t.encode("utf-8")) p = len(text[:s].encode("utf-8")) - yield t, p, p + l + yield t, p, p + token_len def test_createtable(): c = apsw.Connection(":memory:") name = "simple" - sql = "CREATE VIRTUAL TABLE fts USING FTS4(tokenize={})".format(name) + sql = f"CREATE VIRTUAL TABLE fts USING FTS4(tokenize={name})" fts.register_tokenizer(c, name, fts.make_tokenizer_module(SimpleTokenizer())) c.cursor().execute(sql) r = ( c.cursor() - .execute( - "SELECT type, name, tbl_name, sql FROM sqlite_master WHERE type='table' AND name='fts'" - ) + .execute("SELECT type, name, tbl_name, sql FROM sqlite_master WHERE type='table' AND name='fts'") .fetchone() ) assert r == ("table", "fts", "fts", sql) @@ -58,7 +54,7 @@ def test_insert(): name = "simple" content = "これは日本語で書かれています" fts.register_tokenizer(c, name, fts.make_tokenizer_module(SimpleTokenizer())) - c.cursor().execute("CREATE VIRTUAL TABLE fts USING FTS4(tokenize={})".format(name)) + c.cursor().execute(f"CREATE VIRTUAL TABLE fts USING FTS4(tokenize={name})") r = c.cursor().execute("INSERT INTO fts VALUES(?)", (content,)) assert c.changes() == 1 r = c.cursor().execute("SELECT content FROM fts").fetchone() @@ -69,9 +65,14 @@ def test_insert(): def test_match(): c = apsw.Connection(":memory:") name = "simple" - contents = [("abc def",), ("abc xyz",), ("あいうえお かきくけこ",), ("あいうえお らりるれろ",)] + contents = [ + ("abc def",), + ("abc xyz",), + ("あいうえお かきくけこ",), + ("あいうえお らりるれろ",), + ] fts.register_tokenizer(c, name, fts.make_tokenizer_module(SimpleTokenizer())) - c.cursor().execute("CREATE VIRTUAL TABLE fts USING FTS4(tokenize={})".format(name)) + c.cursor().execute(f"CREATE VIRTUAL TABLE fts USING FTS4(tokenize={name})") r = c.cursor().executemany("INSERT INTO fts VALUES(?)", contents) r = c.cursor().execute("SELECT * FROM fts").fetchall() assert len(r) == 4 @@ -94,45 +95,17 @@ def test_match(): c.close() -def test_full_text_index_queries(): +def test_full_text_index_queries(test_docs): name = "simple" - docs = [ - ( - "README", - "sqlitefts-python provides binding for tokenizer of SQLite Full-Text search(FTS3/4). It allows you to write tokenizers in Python.", - ), - ( - "LICENSE", - """Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions:""", - ), - ("日本語", "あいうえお かきくけこ さしすせそ たちつてと なにぬねの"), - ] with apsw.Connection(":memory:") as c: fts.register_tokenizer(c, name, fts.make_tokenizer_module(SimpleTokenizer())) - c.cursor().execute( - "CREATE VIRTUAL TABLE docs USING FTS4(title, body, tokenize={})".format( - name - ) - ) - c.cursor().executemany("INSERT INTO docs(title, body) VALUES(?, ?)", docs) - r = ( - c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH 'Python'") - .fetchall() - ) + c.cursor().execute(f"CREATE VIRTUAL TABLE docs USING FTS4(title, body, tokenize={name})") + c.cursor().executemany("INSERT INTO docs(title, body) VALUES(?, ?)", test_docs) + r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH 'Python'").fetchall() assert len(r) == 1 r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH 'bind'").fetchall() assert len(r) == 0 - r = ( - c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH 'binding'") - .fetchall() - ) + r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH 'binding'").fetchall() assert len(r) == 1 r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH 'to'").fetchall() assert len(r) == 2 @@ -141,62 +114,30 @@ def test_full_text_index_queries(): r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH 'らりるれろ'").fetchall() assert len(r) == 0 assert ( - c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH 'binding'") - .fetchall()[0] - == c.cursor() - .execute("SELECT * FROM docs WHERE body MATCH 'binding'") - .fetchall()[0] + c.cursor().execute("SELECT * FROM docs WHERE docs MATCH 'binding'").fetchall()[0] + == c.cursor().execute("SELECT * FROM docs WHERE body MATCH 'binding'").fetchall()[0] ) assert ( - c.cursor() - .execute("SELECT * FROM docs WHERE body MATCH 'binding'") - .fetchall()[0] - == c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH 'body:binding'") - .fetchall()[0] + c.cursor().execute("SELECT * FROM docs WHERE body MATCH 'binding'").fetchall()[0] + == c.cursor().execute("SELECT * FROM docs WHERE docs MATCH 'body:binding'").fetchall()[0] ) assert ( - c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH 'あいうえお'") - .fetchall()[0] - == c.cursor() - .execute("SELECT * FROM docs WHERE body MATCH 'あいうえお'") - .fetchall()[0] + c.cursor().execute("SELECT * FROM docs WHERE docs MATCH 'あいうえお'").fetchall()[0] + == c.cursor().execute("SELECT * FROM docs WHERE body MATCH 'あいうえお'").fetchall()[0] ) assert ( - c.cursor() - .execute("SELECT * FROM docs WHERE body MATCH 'かきくけこ'") - .fetchall()[0] - == c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH 'body:かきくけこ'") - .fetchall()[0] - ) - r = ( - c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH 'title:bind'") - .fetchall() + c.cursor().execute("SELECT * FROM docs WHERE body MATCH 'かきくけこ'").fetchall()[0] + == c.cursor().execute("SELECT * FROM docs WHERE docs MATCH 'body:かきくけこ'").fetchall()[0] ) + r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH 'title:bind'").fetchall() assert len(r) == 0 - r = ( - c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH 'title:README'") - .fetchall() - ) + r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH 'title:README'").fetchall() assert len(r) == 1 - r = ( - c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH 'title:日本語'") - .fetchall() - ) + r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH 'title:日本語'").fetchall() assert len(r) == 1 r = c.cursor().execute("SELECT * FROM docs WHERE title MATCH 'bind'").fetchall() assert len(r) == 0 - r = ( - c.cursor() - .execute("SELECT * FROM docs WHERE title MATCH 'README'") - .fetchall() - ) + r = c.cursor().execute("SELECT * FROM docs WHERE title MATCH 'README'").fetchall() assert len(r) == 1 r = c.cursor().execute("SELECT * FROM docs WHERE title MATCH '日本語'").fetchall() assert len(r) == 1 @@ -210,89 +151,33 @@ def test_full_text_index_queries(): assert len(r) == 1 r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH 'ん*'").fetchall() assert len(r) == 0 - r = ( - c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH 'tokenizer SQLite'") - .fetchall() - ) + r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH 'tokenizer SQLite'").fetchall() assert len(r) == 1 - r = ( - c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH '\"tokenizer SQLite\"'") - .fetchall() - ) + r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH '\"tokenizer SQLite\"'").fetchall() assert len(r) == 0 - r = ( - c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH 'あいうえお たちつてと'") - .fetchall() - ) + r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH 'あいうえお たちつてと'").fetchall() assert len(r) == 1 - r = ( - c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH '\"あいうえお たちつてと\"'") - .fetchall() - ) + r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH '\"あいうえお たちつてと\"'").fetchall() assert len(r) == 0 - r = ( - c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH '\"tok* SQL*\"'") - .fetchall() - ) + r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH '\"tok* SQL*\"'").fetchall() assert len(r) == 0 - r = ( - c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH '\"tok* of SQL*\"'") - .fetchall() - ) + r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH '\"tok* of SQL*\"'").fetchall() assert len(r) == 1 - r = ( - c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH '\"あ* さ*\"'") - .fetchall() - ) + r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH '\"あ* さ*\"'").fetchall() assert len(r) == 0 - r = ( - c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH '\"あ* かきくけこ さ*\"'") - .fetchall() - ) + r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH '\"あ* かきくけこ さ*\"'").fetchall() assert len(r) == 1 - r = ( - c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH 'tokenizer NEAR SQLite'") - .fetchall() - ) + r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH 'tokenizer NEAR SQLite'").fetchall() assert len(r) == 1 - r = ( - c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH 'binding NEAR/2 SQLite'") - .fetchall() - ) + r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH 'binding NEAR/2 SQLite'").fetchall() assert len(r) == 0 - r = ( - c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH 'binding NEAR/3 SQLite'") - .fetchall() - ) + r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH 'binding NEAR/3 SQLite'").fetchall() assert len(r) == 1 - r = ( - c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH 'あいうえお NEAR たちつてと'") - .fetchall() - ) + r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH 'あいうえお NEAR たちつてと'").fetchall() assert len(r) == 1 - r = ( - c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH 'あいうえお NEAR/2 たちつてと'") - .fetchall() - ) + r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH 'あいうえお NEAR/2 たちつてと'").fetchall() assert len(r) == 1 - r = ( - c.cursor() - .execute("SELECT * FROM docs WHERE docs MATCH 'あいうえお NEAR/3 たちつてと'") - .fetchall() - ) + r = c.cursor().execute("SELECT * FROM docs WHERE docs MATCH 'あいうえお NEAR/3 たちつてと'").fetchall() assert len(r) == 1 @@ -300,9 +185,7 @@ def test_tokenizer_output(): name = "simple" with apsw.Connection(":memory:") as c: fts.register_tokenizer(c, name, fts.make_tokenizer_module(SimpleTokenizer())) - c.cursor().execute( - "CREATE VIRTUAL TABLE tok1 USING fts3tokenize({})".format(name) - ) + c.cursor().execute(f"CREATE VIRTUAL TABLE tok1 USING fts3tokenize({name})") expect = [ ("This", 0, 4, 0), ("is", 5, 7, 1), @@ -311,33 +194,26 @@ def test_tokenizer_output(): ("sentence", 15, 23, 4), ] for a, e in zip( - c.cursor().execute( - "SELECT token, start, end, position " - "FROM tok1 WHERE input='This is a test sentence.'" - ), + c.cursor().execute("SELECT token, start, end, position FROM tok1 WHERE input='This is a test sentence.'"), expect, + strict=False, ): assert e == a s = "これ は テスト の 文 です" expect = [(None, 0, -1, 0)] for i, t in enumerate(s.split()): - expect.append( - (t, expect[-1][2] + 1, expect[-1][2] + 1 + len(t.encode("utf-8")), i) - ) + expect.append((t, expect[-1][2] + 1, expect[-1][2] + 1 + len(t.encode("utf-8")), i)) expect = expect[1:] for a, e in zip( - c.cursor().execute( - "SELECT token, start, end, position " "FROM tok1 WHERE input=?", [s] - ), + c.cursor().execute("SELECT token, start, end, position FROM tok1 WHERE input=?", [s]), expect, + strict=False, ): assert e == a -@pytest.mark.xfail( - apsw.using_amalgamation, reason="FTS5 with APSW+Amalgamation not supported" -) +@pytest.mark.xfail(apsw.using_amalgamation, reason="FTS5 with APSW+Amalgamation not supported") def test_fts5_api_from_db(): with apsw.Connection(":memory:") as c: fts5api = fts5.fts5_api_from_db(c) diff --git a/tests/test_base.py b/tests/test_base.py index 1d2048c..216a488 100644 --- a/tests/test_base.py +++ b/tests/test_base.py @@ -1,5 +1,3 @@ -# coding: utf-8 -from __future__ import print_function, unicode_literals import re import sqlite3 @@ -20,16 +18,9 @@ def tokenize(self, text): for m in self._p.finditer(text): s, e = m.span() t = text[s:e].lower() - l = len(t.encode("utf-8")) + token_len = len(t.encode("utf-8")) p = len(text[:s].encode("utf-8")) - yield t, p, p + l - - -@pytest.fixture -def c(): - c = sqlite3.connect(":memory:") - c.row_factory = sqlite3.Row - return c + yield t, p, p + token_len @pytest.fixture @@ -65,20 +56,14 @@ def test_register_tokenizer(c, tokenizer_module): def test_createtable(c, tokenizer_module): name = "simple" - sql = "CREATE VIRTUAL TABLE fts USING FTS4(tokenize={})".format(name) + sql = f"CREATE VIRTUAL TABLE fts USING FTS4(tokenize={name})" fts.register_tokenizer(c, name, tokenizer_module) c.execute(sql) - r = c.execute( - "SELECT * FROM sqlite_master WHERE type='table' AND name='fts'" - ).fetchone() + r = c.execute("SELECT * FROM sqlite_master WHERE type='table' AND name='fts'").fetchone() assert r - assert ( - r[str("type")] == "table" - and r[str("name")] == "fts" - and r[str("tbl_name")] == "fts" - ) - assert r[str("sql")].upper() == sql.upper() + assert r["type"] == "table" and r["name"] == "fts" and r["tbl_name"] == "fts" + assert r["sql"].upper() == sql.upper() c.close() @@ -86,20 +71,25 @@ def test_insert(c, tokenizer_module): name = "simple" content = "これは日本語で書かれています" fts.register_tokenizer(c, name, tokenizer_module) - c.execute("CREATE VIRTUAL TABLE fts USING FTS4(tokenize={})".format(name)) + c.execute(f"CREATE VIRTUAL TABLE fts USING FTS4(tokenize={name})") r = c.execute("INSERT INTO fts VALUES(?)", (content,)) assert r.rowcount == 1 r = c.execute("SELECT * FROM fts").fetchone() assert r - assert r[str("content")] == content + assert r["content"] == content c.close() def test_match(c, tokenizer_module): name = "simple" - contents = [("abc def",), ("abc xyz",), ("あいうえお かきくけこ",), ("あいうえお らりるれろ",)] + contents = [ + ("abc def",), + ("abc xyz",), + ("あいうえお かきくけこ",), + ("あいうえお らりるれろ",), + ] fts.register_tokenizer(c, name, tokenizer_module) - c.execute("CREATE VIRTUAL TABLE fts USING FTS4(tokenize={})".format(name)) + c.execute(f"CREATE VIRTUAL TABLE fts USING FTS4(tokenize={name})") r = c.executemany("INSERT INTO fts VALUES(?)", contents) assert r.rowcount == 4 r = c.execute("SELECT * FROM fts").fetchall() @@ -107,48 +97,28 @@ def test_match(c, tokenizer_module): r = c.execute("SELECT * FROM fts WHERE fts MATCH 'abc'").fetchall() assert len(r) == 2 r = c.execute("SELECT * FROM fts WHERE fts MATCH 'def'").fetchall() - assert len(r) == 1 and r[0][str("content")] == contents[0][0] + assert len(r) == 1 and r[0]["content"] == contents[0][0] r = c.execute("SELECT * FROM fts WHERE fts MATCH 'xyz'").fetchall() - assert len(r) == 1 and r[0][str("content")] == contents[1][0] + assert len(r) == 1 and r[0]["content"] == contents[1][0] r = c.execute("SELECT * FROM fts WHERE fts MATCH 'zzz'").fetchall() assert len(r) == 0 r = c.execute("SELECT * FROM fts WHERE fts MATCH 'あいうえお'").fetchall() assert len(r) == 2 r = c.execute("SELECT * FROM fts WHERE fts MATCH 'かきくけこ'").fetchall() - assert len(r) == 1 and r[0][str("content")] == contents[2][0] + assert len(r) == 1 and r[0]["content"] == contents[2][0] r = c.execute("SELECT * FROM fts WHERE fts MATCH 'らりるれろ'").fetchall() - assert len(r) == 1 and r[0][str("content")] == contents[3][0] + assert len(r) == 1 and r[0]["content"] == contents[3][0] r = c.execute("SELECT * FROM fts WHERE fts MATCH 'まみむめも'").fetchall() assert len(r) == 0 c.close() -def test_full_text_index_queries(c, tokenizer_module): +def test_full_text_index_queries(c, tokenizer_module, test_docs): name = "simple" - docs = [ - ( - "README", - "sqlitefts-python provides binding for tokenizer of SQLite Full-Text search(FTS3/4). It allows you to write tokenizers in Python.", - ), - ( - "LICENSE", - """Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions:""", - ), - ("日本語", "あいうえお かきくけこ さしすせそ たちつてと なにぬねの"), - ] with c: fts.register_tokenizer(c, name, tokenizer_module) - c.execute( - "CREATE VIRTUAL TABLE docs USING FTS4(title, body, tokenize={})".format( - name - ) - ) - c.executemany("INSERT INTO docs(title, body) VALUES(?, ?)", docs) + c.execute(f"CREATE VIRTUAL TABLE docs USING FTS4(title, body, tokenize={name})") + c.executemany("INSERT INTO docs(title, body) VALUES(?, ?)", test_docs) r = c.execute("SELECT * FROM docs WHERE docs MATCH 'Python'").fetchall() assert len(r) == 1 r = c.execute("SELECT * FROM docs WHERE docs MATCH 'bind'").fetchall() @@ -167,9 +137,7 @@ def test_full_text_index_queries(c, tokenizer_module): ) assert ( c.execute("SELECT * FROM docs WHERE body MATCH 'binding'").fetchall()[0] - == c.execute( - "SELECT * FROM docs WHERE docs MATCH 'body:binding'" - ).fetchall()[0] + == c.execute("SELECT * FROM docs WHERE docs MATCH 'body:binding'").fetchall()[0] ) assert ( c.execute("SELECT * FROM docs WHERE docs MATCH 'あいうえお'").fetchall()[0] @@ -177,9 +145,7 @@ def test_full_text_index_queries(c, tokenizer_module): ) assert ( c.execute("SELECT * FROM docs WHERE body MATCH 'かきくけこ'").fetchall()[0] - == c.execute("SELECT * FROM docs WHERE docs MATCH 'body:かきくけこ'").fetchall()[ - 0 - ] + == c.execute("SELECT * FROM docs WHERE docs MATCH 'body:かきくけこ'").fetchall()[0] ) r = c.execute("SELECT * FROM docs WHERE docs MATCH 'title:bind'").fetchall() assert len(r) == 0 @@ -203,55 +169,33 @@ def test_full_text_index_queries(c, tokenizer_module): assert len(r) == 1 r = c.execute("SELECT * FROM docs WHERE docs MATCH 'ん*'").fetchall() assert len(r) == 0 - r = c.execute( - "SELECT * FROM docs WHERE docs MATCH 'tokenizer SQLite'" - ).fetchall() + r = c.execute("SELECT * FROM docs WHERE docs MATCH 'tokenizer SQLite'").fetchall() assert len(r) == 1 - r = c.execute( - "SELECT * FROM docs WHERE docs MATCH '\"tokenizer SQLite\"'" - ).fetchall() + r = c.execute("SELECT * FROM docs WHERE docs MATCH '\"tokenizer SQLite\"'").fetchall() assert len(r) == 0 r = c.execute("SELECT * FROM docs WHERE docs MATCH 'あいうえお たちつてと'").fetchall() assert len(r) == 1 - r = c.execute( - "SELECT * FROM docs WHERE docs MATCH '\"あいうえお たちつてと\"'" - ).fetchall() + r = c.execute("SELECT * FROM docs WHERE docs MATCH '\"あいうえお たちつてと\"'").fetchall() assert len(r) == 0 r = c.execute("SELECT * FROM docs WHERE docs MATCH '\"tok* SQL*\"'").fetchall() assert len(r) == 0 - r = c.execute( - "SELECT * FROM docs WHERE docs MATCH '\"tok* of SQL*\"'" - ).fetchall() + r = c.execute("SELECT * FROM docs WHERE docs MATCH '\"tok* of SQL*\"'").fetchall() assert len(r) == 1 r = c.execute("SELECT * FROM docs WHERE docs MATCH '\"あ* さ*\"'").fetchall() assert len(r) == 0 - r = c.execute( - "SELECT * FROM docs WHERE docs MATCH '\"あ* かきくけこ さ*\"'" - ).fetchall() + r = c.execute("SELECT * FROM docs WHERE docs MATCH '\"あ* かきくけこ さ*\"'").fetchall() assert len(r) == 1 - r = c.execute( - "SELECT * FROM docs WHERE docs MATCH 'tokenizer NEAR SQLite'" - ).fetchall() + r = c.execute("SELECT * FROM docs WHERE docs MATCH 'tokenizer NEAR SQLite'").fetchall() assert len(r) == 1 - r = c.execute( - "SELECT * FROM docs WHERE docs MATCH 'binding NEAR/2 SQLite'" - ).fetchall() + r = c.execute("SELECT * FROM docs WHERE docs MATCH 'binding NEAR/2 SQLite'").fetchall() assert len(r) == 0 - r = c.execute( - "SELECT * FROM docs WHERE docs MATCH 'binding NEAR/3 SQLite'" - ).fetchall() + r = c.execute("SELECT * FROM docs WHERE docs MATCH 'binding NEAR/3 SQLite'").fetchall() assert len(r) == 1 - r = c.execute( - "SELECT * FROM docs WHERE docs MATCH 'あいうえお NEAR たちつてと'" - ).fetchall() + r = c.execute("SELECT * FROM docs WHERE docs MATCH 'あいうえお NEAR たちつてと'").fetchall() assert len(r) == 1 - r = c.execute( - "SELECT * FROM docs WHERE docs MATCH 'あいうえお NEAR/2 たちつてと'" - ).fetchall() + r = c.execute("SELECT * FROM docs WHERE docs MATCH 'あいうえお NEAR/2 たちつてと'").fetchall() assert len(r) == 1 - r = c.execute( - "SELECT * FROM docs WHERE docs MATCH 'あいうえお NEAR/3 たちつてと'" - ).fetchall() + r = c.execute("SELECT * FROM docs WHERE docs MATCH 'あいうえお NEAR/3 たちつてと'").fetchall() assert len(r) == 1 @@ -259,7 +203,7 @@ def test_tokenizer_output(c, tokenizer_module): name = "s" with sqlite3.connect(":memory:") as c: fts.register_tokenizer(c, name, tokenizer_module) - c.execute("CREATE VIRTUAL TABLE tok1 USING fts3tokenize({})".format(name)) + c.execute(f"CREATE VIRTUAL TABLE tok1 USING fts3tokenize({name})") expect: list[tuple[str | None, int, int, int]] = [ ("this", 0, 4, 0), ("is", 5, 7, 1), @@ -268,94 +212,56 @@ def test_tokenizer_output(c, tokenizer_module): ("sentence", 15, 23, 4), ] for a, e in zip( - c.execute( - "SELECT token, start, end, position " - "FROM tok1 WHERE input='This is a test sentence.'" - ), + c.execute("SELECT token, start, end, position FROM tok1 WHERE input='This is a test sentence.'"), expect, + strict=False, ): assert e == a s = "これ は テスト の 文 です" expect = [(None, 0, -1, 0)] for i, t in enumerate(s.split()): - expect.append( - (t, expect[-1][2] + 1, expect[-1][2] + 1 + len(t.encode("utf-8")), i) - ) + expect.append((t, expect[-1][2] + 1, expect[-1][2] + 1 + len(t.encode("utf-8")), i)) expect = expect[1:] - a = c.execute( - "SELECT token, start, end, position FROM tok1 WHERE input=?", [s] - ).fetchall() + a = c.execute("SELECT token, start, end, position FROM tok1 WHERE input=?", [s]).fetchall() for a, e in zip( - c.execute( - "SELECT token, start, end, position FROM tok1 WHERE input=?", [s] - ), + c.execute("SELECT token, start, end, position FROM tok1 WHERE input=?", [s]), expect, + strict=False, ): assert e == a c.execute("CREATE VIRTUAL TABLE tok2 USING fts3tokenize()") s = '"binding" OR "あいうえお"' for a, e in zip( - c.execute( - "SELECT token, start, end, position FROM tok1 WHERE input=?", [s] - ), - c.execute( - "SELECT token, start, end, position FROM tok2 WHERE input=?", [s] - ), + c.execute("SELECT token, start, end, position FROM tok1 WHERE input=?", [s]), + c.execute("SELECT token, start, end, position FROM tok2 WHERE input=?", [s]), + strict=False, ): assert a == e -def test_quoted(c, tokenizer_module): +def test_quoted(c, tokenizer_module, test_docs): name = "simple1" - docs = [ - ( - "README", - "sqlitefts-python provides binding for tokenizer of SQLite Full-Text search(FTS3/4). It allows you to write tokenizers in Python.", - ), - ( - "LICENSE", - """Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions:""", - ), - ("日本語", "あいうえお かきくけこ さしすせそ たちつてと なにぬねの"), - ] with c: c.execute("CREATE VIRTUAL TABLE docs USING FTS4(title, body)") - c.executemany("INSERT INTO docs(title, body) VALUES(?, ?)", docs) + c.executemany("INSERT INTO docs(title, body) VALUES(?, ?)", test_docs) c.execute("CREATE VIRTUAL TABLE docs_term USING FTS4AUX(docs)") orig_terms = c.execute("SELECT * FROM docs_term").fetchall() - r = c.execute( - """SELECT * FROM docs WHERE docs MATCH '"binding" OR "あいうえお"'""" - ).fetchall() + r = c.execute("""SELECT * FROM docs WHERE docs MATCH '"binding" OR "あいうえお"'""").fetchall() assert len(r) == 2 - r = c.execute( - """SELECT * FROM docs WHERE docs MATCH '"provides binding" OR あいうえお'""" - ).fetchall() + r = c.execute("""SELECT * FROM docs WHERE docs MATCH '"provides binding" OR あいうえお'""").fetchall() assert len(r) == 2 c.execute("DROP TABLE docs_term") c.execute("DROP TABLE docs") fts.register_tokenizer(c, name, tokenizer_module) - c.execute( - "CREATE VIRTUAL TABLE docs USING FTS4(title, body, tokenize={})".format( - name - ) - ) - c.executemany("INSERT INTO docs(title, body) VALUES(?, ?)", docs) + c.execute(f"CREATE VIRTUAL TABLE docs USING FTS4(title, body, tokenize={name})") + c.executemany("INSERT INTO docs(title, body) VALUES(?, ?)", test_docs) c.execute("CREATE VIRTUAL TABLE docs_term USING FTS4AUX(docs)") terms = c.execute("SELECT * FROM docs_term").fetchall() assert terms == orig_terms - r = c.execute( - """SELECT * FROM docs WHERE docs MATCH '"binding" OR "あいうえお"'""" - ).fetchall() + r = c.execute("""SELECT * FROM docs WHERE docs MATCH '"binding" OR "あいうえお"'""").fetchall() assert len(r) == 2 - r = c.execute( - """SELECT * FROM docs WHERE docs MATCH '"provides binding" OR あいうえお'""" - ).fetchall() + r = c.execute("""SELECT * FROM docs WHERE docs MATCH '"provides binding" OR あいうえお'""").fetchall() assert len(r) == 2 diff --git a/tests/test_base2.py b/tests/test_base2.py index d35c5b6..526045c 100644 --- a/tests/test_base2.py +++ b/tests/test_base2.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- -from __future__ import print_function import re import sqlite3 @@ -10,7 +8,6 @@ class BaseTokenizer(fts.Tokenizer): - _spliter = re.compile(r"\s+|\S+") _nonws = re.compile(r"\S+") @@ -30,7 +27,6 @@ def tokenize(self, text): class DebugTokenizer(BaseTokenizer): - _limit = 16 def _normalize(self, token): @@ -48,15 +44,13 @@ def db(): conn = sqlite3.connect(":memory:") fts.register_tokenizer(conn, name, fts.make_tokenizer_module(BaseTokenizer())) - conn.execute("CREATE VIRTUAL TABLE fts USING FTS4(tokenize={})".format(name)) + conn.execute(f"CREATE VIRTUAL TABLE fts USING FTS4(tokenize={name})") return conn def testZeroLengthToken(db): - result = db.executemany( - "INSERT INTO fts VALUES(?)", [("Make things I",), (u"Some σ φχικλψ",)] - ) + result = db.executemany("INSERT INTO fts VALUES(?)", [("Make things I",), ("Some σ φχικλψ",)]) # noqa: RUF001 assert 2 == result.rowcount diff --git a/tests/test_compat.py b/tests/test_compat.py index 2d73128..732ebe3 100644 --- a/tests/test_compat.py +++ b/tests/test_compat.py @@ -1,8 +1,6 @@ -# coding: utf-8 # test compatibility # - a tokneizer for FTS5 can be used for FTS3 # - a tokneizer for FTS3 can be wrapped for FTS5 -from __future__ import print_function, unicode_literals import re @@ -10,9 +8,6 @@ from sqlitefts import Tokenizer, make_tokenizer_module from sqlitefts.fts5 import FTS3TokenizerAdaptor, FTS5Tokenizer, make_fts5_tokenizer -from test_base import c -from test_base import test_full_text_index_queries as test_fts3 -from test_fts5 import test_full_text_index_queries as test_fts5 class SimpleFTS5Tokenizer(FTS5Tokenizer): @@ -22,9 +17,9 @@ def tokenize(self, text, flags=None): for m in self._p.finditer(text): s, e = m.span() t = text[s:e] - l = len(t.encode("utf-8")) + token_len = len(t.encode("utf-8")) p = len(text[:s].encode("utf-8")) - yield t, p, p + l + yield t, p, p + token_len class SimpleFTS3Tokenizer(Tokenizer): @@ -34,9 +29,9 @@ def tokenize(self, text): for m in self._p.finditer(text): s, e = m.span() t = text[s:e] - l = len(t.encode("utf-8")) + token_len = len(t.encode("utf-8")) p = len(text[:s].encode("utf-8")) - yield t, p, p + l + yield t, p, p + token_len @pytest.fixture diff --git a/tests/test_fts5.py b/tests/test_fts5.py index a117dc3..ec5e4c6 100644 --- a/tests/test_fts5.py +++ b/tests/test_fts5.py @@ -1,8 +1,5 @@ -# coding: utf-8 -from __future__ import print_function, unicode_literals import re -import sqlite3 from collections import Counter import pytest @@ -20,16 +17,9 @@ def tokenize(self, text, flags): for m in self._p.finditer(text): s, e = m.span() t = text[s:e] - l = len(t.encode("utf-8")) + token_len = len(t.encode("utf-8")) p = len(text[:s].encode("utf-8")) - yield t, p, p + l - - -@pytest.fixture -def c(): - c = sqlite3.connect(":memory:") - c.row_factory = sqlite3.Row - return c + yield t, p, p + token_len @pytest.fixture @@ -77,20 +67,14 @@ def on_destroy(x): def test_createtable(c, tm): name = "super_simple" - sql = "CREATE VIRTUAL TABLE fts USING fts5(w, tokenize={})".format(name) + sql = f"CREATE VIRTUAL TABLE fts USING fts5(w, tokenize={name})" fts5.register_tokenizer(c, name, tm) c.execute(sql) - r = c.execute( - "SELECT * FROM sqlite_master WHERE type='table' AND name='fts'" - ).fetchone() + r = c.execute("SELECT * FROM sqlite_master WHERE type='table' AND name='fts'").fetchone() assert r - assert ( - r[str("type")] == "table" - and r[str("name")] == "fts" - and r[str("tbl_name")] == "fts" - ) - assert r[str("sql")].upper() == sql.upper() + assert r["type"] == "table" and r["name"] == "fts" and r["tbl_name"] == "fts" + assert r["sql"].upper() == sql.upper() c.close() @@ -107,43 +91,44 @@ def on_delete(self): name = "super_simple" fts5.register_tokenizer(c, name, fts5.make_fts5_tokenizer(ST), context="test") - sql = ( - "CREATE VIRTUAL TABLE fts " "USING FTS5(content, tokenize='{} {} {}')" - ).format(name, "arg", "引数") + sql = ("CREATE VIRTUAL TABLE fts USING FTS5(content, tokenize='{} {} {}')").format(name, "arg", "引数") c.execute(sql) assert len(initialized) == 1 assert list(initialized.values()) == [("test", ("arg", "引数"))] assert len(deleted) == 0 - sql = ( - "CREATE VIRTUAL TABLE fts_2 " "USING FTS5(content, tokenize='{} {} {}')" - ).format(name, "arg2", "引数2") + sql = ("CREATE VIRTUAL TABLE fts_2 USING FTS5(content, tokenize='{} {} {}')").format(name, "arg2", "引数2") c.execute(sql) c.close() assert set(initialized.values()) == { ("test", ("arg", "引数")), ("test", ("arg2", "引数2")), } - assert list(x for x in deleted.values()) == [1, 1] + assert list(deleted.values()) == [1, 1] def test_insert(c, tm): name = "super_simple" content = "これは日本語で書かれています" fts5.register_tokenizer(c, name, tm) - c.execute("CREATE VIRTUAL TABLE fts USING FTS5(content, tokenize={})".format(name)) + c.execute(f"CREATE VIRTUAL TABLE fts USING FTS5(content, tokenize={name})") r = c.execute("INSERT INTO fts VALUES(?)", (content,)) assert r.rowcount == 1 r = c.execute("SELECT * FROM fts").fetchone() assert r - assert r[str("content")] == content + assert r["content"] == content c.close() def test_match(c, tm): name = "super_simple" - contents = [("abc def",), ("abc xyz",), ("あいうえお かきくけこ",), ("あいうえお らりるれろ",)] + contents = [ + ("abc def",), + ("abc xyz",), + ("あいうえお かきくけこ",), + ("あいうえお らりるれろ",), + ] fts5.register_tokenizer(c, name, tm) - c.execute("CREATE VIRTUAL TABLE fts USING FTS5(content, tokenize={})".format(name)) + c.execute(f"CREATE VIRTUAL TABLE fts USING FTS5(content, tokenize={name})") r = c.executemany("INSERT INTO fts VALUES(?)", contents) assert r.rowcount == 4 r = c.execute("SELECT * FROM fts").fetchall() @@ -151,48 +136,28 @@ def test_match(c, tm): r = c.execute("SELECT * FROM fts WHERE fts MATCH 'abc'").fetchall() assert len(r) == 2 r = c.execute("SELECT * FROM fts WHERE fts MATCH 'def'").fetchall() - assert len(r) == 1 and r[0][str("content")] == contents[0][0] + assert len(r) == 1 and r[0]["content"] == contents[0][0] r = c.execute("SELECT * FROM fts WHERE fts MATCH 'xyz'").fetchall() - assert len(r) == 1 and r[0][str("content")] == contents[1][0] + assert len(r) == 1 and r[0]["content"] == contents[1][0] r = c.execute("SELECT * FROM fts WHERE fts MATCH 'zzz'").fetchall() assert len(r) == 0 r = c.execute("SELECT * FROM fts WHERE fts MATCH 'あいうえお'").fetchall() assert len(r) == 2 r = c.execute("SELECT * FROM fts WHERE fts MATCH 'かきくけこ'").fetchall() - assert len(r) == 1 and r[0][str("content")] == contents[2][0] + assert len(r) == 1 and r[0]["content"] == contents[2][0] r = c.execute("SELECT * FROM fts WHERE fts MATCH 'らりるれろ'").fetchall() - assert len(r) == 1 and r[0][str("content")] == contents[3][0] + assert len(r) == 1 and r[0]["content"] == contents[3][0] r = c.execute("SELECT * FROM fts WHERE fts MATCH 'まみむめも'").fetchall() assert len(r) == 0 c.close() -def test_full_text_index_queries(c, tm): +def test_full_text_index_queries(c, tm, test_docs): name = "super_simple" - docs = [ - ( - "README", - "sqlitefts-python provides binding for tokenizer of SQLite Full-Text search(FTS3/4). It allows you to write tokenizers in Python.", - ), - ( - "LICENSE", - """Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions:""", - ), - ("日本語", "あいうえお かきくけこ さしすせそ たちつてと なにぬねの"), - ] with c: fts5.register_tokenizer(c, name, tm) - c.execute( - "CREATE VIRTUAL TABLE docs USING FTS5(title, body, tokenize={})".format( - name - ) - ) - c.executemany("INSERT INTO docs(title, body) VALUES(?, ?)", docs) + c.execute(f"CREATE VIRTUAL TABLE docs USING FTS5(title, body, tokenize={name})") + c.executemany("INSERT INTO docs(title, body) VALUES(?, ?)", test_docs) r = c.execute("SELECT * FROM docs WHERE docs MATCH 'Python'").fetchall() assert len(r) == 1 r = c.execute("SELECT * FROM docs WHERE docs MATCH 'bind'").fetchall() @@ -207,23 +172,15 @@ def test_full_text_index_queries(c, tm): assert len(r) == 0 assert ( c.execute("SELECT * FROM docs WHERE docs MATCH 'binding'").fetchall()[0] - == c.execute( - "SELECT * FROM docs WHERE docs MATCH 'body:binding'" - ).fetchall()[0] + == c.execute("SELECT * FROM docs WHERE docs MATCH 'body:binding'").fetchall()[0] ) assert ( - c.execute("SELECT * FROM docs WHERE docs MATCH 'body:binding'").fetchall()[ - 0 - ] - == c.execute( - "SELECT * FROM docs WHERE docs MATCH 'body:binding'" - ).fetchall()[0] + c.execute("SELECT * FROM docs WHERE docs MATCH 'body:binding'").fetchall()[0] + == c.execute("SELECT * FROM docs WHERE docs MATCH 'body:binding'").fetchall()[0] ) assert ( c.execute("SELECT * FROM docs WHERE docs MATCH 'あいうえお'").fetchall()[0] - == c.execute("SELECT * FROM docs WHERE docs MATCH 'body:あいうえお'").fetchall()[ - 0 - ] + == c.execute("SELECT * FROM docs WHERE docs MATCH 'body:あいうえお'").fetchall()[0] ) r = c.execute("SELECT * FROM docs WHERE docs MATCH 'title:bind'").fetchall() assert len(r) == 0 @@ -241,19 +198,13 @@ def test_full_text_index_queries(c, tm): assert len(r) == 1 r = c.execute("SELECT * FROM docs WHERE docs MATCH 'ん*'").fetchall() assert len(r) == 0 - r = c.execute( - "SELECT * FROM docs WHERE docs MATCH 'tokenizer SQLite'" - ).fetchall() + r = c.execute("SELECT * FROM docs WHERE docs MATCH 'tokenizer SQLite'").fetchall() assert len(r) == 1 - r = c.execute( - "SELECT * FROM docs WHERE docs MATCH '\"tokenizer SQLite\"'" - ).fetchall() + r = c.execute("SELECT * FROM docs WHERE docs MATCH '\"tokenizer SQLite\"'").fetchall() assert len(r) == 0 r = c.execute("SELECT * FROM docs WHERE docs MATCH 'あいうえお たちつてと'").fetchall() assert len(r) == 1 - r = c.execute( - "SELECT * FROM docs WHERE docs MATCH '\"あいうえお たちつてと\"'" - ).fetchall() + r = c.execute("SELECT * FROM docs WHERE docs MATCH '\"あいうえお たちつてと\"'").fetchall() assert len(r) == 0 r = c.execute("SELECT * FROM docs WHERE docs MATCH 'tok* + SQL*'").fetchall() assert len(r) == 0 @@ -263,29 +214,17 @@ def test_full_text_index_queries(c, tm): assert len(r) == 0 r = c.execute("SELECT * FROM docs WHERE docs MATCH 'あ* かきくけこ さ*'").fetchall() assert len(r) == 1 - r = c.execute( - "SELECT * FROM docs WHERE docs MATCH 'NEAR(tokenizer SQLite)'" - ).fetchall() + r = c.execute("SELECT * FROM docs WHERE docs MATCH 'NEAR(tokenizer SQLite)'").fetchall() assert len(r) == 1 - r = c.execute( - "SELECT * FROM docs WHERE docs MATCH 'NEAR(binding SQLite, 2)'" - ).fetchall() + r = c.execute("SELECT * FROM docs WHERE docs MATCH 'NEAR(binding SQLite, 2)'").fetchall() assert len(r) == 0 - r = c.execute( - "SELECT * FROM docs WHERE docs MATCH 'NEAR(binding SQLite, 3)'" - ).fetchall() + r = c.execute("SELECT * FROM docs WHERE docs MATCH 'NEAR(binding SQLite, 3)'").fetchall() assert len(r) == 1 - r = c.execute( - "SELECT * FROM docs WHERE docs MATCH 'NEAR(あいうえお たちつてと)'" - ).fetchall() + r = c.execute("SELECT * FROM docs WHERE docs MATCH 'NEAR(あいうえお たちつてと)'").fetchall() assert len(r) == 1 - r = c.execute( - "SELECT * FROM docs WHERE docs MATCH 'NEAR(あいうえお たちつてと, 2)'" - ).fetchall() + r = c.execute("SELECT * FROM docs WHERE docs MATCH 'NEAR(あいうえお たちつてと, 2)'").fetchall() assert len(r) == 1 - r = c.execute( - "SELECT * FROM docs WHERE docs MATCH 'NEAR(あいうえお たちつてと, 3)'" - ).fetchall() + r = c.execute("SELECT * FROM docs WHERE docs MATCH 'NEAR(あいうえお たちつてと, 3)'").fetchall() assert len(r) == 1 @@ -295,17 +234,20 @@ def test_flags(c): class ST(SimpleTokenizer): def tokenize(self, text, flags): flags_counter[flags] += 1 - return super(ST, self).tokenize(text, flags) + return super().tokenize(text, flags) name = "super_simple2" fts5.register_tokenizer(c, name, fts5.make_fts5_tokenizer(ST())) - sql = ("CREATE VIRTUAL TABLE fts " "USING FTS5(content, tokenize='{}')").format( - name - ) + sql = (f"CREATE VIRTUAL TABLE fts USING FTS5(content, tokenize='{name}')") c.execute(sql) c.executemany( "INSERT INTO fts VALUES(?)", - [("abc def",), ("abc xyz",), ("あいうえお かきくけこ",), ("あいうえお らりるれろ",)], + [ + ("abc def",), + ("abc xyz",), + ("あいうえお かきくけこ",), + ("あいうえお らりるれろ",), + ], ) c.execute("SELECT * FROM fts WHERE fts MATCH 'abc'").fetchall() c.execute("SELECT * FROM fts WHERE fts MATCH 'abc'").fetchall() @@ -318,7 +260,7 @@ def test_aux_and_tokenize(c, tm): name = "super_simple" fts5.register_tokenizer(c, name, tm) fts5_aux.register_aux_function(c, "tokenize", fts5_aux.aux_tokenize) - c.execute("CREATE VIRTUAL TABLE fts USING FTS5(content, tokenize={})".format(name)) + c.execute(f"CREATE VIRTUAL TABLE fts USING FTS5(content, tokenize={name})") r = c.executemany("INSERT INTO fts VALUES(?)", (["hello world"], ["こんにちは 世界"])) assert r.rowcount == 2 r = c.execute("SELECT tokenize(fts, 0) FROM fts") diff --git a/tests/test_igo.py b/tests/test_igo.py index 326eb6a..b038c52 100644 --- a/tests/test_igo.py +++ b/tests/test_igo.py @@ -1,5 +1,3 @@ -# coding: utf-8 -from __future__ import print_function, unicode_literals import sys diff --git a/tests/test_janome.py b/tests/test_janome.py index 22afa75..f6b7bd1 100644 --- a/tests/test_janome.py +++ b/tests/test_janome.py @@ -1,5 +1,3 @@ -# coding: utf-8 -from __future__ import print_function, unicode_literals import pytest diff --git a/tests/test_many.py b/tests/test_many.py index 551bbf7..bd36f88 100644 --- a/tests/test_many.py +++ b/tests/test_many.py @@ -1,4 +1,3 @@ -from __future__ import print_function, unicode_literals import os import sqlite3 @@ -61,7 +60,7 @@ def create_table(c): def test_insert_many_each(conn, nr): with conn: - for i in range(nr): + for _ in range(nr): conn.execute("INSERT INTO fts VALUES(?)", [fake.address()]) conn.execute("INSERT INTO fts5 VALUES(?)", [fake.address()]) assert conn.execute("SELECT COUNT(*) FROM fts").fetchall()[0][0] == nr @@ -70,24 +69,16 @@ def test_insert_many_each(conn, nr): def test_insert_many_many(conn, nr): with conn: - conn.executemany( - "INSERT INTO fts VALUES(?)", ([fake.address()] for _ in range(nr)) - ) - conn.executemany( - "INSERT INTO fts5 VALUES(?)", ([fake.address()] for _ in range(nr)) - ) + conn.executemany("INSERT INTO fts VALUES(?)", ([fake.address()] for _ in range(nr))) + conn.executemany("INSERT INTO fts5 VALUES(?)", ([fake.address()] for _ in range(nr))) assert conn.execute("SELECT COUNT(*) FROM fts").fetchall()[0][0] == nr assert conn.execute("SELECT COUNT(*) FROM fts5").fetchall()[0][0] == nr def test_insert_many_use_select(conn, nr): with conn: - conn.executemany( - "INSERT INTO fts VALUES(?)", ([fake.address()] for _ in range(nr)) - ) - conn.executemany( - "INSERT INTO fts5 VALUES(?)", ([fake.address()] for _ in range(nr)) - ) + conn.executemany("INSERT INTO fts VALUES(?)", ([fake.address()] for _ in range(nr))) + conn.executemany("INSERT INTO fts5 VALUES(?)", ([fake.address()] for _ in range(nr))) with conn: conn.execute("INSERT INTO fts SELECT * FROM fts") conn.execute("INSERT INTO fts5 SELECT * FROM fts5") diff --git a/tests/test_mecab.py b/tests/test_mecab.py index 326232b..28bdddc 100644 --- a/tests/test_mecab.py +++ b/tests/test_mecab.py @@ -1,8 +1,5 @@ -# coding: utf-8 -from __future__ import print_function import os -import sys import pytest @@ -16,36 +13,20 @@ class MeCabTokenizer(fts.Tokenizer): def __init__(self): try: self.tagger = mecab.Tagger() - except: - self.tagger = mecab.Tagger("".join(["-r", os.getenv("MECABRC", "/etc/mecabrc")])) + except Exception: + self.tagger = mecab.Tagger("".join(["-r", os.getenv("MECABRC", "/etc/mecabrc")])) self.tagger.parseToNode("") - if sys.version_info.major == 2: - - def to_mecab(self, text): - return text.encode("utf-8") - - def from_mecab(self, text): - return text.decode("utf-8") - - else: - - def to_mecab(self, text): - return text - - def from_mecab(self, text): - return text - def tokenize(self, text): p = 0 - m = self.tagger.parseToNode(self.to_mecab(text)) + m = self.tagger.parseToNode(text) while m: - l = m.length - d = m.rlength - l + token_len = m.length + d = m.rlength - token_len start = p + d - p = start + l - if l: - yield self.from_mecab(m.surface), start, p + p = start + token_len + if token_len: + yield m.surface, start, p m = m.next diff --git a/tests/test_natto.py b/tests/test_natto.py index 8f607cf..361f1fe 100644 --- a/tests/test_natto.py +++ b/tests/test_natto.py @@ -1,7 +1,4 @@ -# coding: utf-8 -from __future__ import print_function -import sys import pytest @@ -12,32 +9,16 @@ class NattoPyTokenizer(fts.Tokenizer): - if sys.version_info.major == 2: - - def to_mecab(self, text): - return text.encode("utf-8") - - def from_mecab(self, text): - return text.decode("utf-8") - - else: - - def to_mecab(self, text): - return text - - def from_mecab(self, text): - return text - def tokenize(self, text): p = 0 with mecab.MeCab() as tagger: - for m in tagger.parse(self.to_mecab(text), as_nodes=1): - l = m.length - d = m.rlength - l + for m in tagger.parse(text, as_nodes=1): + token_len = m.length + d = m.rlength - token_len start = p + d - p = start + l - if l: - yield self.from_mecab(m.surface), start, p + p = start + token_len + if token_len: + yield m.surface, start, p @pytest.fixture diff --git a/tests/test_ranking.py b/tests/test_ranking.py index 7689051..4d87d04 100644 --- a/tests/test_ranking.py +++ b/tests/test_ranking.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals import re import sqlite3 @@ -11,7 +9,6 @@ class Tokenizer(fts.Tokenizer): - _spliter = re.compile(r"\s+|\S+", re.UNICODE) _nonws = re.compile(r"\S+", re.UNICODE) @@ -38,8 +35,8 @@ def db(): fts.register_tokenizer(conn, name, fts.make_tokenizer_module(Tokenizer())) - conn.execute("CREATE VIRTUAL TABLE fts3 USING FTS3(tokenize={})".format(name)) - conn.execute("CREATE VIRTUAL TABLE fts4 USING FTS4(tokenize={})".format(name)) + conn.execute(f"CREATE VIRTUAL TABLE fts3 USING FTS3(tokenize={name})") + conn.execute(f"CREATE VIRTUAL TABLE fts4 USING FTS4(tokenize={name})") values = [ ["Make thing I"], @@ -49,15 +46,11 @@ def db(): "Sed posuere mi a nisl aliquet tempor. Praesent tincidunt vel nunc ac pharetra." ], ["Nam molestie euismod leo id aliquam. In hac habitasse platea dictumst."], - [ - "Vivamus tincidunt feugiat tellus ac bibendum. In rhoncus dignissim suscipit." - ], - [ - "Pellentesque hendrerit nulla rutrum luctus rutrum. Fusce hendrerit fermentum nunc at posuere." - ], + ["Vivamus tincidunt feugiat tellus ac bibendum. In rhoncus dignissim suscipit."], + ["Pellentesque hendrerit nulla rutrum luctus rutrum. Fusce hendrerit fermentum nunc at posuere."], ] for n in ("fts3", "fts4"): - result = conn.executemany("INSERT INTO {0} VALUES(?)".format(n), values) + result = conn.executemany(f"INSERT INTO {n} VALUES(?)", values) assert result.rowcount == len(values) conn.create_function("bm25", 2, ranking.bm25) @@ -67,12 +60,7 @@ def db(): def testSimple(db): - sql = ( - "SELECT content, rank(matchinfo(fts3, 'pcx')) AS rank " - "FROM fts3 " - "WHERE fts3 MATCH :query " - "ORDER BY rank" - ) + sql = "SELECT content, rank(matchinfo(fts3, 'pcx')) AS rank FROM fts3 WHERE fts3 MATCH :query ORDER BY rank" actual = [dict(x) for x in db.execute(sql, {"query": "thing"})] assert 2 == len(actual) @@ -85,12 +73,7 @@ def testSimple(db): def testBm25(db): - sql = ( - "SELECT content, bm25(matchinfo(fts4, 'pcnalx'), 1) AS rank " - "FROM fts4 " - "WHERE fts4 MATCH :query " - "ORDER BY rank" - ) + sql = "SELECT content, bm25(matchinfo(fts4, 'pcnalx'), 1) AS rank FROM fts4 WHERE fts4 MATCH :query ORDER BY rank" actual = [dict(x) for x in db.execute(sql, {"query": "thing"})] assert 2 == len(actual) diff --git a/tests/test_tinysegmenter.py b/tests/test_tinysegmenter.py index 9602ead..0946bb9 100644 --- a/tests/test_tinysegmenter.py +++ b/tests/test_tinysegmenter.py @@ -1,5 +1,3 @@ -# coding: utf-8 -from __future__ import print_function, unicode_literals import pytest @@ -9,6 +7,7 @@ tinysegmenter = pytest.importorskip("tinysegmenter") ts = tinysegmenter.TinySegmenter() + class TinySegmenterTokenizer(fts.Tokenizer): def __init__(self, path=None): pass diff --git a/tox.ini b/tox.ini index 75ebf63..b19032f 100644 --- a/tox.ini +++ b/tox.ini @@ -23,11 +23,11 @@ platform = deps = pytest igo-python - py{310,311,312,313},pypy3: janome + janome tinysegmenter faker - py{310,311,312,313,314,314t}-linux,pypy3-linux: mecab - py{310,311,312,313,314,314t}-linux,pypy3-linux: natto-py + linux: mecab + linux: natto-py commands= py.test -svrx diff --git a/uv.lock b/uv.lock index 72b5dea..3a8205d 100644 --- a/uv.lock +++ b/uv.lock @@ -1,182 +1,21 @@ version = 1 revision = 3 -requires-python = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, !=3.5, !=3.6, !=3.7, !=3.8" +requires-python = ">=3.10, <4" resolution-markers = [ "python_full_version >= '3.14' and platform_python_implementation != 'PyPy'", "python_full_version >= '3.14' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.9' and python_full_version < '3.12' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.9' and python_full_version < '3.12' and platform_python_implementation == 'PyPy'", - "python_full_version == '3.8.*' and platform_python_implementation != 'PyPy'", - "python_full_version < '3.8' and platform_python_implementation != 'PyPy'", - "python_full_version < '3.9' and platform_python_implementation == 'PyPy'", -] - -[[package]] -name = "cffi" -version = "1.15.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.8' and platform_python_implementation != 'PyPy'", -] -dependencies = [ - { name = "pycparser", version = "2.21", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8' and platform_python_implementation != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2b/a8/050ab4f0c3d4c1b8aaa805f70e26e84d0e27004907c5b8ecc1d31815f92a/cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9", size = 508501, upload-time = "2022-06-30T18:18:32.799Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/ff/c4b7a358526f231efa46a375c959506c87622fb4a2c5726e827c55e6adf2/cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21", size = 179233, upload-time = "2022-06-30T18:15:31.105Z" }, - { url = "https://files.pythonhosted.org/packages/ea/be/c4ad40ad441ac847b67c7a37284ae3c58f39f3e638c6b0f85fb662233825/cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185", size = 174280, upload-time = "2022-06-30T18:15:34.397Z" }, - { url = "https://files.pythonhosted.org/packages/ed/a3/c5f01988ddb70a187c3e6112152e01696188c9f8a4fa4c68aa330adbb179/cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd", size = 421712, upload-time = "2022-06-30T18:15:37.367Z" }, - { url = "https://files.pythonhosted.org/packages/ef/41/19da352d341963d29a33bdb28433ba94c05672fb16155f794fad3fd907b0/cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc", size = 449886, upload-time = "2022-06-30T18:15:40.823Z" }, - { url = "https://files.pythonhosted.org/packages/af/da/9441d56d7dd19d07dcc40a2a5031a1f51c82a27cee3705edf53dadcac398/cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f", size = 450520, upload-time = "2022-06-30T18:15:43.967Z" }, - { url = "https://files.pythonhosted.org/packages/aa/02/ab15b3aa572759df752491d5fa0f74128cd14e002e8e3257c1ab1587810b/cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e", size = 446015, upload-time = "2022-06-30T18:15:46.905Z" }, - { url = "https://files.pythonhosted.org/packages/88/89/c34caf63029fb7628ec2ebd5c88ae0c9bd17db98c812e4065a4d020ca41f/cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4", size = 441830, upload-time = "2022-06-30T18:15:50.622Z" }, - { url = "https://files.pythonhosted.org/packages/32/bd/d0809593f7976828f06a492716fbcbbfb62798bbf60ea1f65200b8d49901/cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01", size = 434743, upload-time = "2022-06-30T18:15:53.952Z" }, - { url = "https://files.pythonhosted.org/packages/0e/65/0d7b5dad821ced4dcd43f96a362905a68ce71e6b5f5cfd2fada867840582/cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e", size = 464113, upload-time = "2022-06-30T18:15:57.459Z" }, - { url = "https://files.pythonhosted.org/packages/9f/52/1e2b43cfdd7d9a39f48bc89fcaee8d8685b1295e205a4f1044909ac14d89/cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2", size = 170412, upload-time = "2022-06-30T18:16:00.728Z" }, - { url = "https://files.pythonhosted.org/packages/0e/e2/a23af3d81838c577571da4ff01b799b0c2bbde24bd924d97e228febae810/cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d", size = 179060, upload-time = "2022-06-30T18:16:03.511Z" }, - { url = "https://files.pythonhosted.org/packages/23/8b/2e8c2469eaf89f7273ac685164949a7e644cdfe5daf1c036564208c3d26b/cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac", size = 179198, upload-time = "2022-06-30T18:16:06.056Z" }, - { url = "https://files.pythonhosted.org/packages/f9/96/fc9e118c47b7adc45a0676f413b4a47554e5f3b6c99b8607ec9726466ef1/cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83", size = 174221, upload-time = "2022-06-30T18:16:09.137Z" }, - { url = "https://files.pythonhosted.org/packages/10/72/617ee266192223a38b67149c830bd9376b69cf3551e1477abc72ff23ef8e/cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9", size = 441694, upload-time = "2022-06-30T18:16:12.057Z" }, - { url = "https://files.pythonhosted.org/packages/91/bc/b7723c2fe7a22eee71d7edf2102cd43423d5f95ff3932ebaa2f82c7ec8d0/cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c", size = 470613, upload-time = "2022-06-30T18:16:15.3Z" }, - { url = "https://files.pythonhosted.org/packages/5d/4e/4e0bb5579b01fdbfd4388bd1eb9394a989e1336203a4b7f700d887b233c1/cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325", size = 472199, upload-time = "2022-06-30T18:16:18.027Z" }, - { url = "https://files.pythonhosted.org/packages/37/5a/c37631a86be838bdd84cc0259130942bf7e6e32f70f4cab95f479847fb91/cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c", size = 462588, upload-time = "2022-06-30T18:16:21.148Z" }, - { url = "https://files.pythonhosted.org/packages/71/d7/0fe0d91b0bbf610fb7254bb164fa8931596e660d62e90fb6289b7ee27b09/cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef", size = 450543, upload-time = "2022-06-30T18:16:24.497Z" }, - { url = "https://files.pythonhosted.org/packages/d3/56/3e94aa719ae96eeda8b68b3ec6e347e0a23168c6841dc276ccdcdadc9f32/cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8", size = 474253, upload-time = "2022-06-30T18:16:27.156Z" }, - { url = "https://files.pythonhosted.org/packages/87/ee/ddc23981fc0f5e7b5356e98884226bcb899f95ebaefc3e8e8b8742dd7e22/cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d", size = 170313, upload-time = "2022-06-30T18:16:29.939Z" }, - { url = "https://files.pythonhosted.org/packages/43/a0/cc7370ef72b6ee586369bacd3961089ab3d94ae712febf07a244f1448ffd/cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104", size = 179001, upload-time = "2022-06-30T18:16:34.521Z" }, - { url = "https://files.pythonhosted.org/packages/7c/3e/5d823e5bbe00285e479034bcad44177b7353ec9fdcd7795baac5ccf82950/cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7", size = 178921, upload-time = "2022-06-30T18:16:37.701Z" }, - { url = "https://files.pythonhosted.org/packages/b5/80/ce5ba093c2475a73df530f643a61e2969a53366e372b24a32f08cd10172b/cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6", size = 434577, upload-time = "2022-06-30T18:16:41.299Z" }, - { url = "https://files.pythonhosted.org/packages/47/51/3049834f07cd89aceef27f9c56f5394ca6725ae6a15cff5fbdb2f06a24ad/cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d", size = 434474, upload-time = "2022-06-30T18:16:44.681Z" }, - { url = "https://files.pythonhosted.org/packages/b3/b8/89509b6357ded0cbacc4e430b21a4ea2c82c2cdeb4391c148b7c7b213bed/cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a", size = 429057, upload-time = "2022-06-30T18:16:47.455Z" }, - { url = "https://files.pythonhosted.org/packages/03/7b/259d6e01a6083acef9d3c8c88990c97d313632bb28fa84d6ab2bb201140a/cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405", size = 379662, upload-time = "2022-06-30T18:16:50.255Z" }, - { url = "https://files.pythonhosted.org/packages/3a/12/d6066828014b9ccb2bbb8e1d9dc28872d20669b65aeb4a86806a0757813f/cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e", size = 402952, upload-time = "2022-06-30T18:16:52.909Z" }, - { url = "https://files.pythonhosted.org/packages/5d/6f/3a2e167113eabd46ed300ff3a6a1e9277a3ad8b020c4c682f83e9326fcf7/cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf", size = 174687, upload-time = "2022-06-30T18:16:55.741Z" }, - { url = "https://files.pythonhosted.org/packages/69/bf/335f8d95510b1a26d7c5220164dc739293a71d5540ecd54a2f66bac3ecb8/cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497", size = 187274, upload-time = "2022-06-30T18:16:58.59Z" }, - { url = "https://files.pythonhosted.org/packages/b5/7d/df6c088ef30e78a78b0c9cca6b904d5abb698afb5bc8f5191d529d83d667/cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375", size = 178906, upload-time = "2022-06-30T18:17:02.029Z" }, - { url = "https://files.pythonhosted.org/packages/c2/0b/3b09a755ddb977c167e6d209a7536f6ade43bb0654bad42e08df1406b8e4/cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e", size = 405992, upload-time = "2022-06-30T18:17:05.658Z" }, - { url = "https://files.pythonhosted.org/packages/5b/1a/e1ee5bed11d8b6540c05a8e3c32448832d775364d4461dd6497374533401/cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82", size = 435560, upload-time = "2022-06-30T18:17:08.894Z" }, - { url = "https://files.pythonhosted.org/packages/d3/e1/e55ca2e0dd446caa2cc8f73c2b98879c04a1f4064ac529e1836683ca58b8/cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b", size = 435478, upload-time = "2022-06-30T18:17:11.637Z" }, - { url = "https://files.pythonhosted.org/packages/2e/7a/68c35c151e5b7a12650ecc12fdfb85211aa1da43e9924598451c4a0a3839/cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c", size = 430395, upload-time = "2022-06-30T18:17:14.378Z" }, - { url = "https://files.pythonhosted.org/packages/93/d0/2e2b27ea2f69b0ec9e481647822f8f77f5fc23faca2dd00d1ff009940eb7/cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426", size = 427911, upload-time = "2022-06-30T18:17:17.178Z" }, - { url = "https://files.pythonhosted.org/packages/50/34/4cc590ad600869502c9838b4824982c122179089ed6791a8b1c95f0ff55e/cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9", size = 169721, upload-time = "2022-06-30T18:17:20.322Z" }, - { url = "https://files.pythonhosted.org/packages/32/2a/63cb8c07d151de92ff9d897b2eb27ba6a0e78dda8e4c5f70d7b8c16cd6a2/cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045", size = 179301, upload-time = "2022-06-30T18:17:25.797Z" }, - { url = "https://files.pythonhosted.org/packages/87/4b/64e8bd9d15d6b22b6cb11997094fbe61edf453ea0a97c8675cb7d1c3f06f/cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3", size = 178940, upload-time = "2022-06-30T18:17:29.329Z" }, - { url = "https://files.pythonhosted.org/packages/22/c6/df826563f55f7e9dd9a1d3617866282afa969fe0d57decffa1911f416ed8/cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a", size = 421947, upload-time = "2022-06-30T18:17:33.099Z" }, - { url = "https://files.pythonhosted.org/packages/c1/25/16a082701378170559bb1d0e9ef2d293cece8dc62913d79351beb34c5ddf/cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5", size = 449906, upload-time = "2022-06-30T18:17:36.107Z" }, - { url = "https://files.pythonhosted.org/packages/df/02/aef53d4aa43154b829e9707c8c60bab413cd21819c4a36b0d7aaa83e2a61/cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca", size = 451028, upload-time = "2022-06-30T18:17:39.675Z" }, - { url = "https://files.pythonhosted.org/packages/79/4b/33494eb0adbcd884656c48f6db0c98ad8a5c678fb8fb5ed41ab546b04d8c/cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02", size = 446520, upload-time = "2022-06-30T18:17:44.577Z" }, - { url = "https://files.pythonhosted.org/packages/b7/8b/06f30caa03b5b3ac006de4f93478dbd0239e2a16566d81a106c322dc4f79/cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192", size = 442655, upload-time = "2022-06-30T18:17:48.199Z" }, - { url = "https://files.pythonhosted.org/packages/47/97/137f0e3d2304df2060abb872a5830af809d7559a5a4b6a295afb02728e65/cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314", size = 170236, upload-time = "2022-06-30T18:17:51.708Z" }, - { url = "https://files.pythonhosted.org/packages/c9/e3/0a52838832408cfbbf3a59cb19bcd17e64eb33795c9710ca7d29ae10b5b7/cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5", size = 178835, upload-time = "2022-06-30T18:17:54.561Z" }, - { url = "https://files.pythonhosted.org/packages/18/8f/5ff70c7458d61fa8a9752e5ee9c9984c601b0060aae0c619316a1e1f1ee5/cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585", size = 179249, upload-time = "2022-06-30T18:17:57.374Z" }, - { url = "https://files.pythonhosted.org/packages/3a/75/a162315adeaf47e94a3b7f886a8e31d77b9e525a387eef2d6f0efc96a7c8/cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0", size = 174297, upload-time = "2022-06-30T18:18:00.012Z" }, - { url = "https://files.pythonhosted.org/packages/85/1f/a3c533f8d377da5ca7edb4f580cc3edc1edbebc45fac8bb3ae60f1176629/cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415", size = 420641, upload-time = "2022-06-30T18:18:03.635Z" }, - { url = "https://files.pythonhosted.org/packages/77/b7/d3618d612be01e184033eab90006f8ca5b5edafd17bf247439ea4e167d8a/cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d", size = 448814, upload-time = "2022-06-30T18:18:07.53Z" }, - { url = "https://files.pythonhosted.org/packages/a9/ba/e082df21ebaa9cb29f2c4e1d7e49a29b90fcd667d43632c6674a16d65382/cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984", size = 449647, upload-time = "2022-06-30T18:18:11.38Z" }, - { url = "https://files.pythonhosted.org/packages/af/cb/53b7bba75a18372d57113ba934b27d0734206c283c1dfcc172347fbd9f76/cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35", size = 445191, upload-time = "2022-06-30T18:18:14.46Z" }, - { url = "https://files.pythonhosted.org/packages/2d/86/3ca57cddfa0419f6a95d1c8478f8f622ba597e3581fd501bbb915b20eb75/cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", size = 441236, upload-time = "2022-06-30T18:18:17.433Z" }, - { url = "https://files.pythonhosted.org/packages/ad/26/7b3a73ab7d82a64664c7c4ea470e4ec4a3c73bb4f02575c543a41e272de5/cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76", size = 433865, upload-time = "2022-06-30T18:18:20.607Z" }, - { url = "https://files.pythonhosted.org/packages/da/ff/ab939e2c7b3f40d851c0f7192c876f1910f3442080c9c846532993ec3cef/cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3", size = 463090, upload-time = "2022-06-30T18:18:23.592Z" }, - { url = "https://files.pythonhosted.org/packages/c6/3d/dd085bb831b22ce4d0b7ba8550e6d78960f02f770bbd1314fea3580727f8/cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee", size = 170382, upload-time = "2022-06-30T18:18:26.229Z" }, - { url = "https://files.pythonhosted.org/packages/a8/16/06b84a7063a4c0a2b081030fdd976022086da9c14e80a9ed4ba0183a98a9/cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c", size = 179079, upload-time = "2022-06-30T18:18:29.006Z" }, -] - -[[package]] -name = "cffi" -version = "1.17.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.8.*' and platform_python_implementation != 'PyPy'", -] -dependencies = [ - { name = "pycparser", version = "2.22", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*' and platform_python_implementation != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621, upload-time = "2024-09-04T20:45:21.852Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191, upload-time = "2024-09-04T20:43:30.027Z" }, - { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592, upload-time = "2024-09-04T20:43:32.108Z" }, - { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024, upload-time = "2024-09-04T20:43:34.186Z" }, - { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188, upload-time = "2024-09-04T20:43:36.286Z" }, - { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571, upload-time = "2024-09-04T20:43:38.586Z" }, - { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687, upload-time = "2024-09-04T20:43:40.084Z" }, - { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211, upload-time = "2024-09-04T20:43:41.526Z" }, - { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325, upload-time = "2024-09-04T20:43:43.117Z" }, - { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784, upload-time = "2024-09-04T20:43:45.256Z" }, - { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564, upload-time = "2024-09-04T20:43:46.779Z" }, - { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804, upload-time = "2024-09-04T20:43:48.186Z" }, - { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299, upload-time = "2024-09-04T20:43:49.812Z" }, - { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264, upload-time = "2024-09-04T20:43:51.124Z" }, - { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651, upload-time = "2024-09-04T20:43:52.872Z" }, - { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259, upload-time = "2024-09-04T20:43:56.123Z" }, - { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200, upload-time = "2024-09-04T20:43:57.891Z" }, - { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235, upload-time = "2024-09-04T20:44:00.18Z" }, - { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721, upload-time = "2024-09-04T20:44:01.585Z" }, - { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242, upload-time = "2024-09-04T20:44:03.467Z" }, - { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999, upload-time = "2024-09-04T20:44:05.023Z" }, - { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242, upload-time = "2024-09-04T20:44:06.444Z" }, - { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604, upload-time = "2024-09-04T20:44:08.206Z" }, - { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727, upload-time = "2024-09-04T20:44:09.481Z" }, - { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400, upload-time = "2024-09-04T20:44:10.873Z" }, - { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178, upload-time = "2024-09-04T20:44:12.232Z" }, - { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840, upload-time = "2024-09-04T20:44:13.739Z" }, - { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803, upload-time = "2024-09-04T20:44:15.231Z" }, - { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850, upload-time = "2024-09-04T20:44:17.188Z" }, - { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729, upload-time = "2024-09-04T20:44:18.688Z" }, - { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256, upload-time = "2024-09-04T20:44:20.248Z" }, - { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424, upload-time = "2024-09-04T20:44:21.673Z" }, - { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568, upload-time = "2024-09-04T20:44:23.245Z" }, - { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736, upload-time = "2024-09-04T20:44:24.757Z" }, - { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448, upload-time = "2024-09-04T20:44:26.208Z" }, - { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976, upload-time = "2024-09-04T20:44:27.578Z" }, - { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989, upload-time = "2024-09-04T20:44:28.956Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802, upload-time = "2024-09-04T20:44:30.289Z" }, - { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792, upload-time = "2024-09-04T20:44:32.01Z" }, - { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893, upload-time = "2024-09-04T20:44:33.606Z" }, - { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810, upload-time = "2024-09-04T20:44:35.191Z" }, - { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200, upload-time = "2024-09-04T20:44:36.743Z" }, - { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447, upload-time = "2024-09-04T20:44:38.492Z" }, - { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358, upload-time = "2024-09-04T20:44:40.046Z" }, - { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469, upload-time = "2024-09-04T20:44:41.616Z" }, - { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475, upload-time = "2024-09-04T20:44:43.733Z" }, - { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload-time = "2024-09-04T20:44:45.309Z" }, - { url = "https://files.pythonhosted.org/packages/48/08/15bf6b43ae9bd06f6b00ad8a91f5a8fe1069d4c9fab550a866755402724e/cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b", size = 182457, upload-time = "2024-09-04T20:44:47.892Z" }, - { url = "https://files.pythonhosted.org/packages/c2/5b/f1523dd545f92f7df468e5f653ffa4df30ac222f3c884e51e139878f1cb5/cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964", size = 425932, upload-time = "2024-09-04T20:44:49.491Z" }, - { url = "https://files.pythonhosted.org/packages/53/93/7e547ab4105969cc8c93b38a667b82a835dd2cc78f3a7dad6130cfd41e1d/cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9", size = 448585, upload-time = "2024-09-04T20:44:51.671Z" }, - { url = "https://files.pythonhosted.org/packages/56/c4/a308f2c332006206bb511de219efeff090e9d63529ba0a77aae72e82248b/cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc", size = 456268, upload-time = "2024-09-04T20:44:53.51Z" }, - { url = "https://files.pythonhosted.org/packages/ca/5b/b63681518265f2f4060d2b60755c1c77ec89e5e045fc3773b72735ddaad5/cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c", size = 436592, upload-time = "2024-09-04T20:44:55.085Z" }, - { url = "https://files.pythonhosted.org/packages/bb/19/b51af9f4a4faa4a8ac5a0e5d5c2522dcd9703d07fac69da34a36c4d960d3/cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1", size = 446512, upload-time = "2024-09-04T20:44:57.135Z" }, - { url = "https://files.pythonhosted.org/packages/e2/63/2bed8323890cb613bbecda807688a31ed11a7fe7afe31f8faaae0206a9a3/cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8", size = 171576, upload-time = "2024-09-04T20:44:58.535Z" }, - { url = "https://files.pythonhosted.org/packages/2f/70/80c33b044ebc79527447fd4fbc5455d514c3bb840dede4455de97da39b4d/cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1", size = 181229, upload-time = "2024-09-04T20:44:59.963Z" }, - { url = "https://files.pythonhosted.org/packages/b9/ea/8bb50596b8ffbc49ddd7a1ad305035daa770202a6b782fc164647c2673ad/cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16", size = 182220, upload-time = "2024-09-04T20:45:01.577Z" }, - { url = "https://files.pythonhosted.org/packages/ae/11/e77c8cd24f58285a82c23af484cf5b124a376b32644e445960d1a4654c3a/cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36", size = 178605, upload-time = "2024-09-04T20:45:03.837Z" }, - { url = "https://files.pythonhosted.org/packages/ed/65/25a8dc32c53bf5b7b6c2686b42ae2ad58743f7ff644844af7cdb29b49361/cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8", size = 424910, upload-time = "2024-09-04T20:45:05.315Z" }, - { url = "https://files.pythonhosted.org/packages/42/7a/9d086fab7c66bd7c4d0f27c57a1b6b068ced810afc498cc8c49e0088661c/cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576", size = 447200, upload-time = "2024-09-04T20:45:06.903Z" }, - { url = "https://files.pythonhosted.org/packages/da/63/1785ced118ce92a993b0ec9e0d0ac8dc3e5dbfbcaa81135be56c69cabbb6/cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", size = 454565, upload-time = "2024-09-04T20:45:08.975Z" }, - { url = "https://files.pythonhosted.org/packages/74/06/90b8a44abf3556599cdec107f7290277ae8901a58f75e6fe8f970cd72418/cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0", size = 435635, upload-time = "2024-09-04T20:45:10.64Z" }, - { url = "https://files.pythonhosted.org/packages/bd/62/a1f468e5708a70b1d86ead5bab5520861d9c7eacce4a885ded9faa7729c3/cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3", size = 445218, upload-time = "2024-09-04T20:45:12.366Z" }, - { url = "https://files.pythonhosted.org/packages/5b/95/b34462f3ccb09c2594aa782d90a90b045de4ff1f70148ee79c69d37a0a5a/cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595", size = 460486, upload-time = "2024-09-04T20:45:13.935Z" }, - { url = "https://files.pythonhosted.org/packages/fc/fc/a1e4bebd8d680febd29cf6c8a40067182b64f00c7d105f8f26b5bc54317b/cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a", size = 437911, upload-time = "2024-09-04T20:45:15.696Z" }, - { url = "https://files.pythonhosted.org/packages/e6/c3/21cab7a6154b6a5ea330ae80de386e7665254835b9e98ecc1340b3a7de9a/cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e", size = 460632, upload-time = "2024-09-04T20:45:17.284Z" }, - { url = "https://files.pythonhosted.org/packages/cb/b5/fd9f8b5a84010ca169ee49f4e4ad6f8c05f4e3545b72ee041dbbcb159882/cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7", size = 171820, upload-time = "2024-09-04T20:45:18.762Z" }, - { url = "https://files.pythonhosted.org/packages/8c/52/b08750ce0bce45c143e1b5d7357ee8c55341b52bdef4b0f081af1eb248c2/cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662", size = 181290, upload-time = "2024-09-04T20:45:20.226Z" }, + "python_full_version == '3.13.*' and platform_python_implementation != 'PyPy'", + "python_full_version < '3.13' and platform_python_implementation != 'PyPy'", + "python_full_version == '3.13.*' and platform_python_implementation == 'PyPy'", + "python_full_version < '3.13' and platform_python_implementation == 'PyPy'", ] [[package]] name = "cffi" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.14' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.9' and python_full_version < '3.12' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.9' and python_full_version < '3.12' and platform_python_implementation == 'PyPy'", -] dependencies = [ - { name = "pycparser", version = "2.22", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and implementation_name != 'PyPy'" }, + { name = "pycparser", marker = "(python_full_version >= '3.14' and implementation_name != 'PyPy') or (implementation_name != 'PyPy' and platform_python_implementation != 'PyPy')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } wheels = [ @@ -251,18 +90,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, - { url = "https://files.pythonhosted.org/packages/c0/cc/08ed5a43f2996a16b462f64a7055c6e962803534924b9b2f1371d8c00b7b/cffi-2.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf", size = 184288, upload-time = "2025-09-08T23:23:48.404Z" }, - { url = "https://files.pythonhosted.org/packages/3d/de/38d9726324e127f727b4ecc376bc85e505bfe61ef130eaf3f290c6847dd4/cffi-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7", size = 180509, upload-time = "2025-09-08T23:23:49.73Z" }, - { url = "https://files.pythonhosted.org/packages/9b/13/c92e36358fbcc39cf0962e83223c9522154ee8630e1df7c0b3a39a8124e2/cffi-2.0.0-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c", size = 208813, upload-time = "2025-09-08T23:23:51.263Z" }, - { url = "https://files.pythonhosted.org/packages/15/12/a7a79bd0df4c3bff744b2d7e52cc1b68d5e7e427b384252c42366dc1ecbc/cffi-2.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165", size = 216498, upload-time = "2025-09-08T23:23:52.494Z" }, - { url = "https://files.pythonhosted.org/packages/a3/ad/5c51c1c7600bdd7ed9a24a203ec255dccdd0ebf4527f7b922a0bde2fb6ed/cffi-2.0.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534", size = 203243, upload-time = "2025-09-08T23:23:53.836Z" }, - { url = "https://files.pythonhosted.org/packages/32/f2/81b63e288295928739d715d00952c8c6034cb6c6a516b17d37e0c8be5600/cffi-2.0.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f", size = 203158, upload-time = "2025-09-08T23:23:55.169Z" }, - { url = "https://files.pythonhosted.org/packages/1f/74/cc4096ce66f5939042ae094e2e96f53426a979864aa1f96a621ad128be27/cffi-2.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63", size = 216548, upload-time = "2025-09-08T23:23:56.506Z" }, - { url = "https://files.pythonhosted.org/packages/e8/be/f6424d1dc46b1091ffcc8964fa7c0ab0cd36839dd2761b49c90481a6ba1b/cffi-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2", size = 218897, upload-time = "2025-09-08T23:23:57.825Z" }, - { url = "https://files.pythonhosted.org/packages/f7/e0/dda537c2309817edf60109e39265f24f24aa7f050767e22c98c53fe7f48b/cffi-2.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65", size = 211249, upload-time = "2025-09-08T23:23:59.139Z" }, - { url = "https://files.pythonhosted.org/packages/2b/e7/7c769804eb75e4c4b35e658dba01de1640a351a9653c3d49ca89d16ccc91/cffi-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322", size = 218041, upload-time = "2025-09-08T23:24:00.496Z" }, - { url = "https://files.pythonhosted.org/packages/aa/d9/6218d78f920dcd7507fc16a766b5ef8f3b913cc7aa938e7fc80b9978d089/cffi-2.0.0-cp39-cp39-win32.whl", hash = "sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a", size = 172138, upload-time = "2025-09-08T23:24:01.7Z" }, - { url = "https://files.pythonhosted.org/packages/54/8f/a1e836f82d8e32a97e6b29cc8f641779181ac7363734f12df27db803ebda/cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9", size = 182794, upload-time = "2025-09-08T23:24:02.943Z" }, ] [[package]] @@ -276,73 +103,153 @@ wheels = [ [[package]] name = "faker" -version = "37.6.0" +version = "40.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "tzdata", marker = "python_full_version >= '3.12'" }, + { name = "tzdata", marker = "python_full_version >= '3.13' and sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/24/cd/f7679c20f07d9e2013123b7f7e13809a3450a18d938d58e86081a486ea15/faker-37.6.0.tar.gz", hash = "sha256:0f8cc34f30095184adf87c3c24c45b38b33ad81c35ef6eb0a3118f301143012c", size = 1907960, upload-time = "2025-08-26T15:56:27.419Z" } +sdist = { url = "https://files.pythonhosted.org/packages/70/03/14428edc541467c460d363f6e94bee9acc271f3e62470630fc9a647d0cf2/faker-40.8.0.tar.gz", hash = "sha256:936a3c9be6c004433f20aa4d99095df5dec82b8c7ad07459756041f8c1728875", size = 1956493, upload-time = "2026-03-04T16:18:48.161Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/7d/8b50e4ac772719777be33661f4bde320793400a706f5eb214e4de46f093c/faker-37.6.0-py3-none-any.whl", hash = "sha256:3c5209b23d7049d596a51db5d76403a0ccfea6fc294ffa2ecfef6a8843b1e6a7", size = 1949837, upload-time = "2025-08-26T15:56:25.33Z" }, + { url = "https://files.pythonhosted.org/packages/4c/3b/c6348f1e285e75b069085b18110a4e6325b763a5d35d5e204356fc7c20b3/faker-40.8.0-py3-none-any.whl", hash = "sha256:eb21bdba18f7a8375382eb94fb436fce07046893dc94cb20817d28deb0c3d579", size = 1989124, upload-time = "2026-03-04T16:18:46.45Z" }, ] [[package]] name = "iniconfig" -version = "2.1.0" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "librt" +version = "0.8.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } +sdist = { url = "https://files.pythonhosted.org/packages/56/9c/b4b0c54d84da4a94b37bd44151e46d5e583c9534c7e02250b961b1b6d8a8/librt-0.8.1.tar.gz", hash = "sha256:be46a14693955b3bd96014ccbdb8339ee8c9346fbe11c1b78901b55125f14c73", size = 177471, upload-time = "2026-02-17T16:13:06.101Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, + { url = "https://files.pythonhosted.org/packages/7c/5f/63f5fa395c7a8a93558c0904ba8f1c8d1b997ca6a3de61bc7659970d66bf/librt-0.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:81fd938344fecb9373ba1b155968c8a329491d2ce38e7ddb76f30ffb938f12dc", size = 65697, upload-time = "2026-02-17T16:11:06.903Z" }, + { url = "https://files.pythonhosted.org/packages/ff/e0/0472cf37267b5920eff2f292ccfaede1886288ce35b7f3203d8de00abfe6/librt-0.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5db05697c82b3a2ec53f6e72b2ed373132b0c2e05135f0696784e97d7f5d48e7", size = 68376, upload-time = "2026-02-17T16:11:08.395Z" }, + { url = "https://files.pythonhosted.org/packages/c8/be/8bd1359fdcd27ab897cd5963294fa4a7c83b20a8564678e4fd12157e56a5/librt-0.8.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d56bc4011975f7460bea7b33e1ff425d2f1adf419935ff6707273c77f8a4ada6", size = 197084, upload-time = "2026-02-17T16:11:09.774Z" }, + { url = "https://files.pythonhosted.org/packages/e2/fe/163e33fdd091d0c2b102f8a60cc0a61fd730ad44e32617cd161e7cd67a01/librt-0.8.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdc0f588ff4b663ea96c26d2a230c525c6fc62b28314edaaaca8ed5af931ad0", size = 207337, upload-time = "2026-02-17T16:11:11.311Z" }, + { url = "https://files.pythonhosted.org/packages/01/99/f85130582f05dcf0c8902f3d629270231d2f4afdfc567f8305a952ac7f14/librt-0.8.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:97c2b54ff6717a7a563b72627990bec60d8029df17df423f0ed37d56a17a176b", size = 219980, upload-time = "2026-02-17T16:11:12.499Z" }, + { url = "https://files.pythonhosted.org/packages/6f/54/cb5e4d03659e043a26c74e08206412ac9a3742f0477d96f9761a55313b5f/librt-0.8.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8f1125e6bbf2f1657d9a2f3ccc4a2c9b0c8b176965bb565dd4d86be67eddb4b6", size = 212921, upload-time = "2026-02-17T16:11:14.484Z" }, + { url = "https://files.pythonhosted.org/packages/b1/81/a3a01e4240579c30f3487f6fed01eb4bc8ef0616da5b4ebac27ca19775f3/librt-0.8.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8f4bb453f408137d7581be309b2fbc6868a80e7ef60c88e689078ee3a296ae71", size = 221381, upload-time = "2026-02-17T16:11:17.459Z" }, + { url = "https://files.pythonhosted.org/packages/08/b0/fc2d54b4b1c6fb81e77288ff31ff25a2c1e62eaef4424a984f228839717b/librt-0.8.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c336d61d2fe74a3195edc1646d53ff1cddd3a9600b09fa6ab75e5514ba4862a7", size = 216714, upload-time = "2026-02-17T16:11:19.197Z" }, + { url = "https://files.pythonhosted.org/packages/96/96/85daa73ffbd87e1fb287d7af6553ada66bf25a2a6b0de4764344a05469f6/librt-0.8.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:eb5656019db7c4deacf0c1a55a898c5bb8f989be904597fcb5232a2f4828fa05", size = 214777, upload-time = "2026-02-17T16:11:20.443Z" }, + { url = "https://files.pythonhosted.org/packages/12/9c/c3aa7a2360383f4bf4f04d98195f2739a579128720c603f4807f006a4225/librt-0.8.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c25d9e338d5bed46c1632f851babf3d13c78f49a225462017cf5e11e845c5891", size = 237398, upload-time = "2026-02-17T16:11:22.083Z" }, + { url = "https://files.pythonhosted.org/packages/61/19/d350ea89e5274665185dabc4bbb9c3536c3411f862881d316c8b8e00eb66/librt-0.8.1-cp310-cp310-win32.whl", hash = "sha256:aaab0e307e344cb28d800957ef3ec16605146ef0e59e059a60a176d19543d1b7", size = 54285, upload-time = "2026-02-17T16:11:23.27Z" }, + { url = "https://files.pythonhosted.org/packages/4f/d6/45d587d3d41c112e9543a0093d883eb57a24a03e41561c127818aa2a6bcc/librt-0.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:56e04c14b696300d47b3bc5f1d10a00e86ae978886d0cee14e5714fafb5df5d2", size = 61352, upload-time = "2026-02-17T16:11:24.207Z" }, + { url = "https://files.pythonhosted.org/packages/1d/01/0e748af5e4fee180cf7cd12bd12b0513ad23b045dccb2a83191bde82d168/librt-0.8.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:681dc2451d6d846794a828c16c22dc452d924e9f700a485b7ecb887a30aad1fd", size = 65315, upload-time = "2026-02-17T16:11:25.152Z" }, + { url = "https://files.pythonhosted.org/packages/9d/4d/7184806efda571887c798d573ca4134c80ac8642dcdd32f12c31b939c595/librt-0.8.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3b4350b13cc0e6f5bec8fa7caf29a8fb8cdc051a3bae45cfbfd7ce64f009965", size = 68021, upload-time = "2026-02-17T16:11:26.129Z" }, + { url = "https://files.pythonhosted.org/packages/ae/88/c3c52d2a5d5101f28d3dc89298444626e7874aa904eed498464c2af17627/librt-0.8.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ac1e7817fd0ed3d14fd7c5df91daed84c48e4c2a11ee99c0547f9f62fdae13da", size = 194500, upload-time = "2026-02-17T16:11:27.177Z" }, + { url = "https://files.pythonhosted.org/packages/d6/5d/6fb0a25b6a8906e85b2c3b87bee1d6ed31510be7605b06772f9374ca5cb3/librt-0.8.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:747328be0c5b7075cde86a0e09d7a9196029800ba75a1689332348e998fb85c0", size = 205622, upload-time = "2026-02-17T16:11:28.242Z" }, + { url = "https://files.pythonhosted.org/packages/b2/a6/8006ae81227105476a45691f5831499e4d936b1c049b0c1feb17c11b02d1/librt-0.8.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0af2bd2bc204fa27f3d6711d0f360e6b8c684a035206257a81673ab924aa11e", size = 218304, upload-time = "2026-02-17T16:11:29.344Z" }, + { url = "https://files.pythonhosted.org/packages/ee/19/60e07886ad16670aae57ef44dada41912c90906a6fe9f2b9abac21374748/librt-0.8.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d480de377f5b687b6b1bc0c0407426da556e2a757633cc7e4d2e1a057aa688f3", size = 211493, upload-time = "2026-02-17T16:11:30.445Z" }, + { url = "https://files.pythonhosted.org/packages/9c/cf/f666c89d0e861d05600438213feeb818c7514d3315bae3648b1fc145d2b6/librt-0.8.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d0ee06b5b5291f609ddb37b9750985b27bc567791bc87c76a569b3feed8481ac", size = 219129, upload-time = "2026-02-17T16:11:32.021Z" }, + { url = "https://files.pythonhosted.org/packages/8f/ef/f1bea01e40b4a879364c031476c82a0dc69ce068daad67ab96302fed2d45/librt-0.8.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9e2c6f77b9ad48ce5603b83b7da9ee3e36b3ab425353f695cba13200c5d96596", size = 213113, upload-time = "2026-02-17T16:11:33.192Z" }, + { url = "https://files.pythonhosted.org/packages/9b/80/cdab544370cc6bc1b72ea369525f547a59e6938ef6863a11ab3cd24759af/librt-0.8.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:439352ba9373f11cb8e1933da194dcc6206daf779ff8df0ed69c5e39113e6a99", size = 212269, upload-time = "2026-02-17T16:11:34.373Z" }, + { url = "https://files.pythonhosted.org/packages/9d/9c/48d6ed8dac595654f15eceab2035131c136d1ae9a1e3548e777bb6dbb95d/librt-0.8.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:82210adabbc331dbb65d7868b105185464ef13f56f7f76688565ad79f648b0fe", size = 234673, upload-time = "2026-02-17T16:11:36.063Z" }, + { url = "https://files.pythonhosted.org/packages/16/01/35b68b1db517f27a01be4467593292eb5315def8900afad29fabf56304ba/librt-0.8.1-cp311-cp311-win32.whl", hash = "sha256:52c224e14614b750c0a6d97368e16804a98c684657c7518752c356834fff83bb", size = 54597, upload-time = "2026-02-17T16:11:37.544Z" }, + { url = "https://files.pythonhosted.org/packages/71/02/796fe8f02822235966693f257bf2c79f40e11337337a657a8cfebba5febc/librt-0.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:c00e5c884f528c9932d278d5c9cbbea38a6b81eb62c02e06ae53751a83a4d52b", size = 61733, upload-time = "2026-02-17T16:11:38.691Z" }, + { url = "https://files.pythonhosted.org/packages/28/ad/232e13d61f879a42a4e7117d65e4984bb28371a34bb6fb9ca54ec2c8f54e/librt-0.8.1-cp311-cp311-win_arm64.whl", hash = "sha256:f7cdf7f26c2286ffb02e46d7bac56c94655540b26347673bea15fa52a6af17e9", size = 52273, upload-time = "2026-02-17T16:11:40.308Z" }, + { url = "https://files.pythonhosted.org/packages/95/21/d39b0a87ac52fc98f621fb6f8060efb017a767ebbbac2f99fbcbc9ddc0d7/librt-0.8.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a28f2612ab566b17f3698b0da021ff9960610301607c9a5e8eaca62f5e1c350a", size = 66516, upload-time = "2026-02-17T16:11:41.604Z" }, + { url = "https://files.pythonhosted.org/packages/69/f1/46375e71441c43e8ae335905e069f1c54febee63a146278bcee8782c84fd/librt-0.8.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:60a78b694c9aee2a0f1aaeaa7d101cf713e92e8423a941d2897f4fa37908dab9", size = 68634, upload-time = "2026-02-17T16:11:43.268Z" }, + { url = "https://files.pythonhosted.org/packages/0a/33/c510de7f93bf1fa19e13423a606d8189a02624a800710f6e6a0a0f0784b3/librt-0.8.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:758509ea3f1eba2a57558e7e98f4659d0ea7670bff49673b0dde18a3c7e6c0eb", size = 198941, upload-time = "2026-02-17T16:11:44.28Z" }, + { url = "https://files.pythonhosted.org/packages/dd/36/e725903416409a533d92398e88ce665476f275081d0d7d42f9c4951999e5/librt-0.8.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:039b9f2c506bd0ab0f8725aa5ba339c6f0cd19d3b514b50d134789809c24285d", size = 209991, upload-time = "2026-02-17T16:11:45.462Z" }, + { url = "https://files.pythonhosted.org/packages/30/7a/8d908a152e1875c9f8eac96c97a480df425e657cdb47854b9efaa4998889/librt-0.8.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bb54f1205a3a6ab41a6fd71dfcdcbd278670d3a90ca502a30d9da583105b6f7", size = 224476, upload-time = "2026-02-17T16:11:46.542Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b8/a22c34f2c485b8903a06f3fe3315341fe6876ef3599792344669db98fcff/librt-0.8.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:05bd41cdee35b0c59c259f870f6da532a2c5ca57db95b5f23689fcb5c9e42440", size = 217518, upload-time = "2026-02-17T16:11:47.746Z" }, + { url = "https://files.pythonhosted.org/packages/79/6f/5c6fea00357e4f82ba44f81dbfb027921f1ab10e320d4a64e1c408d035d9/librt-0.8.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adfab487facf03f0d0857b8710cf82d0704a309d8ffc33b03d9302b4c64e91a9", size = 225116, upload-time = "2026-02-17T16:11:49.298Z" }, + { url = "https://files.pythonhosted.org/packages/f2/a0/95ced4e7b1267fe1e2720a111685bcddf0e781f7e9e0ce59d751c44dcfe5/librt-0.8.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:153188fe98a72f206042be10a2c6026139852805215ed9539186312d50a8e972", size = 217751, upload-time = "2026-02-17T16:11:50.49Z" }, + { url = "https://files.pythonhosted.org/packages/93/c2/0517281cb4d4101c27ab59472924e67f55e375bc46bedae94ac6dc6e1902/librt-0.8.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:dd3c41254ee98604b08bd5b3af5bf0a89740d4ee0711de95b65166bf44091921", size = 218378, upload-time = "2026-02-17T16:11:51.783Z" }, + { url = "https://files.pythonhosted.org/packages/43/e8/37b3ac108e8976888e559a7b227d0ceac03c384cfd3e7a1c2ee248dbae79/librt-0.8.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e0d138c7ae532908cbb342162b2611dbd4d90c941cd25ab82084aaf71d2c0bd0", size = 241199, upload-time = "2026-02-17T16:11:53.561Z" }, + { url = "https://files.pythonhosted.org/packages/4b/5b/35812d041c53967fedf551a39399271bbe4257e681236a2cf1a69c8e7fa1/librt-0.8.1-cp312-cp312-win32.whl", hash = "sha256:43353b943613c5d9c49a25aaffdba46f888ec354e71e3529a00cca3f04d66a7a", size = 54917, upload-time = "2026-02-17T16:11:54.758Z" }, + { url = "https://files.pythonhosted.org/packages/de/d1/fa5d5331b862b9775aaf2a100f5ef86854e5d4407f71bddf102f4421e034/librt-0.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:ff8baf1f8d3f4b6b7257fcb75a501f2a5499d0dda57645baa09d4d0d34b19444", size = 62017, upload-time = "2026-02-17T16:11:55.748Z" }, + { url = "https://files.pythonhosted.org/packages/c7/7c/c614252f9acda59b01a66e2ddfd243ed1c7e1deab0293332dfbccf862808/librt-0.8.1-cp312-cp312-win_arm64.whl", hash = "sha256:0f2ae3725904f7377e11cc37722d5d401e8b3d5851fb9273d7f4fe04f6b3d37d", size = 52441, upload-time = "2026-02-17T16:11:56.801Z" }, + { url = "https://files.pythonhosted.org/packages/c5/3c/f614c8e4eaac7cbf2bbdf9528790b21d89e277ee20d57dc6e559c626105f/librt-0.8.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7e6bad1cd94f6764e1e21950542f818a09316645337fd5ab9a7acc45d99a8f35", size = 66529, upload-time = "2026-02-17T16:11:57.809Z" }, + { url = "https://files.pythonhosted.org/packages/ab/96/5836544a45100ae411eda07d29e3d99448e5258b6e9c8059deb92945f5c2/librt-0.8.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cf450f498c30af55551ba4f66b9123b7185362ec8b625a773b3d39aa1a717583", size = 68669, upload-time = "2026-02-17T16:11:58.843Z" }, + { url = "https://files.pythonhosted.org/packages/06/53/f0b992b57af6d5531bf4677d75c44f095f2366a1741fb695ee462ae04b05/librt-0.8.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:eca45e982fa074090057132e30585a7e8674e9e885d402eae85633e9f449ce6c", size = 199279, upload-time = "2026-02-17T16:11:59.862Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ad/4848cc16e268d14280d8168aee4f31cea92bbd2b79ce33d3e166f2b4e4fc/librt-0.8.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c3811485fccfda840861905b8c70bba5ec094e02825598bb9d4ca3936857a04", size = 210288, upload-time = "2026-02-17T16:12:00.954Z" }, + { url = "https://files.pythonhosted.org/packages/52/05/27fdc2e95de26273d83b96742d8d3b7345f2ea2bdbd2405cc504644f2096/librt-0.8.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e4af413908f77294605e28cfd98063f54b2c790561383971d2f52d113d9c363", size = 224809, upload-time = "2026-02-17T16:12:02.108Z" }, + { url = "https://files.pythonhosted.org/packages/7a/d0/78200a45ba3240cb042bc597d6f2accba9193a2c57d0356268cbbe2d0925/librt-0.8.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5212a5bd7fae98dae95710032902edcd2ec4dc994e883294f75c857b83f9aba0", size = 218075, upload-time = "2026-02-17T16:12:03.631Z" }, + { url = "https://files.pythonhosted.org/packages/af/72/a210839fa74c90474897124c064ffca07f8d4b347b6574d309686aae7ca6/librt-0.8.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e692aa2d1d604e6ca12d35e51fdc36f4cda6345e28e36374579f7ef3611b3012", size = 225486, upload-time = "2026-02-17T16:12:04.725Z" }, + { url = "https://files.pythonhosted.org/packages/a3/c1/a03cc63722339ddbf087485f253493e2b013039f5b707e8e6016141130fa/librt-0.8.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4be2a5c926b9770c9e08e717f05737a269b9d0ebc5d2f0060f0fe3fe9ce47acb", size = 218219, upload-time = "2026-02-17T16:12:05.828Z" }, + { url = "https://files.pythonhosted.org/packages/58/f5/fff6108af0acf941c6f274a946aea0e484bd10cd2dc37610287ce49388c5/librt-0.8.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fd1a720332ea335ceb544cf0a03f81df92abd4bb887679fd1e460976b0e6214b", size = 218750, upload-time = "2026-02-17T16:12:07.09Z" }, + { url = "https://files.pythonhosted.org/packages/71/67/5a387bfef30ec1e4b4f30562c8586566faf87e47d696768c19feb49e3646/librt-0.8.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2af9e01e0ef80d95ae3c720be101227edae5f2fe7e3dc63d8857fadfc5a1d", size = 241624, upload-time = "2026-02-17T16:12:08.43Z" }, + { url = "https://files.pythonhosted.org/packages/d4/be/24f8502db11d405232ac1162eb98069ca49c3306c1d75c6ccc61d9af8789/librt-0.8.1-cp313-cp313-win32.whl", hash = "sha256:086a32dbb71336627e78cc1d6ee305a68d038ef7d4c39aaff41ae8c9aa46e91a", size = 54969, upload-time = "2026-02-17T16:12:09.633Z" }, + { url = "https://files.pythonhosted.org/packages/5c/73/c9fdf6cb2a529c1a092ce769a12d88c8cca991194dfe641b6af12fa964d2/librt-0.8.1-cp313-cp313-win_amd64.whl", hash = "sha256:e11769a1dbda4da7b00a76cfffa67aa47cfa66921d2724539eee4b9ede780b79", size = 62000, upload-time = "2026-02-17T16:12:10.632Z" }, + { url = "https://files.pythonhosted.org/packages/d3/97/68f80ca3ac4924f250cdfa6e20142a803e5e50fca96ef5148c52ee8c10ea/librt-0.8.1-cp313-cp313-win_arm64.whl", hash = "sha256:924817ab3141aca17893386ee13261f1d100d1ef410d70afe4389f2359fea4f0", size = 52495, upload-time = "2026-02-17T16:12:11.633Z" }, + { url = "https://files.pythonhosted.org/packages/c9/6a/907ef6800f7bca71b525a05f1839b21f708c09043b1c6aa77b6b827b3996/librt-0.8.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6cfa7fe54fd4d1f47130017351a959fe5804bda7a0bc7e07a2cdbc3fdd28d34f", size = 66081, upload-time = "2026-02-17T16:12:12.766Z" }, + { url = "https://files.pythonhosted.org/packages/1b/18/25e991cd5640c9fb0f8d91b18797b29066b792f17bf8493da183bf5caabe/librt-0.8.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:228c2409c079f8c11fb2e5d7b277077f694cb93443eb760e00b3b83cb8b3176c", size = 68309, upload-time = "2026-02-17T16:12:13.756Z" }, + { url = "https://files.pythonhosted.org/packages/a4/36/46820d03f058cfb5a9de5940640ba03165ed8aded69e0733c417bb04df34/librt-0.8.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7aae78ab5e3206181780e56912d1b9bb9f90a7249ce12f0e8bf531d0462dd0fc", size = 196804, upload-time = "2026-02-17T16:12:14.818Z" }, + { url = "https://files.pythonhosted.org/packages/59/18/5dd0d3b87b8ff9c061849fbdb347758d1f724b9a82241aa908e0ec54ccd0/librt-0.8.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:172d57ec04346b047ca6af181e1ea4858086c80bdf455f61994c4aa6fc3f866c", size = 206907, upload-time = "2026-02-17T16:12:16.513Z" }, + { url = "https://files.pythonhosted.org/packages/d1/96/ef04902aad1424fd7299b62d1890e803e6ab4018c3044dca5922319c4b97/librt-0.8.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b1977c4ea97ce5eb7755a78fae68d87e4102e4aaf54985e8b56806849cc06a3", size = 221217, upload-time = "2026-02-17T16:12:17.906Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ff/7e01f2dda84a8f5d280637a2e5827210a8acca9a567a54507ef1c75b342d/librt-0.8.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:10c42e1f6fd06733ef65ae7bebce2872bcafd8d6e6b0a08fe0a05a23b044fb14", size = 214622, upload-time = "2026-02-17T16:12:19.108Z" }, + { url = "https://files.pythonhosted.org/packages/1e/8c/5b093d08a13946034fed57619742f790faf77058558b14ca36a6e331161e/librt-0.8.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4c8dfa264b9193c4ee19113c985c95f876fae5e51f731494fc4e0cf594990ba7", size = 221987, upload-time = "2026-02-17T16:12:20.331Z" }, + { url = "https://files.pythonhosted.org/packages/d3/cc/86b0b3b151d40920ad45a94ce0171dec1aebba8a9d72bb3fa00c73ab25dd/librt-0.8.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:01170b6729a438f0dedc4a26ed342e3dc4f02d1000b4b19f980e1877f0c297e6", size = 215132, upload-time = "2026-02-17T16:12:21.54Z" }, + { url = "https://files.pythonhosted.org/packages/fc/be/8588164a46edf1e69858d952654e216a9a91174688eeefb9efbb38a9c799/librt-0.8.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:7b02679a0d783bdae30d443025b94465d8c3dc512f32f5b5031f93f57ac32071", size = 215195, upload-time = "2026-02-17T16:12:23.073Z" }, + { url = "https://files.pythonhosted.org/packages/f5/f2/0b9279bea735c734d69344ecfe056c1ba211694a72df10f568745c899c76/librt-0.8.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:190b109bb69592a3401fe1ffdea41a2e73370ace2ffdc4a0e8e2b39cdea81b78", size = 237946, upload-time = "2026-02-17T16:12:24.275Z" }, + { url = "https://files.pythonhosted.org/packages/e9/cc/5f2a34fbc8aeb35314a3641f9956fa9051a947424652fad9882be7a97949/librt-0.8.1-cp314-cp314-win32.whl", hash = "sha256:e70a57ecf89a0f64c24e37f38d3fe217a58169d2fe6ed6d70554964042474023", size = 50689, upload-time = "2026-02-17T16:12:25.766Z" }, + { url = "https://files.pythonhosted.org/packages/a0/76/cd4d010ab2147339ca2b93e959c3686e964edc6de66ddacc935c325883d7/librt-0.8.1-cp314-cp314-win_amd64.whl", hash = "sha256:7e2f3edca35664499fbb36e4770650c4bd4a08abc1f4458eab9df4ec56389730", size = 57875, upload-time = "2026-02-17T16:12:27.465Z" }, + { url = "https://files.pythonhosted.org/packages/84/0f/2143cb3c3ca48bd3379dcd11817163ca50781927c4537345d608b5045998/librt-0.8.1-cp314-cp314-win_arm64.whl", hash = "sha256:0d2f82168e55ddefd27c01c654ce52379c0750ddc31ee86b4b266bcf4d65f2a3", size = 48058, upload-time = "2026-02-17T16:12:28.556Z" }, + { url = "https://files.pythonhosted.org/packages/d2/0e/9b23a87e37baf00311c3efe6b48d6b6c168c29902dfc3f04c338372fd7db/librt-0.8.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2c74a2da57a094bd48d03fa5d196da83d2815678385d2978657499063709abe1", size = 68313, upload-time = "2026-02-17T16:12:29.659Z" }, + { url = "https://files.pythonhosted.org/packages/db/9a/859c41e5a4f1c84200a7d2b92f586aa27133c8243b6cac9926f6e54d01b9/librt-0.8.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a355d99c4c0d8e5b770313b8b247411ed40949ca44e33e46a4789b9293a907ee", size = 70994, upload-time = "2026-02-17T16:12:31.516Z" }, + { url = "https://files.pythonhosted.org/packages/4c/28/10605366ee599ed34223ac2bf66404c6fb59399f47108215d16d5ad751a8/librt-0.8.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2eb345e8b33fb748227409c9f1233d4df354d6e54091f0e8fc53acdb2ffedeb7", size = 220770, upload-time = "2026-02-17T16:12:33.294Z" }, + { url = "https://files.pythonhosted.org/packages/af/8d/16ed8fd452dafae9c48d17a6bc1ee3e818fd40ef718d149a8eff2c9f4ea2/librt-0.8.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9be2f15e53ce4e83cc08adc29b26fb5978db62ef2a366fbdf716c8a6c8901040", size = 235409, upload-time = "2026-02-17T16:12:35.443Z" }, + { url = "https://files.pythonhosted.org/packages/89/1b/7bdf3e49349c134b25db816e4a3db6b94a47ac69d7d46b1e682c2c4949be/librt-0.8.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:785ae29c1f5c6e7c2cde2c7c0e148147f4503da3abc5d44d482068da5322fd9e", size = 246473, upload-time = "2026-02-17T16:12:36.656Z" }, + { url = "https://files.pythonhosted.org/packages/4e/8a/91fab8e4fd2a24930a17188c7af5380eb27b203d72101c9cc000dbdfd95a/librt-0.8.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1d3a7da44baf692f0c6aeb5b2a09c5e6fc7a703bca9ffa337ddd2e2da53f7732", size = 238866, upload-time = "2026-02-17T16:12:37.849Z" }, + { url = "https://files.pythonhosted.org/packages/b9/e0/c45a098843fc7c07e18a7f8a24ca8496aecbf7bdcd54980c6ca1aaa79a8e/librt-0.8.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5fc48998000cbc39ec0d5311312dda93ecf92b39aaf184c5e817d5d440b29624", size = 250248, upload-time = "2026-02-17T16:12:39.445Z" }, + { url = "https://files.pythonhosted.org/packages/82/30/07627de23036640c952cce0c1fe78972e77d7d2f8fd54fa5ef4554ff4a56/librt-0.8.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e96baa6820280077a78244b2e06e416480ed859bbd8e5d641cf5742919d8beb4", size = 240629, upload-time = "2026-02-17T16:12:40.889Z" }, + { url = "https://files.pythonhosted.org/packages/fb/c1/55bfe1ee3542eba055616f9098eaf6eddb966efb0ca0f44eaa4aba327307/librt-0.8.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:31362dbfe297b23590530007062c32c6f6176f6099646bb2c95ab1b00a57c382", size = 239615, upload-time = "2026-02-17T16:12:42.446Z" }, + { url = "https://files.pythonhosted.org/packages/2b/39/191d3d28abc26c9099b19852e6c99f7f6d400b82fa5a4e80291bd3803e19/librt-0.8.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cc3656283d11540ab0ea01978378e73e10002145117055e03722417aeab30994", size = 263001, upload-time = "2026-02-17T16:12:43.627Z" }, + { url = "https://files.pythonhosted.org/packages/b9/eb/7697f60fbe7042ab4e88f4ee6af496b7f222fffb0a4e3593ef1f29f81652/librt-0.8.1-cp314-cp314t-win32.whl", hash = "sha256:738f08021b3142c2918c03692608baed43bc51144c29e35807682f8070ee2a3a", size = 51328, upload-time = "2026-02-17T16:12:45.148Z" }, + { url = "https://files.pythonhosted.org/packages/7c/72/34bf2eb7a15414a23e5e70ecb9440c1d3179f393d9349338a91e2781c0fb/librt-0.8.1-cp314-cp314t-win_amd64.whl", hash = "sha256:89815a22daf9c51884fb5dbe4f1ef65ee6a146e0b6a8df05f753e2e4a9359bf4", size = 58722, upload-time = "2026-02-17T16:12:46.85Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c8/d148e041732d631fc76036f8b30fae4e77b027a1e95b7a84bb522481a940/librt-0.8.1-cp314-cp314t-win_arm64.whl", hash = "sha256:bf512a71a23504ed08103a13c941f763db13fb11177beb3d9244c98c29fb4a61", size = 48755, upload-time = "2026-02-17T16:12:47.943Z" }, ] [[package]] name = "mypy" -version = "1.17.1" +version = "1.19.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "mypy-extensions", marker = "python_full_version >= '3.12'" }, - { name = "pathspec", marker = "python_full_version >= '3.12'" }, - { name = "typing-extensions", marker = "python_full_version >= '3.12'" }, + { name = "librt", marker = "python_full_version >= '3.13' and platform_python_implementation != 'PyPy'" }, + { name = "mypy-extensions", marker = "python_full_version >= '3.13'" }, + { name = "pathspec", marker = "python_full_version >= '3.13'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8e/22/ea637422dedf0bf36f3ef238eab4e455e2a0dcc3082b5cc067615347ab8e/mypy-1.17.1.tar.gz", hash = "sha256:25e01ec741ab5bb3eec8ba9cdb0f769230368a22c959c4937360efb89b7e9f01", size = 3352570, upload-time = "2025-07-31T07:54:19.204Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/db/4efed9504bc01309ab9c2da7e352cc223569f05478012b5d9ece38fd44d2/mypy-1.19.1.tar.gz", hash = "sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba", size = 3582404, upload-time = "2025-12-15T05:03:48.42Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/a9/3d7aa83955617cdf02f94e50aab5c830d205cfa4320cf124ff64acce3a8e/mypy-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3fbe6d5555bf608c47203baa3e72dbc6ec9965b3d7c318aa9a4ca76f465bd972", size = 11003299, upload-time = "2025-07-31T07:54:06.425Z" }, - { url = "https://files.pythonhosted.org/packages/83/e8/72e62ff837dd5caaac2b4a5c07ce769c8e808a00a65e5d8f94ea9c6f20ab/mypy-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80ef5c058b7bce08c83cac668158cb7edea692e458d21098c7d3bce35a5d43e7", size = 10125451, upload-time = "2025-07-31T07:53:52.974Z" }, - { url = "https://files.pythonhosted.org/packages/7d/10/f3f3543f6448db11881776f26a0ed079865926b0c841818ee22de2c6bbab/mypy-1.17.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4a580f8a70c69e4a75587bd925d298434057fe2a428faaf927ffe6e4b9a98df", size = 11916211, upload-time = "2025-07-31T07:53:18.879Z" }, - { url = "https://files.pythonhosted.org/packages/06/bf/63e83ed551282d67bb3f7fea2cd5561b08d2bb6eb287c096539feb5ddbc5/mypy-1.17.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd86bb649299f09d987a2eebb4d52d10603224500792e1bee18303bbcc1ce390", size = 12652687, upload-time = "2025-07-31T07:53:30.544Z" }, - { url = "https://files.pythonhosted.org/packages/69/66/68f2eeef11facf597143e85b694a161868b3b006a5fbad50e09ea117ef24/mypy-1.17.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a76906f26bd8d51ea9504966a9c25419f2e668f012e0bdf3da4ea1526c534d94", size = 12896322, upload-time = "2025-07-31T07:53:50.74Z" }, - { url = "https://files.pythonhosted.org/packages/a3/87/8e3e9c2c8bd0d7e071a89c71be28ad088aaecbadf0454f46a540bda7bca6/mypy-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:e79311f2d904ccb59787477b7bd5d26f3347789c06fcd7656fa500875290264b", size = 9507962, upload-time = "2025-07-31T07:53:08.431Z" }, - { url = "https://files.pythonhosted.org/packages/46/cf/eadc80c4e0a70db1c08921dcc220357ba8ab2faecb4392e3cebeb10edbfa/mypy-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad37544be07c5d7fba814eb370e006df58fed8ad1ef33ed1649cb1889ba6ff58", size = 10921009, upload-time = "2025-07-31T07:53:23.037Z" }, - { url = "https://files.pythonhosted.org/packages/5d/c1/c869d8c067829ad30d9bdae051046561552516cfb3a14f7f0347b7d973ee/mypy-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:064e2ff508e5464b4bd807a7c1625bc5047c5022b85c70f030680e18f37273a5", size = 10047482, upload-time = "2025-07-31T07:53:26.151Z" }, - { url = "https://files.pythonhosted.org/packages/98/b9/803672bab3fe03cee2e14786ca056efda4bb511ea02dadcedde6176d06d0/mypy-1.17.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70401bbabd2fa1aa7c43bb358f54037baf0586f41e83b0ae67dd0534fc64edfd", size = 11832883, upload-time = "2025-07-31T07:53:47.948Z" }, - { url = "https://files.pythonhosted.org/packages/88/fb/fcdac695beca66800918c18697b48833a9a6701de288452b6715a98cfee1/mypy-1.17.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e92bdc656b7757c438660f775f872a669b8ff374edc4d18277d86b63edba6b8b", size = 12566215, upload-time = "2025-07-31T07:54:04.031Z" }, - { url = "https://files.pythonhosted.org/packages/7f/37/a932da3d3dace99ee8eb2043b6ab03b6768c36eb29a02f98f46c18c0da0e/mypy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c1fdf4abb29ed1cb091cf432979e162c208a5ac676ce35010373ff29247bcad5", size = 12751956, upload-time = "2025-07-31T07:53:36.263Z" }, - { url = "https://files.pythonhosted.org/packages/8c/cf/6438a429e0f2f5cab8bc83e53dbebfa666476f40ee322e13cac5e64b79e7/mypy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:ff2933428516ab63f961644bc49bc4cbe42bbffb2cd3b71cc7277c07d16b1a8b", size = 9507307, upload-time = "2025-07-31T07:53:59.734Z" }, - { url = "https://files.pythonhosted.org/packages/17/a2/7034d0d61af8098ec47902108553122baa0f438df8a713be860f7407c9e6/mypy-1.17.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:69e83ea6553a3ba79c08c6e15dbd9bfa912ec1e493bf75489ef93beb65209aeb", size = 11086295, upload-time = "2025-07-31T07:53:28.124Z" }, - { url = "https://files.pythonhosted.org/packages/14/1f/19e7e44b594d4b12f6ba8064dbe136505cec813549ca3e5191e40b1d3cc2/mypy-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b16708a66d38abb1e6b5702f5c2c87e133289da36f6a1d15f6a5221085c6403", size = 10112355, upload-time = "2025-07-31T07:53:21.121Z" }, - { url = "https://files.pythonhosted.org/packages/5b/69/baa33927e29e6b4c55d798a9d44db5d394072eef2bdc18c3e2048c9ed1e9/mypy-1.17.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:89e972c0035e9e05823907ad5398c5a73b9f47a002b22359b177d40bdaee7056", size = 11875285, upload-time = "2025-07-31T07:53:55.293Z" }, - { url = "https://files.pythonhosted.org/packages/90/13/f3a89c76b0a41e19490b01e7069713a30949d9a6c147289ee1521bcea245/mypy-1.17.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03b6d0ed2b188e35ee6d5c36b5580cffd6da23319991c49ab5556c023ccf1341", size = 12737895, upload-time = "2025-07-31T07:53:43.623Z" }, - { url = "https://files.pythonhosted.org/packages/23/a1/c4ee79ac484241301564072e6476c5a5be2590bc2e7bfd28220033d2ef8f/mypy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c837b896b37cd103570d776bda106eabb8737aa6dd4f248451aecf53030cdbeb", size = 12931025, upload-time = "2025-07-31T07:54:17.125Z" }, - { url = "https://files.pythonhosted.org/packages/89/b8/7409477be7919a0608900e6320b155c72caab4fef46427c5cc75f85edadd/mypy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:665afab0963a4b39dff7c1fa563cc8b11ecff7910206db4b2e64dd1ba25aed19", size = 9584664, upload-time = "2025-07-31T07:54:12.842Z" }, - { url = "https://files.pythonhosted.org/packages/5b/82/aec2fc9b9b149f372850291827537a508d6c4d3664b1750a324b91f71355/mypy-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93378d3203a5c0800c6b6d850ad2f19f7a3cdf1a3701d3416dbf128805c6a6a7", size = 11075338, upload-time = "2025-07-31T07:53:38.873Z" }, - { url = "https://files.pythonhosted.org/packages/07/ac/ee93fbde9d2242657128af8c86f5d917cd2887584cf948a8e3663d0cd737/mypy-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:15d54056f7fe7a826d897789f53dd6377ec2ea8ba6f776dc83c2902b899fee81", size = 10113066, upload-time = "2025-07-31T07:54:14.707Z" }, - { url = "https://files.pythonhosted.org/packages/5a/68/946a1e0be93f17f7caa56c45844ec691ca153ee8b62f21eddda336a2d203/mypy-1.17.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:209a58fed9987eccc20f2ca94afe7257a8f46eb5df1fb69958650973230f91e6", size = 11875473, upload-time = "2025-07-31T07:53:14.504Z" }, - { url = "https://files.pythonhosted.org/packages/9f/0f/478b4dce1cb4f43cf0f0d00fba3030b21ca04a01b74d1cd272a528cf446f/mypy-1.17.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:099b9a5da47de9e2cb5165e581f158e854d9e19d2e96b6698c0d64de911dd849", size = 12744296, upload-time = "2025-07-31T07:53:03.896Z" }, - { url = "https://files.pythonhosted.org/packages/ca/70/afa5850176379d1b303f992a828de95fc14487429a7139a4e0bdd17a8279/mypy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ffadfbe6994d724c5a1bb6123a7d27dd68fc9c059561cd33b664a79578e14", size = 12914657, upload-time = "2025-07-31T07:54:08.576Z" }, - { url = "https://files.pythonhosted.org/packages/53/f9/4a83e1c856a3d9c8f6edaa4749a4864ee98486e9b9dbfbc93842891029c2/mypy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:9a2b7d9180aed171f033c9f2fc6c204c1245cf60b0cb61cf2e7acc24eea78e0a", size = 9593320, upload-time = "2025-07-31T07:53:01.341Z" }, - { url = "https://files.pythonhosted.org/packages/38/56/79c2fac86da57c7d8c48622a05873eaab40b905096c33597462713f5af90/mypy-1.17.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:15a83369400454c41ed3a118e0cc58bd8123921a602f385cb6d6ea5df050c733", size = 11040037, upload-time = "2025-07-31T07:54:10.942Z" }, - { url = "https://files.pythonhosted.org/packages/4d/c3/adabe6ff53638e3cad19e3547268482408323b1e68bf082c9119000cd049/mypy-1.17.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:55b918670f692fc9fba55c3298d8a3beae295c5cded0a55dccdc5bbead814acd", size = 10131550, upload-time = "2025-07-31T07:53:41.307Z" }, - { url = "https://files.pythonhosted.org/packages/b8/c5/2e234c22c3bdeb23a7817af57a58865a39753bde52c74e2c661ee0cfc640/mypy-1.17.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:62761474061feef6f720149d7ba876122007ddc64adff5ba6f374fda35a018a0", size = 11872963, upload-time = "2025-07-31T07:53:16.878Z" }, - { url = "https://files.pythonhosted.org/packages/ab/26/c13c130f35ca8caa5f2ceab68a247775648fdcd6c9a18f158825f2bc2410/mypy-1.17.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c49562d3d908fd49ed0938e5423daed8d407774a479b595b143a3d7f87cdae6a", size = 12710189, upload-time = "2025-07-31T07:54:01.962Z" }, - { url = "https://files.pythonhosted.org/packages/82/df/c7d79d09f6de8383fe800521d066d877e54d30b4fb94281c262be2df84ef/mypy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:397fba5d7616a5bc60b45c7ed204717eaddc38f826e3645402c426057ead9a91", size = 12900322, upload-time = "2025-07-31T07:53:10.551Z" }, - { url = "https://files.pythonhosted.org/packages/b8/98/3d5a48978b4f708c55ae832619addc66d677f6dc59f3ebad71bae8285ca6/mypy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:9d6b20b97d373f41617bd0708fd46aa656059af57f2ef72aa8c7d6a2b73b74ed", size = 9751879, upload-time = "2025-07-31T07:52:56.683Z" }, - { url = "https://files.pythonhosted.org/packages/29/cb/673e3d34e5d8de60b3a61f44f80150a738bff568cd6b7efb55742a605e98/mypy-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5d1092694f166a7e56c805caaf794e0585cabdbf1df36911c414e4e9abb62ae9", size = 10992466, upload-time = "2025-07-31T07:53:57.574Z" }, - { url = "https://files.pythonhosted.org/packages/0c/d0/fe1895836eea3a33ab801561987a10569df92f2d3d4715abf2cfeaa29cb2/mypy-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:79d44f9bfb004941ebb0abe8eff6504223a9c1ac51ef967d1263c6572bbebc99", size = 10117638, upload-time = "2025-07-31T07:53:34.256Z" }, - { url = "https://files.pythonhosted.org/packages/97/f3/514aa5532303aafb95b9ca400a31054a2bd9489de166558c2baaeea9c522/mypy-1.17.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b01586eed696ec905e61bd2568f48740f7ac4a45b3a468e6423a03d3788a51a8", size = 11915673, upload-time = "2025-07-31T07:52:59.361Z" }, - { url = "https://files.pythonhosted.org/packages/ab/c3/c0805f0edec96fe8e2c048b03769a6291523d509be8ee7f56ae922fa3882/mypy-1.17.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43808d9476c36b927fbcd0b0255ce75efe1b68a080154a38ae68a7e62de8f0f8", size = 12649022, upload-time = "2025-07-31T07:53:45.92Z" }, - { url = "https://files.pythonhosted.org/packages/45/3e/d646b5a298ada21a8512fa7e5531f664535a495efa672601702398cea2b4/mypy-1.17.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:feb8cc32d319edd5859da2cc084493b3e2ce5e49a946377663cc90f6c15fb259", size = 12895536, upload-time = "2025-07-31T07:53:06.17Z" }, - { url = "https://files.pythonhosted.org/packages/14/55/e13d0dcd276975927d1f4e9e2ec4fd409e199f01bdc671717e673cc63a22/mypy-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d7598cf74c3e16539d4e2f0b8d8c318e00041553d83d4861f87c7a72e95ac24d", size = 9512564, upload-time = "2025-07-31T07:53:12.346Z" }, - { url = "https://files.pythonhosted.org/packages/1d/f3/8fcd2af0f5b806f6cf463efaffd3c9548a28f84220493ecd38d127b6b66d/mypy-1.17.1-py3-none-any.whl", hash = "sha256:a9f52c0351c21fe24c21d8c0eb1f62967b262d6729393397b6f443c3b773c3b9", size = 2283411, upload-time = "2025-07-31T07:53:24.664Z" }, + { url = "https://files.pythonhosted.org/packages/2f/63/e499890d8e39b1ff2df4c0c6ce5d371b6844ee22b8250687a99fd2f657a8/mypy-1.19.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f05aa3d375b385734388e844bc01733bd33c644ab48e9684faa54e5389775ec", size = 13101333, upload-time = "2025-12-15T05:03:03.28Z" }, + { url = "https://files.pythonhosted.org/packages/72/4b/095626fc136fba96effc4fd4a82b41d688ab92124f8c4f7564bffe5cf1b0/mypy-1.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:022ea7279374af1a5d78dfcab853fe6a536eebfda4b59deab53cd21f6cd9f00b", size = 12164102, upload-time = "2025-12-15T05:02:33.611Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5b/952928dd081bf88a83a5ccd49aaecfcd18fd0d2710c7ff07b8fb6f7032b9/mypy-1.19.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee4c11e460685c3e0c64a4c5de82ae143622410950d6be863303a1c4ba0e36d6", size = 12765799, upload-time = "2025-12-15T05:03:28.44Z" }, + { url = "https://files.pythonhosted.org/packages/2a/0d/93c2e4a287f74ef11a66fb6d49c7a9f05e47b0a4399040e6719b57f500d2/mypy-1.19.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de759aafbae8763283b2ee5869c7255391fbc4de3ff171f8f030b5ec48381b74", size = 13522149, upload-time = "2025-12-15T05:02:36.011Z" }, + { url = "https://files.pythonhosted.org/packages/7b/0e/33a294b56aaad2b338d203e3a1d8b453637ac36cb278b45005e0901cf148/mypy-1.19.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ab43590f9cd5108f41aacf9fca31841142c786827a74ab7cc8a2eacb634e09a1", size = 13810105, upload-time = "2025-12-15T05:02:40.327Z" }, + { url = "https://files.pythonhosted.org/packages/0e/fd/3e82603a0cb66b67c5e7abababce6bf1a929ddf67bf445e652684af5c5a0/mypy-1.19.1-cp310-cp310-win_amd64.whl", hash = "sha256:2899753e2f61e571b3971747e302d5f420c3fd09650e1951e99f823bc3089dac", size = 10057200, upload-time = "2025-12-15T05:02:51.012Z" }, + { url = "https://files.pythonhosted.org/packages/ef/47/6b3ebabd5474d9cdc170d1342fbf9dddc1b0ec13ec90bf9004ee6f391c31/mypy-1.19.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288", size = 13028539, upload-time = "2025-12-15T05:03:44.129Z" }, + { url = "https://files.pythonhosted.org/packages/5c/a6/ac7c7a88a3c9c54334f53a941b765e6ec6c4ebd65d3fe8cdcfbe0d0fd7db/mypy-1.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab", size = 12083163, upload-time = "2025-12-15T05:03:37.679Z" }, + { url = "https://files.pythonhosted.org/packages/67/af/3afa9cf880aa4a2c803798ac24f1d11ef72a0c8079689fac5cfd815e2830/mypy-1.19.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6", size = 12687629, upload-time = "2025-12-15T05:02:31.526Z" }, + { url = "https://files.pythonhosted.org/packages/2d/46/20f8a7114a56484ab268b0ab372461cb3a8f7deed31ea96b83a4e4cfcfca/mypy-1.19.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a009ffa5a621762d0c926a078c2d639104becab69e79538a494bcccb62cc0331", size = 13436933, upload-time = "2025-12-15T05:03:15.606Z" }, + { url = "https://files.pythonhosted.org/packages/5b/f8/33b291ea85050a21f15da910002460f1f445f8007adb29230f0adea279cb/mypy-1.19.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f7cee03c9a2e2ee26ec07479f38ea9c884e301d42c6d43a19d20fb014e3ba925", size = 13661754, upload-time = "2025-12-15T05:02:26.731Z" }, + { url = "https://files.pythonhosted.org/packages/fd/a3/47cbd4e85bec4335a9cd80cf67dbc02be21b5d4c9c23ad6b95d6c5196bac/mypy-1.19.1-cp311-cp311-win_amd64.whl", hash = "sha256:4b84a7a18f41e167f7995200a1d07a4a6810e89d29859df936f1c3923d263042", size = 10055772, upload-time = "2025-12-15T05:03:26.179Z" }, + { url = "https://files.pythonhosted.org/packages/06/8a/19bfae96f6615aa8a0604915512e0289b1fad33d5909bf7244f02935d33a/mypy-1.19.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1", size = 13206053, upload-time = "2025-12-15T05:03:46.622Z" }, + { url = "https://files.pythonhosted.org/packages/a5/34/3e63879ab041602154ba2a9f99817bb0c85c4df19a23a1443c8986e4d565/mypy-1.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e", size = 12219134, upload-time = "2025-12-15T05:03:24.367Z" }, + { url = "https://files.pythonhosted.org/packages/89/cc/2db6f0e95366b630364e09845672dbee0cbf0bbe753a204b29a944967cd9/mypy-1.19.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2", size = 12731616, upload-time = "2025-12-15T05:02:44.725Z" }, + { url = "https://files.pythonhosted.org/packages/00/be/dd56c1fd4807bc1eba1cf18b2a850d0de7bacb55e158755eb79f77c41f8e/mypy-1.19.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8", size = 13620847, upload-time = "2025-12-15T05:03:39.633Z" }, + { url = "https://files.pythonhosted.org/packages/6d/42/332951aae42b79329f743bf1da088cd75d8d4d9acc18fbcbd84f26c1af4e/mypy-1.19.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a", size = 13834976, upload-time = "2025-12-15T05:03:08.786Z" }, + { url = "https://files.pythonhosted.org/packages/6f/63/e7493e5f90e1e085c562bb06e2eb32cae27c5057b9653348d38b47daaecc/mypy-1.19.1-cp312-cp312-win_amd64.whl", hash = "sha256:b10e7c2cd7870ba4ad9b2d8a6102eb5ffc1f16ca35e3de6bfa390c1113029d13", size = 10118104, upload-time = "2025-12-15T05:03:10.834Z" }, + { url = "https://files.pythonhosted.org/packages/de/9f/a6abae693f7a0c697dbb435aac52e958dc8da44e92e08ba88d2e42326176/mypy-1.19.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e3157c7594ff2ef1634ee058aafc56a82db665c9438fd41b390f3bde1ab12250", size = 13201927, upload-time = "2025-12-15T05:02:29.138Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a4/45c35ccf6e1c65afc23a069f50e2c66f46bd3798cbe0d680c12d12935caa/mypy-1.19.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdb12f69bcc02700c2b47e070238f42cb87f18c0bc1fc4cdb4fb2bc5fd7a3b8b", size = 12206730, upload-time = "2025-12-15T05:03:01.325Z" }, + { url = "https://files.pythonhosted.org/packages/05/bb/cdcf89678e26b187650512620eec8368fded4cfd99cfcb431e4cdfd19dec/mypy-1.19.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f859fb09d9583a985be9a493d5cfc5515b56b08f7447759a0c5deaf68d80506e", size = 12724581, upload-time = "2025-12-15T05:03:20.087Z" }, + { url = "https://files.pythonhosted.org/packages/d1/32/dd260d52babf67bad8e6770f8e1102021877ce0edea106e72df5626bb0ec/mypy-1.19.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9a6538e0415310aad77cb94004ca6482330fece18036b5f360b62c45814c4ef", size = 13616252, upload-time = "2025-12-15T05:02:49.036Z" }, + { url = "https://files.pythonhosted.org/packages/71/d0/5e60a9d2e3bd48432ae2b454b7ef2b62a960ab51292b1eda2a95edd78198/mypy-1.19.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:da4869fc5e7f62a88f3fe0b5c919d1d9f7ea3cef92d3689de2823fd27e40aa75", size = 13840848, upload-time = "2025-12-15T05:02:55.95Z" }, + { url = "https://files.pythonhosted.org/packages/98/76/d32051fa65ecf6cc8c6610956473abdc9b4c43301107476ac03559507843/mypy-1.19.1-cp313-cp313-win_amd64.whl", hash = "sha256:016f2246209095e8eda7538944daa1d60e1e8134d98983b9fc1e92c1fc0cb8dd", size = 10135510, upload-time = "2025-12-15T05:02:58.438Z" }, + { url = "https://files.pythonhosted.org/packages/de/eb/b83e75f4c820c4247a58580ef86fcd35165028f191e7e1ba57128c52782d/mypy-1.19.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06e6170bd5836770e8104c8fdd58e5e725cfeb309f0a6c681a811f557e97eac1", size = 13199744, upload-time = "2025-12-15T05:03:30.823Z" }, + { url = "https://files.pythonhosted.org/packages/94/28/52785ab7bfa165f87fcbb61547a93f98bb20e7f82f90f165a1f69bce7b3d/mypy-1.19.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:804bd67b8054a85447c8954215a906d6eff9cabeabe493fb6334b24f4bfff718", size = 12215815, upload-time = "2025-12-15T05:02:42.323Z" }, + { url = "https://files.pythonhosted.org/packages/0a/c6/bdd60774a0dbfb05122e3e925f2e9e846c009e479dcec4821dad881f5b52/mypy-1.19.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21761006a7f497cb0d4de3d8ef4ca70532256688b0523eee02baf9eec895e27b", size = 12740047, upload-time = "2025-12-15T05:03:33.168Z" }, + { url = "https://files.pythonhosted.org/packages/32/2a/66ba933fe6c76bd40d1fe916a83f04fed253152f451a877520b3c4a5e41e/mypy-1.19.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045", size = 13601998, upload-time = "2025-12-15T05:03:13.056Z" }, + { url = "https://files.pythonhosted.org/packages/e3/da/5055c63e377c5c2418760411fd6a63ee2b96cf95397259038756c042574f/mypy-1.19.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:481daf36a4c443332e2ae9c137dfee878fcea781a2e3f895d54bd3002a900957", size = 13807476, upload-time = "2025-12-15T05:03:17.977Z" }, + { url = "https://files.pythonhosted.org/packages/cd/09/4ebd873390a063176f06b0dbf1f7783dd87bd120eae7727fa4ae4179b685/mypy-1.19.1-cp314-cp314-win_amd64.whl", hash = "sha256:8bb5c6f6d043655e055be9b542aa5f3bdd30e4f3589163e85f93f3640060509f", size = 10281872, upload-time = "2025-12-15T05:03:05.549Z" }, + { url = "https://files.pythonhosted.org/packages/8d/f4/4ce9a05ce5ded1de3ec1c1d96cf9f9504a04e54ce0ed55cfa38619a32b8d/mypy-1.19.1-py3-none-any.whl", hash = "sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247", size = 2471239, upload-time = "2025-12-15T05:03:07.248Z" }, ] [[package]] @@ -356,20 +263,20 @@ wheels = [ [[package]] name = "packaging" -version = "25.0" +version = "26.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, ] [[package]] name = "pathspec" -version = "0.12.1" +version = "1.0.4" 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, upload-time = "2023-12-10T22:30:45Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/36/e27608899f9b8d4dff0617b2d9ab17ca5608956ca44461ac14ac48b44015/pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", size = 131200, upload-time = "2026-01-27T03:59:46.938Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, + { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, ] [[package]] @@ -383,32 +290,11 @@ wheels = [ [[package]] name = "pycparser" -version = "2.21" +version = "3.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.8' and platform_python_implementation != 'PyPy'", -] -sdist = { url = "https://files.pythonhosted.org/packages/5e/0b/95d387f5f4433cb0f53ff7ad859bd2c6051051cebbb564f139a999ab46de/pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206", size = 170877, upload-time = "2021-11-06T12:48:46.095Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/d5/5f610ebe421e85889f2e55e33b7f9a6795bd982198517d912eb1c76e1a53/pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", size = 118697, upload-time = "2021-11-06T12:50:13.61Z" }, -] - -[[package]] -name = "pycparser" -version = "2.22" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.14' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.9' and python_full_version < '3.12' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.12' and python_full_version < '3.14' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.9' and python_full_version < '3.12' and platform_python_implementation == 'PyPy'", - "python_full_version == '3.8.*' and platform_python_implementation != 'PyPy'", -] -sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736, upload-time = "2024-03-30T13:22:22.564Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552, upload-time = "2024-03-30T13:22:20.476Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, ] [[package]] @@ -422,100 +308,122 @@ wheels = [ [[package]] name = "pytest" -version = "8.4.2" +version = "9.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" }, - { name = "iniconfig", marker = "python_full_version >= '3.12'" }, - { name = "packaging", marker = "python_full_version >= '3.12'" }, - { name = "pluggy", marker = "python_full_version >= '3.12'" }, - { name = "pygments", marker = "python_full_version >= '3.12'" }, + { name = "colorama", marker = "python_full_version >= '3.13' and sys_platform == 'win32'" }, + { name = "iniconfig", marker = "python_full_version >= '3.13'" }, + { name = "packaging", marker = "python_full_version >= '3.13'" }, + { name = "pluggy", marker = "python_full_version >= '3.13'" }, + { name = "pygments", marker = "python_full_version >= '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, + { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, ] [[package]] name = "ruff" -version = "0.12.12" +version = "0.15.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a8/f0/e0965dd709b8cabe6356811c0ee8c096806bb57d20b5019eb4e48a117410/ruff-0.12.12.tar.gz", hash = "sha256:b86cd3415dbe31b3b46a71c598f4c4b2f550346d1ccf6326b347cc0c8fd063d6", size = 5359915, upload-time = "2025-09-04T16:50:18.273Z" } +sdist = { url = "https://files.pythonhosted.org/packages/77/9b/840e0039e65fcf12758adf684d2289024d6140cde9268cc59887dc55189c/ruff-0.15.5.tar.gz", hash = "sha256:7c3601d3b6d76dce18c5c824fc8d06f4eef33d6df0c21ec7799510cde0f159a2", size = 4574214, upload-time = "2026-03-05T20:06:34.946Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/09/79/8d3d687224d88367b51c7974cec1040c4b015772bfbeffac95face14c04a/ruff-0.12.12-py3-none-linux_armv6l.whl", hash = "sha256:de1c4b916d98ab289818e55ce481e2cacfaad7710b01d1f990c497edf217dafc", size = 12116602, upload-time = "2025-09-04T16:49:18.892Z" }, - { url = "https://files.pythonhosted.org/packages/c3/c3/6e599657fe192462f94861a09aae935b869aea8a1da07f47d6eae471397c/ruff-0.12.12-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:7acd6045e87fac75a0b0cdedacf9ab3e1ad9d929d149785903cff9bb69ad9727", size = 12868393, upload-time = "2025-09-04T16:49:23.043Z" }, - { url = "https://files.pythonhosted.org/packages/e8/d2/9e3e40d399abc95336b1843f52fc0daaceb672d0e3c9290a28ff1a96f79d/ruff-0.12.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:abf4073688d7d6da16611f2f126be86523a8ec4343d15d276c614bda8ec44edb", size = 12036967, upload-time = "2025-09-04T16:49:26.04Z" }, - { url = "https://files.pythonhosted.org/packages/e9/03/6816b2ed08836be272e87107d905f0908be5b4a40c14bfc91043e76631b8/ruff-0.12.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:968e77094b1d7a576992ac078557d1439df678a34c6fe02fd979f973af167577", size = 12276038, upload-time = "2025-09-04T16:49:29.056Z" }, - { url = "https://files.pythonhosted.org/packages/9f/d5/707b92a61310edf358a389477eabd8af68f375c0ef858194be97ca5b6069/ruff-0.12.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42a67d16e5b1ffc6d21c5f67851e0e769517fb57a8ebad1d0781b30888aa704e", size = 11901110, upload-time = "2025-09-04T16:49:32.07Z" }, - { url = "https://files.pythonhosted.org/packages/9d/3d/f8b1038f4b9822e26ec3d5b49cf2bc313e3c1564cceb4c1a42820bf74853/ruff-0.12.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b216ec0a0674e4b1214dcc998a5088e54eaf39417327b19ffefba1c4a1e4971e", size = 13668352, upload-time = "2025-09-04T16:49:35.148Z" }, - { url = "https://files.pythonhosted.org/packages/98/0e/91421368ae6c4f3765dd41a150f760c5f725516028a6be30e58255e3c668/ruff-0.12.12-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:59f909c0fdd8f1dcdbfed0b9569b8bf428cf144bec87d9de298dcd4723f5bee8", size = 14638365, upload-time = "2025-09-04T16:49:38.892Z" }, - { url = "https://files.pythonhosted.org/packages/74/5d/88f3f06a142f58ecc8ecb0c2fe0b82343e2a2b04dcd098809f717cf74b6c/ruff-0.12.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ac93d87047e765336f0c18eacad51dad0c1c33c9df7484c40f98e1d773876f5", size = 14060812, upload-time = "2025-09-04T16:49:42.732Z" }, - { url = "https://files.pythonhosted.org/packages/13/fc/8962e7ddd2e81863d5c92400820f650b86f97ff919c59836fbc4c1a6d84c/ruff-0.12.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:01543c137fd3650d322922e8b14cc133b8ea734617c4891c5a9fccf4bfc9aa92", size = 13050208, upload-time = "2025-09-04T16:49:46.434Z" }, - { url = "https://files.pythonhosted.org/packages/53/06/8deb52d48a9a624fd37390555d9589e719eac568c020b27e96eed671f25f/ruff-0.12.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afc2fa864197634e549d87fb1e7b6feb01df0a80fd510d6489e1ce8c0b1cc45", size = 13311444, upload-time = "2025-09-04T16:49:49.931Z" }, - { url = "https://files.pythonhosted.org/packages/2a/81/de5a29af7eb8f341f8140867ffb93f82e4fde7256dadee79016ac87c2716/ruff-0.12.12-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:0c0945246f5ad776cb8925e36af2438e66188d2b57d9cf2eed2c382c58b371e5", size = 13279474, upload-time = "2025-09-04T16:49:53.465Z" }, - { url = "https://files.pythonhosted.org/packages/7f/14/d9577fdeaf791737ada1b4f5c6b59c21c3326f3f683229096cccd7674e0c/ruff-0.12.12-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a0fbafe8c58e37aae28b84a80ba1817f2ea552e9450156018a478bf1fa80f4e4", size = 12070204, upload-time = "2025-09-04T16:49:56.882Z" }, - { url = "https://files.pythonhosted.org/packages/77/04/a910078284b47fad54506dc0af13839c418ff704e341c176f64e1127e461/ruff-0.12.12-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b9c456fb2fc8e1282affa932c9e40f5ec31ec9cbb66751a316bd131273b57c23", size = 11880347, upload-time = "2025-09-04T16:49:59.729Z" }, - { url = "https://files.pythonhosted.org/packages/df/58/30185fcb0e89f05e7ea82e5817b47798f7fa7179863f9d9ba6fd4fe1b098/ruff-0.12.12-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5f12856123b0ad0147d90b3961f5c90e7427f9acd4b40050705499c98983f489", size = 12891844, upload-time = "2025-09-04T16:50:02.591Z" }, - { url = "https://files.pythonhosted.org/packages/21/9c/28a8dacce4855e6703dcb8cdf6c1705d0b23dd01d60150786cd55aa93b16/ruff-0.12.12-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:26a1b5a2bf7dd2c47e3b46d077cd9c0fc3b93e6c6cc9ed750bd312ae9dc302ee", size = 13360687, upload-time = "2025-09-04T16:50:05.8Z" }, - { url = "https://files.pythonhosted.org/packages/c8/fa/05b6428a008e60f79546c943e54068316f32ec8ab5c4f73e4563934fbdc7/ruff-0.12.12-py3-none-win32.whl", hash = "sha256:173be2bfc142af07a01e3a759aba6f7791aa47acf3604f610b1c36db888df7b1", size = 12052870, upload-time = "2025-09-04T16:50:09.121Z" }, - { url = "https://files.pythonhosted.org/packages/85/60/d1e335417804df452589271818749d061b22772b87efda88354cf35cdb7a/ruff-0.12.12-py3-none-win_amd64.whl", hash = "sha256:e99620bf01884e5f38611934c09dd194eb665b0109104acae3ba6102b600fd0d", size = 13178016, upload-time = "2025-09-04T16:50:12.559Z" }, - { url = "https://files.pythonhosted.org/packages/28/7e/61c42657f6e4614a4258f1c3b0c5b93adc4d1f8575f5229d1906b483099b/ruff-0.12.12-py3-none-win_arm64.whl", hash = "sha256:2a8199cab4ce4d72d158319b63370abf60991495fb733db96cd923a34c52d093", size = 12256762, upload-time = "2025-09-04T16:50:15.737Z" }, + { url = "https://files.pythonhosted.org/packages/47/20/5369c3ce21588c708bcbe517a8fbe1a8dfdb5dfd5137e14790b1da71612c/ruff-0.15.5-py3-none-linux_armv6l.whl", hash = "sha256:4ae44c42281f42e3b06b988e442d344a5b9b72450ff3c892e30d11b29a96a57c", size = 10478185, upload-time = "2026-03-05T20:06:29.093Z" }, + { url = "https://files.pythonhosted.org/packages/44/ed/e81dd668547da281e5dce710cf0bc60193f8d3d43833e8241d006720e42b/ruff-0.15.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6edd3792d408ebcf61adabc01822da687579a1a023f297618ac27a5b51ef0080", size = 10859201, upload-time = "2026-03-05T20:06:32.632Z" }, + { url = "https://files.pythonhosted.org/packages/c4/8f/533075f00aaf19b07c5cd6aa6e5d89424b06b3b3f4583bfa9c640a079059/ruff-0.15.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:89f463f7c8205a9f8dea9d658d59eff49db05f88f89cc3047fb1a02d9f344010", size = 10184752, upload-time = "2026-03-05T20:06:40.312Z" }, + { url = "https://files.pythonhosted.org/packages/66/0e/ba49e2c3fa0395b3152bad634c7432f7edfc509c133b8f4529053ff024fb/ruff-0.15.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba786a8295c6574c1116704cf0b9e6563de3432ac888d8f83685654fe528fd65", size = 10534857, upload-time = "2026-03-05T20:06:19.581Z" }, + { url = "https://files.pythonhosted.org/packages/59/71/39234440f27a226475a0659561adb0d784b4d247dfe7f43ffc12dd02e288/ruff-0.15.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd4b801e57955fe9f02b31d20375ab3a5c4415f2e5105b79fb94cf2642c91440", size = 10309120, upload-time = "2026-03-05T20:06:00.435Z" }, + { url = "https://files.pythonhosted.org/packages/f5/87/4140aa86a93df032156982b726f4952aaec4a883bb98cb6ef73c347da253/ruff-0.15.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391f7c73388f3d8c11b794dbbc2959a5b5afe66642c142a6effa90b45f6f5204", size = 11047428, upload-time = "2026-03-05T20:05:51.867Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f7/4953e7e3287676f78fbe85e3a0ca414c5ca81237b7575bdadc00229ac240/ruff-0.15.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dc18f30302e379fe1e998548b0f5e9f4dff907f52f73ad6da419ea9c19d66c8", size = 11914251, upload-time = "2026-03-05T20:06:22.887Z" }, + { url = "https://files.pythonhosted.org/packages/77/46/0f7c865c10cf896ccf5a939c3e84e1cfaeed608ff5249584799a74d33835/ruff-0.15.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc6e7f90087e2d27f98dc34ed1b3ab7c8f0d273cc5431415454e22c0bd2a681", size = 11333801, upload-time = "2026-03-05T20:05:57.168Z" }, + { url = "https://files.pythonhosted.org/packages/d3/01/a10fe54b653061585e655f5286c2662ebddb68831ed3eaebfb0eb08c0a16/ruff-0.15.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1cb7169f53c1ddb06e71a9aebd7e98fc0fea936b39afb36d8e86d36ecc2636a", size = 11206821, upload-time = "2026-03-05T20:06:03.441Z" }, + { url = "https://files.pythonhosted.org/packages/7a/0d/2132ceaf20c5e8699aa83da2706ecb5c5dcdf78b453f77edca7fb70f8a93/ruff-0.15.5-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9b037924500a31ee17389b5c8c4d88874cc6ea8e42f12e9c61a3d754ff72f1ca", size = 11133326, upload-time = "2026-03-05T20:06:25.655Z" }, + { url = "https://files.pythonhosted.org/packages/72/cb/2e5259a7eb2a0f87c08c0fe5bf5825a1e4b90883a52685524596bfc93072/ruff-0.15.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:65bb414e5b4eadd95a8c1e4804f6772bbe8995889f203a01f77ddf2d790929dd", size = 10510820, upload-time = "2026-03-05T20:06:37.79Z" }, + { url = "https://files.pythonhosted.org/packages/ff/20/b67ce78f9e6c59ffbdb5b4503d0090e749b5f2d31b599b554698a80d861c/ruff-0.15.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d20aa469ae3b57033519c559e9bc9cd9e782842e39be05b50e852c7c981fa01d", size = 10302395, upload-time = "2026-03-05T20:05:54.504Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e5/719f1acccd31b720d477751558ed74e9c88134adcc377e5e886af89d3072/ruff-0.15.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:15388dd28c9161cdb8eda68993533acc870aa4e646a0a277aa166de9ad5a8752", size = 10754069, upload-time = "2026-03-05T20:06:06.422Z" }, + { url = "https://files.pythonhosted.org/packages/c3/9c/d1db14469e32d98f3ca27079dbd30b7b44dbb5317d06ab36718dee3baf03/ruff-0.15.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b30da330cbd03bed0c21420b6b953158f60c74c54c5f4c1dabbdf3a57bf355d2", size = 11304315, upload-time = "2026-03-05T20:06:10.867Z" }, + { url = "https://files.pythonhosted.org/packages/28/3a/950367aee7c69027f4f422059227b290ed780366b6aecee5de5039d50fa8/ruff-0.15.5-py3-none-win32.whl", hash = "sha256:732e5ee1f98ba5b3679029989a06ca39a950cced52143a0ea82a2102cb592b74", size = 10551676, upload-time = "2026-03-05T20:06:13.705Z" }, + { url = "https://files.pythonhosted.org/packages/b8/00/bf077a505b4e649bdd3c47ff8ec967735ce2544c8e4a43aba42ee9bf935d/ruff-0.15.5-py3-none-win_amd64.whl", hash = "sha256:821d41c5fa9e19117616c35eaa3f4b75046ec76c65e7ae20a333e9a8696bc7fe", size = 11678972, upload-time = "2026-03-05T20:06:45.379Z" }, + { url = "https://files.pythonhosted.org/packages/fe/4e/cd76eca6db6115604b7626668e891c9dd03330384082e33662fb0f113614/ruff-0.15.5-py3-none-win_arm64.whl", hash = "sha256:b498d1c60d2fe5c10c45ec3f698901065772730b411f164ae270bb6bfcc4740b", size = 10965572, upload-time = "2026-03-05T20:06:16.984Z" }, ] [[package]] name = "sqlitefts" -version = "1.0.1" +version = "2.0.dev0" source = { editable = "." } dependencies = [ - { name = "cffi", version = "1.15.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8' and platform_python_implementation != 'PyPy'" }, - { name = "cffi", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*' and platform_python_implementation != 'PyPy'" }, - { name = "cffi", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "cffi", marker = "python_full_version >= '3.14' or platform_python_implementation != 'PyPy'" }, ] [package.dev-dependencies] dev = [ - { name = "faker", marker = "python_full_version >= '3.12'" }, - { name = "mypy", marker = "python_full_version >= '3.12'" }, - { name = "pytest", marker = "python_full_version >= '3.12'" }, - { name = "ruff", marker = "python_full_version >= '3.12'" }, - { name = "types-cffi", marker = "python_full_version >= '3.12'" }, + { name = "faker", marker = "python_full_version >= '3.13'" }, + { name = "mypy", marker = "python_full_version >= '3.13'" }, + { name = "pytest", marker = "python_full_version >= '3.13'" }, + { name = "ruff", marker = "python_full_version >= '3.13'" }, + { name = "ty", marker = "python_full_version >= '3.13'" }, + { name = "types-cffi", marker = "python_full_version >= '3.13'" }, ] [package.metadata] requires-dist = [ - { name = "cffi", marker = "python_full_version >= '3.9'", specifier = ">=1.17.0" }, { name = "cffi", marker = "python_full_version >= '3.14'", specifier = ">=2.0.0" }, - { name = "cffi", marker = "platform_python_implementation != 'PyPy'", specifier = ">=1.15.1" }, + { name = "cffi", marker = "platform_python_implementation != 'PyPy'", specifier = ">=1.17.0" }, ] [package.metadata.requires-dev] dev = [ - { name = "faker", marker = "python_full_version >= '3.12'", specifier = ">=30.0.0" }, - { name = "mypy", marker = "python_full_version >= '3.12'", specifier = ">=1.11.2" }, - { name = "pytest", marker = "python_full_version >= '3.12'", specifier = ">=8.3.2" }, - { name = "ruff", marker = "python_full_version >= '3.12'", specifier = ">=0.6.2" }, - { name = "types-cffi", marker = "python_full_version >= '3.12'", specifier = ">=1.16.0.0" }, + { name = "faker", marker = "python_full_version >= '3.13'", specifier = ">=30.0.0" }, + { name = "mypy", marker = "python_full_version >= '3.13'", specifier = ">=1.11.2" }, + { name = "pytest", marker = "python_full_version >= '3.13'", specifier = ">=8.3.2" }, + { name = "ruff", marker = "python_full_version >= '3.13'", specifier = ">=0.6.2" }, + { name = "ty", marker = "python_full_version >= '3.13'", specifier = ">=0.0.1a20" }, + { name = "types-cffi", marker = "python_full_version >= '3.13'", specifier = ">=1.16.0.0" }, +] + +[[package]] +name = "ty" +version = "0.0.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/20/2ba8fd9493c89c41dfe9dbb73bc70a28b28028463bc0d2897ba8be36230a/ty-0.0.21.tar.gz", hash = "sha256:a4c2ba5d67d64df8fcdefd8b280ac1149d24a73dbda82fa953a0dff9d21400ed", size = 5297967, upload-time = "2026-03-06T01:57:13.809Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/70/edf38bb37517531681d1c37f5df64744e5ad02673c02eb48447eae4bea08/ty-0.0.21-py3-none-linux_armv6l.whl", hash = "sha256:7bdf2f572378de78e1f388d24691c89db51b7caf07cf90f2bfcc1d6b18b70a76", size = 10299222, upload-time = "2026-03-06T01:57:16.64Z" }, + { url = "https://files.pythonhosted.org/packages/72/62/0047b0bd19afeefbc7286f20a5f78a2aa39f92b4d89853f0d7185ab89edc/ty-0.0.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:7e9613994610431ab8625025bd2880dbcb77c5c9fabdd21134cda12d840a529d", size = 10130513, upload-time = "2026-03-06T01:57:29.93Z" }, + { url = "https://files.pythonhosted.org/packages/a2/20/0b93a9e91aaed23155780258cdfdb4726ef68b6985378ac069bc427291a0/ty-0.0.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:56d3b198b64dd0a19b2b66e257deaed2ecea568e722ae5352f3c6fb62027f89d", size = 9605425, upload-time = "2026-03-06T01:57:27.115Z" }, + { url = "https://files.pythonhosted.org/packages/ea/fd/9945e2fa2996a1287b1e1d7ce050e97e1f420233b271e770934bfa0880a0/ty-0.0.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d23d2c34f7a77d974bb08f0860ef700addc8a683d81a0319f71c08f87506cfd0", size = 10108298, upload-time = "2026-03-06T01:57:35.429Z" }, + { url = "https://files.pythonhosted.org/packages/52/e7/4ec52fcb15f3200826c9f048472c062549a05b0d1ef0b51f32d527b513c4/ty-0.0.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:56b01fd2519637a4ca88344f61c96225f540c98ff18bca321d4eaa7bb0f7aa2f", size = 10121556, upload-time = "2026-03-06T01:57:03.242Z" }, + { url = "https://files.pythonhosted.org/packages/ee/c0/ad457be2a8abea0f25549598bd098554540ced66229488daa0d558dad3c8/ty-0.0.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9de7e11c63c6afc40f3e9ba716374add171aee7fabc70b5146a510705c6d41b", size = 10603264, upload-time = "2026-03-06T01:56:52.134Z" }, + { url = "https://files.pythonhosted.org/packages/f8/5b/2ecc7a2175243a4bcb72f5298ae41feabbb93b764bb0dc45722f3752c2c2/ty-0.0.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:62f7f5b235c4f7876db305c36997aea07b7af29b1a068f373d0e2547e25f32ff", size = 11196428, upload-time = "2026-03-06T01:57:32.94Z" }, + { url = "https://files.pythonhosted.org/packages/37/f5/aff507d6a901f328ef96a298032b0c11aaaf950a146ed7dd3b5bf2cd3acf/ty-0.0.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ee8399f7c453a425291e6688efe430cfae7ab0ac4ffd50eba9f872bf878b54f6", size = 10866355, upload-time = "2026-03-06T01:56:57.831Z" }, + { url = "https://files.pythonhosted.org/packages/be/30/822bbcb92d55b65989aa7ed06d9585f28ade9c9447369194ed4b0fb3b5b9/ty-0.0.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210e7568c9f886c4d01308d751949ee714ad7ad9d7d928d2ba90d329dd880367", size = 10738177, upload-time = "2026-03-06T01:57:11.256Z" }, + { url = "https://files.pythonhosted.org/packages/57/cc/46e7991b6469e93ac2c7e533a028983e402485580150ac864c56352a3a82/ty-0.0.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:53508e345b11569f78b21ba8e2b4e61df38a9754947fb3cd9f2ef574367338fb", size = 10079158, upload-time = "2026-03-06T01:57:00.516Z" }, + { url = "https://files.pythonhosted.org/packages/15/c2/0bbdadfbd008240f8f1a87dc877433cb3884436097926107ccf06e618199/ty-0.0.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:553e43571f4a35604c36cfd07d8b61a5eb7a714e3c67f8c4ff2cf674fefbaef9", size = 10150535, upload-time = "2026-03-06T01:57:08.815Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b5/2dbdb7b57b5362200ef0a39738ebd31331726328336def0143ac097ee59d/ty-0.0.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:666f6822e3b9200abfa7e95eb0ddd576460adb8d66b550c0ad2c70abc84a2048", size = 10319803, upload-time = "2026-03-06T01:57:19.106Z" }, + { url = "https://files.pythonhosted.org/packages/72/84/70e52c0b7abc7c2086f9876ef454a73b161d3125315536d8d7e911c94ca4/ty-0.0.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a0854d008347ce4a5fb351af132f660a390ab2a1163444d075251d43e6f74b9b", size = 10826239, upload-time = "2026-03-06T01:57:21.727Z" }, + { url = "https://files.pythonhosted.org/packages/a1/8a/1f72480fd013bbc6cd1929002abbbcde9a0b08ead6a15154de9d7f7fa37e/ty-0.0.21-py3-none-win32.whl", hash = "sha256:bef3ab4c7b966bcc276a8ac6c11b63ba222d21355b48d471ea782c4104eee4e0", size = 9693196, upload-time = "2026-03-06T01:57:24.126Z" }, + { url = "https://files.pythonhosted.org/packages/8d/f8/1104808b875c26c640e536945753a78562d606bef4e241d9dbf3d92477f6/ty-0.0.21-py3-none-win_amd64.whl", hash = "sha256:a709d576e5bea84b745d43058d8b9cd4f27f74a0b24acb4b0cbb7d3d41e0d050", size = 10668660, upload-time = "2026-03-06T01:56:55.06Z" }, + { url = "https://files.pythonhosted.org/packages/1b/b8/25e0adc404bbf986977657b25318991f93097b49f8aea640d93c0b0db68e/ty-0.0.21-py3-none-win_arm64.whl", hash = "sha256:f72047996598ac20553fb7e21ba5741e3c82dee4e9eadf10d954551a5fe09391", size = 10104161, upload-time = "2026-03-06T01:57:06.072Z" }, ] [[package]] name = "types-cffi" -version = "1.17.0.20250822" +version = "1.17.0.20260307" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "types-setuptools", marker = "python_full_version >= '3.12'" }, + { name = "types-setuptools", marker = "python_full_version >= '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/da/0c/76a48cb6e742cac4d61a4ec632dd30635b6d302f5acdc2c0a27572ac7ae3/types_cffi-1.17.0.20250822.tar.gz", hash = "sha256:bf6f5a381ea49da7ff895fae69711271e6192c434470ce6139bf2b2e0d0fa08d", size = 17130, upload-time = "2025-08-22T03:04:02.445Z" } +sdist = { url = "https://files.pythonhosted.org/packages/06/cf/f727256b5b17e8d54a08e3c40877b3c49fdb35e7f683f9ee295bd4df51e1/types_cffi-1.17.0.20260307.tar.gz", hash = "sha256:1a4f1168d43ed8cd2b0ed40a3eb870cda685a154d98478b0a65862084f190a02", size = 17437, upload-time = "2026-03-07T03:49:26.106Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/21/f7/68029931e7539e3246b33386a19c475f234c71d2a878411847b20bb31960/types_cffi-1.17.0.20250822-py3-none-any.whl", hash = "sha256:183dd76c1871a48936d7b931488e41f0f25a7463abe10b5816be275fc11506d5", size = 20083, upload-time = "2025-08-22T03:04:01.466Z" }, + { url = "https://files.pythonhosted.org/packages/c8/15/4564f173d031f64bf56964d192b6b705e679fc23c02704b84ccbcb809396/types_cffi-1.17.0.20260307-py3-none-any.whl", hash = "sha256:89b5b2c798d32fc6e3304903ed99af93fd608b741483ce7d57fa69eda40430e5", size = 20115, upload-time = "2026-03-07T03:49:25.031Z" }, ] [[package]] name = "types-setuptools" -version = "80.9.0.20250822" +version = "82.0.0.20260210" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/19/bd/1e5f949b7cb740c9f0feaac430e301b8f1c5f11a81e26324299ea671a237/types_setuptools-80.9.0.20250822.tar.gz", hash = "sha256:070ea7716968ec67a84c7f7768d9952ff24d28b65b6594797a464f1b3066f965", size = 41296, upload-time = "2025-08-22T03:02:08.771Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4b/90/796ac8c774a7f535084aacbaa6b7053d16fff5c630eff87c3ecff7896c37/types_setuptools-82.0.0.20260210.tar.gz", hash = "sha256:d9719fbbeb185254480ade1f25327c4654f8c00efda3fec36823379cebcdee58", size = 44768, upload-time = "2026-02-10T04:22:02.107Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/2d/475bf15c1cdc172e7a0d665b6e373ebfb1e9bf734d3f2f543d668b07a142/types_setuptools-80.9.0.20250822-py3-none-any.whl", hash = "sha256:53bf881cb9d7e46ed12c76ef76c0aaf28cfe6211d3fab12e0b83620b1a8642c3", size = 63179, upload-time = "2025-08-22T03:02:07.643Z" }, + { url = "https://files.pythonhosted.org/packages/3e/54/3489432b1d9bc713c9d8aa810296b8f5b0088403662959fb63a8acdbd4fc/types_setuptools-82.0.0.20260210-py3-none-any.whl", hash = "sha256:5124a7daf67f195c6054e0f00f1d97c69caad12fdcf9113eba33eff0bce8cd2b", size = 68433, upload-time = "2026-02-10T04:22:00.876Z" }, ] [[package]] @@ -529,9 +437,9 @@ wheels = [ [[package]] name = "tzdata" -version = "2025.2" +version = "2025.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, ]