| 
									
										
										
										
											2014-11-02 11:36:29 +01:00
										 |  |  | from __future__ import unicode_literals | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-28 21:42:16 +01:00
										 |  |  | import collections | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  | import getpass | 
					
						
							| 
									
										
										
										
											2014-11-19 18:21:58 +01:00
										 |  |  | import optparse | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2014-11-23 10:49:19 +01:00
										 |  |  | import re | 
					
						
							| 
									
										
										
										
											2015-02-28 21:42:16 +01:00
										 |  |  | import shutil | 
					
						
							| 
									
										
										
										
											2015-01-10 19:55:36 +01:00
										 |  |  | import socket | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  | import subprocess | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     import urllib.request as compat_urllib_request | 
					
						
							| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  | except ImportError:  # Python 2 | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  |     import urllib2 as compat_urllib_request | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     import urllib.error as compat_urllib_error | 
					
						
							| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  | except ImportError:  # Python 2 | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  |     import urllib2 as compat_urllib_error | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     import urllib.parse as compat_urllib_parse | 
					
						
							| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  | except ImportError:  # Python 2 | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  |     import urllib as compat_urllib_parse | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     from urllib.parse import urlparse as compat_urllib_parse_urlparse | 
					
						
							| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  | except ImportError:  # Python 2 | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  |     from urlparse import urlparse as compat_urllib_parse_urlparse | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     import urllib.parse as compat_urlparse | 
					
						
							| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  | except ImportError:  # Python 2 | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  |     import urlparse as compat_urlparse | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     import http.cookiejar as compat_cookiejar | 
					
						
							| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  | except ImportError:  # Python 2 | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  |     import cookielib as compat_cookiejar | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     import html.entities as compat_html_entities | 
					
						
							| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  | except ImportError:  # Python 2 | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  |     import htmlentitydefs as compat_html_entities | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     import html.parser as compat_html_parser | 
					
						
							| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  | except ImportError:  # Python 2 | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  |     import HTMLParser as compat_html_parser | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     import http.client as compat_http_client | 
					
						
							| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  | except ImportError:  # Python 2 | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  |     import httplib as compat_http_client | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     from urllib.error import HTTPError as compat_HTTPError | 
					
						
							|  |  |  | except ImportError:  # Python 2 | 
					
						
							|  |  |  |     from urllib2 import HTTPError as compat_HTTPError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     from urllib.request import urlretrieve as compat_urlretrieve | 
					
						
							|  |  |  | except ImportError:  # Python 2 | 
					
						
							|  |  |  |     from urllib import urlretrieve as compat_urlretrieve | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     from subprocess import DEVNULL | 
					
						
							|  |  |  |     compat_subprocess_get_DEVNULL = lambda: DEVNULL | 
					
						
							|  |  |  | except ImportError: | 
					
						
							|  |  |  |     compat_subprocess_get_DEVNULL = lambda: open(os.path.devnull, 'w') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-30 02:57:37 +01:00
										 |  |  | try: | 
					
						
							|  |  |  |     import http.server as compat_http_server | 
					
						
							|  |  |  | except ImportError: | 
					
						
							|  |  |  |     import BaseHTTPServer as compat_http_server | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  | try: | 
					
						
							|  |  |  |     from urllib.parse import unquote as compat_urllib_parse_unquote | 
					
						
							|  |  |  | except ImportError: | 
					
						
							|  |  |  |     def compat_urllib_parse_unquote(string, encoding='utf-8', errors='replace'): | 
					
						
							|  |  |  |         if string == '': | 
					
						
							|  |  |  |             return string | 
					
						
							|  |  |  |         res = string.split('%') | 
					
						
							|  |  |  |         if len(res) == 1: | 
					
						
							|  |  |  |             return string | 
					
						
							|  |  |  |         if encoding is None: | 
					
						
							|  |  |  |             encoding = 'utf-8' | 
					
						
							|  |  |  |         if errors is None: | 
					
						
							|  |  |  |             errors = 'replace' | 
					
						
							|  |  |  |         # pct_sequence: contiguous sequence of percent-encoded bytes, decoded | 
					
						
							|  |  |  |         pct_sequence = b'' | 
					
						
							|  |  |  |         string = res[0] | 
					
						
							|  |  |  |         for item in res[1:]: | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 if not item: | 
					
						
							|  |  |  |                     raise ValueError | 
					
						
							|  |  |  |                 pct_sequence += item[:2].decode('hex') | 
					
						
							|  |  |  |                 rest = item[2:] | 
					
						
							|  |  |  |                 if not rest: | 
					
						
							|  |  |  |                     # This segment was just a single percent-encoded character. | 
					
						
							|  |  |  |                     # May be part of a sequence of code units, so delay decoding. | 
					
						
							|  |  |  |                     # (Stored in pct_sequence). | 
					
						
							|  |  |  |                     continue | 
					
						
							|  |  |  |             except ValueError: | 
					
						
							|  |  |  |                 rest = '%' + item | 
					
						
							|  |  |  |             # Encountered non-percent-encoded characters. Flush the current | 
					
						
							|  |  |  |             # pct_sequence. | 
					
						
							|  |  |  |             string += pct_sequence.decode(encoding, errors) + rest | 
					
						
							|  |  |  |             pct_sequence = b'' | 
					
						
							|  |  |  |         if pct_sequence: | 
					
						
							|  |  |  |             # Flush the final pct_sequence | 
					
						
							|  |  |  |             string += pct_sequence.decode(encoding, errors) | 
					
						
							|  |  |  |         return string | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-01 11:30:56 +01:00
										 |  |  | try: | 
					
						
							|  |  |  |     compat_str = unicode  # Python 2 | 
					
						
							|  |  |  | except NameError: | 
					
						
							|  |  |  |     compat_str = str | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							| 
									
										
										
										
											2015-02-01 11:36:59 +01:00
										 |  |  |     compat_basestring = basestring  # Python 2 | 
					
						
							| 
									
										
										
										
											2015-02-01 11:30:56 +01:00
										 |  |  | except NameError: | 
					
						
							| 
									
										
										
										
											2015-02-01 11:36:59 +01:00
										 |  |  |     compat_basestring = str | 
					
						
							| 
									
										
										
										
											2015-02-01 11:30:56 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     compat_chr = unichr  # Python 2 | 
					
						
							|  |  |  | except NameError: | 
					
						
							|  |  |  |     compat_chr = chr | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     from xml.etree.ElementTree import ParseError as compat_xml_parse_error | 
					
						
							|  |  |  | except ImportError:  # Python 2.6 | 
					
						
							|  |  |  |     from xml.parsers.expat import ExpatError as compat_xml_parse_error | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     from urllib.parse import parse_qs as compat_parse_qs | 
					
						
							| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  | except ImportError:  # Python 2 | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  |     # HACK: The following is the correct parse_qs implementation from cpython 3's stdlib. | 
					
						
							|  |  |  |     # Python 2's version is apparently totally broken | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _parse_qsl(qs, keep_blank_values=False, strict_parsing=False, | 
					
						
							| 
									
										
										
										
											2014-11-23 21:39:15 +01:00
										 |  |  |                    encoding='utf-8', errors='replace'): | 
					
						
							| 
									
										
										
										
											2015-02-01 11:30:56 +01:00
										 |  |  |         qs, _coerce_result = qs, compat_str | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  |         pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')] | 
					
						
							|  |  |  |         r = [] | 
					
						
							|  |  |  |         for name_value in pairs: | 
					
						
							|  |  |  |             if not name_value and not strict_parsing: | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             nv = name_value.split('=', 1) | 
					
						
							|  |  |  |             if len(nv) != 2: | 
					
						
							|  |  |  |                 if strict_parsing: | 
					
						
							|  |  |  |                     raise ValueError("bad query field: %r" % (name_value,)) | 
					
						
							|  |  |  |                 # Handle case of a control-name with no equal sign | 
					
						
							|  |  |  |                 if keep_blank_values: | 
					
						
							|  |  |  |                     nv.append('') | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     continue | 
					
						
							|  |  |  |             if len(nv[1]) or keep_blank_values: | 
					
						
							|  |  |  |                 name = nv[0].replace('+', ' ') | 
					
						
							|  |  |  |                 name = compat_urllib_parse_unquote( | 
					
						
							|  |  |  |                     name, encoding=encoding, errors=errors) | 
					
						
							|  |  |  |                 name = _coerce_result(name) | 
					
						
							|  |  |  |                 value = nv[1].replace('+', ' ') | 
					
						
							|  |  |  |                 value = compat_urllib_parse_unquote( | 
					
						
							|  |  |  |                     value, encoding=encoding, errors=errors) | 
					
						
							|  |  |  |                 value = _coerce_result(value) | 
					
						
							|  |  |  |                 r.append((name, value)) | 
					
						
							|  |  |  |         return r | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def compat_parse_qs(qs, keep_blank_values=False, strict_parsing=False, | 
					
						
							| 
									
										
										
										
											2014-11-23 21:39:15 +01:00
										 |  |  |                         encoding='utf-8', errors='replace'): | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  |         parsed_result = {} | 
					
						
							|  |  |  |         pairs = _parse_qsl(qs, keep_blank_values, strict_parsing, | 
					
						
							| 
									
										
										
										
											2014-11-23 21:39:15 +01:00
										 |  |  |                            encoding=encoding, errors=errors) | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  |         for name, value in pairs: | 
					
						
							|  |  |  |             if name in parsed_result: | 
					
						
							|  |  |  |                 parsed_result[name].append(value) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 parsed_result[name] = [value] | 
					
						
							|  |  |  |         return parsed_result | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     from shlex import quote as shlex_quote | 
					
						
							|  |  |  | except ImportError:  # Python < 3.3 | 
					
						
							|  |  |  |     def shlex_quote(s): | 
					
						
							| 
									
										
										
										
											2014-11-23 10:49:19 +01:00
										 |  |  |         if re.match(r'^[-_\w./]+$', s): | 
					
						
							|  |  |  |             return s | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             return "'" + s.replace("'", "'\"'\"'") + "'" | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def compat_ord(c): | 
					
						
							| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  |     if type(c) is int: | 
					
						
							|  |  |  |         return c | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         return ord(c) | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if sys.version_info >= (3, 0): | 
					
						
							|  |  |  |     compat_getenv = os.getenv | 
					
						
							|  |  |  |     compat_expanduser = os.path.expanduser | 
					
						
							|  |  |  | else: | 
					
						
							|  |  |  |     # Environment variables should be decoded with filesystem encoding. | 
					
						
							|  |  |  |     # Otherwise it will fail if any non-ASCII characters present (see #3854 #3217 #2918) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def compat_getenv(key, default=None): | 
					
						
							|  |  |  |         from .utils import get_filesystem_encoding | 
					
						
							|  |  |  |         env = os.getenv(key, default) | 
					
						
							|  |  |  |         if env: | 
					
						
							|  |  |  |             env = env.decode(get_filesystem_encoding()) | 
					
						
							|  |  |  |         return env | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # HACK: The default implementations of os.path.expanduser from cpython do not decode | 
					
						
							|  |  |  |     # environment variables with filesystem encoding. We will work around this by | 
					
						
							|  |  |  |     # providing adjusted implementations. | 
					
						
							|  |  |  |     # The following are os.path.expanduser implementations from cpython 2.7.8 stdlib | 
					
						
							|  |  |  |     # for different platforms with correct environment variables decoding. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if os.name == 'posix': | 
					
						
							|  |  |  |         def compat_expanduser(path): | 
					
						
							|  |  |  |             """Expand ~ and ~user constructions.  If user or $HOME is unknown,
 | 
					
						
							|  |  |  |             do nothing."""
 | 
					
						
							|  |  |  |             if not path.startswith('~'): | 
					
						
							|  |  |  |                 return path | 
					
						
							|  |  |  |             i = path.find('/', 1) | 
					
						
							|  |  |  |             if i < 0: | 
					
						
							|  |  |  |                 i = len(path) | 
					
						
							|  |  |  |             if i == 1: | 
					
						
							|  |  |  |                 if 'HOME' not in os.environ: | 
					
						
							|  |  |  |                     import pwd | 
					
						
							|  |  |  |                     userhome = pwd.getpwuid(os.getuid()).pw_dir | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     userhome = compat_getenv('HOME') | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 import pwd | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     pwent = pwd.getpwnam(path[1:i]) | 
					
						
							|  |  |  |                 except KeyError: | 
					
						
							|  |  |  |                     return path | 
					
						
							|  |  |  |                 userhome = pwent.pw_dir | 
					
						
							|  |  |  |             userhome = userhome.rstrip('/') | 
					
						
							|  |  |  |             return (userhome + path[i:]) or '/' | 
					
						
							|  |  |  |     elif os.name == 'nt' or os.name == 'ce': | 
					
						
							|  |  |  |         def compat_expanduser(path): | 
					
						
							|  |  |  |             """Expand ~ and ~user constructs.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             If user or $HOME is unknown, do nothing."""
 | 
					
						
							|  |  |  |             if path[:1] != '~': | 
					
						
							|  |  |  |                 return path | 
					
						
							|  |  |  |             i, n = 1, len(path) | 
					
						
							|  |  |  |             while i < n and path[i] not in '/\\': | 
					
						
							|  |  |  |                 i = i + 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if 'HOME' in os.environ: | 
					
						
							|  |  |  |                 userhome = compat_getenv('HOME') | 
					
						
							|  |  |  |             elif 'USERPROFILE' in os.environ: | 
					
						
							|  |  |  |                 userhome = compat_getenv('USERPROFILE') | 
					
						
							| 
									
										
										
										
											2014-12-09 23:11:26 +01:00
										 |  |  |             elif 'HOMEPATH' not in os.environ: | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  |                 return path | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     drive = compat_getenv('HOMEDRIVE') | 
					
						
							|  |  |  |                 except KeyError: | 
					
						
							|  |  |  |                     drive = '' | 
					
						
							|  |  |  |                 userhome = os.path.join(drive, compat_getenv('HOMEPATH')) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  |             if i != 1:  # ~user | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  |                 userhome = os.path.join(os.path.dirname(userhome), path[1:i]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return userhome + path[i:] | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         compat_expanduser = os.path.expanduser | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if sys.version_info < (3, 0): | 
					
						
							|  |  |  |     def compat_print(s): | 
					
						
							|  |  |  |         from .utils import preferredencoding | 
					
						
							|  |  |  |         print(s.encode(preferredencoding(), 'xmlcharrefreplace')) | 
					
						
							|  |  |  | else: | 
					
						
							|  |  |  |     def compat_print(s): | 
					
						
							| 
									
										
										
										
											2014-11-26 11:48:09 +01:00
										 |  |  |         assert isinstance(s, compat_str) | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  |         print(s) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     subprocess_check_output = subprocess.check_output | 
					
						
							|  |  |  | except AttributeError: | 
					
						
							|  |  |  |     def subprocess_check_output(*args, **kwargs): | 
					
						
							|  |  |  |         assert 'input' not in kwargs | 
					
						
							|  |  |  |         p = subprocess.Popen(*args, stdout=subprocess.PIPE, **kwargs) | 
					
						
							|  |  |  |         output, _ = p.communicate() | 
					
						
							|  |  |  |         ret = p.poll() | 
					
						
							|  |  |  |         if ret: | 
					
						
							|  |  |  |             raise subprocess.CalledProcessError(ret, p.args, output=output) | 
					
						
							|  |  |  |         return output | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if sys.version_info < (3, 0) and sys.platform == 'win32': | 
					
						
							|  |  |  |     def compat_getpass(prompt, *args, **kwargs): | 
					
						
							|  |  |  |         if isinstance(prompt, compat_str): | 
					
						
							| 
									
										
										
										
											2014-11-02 11:26:40 +01:00
										 |  |  |             from .utils import preferredencoding | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  |             prompt = prompt.encode(preferredencoding()) | 
					
						
							|  |  |  |         return getpass.getpass(prompt, *args, **kwargs) | 
					
						
							|  |  |  | else: | 
					
						
							|  |  |  |     compat_getpass = getpass.getpass | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-15 15:17:19 +01:00
										 |  |  | # Old 2.6 and 2.7 releases require kwargs to be bytes | 
					
						
							|  |  |  | try: | 
					
						
							| 
									
										
										
										
											2014-12-12 12:42:33 +01:00
										 |  |  |     def _testfunc(x): | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  |     _testfunc(**{'x': 0}) | 
					
						
							| 
									
										
										
										
											2014-11-15 15:17:19 +01:00
										 |  |  | except TypeError: | 
					
						
							|  |  |  |     def compat_kwargs(kwargs): | 
					
						
							|  |  |  |         return dict((bytes(k), v) for k, v in kwargs.items()) | 
					
						
							|  |  |  | else: | 
					
						
							|  |  |  |     compat_kwargs = lambda kwargs: kwargs | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-19 18:21:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-10 19:55:36 +01:00
										 |  |  | if sys.version_info < (2, 7): | 
					
						
							|  |  |  |     def compat_socket_create_connection(address, timeout, source_address=None): | 
					
						
							|  |  |  |         host, port = address | 
					
						
							|  |  |  |         err = None | 
					
						
							|  |  |  |         for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): | 
					
						
							|  |  |  |             af, socktype, proto, canonname, sa = res | 
					
						
							|  |  |  |             sock = None | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 sock = socket.socket(af, socktype, proto) | 
					
						
							|  |  |  |                 sock.settimeout(timeout) | 
					
						
							|  |  |  |                 if source_address: | 
					
						
							|  |  |  |                     sock.bind(source_address) | 
					
						
							|  |  |  |                 sock.connect(sa) | 
					
						
							|  |  |  |                 return sock | 
					
						
							|  |  |  |             except socket.error as _: | 
					
						
							|  |  |  |                 err = _ | 
					
						
							|  |  |  |                 if sock is not None: | 
					
						
							|  |  |  |                     sock.close() | 
					
						
							|  |  |  |         if err is not None: | 
					
						
							|  |  |  |             raise err | 
					
						
							|  |  |  |         else: | 
					
						
							| 
									
										
										
										
											2015-01-11 10:47:39 +01:00
										 |  |  |             raise socket.error("getaddrinfo returns an empty list") | 
					
						
							| 
									
										
										
										
											2015-01-10 19:55:36 +01:00
										 |  |  | else: | 
					
						
							|  |  |  |     compat_socket_create_connection = socket.create_connection | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-19 18:21:58 +01:00
										 |  |  | # Fix https://github.com/rg3/youtube-dl/issues/4223 | 
					
						
							|  |  |  | # See http://bugs.python.org/issue9161 for what is broken | 
					
						
							|  |  |  | def workaround_optparse_bug9161(): | 
					
						
							| 
									
										
										
										
											2014-11-20 07:21:12 +01:00
										 |  |  |     op = optparse.OptionParser() | 
					
						
							|  |  |  |     og = optparse.OptionGroup(op, 'foo') | 
					
						
							| 
									
										
										
										
											2014-11-19 18:21:58 +01:00
										 |  |  |     try: | 
					
						
							| 
									
										
										
										
											2014-11-20 07:21:12 +01:00
										 |  |  |         og.add_option('-t') | 
					
						
							| 
									
										
										
										
											2014-11-20 16:35:55 +01:00
										 |  |  |     except TypeError: | 
					
						
							| 
									
										
										
										
											2014-11-19 18:21:58 +01:00
										 |  |  |         real_add_option = optparse.OptionGroup.add_option | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def _compat_add_option(self, *args, **kwargs): | 
					
						
							|  |  |  |             enc = lambda v: ( | 
					
						
							|  |  |  |                 v.encode('ascii', 'replace') if isinstance(v, compat_str) | 
					
						
							|  |  |  |                 else v) | 
					
						
							|  |  |  |             bargs = [enc(a) for a in args] | 
					
						
							|  |  |  |             bkwargs = dict( | 
					
						
							|  |  |  |                 (k, enc(v)) for k, v in kwargs.items()) | 
					
						
							|  |  |  |             return real_add_option(self, *bargs, **bkwargs) | 
					
						
							|  |  |  |         optparse.OptionGroup.add_option = _compat_add_option | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-28 21:42:16 +01:00
										 |  |  | if hasattr(shutil, 'get_terminal_size'):  # Python >= 3.3 | 
					
						
							|  |  |  |     compat_get_terminal_size = shutil.get_terminal_size | 
					
						
							|  |  |  | else: | 
					
						
							|  |  |  |     _terminal_size = collections.namedtuple('terminal_size', ['columns', 'lines']) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def compat_get_terminal_size(): | 
					
						
							|  |  |  |         columns = compat_getenv('COLUMNS', None) | 
					
						
							|  |  |  |         if columns: | 
					
						
							|  |  |  |             columns = int(columns) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             columns = None | 
					
						
							|  |  |  |         lines = compat_getenv('LINES', None) | 
					
						
							|  |  |  |         if lines: | 
					
						
							|  |  |  |             lines = int(lines) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             lines = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             sp = subprocess.Popen( | 
					
						
							|  |  |  |                 ['stty', 'size'], | 
					
						
							|  |  |  |                 stdout=subprocess.PIPE, stderr=subprocess.PIPE) | 
					
						
							|  |  |  |             out, err = sp.communicate() | 
					
						
							|  |  |  |             lines, columns = map(int, out.split()) | 
					
						
							| 
									
										
										
										
											2015-03-27 13:02:20 +01:00
										 |  |  |         except Exception: | 
					
						
							| 
									
										
										
										
											2015-02-28 21:42:16 +01:00
										 |  |  |             pass | 
					
						
							|  |  |  |         return _terminal_size(columns, lines) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-19 18:21:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  | __all__ = [ | 
					
						
							|  |  |  |     'compat_HTTPError', | 
					
						
							| 
									
										
										
										
											2015-02-01 11:36:59 +01:00
										 |  |  |     'compat_basestring', | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  |     'compat_chr', | 
					
						
							|  |  |  |     'compat_cookiejar', | 
					
						
							|  |  |  |     'compat_expanduser', | 
					
						
							| 
									
										
										
										
											2015-02-28 21:42:16 +01:00
										 |  |  |     'compat_get_terminal_size', | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  |     'compat_getenv', | 
					
						
							|  |  |  |     'compat_getpass', | 
					
						
							|  |  |  |     'compat_html_entities', | 
					
						
							|  |  |  |     'compat_html_parser', | 
					
						
							|  |  |  |     'compat_http_client', | 
					
						
							| 
									
										
										
										
											2015-01-30 02:57:37 +01:00
										 |  |  |     'compat_http_server', | 
					
						
							| 
									
										
										
										
											2014-11-15 15:17:19 +01:00
										 |  |  |     'compat_kwargs', | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  |     'compat_ord', | 
					
						
							|  |  |  |     'compat_parse_qs', | 
					
						
							|  |  |  |     'compat_print', | 
					
						
							| 
									
										
										
										
											2015-01-10 19:55:36 +01:00
										 |  |  |     'compat_socket_create_connection', | 
					
						
							| 
									
										
										
										
											2015-01-11 15:13:03 +06:00
										 |  |  |     'compat_str', | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  |     'compat_subprocess_get_DEVNULL', | 
					
						
							|  |  |  |     'compat_urllib_error', | 
					
						
							|  |  |  |     'compat_urllib_parse', | 
					
						
							|  |  |  |     'compat_urllib_parse_unquote', | 
					
						
							|  |  |  |     'compat_urllib_parse_urlparse', | 
					
						
							|  |  |  |     'compat_urllib_request', | 
					
						
							|  |  |  |     'compat_urlparse', | 
					
						
							|  |  |  |     'compat_urlretrieve', | 
					
						
							|  |  |  |     'compat_xml_parse_error', | 
					
						
							|  |  |  |     'shlex_quote', | 
					
						
							|  |  |  |     'subprocess_check_output', | 
					
						
							| 
									
										
										
										
											2014-11-19 18:21:58 +01:00
										 |  |  |     'workaround_optparse_bug9161', | 
					
						
							| 
									
										
										
										
											2014-11-02 11:23:40 +01:00
										 |  |  | ] |