Skip to content

Commit 4bfff4d

Browse files
committed
refactor(exception): move output message related to exception into exception
1 parent ffb6dde commit 4bfff4d

18 files changed

+89
-94
lines changed

commitizen/bump.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
from packaging.version import Version
88

9-
from commitizen import out
109
from commitizen.defaults import (
1110
MAJOR,
1211
MINOR,
@@ -162,12 +161,11 @@ def update_version_in_files(
162161
file_content.append(line)
163162

164163
if check_consistency and not current_version_found:
165-
out.error(
164+
raise CurrentVersionNotFoundError(
166165
f"Current version {current_version} is not found in {location}.\n"
167166
"The version defined in commitizen configuration and the ones in "
168167
"version_files are possibly inconsistent."
169168
)
170-
raise CurrentVersionNotFoundError()
171169

172170
# Write the file out again
173171
with open(filepath, "w") as file:

commitizen/cli.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from decli import cli
77

8-
from commitizen import commands, config, out
8+
from commitizen import commands, config
99
from commitizen.exceptions import CommitizenException, ExpectedExit, NoCommandFoundError
1010

1111
logger = logging.getLogger(__name__)
@@ -266,7 +266,6 @@ def main():
266266
try:
267267
args = parser.parse_args()
268268
except TypeError:
269-
out.error("Command is required")
270269
raise NoCommandFoundError()
271270

272271
if args.name:
@@ -299,7 +298,6 @@ def main():
299298
try:
300299
args.func(conf, vars(args))()
301300
except AttributeError:
302-
out.error("Command is required")
303301
raise NoCommandFoundError()
304302

305303

commitizen/commands/bump.py

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,9 @@ def find_increment(self, commits: List[git.GitCommit]) -> Optional[str]:
5858
bump_pattern = self.cz.bump_pattern
5959
bump_map = self.cz.bump_map
6060
if not bump_map or not bump_pattern:
61-
out.error(f"'{self.config.settings['name']}' rule does not support bump")
62-
raise NoPatternMapError()
61+
raise NoPatternMapError(
62+
f"'{self.config.settings['name']}' rule does not support bump"
63+
)
6364
increment = bump.find_increment(
6465
commits, regex=bump_pattern, increments_map=bump_map
6566
)
@@ -70,11 +71,6 @@ def __call__(self): # noqa: C901
7071
try:
7172
current_version_instance: Version = Version(self.bump_settings["version"])
7273
except TypeError:
73-
out.error(
74-
"[NO_VERSION_SPECIFIED]\n"
75-
"Check if current version is specified in config file, like:\n"
76-
"version = 0.4.3\n"
77-
)
7874
raise NoVersionSpecifiedError()
7975

8076
# Initialize values from sources (conf)
@@ -103,8 +99,7 @@ def __call__(self): # noqa: C901
10399
# No commits, there is no need to create an empty tag.
104100
# Unless we previously had a prerelease.
105101
if not commits and not current_version_instance.is_prerelease:
106-
out.error("[NO_COMMITS_FOUND]\n" "No new commits found.")
107-
raise NoCommitsFoundError()
102+
raise NoCommitsFoundError("[NO_COMMITS_FOUND]\n" "No new commits found.")
108103

109104
if increment is None:
110105
increment = self.find_increment(commits)
@@ -156,12 +151,10 @@ def __call__(self): # noqa: C901
156151
self.config.set_key("version", new_version.public)
157152
c = git.commit(message, args=self._get_commit_args())
158153
if c.err:
159-
out.error('git.commit error: "{}"'.format(c.err.strip()))
160-
raise CommitFailedError()
154+
raise CommitFailedError(f'git.commit error: "{c.err.strip()}"')
161155
c = git.tag(new_tag_version)
162156
if c.err:
163-
out.error(c.err)
164-
raise TagFailedError()
157+
raise TagFailedError(c.err)
165158
out.success("Done!")
166159

167160
def _get_commit_args(self):

commitizen/commands/changelog.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,10 @@ def __call__(self):
7373
Callable
7474
] = self.cz.changelog_message_builder_hook
7575
changelog_hook: Optional[Callable] = self.cz.changelog_hook
76-
7776
if not changelog_pattern or not commit_parser:
78-
out.error(
77+
raise NoPatternMapError(
7978
f"'{self.config.settings['name']}' rule does not support changelog"
8079
)
81-
raise NoPatternMapError()
8280

8381
tags = git.get_tags()
8482
if not tags:
@@ -92,8 +90,7 @@ def __call__(self):
9290

9391
commits = git.get_commits(start=start_rev, args="--author-date-order")
9492
if not commits:
95-
out.error("No commits found")
96-
raise NoCommitsFoundError()
93+
raise NoCommitsFoundError("No commits found")
9794

9895
tree = changelog.generate_tree_from_commits(
9996
commits,

commitizen/commands/check.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import os
22
import re
3-
import warnings
43
from typing import Dict, Optional
54

65
from commitizen import factory, git, out
@@ -33,13 +32,12 @@ def __init__(self, config: BaseConfig, arguments: Dict[str, str], cwd=os.getcwd(
3332

3433
def _valid_command_argument(self):
3534
if bool(self.commit_msg_file) is bool(self.rev_range):
36-
out.error(
35+
raise InvalidCommandArgumentError(
3736
(
3837
"One and only one argument is required for check command! "
3938
"See 'cz check -h' for more information"
4039
)
4140
)
42-
raise InvalidCommandArgumentError()
4341

4442
def __call__(self):
4543
"""Validate if commit messages follows the conventional pattern.
@@ -49,19 +47,17 @@ def __call__(self):
4947
"""
5048
commit_msgs = self._get_commit_messages()
5149
if not commit_msgs:
52-
warnings.warn(f"No commit found with range: '{self.rev_range}'")
53-
raise NoCommitsFoundError()
50+
raise NoCommitsFoundError(f"No commit found with range: '{self.rev_range}'")
5451

5552
pattern = self.cz.schema_pattern()
5653
for commit_msg in commit_msgs:
5754
if not Check.validate_commit_message(commit_msg, pattern):
58-
out.error(
55+
raise InvalidCommitMessageError(
5956
"commit validation: failed!\n"
6057
"please enter a commit message in the commitizen format.\n"
6158
f"commit: {commit_msg}\n"
6259
f"pattern: {pattern}"
6360
)
64-
raise InvalidCommitMessageError()
6561
out.success("Commit validation: successful!")
6662

6763
def _get_commit_messages(self):

commitizen/commands/commit.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ def __init__(self, config: BaseConfig, arguments: dict):
2929
def read_backup_message(self) -> str:
3030
# Check the commit backup file exists
3131
if not os.path.isfile(self.temp_file):
32-
out.error("No commit backup found")
3332
raise NoCommitBackupError()
3433

3534
# Read commit message from backup
@@ -45,8 +44,7 @@ def prompt_commit_questions(self) -> str:
4544
except ValueError as err:
4645
root_err = err.__context__
4746
if isinstance(root_err, CzException):
48-
out.error(root_err.__str__())
49-
raise CustomError()
47+
raise CustomError(root_err.__str__())
5048
raise err
5149

5250
if not answers:
@@ -57,8 +55,7 @@ def __call__(self):
5755
dry_run: bool = self.arguments.get("dry_run")
5856

5957
if git.is_staging_clean() and not dry_run:
60-
out.write("No files added to staging!")
61-
raise NothingToCommitError()
58+
raise NothingToCommitError("No files added to staging!")
6259

6360
retry: bool = self.arguments.get("retry")
6461

commitizen/commands/init.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from packaging.version import Version
33

44
from commitizen import factory, out
5+
from commitizen.exceptions import ExpectedExit, NoAnswersError
56
from commitizen.config import BaseConfig, IniConfig, TomlConfig
67
from commitizen.cz import registry
78
from commitizen.defaults import long_term_support_config_files
@@ -79,8 +80,7 @@ def _ask_tag(self) -> str:
7980
).ask()
8081

8182
if not latest_tag:
82-
out.error("Tag is required!")
83-
raise SystemExit()
83+
raise NoAnswersError("Tag is required!")
8484
return latest_tag
8585

8686
def _ask_tag_format(self, latest_tag) -> str:
@@ -103,8 +103,7 @@ def _ask_tag_format(self, latest_tag) -> str:
103103

104104
def _update_config_file(self, values):
105105
if not values:
106-
out.write("The configuration were all set. Nothing to add.")
107-
raise SystemExit()
106+
raise ExpectedExit("The configuration were all set. Nothing to add.")
108107

109108
for key, value in values.items():
110109
self.config.set_key(key, value)

commitizen/exceptions.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ def __str__(self):
4343
class ExpectedExit(CommitizenException):
4444
exit_code = ExitCode.EXPECTED_EXIT
4545

46+
def __init__(self, *args, **kwargs):
47+
output_method = kwargs.get("output_method") or out.write
48+
kwargs["output_method"] = output_method
49+
super().__init__(*args, **kwargs)
50+
4651

4752
class DryRunExit(ExpectedExit):
4853
pass
@@ -68,6 +73,11 @@ class NoCommitsFoundError(CommitizenException):
6873

6974
class NoVersionSpecifiedError(CommitizenException):
7075
exit_code = ExitCode.NO_VERSION_SPECIFIED
76+
message = (
77+
"[NO_VERSION_SPECIFIED]\n"
78+
"Check if current version is specified in config file, like:\n"
79+
"version = 0.4.3\n"
80+
)
7181

7282

7383
class NoPatternMapError(CommitizenException):
@@ -96,6 +106,7 @@ class CommitError(CommitizenException):
96106

97107
class NoCommitBackupError(CommitizenException):
98108
exit_code = ExitCode.NO_COMMIT_BACKUP
109+
message = "No commit backup found"
99110

100111

101112
class NothingToCommitError(CommitizenException):
@@ -116,6 +127,7 @@ class NoRevisionError(CommitizenException):
116127

117128
class NoCommandFoundError(CommitizenException):
118129
exit_code = ExitCode.NO_COMMAND_FOUND
130+
message = "Command is required"
119131

120132

121133
class InvalidCommandArgumentError(CommitizenException):

commitizen/factory.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from commitizen import BaseCommitizen, out
1+
from commitizen import BaseCommitizen
22
from commitizen.config import BaseConfig
33
from commitizen.cz import registry
44
from commitizen.exceptions import NoCommitizenFoundException
@@ -14,7 +14,6 @@ def commiter_factory(config: BaseConfig) -> BaseCommitizen:
1414
"The committer has not been found in the system.\n\n"
1515
f"Try running 'pip install {name}'\n"
1616
)
17-
out.error(msg_error)
18-
raise NoCommitizenFoundException(name)
17+
raise NoCommitizenFoundException(msg_error)
1918
else:
2019
return _cz

tests/commands/test_bump_command.py

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def test_bump_command(mocker):
6969

7070

7171
@pytest.mark.usefixtures("tmp_commitizen_project")
72-
def test_bump_on_git_with_hooks_no_verify_disabled(mocker, capsys):
72+
def test_bump_on_git_with_hooks_no_verify_disabled(mocker):
7373
cmd.run("mkdir .git/hooks")
7474
with open(".git/hooks/pre-commit", "w") as f:
7575
f.write("#!/usr/bin/env bash\n" 'echo "0.1.0"')
@@ -81,11 +81,10 @@ def test_bump_on_git_with_hooks_no_verify_disabled(mocker, capsys):
8181
testargs = ["cz", "bump", "--yes"]
8282
mocker.patch.object(sys, "argv", testargs)
8383

84-
with pytest.raises(CommitFailedError):
84+
with pytest.raises(CommitFailedError) as excinfo:
8585
cli.main()
8686

87-
_, err = capsys.readouterr()
88-
assert 'git.commit error: "0.1.0"' in err
87+
assert 'git.commit error: "0.1.0"' in str(excinfo.value)
8988

9089

9190
@pytest.mark.usefixtures("tmp_commitizen_project")
@@ -106,53 +105,44 @@ def test_bump_on_git_with_hooks_no_verify_enabled(mocker):
106105
assert tag_exists is True
107106

108107

109-
def test_bump_when_bumpping_is_not_support(mocker, capsys, tmp_commitizen_project):
108+
def test_bump_when_bumpping_is_not_support(mocker, tmp_commitizen_project):
110109
create_file_and_commit(
111110
"feat: new user interface\n\nBREAKING CHANGE: age is no longer supported"
112111
)
113112

114113
testargs = ["cz", "-n", "cz_jira", "bump", "--yes"]
115114
mocker.patch.object(sys, "argv", testargs)
116115

117-
with pytest.raises(NoPatternMapError):
116+
with pytest.raises(NoPatternMapError) as excinfo:
118117
cli.main()
119118

120-
_, err = capsys.readouterr()
121-
assert "'cz_jira' rule does not support bump" in err
119+
assert "'cz_jira' rule does not support bump" in str(excinfo.value)
122120

123121

124122
@pytest.mark.usefixtures("tmp_git_project")
125-
def test_bump_is_not_specify(mocker, capsys):
123+
def test_bump_when_version_is_not_specify(mocker):
126124
mocker.patch.object(sys, "argv", ["cz", "bump"])
127125

128-
with pytest.raises(NoVersionSpecifiedError):
126+
with pytest.raises(NoVersionSpecifiedError) as excinfo:
129127
cli.main()
130128

131-
expected_error_message = (
132-
"[NO_VERSION_SPECIFIED]\n"
133-
"Check if current version is specified in config file, like:\n"
134-
"version = 0.4.3\n"
135-
)
136-
137-
_, err = capsys.readouterr()
138-
assert expected_error_message in err
129+
assert NoVersionSpecifiedError.message in str(excinfo.value)
139130

140131

141132
@pytest.mark.usefixtures("tmp_commitizen_project")
142-
def test_bump_when_no_new_commit(mocker, capsys):
133+
def test_bump_when_no_new_commit(mocker):
143134
testargs = ["cz", "bump", "--yes"]
144135
mocker.patch.object(sys, "argv", testargs)
145136

146-
with pytest.raises(NoCommitsFoundError):
137+
with pytest.raises(NoCommitsFoundError) as excinfo:
147138
cli.main()
148139

149140
expected_error_message = "[NO_COMMITS_FOUND]\n" "No new commits found."
150-
_, err = capsys.readouterr()
151-
assert expected_error_message in err
141+
assert expected_error_message in str(excinfo.value)
152142

153143

154144
def test_bump_when_version_inconsistent_in_version_files(
155-
tmp_commitizen_project, mocker, capsys
145+
tmp_commitizen_project, mocker
156146
):
157147
tmp_version_file = tmp_commitizen_project.join("__version__.py")
158148
tmp_version_file.write("100.999.10000")
@@ -167,12 +157,11 @@ def test_bump_when_version_inconsistent_in_version_files(
167157
testargs = ["cz", "bump", "--yes", "--check-consistency"]
168158
mocker.patch.object(sys, "argv", testargs)
169159

170-
with pytest.raises(CurrentVersionNotFoundError):
160+
with pytest.raises(CurrentVersionNotFoundError) as excinfo:
171161
cli.main()
172162

173163
partial_expected_error_message = "Current version 0.1.0 is not found in"
174-
_, err = capsys.readouterr()
175-
assert partial_expected_error_message in err
164+
assert partial_expected_error_message in str(excinfo.value)
176165

177166

178167
def test_bump_files_only(mocker, tmp_commitizen_project):

tests/commands/test_changelog_command.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@ def test_changelog_on_empty_project(mocker):
2020
testargs = ["cz", "changelog", "--dry-run"]
2121
mocker.patch.object(sys, "argv", testargs)
2222

23-
with pytest.raises(NoCommitsFoundError):
23+
with pytest.raises(NoCommitsFoundError) as excinfo:
2424
cli.main()
2525

26+
assert "No commits found" in str(excinfo)
27+
2628

2729
@pytest.mark.usefixtures("tmp_commitizen_project")
2830
def test_changelog_from_version_zero_point_two(mocker, capsys):

0 commit comments

Comments
 (0)