commitizen 4.17.0__tar.gz → 4.18.0__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.
- {commitizen-4.17.0 → commitizen-4.18.0}/PKG-INFO +1 -6
- commitizen-4.18.0/commitizen/__version__.py +1 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/cli.py +5 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/commands/commit.py +26 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/commands/init.py +45 -13
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/defaults.py +2 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/project_info.py +14 -1
- {commitizen-4.17.0 → commitizen-4.18.0}/docs/README.md +0 -5
- {commitizen-4.17.0 → commitizen-4.18.0}/pyproject.toml +1 -1
- {commitizen-4.17.0 → commitizen-4.18.0}/pyproject.toml.orig +1 -1
- commitizen-4.17.0/commitizen/__version__.py +0 -1
- {commitizen-4.17.0 → commitizen-4.18.0}/LICENSE +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/__init__.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/__main__.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/bump.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/changelog.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/changelog_formats/__init__.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/changelog_formats/asciidoc.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/changelog_formats/base.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/changelog_formats/markdown.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/changelog_formats/restructuredtext.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/changelog_formats/textile.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/cmd.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/commands/__init__.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/commands/bump.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/commands/changelog.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/commands/check.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/commands/example.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/commands/info.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/commands/list_cz.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/commands/schema.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/commands/version.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/config/__init__.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/config/base_config.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/config/factory.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/config/json_config.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/config/toml_config.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/config/yaml_config.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/cz/__init__.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/cz/base.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/cz/conventional_commits/__init__.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/cz/conventional_commits/conventional_commits.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/cz/conventional_commits/conventional_commits_info.txt +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/cz/customize/__init__.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/cz/customize/customize.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/cz/customize/customize_info.txt +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/cz/exceptions.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/cz/jira/__init__.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/cz/jira/jira.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/cz/jira/jira_info.txt +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/cz/utils.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/exceptions.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/factory.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/git.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/hooks.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/out.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/providers/__init__.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/providers/base_provider.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/providers/cargo_provider.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/providers/commitizen_provider.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/providers/composer_provider.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/providers/npm_provider.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/providers/pep621_provider.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/providers/poetry_provider.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/providers/scm_provider.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/providers/uv_provider.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/py.typed +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/question.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/tags.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/templates/CHANGELOG.adoc.j2 +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/templates/CHANGELOG.md.j2 +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/templates/CHANGELOG.rst.j2 +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/templates/CHANGELOG.textile.j2 +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/version_increment.py +0 -0
- {commitizen-4.17.0 → commitizen-4.18.0}/commitizen/version_schemes.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: commitizen
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.18.0
|
|
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
|
-
[](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.18.0"
|
|
@@ -165,6 +165,11 @@ data = {
|
|
|
165
165
|
"type": int,
|
|
166
166
|
"help": "Set the length limit of the commit message; 0 for no limit.",
|
|
167
167
|
},
|
|
168
|
+
{
|
|
169
|
+
"name": ["--body-length-limit"],
|
|
170
|
+
"type": int,
|
|
171
|
+
"help": "Set the length limit of the commit body. Commit message in body will be rewrapped to this length; 0 for no limit.",
|
|
172
|
+
},
|
|
168
173
|
{
|
|
169
174
|
"name": ["--"],
|
|
170
175
|
"action": "store_true",
|
|
@@ -5,6 +5,8 @@ import os
|
|
|
5
5
|
import shutil
|
|
6
6
|
import subprocess
|
|
7
7
|
import tempfile
|
|
8
|
+
import textwrap
|
|
9
|
+
from itertools import chain
|
|
8
10
|
from pathlib import Path
|
|
9
11
|
from typing import TYPE_CHECKING, TypedDict
|
|
10
12
|
|
|
@@ -36,6 +38,7 @@ class CommitArgs(TypedDict, total=False):
|
|
|
36
38
|
edit: bool
|
|
37
39
|
extra_cli_args: list[str]
|
|
38
40
|
message_length_limit: int
|
|
41
|
+
body_length_limit: int
|
|
39
42
|
no_retry: bool
|
|
40
43
|
signoff: bool
|
|
41
44
|
write_message_to_file: Path | None
|
|
@@ -82,6 +85,7 @@ class Commit:
|
|
|
82
85
|
|
|
83
86
|
message = self.cz.message(answers)
|
|
84
87
|
self._validate_subject_length(message)
|
|
88
|
+
message = self._wrap_body(message)
|
|
85
89
|
return message
|
|
86
90
|
|
|
87
91
|
def _validate_subject_length(self, message: str) -> None:
|
|
@@ -100,6 +104,28 @@ class Commit:
|
|
|
100
104
|
f"Length of commit message exceeds limit ({len(subject)}/{message_length_limit}), subject: '{subject}'"
|
|
101
105
|
)
|
|
102
106
|
|
|
107
|
+
def _wrap_body(self, message: str) -> str:
|
|
108
|
+
"""
|
|
109
|
+
Wrap the body of the commit message to the --body-length-limit length.
|
|
110
|
+
"""
|
|
111
|
+
|
|
112
|
+
body_length_limit = self.arguments.get(
|
|
113
|
+
"body_length_limit", self.config.settings["body_length_limit"]
|
|
114
|
+
)
|
|
115
|
+
# By the contract, body_length_limit is set to 0 for no limit
|
|
116
|
+
if not body_length_limit or body_length_limit <= 0:
|
|
117
|
+
return message
|
|
118
|
+
|
|
119
|
+
lines = message.split("\n")
|
|
120
|
+
if len(lines) < 3:
|
|
121
|
+
return message
|
|
122
|
+
|
|
123
|
+
# First line is subject, second is blank line, rest are body lines
|
|
124
|
+
wrapped_body_lines = chain.from_iterable(
|
|
125
|
+
textwrap.wrap(line, width=body_length_limit) for line in lines[2:]
|
|
126
|
+
)
|
|
127
|
+
return "\n".join(chain(lines[:2], wrapped_body_lines))
|
|
128
|
+
|
|
103
129
|
def manual_edit(self, message: str) -> str:
|
|
104
130
|
editor = git.get_core_editor()
|
|
105
131
|
if editor is None:
|
|
@@ -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
|
|
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
|
-
|
|
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 = [
|
|
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: ",
|
|
@@ -49,6 +49,7 @@ class Settings(TypedDict, total=False):
|
|
|
49
49
|
legacy_tag_formats: Sequence[str]
|
|
50
50
|
major_version_zero: bool
|
|
51
51
|
message_length_limit: int
|
|
52
|
+
body_length_limit: int
|
|
52
53
|
name: str
|
|
53
54
|
post_bump_hooks: list[str] | None
|
|
54
55
|
pre_bump_hooks: list[str] | None
|
|
@@ -115,6 +116,7 @@ DEFAULT_SETTINGS: Settings = {
|
|
|
115
116
|
"extras": {},
|
|
116
117
|
"breaking_change_exclamation_in_title": False,
|
|
117
118
|
"message_length_limit": 0, # 0 for no limit
|
|
119
|
+
"body_length_limit": 0, # 0 for no limit
|
|
118
120
|
}
|
|
119
121
|
|
|
120
122
|
MAJOR = "MAJOR"
|
|
@@ -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
|
-
|
|
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
|
-
[](https://star-history.com/#commitizen-tools/commitizen)
|
|
309
|
-
|
|
310
|
-
|
|
311
306
|
## Sponsors
|
|
312
307
|
|
|
313
308
|
These are our cool sponsors!
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "4.17.0"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{commitizen-4.17.0 → commitizen-4.18.0}/commitizen/cz/conventional_commits/conventional_commits.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|