Commit 7d9c21a8 authored by Jason R. Coombs's avatar Jason R. Coombs

Prefer packaging library if available.

parent a9541756
......@@ -14,6 +14,8 @@ The package resource API is designed to work with normal filesystem packages,
method.
"""
from __future__ import absolute_import
import sys
import os
import io
......@@ -73,13 +75,15 @@ try:
except ImportError:
pass
# Import packaging.version.parse as parse_version for a compat shim with the
# old parse_version that used to be defined in this file.
from setuptools._vendor.packaging.version import parse as parse_version
try:
import packaging.version
except ImportError:
# fallback to vendored version
import setuptools._vendor.packaging.version
packaging = setuptools._vendor.packaging
from setuptools._vendor.packaging.version import (
Version, InvalidVersion, Specifier,
)
# For compatibility, expose packaging.version.parse as parse_version
parse_version = packaging.version.parse
_state_vars = {}
......@@ -1156,8 +1160,8 @@ def safe_version(version):
"""
try:
# normalize the version
return str(Version(version))
except InvalidVersion:
return str(packaging.version.Version(version))
except packaging.version.InvalidVersion:
version = version.replace(' ','.')
return re.sub('[^A-Za-z0-9.]+', '-', version)
......@@ -2395,7 +2399,7 @@ class Distribution(object):
def as_requirement(self):
"""Return a ``Requirement`` that matches this distribution exactly"""
if isinstance(self.parsed_version, Version):
if isinstance(self.parsed_version, packaging.version.Version):
spec = "%s==%s" % (self.project_name, self.parsed_version)
else:
spec = "%s===%s" % (self.project_name, self.parsed_version)
......@@ -2661,7 +2665,7 @@ class Requirement:
"""DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!"""
self.unsafe_name, project_name = project_name, safe_name(project_name)
self.project_name, self.key = project_name, project_name.lower()
self.specifier = Specifier(
self.specifier = packaging.version.Specifier(
",".join(["".join([x, y]) for x, y in specs])
)
self.specs = specs
......
......@@ -198,6 +198,9 @@ setup_params = dict(
Topic :: System :: Systems Administration
Topic :: Utilities
""").strip().splitlines(),
install_requires=[
"packaging>=14.2,<15.0.dev0",
],
extras_require={
"ssl:sys_platform=='win32'": "wincertstore==0.2",
"certs": "certifi==1.0.1",
......
......@@ -10,12 +10,18 @@ import os
import re
import sys
try:
import packaging.version
except ImportError:
# fallback to vendored version
import setuptools._vendor.packaging.version
packaging = setuptools._vendor.packaging
from setuptools import Command
from setuptools.command.sdist import sdist
from setuptools.compat import basestring, PY3, StringIO
from setuptools import svn_utils
from setuptools.command.sdist import walk_revctrl
from setuptools._vendor.packaging.version import Version
from pkg_resources import (
parse_requirements, safe_name, parse_version,
safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename)
......@@ -72,8 +78,9 @@ class egg_info(Command):
parsed_version = parse_version(self.egg_version)
try:
is_version = isinstance(parsed_version, packaging.version.Version)
spec = (
"%s==%s" if isinstance(parsed_version, Version) else "%s===%s"
"%s==%s" if is_version else "%s===%s"
)
list(
parse_requirements(spec % (self.egg_name, self.egg_version))
......
......@@ -13,11 +13,18 @@ from distutils.core import Distribution as _Distribution
from distutils.errors import (DistutilsOptionError, DistutilsPlatformError,
DistutilsSetupError)
try:
import packaging.version
except ImportError:
# fallback to vendored version
import setuptools._vendor.packaging.version
packaging = setuptools._vendor.packaging
from setuptools.depends import Require
from setuptools.compat import basestring, PY2
from setuptools._vendor.packaging.version import Version, InvalidVersion
import pkg_resources
def _get_unpatched(cls):
"""Protect against re-patching the distutils if reloaded
......@@ -271,7 +278,8 @@ class Distribution(_Distribution):
if self.metadata.version is not None:
try:
normalized_version = str(Version(self.metadata.version))
ver = packaging.version.Version(self.metadata.version)
normalized_version = str(ver)
if self.metadata.version != normalized_version:
warnings.warn(
"The version specified requires normalization, "
......@@ -281,7 +289,7 @@ class Distribution(_Distribution):
)
)
self.metadata.version = normalized_version
except (InvalidVersion, TypeError):
except (packaging.version.InvalidVersion, TypeError):
warnings.warn(
"The version specified (%r) is an invalid version, this "
"may not work as expected with newer versions of "
......
......@@ -8,6 +8,13 @@ import tempfile
import shutil
from unittest import TestCase
try:
import packaging.version
except ImportError:
# fallback to vendored version
import setuptools._vendor.packaging.version
packaging = setuptools._vendor.packaging
import pkg_resources
from pkg_resources import (parse_requirements, VersionConflict, parse_version,
Distribution, EntryPoint, Requirement, safe_version, safe_name,
......@@ -16,7 +23,6 @@ from pkg_resources import (parse_requirements, VersionConflict, parse_version,
from setuptools.command.easy_install import (get_script_header, is_sh,
nt_quote_arg)
from setuptools.compat import StringIO, iteritems, PY3
from setuptools._vendor.packaging.version import Specifier
from .py26compat import skipIf
def safe_repr(obj, short=False):
......@@ -339,7 +345,7 @@ class RequirementsTests(TestCase):
self.assertEqual(r2.extras, ("bar","foo")) # extras are normalized
self.assertEqual(hash(r1), hash(r2))
self.assertEqual(
hash(r1), hash(("twisted", Specifier(">=1.2"),
hash(r1), hash(("twisted", packaging.version.Specifier(">=1.2"),
frozenset(["foo","bar"])))
)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment