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