diff --git a/binstar_client/__init__.py b/binstar_client/__init__.py index e76bdf95..5dff7d6a 100644 --- a/binstar_client/__init__.py +++ b/binstar_client/__init__.py @@ -13,7 +13,6 @@ import defusedxml.ElementTree as ET import requests -from pkg_resources import parse_version as pv from tqdm import tqdm from . import errors @@ -186,15 +185,6 @@ def remove_authentication(self, auth_name=None, organization=None): def _check_response(self, res, allowed=None): allowed = [200] if allowed is None else allowed - api_version = res.headers.get('x-binstar-api-version', '0.2.1') - if pv(api_version) > pv(__version__): - # pylint: disable=implicit-str-concat - logger.warning( - 'The api server is running the binstar-api version %s. you are using %s\n' - 'Please update your client with pip install -U binstar or conda update binstar', - api_version, - __version__, - ) if not self._token_warning_sent and 'Conda-Token-Warning' in res.headers: logger.warning('Token warning: %s', res.headers['Conda-Token-Warning']) diff --git a/binstar_client/inspect_package/pypi.py b/binstar_client/inspect_package/pypi.py index ace0ed7e..536ab07e 100644 --- a/binstar_client/inspect_package/pypi.py +++ b/binstar_client/inspect_package/pypi.py @@ -11,7 +11,7 @@ from email.parser import Parser from os import path -import pkg_resources +from packaging.requirements import Requirement from binstar_client import errors from binstar_client.inspect_package.uitls import extract_first, pop_key @@ -145,12 +145,19 @@ def python_version_check(filedata): def parse_requirement(line, deps, extras, extra): - req = pkg_resources.Requirement.parse(line) - req.specs.sort(key=sort_ver) + parsed_req = Requirement(line) + name = parsed_req.name.lower() + specs = sorted( + ( + (spec.operator, spec.version) for spec in parsed_req.specifier + ), + key=sort_ver, + ) + if extra: - extras[extra].append({'name': req.key, 'specs': req.specs or []}) + extras[extra].append({'name': name, 'specs': specs}) else: - deps.append({'name': req.key, 'specs': req.specs or []}) + deps.append({'name': name, 'specs': specs}) deps.sort(key=sort_key) for extra_item in extras.values(): @@ -197,37 +204,18 @@ def parse_requires_txt(requires_txt): def format_requirements(requires): obj = [] for req in requires: - req = req.strip() - - # Get environment marker - marker = None - if ';' in req: - req, marker = req.split(';', 1) - marker = marker.strip() - else: - marker = None - - req_spec = req.split(' ', 1) - if len(req_spec) == 1: - # Note: req.lower() was introduced here to enforce the same parsing - # using metadata.json and METADATA - obj.append({'name': req.lower(), 'specs': []}) - else: - req, spec = req_spec - spec = spec.strip() - - if spec[0] == '(': - spec = spec[1:] - - if spec[-1] == ')': - spec = spec[:-1] - - req = pkg_resources.Requirement.parse('%s %s' % (req, spec)) - req.specs.sort(key=sort_ver) - obj.append({ - 'name': req.key, - 'specs': req.specs or [], - }) + parsed_req = Requirement(req) + name = parsed_req.name.lower() + specs = sorted( + ( + (spec.operator, spec.version) for spec in parsed_req.specifier + ), + key=sort_ver, + ) + obj.append({ + 'name': name, + 'specs': specs, + }) return obj diff --git a/setup.cfg b/setup.cfg index d371c9b6..687354f7 100644 --- a/setup.cfg +++ b/setup.cfg @@ -179,3 +179,6 @@ redefining-builtins-modules=past.builtins,future.builtins,builtins,io [tool:pytest] addopts=--durations 10 --cov=binstar_client --cov-report term-missing cache_dir=.cache/pytest +# Treat all warnings errors: https://til.simonwillison.net/pytest/treat-warnings-as-errors +filterwarnings = + error