commitizen 4.16.5__tar.gz → 4.17.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. {commitizen-4.16.5 → commitizen-4.17.1}/PKG-INFO +1 -6
  2. commitizen-4.17.1/commitizen/__version__.py +1 -0
  3. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/cli.py +0 -1
  4. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/commands/changelog.py +1 -1
  5. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/commands/init.py +45 -13
  6. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/commands/version.py +57 -5
  7. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/project_info.py +14 -1
  8. {commitizen-4.16.5 → commitizen-4.17.1}/docs/README.md +0 -5
  9. commitizen-4.17.1/pyproject.toml +363 -0
  10. commitizen-4.16.5/pyproject.toml → commitizen-4.17.1/pyproject.toml.orig +2 -2
  11. commitizen-4.16.5/commitizen/__version__.py +0 -1
  12. {commitizen-4.16.5 → commitizen-4.17.1}/LICENSE +0 -0
  13. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/__init__.py +0 -0
  14. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/__main__.py +0 -0
  15. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/bump.py +0 -0
  16. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/changelog.py +0 -0
  17. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/changelog_formats/__init__.py +0 -0
  18. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/changelog_formats/asciidoc.py +0 -0
  19. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/changelog_formats/base.py +0 -0
  20. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/changelog_formats/markdown.py +0 -0
  21. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/changelog_formats/restructuredtext.py +0 -0
  22. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/changelog_formats/textile.py +0 -0
  23. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/cmd.py +0 -0
  24. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/commands/__init__.py +0 -0
  25. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/commands/bump.py +0 -0
  26. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/commands/check.py +0 -0
  27. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/commands/commit.py +0 -0
  28. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/commands/example.py +0 -0
  29. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/commands/info.py +0 -0
  30. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/commands/list_cz.py +0 -0
  31. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/commands/schema.py +0 -0
  32. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/config/__init__.py +0 -0
  33. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/config/base_config.py +0 -0
  34. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/config/factory.py +0 -0
  35. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/config/json_config.py +0 -0
  36. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/config/toml_config.py +0 -0
  37. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/config/yaml_config.py +0 -0
  38. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/cz/__init__.py +0 -0
  39. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/cz/base.py +0 -0
  40. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/cz/conventional_commits/__init__.py +0 -0
  41. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/cz/conventional_commits/conventional_commits.py +0 -0
  42. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/cz/conventional_commits/conventional_commits_info.txt +0 -0
  43. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/cz/customize/__init__.py +0 -0
  44. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/cz/customize/customize.py +0 -0
  45. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/cz/customize/customize_info.txt +0 -0
  46. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/cz/exceptions.py +0 -0
  47. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/cz/jira/__init__.py +0 -0
  48. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/cz/jira/jira.py +0 -0
  49. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/cz/jira/jira_info.txt +0 -0
  50. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/cz/utils.py +0 -0
  51. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/defaults.py +0 -0
  52. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/exceptions.py +0 -0
  53. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/factory.py +0 -0
  54. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/git.py +0 -0
  55. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/hooks.py +0 -0
  56. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/out.py +0 -0
  57. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/providers/__init__.py +0 -0
  58. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/providers/base_provider.py +0 -0
  59. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/providers/cargo_provider.py +0 -0
  60. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/providers/commitizen_provider.py +0 -0
  61. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/providers/composer_provider.py +0 -0
  62. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/providers/npm_provider.py +0 -0
  63. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/providers/pep621_provider.py +0 -0
  64. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/providers/poetry_provider.py +0 -0
  65. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/providers/scm_provider.py +0 -0
  66. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/providers/uv_provider.py +0 -0
  67. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/py.typed +0 -0
  68. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/question.py +0 -0
  69. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/tags.py +0 -0
  70. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/templates/CHANGELOG.adoc.j2 +0 -0
  71. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/templates/CHANGELOG.md.j2 +0 -0
  72. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/templates/CHANGELOG.rst.j2 +0 -0
  73. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/templates/CHANGELOG.textile.j2 +0 -0
  74. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/version_increment.py +0 -0
  75. {commitizen-4.16.5 → commitizen-4.17.1}/commitizen/version_schemes.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: commitizen
3
- Version: 4.16.5
3
+ Version: 4.17.1
4
4
  Summary: Python commitizen client tool
