Skip to content

Commit c98bc8f

Browse files
groodtalexeagle
andauthored
Validation to ensure requirements_lock is pinned. (#732)
* Light validation to ensure lockfile is pinned. * Clean up * . Co-authored-by: Alex Eagle <[email protected]>
1 parent c49bab3 commit c98bc8f

File tree

7 files changed

+27
-23
lines changed

7 files changed

+27
-23
lines changed
Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
boto3==1.14.51
2-
s3cmd==2.1.0
3-
yamllint==1.26.3
4-
5-
# Last available for Python 3.6.
6-
setuptools==59.6.0
1+
boto3~=1.14.51
2+
s3cmd~=2.1.0
3+
yamllint~=1.26.3

examples/pip_install/requirements.txt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,4 @@ yamllint==1.26.3 \
9898
setuptools==59.6.0 \
9999
--hash=sha256:22c7348c6d2976a52632c67f7ab0cdf40147db7789f9aed18734643fe9cf3373 \
100100
--hash=sha256:4ce92f1e1f8f01233ee9952c04f6b81d1e02939d6e1b488428154974a4d0783e
101-
# via
102-
# -r requirements.in
103-
# yamllint
101+
# via yamllint

examples/pip_parse/BUILD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ alias(
5959
compile_pip_requirements(
6060
name = "requirements",
6161
extra_args = ["--allow-unsafe"],
62-
requirements_in = "requirements.txt",
62+
requirements_in = "requirements.in",
6363
requirements_txt = "requirements_lock.txt",
6464
)
6565

examples/pip_parse/requirements.in

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
requests~=2.25.1
2+
s3cmd~=2.1.0
3+
yamllint~=1.26.3

examples/pip_parse/requirements.txt

Lines changed: 0 additions & 6 deletions
This file was deleted.

examples/pip_parse/requirements_lock.txt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,11 @@ pyyaml==6.0 \
6666
requests==2.25.1 \
6767
--hash=sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804 \
6868
--hash=sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e
69-
# via -r requirements.txt
69+
# via -r requirements.in
7070
s3cmd==2.1.0 \
7171
--hash=sha256:49cd23d516b17974b22b611a95ce4d93fe326feaa07320bd1d234fed68cbccfa \
7272
--hash=sha256:966b0a494a916fc3b4324de38f089c86c70ee90e8e1cae6d59102103a4c0cc03
73-
# via -r requirements.txt
73+
# via -r requirements.in
7474
six==1.16.0 \
7575
--hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \
7676
--hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254
@@ -81,12 +81,10 @@ urllib3==1.26.7 \
8181
# via requests
8282
yamllint==1.26.3 \
8383
--hash=sha256:3934dcde484374596d6b52d8db412929a169f6d9e52e20f9ade5bf3523d9b96e
84-
# via -r requirements.txt
84+
# via -r requirements.in
8585

8686
# The following packages are considered to be unsafe in a requirements file:
8787
setuptools==59.6.0 \
8888
--hash=sha256:22c7348c6d2976a52632c67f7ab0cdf40147db7789f9aed18734643fe9cf3373 \
8989
--hash=sha256:4ce92f1e1f8f01233ee9952c04f6b81d1e02939d6e1b488428154974a4d0783e
90-
# via
91-
# -r requirements.txt
92-
# yamllint
90+
# via yamllint

python/pip_install/parse_requirements_to_bzl/__init__.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,30 @@ def parse_install_requirements(
3131
parser = RequirementsFileParser(ps, line_parser)
3232
install_req_and_lines: List[Tuple[InstallRequirement, str]] = []
3333
_, content = get_file_content(requirements_lock, ps)
34+
unpinned_reqs = []
3435
for parsed_line, (_, line) in zip(
3536
parser.parse(requirements_lock, constraint=False), preprocess(content)
3637
):
3738
if parsed_line.is_requirement:
39+
install_req = constructors.install_req_from_line(parsed_line.requirement)
40+
if not install_req.is_pinned:
41+
unpinned_reqs.append(str(install_req))
3842
install_req_and_lines.append(
39-
(constructors.install_req_from_line(parsed_line.requirement), line)
43+
(install_req, line)
4044
)
4145

4246
else:
4347
extra_pip_args.extend(shlex.split(line))
48+
49+
if len(unpinned_reqs) > 0:
50+
unpinned_reqs_str = "\n".join(unpinned_reqs)
51+
raise RuntimeError(f"""\
52+
The `requirements_lock` file must be fully pinned. See `compile_pip_requirements`.
53+
Alternatively, use `pip-tools` or a similar mechanism to produce a pinned lockfile.
54+
55+
The following requirements were not pinned:
56+
{unpinned_reqs_str}""")
57+
4458
return install_req_and_lines
4559

4660

0 commit comments

Comments
 (0)