1
1
import json
2
+ import tarfile
2
3
from pathlib import Path
3
- from typing import Tuple
4
+ from typing import List , Optional , Tuple
4
5
from zipfile import ZipFile
5
6
7
+ from pip ._internal .utils .urls import path_to_url
6
8
from tests .lib import PipTestEnvironment
7
9
8
10
PYPROJECT_TOML = """\
36
38
Author: None
37
39
38
40
License: MIT
41
+ {requires_dist}
39
42
"""
40
43
41
- def make_wheel(z, project, version, files):
44
+ def make_wheel(z, project, version, requires_dist, files):
42
45
record = []
43
46
def add_file(name, data):
44
47
data = data.encode("utf-8")
@@ -48,7 +51,9 @@ def add_file(name, data):
48
51
record.append((name, f"sha256={hash}", len(data)))
49
52
distinfo = f"{project}-{version}.dist-info"
50
53
add_file(f"{distinfo}/WHEEL", WHEEL)
51
- add_file(f"{distinfo}/METADATA", METADATA.format(project=project, version=version))
54
+ add_file(f"{distinfo}/METADATA", METADATA.format(
55
+ project=project, version=version, requires_dist=requires_dist
56
+ ))
52
57
for name, data in files:
53
58
add_file(name, data)
54
59
record_name = f"{distinfo}/RECORD"
@@ -70,29 +75,35 @@ def build_wheel(
70
75
):
71
76
if config_settings is None:
72
77
config_settings = {}
73
- w = os.path.join(wheel_directory, "foo -1.0-py3-none-any.whl")
78
+ w = os.path.join(wheel_directory, "{{name}} -1.0-py3-none-any.whl")
74
79
with open(w, "wb") as f:
75
80
with ZipFile(f, "w") as z:
76
81
make_wheel(
77
- z, "foo ", "1.0",
78
- [("config.json", json.dumps(config_settings))]
82
+ z, "{{name}} ", "1.0", "{{requires_dist}} ",
83
+ [("{{name}}- config.json", json.dumps(config_settings))]
79
84
)
80
- return "foo -1.0-py3-none-any.whl"
85
+ return "{{name}} -1.0-py3-none-any.whl"
81
86
82
87
build_editable = build_wheel
83
88
84
89
main = Backend()
85
90
'''
86
91
87
92
88
- def make_project (path : Path ) -> Tuple [str , str , Path ]:
89
- name = "foo"
93
+ def make_project (
94
+ path : Path , name : str = "foo" , dependencies : Optional [List [str ]] = None
95
+ ) -> Tuple [str , str , Path ]:
90
96
version = "1.0"
91
97
project_dir = path / name
92
98
backend = project_dir / "backend"
93
99
backend .mkdir (parents = True )
94
100
(project_dir / "pyproject.toml" ).write_text (PYPROJECT_TOML )
95
- (backend / "dummy_backend.py" ).write_text (BACKEND_SRC )
101
+ requires_dist = [f"Requires-Dist: { dep } " for dep in dependencies or []]
102
+ (backend / "dummy_backend.py" ).write_text (
103
+ BACKEND_SRC .replace ("{{name}}" , name ).replace (
104
+ "{{requires_dist}}" , "\n " .join (requires_dist )
105
+ )
106
+ )
96
107
return name , version , project_dir
97
108
98
109
@@ -108,32 +119,140 @@ def test_backend_sees_config(script: PipTestEnvironment) -> None:
108
119
wheel_file_path = script .cwd / wheel_file_name
109
120
with open (wheel_file_path , "rb" ) as f :
110
121
with ZipFile (f ) as z :
111
- output = z .read ("config.json" )
122
+ output = z .read (f"{ name } -config.json" )
123
+ assert json .loads (output ) == {"FOO" : "Hello" }
124
+
125
+
126
+ def test_backend_sees_config_via_constraint (script : PipTestEnvironment ) -> None :
127
+ name , version , project_dir = make_project (script .scratch_path )
128
+ constraints_file = script .scratch_path / "constraints.txt"
129
+ constraints_file .write_text (f"{ name } @ { path_to_url (str (project_dir ))} " )
130
+ script .pip (
131
+ "wheel" ,
132
+ "--config-settings" ,
133
+ "FOO=Hello" ,
134
+ "-c" ,
135
+ "constraints.txt" ,
136
+ name ,
137
+ )
138
+ wheel_file_name = f"{ name } -{ version } -py3-none-any.whl"
139
+ wheel_file_path = script .cwd / wheel_file_name
140
+ with open (wheel_file_path , "rb" ) as f :
141
+ with ZipFile (f ) as z :
142
+ output = z .read (f"{ name } -config.json" )
143
+ assert json .loads (output ) == {"FOO" : "Hello" }
144
+
145
+
146
+ def test_backend_sees_config_via_sdist (script : PipTestEnvironment ) -> None :
147
+ name , version , project_dir = make_project (script .scratch_path )
148
+ dists_dir = script .scratch_path / "dists"
149
+ dists_dir .mkdir ()
150
+ with tarfile .open (dists_dir / f"{ name } -{ version } .tar.gz" , "w:gz" ) as dist_tar :
151
+ dist_tar .add (project_dir , arcname = name )
152
+ script .pip (
153
+ "wheel" ,
154
+ "--config-settings" ,
155
+ "FOO=Hello" ,
156
+ "-f" ,
157
+ dists_dir ,
158
+ name ,
159
+ )
160
+ wheel_file_name = f"{ name } -{ version } -py3-none-any.whl"
161
+ wheel_file_path = script .cwd / wheel_file_name
162
+ with open (wheel_file_path , "rb" ) as f :
163
+ with ZipFile (f ) as z :
164
+ output = z .read (f"{ name } -config.json" )
112
165
assert json .loads (output ) == {"FOO" : "Hello" }
113
166
114
167
168
+ def test_req_file_does_not_see_config (script : PipTestEnvironment ) -> None :
169
+ """Test that CLI config settings do not propagate to requirement files."""
170
+ name , _ , project_dir = make_project (script .scratch_path )
171
+ reqs_file = script .scratch_path / "reqs.txt"
172
+ reqs_file .write_text (f"{ project_dir } " )
173
+ script .pip (
174
+ "install" ,
175
+ "--config-settings" ,
176
+ "FOO=Hello" ,
177
+ "-r" ,
178
+ reqs_file ,
179
+ )
180
+ config = script .site_packages_path / f"{ name } -config.json"
181
+ with open (config , "rb" ) as f :
182
+ assert json .load (f ) == {}
183
+
184
+
185
+ def test_dep_does_not_see_config (script : PipTestEnvironment ) -> None :
186
+ """Test that CLI config settings do not propagate to dependencies."""
187
+ _ , _ , bar_project_dir = make_project (script .scratch_path , name = "bar" )
188
+ _ , _ , foo_project_dir = make_project (
189
+ script .scratch_path ,
190
+ name = "foo" ,
191
+ dependencies = [f"bar @ { path_to_url (str (bar_project_dir ))} " ],
192
+ )
193
+ script .pip (
194
+ "install" ,
195
+ "--config-settings" ,
196
+ "FOO=Hello" ,
197
+ foo_project_dir ,
198
+ )
199
+ foo_config = script .site_packages_path / "foo-config.json"
200
+ with open (foo_config , "rb" ) as f :
201
+ assert json .load (f ) == {"FOO" : "Hello" }
202
+ bar_config = script .site_packages_path / "bar-config.json"
203
+ with open (bar_config , "rb" ) as f :
204
+ assert json .load (f ) == {}
205
+
206
+
207
+ def test_dep_in_req_file_does_not_see_config (script : PipTestEnvironment ) -> None :
208
+ """Test that CLI config settings do not propagate to dependencies found in
209
+ requirement files."""
210
+ _ , _ , bar_project_dir = make_project (script .scratch_path , name = "bar" )
211
+ _ , _ , foo_project_dir = make_project (
212
+ script .scratch_path ,
213
+ name = "foo" ,
214
+ dependencies = ["bar" ],
215
+ )
216
+ reqs_file = script .scratch_path / "reqs.txt"
217
+ reqs_file .write_text (f"bar @ { path_to_url (str (bar_project_dir ))} " )
218
+ script .pip (
219
+ "install" ,
220
+ "--config-settings" ,
221
+ "FOO=Hello" ,
222
+ "-r" ,
223
+ reqs_file ,
224
+ foo_project_dir ,
225
+ )
226
+ foo_config = script .site_packages_path / "foo-config.json"
227
+ with open (foo_config , "rb" ) as f :
228
+ assert json .load (f ) == {"FOO" : "Hello" }
229
+ bar_config = script .site_packages_path / "bar-config.json"
230
+ with open (bar_config , "rb" ) as f :
231
+ assert json .load (f ) == {}
232
+
233
+
115
234
def test_install_sees_config (script : PipTestEnvironment ) -> None :
116
- _ , _ , project_dir = make_project (script .scratch_path )
235
+ name , _ , project_dir = make_project (script .scratch_path )
117
236
script .pip (
118
237
"install" ,
119
238
"--config-settings" ,
120
239
"FOO=Hello" ,
121
240
project_dir ,
122
241
)
123
- config = script .site_packages_path / " config.json"
242
+ config = script .site_packages_path / f" { name } - config.json"
124
243
with open (config , "rb" ) as f :
125
244
assert json .load (f ) == {"FOO" : "Hello" }
126
245
127
246
128
247
def test_install_editable_sees_config (script : PipTestEnvironment ) -> None :
129
- _ , _ , project_dir = make_project (script .scratch_path )
248
+ name , _ , project_dir = make_project (script .scratch_path )
130
249
script .pip (
131
250
"install" ,
132
251
"--config-settings" ,
133
252
"FOO=Hello" ,
134
253
"--editable" ,
135
254
project_dir ,
136
255
)
137
- config = script .site_packages_path / " config.json"
256
+ config = script .site_packages_path / f" { name } - config.json"
138
257
with open (config , "rb" ) as f :
139
258
assert json .load (f ) == {"FOO" : "Hello" }
0 commit comments