From 1e844f5fdae8a823348104f96aaaaa01a65b5cf3 Mon Sep 17 00:00:00 2001 From: Ioannis Tziakos Date: Tue, 29 Jun 2021 14:33:13 +0100 Subject: [PATCH] Cherry pick fixes from master (#416) * Update dummy eggs to hold the correct abi tag for Python 3.8 (#413) * Pass the runtime version to from_epd_string (#414) * Fix guess abi tag (#418) * Fix legacy.guess_abi_tag to support python 3.8 * Fix _guess_abi_from_python to return the correct value on 3.8 * Fix okonomiyaki support for python 3.8 setuptools eggs Make sure that python 3.8 setuptools eggs can be correctly parsed into SetuptoolsEggMetadata * Fix flake8 errors --- okonomiyaki/file_formats/legacy.py | 9 +- okonomiyaki/file_formats/setuptools_egg.py | 8 +- okonomiyaki/file_formats/tests/common.py | 11 +- okonomiyaki/file_formats/tests/test_legacy.py | 248 ++++++++++++------ .../tests/test_setuptools_file_format.py | 74 +++++- ...raits-6.3.0.dev1702-py3.8-linux-x86_64.egg | Bin 0 -> 5508 bytes ....3.0.dev1702-py3.8-macosx-10.14-x86_64.egg | Bin 0 -> 5510 bytes .../traits-6.3.0.dev1702-py3.8-win-amd64.egg | Bin 0 -> 5528 bytes okonomiyaki/runtimes/runtime_metadata.py | 2 +- .../eggs/osx_x86_64/cp38/nose-1.3.4-1.egg | Bin 1571 -> 1581 bytes .../eggs/osx_x86_64/cp38/numpy-1.9.2-1.egg | Bin 1378 -> 1386 bytes .../eggs/rh7_x86_64/cp38/nose-1.3.4-1.egg | Bin 1571 -> 1580 bytes .../eggs/rh7_x86_64/cp38/numpy-1.9.2-1.egg | Bin 1377 -> 1384 bytes .../eggs/win_x86_64/cp38/nose-1.3.4-1.egg | Bin 1567 -> 1577 bytes .../eggs/win_x86_64/cp38/numpy-1.9.2-1.egg | Bin 1372 -> 1382 bytes okonomiyaki/utils/tests/test_eggs.py | 2 +- 16 files changed, 264 insertions(+), 90 deletions(-) create mode 100644 okonomiyaki/repositories/tests/data/traits-6.3.0.dev1702-py3.8-linux-x86_64.egg create mode 100644 okonomiyaki/repositories/tests/data/traits-6.3.0.dev1702-py3.8-macosx-10.14-x86_64.egg create mode 100644 okonomiyaki/repositories/tests/data/traits-6.3.0.dev1702-py3.8-win-amd64.egg diff --git a/okonomiyaki/file_formats/legacy.py b/okonomiyaki/file_formats/legacy.py index e88b5f6c..bdbc47fd 100644 --- a/okonomiyaki/file_formats/legacy.py +++ b/okonomiyaki/file_formats/legacy.py @@ -5,7 +5,7 @@ from ..errors import InvalidMetadataField from ..platforms import PythonImplementation, default_abi - +from ..versions import RuntimeVersion # To parse the python field in our index and spec/depend _PYVER_RE = re.compile(r"(?P\d+)\.(?P\d+)") @@ -35,8 +35,11 @@ def _guess_abi_tag(epd_platform, python_tag): # # In those cases, the mapping (platform pyver) -> ABI is unambiguous, # as we only ever used one ABI for a given python version/platform. - pyver = _python_tag_to_python(python_tag) - return u"cp{0}{1}m".format(pyver[0], pyver[2]) + pyver = RuntimeVersion.from_string(_python_tag_to_python(python_tag)) + if pyver >= RuntimeVersion.from_string('3.8'): + return u"cp{0}{1}".format(pyver.major, pyver.minor) + else: + return u"cp{0}{1}m".format(pyver.major, pyver.minor) def _guess_platform_abi(epd_platform, python_tag): diff --git a/okonomiyaki/file_formats/setuptools_egg.py b/okonomiyaki/file_formats/setuptools_egg.py index 6d76b196..dc878b04 100644 --- a/okonomiyaki/file_formats/setuptools_egg.py +++ b/okonomiyaki/file_formats/setuptools_egg.py @@ -82,7 +82,11 @@ def _guess_abi_from_python(python): # # In those cases, the mapping (platform pyver) -> ABI is unambiguous, # as we only ever used one ABI for a given python version/platform. - return "cp{0}{1}m".format(python.major, python.minor) + if python.major >= 3 and python.minor >= 8: + # Python 3.8 has removed the `m` from the abi tag + return u"cp{0}{1}".format(python.major, python.minor) + else: + return u"cp{0}{1}m".format(python.major, python.minor) def _guess_abi_from_running_python(): @@ -104,7 +108,6 @@ def _guess_abi_from_running_python(): def _guess_abi(platform, python): if platform is None: return None - if python is not None: if (python.major, python.minor) != sys.version_info[:2]: return _guess_abi_from_python(python) @@ -128,7 +131,6 @@ def from_egg(cls, path, platform=None, python=_UNSPECIFIED, abi_tag=_UNSPECIFIED): filename = os.path.basename(path) name, version, pyver, platform_string = parse_filename(filename) - if platform is None and platform_string is not None: msg = ("Platform-specific egg detected: you need to specify a " "platform argument that is not None to from_egg") diff --git a/okonomiyaki/file_formats/tests/common.py b/okonomiyaki/file_formats/tests/common.py index 17b40fef..441c6c3a 100644 --- a/okonomiyaki/file_formats/tests/common.py +++ b/okonomiyaki/file_formats/tests/common.py @@ -4,8 +4,8 @@ from ... import repositories -DATA_DIR = os.path.join(os.path.dirname(repositories.__file__), - "tests", "data") +DATA_DIR = os.path.join( + os.path.dirname(repositories.__file__), "tests", "data") ENSTALLER_EGG = os.path.join(DATA_DIR, "enstaller-4.5.0-1.egg") ETS_EGG = os.path.join(DATA_DIR, "ets-4.3.0-3.egg") @@ -477,6 +477,13 @@ PIP_SETUPTOOLS_EGG = os.path.join(DATA_DIR, "pip-7.0.3-py3.4.egg") +TRAITS_SETUPTOOLS_OSX_cp38_EGG = os.path.join( + DATA_DIR, "traits-6.3.0.dev1702-py3.8-macosx-10.14-x86_64.egg") +TRAITS_SETUPTOOLS_LINUX_cp38_EGG = os.path.join( + DATA_DIR, "traits-6.3.0.dev1702-py3.8-linux-x86_64.egg") +TRAITS_SETUPTOOLS_WIN_cp38_EGG = os.path.join( + DATA_DIR, "traits-6.3.0.dev1702-py3.8-win-amd64.egg") + FAKE_PYSIDE_1_1_0_EGG_PKG_INFO = u"""\ ============ About PySide diff --git a/okonomiyaki/file_formats/tests/test_legacy.py b/okonomiyaki/file_formats/tests/test_legacy.py index 55bdb024..0202c5dd 100644 --- a/okonomiyaki/file_formats/tests/test_legacy.py +++ b/okonomiyaki/file_formats/tests/test_legacy.py @@ -10,83 +10,83 @@ from okonomiyaki.platforms import EPDPlatform -from ..legacy import _guess_platform_abi - -#: Known platforms that at some point have been uploaded into an EDS -#: server. -CONFIGURATIONS = { - ('cp27', 'osx_x86'): 'darwin', - ('cp27', 'osx_x86_64'): 'darwin', - ('cp27', 'rh5_x86'): 'gnu', - ('cp27', 'rh5_x86_64'): 'gnu', - ('cp27', 'win_x86'): 'msvc2008', - ('cp27', 'win_x86_64'): 'msvc2008', - ('cp30', 'osx_x86'): 'darwin', - ('cp30', 'osx_x86_64'): 'darwin', - ('cp30', 'rh5_x86'): 'gnu', - ('cp30', 'rh5_x86_64'): 'gnu', - ('cp30', 'win_x86'): 'msvc2008', - ('cp30', 'win_x86_64'): 'msvc2008', - ('cp31', 'osx_x86'): 'darwin', - ('cp31', 'osx_x86_64'): 'darwin', - ('cp31', 'rh5_x86'): 'gnu', - ('cp31', 'rh5_x86_64'): 'gnu', - ('cp31', 'win_x86'): 'msvc2008', - ('cp31', 'win_x86_64'): 'msvc2008', - ('cp32', 'osx_x86'): 'darwin', - ('cp32', 'osx_x86_64'): 'darwin', - ('cp32', 'rh5_x86'): 'gnu', - ('cp32', 'rh5_x86_64'): 'gnu', - ('cp32', 'win_x86'): 'msvc2008', - ('cp32', 'win_x86_64'): 'msvc2008', - ('cp33', 'osx_x86'): 'darwin', - ('cp33', 'osx_x86_64'): 'darwin', - ('cp33', 'rh5_x86'): 'gnu', - ('cp33', 'rh5_x86_64'): 'gnu', - ('cp33', 'win_x86'): 'msvc2010', - ('cp33', 'win_x86_64'): 'msvc2010', - ('cp34', 'osx_x86'): 'darwin', - ('cp34', 'osx_x86_64'): 'darwin', - ('cp34', 'rh5_x86'): 'gnu', - ('cp34', 'rh5_x86_64'): 'gnu', - ('cp34', 'win_x86'): 'msvc2010', - ('cp34', 'win_x86_64'): 'msvc2010', - ('cp36', 'osx_x86'): 'darwin', - ('cp36', 'osx_x86_64'): 'darwin', - ('cp36', 'rh6_x86'): 'gnu', - ('cp36', 'rh6_x86_64'): 'gnu', - ('cp36', 'rh7_x86'): 'gnu', - ('cp36', 'rh7_x86_64'): 'gnu', - ('cp36', 'win_x86'): 'msvc2015', - ('cp36', 'win_x86_64'): 'msvc2015', - ('cp38', 'osx_x86'): 'darwin', - ('cp38', 'osx_x86_64'): 'darwin', - ('cp38', 'rh7_x86'): 'gnu', - ('cp38', 'rh7_x86_64'): 'gnu', - ('cp38', 'win_x86'): 'msvc2019', - ('cp38', 'win_x86_64'): 'msvc2019', - ('ip27', 'osx_x86'): 'darwin', - ('ip27', 'osx_x86_64'): 'darwin', - ('ip27', 'rh5_x86'): 'gnu', - ('ip27', 'rh5_x86_64'): 'gnu', - ('ip27', 'win_x86'): 'msvc2008', - ('ip27', 'win_x86_64'): 'msvc2008', - ('jy27', 'osx_x86'): 'darwin', - ('jy27', 'osx_x86_64'): 'darwin', - ('jy27', 'rh5_x86'): 'gnu', - ('jy27', 'rh5_x86_64'): 'gnu', - ('jy27', 'win_x86'): 'msvc2008', - ('jy27', 'win_x86_64'): 'msvc2008', - ('pp27', 'osx_x86'): 'darwin', - ('pp27', 'osx_x86_64'): 'darwin', - ('pp27', 'rh5_x86'): 'gnu', - ('pp27', 'rh5_x86_64'): 'gnu', - ('pp27', 'win_x86'): 'msvc2008', - ('pp27', 'win_x86_64'): 'msvc2008'} +from ..legacy import _guess_platform_abi, _guess_abi_tag class TestGuessPlatformABI(unittest.TestCase): + #: Known platforms that at some point have been uploaded into an EDS + #: server. + CONFIGURATIONS = { + ('cp27', 'osx_x86'): 'darwin', + ('cp27', 'osx_x86_64'): 'darwin', + ('cp27', 'rh5_x86'): 'gnu', + ('cp27', 'rh5_x86_64'): 'gnu', + ('cp27', 'win_x86'): 'msvc2008', + ('cp27', 'win_x86_64'): 'msvc2008', + ('cp30', 'osx_x86'): 'darwin', + ('cp30', 'osx_x86_64'): 'darwin', + ('cp30', 'rh5_x86'): 'gnu', + ('cp30', 'rh5_x86_64'): 'gnu', + ('cp30', 'win_x86'): 'msvc2008', + ('cp30', 'win_x86_64'): 'msvc2008', + ('cp31', 'osx_x86'): 'darwin', + ('cp31', 'osx_x86_64'): 'darwin', + ('cp31', 'rh5_x86'): 'gnu', + ('cp31', 'rh5_x86_64'): 'gnu', + ('cp31', 'win_x86'): 'msvc2008', + ('cp31', 'win_x86_64'): 'msvc2008', + ('cp32', 'osx_x86'): 'darwin', + ('cp32', 'osx_x86_64'): 'darwin', + ('cp32', 'rh5_x86'): 'gnu', + ('cp32', 'rh5_x86_64'): 'gnu', + ('cp32', 'win_x86'): 'msvc2008', + ('cp32', 'win_x86_64'): 'msvc2008', + ('cp33', 'osx_x86'): 'darwin', + ('cp33', 'osx_x86_64'): 'darwin', + ('cp33', 'rh5_x86'): 'gnu', + ('cp33', 'rh5_x86_64'): 'gnu', + ('cp33', 'win_x86'): 'msvc2010', + ('cp33', 'win_x86_64'): 'msvc2010', + ('cp34', 'osx_x86'): 'darwin', + ('cp34', 'osx_x86_64'): 'darwin', + ('cp34', 'rh5_x86'): 'gnu', + ('cp34', 'rh5_x86_64'): 'gnu', + ('cp34', 'win_x86'): 'msvc2010', + ('cp34', 'win_x86_64'): 'msvc2010', + ('cp36', 'osx_x86'): 'darwin', + ('cp36', 'osx_x86_64'): 'darwin', + ('cp36', 'rh6_x86'): 'gnu', + ('cp36', 'rh6_x86_64'): 'gnu', + ('cp36', 'rh7_x86'): 'gnu', + ('cp36', 'rh7_x86_64'): 'gnu', + ('cp36', 'win_x86'): 'msvc2015', + ('cp36', 'win_x86_64'): 'msvc2015', + ('cp38', 'osx_x86'): 'darwin', + ('cp38', 'osx_x86_64'): 'darwin', + ('cp38', 'rh7_x86'): 'gnu', + ('cp38', 'rh7_x86_64'): 'gnu', + ('cp38', 'win_x86'): 'msvc2019', + ('cp38', 'win_x86_64'): 'msvc2019', + ('ip27', 'osx_x86'): 'darwin', + ('ip27', 'osx_x86_64'): 'darwin', + ('ip27', 'rh5_x86'): 'gnu', + ('ip27', 'rh5_x86_64'): 'gnu', + ('ip27', 'win_x86'): 'msvc2008', + ('ip27', 'win_x86_64'): 'msvc2008', + ('jy27', 'osx_x86'): 'darwin', + ('jy27', 'osx_x86_64'): 'darwin', + ('jy27', 'rh5_x86'): 'gnu', + ('jy27', 'rh5_x86_64'): 'gnu', + ('jy27', 'win_x86'): 'msvc2008', + ('jy27', 'win_x86_64'): 'msvc2008', + ('pp27', 'osx_x86'): 'darwin', + ('pp27', 'osx_x86_64'): 'darwin', + ('pp27', 'rh5_x86'): 'gnu', + ('pp27', 'rh5_x86_64'): 'gnu', + ('pp27', 'win_x86'): 'msvc2008', + ('pp27', 'win_x86_64'): 'msvc2008'} + @given(sampled_from(sorted(CONFIGURATIONS))) def test_known_cases(self, configuration): # given @@ -96,7 +96,7 @@ def test_known_cases(self, configuration): result = _guess_platform_abi(epd_platform, configuration[0]) # then - expected = CONFIGURATIONS[configuration] + expected = self.CONFIGURATIONS[configuration] self.assertEqual( result, expected, msg="{} gives {} instead of {}".format( @@ -149,3 +149,103 @@ def test_no_python_implementation(self): # Then self.assertEqual(abi, "msvc2008") + + +class TestGuessABITag(unittest.TestCase): + + #: Known platforms that at some point have been uploaded into an EDS + #: server. Note that only cpython and pypy implementations are + #: supported + CONFIGURATIONS = { + ('cp27', 'osx_x86'): 'cp27m', + ('cp27', 'osx_x86_64'): 'cp27m', + ('cp27', 'rh5_x86'): 'cp27m', + ('cp27', 'rh5_x86_64'): 'cp27m', + ('cp27', 'win_x86'): 'cp27m', + ('cp27', 'win_x86_64'): 'cp27m', + ('cp30', 'osx_x86'): 'cp30m', + ('cp30', 'osx_x86_64'): 'cp30m', + ('cp30', 'rh5_x86'): 'cp30m', + ('cp30', 'rh5_x86_64'): 'cp30m', + ('cp30', 'win_x86'): 'cp30m', + ('cp30', 'win_x86_64'): 'cp30m', + ('cp31', 'osx_x86'): 'cp31m', + ('cp31', 'osx_x86_64'): 'cp31m', + ('cp31', 'rh5_x86'): 'cp31m', + ('cp31', 'rh5_x86_64'): 'cp31m', + ('cp31', 'win_x86'): 'cp31m', + ('cp31', 'win_x86_64'): 'cp31m', + ('cp32', 'osx_x86'): 'cp32m', + ('cp32', 'osx_x86_64'): 'cp32m', + ('cp32', 'rh5_x86'): 'cp32m', + ('cp32', 'rh5_x86_64'): 'cp32m', + ('cp32', 'win_x86'): 'cp32m', + ('cp32', 'win_x86_64'): 'cp32m', + ('cp33', 'osx_x86'): 'cp33m', + ('cp33', 'osx_x86_64'): 'cp33m', + ('cp33', 'rh5_x86'): 'cp33m', + ('cp33', 'rh5_x86_64'): 'cp33m', + ('cp33', 'win_x86'): 'cp33m', + ('cp33', 'win_x86_64'): 'cp33m', + ('cp34', 'osx_x86'): 'cp34m', + ('cp34', 'osx_x86_64'): 'cp34m', + ('cp34', 'rh5_x86'): 'cp34m', + ('cp34', 'rh5_x86_64'): 'cp34m', + ('cp34', 'win_x86'): 'cp34m', + ('cp34', 'win_x86_64'): 'cp34m', + ('cp36', 'osx_x86'): 'cp36m', + ('cp36', 'osx_x86_64'): 'cp36m', + ('cp36', 'rh6_x86'): 'cp36m', + ('cp36', 'rh6_x86_64'): 'cp36m', + ('cp36', 'rh7_x86'): 'cp36m', + ('cp36', 'rh7_x86_64'): 'cp36m', + ('cp36', 'win_x86'): 'cp36m', + ('cp36', 'win_x86_64'): 'cp36m', + ('cp38', 'osx_x86'): 'cp38', + ('cp38', 'osx_x86_64'): 'cp38', + ('cp38', 'rh7_x86'): 'cp38', + ('cp38', 'rh7_x86_64'): 'cp38', + ('cp38', 'win_x86'): 'cp38', + ('cp38', 'win_x86_64'): 'cp38', + ('pp27', 'osx_x86'): 'cp27m', + ('pp27', 'osx_x86_64'): 'cp27m', + ('pp27', 'rh5_x86'): 'cp27m', + ('pp27', 'rh5_x86_64'): 'cp27m', + ('pp27', 'win_x86'): 'cp27m', + ('pp27', 'win_x86_64'): 'cp27m'} + + @given(sampled_from(sorted(CONFIGURATIONS))) + def test_known_cases(self, configuration): + # given + epd_platform = EPDPlatform.from_string(configuration[1]) + + # when + result = _guess_abi_tag(epd_platform, configuration[0]) + + # then + expected = self.CONFIGURATIONS[configuration] + self.assertEqual( + result, expected, + msg="{} gives {} instead of {}".format( + configuration, result, expected)) + + @given(sampled_from( + ['cp27', 'cp30', 'cp31', 'cp34', 'cp36', 'cp38'])) + def test_no_platform(self, python_tag): + # When + abi = _guess_abi_tag(None, python_tag) + + # Then + self.assertIsNone(abi) + + @given(sampled_from( + ['rh5-64', 'rh6-64', 'rh7-64', 'win-32', 'win-64', 'osx-64'])) + def test_no_python_implementation(self, platform_tag): + # Given + platform = EPDPlatform.from_epd_string(platform_tag) + + # When + abi = _guess_abi_tag(platform, None) + + # Then + self.assertIsNone(abi) diff --git a/okonomiyaki/file_formats/tests/test_setuptools_file_format.py b/okonomiyaki/file_formats/tests/test_setuptools_file_format.py index 8f3708bf..1a4ed790 100644 --- a/okonomiyaki/file_formats/tests/test_setuptools_file_format.py +++ b/okonomiyaki/file_formats/tests/test_setuptools_file_format.py @@ -5,10 +5,13 @@ else: import unittest -from ...errors import OkonomiyakiError -from ...platforms import EPDPlatform +from okonomiyaki.errors import OkonomiyakiError +from okonomiyaki.platforms import EPDPlatform +from okonomiyaki.versions import RuntimeVersion from ..setuptools_egg import SetuptoolsEggMetadata, parse_filename -from .common import PIP_SETUPTOOLS_EGG, TRAITS_SETUPTOOLS_EGG +from .common import ( + PIP_SETUPTOOLS_EGG, TRAITS_SETUPTOOLS_EGG, TRAITS_SETUPTOOLS_OSX_cp38_EGG, + TRAITS_SETUPTOOLS_WIN_cp38_EGG, TRAITS_SETUPTOOLS_LINUX_cp38_EGG) class TestParseFilename(unittest.TestCase): @@ -92,8 +95,7 @@ def test_simple(self): # When metadata = SetuptoolsEggMetadata.from_egg( - path, platform, python_tag, abi_tag, - ) + path, platform, python_tag, abi_tag) # Then self.assertEqual(metadata.name, "pip") @@ -105,9 +107,9 @@ def test_simple(self): def test_platform_specific(self): # Given path = TRAITS_SETUPTOOLS_EGG + platform = EPDPlatform.from_epd_string("osx-64") # When - platform = EPDPlatform.from_epd_string("osx-64") metadata = SetuptoolsEggMetadata.from_egg(path, platform) # Then @@ -120,3 +122,63 @@ def test_platform_specific(self): # When/Then with self.assertRaises(OkonomiyakiError): SetuptoolsEggMetadata.from_egg(path) + + def test_macos_cp38_egg(self): + # Given + path = TRAITS_SETUPTOOLS_OSX_cp38_EGG + python = RuntimeVersion.from_string('3.8.10') + platform = EPDPlatform.from_epd_string("osx-64", python) + + # When + metadata = SetuptoolsEggMetadata.from_egg(path, platform) + + # Then + self.assertEqual(metadata.name, "traits") + self.assertEqual(metadata.version, "6.3.0.dev1702") + self.assertEqual(metadata.python_tag, "cp38") + self.assertEqual(metadata.abi_tag, "cp38") + self.assertEqual(metadata.platform_tag, "macosx_10_14_x86_64") + + # When/Then + with self.assertRaises(OkonomiyakiError): + SetuptoolsEggMetadata.from_egg(path) + + def test_linux_cp38_egg(self): + # Given + path = TRAITS_SETUPTOOLS_LINUX_cp38_EGG + python = RuntimeVersion.from_string('3.8.10') + platform = EPDPlatform.from_epd_string("rh7-64", python) + + # When + metadata = SetuptoolsEggMetadata.from_egg(path, platform) + + # Then + self.assertEqual(metadata.name, "traits") + self.assertEqual(metadata.version, "6.3.0.dev1702") + self.assertEqual(metadata.python_tag, "cp38") + self.assertEqual(metadata.abi_tag, "cp38") + self.assertEqual(metadata.platform_tag, "linux_x86_64") + + # When/Then + with self.assertRaises(OkonomiyakiError): + SetuptoolsEggMetadata.from_egg(path) + + def test_windows_cp38_egg(self): + # Given + path = TRAITS_SETUPTOOLS_WIN_cp38_EGG + python = RuntimeVersion.from_string('3.8.10') + platform = EPDPlatform.from_epd_string("win-64", python) + + # When + metadata = SetuptoolsEggMetadata.from_egg(path, platform) + + # Then + self.assertEqual(metadata.name, "traits") + self.assertEqual(metadata.version, "6.3.0.dev1702") + self.assertEqual(metadata.python_tag, "cp38") + self.assertEqual(metadata.abi_tag, "cp38") + self.assertEqual(metadata.platform_tag, "win_amd64") + + # When/Then + with self.assertRaises(OkonomiyakiError): + SetuptoolsEggMetadata.from_egg(path) diff --git a/okonomiyaki/repositories/tests/data/traits-6.3.0.dev1702-py3.8-linux-x86_64.egg b/okonomiyaki/repositories/tests/data/traits-6.3.0.dev1702-py3.8-linux-x86_64.egg new file mode 100644 index 0000000000000000000000000000000000000000..eb6fe9e9aa9d3d7cbfcc44f814dbc7372879aefc GIT binary patch literal 5508 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 literal 0 HcmV?d00001 diff --git a/okonomiyaki/repositories/tests/data/traits-6.3.0.dev1702-py3.8-macosx-10.14-x86_64.egg b/okonomiyaki/repositories/tests/data/traits-6.3.0.dev1702-py3.8-macosx-10.14-x86_64.egg new file mode 100644 index 0000000000000000000000000000000000000000..b11889f315255a5bb2bf4cd5d27ad909b525aed3 GIT binary patch literal 5510 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�M7hJ-fpQt!o?RMjdj*yt6m0% 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 literal 0 HcmV?d00001 diff --git a/okonomiyaki/runtimes/runtime_metadata.py b/okonomiyaki/runtimes/runtime_metadata.py index 244cee0e..991df3c3 100644 --- a/okonomiyaki/runtimes/runtime_metadata.py +++ b/okonomiyaki/runtimes/runtime_metadata.py @@ -255,7 +255,7 @@ def _parse_from_path(path): abi = abi_string version = RuntimeVersion.from_string(version_string) - epd_platform = EPDPlatform.from_epd_string(platform_string) + epd_platform = EPDPlatform.from_epd_string(platform_string, version) return implementation, version, epd_platform.platform, abi diff --git a/okonomiyaki/utils/test_data/eggs/osx_x86_64/cp38/nose-1.3.4-1.egg b/okonomiyaki/utils/test_data/eggs/osx_x86_64/cp38/nose-1.3.4-1.egg index 7efa240a377b737273855e08a55f5cb835c7e62f..0d7531936010a43ea21d05e947f5d18bf44bcb8c 100644 GIT binary patch delta 313 zcmZ3?vzBMW6J}w_xEnz%X$DuOGcYiG17Z;dnaLAbMe9RDI2o7)ldmLzaA^fM10%}| zW(Ec@5!&m^b;v-Z<@#P+mJ52%f6tIyZLE2! zMPGLE$90zGJ=RNQ8#4Li~#6 Y&&j7)wHWtL{>rMtbqA>0niZrE0FF>-jsO4v delta 330 zcmZ3>vzTYY6XyEcu{l9s7hXR!mw|zSosoe-1W3EOyX$)Tx%ulC7o;ZZr=%97=B0$5 zbL46^5MaGft59C>+)qlR@Ur$7rlmZ|ld@KLs(40M|MrVw**xca`}yrw3lFt?xTGlc zepPX3_p;TN#Tljh=Jd}xr<7kW|M;>_mqWoZNjA&p0&8Ct?{L$b@y_l>4%gw^7Ebb0 zJ3C)In!9Yi|E&L0bBzP`aI4JObZYC_p2e13wp-rk1^(L6Xwmp0LApxAjKNgITEpq* z0Z;cwuX{J^Pu|b6Kgk~Kcn$_kFR1`M1p*2{e2W>o2f4tq3=E765)AC=rKzUk*BO^& c*MMmlfASSpEyk6T|Ff!ay#N}e$_gYH0D&BN(f|Me diff --git a/okonomiyaki/utils/test_data/eggs/osx_x86_64/cp38/numpy-1.9.2-1.egg b/okonomiyaki/utils/test_data/eggs/osx_x86_64/cp38/numpy-1.9.2-1.egg index 4bdbbb635856d4163e5d74a23822a3ca03d0830c..69a0ec3b7c8a2d90b6ad56c90afef4f1e0c9a928 100644 GIT binary patch delta 328 zcmaFF^@?kQ1hcSc+>M|*mB%%`cUw%UJgIQu4Rx@+guTV1JT8>O;eyPpd>S7bMhHNO6H zMEw8e!@pX4zXaZE6sWR|=kT7KbN&UN+y~alADOqQ$uWz7Jja0PRSBRt0|U_44BHwf opJkDd2n}I{_!`Z}lQ~(nm{?gR^RkFf_F?7Wx&zcw!2;3@0QksoXaE2J delta 344 zcmaFG^@wYO1atlC*qop#t{0APWME*BW@KOx0n)DS?z*0SZvOhk1*ysUDX9gic`2di zeEFIT1Xv%`PQJI$+RST>KohtBgY&FCnQT!DCvIyIYrSpVtJwIoCjVJ#50`>s!;cjQ zv(sGNH;hi^K`*FL;?awLhCnrympUld#P0b$cAr1yiZ>j)23IYm1JozDu zgbEj!$-uzKAi;2Gc1x+L_;p6k=58s1<+SDbS6!{u+4KJQyL+G80+bil z%(C1m(N(Ot>XU}T0&^KBAGZVNuD$tvwAbo67el(~2FLZYbCwCdluJLKQIZ(R&y;jY zPjK>T^NZptm8Z(}rS?rNy~*_>)iYz}%9ZB?s<*R8|8%owF3OeuX|MZPK3ZB#&+V&2 zc97b3zIy@Q%q){Huu4rn&azNVj#&ig8x96c|49JF85kIWcw6J-K2`~d&=6LLSJAvV X`4p=bFaP;oYt23T05S9Avcx&~+`h5RIjUQ|8y^dY$G@(HuPRr$O zY@yz%T~^cPSZ?T=^f~b9j@Pr_yUgD*Q8MeCMYDlVNYhl^shiyxYknl0>?zB%O!*S{ zs>3B*Rlnhp%jEny*N*yLefmeZ(O?o^u`|!!dtG<$DEz-K=zYEGuDDB`*Vh-9cFDD= z_h_Z$8#`XdPxQ7DG*Qq;#Y^?DqJssd{tH;!2kdl ClY<8U diff --git a/okonomiyaki/utils/test_data/eggs/rh7_x86_64/cp38/numpy-1.9.2-1.egg b/okonomiyaki/utils/test_data/eggs/rh7_x86_64/cp38/numpy-1.9.2-1.egg index 5fc69f3677818dde7a3ff3e59fef91ae459b0977..540c9c5b344738e9b697e9655146174afb61dbe1 100644 GIT binary patch delta 322 zcmaFJ^@3}I1heqR*c(Bir!@GMGcYi)FfuTRFvv_k&mvkM8p6rId^G7w0tlB@a5FHn zykG_@0TH3Sd-)D2h_rtHEs~?-b!676=G~pUc1Strac?`~G@EHzZM9==((%u8?HAj4 zebI~(FzI;X~pDT-C`E&JG6$9H7I>7)O*cIfbGFv&-)9dyM?sf z3Jc5w#lw?lHHT#^X}xgm!0p@I7Y|h2zgu7KRypB;V@=5WlI)wEsy263r$iWVX-oT< zAFDDf@Yz1GYk{<6W3UtFm(*TggQEVQ>lpuMRX1PDkY@AQ;+OS&;ybT-2fLa5`u5Ee zOV5;hJ)eVLH0!28>WP3CJ7?VF{qkSd@JaQ?3dbWF+q9*ZeGS;RFi7uKv(T|gx1XN+ zp?3C~O=RGwB~Q2~GqY?{vj@7Kfq{bo(@!cuaS%`d;>q_}BviP-Oa=x<1__2$mO{5p q#IG~z&65JtF#cqIRxPFv%#-C=#Ki)sUg@uGDb*q$Zm)WD!bjaxfPFh_cIncPuzG$` z*^Qr4FaBL;T`2XH**%&gKK}z_fHyPCNlMk~j43lFP0eX#t0n@V*Kyd~JMj+nS jcnjzs>|SSucpc5#laH}#G47uHkyVB34$uH|R*+Euw2^qr delta 307 zcmZ3N=S8B(iO3pjq{m_(fb_T)wJsIzPX5Wc{hmdbTV7HypArvOB-)ZpUFGhF@%Z&uW|# zKNmN7H_LuCd$7Yf7%;t~0`w3FC;;)~1*{S(Two>x10#b3L#PI~sj2vN#s%y`U>e4s Xe1TPqap~mWtSVeDfcg|!fdm5pdkJuu diff --git a/okonomiyaki/utils/test_data/eggs/win_x86_64/cp38/numpy-1.9.2-1.egg b/okonomiyaki/utils/test_data/eggs/win_x86_64/cp38/numpy-1.9.2-1.egg index 94f8e6562f8e0c54958445b52740b69cd03513aa..e1d3144d08764c27507f63d2e65bda4131cbf9de 100644 GIT binary patch delta 391 zcmcb^^^9wS1am!8+>M}}8eSPo85kJ;1F;B$41=q?yRN67o4L29yoN@_uBUP@>P zCj;~2q$>#^Tw1}+z{v7~nSlXJ#P<5~H5mxBelPBNx9j4uCc{l1SpLNvkTANy)w{)H zOTv!5mo>O!_Psy*``D`vF6C*H<(gi~S{v#eo!4CNygImG@mJ&a(AbV1XVY1Jfzuc) zuHkM@MdHZVV?Y+S&9d2 X3Xo`EWMrAF&#KII2goU50SN;DV-AOp delta 313 zcmaFHb%$$%1hdfM*qorPd$jddGcYg+F)}cSFigJBB32*U>&@3>AmaMmcUSwl85#={ zdU#?Q=krQ9%jLGZ-4cp2cyn*x0#2(v&;RvsDJVLat~{8XesiL#&0WmYeBviP-Oa=x<1_=hsS1GEd;@257 iH|2n77=JP^s}|F1=E<@w;*$eddAMExHOH|42?hY|HgBx} diff --git a/okonomiyaki/utils/tests/test_eggs.py b/okonomiyaki/utils/tests/test_eggs.py index ae195e45..4ef16479 100644 --- a/okonomiyaki/utils/tests/test_eggs.py +++ b/okonomiyaki/utils/tests/test_eggs.py @@ -22,7 +22,7 @@ def test_cp38_egg_metadata_valid(self, filepath): self.assertEqual(metadata.abi_tag, None) else: self.assertEqual(metadata.python_tag, 'cp38') - self.assertEqual(metadata.abi_tag, 'cp38m') + self.assertEqual(metadata.abi_tag, 'cp38') if 'osx' in filepath: self.assertEqual(metadata.platform_tag, 'macosx_10_14_x86_64') self.assertEqual(metadata.platform_abi, PlatformABI(u'darwin'))