Skip to content

Commit 40b2251

Browse files
committed
fix(version): fix the behavior of cz version --major
1 parent f52f532 commit 40b2251

File tree

4 files changed

+80
-46
lines changed

4 files changed

+80
-46
lines changed

commitizen/cli.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -543,13 +543,13 @@ def __call__(
543543
},
544544
{
545545
"name": ["--major"],
546-
"help": "get just the major version",
546+
"help": "get just the major version. Need to be used with --project or --verbose.",
547547
"action": "store_true",
548548
"exclusive_group": "group2",
549549
},
550550
{
551551
"name": ["--minor"],
552-
"help": "get just the minor version",
552+
"help": "get just the minor version. Need to be used with --project or --verbose.",
553553
"action": "store_true",
554554
"exclusive_group": "group2",
555555
},

commitizen/commands/version.py

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212

1313
class VersionArgs(TypedDict, total=False):
14+
commitizen: bool
1415
report: bool
1516
project: bool
1617
verbose: bool
@@ -19,46 +20,58 @@ class VersionArgs(TypedDict, total=False):
1920

2021

2122
class Version:
22-
"""Get the version of the installed commitizen or the current project."""
23+
"""Get the version of the installed commitizen or the current project.
24+
Precedence:
25+
1. report
26+
2. commitizen
27+
3. verbose, project
28+
"""
2329

2430
def __init__(self, config: BaseConfig, arguments: VersionArgs) -> None:
2531
self.config: BaseConfig = config
2632
self.parameter = arguments
27-
self.operating_system = platform.system()
28-
self.python_version = sys.version
2933

3034
def __call__(self) -> None:
3135
if self.parameter.get("report"):
3236
out.write(f"Commitizen Version: {__version__}")
33-
out.write(f"Python Version: {self.python_version}")
34-
out.write(f"Operating System: {self.operating_system}")
37+
out.write(f"Python Version: {sys.version}")
38+
out.write(f"Operating System: {platform.system()}")
3539
return
3640

37-
if (verbose := self.parameter.get("verbose")) or self.parameter.get("project"):
38-
if verbose:
39-
out.write(f"Installed Commitizen Version: {__version__}")
41+
if self.parameter.get("verbose"):
42+
out.write(f"Installed Commitizen Version: {__version__}")
4043

44+
if not self.parameter.get("commitizen") and (
45+
self.parameter.get("project") or self.parameter.get("verbose")
46+
):
4147
try:
4248
version = get_provider(self.config).get_version()
4349
except NoVersionSpecifiedError:
4450
out.error("No project information in this project.")
4551
return
46-
4752
try:
48-
version_scheme = get_version_scheme(self.config.settings)
53+
version_scheme = get_version_scheme(self.config.settings)(version)
4954
except VersionSchemeUnknown:
5055
out.error("Unknown version scheme.")
5156
return
5257

53-
_version = version_scheme(version)
54-
5558
if self.parameter.get("major"):
56-
version = f"{_version.major}"
59+
version = f"{version_scheme.major}"
5760
elif self.parameter.get("minor"):
58-
version = f"{_version.minor}"
61+
version = f"{version_scheme.minor}"
62+
63+
out.write(
64+
f"Project Version: {version}"
65+
if self.parameter.get("verbose")
66+
else version
67+
)
68+
return
5969

60-
out.write(f"Project Version: {version}" if verbose else version)
70+
if self.parameter.get("major") or self.parameter.get("minor"):
71+
out.error(
72+
"Major or minor version can only be used with --project or --verbose."
73+
)
6174
return
6275

63-
# if no argument is given, show installed commitizen version
64-
out.write(f"{__version__}")
76+
# If no arguments are provided, just show the installed commitizen version
77+
out.write(__version__)

tests/commands/test_version_command.py

Lines changed: 44 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,54 +11,51 @@
1111
from tests.utils import skip_below_py_3_10
1212

1313

14-
def test_version_for_showing_project_version(config, capsys):
15-
# No version exist
14+
def test_version_for_showing_project_version_error(config, capsys):
15+
# No version specified in config
1616
commands.Version(
1717
config,
18-
{"report": False, "project": True, "commitizen": False, "verbose": False},
18+
{"project": True},
1919
)()
2020
captured = capsys.readouterr()
2121
assert "No project information in this project." in captured.err
2222

23+
24+
def test_version_for_showing_project_version(config, capsys):
2325
config.settings["version"] = "v0.0.1"
2426
commands.Version(
2527
config,
26-
{"report": False, "project": True, "commitizen": False, "verbose": False},
28+
{"project": True},
2729
)()
2830
captured = capsys.readouterr()
2931
assert "v0.0.1" in captured.out
3032

3133

