Index: recipe_engine/third_party/setuptools/__init__.py |
diff --git a/recipe_engine/third_party/setuptools/__init__.py b/recipe_engine/third_party/setuptools/__init__.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ca025c305de87e7146a62c3eef240ef1ac728be9 |
--- /dev/null |
+++ b/recipe_engine/third_party/setuptools/__init__.py |
@@ -0,0 +1,150 @@ |
+"""Extensions to the 'distutils' for large or complex distributions""" |
+ |
+import os |
+import sys |
+import distutils.core |
+import distutils.filelist |
+from distutils.core import Command as _Command |
+from distutils.util import convert_path |
+from fnmatch import fnmatchcase |
+ |
+import setuptools.version |
+from setuptools.extension import Extension |
+from setuptools.dist import Distribution, Feature, _get_unpatched |
+from setuptools.depends import Require |
+from setuptools.compat import filterfalse |
+ |
+__all__ = [ |
+ 'setup', 'Distribution', 'Feature', 'Command', 'Extension', 'Require', |
+ 'find_packages' |
+] |
+ |
+__version__ = setuptools.version.__version__ |
+ |
+bootstrap_install_from = None |
+ |
+# If we run 2to3 on .py files, should we also convert docstrings? |
+# Default: yes; assume that we can detect doctests reliably |
+run_2to3_on_doctests = True |
+# Standard package names for fixer packages |
+lib2to3_fixer_packages = ['lib2to3.fixes'] |
+ |
+ |
+class PackageFinder(object): |
+ @classmethod |
+ def find(cls, where='.', exclude=(), include=('*',)): |
+ """Return a list all Python packages found within directory 'where' |
+ |
+ 'where' should be supplied as a "cross-platform" (i.e. URL-style) |
+ path; it will be converted to the appropriate local path syntax. |
+ 'exclude' is a sequence of package names to exclude; '*' can be used |
+ as a wildcard in the names, such that 'foo.*' will exclude all |
+ subpackages of 'foo' (but not 'foo' itself). |
+ |
+ 'include' is a sequence of package names to include. If it's |
+ specified, only the named packages will be included. If it's not |
+ specified, all found packages will be included. 'include' can contain |
+ shell style wildcard patterns just like 'exclude'. |
+ |
+ The list of included packages is built up first and then any |
+ explicitly excluded packages are removed from it. |
+ """ |
+ out = cls._find_packages_iter(convert_path(where)) |
+ out = cls.require_parents(out) |
+ includes = cls._build_filter(*include) |
+ excludes = cls._build_filter('ez_setup', '*__pycache__', *exclude) |
+ out = filter(includes, out) |
+ out = filterfalse(excludes, out) |
+ return list(out) |
+ |
+ @staticmethod |
+ def require_parents(packages): |
+ """ |
+ Exclude any apparent package that apparently doesn't include its |
+ parent. |
+ |
+ For example, exclude 'foo.bar' if 'foo' is not present. |
+ """ |
+ found = [] |
+ for pkg in packages: |
+ base, sep, child = pkg.rpartition('.') |
+ if base and base not in found: |
+ continue |
+ found.append(pkg) |
+ yield pkg |
+ |
+ @staticmethod |
+ def _all_dirs(base_path): |
+ """ |
+ Return all dirs in base_path, relative to base_path |
+ """ |
+ for root, dirs, files in os.walk(base_path, followlinks=True): |
+ for dir in dirs: |
+ yield os.path.relpath(os.path.join(root, dir), base_path) |
+ |
+ @classmethod |
+ def _find_packages_iter(cls, base_path): |
+ dirs = cls._all_dirs(base_path) |
+ suitable = filterfalse(lambda n: '.' in n, dirs) |
+ return ( |
+ path.replace(os.path.sep, '.') |
+ for path in suitable |
+ if cls._looks_like_package(os.path.join(base_path, path)) |
+ ) |
+ |
+ @staticmethod |
+ def _looks_like_package(path): |
+ return os.path.isfile(os.path.join(path, '__init__.py')) |
+ |
+ @staticmethod |
+ def _build_filter(*patterns): |
+ """ |
+ Given a list of patterns, return a callable that will be true only if |
+ the input matches one of the patterns. |
+ """ |
+ return lambda name: any(fnmatchcase(name, pat=pat) for pat in patterns) |
+ |
+class PEP420PackageFinder(PackageFinder): |
+ @staticmethod |
+ def _looks_like_package(path): |
+ return True |
+ |
+find_packages = PackageFinder.find |
+ |
+setup = distutils.core.setup |
+ |
+_Command = _get_unpatched(_Command) |
+ |
+class Command(_Command): |
+ __doc__ = _Command.__doc__ |
+ |
+ command_consumes_arguments = False |
+ |
+ def __init__(self, dist, **kw): |
+ # Add support for keyword arguments |
+ _Command.__init__(self,dist) |
+ for k,v in kw.items(): |
+ setattr(self,k,v) |
+ |
+ def reinitialize_command(self, command, reinit_subcommands=0, **kw): |
+ cmd = _Command.reinitialize_command(self, command, reinit_subcommands) |
+ for k,v in kw.items(): |
+ setattr(cmd,k,v) # update command with keywords |
+ return cmd |
+ |
+distutils.core.Command = Command # we can't patch distutils.cmd, alas |
+ |
+def findall(dir = os.curdir): |
+ """Find all files under 'dir' and return the list of full filenames |
+ (relative to 'dir'). |
+ """ |
+ all_files = [] |
+ for base, dirs, files in os.walk(dir, followlinks=True): |
+ if base==os.curdir or base.startswith(os.curdir+os.sep): |
+ base = base[2:] |
+ if base: |
+ files = [os.path.join(base, f) for f in files] |
+ all_files.extend(filter(os.path.isfile, files)) |
+ return all_files |
+ |
+distutils.filelist.findall = findall # fix findall bug in distutils. |