diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index a7b7b97..1455d7e 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -2,6 +2,7 @@ name: Build on: push: + tags: ["*"] permissions: contents: write @@ -28,7 +29,6 @@ jobs: environment: name: publishing url: https://pypi.org/p/${{ needs.build.outputs.package_name }}/${{ needs.build.outputs.package_version }} - if: startsWith(github.ref, 'refs/tags/') steps: - uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0 with: diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 0000000..b8f30c9 --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,96 @@ +name: Test tap-betterstack + +on: + push: + branches: [main] + paths: + - tap_betterstack/** + - tests/** + - pyproject.toml + - uv.lock + - .github/workflows/test.yml + pull_request: + paths: + - tap_betterstack/** + - tests/** + - pyproject.toml + - uv.lock + - .github/workflows/test.yml + workflow_dispatch: + schedule: + # Run weekly on Monday at 12:00 PM UTC + - cron: "0 12 * * 1" + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read + +env: + FORCE_COLOR: "1" + # renovate: datasource=pypi depName=tox + TOX_VERSION: 4.44.0 + # renovate: datasource=pypi depName=tox-uv + TOX_UV_VERSION: 1.29.0 + # renovate: datasource=pypi depName=uv + UV_VERSION: 0.10.7 + +jobs: + build-package: + name: Build & verify package + runs-on: ubuntu-latest + outputs: + supported-python-versions: ${{ steps.baipp.outputs.supported_python_classifiers_json_array }} + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + fetch-depth: 0 + persist-credentials: false + - uses: hynek/build-and-inspect-python-package@efb823f52190ad02594531168b7a2d5790e66516 # v2.14.0 + id: baipp + + test: + name: Integration + runs-on: ubuntu-24.04 + needs: build-package + strategy: + fail-fast: false + max-parallel: 1 + matrix: + python-version: ${{ fromJson(needs.build-package.outputs.supported-python-versions) }} + + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 # v7.3.1 + with: + python-version: ${{ matrix.python-version }} + version: ${{ env.UV_VERSION }} + - name: Run tests + env: + TAP_BETTERSTACK_TOKEN: ${{ secrets.TAP_BETTERSTACK_TOKEN }} + TAP_BETTERSTACK_START_DATE: ${{ secrets.TAP_BETTERSTACK_START_DATE }} + run: > + uvx + --with tox-uv==${{ env.TOX_UV_VERSION }} + --with tox==${{ env.TOX_VERSION }} + tox -e ${{ matrix.python-version }} + + lint: + name: Lint + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + id: setup-python + - uses: astral-sh/setup-uv@eac588ad8def6316056a12d4907a9d4d84ff7a3b # v7.3.0 + with: + version: ${{ env.UV_VERSION }} + - env: + UV_PYTHON: ${{ steps.setup-python.outputs.python-path }} + run: uv tool install --with tox-uv==${{ env.TOX_UV_VERSION }} --from tox==${{ env.TOX_VERSION }} tox + - name: Static type checking + run: tox -e typing + - name: Unused, missing and transitive dependencies + run: tox -e dependencies diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 51d913c..0000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,86 +0,0 @@ -name: Test tap-betterstack - -on: - push: - branches: [main] - paths: - - tap_betterstack/** - - tests/** - - noxfile.py - - pyproject.toml - - uv.lock - - .github/workflows/test.yml - pull_request: - types: [opened, synchronize, reopened] - paths: - - tap_betterstack/** - - tests/** - - noxfile.py - - pyproject.toml - - uv.lock - - .github/workflows/test.yml - workflow_dispatch: - schedule: - # Run weekly on Monday at 12:00 PM UTC - - cron: "0 12 * * 1" - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -env: - FORCE_COLOR: "1" - # renovate: datasource=pypi depName=nox - NOX_VERSION: 2026.2.9 - # renovate: datasource=pypi depName=uv - UV_VERSION: 0.10.7 - -jobs: - test: - name: Integration - runs-on: ubuntu-24.04 - env: - NOXFORCEPYTHON: ${{ matrix.python-version }} - NOXSESSION: tests - PYO3_USE_ABI3_FORWARD_COMPATIBILITY: "1" - strategy: - fail-fast: false - max-parallel: 1 - matrix: - python-version: - - "3.12" - - "3.13" - - "3.14" - - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 # v7.3.1 - with: - version: ${{ env.UV_VERSION }} - - name: Run tests - env: - TAP_BETTERSTACK_TOKEN: ${{ secrets.TAP_BETTERSTACK_TOKEN }} - TAP_BETTERSTACK_START_DATE: ${{ secrets.TAP_BETTERSTACK_START_DATE }} - run: > - uvx - --managed-python - --python ${{ matrix.python-version }} - --with nox==${{ env.NOX_VERSION }} - nox --verbose - - typing: - name: Type Checks - runs-on: ubuntu-24.04 - env: - NOXSESSION: typing - steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 # v7.3.1 - with: - version: ${{ env.UV_VERSION }} - - name: Run typing checks - run: > - uvx - --no-python-downloads - --with nox==${{ env.NOX_VERSION }} - nox --verbose diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ab31664..6a02c79 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -48,3 +48,8 @@ repos: hooks: - id: uv-lock - id: uv-sync + +- repo: https://github.com/hukkin/mdformat + rev: 1.0.0 + hooks: + - id: mdformat diff --git a/README.md b/README.md index 8917ef0..a726b6c 100644 --- a/README.md +++ b/README.md @@ -23,25 +23,25 @@ Singer tap for [Better Stack](https://betterstack.com). Built with the [Meltano ## Capabilities -* `catalog` -* `state` -* `discover` -* `about` -* `stream-maps` -* `schema-flattening` -* `batch` +- `catalog` +- `state` +- `discover` +- `about` +- `stream-maps` +- `schema-flattening` +- `batch` ## Settings -| Setting | Required | Default | Description | +| Setting | Required | Default | Description | |:--------------------|:--------:|:-------:|:------------| -| token | True | None | API Token for Better Stack | -| start_date | False | None | Earliest datetime to get data from | -| stream_maps | False | None | Config object for stream maps capability. For more information check out [Stream Maps](https://sdk.meltano.com/en/latest/stream_maps.html). | -| stream_map_config | False | None | User-defined config values to be used within map expressions. | -| flattening_enabled | False | None | 'True' to enable schema flattening and automatically expand nested properties. | -| flattening_max_depth| False | None | The max depth to flatten schemas. | -| batch_config | False | None | | +| token | True | None | API Token for Better Stack | +| start_date | False | None | Earliest datetime to get data from | +| stream_maps | False | None | Config object for stream maps capability. For more information check out [Stream Maps](https://sdk.meltano.com/en/latest/stream_maps.html). | +| stream_map_config | False | None | User-defined config values to be used within map expressions. | +| flattening_enabled | False | None | 'True' to enable schema flattening and automatically expand nested properties. | +| flattening_max_depth| False | None | The max depth to flatten schemas. | +| batch_config | False | None | | A full list of supported settings and capabilities is available by running: `tap-betterstack --about` @@ -49,24 +49,24 @@ A full list of supported settings and capabilities is available by running: `tap ### Supported -* [`monitors`](https://betterstack.com/docs/uptime/api/list-all-existing-monitors/) -* [`monitor_groups`](https://betterstack.com/docs/uptime/api/list-all-existing-monitor-groups/) -* [`heartbeats`](https://betterstack.com/docs/uptime/api/list-all-existing-hearbeats/) -* [`heartbeat_groups`](https://betterstack.com/docs/uptime/api/list-all-existing-heartbeat-groups/) -* [`on_calls`](https://betterstack.com/docs/uptime/api/list-all-existing-on-call-calendars/) -* [`escalation_policies`](https://betterstack.com/docs/uptime/api/list-all-escalation-policies/) -* [`incidents`](https://betterstack.com/docs/uptime/api/list-all-incidents/) -* [`incident_events`](https://betterstack.com/docs/uptime/api/list-of-incident-timeline-events/) -* [`email_integrations`](https://betterstack.com/docs/uptime/api/list-all-email-integrations/) -* [`incoming_webhooks`](https://betterstack.com/docs/uptime/api/list-all-incoming-webhooks/) -* [`status_pages`](https://betterstack.com/docs/uptime/api/list-all-existing-status-pages/) +- [`monitors`](https://betterstack.com/docs/uptime/api/list-all-existing-monitors/) +- [`monitor_groups`](https://betterstack.com/docs/uptime/api/list-all-existing-monitor-groups/) +- [`heartbeats`](https://betterstack.com/docs/uptime/api/list-all-existing-hearbeats/) +- [`heartbeat_groups`](https://betterstack.com/docs/uptime/api/list-all-existing-heartbeat-groups/) +- [`on_calls`](https://betterstack.com/docs/uptime/api/list-all-existing-on-call-calendars/) +- [`escalation_policies`](https://betterstack.com/docs/uptime/api/list-all-escalation-policies/) +- [`incidents`](https://betterstack.com/docs/uptime/api/list-all-incidents/) +- [`incident_events`](https://betterstack.com/docs/uptime/api/list-of-incident-timeline-events/) +- [`email_integrations`](https://betterstack.com/docs/uptime/api/list-all-email-integrations/) +- [`incoming_webhooks`](https://betterstack.com/docs/uptime/api/list-all-incoming-webhooks/) +- [`status_pages`](https://betterstack.com/docs/uptime/api/list-all-existing-status-pages/) ### Planned (PRs welcome!) -* [`status_page_sections`](https://betterstack.com/docs/uptime/api/list-existing-sections-of-a-status-page/) -* [`status_page_resources`](https://betterstack.com/docs/uptime/api/list-existing-resources-of-a-status-page/) -* [`status_page_reports`](https://betterstack.com/docs/uptime/api/list-existing-reports-on-a-status-page/) -* [`status_page_report_updates`](https://betterstack.com/docs/uptime/api/list-all-existing-status-updates-for-a-status-page-report/) +- [`status_page_sections`](https://betterstack.com/docs/uptime/api/list-existing-sections-of-a-status-page/) +- [`status_page_resources`](https://betterstack.com/docs/uptime/api/list-existing-resources-of-a-status-page/) +- [`status_page_reports`](https://betterstack.com/docs/uptime/api/list-existing-reports-on-a-status-page/) +- [`status_page_report_updates`](https://betterstack.com/docs/uptime/api/list-all-existing-status-updates-for-a-status-page-report/) ## Usage diff --git a/noxfile.py b/noxfile.py deleted file mode 100755 index 3027ca0..0000000 --- a/noxfile.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env -S uv run --script - -# /// script -# dependencies = ["nox"] -# /// - -"""Nox configuration.""" - -from __future__ import annotations - -import nox - -PYPROJECT = nox.project.load_toml("pyproject.toml") -PYTHON_VERSIONS = nox.project.python_versions(PYPROJECT) - -nox.needs_version = ">=2025.2.9" -nox.options.default_venv_backend = "uv" -nox.options.reuse_venv = "yes" - -UV_SYNC_COMMAND = ( - "uv", - "sync", - "--locked", - "--no-dev", -) - - -@nox.session(python=PYTHON_VERSIONS) -def tests(session: nox.Session) -> None: - """Execute pytest tests.""" - env = { - "UV_PROJECT_ENVIRONMENT": session.virtualenv.location, - } - if isinstance(session.python, str): - env["UV_PYTHON"] = session.python - - session.run_install( - *UV_SYNC_COMMAND, - "--group=ci", - "--group=testing", - env=env, - ) - session.run("pytest", *session.posargs) - - -@nox.session() -def typing(session: nox.Session) -> None: - """Check types.""" - env = { - "UV_PROJECT_ENVIRONMENT": session.virtualenv.location, - } - if isinstance(session.python, str): - env["UV_PYTHON"] = session.python - - session.run_install( - *UV_SYNC_COMMAND, - "--group=testing", - "--group=typing", - env=env, - ) - args = session.posargs or ("tap_betterstack", "tests") - session.run("mypy", *args) - session.run("ty", "check", *args) - - -if __name__ == "__main__": - nox.main() diff --git a/pyproject.toml b/pyproject.toml index c10c8a1..d31504c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ build-backend = "hatchling.build" requires = [ "hatch-vcs==0.5", - "hatchling==1.29.0", + "hatchling==1.29", ] [project] @@ -18,10 +18,6 @@ license = "Apache-2.0" license-files = [ "LICENSE", ] - -authors = [ - { name = "Edgar Ramírez-Mondragón", email = "edgarrm358@gmail.com" }, -] requires-python = ">=3.12" classifiers = [ "Programming Language :: Python :: 3 :: Only", @@ -35,10 +31,15 @@ dynamic = [ dependencies = [ "singer-sdk~=0.53.2", ] -urls.Documentation = "https://github.com/reservoir-data/tap-betterstack#readme" -urls.Homepage = "https://github.com/reservoir-data/tap-betterstack" -urls.Repository = "https://github.com/reservoir-data/tap-betterstack" -scripts.tap-betterstack = "tap_betterstack.tap:TapBetterStack.cli" +[[project.authors]] +name = "Edgar Ramírez-Mondragón" +email = "edgarrm358@gmail.com" +[project.scripts] +tap-betterstack = "tap_betterstack.tap:TapBetterStack.cli" +[project.urls] +Documentation = "https://github.com/reservoir-data/tap-betterstack#readme" +Homepage = "https://github.com/reservoir-data/tap-betterstack" +Repository = "https://github.com/reservoir-data/tap-betterstack" [dependency-groups] dev = [ @@ -49,6 +50,7 @@ ci = [ "pytest-github-actions-annotate-failures>=0.3", ] testing = [ + "deptry>=0.12", "singer-sdk[testing]", ] typing = [ @@ -57,41 +59,40 @@ typing = [ "types-requests", ] +[tool.hatch] [tool.hatch.version] source = "vcs" [tool.ruff] required-version = ">=0.15" line-length = 88 -lint.select = [ +[tool.ruff.lint] +select = [ "ALL", ] -lint.ignore = [ +ignore = [ "COM812", # missing-trailing-comma "DJ", # flake8-django "FIX002", # line-contains-todo "ISC001", # single-line-implicit-string-concatenation ] -lint.per-file-ignores."noxfile.py" = [ - "ANN", -] -lint.per-file-ignores."tests/*" = [ +per-file-ignores."tests/*" = [ "ANN201", # missing-return-type-public-function "INP001", # implicit-namespace-package "S101", # assert "SLF001", # private-member-access ] -lint.unfixable = [ +unfixable = [ "ERA001", # commented-out-code ] -lint.flake8-annotations.allow-star-arg-any = true -lint.isort.required-imports = [ +flake8-annotations.allow-star-arg-any = true +isort.required-imports = [ "from __future__ import annotations", ] -lint.pydocstyle.convention = "google" +pydocstyle.convention = "google" [tool.pyproject-fmt] -max_supported_python = "3.14" +table_format = "long" [tool.pytest] addopts = [ @@ -106,9 +107,36 @@ minversion = "9" testpaths = [ "tests" ] xfail_strict = true +[tool.tox] +min_version = "4.43" +requires = [ "tox", "tox-uv" ] +env_list = [ + "dependencies", + "typing", + { product = [ + { prefix = "3.", start = 12 }, + ] }, +] +[tool.tox.env.dependencies] +dependency_groups = [ "testing" ] +commands = [ [ "deptry", "." ] ] +[tool.tox.env.typing] +dependency_groups = [ "testing", "typing" ] +commands = [ + [ "mypy", { replace = "posargs", default = [ "tap_betterstack", "tests" ], extend = true } ], + [ "ty", "check", { replace = "posargs", default = [ "tap_betterstack", "tests" ], extend = true } ], +] + +[tool.tox.env_run_base] +runner = "uv-venv-lock-runner" +pass_env = [ "TAP_BETTERSTACK_*" ] +dependency_groups = [ "testing" ] +commands = [ [ "pytest", { replace = "posargs", default = [ "tests" ], extend = true } ] ] + [tool.mypy] enable_error_code = [ "ignore-without-code", "redundant-expr", "truthy-bool" ] strict = true +warn_no_return = true warn_redundant_casts = true warn_unreachable = true warn_unused_configs = true diff --git a/uv.lock b/uv.lock index 8bf7b48..076601b 100644 --- a/uv.lock +++ b/uv.lock @@ -98,6 +98,28 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] +[[package]] +name = "deptry" +version = "0.24.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "packaging" }, + { name = "requirements-parser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/aa/5cae0f25a2ac5334d5bd2782a6bcd80eecf184f433ff74b2fb0387cfbbb6/deptry-0.24.0.tar.gz", hash = "sha256:852e88af2087e03cdf9ece6916f3f58b74191ab51cc8074897951bd496ee7dbb", size = 440158, upload-time = "2025-11-09T00:31:44.637Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/5a/c1552996499911b6eabe874a994d9eede58ac3936d7fe7f865857b97c03f/deptry-0.24.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:a575880146bab671a62babb9825b85b4f1bda8aeaade4fcb59f9262caf91d6c7", size = 1774138, upload-time = "2025-11-09T00:31:41.896Z" }, + { url = "https://files.pythonhosted.org/packages/32/b6/1dcc011fc3e6eec71601569c9de3215530563412b3714fba80dcd1a88ec8/deptry-0.24.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:00ec34b968a13c03a5268ce0211f891ace31851d916415e0a748fae9596c00d5", size = 1677340, upload-time = "2025-11-09T00:31:39.676Z" }, + { url = "https://files.pythonhosted.org/packages/4a/e2/af81dfd46b457be9e8ded9472872141777fbda8af661f5d509157b165359/deptry-0.24.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ddfedafafe5cbfce31a50d4ea99d7b9074edcd08b9b94350dc739e2fb6ed7f9", size = 1782740, upload-time = "2025-11-09T00:31:28.302Z" }, + { url = "https://files.pythonhosted.org/packages/ab/28/960c311aae084deef57ece41aac13cb359b06ce31b7771139e79c394a1b7/deptry-0.24.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd22fa2dbbdf4b38061ca9504f2a6ce41ec14fa5c9fe9b0b763ccc1275efebd5", size = 1845477, upload-time = "2025-11-09T00:31:33.452Z" }, + { url = "https://files.pythonhosted.org/packages/f5/6c/4b972b011a06611e0cf8f4bb6bc04a3d0f9c651950ad9abe320fcbac6983/deptry-0.24.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0fbe50a2122d79cec53fdfd73a7092c05f316555a1139bcbacf3432572675977", size = 1960410, upload-time = "2025-11-09T00:31:31.174Z" }, + { url = "https://files.pythonhosted.org/packages/1b/08/0eac3c72a9fd79a043cc492f3ba350c47a7be2160288353218b2c8c1bf3a/deptry-0.24.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:92bd8d331a5a6f8e6247436bc6fe384bcf86a8d69fe33442d195996fb9b20547", size = 2023832, upload-time = "2025-11-09T00:31:36.381Z" }, + { url = "https://files.pythonhosted.org/packages/35/e4/23dcbc505f6f35c70ba68015774cf891ceda080331d7fd6d75e84ada9f73/deptry-0.24.0-cp39-abi3-win_amd64.whl", hash = "sha256:94b354848130d45e16d3a3039ae8177bce33828f62028c4ff8f2e1b04f7182ba", size = 1631631, upload-time = "2025-11-09T00:31:47.108Z" }, + { url = "https://files.pythonhosted.org/packages/39/69/6ec1e18e27dd6f80e4fb6c5fc05a6527242ff83b81c0711d0ba470e9a144/deptry-0.24.0-cp39-abi3-win_arm64.whl", hash = "sha256:ea58709e5f3aa77c0737d8fb76166b7703201cf368fbbb14072ccda968b6703a", size = 1550504, upload-time = "2025-11-09T00:31:45.988Z" }, +] + [[package]] name = "fsspec" version = "2026.2.0" @@ -486,6 +508,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, ] +[[package]] +name = "requirements-parser" +version = "0.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/96/fb6dbfebb524d5601d359a47c78fe7ba1eef90fc4096404aa60c9a906fbb/requirements_parser-0.13.0.tar.gz", hash = "sha256:0843119ca2cb2331de4eb31b10d70462e39ace698fd660a915c247d2301a4418", size = 22630, upload-time = "2025-05-21T13:42:05.464Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/60/50fbb6ffb35f733654466f1a90d162bcbea358adc3b0871339254fbc37b2/requirements_parser-0.13.0-py3-none-any.whl", hash = "sha256:2b3173faecf19ec5501971b7222d38f04cb45bb9d87d0ad629ca71e2e62ded14", size = 14782, upload-time = "2025-05-21T13:42:04.007Z" }, +] + [[package]] name = "rpds-py" version = "0.30.0" @@ -702,12 +736,14 @@ ci = [ { name = "pytest-github-actions-annotate-failures" }, ] dev = [ + { name = "deptry" }, { name = "mypy" }, { name = "singer-sdk", extra = ["testing"] }, { name = "ty" }, { name = "types-requests" }, ] testing = [ + { name = "deptry" }, { name = "singer-sdk", extra = ["testing"] }, ] typing = [ @@ -722,12 +758,16 @@ requires-dist = [{ name = "singer-sdk", specifier = "~=0.53.2" }] [package.metadata.requires-dev] ci = [{ name = "pytest-github-actions-annotate-failures", specifier = ">=0.3" }] dev = [ + { name = "deptry", specifier = ">=0.12" }, { name = "mypy", specifier = ">=1.19.1" }, { name = "singer-sdk", extras = ["testing"] }, { name = "ty", specifier = ">=0.0.19" }, { name = "types-requests" }, ] -testing = [{ name = "singer-sdk", extras = ["testing"] }] +testing = [ + { name = "deptry", specifier = ">=0.12" }, + { name = "singer-sdk", extras = ["testing"] }, +] typing = [ { name = "mypy", specifier = ">=1.19.1" }, { name = "ty", specifier = ">=0.0.19" },