Skip to content

Commit 0611a89

Browse files
authored
Fix generated diff when adding hashes to requirements.txt (#403)
1 parent 34012db commit 0611a89

File tree

8 files changed

+92
-49
lines changed

8 files changed

+92
-49
lines changed

integration_tests/test_flask_enable_csrf_protection.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,14 @@ class TestFlaskEnableCSRFProtection(BaseIntegrationTest):
3939
requirements_path = "tests/samples/requirements.txt"
4040
original_requirements = "# file used to test dependency management\nrequests==2.31.0\nblack==23.7.*\nmypy~=1.4\npylint>1\n"
4141
expected_new_reqs = (
42-
"# file used to test dependency management\n"
43-
"requests==2.31.0\n"
44-
"black==23.7.*\n"
45-
"mypy~=1.4\n"
46-
"pylint>1\n"
47-
f"{FlaskWTF.requirement} \\\n"
48-
f"{FlaskWTF.build_hashes()}"
42+
(
43+
"# file used to test dependency management\n"
44+
"requests==2.31.0\n"
45+
"black==23.7.*\n"
46+
"mypy~=1.4\n"
47+
"pylint>1\n"
48+
f"{FlaskWTF.requirement} \\\n"
49+
)
50+
+ "\n".join(FlaskWTF.build_hashes())
51+
+ "\n"
4952
)

integration_tests/test_harden_pickle_load.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,14 @@ class TestHardenPickleLoad(BaseIntegrationTest):
4141
requirements_path = "tests/samples/requirements.txt"
4242
original_requirements = "# file used to test dependency management\nrequests==2.31.0\nblack==23.7.*\nmypy~=1.4\npylint>1\n"
4343
expected_new_reqs = (
44-
"# file used to test dependency management\n"
45-
"requests==2.31.0\n"
46-
"black==23.7.*\n"
47-
"mypy~=1.4\n"
48-
"pylint>1\n"
49-
f"{Fickling.requirement} \\\n"
50-
f"{Fickling.build_hashes()}"
44+
(
45+
"# file used to test dependency management\n"
46+
"requests==2.31.0\n"
47+
"black==23.7.*\n"
48+
"mypy~=1.4\n"
49+
"pylint>1\n"
50+
f"{Fickling.requirement} \\\n"
51+
)
52+
+ "\n".join(Fickling.build_hashes())
53+
+ "\n"
5154
)

integration_tests/test_process_sandbox.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,14 @@ class TestProcessSandbox(BaseIntegrationTest):
2828
requirements_path = "tests/samples/requirements.txt"
2929
original_requirements = "# file used to test dependency management\nrequests==2.31.0\nblack==23.7.*\nmypy~=1.4\npylint>1\n"
3030
expected_new_reqs = (
31-
"# file used to test dependency management\n"
32-
"requests==2.31.0\n"
33-
"black==23.7.*\n"
34-
"mypy~=1.4\n"
35-
"pylint>1\n"
36-
f"{Security.requirement} \\\n"
37-
f"{Security.build_hashes()}"
31+
(
32+
"# file used to test dependency management\n"
33+
"requests==2.31.0\n"
34+
"black==23.7.*\n"
35+
"mypy~=1.4\n"
36+
"pylint>1\n"
37+
f"{Security.requirement} \\\n"
38+
)
39+
+ "\n".join(Security.build_hashes())
40+
+ "\n"
3841
)

integration_tests/test_url_sandbox.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,14 @@ class TestUrlSandbox(BaseIntegrationTest):
3838
requirements_path = "tests/samples/requirements.txt"
3939
original_requirements = "# file used to test dependency management\nrequests==2.31.0\nblack==23.7.*\nmypy~=1.4\npylint>1\n"
4040
expected_new_reqs = (
41-
"# file used to test dependency management\n"
42-
"requests==2.31.0\n"
43-
"black==23.7.*\n"
44-
"mypy~=1.4\n"
45-
"pylint>1\n"
46-
f"{Security.requirement} \\\n"
47-
f"{Security.build_hashes()}"
41+
(
42+
"# file used to test dependency management\n"
43+
"requests==2.31.0\n"
44+
"black==23.7.*\n"
45+
"mypy~=1.4\n"
46+
"pylint>1\n"
47+
f"{Security.requirement} \\\n"
48+
)
49+
+ "\n".join(Security.build_hashes())
50+
+ "\n"
4851
)

integration_tests/test_use_defusedxml.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,14 @@ class TestUseDefusedXml(BaseIntegrationTest):
4141
requirements_path = "tests/samples/requirements.txt"
4242
original_requirements = "# file used to test dependency management\nrequests==2.31.0\nblack==23.7.*\nmypy~=1.4\npylint>1\n"
4343
expected_new_reqs = (
44-
"# file used to test dependency management\n"
45-
"requests==2.31.0\n"
46-
"black==23.7.*\n"
47-
"mypy~=1.4\n"
48-
"pylint>1\n"
49-
f"{DefusedXML.requirement} \\\n"
50-
f"{DefusedXML.build_hashes()}"
44+
(
45+
"# file used to test dependency management\n"
46+
"requests==2.31.0\n"
47+
"black==23.7.*\n"
48+
"mypy~=1.4\n"
49+
"pylint>1\n"
50+
f"{DefusedXML.requirement} \\\n"
51+
)
52+
+ "\n".join(DefusedXML.build_hashes())
53+
+ "\n"
5154
)

src/codemodder/dependency.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ def build_description(self) -> str:
3434
[More facts]({self.package_link})
3535
"""
3636

37-
def build_hashes(self) -> str:
38-
return " \\\n".join(f"{' '*4}--hash=sha256:{sha256}" for sha256 in self.hashes)
37+
def build_hashes(self) -> list[str]:
38+
return [f"{' '*4}--hash=sha256:{sha256}" for sha256 in self.hashes]
3939

4040
def __hash__(self):
4141
return hash(self.requirement)

src/codemodder/dependency_management/requirements_txt_writer.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@ def add_to_file(
2121
if not original_lines[-1].endswith("\n"):
2222
original_lines[-1] += "\n"
2323

24-
requirement_lines = [
25-
f"{dep.requirement} \\\n{dep.build_hashes()}" for dep in dependencies
26-
]
24+
requirement_lines = []
25+
for dep in dependencies:
26+
requirement_lines.append(f"{dep.requirement} \\\n")
27+
for hash_line in dep.build_hashes():
28+
requirement_lines.append(f"{hash_line}\n")
2729

2830
updated_lines = original_lines + requirement_lines
2931

tests/dependency_management/test_requirements_txt_writer.py

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,35 @@ def test_add_dependencies_preserve_comments(self, tmpdir, dry_run):
3232
assert dependency_file.read_text(encoding="utf-8") == (
3333
contents
3434
if dry_run
35-
else f"# comment\n\nrequests\n{DefusedXML.requirement} \\\n{DefusedXML.build_hashes()}{Security.requirement} \\\n{Security.build_hashes()}"
35+
else (
36+
"# comment\n\nrequests\n"
37+
+ f"{DefusedXML.requirement} \\\n"
38+
+ "\n".join(DefusedXML.build_hashes())
39+
+ "\n"
40+
+ f"{Security.requirement} \\\n"
41+
+ "\n".join(Security.build_hashes())
42+
+ "\n"
43+
)
3644
)
3745

3846
assert changeset is not None
3947
assert changeset.path == dependency_file.name
48+
49+
defused_xml_hashes = DefusedXML.build_hashes()
50+
security_hashes = Security.build_hashes()
4051
assert changeset.diff == (
4152
"--- \n"
4253
"+++ \n"
43-
"@@ -1,3 +1,5 @@\n"
54+
"@@ -1,3 +1,9 @@\n"
4455
" # comment\n"
4556
" \n"
4657
" requests\n"
4758
f"+{DefusedXML.requirement} \\\n"
48-
f"{DefusedXML.build_hashes()}\n"
59+
f"+{defused_xml_hashes[0]}\n"
60+
f"+{defused_xml_hashes[1]}\n"
4961
f"+{Security.requirement} \\\n"
50-
f"{Security.build_hashes()}"
62+
f"+{security_hashes[0]}\n"
63+
f"+{security_hashes[1]}\n"
5164
)
5265
assert len(changeset.changes) == 2
5366
change_one = changeset.changes[0]
@@ -83,7 +96,9 @@ def test_add_same_dependency_only_once(self, tmpdir):
8396
assert len(changeset.changes) == 1
8497

8598
assert dependency_file.read_text(encoding="utf-8") == (
86-
f"requests\n{Security.requirement} \\\n{Security.build_hashes()}"
99+
f"requests\n{Security.requirement} \\\n"
100+
+ "\n".join(Security.build_hashes())
101+
+ "\n"
87102
)
88103

89104
def test_dont_add_existing_dependency(self, tmpdir):
@@ -140,20 +155,31 @@ def test_dependency_file_no_terminating_newline(self, tmpdir):
140155

141156
assert (
142157
dependency_file.read_text(encoding="utf-8")
143-
== f"# comment\n\nrequests\n{DefusedXML.requirement} \\\n{DefusedXML.build_hashes()}{Security.requirement} \\\n{Security.build_hashes()}"
158+
== "# comment\n\nrequests\n"
159+
+ f"{DefusedXML.requirement} \\\n"
160+
+ "\n".join(DefusedXML.build_hashes())
161+
+ "\n"
162+
+ f"{Security.requirement} \\\n"
163+
+ "\n".join(Security.build_hashes())
164+
+ "\n"
144165
)
145166

146167
assert changeset is not None
147168
assert changeset.path == dependency_file.name
169+
170+
defused_xml_hashes = DefusedXML.build_hashes()
171+
security_hashes = Security.build_hashes()
148172
assert changeset.diff == (
149173
"--- \n"
150174
"+++ \n"
151-
"@@ -1,3 +1,5 @@\n"
175+
"@@ -1,3 +1,9 @@\n"
152176
" # comment\n"
153177
" \n"
154178
" requests\n"
155179
f"+{DefusedXML.requirement} \\\n"
156-
f"{DefusedXML.build_hashes()}\n"
180+
f"+{defused_xml_hashes[0]}\n"
181+
f"+{defused_xml_hashes[1]}\n"
157182
f"+{Security.requirement} \\\n"
158-
f"{Security.build_hashes()}"
183+
f"+{security_hashes[0]}\n"
184+
f"+{security_hashes[1]}\n"
159185
)

0 commit comments

Comments
 (0)