From 8972606aa472095619b03bf383ef49b7ea625ce5 Mon Sep 17 00:00:00 2001 From: Kirill Mokevnin Date: Wed, 12 Aug 2026 16:14:56 -0400 Subject: [PATCH] =?UTF-8?q?chore:=20=D0=BF=D1=80=D0=B8=D0=B2=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=B8=20=D0=B8=D0=BD=D1=84=D1=80=D0=B0=D1=81=D1=82=D1=80?= =?UTF-8?q?=D1=83=D0=BA=D1=82=D1=83=D1=80=D1=83=20=D0=BA=20=D0=BA=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=D0=BD=D1=83=20=D0=BA=D0=B0=D0=BC=D0=BF=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Версия рантайма переезжает в .python-version и берётся оттуда uv-ом. В dependabot экосистема pip заменена на uv: проект собран на uv, и pip-блок не видел uv.lock. Добавлены линт заголовка PR и release-please с публикацией в PyPI вторым шагом того же workflow. Стартовая точка release-please это 0.3.0: столько в PyPI и на теге v0.3.0. Версию 0.3.1 подняли вручную и не выпустили, ближайший релиз её опубликует. Co-Authored-By: Claude Opus 5 (1M context) --- .github/dependabot.yml | 14 ++++++++---- .github/workflows/pr-title.yml | 24 ++++++++++++++++++++ .github/workflows/pyci.yml | 21 +++++++++++------- .github/workflows/release-please.yml | 33 ++++++++++++++++++++++++++++ .gitignore | 3 --- .python-version | 1 + .release-please-manifest.json | 3 +++ Makefile | 21 +++++++++++------- pyproject.toml | 2 +- release-please-config.json | 9 ++++++++ 10 files changed, 107 insertions(+), 24 deletions(-) create mode 100644 .github/workflows/pr-title.yml create mode 100644 .github/workflows/release-please.yml create mode 100644 .python-version create mode 100644 .release-please-manifest.json create mode 100644 release-please-config.json 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" + } + } +}