5
5
  Keywords: commitizen,conventional,commits,git
6
6
  Author: Santiago Fraire
@@ -349,11 +349,6 @@ After installation, you can verify the completion is working by:
349
349
 
350
350
  For more detailed information about argcomplete configuration and troubleshooting, visit the [argcomplete documentation](https://kislyuk.github.io/argcomplete/).
351
351
 
352
- ## Star History
353
-
354
- [![Star History Chart](https://api.star-history.com/svg?repos=commitizen-tools/commitizen)](https://star-history.com/#commitizen-tools/commitizen)
355
-
356
-
357
352
  ## Sponsors
358
353
 
359
354
  These are our cool sponsors!
@@ -0,0 +1 @@
1
+ __version__ = "4.17.1"
@@ -583,7 +583,6 @@ data = {
583
583
  "const": "USE_GIT_COMMITS",
584
584
  "choices": ["USE_GIT_COMMITS"]
585
585
  + [str(increment) for increment in VersionIncrement],
586
- "exclusive_group": "group2",
587
586
  },
588
587
  {
589
588
  "name": "manual_version",
@@ -31,7 +31,7 @@ class ChangelogArgs(TypedDict, total=False):
31
31
  change_type_order: list[str]
32
32
  current_version: str
33
33
  dry_run: bool
34
- file_name: str
34
+ file_name: str | None
35
35
  incremental: bool
36
36
  merge_prerelease: bool
37
37
  rev_range: str
@@ -109,13 +109,7 @@ class Init:
109
109
  tag_format = self._ask_tag_format(tag) # confirm & text
110
110
  update_changelog_on_bump = self._ask_update_changelog_on_bump() # confirm
111
111
  major_version_zero = self._ask_major_version_zero(version) # confirm
112
- hook_types: list[str] | None = questionary.checkbox(
113
- "What types of pre-commit hook you want to install? (Leave blank if you don't want to install)",
114
- choices=[
115
- questionary.Choice("commit-msg", checked=False),
116
- questionary.Choice("pre-push", checked=False),
117
- ],
118
- ).unsafe_ask()
112
+ hook_types = self._ask_hook_types()
119
113
  except KeyboardInterrupt:
120
114
  raise InitFailedError("Stopped by user")
121
115
 
@@ -128,13 +122,9 @@ class Init:
128
122
  ) as config_file:
129
123
  yaml.safe_dump(config_data, stream=config_file)
130
124
 
131
- if not project_info.is_pre_commit_installed():
132
- raise InitFailedError(
133
- "Failed to install pre-commit hook.\n"
134
- "pre-commit is not installed in current environment."
135
- )
125
+ installer = self._ask_hook_installer()
136
126
 
137
- cmd_args = ["pre-commit", "install"]
127
+ cmd_args = [installer, "install"]
138
128
  for ty in hook_types:
139
129
  cmd_args.extend(["--hook-type", ty])
140
130
  c = cmd.run(cmd_args)
@@ -164,6 +154,48 @@ class Init:
164
154
  out.info("\tcz bump\n")
165
155
  out.success("Configuration complete 🚀")
166
156
 
157
+ def _ask_hook_types(self) -> list[str] | None:
158
+ """Ask which pre-commit hook types to install.
159
+
160
+ Skip the question when neither ``pre-commit`` nor ``prek`` is
161
+ installed, so users who do not use those tools are not prompted.
162
+ """
163
+ if not project_info.available_hook_installers():
164
+ out.info("No pre-commit hook detected, skipping question")
165
+ return None
166
+
167
+ hook_types: list[str] | None = questionary.checkbox(
168
+ "What types of pre-commit hook you want to install? (Leave blank if you don't want to install)",
169
+ choices=[
170
+ questionary.Choice("commit-msg", checked=False),
171
+ questionary.Choice("pre-push", checked=False),
172
+ ],
173
+ ).unsafe_ask()
174
+ return hook_types
175
+
176
+ def _ask_hook_installer(self) -> str:
177
+ """Choose ``pre-commit`` or ``prek`` when installing Git hooks.
178
+
179
+ Detection already accepts either tool, but install used to
180
+ hard-code ``pre-commit``. Use the only available installer, or
181
+ ask when both are on PATH.
182
+ """
183
+ installers = project_info.available_hook_installers()
184
+ if not installers:
185
+ raise InitFailedError(
186
+ "Failed to install pre-commit hook.\n"
187
+ "Neither pre-commit nor prek is installed in the current environment."
188
+ )
189
+ if len(installers) == 1:
190
+ return installers[0]
191
+
192
+ installer: str = questionary.select(
193
+ "Which hook installer do you want to use?",
194
+ choices=installers,
195
+ style=self.cz.style,
196
+ ).unsafe_ask()
197
+ return installer
198
+
167
199
  def _ask_config_path(self) -> Path:
168
200
  filename: str = questionary.select(
169
201
  "Please choose a supported config file: ",
@@ -4,14 +4,20 @@ from typing import TypedDict
4
4
 
5
5
  from packaging.version import InvalidVersion
6
6
 
7
- from commitizen import out
7
+ from commitizen import bump, factory, git, out
8
8
  from commitizen.__version__ import __version__
9
9
  from commitizen.config import BaseConfig
10
- from commitizen.exceptions import NoVersionSpecifiedError, VersionSchemeUnknown
10
+ from commitizen.exceptions import (
11
+ NoCommitsFoundError,
12
+ NoPatternMapError,
13
+ NotAGitProjectError,
14
+ NoVersionSpecifiedError,
15
+ VersionSchemeUnknown,
16
+ )
11
17
  from commitizen.providers import get_provider
12
18
  from commitizen.tags import TagRules
13
19
  from commitizen.version_increment import VersionIncrement
14
- from commitizen.version_schemes import Increment, get_version_scheme
20
+ from commitizen.version_schemes import Increment, VersionProtocol, get_version_scheme
15
21
 
16
22
 
17
23
  class VersionArgs(TypedDict, total=False):
@@ -63,6 +69,9 @@ class Version:
63
69
  or self.arguments.get("next")
64
70
  or self.arguments.get("manual_version")
65
71
  ):
72
+ # TODO: once `cz --version` is implemented, move `self.cz` back to __init__
73
+ self.cz = factory.committer_factory(self.config)
74
+
66
75
  version_str = self.arguments.get("manual_version")
67
76
  if version_str is None:
68
77
  try:
@@ -84,11 +93,15 @@ class Version:
84
93
 
85
94
  if next_increment_str := self.arguments.get("next"):
86
95
  if next_increment_str == "USE_GIT_COMMITS":
96
+ # Only check under `git` to allow the user to do stuff like
97
+ # `cz version 1.2.3 --major`
98
+ if not git.is_git_project():
99
+ raise NotAGitProjectError()
100
+
87
101
  # TODO: implement USE_GIT_COMMITS by deriving the increment from
88
102
  # git history. This requires refactoring the bump logic out of
89
103
  # `commitizen/commands/bump.py` so it can be reused here. See #1678.
90
- out.error("--next USE_GIT_COMMITS is not implemented yet.")
91
- return
104
+ version = self._get_next_git_version(version)
92
105
 
93
106
  next_increment = VersionIncrement.from_value(next_increment_str)
94
107
  increment: Increment | None
@@ -100,6 +113,9 @@ class Version:
100
113
  increment = "MINOR"
101
114
  else:
102
115
  increment = "MAJOR"
116
+
117
+ # TODO: Consider adding all the parameters `.bump` supports:
118
+ # prerelease, prerelease_offset,exact_increment, etc...
103
119
  version = version.bump(increment=increment)
104
120
 
105
121
  if self.arguments.get("major"):
@@ -139,3 +155,39 @@ class Version:
139
155
 
140
156
  # If no arguments are provided, just show the installed commitizen version
141
157
  out.write(__version__)
158
+
159
+ def _get_next_git_version(
160
+ self, current_version: VersionProtocol
161
+ ) -> VersionProtocol:
162
+ """Calculate the next version based on commits."""
163
+ rules = TagRules.from_settings(self.config.settings)
164
+ current_tag = rules.find_tag_for(git.get_tags(), current_version)
165
+ commits = git.get_commits(current_tag.name if current_tag else None)
166
+
167
+ # No commits, there is no need to create an empty tag.
168
+ # Unless we previously had a prerelease.
169
+ if not commits and not current_version.is_prerelease:
170
+ raise NoCommitsFoundError("[NO_COMMITS_FOUND]\nNo new commits found.")
171
+
172
+ bump_map = (
173
+ self.cz.bump_map_major_version_zero
174
+ if self.config.settings["major_version_zero"]
175
+ else self.cz.bump_map
176
+ )
177
+ bump_pattern = self.cz.bump_pattern
178
+
179
+ if not bump_map or not bump_pattern:
180
+ raise NoPatternMapError(
181
+ f"'{self.config.settings['name']}' rule does not support bump"
182
+ )
183
+ increment = bump.find_increment(
184
+ commits, regex=bump_pattern, increments_map=bump_map
185
+ )
186
+
187
+ # TODO: Consider adding all the parameters `.bump` supports:
188
+ # prerelease, prerelease_offset,exact_increment, etc..
189
+ new_version = current_version.bump(
190
+ increment,
191
+ )
192
+
193
+ return new_version
@@ -4,9 +4,22 @@ import shutil
4
4
  from pathlib import Path
5
5
  from typing import Literal
6
6
 
7
+ _HOOK_INSTALLERS = ("pre-commit", "prek")
8
+
9
+
10
+ def available_hook_installers() -> list[str]:
11
+ """Return hook installer CLIs found on PATH.
12
+
13
+ ``pre-commit`` and ``prek`` are interchangeable. ``pre-commit`` is
14
+ listed first when both are present so existing setups keep a stable
15
+ default unless the user is asked to choose.
16
+ """
17
+ return [tool for tool in _HOOK_INSTALLERS if shutil.which(tool)]
18
+
7
19
 
8
20
  def is_pre_commit_installed() -> bool:
9
- return any(shutil.which(tool) for tool in ("pre-commit", "prek"))
21
+ """Return whether any supported hook installer is on PATH."""
22
+ return bool(available_hook_installers())
10
23
 
11
24
 
12
25
  def get_default_version_provider() -> Literal[
@@ -303,11 +303,6 @@ After installation, you can verify the completion is working by:
303
303
 
304
304
  For more detailed information about argcomplete configuration and troubleshooting, visit the [argcomplete documentation](https://kislyuk.github.io/argcomplete/).
305
305
 
306
- ## Star History
307
-
308
- [![Star History Chart](https://api.star-history.com/svg?repos=commitizen-tools/commitizen)](https://star-history.com/#commitizen-tools/commitizen)
309
-
310
-
311
306
  ## Sponsors
312
307
 
313
308
  These are our cool sponsors!
@@ -0,0 +1,363 @@
1
+ [project]
2
+ name = "commitizen"
3
+ version = "4.17.1"
4
+ description = "Python commitizen client tool"
5
+ license = "MIT"
6
+ license-files = ["LICENSE"]
7
+ readme = "docs/README.md"
8
+ requires-python = ">=3.10,<4.0"
9
+ dependencies = [
10
+ "questionary (>=2.0,<3.0)",
11
+ "prompt_toolkit!=3.0.52",
12
+ "decli (>=0.6.0,<1.0)",
13
+ "colorama (>=0.4.1,<1.0)",
14
+ "termcolor (>=1.1.0,<4.0.0)",
15
+ "packaging>=26",
16
+ "tomlkit (>=0.8.0,<1.0.0)",
17
+ "jinja2>=2.10.3",
18
+ "pyyaml>=3.08",
19
+ "argcomplete >=1.12.1,<3.8",
20
+ "typing-extensions (>=4.0.1,<5.0.0) ; python_version < '3.11'",
21
+ "charset-normalizer (>=2.1.0,<4)",
22
+ "deprecated (>=1.2.13, <2)",
23
+ "importlib-metadata >=8.0.0,<8.7.0 ; python_version < '3.10'",
24
+ ]
25
+ keywords = [
26
+ "commitizen",
27
+ "conventional",
28
+ "commits",
29
+ "git",
30
+ ]
31
+ classifiers = [
32
+ "Development Status :: 5 - Production/Stable",
33
+ "Environment :: Console",
34
+ "Intended Audience :: Developers",
35
+ "Natural Language :: English",
36
+ "Operating System :: OS Independent",
37
+ "Programming Language :: Python",
38
+ "Programming Language :: Python :: 3",
39
+ "Programming Language :: Python :: 3.10",
40
+ "Programming Language :: Python :: 3.11",
41
+ "Programming Language :: Python :: 3.12",
42
+ "Programming Language :: Python :: 3.13",
43
+ "Programming Language :: Python :: 3.14",
44
+ "Programming Language :: Python :: Implementation :: CPython",
45
+ ]
46
+
47
+ [[project.authors]]
48
+ name = "Santiago Fraire"
49
+ email = "santiwilly@gmail.com"
50
+
51
+ [[project.maintainers]]
52
+ name = "Wei Lee"
53
+ email = "weilee.rx@gmail.com"
54
+
55
+ [[project.maintainers]]
56
+ name = "Axel H."
57
+ email = "noirbizarre@gmail.com"
58
+
59
+ [[project.maintainers]]
60
+ name = "Tim Hsiung"
61
+ email = "bear890707@gmail.com"
62
+
63
+ [project.urls]
64
+ Homepage = "https://github.com/commitizen-tools/commitizen"
65
+ Documentation = "https://commitizen-tools.github.io/commitizen/"
66
+ Repository = "https://github.com/commitizen-tools/commitizen"
67
+ Issues = "https://github.com/commitizen-tools/commitizen/issues"
68
+ Changelog = "https://github.com/commitizen-tools/commitizen/blob/master/CHANGELOG.md"
69
+
70
+ [project.scripts]
71
+ cz = "commitizen.cli:main"
72
+ git-cz = "commitizen.cli:main"
73
+
74
+ [project.entry-points."commitizen.plugin"]
75
+ cz_conventional_commits = "commitizen.cz.conventional_commits:ConventionalCommitsCz"
76
+ cz_jira = "commitizen.cz.jira:JiraSmartCz"
77
+ cz_customize = "commitizen.cz.customize:CustomizeCommitsCz"
78
+
79
+ [project.entry-points."commitizen.changelog_format"]
80
+ markdown = "commitizen.changelog_formats.markdown:Markdown"
81
+ asciidoc = "commitizen.changelog_formats.asciidoc:AsciiDoc"
82
+ textile = "commitizen.changelog_formats.textile:Textile"
83
+ restructuredtext = "commitizen.changelog_formats.restructuredtext:RestructuredText"
84
+
85
+ [project.entry-points."commitizen.provider"]
86
+ cargo = "commitizen.providers:CargoProvider"
87
+ commitizen = "commitizen.providers:CommitizenProvider"
88
+ composer = "commitizen.providers:ComposerProvider"
89
+ npm = "commitizen.providers:NpmProvider"
90
+ pep621 = "commitizen.providers:Pep621Provider"
91
+ poetry = "commitizen.providers:PoetryProvider"
92
+ scm = "commitizen.providers:ScmProvider"
93
+ uv = "commitizen.providers:UvProvider"
94
+
95
+ [project.entry-points."commitizen.scheme"]
96
+ pep440 = "commitizen.version_schemes:Pep440"
97
+ semver = "commitizen.version_schemes:SemVer"
98
+ semver2 = "commitizen.version_schemes:SemVer2"
99
+
100
+ [dependency-groups]
101
+ dev = [
102
+ { include-group = "base" },
103
+ { include-group = "test" },
104
+ { include-group = "linters" },
105
+ { include-group = "documentation" },
106
+ { include-group = "script" },
107
+ "ipython>=8.0",
108
+ "tox>4",
109
+ "tox-uv",
110
+ ]
111
+ base = [
112
+ "mkdocs-llmstxt>=0.5.0",
113
+ "poethepoet>=0.34.0",
114
+ ]
115
+ test = [
116
+ "pytest>=9",
117
+ "pytest-cov>=4",
118
+ "pytest-mock>=3.10",
119
+ "pytest-regressions>=2.4.0",
120
+ "pytest-freezer>=0.4.6",
121
+ "pytest-xdist>=3.1.0",
122
+ "pytest-gitconfig>=0.9.0",
123
+ "pre-commit>=4.5.1",
124
+ ]
125
+ linters = [
126
+ "ruff>=0.11.5",
127
+ "mypy>=1.16.0",
128
+ "types-deprecated>=1.2.9.2",
129
+ "types-python-dateutil>=2.8.19.13",
130
+ "types-PyYAML>=5.4.3",
131
+ "types-termcolor>=0.1.1",
132
+ "types-colorama>=0.4.15.20240311",
133
+ "prek>=0.2.28",
134
+ ]
135
+ documentation = [
136
+ "mkdocs>=1.4.2,<2",
137
+ "mkdocs-git-revision-date-localized-plugin>=1.5.0",
138
+ "mkdocs-material>=9.1.6",
139
+ ]
140
+ script = ["rich>=13.7.1"]
141
+
142
+ [build-system]
143
+ requires = ["uv_build >= 0.9.17, < 0.13"]
144
+ build-backend = "uv_build"
145
+
146
+ [tool.commitizen]
147
+ tag_format = "v$version"
148
+ version_files = [
149
+ "commitizen/__version__.py",
150
+ ".pre-commit-config.yaml:rev:.+Commitizen",
151
+ ]
152
+ version_provider = "uv"
153
+ version_scheme = "pep440"
154
+ annotated_tag = true
155
+
156
+ [tool.uv.build-backend]
157
+ module-name = "commitizen"
158
+ module-root = ""
159
+ include = ["commitizen/py.typed"]
160
+
161
+ [tool.coverage.report]
162
+ show_missing = true
163
+ exclude_lines = [
164
+ "pragma: no cover",
165
+ "def __repr__",
166
+ 'if self\.debug',
167
+ "raise AssertionError",
168
+ "raise NotImplementedError",
169
+ "if 0:",
170
+ "if __name__ == .__main__.:",
171
+ "if TYPE_CHECKING:",
172
+ ]
173
+ omit = [
174
+ "env/*",
175
+ "venv/*",
176
+ ".venv/*",
177
+ "*/virtualenv/*",
178
+ "*/virtualenvs/*",
179
+ "*/tests/*",
180
+ ]
181
+
182
+ [tool.pytest]
183
+ addopts = ["--strict-markers"]
184
+ testpaths = ["tests/"]
185
+ filterwarnings = ['ignore:Call to deprecated function \(or staticmethod\) get_smart_tag_range:DeprecationWarning']
186
+
187
+ [tool.tox]
188
+ requires = ["tox>=4.22"]
189
+ env_list = [
190
+ "3.10",
191
+ "3.11",
192
+ "3.12",
193
+ "3.13",
194
+ "3.14",
195
+ ]
196
+
197
+ [tool.tox.env_run_base]
198
+ description = "Run tests suite against Python {base_python}"
199
+ dependency_groups = ["test"]
200
+ commands = [[
201
+ "pytest",
202
+ { replace = "posargs", extend = true },
203
+ ]]
204
+
205
+ [tool.ruff]
206
+ required-version = ">=0.11.5"
207
+ line-length = 88
208
+
209
+ [tool.ruff.lint]
210
+ select = [
211
+ "ANN001",
212
+ "ANN2",
213
+ "E",
214
+ "F",
215
+ "UP",
216
+ "I",
217
+ "PGH003",
218
+ "PGH004",
219
+ "RUF022",
220
+ "RUF100",
221
+ "PT",
222
+ "S101",
223
+ "TC001",
224
+ "TC002",
225
+ "TC003",
226
+ "TC004",
227
+ "TC005",
228
+ "TC006",
229
+ ]
230
+ ignore = [
231
+ "E501",
232
+ "D1",
233
+ "D415",
234
+ ]
235
+ extend-safe-fixes = [
236
+ "TC",
237
+ "UP",
238
+ "PT006",
239
+ ]
240
+
241
+ [tool.ruff.lint.per-file-ignores]
242
+ "tests/*" = [
243
+ "ANN",
244
+ "S101",
245
+ ]
246
+
247
+ [tool.ruff.lint.isort]
248
+ known-first-party = [
249
+ "commitizen",
250
+ "tests",
251
+ ]
252
+
253
+ [tool.ruff.lint.pydocstyle]
254
+ convention = "google"
255
+
256
+ [tool.mypy]
257
+ files = [
258
+ "commitizen",
259
+ "tests",
260
+ "scripts",
261
+ ]
262
+ disallow_untyped_decorators = true
263
+ disallow_subclassing_any = true
264
+ warn_return_any = true
265
+ warn_redundant_casts = true
266
+ warn_unused_ignores = true
267
+ warn_unused_configs = true
268
+
269
+ [[tool.mypy.overrides]]
270
+ module = "py.*"
271
+ ignore_missing_imports = true
272
+
273
+ [tool.codespell]
274
+ skip = ".git*,*.svg,*.lock"
275
+ check-hidden = true
276
+ ignore-words-list = "asend"
277
+
278
+ [tool.poe.executor]
279
+ type = "uv"
280
+
281
+ [tool.poe.tasks.format]
282
+ help = "Format the code"
283
+
284
+ [[tool.poe.tasks.format.sequence]]
285
+ cmd = "ruff check --fix"
286
+
287
+ [[tool.poe.tasks.format.sequence]]
288
+ cmd = "ruff format"
289
+
290
+ [tool.poe.tasks.lint]
291
+ help = "Lint the code"
292
+
293
+ [[tool.poe.tasks.lint.sequence]]
294
+ cmd = "ruff check"
295
+
296
+ [[tool.poe.tasks.lint.sequence]]
297
+ cmd = "mypy"
298
+
299
+ [tool.poe.tasks.check-commit]
300
+ help = "Check the commit messages"
301
+ cmd = "cz --no-raise 3 check --rev-range origin/master.."
302
+
303
+ [tool.poe.tasks.test]
304
+ help = "Run the test suite"
305
+ cmd = "pytest -n auto --dist=loadfile"
306
+
307
+ [tool.poe.tasks."test:all"]
308
+ help = "Run the test suite on all supported Python versions"
309
+ cmd = "tox --parallel"
310
+
311
+ [tool.poe.tasks."test:regen"]
312
+ help = "Regenerate the test fixtures"
313
+
314
+ [[tool.poe.tasks."test:regen".parallel]]
315
+ ref = "test -k 'not py_' --regen-all"
316
+
317
+ [[tool.poe.tasks."test:regen".parallel]]
318
+ ref = "test:all -- -k py_ --regen-all"
319
+
320
+ [tool.poe.tasks.cover]
321
+ help = "Run the test suite with coverage"
322
+ ref = "test --cov-report term-missing --cov-report=xml:coverage.xml --cov=commitizen --junitxml=junit.xml -o junit_family=legacy"
323
+
324
+ [tool.poe.tasks.all]
325
+ help = "Run all tasks"
326
+ sequence = [
327
+ "format",
328
+ "lint",
329
+ "check-commit",
330
+ "cover",
331
+ ]
332
+
333
+ [tool.poe.tasks."doc:screenshots"]
334
+ help = "Render documentation screenshots"
335
+
336
+ [[tool.poe.tasks."doc:screenshots".parallel]]
337
+ script = "scripts.gen_cli_help_screenshots:gen_cli_help_screenshots"
338
+
339
+ [[tool.poe.tasks."doc:screenshots".parallel]]
340
+ script = "scripts.gen_cli_interactive_gifs:gen_cli_interactive_gifs"
341
+
342
+ [tool.poe.tasks."doc:build"]
343
+ help = "Build the documentation"
344
+ cmd = "mkdocs build"
345
+
346
+ [tool.poe.tasks.doc]
347
+ help = "Live documentation server"
348
+ cmd = "mkdocs serve --livereload"
349
+
350
+ [tool.poe.tasks.ci]
351
+ help = "Run all tasks in CI"
352
+ sequence = [
353
+ "check-commit",
354
+ { cmd = "prek run --all-files" },
355
+ "cover",
356
+ ]
357
+
358
+ [tool.poe.tasks.ci.env]
359
+ SKIP = "no-commit-to-branch"
360
+
361
+ [tool.poe.tasks.setup-pre-commit]
362
+ help = "Install pre-commit hooks"
363
+ cmd = "prek install"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "commitizen"
3
- version = "4.16.5"
3
+ version = "4.17.1"
4
4
  description = "Python commitizen client tool"
5
5
  authors = [{ name = "Santiago Fraire", email = "santiwilly@gmail.com" }]
6
6
  maintainers = [
@@ -133,7 +133,7 @@ script = [
133
133
  ]
134
134
 
135
135
  [build-system]
136
- requires = ["uv_build >= 0.9.17, <0.12"]
136
+ requires = ["uv_build >= 0.9.17, < 0.13"]
137
137
  build-backend = "uv_build"
138
138
 
139
139
 
@@ -1 +0,0 @@
1
- __version__ = "4.16.5"
File without changes