diff --git a/commitizen/providers/__init__.py b/commitizen/providers/__init__.py index 51302d2b37..c1f24aaaee 100644 --- a/commitizen/providers/__init__.py +++ b/commitizen/providers/__init__.py @@ -14,6 +14,7 @@ from commitizen.providers.npm_provider import NpmProvider from commitizen.providers.pep621_provider import Pep621Provider from commitizen.providers.poetry_provider import PoetryProvider +from commitizen.providers.rye_provider import RyeProvider from commitizen.providers.scm_provider import ScmProvider __all__ = [ @@ -24,6 +25,7 @@ "NpmProvider", "Pep621Provider", "PoetryProvider", + "RyeProvider", "ScmProvider", ] diff --git a/commitizen/providers/rye_provider.py b/commitizen/providers/rye_provider.py new file mode 100644 index 0000000000..e7031d1548 --- /dev/null +++ b/commitizen/providers/rye_provider.py @@ -0,0 +1,20 @@ +from __future__ import annotations + +import tomlkit + + +from commitizen.providers.base_provider import TomlProvider + + +class RyeProvider(TomlProvider): + """ + Rye version management + """ + + filename = "pyproject.toml" + + def get(self, pyproject: tomlkit.TOMLDocument) -> str: + return pyproject["tool"]["rye"]["version"] # type: ignore + + def set(self, pyproject: tomlkit.TOMLDocument, version: str): + pyproject["tool"]["rye"]["version"] = version # type: ignore diff --git a/docs/config.md b/docs/config.md index 7ef8644fa2..63f0247402 100644 --- a/docs/config.md +++ b/docs/config.md @@ -332,6 +332,7 @@ Commitizen provides some version providers for some well known formats: | `scm` | Fetch the version from git and does not need to set it back | | `pep621` | Get and set version from `pyproject.toml` `project.version` field | | `poetry` | Get and set version from `pyproject.toml` `tool.poetry.version` field | +| `rye` | Get and set version from `pyproject.toml` `tool.rye.version` field | | `cargo` | Get and set version from `Cargo.toml` `project.version` field | | `npm` | Get and set version from `package.json` `version` field, `package-lock.json` `version,packages.''.version` fields if the file exists, and `npm-shrinkwrap.json` `version,packages.''.version` fields if the file exists | | `composer` | Get and set version from `composer.json` `project.version` field | diff --git a/pyproject.toml b/pyproject.toml index da57effff7..7b1c1911f7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -98,6 +98,7 @@ composer = "commitizen.providers:ComposerProvider" npm = "commitizen.providers:NpmProvider" pep621 = "commitizen.providers:Pep621Provider" poetry = "commitizen.providers:PoetryProvider" +rye = "commitizen.providers:RyeProvider" scm = "commitizen.providers:ScmProvider" [tool.poetry.plugins."commitizen.scheme"] diff --git a/tests/providers/test_poetry_provider.py b/tests/providers/test_poetry_provider.py index 9e327db6ad..4f22d4897e 100644 --- a/tests/providers/test_poetry_provider.py +++ b/tests/providers/test_poetry_provider.py @@ -25,7 +25,7 @@ "content, expected", ((POETRY_TOML, POETRY_EXPECTED),), ) -def test_cargo_provider( +def test_poetry_provider( config: BaseConfig, chdir: Path, content: str, diff --git a/tests/providers/test_rye_provider.py b/tests/providers/test_rye_provider.py new file mode 100644 index 0000000000..d0a5a5f13a --- /dev/null +++ b/tests/providers/test_rye_provider.py @@ -0,0 +1,45 @@ +from __future__ import annotations + +from pathlib import Path +from textwrap import dedent + +import pytest + +from commitizen.config.base_config import BaseConfig +from commitizen.providers import get_provider +from commitizen.providers.base_provider import VersionProvider +from commitizen.providers.rye_provider import RyeProvider + + +RYE_TOML = """\ +[tool.rye] +version = "0.1.0" +""" + +RYE_EXPECTED = """\ +[tool.rye] +version = "42.1" +""" + + +@pytest.mark.parametrize( + "content, expected", + ((RYE_TOML, RYE_EXPECTED),), +) +def test_rye_provider( + config: BaseConfig, + chdir: Path, + content: str, + expected: str, +): + filename = RyeProvider.filename + file = chdir / filename + file.write_text(dedent(content)) + config.settings["version_provider"] = "rye" + + provider: VersionProvider = get_provider(config) + assert isinstance(provider, RyeProvider) + assert provider.get_version() == "0.1.0" + + provider.set_version("42.1") + assert file.read_text() == dedent(expected)