Hello community,
here is the log from the commit of package python3-pip for openSUSE:Factory checked in at 2015-02-01 12:30:29
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python3-pip (Old)
and /work/SRC/openSUSE:Factory/.python3-pip.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python3-pip"
Changes:
--------
--- /work/SRC/openSUSE:Factory/python3-pip/python3-pip.changes 2015-01-09 20:50:31.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.python3-pip.new/python3-pip.changes 2015-02-01 12:30:39.000000000 +0100
@@ -1,0 +2,17 @@
+Sat Jan 31 22:07:04 UTC 2015 - arun@gmx.de
+
+- update to version 6.0.7:
+ * Fix a regression where Numpy requires a build path without
+ symlinks to properly build.
+ * Fix a broken log message when running pip wheel without a
+ requirement.
+ * Don’t mask network errors while downloading the file as a hash
+ failure.
+ * Properly create the state file for the pip version check so it
+ only happens once a week.
+ * Fix an issue where switching between Python 3 and Python 2 would
+ evict cached items.
+ * Fix a regression where pip would be unable to successfully
+ uninstall a project without a normalized version.
+
+-------------------------------------------------------------------
Old:
----
pip-6.0.6.tar.gz
New:
----
pip-6.0.7.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python3-pip.spec ++++++
--- /var/tmp/diff_new_pack.g2vRbk/_old 2015-02-01 12:30:40.000000000 +0100
+++ /var/tmp/diff_new_pack.g2vRbk/_new 2015-02-01 12:30:40.000000000 +0100
@@ -17,7 +17,7 @@
Name: python3-pip
-Version: 6.0.6
+Version: 6.0.7
Release: 0
Url: http://www.pip-installer.org
Summary: Pip installs packages. Python packages. An easy_install replacement
++++++ pip-6.0.6.tar.gz -> pip-6.0.7.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/AUTHORS.txt new/pip-6.0.7/AUTHORS.txt
--- old/pip-6.0.6/AUTHORS.txt 2015-01-03 10:32:01.000000000 +0100
+++ new/pip-6.0.7/AUTHORS.txt 2015-01-28 22:35:25.000000000 +0100
@@ -73,6 +73,7 @@
Igor Sobreira
Ilya Baryshev
INADA Naoki
+Ionel Cristian Mărieș
Ionel Maries Cristian
Jakub Stasiak
Jakub Vysoky
@@ -100,6 +101,7 @@
Kevin Burke
Kevin Frommelt
Kumar McMillan
+Laurent Bristiel
Leon Sasson
Lev Givon
Lincoln de Sousa
@@ -130,6 +132,7 @@
Oscar Benjamin
Patrick Dubroy
Patrick Jenkins
+patricktokeeffe
Paul Moore
Paul Nasrat
Paul Oswald
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/CHANGES.txt new/pip-6.0.7/CHANGES.txt
--- old/pip-6.0.6/CHANGES.txt 2015-01-03 10:32:01.000000000 +0100
+++ new/pip-6.0.7/CHANGES.txt 2015-01-28 22:35:25.000000000 +0100
@@ -1,3 +1,22 @@
+**6.0.7 (2015-01-28)**
+
+* Fix a regression where Numpy requires a build path without symlinks to
+ properly build.
+
+* Fix a broken log message when running ``pip wheel`` without a requirement.
+
+* Don't mask network errors while downloading the file as a hash failure.
+
+* Properly create the state file for the pip version check so it only happens
+ once a week.
+
+* Fix an issue where switching between Python 3 and Python 2 would evict cached
+ items.
+
+* Fix a regression where pip would be unable to successfully uninstall a
+ project without a normalized version.
+
+
**6.0.6 (2015-01-03)**
* Continue the regression fix from 6.0.5 which was not a complete fix.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/PKG-INFO new/pip-6.0.7/PKG-INFO
--- old/pip-6.0.6/PKG-INFO 2015-01-03 10:32:20.000000000 +0100
+++ new/pip-6.0.7/PKG-INFO 2015-01-28 22:35:32.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: pip
-Version: 6.0.6
+Version: 6.0.7
Summary: The PyPA recommended tool for installing Python packages.
Home-page: https://pip.pypa.io/
Author: The pip developers
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip/__init__.py new/pip-6.0.7/pip/__init__.py
--- old/pip-6.0.6/pip/__init__.py 2015-01-03 10:32:01.000000000 +0100
+++ new/pip-6.0.7/pip/__init__.py 2015-01-28 22:35:25.000000000 +0100
@@ -30,7 +30,7 @@
cmdoptions = pip.cmdoptions
# The version as used in the setup.py and the docs conf.py
-__version__ = "6.0.6"
+__version__ = "6.0.7"
logger = logging.getLogger(__name__)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip/_vendor/cachecontrol/__init__.py new/pip-6.0.7/pip/_vendor/cachecontrol/__init__.py
--- old/pip-6.0.6/pip/_vendor/cachecontrol/__init__.py 2015-01-03 10:32:01.000000000 +0100
+++ new/pip-6.0.7/pip/_vendor/cachecontrol/__init__.py 2015-01-28 22:35:25.000000000 +0100
@@ -2,6 +2,10 @@
Make it easy to import from cachecontrol without long namespaces.
"""
+__author__ = 'Eric Larson'
+__email__ = 'eric@ionrock.org'
+__version__ = '0.11.1'
+
from .wrapper import CacheControl
from .adapter import CacheControlAdapter
from .controller import CacheController
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip/_vendor/cachecontrol/controller.py new/pip-6.0.7/pip/_vendor/cachecontrol/controller.py
--- old/pip-6.0.6/pip/_vendor/cachecontrol/controller.py 2015-01-03 10:32:01.000000000 +0100
+++ new/pip-6.0.7/pip/_vendor/cachecontrol/controller.py 2015-01-28 22:35:25.000000000 +0100
@@ -112,15 +112,19 @@
current_age = max(0, now - date)
# TODO: There is an assumption that the result will be a
- # urllib3 response object. This may not be best since we
- # could probably avoid instantiating or constructing the
- # response until we know we need it.
+ # urllib3 response object. This may not be best since we
+ # could probably avoid instantiating or constructing the
+ # response until we know we need it.
resp_cc = self.parse_cache_control(headers)
# determine freshness
freshness_lifetime = 0
+
+ # Check the max-age pragma in the cache control header
if 'max-age' in resp_cc and resp_cc['max-age'].isdigit():
freshness_lifetime = int(resp_cc['max-age'])
+
+ # If there isn't a max-age, check for an expires header
elif 'expires' in headers:
expires = parsedate_tz(headers['expires'])
if expires is not None:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip/_vendor/cachecontrol/heuristics.py new/pip-6.0.7/pip/_vendor/cachecontrol/heuristics.py
--- old/pip-6.0.6/pip/_vendor/cachecontrol/heuristics.py 2015-01-03 10:32:01.000000000 +0100
+++ new/pip-6.0.7/pip/_vendor/cachecontrol/heuristics.py 2015-01-28 22:35:25.000000000 +0100
@@ -5,11 +5,24 @@
from datetime import datetime, timedelta
+def expire_after(delta, date=None):
+ date = date or datetime.now()
+ return date + delta
+
+
+def datetime_to_header(dt):
+ return formatdate(calendar.timegm(dt.timetuple()))
+
+
class BaseHeuristic(object):
- def warning(self):
+ def warning(self, response):
"""
Return a valid 1xx warning header value describing the cache adjustments.
+
+ The response is provided too allow warnings like 113
+ http://tools.ietf.org/html/rfc7234#section-5.5.4 where we need
+ to explicitly say response is over 24 hours old.
"""
return '110 - "Response is Stale"'
@@ -17,15 +30,15 @@
"""Update the response headers with any new headers.
NOTE: This SHOULD always include some Warning header to
- signify that the response was cached by the client, not by way
- of the provided headers.
- return response.
+ signify that the response was cached by the client, not
+ by way of the provided headers.
"""
return {}
def apply(self, response):
+ warning_header = {'warning': self.warning(response)}
response.headers.update(self.update_headers(response))
- response.headers.update({'warning': self.warning()})
+ response.headers.update(warning_header)
return response
@@ -39,7 +52,28 @@
if 'expires' not in response.headers:
date = parsedate(response.headers['date'])
- expires = datetime(*date[:6]) + timedelta(days=1)
- headers['expires'] = formatdate(calendar.timegm(expires.timetuple()))
-
+ expires = expire_after(timedelta(days=1),
+ date=datetime(*date[:6]))
+ headers['expires'] = datetime_to_header(expires)
+ headers['cache-control'] = 'public'
return headers
+
+
+class ExpiresAfter(BaseHeuristic):
+ """
+ Cache **all** requests for a defined time period.
+ """
+
+ def __init__(self, **kw):
+ self.delta = timedelta(**kw)
+
+ def update_headers(self, response):
+ expires = expire_after(self.delta)
+ return {
+ 'expires': datetime_to_header(expires),
+ 'cache-control': 'public',
+ }
+
+ def warning(self, response):
+ tmpl = '110 - Automatically cached for %s. Response might be stale'
+ return tmpl % self.delta
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip/_vendor/cachecontrol/serialize.py new/pip-6.0.7/pip/_vendor/cachecontrol/serialize.py
--- old/pip-6.0.6/pip/_vendor/cachecontrol/serialize.py 2015-01-03 10:32:01.000000000 +0100
+++ new/pip-6.0.7/pip/_vendor/cachecontrol/serialize.py 2015-01-28 22:35:25.000000000 +0100
@@ -1,10 +1,29 @@
+import base64
import io
+import json
+import zlib
from pip._vendor.requests.structures import CaseInsensitiveDict
from .compat import HTTPResponse, pickle
+def _b64_encode_bytes(b):
+ return base64.b64encode(b).decode("ascii")
+
+
+def _b64_encode_str(s):
+ return _b64_encode_bytes(s.encode("utf8"))
+
+
+def _b64_decode_bytes(b):
+ return base64.b64decode(b.encode("ascii"))
+
+
+def _b64_decode_str(s):
+ return _b64_decode_bytes(s).decode("utf8")
+
+
class Serializer(object):
def dumps(self, request, response, body=None):
@@ -12,15 +31,29 @@
if body is None:
body = response.read(decode_content=False)
+
+ # NOTE: 99% sure this is dead code. I'm only leaving it
+ # here b/c I don't have a test yet to prove
+ # it. Basically, before using
+ # `cachecontrol.filewrapper.CallbackFileWrapper`,
+ # this made an effort to reset the file handle. The
+ # `CallbackFileWrapper` short circuits this code by
+ # setting the body as the content is consumed, the
+ # result being a `body` argument is *always* passed
+ # into cache_response, and in turn,
+ # `Serializer.dump`.
response._fp = io.BytesIO(body)
data = {
"response": {
- "body": body,
- "headers": response.headers,
+ "body": _b64_encode_bytes(body),
+ "headers": dict(
+ (_b64_encode_str(k), _b64_encode_str(v))
+ for k, v in response.headers.items()
+ ),
"status": response.status,
"version": response.version,
- "reason": response.reason,
+ "reason": _b64_encode_str(response.reason),
"strict": response.strict,
"decode_content": response.decode_content,
},
@@ -34,7 +67,20 @@
header = header.strip()
data["vary"][header] = request.headers.get(header, None)
- return b"cc=1," + pickle.dumps(data, pickle.HIGHEST_PROTOCOL)
+ # Encode our Vary headers to ensure they can be serialized as JSON
+ data["vary"] = dict(
+ (_b64_encode_str(k), _b64_encode_str(v) if v is not None else v)
+ for k, v in data["vary"].items()
+ )
+
+ return b",".join([
+ b"cc=2",
+ zlib.compress(
+ json.dumps(
+ data, separators=(",", ":"), sort_keys=True,
+ ).encode("utf8"),
+ ),
+ ])
def loads(self, request, data):
# Short circuit if we've been given an empty set of data
@@ -65,18 +111,10 @@
# just treat it as a miss and return None
return
- def _loads_v0(self, request, data):
- # The original legacy cache data. This doesn't contain enough
- # information to construct everything we need, so we'll treat this as
- # a miss.
- return
-
- def _loads_v1(self, request, data):
- try:
- cached = pickle.loads(data)
- except ValueError:
- return
-
+ def prepare_response(self, request, cached):
+ """Verify our vary headers match and construct a real urllib3
+ HTTPResponse object.
+ """
# Special case the '*' Vary value as it means we cannot actually
# determine if the cached response is suitable for this request.
if "*" in cached.get("vary", {}):
@@ -94,3 +132,41 @@
preload_content=False,
**cached["response"]
)
+
+ def _loads_v0(self, request, data):
+ # The original legacy cache data. This doesn't contain enough
+ # information to construct everything we need, so we'll treat this as
+ # a miss.
+ return
+
+ def _loads_v1(self, request, data):
+ try:
+ cached = pickle.loads(data)
+ except ValueError:
+ return
+
+ return self.prepare_response(request, cached)
+
+ def _loads_v2(self, request, data):
+ try:
+ cached = json.loads(zlib.decompress(data).decode("utf8"))
+ except ValueError:
+ return
+
+ # We need to decode the items that we've base64 encoded
+ cached["response"]["body"] = _b64_decode_bytes(
+ cached["response"]["body"]
+ )
+ cached["response"]["headers"] = dict(
+ (_b64_decode_str(k), _b64_decode_str(v))
+ for k, v in cached["response"]["headers"].items()
+ )
+ cached["response"]["reason"] = _b64_decode_str(
+ cached["response"]["reason"],
+ )
+ cached["vary"] = dict(
+ (_b64_decode_str(k), _b64_decode_str(v) if v is not None else v)
+ for k, v in cached["vary"].items()
+ )
+
+ return self.prepare_response(request, cached)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip/_vendor/colorama/__init__.py new/pip-6.0.7/pip/_vendor/colorama/__init__.py
--- old/pip-6.0.6/pip/_vendor/colorama/__init__.py 2015-01-03 10:32:01.000000000 +0100
+++ new/pip-6.0.7/pip/_vendor/colorama/__init__.py 2015-01-28 22:35:25.000000000 +0100
@@ -1,7 +1,7 @@
# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
from .initialise import init, deinit, reinit
-from .ansi import Fore, Back, Style
+from .ansi import Fore, Back, Style, Cursor
from .ansitowin32 import AnsiToWin32
-__version__ = '0.3.2'
+__version__ = '0.3.3'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip/_vendor/colorama/ansi.py new/pip-6.0.7/pip/_vendor/colorama/ansi.py
--- old/pip-6.0.6/pip/_vendor/colorama/ansi.py 2015-01-03 10:32:01.000000000 +0100
+++ new/pip-6.0.7/pip/_vendor/colorama/ansi.py 2015-01-28 22:35:25.000000000 +0100
@@ -5,10 +5,14 @@
'''
CSI = '\033['
+OSC = '\033]'
+BEL = '\007'
+
def code_to_chars(code):
return CSI + str(code) + 'm'
+
class AnsiCodes(object):
def __init__(self, codes):
for name in dir(codes):
@@ -16,27 +20,72 @@
value = getattr(codes, name)
setattr(self, name, code_to_chars(value))
+
+class AnsiCursor(object):
+ def UP(self, n=1):
+ return CSI + str(n) + "A"
+ def DOWN(self, n=1):
+ return CSI + str(n) + "B"
+ def FORWARD(self, n=1):
+ return CSI + str(n) + "C"
+ def BACK(self, n=1):
+ return CSI + str(n) + "D"
+ def POS(self, x=1, y=1):
+ return CSI + str(y) + ";" + str(x) + "H"
+
+def set_title(title):
+ return OSC + "2;" + title + BEL
+
+def clear_screen(mode=2):
+ return CSI + str(mode) + "J"
+
+def clear_line(mode=2):
+ return CSI + str(mode) + "K"
+
+
class AnsiFore:
- BLACK = 30
- RED = 31
- GREEN = 32
- YELLOW = 33
- BLUE = 34
- MAGENTA = 35
- CYAN = 36
- WHITE = 37
- RESET = 39
+ BLACK = 30
+ RED = 31
+ GREEN = 32
+ YELLOW = 33
+ BLUE = 34
+ MAGENTA = 35
+ CYAN = 36
+ WHITE = 37
+ RESET = 39
+
+ # These are fairly well supported, but not part of the standard.
+ LIGHTBLACK_EX = 90
+ LIGHTRED_EX = 91
+ LIGHTGREEN_EX = 92
+ LIGHTYELLOW_EX = 93
+ LIGHTBLUE_EX = 94
+ LIGHTMAGENTA_EX = 95
+ LIGHTCYAN_EX = 96
+ LIGHTWHITE_EX = 97
+
class AnsiBack:
- BLACK = 40
- RED = 41
- GREEN = 42
- YELLOW = 43
- BLUE = 44
- MAGENTA = 45
- CYAN = 46
- WHITE = 47
- RESET = 49
+ BLACK = 40
+ RED = 41
+ GREEN = 42
+ YELLOW = 43
+ BLUE = 44
+ MAGENTA = 45
+ CYAN = 46
+ WHITE = 47
+ RESET = 49
+
+ # These are fairly well supported, but not part of the standard.
+ LIGHTBLACK_EX = 100
+ LIGHTRED_EX = 101
+ LIGHTGREEN_EX = 102
+ LIGHTYELLOW_EX = 103
+ LIGHTBLUE_EX = 104
+ LIGHTMAGENTA_EX = 105
+ LIGHTCYAN_EX = 106
+ LIGHTWHITE_EX = 107
+
class AnsiStyle:
BRIGHT = 1
@@ -47,4 +96,4 @@
Fore = AnsiCodes( AnsiFore )
Back = AnsiCodes( AnsiBack )
Style = AnsiCodes( AnsiStyle )
-
+Cursor = AnsiCursor()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip/_vendor/colorama/ansitowin32.py new/pip-6.0.7/pip/_vendor/colorama/ansitowin32.py
--- old/pip-6.0.6/pip/_vendor/colorama/ansitowin32.py 2015-01-03 10:32:01.000000000 +0100
+++ new/pip-6.0.7/pip/_vendor/colorama/ansitowin32.py 2015-01-28 22:35:25.000000000 +0100
@@ -1,6 +1,7 @@
# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
import re
import sys
+import os
from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style
from .winterm import WinTerm, WinColor, WinStyle
@@ -41,7 +42,8 @@
sequences from the text, and if outputting to a tty, will convert them into
win32 function calls.
'''
- ANSI_RE = re.compile('\033\[((?:\d|;)*)([a-zA-Z])')
+ ANSI_CSI_RE = re.compile('\033\[((?:\d|;)*)([a-zA-Z])') # Control Sequence Introducer
+ ANSI_OSC_RE = re.compile('\033\]((?:.|;)*?)(\x07)') # Operating System Command
def __init__(self, wrapped, convert=None, strip=None, autoreset=False):
# The wrapped stream (normally sys.stdout or sys.stderr)
@@ -53,16 +55,17 @@
# create the proxy wrapping our output stream
self.stream = StreamWrapper(wrapped, self)
- on_windows = sys.platform.startswith('win')
+ on_windows = os.name == 'nt'
+ on_emulated_windows = on_windows and 'TERM' in os.environ
# should we strip ANSI sequences from our output?
if strip is None:
- strip = on_windows
+ strip = on_windows and not on_emulated_windows
self.strip = strip
# should we should convert ANSI sequences into win32 calls?
if convert is None:
- convert = on_windows and not wrapped.closed and is_a_tty(wrapped)
+ convert = on_windows and not wrapped.closed and not on_emulated_windows and is_a_tty(wrapped)
self.convert = convert
# dict of ansi codes to win32 functions and parameters
@@ -71,7 +74,6 @@
# are we wrapping stderr?
self.on_stderr = self.wrapped is sys.stderr
-
def should_wrap(self):
'''
True if this class is actually needed. If false, then the output
@@ -82,7 +84,6 @@
'''
return self.convert or self.strip or self.autoreset
-
def get_win32_calls(self):
if self.convert and winterm:
return {
@@ -99,6 +100,14 @@
AnsiFore.CYAN: (winterm.fore, WinColor.CYAN),
AnsiFore.WHITE: (winterm.fore, WinColor.GREY),
AnsiFore.RESET: (winterm.fore, ),
+ AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True),
+ AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True),
+ AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True),
+ AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True),
+ AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True),
+ AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True),
+ AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True),
+ AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True),
AnsiBack.BLACK: (winterm.back, WinColor.BLACK),
AnsiBack.RED: (winterm.back, WinColor.RED),
AnsiBack.GREEN: (winterm.back, WinColor.GREEN),
@@ -108,10 +117,17 @@
AnsiBack.CYAN: (winterm.back, WinColor.CYAN),
AnsiBack.WHITE: (winterm.back, WinColor.GREY),
AnsiBack.RESET: (winterm.back, ),
+ AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True),
+ AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True),
+ AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True),
+ AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True),
+ AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True),
+ AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True),
+ AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True),
+ AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True),
}
return dict()
-
def write(self, text):
if self.strip or self.convert:
self.write_and_convert(text)
@@ -136,7 +152,8 @@
calls.
'''
cursor = 0
- for match in self.ANSI_RE.finditer(text):
+ text = self.convert_osc(text)
+ for match in self.ANSI_CSI_RE.finditer(text):
start, end = match.span()
self.write_plain_text(text, cursor, start)
self.convert_ansi(*match.groups())
@@ -152,21 +169,29 @@
def convert_ansi(self, paramstring, command):
if self.convert:
- params = self.extract_params(paramstring)
+ params = self.extract_params(command, paramstring)
self.call_win32(command, params)
- def extract_params(self, paramstring):
- def split(paramstring):
- for p in paramstring.split(';'):
- if p != '':
- yield int(p)
- return tuple(split(paramstring))
+ def extract_params(self, command, paramstring):
+ if command in 'Hf':
+ params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';'))
+ while len(params) < 2:
+ # defaults:
+ params = params + (1,)
+ else:
+ params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0)
+ if len(params) == 0:
+ # defaults:
+ if command in 'JKm':
+ params = (0,)
+ elif command in 'ABCD':
+ params = (1,)
+
+ return params
def call_win32(self, command, params):
- if params == []:
- params = [0]
if command == 'm':
for param in params:
if param in self.win32_calls:
@@ -175,17 +200,29 @@
args = func_args[1:]
kwargs = dict(on_stderr=self.on_stderr)
func(*args, **kwargs)
- elif command in ('H', 'f'): # set cursor position
- func = winterm.set_cursor_position
- func(params, on_stderr=self.on_stderr)
- elif command in ('J'):
- func = winterm.erase_data
- func(params, on_stderr=self.on_stderr)
- elif command == 'A':
- if params == () or params == None:
- num_rows = 1
- else:
- num_rows = params[0]
- func = winterm.cursor_up
- func(num_rows, on_stderr=self.on_stderr)
+ elif command in 'J':
+ winterm.erase_screen(params[0], on_stderr=self.on_stderr)
+ elif command in 'K':
+ winterm.erase_line(params[0], on_stderr=self.on_stderr)
+ elif command in 'Hf': # cursor position - absolute
+ winterm.set_cursor_position(params, on_stderr=self.on_stderr)
+ elif command in 'ABCD': # cursor position - relative
+ n = params[0]
+ # A - up, B - down, C - forward, D - back
+ x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command]
+ winterm.cursor_adjust(x, y, on_stderr=self.on_stderr)
+
+ def convert_osc(self, text):
+ for match in self.ANSI_OSC_RE.finditer(text):
+ start, end = match.span()
+ text = text[:start] + text[end:]
+ paramstring, command = match.groups()
+ if command in '\x07': # \x07 = BEL
+ params = paramstring.split(";")
+ # 0 - change title and icon (we will only change title)
+ # 1 - change icon (we don't support this)
+ # 2 - change title
+ if params[0] in '02':
+ winterm.set_title(params[1])
+ return text
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip/_vendor/colorama/win32.py new/pip-6.0.7/pip/_vendor/colorama/win32.py
--- old/pip-6.0.6/pip/_vendor/colorama/win32.py 2015-01-03 10:32:01.000000000 +0100
+++ new/pip-6.0.7/pip/_vendor/colorama/win32.py 2015-01-28 22:35:25.000000000 +0100
@@ -13,18 +13,18 @@
windll = None
SetConsoleTextAttribute = lambda *_: None
else:
- from ctypes import (
- byref, Structure, c_char, c_short, c_uint32, c_ushort, POINTER
- )
+ from ctypes import byref, Structure, c_char, POINTER
+
+ COORD = wintypes._COORD
class CONSOLE_SCREEN_BUFFER_INFO(Structure):
"""struct in wincon.h."""
_fields_ = [
- ("dwSize", wintypes._COORD),
- ("dwCursorPosition", wintypes._COORD),
+ ("dwSize", COORD),
+ ("dwCursorPosition", COORD),
("wAttributes", wintypes.WORD),
("srWindow", wintypes.SMALL_RECT),
- ("dwMaximumWindowSize", wintypes._COORD),
+ ("dwMaximumWindowSize", COORD),
]
def __str__(self):
return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % (
@@ -58,7 +58,7 @@
_SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition
_SetConsoleCursorPosition.argtypes = [
wintypes.HANDLE,
- wintypes._COORD,
+ COORD,
]
_SetConsoleCursorPosition.restype = wintypes.BOOL
@@ -67,7 +67,7 @@
wintypes.HANDLE,
c_char,
wintypes.DWORD,
- wintypes._COORD,
+ COORD,
POINTER(wintypes.DWORD),
]
_FillConsoleOutputCharacterA.restype = wintypes.BOOL
@@ -77,11 +77,17 @@
wintypes.HANDLE,
wintypes.WORD,
wintypes.DWORD,
- wintypes._COORD,
+ COORD,
POINTER(wintypes.DWORD),
]
_FillConsoleOutputAttribute.restype = wintypes.BOOL
+ _SetConsoleTitleW = windll.kernel32.SetConsoleTitleA
+ _SetConsoleTitleW.argtypes = [
+ wintypes.LPCSTR
+ ]
+ _SetConsoleTitleW.restype = wintypes.BOOL
+
handles = {
STDOUT: _GetStdHandle(STDOUT),
STDERR: _GetStdHandle(STDERR),
@@ -98,26 +104,27 @@
handle = handles[stream_id]
return _SetConsoleTextAttribute(handle, attrs)
- def SetConsoleCursorPosition(stream_id, position):
- position = wintypes._COORD(*position)
+ def SetConsoleCursorPosition(stream_id, position, adjust=True):
+ position = COORD(*position)
# If the position is out of range, do nothing.
if position.Y <= 0 or position.X <= 0:
return
# Adjust for Windows' SetConsoleCursorPosition:
# 1. being 0-based, while ANSI is 1-based.
# 2. expecting (x,y), while ANSI uses (y,x).
- adjusted_position = wintypes._COORD(position.Y - 1, position.X - 1)
- # Adjust for viewport's scroll position
- sr = GetConsoleScreenBufferInfo(STDOUT).srWindow
- adjusted_position.Y += sr.Top
- adjusted_position.X += sr.Left
+ adjusted_position = COORD(position.Y - 1, position.X - 1)
+ if adjust:
+ # Adjust for viewport's scroll position
+ sr = GetConsoleScreenBufferInfo(STDOUT).srWindow
+ adjusted_position.Y += sr.Top
+ adjusted_position.X += sr.Left
# Resume normal processing
handle = handles[stream_id]
return _SetConsoleCursorPosition(handle, adjusted_position)
def FillConsoleOutputCharacter(stream_id, char, length, start):
handle = handles[stream_id]
- char = c_char(char)
+ char = c_char(char.encode())
length = wintypes.DWORD(length)
num_written = wintypes.DWORD(0)
# Note that this is hard-coded for ANSI (vs wide) bytes.
@@ -134,3 +141,6 @@
# Note that this is hard-coded for ANSI (vs wide) bytes.
return _FillConsoleOutputAttribute(
handle, attribute, length, start, byref(num_written))
+
+ def SetConsoleTitle(title):
+ return _SetConsoleTitleW(title)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip/_vendor/colorama/winterm.py new/pip-6.0.7/pip/_vendor/colorama/winterm.py
--- old/pip-6.0.6/pip/_vendor/colorama/winterm.py 2015-01-03 10:32:01.000000000 +0100
+++ new/pip-6.0.7/pip/_vendor/colorama/winterm.py 2015-01-28 22:35:25.000000000 +0100
@@ -15,9 +15,9 @@
# from wincon.h
class WinStyle(object):
- NORMAL = 0x00 # dim text, dim background
- BRIGHT = 0x08 # bright text, dim background
-
+ NORMAL = 0x00 # dim text, dim background
+ BRIGHT = 0x08 # bright text, dim background
+ BRIGHT_BACKGROUND = 0x80 # dim text, bright background
class WinTerm(object):
@@ -34,22 +34,26 @@
def set_attrs(self, value):
self._fore = value & 7
self._back = (value >> 4) & 7
- self._style = value & WinStyle.BRIGHT
+ self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND)
def reset_all(self, on_stderr=None):
self.set_attrs(self._default)
self.set_console(attrs=self._default)
- def fore(self, fore=None, on_stderr=False):
+ def fore(self, fore=None, light=False, on_stderr=False):
if fore is None:
fore = self._default_fore
self._fore = fore
+ if light:
+ self._style |= WinStyle.BRIGHT
self.set_console(on_stderr=on_stderr)
- def back(self, back=None, on_stderr=False):
+ def back(self, back=None, light=False, on_stderr=False):
if back is None:
back = self._default_back
self._back = back
+ if light:
+ self._style |= WinStyle.BRIGHT_BACKGROUND
self.set_console(on_stderr=on_stderr)
def style(self, style=None, on_stderr=False):
@@ -73,7 +77,7 @@
position.X += 1
position.Y += 1
return position
-
+
def set_cursor_position(self, position=None, on_stderr=False):
if position is None:
#I'm not currently tracking the position, so there is no default.
@@ -84,37 +88,64 @@
handle = win32.STDERR
win32.SetConsoleCursorPosition(handle, position)
- def cursor_up(self, num_rows=0, on_stderr=False):
- if num_rows == 0:
- return
+ def cursor_adjust(self, x, y, on_stderr=False):
handle = win32.STDOUT
if on_stderr:
handle = win32.STDERR
position = self.get_position(handle)
- adjusted_position = (position.Y - num_rows, position.X)
- self.set_cursor_position(adjusted_position, on_stderr)
+ adjusted_position = (position.Y + y, position.X + x)
+ win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False)
- def erase_data(self, mode=0, on_stderr=False):
- # 0 (or None) should clear from the cursor to the end of the screen.
+ def erase_screen(self, mode=0, on_stderr=False):
+ # 0 should clear from the cursor to the end of the screen.
# 1 should clear from the cursor to the beginning of the screen.
- # 2 should clear the entire screen. (And maybe move cursor to (1,1)?)
- #
- # At the moment, I only support mode 2. From looking at the API, it
- # should be possible to calculate a different number of bytes to clear,
- # and to do so relative to the cursor position.
- if mode[0] not in (2,):
- return
+ # 2 should clear the entire screen, and move cursor to (1,1)
handle = win32.STDOUT
if on_stderr:
handle = win32.STDERR
- # here's where we'll home the cursor
- coord_screen = win32.COORD(0,0)
csbi = win32.GetConsoleScreenBufferInfo(handle)
# get the number of character cells in the current buffer
- dw_con_size = csbi.dwSize.X * csbi.dwSize.Y
+ cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y
+ # get number of character cells before current cursor position
+ cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X
+ if mode == 0:
+ from_coord = csbi.dwCursorPosition
+ cells_to_erase = cells_in_screen - cells_before_cursor
+ if mode == 1:
+ from_coord = win32.COORD(0, 0)
+ cells_to_erase = cells_before_cursor
+ elif mode == 2:
+ from_coord = win32.COORD(0, 0)
+ cells_to_erase = cells_in_screen
# fill the entire screen with blanks
- win32.FillConsoleOutputCharacter(handle, ' ', dw_con_size, coord_screen)
+ win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord)
# now set the buffer's attributes accordingly
- win32.FillConsoleOutputAttribute(handle, self.get_attrs(), dw_con_size, coord_screen );
- # put the cursor at (0, 0)
- win32.SetConsoleCursorPosition(handle, (coord_screen.X, coord_screen.Y))
+ win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord)
+ if mode == 2:
+ # put the cursor where needed
+ win32.SetConsoleCursorPosition(handle, (1, 1))
+
+ def erase_line(self, mode=0, on_stderr=False):
+ # 0 should clear from the cursor to the end of the line.
+ # 1 should clear from the cursor to the beginning of the line.
+ # 2 should clear the entire line.
+ handle = win32.STDOUT
+ if on_stderr:
+ handle = win32.STDERR
+ csbi = win32.GetConsoleScreenBufferInfo(handle)
+ if mode == 0:
+ from_coord = csbi.dwCursorPosition
+ cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X
+ if mode == 1:
+ from_coord = win32.COORD(0, csbi.dwCursorPosition.Y)
+ cells_to_erase = csbi.dwCursorPosition.X
+ elif mode == 2:
+ from_coord = win32.COORD(0, csbi.dwCursorPosition.Y)
+ cells_to_erase = csbi.dwSize.X
+ # fill the entire screen with blanks
+ win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord)
+ # now set the buffer's attributes accordingly
+ win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord)
+
+ def set_title(self, title):
+ win32.SetConsoleTitle(title)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip/_vendor/requests/__init__.py new/pip-6.0.7/pip/_vendor/requests/__init__.py
--- old/pip-6.0.6/pip/_vendor/requests/__init__.py 2015-01-03 10:32:01.000000000 +0100
+++ new/pip-6.0.7/pip/_vendor/requests/__init__.py 2015-01-28 22:35:25.000000000 +0100
@@ -42,8 +42,8 @@
"""
__title__ = 'requests'
-__version__ = '2.5.0'
-__build__ = 0x020500
+__version__ = '2.5.1'
+__build__ = 0x020501
__author__ = 'Kenneth Reitz'
__license__ = 'Apache 2.0'
__copyright__ = 'Copyright 2014 Kenneth Reitz'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip/_vendor/requests/auth.py new/pip-6.0.7/pip/_vendor/requests/auth.py
--- old/pip-6.0.6/pip/_vendor/requests/auth.py 2015-01-03 10:32:01.000000000 +0100
+++ new/pip-6.0.7/pip/_vendor/requests/auth.py 2015-01-28 22:35:25.000000000 +0100
@@ -67,6 +67,7 @@
self.nonce_count = 0
self.chal = {}
self.pos = None
+ self.num_401_calls = 1
def build_digest_header(self, method, url):
@@ -154,7 +155,7 @@
def handle_redirect(self, r, **kwargs):
"""Reset num_401_calls counter on redirects."""
if r.is_redirect:
- setattr(self, 'num_401_calls', 1)
+ self.num_401_calls = 1
def handle_401(self, r, **kwargs):
"""Takes the given response and tries digest-auth, if needed."""
@@ -168,7 +169,7 @@
if 'digest' in s_auth.lower() and num_401_calls < 2:
- setattr(self, 'num_401_calls', num_401_calls + 1)
+ self.num_401_calls += 1
pat = re.compile(r'digest ', flags=re.IGNORECASE)
self.chal = parse_dict_header(pat.sub('', s_auth, count=1))
@@ -188,7 +189,7 @@
return _r
- setattr(self, 'num_401_calls', num_401_calls + 1)
+ self.num_401_calls = 1
return r
def __call__(self, r):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip/_vendor/requests/compat.py new/pip-6.0.7/pip/_vendor/requests/compat.py
--- old/pip-6.0.6/pip/_vendor/requests/compat.py 2015-01-03 10:32:01.000000000 +0100
+++ new/pip-6.0.7/pip/_vendor/requests/compat.py 2015-01-28 22:35:25.000000000 +0100
@@ -76,7 +76,7 @@
try:
import simplejson as json
except (ImportError, SyntaxError):
- # simplejson does not support Python 3.2, it thows a SyntaxError
+ # simplejson does not support Python 3.2, it throws a SyntaxError
# because of u'...' Unicode literals.
import json
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip/_vendor/requests/models.py new/pip-6.0.7/pip/_vendor/requests/models.py
--- old/pip-6.0.6/pip/_vendor/requests/models.py 2015-01-03 10:32:01.000000000 +0100
+++ new/pip-6.0.7/pip/_vendor/requests/models.py 2015-01-28 22:35:25.000000000 +0100
@@ -20,11 +20,10 @@
from .packages.urllib3.filepost import encode_multipart_formdata
from .packages.urllib3.util import parse_url
from .packages.urllib3.exceptions import (
- DecodeError, ReadTimeoutError, ProtocolError)
+ DecodeError, ReadTimeoutError, ProtocolError, LocationParseError)
from .exceptions import (
- HTTPError, RequestException, MissingSchema, InvalidURL,
- ChunkedEncodingError, ContentDecodingError, ConnectionError,
- StreamConsumedError)
+ HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError,
+ ContentDecodingError, ConnectionError, StreamConsumedError)
from .utils import (
guess_filename, get_auth_from_url, requote_uri,
stream_decode_response_unicode, to_key_val_list, parse_header_links,
@@ -351,7 +350,10 @@
return
# Support for unicode domain names and paths.
- scheme, auth, host, port, path, query, fragment = parse_url(url)
+ try:
+ scheme, auth, host, port, path, query, fragment = parse_url(url)
+ except LocationParseError as e:
+ raise InvalidURL(*e.args)
if not scheme:
raise MissingSchema("Invalid URL {0!r}: No schema supplied. "
@@ -615,7 +617,7 @@
def ok(self):
try:
self.raise_for_status()
- except RequestException:
+ except HTTPError:
return False
return True
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip/_vendor/requests/utils.py new/pip-6.0.7/pip/_vendor/requests/utils.py
--- old/pip-6.0.6/pip/_vendor/requests/utils.py 2015-01-03 10:32:02.000000000 +0100
+++ new/pip-6.0.7/pip/_vendor/requests/utils.py 2015-01-28 22:35:25.000000000 +0100
@@ -115,7 +115,7 @@
def guess_filename(obj):
"""Tries to guess the filename of the given object."""
name = getattr(obj, 'name', None)
- if name and name[0] != '<' and name[-1] != '>':
+ if name and isinstance(name, builtin_str) and name[0] != '<' and name[-1] != '>':
return os.path.basename(name)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip/_vendor/six.py new/pip-6.0.7/pip/_vendor/six.py
--- old/pip-6.0.6/pip/_vendor/six.py 2015-01-03 10:32:02.000000000 +0100
+++ new/pip-6.0.7/pip/_vendor/six.py 2015-01-28 22:35:25.000000000 +0100
@@ -1,6 +1,6 @@
"""Utilities for writing code that runs on Python 2 and 3"""
-# Copyright (c) 2010-2014 Benjamin Peterson
+# Copyright (c) 2010-2015 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
@@ -23,12 +23,13 @@
from __future__ import absolute_import
import functools
+import itertools
import operator
import sys
import types
__author__ = "Benjamin Peterson "
-__version__ = "1.8.0"
+__version__ = "1.9.0"
# Useful for very coarse version differentiation.
@@ -88,8 +89,12 @@
def __get__(self, obj, tp):
result = self._resolve()
setattr(obj, self.name, result) # Invokes __set__.
- # This is a bit ugly, but it avoids running this again.
- delattr(obj.__class__, self.name)
+ try:
+ # This is a bit ugly, but it avoids running this again by
+ # removing this descriptor.
+ delattr(obj.__class__, self.name)
+ except AttributeError:
+ pass
return result
@@ -554,6 +559,12 @@
def iterlists(d, **kw):
return iter(d.lists(**kw))
+
+ viewkeys = operator.methodcaller("keys")
+
+ viewvalues = operator.methodcaller("values")
+
+ viewitems = operator.methodcaller("items")
else:
def iterkeys(d, **kw):
return iter(d.iterkeys(**kw))
@@ -567,6 +578,12 @@
def iterlists(d, **kw):
return iter(d.iterlists(**kw))
+ viewkeys = operator.methodcaller("viewkeys")
+
+ viewvalues = operator.methodcaller("viewvalues")
+
+ viewitems = operator.methodcaller("viewitems")
+
_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
_add_doc(itervalues, "Return an iterator over the values of a dictionary.")
_add_doc(iteritems,
@@ -593,6 +610,9 @@
import io
StringIO = io.StringIO
BytesIO = io.BytesIO
+ _assertCountEqual = "assertCountEqual"
+ _assertRaisesRegex = "assertRaisesRegex"
+ _assertRegex = "assertRegex"
else:
def b(s):
return s
@@ -605,14 +625,28 @@
return ord(bs[0])
def indexbytes(buf, i):
return ord(buf[i])
- def iterbytes(buf):
- return (ord(byte) for byte in buf)
+ iterbytes = functools.partial(itertools.imap, ord)
import StringIO
StringIO = BytesIO = StringIO.StringIO
+ _assertCountEqual = "assertItemsEqual"
+ _assertRaisesRegex = "assertRaisesRegexp"
+ _assertRegex = "assertRegexpMatches"
_add_doc(b, """Byte literal""")
_add_doc(u, """Text literal""")
+def assertCountEqual(self, *args, **kwargs):
+ return getattr(self, _assertCountEqual)(*args, **kwargs)
+
+
+def assertRaisesRegex(self, *args, **kwargs):
+ return getattr(self, _assertRaisesRegex)(*args, **kwargs)
+
+
+def assertRegex(self, *args, **kwargs):
+ return getattr(self, _assertRegex)(*args, **kwargs)
+
+
if PY3:
exec_ = getattr(moves.builtins, "exec")
@@ -643,6 +677,21 @@
""")
+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
+""")
+elif sys.version_info[:2] > (3, 2):
+ exec_("""def raise_from(value, from_value):
+ raise value from from_value
+""")
+else:
+ def raise_from(value, from_value):
+ raise value
+
+
print_ = getattr(moves.builtins, "print", None)
if print_ is None:
def print_(*args, **kwargs):
@@ -697,6 +746,14 @@
write(sep)
write(arg)
write(end)
+if sys.version_info[:2] < (3, 3):
+ _print = print_
+ def print_(*args, **kwargs):
+ fp = kwargs.get("file", sys.stdout)
+ flush = kwargs.pop("flush", False)
+ _print(*args, **kwargs)
+ if flush and fp is not None:
+ fp.flush()
_add_doc(reraise, """Reraise an exception.""")
@@ -704,7 +761,7 @@
def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
updated=functools.WRAPPER_UPDATES):
def wrapper(f):
- f = functools.wraps(wrapped)(f)
+ f = functools.wraps(wrapped, assigned, updated)(f)
f.__wrapped__ = wrapped
return f
return wrapper
@@ -737,6 +794,25 @@
return metaclass(cls.__name__, cls.__bases__, orig_vars)
return wrapper
+
+def python_2_unicode_compatible(klass):
+ """
+ A decorator that defines __unicode__ and __str__ methods under Python 2.
+ Under Python 3 it does nothing.
+
+ To support Python 2 and 3 with a single code base, define a __str__ method
+ returning text and apply this decorator to the class.
+ """
+ if PY2:
+ if '__str__' not in klass.__dict__:
+ raise ValueError("@python_2_unicode_compatible cannot be applied "
+ "to %s because it doesn't define __str__()." %
+ klass.__name__)
+ klass.__unicode__ = klass.__str__
+ klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
+ return klass
+
+
# Complete the moves implementation.
# This code is at the end of this module to speed up module loading.
# Turn this module into a package.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip/_vendor/vendor.txt new/pip-6.0.7/pip/_vendor/vendor.txt
--- old/pip-6.0.6/pip/_vendor/vendor.txt 2015-01-03 10:32:02.000000000 +0100
+++ new/pip-6.0.7/pip/_vendor/vendor.txt 2015-01-28 22:35:25.000000000 +0100
@@ -1,10 +1,10 @@
distlib==0.2.0
html5lib==0.999 # See: https://github.com/html5lib/html5lib-python/issues/161
-six==1.8.0
-colorama==0.3.2
-requests==2.5.0
+six==1.9.0
+colorama==0.3.3
+requests==2.5.1
certifi==14.05.14
-CacheControl==0.10.7
+CacheControl==0.11.1
lockfile==0.10.2
progress==1.2
ipaddress==1.0.7 # Only needed on 2.6, 2.7, and 3.2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip/commands/wheel.py new/pip-6.0.7/pip/commands/wheel.py
--- old/pip-6.0.6/pip/commands/wheel.py 2015-01-03 10:32:02.000000000 +0100
+++ new/pip-6.0.7/pip/commands/wheel.py 2015-01-28 22:35:25.000000000 +0100
@@ -222,7 +222,7 @@
logger.error(
"You must give at least one requirement to %s "
"(see \"pip help %s\")",
- self.name,
+ self.name, self.name,
)
return
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip/download.py new/pip-6.0.7/pip/download.py
--- old/pip-6.0.6/pip/download.py 2015-01-03 10:32:02.000000000 +0100
+++ new/pip-6.0.7/pip/download.py 2015-01-28 22:35:25.000000000 +0100
@@ -549,76 +549,75 @@
show_progress = False
show_url = link.show_url
- try:
- def resp_read(chunk_size):
- try:
- # Special case for urllib3.
- for chunk in resp.raw.stream(
- chunk_size,
- # We use decode_content=False here because we do
- # want urllib3 to mess with the raw bytes we get
- # from the server. If we decompress inside of
- # urllib3 then we cannot verify the checksum
- # because the checksum will be of the compressed
- # file. This breakage will only occur if the
- # server adds a Content-Encoding header, which
- # depends on how the server was configured:
- # - Some servers will notice that the file isn't a
- # compressible file and will leave the file alone
- # and with an empty Content-Encoding
- # - Some servers will notice that the file is
- # already compressed and will leave the file
- # alone and will add a Content-Encoding: gzip
- # header
- # - Some servers won't notice anything at all and
- # will take a file that's already been compressed
- # and compress it again and set the
- # Content-Encoding: gzip header
- #
- # By setting this not to decode automatically we
- # hope to eliminate problems with the second case.
- decode_content=False):
- yield chunk
- except AttributeError:
- # Standard file-like object.
- while True:
- chunk = resp.raw.read(chunk_size)
- if not chunk:
- break
- yield chunk
- progress_indicator = lambda x, *a, **k: x
-
- if link.netloc == PyPI.netloc:
- url = show_url
- else:
- url = link.url_without_fragment
-
- if show_progress: # We don't show progress on cached responses
- if total_length:
- logger.info(
- "Downloading %s (%s)", url, format_size(total_length),
- )
- progress_indicator = DownloadProgressBar(
- max=total_length,
- ).iter
- else:
- logger.info("Downloading %s", url)
- progress_indicator = DownloadProgressSpinner().iter
- elif cached_resp:
- logger.info("Using cached %s", url)
+ def resp_read(chunk_size):
+ try:
+ # Special case for urllib3.
+ for chunk in resp.raw.stream(
+ chunk_size,
+ # We use decode_content=False here because we do
+ # want urllib3 to mess with the raw bytes we get
+ # from the server. If we decompress inside of
+ # urllib3 then we cannot verify the checksum
+ # because the checksum will be of the compressed
+ # file. This breakage will only occur if the
+ # server adds a Content-Encoding header, which
+ # depends on how the server was configured:
+ # - Some servers will notice that the file isn't a
+ # compressible file and will leave the file alone
+ # and with an empty Content-Encoding
+ # - Some servers will notice that the file is
+ # already compressed and will leave the file
+ # alone and will add a Content-Encoding: gzip
+ # header
+ # - Some servers won't notice anything at all and
+ # will take a file that's already been compressed
+ # and compress it again and set the
+ # Content-Encoding: gzip header
+ #
+ # By setting this not to decode automatically we
+ # hope to eliminate problems with the second case.
+ decode_content=False):
+ yield chunk
+ except AttributeError:
+ # Standard file-like object.
+ while True:
+ chunk = resp.raw.read(chunk_size)
+ if not chunk:
+ break
+ yield chunk
+
+ progress_indicator = lambda x, *a, **k: x
+
+ if link.netloc == PyPI.netloc:
+ url = show_url
+ else:
+ url = link.url_without_fragment
+
+ if show_progress: # We don't show progress on cached responses
+ if total_length:
+ logger.info(
+ "Downloading %s (%s)", url, format_size(total_length),
+ )
+ progress_indicator = DownloadProgressBar(
+ max=total_length,
+ ).iter
else:
logger.info("Downloading %s", url)
-
- logger.debug('Downloading from URL %s', link)
-
- for chunk in progress_indicator(resp_read(4096), 4096):
- if download_hash is not None:
- download_hash.update(chunk)
- content_file.write(chunk)
- finally:
- if link.hash and link.hash_name:
- _check_hash(download_hash, link)
+ progress_indicator = DownloadProgressSpinner().iter
+ elif cached_resp:
+ logger.info("Using cached %s", url)
+ else:
+ logger.info("Downloading %s", url)
+
+ logger.debug('Downloading from URL %s', link)
+
+ for chunk in progress_indicator(resp_read(4096), 4096):
+ if download_hash is not None:
+ download_hash.update(chunk)
+ content_file.write(chunk)
+ if link.hash and link.hash_name:
+ _check_hash(download_hash, link)
return download_hash
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip/req/req_install.py new/pip-6.0.7/pip/req/req_install.py
--- old/pip-6.0.6/pip/req/req_install.py 2015-01-03 10:32:02.000000000 +0100
+++ new/pip-6.0.7/pip/req/req_install.py 2015-01-28 22:35:25.000000000 +0100
@@ -557,33 +557,27 @@
dist = self.satisfied_by or self.conflicts_with
paths_to_remove = UninstallPathSet(dist)
-
- pip_egg_info_path = os.path.join(dist.location,
- dist.egg_name()) + '.egg-info'
- dist_info_path = os.path.join(dist.location,
- '-'.join(dist.egg_name().split('-')[:2])
- ) + '.dist-info'
- # Workaround - http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=618367
- debian_egg_info_path = pip_egg_info_path.replace(
- '-py%s' % pkg_resources.PY_MAJOR, '')
- easy_install_egg = dist.egg_name() + '.egg'
develop_egg_link = egg_link_path(dist)
-
- pip_egg_info_exists = os.path.exists(pip_egg_info_path)
- debian_egg_info_exists = os.path.exists(debian_egg_info_path)
- dist_info_exists = os.path.exists(dist_info_path)
- if pip_egg_info_exists or debian_egg_info_exists:
- # package installed by pip
- if pip_egg_info_exists:
- egg_info_path = pip_egg_info_path
- else:
- egg_info_path = debian_egg_info_path
- paths_to_remove.add(egg_info_path)
+ egg_info_exists = dist.egg_info and os.path.exists(dist.egg_info)
+ if develop_egg_link:
+ # develop egg
+ with open(develop_egg_link, 'r') as fh:
+ link_pointer = os.path.normcase(fh.readline().strip())
+ assert (link_pointer == dist.location), (
+ 'Egg-link %s does not match installed location of %s '
+ '(at %s)' % (link_pointer, self.name, dist.location)
+ )
+ paths_to_remove.add(develop_egg_link)
+ easy_install_pth = os.path.join(os.path.dirname(develop_egg_link),
+ 'easy-install.pth')
+ paths_to_remove.add_pth(easy_install_pth, dist.location)
+ elif egg_info_exists and dist.egg_info.endswith('.egg-info'):
+ paths_to_remove.add(dist.egg_info)
if dist.has_metadata('installed-files.txt'):
for installed_file in dist.get_metadata(
'installed-files.txt').splitlines():
path = os.path.normpath(
- os.path.join(egg_info_path, installed_file)
+ os.path.join(dist.egg_info, installed_file)
)
paths_to_remove.add(path)
# FIXME: need a test for this elif block
@@ -603,28 +597,23 @@
paths_to_remove.add(path + '.py')
paths_to_remove.add(path + '.pyc')
- elif dist.location.endswith(easy_install_egg):
+ elif dist.location.endswith('.egg'):
# package installed by easy_install
+ # We cannot match on dist.egg_name because it can slightly vary
+ # i.e. setuptools-0.6c11-py2.6.egg vs setuptools-0.6rc11-py2.6.egg
paths_to_remove.add(dist.location)
+ easy_install_egg = os.path.split(dist.location)[1]
easy_install_pth = os.path.join(os.path.dirname(dist.location),
'easy-install.pth')
paths_to_remove.add_pth(easy_install_pth, './' + easy_install_egg)
- elif develop_egg_link:
- # develop egg
- with open(develop_egg_link, 'r') as fh:
- link_pointer = os.path.normcase(fh.readline().strip())
- assert (link_pointer == dist.location), (
- 'Egg-link %s does not match installed location of %s '
- '(at %s)' % (link_pointer, self.name, dist.location)
- )
- paths_to_remove.add(develop_egg_link)
- easy_install_pth = os.path.join(os.path.dirname(develop_egg_link),
- 'easy-install.pth')
- paths_to_remove.add_pth(easy_install_pth, dist.location)
- elif dist_info_exists:
+ elif egg_info_exists and dist.egg_info.endswith('.dist-info'):
for path in pip.wheel.uninstallation_paths(dist):
paths_to_remove.add(path)
+ else:
+ logger.debug(
+ 'Not sure how to uninstall: %s - Check: %s',
+ dist, dist.location)
# find distutils scripts= scripts
if dist.has_metadata('scripts') and dist.metadata_isdir('scripts'):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip/utils/build.py new/pip-6.0.7/pip/utils/build.py
--- old/pip-6.0.6/pip/utils/build.py 2015-01-03 10:32:02.000000000 +0100
+++ new/pip-6.0.7/pip/utils/build.py 2015-01-28 22:35:25.000000000 +0100
@@ -1,5 +1,6 @@
from __future__ import absolute_import
+import os.path
import tempfile
from pip.utils import rmtree
@@ -14,7 +15,11 @@
delete = True
if name is None:
- name = tempfile.mkdtemp(prefix="pip-build-")
+ # We realpath here because some systems have their default tmpdir
+ # symlinked to another directory. This tends to confuse build
+ # scripts, so we canonicalize the path by traversing potential
+ # symlinks here.
+ name = os.path.realpath(tempfile.mkdtemp(prefix="pip-build-"))
# If we were not given an explicit directory, and we were not given
# an explicit delete option, then we'll default to deleting.
if delete is None:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip/utils/outdated.py new/pip-6.0.7/pip/utils/outdated.py
--- old/pip-6.0.6/pip/utils/outdated.py 2015-01-03 10:32:02.000000000 +0100
+++ new/pip-6.0.7/pip/utils/outdated.py 2015-01-28 22:35:25.000000000 +0100
@@ -73,8 +73,11 @@
# Attempt to write out our version check file
with lockfile.LockFile(self.statefile_path):
- with open(self.statefile_path) as statefile:
- state = json.load(statefile)
+ if os.path.exists(self.statefile_path):
+ with open(self.statefile_path) as statefile:
+ state = json.load(statefile)
+ else:
+ state = {}
state[sys.prefix] = {
"last_check": current_time.strftime(SELFCHECK_DATE_FMT),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip.egg-info/PKG-INFO new/pip-6.0.7/pip.egg-info/PKG-INFO
--- old/pip-6.0.6/pip.egg-info/PKG-INFO 2015-01-03 10:32:20.000000000 +0100
+++ new/pip-6.0.7/pip.egg-info/PKG-INFO 2015-01-28 22:35:31.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: pip
-Version: 6.0.6
+Version: 6.0.7
Summary: The PyPA recommended tool for installing Python packages.
Home-page: https://pip.pypa.io/
Author: The pip developers
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pip-6.0.6/pip.egg-info/pbr.json new/pip-6.0.7/pip.egg-info/pbr.json
--- old/pip-6.0.6/pip.egg-info/pbr.json 2015-01-03 10:32:20.000000000 +0100
+++ new/pip-6.0.7/pip.egg-info/pbr.json 2015-01-28 22:35:31.000000000 +0100
@@ -1 +1 @@
-{"git_version": "a898b9b", "is_release": true}
\ No newline at end of file
+{"git_version": "2a96914", "is_release": true}
\ No newline at end of file
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org