Skip to content

Commit 9a126b6

Browse files
authored
Merge pull request django-extensions#1588 from mplumador/pipchecker-retry
Pipchecker retry
2 parents 91a4640 + 18dddb5 commit 9a126b6

File tree

2 files changed

+67
-2
lines changed

2 files changed

+67
-2
lines changed

django_extensions/management/commands/pipchecker.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66
from urllib.parse import urlparse
77
from urllib.error import HTTPError
88
from urllib.request import Request, urlopen
9-
from xmlrpc.client import ServerProxy
9+
from xmlrpc.client import ServerProxy, Fault
1010

1111
import pip
12+
from time import sleep
1213
from django.core.management.base import BaseCommand, CommandError
1314
from django_extensions.management.color import color_style
1415
from django_extensions.management.utils import signalcommand
@@ -145,7 +146,17 @@ def check_pypi(self):
145146
elif "dist" in req:
146147
dist = req["dist"]
147148
dist_version = LooseVersion(dist.version)
148-
available = pypi.package_releases(req["pip_req"].name, True) or pypi.package_releases(req["pip_req"].name.replace('-', '_'), True)
149+
retry = True
150+
available = None
151+
while retry:
152+
try:
153+
available = pypi.package_releases(req["pip_req"].name, True) or pypi.package_releases(req["pip_req"].name.replace('-', '_'), True)
154+
retry = False
155+
except Fault as err:
156+
self.stdout.write(err.faultString)
157+
self.stdout.write("Retrying in 60 seconds!")
158+
sleep(60)
159+
149160
available_version = self._available_version(dist_version, available)
150161

151162
if not available_version:

tests/management/commands/test_pipchecker.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,57 @@ def test_pipchecker_with_outdated_requirement_on_pip20_1(self):
115115
os.remove(requirements_path)
116116

117117
self.assertTrue(value.endswith('available\n'))
118+
119+
def test_pipchecker_with_long_up_to_date_requirements(self):
120+
requirements_path = './requirements.txt'
121+
out = StringIO()
122+
123+
f = open(requirements_path, 'wt')
124+
f.write('appdirs')
125+
f.write('asgiref')
126+
f.write('attrs')
127+
f.write('black')
128+
f.write('certifi')
129+
f.write('chardet')
130+
f.write('click')
131+
f.write('distlib')
132+
f.write('Django')
133+
f.write('django-cors-headers')
134+
f.write('django-debug-toolbar')
135+
f.write('djangorestframework')
136+
f.write('filelock')
137+
f.write('idna')
138+
f.write('iniconfig')
139+
f.write('mypy-extensions')
140+
f.write('packaging')
141+
f.write('pathspec')
142+
f.write('Pillow')
143+
f.write('pluggy')
144+
f.write('psycopg2-binary')
145+
f.write('py')
146+
f.write('pyparsing')
147+
f.write('pytest')
148+
f.write('pytz')
149+
f.write('regex')
150+
f.write('requests')
151+
f.write('sentry-sdk')
152+
f.write('shortuuid')
153+
f.write('six')
154+
f.write('sqlparse')
155+
f.write('toml')
156+
f.write('typed-ast')
157+
f.write('typing-extensions')
158+
f.write('urllib3')
159+
f.write('whitenoise')
160+
f.write('zipp')
161+
162+
subprocess.call([sys.executable, '-m', 'pip', 'install', '-r', requirements_path])
163+
pip._vendor.pkg_resources = importlib.reload(pip._vendor.pkg_resources)
164+
call_command('pipchecker', '-r', requirements_path, stdout=out)
165+
166+
value = out.getvalue()
167+
168+
subprocess.call([sys.executable, '-m', 'pip', 'uninstall', '--yes', '-r', requirements_path])
169+
os.remove(requirements_path)
170+
171+
self.assertTrue(value.endswith("Retrying in 60 seconds!") or value == '')

0 commit comments

Comments
 (0)