Hello community, here is the log from the commit of package python3-setuptools for openSUSE:Factory checked in at 2016-09-30 15:25:08 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python3-setuptools (Old) and /work/SRC/openSUSE:Factory/.python3-setuptools.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python3-setuptools" Changes: -------- --- /work/SRC/openSUSE:Factory/python3-setuptools/python3-setuptools.changes 2016-09-23 11:24:42.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.python3-setuptools.new/python3-setuptools.changes 2016-09-30 15:25:09.000000000 +0200 @@ -1,0 +2,13 @@ +Wed Sep 28 04:45:54 UTC 2016 - a...@gmx.de + +- update to version 28.0.0: + * #733: Do not search excluded directories for packages. This + introduced a backwards incompatible change in find_packages() so + that find_packages(exclude=['foo']) == [], excluding subpackages + of foo. Previously, find_packages(exclude=['foo']) == + ['foo.bar'], even though the parent foo package was excluded. + * #795: Bump certifi. + * #719: Suppress decoding errors and instead log a warning when + metadata cannot be decoded. + +------------------------------------------------------------------- Old: ---- setuptools-27.3.0.tar.gz New: ---- setuptools-28.0.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python3-setuptools.spec ++++++ --- /var/tmp/diff_new_pack.Bz7Pn1/_old 2016-09-30 15:25:10.000000000 +0200 +++ /var/tmp/diff_new_pack.Bz7Pn1/_new 2016-09-30 15:25:10.000000000 +0200 @@ -17,7 +17,7 @@ Name: python3-setuptools -Version: 27.3.0 +Version: 28.0.0 Release: 0 Url: http://pypi.python.org/pypi/setuptools Summary: Easily download, build, install, upgrade, and uninstall Python packages ++++++ setuptools-27.3.0.tar.gz -> setuptools-28.0.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/setuptools-27.3.0/CHANGES.rst new/setuptools-28.0.0/CHANGES.rst --- old/setuptools-27.3.0/CHANGES.rst 2016-09-21 03:22:50.000000000 +0200 +++ new/setuptools-28.0.0/CHANGES.rst 2016-09-27 21:53:44.000000000 +0200 @@ -2,6 +2,29 @@ CHANGES ======= +v28.0.0 +------- + +* #733: Do not search excluded directories for packages. + This introduced a backwards incompatible change in ``find_packages()`` + so that ``find_packages(exclude=['foo']) == []``, excluding subpackages of ``foo``. + Previously, ``find_packages(exclude=['foo']) == ['foo.bar']``, + even though the parent ``foo`` package was excluded. + +* #795: Bump certifi. + +* #719: Suppress decoding errors and instead log a warning + when metadata cannot be decoded. + +v27.3.1 +------- + +* #790: In MSVC monkeypatching, explicitly patch each + function by name in the target module instead of inferring + the module from the function's ``__module__``. Improves + compatibility with other packages that might have previously + patched distutils functions (i.e. NumPy). + v27.3.0 ------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/setuptools-27.3.0/PKG-INFO new/setuptools-28.0.0/PKG-INFO --- old/setuptools-27.3.0/PKG-INFO 2016-09-21 03:23:11.000000000 +0200 +++ new/setuptools-28.0.0/PKG-INFO 2016-09-27 21:54:06.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: setuptools -Version: 27.3.0 +Version: 28.0.0 Summary: Easily download, build, install, upgrade, and uninstall Python packages Home-page: https://github.com/pypa/setuptools Author: Python Packaging Authority diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/setuptools-27.3.0/pkg_resources/__init__.py new/setuptools-28.0.0/pkg_resources/__init__.py --- old/setuptools-27.3.0/pkg_resources/__init__.py 2016-09-21 03:22:50.000000000 +0200 +++ new/setuptools-28.0.0/pkg_resources/__init__.py 2016-09-27 21:53:44.000000000 +0200 @@ -1,3 +1,5 @@ +# coding: utf-8 + """ Package resource API -------------------- @@ -1857,17 +1859,21 @@ return name == 'PKG-INFO' and os.path.isfile(self.path) def get_metadata(self, name): - if name == 'PKG-INFO': - with io.open(self.path, encoding='utf-8') as f: - try: - metadata = f.read() - except UnicodeDecodeError as exc: - # add path context to error message - tmpl = " in {self.path}" - exc.reason += tmpl.format(self=self) - raise - return metadata - raise KeyError("No metadata except PKG-INFO is available") + if name != 'PKG-INFO': + raise KeyError("No metadata except PKG-INFO is available") + + with io.open(self.path, encoding='utf-8', errors="replace") as f: + metadata = f.read() + self._warn_on_replacement(metadata) + return metadata + + def _warn_on_replacement(self, metadata): + # Python 2.6 and 3.2 compat for: replacement_char = '�' + replacement_char = b'\xef\xbf\xbd'.decode('utf-8') + if replacement_char in metadata: + tmpl = "{self.path} could not be properly decoded in UTF-8" + msg = tmpl.format(**locals()) + warnings.warn(msg) def get_metadata_lines(self, name): return yield_lines(self.get_metadata(name)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/setuptools-27.3.0/setup.cfg new/setuptools-28.0.0/setup.cfg --- old/setuptools-27.3.0/setup.cfg 2016-09-21 03:23:11.000000000 +0200 +++ new/setuptools-28.0.0/setup.cfg 2016-09-27 21:54:06.000000000 +0200 @@ -1,5 +1,5 @@ [bumpversion] -current_version = 27.3.0 +current_version = 28.0.0 commit = True tag = True diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/setuptools-27.3.0/setup.py new/setuptools-28.0.0/setup.py --- old/setuptools-27.3.0/setup.py 2016-09-21 03:22:50.000000000 +0200 +++ new/setuptools-28.0.0/setup.py 2016-09-27 21:53:44.000000000 +0200 @@ -88,7 +88,7 @@ setup_params = dict( name="setuptools", - version="27.3.0", + version="28.0.0", description="Easily download, build, install, upgrade, and uninstall " "Python packages", author="Python Packaging Authority", @@ -167,11 +167,11 @@ """).strip().splitlines(), extras_require={ "ssl:sys_platform=='win32'": "wincertstore==0.2", - "certs": "certifi==2016.8.8", + "certs": "certifi==2016.8.31", }, dependency_links=[ pypi_link( - 'certifi-2016.8.8.tar.gz#md5=b57513f7670482da45bb350b792f659e', + 'certifi-2016.8.31.tar.gz#md5=2f22d484a36d38d98be74f9eeb2846ec', ), pypi_link( 'wincertstore-0.2.zip#md5=ae728f2f007185648d0c7a8679b361e2', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/setuptools-27.3.0/setuptools/__init__.py new/setuptools-28.0.0/setuptools/__init__.py --- old/setuptools-27.3.0/setuptools/__init__.py 2016-09-21 03:22:50.000000000 +0200 +++ new/setuptools-28.0.0/setuptools/__init__.py 2016-09-27 21:53:44.000000000 +0200 @@ -7,7 +7,7 @@ from distutils.util import convert_path from fnmatch import fnmatchcase -from setuptools.extern.six.moves import filterfalse, map +from setuptools.extern.six.moves import filter, filterfalse, map import setuptools.version from setuptools.extension import Extension @@ -32,13 +32,18 @@ class PackageFinder(object): + """ + Generate a list of all Python packages found within a directory + """ @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. + 'where' is the root directory which will be searched for packages. It + 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). @@ -47,65 +52,47 @@ 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 + return list(cls._find_packages_iter( + convert_path(where), + cls._build_filter('ez_setup', '*__pycache__', *exclude), + cls._build_filter(*include))) - @staticmethod - def _candidate_dirs(base_path): + @classmethod + def _find_packages_iter(cls, where, exclude, include): """ - Return all dirs in base_path that might be packages. + All the packages found in 'where' that pass the 'include' filter, but + not the 'exclude' filter. """ - has_dot = lambda name: '.' in name - for root, dirs, files in os.walk(base_path, followlinks=True): - # Exclude directories that contain a period, as they cannot be - # packages. Mutate the list to avoid traversal. - dirs[:] = filterfalse(has_dot, dirs) - for dir in dirs: - yield os.path.relpath(os.path.join(root, dir), base_path) - - @classmethod - def _find_packages_iter(cls, base_path): - candidates = cls._candidate_dirs(base_path) - return ( - path.replace(os.path.sep, '.') - for path in candidates - if cls._looks_like_package(os.path.join(base_path, path)) - ) + for root, dirs, files in os.walk(where, followlinks=True): + # Copy dirs to iterate over it, then empty dirs. + all_dirs = dirs[:] + dirs[:] = [] + + for dir in all_dirs: + full_path = os.path.join(root, dir) + rel_path = os.path.relpath(full_path, where) + package = rel_path.replace(os.path.sep, '.') + + # Check if the directory is a package and passes the filters + if ('.' not in dir + and include(package) + and not exclude(package) + and cls._looks_like_package(full_path)): + yield package + dirs.append(dir) @staticmethod def _looks_like_package(path): + """Does a directory look like a package?""" 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. + the input matches at least one of the patterns. """ return lambda name: any(fnmatchcase(name, pat=pat) for pat in patterns) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/setuptools-27.3.0/setuptools/monkey.py new/setuptools-28.0.0/setuptools/monkey.py --- old/setuptools-27.3.0/setuptools/monkey.py 2016-09-21 03:22:50.000000000 +0200 +++ new/setuptools-28.0.0/setuptools/monkey.py 2016-09-27 21:53:44.000000000 +0200 @@ -6,6 +6,7 @@ import distutils.filelist import platform import types +import functools from .py26compat import import_module from setuptools.extern import six @@ -115,16 +116,21 @@ ) -def patch_func(replacement, original): - # first set the 'unpatched' attribute on the replacement to +def patch_func(replacement, target_mod, func_name): + """ + Patch func_name in target_mod with replacement + + Important - original must be resolved by name to avoid + patching an already patched function. + """ + original = getattr(target_mod, func_name) + + # set the 'unpatched' attribute on the replacement to # point to the original. vars(replacement).setdefault('unpatched', original) - # next resolve the module in which the original func resides - target_mod = import_module(original.__module__) - - # finally replace the function in the original module - setattr(target_mod, original.__name__, replacement) + # replace the function in the original module + setattr(target_mod, func_name, replacement) def get_unpatched_function(candidate): @@ -139,37 +145,43 @@ # import late to avoid circular imports on Python < 3.5 msvc = import_module('setuptools.msvc') - try: - # Distutil file for MSVC++ 9.0 and upper (Python 2.7 to 3.4) - import distutils.msvc9compiler as msvc9compiler - except ImportError: - pass - - try: - # Distutil file for MSVC++ 14.0 and upper (Python 3.5+) - import distutils._msvccompiler as msvc14compiler - except ImportError: - pass - if platform.system() != 'Windows': # Compilers only availables on Microsoft Windows return + def patch_params(mod_name, func_name): + """ + Prepare the parameters for patch_func to patch indicated function. + """ + repl_prefix = 'msvc9_' if 'msvc9' in mod_name else 'msvc14_' + repl_name = repl_prefix + func_name.lstrip('_') + repl = getattr(msvc, repl_name) + mod = import_module(mod_name) + if not hasattr(mod, func_name): + raise ImportError(func_name) + return repl, mod, func_name + + # Python 2.7 to 3.4 + msvc9 = functools.partial(patch_params, 'distutils.msvc9compiler') + + # Python 3.5+ + msvc14 = functools.partial(patch_params, 'distutils._msvccompiler') + try: # Patch distutils.msvc9compiler - patch_func(msvc.msvc9_find_vcvarsall, msvc9compiler.find_vcvarsall) - patch_func(msvc.msvc9_query_vcvarsall, msvc9compiler.query_vcvarsall) - except NameError: + patch_func(*msvc9('find_vcvarsall')) + patch_func(*msvc9('query_vcvarsall')) + except ImportError: pass try: # Patch distutils._msvccompiler._get_vc_env - patch_func(msvc.msvc14_get_vc_env, msvc14compiler._get_vc_env) - except NameError: + patch_func(*msvc14('_get_vc_env')) + except ImportError: pass try: # Patch distutils._msvccompiler.gen_lib_options for Numpy - patch_func(msvc.msvc14_gen_lib_options, msvc14compiler.gen_lib_options) - except NameError: + patch_func(*msvc14('gen_lib_options')) + except ImportError: pass diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/setuptools-27.3.0/setuptools/tests/test_find_packages.py new/setuptools-28.0.0/setuptools/tests/test_find_packages.py --- old/setuptools-27.3.0/setuptools/tests/test_find_packages.py 2016-09-21 03:22:50.000000000 +0200 +++ new/setuptools-28.0.0/setuptools/tests/test_find_packages.py 2016-09-27 21:53:44.000000000 +0200 @@ -98,6 +98,15 @@ packages = find_packages(self.dist_dir, exclude=('pkg.*',)) assert packages == ['pkg'] + def test_exclude_recursive(self): + """ + Excluding a parent package should exclude all child packages as well. + """ + self._touch('__init__.py', self.pkg_dir) + self._touch('__init__.py', self.sub_pkg_dir) + packages = find_packages(self.dist_dir, exclude=('pkg',)) + assert packages == [] + def test_include_excludes_other(self): """ If include is specified, other packages should be excluded. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/setuptools-27.3.0/setuptools.egg-info/PKG-INFO new/setuptools-28.0.0/setuptools.egg-info/PKG-INFO --- old/setuptools-27.3.0/setuptools.egg-info/PKG-INFO 2016-09-21 03:23:11.000000000 +0200 +++ new/setuptools-28.0.0/setuptools.egg-info/PKG-INFO 2016-09-27 21:54:05.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: setuptools -Version: 27.3.0 +Version: 28.0.0 Summary: Easily download, build, install, upgrade, and uninstall Python packages Home-page: https://github.com/pypa/setuptools Author: Python Packaging Authority diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/setuptools-27.3.0/setuptools.egg-info/dependency_links.txt new/setuptools-28.0.0/setuptools.egg-info/dependency_links.txt --- old/setuptools-27.3.0/setuptools.egg-info/dependency_links.txt 2016-09-21 03:23:11.000000000 +0200 +++ new/setuptools-28.0.0/setuptools.egg-info/dependency_links.txt 2016-09-27 21:54:05.000000000 +0200 @@ -1,2 +1,2 @@ -https://pypi.python.org/packages/source/c/certifi/certifi-2016.8.8.tar.gz#md5=b57513f7670482da45bb350b792f659e +https://pypi.python.org/packages/source/c/certifi/certifi-2016.8.31.tar.gz#md5=2f22d484a36d38d98be74f9eeb2846ec https://pypi.python.org/packages/source/w/wincertstore/wincertstore-0.2.zip#md5=ae728f2f007185648d0c7a8679b361e2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/setuptools-27.3.0/setuptools.egg-info/requires.txt new/setuptools-28.0.0/setuptools.egg-info/requires.txt --- old/setuptools-27.3.0/setuptools.egg-info/requires.txt 2016-09-21 03:23:11.000000000 +0200 +++ new/setuptools-28.0.0/setuptools.egg-info/requires.txt 2016-09-27 21:54:05.000000000 +0200 @@ -1,6 +1,6 @@ [certs] -certifi==2016.8.8 +certifi==2016.8.31 [ssl:sys_platform=='win32'] wincertstore==0.2