5
5
import sqlite3
6
6
import subprocess
7
7
import tempfile
8
+ import time
8
9
from contextlib import closing
9
10
10
11
import urllib3
48
49
db .execute (
49
50
"""
50
51
CREATE TABLE IF NOT EXISTS deps (
51
- dependent_name STRING,
52
- dependent_version STRING,
53
- dependency_name STRING,
54
- dependency_specifier STRING,
52
+ name STRING,
53
+ version STRING,
54
+ dep_name STRING,
55
+ dep_specifier STRING,
55
56
extra STRING DEFAULT NULL,
56
- PRIMARY KEY (dependent_name, dependent_version, dependency_name, dependency_specifier )
57
+ PRIMARY KEY (name, version, dep_name, dep_specifier )
57
58
);
58
59
"""
59
60
)
@@ -156,21 +157,29 @@ def get_metadata_by_install(package, resp):
156
157
!= 0
157
158
):
158
159
return None
159
- package_str = f'"{ package } "'
160
- try :
161
- package_metadata = json .loads (
162
- subprocess .check_output (
163
- f"{ venv_python } -c 'import json; from importlib_metadata import requires, metadata; "
164
- f'package={ package_str } ; print(json.dumps({{"requires_dist": requires(package), "requires_python": metadata(package).get("Requires-Python", "")}}))\' ' ,
165
- shell = True ,
166
- )
167
- )
168
- except subprocess .SubprocessError :
160
+
161
+ print (f"building { package !r} from source!" )
162
+ popen = subprocess .Popen (
163
+ f"{ venv_python } -c 'import json; from importlib_metadata import requires, metadata; "
164
+ f'package="{ package } "; print(json.dumps({{"requires_dist": requires(package), "requires_python": metadata(package).get("Requires-Python", "")}}))\' ' ,
165
+ shell = True ,
166
+ stdout = subprocess .PIPE ,
167
+ stderr = subprocess .DEVNULL ,
168
+ )
169
+
170
+ # Run the install for no more than 20 seconds
171
+ start_time = time .time ()
172
+ while time .time () - start_time < 20 and popen .poll () is None :
173
+ time .sleep (0.5 )
174
+
175
+ if popen .returncode != 0 :
169
176
return resp
177
+ package_metadata = json .loads (popen .stdout .read ())
170
178
171
179
resp = resp .copy ()
172
180
resp ["info" ]["requires_dist" ] = package_metadata ["requires_dist" ]
173
181
resp ["info" ]["requires_python" ] = package_metadata ["requires_python" ]
182
+ print (package_metadata )
174
183
return resp
175
184
176
185
@@ -213,17 +222,15 @@ def update_data_from_pypi():
213
222
# Check to see if we already have this version or not
214
223
with closing (db .cursor ()) as cur :
215
224
cur .execute (
216
- """
217
- SELECT name FROM packages WHERE name = ? AND version = ?;
218
- """ ,
225
+ "SELECT name FROM packages WHERE name = ? AND version = ?;" ,
219
226
(package , str_version ),
220
227
)
221
228
if cur .fetchone ():
222
229
continue
223
230
224
231
# If we don't have 'requires_dist' information install
225
232
# locally and investigate the installed package
226
- if False and resp ["info" ]["requires_dist" ] is None : # XXX: Disabled for now!
233
+ if False and resp ["info" ]["requires_dist" ] is None :
227
234
new_resp = get_metadata_by_install (package , resp )
228
235
if new_resp is not None :
229
236
resp = new_resp
@@ -239,7 +246,7 @@ def update_data_from_pypi():
239
246
yanked = []
240
247
241
248
releases = resp ["releases" ][str_version ]
242
- uploaded_at = min (x ["uplaoded_at " ] for x in releases )
249
+ uploaded_at = None if not releases else min (x ["upload_time " ] for x in releases )
243
250
wheel_filenames = [
244
251
x ["filename" ] for x in releases if x ["filename" ].endswith (".whl" )
245
252
]
@@ -293,10 +300,10 @@ def update_data_from_pypi():
293
300
db .execute (
294
301
"""
295
302
INSERT OR IGNORE INTO deps (
296
- dependent_name ,
297
- dependent_version ,
298
- dependency_name ,
299
- dependency_specifier ,
303
+ name ,
304
+ version ,
305
+ dep_name ,
306
+ dep_specifier ,
300
307
extra
301
308
) VALUES (?, ?, ?, ?, ?);
302
309
""" ,
@@ -306,10 +313,10 @@ def update_data_from_pypi():
306
313
db .execute (
307
314
"""
308
315
INSERT OR IGNORE INTO deps (
309
- dependent_name ,
310
- dependent_version ,
311
- dependency_name ,
312
- dependency_specifier
316
+ name ,
317
+ version ,
318
+ dep_name ,
319
+ dep_specifier
313
320
) VALUES (?, ?, ?, ?);
314
321
""" ,
315
322
(package , str_version , req_no_specifiers , specifier ),
0 commit comments