32-
def test_version_for_showing_commitizen_version(config, capsys):
33-
commands.Version(
34-
config,
35-
{"report": False, "project": False, "commitizen": True, "verbose": False},
36-
)()
37-
captured = capsys.readouterr()
38-
assert f"{__version__}" in captured.out
39-
40-
# default showing commitizen version
34+
@pytest.mark.parametrize("project", (True, False))
35+
def test_version_for_showing_commitizen_version(config, capsys, project: bool):
4136
commands.Version(
4237
config,
43-
{"report": False, "project": False, "commitizen": False, "verbose": False},
38+
{"project": project, "commitizen": True},
4439
)()
4540
captured = capsys.readouterr()
4641
assert f"{__version__}" in captured.out
4742

4843

49-
def test_version_for_showing_both_versions(config, capsys):
44+
def test_version_for_showing_both_versions_no_project(config, capsys):
5045
commands.Version(
5146
config,
52-
{"report": False, "project": False, "commitizen": False, "verbose": True},
47+
{"verbose": True},
5348
)()
5449
captured = capsys.readouterr()
5550
assert f"Installed Commitizen Version: {__version__}" in captured.out
5651
assert "No project information in this project." in captured.err
5752

53+
54+
def test_version_for_showing_both_versions(config, capsys):
5855
config.settings["version"] = "v0.0.1"
5956
commands.Version(
6057
config,
61-
{"report": False, "project": False, "commitizen": False, "verbose": True},
58+
{"verbose": True},
6259
)()
6360
captured = capsys.readouterr()
6461
expected_out = (
@@ -70,7 +67,7 @@ def test_version_for_showing_both_versions(config, capsys):
7067
def test_version_for_showing_commitizen_system_info(config, capsys):
7168
commands.Version(
7269
config,
73-
{"report": True, "project": False, "commitizen": False, "verbose": False},
70+
{"report": True},
7471
)()
7572
captured = capsys.readouterr()
7673
assert f"Commitizen Version: {__version__}" in captured.out
@@ -96,7 +93,6 @@ def test_version_use_version_provider(
9693
commands.Version(
9794
config,
9895
{
99-
"report": False,
10096
"project": project,
10197
"verbose": not project,
10298
},
@@ -135,16 +131,20 @@ def test_version_command_shows_description_when_use_help_option(
135131

136132

137133
@pytest.mark.parametrize(
138-
"version, expected_version", (("1.0.0", "1\n"), ("2.1.3", "2\n"), ("0.0.1", "0\n"))
134+
"version, expected_version",
135+
[
136+
("1.0.0", "1\n"),
137+
("2.1.3", "2\n"),
138+
("0.0.1", "0\n"),
139+
("0.1.0", "0\n"),
140+
],
139141
)
140142
def test_version_just_major(config, capsys, version: str, expected_version: str):
141143
config.settings["version"] = version
142144
commands.Version(
143145
config,
144146
{
145-
"report": False,
146147
"project": True,
147-
"verbose": False,
148148
"major": True,
149149
},
150150
)()
@@ -154,18 +154,37 @@ def test_version_just_major(config, capsys, version: str, expected_version: str)
154154

155155
@pytest.mark.parametrize(
156156
"version, expected_version",
157-
(("1.0.0", "0\n"), ("2.1.3", "1\n"), ("0.0.1", "0\n"), ("0.1.0", "1\n")),
157+
[
158+
("1.0.0", "0\n"),
159+
("2.1.3", "1\n"),
160+
("0.0.1", "0\n"),
161+
("0.1.0", "1\n"),
162+
],
158163
)
159164
def test_version_just_minor(config, capsys, version: str, expected_version: str):
160165
config.settings["version"] = version
161166
commands.Version(
162167
config,
163168
{
164-
"report": False,
165169
"project": True,
166-
"verbose": False,
167170
"minor": True,
168171
},
169172
)()
170173
captured = capsys.readouterr()
171174
assert expected_version == captured.out
175+
176+
177+
@pytest.mark.parametrize("argument", ("major", "minor"))
178+
def test_version_just_major_error_no_project(config, capsys, argument: str):
179+
commands.Version(
180+
config,
181+
{
182+
argument: True, # type: ignore[misc]
183+
},
184+
)()
185+
captured = capsys.readouterr()
186+
assert not captured.out
187+
assert (
188+
"Major or minor version can only be used with --project or --verbose."
189+
in captured.err
190+
)

tests/commands/test_version_command/test_version_command_shows_description_when_use_help_option.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,7 @@ options:
1010
-c, --commitizen get the version of the installed commitizen
1111
-v, --verbose get the version of both the installed commitizen and the
1212
current project
13-
--major get just the major version
14-
--minor get just the minor version
13+
--major get just the major version. Need to be used with --project
14+
or --verbose.
15+
--minor get just the minor version. Need to be used with --project
16+
or --verbose.

0 commit comments

Comments
 (0)