Skip to content

Commit ab082e1

Browse files
Add --version flag (#7)
* feat: Add --version flag * chore: Remove __init__ module for __version__
1 parent f7511b4 commit ab082e1

File tree

4 files changed

+51
-9
lines changed

4 files changed

+51
-9
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "package-name"
3-
version = "0.1.0"
3+
version = "1.0.0"
44
description = "Package description"
55
license = "MIT"
66
authors = ["Author Name <author.email@example.com>"]

src/package_name/cli.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import argparse
2+
from importlib import metadata
23
import requests
34

45

@@ -11,18 +12,25 @@ def run() -> None:
1112
parser = _get_parser()
1213
args = parser.parse_args()
1314

14-
if args.zen:
15-
_get_zen()
15+
if args.version:
16+
_print_version()
17+
elif args.zen:
18+
_print_zen()
1619
else:
1720
parser.print_help()
1821

1922

20-
def _get_zen() -> str:
23+
def _print_zen() -> str:
2124
print(requests.get(url="https://api.github.com/zen", timeout=30).text)
2225

2326

2427
def _get_parser() -> argparse.ArgumentParser:
2528
parser = argparse.ArgumentParser(prog="package-name", description="Package description")
29+
parser.add_argument("--version", "-v", action="store_true", help="print version")
2630
parser.add_argument("--zen", "-z", action="store_true", help="print a random sentence of Zen")
2731

2832
return parser
33+
34+
35+
def _print_version() -> str:
36+
print(metadata.version("package-name"))

tests/e2e/test_cli.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,26 @@
11
import os
2+
import re
3+
4+
SEMVAR_PATTERN = (
5+
r"^(?P<major>0|[1-9]\d*)\."
6+
r"(?P<minor>0|[1-9]\d*)\."
7+
r"(?P<patch>0|[1-9]\d*)"
8+
r"(?:-(?P<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)"
9+
r"(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?"
10+
r"(?:\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$"
11+
)
212

313

414
def test_cli_default() -> None:
515
output = os.popen("poetry run package-name").read()
616

717
assert output == (
8-
"usage: package-name [-h] [--zen]\n\n"
18+
"usage: package-name [-h] [--version] [--zen]\n\n"
919
"Package description\n\n"
1020
"options:\n"
11-
" -h, --help show this help message and exit\n"
12-
" --zen, -z print a random sentence of Zen\n"
21+
" -h, --help show this help message and exit\n"
22+
" --version, -v print version\n"
23+
" --zen, -z print a random sentence of Zen\n"
1324
), "should display default output"
1425

1526

@@ -18,3 +29,10 @@ def test_cli_zen_flag() -> None:
1829

1930
assert output.endswith(".\n"), "should return zen sentence"
2031
assert "usage" not in output, "should not print usage"
32+
33+
34+
def test_cli_version_flag() -> None:
35+
output = os.popen("poetry run package-name --version").read()
36+
37+
match = re.match(SEMVAR_PATTERN, output.strip())
38+
assert match is not None, "should print a semvar-compliant version"

tests/integration/test_cli.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,35 @@
55

66
@patch("package_name.cli.requests")
77
@patch("package_name.cli.argparse._sys.argv")
8-
def test_cli_default_command(mock_argv, mock_requests) -> None:
8+
def test_cli_default(mock_argv, mock_requests, capsys) -> None:
99
mock_argv.__getitem__.return_value = []
1010

1111
cli.run()
1212

13+
assert capsys.readouterr().out.startswith("usage: package-name"), "should Zen sentence"
1314
mock_requests.get.assert_not_called()
1415

1516

1617
@patch("package_name.cli.requests")
1718
@patch("package_name.cli.argparse._sys.argv")
18-
def test_cli_zen_command(mock_argv, mock_requests) -> None:
19+
def test_cli_zen(mock_argv, mock_requests, capsys) -> None:
20+
mock_requests.get.return_value.text = "Foo."
1921
mock_argv.__getitem__.return_value = ["--zen"]
2022

2123
cli.run()
2224

25+
assert capsys.readouterr().out == "Foo.\n", "should Zen sentence"
2326
mock_requests.get.assert_called_once_with(url="https://api.github.com/zen", timeout=30)
27+
28+
29+
@patch("package_name.cli.metadata")
30+
@patch("package_name.cli.requests")
31+
@patch("package_name.cli.argparse._sys.argv")
32+
def test_cli_version(mock_argv, mock_requests, mock_metadata, capsys) -> None:
33+
mock_argv.__getitem__.return_value = ["--version"]
34+
mock_metadata.version.return_value = "1.1.0a0"
35+
36+
cli.run()
37+
38+
assert capsys.readouterr().out == "1.1.0a0\n", "should print version"
39+
mock_requests.get.assert_not_called()

0 commit comments

Comments
 (0)