diff --git a/.gitignore b/.gitignore index b49985c..607abb7 100644 --- a/.gitignore +++ b/.gitignore @@ -68,8 +68,5 @@ devenv.local.nix # direnv .direnv -# pre-commit -.pre-commit-config.yaml - # python version lock .python-version diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..85618c2 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,32 @@ +repos: + - repo: local + hooks: + - id: check-version-increment + name: Check Version Increment + entry: python scripts/hooks/pre-push/check_version_increment.py + language: system + pass_filenames: false + stages: [pre-push] + + - id: tests + name: Run Python Tests + entry: uv run test + language: system + pass_filenames: false + stages: [pre-push] + + - id: prettier-with-jinja + name: Prettier (with Jinja support) + entry: bun run prettier -c + language: system + types_or: + [javascript, jsx, ts, tsx, css, scss, sass, less, yaml, json, markdown, html, jinja] + stages: [pre-push] + + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.11.9 + hooks: + - id: ruff + stages: [pre-push] + - id: ruff-format + stages: [pre-push] diff --git a/pyproject.toml b/pyproject.toml index 14129bd..9137fa9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,7 +53,12 @@ invenio_config_iform = "invenio_config_iform.config" invenio_config_iform = "invenio_config_iform.ext:finalize_app" [dependency-groups] -dev = ["hatch>=1.14.1", "pydocstyle>=6.3.0", "ruff>=0.11.7"] +dev = [ + "hatch>=1.14.1", + "pre-commit>=4.2.0", + "pydocstyle>=6.3.0", + "ruff>=0.11.7", +] tests = [ "invenio-app>=1.5.0", "invenio-search[opensearch2]>=2.1.0", diff --git a/scripts/hooks/pre-push/check_version_increment.py b/scripts/hooks/pre-push/check_version_increment.py new file mode 100755 index 0000000..a7295a2 --- /dev/null +++ b/scripts/hooks/pre-push/check_version_increment.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python + +from pathlib import Path +import re +import subprocess +import sys +import tomllib + + +def run_command(command): + return subprocess.run( + command, shell=True, capture_output=True, text=True, check=True + ).stdout.strip() + + +def get_version_file_from_pyproject(): + try: + with Path("pyproject.toml").open("rb") as f: + return tomllib.load(f)["tool"]["hatch"]["version"]["path"] + except FileNotFoundError: + raise FileNotFoundError("Project has no pyproject.toml file!") + except KeyError: + raise KeyError("Attribute `tool.hatch.version.path` not found in pyproject.toml") + + +def get_remote_version(remote, branch, version_file): + remote_file = f"{remote}/{branch}:{version_file}" + match = re.search( + r"__version__\s*=\s*['\"]([^'\"]+)['\"]", + run_command(f"git show {remote_file}"), + ) + if match: + return match.group(1) + else: + raise AttributeError(f"No `__version__` attribute found in {remote_file}") + + +def main(): + version_file = get_version_file_from_pyproject() + branch = run_command("git rev-parse --abbrev-ref HEAD") + remote = sys.argv[1] if len(sys.argv) > 1 else "origin" + + current_version = run_command("uv run hatch version") + remote_version = get_remote_version(remote, branch, version_file) + + assert current_version != remote_version, ( + "Version has not been incremented! Please update the version before pushing." + ) + + +if __name__ == "__main__": + main() diff --git a/uv.lock b/uv.lock index 82be131..32225be 100644 --- a/uv.lock +++ b/uv.lock @@ -321,6 +321,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload_time = "2024-09-04T20:44:45.309Z" }, ] +[[package]] +name = "cfgv" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload_time = "2023-08-12T20:38:17.776Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload_time = "2023-08-12T20:38:16.269Z" }, +] + [[package]] name = "charset-normalizer" version = "3.4.1" @@ -1443,6 +1452,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6e/aa/8caf6a0a3e62863cbb9dab27135660acba46903b703e224f14f447e57934/hyperlink-21.0.0-py2.py3-none-any.whl", hash = "sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4", size = 74638, upload_time = "2021-01-08T05:51:22.906Z" }, ] +[[package]] +name = "identify" +version = "2.6.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0c/83/b6ea0334e2e7327084a46aaaf71f2146fc061a192d6518c0d020120cd0aa/identify-2.6.10.tar.gz", hash = "sha256:45e92fd704f3da71cc3880036633f48b4b7265fd4de2b57627cb157216eb7eb8", size = 99201, upload_time = "2025-04-19T15:10:38.32Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/d3/85feeba1d097b81a44bcffa6a0beab7b4dfffe78e82fc54978d3ac380736/identify-2.6.10-py2.py3-none-any.whl", hash = "sha256:5f34248f54136beed1a7ba6a6b5c4b6cf21ff495aac7c359e1ef831ae3b8ab25", size = 99101, upload_time = "2025-04-19T15:10:36.701Z" }, +] + [[package]] name = "idna" version = "3.10" @@ -1700,6 +1718,7 @@ dependencies = [ [package.dev-dependencies] dev = [ { name = "hatch" }, + { name = "pre-commit" }, { name = "pydocstyle" }, { name = "ruff" }, ] @@ -1722,6 +1741,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ { name = "hatch", specifier = ">=1.14.1" }, + { name = "pre-commit", specifier = ">=4.2.0" }, { name = "pydocstyle", specifier = ">=6.3.0" }, { name = "ruff", specifier = ">=0.11.7" }, ] @@ -3174,6 +3194,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/42/9c/56301d6d2165f3bc5c4dd520a827c1d5790b2b91664230ff9188e7416e53/nbstripout-0.6.2-py2.py3-none-any.whl", hash = "sha256:2eddf4033db5bbe9e96bbb85d09746a050cb662f31601c786a4cf78552ae5303", size = 15765, upload_time = "2024-02-04T08:45:13.146Z" }, ] +[[package]] +name = "nodeenv" +version = "1.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload_time = "2024-06-04T18:44:11.171Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload_time = "2024-06-04T18:44:08.352Z" }, +] + [[package]] name = "oauthlib" version = "3.2.2" @@ -3395,6 +3424,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce", size = 49567, upload_time = "2018-02-15T19:01:27.172Z" }, ] +[[package]] +name = "pre-commit" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cfgv" }, + { name = "identify" }, + { name = "nodeenv" }, + { name = "pyyaml" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/08/39/679ca9b26c7bb2999ff122d50faa301e49af82ca9c066ec061cfbc0c6784/pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146", size = 193424, upload_time = "2025-03-18T21:35:20.987Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/74/a88bf1b1efeae488a0c0b7bdf71429c313722d1fc0f377537fbe554e6180/pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd", size = 220707, upload_time = "2025-03-18T21:35:19.343Z" }, +] + [[package]] name = "prompt-toolkit" version = "3.0.51"