Jelajahi Sumber

Merge pull request #210 from bastimeyer/py38-wheel-abi-suffix

No ABI suffix in wheel names on Python >=3.8
Thomas Kluyver 4 tahun lalu
induk
melakukan
ba9d161370
2 mengubah file dengan 36 tambahan dan 19 penghapusan
  1. 28 14
      nsist/tests/test_pypi.py
  2. 8 5
      nsist/wheels.py

+ 28 - 14
nsist/tests/test_pypi.py

@@ -50,8 +50,8 @@ def test_extra_sources(tmpdir):
     assert wl.check_extra_sources() is None
     assert wl.check_extra_sources() is None
 
 
 def test_pick_best_wheel():
 def test_pick_best_wheel():
-    wd = WheelLocator("astsearch==0.1.2",
-                      CompatibilityScorer("3.5.1", "win_amd64"))
+    wd37 = WheelLocator("astsearch==0.1.2", CompatibilityScorer("3.7.1", "win_amd64"))
+    wd38 = WheelLocator("astsearch==0.1.2", CompatibilityScorer("3.8.0", "win_amd64"))
 
 
     # Some of the wheel filenames below are impossible combinations - they are
     # Some of the wheel filenames below are impossible combinations - they are
     # there to test the scoring and ranking machinery.
     # there to test the scoring and ranking machinery.
@@ -61,56 +61,70 @@ def test_pick_best_wheel():
         CachedRelease('astsearch-0.1.2-py3-none-any.whl'),
         CachedRelease('astsearch-0.1.2-py3-none-any.whl'),
         CachedRelease('astsearch-0.1.2-py3-none-win_amd64.whl'),
         CachedRelease('astsearch-0.1.2-py3-none-win_amd64.whl'),
     ]
     ]
-    assert wd.pick_best_wheel(releases) == releases[1]
+    assert wd37.pick_best_wheel(releases) == releases[1]
 
 
     # Wrong Windows bitness
     # Wrong Windows bitness
     releases = [
     releases = [
         CachedRelease('astsearch-0.1.2-py3-none-any.whl'),
         CachedRelease('astsearch-0.1.2-py3-none-any.whl'),
         CachedRelease('astsearch-0.1.2-py3-none-win_32.whl'),
         CachedRelease('astsearch-0.1.2-py3-none-win_32.whl'),
     ]
     ]
-    assert wd.pick_best_wheel(releases) == releases[0]
+    assert wd37.pick_best_wheel(releases) == releases[0]
 
 
     # Prefer more specific Python version
     # Prefer more specific Python version
     releases = [
     releases = [
-        CachedRelease('astsearch-0.1.2-cp35-none-any.whl'),
+        CachedRelease('astsearch-0.1.2-cp37-none-any.whl'),
         CachedRelease('astsearch-0.1.2-py3-none-any.whl'),
         CachedRelease('astsearch-0.1.2-py3-none-any.whl'),
     ]
     ]
-    assert wd.pick_best_wheel(releases) == releases[0]
+    assert wd37.pick_best_wheel(releases) == releases[0]
 
 
     # Prefer more specific Python version
     # Prefer more specific Python version
     releases = [
     releases = [
-        CachedRelease('astsearch-0.1.2-py34.py35-none-any.whl'),
+        CachedRelease('astsearch-0.1.2-py34.py37-none-any.whl'),
         CachedRelease('astsearch-0.1.2-py3-none-any.whl'),
         CachedRelease('astsearch-0.1.2-py3-none-any.whl'),
     ]
     ]
-    assert wd.pick_best_wheel(releases) == releases[0]
+    assert wd37.pick_best_wheel(releases) == releases[0]
 
 
     # Incompatible Python version
     # Incompatible Python version
     releases = [
     releases = [
         CachedRelease('astsearch-0.1.2-cp33-none-any.whl'),
         CachedRelease('astsearch-0.1.2-cp33-none-any.whl'),
         CachedRelease('astsearch-0.1.2-py3-none-any.whl'),
         CachedRelease('astsearch-0.1.2-py3-none-any.whl'),
     ]
     ]
-    assert wd.pick_best_wheel(releases) == releases[1]
+    assert wd37.pick_best_wheel(releases) == releases[1]
 
 
     # Prefer more specific ABI version
     # Prefer more specific ABI version
     releases = [
     releases = [
         CachedRelease('astsearch-0.1.2-py3-abi3-any.whl'),
         CachedRelease('astsearch-0.1.2-py3-abi3-any.whl'),
         CachedRelease('astsearch-0.1.2-py3-none-any.whl'),
         CachedRelease('astsearch-0.1.2-py3-none-any.whl'),
     ]
     ]
