diff --git a/.envrc b/.envrc new file mode 100644 index 00000000..5a33c2e5 --- /dev/null +++ b/.envrc @@ -0,0 +1,16 @@ +if [[ -f "${PWD}/.env" ]]; then + dotenv +fi + +PATH_add "${HOME}/.local/share/sentry-devenv/bin" + +if ! command -v devenv >/dev/null; then + echo "install devenv: https://github.com/getsentry/devenv#install" + return 1 +fi + +PATH_add "${PWD}/.devenv/bin" + +export VIRTUAL_ENV="${PWD}/.venv" + +PATH_add "${PWD}/.venv/bin" diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 380aa535..9caec0ef 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -8,8 +8,38 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Get changed files + id: changes + uses: dorny/paths-filter@0bc4621a3135347011ad047f9ecf449bf72ce2bd # v3.0.0 + with: + list-files: json + filters: | + all: + - added|modified: '**/*' + + - uses: astral-sh/setup-uv@884ad927a57e558e7a70b92f2bccf9198a4be546 # v6 + with: + version: '0.8.2' + # we just cache the venv-dir directly in action-setup-venv + enable-cache: false + + - uses: getsentry/action-setup-venv@v3.0.0 with: - python-version: '3.11' - - uses: pre-commit/action@v3.0.0 + cache-dependency-path: uv.lock + install-cmd: uv sync --frozen --active + + - uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0 + with: + path: ~/.cache/pre-commit + key: cache-epoch-1|${{ env.pythonLocation }}|${{ hashFiles('.pre-commit-config.yaml', 'uv.lock') }} + + - name: Install pre-commit + run: pre-commit install-hooks + + - name: Run pre-commit + run: | + jq '.[]' --raw-output <<< '${{steps.changes.outputs.all_files}}' | + # Run pre-commit to lint and format check files that were changed (but not deleted) + xargs pre-commit run --files diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ce437e39..eeb43173 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,28 +12,42 @@ repos: hooks: - id: reorder-python-imports args: [--py311-plus, --add-import, 'from __future__ import annotations'] -- repo: https://github.com/psf/black - rev: 24.1.1 - hooks: - - id: black -- repo: https://github.com/asottile/pyupgrade - rev: v3.15.0 - hooks: - - id: pyupgrade - args: [--py311-plus] -- repo: https://github.com/PyCQA/flake8 - rev: 7.0.0 - hooks: - - id: flake8 -- repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.8.0 - hooks: - - id: mypy - repo: local hooks: - id: format-packages-ini name: format packages.ini language: python - entry: python -m format_ini + entry: .venv/bin/python -m format_ini files: ^packages\.ini$ - additional_dependencies: [packaging==21.3] + + # Configuration for black exists in pyproject.toml, + # but we let pre-commit take care of the file filtering. + - id: black + name: black + entry: .venv/bin/black + language: system + types_or: [python, pyi] + require_serial: true + + # Configuration for flake8 exists in setup.cfg, + # but we let pre-commit take care of the file filtering. + - id: flake8 + name: flake8 + entry: .venv/bin/flake8 + language: system + types: [python] + require_serial: true + + - id: pyupgrade + name: pyupgrade + entry: .venv/bin/pyupgrade + language: system + types: [python] + args: [--py311-plus] + + - id: mypy + name: mypy + entry: .venv/bin/mypy + language: system + types: [python] + require_serial: true diff --git a/.python-version b/.python-version new file mode 100644 index 00000000..2c20ac9b --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.13.3 diff --git a/README.md b/README.md index a98be766..c04c59c8 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,16 @@ sentry internal pypi this repository contains the tools to import and/or build packages from public pypi for the platforms and achitectures required for sentry development. +## setup + +```bash +devenv sync +direnv allow +``` + +to run tests: `tox` + + ## adding packages packages are configured in the `packages.ini` file. diff --git a/build.py b/build.py index 16f1189d..973031e3 100644 --- a/build.py +++ b/build.py @@ -146,7 +146,7 @@ def _brew_paths(*pkgs: str) -> list[str]: @contextlib.contextmanager -def _brew_install(packages: tuple[str, ...]) -> Generator[None, None, None]: +def _brew_install(packages: tuple[str, ...]) -> Generator[None]: installed_before = _darwin_installed_packages() subprocess.check_call( @@ -180,7 +180,7 @@ def _paths(*parts: str) -> list[str]: @contextlib.contextmanager -def _darwin_install(package: Package) -> Generator[None, None, None]: +def _darwin_install(package: Package) -> Generator[None]: with contextlib.ExitStack() as ctx: if package.brew_requires: ctx.enter_context(_brew_install(package.brew_requires)) @@ -252,7 +252,7 @@ def _linux_installed_packages() -> frozenset[str]: @contextlib.contextmanager -def _apt_install(packages: tuple[str, ...]) -> Generator[None, None, None]: +def _apt_install(packages: tuple[str, ...]) -> Generator[None]: _apt_update() installed_before = _linux_installed_packages() @@ -280,7 +280,7 @@ def _apt_install(packages: tuple[str, ...]) -> Generator[None, None, None]: @contextlib.contextmanager -def _linux_install(package: Package) -> Generator[None, None, None]: +def _linux_install(package: Package) -> Generator[None]: with contextlib.ExitStack() as ctx: if package.apt_requires: ctx.enter_context(_apt_install(package.apt_requires)) @@ -446,7 +446,7 @@ def _join_env( @contextlib.contextmanager def _prebuild( package: Package, tmpdir: str, *, env: MutableMapping[str, str] | None = None -) -> Generator[None, None, None]: +) -> Generator[None]: if env is None: env = os.environ diff --git a/devenv/config.ini b/devenv/config.ini new file mode 100644 index 00000000..f2a25d68 --- /dev/null +++ b/devenv/config.ini @@ -0,0 +1,14 @@ +[devenv] +minimum_version = 1.22.1 + +[uv] +darwin_arm64 = https://github.com/astral-sh/uv/releases/download/0.8.2/uv-aarch64-apple-darwin.tar.gz +darwin_arm64_sha256 = 954d24634d5f37fa26c7af75eb79893d11623fc81b4de4b82d60d1ade4bfca22 +darwin_x86_64 = https://github.com/astral-sh/uv/releases/download/0.8.2/uv-x86_64-apple-darwin.tar.gz +darwin_x86_64_sha256 = ae755df53c8c2c1f3dfbee6e3d2e00be0dfbc9c9b4bdffdb040b96f43678b7ce +linux_arm64 = https://github.com/astral-sh/uv/releases/download/0.8.2/uv-aarch64-unknown-linux-gnu.tar.gz +linux_arm64_sha256 = 27da35ef54e9131c2e305de67dd59a07c19257882c6b1f3cf4d8d5fbb8eaf4ca +linux_x86_64 = https://github.com/astral-sh/uv/releases/download/0.8.2/uv-x86_64-unknown-linux-gnu.tar.gz +linux_x86_64_sha256 = 6dcb28a541868a455aefb2e8d4a1283dd6bf888605a2db710f0530cec888b0ad +# used for autoupdate +version = 0.8.2 diff --git a/devenv/sync.py b/devenv/sync.py new file mode 100644 index 00000000..23acbf34 --- /dev/null +++ b/devenv/sync.py @@ -0,0 +1,26 @@ +from __future__ import annotations + +from devenv import constants +from devenv.lib import config +from devenv.lib import proc +from devenv.lib import uv + + +def main(context: dict[str, str]) -> int: + reporoot = context["reporoot"] + cfg = config.get_repo(reporoot) + + uv.install( + cfg["uv"]["version"], + cfg["uv"][constants.SYSTEM_MACHINE], + cfg["uv"][f"{constants.SYSTEM_MACHINE}_sha256"], + reporoot, + ) + + print("syncing .venv ...") + proc.run(("uv", "sync", "--frozen", "--quiet")) + + print("installing pre-commit hooks ...") + proc.run((f"{reporoot}/.venv/bin/pre-commit", "install", "--install-hooks")) + + return 0 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..3c723146 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,27 @@ +[project] +name = "pypi" +version = "0.0.0" + +[dependency-groups] +# Currently we're just doing this much to get `devenv sync` to be able to +# run tox and packaging for local python -m add_pkg. +# Not sure it would be worth the effort right now to move everything to pure pytest +# and run pytest on 3 different python versions in ci by swapping out .python-version. +# Tox remains the most ergonomic solution to test on multiple pythons. +dev = [ + "black>=22.10.0", + "flake8>=7.3.0", + "mypy>=1.18.2", + "packaging==21.3", + "pre-commit==4.2.0", + "pyupgrade>=3.19.1", + "sentry-devenv>=1.25.0", + "tox==3.25.1", +] + +[tool.uv] +environments = ["sys_platform == 'darwin' or sys_platform == 'linux'"] + +[[tool.uv.index]] +url = "https://pypi.devinfra.sentry.io/simple" +default = true diff --git a/setup.cfg b/setup.cfg index 12654f40..34079920 100644 --- a/setup.cfg +++ b/setup.cfg @@ -18,3 +18,6 @@ warn_unused_ignores = true [mypy-tests.*] disallow_untyped_defs = false + +[mypy-devenv.*] +follow_imports = skip diff --git a/uv.lock b/uv.lock new file mode 100644 index 00000000..3f5cd521 --- /dev/null +++ b/uv.lock @@ -0,0 +1,353 @@ +version = 1 +revision = 2 +requires-python = ">=3.13" +resolution-markers = [ + "sys_platform == 'darwin' or sys_platform == 'linux'", +] +supported-markers = [ + "sys_platform == 'darwin' or sys_platform == 'linux'", +] + +[[package]] +name = "black" +version = "22.10.0" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +dependencies = [ + { name = "click", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "mypy-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pathspec", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "platformdirs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458" }, +] + +[[package]] +name = "certifi" +version = "2025.8.3" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5" }, +] + +[[package]] +name = "cfgv" +version = "3.4.0" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9" }, +] + +[[package]] +name = "click" +version = "8.3.0" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc" }, +] + +[[package]] +name = "distlib" +version = "0.3.9" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87" }, +] + +[[package]] +name = "filelock" +version = "3.19.1" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d" }, +] + +[[package]] +name = "flake8" +version = "7.3.0" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +dependencies = [ + { name = "mccabe", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pycodestyle", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pyflakes", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/flake8-7.3.0-py2.py3-none-any.whl", hash = "sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e" }, +] + +[[package]] +name = "identify" +version = "2.6.9" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/identify-2.6.9-py2.py3-none-any.whl", hash = "sha256:c98b4322da415a8e5a70ff6e51fbc2d2932c015532d77e9f8537b4ba7813b150" }, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" }, +] + +[[package]] +name = "mypy" +version = "1.18.2" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +dependencies = [ + { name = "mypy-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pathspec", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/mypy-1.18.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:07b8b0f580ca6d289e69209ec9d3911b4a26e5abfde32228a288eb79df129fcc" }, + { url = "https://pypi.devinfra.sentry.io/wheels/mypy-1.18.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ed4482847168439651d3feee5833ccedbf6657e964572706a2adb1f7fa4dfe2e" }, + { url = "https://pypi.devinfra.sentry.io/wheels/mypy-1.18.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3ad2afadd1e9fea5cf99a45a822346971ede8685cc581ed9cd4d42eaf940986" }, + { url = "https://pypi.devinfra.sentry.io/wheels/mypy-1.18.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a431a6f1ef14cf8c144c6b14793a23ec4eae3db28277c358136e79d7d062f62d" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505" }, +] + +[[package]] +name = "nodeenv" +version = "1.9.1" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9" }, +] + +[[package]] +name = "packaging" +version = "21.3" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +dependencies = [ + { name = "pyparsing", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522" }, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08" }, +] + +[[package]] +name = "platformdirs" +version = "4.3.8" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4" }, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" }, +] + +[[package]] +name = "pre-commit" +version = "4.2.0" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +dependencies = [ + { name = "cfgv", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "identify", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "nodeenv", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pyyaml", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "virtualenv", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd" }, +] + +[[package]] +name = "py" +version = "1.11.0" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378" }, +] + +[[package]] +name = "pycodestyle" +version = "2.14.0" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/pycodestyle-2.14.0-py2.py3-none-any.whl", hash = "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d" }, +] + +[[package]] +name = "pyflakes" +version = "3.4.0" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/pyflakes-3.4.0-py2.py3-none-any.whl", hash = "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f" }, +] + +[[package]] +name = "pyparsing" +version = "3.2.5" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e" }, +] + +[[package]] +name = "pypi" +version = "0.0.0" +source = { virtual = "." } + +[package.dev-dependencies] +dev = [ + { name = "black", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "flake8", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "mypy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pre-commit", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pyupgrade", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "sentry-devenv", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "tox", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] + +[package.metadata] + +[package.metadata.requires-dev] +dev = [ + { name = "black", specifier = ">=22.10.0" }, + { name = "flake8", specifier = ">=7.3.0" }, + { name = "mypy", specifier = ">=1.18.2" }, + { name = "packaging", specifier = "==21.3" }, + { name = "pre-commit", specifier = "==4.2.0" }, + { name = "pyupgrade", specifier = ">=3.19.1" }, + { name = "sentry-devenv", specifier = ">=1.25.0" }, + { name = "tox", specifier = "==3.25.1" }, +] + +[[package]] +name = "pyupgrade" +version = "3.19.1" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +dependencies = [ + { name = "tokenize-rt", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/pyupgrade-3.19.1-py2.py3-none-any.whl", hash = "sha256:8c5b0bfacae5ff30fa136a53eb7f22c34ba007450d4099e9da8089dabb9e67c9" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8" }, + { url = "https://pypi.devinfra.sentry.io/wheels/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1" }, + { url = "https://pypi.devinfra.sentry.io/wheels/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c" }, + { url = "https://pypi.devinfra.sentry.io/wheels/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6" }, +] + +[[package]] +name = "sentry-devenv" +version = "1.25.0" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +dependencies = [ + { name = "sentry-sdk", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/sentry_devenv-1.25.0-py3-none-any.whl", hash = "sha256:fc143542d555af05e4003052b8d2f336ac69361432e430ed92c22b9a3df5bd3d" }, +] + +[[package]] +name = "sentry-sdk" +version = "2.45.0" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +dependencies = [ + { name = "certifi", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "urllib3", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/sentry_sdk-2.45.0-py2.py3-none-any.whl", hash = "sha256:86c8ab05dc3e8666aece77a5c747b45b25aa1d5f35f06cde250608f495d50f23" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274" }, +] + +[[package]] +name = "tokenize-rt" +version = "6.1.0" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/tokenize_rt-6.1.0-py2.py3-none-any.whl", hash = "sha256:d706141cdec4aa5f358945abe36b911b8cbdc844545da99e811250c0cee9b6fc" }, +] + +[[package]] +name = "toml" +version = "0.10.2" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b" }, +] + +[[package]] +name = "tox" +version = "3.25.1" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +dependencies = [ + { name = "filelock", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pluggy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "py", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "six", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "toml", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "virtualenv", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/tox-3.25.1-py2.py3-none-any.whl", hash = "sha256:c38e15f4733683a9cc0129fba078633e07eb0961f550a010ada879e95fb32632" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548" }, +] + +[[package]] +name = "urllib3" +version = "2.5.0" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc" }, +] + +[[package]] +name = "virtualenv" +version = "20.29.3" +source = { registry = "https://pypi.devinfra.sentry.io/simple" } +dependencies = [ + { name = "distlib", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "filelock", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "platformdirs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://pypi.devinfra.sentry.io/wheels/virtualenv-20.29.3-py3-none-any.whl", hash = "sha256:3e3d00f5807e83b234dfb6122bf37cfadf4be216c53a49ac059d02414f819170" }, +]