diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 748ec063..00000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,11 +0,0 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file - -version: 2 -updates: - - package-ecosystem: "github-actions" # See documentation for possible values - directory: "/" # Location of package manifests - schedule: - interval: "daily" diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index dc968523..3e4e4a50 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -6,11 +6,11 @@ env: on: push: - branches: [main, ci/*, dependabot/*, renovate/*] + branches: [ main, ci/*, dependabot/*, renovate/* ] tags: - "v*.*.*" pull_request: - branches: [main] + branches: [ main ] concurrency: group: ${{ github.head_ref || github.run_id }} @@ -57,7 +57,7 @@ jobs: tests: name: 🔬 ${{ matrix.session.job_name }} - needs: [pre, generate-jobs-tests] + needs: [ pre, generate-jobs-tests ] if: github.ref_type == 'tag' || needs.pre.outputs.should_skip != 'true' runs-on: ubuntu-latest strategy: @@ -119,9 +119,46 @@ jobs: name: test-results-${{ matrix.session.session }} path: junit-${{ matrix.session.session }}.xml + benchmarks: + name: 📈 Run benchmarks + needs: [ tests, generate-jobs-tests ] + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Set up Docker Buildx + id: docker-buildx + uses: docker/setup-buildx-action@v3 + + - name: Pip and nox cache + id: cache + uses: actions/cache@v4 + with: + path: | + ~/.cache + key: + ${{ runner.os }}-benchmarks-${{ env.pythonLocation }}-${{ hashFiles('**/uv.lock') }} + restore-keys: | + ${{ runner.os }}-benchmarks-${{ env.pythonLocation }} + + - name: Setup mise + uses: jdx/mise-action@v3 + with: + cache: true + log_level: debug + + - name: Run the benchmarks + uses: CodSpeedHQ/action@v4 + with: + mode: instrumentation + run: mise run test:benchmarks + token: ${{ secrets.CODSPEED_TOKEN }} # optional for public repos + + upload-coverage: name: 🆙 Upload Coverage - needs: [tests, generate-jobs-tests] + needs: [ tests, generate-jobs-tests ] runs-on: ubuntu-latest steps: @@ -155,7 +192,7 @@ jobs: upload-test-results: name: 📊 Upload test results - needs: [tests, generate-jobs-tests] + needs: [ tests, generate-jobs-tests ] runs-on: ubuntu-latest strategy: matrix: @@ -208,6 +245,7 @@ jobs: - pre - tests - lint + - benchmarks steps: - name: Mark workflow as failed if lint or test did not pass or were cancelled if: contains(fromJson('["failure", "cancelled"]'), needs.tests.result) || contains(fromJson('["failure", "cancelled"]'), needs.lint.result) diff --git a/.gitignore b/.gitignore index 4b27c3b2..99603785 100644 --- a/.gitignore +++ b/.gitignore @@ -192,3 +192,5 @@ mise.local.toml .windsurf CLAUDE.md + +.codspeed diff --git a/mise.toml b/mise.toml index 79b1ae25..327f893d 100644 --- a/mise.toml +++ b/mise.toml @@ -47,6 +47,11 @@ description = "Install dependencies" hide = true run = "uv sync --all-extras --dev" +[tasks."_install:test"] +description = "Install test dependencies" +hide = true +run = "uv sync --all-extras --only-group test" + [tasks."_install:geo"] description = "Install dependencies with geo extras" hide = true @@ -149,6 +154,12 @@ description = "Run snapshot-based tests and update snapshots" depends = "_install" run = "uv run pytest {{vars.local_pytest_options}} -m snapshot --snapshot-update" +[tasks."test:benchmarks"] +description = "Run benchmarks" +depends = "_install:test" +run = "uv run pytest --codspeed tests/benchmarks" + + # ############### # CI # ############### diff --git a/pyproject.toml b/pyproject.toml index adcea17a..df9c75e9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -80,6 +80,7 @@ test = [ "pytest-xdist", "pytest-databases[postgres,mysql]", "pytest-lazy-fixtures", + "pytest-codspeed", "syrupy", "sqlparse", "covdefaults", @@ -296,12 +297,13 @@ markers = [ "snapshot: snapshot-based tests using syrupy", "integration: SQLAlchemy integration tests", "geo: Geoalchemy2 integration tests", - "aiosqlite: SQLite (aiosqlite) Tests", - "sqlite: SQLite Tests", - "asyncmy: MySQL (asyncmy) Tests", - "psycopg_async: SQLAlchemy Postgres (psycopg async) Tests", - "psycopg_sync: SQLAlchemy Postgres (psycopg sync) Tests", - "asyncpg: SQLAlchemy Postgres (asyncpg) Tests", + "aiosqlite: SQLite (aiosqlite) tests", + "sqlite: SQLite tests", + "asyncmy: MySQL (asyncmy) tests", + "psycopg_async: SQLAlchemy Postgres (psycopg async) tests", + "psycopg_sync: SQLAlchemy Postgres (psycopg sync) tests", + "asyncpg: SQLAlchemy Postgres (asyncpg) tests", + "benchmark: Benchmark tests" ] testpaths = ["tests"] xfail_strict = true diff --git a/tasks.md b/tasks.md index 8e07cd31..adc4bf60 100644 --- a/tasks.md +++ b/tasks.md @@ -146,6 +146,14 @@ Run tests #### `[test]` +## `test:benchmarks` + +- Depends: _install:test + +- **Usage**: `test:benchmarks` + +Run benchmarks + ## `test:coverage` - Depends: _install diff --git a/tests/benchmarks/__init__.py b/tests/benchmarks/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/benchmarks/conftest.py b/tests/benchmarks/conftest.py new file mode 100644 index 00000000..629ff40e --- /dev/null +++ b/tests/benchmarks/conftest.py @@ -0,0 +1,94 @@ +from __future__ import annotations + +from tests.integration.fixtures import ( + aiosqlite_engine, + any_query, + any_session, + async_engine, + async_mutation, + async_query, + async_session, + asyncmy_engine, + asyncpg_engine, + before_create_all_statements, + config, + db_features, + dialect, + engine, + fx_metadata, + mapper, + no_session_query, + postgis_service, + postgres_database_service, + psycopg_async_engine, + psycopg_engine, + query_tracker, + raw_arrays, + raw_colors, + raw_date_times, + raw_farms, + raw_fruits, + raw_geo, + raw_geo_flipped, + raw_groups, + raw_intervals, + raw_json, + raw_topics, + raw_users, + seed_db_async, + seed_db_sync, + seed_insert_statements, + session, + sqlite_engine, + sync_mutation, + sync_query, +) + +from .fixtures import fx_strawchemy_mysql, fx_strawchemy_postgresql, fx_strawchemy_sqlite + +__all__ = ( + "aiosqlite_engine", + "any_query", + "any_session", + "async_engine", + "async_mutation", + "async_query", + "async_session", + "asyncmy_engine", + "asyncpg_engine", + "before_create_all_statements", + "config", + "db_features", + "dialect", + "engine", + "fx_metadata", + "fx_strawchemy_mysql", + "fx_strawchemy_postgresql", + "fx_strawchemy_sqlite", + "mapper", + "no_session_query", + "postgis_service", + "postgres_database_service", + "psycopg_async_engine", + "psycopg_engine", + "query_tracker", + "raw_arrays", + "raw_colors", + "raw_date_times", + "raw_farms", + "raw_fruits", + "raw_geo", + "raw_geo_flipped", + "raw_groups", + "raw_intervals", + "raw_json", + "raw_topics", + "raw_users", + "seed_db_async", + "seed_db_sync", + "seed_insert_statements", + "session", + "sqlite_engine", + "sync_mutation", + "sync_query", +) diff --git a/tests/benchmarks/fixtures.py b/tests/benchmarks/fixtures.py new file mode 100644 index 00000000..6e7e285f --- /dev/null +++ b/tests/benchmarks/fixtures.py @@ -0,0 +1,19 @@ +from __future__ import annotations + +import pytest +from strawchemy import Strawchemy + + +@pytest.fixture(name="strawchemy_postgresql") +def fx_strawchemy_postgresql() -> Strawchemy: + return Strawchemy("postgresql") + + +@pytest.fixture(name="strawchemy_sqlite") +def fx_strawchemy_sqlite() -> Strawchemy: + return Strawchemy("sqlite") + + +@pytest.fixture(name="strawchemy_mysql") +def fx_strawchemy_mysql() -> Strawchemy: + return Strawchemy("mysql") diff --git a/tests/benchmarks/test_build_schema.py b/tests/benchmarks/test_build_schema.py new file mode 100644 index 00000000..acdd3fa6 --- /dev/null +++ b/tests/benchmarks/test_build_schema.py @@ -0,0 +1,59 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pytest +from pytest_lazy_fixtures import lf +from strawchemy import StrawchemySyncRepository + +from tests.integration.models import User + +if TYPE_CHECKING: + from pytest_codspeed import BenchmarkFixture + from strawchemy import Strawchemy + + +@pytest.mark.benchmark(group="schema") +@pytest.mark.parametrize("strawchemy", [lf("strawchemy_postgresql"), lf("strawchemy_sqlite"), lf("strawchemy_mysql")]) +def test_build_user_type(strawchemy: Strawchemy) -> None: + strawchemy.type(User, include="all", override=True)(type("UserType", (), {})) + + +@pytest.mark.benchmark(group="schema") +@pytest.mark.parametrize("strawchemy", [lf("strawchemy_postgresql"), lf("strawchemy_sqlite"), lf("strawchemy_mysql")]) +def test_build_user_filter(strawchemy: Strawchemy) -> None: + strawchemy.filter(User, include="all", override=True)(type("UserFilter", (), {})) + + +@pytest.mark.benchmark(group="schema") +@pytest.mark.parametrize("strawchemy", [lf("strawchemy_postgresql"), lf("strawchemy_sqlite"), lf("strawchemy_mysql")]) +def test_build_user_create_input(strawchemy: Strawchemy) -> None: + strawchemy.create_input(User, include="all", override=True)(type("UserFilter", (), {})) + + +@pytest.mark.benchmark(group="schema") +@pytest.mark.parametrize("strawchemy", [lf("strawchemy_postgresql"), lf("strawchemy_sqlite"), lf("strawchemy_mysql")]) +def test_build_user_pk_update_input(strawchemy: Strawchemy) -> None: + strawchemy.create_input(User, include="all", override=True)(type("UserFilter", (), {})) + + +@pytest.mark.benchmark(group="schema") +@pytest.mark.parametrize("strawchemy", [lf("strawchemy_postgresql"), lf("strawchemy_sqlite"), lf("strawchemy_mysql")]) +def test_build_user_query_field(strawchemy: Strawchemy, benchmark: BenchmarkFixture) -> None: + @strawchemy.filter(User, include="all", override=True) + class UserFilter: ... + + @strawchemy.order(User, include="all", override=True) + class UserOrderBy: ... + + @strawchemy.distinct_on(User, include="all", override=True) + class UserDistinctOn: ... + + benchmark( + lambda: strawchemy.field( + filter_input=UserFilter, + order_by=UserOrderBy, + distinct_on=UserDistinctOn, + repository_type=StrawchemySyncRepository, + ) + ) diff --git a/tests/benchmarks/test_queries.py b/tests/benchmarks/test_queries.py new file mode 100644 index 00000000..413fbf74 --- /dev/null +++ b/tests/benchmarks/test_queries.py @@ -0,0 +1,23 @@ +from __future__ import annotations + +import pytest + +from tests.integration.typing import RawRecordData +from tests.typing import AnyQueryExecutor +from tests.utils import maybe_async + + +@pytest.mark.benchmark(group="queries") +async def test_single(any_query: AnyQueryExecutor, raw_users: RawRecordData) -> None: + await maybe_async( + any_query( + """ + query GetUser($id: Int!) { + user(id: $id) { + name + } + } + """, + {"id": raw_users[0]["id"]}, + ) + ) diff --git a/uv.lock b/uv.lock index 035763f0..e5265029 100644 --- a/uv.lock +++ b/uv.lock @@ -6,13 +6,16 @@ resolution-markers = [ "python_full_version >= '3.10' and python_full_version < '3.13' and extra != 'group-10-strawchemy-build' and extra == 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", "python_full_version < '3.10' and extra != 'group-10-strawchemy-build' and extra == 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", "python_full_version >= '3.13' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", - "python_full_version >= '3.10' and python_full_version < '3.13' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", + "python_full_version == '3.12.*' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", + "python_full_version >= '3.10' and python_full_version < '3.12' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", "python_full_version < '3.10' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", "python_full_version >= '3.13' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", - "python_full_version >= '3.10' and python_full_version < '3.13' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", + "python_full_version == '3.12.*' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", + "python_full_version >= '3.10' and python_full_version < '3.12' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", "python_full_version < '3.10' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", "python_full_version >= '3.13' and extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", - "python_full_version >= '3.10' and python_full_version < '3.13' and extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", + "python_full_version == '3.12.*' and extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", + "python_full_version >= '3.10' and python_full_version < '3.12' and extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", "python_full_version < '3.10' and extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", "python_full_version >= '3.10' and extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", "python_full_version < '3.10' and extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", @@ -1990,11 +1993,14 @@ resolution-markers = [ "python_full_version >= '3.13' and extra != 'group-10-strawchemy-build' and extra == 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", "python_full_version >= '3.10' and python_full_version < '3.13' and extra != 'group-10-strawchemy-build' and extra == 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", "python_full_version >= '3.13' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", - "python_full_version >= '3.10' and python_full_version < '3.13' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", + "python_full_version == '3.12.*' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", + "python_full_version >= '3.10' and python_full_version < '3.12' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", "python_full_version >= '3.13' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", - "python_full_version >= '3.10' and python_full_version < '3.13' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", + "python_full_version == '3.12.*' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", + "python_full_version >= '3.10' and python_full_version < '3.12' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", "python_full_version >= '3.13' and extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", - "python_full_version >= '3.10' and python_full_version < '3.13' and extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", + "python_full_version == '3.12.*' and extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", + "python_full_version >= '3.10' and python_full_version < '3.12' and extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", "python_full_version >= '3.10' and extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", ] sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } @@ -2436,6 +2442,59 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/30/05/ce271016e351fddc8399e546f6e23761967ee09c8c568bbfbecb0c150171/pytest_asyncio-1.0.0-py3-none-any.whl", hash = "sha256:4f024da9f1ef945e680dc68610b52550e36590a67fd31bb3b4943979a1f90ef3", size = 15976, upload-time = "2025-05-26T04:54:39.035Z" }, ] +[[package]] +name = "pytest-codspeed" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13'", + "python_full_version == '3.12.*'", + "python_full_version >= '3.10' and python_full_version < '3.12'", + "python_full_version < '3.10'", +] +dependencies = [ + { name = "cffi", marker = "extra == 'group-10-strawchemy-build' or extra == 'group-10-strawchemy-dev'" }, + { name = "filelock", marker = "extra == 'group-10-strawchemy-build' or extra == 'group-10-strawchemy-dev'" }, + { name = "pytest", marker = "extra == 'group-10-strawchemy-build' or extra == 'group-10-strawchemy-dev'" }, + { name = "setuptools", marker = "(python_full_version >= '3.12' and extra == 'group-10-strawchemy-build') or (python_full_version >= '3.12' and extra == 'group-10-strawchemy-dev') or (extra == 'group-10-strawchemy-build' and extra == 'group-10-strawchemy-codeflash') or (extra == 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/40/6a/ba0b067dba286443a04c9d32ff75ef3bc169617ee347d1a97972ada62665/pytest_codspeed-2.2.1.tar.gz", hash = "sha256:0adc24baf01c64a6ca0a0b83b3cd704351708997e09ec086b7776c32227d4e0a", size = 9163, upload-time = "2024-03-19T21:59:57.142Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/0b/e3541064afcf24ed54bcabfa6eb5f8083eb335d5c58c7b5b95bc31127f86/pytest_codspeed-2.2.1-py3-none-any.whl", hash = "sha256:aad08033015f3e6c8c14c8bf0eca475921a9b088e92c98b626bf8af8f516471e", size = 10126, upload-time = "2024-03-19T21:59:55.388Z" }, +] + +[[package]] +name = "pytest-codspeed" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13' and extra != 'group-10-strawchemy-build' and extra == 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", + "python_full_version >= '3.10' and python_full_version < '3.13' and extra != 'group-10-strawchemy-build' and extra == 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", + "python_full_version < '3.10' and extra != 'group-10-strawchemy-build' and extra == 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", + "python_full_version >= '3.10' and extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", + "python_full_version < '3.10' and extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", +] +dependencies = [ + { name = "cffi", marker = "extra == 'group-10-strawchemy-codeflash' or (extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-dev')" }, + { name = "importlib-metadata", version = "8.7.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.10' and extra == 'group-10-strawchemy-codeflash') or (python_full_version < '3.10' and extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-dev') or (extra == 'group-10-strawchemy-build' and extra == 'group-10-strawchemy-codeflash') or (extra == 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev')" }, + { name = "pytest", marker = "extra == 'group-10-strawchemy-codeflash' or (extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-dev')" }, + { name = "rich", version = "14.1.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-10-strawchemy-codeflash' or (extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-dev')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/64/13/4989d50a3d6de9fb91de23f3b6ffce7c704f23516d308138242325a7c857/pytest_codspeed-4.0.0.tar.gz", hash = "sha256:0e9af08ca93ad897b376771db92693a81aa8990eecc2a778740412e00a6f6eaf", size = 107630, upload-time = "2025-07-10T08:37:53.518Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/c9/c7116338e04d1c6bb43277c5f938fa7e5eb1df54b4cc0c298a428995296b/pytest_codspeed-4.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2517731b20a6aa9fe61d04822b802e1637ee67fd865189485b384a9d5897117f", size = 230409, upload-time = "2025-07-10T08:37:40.83Z" }, + { url = "https://files.pythonhosted.org/packages/e6/00/c21b0e2863c967c8d4dfa5bebdc5f0f2a9d6ab1cc7a39e111faf70a5880d/pytest_codspeed-4.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1e5076bb5119d4f8248822b5cd6b768f70a18c7e1a7fbcd96a99cd4a6430096e", size = 221135, upload-time = "2025-07-10T08:37:42.255Z" }, + { url = "https://files.pythonhosted.org/packages/7f/e7/16b0f347fd910f2cc50e858094c17744d640e5ae71926c2c0ad762ecb7ec/pytest_codspeed-4.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:06b324acdfe2076a0c97a9d31e8645f820822d6f0e766c73426767ff887a9381", size = 230418, upload-time = "2025-07-10T08:37:43.602Z" }, + { url = "https://files.pythonhosted.org/packages/47/a7/2b3ac30e1e2b326abf370c8a6b4ed48a43d3a5491def7aaf67f7fbab5d6f/pytest_codspeed-4.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ebdac1a4d6138e1ca4f5391e7e3cafad6e3aa6d5660d1b243871b691bc1396c", size = 221131, upload-time = "2025-07-10T08:37:44.708Z" }, + { url = "https://files.pythonhosted.org/packages/11/e4/a9591949783cdea60d5f2a215d89c3e17af7b068f2613e38b1d46cb5b8e9/pytest_codspeed-4.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f3def79d4072867d038a33e7f35bc7fb1a2a75236a624b3a690c5540017cb38", size = 230601, upload-time = "2025-07-10T08:37:46.018Z" }, + { url = "https://files.pythonhosted.org/packages/16/fe/22caa7cfb6717d21ba14ffd3c0b013b2143a4c32225715f401489f6c32bc/pytest_codspeed-4.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01d29d4538c2d111c0034f71811bcce577304506d22af4dd65df87fadf3ab495", size = 221230, upload-time = "2025-07-10T08:37:46.997Z" }, + { url = "https://files.pythonhosted.org/packages/55/e2/0a2e703301f7560a456e343e1b31d01a2ddee96807db5ded65951bfa5b7a/pytest_codspeed-4.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90894c93c9e23f12487b7fdf16c28da8f6275d565056772072beb41a72a54cf9", size = 230591, upload-time = "2025-07-10T08:37:47.961Z" }, + { url = "https://files.pythonhosted.org/packages/17/fc/5fee0bcdada8ecb5a89088cd84af7e094652fc94bf414a96b49a874fd8be/pytest_codspeed-4.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:79e9c40852fa7fc76776db4f1d290eceaeee2d6c5d2dc95a66c7cc690d83889e", size = 221227, upload-time = "2025-07-10T08:37:49.113Z" }, + { url = "https://files.pythonhosted.org/packages/96/af/4b04220fb0124824c950f974456d5f64446626a5795217e85de4b10a0c14/pytest_codspeed-4.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7330b6eadd6a729d4dba95d26496ee1c6f1649d552f515ef537b14a43908eb67", size = 230397, upload-time = "2025-07-10T08:37:50.435Z" }, + { url = "https://files.pythonhosted.org/packages/50/5f/14223d692f34b5523a7b8ab977ab04dd4b7c1313d2a91c5f4001db5161a6/pytest_codspeed-4.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1271cd28e895132b20d12875554a544ee041f7acfb8112af8a5c3cb201f2fc8", size = 221123, upload-time = "2025-07-10T08:37:51.393Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e4/e3ddab5fd04febf6189d71bfa4ba2d7c05adaa7d692a6d6b1e8ed68de12d/pytest_codspeed-4.0.0-py3-none-any.whl", hash = "sha256:c5debd4b127dc1c507397a8304776f52cabbfa53aad6f51eae329a5489df1e06", size = 107084, upload-time = "2025-07-10T08:37:52.65Z" }, +] + [[package]] name = "pytest-cov" version = "6.1.1" @@ -2683,7 +2742,8 @@ version = "13.6.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.13'", - "python_full_version >= '3.10' and python_full_version < '3.13'", + "python_full_version == '3.12.*'", + "python_full_version >= '3.10' and python_full_version < '3.12'", "python_full_version < '3.10'", ] dependencies = [ @@ -2779,6 +2839,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2d/3e/bb34de65a5787f76848a533afbb6610e01fbcdd59e76d8679c254e02255c/sentry_sdk-2.34.1-py2.py3-none-any.whl", hash = "sha256:b7a072e1cdc5abc48101d5146e1ae680fa81fe886d8d95aaa25a0b450c818d32", size = 357743, upload-time = "2025-07-30T11:13:36.145Z" }, ] +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, +] + [[package]] name = "shapely" version = "2.0.7" @@ -2831,11 +2900,14 @@ resolution-markers = [ "python_full_version >= '3.13' and extra != 'group-10-strawchemy-build' and extra == 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", "python_full_version >= '3.10' and python_full_version < '3.13' and extra != 'group-10-strawchemy-build' and extra == 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", "python_full_version >= '3.13' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", - "python_full_version >= '3.10' and python_full_version < '3.13' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", + "python_full_version == '3.12.*' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", + "python_full_version >= '3.10' and python_full_version < '3.12' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", "python_full_version >= '3.13' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", - "python_full_version >= '3.10' and python_full_version < '3.13' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", + "python_full_version == '3.12.*' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", + "python_full_version >= '3.10' and python_full_version < '3.12' and extra == 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", "python_full_version >= '3.13' and extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", - "python_full_version >= '3.10' and python_full_version < '3.13' and extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", + "python_full_version == '3.12.*' and extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", + "python_full_version >= '3.10' and python_full_version < '3.12' and extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev'", "python_full_version >= '3.10' and extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-codeflash' and extra != 'group-10-strawchemy-dev'", ] dependencies = [ @@ -3038,6 +3110,7 @@ dev = [ { name = "psycopg", extra = ["binary", "pool"], marker = "(extra == 'group-10-strawchemy-build' and extra == 'group-10-strawchemy-codeflash') or (extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev') or (extra != 'group-10-strawchemy-build' and extra == 'group-10-strawchemy-dev')" }, { name = "pytest" }, { name = "pytest-asyncio" }, + { name = "pytest-codspeed", version = "2.2.1", source = { registry = "https://pypi.org/simple" } }, { name = "pytest-cov" }, { name = "pytest-databases", extra = ["mysql", "postgres"], marker = "(extra == 'group-10-strawchemy-build' and extra == 'group-10-strawchemy-codeflash') or (extra != 'group-10-strawchemy-codeflash' and extra == 'group-10-strawchemy-dev') or (extra != 'group-10-strawchemy-build' and extra == 'group-10-strawchemy-dev')" }, { name = "pytest-lazy-fixtures" }, @@ -3077,6 +3150,8 @@ test = [ { name = "psycopg", extra = ["binary", "pool"] }, { name = "pytest" }, { name = "pytest-asyncio" }, + { name = "pytest-codspeed", version = "2.2.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-10-strawchemy-build' or extra == 'group-10-strawchemy-dev'" }, + { name = "pytest-codspeed", version = "4.0.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'group-10-strawchemy-codeflash' or (extra != 'group-10-strawchemy-build' and extra != 'group-10-strawchemy-dev')" }, { name = "pytest-cov" }, { name = "pytest-databases", extra = ["mysql", "postgres"] }, { name = "pytest-lazy-fixtures" }, @@ -3124,6 +3199,7 @@ dev = [ { name = "psycopg", extras = ["binary", "pool"], specifier = ">=3.2.3" }, { name = "pytest" }, { name = "pytest-asyncio", specifier = ">=0.24" }, + { name = "pytest-codspeed" }, { name = "pytest-cov" }, { name = "pytest-databases", extras = ["postgres", "mysql"] }, { name = "pytest-lazy-fixtures" }, @@ -3161,6 +3237,7 @@ test = [ { name = "psycopg", extras = ["binary", "pool"], specifier = ">=3.2.3" }, { name = "pytest" }, { name = "pytest-asyncio", specifier = ">=0.24" }, + { name = "pytest-codspeed" }, { name = "pytest-cov" }, { name = "pytest-databases", extras = ["postgres", "mysql"] }, { name = "pytest-lazy-fixtures" },