ci: adopt python-semantic-release, fix hardcoded version strings

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Justin Visser 2026-02-27 00:07:25 +01:00
parent 3866c6d6f0
commit 6c31b331f7
3 changed files with 41 additions and 3 deletions

27
.github/workflows/release.yml vendored Normal file
View file

@ -0,0 +1,27 @@
name: Release
on:
push:
branches: [main]
jobs:
release:
runs-on: ubuntu-latest
if: github.repository == 'JustinZeus/scholarr'
permissions:
contents: write
id-token: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: pip install python-semantic-release
- name: Semantic Release
id: release
run: semantic-release publish
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View file

@ -5,16 +5,19 @@ import logging
import re import re
import threading import threading
import time import time
from importlib.metadata import version as pkg_version
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from crossref.restful import Etiquette, Works from crossref.restful import Etiquette, Works
from app.logging_utils import structured_log from app.logging_utils import structured_log
from app.services.domains.doi.normalize import normalize_doi from app.services.doi.normalize import normalize_doi
from app.settings import settings from app.settings import settings
_APP_VERSION = pkg_version("scholarr")
if TYPE_CHECKING: if TYPE_CHECKING:
from app.services.domains.publications.types import PublicationListItem, UnreadPublicationItem from app.services.publications.types import PublicationListItem, UnreadPublicationItem
TOKEN_RE = re.compile(r"[a-z0-9]+") TOKEN_RE = re.compile(r"[a-z0-9]+")
NON_ALNUM_RE = re.compile(r"[^a-z0-9\\s]+") NON_ALNUM_RE = re.compile(r"[^a-z0-9\\s]+")
@ -292,7 +295,7 @@ def _best_candidate_doi(
def _works_client(email: str | None) -> Works: def _works_client(email: str | None) -> Works:
if email: if email:
etiquette = Etiquette(settings.app_name, "0.1.0", "https://scholarr.local", email) etiquette = Etiquette(settings.app_name, _APP_VERSION, "https://scholarr.local", email)
return Works(etiquette=etiquette) return Works(etiquette=etiquette)
return Works() return Works()

View file

@ -27,6 +27,7 @@ dependencies = [
dev = [ dev = [
"pytest>=8.3,<9.0", "pytest>=8.3,<9.0",
"pytest-asyncio>=0.25,<0.26", "pytest-asyncio>=0.25,<0.26",
"python-semantic-release>=9.0,<10.0",
"ruff>=0.9", "ruff>=0.9",
"mypy>=1.14", "mypy>=1.14",
] ]
@ -61,6 +62,13 @@ ignore_missing_imports = true
check_untyped_defs = false check_untyped_defs = false
warn_unused_ignores = true warn_unused_ignores = true
[tool.semantic_release]
version_toml = ["pyproject.toml:project.version"]
version_variables = ["frontend/package.json:version"]
branch = "main"
build_command = ""
commit_message = "chore(release): v{version}"
[tool.setuptools] [tool.setuptools]
include-package-data = true include-package-data = true