From cf811cfff8c481966bb1231f7cc66392ee409864 Mon Sep 17 00:00:00 2001 From: "A. Reit" Date: Mon, 25 Nov 2024 14:41:23 +0100 Subject: [PATCH] Fix SetuptoolsDeprecationWarning issued by 'python -m build' Fix 'extras_require' in setup.py to fix the warning. This requires fixes for the parsing of dependencies in test_dependencies_in_sync.py: Use the 'packaging' module which simplifies the code. --- setup.py | 2 +- spyder/tests/test_dependencies_in_sync.py | 69 +++++++++-------------- 2 files changed, 28 insertions(+), 43 deletions(-) diff --git a/setup.py b/setup.py index 36d70cf53ae..51ad92f9ab6 100644 --- a/setup.py +++ b/setup.py @@ -332,7 +332,6 @@ def run(self): install_requires.append('qtconsole>=5.5.1,<5.7.0') extras_require = { - 'test:platform_system == "Windows"': ['pywin32'], 'test': [ 'coverage', 'cython', @@ -347,6 +346,7 @@ def run(self): 'pytest-order', 'pytest-qt', 'pytest-timeout', + 'pywin32;platform_system=="Windows"', 'pyyaml', 'scipy', 'sympy', diff --git a/spyder/tests/test_dependencies_in_sync.py b/spyder/tests/test_dependencies_in_sync.py index f12bc449bcb..caa85b3ac6a 100644 --- a/spyder/tests/test_dependencies_in_sync.py +++ b/spyder/tests/test_dependencies_in_sync.py @@ -9,6 +9,8 @@ import os.path as osp # Third party imports +from packaging.requirements import Requirement +from packaging.specifiers import SpecifierSet import pytest import yaml @@ -42,15 +44,11 @@ def parse_environment_yaml(fpath): elif dep == 'websockify': continue else: - parts = dep.split(' ') - if len(parts) > 1: - ver = parts[-1] - if ver[0] == '=': - ver = '=' + ver - - deps[parts[0]] = ver + req = Requirement(dep) + if req.specifier: + deps[req.name] = str(req.specifier) else: - deps[parts[0]] = None + deps[req.name] = None return deps @@ -66,10 +64,7 @@ def parse_spyder_dependencies(): ver = dep['required_version'] if ver: - if ';' in ver: - ver = ver.replace(';', ',') - elif ver[0] == '=': - ver = '=' + ver + ver = str(SpecifierSet(ver)) deps[dep['package_name'].lower()] = ver @@ -105,21 +100,16 @@ def parse_setup_install_requires(fpath): # Process dependencies deps = {} for dep in deps_list: - dep = dep.split(';')[0] - name, ver = None, None - - for sep in ['>=', '==', '<=', '<', '>']: - if sep in dep: - name, ver = dep.split(sep) - name = name.split('[')[0] # Discard e.g. [all] - ver = sep + ver # Include comparator - break + req = Requirement(dep) # Transform pypi to conda name - if name == 'pyqt5': - name = 'pyqt' + if req.name == 'pyqt5': + req.name = 'pyqt' - deps[name] = ver + if req.specifier: + deps[req.name] = str(req.specifier) + else: + deps[req.name] = None return deps @@ -147,27 +137,22 @@ def parse_setup_extra_requires(fpath): dep_list = dep_dict.get('test') dep_list = [item for item in dep_list if item[0] != '#'] for dep in dep_list: - dep = dep.split(';')[0] - name, ver = None, None - - for sep in ['>=', '==', '<=', '<', '>']: - if sep in dep: - idx = dep.index(sep) - name = dep[:idx] - ver = dep[idx:] - break - - if name is not None: - name = name.split('[')[0] - else: - name = dep.split('[')[0] + req = Requirement(dep) # Transform pypi to conda name - if name == 'pyqt5': - name = 'pyqt' + if req.name == 'pyqt5': + req.name = 'pyqt' + + if req.marker and not req.marker.evaluate(): + # Skip dependencies which are not required for current environment + # (e.g. skip 'platform_system=="Windows"' on Linux) + continue + + if req.specifier: + deps[req.name] = str(req.specifier) + else: + deps[req.name] = None - deps[name] = ver - print(deps) return deps