diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1b02bb8..be00e6c 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -8,17 +8,22 @@ on: workflow_dispatch: jobs: - tests: + tests-3x: name: "Python ${{ matrix.python-version }}" runs-on: "ubuntu-latest" strategy: matrix: - python-version: ["2.7", "3.9"] + python-version: + - "3.8" + - "3.9" + - "3.10" + - "3.11" + - "3.12" steps: - - uses: "actions/checkout@v2" - - uses: "actions/setup-python@v2" + - uses: "actions/checkout@v3" + - uses: "actions/setup-python@v4" with: python-version: "${{ matrix.python-version }}" - name: "Install dependencies" @@ -28,8 +33,23 @@ jobs: python -m pip install -e .[dev] - name: "Run tests for ${{ matrix.python-version }}" run: python -m pytest + - name: Upload coverage to Codecov + uses: "codecov/codecov-action@v3" + + tests-27: + name: "Python 2.7 on ubuntu-20.04" + runs-on: ubuntu-20.04 + container: + image: python:2.7-buster + steps: + - uses: "actions/checkout@v3" + - name: "Install dependencies" + run: | + set -xe + python -VV + python -m pip install -e .[dev] + - name: "Run tests for 2.7" + run: python -m pytest - name: Upload coverage to Codecov - uses: "codecov/codecov-action@v1" - with: - fail_ci_if_error: true + uses: "codecov/codecov-action@v3" diff --git a/luddite.py b/luddite.py index 40d08cc..d8cc1b4 100755 --- a/luddite.py +++ b/luddite.py @@ -8,10 +8,9 @@ import subprocess import sys from concurrent.futures import ThreadPoolExecutor -from pkg_resources import parse_version -from pkg_resources import Requirement -from pkg_resources import RequirementParseError +from packaging.requirements import Requirement, InvalidRequirement +from packaging.version import Version try: from urllib2 import Request, urlopen @@ -97,7 +96,7 @@ def get_data_pypi(name, index=DEFAULT_INDEX): def get_versions_pypi(name, index=DEFAULT_INDEX): data = get_data_pypi(name, index) - version_numbers = sorted(data["releases"], key=parse_version) + version_numbers = sorted(data["releases"], key=Version) return tuple(version_numbers) @@ -123,7 +122,7 @@ def get_data_devpi(name, index): def get_versions_devpi(name, index): data = get_data_devpi(name, index) - version_numbers = sorted(data["result"], key=parse_version) + version_numbers = sorted(data["result"], key=Version) return tuple(version_numbers) @@ -195,14 +194,14 @@ def __init__(self, text, line_number=None): self.from_versions = "" if self.stripped: try: - self.req = Requirement.parse(self.stripped) - except (RequirementParseError, ValueError): + self.req = Requirement(self.stripped) + except (InvalidRequirement, ValueError): pass else: - if len(self.req.specs) == 1: - [(op, v)] = self.req.specs - if op == "==": - self.version = v + if len(self.req.specifier) == 1: + spec = str(self.req.specifier) + if spec.startswith("=="): + _, self.version = spec.split("==", 1) self.error = None self.latest = None self.latest_non_pre = None @@ -236,7 +235,7 @@ def process(self, worker, index=None): return "gone" self.latest = index_versions[-1] self.latest_non_pre = max( - index_versions, key=lambda v: (not parse_version(v).is_prerelease, parse_version(v)) + index_versions, key=lambda v: (not Version(v).is_prerelease, Version(v)) ) if self.version == self.latest: return "pass" diff --git a/setup.py b/setup.py index 7f5ed10..0f35371 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name="luddite", - version="1.0.2", + version="1.0.3", author="Wim Glenn", author_email="hey@wimglenn.com", url="https://github.com/jumptrading/luddite", @@ -18,14 +18,14 @@ ], entry_points={"console_scripts": ["luddite=luddite:main"]}, install_requires=[ - "setuptools >= 18.0", + "packaging", 'colorama; platform_system == "Windows"', 'futures; python_version < "3.2"', ], extras_require={ # https://hynek.me/articles/conditional-python-dependencies/ "dev": [ - "pytest>=3.6.3", + "pytest >= 3.6.3", "pytest-cov", "pytest-mock", "pytest-socket",