Skip to content

Commit 698f2e5

Browse files
committed
Add test for extras_require
1 parent 41eb342 commit 698f2e5

4 files changed

Lines changed: 77 additions & 12 deletions

File tree

binder/environment.yml

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,22 +44,23 @@ dependencies:
4444
# the contents of this requirements/tests.txt to this file.yml.
4545
# Please *DO NOT* make changes directly just to here - make changes
4646
# to requirements/tests.txt, and copy it here.
47+
- coverage <5.0
48+
- cython
49+
- flaky
50+
- matplotlib
51+
- mock
52+
- pandas
53+
- pillow
4754
- pytest <5.0
4855
- pytest-mock
4956
- pytest-cov
5057
- pytest-qt
5158
- pytest-ordering
5259
- pytest-lazy-fixture
5360
- pytest-faulthandler <2.0
54-
- mock
55-
- pandas
61+
- pytest-xvfb
5662
- scipy
5763
- sympy
58-
- pillow
59-
- matplotlib
60-
- cython
61-
- flaky
62-
- coverage <5.0
6364

6465
# Required for jupyter-desktop-server
6566
- websockify

setup.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,8 +239,10 @@ def run(self):
239239

240240
extras_require = {
241241
'test:python_version == "2.7"': ['mock'],
242+
'test:platform_system == "Linux"': ['pytest-xvfb'],
242243
'test:platform_system == "Windows"': ['pywin32'],
243244
'test': [
245+
'coverage<5.0',
244246
'cython',
245247
'flaky',
246248
'matplotlib',
@@ -249,12 +251,11 @@ def run(self):
249251
'pillow',
250252
'pytest<5.0',
251253
'pytest-cov',
252-
'pytest-faulthandler',
254+
'pytest-faulthandler<2.0',
253255
'pytest-lazy-fixture',
254256
'pytest-mock',
255257
'pytest-ordering',
256258
'pytest-qt',
257-
'pytest-xvfb;platform_system=="Linux"',
258259
'pyyaml',
259260
'scipy',
260261
'sympy',

spyder/dependencies.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@
7272
# =============================================================================
7373
# Descriptions
7474
# NOTE: We declare our dependencies in **alphabetical** order
75+
# If some dependencies are limited to some systems only, add a 'display' key.
76+
# See 'applaunchservices' for an example.
7577
# =============================================================================
7678
# List of descriptions
7779
DESCRIPTIONS = [

spyder/tests/test_dependencies_in_sync.py

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ def parse_spyder_dependencies():
9898
return deps
9999

100100

101-
def parse_setup(fpath):
101+
def parse_setup_install_requires(fpath):
102102
"""
103103
Parse Spyder setup.py and return a dict of deps and versions.
104104
"""
@@ -144,6 +144,53 @@ def parse_setup(fpath):
144144
return deps
145145

146146

147+
def parse_setup_extra_requires(fpath):
148+
"""
149+
Parse Spyder setup.py and return a dict of deps and versions.
150+
"""
151+
deps = {}
152+
with open(fpath, 'r') as fh:
153+
data = fh.read()
154+
155+
lines = data.split('\n')
156+
start = None
157+
end = None
158+
for idx, line in enumerate(lines):
159+
if line.startswith('extras_require = '):
160+
start = idx + 1
161+
162+
if start is not None and line.startswith('}'):
163+
end = idx
164+
break
165+
166+
dep_dict = literal_eval('{' + '\n'.join(lines[start:end + 1]))
167+
dep_list = dep_dict.get('test')
168+
dep_list = [item for item in dep_list if item[0] != '#']
169+
for dep in dep_list:
170+
dep = dep.split(';')[0]
171+
name, ver = None, None
172+
173+
for sep in ['>=', '==', '<=', '<', '>']:
174+
if sep in dep:
175+
idx = dep.index(sep)
176+
name = dep[:idx]
177+
ver = dep[idx:]
178+
break
179+
180+
if name is not None:
181+
name = name.split('[')[0]
182+
else:
183+
name = dep.split('[')[0]
184+
185+
# Transform pypi to conda name
186+
if name == 'pyqt5':
187+
name = 'pyqt'
188+
189+
deps[name] = ver
190+
print(deps)
191+
return deps
192+
193+
147194
def test_dependencies_for_binder_in_sync():
148195
"""
149196
Binder environment yaml should be the sum of conda.txt and tests.txt
@@ -157,6 +204,10 @@ def test_dependencies_for_binder_in_sync():
157204
if 'rtree' in spyder_env:
158205
spyder_env.pop('rtree')
159206

207+
# xvfb is only available on linux (which binder runs on)
208+
if 'pytest-xvfb' in spyder_env:
209+
spyder_env.pop('pytest-xvfb')
210+
160211
# Check that the requirement files match the environment yaml file
161212
full_reqs = {}
162213
full_reqs.update(test_reqs)
@@ -182,14 +233,24 @@ def test_dependencies_for_spyder_dialog_in_sync():
182233
assert spyder_deps == spyder_reqs
183234

184235

185-
def test_dependencies_for_spyder_setup_in_sync():
236+
def test_dependencies_for_spyder_setup_install_requires_in_sync():
186237
"""
187238
Spyder setup.py should share deps with conda.txt.
188239
"""
189-
spyder_setup = parse_setup(SETUP_FPATH)
240+
spyder_setup = parse_setup_install_requires(SETUP_FPATH)
190241
spyder_reqs = parse_requirements(REQ_FPATH)
191242

192243
if 'pyqtwebengine' in spyder_setup:
193244
spyder_setup.pop('pyqtwebengine')
194245

195246
assert spyder_setup == spyder_reqs
247+
248+
249+
def test_dependencies_for_spyder_setup_extras_requires_in_sync():
250+
"""
251+
Spyder setup.py extra_requires should share deps with tests.txt.
252+
"""
253+
spyder_extras_setup = parse_setup_extra_requires(SETUP_FPATH)
254+
spyder_test_reqs = parse_requirements(REQ_TEST_FPATH)
255+
256+
assert spyder_extras_setup == spyder_test_reqs

0 commit comments

Comments
 (0)