diff --git a/.github/workflows/check-requirements.yml b/.github/workflows/check-requirements.yml new file mode 100644 index 000000000..1861bbb39 --- /dev/null +++ b/.github/workflows/check-requirements.yml @@ -0,0 +1,51 @@ +name: Check Requirements Up-to-Date + +on: + pull_request: + paths: + - "pyproject.toml" + - "uv.lock" + - "requirements/requirements-api.txt" + - ".github/workflows/check-requirements.yml" + push: + branches: [master] + paths: + - "pyproject.toml" + - "uv.lock" + - "requirements/requirements-api.txt" + +permissions: + contents: read + +jobs: + check-requirements: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Install uv + uses: astral-sh/setup-uv@caf0cab7a618c569241d31dcd442f54681755d39 # v3.2.4 + with: + version: "latest" + + - name: Set up Python + run: uv python install 3.12 + + - name: Generate requirements file from lock + run: | + uv export --extra api --no-hashes --format requirements-txt > requirements/requirements-api-check.txt + + - name: Check if requirements file is up-to-date + run: | + if ! diff -u requirements/requirements-api.txt requirements/requirements-api-check.txt; then + echo "❌ Error: requirements/requirements-api.txt is out of date!" + echo "" + echo "Please regenerate it by running:" + echo " uv export --extra api --no-hashes --format requirements-txt > requirements/requirements-api.txt" + echo "" + echo "Then commit the updated file." + exit 1 + else + echo "✅ requirements/requirements-api.txt is up-to-date" + fi diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 37588e115..73cac31c5 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -28,14 +28,6 @@ jobs: tar -xvf clever-tools-${CC_VERSION}_linux.tar.gz PATH=${PATH}:$(pwd)/clever-tools-${CC_VERSION}_linux - - name: Install uv - uses: astral-sh/setup-uv@caf0cab7a618c569241d31dcd442f54681755d39 # v3.2.4 - with: - version: "latest" - - - name: Set up Python - run: uv python install 3.12 - - name: Login to Clever Cloud env: CLEVER_TOKEN: ${{ secrets.CLEVER_TOKEN }} @@ -46,7 +38,6 @@ jobs: CLEVER_APP_ID: ${{ secrets.BE_CLEVER_APP_ID_PROD }} APP_NAME: cc_api_prod run: | - uv pip compile pyproject.toml --extra api --output-file requirements/requirements-api.txt ./clever-tools-latest_linux/clever link $CLEVER_APP_ID ./clever-tools-latest_linux/clever deploy -f diff --git a/requirements/README.md b/requirements/README.md new file mode 100644 index 000000000..6eda827c7 --- /dev/null +++ b/requirements/README.md @@ -0,0 +1,23 @@ +# Requirements Files + +This directory contains pre-compiled requirements files for different use cases. + +## requirements-api.txt + +This file contains all dependencies needed to run the CodeCarbon API server (carbonserver). + +### Updating the file + +When you modify dependencies in `pyproject.toml` or when `uv.lock` changes (especially those under the `[project.optional-dependencies.api]` section), you **must** regenerate this file: + +```bash +uv export --extra api --no-hashes --format requirements-txt > requirements/requirements-api.txt +``` + +Then commit the updated file. + +**Note:** This uses `uv.lock` to ensure fully reproducible builds with the exact same versions that are tested in CI. + +### CI Check + +A GitHub Actions workflow (`.github/workflows/check-requirements.yml`) automatically verifies that this file is up-to-date on every pull request that modifies `pyproject.toml`. If the check fails, simply run the command above and commit the changes. \ No newline at end of file diff --git a/requirements/requirements-api.txt b/requirements/requirements-api.txt new file mode 100644 index 000000000..609aec198 --- /dev/null +++ b/requirements/requirements-api.txt @@ -0,0 +1,821 @@ +# This file was autogenerated by uv via the following command: +# uv export --extra api --no-hashes --format requirements-txt +-e . +alembic==1.12.1 ; python_full_version < '3.8' + # via codecarbon +alembic==1.14.1 ; python_full_version == '3.8.*' + # via codecarbon +alembic==1.16.5 ; python_full_version == '3.9.*' + # via codecarbon +alembic==1.17.2 ; python_full_version >= '3.10' + # via codecarbon +annotated-doc==0.0.4 ; python_full_version >= '3.8' + # via fastapi +anyio==3.7.1 ; python_full_version < '3.8' + # via + # fastapi + # httpcore + # starlette + # watchfiles +anyio==4.5.2 ; python_full_version == '3.8.*' + # via + # httpx + # starlette + # watchfiles +anyio==4.12.0 ; python_full_version >= '3.9' + # via + # httpx + # starlette + # watchfiles +arrow==1.2.3 ; python_full_version < '3.8' + # via codecarbon +arrow==1.4.0 ; python_full_version >= '3.8' + # via codecarbon +asgiref==3.7.2 ; python_full_version < '3.8' + # via opentelemetry-instrumentation-asgi +asgiref==3.8.1 ; python_full_version == '3.8.*' + # via opentelemetry-instrumentation-asgi +asgiref==3.11.0 ; python_full_version >= '3.9' + # via opentelemetry-instrumentation-asgi +backoff==2.2.1 ; python_full_version < '3.8' + # via + # opentelemetry-exporter-otlp-proto-common + # opentelemetry-exporter-otlp-proto-http +backports-zoneinfo==0.2.1 ; python_full_version == '3.8.*' + # via arrow +bcrypt==4.2.1 ; python_full_version < '3.8' + # via codecarbon +bcrypt==4.3.0 ; python_full_version >= '3.8' + # via codecarbon +black==23.3.0 ; python_full_version < '3.8' +black==24.8.0 ; python_full_version == '3.8.*' +black==25.11.0 ; python_full_version >= '3.9' +bumpver==2025.1131 +certifi==2025.11.12 + # via + # httpcore + # httpx + # requests +cffi==1.15.1 ; python_full_version < '3.8' and platform_python_implementation != 'PyPy' + # via cryptography +cffi==1.17.1 ; python_full_version == '3.8.*' and platform_python_implementation != 'PyPy' + # via cryptography +cffi==2.0.0 ; python_full_version >= '3.9' and platform_python_implementation != 'PyPy' + # via cryptography +cfgv==3.3.1 ; python_full_version < '3.8' + # via pre-commit +cfgv==3.4.0 ; python_full_version >= '3.8' and python_full_version < '3.10' + # via pre-commit +cfgv==3.5.0 ; python_full_version >= '3.10' + # via pre-commit +charset-normalizer==3.4.4 + # via requests +click==8.1.8 ; python_full_version < '3.10' + # via + # black + # bumpver + # codecarbon + # typer + # uvicorn +click==8.3.1 ; python_full_version >= '3.10' + # via + # black + # bumpver + # codecarbon + # typer + # uvicorn +colorama==0.4.6 + # via + # bumpver + # click + # halo + # log-symbols + # pytest + # taskipy + # uvicorn +cryptography==45.0.7 ; python_full_version < '3.8' + # via jwcrypto +cryptography==46.0.3 ; python_full_version >= '3.8' + # via jwcrypto +dependency-injector==4.46.0 ; python_full_version < '3.8' + # via codecarbon +dependency-injector==4.48.2 ; python_full_version >= '3.8' + # via codecarbon +deprecated==1.3.1 ; python_full_version < '3.9' + # via + # jwcrypto + # opentelemetry-api + # opentelemetry-exporter-otlp-proto-http + # opentelemetry-semantic-conventions +distlib==0.4.0 + # via virtualenv +dnspython==2.3.0 ; python_full_version < '3.8' + # via email-validator +dnspython==2.6.1 ; python_full_version == '3.8.*' + # via email-validator +dnspython==2.7.0 ; python_full_version == '3.9.*' + # via email-validator +dnspython==2.8.0 ; python_full_version >= '3.10' + # via email-validator +email-validator==2.0.0.post2 ; python_full_version < '3.8' + # via pydantic +email-validator==2.3.0 ; python_full_version >= '3.8' + # via pydantic +exceptiongroup==1.3.1 ; python_full_version < '3.11' + # via + # anyio + # pytest +executing==2.0.1 ; python_full_version < '3.8' + # via logfire +executing==2.2.1 ; python_full_version >= '3.8' + # via logfire +fastapi==0.103.2 ; python_full_version < '3.8' + # via + # codecarbon + # fastapi-pagination + # fief-client +fastapi==0.123.0 ; python_full_version >= '3.8' + # via + # codecarbon + # fastapi-pagination + # fief-client +fastapi-pagination==0.10.0 ; python_full_version < '3.8' + # via codecarbon +fastapi-pagination==0.12.34 ; python_full_version == '3.8.*' + # via codecarbon +fastapi-pagination==0.14.3 ; python_full_version == '3.9.*' + # via codecarbon +fastapi-pagination==0.15.0 ; python_full_version >= '3.10' + # via codecarbon +fief-client==0.16.1 ; python_full_version < '3.8' + # via codecarbon +fief-client==0.19.0 ; python_full_version == '3.8.*' + # via codecarbon +fief-client==0.20.0 ; python_full_version >= '3.9' + # via codecarbon +filelock==3.12.2 ; python_full_version < '3.8' + # via virtualenv +filelock==3.16.1 ; python_full_version == '3.8.*' + # via virtualenv +filelock==3.19.1 ; python_full_version == '3.9.*' + # via virtualenv +filelock==3.20.0 ; python_full_version >= '3.10' + # via virtualenv +googleapis-common-protos==1.72.0 + # via opentelemetry-exporter-otlp-proto-http +greenlet==3.1.1 ; (python_full_version < '3.9' and platform_machine == 'AMD64') or (python_full_version < '3.9' and platform_machine == 'WIN32') or (python_full_version < '3.9' and platform_machine == 'aarch64') or (python_full_version < '3.9' and platform_machine == 'amd64') or (python_full_version < '3.9' and platform_machine == 'ppc64le') or (python_full_version < '3.9' and platform_machine == 'win32') or (python_full_version < '3.9' and platform_machine == 'x86_64') + # via sqlalchemy +greenlet==3.2.4 ; (python_full_version >= '3.9' and platform_machine == 'AMD64') or (python_full_version >= '3.9' and platform_machine == 'WIN32') or (python_full_version >= '3.9' and platform_machine == 'aarch64') or (python_full_version >= '3.9' and platform_machine == 'amd64') or (python_full_version >= '3.9' and platform_machine == 'ppc64le') or (python_full_version >= '3.9' and platform_machine == 'win32') or (python_full_version >= '3.9' and platform_machine == 'x86_64') + # via sqlalchemy +h11==0.14.0 ; python_full_version < '3.8' + # via + # httpcore + # uvicorn +h11==0.16.0 ; python_full_version >= '3.8' + # via + # httpcore + # uvicorn +halo==0.0.31 ; python_full_version < '3.8' + # via fief-client +httpcore==0.16.3 ; python_full_version < '3.8' + # via httpx +httpcore==1.0.9 ; python_full_version >= '3.8' + # via httpx +httptools==0.6.0 ; python_full_version < '3.8' + # via uvicorn +httptools==0.6.4 ; python_full_version == '3.8.*' + # via uvicorn +httptools==0.7.1 ; python_full_version >= '3.9' + # via uvicorn +httpx==0.23.3 ; python_full_version < '3.8' + # via + # codecarbon + # fief-client +httpx==0.27.2 ; python_full_version >= '3.8' + # via + # codecarbon + # fief-client +identify==2.5.24 ; python_full_version < '3.8' + # via pre-commit +identify==2.6.1 ; python_full_version == '3.8.*' + # via pre-commit +identify==2.6.15 ; python_full_version >= '3.9' + # via pre-commit +idna==3.10 ; python_full_version < '3.8' + # via + # anyio + # email-validator + # requests + # rfc3986 +idna==3.11 ; python_full_version >= '3.8' + # via + # anyio + # email-validator + # httpx + # requests +importlib-metadata==6.7.0 ; python_full_version < '3.8' + # via + # alembic + # click + # mako + # opentelemetry-api + # pluggy + # pre-commit + # pytest + # sqlalchemy + # virtualenv +importlib-metadata==8.5.0 ; python_full_version == '3.8.*' + # via + # alembic + # opentelemetry-api +importlib-metadata==8.7.0 ; python_full_version >= '3.9' + # via opentelemetry-api +importlib-resources==5.12.0 ; python_full_version < '3.8' + # via alembic +importlib-resources==6.4.5 ; python_full_version == '3.8.*' + # via alembic +iniconfig==2.0.0 ; python_full_version < '3.8' + # via pytest +iniconfig==2.1.0 ; python_full_version >= '3.8' and python_full_version < '3.10' + # via pytest +iniconfig==2.3.0 ; python_full_version >= '3.10' + # via pytest +jwcrypto==1.5.1 ; python_full_version < '3.8' + # via fief-client +jwcrypto==1.5.6 ; python_full_version >= '3.8' + # via fief-client +lexid==2021.1006 + # via bumpver +librt==0.6.3 ; python_full_version >= '3.9' + # via mypy +log-symbols==0.0.14 ; python_full_version < '3.8' + # via halo +logfire==1.0.1 ; python_full_version < '3.8' + # via codecarbon +logfire==3.17.0 ; python_full_version == '3.8.*' + # via codecarbon +logfire==4.15.1 ; python_full_version >= '3.9' + # via codecarbon +makefun==1.16.0 + # via fief-client +mako==1.2.4 ; python_full_version < '3.8' + # via alembic +mako==1.3.10 ; python_full_version >= '3.8' + # via alembic +markdown-it-py==2.2.0 ; python_full_version < '3.8' + # via rich +markdown-it-py==3.0.0 ; python_full_version >= '3.8' and python_full_version < '3.10' + # via rich +markdown-it-py==4.0.0 ; python_full_version >= '3.10' + # via rich +markupsafe==2.1.5 ; python_full_version < '3.9' + # via mako +markupsafe==3.0.3 ; python_full_version >= '3.9' + # via mako +mdurl==0.1.2 + # via markdown-it-py +mock==5.2.0 + # via codecarbon +mslex==1.3.0 ; sys_platform == 'win32' + # via taskipy +mypy==1.4.1 ; python_full_version < '3.8' +mypy==1.14.1 ; python_full_version == '3.8.*' +mypy==1.19.0 ; python_full_version >= '3.9' +mypy-extensions==1.0.0 ; python_full_version < '3.8' + # via + # black + # mypy +mypy-extensions==1.1.0 ; python_full_version >= '3.8' + # via + # black + # mypy +nodeenv==1.9.1 + # via pre-commit +numpy==1.21.6 ; python_full_version < '3.8' + # via + # codecarbon + # pandas +numpy==1.24.4 ; python_full_version == '3.8.*' + # via + # codecarbon + # pandas +numpy==2.0.2 ; python_full_version == '3.9.*' + # via + # codecarbon + # pandas +numpy==2.2.6 ; python_full_version == '3.10.*' + # via + # codecarbon + # pandas +numpy==2.3.5 ; python_full_version >= '3.11' + # via + # codecarbon + # pandas +nvidia-ml-py==13.580.82 + # via codecarbon +opentelemetry-api==1.22.0 ; python_full_version < '3.8' + # via + # opentelemetry-exporter-otlp-proto-http + # opentelemetry-instrumentation + # opentelemetry-instrumentation-asgi + # opentelemetry-instrumentation-fastapi + # opentelemetry-sdk +opentelemetry-api==1.33.1 ; python_full_version == '3.8.*' + # via + # opentelemetry-exporter-otlp-proto-http + # opentelemetry-instrumentation + # opentelemetry-instrumentation-asgi + # opentelemetry-instrumentation-fastapi + # opentelemetry-sdk + # opentelemetry-semantic-conventions +opentelemetry-api==1.38.0 ; python_full_version >= '3.9' + # via + # opentelemetry-exporter-otlp-proto-http + # opentelemetry-instrumentation + # opentelemetry-instrumentation-asgi + # opentelemetry-instrumentation-fastapi + # opentelemetry-sdk + # opentelemetry-semantic-conventions +opentelemetry-exporter-otlp-proto-common==1.22.0 ; python_full_version < '3.8' + # via opentelemetry-exporter-otlp-proto-http +opentelemetry-exporter-otlp-proto-common==1.33.1 ; python_full_version == '3.8.*' + # via opentelemetry-exporter-otlp-proto-http +opentelemetry-exporter-otlp-proto-common==1.38.0 ; python_full_version >= '3.9' + # via opentelemetry-exporter-otlp-proto-http +opentelemetry-exporter-otlp-proto-http==1.22.0 ; python_full_version < '3.8' + # via logfire +opentelemetry-exporter-otlp-proto-http==1.33.1 ; python_full_version == '3.8.*' + # via logfire +opentelemetry-exporter-otlp-proto-http==1.38.0 ; python_full_version >= '3.9' + # via logfire +opentelemetry-instrumentation==0.43b0 ; python_full_version < '3.8' + # via + # logfire + # opentelemetry-instrumentation-asgi + # opentelemetry-instrumentation-fastapi +opentelemetry-instrumentation==0.54b1 ; python_full_version == '3.8.*' + # via + # logfire + # opentelemetry-instrumentation-asgi + # opentelemetry-instrumentation-fastapi +opentelemetry-instrumentation==0.59b0 ; python_full_version >= '3.9' + # via + # logfire + # opentelemetry-instrumentation-asgi + # opentelemetry-instrumentation-fastapi +opentelemetry-instrumentation-asgi==0.43b0 ; python_full_version < '3.8' + # via opentelemetry-instrumentation-fastapi +opentelemetry-instrumentation-asgi==0.54b1 ; python_full_version == '3.8.*' + # via opentelemetry-instrumentation-fastapi +opentelemetry-instrumentation-asgi==0.59b0 ; python_full_version >= '3.9' + # via opentelemetry-instrumentation-fastapi +opentelemetry-instrumentation-fastapi==0.43b0 ; python_full_version < '3.8' + # via logfire +opentelemetry-instrumentation-fastapi==0.54b1 ; python_full_version == '3.8.*' + # via logfire +opentelemetry-instrumentation-fastapi==0.59b0 ; python_full_version >= '3.9' + # via logfire +opentelemetry-proto==1.22.0 ; python_full_version < '3.8' + # via + # opentelemetry-exporter-otlp-proto-common + # opentelemetry-exporter-otlp-proto-http +opentelemetry-proto==1.33.1 ; python_full_version == '3.8.*' + # via + # opentelemetry-exporter-otlp-proto-common + # opentelemetry-exporter-otlp-proto-http +opentelemetry-proto==1.38.0 ; python_full_version >= '3.9' + # via + # opentelemetry-exporter-otlp-proto-common + # opentelemetry-exporter-otlp-proto-http +opentelemetry-sdk==1.22.0 ; python_full_version < '3.8' + # via + # logfire + # opentelemetry-exporter-otlp-proto-http +opentelemetry-sdk==1.33.1 ; python_full_version == '3.8.*' + # via + # logfire + # opentelemetry-exporter-otlp-proto-http +opentelemetry-sdk==1.38.0 ; python_full_version >= '3.9' + # via + # logfire + # opentelemetry-exporter-otlp-proto-http +opentelemetry-semantic-conventions==0.43b0 ; python_full_version < '3.8' + # via + # opentelemetry-instrumentation-asgi + # opentelemetry-instrumentation-fastapi + # opentelemetry-sdk +opentelemetry-semantic-conventions==0.54b1 ; python_full_version == '3.8.*' + # via + # opentelemetry-instrumentation + # opentelemetry-instrumentation-asgi + # opentelemetry-instrumentation-fastapi + # opentelemetry-sdk +opentelemetry-semantic-conventions==0.59b0 ; python_full_version >= '3.9' + # via + # opentelemetry-instrumentation + # opentelemetry-instrumentation-asgi + # opentelemetry-instrumentation-fastapi + # opentelemetry-sdk +opentelemetry-util-http==0.43b0 ; python_full_version < '3.8' + # via + # opentelemetry-instrumentation-asgi + # opentelemetry-instrumentation-fastapi +opentelemetry-util-http==0.54b1 ; python_full_version == '3.8.*' + # via + # opentelemetry-instrumentation-asgi + # opentelemetry-instrumentation-fastapi +opentelemetry-util-http==0.59b0 ; python_full_version >= '3.9' + # via + # opentelemetry-instrumentation-asgi + # opentelemetry-instrumentation-fastapi +packaging==24.0 ; python_full_version < '3.8' + # via + # black + # pytest +packaging==25.0 ; python_full_version >= '3.8' + # via + # black + # opentelemetry-instrumentation + # pytest +pandas==1.1.5 ; python_full_version < '3.7.1' + # via codecarbon +pandas==1.3.5 ; python_full_version >= '3.7.1' and python_full_version < '3.8' + # via codecarbon +pandas==2.0.3 ; python_full_version == '3.8.*' + # via codecarbon +pandas==2.3.3 ; python_full_version >= '3.9' + # via codecarbon +pathspec==0.11.2 ; python_full_version < '3.8' + # via black +pathspec==0.12.1 ; python_full_version >= '3.8' + # via + # black + # mypy +platformdirs==4.0.0 ; python_full_version < '3.8' + # via + # black + # virtualenv +platformdirs==4.3.6 ; python_full_version == '3.8.*' + # via + # black + # virtualenv +platformdirs==4.4.0 ; python_full_version == '3.9.*' + # via + # black + # virtualenv +platformdirs==4.5.0 ; python_full_version >= '3.10' + # via + # black + # virtualenv +pluggy==1.2.0 ; python_full_version < '3.8' + # via pytest +pluggy==1.5.0 ; python_full_version == '3.8.*' + # via pytest +pluggy==1.6.0 ; python_full_version >= '3.9' + # via pytest +pre-commit==2.21.0 ; python_full_version < '3.8' +pre-commit==3.5.0 ; python_full_version == '3.8.*' +pre-commit==4.3.0 ; python_full_version == '3.9.*' +pre-commit==4.5.0 ; python_full_version >= '3.10' +prometheus-client==0.17.1 ; python_full_version < '3.8' + # via codecarbon +prometheus-client==0.21.1 ; python_full_version == '3.8.*' + # via codecarbon +prometheus-client==0.23.1 ; python_full_version >= '3.9' + # via codecarbon +prompt-toolkit==3.0.48 ; python_full_version < '3.8' + # via questionary +prompt-toolkit==3.0.52 ; python_full_version >= '3.8' + # via questionary +protobuf==4.24.4 ; python_full_version < '3.8' + # via + # googleapis-common-protos + # logfire + # opentelemetry-proto +protobuf==5.29.5 ; python_full_version == '3.8.*' + # via + # googleapis-common-protos + # logfire + # opentelemetry-proto +protobuf==6.33.1 ; python_full_version >= '3.9' + # via + # googleapis-common-protos + # logfire + # opentelemetry-proto +psutil==6.1.1 + # via + # codecarbon + # taskipy +psycopg2-binary==2.9.9 ; python_full_version < '3.8' + # via codecarbon +psycopg2-binary==2.9.10 ; python_full_version == '3.8.*' + # via codecarbon +psycopg2-binary==2.9.11 ; python_full_version >= '3.9' + # via codecarbon +py-cpuinfo==9.0.0 + # via codecarbon +pycparser==2.21 ; python_full_version < '3.8' and platform_python_implementation != 'PyPy' + # via cffi +pycparser==2.23 ; (python_full_version >= '3.8' and implementation_name != 'PyPy' and platform_python_implementation != 'PyPy') or (python_full_version == '3.8.*' and implementation_name == 'PyPy' and platform_python_implementation != 'PyPy') + # via cffi +pydantic==1.10.24 + # via + # codecarbon + # fastapi + # fastapi-pagination +pygments==2.17.2 ; python_full_version < '3.8' + # via rich +pygments==2.19.2 ; python_full_version >= '3.8' + # via + # pytest + # rich +pyjwt==2.8.0 ; python_full_version < '3.8' + # via codecarbon +pyjwt==2.9.0 ; python_full_version == '3.8.*' + # via codecarbon +pyjwt==2.10.1 ; python_full_version >= '3.9' + # via codecarbon +pytest==7.4.4 ; python_full_version < '3.8' + # via codecarbon +pytest==8.3.5 ; python_full_version == '3.8.*' + # via codecarbon +pytest==8.4.2 ; python_full_version == '3.9.*' + # via codecarbon +pytest==9.0.1 ; python_full_version >= '3.10' + # via codecarbon +python-dateutil==2.9.0.post0 + # via + # arrow + # codecarbon + # pandas +python-dotenv==0.21.1 ; python_full_version < '3.8' + # via uvicorn +python-dotenv==1.0.1 ; python_full_version == '3.8.*' + # via uvicorn +python-dotenv==1.2.1 ; python_full_version >= '3.9' + # via uvicorn +pytokens==0.3.0 ; python_full_version >= '3.9' + # via black +pytz==2025.2 + # via pandas +pyyaml==6.0.1 ; python_full_version < '3.8' + # via + # pre-commit + # responses + # uvicorn +pyyaml==6.0.3 ; python_full_version >= '3.8' + # via + # pre-commit + # responses + # uvicorn +questionary==1.10.0 ; python_full_version < '3.8' + # via codecarbon +questionary==2.1.0 ; python_full_version == '3.8.*' + # via codecarbon +questionary==2.1.1 ; python_full_version >= '3.9' + # via codecarbon +rapidfuzz==3.4.0 ; python_full_version < '3.8' + # via codecarbon +rapidfuzz==3.9.7 ; python_full_version == '3.8.*' + # via codecarbon +rapidfuzz==3.13.0 ; python_full_version == '3.9.*' + # via codecarbon +rapidfuzz==3.14.3 ; python_full_version >= '3.10' + # via codecarbon +requests==2.31.0 ; python_full_version < '3.8' + # via + # codecarbon + # opentelemetry-exporter-otlp-proto-http + # requests-mock + # responses +requests==2.32.4 ; python_full_version == '3.8.*' + # via + # codecarbon + # opentelemetry-exporter-otlp-proto-http + # requests-mock + # responses +requests==2.32.5 ; python_full_version >= '3.9' + # via + # codecarbon + # opentelemetry-exporter-otlp-proto-http + # requests-mock + # responses +requests-mock==1.12.1 + # via codecarbon +responses==0.23.3 ; python_full_version < '3.8' + # via codecarbon +responses==0.25.8 ; python_full_version >= '3.8' + # via codecarbon +rfc3986==1.5.0 ; python_full_version < '3.8' + # via httpx +rich==13.8.1 ; python_full_version < '3.8' + # via + # codecarbon + # logfire + # typer +rich==14.2.0 ; python_full_version >= '3.8' + # via + # codecarbon + # logfire + # typer +ruff==0.14.7 +setuptools==68.0.0 ; python_full_version < '3.8' + # via opentelemetry-instrumentation +shellingham==1.5.4 + # via typer +six==1.17.0 + # via + # halo + # python-dateutil +sniffio==1.3.1 + # via + # anyio + # httpcore + # httpx +spinners==0.0.24 ; python_full_version < '3.8' + # via halo +sqlalchemy==1.4.54 + # via + # alembic + # codecarbon +starlette==0.27.0 ; python_full_version < '3.8' + # via fastapi +starlette==0.44.0 ; python_full_version == '3.8.*' + # via fastapi +starlette==0.49.3 ; python_full_version == '3.9.*' + # via fastapi +starlette==0.50.0 ; python_full_version >= '3.10' + # via fastapi +taskipy==1.14.1 +termcolor==2.3.0 ; python_full_version < '3.8' + # via halo +termcolor==2.4.0 ; python_full_version == '3.8.*' + # via yaspin +termcolor==3.1.0 ; python_full_version == '3.9.*' + # via yaspin +termcolor==3.2.0 ; python_full_version >= '3.10' + # via yaspin +toml==0.10.2 + # via bumpver +tomli==2.0.1 ; python_full_version < '3.8' + # via + # black + # logfire + # mypy + # pytest + # taskipy +tomli==2.3.0 ; python_full_version >= '3.8' and python_full_version < '4' + # via + # alembic + # black + # logfire + # mypy + # pytest + # taskipy +typed-ast==1.5.5 ; python_full_version < '3.8' + # via + # black + # mypy +typer==0.19.1 ; python_full_version < '3.8' + # via codecarbon +typer==0.20.0 ; python_full_version >= '3.8' + # via codecarbon +types-pyyaml==6.0.12.12 ; python_full_version < '3.8' + # via responses +typing-extensions==4.7.1 ; python_full_version < '3.8' + # via + # alembic + # anyio + # arrow + # asgiref + # black + # exceptiongroup + # fastapi + # fief-client + # h11 + # importlib-metadata + # logfire + # markdown-it-py + # mypy + # opentelemetry-sdk + # platformdirs + # pydantic + # pyjwt + # responses + # rich + # starlette + # typer + # uvicorn +typing-extensions==4.13.2 ; python_full_version == '3.8.*' + # via + # alembic + # anyio + # asgiref + # black + # cryptography + # dependency-injector + # exceptiongroup + # fastapi + # fastapi-pagination + # jwcrypto + # logfire + # mypy + # opentelemetry-sdk + # pydantic + # starlette + # typer + # uvicorn + # virtualenv +typing-extensions==4.15.0 ; python_full_version >= '3.9' + # via + # alembic + # anyio + # asgiref + # black + # cryptography + # dependency-injector + # exceptiongroup + # fastapi + # fastapi-pagination + # jwcrypto + # logfire + # mypy + # opentelemetry-api + # opentelemetry-exporter-otlp-proto-http + # opentelemetry-sdk + # opentelemetry-semantic-conventions + # pydantic + # starlette + # typer + # uvicorn + # virtualenv +tzdata==2025.2 ; python_full_version >= '3.8' + # via + # arrow + # pandas +urllib3==2.0.7 ; python_full_version < '3.8' + # via + # requests + # responses +urllib3==2.2.3 ; python_full_version == '3.8.*' + # via + # requests + # responses +urllib3==2.5.0 ; python_full_version >= '3.9' + # via + # requests + # responses +uvicorn==0.22.0 ; python_full_version < '3.8' + # via codecarbon +uvicorn==0.33.0 ; python_full_version == '3.8.*' + # via codecarbon +uvicorn==0.38.0 ; python_full_version >= '3.9' + # via codecarbon +uvloop==0.18.0 ; python_full_version < '3.8' and platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32' + # via uvicorn +uvloop==0.21.0 ; python_full_version >= '3.8' and python_full_version < '3.8.1' and platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32' + # via uvicorn +uvloop==0.22.1 ; python_full_version >= '3.8.1' and platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32' + # via uvicorn +virtualenv==20.26.6 ; python_full_version < '3.8' + # via pre-commit +virtualenv==20.35.4 ; python_full_version >= '3.8' + # via pre-commit +watchfiles==0.20.0 ; python_full_version < '3.8' + # via uvicorn +watchfiles==0.24.0 ; python_full_version == '3.8.*' + # via uvicorn +watchfiles==1.1.1 ; python_full_version >= '3.9' + # via uvicorn +wcwidth==0.2.14 + # via prompt-toolkit +websockets==11.0.3 ; python_full_version < '3.8' + # via uvicorn +websockets==13.1 ; python_full_version == '3.8.*' + # via uvicorn +websockets==15.0.1 ; python_full_version >= '3.9' + # via uvicorn +wrapt==1.16.0 ; python_full_version < '3.8' + # via + # deprecated + # opentelemetry-instrumentation +wrapt==1.17.3 ; python_full_version >= '3.8' + # via + # deprecated + # opentelemetry-instrumentation +yaspin==2.4.0 ; python_full_version >= '3.8' and python_full_version < '3.8.1' + # via fief-client +yaspin==2.5.0 ; python_full_version >= '3.8.1' and python_full_version < '3.9' + # via fief-client +yaspin==3.3.0 ; python_full_version >= '3.9' + # via fief-client +zipp==3.15.0 ; python_full_version < '3.8' + # via + # importlib-metadata + # importlib-resources +zipp==3.20.2 ; python_full_version == '3.8.*' + # via + # importlib-metadata + # importlib-resources +zipp==3.23.0 ; python_full_version >= '3.9' + # via importlib-metadata