diff --git a/.bumpversion.toml b/.bumpversion.toml new file mode 100644 index 00000000..8a178596 --- /dev/null +++ b/.bumpversion.toml @@ -0,0 +1,27 @@ +[tool.bumpversion] +current_version = "1.0.1" +commit = true +tag = false +tag_name = "v{new_version}" +tag_message = "Release version {new_version}" +message = "bump: version {current_version} → {new_version}" + +[[tool.bumpversion.files]] +filename = "src/cpg_flow/__init__.py" +search = "__version__ = '{current_version}'" +replace = "__version__ = '{new_version}'" + +[[tool.bumpversion.files]] +filename = "Dockerfile" +search = "# VERSION {current_version}" +replace = "# VERSION {new_version}" + +[[tool.bumpversion.files]] +filename = ".github/workflows/docker.yaml" +search = "VERSION: {current_version}" +replace = "VERSION: {new_version}" + +[[tool.bumpversion.files]] +filename = ".github/workflows/test.yaml" +search = "VERSION: {current_version}" +replace = "VERSION: {new_version}" diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..d9e20df0 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,82 @@ +version: 2 + +# Multi-ecosystem groups for Python dependencies +multi-ecosystem-groups: + python-minor-patch: + applies-to: version-updates + update-types: + - "minor" + - "patch" + python-major: + applies-to: version-updates + update-types: + - "major" + +updates: + # pip ecosystem for pyproject.toml dependencies + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "weekly" + multi-ecosystem-group: python-minor-patch + commit-message: + prefix: "chore" + include: "scope" + ignore: + # Don't update hail - pinned at CPG's installed version + - dependency-name: "hail" + # Don't update Python version + - dependency-name: "python" + open-pull-requests-limit: 10 + + # uv ecosystem for uv.lock file + - package-ecosystem: "uv" + directory: "/" + schedule: + interval: "weekly" + multi-ecosystem-group: python-minor-patch + commit-message: + prefix: "chore" + include: "scope" + ignore: + # Don't update hail - pinned at CPG's installed version + - dependency-name: "hail" + # Don't update Python version + - dependency-name: "python" + open-pull-requests-limit: 10 + + # Separate update for major versions (pip) + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "weekly" + multi-ecosystem-group: python-major + commit-message: + prefix: "chore" + include: "scope" + ignore: + # Don't update hail - pinned at CPG's installed version + - dependency-name: "hail" + # Don't update Python version + - dependency-name: "python" + # Ignore minor and patch updates (handled by the other group) + - update-types: ["version-update:semver-minor", "version-update:semver-patch"] + open-pull-requests-limit: 10 + + # Separate update for major versions (uv) + - package-ecosystem: "uv" + directory: "/" + schedule: + interval: "weekly" + multi-ecosystem-group: python-major + commit-message: + prefix: "chore" + include: "scope" + ignore: + # Don't update hail - pinned at CPG's installed version + - dependency-name: "hail" + # Don't update Python version + - dependency-name: "python" + # Ignore minor and patch updates (handled by the other group) + - update-types: ["version-update:semver-minor", "version-update:semver-patch"] + open-pull-requests-limit: 10 diff --git a/.github/renovate-config.json b/.github/renovate-config.json deleted file mode 100644 index 3317d2de..00000000 --- a/.github/renovate-config.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "onboarding": true, - "requireConfig": "ignored", - "platform": "github", - "repositories": [ - "populationgenomics/cpg-flow" - ], - "prConcurrentLimit": 10, - "prHourlyLimit": 5, - "semanticCommits": "enabled", - "enabledManagers": [ - "pep621" - ], - "constraints": { - "python": "==3.10" - }, - "pep621": { - "lockFileMaintenance": { - "enabled": true - } - }, - "packageRules": [ - { - "matchManagers": [ - "pep621" - ], - "matchPackageNames": [ - "python", - "hail" - ], - "enabled": false - }, - { - "groupName": "all non-major dependencies", - "groupSlug": "all-minor-patch", - "matchUpdateTypes": [ - "minor", - "patch" - ], - "matchPackagePatterns": [ - "*" - ], - "minimumReleaseAge": "48 hours" - }, - { - "groupName": "all major dependencies", - "groupSlug": "all-major", - "matchUpdateTypes": [ - "major" - ], - "matchPackagePatterns": [ - "*" - ], - "minimumReleaseAge": "48 hours" - } - ] -} diff --git a/.github/workflows/package.yaml b/.github/workflows/package.yaml index 36708743..a725c101 100644 --- a/.github/workflows/package.yaml +++ b/.github/workflows/package.yaml @@ -1,9 +1,8 @@ -name: Package +name: Package and Release on: push: branches: - main - - alpha workflow_dispatch: inputs: @@ -16,9 +15,9 @@ on: permissions: {} jobs: - package: - name: Package - if: startsWith(github.event.head_commit.message, 'bump:') != true + release: + name: Release + if: startsWith(github.event.head_commit.message, 'bump:') environment: production permissions: id-token: write @@ -29,45 +28,29 @@ jobs: shell: bash -l {0} steps: - - name: Setup | Force correct release branch on workflow sha - env: - REPO: ${{ github.repository }} - REF_NAME: ${{ github.ref_name }} - SHA: ${{ github.sha }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - set -euo pipefail - git clone https://github.com/${REPO} . - git checkout -B "${REF_NAME}" "${SHA}" - git config user.name "cpg-software-ci-bot" - git config user.email "software-team+githubcibot@populationgenomics.org.au" - git remote set-url origin "https://x-access-token:${GITHUB_TOKEN}@github.com/${REPO}" - - - name: Action | Semantic Version Release - id: release - uses: python-semantic-release/python-semantic-release@0dc72ac9058a62054a45f6344c83a423d7f906a8 #v9.21.1 + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 with: - root_options: '-v' - git_committer_email: 'software-team+githubcibot@populationgenomics.org.au' - git_committer_name: 'cpg-software-ci-bot' - github_token: ${{ secrets.BOT_ACCESS_TOKEN }} + fetch-depth: 0 - - name: Build on no release - if: steps.release.outputs.released != 'true' + - name: Extract version from commit message + id: version + env: + COMMIT_MESSAGE: ${{ github.event.head_commit.message }} run: | - echo "No release was made, manual build" - make ci-build + # Extract version from commit message like "bump: version 1.0.1 → 1.0.2" + VERSION=$(echo "$COMMIT_MESSAGE" | grep -oP '→ \K[0-9]+\.[0-9]+\.[0-9]+') + echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "Detected version: $VERSION" - - name: Publish | Upload package to PyPI - uses: pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc #v1.12.4 - if: steps.release.outputs.released == 'true' || github.event.inputs.force_pypi_release == 'true' - - - name: Publish | Upload to GitHub Release Assets - uses: python-semantic-release/publish-action@1aa9f41fac5d531e6764e1991b536783337f3a56 #v9.21.1 - if: steps.release.outputs.released == 'true' - with: - github_token: ${{ secrets.BOT_ACCESS_TOKEN }} - tag: ${{ steps.release.outputs.tag }} + - name: Create and push tag + env: + VERSION: ${{ steps.version.outputs.version }} + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git tag -a "v${VERSION}" -m "Release version ${VERSION}" + git push origin "v${VERSION}" - name: Install uv uses: astral-sh/setup-uv@6b9c6063abd6010835644d4c2e1bef4cf5cd0fca #v6.0.1 @@ -78,12 +61,18 @@ jobs: run: | uv sync - - run: uv pip install mike - - - name: Clean stale build metadata + - name: Build package run: | - rm -rf src/*.egg-info || true + uv build --sdist --wheel + + - name: Publish | Upload package to PyPI + uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e #v1.13.0 + if: github.event_name == 'push' || github.event.inputs.force_pypi_release == 'true' - name: Publish | Update docs version + env: + VERSION: ${{ steps.version.outputs.version }} + GIT_COMMITTER_NAME: github-actions[bot] + GIT_COMMITTER_EMAIL: github-actions[bot]@users.noreply.github.com run: | - uv run mike deploy -F docs/mkdocs.yml --push --update-aliases ${{ steps.release.outputs.tag }} latest + uv run mike deploy -F docs/mkdocs.yml --push --update-aliases "${VERSION}" latest diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml deleted file mode 100644 index dc0f51c4..00000000 --- a/.github/workflows/renovate.yaml +++ /dev/null @@ -1,35 +0,0 @@ -name: Renovate -on: - schedule: - - cron: '0 0 * * Sun' - workflow_dispatch: - -permissions: {} - -jobs: - renovate: - runs-on: ubuntu-latest - permissions: - contents: write - pull-requests: write - steps: - - uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e #v2.0.6 - id: app-token - with: - app-id: ${{ vars.RENOVATE_APP_ID }} - private-key: ${{ secrets.RENOVATE_PRIVATE_KEY }} - - - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 - with: - persist-credentials: false - - - name: Self-hosted Renovate - uses: renovatebot/github-action@e854b273e774bce1ef8cb05f128b8ce8aee2a887 #v42.0.1 - with: - token: '${{ steps.app-token.outputs.token }}' - docker-user: root - configurationFile: .github/renovate-config.json - env: - LOG_LEVEL: 'debug' - RENOVATE_PLATFORM_COMMIT: 'true' diff --git a/.github/workflows/web-docs.yaml b/.github/workflows/web-docs.yaml deleted file mode 100644 index 16b2dddb..00000000 --- a/.github/workflows/web-docs.yaml +++ /dev/null @@ -1,44 +0,0 @@ -name: mkdocs -on: - push: - branches: - - alpha - - main - -permissions: {} - -jobs: - deploy: - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 #v4.2.2 - with: - persist-credentials: true - - - name: Configure Git Credentials - run: | - git config user.name github-actions[bot] - git config user.email 41898282+github-actions[bot]@users.noreply.github.com - - - name: Install uv - uses: astral-sh/setup-uv@6b9c6063abd6010835644d4c2e1bef4cf5cd0fca #v6.0.1 - - - name: Install project dependencies - run: | - uv sync - source .venv/bin/activate - - - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV - - uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 #v4.2.3 - with: - key: mkdocs-material-${{ env.cache_id }} - path: .cache - restore-keys: | - mkdocs-material- - - - run: uv pip install mkdocs-material - - run: uv pip install "mkdocstrings[python]" - - run: uv pip install griffe-typingdoc - - run: uv run mkdocs gh-deploy -f docs/mkdocs.yml --force diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d9066bc1..2217e20d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -52,11 +52,3 @@ repos: # rev: v1.1.400 # hooks: # - id: pyright - - - repo: https://github.com/alessandrojcm/commitlint-pre-commit-hook - rev: v9.22.0 - hooks: - - id: commitlint - stages: [commit-msg] - args: [--config, .commitlintrc.json] - additional_dependencies: ['@commitlint/config-conventional'] diff --git a/Dockerfile b/Dockerfile index 41a659d4..66e54202 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,5 @@ FROM australia-southeast1-docker.pkg.dev/analysis-runner/images/driver:latest +# VERSION 1.0.1 COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ # Set up working directory for the project diff --git a/Makefile b/Makefile index 0371427b..a10b6893 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ init: venv uv run pre-commit install init-dev: init install-local - uv run pre-commit install --hook-type commit-msg + # Actions test: @@ -27,10 +27,6 @@ docs: uv pip install mkdocs-material "mkdocstrings[python]" griffe-typingdoc uv run mkdocs serve -f docs/mkdocs.yml -ci-build: clean - python -m pip install build "setuptools>=42" setuptools-scm wheel - SETUPTOOLS_SCM_PRETEND_VERSION="$$NEW_VERSION" python -m build --sdist --wheel - build: clean uv build --sdist --wheel @@ -44,4 +40,14 @@ upload: clean build uv run twine check dist/* uv run twine upload -r testpypi dist/* -.PHONY: venv init test docs clean ci-build build install-build install-local upload +# Version Management +bump-major: + uv run bump-my-version bump major + +bump-minor: + uv run bump-my-version bump minor + +bump-patch: + uv run bump-my-version bump patch + +.PHONY: venv init test docs clean build install-build install-local upload bump-major bump-minor bump-patch diff --git a/pyproject.toml b/pyproject.toml index abcc49a4..b61c4bcc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,19 +47,17 @@ classifiers = [ ] keywords = ["hail", "flow", "api", "bioinformatics", "genomics"] -[tool.uv] -dev-dependencies = [ +[dependency-groups] +dev = [ "black>=24.10.0", "build>=1.2.2.post1", - "bump2version>=1.0.1", - "commitizen>=3.30.0", + "bump-my-version>=0.30.0", "coverage>=7.6.4", "hail>=0.2.133", "pip-audit>=2.7.3", "pylint>=3.3.1", "pytest-mock>=3.14.0", "pytest>=8.3.3", - "python-semantic-release>=9.4.1", "pyyaml>=6.0.2", "ruff>=0.5.2", "toml>=0.10.2", @@ -71,6 +69,7 @@ dev-dependencies = [ "pyright>=1.1.400", ] + [project.urls] Repository = "https://github.com/populationgenomics/cpg-flow" @@ -101,91 +100,7 @@ venvPath = "." venv = ".venv" typeCheckingMode = "basic" -[tool.semantic_release] -version_variables = [ - "src/cpg_flow/__init__.py:__version__", - "Dockerfile:VERSION", - ".github/workflows/docker.yaml:VERSION", - ".github/workflows/test.yaml:VERSION", -] -assets = [] -build_command_env = [] -commit_message = "bump: {version}\n\nAutomatically generated by python-semantic-release" -commit_parser = "angular" -logging_use_named_masks = false -major_on_zero = true -allow_zero_version = true -repo_dir = "." -no_git_verify = false -tag_format = "v{version}" -build_command = "make ci-build" - -[tool.semantic_release.branches.main] -match = "main" -prerelease = false - -[tool.semantic_release.branches.prerelease] -match = "alpha" -prerelease_token = "alpha" -prerelease = true - -[tool.semantic_release.changelog] -exclude_commit_patterns = [] -mode = "init" -insertion_flag = "" -template_dir = "templates" - -[tool.semantic_release.changelog.default_templates] -changelog_file = "CHANGELOG.md" -output_format = "md" - -[tool.semantic_release.changelog.environment] -block_start_string = "{%" -block_end_string = "%}" -variable_start_string = "{{" -variable_end_string = "}}" -comment_start_string = "{#" -comment_end_string = "#}" -trim_blocks = false -lstrip_blocks = false -newline_sequence = "\n" -keep_trailing_newline = false -extensions = [] -autoescape = false - -[tool.semantic_release.commit_author] -env = "GIT_COMMIT_AUTHOR" -default = "semantic-release " - -[tool.semantic_release.commit_parser_options] -allowed_tags = [ - "build", - "ci", - "docs", - "feat", - "fix", - "perf", - "style", - "refactor", - "test", - "chore", -] -minor_tags = ["feat"] -patch_tags = ["fix", "perf"] -default_bump_level = 0 - -[tool.semantic_release.remote] -name = "origin" -type = "github" -token = { env = "GITHUB_TOKEN" } -ignore_token_for_push = false -insecure = false - -[tool.semantic_release.publish] -dist_glob_patterns = ["dist/*"] -upload_to_pypi = false -upload_to_test_pypi = true -upload_to_vcs_release = false + [tool.setuptools.dynamic.version] attr = "cpg_flow.__version__" diff --git a/uv.lock b/uv.lock index 948995cc..bdbe65c7 100644 --- a/uv.lock +++ b/uv.lock @@ -95,15 +95,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload-time = "2025-03-17T00:02:52.713Z" }, ] -[[package]] -name = "argcomplete" -version = "3.6.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/16/0f/861e168fc813c56a78b35f3c30d91c6757d1fd185af1110f1aec784b35d0/argcomplete-3.6.2.tar.gz", hash = "sha256:d0519b1bc867f5f4f4713c41ad0aba73a4a5f007449716b16f385f2166dc6adf", size = 73403, upload-time = "2025-04-03T04:57:03.52Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/31/da/e42d7a9d8dd33fa775f467e4028a47936da2f01e4b0e561f9ba0d74cb0ca/argcomplete-3.6.2-py3-none-any.whl", hash = "sha256:65b3133a29ad53fb42c48cf5114752c7ab66c1c38544fdf6460f450c09b42591", size = 43708, upload-time = "2025-04-03T04:57:01.591Z" }, -] - [[package]] name = "astroid" version = "3.3.10" @@ -360,6 +351,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/83/a753562020b69fa90cebc39e8af2c753b24dcdc74bee8355ee3f6cefdf34/botocore-1.38.27-py3-none-any.whl", hash = "sha256:a785d5e9a5eda88ad6ab9ed8b87d1f2ac409d0226bba6ff801c55359e94d91a8", size = 13580545, upload-time = "2025-05-30T19:32:26.712Z" }, ] +[[package]] +name = "bracex" +version = "2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/63/9a/fec38644694abfaaeca2798b58e276a8e61de49e2e37494ace423395febc/bracex-2.6.tar.gz", hash = "sha256:98f1347cd77e22ee8d967a30ad4e310b233f7754dbf31ff3fceb76145ba47dc7", size = 26642, upload-time = "2025-06-22T19:12:31.254Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/2a/9186535ce58db529927f6cf5990a849aa9e052eea3e2cfefe20b9e1802da/bracex-2.6-py3-none-any.whl", hash = "sha256:0b0049264e7340b3ec782b5cb99beb325f36c3782a32e36e876452fd49a09952", size = 11508, upload-time = "2025-06-22T19:12:29.781Z" }, +] + [[package]] name = "build" version = "1.2.2.post1" @@ -377,12 +377,23 @@ wheels = [ ] [[package]] -name = "bump2version" -version = "1.0.1" +name = "bump-my-version" +version = "1.2.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/29/2a/688aca6eeebfe8941235be53f4da780c6edee05dbbea5d7abaa3aab6fad2/bump2version-1.0.1.tar.gz", hash = "sha256:762cb2bfad61f4ec8e2bdf452c7c267416f8c70dd9ecb1653fd0bbb01fa936e6", size = 36236, upload-time = "2020-10-07T18:38:40.119Z" } +dependencies = [ + { name = "click" }, + { name = "httpx" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "questionary" }, + { name = "rich" }, + { name = "rich-click" }, + { name = "tomlkit" }, + { name = "wcmatch" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a0/fa/3ade689370780989831e574e82024d301ffa5ef75b3d169a7074c9419ce4/bump_my_version-1.2.4.tar.gz", hash = "sha256:998abb4f3774cf96137a77034a5a12a722b109b26a3afa044ec14622a0180fa3", size = 1157991, upload-time = "2025-10-04T14:13:31.658Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/e3/fa60c47d7c344533142eb3af0b73234ef8ea3fb2da742ab976b947e717df/bump2version-1.0.1-py2.py3-none-any.whl", hash = "sha256:37f927ea17cde7ae2d7baf832f8e80ce3777624554a653006c9144f8017fe410", size = 22030, upload-time = "2020-10-07T18:38:38.148Z" }, + { url = "https://files.pythonhosted.org/packages/21/bb/893bcf542addd07f3ec92ca20ce028a0f254481f57039dc5b933a074d767/bump_my_version-1.2.4-py3-none-any.whl", hash = "sha256:b60ac52c8972c5a7e1e478d0334015a993ba5c27fad1b04bde558d25c667b0f5", size = 59732, upload-time = "2025-10-04T14:13:29.992Z" }, ] [[package]] @@ -487,18 +498,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" }, ] -[[package]] -name = "click-option-group" -version = "0.5.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b9/9f/1f917934da4e07ae7715a982347e3c2179556d8a58d1108c5da3e8f09c76/click_option_group-0.5.7.tar.gz", hash = "sha256:8dc780be038712fc12c9fecb3db4fe49e0d0723f9c171d7cda85c20369be693c", size = 22110, upload-time = "2025-03-24T13:24:55.897Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/93/27/bf74dc1494625c3b14dbcdb93740defd7b8c58dae3736be8d264f2a643fb/click_option_group-0.5.7-py3-none-any.whl", hash = "sha256:96b9f52f397ef4d916f81929bd6c1f85e89046c7a401a64e72a61ae74ad35c24", size = 11483, upload-time = "2025-03-24T13:24:54.611Z" }, -] - [[package]] name = "cloudpathlib" version = "0.21.1" @@ -540,28 +539,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180, upload-time = "2024-03-12T16:53:39.226Z" }, ] -[[package]] -name = "commitizen" -version = "4.8.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "argcomplete" }, - { name = "charset-normalizer" }, - { name = "colorama" }, - { name = "decli" }, - { name = "jinja2" }, - { name = "packaging" }, - { name = "pyyaml" }, - { name = "questionary" }, - { name = "termcolor" }, - { name = "tomlkit" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/64/15/c2fe85c0224886109b5061419acea2e20539be1b4bff619a16d7295fe0f2/commitizen-4.8.2.tar.gz", hash = "sha256:4fc73126c7300f715f11b85242550677722c57767b579100e869ccd45143e2c5", size = 53235, upload-time = "2025-05-22T03:16:39.915Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/40/2b81df1b3ec24c41004512feba0884895b84748775d21642690120539a30/commitizen-4.8.2-py3-none-any.whl", hash = "sha256:86cae0bd8e1da889389d828b30a5acb79b62f9290f9274b127ee9d8c189eb16c", size = 76074, upload-time = "2025-05-22T03:16:38.431Z" }, -] - [[package]] name = "commonmark" version = "0.9.1" @@ -637,8 +614,7 @@ dependencies = [ dev = [ { name = "black" }, { name = "build" }, - { name = "bump2version" }, - { name = "commitizen" }, + { name = "bump-my-version" }, { name = "coverage" }, { name = "griffe-typingdoc" }, { name = "hail" }, @@ -650,7 +626,6 @@ dev = [ { name = "pyright" }, { name = "pytest" }, { name = "pytest-mock" }, - { name = "python-semantic-release" }, { name = "pyyaml" }, { name = "ruff" }, { name = "toml" }, @@ -677,8 +652,7 @@ requires-dist = [ dev = [ { name = "black", specifier = ">=24.10.0" }, { name = "build", specifier = ">=1.2.2.post1" }, - { name = "bump2version", specifier = ">=1.0.1" }, - { name = "commitizen", specifier = ">=3.30.0" }, + { name = "bump-my-version", specifier = ">=0.30.0" }, { name = "coverage", specifier = ">=7.6.4" }, { name = "griffe-typingdoc", specifier = ">=0.2.7" }, { name = "hail", specifier = ">=0.2.133" }, @@ -690,7 +664,6 @@ dev = [ { name = "pyright", specifier = ">=1.1.400" }, { name = "pytest", specifier = ">=8.3.3" }, { name = "pytest-mock", specifier = ">=3.14.0" }, - { name = "python-semantic-release", specifier = ">=9.4.1" }, { name = "pyyaml", specifier = ">=6.0.2" }, { name = "ruff", specifier = ">=0.5.2" }, { name = "toml", specifier = ">=0.10.2" }, @@ -772,15 +745,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/53/f1/f3be2e9820a2c26fa77622223e91f9c504e1581830930d477e06146073f4/cyclonedx_python_lib-9.1.0-py3-none-any.whl", hash = "sha256:55693fca8edaecc3363b24af14e82cc6e659eb1e8353e58b587c42652ce0fb52", size = 374968, upload-time = "2025-02-27T17:23:37.766Z" }, ] -[[package]] -name = "decli" -version = "0.6.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0c/59/d4ffff1dee2c8f6f2dd8f87010962e60f7b7847504d765c91ede5a466730/decli-0.6.3.tar.gz", hash = "sha256:87f9d39361adf7f16b9ca6e3b614badf7519da13092f2db3c80ca223c53c7656", size = 7564, upload-time = "2025-06-01T15:23:41.25Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/fa/ec878c28bc7f65b77e7e17af3522c9948a9711b9fa7fc4c5e3140a7e3578/decli-0.6.3-py3-none-any.whl", hash = "sha256:5152347c7bb8e3114ad65db719e5709b28d7f7f45bdb709f70167925e55640f3", size = 7989, upload-time = "2025-06-01T15:23:40.228Z" }, -] - [[package]] name = "decorator" version = "4.4.2" @@ -838,15 +802,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload-time = "2024-04-23T18:57:14.835Z" }, ] -[[package]] -name = "dotty-dict" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6a/ab/88d67f02024700b48cd8232579ad1316aa9df2272c63049c27cc094229d6/dotty_dict-1.3.1.tar.gz", hash = "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15", size = 7699, upload-time = "2022-07-09T18:50:57.727Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/91/e0d457ee03ec33d79ee2cd8d212debb1bc21dfb99728ae35efdb5832dc22/dotty_dict-1.3.1-py3-none-any.whl", hash = "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f", size = 7014, upload-time = "2022-07-09T18:50:55.058Z" }, -] - [[package]] name = "exceptiongroup" version = "1.3.0" @@ -931,30 +886,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload-time = "2022-05-02T15:47:14.552Z" }, ] -[[package]] -name = "gitdb" -version = "4.0.12" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "smmap" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload-time = "2025-01-02T07:20:46.413Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload-time = "2025-01-02T07:20:43.624Z" }, -] - -[[package]] -name = "gitpython" -version = "3.1.44" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "gitdb" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c0/89/37df0b71473153574a5cdef8f242de422a0f5d26d7a9e231e6f169b4ad14/gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269", size = 214196, upload-time = "2025-01-02T07:32:43.59Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110", size = 207599, upload-time = "2025-01-02T07:32:40.731Z" }, -] - [[package]] name = "google-api-core" version = "2.24.2" @@ -1215,6 +1146,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/14/32/754cd4474790239c7436a7a9490bc0c4a0a2ed604cb9a940151a3b1055b9/grpcio_status-1.48.2-py3-none-any.whl", hash = "sha256:2c33bbdbe20188b2953f46f31af669263b6ee2a9b2d38fa0d36ee091532e21bf", size = 14441, upload-time = "2022-09-22T02:47:51.828Z" }, ] +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + [[package]] name = "hail" version = "0.2.134" @@ -1260,6 +1200,34 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/6c/eae99ba9422f90a2b86f1f309099e3504c19ee76f7401625fb47bd49f228/hail-0.2.134-py3-none-any.whl", hash = "sha256:75289519fa79d3eede93aa1de9b1ef29307e01eeb3ac99bcc5d5d94f949c2e81", size = 144929795, upload-time = "2025-03-07T12:38:30.373Z" }, ] +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + [[package]] name = "humanize" version = "4.12.3" @@ -2378,6 +2346,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ce/91/2ec36480fdb0b783cd9ef6795753c1dea13882f2e68e73bce76ae8c21e6a/pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808", size = 2066678, upload-time = "2025-04-23T18:33:12.224Z" }, ] +[[package]] +name = "pydantic-settings" +version = "2.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/4b/ac7e0aae12027748076d72a8764ff1c9d82ca75a7a52622e67ed3f765c54/pydantic_settings-2.12.0.tar.gz", hash = "sha256:005538ef951e3c2a68e1c08b292b5f2e71490def8589d4221b95dab00dafcfd0", size = 194184, upload-time = "2025-11-10T14:25:47.013Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/60/5d4751ba3f4a40a6891f24eec885f51afd78d208498268c734e256fb13c4/pydantic_settings-2.12.0-py3-none-any.whl", hash = "sha256:fddb9fd99a5b18da837b29710391e945b1e30c135477f484084ee513adb93809", size = 51880, upload-time = "2025-11-10T14:25:45.546Z" }, +] + [[package]] name = "pygments" version = "2.19.1" @@ -2515,16 +2497,12 @@ wheels = [ ] [[package]] -name = "python-gitlab" -version = "4.13.0" +name = "python-dotenv" +version = "1.2.1" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "requests" }, - { name = "requests-toolbelt" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c4/ea/e2cde926d63526935c1df259177371a195089b631d67a577fe5c39fbc7e1/python_gitlab-4.13.0.tar.gz", hash = "sha256:576bfb0901faca0c6b2d1ff2592e02944a6ec3e086c3129fb43c2a0df56a1c67", size = 484996, upload-time = "2024-10-08T13:28:48.755Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221, upload-time = "2025-10-26T15:12:10.434Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/5e/5fb4dcae9f5af5463c16952823d446ca449cce920efe8669871f600f0ab9/python_gitlab-4.13.0-py3-none-any.whl", hash = "sha256:8299a054fb571da16e1a8c1868fff01f34ac41ea1410c713a4647b3bbb2aa279", size = 145254, upload-time = "2024-10-08T13:28:45.839Z" }, + { url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230, upload-time = "2025-10-26T15:12:09.109Z" }, ] [[package]] @@ -2536,29 +2514,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/35/a6/145655273568ee78a581e734cf35beb9e33a370b29c5d3c8fee3744de29f/python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd", size = 8067, upload-time = "2023-02-21T17:40:05.117Z" }, ] -[[package]] -name = "python-semantic-release" -version = "9.4.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "click-option-group" }, - { name = "dotty-dict" }, - { name = "gitpython" }, - { name = "importlib-resources" }, - { name = "jinja2" }, - { name = "pydantic" }, - { name = "python-gitlab" }, - { name = "requests" }, - { name = "rich" }, - { name = "shellingham" }, - { name = "tomlkit" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/56/a1/22e5e01e8399e7f24dbc365d39ca5907862e257b4e92c30d5a618536de1c/python-semantic-release-9.4.1.tar.gz", hash = "sha256:78d8a8674edbcc8f389799c27d1c5a604f5bc0f061ce14951a6b061e68b25895", size = 158236, upload-time = "2024-04-06T19:50:47.942Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f5/71/a51a0bf84a1c00b1f906555102ed6b13dbd1e4af2b8e8e5a27ad74091b52/python_semantic_release-9.4.1-py3-none-any.whl", hash = "sha256:efe419bfb2e9eb8459d67109a725f00f1a93f487999ca02d757cf442c7f72679", size = 74273, upload-time = "2024-04-06T19:50:45.275Z" }, -] - [[package]] name = "pytz" version = "2025.2" @@ -2718,6 +2673,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/32/60/81ac2e7d1e3b861ab478a72e3b20fc91c4302acd2274822e493758941829/rich-12.6.0-py3-none-any.whl", hash = "sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e", size = 237505, upload-time = "2022-10-02T16:26:58.086Z" }, ] +[[package]] +name = "rich-click" +version = "1.9.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "rich" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bf/d8/f2c1b7e9a645ba40f756d7a5b195fc104729bc6b19061ba3ab385f342931/rich_click-1.9.4.tar.gz", hash = "sha256:af73dc68e85f3bebb80ce302a642b9fe3b65f3df0ceb42eb9a27c467c1b678c8", size = 73632, upload-time = "2025-10-25T01:08:49.142Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/6a/1f03adcb3cc7beb6f63aecc21565e9d515ccee653187fc4619cd0b42713b/rich_click-1.9.4-py3-none-any.whl", hash = "sha256:d70f39938bcecaf5543e8750828cbea94ef51853f7d0e174cda1e10543767389", size = 70245, upload-time = "2025-10-25T01:08:47.939Z" }, +] + [[package]] name = "rsa" version = "4.9.1" @@ -2815,15 +2785,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] -[[package]] -name = "smmap" -version = "5.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329, upload-time = "2025-01-02T07:14:40.909Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload-time = "2025-01-02T07:14:38.724Z" }, -] - [[package]] name = "sniffio" version = "1.3.1" @@ -2874,15 +2835,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload-time = "2025-04-02T08:25:07.678Z" }, ] -[[package]] -name = "termcolor" -version = "2.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/37/72/88311445fd44c455c7d553e61f95412cf89054308a1aa2434ab835075fc5/termcolor-2.5.0.tar.gz", hash = "sha256:998d8d27da6d48442e8e1f016119076b690d962507531df4890fcd2db2ef8a6f", size = 13057, upload-time = "2024-10-06T19:50:04.115Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/be/df630c387a0a054815d60be6a97eb4e8f17385d5d6fe660e1c02750062b4/termcolor-2.5.0-py3-none-any.whl", hash = "sha256:37b17b5fc1e604945c2642c872a3764b5d547a48009871aea3edd3afa180afb8", size = 7755, upload-time = "2024-10-06T19:50:02.097Z" }, -] - [[package]] name = "toml" version = "0.10.2" @@ -3072,6 +3024,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, ] +[[package]] +name = "wcmatch" +version = "10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bracex" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/3e/c0bdc27cf06f4e47680bd5803a07cb3dfd17de84cde92dd217dcb9e05253/wcmatch-10.1.tar.gz", hash = "sha256:f11f94208c8c8484a16f4f48638a85d771d9513f4ab3f37595978801cb9465af", size = 117421, upload-time = "2025-06-22T19:14:02.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/d8/0d1d2e9d3fabcf5d6840362adcf05f8cf3cd06a73358140c3a97189238ae/wcmatch-10.1-py3-none-any.whl", hash = "sha256:5848ace7dbb0476e5e55ab63c6bbd529745089343427caa5537f230cc01beb8a", size = 39854, upload-time = "2025-06-22T19:14:00.978Z" }, +] + [[package]] name = "wcwidth" version = "0.2.13"