From b96bde47c66860762fb4bf9e5e110833fd225036 Mon Sep 17 00:00:00 2001 From: Pradyun Gedam Date: Sun, 8 Oct 2017 20:44:43 +0530 Subject: [PATCH 01/29] docs,tox: Start using a requirements file --- docs-requirements.txt | 3 +++ tox.ini | 6 +----- 2 files changed, 4 insertions(+), 5 deletions(-) create mode 100644 docs-requirements.txt diff --git a/docs-requirements.txt b/docs-requirements.txt new file mode 100644 index 000000000..e664242ba --- /dev/null +++ b/docs-requirements.txt @@ -0,0 +1,3 @@ +sphinx == 1.6.1 +git+https://github.com/python/python-docs-theme.git#egg=python-docs-theme +git+https://github.com/pypa/pypa-docs-theme.git#egg=pypa-docs-theme diff --git a/tox.ini b/tox.ini index 2e36058f1..8a0116b14 100644 --- a/tox.ini +++ b/tox.ini @@ -15,11 +15,7 @@ install_command = python -m pip install {opts} {packages} usedevelop = True [testenv:docs] -deps = - sphinx == 1.6.1 - git+https://github.com/python/python-docs-theme.git#egg=python-docs-theme - git+https://github.com/pypa/pypa-docs-theme.git#egg=pypa-docs-theme - +deps = -r{toxinidir}/docs-requirements.txt basepython = python2.7 commands = sphinx-build -W -b html -d {envtmpdir}/doctrees docs docs/build/html From ba8ba844b9500057b3dac02f31ad54ada7ab597f Mon Sep 17 00:00:00 2001 From: Pradyun Gedam Date: Mon, 9 Oct 2017 16:12:47 +0530 Subject: [PATCH 02/29] misc: exclude all requirement files --- MANIFEST.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MANIFEST.in b/MANIFEST.in index deb091d96..01f545922 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -12,7 +12,7 @@ exclude .travis.yml exclude .landscape.yml exclude src/pip/_vendor/Makefile exclude tox.ini -exclude dev-requirements.txt +exclude *-requirements.txt exclude appveyor.yml recursive-include src/pip/_vendor *.pem From 0610f3788ce35fd650794cc8b38416c84b33da94 Mon Sep 17 00:00:00 2001 From: Pradyun Gedam Date: Wed, 11 Oct 2017 12:44:43 +0530 Subject: [PATCH 03/29] rtd: Resolve wrong version showing up --- docs-requirements.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs-requirements.txt b/docs-requirements.txt index e664242ba..9bdbf1b3c 100644 --- a/docs-requirements.txt +++ b/docs-requirements.txt @@ -1,3 +1,7 @@ sphinx == 1.6.1 git+https://github.com/python/python-docs-theme.git#egg=python-docs-theme git+https://github.com/pypa/pypa-docs-theme.git#egg=pypa-docs-theme + +# XXX: This is a workaround for conf.py not seeing the development pip version +# when the documentation is built on ReadTheDocs. +. From 1379aacc982b1ad6572524b1b484d599c91e6e9e Mon Sep 17 00:00:00 2001 From: Pradyun Gedam Date: Fri, 20 Oct 2017 21:17:32 +0530 Subject: [PATCH 04/29] Add a debugging statement to conf.py --- docs/conf.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index 0afeac3ff..74d73b39d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -68,6 +68,11 @@ try: except ImportError: version = release = 'dev' +# We have this here because readthedocs plays tricks sometimes and there seems +# to be a hiesenbug, related to the version of pip discovered. This is here to +# help debug that if someone decides to do that in the future. +print(version) + # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # language = None From 62875be05040501a3a13a8c3353af41e68917f48 Mon Sep 17 00:00:00 2001 From: Mathieu Bridon Date: Tue, 24 Oct 2017 11:46:48 +0200 Subject: [PATCH 05/29] Record installed files in a deterministic order Installed files are recorded by Pip in the order the underlying tool (Distutils, Setuptools, ...) recorded them. Unfortunately, at least Setuptools doesn't record them in a deterministic order in the case of a directory being installed, as it uses os.walk to find the list of files. We could fix all those underlying tools to record their files in a deterministic order in all situations. But fixing it once here in Pip for all tools is certainly simpler and more future-proof. This makes the installation more reproducible, and therefore more verifiable. --- news/4667.bugfix | 2 ++ src/pip/_internal/req/req_install.py | 1 + tests/functional/test_install.py | 22 ++++++++++++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 news/4667.bugfix diff --git a/news/4667.bugfix b/news/4667.bugfix new file mode 100644 index 000000000..cba4ba427 --- /dev/null +++ b/news/4667.bugfix @@ -0,0 +1,2 @@ +pip now records installed files in a deterministic manner improving +reproducibility. diff --git a/src/pip/_internal/req/req_install.py b/src/pip/_internal/req/req_install.py index e4fc1930c..d3c0eacfa 100644 --- a/src/pip/_internal/req/req_install.py +++ b/src/pip/_internal/req/req_install.py @@ -802,6 +802,7 @@ class InstallRequirement(object): new_lines.append( os.path.relpath(prepend_root(filename), egg_info_dir) ) + new_lines.sort() ensure_dir(egg_info_dir) inst_files_path = os.path.join(egg_info_dir, 'installed-files.txt') with open(inst_files_path, 'w') as f: diff --git a/tests/functional/test_install.py b/tests/functional/test_install.py index c530ce8d7..9d137e8d1 100644 --- a/tests/functional/test_install.py +++ b/tests/functional/test_install.py @@ -1260,3 +1260,25 @@ def test_installing_scripts_on_path_does_not_print_warning(script): result = script.pip_install_local("script_wheel1") assert "Successfully installed script-wheel1" in result.stdout, str(result) assert "--no-warn-script-location" not in result.stderr + + +def test_installed_files_recorded_in_deterministic_order(script, data): + """ + Ensure that we record the files installed by a package in a deterministic + order, to make installs reproducible. + """ + to_install = data.packages.join("FSPkg") + result = script.pip('install', to_install, expect_error=False) + fspkg_folder = script.site_packages / 'fspkg' + egg_info = 'FSPkg-0.1.dev0-py%s.egg-info' % pyversion + installed_files_path = ( + script.site_packages / egg_info / 'installed-files.txt' + ) + assert fspkg_folder in result.files_created, str(result.stdout) + assert installed_files_path in result.files_created, str(result) + + installed_files_path = result.files_created[installed_files_path].full + installed_files_lines = [ + p for p in Path(installed_files_path).read_text().split('\n') if p + ] + assert installed_files_lines == sorted(installed_files_lines) From 7ec7162b69c8c40926b28ecd6f806da7090f7dc2 Mon Sep 17 00:00:00 2001 From: Hari Charan Date: Fri, 27 Oct 2017 20:53:32 +0530 Subject: [PATCH 06/29] Correct a typo in NEWS (#4818) --- NEWS.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS.rst b/NEWS.rst index 715e416bd..7d30fec56 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -769,7 +769,7 @@ than erroring out. (#963) - ``pip bundle`` and support for installing from pybundle files is now considered deprecated and will be removed in pip v1.5. -- Fix a number of isses related to cleaning up and not reusing build +- Fix a number of issues related to cleaning up and not reusing build directories. (#413, #709, #634, #602, #939, #865, #948) - Added a User Agent so that pip is identifiable in logs. (#901) - Added ssl and --user support to get-pip.py. Thanks Gabriel de Perthuis. From f2cf472d917c8282b9075aeffbd59380a99e7c46 Mon Sep 17 00:00:00 2001 From: Pradyun Gedam Date: Sat, 28 Oct 2017 18:33:47 +0530 Subject: [PATCH 07/29] Update distlib to 0.2.6 --- news/distlib.vendor | 2 +- src/pip/_vendor/distlib/__init__.py | 4 +- src/pip/_vendor/distlib/compat.py | 14 +++++-- src/pip/_vendor/distlib/database.py | 58 +++++++++++++++------------ src/pip/_vendor/distlib/locators.py | 35 +++++++++------- src/pip/_vendor/distlib/markers.py | 7 +++- src/pip/_vendor/distlib/resources.py | 2 +- src/pip/_vendor/distlib/scripts.py | 33 ++++++++++++++- src/pip/_vendor/distlib/t32.exe | Bin 89088 -> 92672 bytes src/pip/_vendor/distlib/t64.exe | Bin 97792 -> 102400 bytes src/pip/_vendor/distlib/version.py | 2 +- src/pip/_vendor/distlib/w32.exe | Bin 85504 -> 89088 bytes src/pip/_vendor/distlib/w64.exe | Bin 94208 -> 99328 bytes src/pip/_vendor/distlib/wheel.py | 8 ++-- src/pip/_vendor/vendor.txt | 2 +- 15 files changed, 109 insertions(+), 58 deletions(-) diff --git a/news/distlib.vendor b/news/distlib.vendor index b55615fe7..964856417 100644 --- a/news/distlib.vendor +++ b/news/distlib.vendor @@ -1 +1 @@ -Upgraded distlib to 0.2.5. +Upgraded distlib to 0.2.6. diff --git a/src/pip/_vendor/distlib/__init__.py b/src/pip/_vendor/distlib/__init__.py index 3f3919d1b..718b9879a 100644 --- a/src/pip/_vendor/distlib/__init__.py +++ b/src/pip/_vendor/distlib/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2012-2016 Vinay Sajip. +# Copyright (C) 2012-2017 Vinay Sajip. # Licensed to the Python Software Foundation under a contributor agreement. # See LICENSE.txt and CONTRIBUTORS.txt. # import logging -__version__ = '0.2.5' +__version__ = '0.2.6' class DistlibException(Exception): pass diff --git a/src/pip/_vendor/distlib/compat.py b/src/pip/_vendor/distlib/compat.py index 3bd214016..9387cdada 100644 --- a/src/pip/_vendor/distlib/compat.py +++ b/src/pip/_vendor/distlib/compat.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2013-2016 Vinay Sajip. +# Copyright (C) 2013-2017 Vinay Sajip. # Licensed to the Python Software Foundation under a contributor agreement. # See LICENSE.txt and CONTRIBUTORS.txt. # @@ -12,7 +12,7 @@ import sys try: import ssl -except ImportError: +except ImportError: # pragma: no cover ssl = None if sys.version_info[0] < 3: # pragma: no cover @@ -272,7 +272,7 @@ from zipfile import ZipFile as BaseZipFile if hasattr(BaseZipFile, '__enter__'): # pragma: no cover ZipFile = BaseZipFile -else: +else: # pragma: no cover from zipfile import ZipExtFile as BaseZipExtFile class ZipExtFile(BaseZipExtFile): @@ -329,7 +329,13 @@ try: fsencode = os.fsencode fsdecode = os.fsdecode except AttributeError: # pragma: no cover - _fsencoding = sys.getfilesystemencoding() + # Issue #99: on some systems (e.g. containerised), + # sys.getfilesystemencoding() returns None, and we need a real value, + # so fall back to utf-8. From the CPython 2.7 docs relating to Unix and + # sys.getfilesystemencoding(): the return value is "the user’s preference + # according to the result of nl_langinfo(CODESET), or None if the + # nl_langinfo(CODESET) failed." + _fsencoding = sys.getfilesystemencoding() or 'utf-8' if _fsencoding == 'mbcs': _fserrors = 'strict' else: diff --git a/src/pip/_vendor/distlib/database.py b/src/pip/_vendor/distlib/database.py index 09244bb59..75bb5edaf 100644 --- a/src/pip/_vendor/distlib/database.py +++ b/src/pip/_vendor/distlib/database.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2012-2016 The Python Software Foundation. +# Copyright (C) 2012-2017 The Python Software Foundation. # See LICENSE.txt and CONTRIBUTORS.txt. # """PEP 376 implementation.""" @@ -265,18 +265,23 @@ class DistributionPath(object): (name, version)) for dist in self.get_distributions(): - provided = dist.provides + # We hit a problem on Travis where enum34 was installed and doesn't + # have a provides attribute ... + if not hasattr(dist, 'provides'): + logger.debug('No "provides": %s', dist) + else: + provided = dist.provides - for p in provided: - p_name, p_ver = parse_name_and_version(p) - if matcher is None: - if p_name == name: - yield dist - break - else: - if p_name == name and matcher.match(p_ver): - yield dist - break + for p in provided: + p_name, p_ver = parse_name_and_version(p) + if matcher is None: + if p_name == name: + yield dist + break + else: + if p_name == name and matcher.match(p_ver): + yield dist + break def get_file_path(self, name, relative_path): """ @@ -1025,20 +1030,21 @@ class EggInfoDistribution(BaseInstalledDistribution): :returns: iterator of paths """ record_path = os.path.join(self.path, 'installed-files.txt') - skip = True - with codecs.open(record_path, 'r', encoding='utf-8') as f: - for line in f: - line = line.strip() - if line == './': - skip = False - continue - if not skip: - p = os.path.normpath(os.path.join(self.path, line)) - if p.startswith(self.path): - if absolute: - yield p - else: - yield line + if os.path.exists(record_path): + skip = True + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + if line == './': + skip = False + continue + if not skip: + p = os.path.normpath(os.path.join(self.path, line)) + if p.startswith(self.path): + if absolute: + yield p + else: + yield line def __eq__(self, other): return (isinstance(other, EggInfoDistribution) and diff --git a/src/pip/_vendor/distlib/locators.py b/src/pip/_vendor/distlib/locators.py index 6c6e7febc..e68a4c98f 100644 --- a/src/pip/_vendor/distlib/locators.py +++ b/src/pip/_vendor/distlib/locators.py @@ -24,7 +24,7 @@ from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url, HTTPRedirectHandler as BaseRedirectHandler, text_type, Request, HTTPError, URLError) from .database import Distribution, DistributionPath, make_dist -from .metadata import Metadata +from .metadata import Metadata, MetadataInvalidError from .util import (cached_property, parse_credentials, ensure_slash, split_filename, get_project_data, parse_requirement, parse_name_and_version, ServerProxy, normalize_name) @@ -69,7 +69,7 @@ class RedirectHandler(BaseRedirectHandler): if key in headers: newurl = headers[key] break - if newurl is None: + if newurl is None: # pragma: no cover return urlparts = urlparse(newurl) if urlparts.scheme == '': @@ -175,7 +175,7 @@ class Locator(object): This calls _get_project to do all the work, and just implements a caching layer on top. """ - if self._cache is None: + if self._cache is None: # pragma: no cover result = self._get_project(name) elif name in self._cache: result = self._cache[name] @@ -241,7 +241,7 @@ class Locator(object): result = None scheme, netloc, path, params, query, frag = urlparse(url) - if frag.lower().startswith('egg='): + if frag.lower().startswith('egg='): # pragma: no cover logger.debug('%s: version hint in fragment: %r', project_name, frag) m = HASHER_HASH.match(frag) @@ -250,7 +250,7 @@ class Locator(object): else: algo, digest = None, None origpath = path - if path and path[-1] == '/': + if path and path[-1] == '/': # pragma: no cover path = path[:-1] if path.endswith('.whl'): try: @@ -272,13 +272,15 @@ class Locator(object): } except Exception as e: # pragma: no cover logger.warning('invalid path for wheel: %s', path) - elif path.endswith(self.downloadable_extensions): + elif not path.endswith(self.downloadable_extensions): # pragma: no cover + logger.debug('Not downloadable: %s', path) + else: # downloadable extension path = filename = posixpath.basename(path) for ext in self.downloadable_extensions: if path.endswith(ext): path = path[:-len(ext)] t = self.split_filename(path, project_name) - if not t: + if not t: # pragma: no cover logger.debug('No match for project/version: %s', path) else: name, version, pyver = t @@ -291,7 +293,7 @@ class Locator(object): params, query, '')), #'packagetype': 'sdist', } - if pyver: + if pyver: # pragma: no cover result['python-version'] = pyver break if result and algo: @@ -352,7 +354,7 @@ class Locator(object): """ result = None r = parse_requirement(requirement) - if r is None: + if r is None: # pragma: no cover raise DistlibException('Not a valid requirement: %r' % requirement) scheme = get_scheme(self.scheme) self.matcher = matcher = scheme.matcher(r.requirement) @@ -390,7 +392,7 @@ class Locator(object): d = {} sd = versions.get('digests', {}) for url in result.download_urls: - if url in sd: + if url in sd: # pragma: no cover d[url] = sd[url] result.digests = d self.matcher = None @@ -730,11 +732,14 @@ class SimpleScrapingLocator(Locator): continue for link, rel in page.links: if link not in self._seen: - self._seen.add(link) - if (not self._process_download(link) and - self._should_queue(link, url, rel)): - logger.debug('Queueing %s from %s', link, url) - self._to_fetch.put(link) + try: + self._seen.add(link) + if (not self._process_download(link) and + self._should_queue(link, url, rel)): + logger.debug('Queueing %s from %s', link, url) + self._to_fetch.put(link) + except MetadataInvalidError: # e.g. invalid versions + pass except Exception as e: # pragma: no cover self.errors.put(text_type(e)) finally: diff --git a/src/pip/_vendor/distlib/markers.py b/src/pip/_vendor/distlib/markers.py index f55b8f96d..ee1f3e236 100644 --- a/src/pip/_vendor/distlib/markers.py +++ b/src/pip/_vendor/distlib/markers.py @@ -119,9 +119,12 @@ def interpret(marker, execution_context=None): :param execution_context: The context used for name lookup. :type execution_context: mapping """ - expr, rest = parse_marker(marker) + try: + expr, rest = parse_marker(marker) + except Exception as e: + raise SyntaxError('Unable to interpret marker syntax: %s: %s' % (marker, e)) if rest and rest[0] != '#': - raise SyntaxError('unexpected trailing data: %s' % rest) + raise SyntaxError('unexpected trailing data in marker: %s: %s' % (marker, rest)) context = dict(DEFAULT_CONTEXT) if execution_context: context.update(execution_context) diff --git a/src/pip/_vendor/distlib/resources.py b/src/pip/_vendor/distlib/resources.py index f07cde259..18840167a 100644 --- a/src/pip/_vendor/distlib/resources.py +++ b/src/pip/_vendor/distlib/resources.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2013-2016 Vinay Sajip. +# Copyright (C) 2013-2017 Vinay Sajip. # Licensed to the Python Software Foundation under a contributor agreement. # See LICENSE.txt and CONTRIBUTORS.txt. # diff --git a/src/pip/_vendor/distlib/scripts.py b/src/pip/_vendor/distlib/scripts.py index 9449074db..0b7c3d0b3 100644 --- a/src/pip/_vendor/distlib/scripts.py +++ b/src/pip/_vendor/distlib/scripts.py @@ -136,6 +136,37 @@ class ScriptMaker(object): return executable return '/usr/bin/env %s' % executable + def _build_shebang(self, executable, post_interp): + """ + Build a shebang line. In the simple case (on Windows, or a shebang line + which is not too long or contains spaces) use a simple formulation for + the shebang. Otherwise, use /bin/sh as the executable, with a contrived + shebang which allows the script to run either under Python or sh, using + suitable quoting. Thanks to Harald Nordgren for his input. + + See also: http://www.in-ulm.de/~mascheck/various/shebang/#length + https://hg.mozilla.org/mozilla-central/file/tip/mach + """ + if os.name != 'posix': + simple_shebang = True + else: + # Add 3 for '#!' prefix and newline suffix. + shebang_length = len(executable) + len(post_interp) + 3 + if sys.platform == 'darwin': + max_shebang_length = 512 + else: + max_shebang_length = 127 + simple_shebang = ((b' ' not in executable) and + (shebang_length <= max_shebang_length)) + + if simple_shebang: + result = b'#!' + executable + post_interp + b'\n' + else: + result = b'#!/bin/sh\n' + result += b"'''exec' " + executable + post_interp + b' "$0" "$@"\n' + result += b"' '''" + return result + def _get_shebang(self, encoding, post_interp=b'', options=None): enquote = True if self.executable: @@ -169,7 +200,7 @@ class ScriptMaker(object): if (sys.platform == 'cli' and '-X:Frames' not in post_interp and '-X:FullFrames' not in post_interp): # pragma: no cover post_interp += b' -X:Frames' - shebang = b'#!' + executable + post_interp + b'\n' + shebang = self._build_shebang(executable, post_interp) # Python parser starts to read a script using UTF-8 until # it gets a #coding:xxx cookie. The shebang has to be the # first line of a file, the #coding:xxx cookie cannot be diff --git a/src/pip/_vendor/distlib/t32.exe b/src/pip/_vendor/distlib/t32.exe index 836211d848ec0ba46667d33cfade3348888062ae..bd14c7a627e1055708739fdc9635fba15c3d91ea 100644 GIT binary patch delta 27837 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 Nb*5bx#!4E4{~t;s@d*F` delta 24046 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 diff --git a/src/pip/_vendor/distlib/version.py b/src/pip/_vendor/distlib/version.py index 439a6adb9..3eebe18ee 100644 --- a/src/pip/_vendor/distlib/version.py +++ b/src/pip/_vendor/distlib/version.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2012-2016 The Python Software Foundation. +# Copyright (C) 2012-2017 The Python Software Foundation. # See LICENSE.txt and CONTRIBUTORS.txt. # """ diff --git a/src/pip/_vendor/distlib/w32.exe b/src/pip/_vendor/distlib/w32.exe index 85a90a5f51a9596679a7365eadd3352443b95782..9652c917d581b5b9ddf90766595b7701710fe875 100644 GIT binary patch delta 27020 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 U8~qRd?Mj#=`Y8$q-H~;_u diff --git a/src/pip/_vendor/distlib/w64.exe b/src/pip/_vendor/distlib/w64.exe index b3aea316f61163e2637a7c0b0a96cd3c664b54dc..ec2dc656896831df135b3fcc9c4f1cb8f842992b 100644 GIT binary patch delta 30936 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 MlV)f>{lCTp0PsiO!T9THnAOz zE<{_c6m3apDRrw7;t~W=T2V?`%GS^ZMbu?KpSkx=+TZVae`CDw7|$5*KhGIs^*bvll7i>LG)9k(GJn5pBgw^B1Ge`|DH7IL^> z<2XOI@P}}H9mlQamk0T@>1LUlXMxPb3jA?LIK-UzfZl#RLDnJkLO6=>uTLV!C3ef2 zWSInBVGRD5QM3o}DaR)A-fl|GXaR?obMEXNKCl(q#SKTyhkeQWxP?1_M3blo+>Gr% z^1-_I9Yb_R7V6k}SZ;5Q6YQ=(-sU*j6jpj@H5Q;1z?qdYoZL_Gq5X`PR zdbvMvbJG~d*yEVI@51wS3g48K;YL{n%!;@Q!(Bp40Dvshw zDacjLmt^11aScxjWI=35G73)zL{*3vq>d;x4W%ZFm8s$dK|C!T$MgUNu|}HvT$a%a zv?0EpjcpOo)={m6lDj-dMN&r>CbsYk+SXPrC26-K#v28til?M>6r|>U_&cj=5#awj z$4yI$b+9-M>2h^Q+|P6F)jJFkuPJ?c(Std(?CjAzXo-UOlOR5pO}|yMu7=KTolbF_ zSc{2qkxkF4*;GTQ+cXSW!EuWr>U-I=q?)ZZbnuLXf(lWGg`xpD$Q<>3)N$FgpqiaG zwC7W+*<*uW%WrRSoOJpL^K0dAJ#Z2owVSqrC00qFK9S|9?*)5WNKUf7U$%4*s=4Q( zEX&7|Lvpe)p0eo=CBvu+0pcHGXpotynX{02&jSd{rsJwm6$$04Ld#U47f9$YMQ8(r zyafBG8j?y^rHWK3pC_!QRXcw9Np`DMy!F}%rH#o*OB0Vl`0KxAIawSRk}ZfMLo%R* z$wmI3N9fSHS`ro0LNaAjS84;u4BH8`=qoKDL$HqwNtaE#)H1!)`X-@3h=M-`{Oamz zLBs%NK!3B{1-8`1-6sd@2uq`0WQf){0B;&3D+%(8uOSAX@h3p$%Bc z#+3)9tj9D%HY!^XpR;+cfmTRC{q3f95G0X~5J@cTE!dMo61zM}6D!f$J-425T(Wqk zXhukwP?Q{EmQ9&xka${Ii>_3~lt#+@d!sB*E3(W>6znrX5~sylLJ}=L#$7|8^XH{! z&Psos1oU@WY%Z63W14Ngm20oG^Ra~LR~(c!p@e#)HbT{E4p++2G(gvpi3?KlJkavw z{yWd=|EE0YUl=Ap5KqabGnmqEgQ2`>Vx3T6t*}H+i_I}u!l%V%7%Ux(y9C2t15%}Q zrJ!67OO=@lwHysz|jRms7>#sovsKdpbYu-dBS7On7uQ z&7MST#8cTdx9(Xt^%ym~$pv{8Eow|Ou0-#pOV|a{pbjx<*wQ1??5@F(fU*eUIYB&= zR+L4GG9$z+?QcQDeny%Mg~U3t-42rmKPB>?51VOh=iNfb<+c_M9(14f=%6g;^7ku+ zgU8)(oiehIjXhnL`EuMb&XcCa*Oy&2hGuSPN9ER%Hm1`WbCm`uGG36WKQJvhwp(tn z)Vnzw^#Lig0hpzIU>6rhRn!OKR!^tQE>4NRB`Q=+Z{n@9j7h2=7j>U@> z?3%6vK}%yp6=gBd+1!g51tG{}H!Xr00htj1X#qA{jMrGiyCYTlsXe9ncT_|Y!T|Md zg6M!TweWI{V5>9;aaU*G5o`(daj4D`h>X92lJ11yfP<6~hi26ABxsRrIuXZqwCOW) z0S&M%!Lyx?(-{}*knNbBrw9fkxiIvRCr+tL#)9*R3Zkok(r{c=Qlx<zQ(9xu~pX#M%H>@qmKs7Nas_Ql>Y@A)4FanEtLw?Sz^z z5D7`p?Mf&#P&OSs$YMOkw>pMtz)WVgXPbrXvW0@fI*Kqb}>TiULp^+7Psfr8_? zX6Zhra}UOVlZvpt?U9N43g;^g2ZV4|Qaie$RvKs26CSHSfCLNX`=oRnbB4NH>&vAt zO|;r*y-4euNkKeX-$q&wDQQ_VGpd3`dUa!^KHj`BoPFz)>e_%sq^;EX9;~%*e||h)2^zOGq{jH|l>ho9O4yuj#@T_zi6Nq$4Wm+?G}Q<@#BP z{<2MTfpH+~yHjJIIkEBnW`2${v-;2E*XY?F{(=19@0c+lfGu?K?trx=h!<&Cyrgxl zn+xa;(pDwk8Vf~~`bDwuKySW(Z#FP6m~R=(UJD$;KXqq&1BdbRdofpYB%j)gC7C<( z`XDybJi7B;V{<_ZK%$^}A1M(FyqKEQ5*CZ7Y#v7p?2b8#UtwgyL1BDAFP0V*<#s26 zPS9gYkDo;|dr(^FC78b2P-TOp^18ypcCtOuS@gCieD2SZUrY8p$g|a&mY9C*t>f6I zL2X$>`|wB?3?ph48>N1@22lOayDQrCI&AoYivQ?sXXN^}f;cz~gJ5xz@*c6FA*(_h z_dsL69WoYK>v9S~;a48g-j^d=n@tQDgq|ylpOK-$#tX9O@1=b$SCnxp1Pdl5XC3I>X z$(@Q}x(p@Albtd@dHxs(`1i7EI~?;|$a_JwRkW-ix&lu$6Mr8xX87LN(ynh>;# z6BZsW1x%zBr<`Av31Hd|hus>EDF?3zhJmo~b|J~yU5BC7vPs;9h^UWu(RrdP$srlo zB+1mwR7_Cm$$Iuphwj#=WIj^M(#YCO6CprzA~|F{3}*cv zEs}!`X(vuPeJ09L2Xq=bO4o%q!AH+7U^HaYBt&cpeIUf;I;nDfAt##(zu~yORF`rJ zM($)49ryIQ5)L^_0CN8TO7c>4#p1SCZ3(Qg{a}lO9g}twCsq6*)!~fvKKm-HQ;T$z zCoy&B6pb3Q8Q-1?A0%Q~Da}i>^ZlL+t6;AWs(gM^oa9YNA0) zY`Gh!IamK?)N!1M_wTV6I(zzE^3ieiH7W;TqqC6E9?LdA zAp_P4XVFXFP>G`JWaLs5;0{zvJIZOhvAYT=Lx{ULyRTr^S3h76J9pM)vY;+LgC2a1 zQ(x@?ZgIB99`oDU4!TR-V8t2tzUF0A_jJKNC_(?ye4w2UN zT_Ey~B7$v75vhO(i|&@-9+gD0#)6ADQe}M)16$Z_WMFv<>;h48(Yz3IT*9mlI?iav zg&$XlM^MMUp6st~VeRLkL1YBb+7v{S9u|WjdfdZd+X9Den&^Mu#9rv$dFs18DZL7} zeB|AW(^)8TX{0T06b;YbQtZ>R>FY0*76)MJN=QU>c`OCrR*HES@l;#L6Rti41^h=% zZKS-i={00SO<5*(x_hK9pXnle_>WsK|A_X(YRN-Em+FE#N3sDL#e3pK+hZ9zVvojr zWQF8l3erL>QQs%+UV%PHr=j_2_HiLOf_;EHyc+IlaEJ)B3USL^zJ)E1F!6>D*~W+% zzUl+^YedgJcQ@1O6B}jIRZvu#Ae*W|Lebp|4DMh=YnG72$St*vy_rIx#+~17BFeI!8_BYyM!%qRd7&2TY#brAjD* z)wi&WeHS%mu=_a-+I=EB0vfH(jHoI_~eW<^b zjAg5yfUjO7`|63{Amffd{|@^l+QaQpcPd@6KUG1eVbZvNwCFV#g#~UfI|i|VXzCWr8~b-Z7x?~3BX9k zKuts&XKaK#P0Gup0AgVcEg7r;NBL|$CykD0bv;clyhuVt`UV~&NV7;gOOfj>iWa&4 zu0p*Ew*gAJ=z5Vja_EvTSah!uiML=&YWB*TAnOy;?4grLLUbJqxV01&gEc{AjRDlp zLp()|zreF&y*lt8eaHUnmC&mSmjdKF2sl7HKQ@C**);caT5(dU?U^pOWmLtjr$`x6 za3|L($v(tEa=FeX_a5)|-9F6tSsc1>B7U=vo$B45U%HRo>pj2I794Pu=+A$_rcL)E zs#^mA+0@}PwmK%%{O)J!28*E+UB9oVT~xNX%BB+VZLSsd?B|$Z{=2g`Sy609>v+8v0i>pEfzkz=Mo-7V~^GaOuS$!X$)?d)thD{SeGA*Rdb<8s^)Y_Vk&$xuK zNVNE%kh`?j;uc~7$bljP;O0bSE_6f-t%I8V=|%C_ zPgy~H2mWF*+Y%ql2X$g+<9!4@m5KV|g@dw#VE4o33ztEEWJR$vkS|p{Et{g0IMSg4 zrVeW2Kqc`?Js)*R>VAnuC8V@^`yjH}6D$YW-h}S0MyRngCFWjvgX0chn?etqWz&#S z_Bdf1KY2gf+&5lV#%}c;z~A_pMZD0#>N$`G3)l2q9c^w7k{%3fIIgyY4}a$9{yq)~ z3uRi1#>Hf&3HGkr9^=&8=K)g!e*W_~X|U6hi*I}iomq6^dq5Cd;$9L|9N^Q6dVcdn zG4bF;`xspNypWp(6|HkSqln2ULUoY)rLewm!m=WV`PBg^T&@sojqz^|B*tkl zkfU8W3rzIqYm-Ub>Q3U|R+mu?=V{*$O;);*1gDh7X{&Oed8Q1=CGB=M(JnLxeqlb&NQZR{CxC2v zTOnK*0E?2ReI~ZQ!Qv~3{oTbvMa=an zxVf#QgVAi0DN0wp{n^MQoh$!)^Ps}wnH6@E4a|sjt$<;rnFB*^GJ8gEK5rO1nvunS z|A>XZ6wELCiKV~viFGz?92omCQYwgJTq`u>))82MQF6g?W8nr+arzq%vA5V(gNA1+ zO>BfedDm8W)DOyf+l|1%;?l?F6fD)(9%d{_?qS%7J!uAH7s3dUt#7uIj3^luNU)C7 z2Hl#7^08 zfgX{lMwsWzQMwd1=w)+Hv|~wHL~K%@D$6i9Ylaj$HOVJA{3OVS2G}zjlM9m}kq;xL zo0fm=%bwk+2TJ;5NRmjOrjDiAhg`<9Mp$+|1iBT;rjLr*wU|qR>vVsbHBxO^cm>*)jrS@^-Cwez@gtzdz zai?=XOcv{q*CdEqXDWkk;Fxaw*Wz||)Gm(E{h%QC%#FM@L`93}@IMfgbNh(U`N|0CA= zDm$K;)L}F@QI~LW>e`%iYd=~Ub%|CG&Jr#z;l!UTVv>p9^(PxRsk7IgS7^~oRRDEC z)Q^F2_1nv=Xi`x0DuqkyP%2mCFziSjF%I)kiFQyrGQa+h*wdfcl}TZ)eH4ze1swaC zwVfQ(@4?Tq-1K~8A!y`}AA+N)jSzQkwyW|u=tt?cKeqLgY2qQ6x5e-R3Iz`>M})X1 zb6liverEQ`{aXK4h;h$AgY2(X;W(b)&gv$6xjWJ&P0u-_S*MCz@7-aBDcyaKkjZE} zgvYjn9;u12FlQeTT{qrg!>7cBzlC(AC;3R2m);IQ&p#O1i`L zOi6C@X+-8Hay74RCWplII^Am5g zwOKLVx$hvSD8Vw3EkmdpL9yjNd6zY0b?5KA!-A$p88+0@&93viY~0koBPZY-BJo^z z>7$>Tl!4s7!|`kthKKm0Qo=bD496toVEw&QfYIZlDo}naER*%fSC7ZhC+RtW-Q-@+ z{+K#6G6YUIF##a6hm5n z;dj_~3T3$j89VOO# zrg^#!JVhSHyY$xx2*g!d0w63AO(yr0MapJ@Ewl$Hv6k#=r28Q~O~eKJjBxO=KFM|s zkGo8}Zc-+f6GL9Rl+o{KvbOvwXV^YR-gVLz!-9x_AtuK1?gMQ?r1y^9QzgRyV%y z0k&h-u#WZc+gHP_+;pGEMHafc4MQcHoY4R+i51WAV2Q7{;Fnz9F1&t7*KQq7+g!c$ zb};qI-+~zS+K*SVpf@`4UyfvHZ}e;J4<^Yx3{qrvon>p^@a2aGvwd&0_w9KWOz2|; za!&`HAIDkJ$+q$cW`DmC-s=X&5PSPzT2{i8qk=;%Byx8_+JkaJaO1aRu7x@xiUrXT ze(GKiSi%f1W|{5j>4YhVhPy6;BSU&gmCUVSrL(R4#o;Vy&L#foF!p?o*gN>X+Q=vL z+|Qoi@pIEv1LnJU;i$gF6{O3iw0Tsi{}1;7MG0@7W)+qqw{K5DSUwq5fmcP!Pq8t% z(R|U{%$_@n@BB8qo*NtX=Uk-|c%|vIbZi%F5%Di51>PP2pB{xF0kMN~*?>30t>@@A z45wcNCme`eceSf>)sH)7aSk*d2xHSi_rc0V${?_0hSsBL8G+4Wtvb z8?!Am_6qZRE3oT-E7-O!HHO708wl@|#^oL&Sukmss{&uY^s< zEn5@l9ILzUCl$OUd8Lt9rp+eatu>*;7WTY zk8*sX<%s=>&Cly))!qh+h?4Cu>ZJP9*ahqp9n`&J3%39HQ-vw_v8oqhCgBfjQ1r~D z;b9W?4R>kncUX4Vd|SxJU^Ruu|x6uc1Jwb z-4=46lPl}rQ@55Gr`U=ASonu8vc$Q`UWZT6acpyzr4KR1v z#!b1%fi~(ODH8|3D&7m!G0qFRCv`c_-aW3*F!V$qh9l7Uk)1jH#Bu(?fuG~O1g!>tl5 zJmK0TIajg3`5l~L;;D74s%7c(C;4xO$Gd1i6*bpeT5?R57slAoNXrn>Svtc`&-d=M z2d)+@+;(`w=Dbg?yD()`6{V$;1tVJyi_XgBSQ>qMyZZuXU7HT50NX%y6F;E?>uUAp z$6jTEHMXTMZh+FdBdpMB=J);1%B+6;CwS$}8m0?ncdZ`y+af<)*NsKxZ|4`h&ZPWs z)9xIUNbTz>oBUo^MkMJl>$EUf_X0~>*qi_05Gz<1;%2Sih z7~JkvR=g;jtr#|u|IY^YU|9S9ig)%VT1~^{v`1-ygy=(k>m3}&TRhaKUwch>yEDly z@X}Y%Y}E4{nI)N)(xZuVi=5P z=?QK#py4h;$BtV(ZL#D=9{(?inW}_4Ne}oJKXwEACN0=%Qdt6$59HJEbU7pGR9-q2 zis-%dN_`Pj!VQ(qpd`C~#g_m${d{bDGQpv$?@MG4qk|9Za@mBWJkf52PFyz>1nr_o>yP(Bh zf^ByN%Ea3YQcop)HAU;YsNTf6`^dtui^Rk8Byk(sG8zhiVpIX;puzGn*aw@X>~)l) zzG(6O2Og|+h9le8&(!|hDOnzXE!aNaJ;^?}1>U==OfDMll2$a{aoYWIoI%0c*kAo7 z`FC88T9n5_Im#-&E2cVXFB*DGWwZOIJN{Y?RXN%}mR~3^U2<1`Ebe8=ZCU?hGas75 zrY5iB?|jHw4d~E%{C;XmV^d!}cd*0({?>Q*C>TC!IPO=NF?NW3=?>w3(|hk0{Kce)Ld{UMi9n zq6w_yz@2=%L+t86f47a;4Abl*XW|0qpS+bh36*@u5_U$28!)0tig(tkJVqn zEdI5H+Ge1JyGo$dh9CNn8t#8VNpwKVW^TuYp$l!Q9bkFBw}}KVTNGE=D#%Jn+t>$# zdS;u>qa(Q9g18#GNkh_>wb z4q3h@2A&*Q$1BfR_V6g@*69y0=F8rxw$A+!lS|7ZIYdYjr8Mzgns`fc+)3A5A=dvs zN`T563w}T@ShV#xH{t1cnYi@cl5sIZyI_|eq63wV$WOrfD92Cwr3UZb5E?Rn#*)5Ia>3D*7JH;*hI3{B6t8GNDeYU~k`WB8fHj*~hYvdq&9%s~vEVb(DqKQv$;DA* z%KR8Nfw-fVFgQIe?bD`I!1H1m15kvxK$!N z@3|j6atcFxs5$0G?9DX;_+K`#@7DC@&3)LzHAnf{_1pJ_|Lhfk2D z9#<>P_u#x0z6VcscSG+;Gg543PHOyw3MJRlt@rT<^ZaI9!bjLH=gj&q{)eSs!T;dN zaz5)Av%EQr^f^eBBBj>kcwV_nk2?D{{kpT@rAF-UZ&OBG#=#ub&a=}9Vc{=%EDO=TUvh~SrP zVHscS@3TOlYg`@eMMIUn2=8^#%@EzP>$h#DF1g_KB76;jYRII*@B*@IdN`1!Z|u#F z-^_|O2Js&bWScim-~+lbmrX(Zldi1$rZC=K&R*IS%I_b*@;90I7t2}6rg!*bWlUEd z?BtN59-G}|*0tP+O)dM7|7{bc@IeDuX!&XW(`5Fbyi4TajY|hBIlH;CRch?(a)9rq2_~xEIpO!SutF#j&o+s>nj19r`aX?*}dJ7UwE_j+#3NQ|RTf#LwC1 zUj|yIGz&=$E69nfdSb{P^HN@ZA3Y{%B#zBQ=;tLX>QIlo2)Mn#`rEkcuCbs%QIZqV znVqy5b=_PDEwzUp!Ja@@uAXo*NIQ^3ds7%iz92a`r>4{jEe<}>ORIOXkH7No#Tys9 zDkYtfW+~!Y-bw$?JMy2rlyv}Q4eR2o$>ZvLMsm~S@iG)_{{Jd}?;F96y3 z{DQeGeaFD|pWy}}Eq$+Pv)`?5_HTosZD)q}*xnr${>M=);+yvTwo%(heUqkhy1#@P zdQz&t%*uBr^Per*es||c9Y3aM`@r2Uylxm9xi{3$cOJ|m+ff63sUbbdxc`|j9w*tQ3WQ9_X)UYDu&l>C)qX#FX;E`Axr^A4gFX0ZjO8En=SvFM+Jl~* zUg*Ygk7|9tZ~wQP9ObgdiJJQwS`MF)aj@ue16OfxciCj<#;zO;V0Z0R zz+jYujLymSY+W*aovGeI?yof=1%(d4+eTR=FPmbfLG}$cuQ$G(c=W$-*s>GhvwhJ zBBM7%V2NH5jLEgiR}RwX+bE~deC=BYugB_-K~8lUpH(K((nYX6seAJ~TA&BOk;>+? z{1d)C?el3v!B-_#hoSdXQcuM3O4JXMr76LxCip1{n}+wA!m!x=Q>NTDLGuJ|M2DGeHc`SRe~L3R41}N zj-VcTF{7j-Ms(DF#>1T^h(ADR_GR=FB^wuy#IXv-#YXBlt^yv&_^4L!m4!!FV+Hw) zfYHefmH6hGq;?>cG2&4w-Z_APaj_eULFss(8ikoIv!AO2_&1iaXVs@dZ_K4`k&!OV z0lAx~dM8mowg}mE+9AeX8`^>YY8hig2l4^g?DEi9-oeP)z1Wo*MohOta~EHC;5g+w zO!VTjm}-#rPNsGYc9*uPgqO5YCCt)Vl?anosYHZiR|sdRKxHIK^Hf5R=BPxv^r}i^ zNRw0|Q_4_@Y^(I5O2tSiDv={4s6?I=tq@{9^)F1Nai(&TpGsq;agw`AuO`}2rAvu! zoJ3s^HxhkYrMD7Yr_$sNkj_t%tt3=Ikt#Kzis*eRT|@L%m98avgG$#Cy;`LuqL-?4 z1JU^^-AJ@WrRnM|WvjG-=y56yr=1nwO;jV~~}0R}eizrK^a}ROuR`ts~V)DMbX8t|dBNrR#`}P-%&1yjn_A z)2v=OOMBVj}zR_O?$cdK*^(VJD8 z-t&@5Razi=g-X-ccBMj<&LDc8N@o(Cqte+#XQ^}!(HRr1O6&3{lBOo)6P>8ig+xcI zbTQFkD!rO$Kb0;e+FhkL678tcTZwL*pp?Ix=-Wi&6rr!1k#}|)E%}$t%9?K_#JPIU z!A7o^jw)FO2Jygzu2`qnw*;+AMNgt)A zn~}a#<@8rMVc=|5IXzSk{GYDtR8FAEi2-M|%5haWiQp_#IZwt@7x9X0oa2tb{jC?P??{oOxkw9%u<;}DwFmfFvqA&3o*6f zO&papGHF!O=%g|1-V!hV!wJkq%;WO{*gImH-&kCk=%R~vCKKt=+U8>|tE&|^i8PM= zAx80+{8{^@q5R=MHfU)IKQEBIzciko(8y|*`tj1s?2o0<{OXtUTqtG!~`XU;Kx00u1pe9xEAys8dqmD7NgqaCXSvhEFVDKiXIGy3HT zju(67Oh8-bMab0$GK$#)siQO4>ND{k@vqUL{`h&Wi}Zow(s%9r8k5d+2l2t#Y}gO&__Nm_ z;m!Z?3j6weMD&a|)mgv{q>7Fe>N7_tY34Px=!m8+P?yzbOiNz*r&X`3v=g;zJO`S)r9LzI;+_T&B3RehKU-E)i7Jbxf(9haD#>w8eZ1$o`wc@wcHR5 z`)D{+!wD){xmg+`U&CSzH)^<7!#_0STdM`P(J(;6&KkyRI8?(-4J{fLYxt#taGe~| z7(Z&*prK#!xRmNYdB8BYz^mX_>P9F zG~B4+ZVjt7{7J*#HGHa}i%I8B^*4Whbl2f$j6(e@!ns6h<6nJMOkb?x`H8^gL2X?} zo>Cd5U4h8b(X;6XmS9vOStt7x54SWWcy*%v)qS>11|c@0{%TkF+0 zc{b>iuElBjC?74})YQ`7Rr%Iha-tS*qs1F;sp;69luxl1_fn%)&a5%KHGvvQ&49B? z`DAKwUoGBnQ%xs_CVfh^I1XFolcB`}wRrIjRo<+{&00K2iI2p5UsnaN6Dc2eEshs& zluyGoHGQrYuhHU9wRn{lm$mrDYwV|Mr*{>4=nT5;b+_tT>bUKnUf<=wD(;rHP-WPJ zdxzNFKQmc{WM=036*`XHylp2Y-VVY>MN@s754@C@VRB^XRzGWaPhvKoFI~CFif(&$(5&IP(C#cJ&SPXNv>)_v z_Z*h>B(YahfzC1TXdxtOoo$8hjym@Hr!B{kb_#(;8Q;49>4{JCSWfE0aepFAXd0(~ z^`DBTS?m>$q7mk4GNXt_SksiJts~bKc-%H*bua_i$5%j)rD3(%TtW{WBl7<(U`LKOfkpX(%_3=C~^e_fE43 z&wDlN<`z6|zKU>9Yoe|N&$Wo;)7j?dUW1y(so!{xdk4W;o7YyL*CNDe@z$+daIK@A zxYm)b70x+MnN4-d6F9E@M2;JMhJE-r*j;CA!5Oohq0&yAakz61%ao&=+xO0N9Ciq= zpJAWNotuX+2p5)Qge6*4YWH2yeHU~e!+^59XQTUSyCX;wT5EJuGakV&?mCa-&NZoJ z_f}kh=N1eoEmrj_k@~&ysyQU08D?e)^i@o*=ZUDS4>V z1t=3r%Kvyf6nY28h14K|PbuO_-(ZHc`2VB`XCTvdCn48o>w@s+MR( ziEf!w=!H`T0R#1mB@T*EL8@oOE4w5H7( z`f2E;p}U3#4LJ=P{#NtVX?R}4Diy8VVU1Ct;XVy_Yq&$htr~9DaHEDBG%VF{jfSf= zEY>hzLyLwp6vUy{R6&-OFiyjf8VVXFY8auRSwk-kJv20E*zj2ExrX?ap5}d+2D_H{ zsGqCR1gbQw&~UegTQ%IM;c5*FHO$j6Q$s<+7!A!DdTHpcp#f-B_GyjL*r>L+K|@Ky zIt^ifi)(q1@BbSDHyp>3rvW-YJr||qY8%?LRwDjVYv1}n#T+UY z^A-^f#O-MMuA!c~?;ZHkt|h@fy64s!P4z1@d@hqGlH)eqRr7ZPO+l#$(15RtQ+en6 z{~y5#oK^e$r4?MO75x7dsZrEWMMr?jr{v=x-AJoD$DKr|#_wHK1EX-~FU9Y*L<2kE ze*YBwFd#$N2YLl?H$o!p0>UyAOakyX1IOUH?*)Daa54hPHuMppwj;eNXTc{c+ctWg|SfrtxmOf%=0v{kygTi7l>~S2o0(=Yb3j{?EfEN)+<}z@3Jm&u}gjU2u za}(4;3F8qc1L5m^Ij)f^2Hr&=KD>5Z?-x`$2G}nVy@5_717Aj<3dR9fAW%aIt2LUC zPg42CbQe2|$T(!?U~Z3xu|E%VCU89h6|@2Pw?;n&t{R|bUJYE30!4#-KCo&abOAKs z4FpnB37DITDF&Sf^d6)(Is)i}S5<4RNbm#ED@`pZ23Rlzeo62Pfj5FUcu0TCcJJN}J}ZdL3$P~}upt1a zp+O;_vw@8Wr4S;Vxd_V-{2buW#T=If8a`_-4}ls)xJ{#Lh+lx;>4ywq{=4WgXhMCV z)*0Xh1aC#gMWCa(2H0bl+K6ai%iU-kWDJCR;N=BP zIBPFP3v>=}trdTip$6uD3)2M&#lR~Fb)f5jrw?FT23-S;uTW1s!jyw5UjVi_jG=~% z2e1smi);d*(@{(ZXcyoTgmlnL39C3R6SS3xECkxE2){$fK|%%a#S`cy=yc!~gr&p> z=A1;2K<5JoR%3WUX97*9&`Z!>z!3;LK;t?BnKchl#twU#3yW3qtb-r+9E#T3mQ%Ct%(}VHGP=)gYPaw zH{BaL>ueksJap1gO>3}Vo6-Ff_j(idjNzYn#R90J{-1c*V%6Sh%3reyarb}H^YE*s z*(kdyy>36^sH!Q>3kP=n-Cfr*-MbE(C=#}=+r6%0UDdj}b<(pJV< zui~VV)O?+_*~YT1WxLBN%4*B% z%A~S}vc@v5+)(ab?p1Cs4=ax-k10kaGO*L$ruuMb-vu|8&f;(B2{jY9VNob`F@^Vb)y OFJ8ZE@ Date: Sat, 28 Oct 2017 18:34:06 +0530 Subject: [PATCH 08/29] Update six to 1.11.0 --- news/six.vendor | 1 + src/pip/_vendor/six.py | 55 +++++++++++++++++++++++++++----------- src/pip/_vendor/vendor.txt | 2 +- 3 files changed, 41 insertions(+), 17 deletions(-) create mode 100644 news/six.vendor diff --git a/news/six.vendor b/news/six.vendor new file mode 100644 index 000000000..a81b8d628 --- /dev/null +++ b/news/six.vendor @@ -0,0 +1 @@ +Upgraded six to 1.11.0. diff --git a/src/pip/_vendor/six.py b/src/pip/_vendor/six.py index 190c0239c..6bf4fd381 100644 --- a/src/pip/_vendor/six.py +++ b/src/pip/_vendor/six.py @@ -1,6 +1,4 @@ -"""Utilities for writing code that runs on Python 2 and 3""" - -# Copyright (c) 2010-2015 Benjamin Peterson +# Copyright (c) 2010-2017 Benjamin Peterson # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -20,6 +18,8 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +"""Utilities for writing code that runs on Python 2 and 3""" + from __future__ import absolute_import import functools @@ -29,7 +29,7 @@ import sys import types __author__ = "Benjamin Peterson " -__version__ = "1.10.0" +__version__ = "1.11.0" # Useful for very coarse version differentiation. @@ -241,6 +241,7 @@ _moved_attributes = [ MovedAttribute("map", "itertools", "builtins", "imap", "map"), MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("getoutput", "commands", "subprocess"), MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), MovedAttribute("reduce", "__builtin__", "functools"), @@ -262,10 +263,11 @@ _moved_attributes = [ MovedModule("html_entities", "htmlentitydefs", "html.entities"), MovedModule("html_parser", "HTMLParser", "html.parser"), MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), - MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), @@ -337,10 +339,12 @@ _urllib_parse_moved_attributes = [ MovedAttribute("quote_plus", "urllib", "urllib.parse"), MovedAttribute("unquote", "urllib", "urllib.parse"), MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"), MovedAttribute("urlencode", "urllib", "urllib.parse"), MovedAttribute("splitquery", "urllib", "urllib.parse"), MovedAttribute("splittag", "urllib", "urllib.parse"), MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("splitvalue", "urllib", "urllib.parse"), MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), MovedAttribute("uses_params", "urlparse", "urllib.parse"), @@ -416,6 +420,8 @@ _urllib_request_moved_attributes = [ MovedAttribute("URLopener", "urllib", "urllib.request"), MovedAttribute("FancyURLopener", "urllib", "urllib.request"), MovedAttribute("proxy_bypass", "urllib", "urllib.request"), + MovedAttribute("parse_http_list", "urllib2", "urllib.request"), + MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), ] for attr in _urllib_request_moved_attributes: setattr(Module_six_moves_urllib_request, attr.name, attr) @@ -679,11 +685,15 @@ if PY3: exec_ = getattr(moves.builtins, "exec") def reraise(tp, value, tb=None): - if value is None: - value = tp() - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value + try: + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + finally: + value = None + tb = None else: def exec_(_code_, _globs_=None, _locs_=None): @@ -699,19 +709,28 @@ else: exec("""exec _code_ in _globs_, _locs_""") exec_("""def reraise(tp, value, tb=None): - raise tp, value, tb + try: + raise tp, value, tb + finally: + tb = None """) if sys.version_info[:2] == (3, 2): exec_("""def raise_from(value, from_value): - if from_value is None: - raise value - raise value from from_value + try: + if from_value is None: + raise value + raise value from from_value + finally: + value = None """) elif sys.version_info[:2] > (3, 2): exec_("""def raise_from(value, from_value): - raise value from from_value + try: + raise value from from_value + finally: + value = None """) else: def raise_from(value, from_value): @@ -802,10 +821,14 @@ def with_metaclass(meta, *bases): # This requires a bit of explanation: the basic idea is to make a dummy # metaclass for one level of class instantiation that replaces itself with # the actual metaclass. - class metaclass(meta): + class metaclass(type): def __new__(cls, name, this_bases, d): return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) return type.__new__(metaclass, 'temporary_class', (), {}) diff --git a/src/pip/_vendor/vendor.txt b/src/pip/_vendor/vendor.txt index cb0bef99f..4c1bacad9 100644 --- a/src/pip/_vendor/vendor.txt +++ b/src/pip/_vendor/vendor.txt @@ -2,7 +2,7 @@ appdirs==1.4.3 distlib==0.2.6 distro==1.0.4 html5lib==1.0b10 -six==1.10.0 +six==1.11.0 colorama==0.3.9 CacheControl==0.12.3 msgpack-python==0.4.8 From 058f3b695ff5d0e532ebd5094ad74e20946df59c Mon Sep 17 00:00:00 2001 From: Pradyun Gedam Date: Sat, 28 Oct 2017 18:35:09 +0530 Subject: [PATCH 09/29] Update pkg_resources (via setuptools) to 36.6.0. --- news/setuptools.vendor | 2 +- src/pip/_vendor/pkg_resources/__init__.py | 162 +++++++++++++++------- src/pip/_vendor/vendor.txt | 2 +- 3 files changed, 117 insertions(+), 49 deletions(-) diff --git a/news/setuptools.vendor b/news/setuptools.vendor index ee4bec501..482b819a5 100644 --- a/news/setuptools.vendor +++ b/news/setuptools.vendor @@ -1 +1 @@ -Upgraded pkg_resources (via setuptools) to 36.4.0. +Upgraded pkg_resources (via setuptools) to 36.6.0. diff --git a/src/pip/_vendor/pkg_resources/__init__.py b/src/pip/_vendor/pkg_resources/__init__.py index 9168bd3bb..64189c9dd 100644 --- a/src/pip/_vendor/pkg_resources/__init__.py +++ b/src/pip/_vendor/pkg_resources/__init__.py @@ -2028,51 +2028,121 @@ def find_on_path(importer, path_item, only=False): path_item, os.path.join(path_item, 'EGG-INFO') ) ) - else: - try: - entries = os.listdir(path_item) - except (PermissionError, NotADirectoryError): - return - except OSError as e: - # Ignore the directory if does not exist, not a directory or we - # don't have permissions - if (e.errno in (errno.ENOTDIR, errno.EACCES, errno.ENOENT) - # Python 2 on Windows needs to be handled this way :( - or hasattr(e, "winerror") and e.winerror == 267): - return + return + + entries = safe_listdir(path_item) + + # for performance, before sorting by version, + # screen entries for only those that will yield + # distributions + filtered = ( + entry + for entry in entries + if dist_factory(path_item, entry, only) + ) + + # scan for .egg and .egg-info in directory + path_item_entries = _by_version_descending(filtered) + for entry in path_item_entries: + fullpath = os.path.join(path_item, entry) + factory = dist_factory(path_item, entry, only) + for dist in factory(fullpath): + yield dist + + +def dist_factory(path_item, entry, only): + """ + Return a dist_factory for a path_item and entry + """ + lower = entry.lower() + is_meta = any(map(lower.endswith, ('.egg-info', '.dist-info'))) + return ( + distributions_from_metadata + if is_meta else + find_distributions + if not only and _is_egg_path(entry) else + resolve_egg_link + if not only and lower.endswith('.egg-link') else + NoDists() + ) + + +class NoDists: + """ + >>> bool(NoDists()) + False + + >>> list(NoDists()('anything')) + [] + """ + def __bool__(self): + return False + if six.PY2: + __nonzero__ = __bool__ + + def __call__(self, fullpath): + return iter(()) + + +def safe_listdir(path): + """ + Attempt to list contents of path, but suppress some exceptions. + """ + try: + return os.listdir(path) + except (PermissionError, NotADirectoryError): + pass + except OSError as e: + # Ignore the directory if does not exist, not a directory or + # permission denied + ignorable = ( + e.errno in (errno.ENOTDIR, errno.EACCES, errno.ENOENT) + # Python 2 on Windows needs to be handled this way :( + or getattr(e, "winerror", None) == 267 + ) + if not ignorable: raise - # scan for .egg and .egg-info in directory - path_item_entries = _by_version_descending(entries) - for entry in path_item_entries: - lower = entry.lower() - if lower.endswith('.egg-info') or lower.endswith('.dist-info'): - fullpath = os.path.join(path_item, entry) - if os.path.isdir(fullpath): - # egg-info directory, allow getting metadata - if len(os.listdir(fullpath)) == 0: - # Empty egg directory, skip. - continue - metadata = PathMetadata(path_item, fullpath) - else: - metadata = FileMetadata(fullpath) - yield Distribution.from_location( - path_item, entry, metadata, precedence=DEVELOP_DIST - ) - elif not only and _is_egg_path(entry): - dists = find_distributions(os.path.join(path_item, entry)) - for dist in dists: - yield dist - elif not only and lower.endswith('.egg-link'): - with open(os.path.join(path_item, entry)) as entry_file: - entry_lines = entry_file.readlines() - for line in entry_lines: - if not line.strip(): - continue - path = os.path.join(path_item, line.rstrip()) - dists = find_distributions(path) - for item in dists: - yield item - break + return () + + +def distributions_from_metadata(path): + root = os.path.dirname(path) + if os.path.isdir(path): + if len(os.listdir(path)) == 0: + # empty metadata dir; skip + return + metadata = PathMetadata(root, path) + else: + metadata = FileMetadata(path) + entry = os.path.basename(path) + yield Distribution.from_location( + root, entry, metadata, precedence=DEVELOP_DIST, + ) + + +def non_empty_lines(path): + """ + Yield non-empty lines from file at path + """ + with open(path) as f: + for line in f: + line = line.strip() + if line: + yield line + + +def resolve_egg_link(path): + """ + Given a path to an .egg-link, resolve distributions + present in the referenced path. + """ + referenced_paths = non_empty_lines(path) + resolved_paths = ( + os.path.join(os.path.dirname(path), ref) + for ref in referenced_paths + ) + dist_groups = map(find_distributions, resolved_paths) + return next(dist_groups, ()) register_finder(pkgutil.ImpImporter, find_on_path) @@ -2250,9 +2320,7 @@ def _is_egg_path(path): """ Determine if given path appears to be an egg. """ - return ( - path.lower().endswith('.egg') - ) + return path.lower().endswith('.egg') def _is_unpacked_egg(path): diff --git a/src/pip/_vendor/vendor.txt b/src/pip/_vendor/vendor.txt index 4c1bacad9..5597bd990 100644 --- a/src/pip/_vendor/vendor.txt +++ b/src/pip/_vendor/vendor.txt @@ -18,5 +18,5 @@ requests==2.18.4 idna==2.6 urllib3==1.22 certifi==2017.7.27.1 -setuptools==36.4.0 +setuptools==36.6.0 webencodings==0.5.1 From 4e97d3d5f901c4aeec7b9d6e16960c62f9ea8815 Mon Sep 17 00:00:00 2001 From: Calvin Smith Date: Mon, 30 Oct 2017 22:43:46 -0700 Subject: [PATCH 10/29] Freeze not installed (#4292, #4293) --- news/4293.bugfix | 5 ++ src/pip/_internal/operations/freeze.py | 30 ++++++++--- tests/functional/test_freeze.py | 72 ++++++++++++++++++++++++++ 3 files changed, 101 insertions(+), 6 deletions(-) create mode 100644 news/4293.bugfix diff --git a/news/4293.bugfix b/news/4293.bugfix new file mode 100644 index 000000000..643ee1ea0 --- /dev/null +++ b/news/4293.bugfix @@ -0,0 +1,5 @@ +Fix for an incorrect ``freeze`` warning message due to a package being +included in multiple requirements files that were passed to ``freeze``. +Instead of warning incorrectly that the package is not installed, pip +now warns that the package was declared multiple times and lists the +name of each requirements file that contains the package in question. diff --git a/src/pip/_internal/operations/freeze.py b/src/pip/_internal/operations/freeze.py index 09b03f0bd..adaa8d093 100644 --- a/src/pip/_internal/operations/freeze.py +++ b/src/pip/_internal/operations/freeze.py @@ -1,11 +1,12 @@ from __future__ import absolute_import +import collections import logging import os import re import warnings -from pip._vendor import pkg_resources +from pip._vendor import pkg_resources, six from pip._vendor.packaging.utils import canonicalize_name from pip._vendor.pkg_resources import RequirementParseError @@ -70,6 +71,9 @@ def freeze( # requirements files, so we need to keep track of what has been emitted # so that we don't emit it again if it's seen again emitted_options = set() + # keep track of which files a requirement is in so that we can + # give an accurate warning if a requirement appears multiple times. + req_files = collections.defaultdict(list) for req_file_path in requirement: with open(req_file_path) as req_file: for line in req_file: @@ -119,14 +123,28 @@ def freeze( " this warning)" ) elif line_req.name not in installations: - logger.warning( - "Requirement file [%s] contains %s, but that " - "package is not installed", - req_file_path, COMMENT_RE.sub('', line).strip(), - ) + # either it's not installed, or it is installed + # but has been processed already + if not req_files[line_req.name]: + logger.warning( + "Requirement file [%s] contains %s, but that " + "package is not installed", + req_file_path, + COMMENT_RE.sub('', line).strip(), + ) + else: + req_files[line_req.name].append(req_file_path) else: yield str(installations[line_req.name]).rstrip() del installations[line_req.name] + req_files[line_req.name].append(req_file_path) + + # Warn about requirements that were included multiple times (in a + # single requirements file or in different requirements files). + for name, files in six.iteritems(req_files): + if len(files) > 1: + logger.warning("Requirement %s included multiple times [%s]", + name, ', '.join(sorted(set(files)))) yield( '## The following requirements were added by ' diff --git a/tests/functional/test_freeze.py b/tests/functional/test_freeze.py index d3a0278fd..fae7a4466 100644 --- a/tests/functional/test_freeze.py +++ b/tests/functional/test_freeze.py @@ -498,6 +498,78 @@ def test_freeze_with_requirement_option_multiple(script): assert result.stdout.count("--index-url http://ignore") == 1 +def test_freeze_with_requirement_option_package_repeated_one_file(script): + """ + Test freezing with single requirements file that contains a package + multiple times + """ + script.scratch_path.join('hint1.txt').write(textwrap.dedent("""\ + simple2 + simple2 + NoExist + """) + _freeze_req_opts) + result = script.pip_install_local('simple2==1.0') + result = script.pip_install_local('meta') + result = script.pip( + 'freeze', '--requirement', 'hint1.txt', + expect_stderr=True, + ) + expected_out = textwrap.dedent("""\ + simple2==1.0 + """) + expected_out += _freeze_req_opts + expected_out += "## The following requirements were added by pip freeze:" + expected_out += os.linesep + textwrap.dedent("""\ + ...meta==1.0... + """) + _check_output(result.stdout, expected_out) + err1 = ("Requirement file [hint1.txt] contains NoExist, " + "but that package is not installed\n") + err2 = "Requirement simple2 included multiple times [hint1.txt]\n" + assert err1 in result.stderr + assert err2 in result.stderr + # there shouldn't be any other 'is not installed' warnings + assert result.stderr.count('is not installed') == 1 + + +def test_freeze_with_requirement_option_package_repeated_multi_file(script): + """ + Test freezing with multiple requirements file that contain a package + """ + script.scratch_path.join('hint1.txt').write(textwrap.dedent("""\ + simple + """) + _freeze_req_opts) + script.scratch_path.join('hint2.txt').write(textwrap.dedent("""\ + simple + NoExist + """) + _freeze_req_opts) + result = script.pip_install_local('simple==1.0') + result = script.pip_install_local('meta') + result = script.pip( + 'freeze', '--requirement', 'hint1.txt', + '--requirement', 'hint2.txt', + expect_stderr=True, + ) + expected_out = textwrap.dedent("""\ + simple==1.0 + """) + expected_out += _freeze_req_opts + expected_out += "## The following requirements were added by pip freeze:" + expected_out += os.linesep + textwrap.dedent("""\ + ...meta==1.0... + """) + _check_output(result.stdout, expected_out) + + err1 = ("Requirement file [hint2.txt] contains NoExist, but that " + "package is not installed\n") + err2 = ("Requirement simple included multiple times " + "[hint1.txt, hint2.txt]\n") + assert err1 in result.stderr + assert err2 in result.stderr + # there shouldn't be any other 'is not installed' warnings + assert result.stderr.count('is not installed') == 1 + + @pytest.mark.network def test_freeze_user(script, virtualenv, data): """ From 288a10b17acb71b81cfdcca1dd33b252217a2c9b Mon Sep 17 00:00:00 2001 From: Benoit Pierre Date: Fri, 3 Nov 2017 15:36:47 +0100 Subject: [PATCH 11/29] tests: fix `freeze` integration tests on Windows (#4832) --- tests/functional/test_freeze.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/functional/test_freeze.py b/tests/functional/test_freeze.py index fae7a4466..1846e7290 100644 --- a/tests/functional/test_freeze.py +++ b/tests/functional/test_freeze.py @@ -519,7 +519,7 @@ def test_freeze_with_requirement_option_package_repeated_one_file(script): """) expected_out += _freeze_req_opts expected_out += "## The following requirements were added by pip freeze:" - expected_out += os.linesep + textwrap.dedent("""\ + expected_out += '\n' + textwrap.dedent("""\ ...meta==1.0... """) _check_output(result.stdout, expected_out) @@ -555,7 +555,7 @@ def test_freeze_with_requirement_option_package_repeated_multi_file(script): """) expected_out += _freeze_req_opts expected_out += "## The following requirements were added by pip freeze:" - expected_out += os.linesep + textwrap.dedent("""\ + expected_out += '\n' + textwrap.dedent("""\ ...meta==1.0... """) _check_output(result.stdout, expected_out) From e8bdaa76e5fbb1439eab175676cb470de57860b4 Mon Sep 17 00:00:00 2001 From: "Pradyun S. Gedam" Date: Thu, 3 Aug 2017 04:54:03 +0530 Subject: [PATCH 12/29] Use return values instead of attributes --- src/pip/_internal/commands/uninstall.py | 5 +++-- src/pip/_internal/req/req_install.py | 5 +++-- src/pip/_internal/req/req_set.py | 8 +++++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/pip/_internal/commands/uninstall.py b/src/pip/_internal/commands/uninstall.py index 6b94d6bfd..99c46deb0 100644 --- a/src/pip/_internal/commands/uninstall.py +++ b/src/pip/_internal/commands/uninstall.py @@ -64,7 +64,8 @@ class UninstallCommand(Command): '"pip help %(name)s")' % dict(name=self.name) ) for req in reqs_to_uninstall.values(): - req.uninstall( + uninstall_pathset = req.uninstall( auto_confirm=options.yes, verbose=options.verbose != 0 ) - req.uninstalled_pathset.commit() + if uninstall_pathset: + uninstall_pathset.commit() diff --git a/src/pip/_internal/req/req_install.py b/src/pip/_internal/req/req_install.py index d3c0eacfa..62908f71e 100644 --- a/src/pip/_internal/req/req_install.py +++ b/src/pip/_internal/req/req_install.py @@ -653,8 +653,9 @@ class InstallRequirement(object): ) dist = self.satisfied_by or self.conflicts_with - self.uninstalled_pathset = UninstallPathSet.from_dist(dist) - self.uninstalled_pathset.remove(auto_confirm, verbose) + uninstalled_pathset = UninstallPathSet.from_dist(dist) + uninstalled_pathset.remove(auto_confirm, verbose) + return uninstalled_pathset def archive(self, build_dir): assert self.source_dir diff --git a/src/pip/_internal/req/req_set.py b/src/pip/_internal/req/req_set.py index d943de748..fb07120e8 100644 --- a/src/pip/_internal/req/req_set.py +++ b/src/pip/_internal/req/req_set.py @@ -216,7 +216,9 @@ class RequirementSet(object): requirement.conflicts_with, ) with indent_log(): - requirement.uninstall(auto_confirm=True) + uninstalled_pathset = requirement.uninstall( + auto_confirm=True + ) try: requirement.install( install_options, @@ -231,7 +233,7 @@ class RequirementSet(object): ) # if install did not succeed, rollback previous uninstall if should_rollback: - requirement.uninstalled_pathset.rollback() + uninstalled_pathset.rollback() raise else: should_commit = ( @@ -239,7 +241,7 @@ class RequirementSet(object): requirement.install_succeeded ) if should_commit: - requirement.uninstalled_pathset.commit() + uninstalled_pathset.commit() requirement.remove_temporary_source() return to_install From 8222d788f6f22caa2bdb0b5cb9242ea928bad3b8 Mon Sep 17 00:00:00 2001 From: "Pradyun S. Gedam" Date: Thu, 3 Aug 2017 04:55:21 +0530 Subject: [PATCH 13/29] Switch pip uninstall behaviour to be idempotent pip uninstall no longer aborts if a package is not installed; instead it prints a warning that the package is not installed and it is skipping the uninstallation of it for this reason. --- src/pip/_internal/req/req_install.py | 5 ++--- tests/functional/test_uninstall.py | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/pip/_internal/req/req_install.py b/src/pip/_internal/req/req_install.py index 62908f71e..43b85665b 100644 --- a/src/pip/_internal/req/req_install.py +++ b/src/pip/_internal/req/req_install.py @@ -648,9 +648,8 @@ class InstallRequirement(object): """ if not self.check_if_exists(): - raise UninstallationError( - "Cannot uninstall requirement %s, not installed" % (self.name,) - ) + logger.warning("Skipping %s as it is not installed.", self.name) + return dist = self.satisfied_by or self.conflicts_with uninstalled_pathset = UninstallPathSet.from_dist(dist) diff --git a/tests/functional/test_uninstall.py b/tests/functional/test_uninstall.py index 633d3d350..609d28393 100644 --- a/tests/functional/test_uninstall.py +++ b/tests/functional/test_uninstall.py @@ -468,3 +468,25 @@ def test_uninstall_editable_and_pip_install(script, data): ) in uninstall2.files_deleted, list(uninstall2.files_deleted.keys()) list_result2 = script.pip('list', '--format=json') assert "FSPkg" not in {p["name"] for p in json.loads(list_result2.stdout)} + + +def test_uninstall_ignores_missing_packages(script, data): + """Uninstall of a non existent package prints a warning and exits cleanly + """ + result = script.pip( + 'uninstall', '-y', 'non-existent-pkg', expect_stderr=True, + ) + + assert "Skipping non-existent-pkg as it is not installed." in result.stderr + assert result.returncode == 0, "Expected clean exit" + + +def test_uninstall_ignores_missing_packages_and_uninstalls_rest(script, data): + script.pip_install_local('simple') + result = script.pip( + 'uninstall', '-y', 'non-existent-pkg', 'simple', expect_stderr=True, + ) + + assert "Skipping non-existent-pkg as it is not installed." in result.stderr + assert "Successfully uninstalled simple" in result.stdout + assert result.returncode == 0, "Expected clean exit" From fb47e1814fafe85fed2e9bb8696ce0f89f1137e6 Mon Sep 17 00:00:00 2001 From: Pradyun Gedam Date: Wed, 25 Oct 2017 13:23:34 +0530 Subject: [PATCH 14/29] :newspaper: --- news/3016.feature | 1 + news/4642.feature | 1 + 2 files changed, 2 insertions(+) create mode 100644 news/3016.feature create mode 100644 news/4642.feature diff --git a/news/3016.feature b/news/3016.feature new file mode 100644 index 000000000..85a15d089 --- /dev/null +++ b/news/3016.feature @@ -0,0 +1 @@ +pip uninstall now ignores the absence of a requirement and prints a warning. diff --git a/news/4642.feature b/news/4642.feature new file mode 100644 index 000000000..85a15d089 --- /dev/null +++ b/news/4642.feature @@ -0,0 +1 @@ +pip uninstall now ignores the absence of a requirement and prints a warning. From dcf3ac673680844047b65226f5571d3a9ad50fe3 Mon Sep 17 00:00:00 2001 From: Paul Moore Date: Fri, 3 Nov 2017 17:00:13 +0000 Subject: [PATCH 15/29] Documentation fixes (#4831) - Wheel doesn't have a public API - Reword warning about installing into a running interpreter --- docs/user_guide.rst | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/user_guide.rst b/docs/user_guide.rst index 1c9f4636c..7e7db6389 100644 --- a/docs/user_guide.rst +++ b/docs/user_guide.rst @@ -728,7 +728,7 @@ change without notice. While we do try not to break things as much as possible, the internal APIs can change at any time, for any reason. It also means that we generally *won't* fix issues that are a result of using pip in an unsupported way. -It should also be noted that modifying the contents of ``sys.path`` in a running Python +It should also be noted that installing packages into ``sys.path`` in a running Python process is something that should only be done with care. The import system caches certain data, and installing new packages while a program is running may not always behave as expected. In practice, there is rarely an issue, but it is something to be @@ -756,7 +756,5 @@ of ability. Some examples that you could consider include: * ``setuptools`` (specifically ``pkg_resources``) - Functions for querying what packages the user has installed on their system. -* ``wheel`` - Code for manipulating (creating, querying and installing) wheels. - * ``distlib`` - Packaging and distribution utilities (including functions for interacting with PyPI). From fb56eb9b0ae112cf81501d8905022b31ad66bd3e Mon Sep 17 00:00:00 2001 From: Benoit Pierre Date: Sat, 4 Nov 2017 15:58:40 +0100 Subject: [PATCH 16/29] tox: fix handling of flaky tests during CI builds --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 8a0116b14..cb5a262cc 100644 --- a/tox.ini +++ b/tox.ini @@ -4,7 +4,7 @@ envlist = py27, py33, py34, py35, py36, py37, pypy [testenv] -passenv = GIT_SSL_CAINFO +passenv = CI GIT_SSL_CAINFO setenv = # This is required in order to get UTF-8 output inside of the subprocesses # that our tests use. From cf989e5ace4dcde49e0ebc1360497e5e313586bf Mon Sep 17 00:00:00 2001 From: Pradyun Gedam Date: Sun, 5 Nov 2017 08:54:56 +0530 Subject: [PATCH 17/29] tests: github repositories should use https (#4838) --- tests/functional/test_install_vcs.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/functional/test_install_vcs.py b/tests/functional/test_install_vcs.py index 1ec674baa..4aa27a60b 100644 --- a/tests/functional/test_install_vcs.py +++ b/tests/functional/test_install_vcs.py @@ -184,7 +184,7 @@ def test_git_with_tag_name_and_update(script, tmpdir): result = script.pip( 'install', '-e', '%s#egg=pip-test-package' % local_checkout( - 'git+http://github.com/pypa/pip-test-package.git', + 'git+https://github.com/pypa/pip-test-package.git', tmpdir.join("cache"), ), expect_error=True, @@ -194,7 +194,7 @@ def test_git_with_tag_name_and_update(script, tmpdir): 'install', '--global-option=--version', '-e', '%s@0.1.2#egg=pip-test-package' % local_checkout( - 'git+http://github.com/pypa/pip-test-package.git', + 'git+https://github.com/pypa/pip-test-package.git', tmpdir.join("cache"), ), expect_error=True, @@ -211,7 +211,7 @@ def test_git_branch_should_not_be_changed(script, tmpdir): script.pip( 'install', '-e', '%s#egg=pip-test-package' % local_checkout( - 'git+http://github.com/pypa/pip-test-package.git', + 'git+https://github.com/pypa/pip-test-package.git', tmpdir.join("cache"), ), expect_error=True, @@ -229,7 +229,7 @@ def test_git_with_non_editable_unpacking(script, tmpdir): result = script.pip( 'install', '--global-option=--version', local_checkout( - 'git+http://github.com/pypa/pip-test-package.git@0.1.2' + 'git+https://github.com/pypa/pip-test-package.git@0.1.2' '#egg=pip-test-package', tmpdir.join("cache") ), From 4370a5a37b3a43ed806a592a46f2afaf427706d9 Mon Sep 17 00:00:00 2001 From: Oz N Tiram Date: Sun, 5 Nov 2017 10:53:57 +0100 Subject: [PATCH 18/29] Add a global option to disable colors (#4739) * Add a global option to disable colors This is a fix for issue #2449 All it does is simply add a global option --no-color Internally it switches ColorizedStreamHandler to StreamHandler if this flag is detected. * Fix lint errors * not sure it makes the code more readable though ... * Fix typo * Choose logging class before assigning * As requested per review * Make the code shorter and easier to follow * Be polite to followers, add commas * Add functional test for the --no-color output * Better detection of windows * Fix fragile tests - can't trust script --quiet * The version found in Travis-CI does not respect this flag It added a prefix line and suffix line found if one does not add the flag --quiet (script from util-linux 2.26.2). As such the out put is: Script started on Fri 27 Oct 2017 07:17:30 AM CEST \x1b[31mCannot uninstall requirement noSuchPackage, not installed\x1b[0m\n Script done on Fri 27 Oct 2017 07:17:31 AM CEST With this change, the test should pass, and is hopefully more stable. * Simplify testing for color or no-color --- docs/reference/pip.rst | 4 ++- news/2449.feature | 2 ++ src/pip/_internal/basecommand.py | 11 ++++++--- src/pip/_internal/cmdoptions.py | 10 ++++++++ tests/functional/test_no_color.py | 41 +++++++++++++++++++++++++++++++ 5 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 news/2449.feature create mode 100644 tests/functional/test_no_color.py diff --git a/docs/reference/pip.rst b/docs/reference/pip.rst index 0e1e52135..df312eccd 100644 --- a/docs/reference/pip.rst +++ b/docs/reference/pip.rst @@ -22,7 +22,9 @@ Console logging ~~~~~~~~~~~~~~~ pip offers :ref:`-v, --verbose <--verbose>` and :ref:`-q, --quiet <--quiet>` -to control the console log level. +to control the console log level. By default, some messages (error and warnings) +are colored in the terminal. If you want to suppress the colored output use +:ref:`--no-color <--no-color>`. .. _`FileLogging`: diff --git a/news/2449.feature b/news/2449.feature new file mode 100644 index 000000000..62410a67a --- /dev/null +++ b/news/2449.feature @@ -0,0 +1,2 @@ +Add `--no-color` to `pip`. All colored output is disabled +if this flag is detected. diff --git a/src/pip/_internal/basecommand.py b/src/pip/_internal/basecommand.py index 21aa8d950..d7c643b70 100644 --- a/src/pip/_internal/basecommand.py +++ b/src/pip/_internal/basecommand.py @@ -132,6 +132,11 @@ class Command(object): if options.log: root_level = "DEBUG" + if options.no_color: + logger_class = "logging.StreamHandler" + else: + logger_class = "pip._internal.utils.logging.ColorizedStreamHandler" + logging.config.dictConfig({ "version": 1, "disable_existing_loggers": False, @@ -150,16 +155,14 @@ class Command(object): "handlers": { "console": { "level": level, - "class": - "pip._internal.utils.logging.ColorizedStreamHandler", + "class": logger_class, "stream": self.log_streams[0], "filters": ["exclude_warnings"], "formatter": "indent", }, "console_errors": { "level": "WARNING", - "class": - "pip._internal.utils.logging.ColorizedStreamHandler", + "class": logger_class, "stream": self.log_streams[1], "formatter": "indent", }, diff --git a/src/pip/_internal/cmdoptions.py b/src/pip/_internal/cmdoptions.py index acf73ed66..cdba7acb1 100644 --- a/src/pip/_internal/cmdoptions.py +++ b/src/pip/_internal/cmdoptions.py @@ -102,6 +102,15 @@ verbose = partial( help='Give more output. Option is additive, and can be used up to 3 times.' ) +no_color = partial( + Option, + '--no-color', + dest='no_color', + action='store_true', + default=False, + help="Suppress colored output", +) + version = partial( Option, '-V', '--version', @@ -566,6 +575,7 @@ general_group = { cache_dir, no_cache, disable_pip_version_check, + no_color, ] } diff --git a/tests/functional/test_no_color.py b/tests/functional/test_no_color.py new file mode 100644 index 000000000..e2fbcc9ef --- /dev/null +++ b/tests/functional/test_no_color.py @@ -0,0 +1,41 @@ +""" +Test specific for the --no-color option +""" +import os +import platform +import subprocess as sp +import sys + +import pytest + + +@pytest.mark.skipif(sys.platform == 'win32', + reason="does not run on windows") +def test_no_color(script): + + """ + Test uninstalling an existing package - should out put red error + + We must use subprocess with the script command, since redirection + in unix platform causes text coloring to disapper. Thus, we can't + use the testing infrastructure that other options has. + """ + + sp.Popen("script --flush --quiet --return /tmp/colored-output.txt" + " --command \"pip uninstall noSuchPackage\"", shell=True, + stdout=sp.PIPE, stderr=sp.PIPE).communicate() + + with open("/tmp/colored-output.txt", "r") as result: + assert "\x1b[31m" in result.read() + + os.unlink("/tmp/colored-output.txt") + + sp.Popen("script --flush --quiet --return /tmp/no-color-output.txt" + " --command \"pip --no-color uninstall noSuchPackage\"", + shell=True, + stdout=sp.PIPE, stderr=sp.PIPE).communicate() + + with open("/tmp/no-color-output.txt", "r") as result: + assert "\x1b[31m" not in result.read() + + os.unlink("/tmp/no-color-output.txt") From b1f949a81647acf9e288fdbf477a08d465ba109c Mon Sep 17 00:00:00 2001 From: Min RK Date: Fri, 3 Jul 2015 15:52:02 -0700 Subject: [PATCH 19/29] handle missing trailing newline in uninstall_pth --- src/pip/_internal/req/req_uninstall.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pip/_internal/req/req_uninstall.py b/src/pip/_internal/req/req_uninstall.py index 2777adb40..31271a17c 100644 --- a/src/pip/_internal/req/req_uninstall.py +++ b/src/pip/_internal/req/req_uninstall.py @@ -430,6 +430,9 @@ class UninstallPthEntries(object): endline = '\r\n' else: endline = '\n' + # handle missing trailing newline + if lines and not lines[-1].endswith(endline.encode("utf-8")): + lines[-1] = lines[-1] + endline.encode("utf-8") for entry in self.entries: try: logger.debug('Removing entry: %s', entry) From 0715d67bb25b2f6758b356988e996f75d5f1254d Mon Sep 17 00:00:00 2001 From: Min RK Date: Sun, 5 Nov 2017 16:16:10 +0100 Subject: [PATCH 20/29] add news for missing-newline fix --- news/3741.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 news/3741.bugfix diff --git a/news/3741.bugfix b/news/3741.bugfix new file mode 100644 index 000000000..6691bd81b --- /dev/null +++ b/news/3741.bugfix @@ -0,0 +1 @@ +Fix ``pip uninstall`` when ``easy-install.pth`` lacks a trailing newline. From b734d6e30da55f5c80be8b6c1cb1f06c70c38c7f Mon Sep 17 00:00:00 2001 From: Min RK Date: Sun, 5 Nov 2017 16:36:16 +0100 Subject: [PATCH 21/29] test trailing-newline uninstall behavior --- tests/functional/test_uninstall.py | 33 ++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tests/functional/test_uninstall.py b/tests/functional/test_uninstall.py index 609d28393..8ab346bf6 100644 --- a/tests/functional/test_uninstall.py +++ b/tests/functional/test_uninstall.py @@ -100,6 +100,39 @@ def test_uninstall_easy_install_after_import(script): ) +@pytest.mark.network +def test_uninstall_trailing_newline(script): + """ + Uninstall behaves appropriately if easy-install.pth + lacks a trailing newline + + """ + script.run('easy_install', 'INITools==0.2', expect_stderr=True) + script.run('easy_install', 'PyLogo', expect_stderr=True) + easy_install_pth = script.site_packages_path / 'easy-install.pth' + + # trim trailing newline from easy-install.pth + with open(easy_install_pth) as f: + pth_before = f.read() + + with open(easy_install_pth, 'w') as f: + f.write(pth_before.rstrip()) + + # uninstall initools + script.pip('uninstall', 'INITools', '-y') + with open(easy_install_pth) as f: + pth_after = f.read() + + # verify that only initools is removed + before_without_initools = [ + line for line in pth_before.splitlines() + if 'initools' not in line.lower() + ] + lines_after = pth_after.splitlines() + + assert lines_after == before_without_initools + + @pytest.mark.network def test_uninstall_namespace_package(script): """ From ce146f66663b0e3f6b41af985f06703c436a390d Mon Sep 17 00:00:00 2001 From: Pradyun Gedam Date: Mon, 6 Nov 2017 00:52:36 +0530 Subject: [PATCH 22/29] tests: don't check the actual sequence in test --- tests/functional/test_no_color.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/functional/test_no_color.py b/tests/functional/test_no_color.py index e2fbcc9ef..5977046bf 100644 --- a/tests/functional/test_no_color.py +++ b/tests/functional/test_no_color.py @@ -26,7 +26,7 @@ def test_no_color(script): stdout=sp.PIPE, stderr=sp.PIPE).communicate() with open("/tmp/colored-output.txt", "r") as result: - assert "\x1b[31m" in result.read() + assert "\x1b" in result.read() os.unlink("/tmp/colored-output.txt") @@ -36,6 +36,6 @@ def test_no_color(script): stdout=sp.PIPE, stderr=sp.PIPE).communicate() with open("/tmp/no-color-output.txt", "r") as result: - assert "\x1b[31m" not in result.read() + assert "\x1b" not in result.read() os.unlink("/tmp/no-color-output.txt") From dfa685548fd484cc2adc4ca451d4bb8fa2f3fd41 Mon Sep 17 00:00:00 2001 From: Pradyun Gedam Date: Tue, 7 Nov 2017 12:28:35 +0530 Subject: [PATCH 23/29] docs: fix some indentation issues in quickstart --- docs/quickstart.rst | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/docs/quickstart.rst b/docs/quickstart.rst index efd6d3486..da382aa1e 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -8,8 +8,8 @@ Install a package from `PyPI`_: :: $ pip install SomePackage - [...] - Successfully installed SomePackage + [...] + Successfully installed SomePackage Install a package already downloaded from `PyPI`_ or got elsewhere. This is useful if the target machine does not have a network connection: @@ -17,49 +17,49 @@ This is useful if the target machine does not have a network connection: :: $ pip install SomePackage-1.0-py2.py3-none-any.whl - [...] - Successfully installed SomePackage + [...] + Successfully installed SomePackage Show what files were installed: :: $ pip show --files SomePackage - Name: SomePackage - Version: 1.0 - Location: /my/env/lib/pythonx.x/site-packages - Files: - ../somepackage/__init__.py - [...] + Name: SomePackage + Version: 1.0 + Location: /my/env/lib/pythonx.x/site-packages + Files: + ../somepackage/__init__.py + [...] List what packages are outdated: :: $ pip list --outdated - SomePackage (Current: 1.0 Latest: 2.0) + SomePackage (Current: 1.0 Latest: 2.0) Upgrade a package: :: $ pip install --upgrade SomePackage - [...] - Found existing installation: SomePackage 1.0 - Uninstalling SomePackage: - Successfully uninstalled SomePackage - Running setup.py install for SomePackage - Successfully installed SomePackage + [...] + Found existing installation: SomePackage 1.0 + Uninstalling SomePackage: + Successfully uninstalled SomePackage + Running setup.py install for SomePackage + Successfully installed SomePackage Uninstall a package: :: $ pip uninstall SomePackage - Uninstalling SomePackage: - /my/env/lib/pythonx.x/site-packages/somepackage - Proceed (y/n)? y - Successfully uninstalled SomePackage + Uninstalling SomePackage: + /my/env/lib/pythonx.x/site-packages/somepackage + Proceed (y/n)? y + Successfully uninstalled SomePackage .. _PyPI: http://pypi.python.org/pypi/ From 8dc824af66ac4bd6dc2cb937465eb25741f3c145 Mon Sep 17 00:00:00 2001 From: Pradyun Gedam Date: Thu, 9 Nov 2017 07:09:56 +0530 Subject: [PATCH 24/29] Minor README updates (#4849) * misc: switch docs badge to latest * misc: Minor cleanups in README Move all the links to the botton, rewrap lines. --- README.rst | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/README.rst b/README.rst index 65f255a0a..1b2c95471 100644 --- a/README.rst +++ b/README.rst @@ -1,9 +1,7 @@ pip === -The `PyPA recommended -`_ -tool for installing Python packages. +The `PyPA recommended`_ tool for installing Python packages. .. image:: https://img.shields.io/pypi/v/pip.svg :target: https://pypi.python.org/pypi/pip @@ -14,24 +12,31 @@ tool for installing Python packages. .. image:: https://img.shields.io/appveyor/ci/pypa/pip.svg :target: https://ci.appveyor.com/project/pypa/pip/history -.. image:: https://readthedocs.org/projects/pip/badge/?version=stable - :target: https://pip.pypa.io/en/stable +.. image:: https://readthedocs.org/projects/pip/badge/?version=latest + :target: https://pip.pypa.io/en/latest -* `Installation `_ -* `Documentation `_ -* `Changelog `_ -* `GitHub Page `_ -* `Issue Tracking `_ -* `User mailing list `_ -* `Dev mailing list `_ +* `Installation`_ +* `Documentation`_ +* `Changelog`_ +* `GitHub Page`_ +* `Issue Tracking`_ +* `User mailing list`_ +* `Dev mailing list`_ * User IRC: #pypa on Freenode. * Dev IRC: #pypa-dev on Freenode. - Code of Conduct --------------- Everyone interacting in the pip project's codebases, issue trackers, chat -rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_. +rooms and mailing lists is expected to follow the `PyPA Code of Conduct`_. +.. _PyPA recommended: https://packaging.python.org/en/latest/current/ +.. _Installation: https://pip.pypa.io/en/stable/installing.html +.. _Documentation: https://pip.pypa.io/en/stable/ +.. _Changelog: https://pip.pypa.io/en/stable/news.html +.. _GitHub Page: https://github.com/pypa/pip +.. _Issue Tracking: https://github.com/pypa/pip/issues +.. _User mailing list: http://groups.google.com/group/python-virtualenv> +.. _Dev mailing list: http://groups.google.com/group/pypa-dev> .. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ From e9a0e4c3cd21a29d86e00ae2da1c83291ef39a84 Mon Sep 17 00:00:00 2001 From: Erwin Janssen Date: Fri, 10 Nov 2017 12:21:38 +0100 Subject: [PATCH 25/29] Fix typos in mailing list links in README (#4850) The links to the mailing lists contained a trailing '>', resulting in a 404 error. --- README.rst | 4 ++-- news/bc8c3a60-bf80-4c07-9cce-96cb6735d8cb.trivial | 0 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 news/bc8c3a60-bf80-4c07-9cce-96cb6735d8cb.trivial diff --git a/README.rst b/README.rst index 1b2c95471..259bb46e4 100644 --- a/README.rst +++ b/README.rst @@ -37,6 +37,6 @@ rooms and mailing lists is expected to follow the `PyPA Code of Conduct`_. .. _Changelog: https://pip.pypa.io/en/stable/news.html .. _GitHub Page: https://github.com/pypa/pip .. _Issue Tracking: https://github.com/pypa/pip/issues -.. _User mailing list: http://groups.google.com/group/python-virtualenv> -.. _Dev mailing list: http://groups.google.com/group/pypa-dev> +.. _User mailing list: http://groups.google.com/group/python-virtualenv +.. _Dev mailing list: http://groups.google.com/group/pypa-dev .. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ diff --git a/news/bc8c3a60-bf80-4c07-9cce-96cb6735d8cb.trivial b/news/bc8c3a60-bf80-4c07-9cce-96cb6735d8cb.trivial new file mode 100644 index 000000000..e69de29bb From 3651dd86878e2efc4de6d431634e8887949ead23 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sun, 12 Nov 2017 08:23:18 -0600 Subject: [PATCH 26/29] Update comment now that `-d` is not an install option (#4851) --- news/09f5c22f-ec40-420d-9647-da985cef8050.trivial | 0 src/pip/_internal/commands/install.py | 5 ++--- 2 files changed, 2 insertions(+), 3 deletions(-) create mode 100644 news/09f5c22f-ec40-420d-9647-da985cef8050.trivial diff --git a/news/09f5c22f-ec40-420d-9647-da985cef8050.trivial b/news/09f5c22f-ec40-420d-9647-da985cef8050.trivial new file mode 100644 index 000000000..e69de29bb diff --git a/src/pip/_internal/commands/install.py b/src/pip/_internal/commands/install.py index 71dd62023..e144e39ed 100644 --- a/src/pip/_internal/commands/install.py +++ b/src/pip/_internal/commands/install.py @@ -276,9 +276,8 @@ class InstallCommand(RequirementCommand): ) resolver.resolve(requirement_set) - # on -d don't do complex things like building - # wheels, and don't try to build wheels when wheel is - # not installed. + # If caching is disabled or wheel is not installed don't + # try to build wheels. if wheel and options.cache_dir: # build wheels before install. wb = WheelBuilder( From 8f6b4c9b2d014b9a646585074612cecf51e1cc88 Mon Sep 17 00:00:00 2001 From: Pradyun Gedam Date: Sun, 12 Nov 2017 21:34:37 +0530 Subject: [PATCH 27/29] Navigation (+other) improvements to Documentation (#4855) --- MANIFEST.in | 3 +++ docs-requirements.txt | 2 +- docs/conf.py | 2 +- docs/docutils.conf | 2 ++ docs/pipext.py | 8 ++++---- docs/reference/index.rst | 2 +- docs/reference/pip.rst | 2 ++ docs/reference/pip_check.rst | 2 ++ docs/reference/pip_config.rst | 2 ++ docs/reference/pip_download.rst | 2 ++ docs/reference/pip_freeze.rst | 2 ++ docs/reference/pip_hash.rst | 2 ++ docs/reference/pip_install.rst | 2 ++ docs/reference/pip_list.rst | 2 ++ docs/reference/pip_search.rst | 2 ++ docs/reference/pip_show.rst | 3 +++ docs/reference/pip_uninstall.rst | 2 ++ docs/reference/pip_wheel.rst | 2 ++ docs/user_guide.rst | 2 ++ 19 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 docs/docutils.conf diff --git a/MANIFEST.in b/MANIFEST.in index 01f545922..fa58d7a89 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -3,9 +3,12 @@ include LICENSE.txt include NEWS.rst include README.rst include pyproject.toml + include src/pip/_vendor/README.rst include src/pip/_vendor/vendor.txt +include docs/docutils.conf + exclude .coveragerc exclude .mailmap exclude .travis.yml diff --git a/docs-requirements.txt b/docs-requirements.txt index 9bdbf1b3c..86c5258b1 100644 --- a/docs-requirements.txt +++ b/docs-requirements.txt @@ -1,4 +1,4 @@ -sphinx == 1.6.1 +sphinx == 1.6.* git+https://github.com/python/python-docs-theme.git#egg=python-docs-theme git+https://github.com/pypa/pypa-docs-theme.git#egg=pypa-docs-theme diff --git a/docs/conf.py b/docs/conf.py index 74d73b39d..08f31e61b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -127,7 +127,7 @@ html_theme = "pypa_theme" html_theme_options = { 'collapsiblesidebar': True, 'externalrefs': True, - 'navigation_depth': 2, + 'navigation_depth': 3, 'issues_url': 'https://github.com/pypa/pip/issues' } diff --git a/docs/docutils.conf b/docs/docutils.conf new file mode 100644 index 000000000..dfd80b177 --- /dev/null +++ b/docs/docutils.conf @@ -0,0 +1,2 @@ +[restructuredtext parser] +smart_quotes = no diff --git a/docs/pipext.py b/docs/pipext.py index 39ee3413d..c866e1d71 100644 --- a/docs/pipext.py +++ b/docs/pipext.py @@ -2,13 +2,14 @@ import optparse import sys +from textwrap import dedent + from docutils import nodes from docutils.parsers import rst from docutils.statemachine import ViewList -from textwrap import dedent + from pip._internal import cmdoptions from pip._internal.commands import commands_dict as commands -from pip._internal.utils.misc import get_prog class PipCommandUsage(rst.Directive): @@ -16,8 +17,7 @@ class PipCommandUsage(rst.Directive): def run(self): cmd = commands[self.arguments[0]] - prog = '%s %s' % (get_prog(), cmd.name) - usage = dedent(cmd.usage.replace('%prog', prog)).strip() + usage = dedent(cmd.usage.replace('%prog', 'pip')).strip() node = nodes.literal_block(usage, usage) return [node] diff --git a/docs/reference/index.rst b/docs/reference/index.rst index 6308919de..f25568bfb 100644 --- a/docs/reference/index.rst +++ b/docs/reference/index.rst @@ -3,7 +3,7 @@ Reference Guide =============== .. toctree:: - :maxdepth: 1 + :maxdepth: 2 pip pip_install diff --git a/docs/reference/pip.rst b/docs/reference/pip.rst index df312eccd..c5a1201f5 100644 --- a/docs/reference/pip.rst +++ b/docs/reference/pip.rst @@ -1,6 +1,8 @@ pip --- +.. contents:: + Usage ***** diff --git a/docs/reference/pip_check.rst b/docs/reference/pip_check.rst index 5663335d2..2c33e90a3 100644 --- a/docs/reference/pip_check.rst +++ b/docs/reference/pip_check.rst @@ -3,6 +3,8 @@ pip check --------- +.. contents:: + Usage ***** diff --git a/docs/reference/pip_config.rst b/docs/reference/pip_config.rst index baab537ea..0f92f5714 100644 --- a/docs/reference/pip_config.rst +++ b/docs/reference/pip_config.rst @@ -4,6 +4,8 @@ pip config ------------ +.. contents:: + Usage ***** diff --git a/docs/reference/pip_download.rst b/docs/reference/pip_download.rst index ff65fa039..d5c654821 100644 --- a/docs/reference/pip_download.rst +++ b/docs/reference/pip_download.rst @@ -4,6 +4,8 @@ pip download ------------ +.. contents:: + Usage ***** diff --git a/docs/reference/pip_freeze.rst b/docs/reference/pip_freeze.rst index 809862498..c13bc00f3 100644 --- a/docs/reference/pip_freeze.rst +++ b/docs/reference/pip_freeze.rst @@ -4,6 +4,8 @@ pip freeze ----------- +.. contents:: + Usage ***** diff --git a/docs/reference/pip_hash.rst b/docs/reference/pip_hash.rst index 71e325a72..72052bc22 100644 --- a/docs/reference/pip_hash.rst +++ b/docs/reference/pip_hash.rst @@ -3,6 +3,8 @@ pip hash ------------ +.. contents:: + Usage ***** diff --git a/docs/reference/pip_install.rst b/docs/reference/pip_install.rst index a1fba2c26..b86e78eea 100644 --- a/docs/reference/pip_install.rst +++ b/docs/reference/pip_install.rst @@ -3,6 +3,8 @@ pip install ----------- +.. contents:: + Usage ***** diff --git a/docs/reference/pip_list.rst b/docs/reference/pip_list.rst index 469305f66..c459b7a3b 100644 --- a/docs/reference/pip_list.rst +++ b/docs/reference/pip_list.rst @@ -3,6 +3,8 @@ pip list --------- +.. contents:: + Usage ***** diff --git a/docs/reference/pip_search.rst b/docs/reference/pip_search.rst index 11c0fb168..1332c99f7 100644 --- a/docs/reference/pip_search.rst +++ b/docs/reference/pip_search.rst @@ -3,6 +3,8 @@ pip search ---------- +.. contents:: + Usage ***** diff --git a/docs/reference/pip_show.rst b/docs/reference/pip_show.rst index ada91f89b..6c9aa84aa 100644 --- a/docs/reference/pip_show.rst +++ b/docs/reference/pip_show.rst @@ -3,6 +3,9 @@ pip show -------- +.. contents:: + + Usage ***** diff --git a/docs/reference/pip_uninstall.rst b/docs/reference/pip_uninstall.rst index 954cb6593..f9a97589e 100644 --- a/docs/reference/pip_uninstall.rst +++ b/docs/reference/pip_uninstall.rst @@ -3,6 +3,8 @@ pip uninstall ------------- +.. contents:: + Usage ***** diff --git a/docs/reference/pip_wheel.rst b/docs/reference/pip_wheel.rst index 0b360e312..75ae51a21 100644 --- a/docs/reference/pip_wheel.rst +++ b/docs/reference/pip_wheel.rst @@ -4,6 +4,8 @@ pip wheel --------- +.. contents:: + Usage ***** diff --git a/docs/user_guide.rst b/docs/user_guide.rst index 7e7db6389..052a7cda1 100644 --- a/docs/user_guide.rst +++ b/docs/user_guide.rst @@ -2,6 +2,8 @@ User Guide ========== +.. contents:: + Running pip *********** From afbbacf136dafdfdd3bac3c42fb8da59c91c742a Mon Sep 17 00:00:00 2001 From: Pradyun Gedam Date: Tue, 14 Nov 2017 12:03:01 +0530 Subject: [PATCH 28/29] Add a coverage job for Python 3 to tox --- .coveragerc | 2 +- .gitignore | 1 + dev-requirements.txt | 1 + tox.ini | 4 ++++ 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.coveragerc b/.coveragerc index 7a2f4b47c..5f833c94a 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,4 +1,4 @@ [run] branch = True omit = - pip/_vendor/* + src/pip/_vendor/* diff --git a/.gitignore b/.gitignore index 417786fac..1d842203b 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ docs/build/ # Unit test / coverage reports .tox/ +htmlcov/ .coverage .coverage.* .cache diff --git a/dev-requirements.txt b/dev-requirements.txt index a1bfbb6ee..25549125e 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -2,6 +2,7 @@ freezegun pretend pytest pytest-catchlog +pytest-cov pytest-rerunfailures pytest-timeout pytest-xdist diff --git a/tox.ini b/tox.ini index cb5a262cc..e5cd70a57 100644 --- a/tox.ini +++ b/tox.ini @@ -14,6 +14,10 @@ commands = py.test --timeout 300 [] install_command = python -m pip install {opts} {packages} usedevelop = True +[testenv:coverage-py3] +basepython = python3 +commands = py.test --timeout 300 --cov=pip --cov-report=term-missing --cov-report=xml --cov-report=html tests/unit {posargs} + [testenv:docs] deps = -r{toxinidir}/docs-requirements.txt basepython = python2.7 From 24fd8846723cfcb25dbc36fcb6a77ad1e642d4d4 Mon Sep 17 00:00:00 2001 From: Pradyun Gedam Date: Thu, 16 Nov 2017 15:16:21 +0530 Subject: [PATCH 29/29] Decouple WheelBuilder from RequirementSet (#4860) --- src/pip/_internal/commands/install.py | 13 ++++++------- src/pip/_internal/commands/wheel.py | 9 ++++----- src/pip/_internal/wheel.py | 9 +++------ tests/unit/test_wheel.py | 8 ++++---- 4 files changed, 17 insertions(+), 22 deletions(-) diff --git a/src/pip/_internal/commands/install.py b/src/pip/_internal/commands/install.py index e144e39ed..56f3fbb02 100644 --- a/src/pip/_internal/commands/install.py +++ b/src/pip/_internal/commands/install.py @@ -281,16 +281,15 @@ class InstallCommand(RequirementCommand): if wheel and options.cache_dir: # build wheels before install. wb = WheelBuilder( - requirement_set, - finder, - preparer, - wheel_cache, - build_options=[], - global_options=[], + finder, preparer, wheel_cache, + build_options=[], global_options=[], ) # Ignore the result: a failed wheel will be # installed from the sdist/vcs whatever. - wb.build(session=session, autobuilding=True) + wb.build( + requirement_set.requirements.values(), + session=session, autobuilding=True + ) installed = requirement_set.install( install_options, diff --git a/src/pip/_internal/commands/wheel.py b/src/pip/_internal/commands/wheel.py index e03983cd1..51985b84d 100644 --- a/src/pip/_internal/commands/wheel.py +++ b/src/pip/_internal/commands/wheel.py @@ -177,15 +177,14 @@ class WheelCommand(RequirementCommand): try: # build wheels wb = WheelBuilder( - requirement_set, - finder, - preparer, - wheel_cache, + finder, preparer, wheel_cache, build_options=options.build_options or [], global_options=options.global_options or [], no_clean=options.no_clean, ) - wheels_built_successfully = wb.build(session=session) + wheels_built_successfully = wb.build( + requirement_set.requirements.values(), session=session, + ) if not wheels_built_successfully: raise CommandError( "Failed to build one or more wheels" diff --git a/src/pip/_internal/wheel.py b/src/pip/_internal/wheel.py index cb9ad999c..31fc7b826 100644 --- a/src/pip/_internal/wheel.py +++ b/src/pip/_internal/wheel.py @@ -657,9 +657,8 @@ class BuildEnvironment(object): class WheelBuilder(object): """Build wheels from a RequirementSet.""" - def __init__(self, requirement_set, finder, preparer, wheel_cache, + def __init__(self, finder, preparer, wheel_cache, build_options=None, global_options=None, no_clean=False): - self.requirement_set = requirement_set self.finder = finder self.preparer = preparer self.wheel_cache = wheel_cache @@ -791,7 +790,7 @@ class WheelBuilder(object): logger.error('Failed cleaning build dir for %s', req.name) return False - def build(self, session, autobuilding=False): + def build(self, requirements, session, autobuilding=False): """Build wheels. :param unpack: If True, replace the sdist we built from with the @@ -805,10 +804,8 @@ class WheelBuilder(object): ) assert building_is_possible - reqset = self.requirement_set.requirements.values() - buildset = [] - for req in reqset: + for req in requirements: if req.constraint: continue if req.is_wheel: diff --git a/tests/unit/test_wheel.py b/tests/unit/test_wheel.py index dcc092e73..d972a4561 100644 --- a/tests/unit/test_wheel.py +++ b/tests/unit/test_wheel.py @@ -364,10 +364,10 @@ class TestWheelBuilder(object): with patch('pip._internal.wheel.WheelBuilder._build_one') \ as mock_build_one: wheel_req = Mock(is_wheel=True, editable=False, constraint=False) - reqset = Mock(requirements=Mock(values=lambda: [wheel_req]), - wheel_download_dir='/wheel/dir') - wb = wheel.WheelBuilder(reqset, Mock(), Mock(), wheel_cache=None) - wb.build(Mock()) + wb = wheel.WheelBuilder( + finder=Mock(), preparer=Mock(), wheel_cache=None, + ) + wb.build([wheel_req], session=Mock()) assert "due to already being wheel" in caplog.text assert mock_build_one.mock_calls == []