@@ -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+
147194def 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