| @ -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.