Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 26 additions & 22 deletions commitizen/commands/version.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,11 @@
from commitizen.config import BaseConfig
from commitizen.exceptions import NoVersionSpecifiedError, VersionSchemeUnknown
from commitizen.providers import get_provider
from commitizen.version_schemes import get_version_scheme
from commitizen.version_schemes import DEFAULT_SCHEME, get_version_scheme


class VersionArgs(TypedDict, total=False):
commitizen: bool
report: bool
project: bool
verbose: bool
Expand All @@ -19,46 +20,49 @@ class VersionArgs(TypedDict, total=False):


class Version:
"""Get the version of the installed commitizen or the current project."""
"""Get the version of the installed commitizen or the current project.
Precedence:
1. report
2. commitizen
3. verbose, project
"""

def __init__(self, config: BaseConfig, arguments: VersionArgs) -> None:
self.config: BaseConfig = config
self.parameter = arguments
self.operating_system = platform.system()
self.python_version = sys.version

def __call__(self) -> None:
if self.parameter.get("report"):
out.write(f"Commitizen Version: {__version__}")
out.write(f"Python Version: {self.python_version}")
out.write(f"Operating System: {self.operating_system}")
out.write(f"Python Version: {sys.version}")
out.write(f"Operating System: {platform.system()}")
return

if (verbose := self.parameter.get("verbose")) or self.parameter.get("project"):
if verbose:
out.write(f"Installed Commitizen Version: {__version__}")
if self.parameter.get("verbose"):
out.write(f"Installed Commitizen Version: {__version__}")

if self.parameter.get("commitizen") or not (
self.parameter.get("project") or self.parameter.get("verbose")
):
version = __version__
version_scheme = DEFAULT_SCHEME(__version__)
else:
try:
version = get_provider(self.config).get_version()
except NoVersionSpecifiedError:
out.error("No project information in this project.")
return

try:
version_scheme = get_version_scheme(self.config.settings)
version_scheme = get_version_scheme(self.config.settings)(version)
except VersionSchemeUnknown:
out.error("Unknown version scheme.")
return

_version = version_scheme(version)

if self.parameter.get("major"):
version = f"{_version.major}"
elif self.parameter.get("minor"):
version = f"{_version.minor}"

out.write(f"Project Version: {version}" if verbose else version)
return
if self.parameter.get("major"):
version = f"{version_scheme.major}"
elif self.parameter.get("minor"):
version = f"{version_scheme.minor}"

# if no argument is given, show installed commitizen version
out.write(f"{__version__}")
out.write(
f"Project Version: {version}" if self.parameter.get("verbose") else version
)
63 changes: 44 additions & 19 deletions tests/commands/test_version_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,45 +11,64 @@
from tests.utils import skip_below_py_3_10


def test_version_for_showing_project_version(config, capsys):
# No version exist
def test_version_for_showing_project_version_error(config, capsys):
# No version specified in config
commands.Version(
config,
{"report": False, "project": True, "commitizen": False, "verbose": False},
{"project": True},
)()
captured = capsys.readouterr()
assert "No project information in this project." in captured.err


def test_version_for_showing_project_version(config, capsys):
config.settings["version"] = "v0.0.1"
commands.Version(
config,
{"report": False, "project": True, "commitizen": False, "verbose": False},
{"project": True},
)()
captured = capsys.readouterr()
assert "v0.0.1" in captured.out


def test_version_for_showing_commitizen_version(config, capsys):
@pytest.mark.parametrize("project", (True, False))
def test_version_for_showing_commitizen_version(config, capsys, project: bool):
commands.Version(
config,
{"report": False, "project": False, "commitizen": True, "verbose": False},
{"project": project, "commitizen": True},
)()
captured = capsys.readouterr()
assert f"{__version__}" in captured.out

# default showing commitizen version

@pytest.mark.parametrize("project", (True, False))
def test_version_for_showing_commitizen_version_with_major(
config, capsys, project: bool
):
commands.Version(
config,
{"report": False, "project": False, "commitizen": False, "verbose": False},
{"project": project, "commitizen": True, "major": True},
)()
captured = capsys.readouterr()
assert f"{__version__}" in captured.out
assert f"{__version__.split('.')[0]}" in captured.out


@pytest.mark.parametrize("project", (True, False))
def test_version_for_showing_commitizen_version_with_minor(
config, capsys, project: bool
):
commands.Version(
config,
{"project": project, "commitizen": True, "minor": True},
)()
captured = capsys.readouterr()
assert f"{__version__.split('.')[1]}" in captured.out


def test_version_for_showing_both_versions(config, capsys):
commands.Version(
config,
{"report": False, "project": False, "commitizen": False, "verbose": True},
{"verbose": True},
)()
captured = capsys.readouterr()
assert f"Installed Commitizen Version: {__version__}" in captured.out
Expand All @@ -58,7 +77,7 @@ def test_version_for_showing_both_versions(config, capsys):
config.settings["version"] = "v0.0.1"
commands.Version(
config,
{"report": False, "project": False, "commitizen": False, "verbose": True},
{"verbose": True},
)()
captured = capsys.readouterr()
expected_out = (
Expand All @@ -70,7 +89,7 @@ def test_version_for_showing_both_versions(config, capsys):
def test_version_for_showing_commitizen_system_info(config, capsys):
commands.Version(
config,
{"report": True, "project": False, "commitizen": False, "verbose": False},
{"report": True},
)()
captured = capsys.readouterr()
assert f"Commitizen Version: {__version__}" in captured.out
Expand All @@ -96,7 +115,6 @@ def test_version_use_version_provider(
commands.Version(
config,
{
"report": False,
"project": project,
"verbose": not project,
},
Expand Down Expand Up @@ -135,16 +153,20 @@ def test_version_command_shows_description_when_use_help_option(


@pytest.mark.parametrize(
"version, expected_version", (("1.0.0", "1\n"), ("2.1.3", "2\n"), ("0.0.1", "0\n"))
"version, expected_version",
[
("1.0.0", "1\n"),
("2.1.3", "2\n"),
("0.0.1", "0\n"),
("0.1.0", "0\n"),
],
)
def test_version_just_major(config, capsys, version: str, expected_version: str):
config.settings["version"] = version
commands.Version(
config,
{
"report": False,
"project": True,
"verbose": False,
"major": True,
},
)()
Expand All @@ -154,16 +176,19 @@ def test_version_just_major(config, capsys, version: str, expected_version: str)

@pytest.mark.parametrize(
"version, expected_version",
(("1.0.0", "0\n"), ("2.1.3", "1\n"), ("0.0.1", "0\n"), ("0.1.0", "1\n")),
[
("1.0.0", "0\n"),
("2.1.3", "1\n"),
("0.0.1", "0\n"),
("0.1.0", "1\n"),
],
)
def test_version_just_minor(config, capsys, version: str, expected_version: str):
config.settings["version"] = version
commands.Version(
config,
{
"report": False,
"project": True,
"verbose": False,
"minor": True,
},
)()
Expand Down