| @ -0,0 +1,140 @@ | |||
| #!/usr/bin/python2 | |||
| # coding=utf-8 | |||
| import ldb | |||
| from samba.samdb import SamDB | |||
| from samba.auth import system_session | |||
| # from samba.ndr import ndr_pack, ndr_unpack | |||
| # from samba.dcerpc import security | |||
| import samba.param | |||
| # import base64 | |||
| # import binascii | |||
| base = "CN=Users,DC=techgrow,DC=local" # можно не заморачиваться с ОУ и тогда base = "CN=Users,DC=myDom,DC=lan" | |||
| domainName = 'techgrow.local' | |||
| class UserAd: | |||
| def __init__(self, sam, base, domainName, usrName, usrPass=''): | |||
| self.sam = sam | |||
| self.base = base | |||
| self.domainName = domainName | |||
| self.usrName = usrName | |||
| self.usrPass = usrPass | |||
| self.exists = self.chek_if_exists() | |||
| if not self.exists: | |||
| self.add() | |||
| self.memberOf = self.check_memberof() | |||
| def chek_if_exists(self): | |||
| expression = "(&(objectCategory=person)(objectClass=user)(sAMAccountName=%s))" % self.usrName | |||
| if len(self.sam.search(base=base, expression=expression, attrs=['sAMAccountName'])) > 0: | |||
| return True | |||
| else: | |||
| return False | |||
| def check_memberof(self): | |||
| expression = "(&(objectCategory=person)(objectClass=user)(sAMAccountName=%s))" % self.usrName | |||
| res = self.sam.search(base=base, expression=expression, attrs=['memberOf']) | |||
| groups = [] | |||
| for k in res[0]['memberOf']: | |||
| groups.append(str(k).split(',')[0].split('=')[1]) | |||
| return groups | |||
| def add(self): | |||
| ld = {'dn': 'CN=%s,%s' % (self.usrName, base), | |||
| "sAMAccountName": self.usrName, | |||
| "userPrincipalName": "%s@%s" % (self.usrName, self.domainName), | |||
| "objectClass": "user", | |||
| "displayName": self.usrName, | |||
| "description": self.usrName, | |||
| "homeDirectory": r"\\%s\users\%s" % ("dc01", self.usrName), | |||
| 'scriptPath': "loginScr.cmd", | |||
| } | |||
| self.sam.transaction_start() | |||
| try: | |||
| self.sam.add(ld) | |||
| self.sam.setpassword("(samAccountName=%s)" % ldb.binary_encode(self.usrName), self.usrPass, False) | |||
| except Exception as exc: | |||
| self.sam.transaction_cancel() | |||
| return exc | |||
| else: | |||
| self.sam.transaction_commit() | |||
| self.chek_if_exists() | |||
| return False | |||
| def set_passwd(self): | |||
| self.sam.transaction_start() | |||
| try: | |||
| self.sam.setpassword("(samAccountName=%s)" % ldb.binary_encode(self.usrName), self.usrPass, False) | |||
| except Exception as exc: | |||
| self.sam.transaction_cancel() | |||
| return exc | |||
| else: | |||
| self.sam.transaction_commit() | |||
| return False | |||
| def add_in_group(self, grpName): | |||
| self.sam.transaction_start() | |||
| try: | |||
| self.sam.add_remove_group_members(grpName, [self.usrName], add_members_operation=True) | |||
| except Exception as exc: | |||
| self.sam.transaction_cancel() | |||
| return exc | |||
| else: | |||
| self.sam.transaction_commit() | |||
| self.memberOf = self.check_memberof() | |||
| return False | |||
| def remove_from_group(self, grpName): | |||
| self.sam.transaction_start() | |||
| try: | |||
| self.sam.add_remove_group_members(grpName, [self.usrName], add_members_operation=True) | |||
| except Exception as exc: | |||
| self.sam.transaction_cancel() | |||
| return exc | |||
| else: | |||
| self.sam.transaction_commit() | |||
| return False | |||
| def delete(self): | |||
| return False | |||
| def disable(self): | |||
| return False | |||
| def users_make_ad(sam, base): | |||
| expression = "(&(objectCategory=person)(objectClass=user))" | |||
| users = {} | |||
| res = sam.search(base=base, expression=expression, attrs=['*', 'userAccountControl']) | |||
| for i in res: | |||
| enabled = 0 | |||
| if int(str(i['userAccountControl'])) & 2 == 0: | |||
| enabled = 1 | |||
| memberOf = [] | |||
| for k in i['memberOf']: | |||
| memberOf.append(str(k).split(',')[0].split('=')[1]) | |||
| users[str(i['samAccountName'])] = {'samAccountName': str(i['samAccountName']), | |||
| 'memberOf': memberOf, | |||
| 'userAccountControl': int(str(i['userAccountControl'])), | |||
| 'enabled': enabled} | |||
| return users | |||
| def main(): | |||
| lp = samba.param.LoadParm() | |||
| lp.load(samba.param.default_path()) # или lp.load("/etc/samba/smb.conf") | |||
| sam = SamDB(lp=lp, session_info=system_session()) | |||
| print(users_make_ad(sam, base)) | |||
| test_usr = UserAd(sam, base, domainName, 'tst', "secret34daD") | |||
| print test_usr.memberOf | |||
| err = test_usr.set_passwd() | |||
| if err: | |||
| print err | |||
| if __name__ == '__main__': | |||
| main() | |||
| @ -0,0 +1,78 @@ | |||
| # This file must be used with "source bin/activate" *from bash* | |||
| # you cannot run it directly | |||
| deactivate () { | |||
| unset -f pydoc >/dev/null 2>&1 | |||
| # reset old environment variables | |||
| # ! [ -z ${VAR+_} ] returns true if VAR is declared at all | |||
| if ! [ -z "${_OLD_VIRTUAL_PATH+_}" ] ; then | |||
| PATH="$_OLD_VIRTUAL_PATH" | |||
| export PATH | |||
| unset _OLD_VIRTUAL_PATH | |||
| fi | |||
| if ! [ -z "${_OLD_VIRTUAL_PYTHONHOME+_}" ] ; then | |||
| PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME" | |||
| export PYTHONHOME | |||
| unset _OLD_VIRTUAL_PYTHONHOME | |||
| fi | |||
| # This should detect bash and zsh, which have a hash command that must | |||
| # be called to get it to forget past commands. Without forgetting | |||
| # past commands the $PATH changes we made may not be respected | |||
| if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then | |||
| hash -r 2>/dev/null | |||
| fi | |||
| if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then | |||
| PS1="$_OLD_VIRTUAL_PS1" | |||
| export PS1 | |||
| unset _OLD_VIRTUAL_PS1 | |||
| fi | |||
| unset VIRTUAL_ENV | |||
| if [ ! "${1-}" = "nondestructive" ] ; then | |||
| # Self destruct! | |||
| unset -f deactivate | |||
| fi | |||
| } | |||
| # unset irrelevant variables | |||
| deactivate nondestructive | |||
| VIRTUAL_ENV="/home/mix/PycharmProjects/zayavka-samba-ad/venv" | |||
| export VIRTUAL_ENV | |||
| _OLD_VIRTUAL_PATH="$PATH" | |||
| PATH="$VIRTUAL_ENV/bin:$PATH" | |||
| export PATH | |||
| # unset PYTHONHOME if set | |||
| if ! [ -z "${PYTHONHOME+_}" ] ; then | |||
| _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME" | |||
| unset PYTHONHOME | |||
| fi | |||
| if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then | |||
| _OLD_VIRTUAL_PS1="$PS1" | |||
| if [ "x" != x ] ; then | |||
| PS1="$PS1" | |||
| else | |||
| PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1" | |||
| fi | |||
| export PS1 | |||
| fi | |||
| # Make sure to unalias pydoc if it's already there | |||
| alias pydoc 2>/dev/null >/dev/null && unalias pydoc | |||
| pydoc () { | |||
| python -m pydoc "$@" | |||
| } | |||
| # This should detect bash and zsh, which have a hash command that must | |||
| # be called to get it to forget past commands. Without forgetting | |||
| # past commands the $PATH changes we made may not be respected | |||
| if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then | |||
| hash -r 2>/dev/null | |||
| fi | |||
| @ -0,0 +1,36 @@ | |||
| # This file must be used with "source bin/activate.csh" *from csh*. | |||
| # You cannot run it directly. | |||
| # Created by Davide Di Blasi <davidedb@gmail.com>. | |||
| alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc' | |||
| # Unset irrelevant variables. | |||
| deactivate nondestructive | |||
| setenv VIRTUAL_ENV "/home/mix/PycharmProjects/zayavka-samba-ad/venv" | |||
| set _OLD_VIRTUAL_PATH="$PATH" | |||
| setenv PATH "$VIRTUAL_ENV/bin:$PATH" | |||
| if ("" != "") then | |||
| set env_name = "" | |||
| else | |||
| set env_name = `basename "$VIRTUAL_ENV"` | |||
| endif | |||
| # Could be in a non-interactive environment, | |||
| # in which case, $prompt is undefined and we wouldn't | |||
| # care about the prompt anyway. | |||
| if ( $?prompt ) then | |||
| set _OLD_VIRTUAL_PROMPT="$prompt" | |||
| set prompt = "[$env_name] $prompt" | |||
| endif | |||
| unset env_name | |||
| alias pydoc python -m pydoc | |||
| rehash | |||
| @ -0,0 +1,76 @@ | |||
| # This file must be used using `. bin/activate.fish` *within a running fish ( http://fishshell.com ) session*. | |||
| # Do not run it directly. | |||
| function deactivate -d 'Exit virtualenv mode and return to the normal environment.' | |||
| # reset old environment variables | |||
| if test -n "$_OLD_VIRTUAL_PATH" | |||
| set -gx PATH $_OLD_VIRTUAL_PATH | |||
| set -e _OLD_VIRTUAL_PATH | |||
| end | |||
| if test -n "$_OLD_VIRTUAL_PYTHONHOME" | |||
| set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME | |||
| set -e _OLD_VIRTUAL_PYTHONHOME | |||
| end | |||
| if test -n "$_OLD_FISH_PROMPT_OVERRIDE" | |||
| # Set an empty local `$fish_function_path` to allow the removal of `fish_prompt` using `functions -e`. | |||
| set -l fish_function_path | |||
| # Erase virtualenv's `fish_prompt` and restore the original. | |||
| functions -e fish_prompt | |||
| functions -c _old_fish_prompt fish_prompt | |||
| functions -e _old_fish_prompt | |||
| set -e _OLD_FISH_PROMPT_OVERRIDE | |||
| end | |||
| set -e VIRTUAL_ENV | |||
| if test "$argv[1]" != 'nondestructive' | |||
| # Self-destruct! | |||
| functions -e pydoc | |||
| functions -e deactivate | |||
| end | |||
| end | |||
| # Unset irrelevant variables. | |||
| deactivate nondestructive | |||
| set -gx VIRTUAL_ENV "/home/mix/PycharmProjects/zayavka-samba-ad/venv" | |||
| set -gx _OLD_VIRTUAL_PATH $PATH | |||
| set -gx PATH "$VIRTUAL_ENV/bin" $PATH | |||
| # Unset `$PYTHONHOME` if set. | |||
| if set -q PYTHONHOME | |||
| set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME | |||
| set -e PYTHONHOME | |||
| end | |||
| function pydoc | |||
| python -m pydoc $argv | |||
| end | |||
| if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" | |||
| # Copy the current `fish_prompt` function as `_old_fish_prompt`. | |||
| functions -c fish_prompt _old_fish_prompt | |||
| function fish_prompt | |||
| # Save the current $status, for fish_prompts that display it. | |||
| set -l old_status $status | |||
| # Prompt override provided? | |||
| # If not, just prepend the environment name. | |||
| if test -n "" | |||
| printf '%s%s' "" (set_color normal) | |||
| else | |||
| printf '%s(%s) ' (set_color normal) (basename "$VIRTUAL_ENV") | |||
| end | |||
| # Restore the original $status | |||
| echo "exit $old_status" | source | |||
| _old_fish_prompt | |||
| end | |||
| set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" | |||
| end | |||
| @ -0,0 +1,34 @@ | |||
| """By using execfile(this_file, dict(__file__=this_file)) you will | |||
| activate this virtualenv environment. | |||
| This can be used when you must use an existing Python interpreter, not | |||
| the virtualenv bin/python | |||
| """ | |||
| try: | |||
| __file__ | |||
| except NameError: | |||
| raise AssertionError( | |||
| "You must run this like execfile('path/to/activate_this.py', dict(__file__='path/to/activate_this.py'))") | |||
| import sys | |||
| import os | |||
| old_os_path = os.environ.get('PATH', '') | |||
| os.environ['PATH'] = os.path.dirname(os.path.abspath(__file__)) + os.pathsep + old_os_path | |||
| base = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | |||
| if sys.platform == 'win32': | |||
| site_packages = os.path.join(base, 'Lib', 'site-packages') | |||
| else: | |||
| site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages') | |||
| prev_sys_path = list(sys.path) | |||
| import site | |||
| site.addsitedir(site_packages) | |||
| sys.real_prefix = sys.prefix | |||
| sys.prefix = base | |||
| # Move the added items to the front of the path: | |||
| new_sys_path = [] | |||
| for item in list(sys.path): | |||
| if item not in prev_sys_path: | |||
| new_sys_path.append(item) | |||
| sys.path.remove(item) | |||
| sys.path[:0] = new_sys_path | |||
| @ -0,0 +1,11 @@ | |||
| #!/home/mix/PycharmProjects/zayavka-samba-ad/venv/bin/python2.7 | |||
| # -*- coding: utf-8 -*- | |||
| import re | |||
| import sys | |||
| from setuptools.command.easy_install import main | |||
| if __name__ == '__main__': | |||
| sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) | |||
| sys.exit(main()) | |||
| @ -0,0 +1,11 @@ | |||
| #!/home/mix/PycharmProjects/zayavka-samba-ad/venv/bin/python2.7 | |||
| # -*- coding: utf-8 -*- | |||
| import re | |||
| import sys | |||
| from setuptools.command.easy_install import main | |||
| if __name__ == '__main__': | |||
| sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) | |||
| sys.exit(main()) | |||
| @ -0,0 +1,11 @@ | |||
| #!/home/mix/PycharmProjects/zayavka-samba-ad/venv/bin/python2.7 | |||
| # -*- coding: utf-8 -*- | |||
| import re | |||
| import sys | |||
| from pip._internal import main | |||
| if __name__ == '__main__': | |||
| sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) | |||
| sys.exit(main()) | |||
| @ -0,0 +1,11 @@ | |||
| #!/home/mix/PycharmProjects/zayavka-samba-ad/venv/bin/python2.7 | |||
| # -*- coding: utf-8 -*- | |||
| import re | |||
| import sys | |||
| from pip._internal import main | |||
| if __name__ == '__main__': | |||
| sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) | |||
| sys.exit(main()) | |||
| @ -0,0 +1,11 @@ | |||
| #!/home/mix/PycharmProjects/zayavka-samba-ad/venv/bin/python2.7 | |||
| # -*- coding: utf-8 -*- | |||
| import re | |||
| import sys | |||
| from pip._internal import main | |||
| if __name__ == '__main__': | |||
| sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) | |||
| sys.exit(main()) | |||
| @ -0,0 +1 @@ | |||
| python2.7 | |||
| @ -0,0 +1,78 @@ | |||
| #!/home/mix/PycharmProjects/zayavka-samba-ad/venv/bin/python | |||
| import sys | |||
| import getopt | |||
| import sysconfig | |||
| valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags', | |||
| 'ldflags', 'help'] | |||
| if sys.version_info >= (3, 2): | |||
| valid_opts.insert(-1, 'extension-suffix') | |||
| valid_opts.append('abiflags') | |||
| if sys.version_info >= (3, 3): | |||
| valid_opts.append('configdir') | |||
| def exit_with_usage(code=1): | |||
| sys.stderr.write("Usage: {0} [{1}]\n".format( | |||
| sys.argv[0], '|'.join('--'+opt for opt in valid_opts))) | |||
| sys.exit(code) | |||
| try: | |||
| opts, args = getopt.getopt(sys.argv[1:], '', valid_opts) | |||
| except getopt.error: | |||
| exit_with_usage() | |||
| if not opts: | |||
| exit_with_usage() | |||
| pyver = sysconfig.get_config_var('VERSION') | |||
| getvar = sysconfig.get_config_var | |||
| opt_flags = [flag for (flag, val) in opts] | |||
| if '--help' in opt_flags: | |||
| exit_with_usage(code=0) | |||
| for opt in opt_flags: | |||
| if opt == '--prefix': | |||
| print(sysconfig.get_config_var('prefix')) | |||
| elif opt == '--exec-prefix': | |||
| print(sysconfig.get_config_var('exec_prefix')) | |||
| elif opt in ('--includes', '--cflags'): | |||
| flags = ['-I' + sysconfig.get_path('include'), | |||
| '-I' + sysconfig.get_path('platinclude')] | |||
| if opt == '--cflags': | |||
| flags.extend(getvar('CFLAGS').split()) | |||
| print(' '.join(flags)) | |||
| elif opt in ('--libs', '--ldflags'): | |||
| abiflags = getattr(sys, 'abiflags', '') | |||
| libs = ['-lpython' + pyver + abiflags] | |||
| libs += getvar('LIBS').split() | |||
| libs += getvar('SYSLIBS').split() | |||
| # add the prefix/lib/pythonX.Y/config dir, but only if there is no | |||
| # shared library in prefix/lib/. | |||
| if opt == '--ldflags': | |||
| if not getvar('Py_ENABLE_SHARED'): | |||
| libs.insert(0, '-L' + getvar('LIBPL')) | |||
| if not getvar('PYTHONFRAMEWORK'): | |||
| libs.extend(getvar('LINKFORSHARED').split()) | |||
| print(' '.join(libs)) | |||
| elif opt == '--extension-suffix': | |||
| ext_suffix = sysconfig.get_config_var('EXT_SUFFIX') | |||
| if ext_suffix is None: | |||
| ext_suffix = sysconfig.get_config_var('SO') | |||
| print(ext_suffix) | |||
| elif opt == '--abiflags': | |||
| if not getattr(sys, 'abiflags', None): | |||
| exit_with_usage() | |||
| print(sys.abiflags) | |||
| elif opt == '--configdir': | |||
| print(sysconfig.get_config_var('LIBPL')) | |||
| @ -0,0 +1 @@ | |||
| python2.7 | |||
| @ -0,0 +1,11 @@ | |||
| #!/home/mix/PycharmProjects/zayavka-samba-ad/venv/bin/python2.7 | |||
| # -*- coding: utf-8 -*- | |||
| import re | |||
| import sys | |||
| from wheel.cli import main | |||
| if __name__ == '__main__': | |||
| sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) | |||
| sys.exit(main()) | |||
| @ -0,0 +1 @@ | |||
| /usr/include/python2.7 | |||
| @ -0,0 +1 @@ | |||
| /usr/lib/python2.7/UserDict.py | |||
| @ -0,0 +1 @@ | |||
| /usr/lib/python2.7/_abcoll.py | |||
| @ -0,0 +1 @@ | |||
| /usr/lib/python2.7/_weakrefset.py | |||
| @ -0,0 +1 @@ | |||
| /usr/lib/python2.7/abc.py | |||
| @ -0,0 +1 @@ | |||
| /usr/lib/python2.7/codecs.py | |||
| @ -0,0 +1 @@ | |||
| /usr/lib/python2.7/copy_reg.py | |||
| @ -0,0 +1,101 @@ | |||
| import os | |||
| import sys | |||
| import warnings | |||
| import imp | |||
| import opcode # opcode is not a virtualenv module, so we can use it to find the stdlib | |||
| # Important! To work on pypy, this must be a module that resides in the | |||
| # lib-python/modified-x.y.z directory | |||
| dirname = os.path.dirname | |||
| distutils_path = os.path.join(os.path.dirname(opcode.__file__), 'distutils') | |||
| if os.path.normpath(distutils_path) == os.path.dirname(os.path.normpath(__file__)): | |||
| warnings.warn( | |||
| "The virtualenv distutils package at %s appears to be in the same location as the system distutils?") | |||
| else: | |||
| __path__.insert(0, distutils_path) | |||
| real_distutils = imp.load_module("_virtualenv_distutils", None, distutils_path, ('', '', imp.PKG_DIRECTORY)) | |||
| # Copy the relevant attributes | |||
| try: | |||
| __revision__ = real_distutils.__revision__ | |||
| except AttributeError: | |||
| pass | |||
| __version__ = real_distutils.__version__ | |||
| from distutils import dist, sysconfig | |||
| try: | |||
| basestring | |||
| except NameError: | |||
| basestring = str | |||
| ## patch build_ext (distutils doesn't know how to get the libs directory | |||
| ## path on windows - it hardcodes the paths around the patched sys.prefix) | |||
| if sys.platform == 'win32': | |||
| from distutils.command.build_ext import build_ext as old_build_ext | |||
| class build_ext(old_build_ext): | |||
| def finalize_options (self): | |||
| if self.library_dirs is None: | |||
| self.library_dirs = [] | |||
| elif isinstance(self.library_dirs, basestring): | |||
| self.library_dirs = self.library_dirs.split(os.pathsep) | |||
| self.library_dirs.insert(0, os.path.join(sys.real_prefix, "Libs")) | |||
| old_build_ext.finalize_options(self) | |||
| from distutils.command import build_ext as build_ext_module | |||
| build_ext_module.build_ext = build_ext | |||
| ## distutils.dist patches: | |||
| old_find_config_files = dist.Distribution.find_config_files | |||
| def find_config_files(self): | |||
| found = old_find_config_files(self) | |||
| system_distutils = os.path.join(distutils_path, 'distutils.cfg') | |||
| #if os.path.exists(system_distutils): | |||
| # found.insert(0, system_distutils) | |||
| # What to call the per-user config file | |||
| if os.name == 'posix': | |||
| user_filename = ".pydistutils.cfg" | |||
| else: | |||
| user_filename = "pydistutils.cfg" | |||
| user_filename = os.path.join(sys.prefix, user_filename) | |||
| if os.path.isfile(user_filename): | |||
| for item in list(found): | |||
| if item.endswith('pydistutils.cfg'): | |||
| found.remove(item) | |||
| found.append(user_filename) | |||
| return found | |||
| dist.Distribution.find_config_files = find_config_files | |||
| ## distutils.sysconfig patches: | |||
| old_get_python_inc = sysconfig.get_python_inc | |||
| def sysconfig_get_python_inc(plat_specific=0, prefix=None): | |||
| if prefix is None: | |||
| prefix = sys.real_prefix | |||
| return old_get_python_inc(plat_specific, prefix) | |||
| sysconfig_get_python_inc.__doc__ = old_get_python_inc.__doc__ | |||
| sysconfig.get_python_inc = sysconfig_get_python_inc | |||
| old_get_python_lib = sysconfig.get_python_lib | |||
| def sysconfig_get_python_lib(plat_specific=0, standard_lib=0, prefix=None): | |||
| if standard_lib and prefix is None: | |||
| prefix = sys.real_prefix | |||
| return old_get_python_lib(plat_specific, standard_lib, prefix) | |||
| sysconfig_get_python_lib.__doc__ = old_get_python_lib.__doc__ | |||
| sysconfig.get_python_lib = sysconfig_get_python_lib | |||
| old_get_config_vars = sysconfig.get_config_vars | |||
| def sysconfig_get_config_vars(*args): | |||
| real_vars = old_get_config_vars(*args) | |||
| if sys.platform == 'win32': | |||
| lib_dir = os.path.join(sys.real_prefix, "libs") | |||
| if isinstance(real_vars, dict) and 'LIBDIR' not in real_vars: | |||
| real_vars['LIBDIR'] = lib_dir # asked for all | |||
| elif isinstance(real_vars, list) and 'LIBDIR' in args: | |||
| real_vars = real_vars + [lib_dir] # asked for list | |||
| return real_vars | |||
| sysconfig_get_config_vars.__doc__ = old_get_config_vars.__doc__ | |||
| sysconfig.get_config_vars = sysconfig_get_config_vars | |||
| @ -0,0 +1,6 @@ | |||
| # This is a config file local to this virtualenv installation | |||
| # You may include options that will be used by all distutils commands, | |||
| # and by easy_install. For instance: | |||
| # | |||
| # [easy_install] | |||
| # find_links = http://mylocalsite | |||
| @ -0,0 +1 @@ | |||
| /usr/lib/python2.7/encodings | |||
| @ -0,0 +1 @@ | |||
| /usr/lib/python2.7/fnmatch.py | |||
| @ -0,0 +1 @@ | |||
| /usr/lib/python2.7/genericpath.py | |||
| @ -0,0 +1 @@ | |||
| /usr/lib/python2.7/lib-dynload | |||
| @ -0,0 +1 @@ | |||
| /usr/lib/python2.7/linecache.py | |||
| @ -0,0 +1 @@ | |||
| /usr/lib/python2.7/locale.py | |||
| @ -0,0 +1 @@ | |||
| /usr/lib/python2.7/ntpath.py | |||
| @ -0,0 +1 @@ | |||
| /usr | |||
| @ -0,0 +1 @@ | |||
| /usr/lib/python2.7/os.py | |||
| @ -0,0 +1 @@ | |||
| /usr/lib/python2.7/posixpath.py | |||
| @ -0,0 +1 @@ | |||
| /usr/lib/python2.7/re.py | |||
| @ -0,0 +1,99 @@ | |||
| """ | |||
| MySQLdb - A DB API v2.0 compatible interface to MySQL. | |||
| This package is a wrapper around _mysql, which mostly implements the | |||
| MySQL C API. | |||
| connect() -- connects to server | |||
| See the C API specification and the MySQL documentation for more info | |||
| on other items. | |||
| For information on how MySQLdb handles type conversion, see the | |||
| MySQLdb.converters module. | |||
| """ | |||
| from MySQLdb.release import __version__, version_info, __author__ | |||
| import _mysql | |||
| if version_info != _mysql.version_info: | |||
| raise ImportError("this is MySQLdb version %s, but _mysql is version %r" % | |||
| (version_info, _mysql.version_info)) | |||
| threadsafety = 1 | |||
| apilevel = "2.0" | |||
| paramstyle = "format" | |||
| from _mysql import * | |||
| from MySQLdb.compat import PY2 | |||
| from MySQLdb.constants import FIELD_TYPE | |||
| from MySQLdb.times import Date, Time, Timestamp, \ | |||
| DateFromTicks, TimeFromTicks, TimestampFromTicks | |||
| try: | |||
| frozenset | |||
| except NameError: | |||
| from sets import ImmutableSet as frozenset | |||
| class DBAPISet(frozenset): | |||
| """A special type of set for which A == x is true if A is a | |||
| DBAPISet and x is a member of that set.""" | |||
| def __eq__(self, other): | |||
| if isinstance(other, DBAPISet): | |||
| return not self.difference(other) | |||
| return other in self | |||
| STRING = DBAPISet([FIELD_TYPE.ENUM, FIELD_TYPE.STRING, | |||
| FIELD_TYPE.VAR_STRING]) | |||
| BINARY = DBAPISet([FIELD_TYPE.BLOB, FIELD_TYPE.LONG_BLOB, | |||
| FIELD_TYPE.MEDIUM_BLOB, FIELD_TYPE.TINY_BLOB]) | |||
| NUMBER = DBAPISet([FIELD_TYPE.DECIMAL, FIELD_TYPE.DOUBLE, FIELD_TYPE.FLOAT, | |||
| FIELD_TYPE.INT24, FIELD_TYPE.LONG, FIELD_TYPE.LONGLONG, | |||
| FIELD_TYPE.TINY, FIELD_TYPE.YEAR, FIELD_TYPE.NEWDECIMAL]) | |||
| DATE = DBAPISet([FIELD_TYPE.DATE, FIELD_TYPE.NEWDATE]) | |||
| TIME = DBAPISet([FIELD_TYPE.TIME]) | |||
| TIMESTAMP = DBAPISet([FIELD_TYPE.TIMESTAMP, FIELD_TYPE.DATETIME]) | |||
| DATETIME = TIMESTAMP | |||
| ROWID = DBAPISet() | |||
| def test_DBAPISet_set_equality(): | |||
| assert STRING == STRING | |||
| def test_DBAPISet_set_inequality(): | |||
| assert STRING != NUMBER | |||
| def test_DBAPISet_set_equality_membership(): | |||
| assert FIELD_TYPE.VAR_STRING == STRING | |||
| def test_DBAPISet_set_inequality_membership(): | |||
| assert FIELD_TYPE.DATE != STRING | |||
| if PY2: | |||
| def Binary(x): | |||
| return bytearray(x) | |||
| else: | |||
| def Binary(x): | |||
| return bytes(x) | |||
| def Connect(*args, **kwargs): | |||
| """Factory function for connections.Connection.""" | |||
| from MySQLdb.connections import Connection | |||
| return Connection(*args, **kwargs) | |||
| connect = Connection = Connect | |||
| __all__ = [ 'BINARY', 'Binary', 'Connect', 'Connection', 'DATE', | |||
| 'Date', 'Time', 'Timestamp', 'DateFromTicks', 'TimeFromTicks', | |||
| 'TimestampFromTicks', 'DataError', 'DatabaseError', 'Error', | |||
| 'FIELD_TYPE', 'IntegrityError', 'InterfaceError', 'InternalError', | |||
| 'MySQLError', 'NULL', 'NUMBER', 'NotSupportedError', 'DBAPISet', | |||
| 'OperationalError', 'ProgrammingError', 'ROWID', 'STRING', 'TIME', | |||
| 'TIMESTAMP', 'Warning', 'apilevel', 'connect', 'connections', | |||
| 'constants', 'converters', 'cursors', 'debug', 'escape', 'escape_dict', | |||
| 'escape_sequence', 'escape_string', 'get_client_info', | |||
| 'paramstyle', 'string_literal', 'threadsafety', 'version_info'] | |||
| @ -0,0 +1,12 @@ | |||
| import sys | |||
| if sys.version_info[0] == 3: | |||
| PY2 = False | |||
| unicode = str | |||
| unichr = chr | |||
| long = int | |||
| else: | |||
| PY2 = True | |||
| unicode = unicode | |||
| unichr = unichr | |||
| long = long | |||
| @ -0,0 +1,398 @@ | |||
| """ | |||
| This module implements connections for MySQLdb. Presently there is | |||
| only one class: Connection. Others are unlikely. However, you might | |||
| want to make your own subclasses. In most cases, you will probably | |||
| override Connection.default_cursor with a non-standard Cursor class. | |||
| """ | |||
| import re | |||
| import sys | |||
| from MySQLdb import cursors | |||
| from MySQLdb.compat import unicode, PY2 | |||
| from _mysql_exceptions import ( | |||
| Warning, Error, InterfaceError, DataError, | |||
| DatabaseError, OperationalError, IntegrityError, InternalError, | |||
| NotSupportedError, ProgrammingError, | |||
| ) | |||
| import _mysql | |||
| if not PY2: | |||
| if sys.version_info[:2] < (3, 6): | |||
| # See http://bugs.python.org/issue24870 | |||
| _surrogateescape_table = [chr(i) if i < 0x80 else chr(i + 0xdc00) for i in range(256)] | |||
| def _fast_surrogateescape(s): | |||
| return s.decode('latin1').translate(_surrogateescape_table) | |||
| else: | |||
| def _fast_surrogateescape(s): | |||
| return s.decode('ascii', 'surrogateescape') | |||
| def defaulterrorhandler(connection, cursor, errorclass, errorvalue): | |||
| """ | |||
| If cursor is not None, (errorclass, errorvalue) is appended to | |||
| cursor.messages; otherwise it is appended to | |||
| connection.messages. Then errorclass is raised with errorvalue as | |||
| the value. | |||
| You can override this with your own error handler by assigning it | |||
| to the instance. | |||
| """ | |||
| error = errorclass, errorvalue | |||
| if cursor: | |||
| cursor.messages.append(error) | |||
| else: | |||
| connection.messages.append(error) | |||
| del cursor | |||
| del connection | |||
| if isinstance(errorvalue, BaseException): | |||
| raise errorvalue | |||
| if errorclass is not None: | |||
| raise errorclass(errorvalue) | |||
| else: | |||
| raise Exception(errorvalue) | |||
| re_numeric_part = re.compile(r"^(\d+)") | |||
| def numeric_part(s): | |||
| """Returns the leading numeric part of a string. | |||
| >>> numeric_part("20-alpha") | |||
| 20 | |||
| >>> numeric_part("foo") | |||
| >>> numeric_part("16b") | |||
| 16 | |||
| """ | |||
| m = re_numeric_part.match(s) | |||
| if m: | |||
| return int(m.group(1)) | |||
| return None | |||
| class Connection(_mysql.connection): | |||
| """MySQL Database Connection Object""" | |||
| default_cursor = cursors.Cursor | |||
| waiter = None | |||
| def __init__(self, *args, **kwargs): | |||
| """ | |||
| Create a connection to the database. It is strongly recommended | |||
| that you only use keyword parameters. Consult the MySQL C API | |||
| documentation for more information. | |||
| :param str host: host to connect | |||
| :param str user: user to connect as | |||
| :param str password: password to use | |||
| :param str passwd: alias of password, for backward compatibility | |||
| :param str database: database to use | |||
| :param str db: alias of database, for backward compatibility | |||
| :param int port: TCP/IP port to connect to | |||
| :param str unix_socket: location of unix_socket to use | |||
| :param dict conv: conversion dictionary, see MySQLdb.converters | |||
| :param int connect_timeout: | |||
| number of seconds to wait before the connection attempt fails. | |||
| :param bool compress: if set, compression is enabled | |||
| :param str named_pipe: if set, a named pipe is used to connect (Windows only) | |||
| :param str init_command: | |||
| command which is run once the connection is created | |||
| :param str read_default_file: | |||
| file from which default client values are read | |||
| :param str read_default_group: | |||
| configuration group to use from the default file | |||
| :param type cursorclass: | |||
| class object, used to create cursors (keyword only) | |||
| :param bool use_unicode: | |||
| If True, text-like columns are returned as unicode objects | |||
| using the connection's character set. Otherwise, text-like | |||
| columns are returned as strings. columns are returned as | |||
| normal strings. Unicode objects will always be encoded to | |||
| the connection's character set regardless of this setting. | |||
| Default to False on Python 2 and True on Python 3. | |||
| :param str charset: | |||
| If supplied, the connection character set will be changed | |||
| to this character set (MySQL-4.1 and newer). This implies | |||
| use_unicode=True. | |||
| :param str sql_mode: | |||
| If supplied, the session SQL mode will be changed to this | |||
| setting (MySQL-4.1 and newer). For more details and legal | |||
| values, see the MySQL documentation. | |||
| :param int client_flag: | |||
| flags to use or 0 (see MySQL docs or constants/CLIENTS.py) | |||
| :param dict ssl: | |||
| dictionary or mapping contains SSL connection parameters; | |||
| see the MySQL documentation for more details | |||
| (mysql_ssl_set()). If this is set, and the client does not | |||
| support SSL, NotSupportedError will be raised. | |||
| :param bool local_infile: | |||
| enables LOAD LOCAL INFILE; zero disables | |||
| :param bool autocommit: | |||
| If False (default), autocommit is disabled. | |||
| If True, autocommit is enabled. | |||
| If None, autocommit isn't set and server default is used. | |||
| :param bool binary_prefix: | |||
| If set, the '_binary' prefix will be used for raw byte query | |||
| arguments (e.g. Binary). This is disabled by default. | |||
| There are a number of undocumented, non-standard methods. See the | |||
| documentation for the MySQL C API for some hints on what they do. | |||
| """ | |||
| from MySQLdb.constants import CLIENT, FIELD_TYPE | |||
| from MySQLdb.converters import conversions | |||
| from weakref import proxy | |||
| kwargs2 = kwargs.copy() | |||
| if 'database' in kwargs2: | |||
| kwargs2['db'] = kwargs2.pop('database') | |||
| if 'password' in kwargs2: | |||
| kwargs2['passwd'] = kwargs2.pop('password') | |||
| if 'conv' in kwargs: | |||
| conv = kwargs['conv'] | |||
| else: | |||
| conv = conversions | |||
| conv2 = {} | |||
| for k, v in conv.items(): | |||
| if isinstance(k, int) and isinstance(v, list): | |||
| conv2[k] = v[:] | |||
| else: | |||
| conv2[k] = v | |||
| kwargs2['conv'] = conv2 | |||
| cursorclass = kwargs2.pop('cursorclass', self.default_cursor) | |||
| charset = kwargs2.pop('charset', '') | |||
| if charset or not PY2: | |||
| use_unicode = True | |||
| else: | |||
| use_unicode = False | |||
| use_unicode = kwargs2.pop('use_unicode', use_unicode) | |||
| sql_mode = kwargs2.pop('sql_mode', '') | |||
| self._binary_prefix = kwargs2.pop('binary_prefix', False) | |||
| client_flag = kwargs.get('client_flag', 0) | |||
| client_version = tuple([ numeric_part(n) for n in _mysql.get_client_info().split('.')[:2] ]) | |||
| if client_version >= (4, 1): | |||
| client_flag |= CLIENT.MULTI_STATEMENTS | |||
| if client_version >= (5, 0): | |||
| client_flag |= CLIENT.MULTI_RESULTS | |||
| kwargs2['client_flag'] = client_flag | |||
| # PEP-249 requires autocommit to be initially off | |||
| autocommit = kwargs2.pop('autocommit', False) | |||
| self.waiter = kwargs2.pop('waiter', None) | |||
| super(Connection, self).__init__(*args, **kwargs2) | |||
| self.cursorclass = cursorclass | |||
| self.encoders = dict([ (k, v) for k, v in conv.items() | |||
| if type(k) is not int ]) | |||
| self._server_version = tuple([ numeric_part(n) for n in self.get_server_info().split('.')[:2] ]) | |||
| self.encoding = 'ascii' # overridden in set_character_set() | |||
| db = proxy(self) | |||
| # Note: string_literal() is called for bytes object on Python 3 (via bytes_literal) | |||
| def string_literal(obj, dummy=None): | |||
| return db.string_literal(obj) | |||
| if PY2: | |||
| # unicode_literal is called for only unicode object. | |||
| def unicode_literal(u, dummy=None): | |||
| return db.string_literal(u.encode(db.encoding)) | |||
| else: | |||
| # unicode_literal() is called for arbitrary object. | |||
| def unicode_literal(u, dummy=None): | |||
| return db.string_literal(str(u).encode(db.encoding)) | |||
| def bytes_literal(obj, dummy=None): | |||
| return b'_binary' + db.string_literal(obj) | |||
| def string_decoder(s): | |||
| return s.decode(db.encoding) | |||
| if not charset: | |||
| charset = self.character_set_name() | |||
| self.set_character_set(charset) | |||
| if sql_mode: | |||
| self.set_sql_mode(sql_mode) | |||
| if use_unicode: | |||
| for t in (FIELD_TYPE.STRING, FIELD_TYPE.VAR_STRING, FIELD_TYPE.VARCHAR, FIELD_TYPE.TINY_BLOB, | |||
| FIELD_TYPE.MEDIUM_BLOB, FIELD_TYPE.LONG_BLOB, FIELD_TYPE.BLOB): | |||
| self.converter[t].append((None, string_decoder)) | |||
| self.encoders[bytes] = string_literal | |||
| self.encoders[unicode] = unicode_literal | |||
| self._transactional = self.server_capabilities & CLIENT.TRANSACTIONS | |||
| if self._transactional: | |||
| if autocommit is not None: | |||
| self.autocommit(autocommit) | |||
| self.messages = [] | |||
| def autocommit(self, on): | |||
| on = bool(on) | |||
| if self.get_autocommit() != on: | |||
| _mysql.connection.autocommit(self, on) | |||
| def cursor(self, cursorclass=None): | |||
| """ | |||
| Create a cursor on which queries may be performed. The | |||
| optional cursorclass parameter is used to create the | |||
| Cursor. By default, self.cursorclass=cursors.Cursor is | |||
| used. | |||
| """ | |||
| return (cursorclass or self.cursorclass)(self) | |||
| def query(self, query): | |||
| # Since _mysql releases GIL while querying, we need immutable buffer. | |||
| if isinstance(query, bytearray): | |||
| query = bytes(query) | |||
| if self.waiter is not None: | |||
| self.send_query(query) | |||
| self.waiter(self.fileno()) | |||
| self.read_query_result() | |||
| else: | |||
| _mysql.connection.query(self, query) | |||
| def __enter__(self): | |||
| from warnings import warn | |||
| warn("context interface will be changed. Use explicit conn.commit() or conn.rollback().", | |||
| DeprecationWarning, 2) | |||
| if self.get_autocommit(): | |||
| self.query("BEGIN") | |||
| return self.cursor() | |||
| def __exit__(self, exc, value, tb): | |||
| if exc: | |||
| self.rollback() | |||
| else: | |||
| self.commit() | |||
| def _bytes_literal(self, bs): | |||
| assert isinstance(bs, (bytes, bytearray)) | |||
| x = self.string_literal(bs) # x is escaped and quoted bytes | |||
| if self._binary_prefix: | |||
| return b'_binary' + x | |||
| return x | |||
| def _tuple_literal(self, t): | |||
| return "(%s)" % (','.join(map(self.literal, t))) | |||
| def literal(self, o): | |||
| """If o is a single object, returns an SQL literal as a string. | |||
| If o is a non-string sequence, the items of the sequence are | |||
| converted and returned as a sequence. | |||
| Non-standard. For internal use; do not use this in your | |||
| applications. | |||
| """ | |||
| if isinstance(o, bytearray): | |||
| s = self._bytes_literal(o) | |||
| elif not PY2 and isinstance(o, bytes): | |||
| s = self._bytes_literal(o) | |||
| elif isinstance(o, (tuple, list)): | |||
| s = self._tuple_literal(o) | |||
| else: | |||
| s = self.escape(o, self.encoders) | |||
| # Python 3(~3.4) doesn't support % operation for bytes object. | |||
| # We should decode it before using %. | |||
| # Decoding with ascii and surrogateescape allows convert arbitrary | |||
| # bytes to unicode and back again. | |||
| # See http://python.org/dev/peps/pep-0383/ | |||
| if not PY2 and isinstance(s, (bytes, bytearray)): | |||
| return _fast_surrogateescape(s) | |||
| return s | |||
| def begin(self): | |||
| """Explicitly begin a connection. Non-standard. | |||
| DEPRECATED: Will be removed in 1.3. | |||
| Use an SQL BEGIN statement instead.""" | |||
| from warnings import warn | |||
| warn("begin() is non-standard and will be removed in 1.4", | |||
| DeprecationWarning, 2) | |||
| self.query("BEGIN") | |||
| if not hasattr(_mysql.connection, 'warning_count'): | |||
| def warning_count(self): | |||
| """Return the number of warnings generated from the | |||
| last query. This is derived from the info() method.""" | |||
| info = self.info() | |||
| if info: | |||
| return int(info.split()[-1]) | |||
| else: | |||
| return 0 | |||
| def set_character_set(self, charset): | |||
| """Set the connection character set to charset. The character | |||
| set can only be changed in MySQL-4.1 and newer. If you try | |||
| to change the character set from the current value in an | |||
| older version, NotSupportedError will be raised.""" | |||
| if charset == "utf8mb4": | |||
| py_charset = "utf8" | |||
| else: | |||
| py_charset = charset | |||
| if self.character_set_name() != charset: | |||
| try: | |||
| super(Connection, self).set_character_set(charset) | |||
| except AttributeError: | |||
| if self._server_version < (4, 1): | |||
| raise NotSupportedError("server is too old to set charset") | |||
| self.query('SET NAMES %s' % charset) | |||
| self.store_result() | |||
| self.encoding = py_charset | |||
| def set_sql_mode(self, sql_mode): | |||
| """Set the connection sql_mode. See MySQL documentation for | |||
| legal values.""" | |||
| if self._server_version < (4, 1): | |||
| raise NotSupportedError("server is too old to set sql_mode") | |||
| self.query("SET SESSION sql_mode='%s'" % sql_mode) | |||
| self.store_result() | |||
| def show_warnings(self): | |||
| """Return detailed information about warnings as a | |||
| sequence of tuples of (Level, Code, Message). This | |||
| is only supported in MySQL-4.1 and up. If your server | |||
| is an earlier version, an empty sequence is returned.""" | |||
| if self._server_version < (4,1): return () | |||
| self.query("SHOW WARNINGS") | |||
| r = self.store_result() | |||
| warnings = r.fetch_row(0) | |||
| return warnings | |||
| Warning = Warning | |||
| Error = Error | |||
| InterfaceError = InterfaceError | |||
| DatabaseError = DatabaseError | |||
| DataError = DataError | |||
| OperationalError = OperationalError | |||
| IntegrityError = IntegrityError | |||
| InternalError = InternalError | |||
| ProgrammingError = ProgrammingError | |||
| NotSupportedError = NotSupportedError | |||
| errorhandler = defaulterrorhandler | |||
| # vim: colorcolumn=100 | |||
| @ -0,0 +1,29 @@ | |||
| """MySQL CLIENT constants | |||
| These constants are used when creating the connection. Use bitwise-OR | |||
| (|) to combine options together, and pass them as the client_flags | |||
| parameter to MySQLdb.Connection. For more information on these flags, | |||
| see the MySQL C API documentation for mysql_real_connect(). | |||
| """ | |||
| LONG_PASSWORD = 1 | |||
| FOUND_ROWS = 2 | |||
| LONG_FLAG = 4 | |||
| CONNECT_WITH_DB = 8 | |||
| NO_SCHEMA = 16 | |||
| COMPRESS = 32 | |||
| ODBC = 64 | |||
| LOCAL_FILES = 128 | |||
| IGNORE_SPACE = 256 | |||
| CHANGE_USER = 512 | |||
| INTERACTIVE = 1024 | |||
| SSL = 2048 | |||
| IGNORE_SIGPIPE = 4096 | |||
| TRANSACTIONS = 8192 # mysql_com.h was WRONG prior to 3.23.35 | |||
| RESERVED = 16384 | |||
| SECURE_CONNECTION = 32768 | |||
| MULTI_STATEMENTS = 65536 | |||
| MULTI_RESULTS = 131072 | |||
| @ -0,0 +1,104 @@ | |||
| """MySQL Connection Errors | |||
| Nearly all of these raise OperationalError. COMMANDS_OUT_OF_SYNC | |||
| raises ProgrammingError. | |||
| """ | |||
| if __name__ == "__main__": | |||
| """ | |||
| Usage: python CR.py [/path/to/mysql/errmsg.h ...] >> CR.py | |||
| """ | |||
| import fileinput, re | |||
| data = {} | |||
| error_last = None | |||
| for line in fileinput.input(): | |||
| line = re.sub(r'/\*.*?\*/', '', line) | |||
| m = re.match(r'^\s*#define\s+CR_([A-Z0-9_]+)\s+(\d+)(\s.*|$)', line) | |||
| if m: | |||
| name = m.group(1) | |||
| value = int(m.group(2)) | |||
| if name == 'ERROR_LAST': | |||
| if error_last is None or error_last < value: | |||
| error_last = value | |||
| continue | |||
| if value not in data: | |||
| data[value] = set() | |||
| data[value].add(name) | |||
| for value, names in sorted(data.items()): | |||
| for name in sorted(names): | |||
| print('%s = %s' % (name, value)) | |||
| if error_last is not None: | |||
| print('ERROR_LAST = %s' % error_last) | |||
| ERROR_FIRST = 2000 | |||
| MIN_ERROR = 2000 | |||
| UNKNOWN_ERROR = 2000 | |||
| SOCKET_CREATE_ERROR = 2001 | |||
| CONNECTION_ERROR = 2002 | |||
| CONN_HOST_ERROR = 2003 | |||
| IPSOCK_ERROR = 2004 | |||
| UNKNOWN_HOST = 2005 | |||
| SERVER_GONE_ERROR = 2006 | |||
| VERSION_ERROR = 2007 | |||
| OUT_OF_MEMORY = 2008 | |||
| WRONG_HOST_INFO = 2009 | |||
| LOCALHOST_CONNECTION = 2010 | |||
| TCP_CONNECTION = 2011 | |||
| SERVER_HANDSHAKE_ERR = 2012 | |||
| SERVER_LOST = 2013 | |||
| COMMANDS_OUT_OF_SYNC = 2014 | |||
| NAMEDPIPE_CONNECTION = 2015 | |||
| NAMEDPIPEWAIT_ERROR = 2016 | |||
| NAMEDPIPEOPEN_ERROR = 2017 | |||
| NAMEDPIPESETSTATE_ERROR = 2018 | |||
| CANT_READ_CHARSET = 2019 | |||
| NET_PACKET_TOO_LARGE = 2020 | |||
| EMBEDDED_CONNECTION = 2021 | |||
| PROBE_SLAVE_STATUS = 2022 | |||
| PROBE_SLAVE_HOSTS = 2023 | |||
| PROBE_SLAVE_CONNECT = 2024 | |||
| PROBE_MASTER_CONNECT = 2025 | |||
| SSL_CONNECTION_ERROR = 2026 | |||
| MALFORMED_PACKET = 2027 | |||
| WRONG_LICENSE = 2028 | |||
| NULL_POINTER = 2029 | |||
| NO_PREPARE_STMT = 2030 | |||
| PARAMS_NOT_BOUND = 2031 | |||
| DATA_TRUNCATED = 2032 | |||
| NO_PARAMETERS_EXISTS = 2033 | |||
| INVALID_PARAMETER_NO = 2034 | |||
| INVALID_BUFFER_USE = 2035 | |||
| UNSUPPORTED_PARAM_TYPE = 2036 | |||
| SHARED_MEMORY_CONNECTION = 2037 | |||
| SHARED_MEMORY_CONNECT_REQUEST_ERROR = 2038 | |||
| SHARED_MEMORY_CONNECT_ANSWER_ERROR = 2039 | |||
| SHARED_MEMORY_CONNECT_FILE_MAP_ERROR = 2040 | |||
| SHARED_MEMORY_CONNECT_MAP_ERROR = 2041 | |||
| SHARED_MEMORY_FILE_MAP_ERROR = 2042 | |||
| SHARED_MEMORY_MAP_ERROR = 2043 | |||
| SHARED_MEMORY_EVENT_ERROR = 2044 | |||
| SHARED_MEMORY_CONNECT_ABANDONED_ERROR = 2045 | |||
| SHARED_MEMORY_CONNECT_SET_ERROR = 2046 | |||
| CONN_UNKNOW_PROTOCOL = 2047 | |||
| INVALID_CONN_HANDLE = 2048 | |||
| SECURE_AUTH = 2049 | |||
| UNUSED_1 = 2049 | |||
| FETCH_CANCELED = 2050 | |||
| NO_DATA = 2051 | |||
| NO_STMT_METADATA = 2052 | |||
| NO_RESULT_SET = 2053 | |||
| NOT_IMPLEMENTED = 2054 | |||
| SERVER_LOST_EXTENDED = 2055 | |||
| STMT_CLOSED = 2056 | |||
| NEW_STMT_METADATA = 2057 | |||
| ALREADY_CONNECTED = 2058 | |||
| AUTH_PLUGIN_CANNOT_LOAD = 2058 | |||
| ALREADY_CONNECTED = 2059 | |||
| AUTH_PLUGIN_CANNOT_LOAD = 2059 | |||
| DUPLICATE_CONNECTION_ATTR = 2060 | |||
| PLUGIN_FUNCTION_NOT_SUPPORTED = 2060 | |||
| AUTH_PLUGIN_ERR = 2061 | |||
| MAX_ERROR = 2999 | |||
| ERROR_LAST = 2061 | |||
| @ -0,0 +1,37 @@ | |||
| """MySQL FIELD_TYPE Constants | |||
| These constants represent the various column (field) types that are | |||
| supported by MySQL. | |||
| """ | |||
| DECIMAL = 0 | |||
| TINY = 1 | |||
| SHORT = 2 | |||
| LONG = 3 | |||
| FLOAT = 4 | |||
| DOUBLE = 5 | |||
| NULL = 6 | |||
| TIMESTAMP = 7 | |||
| LONGLONG = 8 | |||
| INT24 = 9 | |||
| DATE = 10 | |||
| TIME = 11 | |||
| DATETIME = 12 | |||
| YEAR = 13 | |||
| NEWDATE = 14 | |||
| VARCHAR = 15 | |||
| BIT = 16 | |||
| NEWDECIMAL = 246 | |||
| ENUM = 247 | |||
| SET = 248 | |||
| TINY_BLOB = 249 | |||
| MEDIUM_BLOB = 250 | |||
| LONG_BLOB = 251 | |||
| BLOB = 252 | |||
| VAR_STRING = 253 | |||
| STRING = 254 | |||
| GEOMETRY = 255 | |||
| CHAR = TINY | |||
| INTERVAL = ENUM | |||
| @ -0,0 +1,23 @@ | |||
| """MySQL FLAG Constants | |||
| These flags are used along with the FIELD_TYPE to indicate various | |||
| properties of columns in a result set. | |||
| """ | |||
| NOT_NULL = 1 | |||
| PRI_KEY = 2 | |||
| UNIQUE_KEY = 4 | |||
| MULTIPLE_KEY = 8 | |||
| BLOB = 16 | |||
| UNSIGNED = 32 | |||
| ZEROFILL = 64 | |||
| BINARY = 128 | |||
| ENUM = 256 | |||
| AUTO_INCREMENT = 512 | |||
| TIMESTAMP = 1024 | |||
| SET = 2048 | |||
| NUM = 32768 | |||
| PART_KEY = 16384 | |||
| GROUP = 32768 | |||
| UNIQUE = 65536 | |||
| @ -0,0 +1,17 @@ | |||
| """MySQL REFRESH Constants | |||
| These constants seem to mostly deal with things internal to the | |||
| MySQL server. Forget you saw this. | |||
| """ | |||
| GRANT = 1 | |||
| LOG = 2 | |||
| TABLES = 4 | |||
| HOSTS = 8 | |||
| STATUS = 16 | |||
| THREADS = 32 | |||
| SLAVE = 64 | |||
| MASTER = 128 | |||
| READ_LOCK = 16384 | |||
| FAST = 32768 | |||
| @ -0,0 +1 @@ | |||
| __all__ = ['CR', 'FIELD_TYPE','CLIENT','REFRESH','ER','FLAG'] | |||
| @ -0,0 +1,143 @@ | |||
| """MySQLdb type conversion module | |||
| This module handles all the type conversions for MySQL. If the default | |||
| type conversions aren't what you need, you can make your own. The | |||
| dictionary conversions maps some kind of type to a conversion function | |||
| which returns the corresponding value: | |||
| Key: FIELD_TYPE.* (from MySQLdb.constants) | |||
| Conversion function: | |||
| Arguments: string | |||
| Returns: Python object | |||
| Key: Python type object (from types) or class | |||
| Conversion function: | |||
| Arguments: Python object of indicated type or class AND | |||
| conversion dictionary | |||
| Returns: SQL literal value | |||
| Notes: Most conversion functions can ignore the dictionary, but | |||
| it is a required parameter. It is necessary for converting | |||
| things like sequences and instances. | |||
| Don't modify conversions if you can avoid it. Instead, make copies | |||
| (with the copy() method), modify the copies, and then pass them to | |||
| MySQL.connect(). | |||
| """ | |||
| from _mysql import string_literal, escape, NULL | |||
| from MySQLdb.constants import FIELD_TYPE, FLAG | |||
| from MySQLdb.times import * | |||
| from MySQLdb.compat import PY2, long | |||
| NoneType = type(None) | |||
| import array | |||
| try: | |||
| ArrayType = array.ArrayType | |||
| except AttributeError: | |||
| ArrayType = array.array | |||
| def Bool2Str(s, d): return str(int(s)) | |||
| def Str2Set(s): | |||
| return set([ i for i in s.split(',') if i ]) | |||
| def Set2Str(s, d): | |||
| # Only support ascii string. Not tested. | |||
| return string_literal(','.join(s), d) | |||
| def Thing2Str(s, d): | |||
| """Convert something into a string via str().""" | |||
| return str(s) | |||
| def Unicode2Str(s, d): | |||
| """Convert a unicode object to a string using the default encoding. | |||
| This is only used as a placeholder for the real function, which | |||
| is connection-dependent.""" | |||
| return s.encode() | |||
| def Float2Str(o, d): | |||
| return '%.15g' % o | |||
| def None2NULL(o, d): | |||
| """Convert None to NULL.""" | |||
| return NULL # duh | |||
| def Thing2Literal(o, d): | |||
| """Convert something into a SQL string literal. If using | |||
| MySQL-3.23 or newer, string_literal() is a method of the | |||
| _mysql.MYSQL object, and this function will be overridden with | |||
| that method when the connection is created.""" | |||
| return string_literal(o, d) | |||
| def char_array(s): | |||
| return array.array('c', s) | |||
| def array2Str(o, d): | |||
| return Thing2Literal(o.tostring(), d) | |||
| def quote_tuple(t, d): | |||
| return "(%s)" % (','.join(escape_sequence(t, d))) | |||
| # bytes or str regarding to BINARY_FLAG. | |||
| _bytes_or_str = [(FLAG.BINARY, bytes)] | |||
| conversions = { | |||
| int: Thing2Str, | |||
| long: Thing2Str, | |||
| float: Float2Str, | |||
| NoneType: None2NULL, | |||
| ArrayType: array2Str, | |||
| bool: Bool2Str, | |||
| Date: Thing2Literal, | |||
| DateTimeType: DateTime2literal, | |||
| DateTimeDeltaType: DateTimeDelta2literal, | |||
| str: Thing2Literal, # default | |||
| set: Set2Str, | |||
| FIELD_TYPE.TINY: int, | |||
| FIELD_TYPE.SHORT: int, | |||
| FIELD_TYPE.LONG: long, | |||
| FIELD_TYPE.FLOAT: float, | |||
| FIELD_TYPE.DOUBLE: float, | |||
| FIELD_TYPE.DECIMAL: float, | |||
| FIELD_TYPE.NEWDECIMAL: float, | |||
| FIELD_TYPE.LONGLONG: long, | |||
| FIELD_TYPE.INT24: int, | |||
| FIELD_TYPE.YEAR: int, | |||
| FIELD_TYPE.SET: Str2Set, | |||
| FIELD_TYPE.TIMESTAMP: mysql_timestamp_converter, | |||
| FIELD_TYPE.DATETIME: DateTime_or_None, | |||
| FIELD_TYPE.TIME: TimeDelta_or_None, | |||
| FIELD_TYPE.DATE: Date_or_None, | |||
| FIELD_TYPE.TINY_BLOB: _bytes_or_str, | |||
| FIELD_TYPE.MEDIUM_BLOB: _bytes_or_str, | |||
| FIELD_TYPE.LONG_BLOB: _bytes_or_str, | |||
| FIELD_TYPE.BLOB: _bytes_or_str, | |||
| FIELD_TYPE.STRING: _bytes_or_str, | |||
| FIELD_TYPE.VAR_STRING: _bytes_or_str, | |||
| FIELD_TYPE.VARCHAR: _bytes_or_str, | |||
| } | |||
| if PY2: | |||
| conversions[unicode] = Unicode2Str | |||
| else: | |||
| conversions[bytes] = Thing2Literal | |||
| try: | |||
| from decimal import Decimal | |||
| conversions[FIELD_TYPE.DECIMAL] = Decimal | |||
| conversions[FIELD_TYPE.NEWDECIMAL] = Decimal | |||
| except ImportError: | |||
| pass | |||
| @ -0,0 +1,595 @@ | |||
| """MySQLdb Cursors | |||
| This module implements Cursors of various types for MySQLdb. By | |||
| default, MySQLdb uses the Cursor class. | |||
| """ | |||
| from __future__ import print_function, absolute_import | |||
| from functools import partial | |||
| import re | |||
| import sys | |||
| from MySQLdb.compat import unicode | |||
| from _mysql_exceptions import ( | |||
| Warning, Error, InterfaceError, DataError, | |||
| DatabaseError, OperationalError, IntegrityError, InternalError, | |||
| NotSupportedError, ProgrammingError) | |||
| PY2 = sys.version_info[0] == 2 | |||
| if PY2: | |||
| text_type = unicode | |||
| else: | |||
| text_type = str | |||
| #: Regular expression for :meth:`Cursor.executemany`. | |||
| #: executemany only supports simple bulk insert. | |||
| #: You can use it to load large dataset. | |||
| RE_INSERT_VALUES = re.compile( | |||
| r"\s*((?:INSERT|REPLACE)\b.+\bVALUES?\s*)" + | |||
| r"(\(\s*(?:%s|%\(.+\)s)\s*(?:,\s*(?:%s|%\(.+\)s)\s*)*\))" + | |||
| r"(\s*(?:ON DUPLICATE.*)?);?\s*\Z", | |||
| re.IGNORECASE | re.DOTALL) | |||
| class BaseCursor(object): | |||
| """A base for Cursor classes. Useful attributes: | |||
| description | |||
| A tuple of DB API 7-tuples describing the columns in | |||
| the last executed query; see PEP-249 for details. | |||
| description_flags | |||
| Tuple of column flags for last query, one entry per column | |||
| in the result set. Values correspond to those in | |||
| MySQLdb.constants.FLAG. See MySQL documentation (C API) | |||
| for more information. Non-standard extension. | |||
| arraysize | |||
| default number of rows fetchmany() will fetch | |||
| """ | |||
| #: Max stetement size which :meth:`executemany` generates. | |||
| #: | |||
| #: Max size of allowed statement is max_allowed_packet - packet_header_size. | |||
| #: Default value of max_allowed_packet is 1048576. | |||
| max_stmt_length = 64*1024 | |||
| from _mysql_exceptions import MySQLError, Warning, Error, InterfaceError, \ | |||
| DatabaseError, DataError, OperationalError, IntegrityError, \ | |||
| InternalError, ProgrammingError, NotSupportedError | |||
| _defer_warnings = False | |||
| connection = None | |||
| def __init__(self, connection): | |||
| self.connection = connection | |||
| self.description = None | |||
| self.description_flags = None | |||
| self.rowcount = -1 | |||
| self.arraysize = 1 | |||
| self._executed = None | |||
| self.lastrowid = None | |||
| self.messages = [] | |||
| self.errorhandler = connection.errorhandler | |||
| self._result = None | |||
| self._warnings = None | |||
| self.rownumber = None | |||
| def close(self): | |||
| """Close the cursor. No further queries will be possible.""" | |||
| try: | |||
| if self.connection is None: | |||
| return | |||
| while self.nextset(): | |||
| pass | |||
| finally: | |||
| self.connection = None | |||
| self.errorhandler = None | |||
| self._result = None | |||
| def __enter__(self): | |||
| return self | |||
| def __exit__(self, *exc_info): | |||
| del exc_info | |||
| self.close() | |||
| def _ensure_bytes(self, x, encoding=None): | |||
| if isinstance(x, text_type): | |||
| x = x.encode(encoding) | |||
| elif isinstance(x, (tuple, list)): | |||
| x = type(x)(self._ensure_bytes(v, encoding=encoding) for v in x) | |||
| return x | |||
| def _escape_args(self, args, conn): | |||
| ensure_bytes = partial(self._ensure_bytes, encoding=conn.encoding) | |||
| if isinstance(args, (tuple, list)): | |||
| if PY2: | |||
| args = tuple(map(ensure_bytes, args)) | |||
| return tuple(conn.literal(arg) for arg in args) | |||
| elif isinstance(args, dict): | |||
| if PY2: | |||
| args = dict((ensure_bytes(key), ensure_bytes(val)) for | |||
| (key, val) in args.items()) | |||
| return dict((key, conn.literal(val)) for (key, val) in args.items()) | |||
| else: | |||
| # If it's not a dictionary let's try escaping it anyways. | |||
| # Worst case it will throw a Value error | |||
| if PY2: | |||
| args = ensure_bytes(args) | |||
| return conn.literal(args) | |||
| def _check_executed(self): | |||
| if not self._executed: | |||
| self.errorhandler(self, ProgrammingError, "execute() first") | |||
| def _warning_check(self): | |||
| from warnings import warn | |||
| db = self._get_db() | |||
| # None => warnings not interrogated for current query yet | |||
| # 0 => no warnings exists or have been handled already for this query | |||
| if self._warnings is None: | |||
| self._warnings = db.warning_count() | |||
| if self._warnings: | |||
| # Only propagate warnings for current query once | |||
| warning_count = self._warnings | |||
| self._warnings = 0 | |||
| # When there is next result, fetching warnings cause "command | |||
| # out of sync" error. | |||
| if self._result and self._result.has_next: | |||
| msg = "There are %d MySQL warnings." % (warning_count,) | |||
| self.messages.append(msg) | |||
| warn(self.Warning(0, msg), stacklevel=3) | |||
| return | |||
| warnings = db.show_warnings() | |||
| if warnings: | |||
| # This is done in two loops in case | |||
| # Warnings are set to raise exceptions. | |||
| for w in warnings: | |||
| self.messages.append((self.Warning, w)) | |||
| for w in warnings: | |||
| warn(self.Warning(*w[1:3]), stacklevel=3) | |||
| else: | |||
| info = db.info() | |||
| if info: | |||
| self.messages.append((self.Warning, info)) | |||
| warn(self.Warning(0, info), stacklevel=3) | |||
| def nextset(self): | |||
| """Advance to the next result set. | |||
| Returns None if there are no more result sets. | |||
| """ | |||
| if self._executed: | |||
| self.fetchall() | |||
| del self.messages[:] | |||
| db = self._get_db() | |||
| nr = db.next_result() | |||
| if nr == -1: | |||
| return None | |||
| self._do_get_result() | |||
| self._post_get_result() | |||
| self._warning_check() | |||
| return 1 | |||
| def _post_get_result(self): pass | |||
| def _do_get_result(self): | |||
| db = self._get_db() | |||
| self._result = self._get_result() | |||
| self.rowcount = db.affected_rows() | |||
| self.rownumber = 0 | |||
| self.description = self._result and self._result.describe() or None | |||
| self.description_flags = self._result and self._result.field_flags() or None | |||
| self.lastrowid = db.insert_id() | |||
| self._warnings = None | |||
| def setinputsizes(self, *args): | |||
| """Does nothing, required by DB API.""" | |||
| def setoutputsizes(self, *args): | |||
| """Does nothing, required by DB API.""" | |||
| def _get_db(self): | |||
| con = self.connection | |||
| if con is None: | |||
| raise ProgrammingError("cursor closed") | |||
| return con | |||
| def execute(self, query, args=None): | |||
| """Execute a query. | |||
| query -- string, query to execute on server | |||
| args -- optional sequence or mapping, parameters to use with query. | |||
| Note: If args is a sequence, then %s must be used as the | |||
| parameter placeholder in the query. If a mapping is used, | |||
| %(key)s must be used as the placeholder. | |||
| Returns integer represents rows affected, if any | |||
| """ | |||
| while self.nextset(): | |||
| pass | |||
| db = self._get_db() | |||
| # NOTE: | |||
| # Python 2: query should be bytes when executing %. | |||
| # All unicode in args should be encoded to bytes on Python 2. | |||
| # Python 3: query should be str (unicode) when executing %. | |||
| # All bytes in args should be decoded with ascii and surrogateescape on Python 3. | |||
| # db.literal(obj) always returns str. | |||
| if PY2 and isinstance(query, unicode): | |||
| query = query.encode(db.encoding) | |||
| if args is not None: | |||
| if isinstance(args, dict): | |||
| args = dict((key, db.literal(item)) for key, item in args.items()) | |||
| else: | |||
| args = tuple(map(db.literal, args)) | |||
| if not PY2 and isinstance(query, (bytes, bytearray)): | |||
| query = query.decode(db.encoding) | |||
| try: | |||
| query = query % args | |||
| except TypeError as m: | |||
| self.errorhandler(self, ProgrammingError, str(m)) | |||
| if isinstance(query, unicode): | |||
| query = query.encode(db.encoding, 'surrogateescape') | |||
| res = None | |||
| try: | |||
| res = self._query(query) | |||
| except Exception: | |||
| exc, value = sys.exc_info()[:2] | |||
| self.errorhandler(self, exc, value) | |||
| self._executed = query | |||
| if not self._defer_warnings: | |||
| self._warning_check() | |||
| return res | |||
| def executemany(self, query, args): | |||
| # type: (str, list) -> int | |||
| """Execute a multi-row query. | |||
| :param query: query to execute on server | |||
| :param args: Sequence of sequences or mappings. It is used as parameter. | |||
| :return: Number of rows affected, if any. | |||
| This method improves performance on multiple-row INSERT and | |||
| REPLACE. Otherwise it is equivalent to looping over args with | |||
| execute(). | |||
| """ | |||
| del self.messages[:] | |||
| if not args: | |||
| return | |||
| m = RE_INSERT_VALUES.match(query) | |||
| if m: | |||
| q_prefix = m.group(1) % () | |||
| q_values = m.group(2).rstrip() | |||
| q_postfix = m.group(3) or '' | |||
| assert q_values[0] == '(' and q_values[-1] == ')' | |||
| return self._do_execute_many(q_prefix, q_values, q_postfix, args, | |||
| self.max_stmt_length, | |||
| self._get_db().encoding) | |||
| self.rowcount = sum(self.execute(query, arg) for arg in args) | |||
| return self.rowcount | |||
| def _do_execute_many(self, prefix, values, postfix, args, max_stmt_length, encoding): | |||
| conn = self._get_db() | |||
| escape = self._escape_args | |||
| if isinstance(prefix, text_type): | |||
| prefix = prefix.encode(encoding) | |||
| if PY2 and isinstance(values, text_type): | |||
| values = values.encode(encoding) | |||
| if isinstance(postfix, text_type): | |||
| postfix = postfix.encode(encoding) | |||
| sql = bytearray(prefix) | |||
| args = iter(args) | |||
| v = values % escape(next(args), conn) | |||
| if isinstance(v, text_type): | |||
| if PY2: | |||
| v = v.encode(encoding) | |||
| else: | |||
| v = v.encode(encoding, 'surrogateescape') | |||
| sql += v | |||
| rows = 0 | |||
| for arg in args: | |||
| v = values % escape(arg, conn) | |||
| if isinstance(v, text_type): | |||
| if PY2: | |||
| v = v.encode(encoding) | |||
| else: | |||
| v = v.encode(encoding, 'surrogateescape') | |||
| if len(sql) + len(v) + len(postfix) + 1 > max_stmt_length: | |||
| rows += self.execute(sql + postfix) | |||
| sql = bytearray(prefix) | |||
| else: | |||
| sql += b',' | |||
| sql += v | |||
| rows += self.execute(sql + postfix) | |||
| self.rowcount = rows | |||
| return rows | |||
| def callproc(self, procname, args=()): | |||
| """Execute stored procedure procname with args | |||
| procname -- string, name of procedure to execute on server | |||
| args -- Sequence of parameters to use with procedure | |||
| Returns the original args. | |||
| Compatibility warning: PEP-249 specifies that any modified | |||
| parameters must be returned. This is currently impossible | |||
| as they are only available by storing them in a server | |||
| variable and then retrieved by a query. Since stored | |||
| procedures return zero or more result sets, there is no | |||
| reliable way to get at OUT or INOUT parameters via callproc. | |||
| The server variables are named @_procname_n, where procname | |||
| is the parameter above and n is the position of the parameter | |||
| (from zero). Once all result sets generated by the procedure | |||
| have been fetched, you can issue a SELECT @_procname_0, ... | |||
| query using .execute() to get any OUT or INOUT values. | |||
| Compatibility warning: The act of calling a stored procedure | |||
| itself creates an empty result set. This appears after any | |||
| result sets generated by the procedure. This is non-standard | |||
| behavior with respect to the DB-API. Be sure to use nextset() | |||
| to advance through all result sets; otherwise you may get | |||
| disconnected. | |||
| """ | |||
| db = self._get_db() | |||
| if args: | |||
| fmt = '@_{0}_%d=%s'.format(procname) | |||
| q = 'SET %s' % ','.join(fmt % (index, db.literal(arg)) | |||
| for index, arg in enumerate(args)) | |||
| if isinstance(q, unicode): | |||
| q = q.encode(db.encoding, 'surrogateescape') | |||
| self._query(q) | |||
| self.nextset() | |||
| q = "CALL %s(%s)" % (procname, | |||
| ','.join(['@_%s_%d' % (procname, i) | |||
| for i in range(len(args))])) | |||
| if isinstance(q, unicode): | |||
| q = q.encode(db.encoding, 'surrogateescape') | |||
| self._query(q) | |||
| self._executed = q | |||
| if not self._defer_warnings: | |||
| self._warning_check() | |||
| return args | |||
| def _do_query(self, q): | |||
| db = self._get_db() | |||
| self._last_executed = q | |||
| db.query(q) | |||
| self._do_get_result() | |||
| return self.rowcount | |||
| def _query(self, q): | |||
| return self._do_query(q) | |||
| def _fetch_row(self, size=1): | |||
| if not self._result: | |||
| return () | |||
| return self._result.fetch_row(size, self._fetch_type) | |||
| def __iter__(self): | |||
| return iter(self.fetchone, None) | |||
| Warning = Warning | |||
| Error = Error | |||
| InterfaceError = InterfaceError | |||
| DatabaseError = DatabaseError | |||
| DataError = DataError | |||
| OperationalError = OperationalError | |||
| IntegrityError = IntegrityError | |||
| InternalError = InternalError | |||
| ProgrammingError = ProgrammingError | |||
| NotSupportedError = NotSupportedError | |||
| class CursorStoreResultMixIn(object): | |||
| """This is a MixIn class which causes the entire result set to be | |||
| stored on the client side, i.e. it uses mysql_store_result(). If the | |||
| result set can be very large, consider adding a LIMIT clause to your | |||
| query, or using CursorUseResultMixIn instead.""" | |||
| def _get_result(self): | |||
| return self._get_db().store_result() | |||
| def _query(self, q): | |||
| rowcount = self._do_query(q) | |||
| self._post_get_result() | |||
| return rowcount | |||
| def _post_get_result(self): | |||
| self._rows = self._fetch_row(0) | |||
| self._result = None | |||
| def fetchone(self): | |||
| """Fetches a single row from the cursor. None indicates that | |||
| no more rows are available.""" | |||
| self._check_executed() | |||
| if self.rownumber >= len(self._rows): | |||
| return None | |||
| result = self._rows[self.rownumber] | |||
| self.rownumber = self.rownumber + 1 | |||
| return result | |||
| def fetchmany(self, size=None): | |||
| """Fetch up to size rows from the cursor. Result set may be smaller | |||
| than size. If size is not defined, cursor.arraysize is used.""" | |||
| self._check_executed() | |||
| end = self.rownumber + (size or self.arraysize) | |||
| result = self._rows[self.rownumber:end] | |||
| self.rownumber = min(end, len(self._rows)) | |||
| return result | |||
| def fetchall(self): | |||
| """Fetchs all available rows from the cursor.""" | |||
| self._check_executed() | |||
| if self.rownumber: | |||
| result = self._rows[self.rownumber:] | |||
| else: | |||
| result = self._rows | |||
| self.rownumber = len(self._rows) | |||
| return result | |||
| def scroll(self, value, mode='relative'): | |||
| """Scroll the cursor in the result set to a new position according | |||
| to mode. | |||
| If mode is 'relative' (default), value is taken as offset to | |||
| the current position in the result set, if set to 'absolute', | |||
| value states an absolute target position.""" | |||
| self._check_executed() | |||
| if mode == 'relative': | |||
| r = self.rownumber + value | |||
| elif mode == 'absolute': | |||
| r = value | |||
| else: | |||
| self.errorhandler(self, ProgrammingError, | |||
| "unknown scroll mode %s" % repr(mode)) | |||
| if r < 0 or r >= len(self._rows): | |||
| self.errorhandler(self, IndexError, "out of range") | |||
| self.rownumber = r | |||
| def __iter__(self): | |||
| self._check_executed() | |||
| result = self.rownumber and self._rows[self.rownumber:] or self._rows | |||
| return iter(result) | |||
| class CursorUseResultMixIn(object): | |||
| """This is a MixIn class which causes the result set to be stored | |||
| in the server and sent row-by-row to client side, i.e. it uses | |||
| mysql_use_result(). You MUST retrieve the entire result set and | |||
| close() the cursor before additional queries can be performed on | |||
| the connection.""" | |||
| _defer_warnings = True | |||
| def _get_result(self): return self._get_db().use_result() | |||
| def fetchone(self): | |||
| """Fetches a single row from the cursor.""" | |||
| self._check_executed() | |||
| r = self._fetch_row(1) | |||
| if not r: | |||
| self._warning_check() | |||
| return None | |||
| self.rownumber = self.rownumber + 1 | |||
| return r[0] | |||
| def fetchmany(self, size=None): | |||
| """Fetch up to size rows from the cursor. Result set may be smaller | |||
| than size. If size is not defined, cursor.arraysize is used.""" | |||
| self._check_executed() | |||
| r = self._fetch_row(size or self.arraysize) | |||
| self.rownumber = self.rownumber + len(r) | |||
| if not r: | |||
| self._warning_check() | |||
| return r | |||
| def fetchall(self): | |||
| """Fetchs all available rows from the cursor.""" | |||
| self._check_executed() | |||
| r = self._fetch_row(0) | |||
| self.rownumber = self.rownumber + len(r) | |||
| self._warning_check() | |||
| return r | |||
| def __iter__(self): | |||
| return self | |||
| def next(self): | |||
| row = self.fetchone() | |||
| if row is None: | |||
| raise StopIteration | |||
| return row | |||
| __next__ = next | |||
| class CursorTupleRowsMixIn(object): | |||
| """This is a MixIn class that causes all rows to be returned as tuples, | |||
| which is the standard form required by DB API.""" | |||
| _fetch_type = 0 | |||
| class CursorDictRowsMixIn(object): | |||
| """This is a MixIn class that causes all rows to be returned as | |||
| dictionaries. This is a non-standard feature.""" | |||
| _fetch_type = 1 | |||
| def fetchoneDict(self): | |||
| """Fetch a single row as a dictionary. Deprecated: | |||
| Use fetchone() instead. Will be removed in 1.3.""" | |||
| from warnings import warn | |||
| warn("fetchoneDict() is non-standard and will be removed in 1.3", | |||
| DeprecationWarning, 2) | |||
| return self.fetchone() | |||
| def fetchmanyDict(self, size=None): | |||
| """Fetch several rows as a list of dictionaries. Deprecated: | |||
| Use fetchmany() instead. Will be removed in 1.3.""" | |||
| from warnings import warn | |||
| warn("fetchmanyDict() is non-standard and will be removed in 1.3", | |||
| DeprecationWarning, 2) | |||
| return self.fetchmany(size) | |||
| def fetchallDict(self): | |||
| """Fetch all available rows as a list of dictionaries. Deprecated: | |||
| Use fetchall() instead. Will be removed in 1.3.""" | |||
| from warnings import warn | |||
| warn("fetchallDict() is non-standard and will be removed in 1.3", | |||
| DeprecationWarning, 2) | |||
| return self.fetchall() | |||
| class CursorOldDictRowsMixIn(CursorDictRowsMixIn): | |||
| """This is a MixIn class that returns rows as dictionaries with | |||
| the same key convention as the old Mysqldb (MySQLmodule). Don't | |||
| use this.""" | |||
| _fetch_type = 2 | |||
| class Cursor(CursorStoreResultMixIn, CursorTupleRowsMixIn, | |||
| BaseCursor): | |||
| """This is the standard Cursor class that returns rows as tuples | |||
| and stores the result set in the client.""" | |||
| class DictCursor(CursorStoreResultMixIn, CursorDictRowsMixIn, | |||
| BaseCursor): | |||
| """This is a Cursor class that returns rows as dictionaries and | |||
| stores the result set in the client.""" | |||
| class SSCursor(CursorUseResultMixIn, CursorTupleRowsMixIn, | |||
| BaseCursor): | |||
| """This is a Cursor class that returns rows as tuples and stores | |||
| the result set in the server.""" | |||
| class SSDictCursor(CursorUseResultMixIn, CursorDictRowsMixIn, | |||
| BaseCursor): | |||
| """This is a Cursor class that returns rows as dictionaries and | |||
| stores the result set in the server.""" | |||
| @ -0,0 +1,4 @@ | |||
| __author__ = "Andy Dustman <farcepest@gmail.com>" | |||
| version_info = (1,3,13,'final',0) | |||
| __version__ = "1.3.13" | |||
| @ -0,0 +1,145 @@ | |||
| """times module | |||
| This module provides some Date and Time classes for dealing with MySQL data. | |||
| Use Python datetime module to handle date and time columns. | |||
| """ | |||
| from time import localtime | |||
| from datetime import date, datetime, time, timedelta | |||
| from _mysql import string_literal | |||
| Date = date | |||
| Time = time | |||
| TimeDelta = timedelta | |||
| Timestamp = datetime | |||
| DateTimeDeltaType = timedelta | |||
| DateTimeType = datetime | |||
| def DateFromTicks(ticks): | |||
| """Convert UNIX ticks into a date instance.""" | |||
| return date(*localtime(ticks)[:3]) | |||
| def TimeFromTicks(ticks): | |||
| """Convert UNIX ticks into a time instance.""" | |||
| return time(*localtime(ticks)[3:6]) | |||
| def TimestampFromTicks(ticks): | |||
| """Convert UNIX ticks into a datetime instance.""" | |||
| return datetime(*localtime(ticks)[:6]) | |||
| format_TIME = format_DATE = str | |||
| def format_TIMEDELTA(v): | |||
| seconds = int(v.seconds) % 60 | |||
| minutes = int(v.seconds // 60) % 60 | |||
| hours = int(v.seconds // 3600) % 24 | |||
| return '%d %d:%d:%d' % (v.days, hours, minutes, seconds) | |||
| def format_TIMESTAMP(d): | |||
| """ | |||
| :type d: datetime.datetime | |||
| """ | |||
| if d.microsecond: | |||
| fmt = "{0.year:04}-{0.month:02}-{0.day:02} {0.hour:02}:{0.minute:02}:{0.second:02}.{0.microsecond:06}" | |||
| else: | |||
| fmt = "{0.year:04}-{0.month:02}-{0.day:02} {0.hour:02}:{0.minute:02}:{0.second:02}" | |||
| return fmt.format(d) | |||
| def DateTime_or_None(s): | |||
| try: | |||
| if len(s) < 11: | |||
| return Date_or_None(s) | |||
| micros = s[20:] | |||
| if len(micros) == 0: | |||
| # 12:00:00 | |||
| micros = 0 | |||
| elif len(micros) < 7: | |||
| # 12:00:00.123456 | |||
| micros = int(micros) * 10 ** (6 - len(micros)) | |||
| else: | |||
| return None | |||
| return datetime( | |||
| int(s[:4]), # year | |||
| int(s[5:7]), # month | |||
| int(s[8:10]), # day | |||
| int(s[11:13] or 0), # hour | |||
| int(s[14:16] or 0), # minute | |||
| int(s[17:19] or 0), # second | |||
| micros, # microsecond | |||
| ) | |||
| except ValueError: | |||
| return None | |||
| def TimeDelta_or_None(s): | |||
| try: | |||
| h, m, s = s.split(':') | |||
| if '.' in s: | |||
| s, ms = s.split('.') | |||
| ms = ms.ljust(6, '0') | |||
| else: | |||
| ms = 0 | |||
| if h[0] == '-': | |||
| negative = True | |||
| else: | |||
| negative = False | |||
| h, m, s, ms = abs(int(h)), int(m), int(s), int(ms) | |||
| td = timedelta(hours=h, minutes=m, seconds=s, | |||
| microseconds=ms) | |||
| if negative: | |||
| return -td | |||
| else: | |||
| return td | |||
| except ValueError: | |||
| # unpacking or int/float conversion failed | |||
| return None | |||
| def Time_or_None(s): | |||
| try: | |||
| h, m, s = s.split(':') | |||
| if '.' in s: | |||
| s, ms = s.split('.') | |||
| ms = ms.ljust(6, '0') | |||
| else: | |||
| ms = 0 | |||
| h, m, s, ms = int(h), int(m), int(s), int(ms) | |||
| return time(hour=h, minute=m, second=s, | |||
| microsecond=ms) | |||
| except ValueError: | |||
| return None | |||
| def Date_or_None(s): | |||
| try: | |||
| return date( | |||
| int(s[:4]), # year | |||
| int(s[5:7]), # month | |||
| int(s[8:10]), # day | |||
| ) | |||
| except ValueError: | |||
| return None | |||
| def DateTime2literal(d, c): | |||
| """Format a DateTime object as an ISO timestamp.""" | |||
| return string_literal(format_TIMESTAMP(d), c) | |||
| def DateTimeDelta2literal(d, c): | |||
| """Format a DateTimeDelta object as a time.""" | |||
| return string_literal(format_TIMEDELTA(d),c) | |||
| def mysql_timestamp_converter(s): | |||
| """Convert a MySQL TIMESTAMP to a Timestamp object.""" | |||
| # MySQL>4.1 returns TIMESTAMP in the same format as DATETIME | |||
| if s[4] == '-': return DateTime_or_None(s) | |||
| s = s + "0"*(14-len(s)) # padding | |||
| parts = map(int, filter(None, (s[:4],s[4:6],s[6:8], | |||
| s[8:10],s[10:12],s[12:14]))) | |||
| try: | |||
| return Timestamp(*parts) | |||
| except (SystemExit, KeyboardInterrupt): | |||
| raise # pragma: no cover | |||
| except: | |||
| return None | |||
| @ -0,0 +1,87 @@ | |||
| """_mysql_exceptions: Exception classes for _mysql and MySQLdb. | |||
| These classes are dictated by the DB API v2.0: | |||
| https://www.python.org/dev/peps/pep-0249/ | |||
| """ | |||
| try: | |||
| from exceptions import Exception, StandardError, Warning | |||
| except ImportError: | |||
| # Python 3 | |||
| StandardError = Exception | |||
| class MySQLError(StandardError): | |||
| """Exception related to operation with MySQL.""" | |||
| class Warning(Warning, MySQLError): | |||
| """Exception raised for important warnings like data truncations | |||
| while inserting, etc.""" | |||
| class Error(MySQLError): | |||
| """Exception that is the base class of all other error exceptions | |||
| (not Warning).""" | |||
| class InterfaceError(Error): | |||
| """Exception raised for errors that are related to the database | |||
| interface rather than the database itself.""" | |||
| class DatabaseError(Error): | |||
| """Exception raised for errors that are related to the | |||
| database.""" | |||
| class DataError(DatabaseError): | |||
| """Exception raised for errors that are due to problems with the | |||
| processed data like division by zero, numeric value out of range, | |||
| etc.""" | |||
| class OperationalError(DatabaseError): | |||
| """Exception raised for errors that are related to the database's | |||
| operation and not necessarily under the control of the programmer, | |||
| e.g. an unexpected disconnect occurs, the data source name is not | |||
| found, a transaction could not be processed, a memory allocation | |||
| error occurred during processing, etc.""" | |||
| class IntegrityError(DatabaseError): | |||
| """Exception raised when the relational integrity of the database | |||
| is affected, e.g. a foreign key check fails, duplicate key, | |||
| etc.""" | |||
| class InternalError(DatabaseError): | |||
| """Exception raised when the database encounters an internal | |||
| error, e.g. the cursor is not valid anymore, the transaction is | |||
| out of sync, etc.""" | |||
| class ProgrammingError(DatabaseError): | |||
| """Exception raised for programming errors, e.g. table not found | |||
| or already exists, syntax error in the SQL statement, wrong number | |||
| of parameters specified, etc.""" | |||
| class NotSupportedError(DatabaseError): | |||
| """Exception raised in case a method or database API was used | |||
| which is not supported by the database, e.g. requesting a | |||
| .rollback() on a connection that does not support transaction or | |||
| has transactions turned off.""" | |||
| @ -0,0 +1,5 @@ | |||
| """Run the EasyInstall command""" | |||
| if __name__ == '__main__': | |||
| from setuptools.command.easy_install import main | |||
| main() | |||
| @ -0,0 +1 @@ | |||
| pip | |||
| @ -0,0 +1,339 @@ | |||
| GNU GENERAL PUBLIC LICENSE | |||
| Version 2, June 1991 | |||
| Copyright (C) 1989, 1991 Free Software Foundation, Inc., | |||
| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
| Everyone is permitted to copy and distribute verbatim copies | |||
| of this license document, but changing it is not allowed. | |||
| Preamble | |||
| The licenses for most software are designed to take away your | |||
| freedom to share and change it. By contrast, the GNU General Public | |||
| License is intended to guarantee your freedom to share and change free | |||
| software--to make sure the software is free for all its users. This | |||
| General Public License applies to most of the Free Software | |||
| Foundation's software and to any other program whose authors commit to | |||
| using it. (Some other Free Software Foundation software is covered by | |||
| the GNU Lesser General Public License instead.) You can apply it to | |||
| your programs, too. | |||
| When we speak of free software, we are referring to freedom, not | |||
| price. Our General Public Licenses are designed to make sure that you | |||
| have the freedom to distribute copies of free software (and charge for | |||
| this service if you wish), that you receive source code or can get it | |||
| if you want it, that you can change the software or use pieces of it | |||
| in new free programs; and that you know you can do these things. | |||
| To protect your rights, we need to make restrictions that forbid | |||
| anyone to deny you these rights or to ask you to surrender the rights. | |||
| These restrictions translate to certain responsibilities for you if you | |||
| distribute copies of the software, or if you modify it. | |||
| For example, if you distribute copies of such a program, whether | |||
| gratis or for a fee, you must give the recipients all the rights that | |||
| you have. You must make sure that they, too, receive or can get the | |||
| source code. And you must show them these terms so they know their | |||
| rights. | |||
| We protect your rights with two steps: (1) copyright the software, and | |||
| (2) offer you this license which gives you legal permission to copy, | |||
| distribute and/or modify the software. | |||
| Also, for each author's protection and ours, we want to make certain | |||
| that everyone understands that there is no warranty for this free | |||
| software. If the software is modified by someone else and passed on, we | |||
| want its recipients to know that what they have is not the original, so | |||
| that any problems introduced by others will not reflect on the original | |||
| authors' reputations. | |||
| Finally, any free program is threatened constantly by software | |||
| patents. We wish to avoid the danger that redistributors of a free | |||
| program will individually obtain patent licenses, in effect making the | |||
| program proprietary. To prevent this, we have made it clear that any | |||
| patent must be licensed for everyone's free use or not licensed at all. | |||
| The precise terms and conditions for copying, distribution and | |||
| modification follow. | |||
| GNU GENERAL PUBLIC LICENSE | |||
| TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | |||
| 0. This License applies to any program or other work which contains | |||
| a notice placed by the copyright holder saying it may be distributed | |||
| under the terms of this General Public License. The "Program", below, | |||
| refers to any such program or work, and a "work based on the Program" | |||
| means either the Program or any derivative work under copyright law: | |||
| that is to say, a work containing the Program or a portion of it, | |||
| either verbatim or with modifications and/or translated into another | |||
| language. (Hereinafter, translation is included without limitation in | |||
| the term "modification".) Each licensee is addressed as "you". | |||
| Activities other than copying, distribution and modification are not | |||
| covered by this License; they are outside its scope. The act of | |||
| running the Program is not restricted, and the output from the Program | |||
| is covered only if its contents constitute a work based on the | |||
| Program (independent of having been made by running the Program). | |||
| Whether that is true depends on what the Program does. | |||
| 1. You may copy and distribute verbatim copies of the Program's | |||
| source code as you receive it, in any medium, provided that you | |||
| conspicuously and appropriately publish on each copy an appropriate | |||
| copyright notice and disclaimer of warranty; keep intact all the | |||
| notices that refer to this License and to the absence of any warranty; | |||
| and give any other recipients of the Program a copy of this License | |||
| along with the Program. | |||
| You may charge a fee for the physical act of transferring a copy, and | |||
| you may at your option offer warranty protection in exchange for a fee. | |||
| 2. You may modify your copy or copies of the Program or any portion | |||
| of it, thus forming a work based on the Program, and copy and | |||
| distribute such modifications or work under the terms of Section 1 | |||
| above, provided that you also meet all of these conditions: | |||
| a) You must cause the modified files to carry prominent notices | |||
| stating that you changed the files and the date of any change. | |||
| b) You must cause any work that you distribute or publish, that in | |||
| whole or in part contains or is derived from the Program or any | |||
| part thereof, to be licensed as a whole at no charge to all third | |||
| parties under the terms of this License. | |||
| c) If the modified program normally reads commands interactively | |||
| when run, you must cause it, when started running for such | |||
| interactive use in the most ordinary way, to print or display an | |||
| announcement including an appropriate copyright notice and a | |||
| notice that there is no warranty (or else, saying that you provide | |||
| a warranty) and that users may redistribute the program under | |||
| these conditions, and telling the user how to view a copy of this | |||
| License. (Exception: if the Program itself is interactive but | |||
| does not normally print such an announcement, your work based on | |||
| the Program is not required to print an announcement.) | |||
| These requirements apply to the modified work as a whole. If | |||
| identifiable sections of that work are not derived from the Program, | |||
| and can be reasonably considered independent and separate works in | |||
| themselves, then this License, and its terms, do not apply to those | |||
| sections when you distribute them as separate works. But when you | |||
| distribute the same sections as part of a whole which is a work based | |||
| on the Program, the distribution of the whole must be on the terms of | |||
| this License, whose permissions for other licensees extend to the | |||
| entire whole, and thus to each and every part regardless of who wrote it. | |||
| Thus, it is not the intent of this section to claim rights or contest | |||
| your rights to work written entirely by you; rather, the intent is to | |||
| exercise the right to control the distribution of derivative or | |||
| collective works based on the Program. | |||
| In addition, mere aggregation of another work not based on the Program | |||
| with the Program (or with a work based on the Program) on a volume of | |||
| a storage or distribution medium does not bring the other work under | |||
| the scope of this License. | |||
| 3. You may copy and distribute the Program (or a work based on it, | |||
| under Section 2) in object code or executable form under the terms of | |||
| Sections 1 and 2 above provided that you also do one of the following: | |||
| a) Accompany it with the complete corresponding machine-readable | |||
| source code, which must be distributed under the terms of Sections | |||
| 1 and 2 above on a medium customarily used for software interchange; or, | |||
| b) Accompany it with a written offer, valid for at least three | |||
| years, to give any third party, for a charge no more than your | |||
| cost of physically performing source distribution, a complete | |||
| machine-readable copy of the corresponding source code, to be | |||
| distributed under the terms of Sections 1 and 2 above on a medium | |||
| customarily used for software interchange; or, | |||
| c) Accompany it with the information you received as to the offer | |||
| to distribute corresponding source code. (This alternative is | |||
| allowed only for noncommercial distribution and only if you | |||
| received the program in object code or executable form with such | |||
| an offer, in accord with Subsection b above.) | |||
| The source code for a work means the preferred form of the work for | |||
| making modifications to it. For an executable work, complete source | |||
| code means all the source code for all modules it contains, plus any | |||
| associated interface definition files, plus the scripts used to | |||
| control compilation and installation of the executable. However, as a | |||
| special exception, the source code distributed need not include | |||
| anything that is normally distributed (in either source or binary | |||
| form) with the major components (compiler, kernel, and so on) of the | |||
| operating system on which the executable runs, unless that component | |||
| itself accompanies the executable. | |||
| If distribution of executable or object code is made by offering | |||
| access to copy from a designated place, then offering equivalent | |||
| access to copy the source code from the same place counts as | |||
| distribution of the source code, even though third parties are not | |||
| compelled to copy the source along with the object code. | |||
| 4. You may not copy, modify, sublicense, or distribute the Program | |||
| except as expressly provided under this License. Any attempt | |||
| otherwise to copy, modify, sublicense or distribute the Program is | |||
| void, and will automatically terminate your rights under this License. | |||
| However, parties who have received copies, or rights, from you under | |||
| this License will not have their licenses terminated so long as such | |||
| parties remain in full compliance. | |||
| 5. You are not required to accept this License, since you have not | |||
| signed it. However, nothing else grants you permission to modify or | |||
| distribute the Program or its derivative works. These actions are | |||
| prohibited by law if you do not accept this License. Therefore, by | |||
| modifying or distributing the Program (or any work based on the | |||
| Program), you indicate your acceptance of this License to do so, and | |||
| all its terms and conditions for copying, distributing or modifying | |||
| the Program or works based on it. | |||
| 6. Each time you redistribute the Program (or any work based on the | |||
| Program), the recipient automatically receives a license from the | |||
| original licensor to copy, distribute or modify the Program subject to | |||
| these terms and conditions. You may not impose any further | |||
| restrictions on the recipients' exercise of the rights granted herein. | |||
| You are not responsible for enforcing compliance by third parties to | |||
| this License. | |||
| 7. If, as a consequence of a court judgment or allegation of patent | |||
| infringement or for any other reason (not limited to patent issues), | |||
| conditions are imposed on you (whether by court order, agreement or | |||
| otherwise) that contradict the conditions of this License, they do not | |||
| excuse you from the conditions of this License. If you cannot | |||
| distribute so as to satisfy simultaneously your obligations under this | |||
| License and any other pertinent obligations, then as a consequence you | |||
| may not distribute the Program at all. For example, if a patent | |||
| license would not permit royalty-free redistribution of the Program by | |||
| all those who receive copies directly or indirectly through you, then | |||
| the only way you could satisfy both it and this License would be to | |||
| refrain entirely from distribution of the Program. | |||
| If any portion of this section is held invalid or unenforceable under | |||
| any particular circumstance, the balance of the section is intended to | |||
| apply and the section as a whole is intended to apply in other | |||
| circumstances. | |||
| It is not the purpose of this section to induce you to infringe any | |||
| patents or other property right claims or to contest validity of any | |||
| such claims; this section has the sole purpose of protecting the | |||
| integrity of the free software distribution system, which is | |||
| implemented by public license practices. Many people have made | |||
| generous contributions to the wide range of software distributed | |||
| through that system in reliance on consistent application of that | |||
| system; it is up to the author/donor to decide if he or she is willing | |||
| to distribute software through any other system and a licensee cannot | |||
| impose that choice. | |||
| This section is intended to make thoroughly clear what is believed to | |||
| be a consequence of the rest of this License. | |||
| 8. If the distribution and/or use of the Program is restricted in | |||
| certain countries either by patents or by copyrighted interfaces, the | |||
| original copyright holder who places the Program under this License | |||
| may add an explicit geographical distribution limitation excluding | |||
| those countries, so that distribution is permitted only in or among | |||
| countries not thus excluded. In such case, this License incorporates | |||
| the limitation as if written in the body of this License. | |||
| 9. The Free Software Foundation may publish revised and/or new versions | |||
| of the General Public License from time to time. Such new versions will | |||
| be similar in spirit to the present version, but may differ in detail to | |||
| address new problems or concerns. | |||
| Each version is given a distinguishing version number. If the Program | |||
| specifies a version number of this License which applies to it and "any | |||
| later version", you have the option of following the terms and conditions | |||
| either of that version or of any later version published by the Free | |||
| Software Foundation. If the Program does not specify a version number of | |||
| this License, you may choose any version ever published by the Free Software | |||
| Foundation. | |||
| 10. If you wish to incorporate parts of the Program into other free | |||
| programs whose distribution conditions are different, write to the author | |||
| to ask for permission. For software which is copyrighted by the Free | |||
| Software Foundation, write to the Free Software Foundation; we sometimes | |||
| make exceptions for this. Our decision will be guided by the two goals | |||
| of preserving the free status of all derivatives of our free software and | |||
| of promoting the sharing and reuse of software generally. | |||
| NO WARRANTY | |||
| 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY | |||
| FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN | |||
| OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES | |||
| PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED | |||
| OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS | |||
| TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE | |||
| PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, | |||
| REPAIR OR CORRECTION. | |||
| 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | |||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR | |||
| REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, | |||
| INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING | |||
| OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED | |||
| TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY | |||
| YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER | |||
| PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE | |||
| POSSIBILITY OF SUCH DAMAGES. | |||
| END OF TERMS AND CONDITIONS | |||
| How to Apply These Terms to Your New Programs | |||
| If you develop a new program, and you want it to be of the greatest | |||
| possible use to the public, the best way to achieve this is to make it | |||
| free software which everyone can redistribute and change under these terms. | |||
| To do so, attach the following notices to the program. It is safest | |||
| to attach them to the start of each source file to most effectively | |||
| convey the exclusion of warranty; and each file should have at least | |||
| the "copyright" line and a pointer to where the full notice is found. | |||
| <one line to give the program's name and a brief idea of what it does.> | |||
| Copyright (C) <year> <name of author> | |||
| This program is free software; you can redistribute it and/or modify | |||
| it under the terms of the GNU General Public License as published by | |||
| the Free Software Foundation; either version 2 of the License, or | |||
| (at your option) any later version. | |||
| This program is distributed in the hope that it will be useful, | |||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| GNU General Public License for more details. | |||
| You should have received a copy of the GNU General Public License along | |||
| with this program; if not, write to the Free Software Foundation, Inc., | |||
| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |||
| Also add information on how to contact you by electronic and paper mail. | |||
| If the program is interactive, make it output a short notice like this | |||
| when it starts in an interactive mode: | |||
| Gnomovision version 69, Copyright (C) year name of author | |||
| Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | |||
| This is free software, and you are welcome to redistribute it | |||
| under certain conditions; type `show c' for details. | |||
| The hypothetical commands `show w' and `show c' should show the appropriate | |||
| parts of the General Public License. Of course, the commands you use may | |||
| be called something other than `show w' and `show c'; they could even be | |||
| mouse-clicks or menu items--whatever suits your program. | |||
| You should also get your employer (if you work as a programmer) or your | |||
| school, if any, to sign a "copyright disclaimer" for the program, if | |||
| necessary. Here is a sample; alter the names: | |||
| Yoyodyne, Inc., hereby disclaims all copyright interest in the program | |||
| `Gnomovision' (which makes passes at compilers) written by James Hacker. | |||
| <signature of Ty Coon>, 1 April 1989 | |||
| Ty Coon, President of Vice | |||
| This General Public License does not permit incorporating your program into | |||
| proprietary programs. If your program is a subroutine library, you may | |||
| consider it more useful to permit linking proprietary applications with the | |||
| library. If this is what you want to do, use the GNU Lesser General | |||
| Public License instead of this License. | |||
| @ -0,0 +1,106 @@ | |||
| Metadata-Version: 2.1 | |||
| Name: mysqlclient | |||
| Version: 1.3.13 | |||
| Summary: Python interface to MySQL | |||
| Home-page: https://github.com/PyMySQL/mysqlclient-python | |||
| Author: Andy Dustman | |||
| Author-email: farcepest@gmail.com | |||
| Maintainer: INADA Naoki | |||
| Maintainer-email: songofacandy@gmail.com | |||
| License: GPL | |||
| Platform: ALL | |||
| Classifier: Development Status :: 5 - Production/Stable | |||
| Classifier: Environment :: Other Environment | |||
| Classifier: License :: OSI Approved :: GNU General Public License (GPL) | |||
| Classifier: Operating System :: MacOS :: MacOS X | |||
| Classifier: Operating System :: Microsoft :: Windows :: Windows NT/2000 | |||
| Classifier: Operating System :: OS Independent | |||
| Classifier: Operating System :: POSIX | |||
| Classifier: Operating System :: POSIX :: Linux | |||
| Classifier: Operating System :: Unix | |||
| Classifier: Programming Language :: C | |||
| Classifier: Programming Language :: Python | |||
| Classifier: Programming Language :: Python :: 2 | |||
| Classifier: Programming Language :: Python :: 2.7 | |||
| Classifier: Programming Language :: Python :: 3 | |||
| Classifier: Programming Language :: Python :: 3.4 | |||
| Classifier: Programming Language :: Python :: 3.5 | |||
| Classifier: Programming Language :: Python :: 3.6 | |||
| Classifier: Topic :: Database | |||
| Classifier: Topic :: Database :: Database Engines/Servers | |||
| Description-Content-Type: text/markdown | |||
| # mysqlclient | |||
| [](http://travis-ci.org/PyMySQL/mysqlclient-python) | |||
| This is a fork of [MySQLdb1](https://github.com/farcepest/MySQLdb1). | |||
| This project adds Python 3 support and bug fixes. | |||
| I hope this fork is merged back to MySQLdb1 like distribute was merged back to setuptools. | |||
| ## Install | |||
| ### Prerequisites | |||
| You may need to install the Python and MySQL development headers and libraries like so: | |||
| * `sudo apt-get install python-dev default-libmysqlclient-dev` # Debian / Ubuntu | |||
| * `sudo yum install python-devel mysql-devel` # Red Hat / CentOS | |||
| * `brew install mysql-connector-c` # macOS (Homebrew) (Currently, it has bug. See below) | |||
| On Windows, there are binary wheels you can install without MySQLConnector/C or MSVC. | |||
| #### Note on Python 3 : if you are using python3 then you need to install python3-dev using the following command : | |||
| `sudo apt-get install python3-dev` # debian / Ubuntu | |||
| `sudo yum install python3-devel ` # Red Hat / CentOS | |||
| #### **Note about bug of MySQL Connector/C on macOS** | |||
| See also: https://bugs.mysql.com/bug.php?id=86971 | |||
| Versions of MySQL Connector/C may have incorrect default configuration options that cause compilation errors when `mysqlclient-python` is installed. (As of November 2017, this is known to be true for homebrew's `mysql-connector-c` and [official package](https://dev.mysql.com/downloads/connector/c/)) | |||
| Modification of `mysql_config` resolves these issues as follows. | |||
| Change | |||
| ``` | |||
| # on macOS, on or about line 112: | |||
| # Create options | |||
| libs="-L$pkglibdir" | |||
| libs="$libs -l " | |||
| ``` | |||
| to | |||
| ``` | |||
| # Create options | |||
| libs="-L$pkglibdir" | |||
| libs="$libs -lmysqlclient -lssl -lcrypto" | |||
| ``` | |||
| An improper ssl configuration may also create issues; see, e.g, `brew info openssl` for details on macOS. | |||
| ### Install from PyPI | |||
| `pip install mysqlclient` | |||
| NOTE: Wheels for Windows may be not released with source package. You should pin version | |||
| in your `requirements.txt` to avoid trying to install newest source package. | |||
| ### Install from source | |||
| 1. Download source by `git clone` or [zipfile](https://github.com/PyMySQL/mysqlclient-python/archive/master.zip). | |||
| 2. Customize `site.cfg` | |||
| 3. `python setup.py install` | |||
| ### Documentation | |||
| Documentation is hosted on [Read The Docs](https://mysqlclient.readthedocs.io/) | |||
| @ -0,0 +1,37 @@ | |||
| MySQLdb/__init__.py,sha256=0BVt8WBd0ISchCuOQivNd4YTiWTbUA2JacK5Uve5sLg,3214 | |||
| MySQLdb/__init__.pyc,, | |||
| MySQLdb/compat.py,sha256=1oVrJX403P_IH7ADXKpDpvRqX_DBBBdH14jQqoRjFGg,186 | |||
| MySQLdb/compat.pyc,, | |||
| MySQLdb/connections.py,sha256=GQD9WZ1_HMscgLr-CPjJOdm_75K7frlh8PuFyZcrVR8,14399 | |||
| MySQLdb/connections.pyc,, | |||
| MySQLdb/constants/CLIENT.py,sha256=PoS_lNck5zAPWbhJOsV1vcKOnqAqOuS4CsHVtvYa9Y8,667 | |||
| MySQLdb/constants/CLIENT.pyc,, | |||
| MySQLdb/constants/CR.py,sha256=c3x2IVDOG95XhJNJEX9K6uOQ7jYBsMA93INzpNd2AlU,2850 | |||
| MySQLdb/constants/CR.pyc,, | |||
| MySQLdb/constants/ER.py,sha256=8ZgzahBfgIM-IjTa1Ns-wfhBJhRmAAUnYRTMEkE3u1g,32210 | |||
| MySQLdb/constants/ER.pyc,, | |||
| MySQLdb/constants/FIELD_TYPE.py,sha256=nA5YstTpfJLe5a1dRQ7LDCgfkyplQUx8OdUhuHycpJ8,485 | |||
| MySQLdb/constants/FIELD_TYPE.pyc,, | |||
| MySQLdb/constants/FLAG.py,sha256=g-3YSSEau8KkjcDIuiDhI_NE-UrrqQA6lCOHGKW5A4k,363 | |||
| MySQLdb/constants/FLAG.pyc,, | |||
| MySQLdb/constants/REFRESH.py,sha256=3FkpfI4l_3ehsArU3iQW2TRMKEo9lSJR6o-y-cqnrWg,252 | |||
| MySQLdb/constants/REFRESH.pyc,, | |||
| MySQLdb/constants/__init__.py,sha256=X7xVUV2AwAnKwNIwmbc4LudU7khGZ_1vVcj0UObTmrk,62 | |||
| MySQLdb/constants/__init__.pyc,, | |||
| MySQLdb/converters.py,sha256=To9ghz1JdTkf8AyUXs34mnyF-h_7elFKxdvRQUd5sUQ,3788 | |||
| MySQLdb/converters.pyc,, | |||
| MySQLdb/cursors.py,sha256=l0RkeZ3uAIEiXflCdqNYP0aXtc1An6WTGgCMpOBkRmE,20372 | |||
| MySQLdb/cursors.pyc,, | |||
| MySQLdb/release.py,sha256=k1dNBbqt1DZ9sypyyTjHD8kxWbvXr-aw-UtGTRMIFNo,108 | |||
| MySQLdb/release.pyc,, | |||
| MySQLdb/times.py,sha256=mU0W2bN-XkiaP0foiVVWeM1fpnigLUf3hZTHR_EBdDE,4017 | |||
| MySQLdb/times.pyc,, | |||
| _mysql.so,sha256=ktMuVLGGY58VWgYNyQhm3m3nn54ucgxWVFkx3OgsqJA,170680 | |||
| _mysql_exceptions.py,sha256=qFv2nFXQAUSV6BXY5Z9A_eOMUHUOfPp2qWxffK3Hy5M,2335 | |||
| _mysql_exceptions.pyc,, | |||
| mysqlclient-1.3.13.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 | |||
| mysqlclient-1.3.13.dist-info/LICENSE,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092 | |||
| mysqlclient-1.3.13.dist-info/METADATA,sha256=k4SME6VYfp6iqrNGyt9S2DpKvx9FkS00K_Gqf-L8waw,3585 | |||
| mysqlclient-1.3.13.dist-info/RECORD,, | |||
| mysqlclient-1.3.13.dist-info/WHEEL,sha256=-Crjs1WwpTj5CCeFg4GKXWPpZsiCLs9UbQGH1WBfXpw,105 | |||
| mysqlclient-1.3.13.dist-info/top_level.txt,sha256=zVcnB6vDKtFFropZmmgvpYyOqmAIc1cdxX0aKjWDQ0g,33 | |||
| @ -0,0 +1,5 @@ | |||
| Wheel-Version: 1.0 | |||
| Generator: bdist_wheel (0.32.2) | |||
| Root-Is-Purelib: false | |||
| Tag: cp27-cp27mu-linux_x86_64 | |||
| @ -0,0 +1,3 @@ | |||
| MySQLdb | |||
| _mysql | |||
| _mysql_exceptions | |||
| @ -0,0 +1 @@ | |||
| pip | |||
| @ -0,0 +1,20 @@ | |||
| Copyright (c) 2008-2018 The pip developers (see AUTHORS.txt file) | |||
| Permission is hereby granted, free of charge, to any person obtaining | |||
| a copy of this software and associated documentation files (the | |||
| "Software"), to deal in the Software without restriction, including | |||
| without limitation the rights to use, copy, modify, merge, publish, | |||
| distribute, sublicense, and/or sell copies of the Software, and to | |||
| permit persons to whom the Software is furnished to do so, subject to | |||
| the following conditions: | |||
| The above copyright notice and this permission notice shall be | |||
| included in all copies or substantial portions of the Software. | |||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |||
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |||
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |||
| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | |||
| LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | |||
| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |||
| WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
| @ -0,0 +1,70 @@ | |||
| Metadata-Version: 2.1 | |||
| Name: pip | |||
| Version: 18.1 | |||
| Summary: The PyPA recommended tool for installing Python packages. | |||
| Home-page: https://pip.pypa.io/ | |||
| Author: The pip developers | |||
| Author-email: pypa-dev@groups.google.com | |||
| License: MIT | |||
| Keywords: distutils easy_install egg setuptools wheel virtualenv | |||
| Platform: UNKNOWN | |||
| Classifier: Development Status :: 5 - Production/Stable | |||
| Classifier: Intended Audience :: Developers | |||
| Classifier: License :: OSI Approved :: MIT License | |||
| Classifier: Topic :: Software Development :: Build Tools | |||
| Classifier: Programming Language :: Python | |||
| Classifier: Programming Language :: Python :: 2 | |||
| Classifier: Programming Language :: Python :: 2.7 | |||
| Classifier: Programming Language :: Python :: 3 | |||
| Classifier: Programming Language :: Python :: 3.4 | |||
| Classifier: Programming Language :: Python :: 3.5 | |||
| Classifier: Programming Language :: Python :: 3.6 | |||
| Classifier: Programming Language :: Python :: 3.7 | |||
| Classifier: Programming Language :: Python :: Implementation :: CPython | |||
| Classifier: Programming Language :: Python :: Implementation :: PyPy | |||
| Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* | |||
| pip | |||
| === | |||
| The `PyPA recommended`_ tool for installing Python packages. | |||
| .. image:: https://img.shields.io/pypi/v/pip.svg | |||
| :target: https://pypi.org/project/pip/ | |||
| .. image:: https://img.shields.io/travis/pypa/pip/master.svg?label=travis-ci | |||
| :target: https://travis-ci.org/pypa/pip | |||
| .. image:: https://img.shields.io/appveyor/ci/pypa/pip.svg?label=appveyor-ci | |||
| :target: https://ci.appveyor.com/project/pypa/pip/history | |||
| .. image:: https://readthedocs.org/projects/pip/badge/?version=latest | |||
| :target: https://pip.pypa.io/en/latest | |||
| * `Installation`_ | |||
| * `Documentation`_ | |||
| * `Changelog`_ | |||
| * `GitHub Page`_ | |||
| * `Issue Tracking`_ | |||
| * `User mailing list`_ | |||
| * `Dev mailing list`_ | |||
| * User IRC: #pypa on Freenode. | |||
| * Dev IRC: #pypa-dev on Freenode. | |||
| Code of Conduct | |||
| --------------- | |||
| Everyone interacting in the pip project's codebases, issue trackers, chat | |||
| rooms and mailing lists is expected to follow the `PyPA Code of Conduct`_. | |||
| .. _PyPA recommended: https://packaging.python.org/en/latest/current/ | |||
| .. _Installation: https://pip.pypa.io/en/stable/installing.html | |||
| .. _Documentation: https://pip.pypa.io/en/stable/ | |||
| .. _Changelog: https://pip.pypa.io/en/stable/news.html | |||
| .. _GitHub Page: https://github.com/pypa/pip | |||
| .. _Issue Tracking: https://github.com/pypa/pip/issues | |||
| .. _User mailing list: https://groups.google.com/forum/#!forum/python-virtualenv | |||
| .. _Dev mailing list: https://groups.google.com/forum/#!forum/pypa-dev | |||
| .. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ | |||
| @ -0,0 +1,614 @@ | |||
| pip/__init__.py,sha256=nO-iphoXiDoci_ZAMl-PG2zdd4Y7m88jBDILTYzwGy4,21 | |||
| pip/__main__.py,sha256=L3IHqBeasELUHvwy5CT_izVEMhM12tve289qut49DvU,623 | |||
| pip/_internal/__init__.py,sha256=b0jSFCCViGhB1RWni35_NMkH3Y-mbZrV648DGMagDjs,2869 | |||
| pip/_internal/build_env.py,sha256=zKhqmDMnrX5OTSNQ4xBw-mN5mTGVu6wjiNFW-ajWYEI,4797 | |||
| pip/_internal/cache.py,sha256=96_aKtDbwgLEVNgNabOT8GrFCYZEACedoiucqU5ccg8,6829 | |||
| pip/_internal/configuration.py,sha256=KMgG3ufFrUKX_QESi2cMVvFi47tl845Bg1ZkNthlWik,13243 | |||
| pip/_internal/download.py,sha256=c5Hkimq39eJdZ6DN0_0etjK43-0a5CK_W_3sVLqH87g,33300 | |||
| pip/_internal/exceptions.py,sha256=EIGotnq6qM2nbGtnlgZ8Xp5VfP2W4-9UOCzQGMwy5MY,8899 | |||
| pip/_internal/index.py,sha256=6CAtZ8QTLcpw0fJqQ9OPu-Os1ettLZtVY1pPSKia8r8,34789 | |||
| pip/_internal/locations.py,sha256=ujNrLnA04Y_EmSriO0nS6qkkw_BkPfobB_hdwIDPvpM,6307 | |||
| pip/_internal/pep425tags.py,sha256=TQhxOPss4RjxgyVgxpSRe31HaTcWmn-LVjWBbkvkjzk,10845 | |||
| pip/_internal/pyproject.py,sha256=fpO52MCa3w5xSlXIBXw39BDTGzP8G4570EW34hVvIKQ,5481 | |||
| pip/_internal/resolve.py,sha256=tdepxCewsXXNFKSIYGSxiLvzi1xCv7UVFT9jRCDO90A,13578 | |||
| pip/_internal/wheel.py,sha256=fg9E936DaI1LyrBPHqtzHG_WEVyuUwipHISkD6N3jNw,32007 | |||
| pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 | |||
| pip/_internal/cli/autocompletion.py,sha256=ptvsMdGjq42pzoY4skABVF43u2xAtLJlXAulPi-A10Y,6083 | |||
| pip/_internal/cli/base_command.py,sha256=ke6af4iWzrZoc3HtiPKnCZJvD6GlX8dRwBwpFCg1axc,9963 | |||
| pip/_internal/cli/cmdoptions.py,sha256=WoPPY1uHsDjA_NvZek8Mko38rxraD3pX8eZUkNKvk10,19468 | |||
| pip/_internal/cli/main_parser.py,sha256=Ga_kT7if-Gg0rmmRqlGEHW6JWVm9zwzO7igJm6RE9EI,2763 | |||
| pip/_internal/cli/parser.py,sha256=VZKUKJPbU6I2cHPLDOikin-aCx7OvLcZ3fzYp3xytd8,9378 | |||
| pip/_internal/cli/status_codes.py,sha256=F6uDG6Gj7RNKQJUDnd87QKqI16Us-t-B0wPF_4QMpWc,156 | |||
| pip/_internal/commands/__init__.py,sha256=CQAzhVx9ViPtqLNUvAeqnKj5iWfFEcqMx5RlZWjJ30c,2251 | |||
| pip/_internal/commands/check.py,sha256=CyeYH2kfDKSGSURoBfWtx-sTcZZQP-bK170NmKYlmsg,1398 | |||
| pip/_internal/commands/completion.py,sha256=hqvCvoxsIHjysiD7olHKTqK2lzE1_lS6LWn69kN5qyI,2929 | |||
| pip/_internal/commands/configuration.py,sha256=265HWuUxPggCNcIeWHA3p-LDDiRVnexwFgwmHGgWOHY,7125 | |||
| pip/_internal/commands/download.py,sha256=D_iGMp3xX2iD7KZYZAjXlYT3rf3xjwxyYe05KE-DVzE,6514 | |||
| pip/_internal/commands/freeze.py,sha256=VvS3G0wrm_9BH3B7Ex5msLL_1UQTtCq5G8dDI63Iemo,3259 | |||
| pip/_internal/commands/hash.py,sha256=K1JycsD-rpjqrRcL_ijacY9UKmI82pQcLYq4kCM4Pv0,1681 | |||
| pip/_internal/commands/help.py,sha256=MwBhPJpW1Dt3GfJV3V8V6kgAy_pXT0jGrZJB1wCTW-E,1090 | |||
| pip/_internal/commands/install.py,sha256=tKyzfo5bhDGLVTTQCQJ9PFnDjimQvEWnwIAI2XHpaac,21039 | |||
| pip/_internal/commands/list.py,sha256=n740MsR0cG34EuvGWMzdVl0uIA3UIYx1_95FUsTktN0,10272 | |||
| pip/_internal/commands/search.py,sha256=sLZ9icKMEEGekHvzRRZMiTd1zCFIZeDptyyU1mQCYzk,4728 | |||
| pip/_internal/commands/show.py,sha256=9EVh86vY0NZdlhT-wsuV-zq_MAV6qqV4S1Akn3wkUuw,6289 | |||
| pip/_internal/commands/uninstall.py,sha256=h0gfPF5jylDESx_IHgF6bZME7QAEOHzQHdn65GP-jrE,2963 | |||
| pip/_internal/commands/wheel.py,sha256=ZuVf_DMpKCUzBVstolvQPAeajQRC51Oky5_hDHzhhFs,7020 | |||
| pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 | |||
| pip/_internal/models/candidate.py,sha256=zq2Vb5l5JflrVX7smHTJHQciZWHyoJZuYTLeQa1G16c,741 | |||
| pip/_internal/models/format_control.py,sha256=aDbH4D2XuyaGjtRjTLQhNzClAcLZdJCKSHO8xbZSmFA,2202 | |||
| pip/_internal/models/index.py,sha256=YI1WlhWfS9mVPY0bIboA5la2pjJ2J0qgPJIbvdEjZBk,996 | |||
| pip/_internal/models/link.py,sha256=E61PvS2Wrmb9-zT-eAc_8_xI3C-89wJlpL8SL-mlQmg,3998 | |||
| pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 | |||
| pip/_internal/operations/check.py,sha256=ahcOg5p68nNow6_wy5prYYK0KZq22lm0CsJn8AyDMCI,4937 | |||
| pip/_internal/operations/freeze.py,sha256=lskaBcqf3bPZupG032fuLf76QYv5wpAQ6jsiXac56Bg,10450 | |||
| pip/_internal/operations/prepare.py,sha256=atoLFj3OD5KfXsa5dYBMC_mI06l068F5yZhF4jle1JA,14280 | |||
| pip/_internal/req/__init__.py,sha256=JnNZWvKUQuqAwHh64LCD3zprzWIVQEXChTo2UGHzVqo,2093 | |||
| pip/_internal/req/constructors.py,sha256=97WQp9Svh-Jw3oLZL9_57gJ3zihm5LnWlSRjOwOorDU,9573 | |||
| pip/_internal/req/req_file.py,sha256=ORA0GKUjGd6vy7pmBwXR55FFj4h_OxYykFQ6gHuWvt0,11940 | |||
| pip/_internal/req/req_install.py,sha256=ry1RtNNCefDHAnf3EeGMpea-9pC6Yk1uHzP0Q5p2Un0,34046 | |||
| pip/_internal/req/req_set.py,sha256=nE6oagXJSiQREuuebX3oJO5OHSOVUIlvLLilodetBzc,7264 | |||
| pip/_internal/req/req_tracker.py,sha256=zH28YHV5TXAVh1ZOEZi6Z1Edkiu26dN2tXfR6VbQ3B4,2370 | |||
| pip/_internal/req/req_uninstall.py,sha256=ORSPah64KOVrKo-InMM3zgS5HQqbl5TLHFnE_Lxstq8,16737 | |||
| pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 | |||
| pip/_internal/utils/appdirs.py,sha256=SPfibHtvOKzD_sHrpEZ60HfLae3GharU4Tg7SB3c-XM,9120 | |||
| pip/_internal/utils/compat.py,sha256=LSAvzXcsGY2O2drKIPszR5Ja2G0kup__51l3bx1jR_Q,8015 | |||
| pip/_internal/utils/deprecation.py,sha256=yQTe6dyWlBfxSBrOv_MdRXF1RPLER_EWOp-pa2zLoZc,3021 | |||
| pip/_internal/utils/encoding.py,sha256=D8tmfStCah6xh9OLhH9mWLr77q4akhg580YHJMKpq3Y,1025 | |||
| pip/_internal/utils/filesystem.py,sha256=ZOIHbacJ-SJtuZru4GoA5DuSIYyeaE4G5kfZPf5cn1A,915 | |||
| pip/_internal/utils/glibc.py,sha256=prOrsBjmgkDE-hY4Pl120yF5MIlkkmGrFLs8XfIyT-w,3004 | |||
| pip/_internal/utils/hashes.py,sha256=rJk-gj6F-sHggXAG97dhynqUHFFgApyZLWgaG2xCHME,2900 | |||
| pip/_internal/utils/logging.py,sha256=BQeUDEER3zlK0O4yv6DBfz6TK3f9XoLXyDlnB0mZVf0,6295 | |||
| pip/_internal/utils/misc.py,sha256=YscDfBiFx1spYOtSgdI_5hnc5BZUysWAyz1aVL5y-48,29904 | |||
| pip/_internal/utils/models.py,sha256=DQYZSRhjvSdDTAaJLLCpDtxAn1S_-v_8nlNjv4T2jwY,1042 | |||
| pip/_internal/utils/outdated.py,sha256=BXtCMKR6gjTrvMfP3MWzZ1Y4ZU4qqoCfbRNqQCusVt8,5642 | |||
| pip/_internal/utils/packaging.py,sha256=Ru8ls_S8PPKR8RKEn7jMetENY_A9jPet1HlhTZwpFxU,2443 | |||
| pip/_internal/utils/setuptools_build.py,sha256=0blfscmNJW_iZ5DcswJeDB_PbtTEjfK9RL1R1WEDW2E,278 | |||
| pip/_internal/utils/temp_dir.py,sha256=n2FkVlwRX_hS61fYt3nSAh2e2V6CcZn_dfbPId1pAQE,2615 | |||
| pip/_internal/utils/typing.py,sha256=ztYtZAcqjCYDwP-WlF6EiAAskAsZBMMXtuqvfgZIlgQ,1139 | |||
| pip/_internal/utils/ui.py,sha256=FW8wdtc7DvNwJClGr_TvGZlqcoO482GYe0UY9nKmpso,13657 | |||
| pip/_internal/vcs/__init__.py,sha256=2Ct9ogOwzS6ZKKaEXKN2XDiBOiFHMcejnN1KM21mLrQ,16319 | |||
| pip/_internal/vcs/bazaar.py,sha256=rjskVmSSn68O7lC5JrGmDTWXneXFMMJJvj_bbdSM8QA,3669 | |||
| pip/_internal/vcs/git.py,sha256=n1cFBqTnLIcxAOClZMgOBqELjEjygDBPZ9z-Q7g0qVQ,12580 | |||
| pip/_internal/vcs/mercurial.py,sha256=jVTa0XQpFR6EiBcaqW4E4JjTce_t1tFnKRaIhaIPlS8,3471 | |||
| pip/_internal/vcs/subversion.py,sha256=vDLTfcjj0kgqcEsbPBfveC4CRxyhWiOjke-qN0Zr8CE,7676 | |||
| pip/_vendor/__init__.py,sha256=XnhkujjE1qUGRlYGYbIRrEGYYYBcNLBraE27HH48wYw,4756 | |||
| pip/_vendor/appdirs.py,sha256=BENKsvcA08IpccD9345-rMrg3aXWFA1q6BFEglnHg6I,24547 | |||
| pip/_vendor/distro.py,sha256=dOMrjIXv-3GmEbtP-NJc057Sv19P7ZAdke-v0TBeNio,42455 | |||
| pip/_vendor/ipaddress.py,sha256=2OgbkeAD2rLkcXqbcvof3J5R7lRwjNLoBySyTkBtKnc,79852 | |||
| pip/_vendor/pyparsing.py,sha256=My2ZwDJCEaZkZgZyG9gL--48RLGmf9vnVCTW93rhdYI,226342 | |||
| pip/_vendor/retrying.py,sha256=k3fflf5_Mm0XcIJYhB7Tj34bqCCPhUDkYbx1NvW2FPE,9972 | |||
| pip/_vendor/six.py,sha256=A08MPb-Gi9FfInI3IW7HimXFmEH2T2IPzHgDvdhZPRA,30888 | |||
| pip/_vendor/cachecontrol/__init__.py,sha256=6cRPchVqkAkeUtYTSW8qCetjSqJo-GxP-n4VMVDbvmc,302 | |||
| pip/_vendor/cachecontrol/_cmd.py,sha256=URGE0KrA87QekCG3SGPatlSPT571dZTDjNa-ZXX3pDc,1295 | |||
| pip/_vendor/cachecontrol/adapter.py,sha256=eBGAtVNRZgtl_Kj5JV54miqL9YND-D0JZPahwY8kFtY,4863 | |||
| pip/_vendor/cachecontrol/cache.py,sha256=1fc4wJP8HYt1ycnJXeEw5pCpeBL2Cqxx6g9Fb0AYDWQ,805 | |||
| pip/_vendor/cachecontrol/compat.py,sha256=kHNvMRdt6s_Xwqq_9qJmr9ou3wYMOMUMxPPcwNxT8Mc,695 | |||
| pip/_vendor/cachecontrol/controller.py,sha256=U7g-YwizQ2O5NRgK_MZreF1ntM4E49C3PuF3od-Vwz4,13698 | |||
| pip/_vendor/cachecontrol/filewrapper.py,sha256=vACKO8Llzu_ZWyjV1Fxn1MA4TGU60N5N3GSrAFdAY2Q,2533 | |||
| pip/_vendor/cachecontrol/heuristics.py,sha256=BFGHJ3yQcxvZizfo90LLZ04T_Z5XSCXvFotrp7Us0sc,4070 | |||
| pip/_vendor/cachecontrol/serialize.py,sha256=GebE34fgToyWwAsRPguh8hEPN6CqoG-5hRMXRsjVABQ,6954 | |||
| pip/_vendor/cachecontrol/wrapper.py,sha256=sfr9YHWx-5TwNz1H5rT6QOo8ggII6v3vbEDjQFwR6wc,671 | |||
| pip/_vendor/cachecontrol/caches/__init__.py,sha256=-gHNKYvaeD0kOk5M74eOrsSgIKUtC6i6GfbmugGweEo,86 | |||
| pip/_vendor/cachecontrol/caches/file_cache.py,sha256=8vrSzzGcdfEfICago1uSFbkumNJMGLbCdEkXsmUIExw,4177 | |||
| pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=HxelMpNCo-dYr2fiJDwM3hhhRmxUYtB5tXm1GpAAT4Y,856 | |||
| pip/_vendor/certifi/__init__.py,sha256=5lCYV1iWxoirX1OAaSHkBYUuZGdcwEjEBS6DS_trL0s,63 | |||
| pip/_vendor/certifi/__main__.py,sha256=NaCn6WtWME-zzVWQ2j4zFyl8cY4knDa9CwtHNIeFPhM,53 | |||
| pip/_vendor/certifi/cacert.pem,sha256=XA-4HVBsOrBD5lfg-b3PiUzAvwUd2qlIzwXypIMIRGM,263074 | |||
| pip/_vendor/certifi/core.py,sha256=xPQDdG_siy5A7BfqGWa7RJhcA61xXEqPiSrw9GNyhHE,836 | |||
| pip/_vendor/chardet/__init__.py,sha256=YsP5wQlsHJ2auF1RZJfypiSrCA7_bQiRm3ES_NI76-Y,1559 | |||
| pip/_vendor/chardet/big5freq.py,sha256=D_zK5GyzoVsRes0HkLJziltFQX0bKCLOrFe9_xDvO_8,31254 | |||
| pip/_vendor/chardet/big5prober.py,sha256=kBxHbdetBpPe7xrlb-e990iot64g_eGSLd32lB7_h3M,1757 | |||
| pip/_vendor/chardet/chardistribution.py,sha256=3woWS62KrGooKyqz4zQSnjFbJpa6V7g02daAibTwcl8,9411 | |||
| pip/_vendor/chardet/charsetgroupprober.py,sha256=6bDu8YIiRuScX4ca9Igb0U69TA2PGXXDej6Cc4_9kO4,3787 | |||
| pip/_vendor/chardet/charsetprober.py,sha256=KSmwJErjypyj0bRZmC5F5eM7c8YQgLYIjZXintZNstg,5110 | |||
| pip/_vendor/chardet/codingstatemachine.py,sha256=VYp_6cyyki5sHgXDSZnXW4q1oelHc3cu9AyQTX7uug8,3590 | |||
| pip/_vendor/chardet/compat.py,sha256=PKTzHkSbtbHDqS9PyujMbX74q1a8mMpeQTDVsQhZMRw,1134 | |||
| pip/_vendor/chardet/cp949prober.py,sha256=TZ434QX8zzBsnUvL_8wm4AQVTZ2ZkqEEQL_lNw9f9ow,1855 | |||
| pip/_vendor/chardet/enums.py,sha256=Aimwdb9as1dJKZaFNUH2OhWIVBVd6ZkJJ_WK5sNY8cU,1661 | |||
| pip/_vendor/chardet/escprober.py,sha256=kkyqVg1Yw3DIOAMJ2bdlyQgUFQhuHAW8dUGskToNWSc,3950 | |||
| pip/_vendor/chardet/escsm.py,sha256=RuXlgNvTIDarndvllNCk5WZBIpdCxQ0kcd9EAuxUh84,10510 | |||
| pip/_vendor/chardet/eucjpprober.py,sha256=iD8Jdp0ISRjgjiVN7f0e8xGeQJ5GM2oeZ1dA8nbSeUw,3749 | |||
| pip/_vendor/chardet/euckrfreq.py,sha256=-7GdmvgWez4-eO4SuXpa7tBiDi5vRXQ8WvdFAzVaSfo,13546 | |||
| pip/_vendor/chardet/euckrprober.py,sha256=MqFMTQXxW4HbzIpZ9lKDHB3GN8SP4yiHenTmf8g_PxY,1748 | |||
| pip/_vendor/chardet/euctwfreq.py,sha256=No1WyduFOgB5VITUA7PLyC5oJRNzRyMbBxaKI1l16MA,31621 | |||
| pip/_vendor/chardet/euctwprober.py,sha256=13p6EP4yRaxqnP4iHtxHOJ6R2zxHq1_m8hTRjzVZ95c,1747 | |||
| pip/_vendor/chardet/gb2312freq.py,sha256=JX8lsweKLmnCwmk8UHEQsLgkr_rP_kEbvivC4qPOrlc,20715 | |||
| pip/_vendor/chardet/gb2312prober.py,sha256=gGvIWi9WhDjE-xQXHvNIyrnLvEbMAYgyUSZ65HUfylw,1754 | |||
| pip/_vendor/chardet/hebrewprober.py,sha256=c3SZ-K7hvyzGY6JRAZxJgwJ_sUS9k0WYkvMY00YBYFo,13838 | |||
| pip/_vendor/chardet/jisfreq.py,sha256=vpmJv2Bu0J8gnMVRPHMFefTRvo_ha1mryLig8CBwgOg,25777 | |||
| pip/_vendor/chardet/jpcntx.py,sha256=PYlNqRUQT8LM3cT5FmHGP0iiscFlTWED92MALvBungo,19643 | |||
| pip/_vendor/chardet/langbulgarianmodel.py,sha256=1HqQS9Pbtnj1xQgxitJMvw8X6kKr5OockNCZWfEQrPE,12839 | |||
| pip/_vendor/chardet/langcyrillicmodel.py,sha256=LODajvsetH87yYDDQKA2CULXUH87tI223dhfjh9Zx9c,17948 | |||
| pip/_vendor/chardet/langgreekmodel.py,sha256=8YAW7bU8YwSJap0kIJSbPMw1BEqzGjWzqcqf0WgUKAA,12688 | |||
| pip/_vendor/chardet/langhebrewmodel.py,sha256=JSnqmE5E62tDLTPTvLpQsg5gOMO4PbdWRvV7Avkc0HA,11345 | |||
| pip/_vendor/chardet/langhungarianmodel.py,sha256=RhapYSG5l0ZaO-VV4Fan5sW0WRGQqhwBM61yx3yxyOA,12592 | |||
| pip/_vendor/chardet/langthaimodel.py,sha256=8l0173Gu_W6G8mxmQOTEF4ls2YdE7FxWf3QkSxEGXJQ,11290 | |||
| pip/_vendor/chardet/langturkishmodel.py,sha256=W22eRNJsqI6uWAfwXSKVWWnCerYqrI8dZQTm_M0lRFk,11102 | |||
| pip/_vendor/chardet/latin1prober.py,sha256=S2IoORhFk39FEFOlSFWtgVybRiP6h7BlLldHVclNkU8,5370 | |||
| pip/_vendor/chardet/mbcharsetprober.py,sha256=AR95eFH9vuqSfvLQZN-L5ijea25NOBCoXqw8s5O9xLQ,3413 | |||
| pip/_vendor/chardet/mbcsgroupprober.py,sha256=h6TRnnYq2OxG1WdD5JOyxcdVpn7dG0q-vB8nWr5mbh4,2012 | |||
| pip/_vendor/chardet/mbcssm.py,sha256=SY32wVIF3HzcjY3BaEspy9metbNSKxIIB0RKPn7tjpI,25481 | |||
| pip/_vendor/chardet/sbcharsetprober.py,sha256=LDSpCldDCFlYwUkGkwD2oFxLlPWIWXT09akH_2PiY74,5657 | |||
| pip/_vendor/chardet/sbcsgroupprober.py,sha256=1IprcCB_k1qfmnxGC6MBbxELlKqD3scW6S8YIwdeyXA,3546 | |||
| pip/_vendor/chardet/sjisprober.py,sha256=IIt-lZj0WJqK4rmUZzKZP4GJlE8KUEtFYVuY96ek5MQ,3774 | |||
| pip/_vendor/chardet/universaldetector.py,sha256=qL0174lSZE442eB21nnktT9_VcAye07laFWUeUrjttY,12485 | |||
| pip/_vendor/chardet/utf8prober.py,sha256=IdD8v3zWOsB8OLiyPi-y_fqwipRFxV9Nc1eKBLSuIEw,2766 | |||
| pip/_vendor/chardet/version.py,sha256=sp3B08mrDXB-pf3K9fqJ_zeDHOCLC8RrngQyDFap_7g,242 | |||
| pip/_vendor/chardet/cli/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 | |||
| pip/_vendor/chardet/cli/chardetect.py,sha256=DI8dlV3FBD0c0XA_y3sQ78z754DUv1J8n34RtDjOXNw,2774 | |||
| pip/_vendor/colorama/__init__.py,sha256=V3-Hv_vOa-2lE5Q_0mGkdhZo-9e4XrGTW_44cU81qQY,240 | |||
| pip/_vendor/colorama/ansi.py,sha256=Fi0un-QLqRm-v7o_nKiOqyC8PapBJK7DLV_q9LKtTO0,2524 | |||
| pip/_vendor/colorama/ansitowin32.py,sha256=QrieYX2tsaWIO19P6biMa1zUCt-_abudoEp2_IdqZZU,9668 | |||
| pip/_vendor/colorama/initialise.py,sha256=cHqVJtb82OG7HUCxvQ2joG7N_CoxbIKbI_fgryZkj20,1917 | |||
| pip/_vendor/colorama/win32.py,sha256=5Hc7L1LabubrYDhdWAfRyzlt14ErP3YKDvf_zYaarLk,5426 | |||
| pip/_vendor/colorama/winterm.py,sha256=V7U7ojwG1q4n6PKripjEvW_htYQi5ueXSM3LUUoqqDY,6290 | |||
| pip/_vendor/distlib/__init__.py,sha256=GxRrh1augb66Eo9NB9jrdwQS02KcBypj9o_-C3oyKZI,581 | |||
| pip/_vendor/distlib/compat.py,sha256=xdNZmqFN5HwF30HjRn5M415pcC2kgXRBXn767xS8v-M,41404 | |||
| pip/_vendor/distlib/database.py,sha256=LqTcNkDyV4bWcc_qDxiYJHnXaNxFs1O1bFSAg_reaI0,50868 | |||
| pip/_vendor/distlib/index.py,sha256=Dd1kIV06XIdynNpKxHMMRRIKsXuoUsG7QIzntfVtZCI,21073 | |||
| pip/_vendor/distlib/locators.py,sha256=e4UaQSzNg5iG3PfQRH6lnVMfLOwhm2sVmGGRdjdB3ik,51657 | |||
| pip/_vendor/distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811 | |||
| pip/_vendor/distlib/markers.py,sha256=6Ac3cCfFBERexiESWIOXmg-apIP8l2esafNSX3KMy-8,4387 | |||
| pip/_vendor/distlib/metadata.py,sha256=Ns92dqeMxopDPQsiEWnhMtd4RagJaA58lz8O_vjCxyk,39986 | |||
| pip/_vendor/distlib/resources.py,sha256=2FGv0ZHF14KXjLIlL0R991lyQQGcewOS4mJ-5n-JVnc,10766 | |||
| pip/_vendor/distlib/scripts.py,sha256=WEqXkpRvqR6oe-QlMRYg8gEJxXRWJeWn1GPc0ihZ4N0,16585 | |||
| pip/_vendor/distlib/t32.exe,sha256=ftub1bsSPUCOnBn-eCtcarKTk0N0CBEP53BumkIxWJE,92672 | |||
| pip/_vendor/distlib/t64.exe,sha256=iChOG627LWTHY8-jzSwlo9SYU5a-0JHwQu4AqDz8I68,102400 | |||
| pip/_vendor/distlib/util.py,sha256=FnzjaibVcIg1xOtET6QPNeqTnn3LcWLCjNOficMyGKA,59494 | |||
| pip/_vendor/distlib/version.py,sha256=_n7F6juvQGAcn769E_SHa7fOcf5ERlEVymJ_EjPRwGw,23391 | |||
| pip/_vendor/distlib/w32.exe,sha256=NPYPpt7PIjVqABEu1CzabbDyHHkJpuw-_qZq_48H0j0,89088 | |||
| pip/_vendor/distlib/w64.exe,sha256=Yb-qr1OQEzL8KRGTk-XHUZDwMSljfQeZnVoTk-K4e7E,99328 | |||
| pip/_vendor/distlib/wheel.py,sha256=W9aKwi4CQL_bQFYb8IcwH-c6WK-yku5P8SY3RGPv-Mk,39506 | |||
| pip/_vendor/distlib/_backport/__init__.py,sha256=bqS_dTOH6uW9iGgd0uzfpPjo6vZ4xpPZ7kyfZJ2vNaw,274 | |||
| pip/_vendor/distlib/_backport/misc.py,sha256=KWecINdbFNOxSOP1fGF680CJnaC6S4fBRgEtaYTw0ig,971 | |||
| pip/_vendor/distlib/_backport/shutil.py,sha256=VW1t3uYqUjWZH7jV-6QiimLhnldoV5uIpH4EuiT1jfw,25647 | |||
| pip/_vendor/distlib/_backport/sysconfig.cfg,sha256=swZKxq9RY5e9r3PXCrlvQPMsvOdiWZBTHLEbqS8LJLU,2617 | |||
| pip/_vendor/distlib/_backport/sysconfig.py,sha256=JdJ9ztRy4Hc-b5-VS74x3nUtdEIVr_OBvMsIb8O2sjc,26964 | |||
| pip/_vendor/distlib/_backport/tarfile.py,sha256=Ihp7rXRcjbIKw8COm9wSePV9ARGXbSF9gGXAMn2Q-KU,92628 | |||
| pip/_vendor/html5lib/__init__.py,sha256=Ztrn7UvF-wIFAgRBBa0ML-Gu5AffH3BPX_INJx4SaBI,1162 | |||
| pip/_vendor/html5lib/_ihatexml.py,sha256=3LBtJMlzgwM8vpQiU1TvGmEEmNH72sV0yD8yS53y07A,16705 | |||
| pip/_vendor/html5lib/_inputstream.py,sha256=bPUWcAfJScK4xkjQQaG_HsI2BvEVbFvI0AsodDYPQj0,32552 | |||
| pip/_vendor/html5lib/_tokenizer.py,sha256=YAaOEBD6qc5ISq9Xt9Nif1OFgcybTTfMdwqBkZhpAq4,76580 | |||
| pip/_vendor/html5lib/_utils.py,sha256=ismpASeqa2jqEPQjHUj8vReAf7yIoKnvLN5fuOw6nv0,4015 | |||
| pip/_vendor/html5lib/constants.py,sha256=4lmZWLtEPRLnl8NzftOoYTJdo6jpeMtP6dqQC0g_bWQ,83518 | |||
| pip/_vendor/html5lib/html5parser.py,sha256=g5g2ezkusHxhi7b23vK_-d6K6BfIJRbqIQmvQ9z4EgI,118963 | |||
| pip/_vendor/html5lib/serializer.py,sha256=yfcfBHse2wDs6ojxn-kieJjLT5s1ipilQJ0gL3-rJis,15758 | |||
| pip/_vendor/html5lib/_trie/__init__.py,sha256=8VR1bcgD2OpeS2XExpu5yBhP_Q1K-lwKbBKICBPf1kU,289 | |||
| pip/_vendor/html5lib/_trie/_base.py,sha256=uJHVhzif9S0MJXgy9F98iEev5evi_rgUk5BmEbUSp8c,930 | |||
| pip/_vendor/html5lib/_trie/datrie.py,sha256=EQpqSfkZRuTbE-DuhW7xMdVDxdZNZ0CfmnYfHA_3zxM,1178 | |||
| pip/_vendor/html5lib/_trie/py.py,sha256=wXmQLrZRf4MyWNyg0m3h81m9InhLR7GJ002mIIZh-8o,1775 | |||
| pip/_vendor/html5lib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 | |||
| pip/_vendor/html5lib/filters/alphabeticalattributes.py,sha256=lViZc2JMCclXi_5gduvmdzrRxtO5Xo9ONnbHBVCsykU,919 | |||
| pip/_vendor/html5lib/filters/base.py,sha256=z-IU9ZAYjpsVsqmVt7kuWC63jR11hDMr6CVrvuao8W0,286 | |||
| pip/_vendor/html5lib/filters/inject_meta_charset.py,sha256=egDXUEHXmAG9504xz0K6ALDgYkvUrC2q15YUVeNlVQg,2945 | |||
| pip/_vendor/html5lib/filters/lint.py,sha256=jk6q56xY0ojiYfvpdP-OZSm9eTqcAdRqhCoPItemPYA,3643 | |||
| pip/_vendor/html5lib/filters/optionaltags.py,sha256=8lWT75J0aBOHmPgfmqTHSfPpPMp01T84NKu0CRedxcE,10588 | |||
| pip/_vendor/html5lib/filters/sanitizer.py,sha256=4ON02KNjuqda1lCw5_JCUZxb0BzWR5M7ON84dtJ7dm0,26248 | |||
| pip/_vendor/html5lib/filters/whitespace.py,sha256=8eWqZxd4UC4zlFGW6iyY6f-2uuT8pOCSALc3IZt7_t4,1214 | |||
| pip/_vendor/html5lib/treeadapters/__init__.py,sha256=A0rY5gXIe4bJOiSGRO_j_tFhngRBO8QZPzPtPw5dFzo,679 | |||
| pip/_vendor/html5lib/treeadapters/genshi.py,sha256=CH27pAsDKmu4ZGkAUrwty7u0KauGLCZRLPMzaO3M5vo,1715 | |||
| pip/_vendor/html5lib/treeadapters/sax.py,sha256=BKS8woQTnKiqeffHsxChUqL4q2ZR_wb5fc9MJ3zQC8s,1776 | |||
| pip/_vendor/html5lib/treebuilders/__init__.py,sha256=AysSJyvPfikCMMsTVvaxwkgDieELD5dfR8FJIAuq7hY,3592 | |||
| pip/_vendor/html5lib/treebuilders/base.py,sha256=wQGp5yy22TNG8tJ6aREe4UUeTR7A99dEz0BXVaedWb4,14579 | |||
| pip/_vendor/html5lib/treebuilders/dom.py,sha256=SY3MsijXyzdNPc8aK5IQsupBoM8J67y56DgNtGvsb9g,8835 | |||
| pip/_vendor/html5lib/treebuilders/etree.py,sha256=aqIBOGj_dFYqBURIcTegGNBhAIJOw5iFDHb4jrkYH-8,12764 | |||
| pip/_vendor/html5lib/treebuilders/etree_lxml.py,sha256=9V0dXxbJYYq-Skgb5-_OL2NkVYpjioEb4CHajo0e9yI,14122 | |||
| pip/_vendor/html5lib/treewalkers/__init__.py,sha256=yhXxHpjlSqfQyUag3v8-vWjMPriFBU8YRAPNpDgBTn8,5714 | |||
| pip/_vendor/html5lib/treewalkers/base.py,sha256=ouiOsuSzvI0KgzdWP8PlxIaSNs9falhbiinAEc_UIJY,7476 | |||
| pip/_vendor/html5lib/treewalkers/dom.py,sha256=EHyFR8D8lYNnyDU9lx_IKigVJRyecUGua0mOi7HBukc,1413 | |||
| pip/_vendor/html5lib/treewalkers/etree.py,sha256=sz1o6mmE93NQ53qJFDO7HKyDtuwgK-Ay3qSFZPC6u00,4550 | |||
| pip/_vendor/html5lib/treewalkers/etree_lxml.py,sha256=sY6wfRshWTllu6n48TPWpKsQRPp-0CQrT0hj_AdzHSU,6309 | |||
| pip/_vendor/html5lib/treewalkers/genshi.py,sha256=4D2PECZ5n3ZN3qu3jMl9yY7B81jnQApBQSVlfaIuYbA,2309 | |||
| pip/_vendor/idna/__init__.py,sha256=9Nt7xpyet3DmOrPUGooDdAwmHZZu1qUAy2EaJ93kGiQ,58 | |||
| pip/_vendor/idna/codec.py,sha256=lvYb7yu7PhAqFaAIAdWcwgaWI2UmgseUua-1c0AsG0A,3299 | |||
| pip/_vendor/idna/compat.py,sha256=R-h29D-6mrnJzbXxymrWUW7iZUvy-26TQwZ0ij57i4U,232 | |||
| pip/_vendor/idna/core.py,sha256=OwI5R_uuXU4PlOSoG8cjaMPA1hhdGGjjZ8I2MZhSPxo,11858 | |||
| pip/_vendor/idna/idnadata.py,sha256=zwxvoSsYqPHNa6xzXWHizXpDC28JJMGXRinhJ4Gkcz0,39285 | |||
| pip/_vendor/idna/intranges.py,sha256=TY1lpxZIQWEP6tNqjZkFA5hgoMWOj1OBmnUG8ihT87E,1749 | |||
| pip/_vendor/idna/package_data.py,sha256=Vt9rtr32BzO7O25rypo8nzAs3syTJhG1ojU3J-s2RFo,21 | |||
| pip/_vendor/idna/uts46data.py,sha256=czULzYN5Lr9K5MmOH-1g3CJY7QPjGeHjYmC3saJ_BHk,197803 | |||
| pip/_vendor/lockfile/__init__.py,sha256=Tqpz90DwKYfhPsfzVOJl84TL87pdFE5ePNHdXAxs4Tk,9371 | |||
| pip/_vendor/lockfile/linklockfile.py,sha256=C7OH3H4GdK68u4FQgp8fkP2kO4fyUTSyj3X6blgfobc,2652 | |||
| pip/_vendor/lockfile/mkdirlockfile.py,sha256=e3qgIL-etZMLsS-3ft19iW_8IQ360HNkGOqE3yBKsUw,3096 | |||
| pip/_vendor/lockfile/pidlockfile.py,sha256=ukH9uk6NFuxyVmG5QiWw4iKq3fT7MjqUguX95avYPIY,6090 | |||
| pip/_vendor/lockfile/sqlitelockfile.py,sha256=o2TMkMRY0iwn-iL1XMRRIFStMUkS4i3ajceeYNntKFg,5506 | |||
| pip/_vendor/lockfile/symlinklockfile.py,sha256=ABwXXmvTHvCl5viPblShL3PG-gGsLiT1roAMfDRwhi8,2616 | |||
| pip/_vendor/msgpack/__init__.py,sha256=y0bk2YbzK6J2e0J_dyreN6nD7yM2IezT6m_tU2h-Mdg,1677 | |||
| pip/_vendor/msgpack/_version.py,sha256=dN7wVIjbyuQIJ35B2o6gymQNDLPlj_7-uTfgCv7KErM,20 | |||
| pip/_vendor/msgpack/exceptions.py,sha256=lPkAi_u12NlFajDz4FELSHEdfU8hrR3zeTvKX8aQuz4,1056 | |||
| pip/_vendor/msgpack/fallback.py,sha256=h0ll8xnq12mI9PuQ9Qd_Ihtt08Sp8L0JqhG9KY8Vyjk,36411 | |||
| pip/_vendor/packaging/__about__.py,sha256=mH-sMIEu48PzdYakZ6Y6OBzL3TlSetzz1fQSkCXiy30,720 | |||
| pip/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 | |||
| pip/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 | |||
| pip/_vendor/packaging/_structures.py,sha256=DCpKtb7u94_oqgVsIJQTrTyZcb3Gz7sSGbk9vYDMME0,1418 | |||
| pip/_vendor/packaging/markers.py,sha256=ftZegBU5oEmulEKApDGEPgti2lYIchFQHAfH9tZy3_U,8221 | |||
| pip/_vendor/packaging/requirements.py,sha256=xIWdoZXVKhUHxqFP5xmnKylM7NHXQS48hUfIIX1PvY0,4439 | |||
| pip/_vendor/packaging/specifiers.py,sha256=pFp716eLYBRt0eLNsy6cnWD9dyMKq-Zag7bsLbLv4Fs,28026 | |||
| pip/_vendor/packaging/utils.py,sha256=c9obOpok2CpKDApkc2M5ma0YFnT-jtt4I6XI4F0jYiI,1580 | |||
| pip/_vendor/packaging/version.py,sha256=MKL8nbKLPLGPouIwFvwSVnYRzNpkMo5AIcsa6LGqDF8,12219 | |||
| pip/_vendor/pep517/__init__.py,sha256=GH4HshnLERtjAjkY0zHoz3f7-35UcIvr27iFWSOUazU,82 | |||
| pip/_vendor/pep517/_in_process.py,sha256=iWpagFk2GhNBbvl-Ca2RagfD0ALuits4WWSM6nQMTdg,5831 | |||
| pip/_vendor/pep517/check.py,sha256=Yp2NHW71DIOCgkFb7HKJOzKmsum_s_OokRP6HnR3bTg,5761 | |||
| pip/_vendor/pep517/colorlog.py,sha256=2AJuPI_DHM5T9IDgcTwf0E8suyHAFnfsesogr0AB7RQ,4048 | |||
| pip/_vendor/pep517/compat.py,sha256=4SFG4QN-cNj8ebSa0wV0HUtEEQWwmbok2a0uk1gYEOM,631 | |||
| pip/_vendor/pep517/envbuild.py,sha256=osRsJVd7hir1w_uFXiVeeWxfJ3iYhwxsKRgNBWpqtCI,5672 | |||
| pip/_vendor/pep517/wrappers.py,sha256=RhgWm-MLxpYPgc9cZ3-A3ToN99ZzgM8-ia4FDB58koM,5018 | |||
| pip/_vendor/pkg_resources/__init__.py,sha256=ykZI7-YBIAQ7ztWf0RskP8Oy1VQU88o-16PJbIMCtLg,103915 | |||
| pip/_vendor/pkg_resources/py31compat.py,sha256=CRk8fkiPRDLsbi5pZcKsHI__Pbmh_94L8mr9Qy9Ab2U,562 | |||
| pip/_vendor/progress/__init__.py,sha256=Hv3Y8Hr6RyM34NdZkrZQWMURjS2h5sONRHJSvZXWZgQ,3188 | |||
| pip/_vendor/progress/bar.py,sha256=hlkDAEv9pRRiWqR5XL6vIAgMG4u_dBGEW_8klQhBRq0,2942 | |||
| pip/_vendor/progress/counter.py,sha256=XtBuZY4yYmr50E2A_fAzjWhm0IkwaVwxNsNVYDE7nsw,1528 | |||
| pip/_vendor/progress/helpers.py,sha256=6FsBLh_xUlKiVua-zZIutCjxth-IO8FtyUj6I2tx9fg,2952 | |||
| pip/_vendor/progress/spinner.py,sha256=m7bASI2GUbLFG-PbAefdHtrrWWlJLFhhSBbw70gp2TY,1439 | |||
| pip/_vendor/pytoml/__init__.py,sha256=q12Xv23Tta44gtK4HGK68Gr4tKfciILidFPmPuoIqIo,92 | |||
| pip/_vendor/pytoml/core.py,sha256=9CrLLTs1PdWjEwRnYzt_i4dhHcZvGxs_GsMlYAX3iY4,509 | |||
| pip/_vendor/pytoml/parser.py,sha256=mcTzHB2GQGyK8KVwuQ0EraSz_78O36U60NqHBtgVmV0,11247 | |||
| pip/_vendor/pytoml/writer.py,sha256=-mSOVGaiGLrpj5BRR7czmquZXJGflcElHrwAd33J48A,3815 | |||
| pip/_vendor/requests/__init__.py,sha256=OrwNk1JwZGqIQ4JVGgMbfpstqey-oHS_Re_Dw6D4ciI,4209 | |||
| pip/_vendor/requests/__version__.py,sha256=rJ2xgNOLhjspGkNPfgXTBctqqvsf2uJMFTaE0rlVtbI,436 | |||
| pip/_vendor/requests/_internal_utils.py,sha256=Zx3PnEUccyfsB-ie11nZVAW8qClJy0gx1qNME7rgT18,1096 | |||
| pip/_vendor/requests/adapters.py,sha256=y5DISepvSsGlu3II_VUsdgKBej1dGY4b5beRrTE2tsI,21428 | |||
| pip/_vendor/requests/api.py,sha256=zub9ENcEUT2m9gwgBgqH5RIRDfrx2kwRpZ7L6hX3mcw,6261 | |||
| pip/_vendor/requests/auth.py,sha256=oRSQkBYcLkTEssudkzoR1UW1Glb1ts3p1RWusgHf1YU,10208 | |||
| pip/_vendor/requests/certs.py,sha256=nXRVq9DtGmv_1AYbwjTu9UrgAcdJv05ZvkNeaoLOZxY,465 | |||
| pip/_vendor/requests/compat.py,sha256=7EC6fZY4dJDxuBQnqUGwe13OTZ3VLGO3QfOApE5lE3I,1998 | |||
| pip/_vendor/requests/cookies.py,sha256=olUaLeNci_z1K-Bn5PeEKllSspmQqN9-s8Ug7CasaPE,18346 | |||
| pip/_vendor/requests/exceptions.py,sha256=-mLam3TAx80V09EaH3H-ZxR61eAVuLRZ8zgBBSLjK44,3197 | |||
| pip/_vendor/requests/help.py,sha256=T4K-Oo_FS9fxF8NHVR8hxMwFo71gIkRM7UddCc9vH7Y,3669 | |||
| pip/_vendor/requests/hooks.py,sha256=HXAHoC1FNTFRZX6-lNdvPM7Tst4kvGwYTN-AOKRxoRU,767 | |||
| pip/_vendor/requests/models.py,sha256=3fmmYdDW7U18SrVeZaseHuk8KPI-7vLp_435DY3ejes,34160 | |||
| pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695 | |||
| pip/_vendor/requests/sessions.py,sha256=71MK2HCadovka1vAx9dyDFWAuw69KgRPRBpd0HWSEAo,27829 | |||
| pip/_vendor/requests/status_codes.py,sha256=pgw-xlnxO5zHQWn3fKps2cxwQehKzPxEbdhIrMQe6Ec,4128 | |||
| pip/_vendor/requests/structures.py,sha256=zoP8qly2Jak5e89HwpqjN1z2diztI-_gaqts1raJJBc,2981 | |||
| pip/_vendor/requests/utils.py,sha256=3OxbbLUQFVdm84fdBD9nduXvhw6hIzj59mhvBomKuJI,30156 | |||
| pip/_vendor/urllib3/__init__.py,sha256=DZucS8tlzGYKmK5FIsyUViMghpCq_0_0Ouvm_Jp9GNc,2853 | |||
| pip/_vendor/urllib3/_collections.py,sha256=iNeAU_we9L3lMGRUKKdq24Mf7o050TXP5U4Jm9AzAY4,10841 | |||
| pip/_vendor/urllib3/connection.py,sha256=My76qeWMDkV-KP1l3iChXHOE7J-ZCaUdP3sPIiLA2uE,14485 | |||
| pip/_vendor/urllib3/connectionpool.py,sha256=w20OwKdIqk6f8FIl6QGgn6jf9gZ0-tmgH7VPxnpEgkQ,35464 | |||
| pip/_vendor/urllib3/exceptions.py,sha256=rFeIfBNKC8KJ61ux-MtJyJlEC9G9ggkmCeF751JwVR4,6604 | |||
| pip/_vendor/urllib3/fields.py,sha256=D_TE_SK15YatdbhWDMN0OE3X6UCJn1RTkANINCYOobE,5943 | |||
| pip/_vendor/urllib3/filepost.py,sha256=40CROlpRKVBpFUkD0R6wJf_PpvbcRQRFUu0OOQlFkKM,2436 | |||
| pip/_vendor/urllib3/poolmanager.py,sha256=FHBjb7odbP2LyQRzeitgpuh1AQAPyegzmrm2b3gSZlY,16821 | |||
| pip/_vendor/urllib3/request.py,sha256=fwjlq5nQfcUa7aoncR25z6-fJAX_oNTcPksKKGjBm38,5996 | |||
| pip/_vendor/urllib3/response.py,sha256=uAuOTZSuTodzvQWIDCZghDoKmZ2bKbgIRCfaVIIZfn8,24667 | |||
| pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 | |||
| pip/_vendor/urllib3/contrib/appengine.py,sha256=Q3BDy5C_TrI-3cSyo0ELNGlNiK2eSVptQAQMdz4PH9Q,11197 | |||
| pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=Q9-rO5Rh2-IqyEd4ZicpTDfMnOlf0IPPCkjhChBCjV4,4478 | |||
| pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=cM7fVZJRrdLZsprcdWe3meM_hvq8LR73UNDveIMa-20,15480 | |||
| pip/_vendor/urllib3/contrib/securetransport.py,sha256=BqXSlChN9_hjCWgyN6JdcgvBUdc37QCCX4u3_8zE_9o,30309 | |||
| pip/_vendor/urllib3/contrib/socks.py,sha256=Iom0snbHkCuZbZ7Sle2Kueha1W0jYAJ0SyCOtePLaio,6391 | |||
| pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 | |||
| pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=x2kLSh-ASZKsun0FxtraBuLVe3oHuth4YW6yZ5Vof-w,17560 | |||
| pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=Umy5u-3Z957GirdapnicXVOpHaM4xdOZABJuJxfaeJA,12162 | |||
| pip/_vendor/urllib3/packages/__init__.py,sha256=nlChrGzkjCkmhCX9HrF_qHPUgosfsPQkVIJxiiLhk9g,109 | |||
| pip/_vendor/urllib3/packages/ordered_dict.py,sha256=VQaPONfhVMsb8B63Xg7ZOydJqIE_jzeMhVN3Pec6ogw,8935 | |||
| pip/_vendor/urllib3/packages/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 | |||
| pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 | |||
| pip/_vendor/urllib3/packages/backports/makefile.py,sha256=r1IADol_pBBq2Y1ub4CPyuS2hXuShK47nfFngZRcRhI,1461 | |||
| pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py,sha256=WBVbxQBojNAxfZwNavkox3BgJiMA9BJmm-_fwd0jD_o,688 | |||
| pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py,sha256=XCW0ydHg171GfOqNbvUAnRzQ0lc0twp5-dIlolgf4RM,5719 | |||
| pip/_vendor/urllib3/util/__init__.py,sha256=6Ran4oAVIy40Cu_oEPWnNV9bwF5rXx6G1DUZ7oehjPY,1044 | |||
| pip/_vendor/urllib3/util/connection.py,sha256=8K1VXm8BHsM3QATJJGBNRa_MStkzDy1Da2IaPAaCU8c,4279 | |||
| pip/_vendor/urllib3/util/queue.py,sha256=myTX3JDHntglKQNBf3b6dasHH-uF-W59vzGSQiFdAfI,497 | |||
| pip/_vendor/urllib3/util/request.py,sha256=H5_lrHvtwl2U2BbT1UYN9HpruNc1gsNFlz2njQmhPrQ,3705 | |||
| pip/_vendor/urllib3/util/response.py,sha256=SSNL888W-MQ8t3HAi44kNGgF682p6H__ytEXzBYxV_M,2343 | |||
| pip/_vendor/urllib3/util/retry.py,sha256=tlxiEq8OU2BSenPpPjYYO1URne8A-qTEgaykam6rZPg,15104 | |||
| pip/_vendor/urllib3/util/ssl_.py,sha256=iHJopgSv8_vXfmGg3lOsTS3ldMD9zhe130huHZxQEGU,14022 | |||
| pip/_vendor/urllib3/util/timeout.py,sha256=7lHNrgL5YH2cI1j-yZnzV_J8jBlRVdmFhQaNyM1_2b8,9757 | |||
| pip/_vendor/urllib3/util/url.py,sha256=qCY_HHUXvo05wAsEERALgExtlgxLnAHSQ7ce1b-g3SM,6487 | |||
| pip/_vendor/urllib3/util/wait.py,sha256=_4vvsT1BTTpqxQYK-2kXVfGsUsVRiuc4R4F-0Bf5BPc,5468 | |||
| pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579 | |||
| pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979 | |||
| pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305 | |||
| pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563 | |||
| pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307 | |||
| pip-18.1.dist-info/LICENSE.txt,sha256=ORqHhOMZ2uVDFHfUzJvFBPxdcf2eieHIDxzThV9dfPo,1090 | |||
| pip-18.1.dist-info/METADATA,sha256=D7pqBJTuqM9w_HTW91a0XGjLT9vynlBAE4pPCt_W_UE,2588 | |||
| pip-18.1.dist-info/WHEEL,sha256=8T8fxefr_r-A79qbOJ9d_AaEgkpCGmEPHc-gpCq5BRg,110 | |||
| pip-18.1.dist-info/entry_points.txt,sha256=S_zfxY25QtQDVY1BiLAmOKSkkI5llzCKPLiYOSEupsY,98 | |||
| pip-18.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 | |||
| pip-18.1.dist-info/RECORD,, | |||
| ../../../bin/pip,sha256=KidZwfbAuZ5Jc6z17Rci424tdd3F0cL2CKRQufrOipM,261 | |||
| ../../../bin/pip2,sha256=KidZwfbAuZ5Jc6z17Rci424tdd3F0cL2CKRQufrOipM,261 | |||
| ../../../bin/pip2.7,sha256=KidZwfbAuZ5Jc6z17Rci424tdd3F0cL2CKRQufrOipM,261 | |||
| pip-18.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 | |||
| pip/_internal/models/link.pyc,, | |||
| pip/_vendor/urllib3/util/queue.pyc,, | |||
| pip/_vendor/requests/compat.pyc,, | |||
| pip/_internal/utils/filesystem.pyc,, | |||
| pip/_internal/utils/models.pyc,, | |||
| pip/_vendor/requests/certs.pyc,, | |||
| pip/_vendor/distlib/util.pyc,, | |||
| pip/_vendor/progress/spinner.pyc,, | |||
| pip/_vendor/html5lib/_tokenizer.pyc,, | |||
| pip/_internal/cli/autocompletion.pyc,, | |||
| pip/__init__.pyc,, | |||
| pip/_vendor/chardet/euckrprober.pyc,, | |||
| pip/_internal/commands/list.pyc,, | |||
| pip/_internal/utils/logging.pyc,, | |||
| pip/_vendor/cachecontrol/cache.pyc,, | |||
| pip/_vendor/distlib/_backport/__init__.pyc,, | |||
| pip/_vendor/distlib/metadata.pyc,, | |||
| pip/_vendor/chardet/hebrewprober.pyc,, | |||
| pip/_vendor/webencodings/tests.pyc,, | |||
| pip/_vendor/html5lib/treebuilders/__init__.pyc,, | |||
| pip/_vendor/html5lib/filters/alphabeticalattributes.pyc,, | |||
| pip/_internal/req/req_file.pyc,, | |||
| pip/_vendor/requests/adapters.pyc,, | |||
| pip/_vendor/chardet/euctwprober.pyc,, | |||
| pip/_vendor/msgpack/exceptions.pyc,, | |||
| pip/_vendor/urllib3/contrib/_securetransport/bindings.pyc,, | |||
| pip/_internal/models/candidate.pyc,, | |||
| pip/_vendor/html5lib/filters/lint.pyc,, | |||
| pip/_internal/models/__init__.pyc,, | |||
| pip/_vendor/chardet/enums.pyc,, | |||
| pip/_vendor/packaging/__init__.pyc,, | |||
| pip/_vendor/lockfile/symlinklockfile.pyc,, | |||
| pip/_vendor/packaging/utils.pyc,, | |||
| pip/_vendor/html5lib/filters/whitespace.pyc,, | |||
| pip/_vendor/idna/codec.pyc,, | |||
| pip/_vendor/distlib/database.pyc,, | |||
| pip/_vendor/html5lib/treeadapters/sax.pyc,, | |||
| pip/_vendor/urllib3/contrib/socks.pyc,, | |||
| pip/_vendor/requests/auth.pyc,, | |||
| pip/_vendor/chardet/compat.pyc,, | |||
| pip/_vendor/packaging/__about__.pyc,, | |||
| pip/_vendor/progress/__init__.pyc,, | |||
| pip/_internal/resolve.pyc,, | |||
| pip/_vendor/chardet/__init__.pyc,, | |||
| pip/_vendor/webencodings/__init__.pyc,, | |||
| pip/_vendor/urllib3/exceptions.pyc,, | |||
| pip/_internal/utils/appdirs.pyc,, | |||
| pip/_vendor/chardet/langhebrewmodel.pyc,, | |||
| pip/_vendor/html5lib/filters/sanitizer.pyc,, | |||
| pip/_internal/pyproject.pyc,, | |||
| pip/_vendor/urllib3/contrib/_securetransport/__init__.pyc,, | |||
| pip/_vendor/pytoml/core.pyc,, | |||
| pip/_internal/commands/hash.pyc,, | |||
| pip/_internal/utils/packaging.pyc,, | |||
| pip/_vendor/lockfile/linklockfile.pyc,, | |||
| pip/_internal/utils/temp_dir.pyc,, | |||
| pip/_vendor/certifi/__main__.pyc,, | |||
| pip/_internal/commands/wheel.pyc,, | |||
| pip/_vendor/chardet/sbcharsetprober.pyc,, | |||
| pip/_internal/commands/__init__.pyc,, | |||
| pip/_vendor/urllib3/filepost.pyc,, | |||
| pip/_vendor/html5lib/_trie/_base.pyc,, | |||
| pip/_internal/commands/freeze.pyc,, | |||
| pip/_vendor/chardet/big5freq.pyc,, | |||
| pip/_vendor/certifi/core.pyc,, | |||
| pip/_vendor/urllib3/connectionpool.pyc,, | |||
| pip/_vendor/colorama/win32.pyc,, | |||
| pip/_vendor/distlib/resources.pyc,, | |||
| pip/_vendor/chardet/mbcssm.pyc,, | |||
| pip/_vendor/lockfile/__init__.pyc,, | |||
| pip/_vendor/chardet/langgreekmodel.pyc,, | |||
| pip/_internal/cli/status_codes.pyc,, | |||
| pip/_internal/utils/compat.pyc,, | |||
| pip/_vendor/progress/helpers.pyc,, | |||
| pip/_vendor/ipaddress.pyc,, | |||
| pip/_vendor/pep517/_in_process.pyc,, | |||
| pip/_vendor/pyparsing.pyc,, | |||
| pip/_vendor/html5lib/__init__.pyc,, | |||
| pip/_vendor/urllib3/response.pyc,, | |||
| pip/_internal/req/req_tracker.pyc,, | |||
| pip/_vendor/urllib3/contrib/securetransport.pyc,, | |||
| pip/_vendor/distlib/_backport/misc.pyc,, | |||
| pip/_vendor/chardet/universaldetector.pyc,, | |||
| pip/_vendor/chardet/jpcntx.pyc,, | |||
| pip/_vendor/urllib3/util/response.pyc,, | |||
| pip/_vendor/urllib3/__init__.pyc,, | |||
| pip/_vendor/chardet/cli/__init__.pyc,, | |||
| pip/_vendor/cachecontrol/controller.pyc,, | |||
| pip/_vendor/chardet/version.pyc,, | |||
| pip/_internal/cli/parser.pyc,, | |||
| pip/_vendor/distlib/_backport/sysconfig.pyc,, | |||
| pip/_vendor/chardet/escprober.pyc,, | |||
| pip/_internal/commands/completion.pyc,, | |||
| pip/_vendor/urllib3/packages/six.pyc,, | |||
| pip/_internal/utils/typing.pyc,, | |||
| pip/_internal/build_env.pyc,, | |||
| pip/_vendor/html5lib/_utils.pyc,, | |||
| pip/_vendor/html5lib/_trie/datrie.pyc,, | |||
| pip/_vendor/chardet/langthaimodel.pyc,, | |||
| pip/_internal/configuration.pyc,, | |||
| pip/_vendor/pkg_resources/py31compat.pyc,, | |||
| pip/_vendor/chardet/latin1prober.pyc,, | |||
| pip/_vendor/msgpack/_version.pyc,, | |||
| pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.pyc,, | |||
| pip/_vendor/chardet/chardistribution.pyc,, | |||
| pip/_internal/req/__init__.pyc,, | |||
| pip/_internal/utils/misc.pyc,, | |||
| pip/_vendor/html5lib/treeadapters/genshi.pyc,, | |||
| pip/_vendor/idna/__init__.pyc,, | |||
| pip/_vendor/urllib3/util/url.pyc,, | |||
| pip/_vendor/lockfile/mkdirlockfile.pyc,, | |||
| pip/_vendor/requests/utils.pyc,, | |||
| pip/_internal/wheel.pyc,, | |||
| pip/_vendor/urllib3/util/__init__.pyc,, | |||
| pip/_vendor/colorama/__init__.pyc,, | |||
| pip/_internal/commands/download.pyc,, | |||
| pip/_vendor/packaging/_compat.pyc,, | |||
| pip/_vendor/distlib/version.pyc,, | |||
| pip/_vendor/distlib/wheel.pyc,, | |||
| pip/_vendor/pytoml/writer.pyc,, | |||
| pip/_vendor/idna/uts46data.pyc,, | |||
| pip/_vendor/distlib/index.pyc,, | |||
| pip/_vendor/pep517/colorlog.pyc,, | |||
| pip/_vendor/cachecontrol/heuristics.pyc,, | |||
| pip/_vendor/requests/sessions.pyc,, | |||
| pip/_internal/download.pyc,, | |||
| pip/_internal/commands/show.pyc,, | |||
| pip/_vendor/html5lib/treewalkers/__init__.pyc,, | |||
| pip/_internal/models/format_control.pyc,, | |||
| pip/_vendor/distlib/_backport/tarfile.pyc,, | |||
| pip/_vendor/idna/package_data.pyc,, | |||
| pip/_vendor/html5lib/treewalkers/etree_lxml.pyc,, | |||
| pip/_vendor/pytoml/__init__.pyc,, | |||
| pip/_vendor/html5lib/filters/__init__.pyc,, | |||
| pip/_vendor/msgpack/__init__.pyc,, | |||
| pip/_vendor/requests/models.pyc,, | |||
| pip/_vendor/urllib3/util/connection.pyc,, | |||
| pip/_vendor/urllib3/util/request.pyc,, | |||
| pip/_vendor/chardet/euctwfreq.pyc,, | |||
| pip/_vendor/cachecontrol/wrapper.pyc,, | |||
| pip/_vendor/chardet/cli/chardetect.pyc,, | |||
| pip/_vendor/html5lib/html5parser.pyc,, | |||
| pip/_internal/utils/ui.pyc,, | |||
| pip/_vendor/distlib/__init__.pyc,, | |||
| pip/_vendor/cachecontrol/caches/__init__.pyc,, | |||
| pip/_vendor/msgpack/fallback.pyc,, | |||
| pip/_vendor/urllib3/fields.pyc,, | |||
| pip/_vendor/cachecontrol/serialize.pyc,, | |||
| pip/_vendor/pkg_resources/__init__.pyc,, | |||
| pip/_internal/cli/main_parser.pyc,, | |||
| pip/_vendor/html5lib/_ihatexml.pyc,, | |||
| pip/_vendor/urllib3/_collections.pyc,, | |||
| pip/_vendor/pep517/__init__.pyc,, | |||
| pip/_vendor/urllib3/contrib/pyopenssl.pyc,, | |||
| pip/_vendor/html5lib/treebuilders/etree_lxml.pyc,, | |||
| pip/_internal/operations/prepare.pyc,, | |||
| pip/_vendor/requests/structures.pyc,, | |||
| pip/_vendor/packaging/version.pyc,, | |||
| pip/_vendor/urllib3/util/wait.pyc,, | |||
| pip/_internal/operations/freeze.pyc,, | |||
| pip/_internal/commands/search.pyc,, | |||
| pip/_vendor/cachecontrol/adapter.pyc,, | |||
| pip/_internal/__init__.pyc,, | |||
| pip/_internal/cli/cmdoptions.pyc,, | |||
| pip/_vendor/html5lib/filters/base.pyc,, | |||
| pip/_vendor/packaging/specifiers.pyc,, | |||
| pip/_vendor/idna/idnadata.pyc,, | |||
| pip/_vendor/html5lib/treewalkers/genshi.pyc,, | |||
| pip/_vendor/pep517/compat.pyc,, | |||
| pip/_vendor/html5lib/treebuilders/base.pyc,, | |||
| pip/_vendor/distlib/compat.pyc,, | |||
| pip/_internal/req/req_set.pyc,, | |||
| pip/_vendor/urllib3/util/retry.pyc,, | |||
| pip/_internal/vcs/__init__.pyc,, | |||
| pip/_vendor/requests/_internal_utils.pyc,, | |||
| pip/_vendor/chardet/gb2312prober.pyc,, | |||
| pip/_internal/operations/__init__.pyc,, | |||
| pip/_vendor/requests/help.pyc,, | |||
| pip/_internal/commands/install.pyc,, | |||
| pip/_vendor/chardet/cp949prober.pyc,, | |||
| pip/_vendor/requests/status_codes.pyc,, | |||
| pip/_vendor/requests/exceptions.pyc,, | |||
| pip/_internal/utils/outdated.pyc,, | |||
| pip/_vendor/appdirs.pyc,, | |||
| pip/_vendor/distlib/markers.pyc,, | |||
| pip/_vendor/requests/hooks.pyc,, | |||
| pip/_vendor/urllib3/poolmanager.pyc,, | |||
| pip/_vendor/chardet/sjisprober.pyc,, | |||
| pip/_vendor/chardet/langcyrillicmodel.pyc,, | |||
| pip/_internal/vcs/subversion.pyc,, | |||
| pip/_vendor/urllib3/contrib/_securetransport/low_level.pyc,, | |||
| pip/_vendor/chardet/charsetgroupprober.pyc,, | |||
| pip/_vendor/packaging/requirements.pyc,, | |||
| pip/_internal/index.pyc,, | |||
| pip/_internal/vcs/bazaar.pyc,, | |||
| pip/_vendor/requests/api.pyc,, | |||
| pip/_vendor/urllib3/util/timeout.pyc,, | |||
| pip/_vendor/html5lib/treebuilders/etree.pyc,, | |||
| pip/_vendor/cachecontrol/caches/file_cache.pyc,, | |||
| pip/_internal/exceptions.pyc,, | |||
| pip/_vendor/distlib/_backport/shutil.pyc,, | |||
| pip/_vendor/idna/core.pyc,, | |||
| pip/__main__.pyc,, | |||
| pip/_internal/operations/check.pyc,, | |||
| pip/_vendor/cachecontrol/compat.pyc,, | |||
| pip/_internal/cache.pyc,, | |||
| pip/_vendor/chardet/charsetprober.pyc,, | |||
| pip/_vendor/urllib3/packages/__init__.pyc,, | |||
| pip/_vendor/lockfile/sqlitelockfile.pyc,, | |||
| pip/_vendor/progress/counter.pyc,, | |||
| pip/_vendor/cachecontrol/_cmd.pyc,, | |||
| pip/_vendor/six.pyc,, | |||
| pip/_vendor/colorama/initialise.pyc,, | |||
| pip/_vendor/requests/__version__.pyc,, | |||
| pip/_vendor/html5lib/_trie/py.pyc,, | |||
| pip/_vendor/urllib3/packages/backports/makefile.pyc,, | |||
| pip/_vendor/chardet/utf8prober.pyc,, | |||
| pip/_vendor/retrying.pyc,, | |||
| pip/_internal/commands/configuration.pyc,, | |||
| pip/_vendor/html5lib/treewalkers/etree.pyc,, | |||
| pip/_internal/vcs/git.pyc,, | |||
| pip/_vendor/chardet/big5prober.pyc,, | |||
| pip/_vendor/urllib3/connection.pyc,, | |||
| pip/_vendor/pep517/wrappers.pyc,, | |||
| pip/_internal/vcs/mercurial.pyc,, | |||
| pip/_internal/utils/__init__.pyc,, | |||
| pip/_vendor/packaging/_structures.pyc,, | |||
| pip/_vendor/chardet/langbulgarianmodel.pyc,, | |||
| pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.pyc,, | |||
| pip/_vendor/requests/packages.pyc,, | |||
| pip/_vendor/idna/intranges.pyc,, | |||
| pip/_vendor/html5lib/_inputstream.pyc,, | |||
| pip/_internal/commands/check.pyc,, | |||
| pip/_vendor/pep517/envbuild.pyc,, | |||
| pip/_vendor/chardet/sbcsgroupprober.pyc,, | |||
| pip/_internal/locations.pyc,, | |||
| pip/_vendor/distlib/scripts.pyc,, | |||
| pip/_internal/models/index.pyc,, | |||
| pip/_vendor/distlib/locators.pyc,, | |||
| pip/_internal/req/req_uninstall.pyc,, | |||
| pip/_internal/utils/hashes.pyc,, | |||
| pip/_vendor/html5lib/treewalkers/dom.pyc,, | |||
| pip/_internal/utils/glibc.pyc,, | |||
| pip/_internal/cli/base_command.pyc,, | |||
| pip/_vendor/html5lib/treebuilders/dom.pyc,, | |||
| pip/_vendor/webencodings/labels.pyc,, | |||
| pip/_vendor/webencodings/x_user_defined.pyc,, | |||
| pip/_vendor/urllib3/request.pyc,, | |||
| pip/_vendor/chardet/mbcharsetprober.pyc,, | |||
| pip/_vendor/html5lib/serializer.pyc,, | |||
| pip/_vendor/chardet/eucjpprober.pyc,, | |||
| pip/_vendor/idna/compat.pyc,, | |||
| pip/_internal/req/constructors.pyc,, | |||
| pip/_vendor/colorama/ansitowin32.pyc,, | |||
| pip/_vendor/cachecontrol/filewrapper.pyc,, | |||
| pip/_vendor/pep517/check.pyc,, | |||
| pip/_vendor/chardet/euckrfreq.pyc,, | |||
| pip/_vendor/html5lib/_trie/__init__.pyc,, | |||
| pip/_vendor/urllib3/contrib/ntlmpool.pyc,, | |||
| pip/_vendor/chardet/langhungarianmodel.pyc,, | |||
| pip/_vendor/requests/cookies.pyc,, | |||
| pip/_vendor/webencodings/mklabels.pyc,, | |||
| pip/_vendor/certifi/__init__.pyc,, | |||
| pip/_vendor/html5lib/treewalkers/base.pyc,, | |||
| pip/_vendor/distlib/manifest.pyc,, | |||
| pip/_vendor/chardet/codingstatemachine.pyc,, | |||
| pip/_internal/commands/help.pyc,, | |||
| pip/_internal/pep425tags.pyc,, | |||
| pip/_vendor/html5lib/treeadapters/__init__.pyc,, | |||
| pip/_vendor/cachecontrol/caches/redis_cache.pyc,, | |||
| pip/_vendor/html5lib/filters/inject_meta_charset.pyc,, | |||
| pip/_internal/utils/setuptools_build.pyc,, | |||
| pip/_vendor/cachecontrol/__init__.pyc,, | |||
| pip/_vendor/urllib3/contrib/appengine.pyc,, | |||
| pip/_vendor/urllib3/contrib/__init__.pyc,, | |||
| pip/_vendor/__init__.pyc,, | |||
| pip/_vendor/html5lib/constants.pyc,, | |||
| pip/_internal/cli/__init__.pyc,, | |||
| pip/_vendor/pytoml/parser.pyc,, | |||
| pip/_vendor/chardet/gb2312freq.pyc,, | |||
| pip/_vendor/urllib3/packages/backports/__init__.pyc,, | |||
| pip/_internal/commands/uninstall.pyc,, | |||
| pip/_vendor/colorama/ansi.pyc,, | |||
| pip/_vendor/packaging/markers.pyc,, | |||
| pip/_vendor/urllib3/packages/ordered_dict.pyc,, | |||
| pip/_vendor/chardet/mbcsgroupprober.pyc,, | |||
| pip/_internal/utils/encoding.pyc,, | |||
| pip/_vendor/distro.pyc,, | |||
| pip/_vendor/chardet/escsm.pyc,, | |||
| pip/_vendor/progress/bar.pyc,, | |||
| pip/_vendor/lockfile/pidlockfile.pyc,, | |||
| pip/_vendor/requests/__init__.pyc,, | |||
| pip/_internal/req/req_install.pyc,, | |||
| pip/_vendor/urllib3/util/ssl_.pyc,, | |||
| pip/_vendor/html5lib/filters/optionaltags.pyc,, | |||
| pip/_vendor/chardet/langturkishmodel.pyc,, | |||
| pip/_internal/utils/deprecation.pyc,, | |||
| pip/_vendor/colorama/winterm.pyc,, | |||
| pip/_vendor/chardet/jisfreq.pyc,, | |||
| @ -0,0 +1,6 @@ | |||
| Wheel-Version: 1.0 | |||
| Generator: bdist_wheel (0.32.1) | |||
| Root-Is-Purelib: true | |||
| Tag: py2-none-any | |||
| Tag: py3-none-any | |||
| @ -0,0 +1,5 @@ | |||
| [console_scripts] | |||
| pip = pip._internal:main | |||
| pip3 = pip._internal:main | |||
| pip3.7 = pip._internal:main | |||
| @ -0,0 +1 @@ | |||
| pip | |||
| @ -0,0 +1 @@ | |||
| __version__ = "18.1" | |||
| @ -0,0 +1,19 @@ | |||
| from __future__ import absolute_import | |||
| import os | |||
| import sys | |||
| # If we are running from a wheel, add the wheel to sys.path | |||
| # This allows the usage python pip-*.whl/pip install pip-*.whl | |||
| if __package__ == '': | |||
| # __file__ is pip-*.whl/pip/__main__.py | |||
| # first dirname call strips of '/__main__.py', second strips off '/pip' | |||
| # Resulting path is the name of the wheel itself | |||
| # Add that to sys.path so we can import pip | |||
| path = os.path.dirname(os.path.dirname(__file__)) | |||
| sys.path.insert(0, path) | |||
| from pip._internal import main as _main # isort:skip # noqa | |||
| if __name__ == '__main__': | |||
| sys.exit(_main()) | |||
| @ -0,0 +1,78 @@ | |||
| #!/usr/bin/env python | |||
| from __future__ import absolute_import | |||
| import locale | |||
| import logging | |||
| import os | |||
| import warnings | |||
| import sys | |||
| # 2016-06-17 barry@debian.org: urllib3 1.14 added optional support for socks, | |||
| # but if invoked (i.e. imported), it will issue a warning to stderr if socks | |||
| # isn't available. requests unconditionally imports urllib3's socks contrib | |||
| # module, triggering this warning. The warning breaks DEP-8 tests (because of | |||
| # the stderr output) and is just plain annoying in normal usage. I don't want | |||
| # to add socks as yet another dependency for pip, nor do I want to allow-stder | |||
| # in the DEP-8 tests, so just suppress the warning. pdb tells me this has to | |||
| # be done before the import of pip.vcs. | |||
| from pip._vendor.urllib3.exceptions import DependencyWarning | |||
| warnings.filterwarnings("ignore", category=DependencyWarning) # noqa | |||
| # We want to inject the use of SecureTransport as early as possible so that any | |||
| # references or sessions or what have you are ensured to have it, however we | |||
| # only want to do this in the case that we're running on macOS and the linked | |||
| # OpenSSL is too old to handle TLSv1.2 | |||
| try: | |||
| import ssl | |||
| except ImportError: | |||
| pass | |||
| else: | |||
| # Checks for OpenSSL 1.0.1 on MacOS | |||
| if sys.platform == "darwin" and ssl.OPENSSL_VERSION_NUMBER < 0x1000100f: | |||
| try: | |||
| from pip._vendor.urllib3.contrib import securetransport | |||
| except (ImportError, OSError): | |||
| pass | |||
| else: | |||
| securetransport.inject_into_urllib3() | |||
| from pip._internal.cli.autocompletion import autocomplete | |||
| from pip._internal.cli.main_parser import parse_command | |||
| from pip._internal.commands import commands_dict | |||
| from pip._internal.exceptions import PipError | |||
| from pip._internal.utils import deprecation | |||
| from pip._internal.vcs import git, mercurial, subversion, bazaar # noqa | |||
| from pip._vendor.urllib3.exceptions import InsecureRequestWarning | |||
| logger = logging.getLogger(__name__) | |||
| # Hide the InsecureRequestWarning from urllib3 | |||
| warnings.filterwarnings("ignore", category=InsecureRequestWarning) | |||
| def main(args=None): | |||
| if args is None: | |||
| args = sys.argv[1:] | |||
| # Configure our deprecation warnings to be sent through loggers | |||
| deprecation.install_warning_logger() | |||
| autocomplete() | |||
| try: | |||
| cmd_name, cmd_args = parse_command(args) | |||
| except PipError as exc: | |||
| sys.stderr.write("ERROR: %s" % exc) | |||
| sys.stderr.write(os.linesep) | |||
| sys.exit(1) | |||
| # Needed for locale.getpreferredencoding(False) to work | |||
| # in pip._internal.utils.encoding.auto_decode | |||
| try: | |||
| locale.setlocale(locale.LC_ALL, '') | |||
| except locale.Error as e: | |||
| # setlocale can apparently crash if locale are uninitialized | |||
| logger.debug("Ignoring error %s when setting locale", e) | |||
| command = commands_dict[cmd_name](isolated=("--isolated" in cmd_args)) | |||
| return command.main(cmd_args) | |||
Powered by TurnKey Linux.