-    assert wd.pick_best_wheel(releases) == releases[0]
+    assert wd37.pick_best_wheel(releases) == releases[0]
+
+    # ABI suffix on Python <3.8
+    releases = [
+        CachedRelease('astsearch-0.1.2-cp37-cp37-any.whl'),
+        CachedRelease('astsearch-0.1.2-cp37-cp37m-any.whl'),
+    ]
+    assert wd37.pick_best_wheel(releases) == releases[1]
+
+    # No ABI suffix on Python >=3.8
+    releases = [
+        CachedRelease('astsearch-0.1.2-cp38-cp38-any.whl'),
+        CachedRelease('astsearch-0.1.2-cp38-cp38m-any.whl'),
+    ]
+    assert wd38.pick_best_wheel(releases) == releases[0]
 
 
     # Incompatible ABI version
     # Incompatible ABI version
     releases = [
     releases = [
-        CachedRelease('astsearch-0.1.2-cp35-abi4-win_amd64.whl'),
+        CachedRelease('astsearch-0.1.2-cp37-abi4-win_amd64.whl'),
         CachedRelease('astsearch-0.1.2-py3-none-any.whl'),
         CachedRelease('astsearch-0.1.2-py3-none-any.whl'),
     ]
     ]
-    assert wd.pick_best_wheel(releases) == releases[1]
+    assert wd37.pick_best_wheel(releases) == releases[1]
 
 
     # Platform has priority over other attributes
     # Platform has priority over other attributes
     releases = [
     releases = [
-        CachedRelease('astsearch-0.1.2-cp35-abi3-any.whl'),
+        CachedRelease('astsearch-0.1.2-cp37-abi3-any.whl'),
         CachedRelease('astsearch-0.1.2-py2.py3-none-win_amd64.whl'),
         CachedRelease('astsearch-0.1.2-py2.py3-none-win_amd64.whl'),
     ]
     ]
-    assert wd.pick_best_wheel(releases) == releases[1]
+    assert wd37.pick_best_wheel(releases) == releases[1]
 
 
 def test_merge_dir_to(tmpdir):
 def test_merge_dir_to(tmpdir):
     td1 = Path(str(tmpdir.mkdir('one')))
     td1 = Path(str(tmpdir.mkdir('one')))

+ 8 - 5
nsist/wheels.py

@@ -27,6 +27,7 @@ class CompatibilityScorer:
     """
     """
     def __init__(self, py_version, platform):
     def __init__(self, py_version, platform):
         self.py_version = py_version
         self.py_version = py_version
+        self.py_version_tuple = tuple(map(int, py_version.split('.')[:2]))
         self.platform = platform
         self.platform = platform
 
 
     def score_platform(self, platform):
     def score_platform(self, platform):
@@ -35,15 +36,17 @@ class CompatibilityScorer:
         return max(d.get(p, 0) for p in platform.split('.'))
         return max(d.get(p, 0) for p in platform.split('.'))
 
 
     def score_abi(self, abi):
     def score_abi(self, abi):
-        py_version_nodot = ''.join(self.py_version.split('.')[:2])
+        py_version_nodot = '%s%s' % (self.py_version_tuple[0], self.py_version_tuple[1])
+        abi_suffix = 'm' if self.py_version_tuple < (3, 8) else ''
         # Are there other valid options here?
         # Are there other valid options here?
-        d = {'cp%sm' % py_version_nodot: 3,  # Is the m reliable?
-            'abi3': 2, 'none': 1}
+        d = {'cp%s%s' % (py_version_nodot, abi_suffix): 3,
+             'abi3': 2,
+             'none': 1}
         return max(d.get(a, 0) for a in abi.split('.'))
         return max(d.get(a, 0) for a in abi.split('.'))
 
 
     def score_interpreter(self, interpreter):
     def score_interpreter(self, interpreter):
-        py_version_nodot = ''.join(self.py_version.split('.')[:2])
-        py_version_major = self.py_version.split('.')[0]
+        py_version_nodot = '%s%s' % (self.py_version_tuple[0], self.py_version_tuple[1])
+        py_version_major = str(self.py_version_tuple[0])
         d = {'cp'+py_version_nodot: 4,
         d = {'cp'+py_version_nodot: 4,
              'cp'+py_version_major: 3,
              'cp'+py_version_major: 3,
              'py'+py_version_nodot: 2,
              'py'+py_version_nodot: 2,