diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 12b35f3..3160f90 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,21 +1,27 @@ version: 2 updates: - - package-ecosystem: "github-actions" + # Экосистема uv покрывает и pyproject.toml, и uv.lock. Отдельный блок pip на + # том же каталоге давал бы вторую пачку PR на те же зависимости. + - package-ecosystem: "uv" directory: "/" schedule: interval: "monthly" open-pull-requests-limit: 1 labels: ["dependencies", "automated"] + commit-message: + prefix: "chore" groups: - github-actions-all: + uv-all: patterns: ["*"] - - package-ecosystem: "pip" + - package-ecosystem: "github-actions" directory: "/" schedule: interval: "monthly" open-pull-requests-limit: 1 labels: ["dependencies", "automated"] + commit-message: + prefix: "chore" groups: - pip-all: + github-actions-all: patterns: ["*"] diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml new file mode 100644 index 0000000..22c4d6b --- /dev/null +++ b/.github/workflows/pr-title.yml @@ -0,0 +1,24 @@ +name: PR Title + +# Заголовок PR обязан быть conventional commit: при squash-мерже он становится +# сообщением коммита, а по нему release-please определяет, какой разряд версии +# поднять. Проверка отдельных коммитов ветки намеренно не делается, чтобы не +# мешать работе внутри PR. +on: + pull_request_target: + types: + - opened + - edited + - synchronize + - reopened + +permissions: + pull-requests: read + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: amannn/action-semantic-pull-request@v6 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/pyci.yml b/.github/workflows/pyci.yml index 00b05db..7956d81 100644 --- a/.github/workflows/pyci.yml +++ b/.github/workflows/pyci.yml @@ -1,21 +1,26 @@ name: Python CI on: - - push - - pull_request + push: + branches: + - main + pull_request: + branches: + - main jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 - - uses: actions/setup-python@v7 - with: - python-version: '3.13' + + # setup-python не нужен: версию питона держит .python-version, и uv сам + # ставит её при первом `uv sync`. Единый источник версии, поэтому раннер + # и образ кита не могут разойтись. + - uses: astral-sh/setup-uv@v10.0.0 + - name: Install - run: | - pip install uv - make install + run: make install - name: Run linter run: make lint - name: Run tests diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 0000000..e17ca4d --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,33 @@ +name: Release Please + +on: + push: + branches: + - main + +permissions: + contents: write + pull-requests: write + # Trusted publishing на PyPI: токена в секретах нет, uv обменивает OIDC-токен + # раннера на разрешение публикации. + id-token: write + +jobs: + release-please: + runs-on: ubuntu-latest + steps: + - uses: googleapis/release-please-action@v5 + id: release + + # Публикация живёт вторым шагом этого же workflow. Схема «release-please + # ставит тег, а отдельный workflow публикует по тегу» не работает: тег + # ставит GITHUB_TOKEN, а от его событий GitHub workflow не запускает. + - uses: actions/checkout@v7 + if: ${{ steps.release.outputs.release_created }} + + - uses: astral-sh/setup-uv@v10.0.0 + if: ${{ steps.release.outputs.release_created }} + + - name: Publish to PyPI + if: ${{ steps.release.outputs.release_created }} + run: make publish diff --git a/.gitignore b/.gitignore index 5f440ab..b921e75 100644 --- a/.gitignore +++ b/.gitignore @@ -37,9 +37,6 @@ coverage.xml .hypothesis/ .pytest_cache/ -# pyenv -.python-version - # Environments .venv diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..6324d40 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.14 diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 0000000..0ee8c01 --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "0.3.0" +} diff --git a/Makefile b/Makefile index fa0096a..29f7119 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,20 @@ export PYTHONPATH=src -check: test lint - @echo Done! +install: + @uv sync + +lint: + @uv run ruff check . -test: lint +test: @uv run pytest test -lint: - @uv run ruff check src test +check: install lint test -install: - @uv sync +build: + @uv build + +publish: build + @uv publish --trusted-publishing always -.PHONY: all test install +.PHONY: install lint test check build publish diff --git a/pyproject.toml b/pyproject.toml index 24710fd..83d10db 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,7 +10,7 @@ repository = "https://github.com/hexlet-components/python-points" classifiers = [ "Intended Audience :: Education", "License :: OSI Approved :: ISC License (ISCL)", - "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3", "Topic :: Education", "Topic :: Software Development :: Libraries", "Typing :: Typed", diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 0000000..4a79858 --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "packages": { + ".": { + "release-type": "python", + "package-name": "hexlet-points" + } + } +}