contraqctor test suite #35
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: contraqctor test suite | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| bump_type: | |
| description: "Version bump type" | |
| required: false | |
| default: "rc" | |
| type: choice | |
| options: | |
| - rc | |
| - patch | |
| - minor | |
| - major | |
| - stable | |
| pull_request: | |
| push: | |
| branches: | |
| - main | |
| - dev* | |
| - release* | |
| release: | |
| types: [published] | |
| jobs: | |
| # ╔──────────────────────────╗ | |
| # │ _____ _ │ | |
| # │ |_ _|__ ___| |_ ___ │ | |
| # │ | |/ _ \/ __| __/ __| │ | |
| # │ | | __/\__ \ |_\__ \ │ | |
| # │ |_|\___||___/\__|___/ │ | |
| # │ │ | |
| # ╚──────────────────────────╝ | |
| tests: | |
| name: Python ${{ matrix.python-version }} on ${{ matrix.os }} | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| matrix: | |
| os: [ubuntu-latest, windows-latest] | |
| python-version: [3.11, 3.12, 3.13] | |
| fail-fast: false | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - uses: astral-sh/setup-uv@v6 | |
| with: | |
| enable-cache: true | |
| - name: Install python dependencies | |
| run: uv sync | |
| - name: Run ruff format | |
| run: uv run ruff format | |
| - name: Run ruff check | |
| run: uv run ruff check | |
| - name: Run interrogate | |
| run: uv run interrogate | |
| - name: Run codespell | |
| run: uv run codespell --check-filenames | |
| - name: Run pytest | |
| run: uv run pytest --cov contraqctor | |
| - name: Build | |
| run: uv build | |
| # ╔───────────────────────────────────────────────────────────╗ | |
| # │ ____ ___ ____ ____ ____ _ │ | |
| # │ / ___|_ _/ ___| _ \ | _ \ ___| | ___ __ _ ___ ___ │ | |
| # │ | | | | | | | | | | |_) / _ \ |/ _ \/ _` / __|/ _ \ │ | |
| # │ | |___ | | |___| |_| | | _ < __/ | __/ (_| \__ \ __/ │ | |
| # │ \____|___\____|____/ |_| \_\___|_|\___|\__,_|___/\___| │ | |
| # │ │ | |
| # ╚───────────────────────────────────────────────────────────╝ | |
| github-rc-release: | |
| needs: tests | |
| runs-on: ubuntu-latest | |
| if: > | |
| github.ref == 'refs/heads/main' && | |
| github.event_name == 'push' && | |
| github.event.head_commit.author.email != 'github-actions[bot]@users.noreply.github.com' | |
| name: Create GitHub pre-release | |
| steps: | |
| - uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 | |
| ref: main | |
| - uses: astral-sh/setup-uv@v6 | |
| with: | |
| enable-cache: true | |
| - name: Bump pre-release by default | |
| # Note: Bumping the rc will fail if the version is not currently an rc | |
| # To solve it, we bump the patch and rc atomically | |
| run: | | |
| if uv version --bump rc --dry-run; then | |
| uv version --bump rc | |
| else | |
| uv version --bump rc --bump patch | |
| fi | |
| - name: Commit version | |
| run: | | |
| git config --global user.name "github-actions[bot]" | |
| git config --global user.email "github-actions[bot]@users.noreply.github.com" | |
| git add . | |
| git commit -m "Bump version [skip ci]" || echo "No changes to commit" | |
| git push origin main | |
| - name: Get version | |
| id: get_version | |
| run: | | |
| version=$(uv run uv version --short) | |
| echo "version=$version" >> $GITHUB_OUTPUT | |
| - name: Create GitHub Release | |
| uses: softprops/action-gh-release@v2 | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| with: | |
| tag_name: v${{ steps.get_version.outputs.version }} | |
| name: v${{ steps.get_version.outputs.version }} | |
| generate_release_notes: true | |
| prerelease: true | |
| body: | | |
| Automated pre-release v${{ steps.get_version.outputs.version }} | |
| # ╔─────────────────────────────────────────────────────────────────╗ | |
| # │ ____ _ _ _ ____ _ │ | |
| # │ | _ \ _ _| |__ | (_) ___ | _ \ ___| | ___ __ _ ___ ___ │ | |
| # │ | |_) | | | | '_ \| | |/ __| | |_) / _ \ |/ _ \/ _` / __|/ _ \ │ | |
| # │ | __/| |_| | |_) | | | (__ | _ < __/ | __/ (_| \__ \ __/ │ | |
| # │ |_| \__,_|_.__/|_|_|\___| |_| \_\___|_|\___|\__,_|___/\___| │ | |
| # │ │ | |
| # ╚─────────────────────────────────────────────────────────────────╝ | |
| prepare-public-release: | |
| runs-on: ubuntu-latest | |
| name: Prepare files for public release | |
| needs: tests | |
| if: github.event_name == 'workflow_dispatch' | |
| outputs: | |
| version: ${{ steps.get_version.outputs.version }} | |
| is_prerelease: ${{ steps.check_prerelease.outputs.prerelease }} | |
| steps: | |
| - uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 | |
| ref: main | |
| - uses: astral-sh/setup-uv@v6 | |
| with: | |
| enable-cache: true | |
| - name: Get target version | |
| id: get_version | |
| run: | | |
| # Use bump type from input (defaults to rc) | |
| bump_type="${{ github.event.inputs.bump_type || 'rc' }}" | |
| echo "Bumping version with type: $bump_type" | |
| # Handle version bumping based on type | |
| if [[ "$bump_type" == "rc" ]]; then | |
| # Handle rc bumping logic (same as in github-rc-release) | |
| if uv version --bump rc --dry-run; then | |
| uv version --bump rc | |
| else | |
| uv version --bump rc --bump patch | |
| fi | |
| else | |
| # Handle patch, minor, major, stable | |
| uv version --bump $bump_type | |
| fi | |
| release_version=$(uv run uv version --short) | |
| echo "version=$release_version" >> $GITHUB_OUTPUT | |
| echo "Release version will be: $release_version" | |
| - name: Validate version format | |
| run: uv version ${{ steps.get_version.outputs.version }} --dry-run | |
| - name: Update package version | |
| run: uv version ${{ steps.get_version.outputs.version }} | |
| - name: Commit version and create tag | |
| run: | | |
| git config --global user.name "github-actions[bot]" | |
| git config --global user.email "github-actions[bot]@users.noreply.github.com" | |
| git add . | |
| git commit -m "Release v${{ steps.get_version.outputs.version }} [skip ci]" | |
| git tag -a "v${{ steps.get_version.outputs.version }}" -m "Release v${{ steps.get_version.outputs.version }}" | |
| git push origin main | |
| git push origin "v${{ steps.get_version.outputs.version }}" | |
| - name: Determine if prerelease | |
| id: check_prerelease | |
| shell: bash | |
| run: | | |
| version="${{ steps.get_version.outputs.version }}" | |
| if [[ "$version" == *"rc"* ]]; then | |
| echo "prerelease=true" >> $GITHUB_OUTPUT | |
| else | |
| echo "prerelease=false" >> $GITHUB_OUTPUT | |
| fi | |
| - name: Create GitHub Release | |
| uses: softprops/action-gh-release@v2 | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| with: | |
| tag_name: v${{ steps.get_version.outputs.version }} | |
| name: Release v${{ steps.get_version.outputs.version }} | |
| generate_release_notes: true | |
| prerelease: ${{ steps.check_prerelease.outputs.prerelease }} | |
| body: | | |
| Release v${{ steps.get_version.outputs.version }} | |
| This release was manually triggered. | |
| publish-to-pypi: | |
| runs-on: ubuntu-latest | |
| name: Publish to PyPI | |
| needs: [tests, prepare-public-release] | |
| if: | | |
| (github.event_name == 'workflow_dispatch') || | |
| (github.event_name == 'release' && | |
| github.event.action == 'published' && | |
| !github.event.release.prerelease && | |
| startsWith(github.ref, 'refs/tags/v')) | |
| steps: | |
| - uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 | |
| ref: ${{ github.event_name == 'workflow_dispatch' && 'main' || github.ref_name }} | |
| - uses: astral-sh/setup-uv@v6 | |
| with: | |
| enable-cache: true | |
| - name: Verify version consistency (for automatic releases) | |
| if: github.event_name == 'release' | |
| shell: bash | |
| run: | | |
| tag_version=$(echo "${{ github.ref_name }}" | sed 's/^v//') | |
| package_version=$(uv run uv version --short) | |
| if [[ "$tag_version" != "$package_version" ]]; then | |
| echo "ERROR: Tag version ($tag_version) doesn't match package version ($package_version)" | |
| exit 1 | |
| fi | |
| echo "✅ Version consistency verified: $tag_version" | |
| - name: Get current version (for manual releases) | |
| if: github.event_name == 'workflow_dispatch' | |
| run: | | |
| package_version=$(uv run uv version --short) | |
| echo "📦 Publishing version: $package_version" | |
| - name: Build | |
| run: uv build | |
| - name: Publish to PyPI | |
| run: uv publish --token ${{ secrets.AIND_PYPI_TOKEN }} | |
| # ╔─────────────────────────╗ | |
| # │ ____ │ | |
| # │ | _ \ ___ ___ ___ │ | |
| # │ | | | |/ _ \ / __/ __| │ | |
| # │ | |_| | (_) | (__\__ \ │ | |
| # │ |____/ \___/ \___|___/ │ | |
| # │ │ | |
| # ╚─────────────────────────╝ | |
| build-docs: | |
| name: Build and deploy documentation to GitHub Pages | |
| runs-on: ubuntu-latest | |
| needs: publish-to-pypi | |
| if: github.event_name == 'release' && !github.event.release.prerelease | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v5 | |
| - name: Install uv | |
| uses: astral-sh/setup-uv@v6 | |
| with: | |
| enable-cache: true | |
| - name: Install dependencies | |
| run: uv sync --group docs | |
| - name: Configure Git user | |
| run: | | |
| git config user.name "github-actions[bot]" | |
| git config user.email "github-actions[bot]@users.noreply.github.com" | |
| - name: Build & Deploy docs | |
| run: uv run mkdocs gh-deploy --force |