Skip to content

Commit de04d0c

Browse files
committed
Add tests
1 parent aa6899e commit de04d0c

9 files changed

Lines changed: 224 additions & 23 deletions

File tree

dep_checker/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
from domdf_python_tools.paths import PathPlus, in_directory
4141
from domdf_python_tools.typing import PathLike
4242
from packaging.requirements import Requirement
43-
from shippinglabel.requirements import read_requirements
4443

4544
# this package
4645
from dep_checker.config import AllowedUnused, ConfigReader, NameMapping, NamespacePackages

dep_checker/__main__.py

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,14 @@
2828

2929
# stdlib
3030
import sys
31-
from typing import List, Optional
31+
from typing import List, Optional, Set
3232

3333
# 3rd party
3434
import click
3535
import dom_toml
3636
from consolekit import click_command
37-
from consolekit.options import auto_default_option, colour_option, flag_option
37+
from consolekit.options import colour_option, flag_option
3838
from consolekit.utils import abort
39-
from domdf_python_tools.paths import PathPlus
40-
from shippinglabel.requirements import parse_pyproject_dependencies, read_requirements
4139

4240
# this package
4341
from dep_checker import check_imports
@@ -60,13 +58,18 @@
6058
multiple=True,
6159
help="Requirements which are allowed to be unused in the source code.",
6260
)
63-
@auto_default_option(
61+
@click.option(
6462
"--req-file",
6563
type=click.STRING,
6664
metavar="FILENAME",
67-
help="Parse the requirements from the given requirements file.",
65+
help="Parse the requirements from the given requirements file (or pyproject.toml file with --pyproject).",
66+
)
67+
@flag_option(
68+
"-p",
69+
"--pyproject",
70+
help="Parse the requirements from 'pyproject.toml'.",
71+
default=False,
6872
)
69-
@flag_option("-P", "--pyproject", help="Parse the requirements from 'pyproject.toml'.", default=False,)
7073
@click.argument(
7174
"pkg-name",
7275
type=click.STRING,
@@ -76,20 +79,25 @@ def main(
7679
pkg_name: str,
7780
allowed_unused: Optional[List[str]],
7881
colour: Optional[bool] = None,
79-
req_file: str = "requirements.txt",
82+
req_file: Optional[str] = None,
8083
work_dir: str = '.',
8184
pyproject: bool = False
8285
) -> None:
8386
"""
8487
Tool to check all requirements are actually required.
8588
"""
8689

90+
# 3rd party
91+
from domdf_python_tools.paths import PathPlus
92+
from domdf_python_tools.typing import PathLike
93+
from shippinglabel.requirements import ComparableRequirement, parse_pyproject_dependencies, read_requirements
94+
8795
if allowed_unused == ():
8896
allowed_unused = None
8997

9098
work_dir_p = PathPlus(work_dir)
9199

92-
def read_req_file(req_file):
100+
def read_req_file(req_file: PathLike) -> Set[ComparableRequirement]:
93101
req_file = PathPlus(req_file)
94102

95103
if not req_file.is_absolute():
@@ -98,15 +106,19 @@ def read_req_file(req_file):
98106
return read_requirements(req_file)[0]
99107

100108
if pyproject:
101-
pyproject_file = work_dir_p / "pyproject.toml"
102-
dynamic = dom_toml.load(pyproject_file)["project"].get("dynamic", ())
109+
if req_file is None:
110+
req_file = "pyproject.toml"
111+
dynamic = dom_toml.load(req_file)["project"].get("dynamic", ())
103112

104113
if "requirements" in dynamic:
105114
requirements = read_req_file(work_dir_p / "requirements.txt")
106115
else:
107-
requirements = parse_pyproject_dependencies(pyproject_file, flavour="pep621")
116+
requirements = parse_pyproject_dependencies(req_file, flavour="pep621")
108117

109118
else:
119+
if req_file is None:
120+
req_file = "requirements.txt"
121+
110122
requirements = read_req_file(req_file)
111123

112124
try:

tests/test_dep_checker.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
from typing import Any, Dict, List
33

44
# 3rd party
5-
from packaging.requirements import Requirement
65
import pytest
76
from coincidence import AdvancedDataRegressionFixture
7+
from coincidence.regressions import AdvancedFileRegressionFixture
88
from consolekit.testing import CliRunner, Result
99
from domdf_python_tools.paths import PathPlus, in_directory
10-
from pytest_regressions.file_regression import FileRegressionFixture
10+
from packaging.requirements import Requirement
1111

1212
# this package
1313
from dep_checker import (
@@ -26,7 +26,9 @@ def test_check_imports(
2626
requirements: List[str],
2727
advanced_data_regression: AdvancedDataRegressionFixture,
2828
):
29-
assert check_imports("my_project", *map(Requirement, requirements), work_dir=single_file_project, colour=False) == 1
29+
assert check_imports(
30+
"my_project", *map(Requirement, requirements), work_dir=single_file_project, colour=False
31+
) == 1
3032
advanced_data_regression.check(capsys.readouterr())
3133

3234

@@ -37,34 +39,36 @@ def test_check_imports_package(
3739
advanced_data_regression: AdvancedDataRegressionFixture,
3840
):
3941

40-
assert check_imports("my_project", *map(Requirement, requirements), work_dir=package_project, colour=False) == 1
42+
assert check_imports(
43+
"my_project", *map(Requirement, requirements), work_dir=package_project, colour=False
44+
) == 1
4145
advanced_data_regression.check(capsys.readouterr())
4246

4347

4448
def test_cli(
4549
single_file_project: PathPlus,
46-
file_regression: FileRegressionFixture,
50+
advanced_file_regression: AdvancedFileRegressionFixture,
4751
):
4852

4953
with in_directory(single_file_project):
5054
runner = CliRunner()
5155
result: Result = runner.invoke(main, args=["my_project", "--no-colour"])
5256

53-
result.check_stdout(file_regression)
57+
result.check_stdout(advanced_file_regression)
5458
assert result.exit_code == 1
5559

5660

57-
def test_cli_package(package_project: PathPlus, file_regression: FileRegressionFixture):
61+
def test_cli_package(package_project: PathPlus, advanced_file_regression: AdvancedFileRegressionFixture):
5862

5963
with in_directory(package_project):
6064
runner = CliRunner()
6165
result: Result = runner.invoke(main, args=["my_project", "--no-colour"])
6266

63-
result.check_stdout(file_regression)
67+
result.check_stdout(advanced_file_regression)
6468
assert result.exit_code == 1
6569

6670

67-
def test_cli_package_srcdir(package_project: PathPlus, file_regression: FileRegressionFixture):
71+
def test_cli_package_srcdir(package_project: PathPlus, advanced_file_regression: AdvancedFileRegressionFixture):
6872
(package_project / "my_project").move(package_project / "src" / "my_project")
6973

7074
with in_directory(package_project):
@@ -74,7 +78,7 @@ def test_cli_package_srcdir(package_project: PathPlus, file_regression: FileRegr
7478
args=["my_project", "--no-colour", "--work-dir", "src", "--req-file", "../requirements.txt"],
7579
)
7680

77-
result.check_stdout(file_regression)
81+
result.check_stdout(advanced_file_regression)
7882
assert result.exit_code == 1
7983

8084

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
# stdlib
2+
from typing import List
3+
4+
# 3rd party
5+
import dom_toml
6+
from coincidence.regressions import AdvancedFileRegressionFixture
7+
from consolekit.testing import CliRunner, Result
8+
from domdf_python_tools.paths import PathPlus, in_directory
9+
10+
# this package
11+
from dep_checker.__main__ import main
12+
13+
14+
def test_cli(
15+
single_file_project: PathPlus,
16+
requirements: List[str],
17+
advanced_file_regression: AdvancedFileRegressionFixture,
18+
):
19+
20+
with in_directory(single_file_project):
21+
dom_toml.dump(
22+
{"project": {"name": "foo", "requirements": requirements}},
23+
single_file_project / "pyproject.toml",
24+
)
25+
runner = CliRunner()
26+
result: Result = runner.invoke(main, args=["my_project", "--no-colour", "-p"])
27+
28+
result.check_stdout(advanced_file_regression)
29+
assert result.exit_code == 1
30+
31+
32+
def test_cli_package(
33+
package_project: PathPlus,
34+
requirements: List[str],
35+
advanced_file_regression: AdvancedFileRegressionFixture
36+
):
37+
38+
with in_directory(package_project):
39+
dom_toml.dump(
40+
{"project": {"name": "foo", "requirements": requirements}},
41+
package_project / "pyproject.toml",
42+
)
43+
runner = CliRunner()
44+
result: Result = runner.invoke(main, args=["my_project", "--no-colour", "-p"])
45+
46+
result.check_stdout(advanced_file_regression)
47+
assert result.exit_code == 1
48+
49+
50+
def test_cli_package_srcdir(
51+
package_project: PathPlus,
52+
requirements: List[str],
53+
advanced_file_regression: AdvancedFileRegressionFixture
54+
):
55+
(package_project / "my_project").move(package_project / "src" / "my_project")
56+
57+
with in_directory(package_project):
58+
dom_toml.dump(
59+
{"project": {"name": "foo", "requirements": requirements}},
60+
package_project / "pyproject.toml",
61+
)
62+
runner = CliRunner()
63+
result: Result = runner.invoke(
64+
main,
65+
args=["my_project", "--no-colour", "--work-dir", "src", "-p"],
66+
)
67+
68+
result.check_stdout(advanced_file_regression)
69+
assert result.exit_code == 1
70+
71+
72+
def test_cli_dynamic(
73+
single_file_project: PathPlus,
74+
advanced_file_regression: AdvancedFileRegressionFixture,
75+
):
76+
77+
with in_directory(single_file_project):
78+
dom_toml.dump(
79+
{"project": {"name": "foo", "dynamic": ["requirements"]}},
80+
single_file_project / "pyproject.toml",
81+
)
82+
runner = CliRunner()
83+
result: Result = runner.invoke(main, args=["my_project", "--no-colour", "-p"])
84+
85+
result.check_stdout(advanced_file_regression)
86+
assert result.exit_code == 1
87+
88+
89+
def test_cli_package_dynamic(package_project: PathPlus, advanced_file_regression: AdvancedFileRegressionFixture):
90+
91+
with in_directory(package_project):
92+
dom_toml.dump(
93+
{"project": {"name": "foo", "dynamic": ["requirements"]}},
94+
package_project / "pyproject.toml",
95+
)
96+
runner = CliRunner()
97+
result: Result = runner.invoke(main, args=["my_project", "--no-colour", "-p"])
98+
99+
result.check_stdout(advanced_file_regression)
100+
assert result.exit_code == 1
101+
102+
103+
def test_cli_package_srcdir_dynamic(
104+
package_project: PathPlus, advanced_file_regression: AdvancedFileRegressionFixture
105+
):
106+
(package_project / "my_project").move(package_project / "src" / "my_project")
107+
108+
with in_directory(package_project):
109+
dom_toml.dump(
110+
{"project": {"name": "foo", "dynamic": ["requirements"]}},
111+
package_project / "pyproject.toml",
112+
)
113+
runner = CliRunner()
114+
result: Result = runner.invoke(
115+
main,
116+
args=["my_project", "--no-colour", "--work-dir", "src", "-p"],
117+
)
118+
119+
result.check_stdout(advanced_file_regression)
120+
assert result.exit_code == 1
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
✘ pytest imported at my_project.py:5 but not listed as a requirement
2+
✘ chemistry_tools imported at my_project.py:6 but not listed as a requirement
3+
✘ pathlib2 imported at my_project.py:7 but not listed as a requirement
4+
✘ typing_extensions imported at my_project.py:8 but not listed as a requirement
5+
✘ domdf_python_tools imported at my_project.py:9 but not listed as a requirement
6+
✘ consolekit imported at my_project.py:10 but not listed as a requirement
7+
✘ click imported at my_project.py:11 but not listed as a requirement
8+
✘ pandas imported at my_project.py:12 but not listed as a requirement
9+
✘ ruamel imported at my_project.py:13 but not listed as a requirement
10+
✘ Bio imported at my_project.py:15 but not listed as a requirement
11+
✘ configconfig imported at my_project.py:31 but not listed as a requirement
12+
✘ setuptools imported at my_project.py:35 but not listed as a requirement
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
✘ pytest imported at my_project.py:5 but not listed as a requirement
2+
✘ chemistry_tools imported at my_project.py:6 but not listed as a requirement
3+
✘ pathlib2 imported at my_project.py:7 but not listed as a requirement
4+
✘ typing_extensions imported at my_project.py:8 but not listed as a requirement
5+
✘ domdf_python_tools imported at my_project.py:9 but not listed as a requirement
6+
✘ click imported at my_project.py:11 but not listed as a requirement
7+
✘ ruamel imported at my_project.py:13 but not listed as a requirement
8+
✘ Bio imported at my_project.py:15 but not listed as a requirement
9+
✘ configconfig imported at my_project.py:31 but not listed as a requirement
10+
✘ setuptools imported at my_project.py:35 but not listed as a requirement
11+
✘ biopython never imported
12+
✘ coincidence never imported
13+
✔ consolekit imported at my_project.py:10
14+
✘ numpy never imported
15+
✔ pandas imported at my_project.py:12
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
✘ pytest imported at my_project/__init__.py:5 but not listed as a requirement
2+
✘ chemistry_tools imported at my_project/__init__.py:6 but not listed as a requirement
3+
✘ pathlib2 imported at my_project/__init__.py:7 but not listed as a requirement
4+
✘ typing_extensions imported at my_project/__init__.py:8 but not listed as a requirement
5+
✘ domdf_python_tools imported at my_project/__init__.py:9 but not listed as a requirement
6+
✘ consolekit imported at my_project/__init__.py:10 but not listed as a requirement
7+
✘ click imported at my_project/__init__.py:11 but not listed as a requirement
8+
✘ pandas imported at my_project/__init__.py:12 but not listed as a requirement
9+
✘ ruamel imported at my_project/__init__.py:13 but not listed as a requirement
10+
✘ Bio imported at my_project/__init__.py:15 but not listed as a requirement
11+
✘ configconfig imported at my_project/__init__.py:31 but not listed as a requirement
12+
✘ setuptools imported at my_project/__init__.py:35 but not listed as a requirement
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
✘ pytest imported at my_project/__init__.py:5 but not listed as a requirement
2+
✘ chemistry_tools imported at my_project/__init__.py:6 but not listed as a requirement
3+
✘ pathlib2 imported at my_project/__init__.py:7 but not listed as a requirement
4+
✘ typing_extensions imported at my_project/__init__.py:8 but not listed as a requirement
5+
✘ domdf_python_tools imported at my_project/__init__.py:9 but not listed as a requirement
6+
✘ click imported at my_project/__init__.py:11 but not listed as a requirement
7+
✘ ruamel imported at my_project/__init__.py:13 but not listed as a requirement
8+
✘ Bio imported at my_project/__init__.py:15 but not listed as a requirement
9+
✘ configconfig imported at my_project/__init__.py:31 but not listed as a requirement
10+
✘ setuptools imported at my_project/__init__.py:35 but not listed as a requirement
11+
✘ biopython never imported
12+
✘ coincidence never imported
13+
✔ consolekit imported at my_project/__init__.py:10
14+
✘ numpy never imported
15+
✔ pandas imported at my_project/__init__.py:12
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
✘ pytest imported at my_project/__init__.py:5 but not listed as a requirement
2+
✘ chemistry_tools imported at my_project/__init__.py:6 but not listed as a requirement
3+
✘ pathlib2 imported at my_project/__init__.py:7 but not listed as a requirement
4+
✘ typing_extensions imported at my_project/__init__.py:8 but not listed as a requirement
5+
✘ domdf_python_tools imported at my_project/__init__.py:9 but not listed as a requirement
6+
✘ consolekit imported at my_project/__init__.py:10 but not listed as a requirement
7+
✘ click imported at my_project/__init__.py:11 but not listed as a requirement
8+
✘ pandas imported at my_project/__init__.py:12 but not listed as a requirement
9+
✘ ruamel imported at my_project/__init__.py:13 but not listed as a requirement
10+
✘ Bio imported at my_project/__init__.py:15 but not listed as a requirement
11+
✘ configconfig imported at my_project/__init__.py:31 but not listed as a requirement
12+
✘ setuptools imported at my_project/__init__.py:35 but not listed as a requirement

0 commit comments

Comments
 (0)