pip/pip/compat.py

118 lines
3.1 KiB
Python
Raw Normal View History

"""Stuff that differs in different Python versions and platform
distributions."""
2009-11-20 08:10:46 +01:00
# flake8: noqa
2012-08-05 03:48:16 +02:00
import os
2012-08-19 00:26:17 +02:00
import imp
import sys
import site
__all__ = ['WindowsError']
uses_pycache = hasattr(imp, 'cache_from_source')
2012-08-19 00:26:17 +02:00
2013-03-04 07:55:54 +01:00
class NeverUsedException(Exception):
"""this exception should never be raised"""
try:
WindowsError = WindowsError
except NameError:
2011-03-15 20:49:48 +01:00
WindowsError = NeverUsedException
2009-11-20 08:10:46 +01:00
2013-03-04 07:55:54 +01:00
try:
#new in Python 3.3
PermissionError = PermissionError
except NameError:
PermissionError = NeverUsedException
console_encoding = sys.__stdout__.encoding
2014-01-27 20:40:32 +01:00
2011-03-15 20:49:48 +01:00
if sys.version_info >= (3,):
from io import StringIO
2011-03-15 20:49:48 +01:00
from urllib.error import URLError, HTTPError
2013-11-21 00:36:09 +01:00
from urllib.request import url2pathname, urlretrieve, pathname2url
2011-03-15 20:49:48 +01:00
import urllib.parse as urllib
import urllib.request as urllib2
import urllib.parse as urlparse
2011-03-15 20:49:48 +01:00
def cmp(a, b):
return (a > b) - (a < b)
def console_to_str(s):
try:
return s.decode(console_encoding)
except UnicodeDecodeError:
return s.decode('utf_8')
def native_str(s):
if isinstance(s, bytes):
return s.decode('utf-8')
return s
def get_http_message_param(http_message, param, default_value):
return http_message.get_param(param, default_value)
2011-03-15 20:49:48 +01:00
else:
from cStringIO import StringIO
from urllib2 import URLError, HTTPError
2013-11-21 00:36:09 +01:00
from urllib import url2pathname, urlretrieve, pathname2url
2011-03-15 20:49:48 +01:00
import urllib
import urllib2
import urlparse
def console_to_str(s):
return s
def native_str(s):
if isinstance(s, unicode):
return s.encode('utf-8')
return s
def get_http_message_param(http_message, param, default_value):
result = http_message.getparam(param)
return result or default_value
2011-03-15 20:49:48 +01:00
cmp = cmp
def get_path_uid(path):
"""
Return path's uid.
Does not follow symlinks:
https://github.com/pypa/pip/pull/935#discussion_r5307003
Placed this function in compat due to differences on AIX and
Jython, that should eventually go away.
:raises OSError: When path is a symlink or can't be read.
"""
if hasattr(os, 'O_NOFOLLOW'):
fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW)
file_uid = os.fstat(fd).st_uid
os.close(fd)
else: # AIX and Jython
# WARNING: time of check vulnerabity, but best we can do w/o NOFOLLOW
if not os.path.islink(path):
# older versions of Jython don't have `os.fstat`
file_uid = os.stat(path).st_uid
else:
# raise OSError for parity with os.O_NOFOLLOW above
raise OSError(
"%s is a symlink; Will not return uid for symlinks" % path
)
return file_uid
2014-03-01 05:09:26 +01:00
# packages in the stdlib that may have installation metadata, but should not be
# considered 'installed'. this theoretically could be determined based on
# dist.location (py27:`sysconfig.get_paths()['stdlib']`,
# py26:sysconfig.get_config_vars('LIBDEST')), but fear platform variation may
# make this ineffective, so hard-coding
stdlib_pkgs = ['python', 'wsgiref']
if sys.version_info >= (2, 7):
stdlib_pkgs.extend(['argparse'])