Skip to content

Commit e58a234

Browse files
Merge pull request #156 from getsentry/multiple-add-pkg
add_pkg: support multiple packages and skipping resolution
2 parents 9b96e23 + 489a065 commit e58a234

File tree

2 files changed

+64
-17
lines changed

2 files changed

+64
-17
lines changed

add_pkg.py

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,28 +13,41 @@
1313

1414
def main(argv: Sequence[str] | None = None) -> int:
1515
parser = argparse.ArgumentParser()
16-
parser.add_argument("dep")
16+
parser.add_argument("deps", nargs="+")
1717
parser.add_argument("--packages-ini", default="packages.ini")
18+
parser.add_argument(
19+
"--skip-resolve",
20+
action="store_true",
21+
help="skip resolving dependencies, all deps must be specified as k==v",
22+
)
1823
args = parser.parse_args(argv)
1924

20-
print(f"resolving {args.dep}...")
21-
with tempfile.TemporaryDirectory() as tmpdir:
22-
subprocess.check_call(
23-
(
24-
sys.executable,
25-
"-mpip",
26-
"wheel",
27-
"--quiet",
28-
"--no-cache-dir",
29-
f"--wheel-dir={tmpdir}",
30-
args.dep,
25+
if args.skip_resolve:
26+
deps = []
27+
for dep in args.deps:
28+
name, _, version = dep.partition("==")
29+
if not version:
30+
raise SystemExit(f"dep must be name==version: {dep!r}")
31+
deps.append((name, version))
32+
else:
33+
print(f"resolving {' '.join(args.deps)}...")
34+
with tempfile.TemporaryDirectory() as tmpdir:
35+
subprocess.check_call(
36+
(
37+
sys.executable,
38+
"-mpip",
39+
"wheel",
40+
"--quiet",
41+
"--no-cache-dir",
42+
f"--wheel-dir={tmpdir}",
43+
*args.deps,
44+
)
3145
)
32-
)
3346

34-
deps = []
35-
for filename in sorted(os.listdir(tmpdir)):
36-
name, version, _, _ = parse_wheel_filename(filename)
37-
deps.append((name, str(version)))
47+
deps = []
48+
for filename in sorted(os.listdir(tmpdir)):
49+
name, version, _, _ = parse_wheel_filename(filename)
50+
deps.append((name, str(version)))
3851

3952
cfg = configparser.ConfigParser()
4053
assert cfg.read(args.packages_ini)

tests/add_pkg_test.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,21 @@ def test_new_pkg(pretend_pip, tmp_path, capsys):
3434
assert out == "resolving a...\na==1: adding...\n"
3535

3636

37+
def test_new_pkg_multiple_packages(pretend_pip, tmp_path, capsys):
38+
pretend_pip.joinpath("a-1-py3-none-any.whl").touch()
39+
pretend_pip.joinpath("c-2-py3-none-any.whl").touch()
40+
41+
packages_ini = tmp_path.joinpath("packages.ini")
42+
packages_ini.write_text("[b==1]\n")
43+
44+
assert add_pkg.main(("a", "c", f"--packages-ini={packages_ini}")) == 0
45+
46+
assert packages_ini.read_text() == "[a==1]\n\n[b==1]\n\n[c==2]\n"
47+
48+
out, _ = capsys.readouterr()
49+
assert out == "resolving a c...\na==1: adding...\nc==2: adding...\n"
50+
51+
3752
def test_pkg_already_present(pretend_pip, tmp_path, capsys):
3853
pretend_pip.joinpath("a-1-py3-none-any.whl").touch()
3954

@@ -65,3 +80,22 @@ def test_pkg_copied_from_previous_version(pretend_pip, tmp_path, capsys):
6580

6681
out, _ = capsys.readouterr()
6782
assert out == "resolving a...\na==2: adding...\n"
83+
84+
85+
def test_skip_resolve(tmp_path, capsys):
86+
packages_ini = tmp_path.joinpath("packages.ini")
87+
packages_ini.write_text("[a==1]\n")
88+
89+
# an attempt to use `pip` should raise!
90+
with mock.patch.object(subprocess, "check_call", side_effect=AssertionError):
91+
ret = add_pkg.main(("a==2", "--skip-resolve", f"--packages-ini={packages_ini}"))
92+
assert ret == 0
93+
94+
assert packages_ini.read_text() == "[a==1]\n[a==2]\n"
95+
96+
97+
def test_error_with_skip_resolve_an_not_pinned(capsys):
98+
with pytest.raises(SystemExit) as excinfo:
99+
add_pkg.main(("wat", "--skip-resolve"))
100+
(msg,) = excinfo.value.args
101+
assert msg == "dep must be name==version: 'wat'"

0 commit comments

Comments
 (0)