Split out pep425 code, add license
diff --git a/dev/_pep425.py b/dev/_pep425.py
new file mode 100644
index 0000000..949686a
--- /dev/null
+++ b/dev/_pep425.py
@@ -0,0 +1,204 @@
+# coding: utf-8
+
+"""
+This file was originally derived from
+https://github.com/pypa/pip/blob/3e713708088aedb1cde32f3c94333d6e29aaf86e/src/pip/_internal/pep425tags.py
+
+The following license covers that code:
+
+Copyright (c) 2008-2018 The pip developers (see AUTHORS.txt file)
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+"""
+
+from __future__ import unicode_literals, division, absolute_import, print_function
+
+import sys
+import os
+import ctypes
+import re
+import platform
+
+if sys.version_info >= (2, 7):
+    import sysconfig
+
+if sys.version_info < (3,):
+    str_cls = unicode  # noqa
+else:
+    str_cls = str
+
+
+def _pep425_implementation():
+    """
+    :return:
+        A 2 character unicode string of the implementation - 'cp' for cpython
+        or 'pp' for PyPy
+    """
+
+    return 'pp' if hasattr(sys, 'pypy_version_info') else 'cp'
+
+
+def _pep425_version():
+    """
+    :return:
+        A tuple of integers representing the Python version number
+    """
+
+    if hasattr(sys, 'pypy_version_info'):
+        return (sys.version_info[0], sys.pypy_version_info.major,
+                sys.pypy_version_info.minor)
+    else:
+        return (sys.version_info[0], sys.version_info[1])
+
+
+def _pep425_supports_manylinux():
+    """
+    :return:
+        A boolean indicating if the machine can use manylinux1 packages
+    """
+
+    try:
+        import _manylinux
+        return bool(_manylinux.manylinux1_compatible)
+    except (ImportError, AttributeError):
+        pass
+
+    # Check for glibc 2.5
+    try:
+        proc = ctypes.CDLL(None)
+        gnu_get_libc_version = proc.gnu_get_libc_version
+        gnu_get_libc_version.restype = ctypes.c_char_p
+
+        ver = gnu_get_libc_version()
+        if not isinstance(ver, str_cls):
+            ver = ver.decode('ascii')
+        match = re.match(r'(\d+)\.(\d+)', ver)
+        return match and match.group(1) == '2' and int(match.group(2)) >= 5
+
+    except (AttributeError):
+        return False
+
+
+def _pep425_get_abi():
+    """
+    :return:
+        A unicode string of the system abi. Will be something like: "cp27m",
+        "cp33m", etc.
+    """
+
+    try:
+        soabi = sysconfig.get_config_var('SOABI')
+        if soabi:
+            if soabi.startswith('cpython-'):
+                return 'cp%s' % soabi.split('-')[1]
+            return soabi.replace('.', '_').replace('-', '_')
+    except (IOError, NameError):
+        pass
+
+    impl = _pep425_implementation()
+    suffix = ''
+    if impl == 'cp':
+        suffix += 'm'
+    if sys.maxunicode == 0x10ffff and sys.version_info < (3, 3):
+        suffix += 'u'
+    return '%s%s%s' % (impl, ''.join(map(str_cls, _pep425_version())), suffix)
+
+
+def _pep425tags():
+    """
+    :return:
+        A list of 3-element tuples with unicode strings or None:
+         [0] implementation tag - cp33, pp27, cp26, py2, py2.py3
+         [1] abi tag - cp26m, None
+         [2] arch tag - linux_x86_64, macosx_10_10_x85_64, etc
+    """
+
+    tags = []
+
+    versions = []
+    version_info = _pep425_version()
+    major = version_info[:-1]
+    for minor in range(version_info[-1], -1, -1):
+        versions.append(''.join(map(str, major + (minor,))))
+
+    impl = _pep425_implementation()
+
+    abis = []
+    abi = _pep425_get_abi()
+    if abi:
+        abis.append(abi)
+    abi3 = _pep425_implementation() == 'cp' and sys.version_info >= (3,)
+    if abi3:
+        abis.append('abi3')
+    abis.append('none')
+
+    if sys.platform == 'darwin':
+        plat_ver = platform.mac_ver()
+        ver_parts = plat_ver[0].split('.')
+        minor = int(ver_parts[1])
+        arch = plat_ver[2]
+        if sys.maxsize == 2147483647:
+            arch = 'i386'
+        arches = []
+        while minor > 5:
+            arches.append('macosx_10_%s_%s' % (minor, arch))
+            arches.append('macosx_10_%s_intel' % (minor,))
+            arches.append('macosx_10_%s_universal' % (minor,))
+            minor -= 1
+    else:
+        if sys.platform == 'win32':
+            if 'amd64' in sys.version.lower():
+                arches = ['win_amd64']
+            arches = [sys.platform]
+        elif hasattr(os, 'uname'):
+            (plat, _, _, _, machine) = os.uname()
+            plat = plat.lower().replace('/', '')
+            machine.replace(' ', '_').replace('/', '_')
+            if plat == 'linux' and sys.maxsize == 2147483647:
+                machine = 'i686'
+            arch = '%s_%s' % (plat, machine)
+            if _pep425_supports_manylinux():
+                arches = [arch.replace('linux', 'manylinux1'), arch]
+            else:
+                arches = [arch]
+
+    for abi in abis:
+        for arch in arches:
+            tags.append(('%s%s' % (impl, versions[0]), abi, arch))
+
+    if abi3:
+        for version in versions[1:]:
+            for arch in arches:
+                tags.append(('%s%s' % (impl, version), 'abi3', arch))
+
+    for arch in arches:
+        tags.append(('py%s' % (versions[0][0]), 'none', arch))
+
+    tags.append(('%s%s' % (impl, versions[0]), 'none', 'any'))
+    tags.append(('%s%s' % (impl, versions[0][0]), 'none', 'any'))
+
+    for i, version in enumerate(versions):
+        tags.append(('py%s' % (version,), 'none', 'any'))
+        if i == 0:
+            tags.append(('py%s' % (version[0]), 'none', 'any'))
+
+    tags.append(('py2.py3', 'none', 'any'))
+
+    return tags