From 86239f50cdcc47d23fbc866cc7b8c8191fb53263 Mon Sep 17 00:00:00 2001 From: stefandmn Date: Sat, 21 Nov 2020 12:44:28 +0200 Subject: [PATCH] Release 2.0.1 --- .gitignore | 4 + Makefile | 246 + README.md | 64 +- res/yahoo.png | Bin 0 -> 16359 bytes src/addon.xml | 10 +- src/changelog.txt | 4 + src/default.py | 2 +- src/resources/media/yahoo.png | Bin 0 -> 16359 bytes src/resources/providers/abstract.py | 125 +- src/resources/providers/darksky.py | 142 +- src/resources/providers/openweathermap.py | 114 +- src/resources/providers/yahoo.py | 177 + venv/bin/activate | 84 + venv/bin/activate.csh | 55 + venv/bin/activate.fish | 102 + venv/bin/activate.ps1 | 60 + venv/bin/activate_this.py | 46 + venv/bin/easy_install | 8 + venv/bin/easy_install-2.7 | 8 + venv/bin/pip | 8 + venv/bin/pip2 | 8 + venv/bin/pip2.7 | 8 + venv/bin/python | 1 + venv/bin/python-config | 78 + venv/bin/python2 | 1 + venv/bin/python2.7 | Bin 0 -> 3628976 bytes venv/bin/wheel | 8 + venv/include/python2.7 | 1 + venv/lib/python2.7/LICENSE.txt | 1 + venv/lib/python2.7/UserDict.py | 1 + venv/lib/python2.7/UserDict.pyc | Bin 0 -> 11241 bytes venv/lib/python2.7/_abcoll.py | 1 + venv/lib/python2.7/_abcoll.pyc | Bin 0 -> 29218 bytes venv/lib/python2.7/_weakrefset.py | 1 + venv/lib/python2.7/_weakrefset.pyc | Bin 0 -> 11310 bytes venv/lib/python2.7/abc.py | 1 + venv/lib/python2.7/abc.pyc | Bin 0 -> 6517 bytes venv/lib/python2.7/codecs.py | 1 + venv/lib/python2.7/codecs.pyc | Bin 0 -> 40020 bytes venv/lib/python2.7/copy_reg.py | 1 + venv/lib/python2.7/copy_reg.pyc | Bin 0 -> 5541 bytes venv/lib/python2.7/distutils/__init__.py | 134 + venv/lib/python2.7/distutils/distutils.cfg | 6 + venv/lib/python2.7/encodings | 1 + venv/lib/python2.7/fnmatch.py | 1 + venv/lib/python2.7/genericpath.py | 1 + venv/lib/python2.7/genericpath.pyc | Bin 0 -> 3891 bytes venv/lib/python2.7/lib-dynload | 1 + venv/lib/python2.7/linecache.py | 1 + venv/lib/python2.7/linecache.pyc | Bin 0 -> 3476 bytes venv/lib/python2.7/locale.py | 1 + .../lib/python2.7/no-global-site-packages.txt | 0 venv/lib/python2.7/ntpath.py | 1 + venv/lib/python2.7/orig-prefix.txt | 1 + venv/lib/python2.7/os.py | 1 + venv/lib/python2.7/os.pyc | Bin 0 -> 27491 bytes venv/lib/python2.7/posixpath.py | 1 + venv/lib/python2.7/posixpath.pyc | Bin 0 -> 12244 bytes venv/lib/python2.7/re.py | 1 + .../python2.7/site-packages/easy_install.py | 5 + .../python2.7/site-packages/easy_install.pyc | Bin 0 -> 317 bytes .../pip-20.2.4.dist-info/INSTALLER | 1 + .../pip-20.2.4.dist-info/LICENSE.txt | 20 + .../pip-20.2.4.dist-info/METADATA | 88 + .../site-packages/pip-20.2.4.dist-info/RECORD | 753 ++ .../site-packages/pip-20.2.4.dist-info/WHEEL | 6 + .../pip-20.2.4.dist-info/entry_points.txt | 5 + .../pip-20.2.4.dist-info/top_level.txt | 1 + .../python2.7/site-packages/pip/__init__.py | 18 + .../python2.7/site-packages/pip/__init__.pyc | Bin 0 -> 738 bytes .../python2.7/site-packages/pip/__main__.py | 26 + .../python2.7/site-packages/pip/__main__.pyc | Bin 0 -> 592 bytes .../site-packages/pip/_internal/__init__.py | 17 + .../site-packages/pip/_internal/__init__.pyc | Bin 0 -> 799 bytes .../site-packages/pip/_internal/build_env.py | 241 + .../site-packages/pip/_internal/build_env.pyc | Bin 0 -> 9059 bytes .../site-packages/pip/_internal/cache.py | 346 + .../site-packages/pip/_internal/cache.pyc | Bin 0 -> 10785 bytes .../pip/_internal/cli/__init__.py | 4 + .../pip/_internal/cli/__init__.pyc | Bin 0 -> 238 bytes .../pip/_internal/cli/autocompletion.py | 164 + .../pip/_internal/cli/autocompletion.pyc | Bin 0 -> 5397 bytes .../pip/_internal/cli/base_command.py | 265 + .../pip/_internal/cli/base_command.pyc | Bin 0 -> 7902 bytes .../pip/_internal/cli/cmdoptions.py | 975 ++ .../pip/_internal/cli/cmdoptions.pyc | Bin 0 -> 24890 bytes .../pip/_internal/cli/command_context.py | 36 + .../pip/_internal/cli/command_context.pyc | Bin 0 -> 1591 bytes .../site-packages/pip/_internal/cli/main.py | 75 + .../site-packages/pip/_internal/cli/main.pyc | Bin 0 -> 1726 bytes .../pip/_internal/cli/main_parser.py | 99 + .../pip/_internal/cli/main_parser.pyc | Bin 0 -> 2642 bytes .../site-packages/pip/_internal/cli/parser.py | 266 + .../pip/_internal/cli/parser.pyc | Bin 0 -> 10257 bytes .../pip/_internal/cli/progress_bars.py | 280 + .../pip/_internal/cli/progress_bars.pyc | Bin 0 -> 9708 bytes .../pip/_internal/cli/req_command.py | 402 + .../pip/_internal/cli/req_command.pyc | Bin 0 -> 11837 bytes .../pip/_internal/cli/spinners.py | 173 + .../pip/_internal/cli/spinners.pyc | Bin 0 -> 6059 bytes .../pip/_internal/cli/status_codes.py | 8 + .../pip/_internal/cli/status_codes.pyc | Bin 0 -> 402 bytes .../pip/_internal/commands/__init__.py | 122 + .../pip/_internal/commands/__init__.pyc | Bin 0 -> 3512 bytes .../pip/_internal/commands/cache.py | 182 + .../pip/_internal/commands/cache.pyc | Bin 0 -> 5398 bytes .../pip/_internal/commands/check.py | 51 + .../pip/_internal/commands/check.pyc | Bin 0 -> 1897 bytes .../pip/_internal/commands/completion.py | 98 + .../pip/_internal/commands/completion.pyc | Bin 0 -> 3523 bytes .../pip/_internal/commands/configuration.py | 284 + .../pip/_internal/commands/configuration.pyc | Bin 0 -> 9440 bytes .../pip/_internal/commands/debug.py | 229 + .../pip/_internal/commands/debug.pyc | Bin 0 -> 7842 bytes .../pip/_internal/commands/download.py | 143 + .../pip/_internal/commands/download.pyc | Bin 0 -> 4737 bytes .../pip/_internal/commands/freeze.py | 103 + .../pip/_internal/commands/freeze.pyc | Bin 0 -> 3705 bytes .../pip/_internal/commands/hash.py | 63 + .../pip/_internal/commands/hash.pyc | Bin 0 -> 2639 bytes .../pip/_internal/commands/help.py | 44 + .../pip/_internal/commands/help.pyc | Bin 0 -> 1669 bytes .../pip/_internal/commands/install.py | 749 ++ .../pip/_internal/commands/install.pyc | Bin 0 -> 19946 bytes .../pip/_internal/commands/list.py | 320 + .../pip/_internal/commands/list.pyc | Bin 0 -> 10233 bytes .../pip/_internal/commands/search.py | 160 + .../pip/_internal/commands/search.pyc | Bin 0 -> 5803 bytes .../pip/_internal/commands/show.py | 186 + .../pip/_internal/commands/show.pyc | Bin 0 -> 6619 bytes .../pip/_internal/commands/uninstall.py | 95 + .../pip/_internal/commands/uninstall.pyc | Bin 0 -> 3486 bytes .../pip/_internal/commands/wheel.py | 188 + .../pip/_internal/commands/wheel.pyc | Bin 0 -> 5868 bytes .../pip/_internal/configuration.py | 418 + .../pip/_internal/configuration.pyc | Bin 0 -> 12992 bytes .../pip/_internal/distributions/__init__.py | 24 + .../pip/_internal/distributions/__init__.pyc | Bin 0 -> 967 bytes .../pip/_internal/distributions/base.py | 45 + .../pip/_internal/distributions/base.pyc | Bin 0 -> 2153 bytes .../pip/_internal/distributions/installed.py | 24 + .../pip/_internal/distributions/installed.pyc | Bin 0 -> 1388 bytes .../pip/_internal/distributions/sdist.py | 104 + .../pip/_internal/distributions/sdist.pyc | Bin 0 -> 4027 bytes .../pip/_internal/distributions/wheel.py | 36 + .../pip/_internal/distributions/wheel.pyc | Bin 0 -> 1781 bytes .../site-packages/pip/_internal/exceptions.py | 381 + .../pip/_internal/exceptions.pyc | Bin 0 -> 17784 bytes .../pip/_internal/index/__init__.py | 2 + .../pip/_internal/index/__init__.pyc | Bin 0 -> 192 bytes .../pip/_internal/index/collector.py | 678 ++ .../pip/_internal/index/collector.pyc | Bin 0 -> 21630 bytes .../pip/_internal/index/package_finder.py | 1016 ++ .../pip/_internal/index/package_finder.pyc | Bin 0 -> 30058 bytes .../site-packages/pip/_internal/locations.py | 194 + .../site-packages/pip/_internal/locations.pyc | Bin 0 -> 5433 bytes .../site-packages/pip/_internal/main.py | 16 + .../site-packages/pip/_internal/main.pyc | Bin 0 -> 722 bytes .../pip/_internal/models/__init__.py | 2 + .../pip/_internal/models/__init__.pyc | Bin 0 -> 226 bytes .../pip/_internal/models/candidate.py | 38 + .../pip/_internal/models/candidate.pyc | Bin 0 -> 1739 bytes .../pip/_internal/models/direct_url.py | 245 + .../pip/_internal/models/direct_url.pyc | Bin 0 -> 8512 bytes .../pip/_internal/models/format_control.py | 92 + .../pip/_internal/models/format_control.pyc | Bin 0 -> 3501 bytes .../pip/_internal/models/index.py | 34 + .../pip/_internal/models/index.pyc | Bin 0 -> 1411 bytes .../pip/_internal/models/link.py | 245 + .../pip/_internal/models/link.pyc | Bin 0 -> 9011 bytes .../pip/_internal/models/scheme.py | 31 + .../pip/_internal/models/scheme.pyc | Bin 0 -> 1089 bytes .../pip/_internal/models/search_scope.py | 135 + .../pip/_internal/models/search_scope.pyc | Bin 0 -> 3957 bytes .../pip/_internal/models/selection_prefs.py | 49 + .../pip/_internal/models/selection_prefs.pyc | Bin 0 -> 1878 bytes .../pip/_internal/models/target_python.py | 120 + .../pip/_internal/models/target_python.pyc | Bin 0 -> 3957 bytes .../pip/_internal/models/wheel.py | 78 + .../pip/_internal/models/wheel.pyc | Bin 0 -> 3793 bytes .../pip/_internal/network/__init__.py | 2 + .../pip/_internal/network/__init__.pyc | Bin 0 -> 214 bytes .../pip/_internal/network/auth.py | 310 + .../pip/_internal/network/auth.pyc | Bin 0 -> 8448 bytes .../pip/_internal/network/cache.py | 79 + .../pip/_internal/network/cache.pyc | Bin 0 -> 3307 bytes .../pip/_internal/network/download.py | 182 + .../pip/_internal/network/download.pyc | Bin 0 -> 5695 bytes .../pip/_internal/network/lazy_wheel.py | 235 + .../pip/_internal/network/lazy_wheel.pyc | Bin 0 -> 9693 bytes .../pip/_internal/network/session.py | 421 + .../pip/_internal/network/session.pyc | Bin 0 -> 11517 bytes .../pip/_internal/network/utils.py | 97 + .../pip/_internal/network/utils.pyc | Bin 0 -> 1729 bytes .../pip/_internal/network/xmlrpc.py | 52 + .../pip/_internal/network/xmlrpc.pyc | Bin 0 -> 2256 bytes .../pip/_internal/operations/__init__.py | 0 .../pip/_internal/operations/__init__.pyc | Bin 0 -> 151 bytes .../_internal/operations/build/__init__.py | 0 .../_internal/operations/build/__init__.pyc | Bin 0 -> 157 bytes .../_internal/operations/build/metadata.py | 37 + .../_internal/operations/build/metadata.pyc | Bin 0 -> 1366 bytes .../operations/build/metadata_legacy.py | 77 + .../operations/build/metadata_legacy.pyc | Bin 0 -> 2238 bytes .../pip/_internal/operations/build/wheel.py | 46 + .../pip/_internal/operations/build/wheel.pyc | Bin 0 -> 1553 bytes .../operations/build/wheel_legacy.py | 115 + .../operations/build/wheel_legacy.pyc | Bin 0 -> 3179 bytes .../pip/_internal/operations/check.py | 158 + .../pip/_internal/operations/check.pyc | Bin 0 -> 4563 bytes .../pip/_internal/operations/freeze.py | 272 + .../pip/_internal/operations/freeze.pyc | Bin 0 -> 7362 bytes .../_internal/operations/install/__init__.py | 2 + .../_internal/operations/install/__init__.pyc | Bin 0 -> 226 bytes .../operations/install/editable_legacy.py | 52 + .../operations/install/editable_legacy.pyc | Bin 0 -> 1566 bytes .../_internal/operations/install/legacy.py | 130 + .../_internal/operations/install/legacy.pyc | Bin 0 -> 3907 bytes .../pip/_internal/operations/install/wheel.py | 861 ++ .../_internal/operations/install/wheel.pyc | Bin 0 -> 25919 bytes .../pip/_internal/operations/prepare.py | 562 ++ .../pip/_internal/operations/prepare.pyc | Bin 0 -> 13915 bytes .../site-packages/pip/_internal/pyproject.py | 196 + .../site-packages/pip/_internal/pyproject.pyc | Bin 0 -> 4430 bytes .../pip/_internal/req/__init__.py | 103 + .../pip/_internal/req/__init__.pyc | Bin 0 -> 3061 bytes .../pip/_internal/req/constructors.py | 486 + .../pip/_internal/req/constructors.pyc | Bin 0 -> 13672 bytes .../pip/_internal/req/req_file.py | 592 ++ .../pip/_internal/req/req_file.pyc | Bin 0 -> 16071 bytes .../pip/_internal/req/req_install.py | 905 ++ .../pip/_internal/req/req_install.pyc | Bin 0 -> 25686 bytes .../pip/_internal/req/req_set.py | 203 + .../pip/_internal/req/req_set.pyc | Bin 0 -> 6923 bytes .../pip/_internal/req/req_tracker.py | 150 + .../pip/_internal/req/req_tracker.pyc | Bin 0 -> 5127 bytes .../pip/_internal/req/req_uninstall.py | 648 ++ .../pip/_internal/req/req_uninstall.pyc | Bin 0 -> 21550 bytes .../pip/_internal/resolution/__init__.py | 0 .../pip/_internal/resolution/__init__.pyc | Bin 0 -> 151 bytes .../pip/_internal/resolution/base.py | 20 + .../pip/_internal/resolution/base.pyc | Bin 0 -> 1202 bytes .../_internal/resolution/legacy/__init__.py | 0 .../_internal/resolution/legacy/__init__.pyc | Bin 0 -> 158 bytes .../_internal/resolution/legacy/resolver.py | 485 + .../_internal/resolution/legacy/resolver.pyc | Bin 0 -> 13858 bytes .../resolution/resolvelib/__init__.py | 0 .../resolution/resolvelib/__init__.pyc | Bin 0 -> 162 bytes .../_internal/resolution/resolvelib/base.py | 117 + .../_internal/resolution/resolvelib/base.pyc | Bin 0 -> 6187 bytes .../resolution/resolvelib/candidates.py | 594 ++ .../resolution/resolvelib/candidates.pyc | Bin 0 -> 22365 bytes .../resolution/resolvelib/factory.py | 461 + .../resolution/resolvelib/factory.pyc | Bin 0 -> 13472 bytes .../resolution/resolvelib/found_candidates.py | 98 + .../resolvelib/found_candidates.pyc | Bin 0 -> 4123 bytes .../resolution/resolvelib/provider.py | 112 + .../resolution/resolvelib/provider.pyc | Bin 0 -> 3791 bytes .../resolution/resolvelib/requirements.py | 137 + .../resolution/resolvelib/requirements.pyc | Bin 0 -> 6416 bytes .../resolution/resolvelib/resolver.py | 259 + .../resolution/resolvelib/resolver.pyc | Bin 0 -> 8342 bytes .../pip/_internal/self_outdated_check.py | 205 + .../pip/_internal/self_outdated_check.pyc | Bin 0 -> 5666 bytes .../pip/_internal/utils/__init__.py | 0 .../pip/_internal/utils/__init__.pyc | Bin 0 -> 146 bytes .../pip/_internal/utils/appdirs.py | 44 + .../pip/_internal/utils/appdirs.pyc | Bin 0 -> 1744 bytes .../pip/_internal/utils/compat.py | 293 + .../pip/_internal/utils/compat.pyc | Bin 0 -> 8525 bytes .../pip/_internal/utils/compatibility_tags.py | 166 + .../_internal/utils/compatibility_tags.pyc | Bin 0 -> 4387 bytes .../pip/_internal/utils/datetime.py | 14 + .../pip/_internal/utils/datetime.pyc | Bin 0 -> 589 bytes .../pip/_internal/utils/deprecation.py | 104 + .../pip/_internal/utils/deprecation.pyc | Bin 0 -> 3416 bytes .../pip/_internal/utils/direct_url_helpers.py | 130 + .../_internal/utils/direct_url_helpers.pyc | Bin 0 -> 3377 bytes .../pip/_internal/utils/distutils_args.py | 48 + .../pip/_internal/utils/distutils_args.pyc | Bin 0 -> 1607 bytes .../pip/_internal/utils/encoding.py | 41 + .../pip/_internal/utils/encoding.pyc | Bin 0 -> 1613 bytes .../pip/_internal/utils/entrypoints.py | 31 + .../pip/_internal/utils/entrypoints.pyc | Bin 0 -> 1431 bytes .../pip/_internal/utils/filesystem.py | 224 + .../pip/_internal/utils/filesystem.pyc | Bin 0 -> 7273 bytes .../pip/_internal/utils/filetypes.py | 16 + .../pip/_internal/utils/filetypes.pyc | Bin 0 -> 774 bytes .../pip/_internal/utils/glibc.py | 98 + .../pip/_internal/utils/glibc.pyc | Bin 0 -> 2153 bytes .../pip/_internal/utils/hashes.py | 153 + .../pip/_internal/utils/hashes.pyc | Bin 0 -> 5526 bytes .../_internal/utils/inject_securetransport.py | 36 + .../utils/inject_securetransport.pyc | Bin 0 -> 1058 bytes .../pip/_internal/utils/logging.py | 399 + .../pip/_internal/utils/logging.pyc | Bin 0 -> 11368 bytes .../site-packages/pip/_internal/utils/misc.py | 959 ++ .../pip/_internal/utils/misc.pyc | Bin 0 -> 31074 bytes .../pip/_internal/utils/models.py | 44 + .../pip/_internal/utils/models.pyc | Bin 0 -> 2415 bytes .../pip/_internal/utils/packaging.py | 94 + .../pip/_internal/utils/packaging.pyc | Bin 0 -> 3258 bytes .../pip/_internal/utils/parallel.py | 107 + .../pip/_internal/utils/parallel.pyc | Bin 0 -> 3615 bytes .../pip/_internal/utils/pkg_resources.py | 44 + .../pip/_internal/utils/pkg_resources.pyc | Bin 0 -> 2290 bytes .../pip/_internal/utils/setuptools_build.py | 181 + .../pip/_internal/utils/setuptools_build.pyc | Bin 0 -> 3796 bytes .../pip/_internal/utils/subprocess.py | 280 + .../pip/_internal/utils/subprocess.pyc | Bin 0 -> 6769 bytes .../pip/_internal/utils/temp_dir.py | 274 + .../pip/_internal/utils/temp_dir.pyc | Bin 0 -> 8599 bytes .../pip/_internal/utils/typing.py | 38 + .../pip/_internal/utils/typing.pyc | Bin 0 -> 1523 bytes .../pip/_internal/utils/unpacking.py | 281 + .../pip/_internal/utils/unpacking.pyc | Bin 0 -> 7837 bytes .../site-packages/pip/_internal/utils/urls.py | 55 + .../pip/_internal/utils/urls.pyc | Bin 0 -> 1919 bytes .../pip/_internal/utils/virtualenv.py | 119 + .../pip/_internal/utils/virtualenv.pyc | Bin 0 -> 4067 bytes .../pip/_internal/utils/wheel.py | 225 + .../pip/_internal/utils/wheel.pyc | Bin 0 -> 7229 bytes .../pip/_internal/vcs/__init__.py | 15 + .../pip/_internal/vcs/__init__.pyc | Bin 0 -> 501 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 119 + .../pip/_internal/vcs/bazaar.pyc | Bin 0 -> 4779 bytes .../site-packages/pip/_internal/vcs/git.py | 397 + .../site-packages/pip/_internal/vcs/git.pyc | Bin 0 -> 11793 bytes .../pip/_internal/vcs/mercurial.py | 158 + .../pip/_internal/vcs/mercurial.pyc | Bin 0 -> 6131 bytes .../pip/_internal/vcs/subversion.py | 336 + .../pip/_internal/vcs/subversion.pyc | Bin 0 -> 9973 bytes .../pip/_internal/vcs/versioncontrol.py | 811 ++ .../pip/_internal/vcs/versioncontrol.pyc | Bin 0 -> 25099 bytes .../pip/_internal/wheel_builder.py | 308 + .../pip/_internal/wheel_builder.pyc | Bin 0 -> 8221 bytes .../site-packages/pip/_vendor/__init__.py | 110 + .../site-packages/pip/_vendor/__init__.pyc | Bin 0 -> 3422 bytes .../site-packages/pip/_vendor/appdirs.py | 633 ++ .../site-packages/pip/_vendor/appdirs.pyc | Bin 0 -> 23875 bytes .../pip/_vendor/cachecontrol/__init__.py | 11 + .../pip/_vendor/cachecontrol/__init__.pyc | Bin 0 -> 578 bytes .../pip/_vendor/cachecontrol/_cmd.py | 57 + .../pip/_vendor/cachecontrol/_cmd.pyc | Bin 0 -> 2028 bytes .../pip/_vendor/cachecontrol/adapter.py | 133 + .../pip/_vendor/cachecontrol/adapter.pyc | Bin 0 -> 3695 bytes .../pip/_vendor/cachecontrol/cache.py | 39 + .../pip/_vendor/cachecontrol/cache.pyc | Bin 0 -> 2351 bytes .../_vendor/cachecontrol/caches/__init__.py | 2 + .../_vendor/cachecontrol/caches/__init__.pyc | Bin 0 -> 277 bytes .../_vendor/cachecontrol/caches/file_cache.py | 146 + .../cachecontrol/caches/file_cache.pyc | Bin 0 -> 4211 bytes .../cachecontrol/caches/redis_cache.py | 33 + .../cachecontrol/caches/redis_cache.pyc | Bin 0 -> 2084 bytes .../pip/_vendor/cachecontrol/compat.py | 29 + .../pip/_vendor/cachecontrol/compat.pyc | Bin 0 -> 797 bytes .../pip/_vendor/cachecontrol/controller.py | 376 + .../pip/_vendor/cachecontrol/controller.pyc | Bin 0 -> 9615 bytes .../pip/_vendor/cachecontrol/filewrapper.py | 80 + .../pip/_vendor/cachecontrol/filewrapper.pyc | Bin 0 -> 2627 bytes .../pip/_vendor/cachecontrol/heuristics.py | 135 + .../pip/_vendor/cachecontrol/heuristics.pyc | Bin 0 -> 5841 bytes .../pip/_vendor/cachecontrol/serialize.py | 188 + .../pip/_vendor/cachecontrol/serialize.pyc | Bin 0 -> 5621 bytes .../pip/_vendor/cachecontrol/wrapper.py | 29 + .../pip/_vendor/cachecontrol/wrapper.pyc | Bin 0 -> 819 bytes .../pip/_vendor/certifi/__init__.py | 3 + .../pip/_vendor/certifi/__init__.pyc | Bin 0 -> 259 bytes .../pip/_vendor/certifi/__main__.py | 12 + .../pip/_vendor/certifi/__main__.pyc | Bin 0 -> 467 bytes .../pip/_vendor/certifi/cacert.pem | 4620 +++++++++ .../site-packages/pip/_vendor/certifi/core.py | 60 + .../pip/_vendor/certifi/core.pyc | Bin 0 -> 1500 bytes .../pip/_vendor/chardet/__init__.py | 39 + .../pip/_vendor/chardet/__init__.pyc | Bin 0 -> 984 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5freq.pyc | Bin 0 -> 54696 bytes .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/big5prober.pyc | Bin 0 -> 1332 bytes .../pip/_vendor/chardet/chardistribution.py | 233 + .../pip/_vendor/chardet/chardistribution.pyc | Bin 0 -> 7721 bytes .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../_vendor/chardet/charsetgroupprober.pyc | Bin 0 -> 2833 bytes .../pip/_vendor/chardet/charsetprober.py | 145 + .../pip/_vendor/chardet/charsetprober.pyc | Bin 0 -> 4094 bytes .../pip/_vendor/chardet/cli/__init__.py | 1 + .../pip/_vendor/chardet/cli/__init__.pyc | Bin 0 -> 150 bytes .../pip/_vendor/chardet/cli/chardetect.py | 85 + .../pip/_vendor/chardet/cli/chardetect.pyc | Bin 0 -> 3175 bytes .../pip/_vendor/chardet/codingstatemachine.py | 88 + .../_vendor/chardet/codingstatemachine.pyc | Bin 0 -> 3320 bytes .../pip/_vendor/chardet/compat.py | 34 + .../pip/_vendor/chardet/compat.pyc | Bin 0 -> 399 bytes .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/cp949prober.pyc | Bin 0 -> 1340 bytes .../pip/_vendor/chardet/enums.py | 76 + .../pip/_vendor/chardet/enums.pyc | Bin 0 -> 3089 bytes .../pip/_vendor/chardet/escprober.py | 101 + .../pip/_vendor/chardet/escprober.pyc | Bin 0 -> 3191 bytes .../pip/_vendor/chardet/escsm.py | 246 + .../pip/_vendor/chardet/escsm.pyc | Bin 0 -> 8010 bytes .../pip/_vendor/chardet/eucjpprober.py | 92 + .../pip/_vendor/chardet/eucjpprober.pyc | Bin 0 -> 3006 bytes .../pip/_vendor/chardet/euckrfreq.py | 195 + .../pip/_vendor/chardet/euckrfreq.pyc | Bin 0 -> 24082 bytes .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euckrprober.pyc | Bin 0 -> 1341 bytes .../pip/_vendor/chardet/euctwfreq.py | 387 + .../pip/_vendor/chardet/euctwfreq.pyc | Bin 0 -> 54705 bytes .../pip/_vendor/chardet/euctwprober.py | 46 + .../pip/_vendor/chardet/euctwprober.pyc | Bin 0 -> 1341 bytes .../pip/_vendor/chardet/gb2312freq.py | 283 + .../pip/_vendor/chardet/gb2312freq.pyc | Bin 0 -> 38347 bytes .../pip/_vendor/chardet/gb2312prober.py | 46 + .../pip/_vendor/chardet/gb2312prober.pyc | Bin 0 -> 1350 bytes .../pip/_vendor/chardet/hebrewprober.py | 292 + .../pip/_vendor/chardet/hebrewprober.pyc | Bin 0 -> 3759 bytes .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/jisfreq.pyc | Bin 0 -> 44491 bytes .../pip/_vendor/chardet/jpcntx.py | 233 + .../pip/_vendor/chardet/jpcntx.pyc | Bin 0 -> 25260 bytes .../pip/_vendor/chardet/langbulgarianmodel.py | 228 + .../_vendor/chardet/langbulgarianmodel.pyc | Bin 0 -> 24959 bytes .../pip/_vendor/chardet/langcyrillicmodel.py | 333 + .../pip/_vendor/chardet/langcyrillicmodel.pyc | Bin 0 -> 30679 bytes .../pip/_vendor/chardet/langgreekmodel.py | 225 + .../pip/_vendor/chardet/langgreekmodel.pyc | Bin 0 -> 24634 bytes .../pip/_vendor/chardet/langhebrewmodel.py | 200 + .../pip/_vendor/chardet/langhebrewmodel.pyc | Bin 0 -> 23445 bytes .../pip/_vendor/chardet/langhungarianmodel.py | 225 + .../_vendor/chardet/langhungarianmodel.pyc | Bin 0 -> 24929 bytes .../pip/_vendor/chardet/langthaimodel.py | 199 + .../pip/_vendor/chardet/langthaimodel.pyc | Bin 0 -> 23424 bytes .../pip/_vendor/chardet/langturkishmodel.py | 193 + .../pip/_vendor/chardet/langturkishmodel.pyc | Bin 0 -> 23441 bytes .../pip/_vendor/chardet/latin1prober.py | 145 + .../pip/_vendor/chardet/latin1prober.pyc | Bin 0 -> 3701 bytes .../pip/_vendor/chardet/mbcharsetprober.py | 91 + .../pip/_vendor/chardet/mbcharsetprober.pyc | Bin 0 -> 2755 bytes .../pip/_vendor/chardet/mbcsgroupprober.py | 54 + .../pip/_vendor/chardet/mbcsgroupprober.pyc | Bin 0 -> 1321 bytes .../pip/_vendor/chardet/mbcssm.py | 572 ++ .../pip/_vendor/chardet/mbcssm.pyc | Bin 0 -> 19116 bytes .../pip/_vendor/chardet/sbcharsetprober.py | 132 + .../pip/_vendor/chardet/sbcharsetprober.pyc | Bin 0 -> 3634 bytes .../pip/_vendor/chardet/sbcsgroupprober.py | 73 + .../pip/_vendor/chardet/sbcsgroupprober.pyc | Bin 0 -> 1914 bytes .../pip/_vendor/chardet/sjisprober.py | 92 + .../pip/_vendor/chardet/sjisprober.pyc | Bin 0 -> 3027 bytes .../pip/_vendor/chardet/universaldetector.py | 286 + .../pip/_vendor/chardet/universaldetector.pyc | Bin 0 -> 7091 bytes .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/utf8prober.pyc | Bin 0 -> 2476 bytes .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/chardet/version.pyc | Bin 0 -> 426 bytes .../pip/_vendor/colorama/__init__.py | 6 + .../pip/_vendor/colorama/__init__.pyc | Bin 0 -> 478 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansi.pyc | Bin 0 -> 4352 bytes .../pip/_vendor/colorama/ansitowin32.py | 257 + .../pip/_vendor/colorama/ansitowin32.pyc | Bin 0 -> 9917 bytes .../pip/_vendor/colorama/initialise.py | 80 + .../pip/_vendor/colorama/initialise.pyc | Bin 0 -> 2319 bytes .../pip/_vendor/colorama/win32.py | 152 + .../pip/_vendor/colorama/win32.pyc | Bin 0 -> 5134 bytes .../pip/_vendor/colorama/winterm.py | 169 + .../pip/_vendor/colorama/winterm.pyc | Bin 0 -> 5999 bytes .../site-packages/pip/_vendor/contextlib2.py | 518 + .../site-packages/pip/_vendor/contextlib2.pyc | Bin 0 -> 18653 bytes .../pip/_vendor/distlib/__init__.py | 23 + .../pip/_vendor/distlib/__init__.pyc | Bin 0 -> 1311 bytes .../pip/_vendor/distlib/_backport/__init__.py | 6 + .../_vendor/distlib/_backport/__init__.pyc | Bin 0 -> 446 bytes .../pip/_vendor/distlib/_backport/misc.py | 41 + .../pip/_vendor/distlib/_backport/misc.pyc | Bin 0 -> 1408 bytes .../pip/_vendor/distlib/_backport/shutil.py | 764 ++ .../pip/_vendor/distlib/_backport/shutil.pyc | Bin 0 -> 26318 bytes .../_vendor/distlib/_backport/sysconfig.cfg | 84 + .../_vendor/distlib/_backport/sysconfig.py | 786 ++ .../_vendor/distlib/_backport/sysconfig.pyc | Bin 0 -> 20670 bytes .../pip/_vendor/distlib/_backport/tarfile.py | 2607 +++++ .../pip/_vendor/distlib/_backport/tarfile.pyc | Bin 0 -> 78929 bytes .../pip/_vendor/distlib/compat.py | 1120 +++ .../pip/_vendor/distlib/compat.pyc | Bin 0 -> 39336 bytes .../pip/_vendor/distlib/database.py | 1339 +++ .../pip/_vendor/distlib/database.pyc | Bin 0 -> 49596 bytes .../pip/_vendor/distlib/index.py | 516 + .../pip/_vendor/distlib/index.pyc | Bin 0 -> 19940 bytes .../pip/_vendor/distlib/locators.py | 1302 +++ .../pip/_vendor/distlib/locators.pyc | Bin 0 -> 46033 bytes .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/manifest.pyc | Bin 0 -> 12074 bytes .../pip/_vendor/distlib/markers.py | 131 + .../pip/_vendor/distlib/markers.pyc | Bin 0 -> 6124 bytes .../pip/_vendor/distlib/metadata.py | 1056 +++ .../pip/_vendor/distlib/metadata.pyc | Bin 0 -> 34258 bytes .../pip/_vendor/distlib/resources.py | 355 + .../pip/_vendor/distlib/resources.pyc | Bin 0 -> 13764 bytes .../pip/_vendor/distlib/scripts.py | 419 + .../pip/_vendor/distlib/scripts.pyc | Bin 0 -> 13280 bytes .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 96768 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 105984 bytes .../site-packages/pip/_vendor/distlib/util.py | 1761 ++++ .../pip/_vendor/distlib/util.pyc | Bin 0 -> 60671 bytes .../pip/_vendor/distlib/version.py | 736 ++ .../pip/_vendor/distlib/version.pyc | Bin 0 -> 25779 bytes .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 90112 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 99840 bytes .../pip/_vendor/distlib/wheel.py | 1018 ++ .../pip/_vendor/distlib/wheel.pyc | Bin 0 -> 32061 bytes .../site-packages/pip/_vendor/distro.py | 1230 +++ .../site-packages/pip/_vendor/distro.pyc | Bin 0 -> 40345 bytes .../pip/_vendor/html5lib/__init__.py | 35 + .../pip/_vendor/html5lib/__init__.pyc | Bin 0 -> 1441 bytes .../pip/_vendor/html5lib/_ihatexml.py | 289 + .../pip/_vendor/html5lib/_ihatexml.pyc | Bin 0 -> 15464 bytes .../pip/_vendor/html5lib/_inputstream.py | 918 ++ .../pip/_vendor/html5lib/_inputstream.pyc | Bin 0 -> 27426 bytes .../pip/_vendor/html5lib/_tokenizer.py | 1735 ++++ .../pip/_vendor/html5lib/_tokenizer.pyc | Bin 0 -> 53831 bytes .../pip/_vendor/html5lib/_trie/__init__.py | 5 + .../pip/_vendor/html5lib/_trie/__init__.pyc | Bin 0 -> 356 bytes .../pip/_vendor/html5lib/_trie/_base.py | 40 + .../pip/_vendor/html5lib/_trie/_base.pyc | Bin 0 -> 1984 bytes .../pip/_vendor/html5lib/_trie/py.py | 67 + .../pip/_vendor/html5lib/_trie/py.pyc | Bin 0 -> 2969 bytes .../pip/_vendor/html5lib/_utils.py | 159 + .../pip/_vendor/html5lib/_utils.pyc | Bin 0 -> 6104 bytes .../pip/_vendor/html5lib/constants.py | 2946 ++++++ .../pip/_vendor/html5lib/constants.pyc | Bin 0 -> 83486 bytes .../pip/_vendor/html5lib/filters/__init__.py | 0 .../pip/_vendor/html5lib/filters/__init__.pyc | Bin 0 -> 155 bytes .../filters/alphabeticalattributes.py | 29 + .../filters/alphabeticalattributes.pyc | Bin 0 -> 1668 bytes .../pip/_vendor/html5lib/filters/base.py | 12 + .../pip/_vendor/html5lib/filters/base.pyc | Bin 0 -> 1081 bytes .../html5lib/filters/inject_meta_charset.py | 73 + .../html5lib/filters/inject_meta_charset.pyc | Bin 0 -> 2440 bytes .../pip/_vendor/html5lib/filters/lint.py | 93 + .../pip/_vendor/html5lib/filters/lint.pyc | Bin 0 -> 3292 bytes .../_vendor/html5lib/filters/optionaltags.py | 207 + .../_vendor/html5lib/filters/optionaltags.pyc | Bin 0 -> 4442 bytes .../pip/_vendor/html5lib/filters/sanitizer.py | 916 ++ .../_vendor/html5lib/filters/sanitizer.pyc | Bin 0 -> 27503 bytes .../_vendor/html5lib/filters/whitespace.py | 38 + .../_vendor/html5lib/filters/whitespace.pyc | Bin 0 -> 1733 bytes .../pip/_vendor/html5lib/html5parser.py | 2795 ++++++ .../pip/_vendor/html5lib/html5parser.pyc | Bin 0 -> 118967 bytes .../pip/_vendor/html5lib/serializer.py | 409 + .../pip/_vendor/html5lib/serializer.pyc | Bin 0 -> 13361 bytes .../_vendor/html5lib/treeadapters/__init__.py | 30 + .../html5lib/treeadapters/__init__.pyc | Bin 0 -> 970 bytes .../_vendor/html5lib/treeadapters/genshi.py | 54 + .../_vendor/html5lib/treeadapters/genshi.pyc | Bin 0 -> 1869 bytes .../pip/_vendor/html5lib/treeadapters/sax.py | 50 + .../pip/_vendor/html5lib/treeadapters/sax.pyc | Bin 0 -> 1866 bytes .../_vendor/html5lib/treebuilders/__init__.py | 88 + .../html5lib/treebuilders/__init__.pyc | Bin 0 -> 3558 bytes .../pip/_vendor/html5lib/treebuilders/base.py | 417 + .../_vendor/html5lib/treebuilders/base.pyc | Bin 0 -> 14231 bytes .../pip/_vendor/html5lib/treebuilders/dom.py | 239 + .../pip/_vendor/html5lib/treebuilders/dom.pyc | Bin 0 -> 11558 bytes .../_vendor/html5lib/treebuilders/etree.py | 343 + .../_vendor/html5lib/treebuilders/etree.pyc | Bin 0 -> 14586 bytes .../html5lib/treebuilders/etree_lxml.py | 392 + .../html5lib/treebuilders/etree_lxml.pyc | Bin 0 -> 16507 bytes .../_vendor/html5lib/treewalkers/__init__.py | 154 + .../_vendor/html5lib/treewalkers/__init__.pyc | Bin 0 -> 4868 bytes .../pip/_vendor/html5lib/treewalkers/base.py | 252 + .../pip/_vendor/html5lib/treewalkers/base.pyc | Bin 0 -> 8705 bytes .../pip/_vendor/html5lib/treewalkers/dom.py | 43 + .../pip/_vendor/html5lib/treewalkers/dom.pyc | Bin 0 -> 2205 bytes .../pip/_vendor/html5lib/treewalkers/etree.py | 131 + .../_vendor/html5lib/treewalkers/etree.pyc | Bin 0 -> 4406 bytes .../html5lib/treewalkers/etree_lxml.py | 215 + .../html5lib/treewalkers/etree_lxml.pyc | Bin 0 -> 9144 bytes .../_vendor/html5lib/treewalkers/genshi.py | 69 + .../_vendor/html5lib/treewalkers/genshi.pyc | Bin 0 -> 2418 bytes .../pip/_vendor/idna/__init__.py | 2 + .../pip/_vendor/idna/__init__.pyc | Bin 0 -> 239 bytes .../site-packages/pip/_vendor/idna/codec.py | 118 + .../site-packages/pip/_vendor/idna/codec.pyc | Bin 0 -> 3914 bytes .../site-packages/pip/_vendor/idna/compat.py | 12 + .../site-packages/pip/_vendor/idna/compat.pyc | Bin 0 -> 791 bytes .../site-packages/pip/_vendor/idna/core.py | 400 + .../site-packages/pip/_vendor/idna/core.pyc | Bin 0 -> 12083 bytes .../pip/_vendor/idna/idnadata.py | 2050 ++++ .../pip/_vendor/idna/idnadata.pyc | Bin 0 -> 36176 bytes .../pip/_vendor/idna/intranges.py | 53 + .../pip/_vendor/idna/intranges.pyc | Bin 0 -> 2192 bytes .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/package_data.pyc | Bin 0 -> 178 bytes .../pip/_vendor/idna/uts46data.py | 8357 +++++++++++++++++ .../pip/_vendor/idna/uts46data.pyc | Bin 0 -> 297919 bytes .../site-packages/pip/_vendor/ipaddress.py | 2420 +++++ .../site-packages/pip/_vendor/ipaddress.pyc | Bin 0 -> 77104 bytes .../pip/_vendor/msgpack/__init__.py | 54 + .../pip/_vendor/msgpack/__init__.pyc | Bin 0 -> 1733 bytes .../pip/_vendor/msgpack/_version.py | 1 + .../pip/_vendor/msgpack/_version.pyc | Bin 0 -> 194 bytes .../pip/_vendor/msgpack/exceptions.py | 48 + .../pip/_vendor/msgpack/exceptions.pyc | Bin 0 -> 2333 bytes .../site-packages/pip/_vendor/msgpack/ext.py | 191 + .../site-packages/pip/_vendor/msgpack/ext.pyc | Bin 0 -> 7385 bytes .../pip/_vendor/msgpack/fallback.py | 1063 +++ .../pip/_vendor/msgpack/fallback.pyc | Bin 0 -> 31965 bytes .../pip/_vendor/packaging/__about__.py | 27 + .../pip/_vendor/packaging/__about__.pyc | Bin 0 -> 781 bytes .../pip/_vendor/packaging/__init__.py | 26 + .../pip/_vendor/packaging/__init__.pyc | Bin 0 -> 611 bytes .../pip/_vendor/packaging/_compat.py | 38 + .../pip/_vendor/packaging/_compat.pyc | Bin 0 -> 1378 bytes .../pip/_vendor/packaging/_structures.py | 86 + .../pip/_vendor/packaging/_structures.pyc | Bin 0 -> 3963 bytes .../pip/_vendor/packaging/_typing.py | 48 + .../pip/_vendor/packaging/_typing.pyc | Bin 0 -> 1604 bytes .../pip/_vendor/packaging/markers.py | 328 + .../pip/_vendor/packaging/markers.pyc | Bin 0 -> 12081 bytes .../pip/_vendor/packaging/requirements.py | 145 + .../pip/_vendor/packaging/requirements.pyc | Bin 0 -> 5344 bytes .../pip/_vendor/packaging/specifiers.py | 863 ++ .../pip/_vendor/packaging/specifiers.pyc | Bin 0 -> 25400 bytes .../pip/_vendor/packaging/tags.py | 751 ++ .../pip/_vendor/packaging/tags.pyc | Bin 0 -> 22164 bytes .../pip/_vendor/packaging/utils.py | 65 + .../pip/_vendor/packaging/utils.pyc | Bin 0 -> 2139 bytes .../pip/_vendor/packaging/version.py | 535 ++ .../pip/_vendor/packaging/version.pyc | Bin 0 -> 17414 bytes .../pip/_vendor/pep517/__init__.py | 4 + .../pip/_vendor/pep517/__init__.pyc | Bin 0 -> 256 bytes .../pip/_vendor/pep517/_in_process.py | 280 + .../pip/_vendor/pep517/_in_process.pyc | Bin 0 -> 10489 bytes .../site-packages/pip/_vendor/pep517/build.py | 124 + .../pip/_vendor/pep517/build.pyc | Bin 0 -> 4286 bytes .../site-packages/pip/_vendor/pep517/check.py | 203 + .../pip/_vendor/pep517/check.pyc | Bin 0 -> 5937 bytes .../pip/_vendor/pep517/colorlog.py | 115 + .../pip/_vendor/pep517/colorlog.pyc | Bin 0 -> 3594 bytes .../pip/_vendor/pep517/compat.py | 34 + .../pip/_vendor/pep517/compat.pyc | Bin 0 -> 1383 bytes .../pip/_vendor/pep517/dirtools.py | 44 + .../pip/_vendor/pep517/dirtools.pyc | Bin 0 -> 1687 bytes .../pip/_vendor/pep517/envbuild.py | 167 + .../pip/_vendor/pep517/envbuild.pyc | Bin 0 -> 5363 bytes .../site-packages/pip/_vendor/pep517/meta.py | 92 + .../site-packages/pip/_vendor/pep517/meta.pyc | Bin 0 -> 3515 bytes .../pip/_vendor/pep517/wrappers.py | 308 + .../pip/_vendor/pep517/wrappers.pyc | Bin 0 -> 12490 bytes .../pip/_vendor/pkg_resources/__init__.py | 3296 +++++++ .../pip/_vendor/pkg_resources/__init__.pyc | Bin 0 -> 122475 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/pkg_resources/py31compat.pyc | Bin 0 -> 777 bytes .../pip/_vendor/progress/__init__.py | 177 + .../pip/_vendor/progress/__init__.pyc | Bin 0 -> 7477 bytes .../site-packages/pip/_vendor/progress/bar.py | 91 + .../pip/_vendor/progress/bar.pyc | Bin 0 -> 3523 bytes .../pip/_vendor/progress/counter.py | 41 + .../pip/_vendor/progress/counter.pyc | Bin 0 -> 2006 bytes .../pip/_vendor/progress/spinner.py | 43 + .../pip/_vendor/progress/spinner.pyc | Bin 0 -> 1847 bytes .../site-packages/pip/_vendor/pyparsing.py | 7107 ++++++++++++++ .../site-packages/pip/_vendor/pyparsing.pyc | Bin 0 -> 275411 bytes .../pip/_vendor/requests/__init__.py | 144 + .../pip/_vendor/requests/__init__.pyc | Bin 0 -> 4376 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/__version__.pyc | Bin 0 -> 587 bytes .../pip/_vendor/requests/_internal_utils.py | 42 + .../pip/_vendor/requests/_internal_utils.pyc | Bin 0 -> 1520 bytes .../pip/_vendor/requests/adapters.py | 533 ++ .../pip/_vendor/requests/adapters.pyc | Bin 0 -> 19307 bytes .../site-packages/pip/_vendor/requests/api.py | 161 + .../pip/_vendor/requests/api.pyc | Bin 0 -> 7274 bytes .../pip/_vendor/requests/auth.py | 305 + .../pip/_vendor/requests/auth.pyc | Bin 0 -> 10414 bytes .../pip/_vendor/requests/certs.py | 18 + .../pip/_vendor/requests/certs.pyc | Bin 0 -> 613 bytes .../pip/_vendor/requests/compat.py | 76 + .../pip/_vendor/requests/compat.pyc | Bin 0 -> 1951 bytes .../pip/_vendor/requests/cookies.py | 549 ++ .../pip/_vendor/requests/cookies.pyc | Bin 0 -> 22427 bytes .../pip/_vendor/requests/exceptions.py | 123 + .../pip/_vendor/requests/exceptions.pyc | Bin 0 -> 7042 bytes .../pip/_vendor/requests/help.py | 119 + .../pip/_vendor/requests/help.pyc | Bin 0 -> 3364 bytes .../pip/_vendor/requests/hooks.py | 34 + .../pip/_vendor/requests/hooks.pyc | Bin 0 -> 1190 bytes .../pip/_vendor/requests/models.py | 954 ++ .../pip/_vendor/requests/models.pyc | Bin 0 -> 29157 bytes .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/packages.pyc | Bin 0 -> 573 bytes .../pip/_vendor/requests/sessions.py | 769 ++ .../pip/_vendor/requests/sessions.pyc | Bin 0 -> 22709 bytes .../pip/_vendor/requests/status_codes.py | 123 + .../pip/_vendor/requests/status_codes.pyc | Bin 0 -> 6076 bytes .../pip/_vendor/requests/structures.py | 105 + .../pip/_vendor/requests/structures.pyc | Bin 0 -> 5331 bytes .../pip/_vendor/requests/utils.py | 982 ++ .../pip/_vendor/requests/utils.pyc | Bin 0 -> 27305 bytes .../pip/_vendor/resolvelib/__init__.py | 26 + .../pip/_vendor/resolvelib/__init__.pyc | Bin 0 -> 688 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../_vendor/resolvelib/compat/__init__.pyc | Bin 0 -> 156 bytes .../resolvelib/compat/collections_abc.py | 6 + .../resolvelib/compat/collections_abc.pyc | Bin 0 -> 333 bytes .../pip/_vendor/resolvelib/providers.py | 109 + .../pip/_vendor/resolvelib/providers.pyc | Bin 0 -> 5864 bytes .../pip/_vendor/resolvelib/reporters.py | 42 + .../pip/_vendor/resolvelib/reporters.pyc | Bin 0 -> 2666 bytes .../pip/_vendor/resolvelib/resolvers.py | 428 + .../pip/_vendor/resolvelib/resolvers.pyc | Bin 0 -> 17173 bytes .../pip/_vendor/resolvelib/structs.py | 68 + .../pip/_vendor/resolvelib/structs.pyc | Bin 0 -> 4004 bytes .../site-packages/pip/_vendor/retrying.py | 267 + .../site-packages/pip/_vendor/retrying.pyc | Bin 0 -> 10050 bytes .../site-packages/pip/_vendor/six.py | 982 ++ .../site-packages/pip/_vendor/six.pyc | Bin 0 -> 33674 bytes .../pip/_vendor/toml/__init__.py | 25 + .../pip/_vendor/toml/__init__.pyc | Bin 0 -> 815 bytes .../site-packages/pip/_vendor/toml/common.py | 6 + .../site-packages/pip/_vendor/toml/common.pyc | Bin 0 -> 402 bytes .../site-packages/pip/_vendor/toml/decoder.py | 1052 +++ .../pip/_vendor/toml/decoder.pyc | Bin 0 -> 27794 bytes .../site-packages/pip/_vendor/toml/encoder.py | 304 + .../pip/_vendor/toml/encoder.pyc | Bin 0 -> 11623 bytes .../site-packages/pip/_vendor/toml/ordered.py | 15 + .../pip/_vendor/toml/ordered.pyc | Bin 0 -> 1149 bytes .../site-packages/pip/_vendor/toml/tz.py | 21 + .../site-packages/pip/_vendor/toml/tz.pyc | Bin 0 -> 1392 bytes .../pip/_vendor/urllib3/__init__.py | 86 + .../pip/_vendor/urllib3/__init__.pyc | Bin 0 -> 2659 bytes .../pip/_vendor/urllib3/_collections.py | 336 + .../pip/_vendor/urllib3/_collections.pyc | Bin 0 -> 13184 bytes .../pip/_vendor/urllib3/connection.py | 423 + .../pip/_vendor/urllib3/connection.pyc | Bin 0 -> 12324 bytes .../pip/_vendor/urllib3/connectionpool.py | 1033 ++ .../pip/_vendor/urllib3/connectionpool.pyc | Bin 0 -> 27405 bytes .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../pip/_vendor/urllib3/contrib/__init__.pyc | Bin 0 -> 154 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../urllib3/contrib/_appengine_environ.pyc | Bin 0 -> 1843 bytes .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/__init__.pyc | Bin 0 -> 171 bytes .../contrib/_securetransport/bindings.py | 493 + .../contrib/_securetransport/bindings.pyc | Bin 0 -> 12050 bytes .../contrib/_securetransport/low_level.py | 328 + .../contrib/_securetransport/low_level.pyc | Bin 0 -> 9372 bytes .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/appengine.pyc | Bin 0 -> 9410 bytes .../pip/_vendor/urllib3/contrib/ntlmpool.py | 121 + .../pip/_vendor/urllib3/contrib/ntlmpool.pyc | Bin 0 -> 3917 bytes .../pip/_vendor/urllib3/contrib/pyopenssl.py | 501 + .../pip/_vendor/urllib3/contrib/pyopenssl.pyc | Bin 0 -> 18511 bytes .../urllib3/contrib/securetransport.py | 864 ++ .../urllib3/contrib/securetransport.pyc | Bin 0 -> 24382 bytes .../pip/_vendor/urllib3/contrib/socks.py | 210 + .../pip/_vendor/urllib3/contrib/socks.pyc | Bin 0 -> 6454 bytes .../pip/_vendor/urllib3/exceptions.py | 272 + .../pip/_vendor/urllib3/exceptions.pyc | Bin 0 -> 13941 bytes .../pip/_vendor/urllib3/fields.py | 273 + .../pip/_vendor/urllib3/fields.pyc | Bin 0 -> 9296 bytes .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/filepost.pyc | Bin 0 -> 3416 bytes .../pip/_vendor/urllib3/packages/__init__.py | 5 + .../pip/_vendor/urllib3/packages/__init__.pyc | Bin 0 -> 317 bytes .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/__init__.pyc | Bin 0 -> 165 bytes .../urllib3/packages/backports/makefile.py | 52 + .../urllib3/packages/backports/makefile.pyc | Bin 0 -> 1605 bytes .../pip/_vendor/urllib3/packages/six.py | 1021 ++ .../pip/_vendor/urllib3/packages/six.pyc | Bin 0 -> 34428 bytes .../packages/ssl_match_hostname/__init__.py | 19 + .../packages/ssl_match_hostname/__init__.pyc | Bin 0 -> 615 bytes .../ssl_match_hostname/_implementation.py | 160 + .../ssl_match_hostname/_implementation.pyc | Bin 0 -> 4290 bytes .../pip/_vendor/urllib3/poolmanager.py | 492 + .../pip/_vendor/urllib3/poolmanager.pyc | Bin 0 -> 15897 bytes .../pip/_vendor/urllib3/request.py | 171 + .../pip/_vendor/urllib3/request.pyc | Bin 0 -> 6091 bytes .../pip/_vendor/urllib3/response.py | 821 ++ .../pip/_vendor/urllib3/response.pyc | Bin 0 -> 24570 bytes .../pip/_vendor/urllib3/util/__init__.py | 46 + .../pip/_vendor/urllib3/util/__init__.pyc | Bin 0 -> 1312 bytes .../pip/_vendor/urllib3/util/connection.py | 138 + .../pip/_vendor/urllib3/util/connection.pyc | Bin 0 -> 3882 bytes .../pip/_vendor/urllib3/util/queue.py | 21 + .../pip/_vendor/urllib3/util/queue.pyc | Bin 0 -> 1353 bytes .../pip/_vendor/urllib3/util/request.py | 135 + .../pip/_vendor/urllib3/util/request.pyc | Bin 0 -> 3866 bytes .../pip/_vendor/urllib3/util/response.py | 86 + .../pip/_vendor/urllib3/util/response.pyc | Bin 0 -> 2373 bytes .../pip/_vendor/urllib3/util/retry.py | 453 + .../pip/_vendor/urllib3/util/retry.pyc | Bin 0 -> 14846 bytes .../pip/_vendor/urllib3/util/ssl_.py | 414 + .../pip/_vendor/urllib3/util/ssl_.pyc | Bin 0 -> 11931 bytes .../pip/_vendor/urllib3/util/timeout.py | 261 + .../pip/_vendor/urllib3/util/timeout.pyc | Bin 0 -> 9739 bytes .../pip/_vendor/urllib3/util/url.py | 430 + .../pip/_vendor/urllib3/util/url.pyc | Bin 0 -> 12736 bytes .../pip/_vendor/urllib3/util/wait.py | 153 + .../pip/_vendor/urllib3/util/wait.pyc | Bin 0 -> 4218 bytes .../site-packages/pip/_vendor/vendor.txt | 24 + .../pip/_vendor/webencodings/__init__.py | 342 + .../pip/_vendor/webencodings/__init__.pyc | Bin 0 -> 11376 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/labels.pyc | Bin 0 -> 5309 bytes .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/mklabels.pyc | Bin 0 -> 2226 bytes .../pip/_vendor/webencodings/tests.py | 153 + .../pip/_vendor/webencodings/tests.pyc | Bin 0 -> 6773 bytes .../_vendor/webencodings/x_user_defined.py | 325 + .../_vendor/webencodings/x_user_defined.pyc | Bin 0 -> 3322 bytes .../site-packages/pkg_resources/__init__.py | 3296 +++++++ .../site-packages/pkg_resources/__init__.pyc | Bin 0 -> 121049 bytes .../pkg_resources/_vendor/__init__.py | 0 .../pkg_resources/_vendor/__init__.pyc | Bin 0 -> 155 bytes .../pkg_resources/_vendor/appdirs.py | 608 ++ .../pkg_resources/_vendor/appdirs.pyc | Bin 0 -> 23194 bytes .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__about__.pyc | Bin 0 -> 794 bytes .../_vendor/packaging/__init__.py | 14 + .../_vendor/packaging/__init__.pyc | Bin 0 -> 616 bytes .../_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_compat.pyc | Bin 0 -> 1264 bytes .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/_structures.pyc | Bin 0 -> 4278 bytes .../_vendor/packaging/markers.py | 301 + .../_vendor/packaging/markers.pyc | Bin 0 -> 12137 bytes .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/requirements.pyc | Bin 0 -> 5215 bytes .../_vendor/packaging/specifiers.py | 774 ++ .../_vendor/packaging/specifiers.pyc | Bin 0 -> 25682 bytes .../pkg_resources/_vendor/packaging/utils.py | 14 + .../pkg_resources/_vendor/packaging/utils.pyc | Bin 0 -> 604 bytes .../_vendor/packaging/version.py | 393 + .../_vendor/packaging/version.pyc | Bin 0 -> 14687 bytes .../pkg_resources/_vendor/pyparsing.py | 5742 +++++++++++ .../pkg_resources/_vendor/pyparsing.pyc | Bin 0 -> 237500 bytes .../pkg_resources/_vendor/six.py | 868 ++ .../pkg_resources/_vendor/six.pyc | Bin 0 -> 31994 bytes .../pkg_resources/extern/__init__.py | 73 + .../pkg_resources/extern/__init__.pyc | Bin 0 -> 2961 bytes .../site-packages/pkg_resources/py31compat.py | 23 + .../pkg_resources/py31compat.pyc | Bin 0 -> 762 bytes .../setuptools-44.1.1.dist-info/INSTALLER | 1 + .../setuptools-44.1.1.dist-info/LICENSE | 19 + .../setuptools-44.1.1.dist-info/METADATA | 86 + .../setuptools-44.1.1.dist-info/RECORD | 194 + .../setuptools-44.1.1.dist-info/WHEEL | 6 + .../dependency_links.txt | 2 + .../entry_points.txt | 69 + .../setuptools-44.1.1.dist-info/top_level.txt | 3 + .../setuptools-44.1.1.dist-info/zip-safe | 1 + .../site-packages/setuptools/__init__.py | 245 + .../site-packages/setuptools/__init__.pyc | Bin 0 -> 10218 bytes .../setuptools/_deprecation_warning.py | 7 + .../setuptools/_deprecation_warning.pyc | Bin 0 -> 586 bytes .../site-packages/setuptools/_imp.py | 73 + .../site-packages/setuptools/_imp.pyc | Bin 0 -> 2466 bytes .../setuptools/_vendor/__init__.py | 0 .../setuptools/_vendor/__init__.pyc | Bin 0 -> 152 bytes .../setuptools/_vendor/ordered_set.py | 488 + .../setuptools/_vendor/ordered_set.pyc | Bin 0 -> 18205 bytes .../setuptools/_vendor/packaging/__about__.py | 27 + .../_vendor/packaging/__about__.pyc | Bin 0 -> 803 bytes .../setuptools/_vendor/packaging/__init__.py | 26 + .../setuptools/_vendor/packaging/__init__.pyc | Bin 0 -> 625 bytes .../setuptools/_vendor/packaging/_compat.py | 31 + .../setuptools/_vendor/packaging/_compat.pyc | Bin 0 -> 1252 bytes .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/_structures.pyc | Bin 0 -> 4215 bytes .../setuptools/_vendor/packaging/markers.py | 296 + .../setuptools/_vendor/packaging/markers.pyc | Bin 0 -> 12078 bytes .../_vendor/packaging/requirements.py | 138 + .../_vendor/packaging/requirements.pyc | Bin 0 -> 5365 bytes .../_vendor/packaging/specifiers.py | 749 ++ .../_vendor/packaging/specifiers.pyc | Bin 0 -> 25441 bytes .../setuptools/_vendor/packaging/tags.py | 404 + .../setuptools/_vendor/packaging/tags.pyc | Bin 0 -> 14875 bytes .../setuptools/_vendor/packaging/utils.py | 57 + .../setuptools/_vendor/packaging/utils.pyc | Bin 0 -> 1953 bytes .../setuptools/_vendor/packaging/version.py | 420 + .../setuptools/_vendor/packaging/version.pyc | Bin 0 -> 16694 bytes .../setuptools/_vendor/pyparsing.py | 5742 +++++++++++ .../setuptools/_vendor/pyparsing.pyc | Bin 0 -> 236189 bytes .../site-packages/setuptools/_vendor/six.py | 868 ++ .../site-packages/setuptools/_vendor/six.pyc | Bin 0 -> 31757 bytes .../site-packages/setuptools/archive_util.py | 173 + .../site-packages/setuptools/archive_util.pyc | Bin 0 -> 6158 bytes .../site-packages/setuptools/build_meta.py | 264 + .../site-packages/setuptools/build_meta.pyc | Bin 0 -> 9824 bytes .../site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 17 + .../setuptools/command/__init__.pyc | Bin 0 -> 852 bytes .../site-packages/setuptools/command/alias.py | 80 + .../setuptools/command/alias.pyc | Bin 0 -> 3112 bytes .../setuptools/command/bdist_egg.py | 502 + .../setuptools/command/bdist_egg.pyc | Bin 0 -> 18446 bytes .../setuptools/command/bdist_rpm.py | 43 + .../setuptools/command/bdist_rpm.pyc | Bin 0 -> 1922 bytes .../setuptools/command/bdist_wininst.py | 21 + .../setuptools/command/bdist_wininst.pyc | Bin 0 -> 1199 bytes .../setuptools/command/build_clib.py | 98 + .../setuptools/command/build_clib.pyc | Bin 0 -> 2850 bytes .../setuptools/command/build_ext.py | 327 + .../setuptools/command/build_ext.pyc | Bin 0 -> 12139 bytes .../setuptools/command/build_py.py | 270 + .../setuptools/command/build_py.pyc | Bin 0 -> 10715 bytes .../setuptools/command/develop.py | 221 + .../setuptools/command/develop.pyc | Bin 0 -> 7997 bytes .../setuptools/command/dist_info.py | 36 + .../setuptools/command/dist_info.pyc | Bin 0 -> 1809 bytes .../setuptools/command/easy_install.py | 2347 +++++ .../setuptools/command/easy_install.pyc | Bin 0 -> 81203 bytes .../setuptools/command/egg_info.py | 717 ++ .../setuptools/command/egg_info.pyc | Bin 0 -> 26856 bytes .../setuptools/command/install.py | 125 + .../setuptools/command/install.pyc | Bin 0 -> 5010 bytes .../setuptools/command/install_egg_info.py | 62 + .../setuptools/command/install_egg_info.pyc | Bin 0 -> 3201 bytes .../setuptools/command/install_lib.py | 121 + .../setuptools/command/install_lib.pyc | Bin 0 -> 4915 bytes .../setuptools/command/install_scripts.py | 65 + .../setuptools/command/install_scripts.pyc | Bin 0 -> 2901 bytes .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 136 + .../setuptools/command/py36compat.pyc | Bin 0 -> 5574 bytes .../setuptools/command/register.py | 18 + .../setuptools/command/register.pyc | Bin 0 -> 1004 bytes .../setuptools/command/rotate.py | 66 + .../setuptools/command/rotate.pyc | Bin 0 -> 3046 bytes .../setuptools/command/saveopts.py | 22 + .../setuptools/command/saveopts.pyc | Bin 0 -> 1135 bytes .../site-packages/setuptools/command/sdist.py | 252 + .../setuptools/command/sdist.pyc | Bin 0 -> 9968 bytes .../setuptools/command/setopt.py | 149 + .../setuptools/command/setopt.pyc | Bin 0 -> 6070 bytes .../site-packages/setuptools/command/test.py | 279 + .../site-packages/setuptools/command/test.pyc | Bin 0 -> 10860 bytes .../setuptools/command/upload.py | 17 + .../setuptools/command/upload.pyc | Bin 0 -> 979 bytes .../setuptools/command/upload_docs.py | 206 + .../setuptools/command/upload_docs.pyc | Bin 0 -> 7864 bytes .../site-packages/setuptools/config.py | 659 ++ .../site-packages/setuptools/config.pyc | Bin 0 -> 20792 bytes .../site-packages/setuptools/dep_util.py | 23 + .../site-packages/setuptools/dep_util.pyc | Bin 0 -> 969 bytes .../site-packages/setuptools/depends.py | 176 + .../site-packages/setuptools/depends.pyc | Bin 0 -> 6381 bytes .../site-packages/setuptools/dist.py | 1274 +++ .../site-packages/setuptools/dist.pyc | Bin 0 -> 48233 bytes .../site-packages/setuptools/errors.py | 16 + .../site-packages/setuptools/errors.pyc | Bin 0 -> 888 bytes .../site-packages/setuptools/extension.py | 57 + .../site-packages/setuptools/extension.pyc | Bin 0 -> 2430 bytes .../setuptools/extern/__init__.py | 73 + .../setuptools/extern/__init__.pyc | Bin 0 -> 2959 bytes .../site-packages/setuptools/glob.py | 174 + .../site-packages/setuptools/glob.pyc | Bin 0 -> 4739 bytes .../site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/installer.py | 150 + .../site-packages/setuptools/installer.pyc | Bin 0 -> 5100 bytes .../site-packages/setuptools/launch.py | 35 + .../site-packages/setuptools/launch.pyc | Bin 0 -> 1004 bytes .../site-packages/setuptools/lib2to3_ex.py | 62 + .../site-packages/setuptools/lib2to3_ex.pyc | Bin 0 -> 3022 bytes .../site-packages/setuptools/monkey.py | 179 + .../site-packages/setuptools/monkey.pyc | Bin 0 -> 5827 bytes .../site-packages/setuptools/msvc.py | 1679 ++++ .../site-packages/setuptools/msvc.pyc | Bin 0 -> 45888 bytes .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/namespaces.pyc | Bin 0 -> 5057 bytes .../site-packages/setuptools/package_index.py | 1136 +++ .../setuptools/package_index.pyc | Bin 0 -> 40595 bytes .../site-packages/setuptools/py27compat.py | 60 + .../site-packages/setuptools/py27compat.pyc | Bin 0 -> 2373 bytes .../site-packages/setuptools/py31compat.py | 32 + .../site-packages/setuptools/py31compat.pyc | Bin 0 -> 1452 bytes .../site-packages/setuptools/py33compat.py | 59 + .../site-packages/setuptools/py33compat.pyc | Bin 0 -> 1779 bytes .../site-packages/setuptools/py34compat.py | 13 + .../site-packages/setuptools/py34compat.pyc | Bin 0 -> 550 bytes .../site-packages/setuptools/sandbox.py | 491 + .../site-packages/setuptools/sandbox.pyc | Bin 0 -> 19008 bytes .../setuptools/script (dev).tmpl | 6 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 74 + .../site-packages/setuptools/site-patch.pyc | Bin 0 -> 1743 bytes .../site-packages/setuptools/ssl_support.py | 260 + .../site-packages/setuptools/ssl_support.pyc | Bin 0 -> 8557 bytes .../site-packages/setuptools/unicode_utils.py | 44 + .../setuptools/unicode_utils.pyc | Bin 0 -> 1480 bytes .../site-packages/setuptools/version.py | 6 + .../site-packages/setuptools/version.pyc | Bin 0 -> 324 bytes .../site-packages/setuptools/wheel.py | 220 + .../site-packages/setuptools/wheel.pyc | Bin 0 -> 9307 bytes .../setuptools/windows_support.py | 29 + .../setuptools/windows_support.pyc | Bin 0 -> 1282 bytes .../wheel-0.35.1.dist-info/INSTALLER | 1 + .../wheel-0.35.1.dist-info/LICENSE.txt | 22 + .../wheel-0.35.1.dist-info/METADATA | 67 + .../wheel-0.35.1.dist-info/RECORD | 40 + .../wheel-0.35.1.dist-info/WHEEL | 6 + .../wheel-0.35.1.dist-info/entry_points.txt | 6 + .../wheel-0.35.1.dist-info/top_level.txt | 1 + .../python2.7/site-packages/wheel/__init__.py | 1 + .../site-packages/wheel/__init__.pyc | Bin 0 -> 167 bytes .../python2.7/site-packages/wheel/__main__.py | 19 + .../site-packages/wheel/__main__.pyc | Bin 0 -> 707 bytes .../site-packages/wheel/bdist_wheel.py | 476 + .../site-packages/wheel/bdist_wheel.pyc | Bin 0 -> 16652 bytes .../site-packages/wheel/cli/__init__.py | 88 + .../site-packages/wheel/cli/__init__.pyc | Bin 0 -> 3885 bytes .../site-packages/wheel/cli/convert.py | 269 + .../site-packages/wheel/cli/convert.pyc | Bin 0 -> 7599 bytes .../python2.7/site-packages/wheel/cli/pack.py | 79 + .../site-packages/wheel/cli/pack.pyc | Bin 0 -> 3386 bytes .../site-packages/wheel/cli/unpack.py | 25 + .../site-packages/wheel/cli/unpack.pyc | Bin 0 -> 1078 bytes .../site-packages/wheel/macosx_libfile.py | 410 + .../site-packages/wheel/macosx_libfile.pyc | Bin 0 -> 10670 bytes .../python2.7/site-packages/wheel/metadata.py | 133 + .../site-packages/wheel/metadata.pyc | Bin 0 -> 4512 bytes .../python2.7/site-packages/wheel/pkginfo.py | 43 + .../python2.7/site-packages/wheel/pkginfo.pyc | Bin 0 -> 2039 bytes .../lib/python2.7/site-packages/wheel/util.py | 46 + .../python2.7/site-packages/wheel/util.pyc | Bin 0 -> 1697 bytes .../site-packages/wheel/vendored/__init__.py | 0 .../site-packages/wheel/vendored/__init__.pyc | Bin 0 -> 143 bytes .../wheel/vendored/packaging/__init__.py | 0 .../wheel/vendored/packaging/__init__.pyc | Bin 0 -> 153 bytes .../wheel/vendored/packaging/_typing.py | 50 + .../wheel/vendored/packaging/_typing.pyc | Bin 0 -> 1602 bytes .../wheel/vendored/packaging/tags.py | 753 ++ .../wheel/vendored/packaging/tags.pyc | Bin 0 -> 22404 bytes .../site-packages/wheel/wheelfile.py | 169 + .../site-packages/wheel/wheelfile.pyc | Bin 0 -> 7051 bytes venv/lib/python2.7/site.py | 829 ++ venv/lib/python2.7/site.pyc | Bin 0 -> 26646 bytes venv/lib/python2.7/sre.py | 1 + venv/lib/python2.7/sre_compile.py | 1 + venv/lib/python2.7/sre_constants.py | 1 + venv/lib/python2.7/sre_parse.py | 1 + venv/lib/python2.7/stat.py | 1 + venv/lib/python2.7/stat.pyc | Bin 0 -> 3091 bytes venv/lib/python2.7/types.py | 1 + venv/lib/python2.7/types.pyc | Bin 0 -> 2963 bytes venv/lib/python2.7/warnings.py | 1 + venv/lib/python2.7/warnings.pyc | Bin 0 -> 14292 bytes venv/local/bin | 1 + venv/local/include | 1 + venv/local/lib | 1 + 1055 files changed, 161683 insertions(+), 182 deletions(-) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 res/yahoo.png create mode 100644 src/resources/media/yahoo.png create mode 100644 src/resources/providers/yahoo.py create mode 100644 venv/bin/activate create mode 100644 venv/bin/activate.csh create mode 100644 venv/bin/activate.fish create mode 100644 venv/bin/activate.ps1 create mode 100644 venv/bin/activate_this.py create mode 100755 venv/bin/easy_install create mode 100755 venv/bin/easy_install-2.7 create mode 100755 venv/bin/pip create mode 100755 venv/bin/pip2 create mode 100755 venv/bin/pip2.7 create mode 120000 venv/bin/python create mode 100755 venv/bin/python-config create mode 120000 venv/bin/python2 create mode 100755 venv/bin/python2.7 create mode 100755 venv/bin/wheel create mode 120000 venv/include/python2.7 create mode 120000 venv/lib/python2.7/LICENSE.txt create mode 120000 venv/lib/python2.7/UserDict.py create mode 100644 venv/lib/python2.7/UserDict.pyc create mode 120000 venv/lib/python2.7/_abcoll.py create mode 100644 venv/lib/python2.7/_abcoll.pyc create mode 120000 venv/lib/python2.7/_weakrefset.py create mode 100644 venv/lib/python2.7/_weakrefset.pyc create mode 120000 venv/lib/python2.7/abc.py create mode 100644 venv/lib/python2.7/abc.pyc create mode 120000 venv/lib/python2.7/codecs.py create mode 100644 venv/lib/python2.7/codecs.pyc create mode 120000 venv/lib/python2.7/copy_reg.py create mode 100644 venv/lib/python2.7/copy_reg.pyc create mode 100644 venv/lib/python2.7/distutils/__init__.py create mode 100644 venv/lib/python2.7/distutils/distutils.cfg create mode 120000 venv/lib/python2.7/encodings create mode 120000 venv/lib/python2.7/fnmatch.py create mode 120000 venv/lib/python2.7/genericpath.py create mode 100644 venv/lib/python2.7/genericpath.pyc create mode 120000 venv/lib/python2.7/lib-dynload create mode 120000 venv/lib/python2.7/linecache.py create mode 100644 venv/lib/python2.7/linecache.pyc create mode 120000 venv/lib/python2.7/locale.py create mode 100644 venv/lib/python2.7/no-global-site-packages.txt create mode 120000 venv/lib/python2.7/ntpath.py create mode 100644 venv/lib/python2.7/orig-prefix.txt create mode 120000 venv/lib/python2.7/os.py create mode 100644 venv/lib/python2.7/os.pyc create mode 120000 venv/lib/python2.7/posixpath.py create mode 100644 venv/lib/python2.7/posixpath.pyc create mode 120000 venv/lib/python2.7/re.py create mode 100644 venv/lib/python2.7/site-packages/easy_install.py create mode 100644 venv/lib/python2.7/site-packages/easy_install.pyc create mode 100644 venv/lib/python2.7/site-packages/pip-20.2.4.dist-info/INSTALLER create mode 100644 venv/lib/python2.7/site-packages/pip-20.2.4.dist-info/LICENSE.txt create mode 100644 venv/lib/python2.7/site-packages/pip-20.2.4.dist-info/METADATA create mode 100644 venv/lib/python2.7/site-packages/pip-20.2.4.dist-info/RECORD create mode 100644 venv/lib/python2.7/site-packages/pip-20.2.4.dist-info/WHEEL create mode 100644 venv/lib/python2.7/site-packages/pip-20.2.4.dist-info/entry_points.txt create mode 100644 venv/lib/python2.7/site-packages/pip-20.2.4.dist-info/top_level.txt create mode 100644 venv/lib/python2.7/site-packages/pip/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/__main__.py create mode 100644 venv/lib/python2.7/site-packages/pip/__main__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/build_env.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/build_env.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cache.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cache.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/base_command.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/base_command.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/command_context.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/command_context.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/main.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/main.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/main_parser.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/main_parser.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/parser.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/parser.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/progress_bars.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/req_command.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/req_command.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/spinners.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/spinners.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/status_codes.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/cli/status_codes.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/cache.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/cache.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/check.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/check.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/completion.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/completion.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/configuration.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/configuration.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/debug.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/debug.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/download.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/download.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/freeze.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/freeze.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/hash.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/hash.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/help.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/help.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/install.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/install.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/list.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/list.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/search.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/search.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/show.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/show.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/uninstall.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/uninstall.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/wheel.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/commands/wheel.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/configuration.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/configuration.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/distributions/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/distributions/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/distributions/base.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/distributions/base.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/distributions/installed.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/distributions/installed.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/distributions/sdist.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/distributions/sdist.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/distributions/wheel.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/distributions/wheel.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/exceptions.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/exceptions.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/index/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/index/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/index/collector.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/index/collector.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/index/package_finder.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/index/package_finder.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/locations.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/locations.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/main.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/main.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/candidate.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/candidate.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/direct_url.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/direct_url.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/format_control.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/format_control.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/index.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/index.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/link.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/link.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/scheme.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/scheme.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/search_scope.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/search_scope.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/selection_prefs.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/target_python.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/target_python.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/wheel.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/models/wheel.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/network/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/network/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/network/auth.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/network/auth.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/network/cache.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/network/cache.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/network/download.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/network/download.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/network/lazy_wheel.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/network/session.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/network/session.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/network/utils.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/network/utils.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/network/xmlrpc.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/build/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata_legacy.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel_legacy.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/check.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/check.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/freeze.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/freeze.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/install/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/install/editable_legacy.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/install/legacy.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/install/legacy.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/install/wheel.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/prepare.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/operations/prepare.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/pyproject.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/pyproject.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/constructors.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/constructors.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_file.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_file.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_install.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_install.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_set.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_set.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/base.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/base.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/legacy/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/legacy/resolver.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/base.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/candidates.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/factory.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/found_candidates.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/provider.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/requirements.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/resolver.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/self_outdated_check.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/self_outdated_check.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/compat.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/compat.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/compatibility_tags.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/datetime.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/datetime.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/direct_url_helpers.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/distutils_args.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/distutils_args.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/encoding.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/encoding.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/entrypoints.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/filetypes.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/filetypes.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/glibc.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/glibc.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/hashes.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/hashes.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/inject_securetransport.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/inject_securetransport.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/logging.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/logging.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/misc.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/misc.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/models.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/models.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/packaging.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/packaging.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/parallel.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/parallel.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/pkg_resources.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/pkg_resources.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/subprocess.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/subprocess.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/typing.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/typing.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/unpacking.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/unpacking.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/urls.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/urls.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/virtualenv.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/wheel.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/utils/wheel.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/git.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/git.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/vcs/versioncontrol.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/wheel_builder.py create mode 100644 venv/lib/python2.7/site-packages/pip/_internal/wheel_builder.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/appdirs.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/appdirs.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/cache.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/heuristics.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/certifi/core.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/certifi/core.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5prober.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/codingstatemachine.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/enums.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/escprober.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrprober.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhebrewmodel.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/latin1prober.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/version.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/chardet/version.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansitowin32.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/initialise.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/contextlib2.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/contextlib2.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/database.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/database.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/index.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/locators.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/locators.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/manifest.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/util.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/util.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/version.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/version.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distro.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/distro.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_inputstream.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_inputstream.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/_base.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/base.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/base.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/lint.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/serializer.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/serializer.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/base.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/base.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/codec.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/codec.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/compat.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/compat.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/core.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/core.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/idnadata.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/intranges.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/intranges.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/package_data.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/package_data.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/idna/uts46data.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/ipaddress.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/ipaddress.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/_version.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/_version.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/exceptions.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/ext.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/msgpack/fallback.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/__about__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/_compat.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/_compat.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/_structures.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/_typing.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/_typing.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/markers.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/markers.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/requirements.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/specifiers.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/tags.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/tags.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/utils.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/utils.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/version.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/packaging/version.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/_in_process.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/_in_process.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/build.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/build.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/check.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/check.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/colorlog.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/compat.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/compat.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/dirtools.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/dirtools.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/envbuild.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/meta.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/meta.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/wrappers.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pep517/wrappers.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pkg_resources/py31compat.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/bar.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/bar.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/counter.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/counter.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/spinner.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/progress/spinner.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pyparsing.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/pyparsing.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/__version__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/__version__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/_internal_utils.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/adapters.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/adapters.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/api.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/api.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/auth.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/auth.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/certs.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/certs.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/compat.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/compat.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/cookies.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/cookies.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/exceptions.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/help.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/help.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/hooks.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/hooks.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/models.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/models.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/packages.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/packages.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/sessions.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/sessions.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/status_codes.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/structures.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/structures.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/utils.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/requests/utils.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/resolvelib/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/resolvelib/compat/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/resolvelib/compat/collections_abc.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/resolvelib/providers.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/resolvelib/reporters.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/resolvelib/resolvers.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/resolvelib/structs.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/retrying.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/retrying.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/six.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/six.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/toml/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/toml/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/toml/common.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/toml/common.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/toml/decoder.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/toml/decoder.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/toml/encoder.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/toml/encoder.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/toml/ordered.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/toml/ordered.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/toml/tz.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/toml/tz.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/_collections.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connection.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/connectionpool.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/appengine.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/contrib/socks.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/exceptions.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/fields.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/filepost.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/six.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/poolmanager.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/request.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/request.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/response.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/response.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/connection.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/queue.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/request.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/response.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/retry.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/ssl_.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/timeout.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/url.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/urllib3/util/wait.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/vendor.txt create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/labels.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/mklabels.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/tests.pyc create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 venv/lib/python2.7/site-packages/pip/_vendor/webencodings/x_user_defined.pyc create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/appdirs.pyc create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__about__.pyc create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_compat.pyc create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/_structures.pyc create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/markers.pyc create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/requirements.pyc create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/specifiers.pyc create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/utils.pyc create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/packaging/version.pyc create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/pyparsing.pyc create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/six.py create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/_vendor/six.pyc create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/extern/__init__.py create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/extern/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/py31compat.py create mode 100644 venv/lib/python2.7/site-packages/pkg_resources/py31compat.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools-44.1.1.dist-info/INSTALLER create mode 100644 venv/lib/python2.7/site-packages/setuptools-44.1.1.dist-info/LICENSE create mode 100644 venv/lib/python2.7/site-packages/setuptools-44.1.1.dist-info/METADATA create mode 100644 venv/lib/python2.7/site-packages/setuptools-44.1.1.dist-info/RECORD create mode 100644 venv/lib/python2.7/site-packages/setuptools-44.1.1.dist-info/WHEEL create mode 100644 venv/lib/python2.7/site-packages/setuptools-44.1.1.dist-info/dependency_links.txt create mode 100644 venv/lib/python2.7/site-packages/setuptools-44.1.1.dist-info/entry_points.txt create mode 100644 venv/lib/python2.7/site-packages/setuptools-44.1.1.dist-info/top_level.txt create mode 100644 venv/lib/python2.7/site-packages/setuptools-44.1.1.dist-info/zip-safe create mode 100644 venv/lib/python2.7/site-packages/setuptools/__init__.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/_deprecation_warning.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/_deprecation_warning.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/_imp.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/_imp.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/__init__.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/ordered_set.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/ordered_set.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/tags.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/six.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/_vendor/six.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/archive_util.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/archive_util.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/build_meta.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/build_meta.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/cli-32.exe create mode 100644 venv/lib/python2.7/site-packages/setuptools/cli-64.exe create mode 100644 venv/lib/python2.7/site-packages/setuptools/cli.exe create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/__init__.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/alias.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/alias.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/bdist_egg.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/bdist_rpm.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/bdist_wininst.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/build_clib.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/build_clib.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/build_ext.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/build_ext.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/build_py.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/build_py.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/develop.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/develop.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/dist_info.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/dist_info.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/easy_install.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/easy_install.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/egg_info.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/egg_info.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install_egg_info.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install_egg_info.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install_lib.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install_lib.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install_scripts.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/install_scripts.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/launcher manifest.xml create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/py36compat.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/py36compat.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/register.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/register.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/rotate.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/rotate.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/saveopts.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/saveopts.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/sdist.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/sdist.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/setopt.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/setopt.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/test.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/test.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/upload.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/upload.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/upload_docs.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/command/upload_docs.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/config.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/config.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/dep_util.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/dep_util.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/depends.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/depends.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/dist.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/dist.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/errors.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/errors.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/extension.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/extension.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/extern/__init__.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/extern/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/glob.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/glob.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/gui-32.exe create mode 100644 venv/lib/python2.7/site-packages/setuptools/gui-64.exe create mode 100644 venv/lib/python2.7/site-packages/setuptools/gui.exe create mode 100644 venv/lib/python2.7/site-packages/setuptools/installer.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/installer.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/launch.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/launch.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/lib2to3_ex.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/monkey.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/monkey.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/msvc.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/msvc.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/namespaces.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/namespaces.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/package_index.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/package_index.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/py27compat.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/py27compat.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/py31compat.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/py31compat.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/py33compat.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/py33compat.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/py34compat.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/py34compat.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/sandbox.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/sandbox.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/script (dev).tmpl create mode 100644 venv/lib/python2.7/site-packages/setuptools/script.tmpl create mode 100644 venv/lib/python2.7/site-packages/setuptools/site-patch.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/site-patch.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/ssl_support.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/ssl_support.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/unicode_utils.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/unicode_utils.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/version.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/version.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/wheel.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/wheel.pyc create mode 100644 venv/lib/python2.7/site-packages/setuptools/windows_support.py create mode 100644 venv/lib/python2.7/site-packages/setuptools/windows_support.pyc create mode 100644 venv/lib/python2.7/site-packages/wheel-0.35.1.dist-info/INSTALLER create mode 100644 venv/lib/python2.7/site-packages/wheel-0.35.1.dist-info/LICENSE.txt create mode 100644 venv/lib/python2.7/site-packages/wheel-0.35.1.dist-info/METADATA create mode 100644 venv/lib/python2.7/site-packages/wheel-0.35.1.dist-info/RECORD create mode 100644 venv/lib/python2.7/site-packages/wheel-0.35.1.dist-info/WHEEL create mode 100644 venv/lib/python2.7/site-packages/wheel-0.35.1.dist-info/entry_points.txt create mode 100644 venv/lib/python2.7/site-packages/wheel-0.35.1.dist-info/top_level.txt create mode 100644 venv/lib/python2.7/site-packages/wheel/__init__.py create mode 100644 venv/lib/python2.7/site-packages/wheel/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/wheel/__main__.py create mode 100644 venv/lib/python2.7/site-packages/wheel/__main__.pyc create mode 100644 venv/lib/python2.7/site-packages/wheel/bdist_wheel.py create mode 100644 venv/lib/python2.7/site-packages/wheel/bdist_wheel.pyc create mode 100644 venv/lib/python2.7/site-packages/wheel/cli/__init__.py create mode 100644 venv/lib/python2.7/site-packages/wheel/cli/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/wheel/cli/convert.py create mode 100644 venv/lib/python2.7/site-packages/wheel/cli/convert.pyc create mode 100644 venv/lib/python2.7/site-packages/wheel/cli/pack.py create mode 100644 venv/lib/python2.7/site-packages/wheel/cli/pack.pyc create mode 100644 venv/lib/python2.7/site-packages/wheel/cli/unpack.py create mode 100644 venv/lib/python2.7/site-packages/wheel/cli/unpack.pyc create mode 100644 venv/lib/python2.7/site-packages/wheel/macosx_libfile.py create mode 100644 venv/lib/python2.7/site-packages/wheel/macosx_libfile.pyc create mode 100644 venv/lib/python2.7/site-packages/wheel/metadata.py create mode 100644 venv/lib/python2.7/site-packages/wheel/metadata.pyc create mode 100644 venv/lib/python2.7/site-packages/wheel/pkginfo.py create mode 100644 venv/lib/python2.7/site-packages/wheel/pkginfo.pyc create mode 100644 venv/lib/python2.7/site-packages/wheel/util.py create mode 100644 venv/lib/python2.7/site-packages/wheel/util.pyc create mode 100644 venv/lib/python2.7/site-packages/wheel/vendored/__init__.py create mode 100644 venv/lib/python2.7/site-packages/wheel/vendored/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/wheel/vendored/packaging/__init__.py create mode 100644 venv/lib/python2.7/site-packages/wheel/vendored/packaging/__init__.pyc create mode 100644 venv/lib/python2.7/site-packages/wheel/vendored/packaging/_typing.py create mode 100644 venv/lib/python2.7/site-packages/wheel/vendored/packaging/_typing.pyc create mode 100644 venv/lib/python2.7/site-packages/wheel/vendored/packaging/tags.py create mode 100644 venv/lib/python2.7/site-packages/wheel/vendored/packaging/tags.pyc create mode 100644 venv/lib/python2.7/site-packages/wheel/wheelfile.py create mode 100644 venv/lib/python2.7/site-packages/wheel/wheelfile.pyc create mode 100644 venv/lib/python2.7/site.py create mode 100644 venv/lib/python2.7/site.pyc create mode 120000 venv/lib/python2.7/sre.py create mode 120000 venv/lib/python2.7/sre_compile.py create mode 120000 venv/lib/python2.7/sre_constants.py create mode 120000 venv/lib/python2.7/sre_parse.py create mode 120000 venv/lib/python2.7/stat.py create mode 100644 venv/lib/python2.7/stat.pyc create mode 120000 venv/lib/python2.7/types.py create mode 100644 venv/lib/python2.7/types.pyc create mode 120000 venv/lib/python2.7/warnings.py create mode 100644 venv/lib/python2.7/warnings.pyc create mode 120000 venv/local/bin create mode 120000 venv/local/include create mode 120000 venv/local/lib diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8e84e97 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.svn +.git +.idea +.svnignore diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2eabc04 --- /dev/null +++ b/Makefile @@ -0,0 +1,246 @@ +SHELL:=/bin/bash +ROOT=$(shell pwd) +NAME=$(shell basename $(ROOT)) + +ifndef VERBOSE +.SILENT: +endif + +OUTDIR= +SYSDIR=sys +SRCDIR=src +RESDIR=res + +ifeq ($(OUTPUT),) + export OUTPUT=$(ROOT)/../Clue-out +endif + +ifeq ($(PUBLISH),) + export PUBLISH=~/AMSD/Web/clue/repos/addons +endif + +OUTDIR=$(OUTPUT)/$(NAME) +DISTRO_VER=$(shell xmlstarlet sel -t -v "//addon/@version" $(ROOT)/$(SRCDIR)/addon.xml) +DISTRO_REL=$(shell echo "$(DISTRO_VER)" | cut -f1 -d".") +DISTRO_MAJ=$(shell echo "$(DISTRO_VER)" | cut -f2 -d".") +DISTRO_MIN=$(shell echo "$(DISTRO_VER)" | cut -f3 -d".") +NEXT_MIN=$(shell python -c "print int($(DISTRO_MIN)) + 1") +NEXT_VER="${DISTRO_REL}.${DISTRO_MAJ}.${NEXT_MIN}" + + +info: + echo -e "\tName: $(NAME)" + echo -e "\tVersion ID: $(DISTRO_VER)" + echo -e "\tPackage File: $(OUTPUT)/targets/$(NAME).zip" + + +# Deploy resources (sources and/or system files) into the remote test RPi device, +# having Kodi v18* or CLue 2.0 linux OS with all components and packages. +deploy: +ifneq ($(RPIHOST),) +ifeq ($(shell [[ -d $(ROOT)/$(SRCDIR) ]] && echo -n yes),yes) + /usr/bin/rsync -a -zvh --progress --delete -e ssh $(ROOT)/$(SRCDIR)/ root@$(RPIHOST):/clue/.kodi/addons/$(NAME) +endif +ifeq ($(shell [[ -d $(ROOT)/$(SYSDIR) ]] && echo -n yes),yes) + /usr/bin/scp -r $(ROOT)/$(SYSDIR)/* root@$(RPIHOST):/clue/ +endif +else + echo "Your remote RPi device should have SSH service enabled, local public SSH key \ + already shared and RPIHOST local variable setted up with the host name or \ + IP address of the RPi device!" +endif + + +# Run testing process (for source files) for any remote host and location settled up +# using TESTPATH variable. IN case this variable is not set the test can be done +# for RPi host (identified by RPIHOST variable). Variable TESTPATH should have complete +# ssh location format: @HOST/ +test: +ifneq ($(TESTPATH),) +ifeq ($(shell [[ -d $(ROOT)/$(SRCDIR) ]] && echo -n yes),yes) + /usr/bin/rsync -a -zvh --progress --delete -e ssh $(ROOT)/$(SRCDIR)/ $(TESTPATH)/.kodi/addons/$(NAME) +endif +else +ifneq ($(RPIHOST),) +ifeq ($(shell [[ -d $(ROOT)/$(SRCDIR) ]] && echo -n yes),yes) + /usr/bin/rsync -a -zvh --progress --delete -e ssh $(ROOT)/$(SRCDIR)/ root@$(RPIHOST):/clue/.kodi/addons/$(NAME) +endif +else + echo "For testing process you have to set TESTPATH variable to test on any Kodi\ + environment (syncronized over rsync with ssh) or RPIHOST variable to test on a RPi\ + device. Test process suppose to synchronize only sourse files, system files can be\ + tested using 'deploy' target - only on RPi devices!" +endif +endif + +# Mark new revision (addon version) in the development copy +version: + xmlstarlet edit -L -P -u "//addon/@version" -v "$(NEXT_VER)" $(ROOT)/$(SRCDIR)/addon.xml + + +# Build addon package in deployment format +build: + mkdir -p $(OUTDIR) $(OUTDIR)/$(TARGETS) + cp -rf ${SRCDIR}/* $(OUTDIR)/ + cp -rf LICENSE $(OUTDIR)/ + cd $(OUTPUT) && /usr/bin/zip -q -y -r $(NAME).zip $(NAME) && cd $(ROOT) + mv -f $(OUTPUT)/$(NAME).zip $(OUTPUT)/targets/$(NAME).zip + + +# Publish the last build in the addon repository +publish: +ifeq ($(shell [[ -f $(OUTPUT)/targets/$(NAME).zip ]] && echo -n yes),yes) +ifneq ($(PUBLISH),) + # deploy package resources, rebuild repository descriptor +ifeq ($(shell [[ -f $(PUBLISH)/addons.xml ]] && echo -n yes),yes) + # define location and copy meta files + $(shell [[ ! -d $(PUBLISH)/$(NAME) ]] && mkdir $(PUBLISH)/$(NAME)) + cp -f $(ROOT)/$(SRCDIR)/addon.xml $(PUBLISH)/$(NAME)/ + $(shell [[ -f $(ROOT)/$(SRCDIR)/icon.png ]] && cp -f $(ROOT)/$(SRCDIR)/icon.png $(PUBLISH)/$(NAME)/) + $(shell [[ -f $(ROOT)/$(SRCDIR)/fanart.jpg ]] && cp -f $(ROOT)/$(SRCDIR)/fanart.jpg $(PUBLISH)/$(NAME)/) + $(shell [[ -f $(ROOT)/$(SRCDIR)/changelog.txt ]] && cp -f $(ROOT)/$(SRCDIR)/changelog.txt $(PUBLISH)/$(NAME)/) + cp -f $(OUTPUT)/targets/$(NAME).zip $(PUBLISH)/$(NAME)/$(NAME)-$(DISTRO_VER).zip + sha256sum $(PUBLISH)/$(NAME)/$(NAME)-$(DISTRO_VER).zip > $(PUBLISH)/$(NAME)/$(NAME)-$(DISTRO_VER).zip.sha256 + python $(PUBLISH)/xmlgen.py +else + echo "Repository location described by PUBLISH variable is not correct (doesn't \ + contain the expected structure and remote resources)!" +endif +else + echo "Repository location is not specified in PUBLISH variable. Set it up and try again!" +endif +else + echo "Repository location is not specified in PUBLISH variable. Set it up and try again!" +endif + + +# Commit and push updated files into versioning system (GitHUB). The 'message' input +# parameter is required. +gitrev: +ifneq ($(message),) + git add . + git commit -m "$(message)" + git push +else + @printf "\n* Please specify 'message' parameter!\n\n" + exit 1 +endif + + + +# Create and push a new versioning tag equals with the addon release. The uploaded can be +# done later - manually or through a separate task and thus the tag is transformed into a +# addon release +gitrel: + git tag "$(DISTRO_VER)" + git push origin --tags + +# Combine git commit and git release tasks into a single one, the only exception is that +# the commit doesn't require a message, if the message exist it will be used, if not a +# standard commit message will be composed using the addon version number +git: +ifeq ($(message),) + $(MAKE) gitrev -e message="Release $(DISTRO_VER)" +else + $(MAKE) gitrev +endif + $(MAKE) gitrel + + +# Create a complete release: new build, publish it in the repository, update the versioning +release: version build publish git + + +# Clean-up the release +clean: + rm -rf $(OUTDIR) + + +# Clean-up all build distributions, cache and stamps +cleanall: + rm -rf $(OUTDIR)/* $(OUTDIR)/.stamp $(OUTDIR)/.ccache + + +# Display the help text +help: + echo -e "\ +\nSYNOPSIS\n\ + make info | deploy | test \n\ + version | build | publish | release \n\ + make gitrev | gittag | version \n\ + make clean | cleanall \n\ + make help \n\ +\nDESCRIPTION\n\ + Executes one of the make targets defined through this Makefile flow, according \n\ + to the scope of this project.\n\n\ + info\n\ + provides main details about current release: package name, version id\n\ + and package file (should be found after execution of 'build' target)\n\ + >> this is the default target wihin the CCM process\n\ + deploy\n\ + deploys addon resources (sources and system files) on a remote test system\n\ + (RPi device described by RPIHOST variable)\n\ + test\n\ + runs testing process (for source files) for any remote host and location \n\ + settled up using TESTPATH variable. In case this variable is not set the \n\ + test can be done for RPi host (identified by RPIHOST variable).\n\ + version\n\ + create local new version within local addon descriptor (addon.xml),\n\ + the new version being the incremented value fo previous version\n\ + (for the minor version number)\n\ + build\n\ + build the addon package along to the new version and prepare the release\n\ + package file within location $(OUTPUT)/targets/$(NAME).zip\n\ + publish\n\ + install/publish the addon (already built) on the repository file\n\ + system (it has to be already mounted to the development environment)\n\ + release\n\ + Build the addon providing new local version, make release and publish it\n\ + on the Clue repository (already mounted to the local file system). Then\n\ + the released version is submitted in the versioning system (GitHUB) over a\n\ + new release tag version\n\ + gitrev\n\ + Commit the new release changes into versioning repository (GitHub)\n\ + gitrel\n\ + Create a new release tag into versioning repository (GitHub) using current\n\ + addon version (defined in the addon descriptor - addon.xml file)\n\ + git\n\ + Combine git commit and git release targets into a single one, the only exception\n\ + is that the commit doesn't require a message description; in case the message exist\n\ + it will be used as such, otherwise a standard commit message will be composed using\n\ + the addon version number\n\ + clean\n\ + cleanup the build resources within the output location\n\ + cleanall\n\ + Clean-up all resources from the output location (related or nor directly\n\ + connected to the addon build process\n\ + help\n\ + Shows this text\n\ +\n\ + There are couple of system variables that should be be set in order to drive the execution\n\ + of particular tasks:\n\ + PUBLISH\n\ + Indicates the remote file system mounted to the local development environment,\n\ + in order to deploy releases in the repository container.\n\ + OUTPUT\n\ + Describes the local file system location where the build process will be \n\ + executed. Default value is '$(ROOT)/../Clue-out'\n\ + RPIHOST\n\ + Indicates the host name or the IP address of the test system in order to deploy\n\ + addon resources through deploy or test task. The remote system should have SSH\n\ + service enabled and active.\n\ + TESTPATH\n\ + Describes the remote location for testing purposes. It should contain complete \n\ + ssh location format: @HOST/\n\ +\n\ +EXAMPLES\n\ + deploy the entire distribution on a testing environment ('deploy' task is default)\n\ + > make\n\ + > make deploy\n\n\ + build the entire distribution ('build' make task is default)\n\ + > make build\n\n\ + publish new release in the addon repository\n\ + > make publish\n\n\ + make complete addon release: build it, publish it and commit the changes on GitHub\n\ + > make release\n\n\ +" | more \ No newline at end of file diff --git a/README.md b/README.md index 26b4d77..f809eb4 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,25 @@ -# Clue Weather for MCPi and/or Kodi +# Clue Weather for Kodi **Clue Weather** package is designed to become main weather plugin for -MCPi and an alternative weather add-on for Kodi. The package comes with -two content providers the default one being **OpenWeatherMap** and the -secondary one is **Dark Sky**. Additionally, can be developed and plugged +_Kodi_ within **Clue** system or an alternative weather add-on for any _Kodi_ +instance. The package comes with three content providers the default one being +**Yahoo**, alternatively might be used **OpenWeatherMap** and the last one is +**Dark Sky** weather provider. Additionally, can be developed and plugged other sources using built-in plugin object model (see `ContentProvider` class definition). -Below are described the main skin properties published by the content provides -through their lifecycle. +Development, testing and deployment activities are driven by CCM process (Clue +Configuration Management), built over GNU `make` utility. To see all make rules +try `make help`. + +_Enjoy!_ + ## Details for Skinners or Plugin Developers -All values returned by the addon will include their units. +Below are described the main skin properties published by the content provides +through the addon execution flow. All values returned by the addon will include +their units. ### Weather Labels @@ -38,6 +45,12 @@ All values returned by the addon will include their units. * Current.OutlookIcon * Current.Visibility +* Forecast.City +* Forecast.Country +* Forecast.Latitude +* Forecast.Longitude +* Forecast.Updated + #### Today * Today.IsFetched @@ -48,21 +61,28 @@ All values returned by the addon will include their units. #### Day [0-6] -* Day.%i.IsFetched -* Day.%i.Title -* Day.%i.HighTemp -* Day.%i.LowTemp -* Day.%i.Outlook -* Day.%i.OutlookIcon -* Day.%i.FanartCode -* Day.%i.WindSpeed -* Day.%i.WindDirection -* Day.%i.Humidity -* Day.%i.DewPoint -* Day.%i.UVIndex -* Day.%i.Visibility -* Day.%i.HighTemperature -* Day.%i.LowTemperature +Day%i.Title +Day%i.HighTemp +Day%i.LowTemp +Day%i.Outlook +Day%i.OutlookIcon +Day%i.FanartCode + +* Daily.%i.IsFetched +* Daily.%i.Title +* Daily.%i.HighTemp +* Daily.%i.LowTemp +* Daily.%i.Outlook +* Daily.%i.OutlookIcon +* Daily.%i.FanartCode +* Daily.%i.WindSpeed +* Daily.%i.WindDirection +* Daily.%i.Humidity +* Daily.%i.DewPoint +* Daily.%i.UVIndex +* Daily.%i.Visibility +* Daily.%i.HighTemperature +* Daily.%i.LowTemperature #### Hourly[0-16] diff --git a/res/yahoo.png b/res/yahoo.png new file mode 100644 index 0000000000000000000000000000000000000000..9845eaa2fa6d9950c8cfbd3ea970972cb12d8f6a GIT binary patch literal 16359 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 literal 0 HcmV?d00001 diff --git a/src/addon.xml b/src/addon.xml index e6f573d..9a971a0 100644 --- a/src/addon.xml +++ b/src/addon.xml @@ -1,12 +1,12 @@ - + - - + + - Clue Weather for MCPi - Weather service for Clue MCPi or Kodi, providing weather forecast content from various providers + Clue Weather for Kodi + Weather service for Clue and Kodi, providing weather forecast content from Yahoo, OpenWeatherMap and Dark Sky weather providers diff --git a/src/changelog.txt b/src/changelog.txt index ad70307..ce79b75 100644 --- a/src/changelog.txt +++ b/src/changelog.txt @@ -1,3 +1,7 @@ +v2.0 +- Implementation of Yahoo provider +- Migrate addon to Python3 + v1.4 - Adapt addon configuration and the logic behind - Implementation of DarkSky new provider diff --git a/src/default.py b/src/default.py index 06555ee..925199b 100644 --- a/src/default.py +++ b/src/default.py @@ -113,7 +113,7 @@ def setLocation(self, config): commons.debug("Setting new location (%s)" %config) provider = self.getProviderByCode(commons.getAddonSetting('Provider')) if provider is None: - raise StandardError("No content provider selected for configuration") + raise RuntimeError("No content provider selected for configuration") inputval = commons.StringInputDialog(14024, commons.getAddonSetting(config + "Action")) if inputval is not None and inputval != '': locnames, locids = provider.location(inputval) diff --git a/src/resources/media/yahoo.png b/src/resources/media/yahoo.png new file mode 100644 index 0000000000000000000000000000000000000000..9845eaa2fa6d9950c8cfbd3ea970972cb12d8f6a GIT binary patch literal 16359 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 literal 0 HcmV?d00001 diff --git a/src/resources/providers/abstract.py b/src/resources/providers/abstract.py index 1fd43a0..e8c7ace 100644 --- a/src/resources/providers/abstract.py +++ b/src/resources/providers/abstract.py @@ -3,11 +3,14 @@ import os import sys import abc +import gzip import json import time +import math import base64 import commons -import urllib2 +from io import StringIO +from urllib import request as urllib2 if hasattr(sys.modules["__main__"], "xbmc"): xbmc = sys.modules["__main__"].xbmc @@ -33,6 +36,8 @@ class ContentProvider(object): __metaclass__ = abc.ABCMeta + LOCATION = '' + FORECAST = '' LANGUAGE = xbmc.getLanguage().lower() UM_SPEED = xbmc.getRegion('speedunit') UM_TEMPR = xbmc.getRegion('tempunit') @@ -97,6 +102,7 @@ def __repr__(self): def name(self): pass + @abc.abstractmethod def code(self): pass @@ -127,6 +133,39 @@ def apikey(self): return commons.setting("APIKey") + def _find(self, url): + commons.debug("Calling URL: %s" % url, self.code()) + try: + req = urllib2.urlopen(url) + response = req.read() + req.close() + except: + response = '' + return self._parse(response) + + + def _call(self, url): + retry = 0 + data = None + while data is None and retry < 6 and not xbmc.abortRequested: + try: + commons.debug("Calling URL: %s" % url, self.code()) + req = urllib2.Request(url) + req.add_header('Accept-encoding', 'gzip') + response = urllib2.urlopen(req) + if response.info().get('Content-Encoding') == 'gzip': + buf = StringIO(response.read()) + compr = gzip.GzipFile(fileobj=buf) + data = compr.read() + else: + data = response.read() + response.close() + except: + data = None + retry += 1 + return self._parse(data) + + def _parse(self, content): if content is not None: commons.debug("Parsing content: %s" % content) @@ -188,17 +227,28 @@ def clear(self): self.skinproperty('Today.LowTemperature') self.skinproperty('Daily.IsFetched') for index in range(0, 6): - self.skinproperty('Day.%i.Title' % index) - self.skinproperty('Day.%i.HighTemp' % index) - self.skinproperty('Day.%i.LowTemp' % index) - self.skinproperty('Day.%i.Outlook' % index) - self.skinproperty('Day.%i.OutlookIcon' % index) - self.skinproperty('Day.%i.FanartCode' % index) - self.skinproperty('Day.%i.Pressure' % index) - self.skinproperty('Day.%i.Humidity' % index) - self.skinproperty('Day.%i.UVIndex' % index) - self.skinproperty('Day.%i.DewPoint' % index) - self.skinproperty('Day.%i.Visibility' % index) + # Standard + self.skinproperty('Day%i.Title' % index) + self.skinproperty('Day%i.HighTemp' % index) + self.skinproperty('Day%i.LowTemp' % index) + self.skinproperty('Day%i.Outlook' % index) + self.skinproperty('Day%i.OutlookIcon' % index) + self.skinproperty('Day%i.FanartCode' % index) + # Extended + self.skinproperty('Daily.%i.ShortDay' % index) + self.skinproperty('Daily.%i.LongDay' % index) + self.skinproperty('Daily.%i.ShortDate' % index) + self.skinproperty('Daily.%i.LongDate' % index) + self.skinproperty('Daily.%i.Outlook' % index) + self.skinproperty('Daily.%i.OutlookIcon' % index) + self.skinproperty('Daily.%i.FanartCode' % index) + self.skinproperty('Daily.%i.Pressure' % index) + self.skinproperty('Daily.%i.Humidity' % index) + self.skinproperty('Daily.%i.UVIndex' % index) + self.skinproperty('Daily.%i.DewPoint' % index) + self.skinproperty('Daily.%i.Visibility' % index) + self.skinproperty('Daily.%i.HighTemperature' % index) + self.skinproperty('Daily.%i.LowTemperature' % index) self.skinproperty('Hourly.IsFetched') for index in range(0, 16): self.skinproperty('Hourly.%i.Time' % index) @@ -265,7 +315,26 @@ def _fanart(self, code): def _2shday(self, value): - return time.strftime('%A', time.localtime(value)) + return time.strftime('%a', time.localtime(value)) + + + def _2lnday(self, value): + if not isinstance(value, int): + value = time.strftime('%w', time.localtime(value)) + if value == 0: + return xbmc.getLocalizedString(17) + elif value == 1: + return xbmc.getLocalizedString(11) + elif value == 2: + return xbmc.getLocalizedString(12) + elif value == 3: + return xbmc.getLocalizedString(13) + elif value == 4: + return xbmc.getLocalizedString(14) + elif value == 5: + return xbmc.getLocalizedString(15) + elif value == 6: + return xbmc.getLocalizedString(16) def _2shtime(self, value): @@ -276,9 +345,39 @@ def _2shdate(self, value): return time.strftime('%d %b', time.localtime(value)) + def _2lndate(self, value): + return time.strftime('%d %B %Y', time.localtime(value)) + + def _2shdatetime(self, value): return time.strftime('%d %b %H:%M', time.localtime(value)) + def _dewpoint(Tc=0, RH=93, minRH=(0, 0.075)[0]): + """ Dewpoint from relative humidity and temperature + If you know the relative humidity and the air temperature, + and want to calculate the dewpoint, the formulas are as follows. + + getDewPoint( tCelsius, humidity ) + """ + # First, if your air temperature is in degrees Fahrenheit, then you must convert it to degrees Celsius by using the Fahrenheit to Celsius formula. + # Tc = 5.0 / 9.0 * ( Tf - 32.0 ) + # The next step is to obtain the saturation vapor pressure(Es) using this formula as before when air temperature is known. + Es = 6.11 * 10.0 ** (7.5 * Tc / (237.7 + Tc)) + # The next step is to use the saturation vapor pressure and the relative humidity to compute the actual vapor pressure(E) of the air. This can be done with the following formula. + # RH=relative humidity of air expressed as a percent. or except minimum(.075) humidity to abort error with math.log. + RH = RH or minRH # 0.075 + E = (RH * Es) / 100 + # Note: math.log( ) means to take the natural log of the variable in the parentheses + # Now you are ready to use the following formula to obtain the dewpoint temperature. + try: + DewPoint = (-430.22 + 237.7 * math.log(E)) / (-math.log(E) + 19.08) + except ValueError: + # math domain error, because RH = 0% + # return "N/A" + DewPoint = 0 # minRH + # Note: Due to the rounding of decimal places, your answer may be slightly different from the above answer, but it should be within two degrees. + return str(int(round(DewPoint))) + def coordinates(self, lat, long): self._latitude = lat diff --git a/src/resources/providers/darksky.py b/src/resources/providers/darksky.py index 8799957..a90719d 100644 --- a/src/resources/providers/darksky.py +++ b/src/resources/providers/darksky.py @@ -4,10 +4,9 @@ import gzip import socket import commons -import urllib2 import unicodedata -from StringIO import StringIO -from abstract import ContentProvider +from urllib import request as urllib2 +from .abstract import ContentProvider if hasattr(sys.modules["__main__"], "xbmc"): xbmc = sys.modules["__main__"].xbmc @@ -38,6 +37,21 @@ def __init__(self): socket.setdefaulttimeout(10) + def _find(self, loc): + url = self.LOCATION % (urllib2.quote(loc)) + return super(ContentProvider, self)._find(url) + + + def _call(self, id): + url = self.FORECAST % (self.apikey, id, self.lang, "si") + return super(ContentProvider, self)._call(url) + + + def _fanart(self, code): + """Detect and return fanart code""" + return self.ART_BASE[self.ART_DATA[code]] + + def name(self): return "Dark Sky" @@ -52,35 +66,7 @@ def validate(self): req = urllib2.urlopen(_url) req.close() except: - raise StandardError("Invalid provider configuration") - - - def _find(self, loc): - url = self.LOCATION %(urllib2.quote(loc)) - commons.debug("Calling URL: %s" % url, self.code()) - try: - req = urllib2.urlopen(url) - response = req.read() - req.close() - except: - response = '' - return self._parse(response) - - - def location(self, string): - locs = [] - locids = [] - loc = unicodedata.normalize('NFKD', unicode(string, 'utf-8')).encode('ascii', 'ignore') - commons.debug('Searching for location: %s' % loc, self.code()) - data = self._find(loc) - commons.debug('Found location data: %s' % data, self.code()) - if data is not None and data.has_key("latitude"): - self.coordinates(data["latitude"], data["longitude"]) - location = string.replace(",", "-") - locationid = str(self.latitude) + "," + str(self.longitude) - locs.append(location) - locids.append(str(locationid)) - return locs, locids + raise RuntimeError("Invalid provider configuration") def geoip(self): @@ -101,16 +87,33 @@ def geoip(self): return location, str(locationid) + def location(self, string): + locs = [] + locids = [] + loc = unicodedata.normalize('NFKD', str(string)).encode('ascii', 'ignore') + commons.debug('Searching for location: %s' % loc, self.code()) + data = self._find(loc) + commons.debug('Found location data: %s' % data, self.code()) + if data is not None and data.has_key("latitude"): + self.coordinates(data["latitude"], data["longitude"]) + location = string.replace(",", "-") + locationid = str(self.latitude) + "," + str(self.longitude) + locs.append(location) + locids.append(str(locationid)) + return locs, locids + + def forecast(self, loc, locid): commons.debug('Weather forecast for location: %s' % locid, self.code()) - data = self.call(locid) + data = self._call(locid) # Current weather forecast if data is not None and data.has_key('currently'): item = data['currently'] + # Current - standard self.skinproperty('Current.IsFetched', 'true') + self.skinproperty('Current.Location', loc) self.skinproperty('Current.Latitude', data['latitude']) self.skinproperty('Current.Longitude', data['longitude']) - self.skinproperty('Current.Location', loc) self.skinproperty('Current.Condition', item["summary"].capitalize()) self.skinproperty('Current.Temperature', self._2c(item['temperature'])) self.skinproperty('Current.Wind', self._2kph(item['windSpeed'])) @@ -125,6 +128,12 @@ def forecast(self, loc, locid): self.skinproperty('Current.Visibility', self._2km(self._2km(item['visibility'], 'km'), self.UM_DSTNC), self.UM_DSTNC) self.skinproperty('Current.DewPoint', item['dewPoint']) self.skinproperty('Current.UVIndex', item['uvIndex']) + # Forecast - extended + self.skinproperty('Forecast.City', loc) + self.skinproperty('Forecast.Country', '') + self.skinproperty('Forecast.Latitude', data['latitude']) + self.skinproperty('Forecast.Longitude', data['longitude']) + self.skinproperty('Forecast.Updated', self._2shdatetime(item['time'])) # Today forecast if data is not None and data.has_key('daily') and data['daily'].has_key('data') and len(data['daily']['data']) > 0: item = data['daily']['data'][0] @@ -140,19 +149,30 @@ def forecast(self, loc, locid): self.skinproperty('Daily.IsFetched', 'true') for item in data['daily']['data']: if index >= 1: - self.skinproperty('Day.%i.Title' % count, self._2shday(item['time'])) - self.skinproperty('Day.%i.Condition' % count, item["summary"].capitalize()) - self.skinproperty('Day.%i.Outlook' % count, item["summary"].capitalize()) - self.skinproperty('Day.%i.OutlookIcon' % count, '%s.png' % self._fanart(item["icon"])) - self.skinproperty('Day.%i.FanartCode' % count, self._fanart(item["icon"])) - self.skinproperty('Day.%i.Wind' % count, self._2wind(item['windSpeed'])) - self.skinproperty('Day.%i.WindDirection' % count, item['windBearing'], '°') if item.has_key('windBearing') else self.skinproperty('Day.%i.WindDirection' % count) - self.skinproperty('Day.%i.Humidity' % count, 100*item['humidity']) - self.skinproperty('Day.%i.Pressure' % count, item['pressure'], "hPa") - self.skinproperty('Day.%i.DewPoint' % count, item['dewPoint']) - self.skinproperty('Day.%i.UVIndex' % count, item['uvIndex']) - self.skinproperty('Day.%i.HighTemp' % count, self._2temp(int(item['temperatureHigh'])), self.UM_TEMPR) - self.skinproperty('Day.%i.LowTemp' % count, self._2temp(int(item['temperatureLow'])), self.UM_TEMPR) + # Standard + self.skinproperty('Day%i.Title' % count, self._2lnday(item['time'])) + self.skinproperty('Day%i.HighTemp' % count, self._2temp(int(item['temperatureHigh'])), self.UM_TEMPR) + self.skinproperty('Day%i.LowTemp' % count, self._2temp(int(item['temperatureLow'])), self.UM_TEMPR) + self.skinproperty('Day%i.Outlook' % count, item["summary"].capitalize()) + self.skinproperty('Day%i.OutlookIcon' % count, '%s.png' % self._fanart(item["icon"])) + self.skinproperty('Day%i.FanartCode' % count, self._fanart(item["icon"])) + # Extended + self.skinproperty('Daily.%i.ShortDay' % count, self._2shday(item['time'])) + self.skinproperty('Daily.%i.LongDay' % count, self._2lnday(item['time'])) + self.skinproperty('Daily.%i.ShortDate' % count, self._2shday(item['time'])) + self.skinproperty('Daily.%i.LongDate' % count, self._2lnday(item['time'])) + self.skinproperty('Daily.%i.Outlook' % count, item["summary"].capitalize()) + self.skinproperty('Daily.%i.OutlookIcon' % count, '%s.png' % self._fanart(item["icon"])) + self.skinproperty('Daily.%i.FanartCode' % count, self._fanart(item["icon"])) + self.skinproperty('Daily.%i.Condition' % count, item["summary"].capitalize()) + self.skinproperty('Daily.%i.Wind' % count, self._2wind(item['windSpeed'])) + self.skinproperty('Daily.%i.WindDirection' % count, item['windBearing'], '°') if item.has_key('windBearing') else self.skinproperty('Day.%i.WindDirection' % count) + self.skinproperty('Daily.%i.Humidity' % count, 100*item['humidity']) + self.skinproperty('Daily.%i.Pressure' % count, item['pressure'], "hPa") + self.skinproperty('Daily.%i.DewPoint' % count, item['dewPoint']) + self.skinproperty('Daily.%i.UVIndex' % count, item['uvIndex']) + self.skinproperty('Daily.%i.HighTemperature' % count, self._2temp(int(item['temperatureHigh'])), self.UM_TEMPR) + self.skinproperty('Daily.%i.LowTemperature' % count, self._2temp(int(item['temperatureLow'])), self.UM_TEMPR) count += 1 index += 1 # Hourly weather forecast @@ -190,31 +210,3 @@ def forecast(self, loc, locid): text += "[B]" + title + "[/B] - " + description + " (" + expire + ")" count += 1 self.skinproperty('Alerts.Text', text) - - - def call(self, id): - retry = 0 - data = None - url = self.FORECAST % (self.apikey, id, self.lang, "si") - while data is None and retry < 6 and not xbmc.abortRequested: - try: - commons.debug("Calling URL: %s" %url, self.code()) - req = urllib2.Request(url) - req.add_header('Accept-encoding', 'gzip') - response = urllib2.urlopen(req) - if response.info().get('Content-Encoding') == 'gzip': - buf = StringIO(response.read()) - compr = gzip.GzipFile(fileobj=buf) - data = compr.read() - else: - data = response.read() - response.close() - except: - data = None - retry += 1 - return self._parse(data) - - - def _fanart(self, code): - """Detect and return fanart code""" - return self.ART_BASE[self.ART_DATA[code]] diff --git a/src/resources/providers/openweathermap.py b/src/resources/providers/openweathermap.py index 12c0934..1a3eec0 100644 --- a/src/resources/providers/openweathermap.py +++ b/src/resources/providers/openweathermap.py @@ -4,10 +4,10 @@ import gzip import socket import commons -import urllib2 import unicodedata -from StringIO import StringIO -from abstract import ContentProvider +from io import StringIO +from urllib import request as urllib2 +from .abstract import ContentProvider if hasattr(sys.modules["__main__"], "xbmc"): xbmc = sys.modules["__main__"].xbmc @@ -43,6 +43,21 @@ def __init__(self): socket.setdefaulttimeout(10) + def _find(self, loc): + url = self.LOCATION % (urllib2.quote(loc)) + return super(ContentProvider, self)._find(url) + + + def _call(self, feature, id): + url = self.FORECAST % (feature, id, self.apikey, "metric", self.lang) + return self._call(url) + + + def _fanart(self, code): + """Detect and return fanart code""" + return self.ART_BASE[self.ART_DATA[code]] + + def name(self): return "OpenWeatherMap" @@ -57,37 +72,7 @@ def validate(self): req = urllib2.urlopen(_url) req.close() except: - raise StandardError("Invalid provider configuration") - - - def _find(self, loc): - url = self.LOCATION %(urllib2.quote(loc), self.apikey) - commons.debug("Calling URL: %s" % url, self.code()) - try: - req = urllib2.urlopen(url) - response = req.read() - req.close() - except: - response = '' - return self._parse(response) - - - def location(self, string): - locs = [] - locids = [] - loc = unicodedata.normalize('NFKD', unicode(string, 'utf-8')).encode('ascii', 'ignore') - commons.debug('Searching for location: %s' % loc, self.code()) - data = self._find(loc) - commons.debug('Found location data: %s' % data, self.code()) - if data is not None and data.has_key("list"): - for item in data["list"]: - location = item["name"] - if item.has_key("sys") and item["sys"].has_key("country"): - location += "-" + item["sys"]["country"] - locationid = item["id"] - locs.append(location) - locids.append(str(locationid)) - return locs, locids + raise RuntimeError("Invalid provider configuration") def geoip(self): @@ -110,11 +95,30 @@ def geoip(self): return location, str(locationid) + def location(self, string): + locs = [] + locids = [] + loc = unicodedata.normalize('NFKD', str(string)).encode('ascii', 'ignore') + commons.debug('Searching for location: %s' % loc, self.code()) + data = self._find(loc) + commons.debug('Found location data: %s' % data, self.code()) + if data is not None and data.has_key("list"): + for item in data["list"]: + location = item["name"] + if item.has_key("sys") and item["sys"].has_key("country"): + location += "-" + item["sys"]["country"] + locationid = item["id"] + locs.append(location) + locids.append(str(locationid)) + return locs, locids + + def forecast(self, loc, locid): commons.debug('Weather forecast for location: %s' % locid, self.code()) # Current weather forecast - data = self.call('weather', locid) + data = self._call('weather', locid) if data is not None and data.has_key('weather') and data.has_key("cod") and data["cod"] == 200: + # current - standard self.skinproperty('Current.IsFetched', 'true') self.skinproperty('Current.Location', loc) self.skinproperty('Current.Latitude', data['coord']['lat']) @@ -127,18 +131,24 @@ def forecast(self, loc, locid): self.skinproperty('Current.Pressure', data['main']['pressure'], "hPa") self.skinproperty('Current.OutlookIcon', '%s.png' % self._fanart(data['weather'][0]["icon"])) self.skinproperty('Current.FanartCode', self._fanart(data['weather'][0]["icon"])) - #self.skinproperty('Current.Visibility', self._2km(self._2km(data['visibility']), self.UM_DSTNC), self.UM_DSTNC) + self.skinproperty('Current.Visibility', self._2km(self._2km(data['visibility']), self.UM_DSTNC), self.UM_DSTNC) self.skinproperty('Current.LocalTime', self._2shtime(data['dt'])) self.skinproperty('Current.LocalDate', self._2shdate(data['dt'])) self.skinproperty('Current.FeelsLike', self.feelslike(self._2c(data['main']['temp']), self._2kph(data['wind']['speed']), data['main']['humidity'])) - self.skinproperty('Today.IsFetched', 'true') + # Forecast - extended + self.skinproperty('Forecast.City', loc) + self.skinproperty('Forecast.Country', data['sys']['country']) + self.skinproperty('Forecast.Latitude', data['coord']['lat']) + self.skinproperty('Forecast.Longitude', data['coord']['lon']) + self.skinproperty('Forecast.Updated', self._2shdatetime(data['dt'])) # Today forecast + self.skinproperty('Today.IsFetched', 'true') self.skinproperty('Today.Sunrise', self._2shtime(data['sys']['sunrise'])) self.skinproperty('Today.Sunset', self._2shtime(data['sys']['sunset'])) self.skinproperty('Today.HighTemperature', self._2c(data['main']['temp_max']), self.UM_TEMPR) self.skinproperty('Today.LowTemperature', self._2c(data['main']['temp_min']), self.UM_TEMPR) # Hourly weather forecast - data = self.call('forecast', locid) + data = self._call('forecast', locid) if data['list'] is not None and len(data['list']) >= 1: count = 0 self.skinproperty('Hourly.IsFetched', 'true') @@ -160,31 +170,3 @@ def forecast(self, loc, locid): # Daily weather forecast self.skinproperty('Daily.IsFetched') self.skinproperty('Alerts.IsFetched') - - - def call(self, feature, id): - retry = 0 - data = None - url = self.FORECAST % (feature, id, self.apikey, "metric", self.lang) - while data is None and retry < 6 and not xbmc.abortRequested: - try: - commons.debug("Calling URL: %s" %url, self.code()) - req = urllib2.Request(url) - req.add_header('Accept-encoding', 'gzip') - response = urllib2.urlopen(req) - if response.info().get('Content-Encoding') == 'gzip': - buf = StringIO(response.read()) - compr = gzip.GzipFile(fileobj=buf) - data = compr.read() - else: - data = response.read() - response.close() - except: - data = None - retry += 1 - return self._parse(data) - - - def _fanart(self, code): - """Detect and return fanart code""" - return self.ART_BASE[self.ART_DATA[code]] diff --git a/src/resources/providers/yahoo.py b/src/resources/providers/yahoo.py new file mode 100644 index 0000000..d195e2d --- /dev/null +++ b/src/resources/providers/yahoo.py @@ -0,0 +1,177 @@ +# -*- coding: utf-8 -*- + +import sys +import time +import socket +import commons +import unicodedata +from datetime import datetime +from urllib import request as urllib2 +from .abstract import ContentProvider + +if hasattr(sys.modules["__main__"], "xbmc"): + xbmc = sys.modules["__main__"].xbmc +else: + import xbmc + + +class Yahoo(ContentProvider): + LOCATION = 'https://www.yahoo.com/news/_tdnews/api/resource/WeatherSearch;text=%s' + FORECAST = 'https://www.yahoo.com/news/_tdnews/api/resource/WeatherService;woeids=%s' + + + def __init__(self): + socket.setdefaulttimeout(10) + + + def name(self): + return "Yahoo" + + + def code(self): + return "yahoo" + + + def validate(self): + pass + + def _2shdate(self, value): + ts = time.strptime(value, "%Y-%m-%dT%H:%M:%S.%zZ") + dt = datetime.fromtimestamp(time.mktime(ts)) + return super(ContentProvider, self)._2shdate(dt.timestamp()) + + + def _2lndate(self, value): + ts = time.strptime(value, "%Y-%m-%dT%H:%M:%S.%zZ") + dt = datetime.fromtimestamp(time.mktime(ts)) + return super(ContentProvider, self)._2lndate(dt.timestamp()) + + + def _find(self, loc): + url = self.LOCATION % (urllib2.quote(loc)) + return super(ContentProvider, self)._find(url) + + + def _call(self, id): + url = self.FORECAST % id + return super(ContentProvider, self)._call(url) + + + def geoip(self): + data = self.ipinfo() + location = '' + locationid = '' + if data is not None and data.has_key("city"): + code = data["city"] + if data.has_key("regionName"): + code += "," + data["regionName"] + if data.has_key("country"): + code += "," + data["country"] + commons.debug('Identifying GeoIP location: %s' % code, self.code()) + data = self._find(code) + commons.debug('Found location data: %s' % data, self.code()) + if data is not None and data.has_key("woeid"): + self.coordinates(data["lat"], data["lon"]) + locationid = data["woeid"] + if data.has_key("qualifiedName"): + location = data["qualifiedName"] + else: + location = code + return location, str(locationid) + + + def location(self, string): + locs = [] + locids = [] + loc = unicodedata.normalize('NFKD', str(string)).encode('ascii', 'ignore') + commons.debug('Searching for location: %s' % loc, self.code()) + data = self._find(loc) + commons.debug('Found location data: %s' % data, self.code()) + if data is not None and isinstance(data, list): + for item in data: + locationid = item["woeid"] + if item.has_key("qualifiedName"): + location = item["qualifiedName"] + else: + location = item["city"] + "," + item["country"] + + locs.append(location) + locids.append(str(locationid)) + return locs, locids + + + def forecast(self, loc, locid): + commons.debug('Weather forecast for location: %s' % locid, self.code()) + # Current weather forecast + data = self._call(locid) + if data is not None and data.has_key('weather') and data.has_key("cod") and data["cod"] == 200: + data = data['weathers'][0] + # Current - standard + self.skinproperty('Current.IsFetched', 'true') + self.skinproperty('Current.Location', data['location']['displayName']) + self.skinproperty('Current.Condition', data['observation']['conditionDescription']) + self.skinproperty('Current.Temperature', self._2c(data['observation']['temperature']['now'])) + self.skinproperty('Current.UVIndex', str(data['observation']['uvIndex'])) + self.skinproperty('Current.OutlookIcon', '%s.png' % str(data['observation']['conditionCode'])) # Kodi translates it to Current.ConditionIcon + self.skinproperty('Current.FanartCode', str(data['observation']['conditionCode'])) + self.skinproperty('Current.Wind', self._2kph(data['observation']['windSpeed'])) + self.skinproperty('Current.WindDirection', data['observation']['windDirection'], '°') if data['observation'].has_key('windBearing') else self.skinproperty('Current.WindDirection') + self.skinproperty('Current.Humidity', str(data['observation']['humidity'])) + self.skinproperty('Current.DewPoint', self._dewpoint(int(self._2c(data['observation']['temperature']['now'])), data['observation']['humidity'])) + self.skinproperty('Current.FeelsLike', self._2c(data['observation']['temperature']['feelsLike'])) + self.skinproperty('Current.Visibility', self._2km(self._2km(data['observation']['visibility'], 'km'), self.UM_DSTNC), self.UM_DSTNC) + self.skinproperty('Current.Pressure', data['observation']['barometricPressure'], "hPa") + # Forecast - extended + self.skinproperty('Forecast.City', data['location']['displayName']) + self.skinproperty('Forecast.Country', data['location']['countryName']) + self.skinproperty('Forecast.Latitude', data['location']['latitude']) + self.skinproperty('Forecast.Longitude', data['location']['longitude']) + self.skinproperty('Forecast.Updated', self._2shdatetime(data['observation']['observationTime']['timestamp'])) + # Today - extended + self.skinproperty('Today.IsFetched', 'true') + self.skinproperty('Today.Sunrise', self._2shtime(data['sunAndMoon']['sunrise'])) + self.skinproperty('Today.Sunset', self._2shtime(data['sunAndMoon']['sunset'])) + self.skinproperty('Today.HighTemperature', self._2c(data['observation']['temperature']['high']), self.UM_TEMPR) + self.skinproperty('Today.LowTemperature', self._2c(data['observation']['temperature']['low']), self.UM_TEMPR) + # Hourly - extended + if data['forecasts'] is not None and data['forecasts']['hourly'] is not None and len(data['forecasts']['hourly']) >= 1: + self.skinproperty('Hourly.IsFetched', 'true') + for count, item in enumerate(data['forecasts']['hourly']): + self.skinproperty('Hourly.%i.Time' %count, self._2shtime(item['observationTime']['timestamp'])) + self.skinproperty('Hourly.%i.LongDate' %count, self._2lndate(item['observationTime']['timestamp'])) + self.skinproperty('Hourly.%i.ShortDate' %count, self._2shdate(item['observationTime']['timestamp'])) + self.skinproperty('Hourly.%i.Temperature' %count, self._2c(item['temperature']['now']), self.UM_TEMPR) + self.skinproperty('Hourly.%i.FeelsLike' %count, self._2c(item['temperature']['feelsLike']), self.UM_TEMPR) + self.skinproperty('Hourly.%i.Outlook' %count, item['conditionDescription']) + self.skinproperty('Hourly.%i.OutlookIcon' %count, '%s.png' % str(item['conditionCode'])) + self.skinproperty('Hourly.%i.FanartCode' %count, item['conditionCode']) + self.skinproperty('Hourly.%i.Humidity' %count, item['humidity']) + self.skinproperty('Hourly.%i.Precipitation' %count, item['precipitationProbability']) + self.skinproperty('Hourly.%i.WindDirection' %count, item['windDirection'], '°') + self.skinproperty('Hourly.%i.WindSpeed' %count, self._2wind(item['windSpeed'])) + self.skinproperty('Hourly.%i.WindDegree' %count, str(item['windDirection']), '°') + self.skinproperty('Hourly.%i.DewPoint' %count, self._dewpoint(self._2c(item['temperature']['now']), item['humidity']), self.UM_TEMPR) + # Daily - standard + if data['forecasts'] is not None and data['forecasts']['daily'] is not None and len(data['forecasts']['daily']) >= 1: + for count, item in enumerate(data['forecasts']['daily']): + # Standard + self.skinproperty('Day%i.Title' %count, self._2lnday(item['observationTime']['weekday'])) + self.skinproperty('Day%i.HighTemp' %count, self._2c(item['temperature']['high']), self.UM_TEMPR) + self.skinproperty('Day%i.LowTemp' %count, self._2c(item['temperature']['low']), self.UM_TEMPR) + self.skinproperty('Day%i.Outlook' %count, item['conditionDescription']) + self.skinproperty('Day%i.OutlookIcon' %count, '%s.png' % item['conditionCode']) + self.skinproperty('Day%i.FanartCode' %count, item['conditionCode']) + # Extended + self.skinproperty('Daily.%i.ShortDay' %count, self._2shday(item['observationTime']['weekday'])) + self.skinproperty('Daily.%i.LongDay' %count, self._2lnday(item['observationTime']['weekday'])) + self.skinproperty('Daily.%i.ShortDate' %count, self._2shdate(item['observationTime']['timestamp'])) + self.skinproperty('Daily.%i.LongDate' %count, self._2lndate(item['observationTime']['timestamp'])) + self.skinproperty('Daily.%i.HighTemperature' %count, self._2c(item['temperature']['high']) + self.UM_TEMPR) + self.skinproperty('Daily.%i.LowTemperature' %count, self._2c(item['temperature']['low']) + self.UM_TEMPR) + self.skinproperty('Daily.%i.Outlook' %count, str(item['conditionDescription'])) + self.skinproperty('Daily.%i.OutlookIcon' %count, '%s.png' % str(item['conditionCode'])) + self.skinproperty('Daily.%i.FanartCode' %count, str(item['conditionCode'])) + self.skinproperty('Daily.%i.Humidity' %count, str(item['humidity']) + '%') + self.skinproperty('Daily.%i.Precipitation' %count, str(item['precipitationProbability']) + '%') + self.skinproperty('Daily.%i.DewPoint' %count, self._dewpoint(self._2c(item['temperature']['low']), item['humidity'])) + diff --git a/venv/bin/activate b/venv/bin/activate new file mode 100644 index 0000000..b8f9e33 --- /dev/null +++ b/venv/bin/activate @@ -0,0 +1,84 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + + +if [ "${BASH_SOURCE-}" = "$0" ]; then + echo "You must source this script: \$ source $0" >&2 + exit 33 +fi + +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/stefan/Workspace/weather.clue/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 || true + +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 diff --git a/venv/bin/activate.csh b/venv/bin/activate.csh new file mode 100644 index 0000000..1fc6765 --- /dev/null +++ b/venv/bin/activate.csh @@ -0,0 +1,55 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . + +set newline='\ +' + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH:q" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT:q" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/home/stefan/Workspace/weather.clue/venv" + +set _OLD_VIRTUAL_PATH="$PATH:q" +setenv PATH "$VIRTUAL_ENV:q/bin:$PATH:q" + + + +if ("" != "") then + set env_name = "" +else + set env_name = '('"$VIRTUAL_ENV:t:q"') ' +endif + +if ( $?VIRTUAL_ENV_DISABLE_PROMPT ) then + if ( $VIRTUAL_ENV_DISABLE_PROMPT == "" ) then + set do_prompt = "1" + else + set do_prompt = "0" + endif +else + set do_prompt = "1" +endif + +if ( $do_prompt == "1" ) then + # 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:q" + if ( "$prompt:q" =~ *"$newline:q"* ) then + : + else + set prompt = "$env_name:q$prompt:q" + endif + endif +endif + +unset env_name +unset do_prompt + +alias pydoc python -m pydoc + +rehash diff --git a/venv/bin/activate.fish b/venv/bin/activate.fish new file mode 100644 index 0000000..c5ce1d5 --- /dev/null +++ b/venv/bin/activate.fish @@ -0,0 +1,102 @@ +# This file must be used using `source bin/activate.fish` *within a running fish ( http://fishshell.com ) session*. +# Do not run it directly. + +function _bashify_path -d "Converts a fish path to something bash can recognize" + set fishy_path $argv + set bashy_path $fishy_path[1] + for path_part in $fishy_path[2..-1] + set bashy_path "$bashy_path:$path_part" + end + echo $bashy_path +end + +function _fishify_path -d "Converts a bash path to something fish can recognize" + echo $argv | tr ':' '\n' +end + +function deactivate -d 'Exit virtualenv mode and return to the normal environment.' + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + # https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling + if test (echo $FISH_VERSION | tr "." "\n")[1] -lt 3 + set -gx PATH (_fishify_path $_OLD_VIRTUAL_PATH) + else + set -gx PATH $_OLD_VIRTUAL_PATH + end + 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" + and functions -q _old_fish_prompt + # 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 + functions -e _bashify_path + functions -e _fishify_path + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV "/home/stefan/Workspace/weather.clue/venv" + +# https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling +if test (echo $FISH_VERSION | tr "." "\n")[1] -lt 3 + set -gx _OLD_VIRTUAL_PATH (_bashify_path $PATH) +else + set -gx _OLD_VIRTUAL_PATH $PATH +end +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 diff --git a/venv/bin/activate.ps1 b/venv/bin/activate.ps1 new file mode 100644 index 0000000..95504d3 --- /dev/null +++ b/venv/bin/activate.ps1 @@ -0,0 +1,60 @@ +$script:THIS_PATH = $myinvocation.mycommand.path +$script:BASE_DIR = Split-Path (Resolve-Path "$THIS_PATH/..") -Parent + +function global:deactivate([switch] $NonDestructive) { + if (Test-Path variable:_OLD_VIRTUAL_PATH) { + $env:PATH = $variable:_OLD_VIRTUAL_PATH + Remove-Variable "_OLD_VIRTUAL_PATH" -Scope global + } + + if (Test-Path function:_old_virtual_prompt) { + $function:prompt = $function:_old_virtual_prompt + Remove-Item function:\_old_virtual_prompt + } + + if ($env:VIRTUAL_ENV) { + Remove-Item env:VIRTUAL_ENV -ErrorAction SilentlyContinue + } + + if (!$NonDestructive) { + # Self destruct! + Remove-Item function:deactivate + Remove-Item function:pydoc + } +} + +function global:pydoc { + python -m pydoc $args +} + +# unset irrelevant variables +deactivate -nondestructive + +$VIRTUAL_ENV = $BASE_DIR +$env:VIRTUAL_ENV = $VIRTUAL_ENV + +New-Variable -Scope global -Name _OLD_VIRTUAL_PATH -Value $env:PATH + +$env:PATH = "$env:VIRTUAL_ENV/bin:" + $env:PATH +if (!$env:VIRTUAL_ENV_DISABLE_PROMPT) { + function global:_old_virtual_prompt { + "" + } + $function:_old_virtual_prompt = $function:prompt + + if ("" -ne "") { + function global:prompt { + # Add the custom prefix to the existing prompt + $previous_prompt_value = & $function:_old_virtual_prompt + ("" + $previous_prompt_value) + } + } + else { + function global:prompt { + # Add a prefix to the current prompt, but don't discard it. + $previous_prompt_value = & $function:_old_virtual_prompt + $new_prompt_value = "($( Split-Path $env:VIRTUAL_ENV -Leaf )) " + ($new_prompt_value + $previous_prompt_value) + } + } +} diff --git a/venv/bin/activate_this.py b/venv/bin/activate_this.py new file mode 100644 index 0000000..aa96457 --- /dev/null +++ b/venv/bin/activate_this.py @@ -0,0 +1,46 @@ +"""Activate virtualenv for current interpreter: + +Use exec(open(this_file).read(), {'__file__': this_file}). + +This can be used when you must use an existing Python interpreter, not the virtualenv bin/python. +""" +import os +import site +import sys + +try: + __file__ +except NameError: + raise AssertionError("You must use exec(open(this_file).read(), {'__file__': this_file}))") + +# prepend bin to PATH (this file is inside the bin directory) +bin_dir = os.path.dirname(os.path.abspath(__file__)) +os.environ["PATH"] = os.pathsep.join([bin_dir] + os.environ.get("PATH", "").split(os.pathsep)) + +base = os.path.dirname(bin_dir) + +# virtual env is right above bin directory +os.environ["VIRTUAL_ENV"] = base + +# add the virtual environments site-package to the host python import mechanism +IS_PYPY = hasattr(sys, "pypy_version_info") +IS_JYTHON = sys.platform.startswith("java") +if IS_JYTHON: + site_packages = os.path.join(base, "Lib", "site-packages") +elif IS_PYPY: + site_packages = os.path.join(base, "site-packages") +else: + IS_WIN = sys.platform == "win32" + if IS_WIN: + site_packages = os.path.join(base, "Lib", "site-packages") + else: + site_packages = os.path.join(base, "lib", "python{}.{}".format(*sys.version_info), "site-packages") + +prev = set(sys.path) +site.addsitedir(site_packages) +sys.real_prefix = sys.prefix +sys.prefix = base + +# Move the added items to the front of the path, in place +new = list(sys.path) +sys.path[:] = [i for i in new if i not in prev] + [i for i in new if i in prev] diff --git a/venv/bin/easy_install b/venv/bin/easy_install new file mode 100755 index 0000000..fc5cfb5 --- /dev/null +++ b/venv/bin/easy_install @@ -0,0 +1,8 @@ +#!/home/stefan/Workspace/weather.clue/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()) diff --git a/venv/bin/easy_install-2.7 b/venv/bin/easy_install-2.7 new file mode 100755 index 0000000..fc5cfb5 --- /dev/null +++ b/venv/bin/easy_install-2.7 @@ -0,0 +1,8 @@ +#!/home/stefan/Workspace/weather.clue/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()) diff --git a/venv/bin/pip b/venv/bin/pip new file mode 100755 index 0000000..2826c25 --- /dev/null +++ b/venv/bin/pip @@ -0,0 +1,8 @@ +#!/home/stefan/Workspace/weather.clue/venv/bin/python2.7 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/bin/pip2 b/venv/bin/pip2 new file mode 100755 index 0000000..2826c25 --- /dev/null +++ b/venv/bin/pip2 @@ -0,0 +1,8 @@ +#!/home/stefan/Workspace/weather.clue/venv/bin/python2.7 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/bin/pip2.7 b/venv/bin/pip2.7 new file mode 100755 index 0000000..2826c25 --- /dev/null +++ b/venv/bin/pip2.7 @@ -0,0 +1,8 @@ +#!/home/stefan/Workspace/weather.clue/venv/bin/python2.7 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/bin/python b/venv/bin/python new file mode 120000 index 0000000..8f7a3c1 --- /dev/null +++ b/venv/bin/python @@ -0,0 +1 @@ +python2.7 \ No newline at end of file diff --git a/venv/bin/python-config b/venv/bin/python-config new file mode 100755 index 0000000..d0a1ae6 --- /dev/null +++ b/venv/bin/python-config @@ -0,0 +1,78 @@ +#!/home/stefan/Workspace/weather.clue/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')) diff --git a/venv/bin/python2 b/venv/bin/python2 new file mode 120000 index 0000000..8f7a3c1 --- /dev/null +++ b/venv/bin/python2 @@ -0,0 +1 @@ +python2.7 \ No newline at end of file diff --git a/venv/bin/python2.7 b/venv/bin/python2.7 new file mode 100755 index 0000000000000000000000000000000000000000..e4f4d93f4a143e61a90a71e2d5347b040a87c191 GIT binary patch literal 3628976 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

xu%*gF8%A;34XSFfhEsaUDpzpbnJ?ce$72GlY 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 z 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

7Ju@N=T`RLWBp^bkA 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

+;xdts9}svK)Gk)}8&D4v?+ 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%0Db!qGiRFy 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∈Fes=ok);(jL>-akO2!G>nBJV?Z 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%0DiehNJfk5Bc4D>=BL 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�hXPmD{2b@b6aVm%=vKJ0QTCjfM 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 y;9)(|)5>PUfJpi+pvaiwu&uryD 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 GR^E&w>0YaTpOrsh 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

    @Wvs_0yp1i`j!*Fg_TV6n;vAy+A>dZzLO~Qm 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�?X&Lf8lYXyOtE zh`Gx{js6Jeo9G_I-|mn{K8B8y~L7%&kyA8H}mlzGB9gZ%8$sHzw znQOuqn+Y=U@1m9%i&t3^@Ut*@tP;fEFGJUgQz86b2dyYd_C4;8@brNXfB%SWAHZW8 z_J5@3ZdYV}%y>nO>0cSQA`>6KMa&4os`5L(gYSBJb}Yr`uAyJYX3jyCqplIA&iPNF z>xqnwoh{=d4*uP+nTg5Bc|g}JMION<9ly!G<<%ccvt$u^XvTf?GIULROa8CH-u3at zpOnw)9@vw4f@{RV@5q{s93wf~zGHqzeC;VQQw%$IV$U7Hj4^(M`BTtYNAj$oDzXg; zLy;I}>Px`MTb0&H}X370R zuPrexD5N&|%W^;afVsQLyHC;oQ1(1;8C$|0u@U^6I;{JL=hM7@T*%z6@HtA)(?aa~ zne4}$PpQ+f!3t#E&2w*PRX}E6bpJhZ`oKYsQeA(o@)cuj1^3Ht=+Bk-x`KYXLTfeo zD1z8*p?)a*m&zsgp@W(5P&bIbYau=YnLiW1-pBf>>={gZ3Uw%TDfkd9Roi^d{4Xel zp|jnSJ0;KaDBiT^sh^eeGS>9r+&+rVn{k(Zhk7UcKlSH35jtKBeZj|+itOW!{wq_@ zrN1ima_Tn7G#L43!Ru@6;S+@JsGl<4k$hAJ|G1&H%~Jmrnm^*>f<2aV=M-zs;Y(kV z+XZj2UQmuaeuFW=&(vjUzpj1}NqaxfqtH!36lctjQl9xGsF&f3rKo>I4`rmEl8N0n zJ|l0P<^PM1=NaU+d*p{tTya*$1+LUC6nBanX?~%{#pUfXZocG~A;zrqkZ<(k8Uw17!%0bVIh&6ZY zcMf_ntUHF?deL7Mc9%YZr+>`V*hHV_;E#T4^X16*wd(jjw0f}r|A+U9Q9;)*qwb5Z zo@L+FyQ+O8p-^T?LTb1LN!zS0hvDx*Ka*Q(zg_;X9jbmqKC9(;{> zcmnOow5L&~Qs&Y(fqDS3_A2!;a>P5(j>TUZyBYKbVKa|#=-(&b5x0Bs-@DZJDFc{y zhq@zsN5QAyBJp$)I)VuG%`O(5C0lITpEcE?cSLplp2mi(?ajW0xc7|P#CHwWBq@y! z>=}iOr#9oC_+m-@&7k;M{>=sG&CbE+>8nV&kG%xFptal$U1Rf^jJu$(zV!9V<+m}~ zrI_;3iRZFBUs2hGMrGyw zEHJnD?U{ z{-FIHtd18t2_F%6z*r_S|u7Q_&^gTtdx7>~S&4|}*`j7eI zgPh%;QWr!$_$vhOR=lh8W)Xjak7!p!f8W-$&N80;(bKQwzDvaa@9g~xJXrBkC8Kp% zJG0nt4)=st&{=izdRzQu89qA@8EopiSII?RvY!=;kVO!MZJjuiuM6$5b(9zgGFq<0 z<0|6N8#)h(qqRJ*qb%pF*+A{jdDj)4jAGv*;zQ=(p7P>qDPEV|L12)>Wsj zMhT(>Qa-@1)A5C3JQt;GLpK@f8?Drjdn?_g&@6&(e3^G^3->>2FN!DSEVigXjw!_Y zPOQ64Uh$^?b3-KC`z1IF*{hBnT|whGZ5PHHQ@&tbk4oGRc{Z_u@mGV0ANs;6H}HoP zHDSnje#D!peW$r1=+e&#MoWFgc&eL@-(%wbBn^pn+ z6Hh~FCo}&e_&mh@X@oC(Q@h~fd#U$Rj${7|oPp2qjThl#AwE%$^}*^ZZZ)Cq_!@6itm=3_jj>%PjoHlPThyn zm(q)}4W0&252OgjVz)4IPg!VWMv{~9#cz@2J7Q!meQDUsiqGJ+b%p$%hxkb6jq=?e zI^^;b{@f{OJCNT*1)V$5Z!^b-6Maa0_&U-U_HV%H@ zK!-8Z!PJ7|%$cJxBJIzW-URyQpa;Pj`c6^Oi0$&OMqeL%cnIqie`o%uN%T2}l)59iI{JckBIV(+*a}~5>DsdKy51Yxf3v8C%(YEw z+;YU-Hy1s8@gJjYYu+-j^`%e6e3^JB+TJs-6AX!?z`%lpUPa;~#A zY-!X<)H1J((Vi6DGBYYOD>`dbLZ&S#DJmg$SV~%)EvZNK9@V9hHab-rQ3>hMS;Jz} zQWI>4_QXLMSUX(`-a#WsOaZPKmcchtBxKq&V|2 z`}w1ECPfYC)V@#O9zA=uYikQh4z-132J(?DA3Z{P^au^LWk!ulN>55jPs_-PQ zL*k;dqHR4O4c|!#V{LH)TYQ#N0z&`>h4sv=3|mO|?%kn6Pf}`9R$@k4c6z2TBb<*G zZp?>}&?q}?dum#iJs~YS^*PDp=QLBIho@!O;>V=N$7aRH*^^SU>LjP7Cf2l9%hV;p zRZ=RGP)JJji1@hpQEcYq3`JzbXBw)obO;MEW3%F;GcuybhQy$f=;Y{(6jpT_9XLKI zDk&{CE7|7!v?EVaYN9Bu8vNr@OFJ|iPLJS2)2v}K0%K=jnOENF)%qN{U>CkrHGPw%!rR2B~9Dtu<~0I{u!Omh{|~G0~av#FBGDQvL)YK#gskkj#YtqAdMcfmwm$Q&XeFm+-`_z^LJA zNmwE^Jv%EudSsT&Ly+|3=-7BANAAOuQkCK7v@)E;m_IHsH7YYbIVsE5hZeN6GNMy6 zlO-#T3xisAYI=0+h#^izWoD9Z$EFx@(W8fdRBUu|@(>op63d29$0etw$EPMFM<KDWcpSurd6U!9Mr4a^ zRb0{^N@JWi*A#LSTvSp?Z zftW2hjo5RNm7es`)O5L>oaLFNq{Mn(PEysfqD2 zO6Igt?16F7V>8KGS)=3QQ*|7-WFgiLTRVF5-BB(r&;F2<`O#Itl7{ z;bnAOZPICWY}OEYmQx@z9mCjCB^hTTQFL5LsJ&J#dsm)NOS&_Wp$KP&avrTihOmmH znKEREGd*Nxr#p|SIHv>0kBN;>&%%cGSmex%&%`+Py0ynNv1jAr#Brv@l1_S1a~?_m za}q__t0iaiUL-m-7=5Lsj*8F7vZux;MrS3Binn8x7|97~_Uu%WpqScuGUOjC_B3a* zwkKs8o-av6=F16X$MZ9s+sjchKB})_FB?!vq5EUu*t# z23D)xC_K|tpp~lA9uhLKX|S6SZ--1Kwv`h)HYJ@D)QTj+2`ZY#w9c~+mx@M!)LO}$ zceNy!5g>X*+WMtFzgoz#DE=b)%}9+-w#$4&8s4E;PeD6LVyvA28{u@YlxS9E4U-ey z>C?{ROuRDc|0ug3_$=rBar{@?9G!$5VTW*IF|3RhNmyDbR!uF2Xw_DWRXc5IF@&MR z9K#MdLXI$mA;bwoh|^&R{aH1PGYlbwxPQ;n>F@@gXS6Q`GYl88>Hf7sE-<_Tf*+Lo2@S^PNv*M7I|Gt6P4jfGRra^pm4ti-~m zS!~W$6p443wu?~GbE$Uh{n&}f%u~9AF zD<;A&KHn@4j~)KoS|9q_8RB%?{6WXq`-sfU#FqbKJJX0?Zx>EDM2+D)w!7F=I_wgE zz19CbuGz(}x12O(hH-3bTzAa5%fk|yHZeBR#WR*j=l|G#ydEU}iFmeyaKH{TJ5{%n z=m|TfP~qSik6vpYvAIS#0gG(yKN3~ek*4?#e`C8u@Av=QF6>gnkuE&XnGtIaVKk;>zNQPHARD4l33?#~+0qcxiEXIm%~vj z63+Ny4 z{G@o#@jo|D%tL;eh}lz$OA{xRu@OGD+h1-cHWhX_Av#E5I^6i!us@^tpmLprxJ}HJ zVjuiPdB&nz{Y*D$kCop+=Ca`w1APtyW3ZYvquQ(|{v5B@)r7CTbM{5V#xWwXLoADgO4P&fe&=a*(%6T&ic@?dQ_ zHlL2y>n}E+Ijv%fQ~ik(Eq2&aq=XS+ava}YI}o~uAAMA2ugt^!zuDz~Y+p2`JUopq zN@PEX&yBS*v*s}U;Y?Za$LBX0dV-3`C6TGqbp`4tR$J3!BSM!h`6bfP z5%XcGhea+wvCG=9Y*tp}XM_~bn zZ&)>&Sz27)I}#bDB{;(P((>uQJWP0!=f%=4+mhm7s{w+v9rRdQ)bN2PMxbdL!3T!g4L>Ub!Wfu?92o+*5z0{=$V;S5WX6A zq~peyPZ>XL+^i`@6(!-ynZ=*<^ztbd&C=6Ho{X&%i}K>)bIt$4Zp-;dPgAFGt)oN@ z#Me5UCpqz)HGWD(AH81r^qDi93LCS+)1w(P%f~xE8!=@>xXKc4lV$a7dqHruM9zPY~d3VR)A3wp5Ei08y znJ{DgjM>)0V&~HO1k)EMpuym|5i9vqCGIUyX4a)u04P+fvZ;uV{&tyAk5U4^p6aPtpvnYUXII%gm2k;;`p+19a2Z&_bd

    07r*9C3%i!UIN1YgZG%$DYsQlQYL8FGn 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%0A%+~Hp%tE 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

    kwCg#Z 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/_abcoll.py b/venv/lib/python2.7/_abcoll.py new file mode 120000 index 0000000..e39c38d --- /dev/null +++ b/venv/lib/python2.7/_abcoll.py @@ -0,0 +1 @@ +/usr/lib/python2.7/_abcoll.py \ No newline at end of file diff --git a/venv/lib/python2.7/_abcoll.pyc b/venv/lib/python2.7/_abcoll.pyc new file mode 100644 index 0000000000000000000000000000000000000000..588feb83f8cebd19c021a51f404607e70f2b8db0 GIT binary patch literal 29218 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 O?bHZV6aNb1Py8Q6DWBH> literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/_weakrefset.py b/venv/lib/python2.7/_weakrefset.py new file mode 120000 index 0000000..a3c1cd4 --- /dev/null +++ b/venv/lib/python2.7/_weakrefset.py @@ -0,0 +1 @@ +/usr/lib/python2.7/_weakrefset.py \ No newline at end of file diff --git a/venv/lib/python2.7/_weakrefset.pyc b/venv/lib/python2.7/_weakrefset.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d1f8146e2b8e9dfbcec9bbe174cfe0ca9cc2197 GIT binary patch literal 11310 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/abc.py b/venv/lib/python2.7/abc.py new file mode 120000 index 0000000..cb3e5d1 --- /dev/null +++ b/venv/lib/python2.7/abc.py @@ -0,0 +1 @@ +/usr/lib/python2.7/abc.py \ No newline at end of file diff --git a/venv/lib/python2.7/abc.pyc b/venv/lib/python2.7/abc.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41f89293a7c9ff414eee1c2be4903b5469ce6854 GIT binary patch literal 6517 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/codecs.py b/venv/lib/python2.7/codecs.py new file mode 120000 index 0000000..50169dc --- /dev/null +++ b/venv/lib/python2.7/codecs.py @@ -0,0 +1 @@ +/usr/lib/python2.7/codecs.py \ No newline at end of file diff --git a/venv/lib/python2.7/codecs.pyc b/venv/lib/python2.7/codecs.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8854616a41e6b87736be158fe47685b24f184cfe GIT binary patch literal 40020 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 U0X{{r~^~ literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/copy_reg.py b/venv/lib/python2.7/copy_reg.py new file mode 120000 index 0000000..5dc0af3 --- /dev/null +++ b/venv/lib/python2.7/copy_reg.py @@ -0,0 +1 @@ +/usr/lib/python2.7/copy_reg.py \ No newline at end of file diff --git a/venv/lib/python2.7/copy_reg.pyc b/venv/lib/python2.7/copy_reg.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5fa69fdbfeec6264ce83e07356c1026c202d3065 GIT binary patch literal 5541 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 C==I|O literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/distutils/__init__.py b/venv/lib/python2.7/distutils/__init__.py new file mode 100644 index 0000000..b9b0f24 --- /dev/null +++ b/venv/lib/python2.7/distutils/__init__.py @@ -0,0 +1,134 @@ +import os +import sys +import warnings + +# 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 +import opcode + +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) # noqa: F821 + if sys.version_info < (3, 4): + import imp + + real_distutils = imp.load_module("_virtualenv_distutils", None, distutils_path, ("", "", imp.PKG_DIRECTORY)) + else: + import importlib.machinery + + distutils_path = os.path.join(distutils_path, "__init__.py") + loader = importlib.machinery.SourceFileLoader("_virtualenv_distutils", distutils_path) + if sys.version_info < (3, 5): + import types + + real_distutils = types.ModuleType(loader.name) + else: + import importlib.util + + spec = importlib.util.spec_from_loader(loader.name, loader) + real_distutils = importlib.util.module_from_spec(spec) + loader.exec_module(real_distutils) + + # Copy the relevant attributes + try: + __revision__ = real_distutils.__revision__ + except AttributeError: + pass + __version__ = real_distutils.__version__ + +from distutils import dist, sysconfig # isort:skip + +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) + 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 diff --git a/venv/lib/python2.7/distutils/distutils.cfg b/venv/lib/python2.7/distutils/distutils.cfg new file mode 100644 index 0000000..1af230e --- /dev/null +++ b/venv/lib/python2.7/distutils/distutils.cfg @@ -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 diff --git a/venv/lib/python2.7/encodings b/venv/lib/python2.7/encodings new file mode 120000 index 0000000..1250ad8 --- /dev/null +++ b/venv/lib/python2.7/encodings @@ -0,0 +1 @@ +/usr/lib/python2.7/encodings \ No newline at end of file diff --git a/venv/lib/python2.7/fnmatch.py b/venv/lib/python2.7/fnmatch.py new file mode 120000 index 0000000..ec3e10c --- /dev/null +++ b/venv/lib/python2.7/fnmatch.py @@ -0,0 +1 @@ +/usr/lib/python2.7/fnmatch.py \ No newline at end of file diff --git a/venv/lib/python2.7/genericpath.py b/venv/lib/python2.7/genericpath.py new file mode 120000 index 0000000..cb8897c --- /dev/null +++ b/venv/lib/python2.7/genericpath.py @@ -0,0 +1 @@ +/usr/lib/python2.7/genericpath.py \ No newline at end of file diff --git a/venv/lib/python2.7/genericpath.pyc b/venv/lib/python2.7/genericpath.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34718b0c10d583ecd8279774e063f34d86617f0e GIT binary patch literal 3891 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/locale.py b/venv/lib/python2.7/locale.py new file mode 120000 index 0000000..92c243c --- /dev/null +++ b/venv/lib/python2.7/locale.py @@ -0,0 +1 @@ +/usr/lib/python2.7/locale.py \ No newline at end of file diff --git a/venv/lib/python2.7/no-global-site-packages.txt b/venv/lib/python2.7/no-global-site-packages.txt new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python2.7/ntpath.py b/venv/lib/python2.7/ntpath.py new file mode 120000 index 0000000..5659ae1 --- /dev/null +++ b/venv/lib/python2.7/ntpath.py @@ -0,0 +1 @@ +/usr/lib/python2.7/ntpath.py \ No newline at end of file diff --git a/venv/lib/python2.7/orig-prefix.txt b/venv/lib/python2.7/orig-prefix.txt new file mode 100644 index 0000000..e25db58 --- /dev/null +++ b/venv/lib/python2.7/orig-prefix.txt @@ -0,0 +1 @@ +/usr \ No newline at end of file diff --git a/venv/lib/python2.7/os.py b/venv/lib/python2.7/os.py new file mode 120000 index 0000000..950fc8d --- /dev/null +++ b/venv/lib/python2.7/os.py @@ -0,0 +1 @@ +/usr/lib/python2.7/os.py \ No newline at end of file diff --git a/venv/lib/python2.7/os.pyc b/venv/lib/python2.7/os.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f450fee5b7ea94f3194f12542782668ab12f3446 GIT binary patch literal 27491 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.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.* + +pip - The Python Package Installer +================================== + +.. image:: https://img.shields.io/pypi/v/pip.svg + :target: https://pypi.org/project/pip/ + +.. image:: https://readthedocs.org/projects/pip/badge/?version=latest + :target: https://pip.pypa.io/en/latest + +pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes. + +Please take a look at our documentation for how to install and use pip: + +* `Installation`_ +* `Usage`_ + +We release updates regularly, with a new version every 3 months. Find more details in our documentation: + +* `Release notes`_ +* `Release process`_ + +In 2020, we're working on improvements to the heart of pip. Please `learn more and take our survey`_ to help us do it right. + +If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms: + +* `Issue tracking`_ +* `Discourse channel`_ +* `User IRC`_ + +If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms: + +* `GitHub page`_ +* `Development documentation`_ +* `Development mailing list`_ +* `Development IRC`_ + +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`_. + +.. _package installer: https://packaging.python.org/guides/tool-recommendations/ +.. _Python Package Index: https://pypi.org +.. _Installation: https://pip.pypa.io/en/stable/installing.html +.. _Usage: https://pip.pypa.io/en/stable/ +.. _Release notes: https://pip.pypa.io/en/stable/news.html +.. _Release process: https://pip.pypa.io/en/latest/development/release-process/ +.. _GitHub page: https://github.com/pypa/pip +.. _Development documentation: https://pip.pypa.io/en/latest/development +.. _learn more and take our survey: https://pyfound.blogspot.com/2020/03/new-pip-resolver-to-roll-out-this-year.html +.. _Issue tracking: https://github.com/pypa/pip/issues +.. _Discourse channel: https://discuss.python.org/c/packaging +.. _Development mailing list: https://mail.python.org/mailman3/lists/distutils-sig.python.org/ +.. _User IRC: https://webchat.freenode.net/?channels=%23pypa +.. _Development IRC: https://webchat.freenode.net/?channels=%23pypa-dev +.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + + diff --git a/venv/lib/python2.7/site-packages/pip-20.2.4.dist-info/RECORD b/venv/lib/python2.7/site-packages/pip-20.2.4.dist-info/RECORD new file mode 100644 index 0000000..487db10 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip-20.2.4.dist-info/RECORD @@ -0,0 +1,753 @@ +../../../bin/pip,sha256=JPzB1Q1pryn1Anf-lLNtM779S4jfxgFQ_hHKvasJvDA,259 +../../../bin/pip2,sha256=JPzB1Q1pryn1Anf-lLNtM779S4jfxgFQ_hHKvasJvDA,259 +../../../bin/pip2.7,sha256=JPzB1Q1pryn1Anf-lLNtM779S4jfxgFQ_hHKvasJvDA,259 +pip-20.2.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip-20.2.4.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 +pip-20.2.4.dist-info/METADATA,sha256=wiiNWMKK1iuJ5-0VMCtwkcA9FZqoz1KKHzqG6cP0Q2E,3708 +pip-20.2.4.dist-info/RECORD,, +pip-20.2.4.dist-info/WHEEL,sha256=ADKeyaGyKF5DwBNE0sRE5pvW-bSkFMJfBuhzZ3rceP4,110 +pip-20.2.4.dist-info/entry_points.txt,sha256=HtfDOwpUlr9s73jqLQ6wF9V0_0qvUXJwCBz7Vwx0Ue0,125 +pip-20.2.4.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip/__init__.py,sha256=7Gz3LXxQ5H_MqrKTsPvze-7ZeAaab6qCwhKCd0NZoz0,455 +pip/__init__.pyc,, +pip/__main__.py,sha256=bqCAM1cj1HwHCDx3WJa-LJxOBXimGxE8OjBqAvnhVg0,911 +pip/__main__.pyc,, +pip/_internal/__init__.py,sha256=2si23JBW1erg19xIJ8CD6tfGknz0ijtXmzuXjGfGMGE,495 +pip/_internal/__init__.pyc,, +pip/_internal/build_env.py,sha256=9_UaQ2fpsBvpKAji27f7bPAi2v3mb0cBvDYcejwFKNM,8088 +pip/_internal/build_env.pyc,, +pip/_internal/cache.py,sha256=pT17VVxgzZK32aqY5FRS8GyAI73LKzNMF8ZelQ7Ojm0,12249 +pip/_internal/cache.pyc,, +pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 +pip/_internal/cli/__init__.pyc,, +pip/_internal/cli/autocompletion.py,sha256=ekGNtcDI0p7rFVc-7s4T9Tbss4Jgb7vsB649XJIblRg,6547 +pip/_internal/cli/autocompletion.pyc,, +pip/_internal/cli/base_command.py,sha256=bf058xM1HE9QJCNEHExbuTjL0peKg9kSxCNxDtwAh88,9302 +pip/_internal/cli/base_command.pyc,, +pip/_internal/cli/cmdoptions.py,sha256=M_BtuqeyRpZAUUYytts3pguBCF2RaGukVpDPE0niroI,28782 +pip/_internal/cli/cmdoptions.pyc,, +pip/_internal/cli/command_context.py,sha256=ygMVoTy2jpNilKT-6416gFSQpaBtrKRBbVbi2fy__EU,975 +pip/_internal/cli/command_context.pyc,, +pip/_internal/cli/main.py,sha256=Hxc9dZyW3xiDsYZX-_J2cGXT5DWNLNn_Y7o9oUme-Ec,2616 +pip/_internal/cli/main.pyc,, +pip/_internal/cli/main_parser.py,sha256=voAtjo4WVPIYeu7Fqabva9SXaB3BjG0gH93GBfe6jHQ,2843 +pip/_internal/cli/main_parser.pyc,, +pip/_internal/cli/parser.py,sha256=4FfwW8xB84CrkLs35ud90ZkhCcWyVkx17XD6j3XCW7c,9480 +pip/_internal/cli/parser.pyc,, +pip/_internal/cli/progress_bars.py,sha256=J1zykt2LI4gbBeXorfYRmYV5FgXhcW4x3r6xE_a7Z7c,9121 +pip/_internal/cli/progress_bars.pyc,, +pip/_internal/cli/req_command.py,sha256=Eiz8TVzeqzG-40t7qLC1vO-vzjCRvX9C-qXMyfw9D1I,15132 +pip/_internal/cli/req_command.pyc,, +pip/_internal/cli/spinners.py,sha256=PS9s53LB5aDPelIn8FhKerK3bOdgeefFH5wSWJ2PCzI,5509 +pip/_internal/cli/spinners.pyc,, +pip/_internal/cli/status_codes.py,sha256=F6uDG6Gj7RNKQJUDnd87QKqI16Us-t-B0wPF_4QMpWc,156 +pip/_internal/cli/status_codes.pyc,, +pip/_internal/commands/__init__.py,sha256=yoLAnmEXjoQgYfDuwsuWG3RzzD19oeHobGEhmpIYsB4,4100 +pip/_internal/commands/__init__.pyc,, +pip/_internal/commands/cache.py,sha256=U3rLjls0AMMO8PxnhXVwIp7Biyvns8-gBThKTH3tX7Y,5676 +pip/_internal/commands/cache.pyc,, +pip/_internal/commands/check.py,sha256=fqRrz2uKPC8Qsx2rgLygAD2Rbr-qxp1Q55zUoyZzB9Q,1677 +pip/_internal/commands/check.pyc,, +pip/_internal/commands/completion.py,sha256=ObssM77quf61qvbuSE6XLwUBdm_WcWIvXFI-Hy1RBsI,3081 +pip/_internal/commands/completion.pyc,, +pip/_internal/commands/configuration.py,sha256=IN2QBF653sRiRU7-pHTpnZ6_gyiXNKUQkLiLaNRLKNw,9344 +pip/_internal/commands/configuration.pyc,, +pip/_internal/commands/debug.py,sha256=otBZnpnostX2kmYyOl6g6CeCLmk6H00Tsj2CDsCtFXw,7314 +pip/_internal/commands/debug.pyc,, +pip/_internal/commands/download.py,sha256=EKFlj_ceGUEJj6yCDw7P6w7yUoB16IcNHhT2qnCFDNQ,4918 +pip/_internal/commands/download.pyc,, +pip/_internal/commands/freeze.py,sha256=vLBBP1d8wgEXrmlh06hbz_x_Q1mWHUdiWDa9NP2eKLE,3452 +pip/_internal/commands/freeze.pyc,, +pip/_internal/commands/hash.py,sha256=v2nYCiEsEI9nEam1p6GwdG8xyj5gFv-4WrqvNexKmeY,1843 +pip/_internal/commands/hash.pyc,, +pip/_internal/commands/help.py,sha256=ryuMDt2tc7ic3NJYMjjoNRH5r6LrB2yQVZvehAm8bLs,1270 +pip/_internal/commands/help.pyc,, +pip/_internal/commands/install.py,sha256=OXjZCNSioJRfP7YMkJyAWLl7X7-8f6DkhWlhPhG6fXk,27995 +pip/_internal/commands/install.pyc,, +pip/_internal/commands/list.py,sha256=2o3rYw37ECrhe4-Bu5s_2C0bwhYgghh4833MxcWAEug,11312 +pip/_internal/commands/list.pyc,, +pip/_internal/commands/search.py,sha256=1HPAFU-tmgKrHhr4xNuk3xMoPeSzD_oDvDDiUFZZ15E,5756 +pip/_internal/commands/search.pyc,, +pip/_internal/commands/show.py,sha256=r69-G8HIepDKm4SeyeHj0Ez1P9xoihrpVUyXm6NmXYY,6996 +pip/_internal/commands/show.pyc,, +pip/_internal/commands/uninstall.py,sha256=Ys8hwFsg0kvvGtLGYG3ibL5BKvURhlSlCX50ZQ-hsHk,3311 +pip/_internal/commands/uninstall.pyc,, +pip/_internal/commands/wheel.py,sha256=-HSISE5AV29I752Aqw4DdmulrGd8rB_ZTOdpbJ6T8iM,6419 +pip/_internal/commands/wheel.pyc,, +pip/_internal/configuration.py,sha256=-Gxz2J-KuvxiqWIJ9F-XnYVZ5lKhNk7VO6ondEbH4EM,14115 +pip/_internal/configuration.pyc,, +pip/_internal/distributions/__init__.py,sha256=ECBUW5Gtu9TjJwyFLvim-i6kUMYVuikNh9I5asL6tbA,959 +pip/_internal/distributions/__init__.pyc,, +pip/_internal/distributions/base.py,sha256=ruprpM_L2T2HNi3KLUHlbHimZ1sWVw-3Q0Lb8O7TDAI,1425 +pip/_internal/distributions/base.pyc,, +pip/_internal/distributions/installed.py,sha256=YqlkBKr6TVP1MAYS6SG8ojud21wVOYLMZ8jMLJe9MSU,760 +pip/_internal/distributions/installed.pyc,, +pip/_internal/distributions/sdist.py,sha256=D4XTMlCwgPlK69l62GLYkNSVTVe99fR5iAcVt2EbGok,4086 +pip/_internal/distributions/sdist.pyc,, +pip/_internal/distributions/wheel.py,sha256=95uD-TfaYoq3KiKBdzk9YMN4RRqJ28LNoSTS2K46gek,1294 +pip/_internal/distributions/wheel.pyc,, +pip/_internal/exceptions.py,sha256=ZVpArxQrSlm4qAMtHaY3nHvG_t5eSi3WCnMowdm_m8I,12637 +pip/_internal/exceptions.pyc,, +pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30 +pip/_internal/index/__init__.pyc,, +pip/_internal/index/collector.py,sha256=oEryA3tr19Yjzrvj83l8YapEOLkVeQzFiPjiXdBjtbQ,22336 +pip/_internal/index/collector.pyc,, +pip/_internal/index/package_finder.py,sha256=JY5vP-d4dkPHyS3w2NiemXDfVo2Wjqvjxz8u8EYLIoM,37442 +pip/_internal/index/package_finder.pyc,, +pip/_internal/locations.py,sha256=7YjzJy2CroQD8GBMemnHWRl9448BSIt0lfH98B-Dkd8,6732 +pip/_internal/locations.pyc,, +pip/_internal/main.py,sha256=IVBnUQ-FG7DK6617uEXRB5_QJqspAsBFmTmTesYkbdQ,437 +pip/_internal/main.pyc,, +pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 +pip/_internal/models/__init__.pyc,, +pip/_internal/models/candidate.py,sha256=gACeCSHTIaWuB6RAeLmGJnbFFbKfp_47UERDoC_ldOU,1195 +pip/_internal/models/candidate.pyc,, +pip/_internal/models/direct_url.py,sha256=MnBLPci1hE9Ndh6d3m0LAqB7hX3ci80CCJTE5eerFaQ,6900 +pip/_internal/models/direct_url.pyc,, +pip/_internal/models/format_control.py,sha256=RdnnmXxVJppCZWzWEmFTr-zD_m3G0izPLqJi6Iop75M,2823 +pip/_internal/models/format_control.pyc,, +pip/_internal/models/index.py,sha256=carvxxaT7mJyoEkptaECHUZiNaA6R5NrsGF55zawNn8,1161 +pip/_internal/models/index.pyc,, +pip/_internal/models/link.py,sha256=FMlxvqKmLoj7xTQSgKqfO2ehE1WcgD4C5DmEBuC_Qos,7470 +pip/_internal/models/link.pyc,, +pip/_internal/models/scheme.py,sha256=EhPkT_6G0Md84JTLSVopYsp5H_K6BREYmFvU8H6wMK8,778 +pip/_internal/models/scheme.pyc,, +pip/_internal/models/search_scope.py,sha256=Lum0mY4_pdR9DDBy6HV5xHGIMPp_kU8vMsqYKFHZip4,4751 +pip/_internal/models/search_scope.pyc,, +pip/_internal/models/selection_prefs.py,sha256=pgNjTfgePPiX1R5S2S8Yc6odOfU9NzG7YP_m_gnS0kw,2044 +pip/_internal/models/selection_prefs.pyc,, +pip/_internal/models/target_python.py,sha256=R7tAXI15B_cgw7Fgnq5cI9F-44goUZncH9JMtE8pXRw,4034 +pip/_internal/models/target_python.pyc,, +pip/_internal/models/wheel.py,sha256=FTfzVb4WIbfIehxhdlAVvCil_MQ0-W44oyN56cE6NHc,2772 +pip/_internal/models/wheel.pyc,, +pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50 +pip/_internal/network/__init__.pyc,, +pip/_internal/network/auth.py,sha256=dt3NvTRJ8182S3VpdYFEZMPT0JhOKHyFtR-O-JMlJII,11652 +pip/_internal/network/auth.pyc,, +pip/_internal/network/cache.py,sha256=6cCD7XNrqh1d1lOSY5U-0ZXOG1YwEgMYs-VhRZVyzMA,2329 +pip/_internal/network/cache.pyc,, +pip/_internal/network/download.py,sha256=VTGDO01_nX-5MCdatd4Icv0F88_M8N3WnW6BevA6a0o,5151 +pip/_internal/network/download.pyc,, +pip/_internal/network/lazy_wheel.py,sha256=RXcQILT5v5UO6kxgv76CSncLTqRL29o-OXbaW2aK7t4,8138 +pip/_internal/network/lazy_wheel.pyc,, +pip/_internal/network/session.py,sha256=Zs0uiyPxTpfpgSv-ZI9hK9TjasmTplBuBivOTcUiJME,15208 +pip/_internal/network/session.pyc,, +pip/_internal/network/utils.py,sha256=ZPHg7u6DEcg2EvILIdPECnvPLp21OPHxNVmeXfMy-n0,4172 +pip/_internal/network/utils.pyc,, +pip/_internal/network/xmlrpc.py,sha256=PFCiX_nnwYxC8SFIf7J3trP40ECGjA6fl2-IVNhbkPM,1882 +pip/_internal/network/xmlrpc.pyc,, +pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/__init__.pyc,, +pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/build/__init__.pyc,, +pip/_internal/operations/build/metadata.py,sha256=2aILgWCQTF1aIhWuCH8TTSjv_kYmA3x1262fT2FQ6pQ,1254 +pip/_internal/operations/build/metadata.pyc,, +pip/_internal/operations/build/metadata_legacy.py,sha256=VgzBTk8naIO8-8N_ifEYF7ZAxWUDhphWVIaVlZ2FqYM,2011 +pip/_internal/operations/build/metadata_legacy.pyc,, +pip/_internal/operations/build/wheel.py,sha256=33vdkxTO-gNqrtWH1eNL_uZo4Irax85moDx2o9zae3M,1465 +pip/_internal/operations/build/wheel.pyc,, +pip/_internal/operations/build/wheel_legacy.py,sha256=N1aqNZyGURBX0Bj6wPmB0t4866oMbxoHUpC9pz6FyT0,3356 +pip/_internal/operations/build/wheel_legacy.pyc,, +pip/_internal/operations/check.py,sha256=ljNbD2PI1RdH0-E3DFGOjmAM38ytl9zhhNOlmkWGgiI,5240 +pip/_internal/operations/check.pyc,, +pip/_internal/operations/freeze.py,sha256=_vJSZwHBNzBV0GpRUSXhUJz3BrGFdcT2aTcWxH1L4P0,10373 +pip/_internal/operations/freeze.pyc,, +pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51 +pip/_internal/operations/install/__init__.pyc,, +pip/_internal/operations/install/editable_legacy.py,sha256=rJ_xs2qtDUjpY2-n6eYlVyZiNoKbOtZXZrYrcnIELt4,1488 +pip/_internal/operations/install/editable_legacy.pyc,, +pip/_internal/operations/install/legacy.py,sha256=zu3Gw54dgHtluyW5n8j5qKcAScidQXJvqB8fb0oLB-4,4281 +pip/_internal/operations/install/legacy.pyc,, +pip/_internal/operations/install/wheel.py,sha256=nJmOSOYY3keksXd_3GFuhAWeeoKvGOyoSGbjXABjZ40,31310 +pip/_internal/operations/install/wheel.pyc,, +pip/_internal/operations/prepare.py,sha256=Rt7Yh7w10_Q-vI3b7R1wkt2R6XPX8YVUdODk-TaGI9c,19903 +pip/_internal/operations/prepare.pyc,, +pip/_internal/pyproject.py,sha256=VJKsrXORGiGoDPVKCQhuu4tWlQSTOhoiRlVLRNu4rx4,7400 +pip/_internal/pyproject.pyc,, +pip/_internal/req/__init__.py,sha256=s-E5Vxxqqpcs7xfY5gY69oHogsWJ4sLbnUiDoWmkHOU,3133 +pip/_internal/req/__init__.pyc,, +pip/_internal/req/constructors.py,sha256=LrSHbRHu52-h6HM1qJKG68o1Jw5q8MvJGfr4As6j2uU,16387 +pip/_internal/req/constructors.pyc,, +pip/_internal/req/req_file.py,sha256=p7n3Y0q275Eisqfxd0vtfnxYvlT6TCCY0tj75p-yiOY,19448 +pip/_internal/req/req_file.pyc,, +pip/_internal/req/req_install.py,sha256=5IYle0AaLivlkZo6mhU9sj30CbzPqLe92csBnAfJq8U,33610 +pip/_internal/req/req_install.pyc,, +pip/_internal/req/req_set.py,sha256=dxcfbieWYfYkTJNE07U8xaO40zLxl8BhWOcIHVFTmoo,7886 +pip/_internal/req/req_set.pyc,, +pip/_internal/req/req_tracker.py,sha256=qWaiejNK6o6cqeyTOIGKIU1CoyrXCcqgMHYi3cqelOA,4690 +pip/_internal/req/req_tracker.pyc,, +pip/_internal/req/req_uninstall.py,sha256=opMGDGb7ZaFippRbaarJaljtzl2CNZmBGEUSnTubE-A,23706 +pip/_internal/req/req_uninstall.pyc,, +pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/resolution/__init__.pyc,, +pip/_internal/resolution/base.py,sha256=xi72YmIS-lEjyK13PN_3qkGGthA4yGoK0C6qWynyHrE,682 +pip/_internal/resolution/base.pyc,, +pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/resolution/legacy/__init__.pyc,, +pip/_internal/resolution/legacy/resolver.py,sha256=d-qW6UUxbZqKyXmX2bqnW5C8UtnO0ZcsQuKw_QXualc,18755 +pip/_internal/resolution/legacy/resolver.pyc,, +pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/resolution/resolvelib/__init__.pyc,, +pip/_internal/resolution/resolvelib/base.py,sha256=IBu9SqpaLklWM0rhGY0DspQE2_LSyHj9yXyEtOxonQs,3455 +pip/_internal/resolution/resolvelib/base.pyc,, +pip/_internal/resolution/resolvelib/candidates.py,sha256=9Rh6AU29FXWivu2uaAX04zd4YuQcHCUz0gq0PUicHJ8,20261 +pip/_internal/resolution/resolvelib/candidates.pyc,, +pip/_internal/resolution/resolvelib/factory.py,sha256=kvt7RH9BY3pu5_p_cm8OaMkGQnbOweEBYla6vkN9Ycs,16888 +pip/_internal/resolution/resolvelib/factory.pyc,, +pip/_internal/resolution/resolvelib/found_candidates.py,sha256=XqW1uuf-6gs_u8zOLXSWOMeZEk9_DjPK-E9IaVC_Sr8,3565 +pip/_internal/resolution/resolvelib/found_candidates.pyc,, +pip/_internal/resolution/resolvelib/provider.py,sha256=fpbPx6vqUq0adWC9lK0I5mXpZwCY4Tsr4RNq_Kzx3Ls,4054 +pip/_internal/resolution/resolvelib/provider.pyc,, +pip/_internal/resolution/resolvelib/requirements.py,sha256=lGvoHRhkusRfaz4cFxYBoQNqxS6TeuO3K68qlui6g-0,4511 +pip/_internal/resolution/resolvelib/requirements.pyc,, +pip/_internal/resolution/resolvelib/resolver.py,sha256=1YP-1oOYpzMW6rE_EyW_kYJZ2yxP5L8qi0umWehc7eA,10097 +pip/_internal/resolution/resolvelib/resolver.pyc,, +pip/_internal/self_outdated_check.py,sha256=q6_nqUHPpt-DScwD97h7FCSqd4nI1s-xkpOI4I5Za3Y,6779 +pip/_internal/self_outdated_check.pyc,, +pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/utils/__init__.pyc,, +pip/_internal/utils/appdirs.py,sha256=RZzUG-Bkh2b-miX0DSZ3v703_-bgK-v0PfWCCjwVE9g,1349 +pip/_internal/utils/appdirs.pyc,, +pip/_internal/utils/compat.py,sha256=LZbjWCD3ve99C07Hae9OB7A25QQ40PqdNrQxbBrCss8,9489 +pip/_internal/utils/compat.pyc,, +pip/_internal/utils/compatibility_tags.py,sha256=EtBJj-pstj_U0STUZ8FjlG7YDTjuRZUy6GY1cM86yv8,5439 +pip/_internal/utils/compatibility_tags.pyc,, +pip/_internal/utils/datetime.py,sha256=KL-vIdGU9JIpGB5NYkmwXWkH-G_2mvvABlmRtoSZsao,295 +pip/_internal/utils/datetime.pyc,, +pip/_internal/utils/deprecation.py,sha256=pBnNogoA4UGTxa_JDnPXBRRYpKMbExAhXpBwAwklOBs,3318 +pip/_internal/utils/deprecation.pyc,, +pip/_internal/utils/direct_url_helpers.py,sha256=bZCBNwPQVyZpYGjX_VcomvVvRHvKw-9JzEV-Ft09LQc,4359 +pip/_internal/utils/direct_url_helpers.pyc,, +pip/_internal/utils/distutils_args.py,sha256=a56mblNxk9BGifbpEETG61mmBrqhjtjRkJ4HYn-oOEE,1350 +pip/_internal/utils/distutils_args.pyc,, +pip/_internal/utils/encoding.py,sha256=wHDJ25yCT_T4ySscCL3P978OpLrfDCpitg8D64IEXMY,1284 +pip/_internal/utils/encoding.pyc,, +pip/_internal/utils/entrypoints.py,sha256=vHcNpnksCv6mllihU6hfifdsKPEjwcaJ1aLIXEaynaU,1152 +pip/_internal/utils/entrypoints.pyc,, +pip/_internal/utils/filesystem.py,sha256=-fU3XteCAIJwf_9FvCZU7vhywvt3nuf_cqkCdwgy1Y8,6943 +pip/_internal/utils/filesystem.pyc,, +pip/_internal/utils/filetypes.py,sha256=R2FwzoeX7b-rZALOXx5cuO8VPPMhUQ4ne7wm3n3IcWA,571 +pip/_internal/utils/filetypes.pyc,, +pip/_internal/utils/glibc.py,sha256=LOeNGgawCKS-4ke9fii78fwXD73dtNav3uxz1Bf-Ab8,3297 +pip/_internal/utils/glibc.pyc,, +pip/_internal/utils/hashes.py,sha256=Elh7q2hx4CNB0zqKSgL4boybviemDN3B7UDueqQWahc,4678 +pip/_internal/utils/hashes.pyc,, +pip/_internal/utils/inject_securetransport.py,sha256=M17ZlFVY66ApgeASVjKKLKNz0LAfk-SyU0HZ4ZB6MmI,810 +pip/_internal/utils/inject_securetransport.pyc,, +pip/_internal/utils/logging.py,sha256=YIfuDUEkmdn9cIRQ_Ec8rgXs1m5nOwDECtZqM4CBH5U,13093 +pip/_internal/utils/logging.pyc,, +pip/_internal/utils/misc.py,sha256=QQZWMJkKKADPSWQYmrwlasc8b03eCcghn0yDNprYgrI,28001 +pip/_internal/utils/misc.pyc,, +pip/_internal/utils/models.py,sha256=HqiBVtTbW_b_Umvj2fjhDWOHo2RKhPwSz4iAYkQZ688,1201 +pip/_internal/utils/models.pyc,, +pip/_internal/utils/packaging.py,sha256=VtiwcAAL7LBi7tGL2je7LeW4bE11KMHGCsJ1NZY5XtM,3035 +pip/_internal/utils/packaging.pyc,, +pip/_internal/utils/parallel.py,sha256=7az3aaTMCkqpaLFbpYYOvk0rj7Hu5YH1NPXXomqjgf4,3404 +pip/_internal/utils/parallel.pyc,, +pip/_internal/utils/pkg_resources.py,sha256=ZX-k7V5q_aNWyDse92nN7orN1aCpRLsaxzpkBZ1XKzU,1254 +pip/_internal/utils/pkg_resources.pyc,, +pip/_internal/utils/setuptools_build.py,sha256=E1KswI7wfNnCDE5R6G8c9ZbByENpu7NqocjY26PCQDw,5058 +pip/_internal/utils/setuptools_build.pyc,, +pip/_internal/utils/subprocess.py,sha256=UkPe89gcjxBMx73uutoeJXgD3kwdlL6YO16BkjDdVSI,9924 +pip/_internal/utils/subprocess.pyc,, +pip/_internal/utils/temp_dir.py,sha256=blmG0jEvEgdxbYUt_V15bgcTIJIrxZwAw8QZlCTJYDE,8378 +pip/_internal/utils/temp_dir.pyc,, +pip/_internal/utils/typing.py,sha256=xkYwOeHlf4zsHXBDC4310HtEqwhQcYXFPq2h35Tcrl0,1401 +pip/_internal/utils/typing.pyc,, +pip/_internal/utils/unpacking.py,sha256=YFAckhqqvmehA8Kan5vd3b1kN_9TafqmOk4b-yz4fho,9488 +pip/_internal/utils/unpacking.pyc,, +pip/_internal/utils/urls.py,sha256=q2rw1kMiiig_XZcoyJSsWMJQqYw-2wUmrMoST4mCW_I,1527 +pip/_internal/utils/urls.pyc,, +pip/_internal/utils/virtualenv.py,sha256=fNGrRp-8QmNL5OzXajBd-z7PbwOsx1XY6G-AVMAhfso,3706 +pip/_internal/utils/virtualenv.pyc,, +pip/_internal/utils/wheel.py,sha256=wFzn3h8GqYvgsyWPZtUyn0Rb3MJzmtyP3owMOhKnmL0,7303 +pip/_internal/utils/wheel.pyc,, +pip/_internal/vcs/__init__.py,sha256=viJxJRqRE_mVScum85bgQIXAd6o0ozFt18VpC-qIJrM,617 +pip/_internal/vcs/__init__.pyc,, +pip/_internal/vcs/bazaar.py,sha256=5rRR02uDZTLaxQT-R5Obd8FZDOMlShqYds-pwVSJJs8,3887 +pip/_internal/vcs/bazaar.pyc,, +pip/_internal/vcs/git.py,sha256=kvB729wrKY0OWMSgOS1pUly4LosZp8utrd3kOQsWalA,13985 +pip/_internal/vcs/git.pyc,, +pip/_internal/vcs/mercurial.py,sha256=FzCGmYzVZvB-vyM73fKcQk2B4jMNXGnXlQ2bJ7nmglM,5162 +pip/_internal/vcs/mercurial.pyc,, +pip/_internal/vcs/subversion.py,sha256=rldcn9ZDt5twjNPzFn_FKRn4qdfkjlxHMJEsR2MFfoA,12399 +pip/_internal/vcs/subversion.pyc,, +pip/_internal/vcs/versioncontrol.py,sha256=WpxeTRC0NoGB2uXJdmfq4pPxY-p7sk1rV_WkxMxgzQA,25966 +pip/_internal/vcs/versioncontrol.pyc,, +pip/_internal/wheel_builder.py,sha256=6w1VPXrpUvCCPlV0cI1wNaCqNz4laF6B6whvaxl9cns,9522 +pip/_internal/wheel_builder.pyc,, +pip/_vendor/__init__.py,sha256=CsxnpYPbi_2agrDI79iQrCmQeZRcwwIF0C6cm_1RynU,4588 +pip/_vendor/__init__.pyc,, +pip/_vendor/appdirs.py,sha256=M6IYRJtdZgmSPCXCSMBRB0VT3P8MdFbWCDbSLrB2Ebg,25907 +pip/_vendor/appdirs.pyc,, +pip/_vendor/cachecontrol/__init__.py,sha256=pJtAaUxOsMPnytI1A3juAJkXYDr8krdSnsg4Yg3OBEg,302 +pip/_vendor/cachecontrol/__init__.pyc,, +pip/_vendor/cachecontrol/_cmd.py,sha256=URGE0KrA87QekCG3SGPatlSPT571dZTDjNa-ZXX3pDc,1295 +pip/_vendor/cachecontrol/_cmd.pyc,, +pip/_vendor/cachecontrol/adapter.py,sha256=sSwaSYd93IIfCFU4tOMgSo6b2LCt_gBSaQUj8ktJFOA,4882 +pip/_vendor/cachecontrol/adapter.pyc,, +pip/_vendor/cachecontrol/cache.py,sha256=1fc4wJP8HYt1ycnJXeEw5pCpeBL2Cqxx6g9Fb0AYDWQ,805 +pip/_vendor/cachecontrol/cache.pyc,, +pip/_vendor/cachecontrol/caches/__init__.py,sha256=-gHNKYvaeD0kOk5M74eOrsSgIKUtC6i6GfbmugGweEo,86 +pip/_vendor/cachecontrol/caches/__init__.pyc,, +pip/_vendor/cachecontrol/caches/file_cache.py,sha256=nYVKsJtXh6gJXvdn1iWyrhxvkwpQrK-eKoMRzuiwkKk,4153 +pip/_vendor/cachecontrol/caches/file_cache.pyc,, +pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=HxelMpNCo-dYr2fiJDwM3hhhRmxUYtB5tXm1GpAAT4Y,856 +pip/_vendor/cachecontrol/caches/redis_cache.pyc,, +pip/_vendor/cachecontrol/compat.py,sha256=kHNvMRdt6s_Xwqq_9qJmr9ou3wYMOMUMxPPcwNxT8Mc,695 +pip/_vendor/cachecontrol/compat.pyc,, +pip/_vendor/cachecontrol/controller.py,sha256=CWEX3pedIM9s60suf4zZPtm_JvVgnvogMGK_OiBG5F8,14149 +pip/_vendor/cachecontrol/controller.pyc,, +pip/_vendor/cachecontrol/filewrapper.py,sha256=vACKO8Llzu_ZWyjV1Fxn1MA4TGU60N5N3GSrAFdAY2Q,2533 +pip/_vendor/cachecontrol/filewrapper.pyc,, +pip/_vendor/cachecontrol/heuristics.py,sha256=BFGHJ3yQcxvZizfo90LLZ04T_Z5XSCXvFotrp7Us0sc,4070 +pip/_vendor/cachecontrol/heuristics.pyc,, +pip/_vendor/cachecontrol/serialize.py,sha256=vIa4jvq4x_KSOLdEIedoknX2aXYHQujLDFV4-F21Dno,7091 +pip/_vendor/cachecontrol/serialize.pyc,, +pip/_vendor/cachecontrol/wrapper.py,sha256=5LX0uJwkNQUtYSEw3aGmGu9WY8wGipd81mJ8lG0d0M4,690 +pip/_vendor/cachecontrol/wrapper.pyc,, +pip/_vendor/certifi/__init__.py,sha256=u1E_DrSGj_nnEkK5VglvEqP8D80KpghLVWL0A_pq41A,62 +pip/_vendor/certifi/__init__.pyc,, +pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255 +pip/_vendor/certifi/__main__.pyc,, +pip/_vendor/certifi/cacert.pem,sha256=GhT24f0R7_9y4YY_hkXwkO7BthZhRGDCEMO348E9S14,282394 +pip/_vendor/certifi/core.py,sha256=jBrwKEWpG0IKcuozK0BQ2HHGp8adXAOyBPC7ddgR6vM,2315 +pip/_vendor/certifi/core.pyc,, +pip/_vendor/chardet/__init__.py,sha256=YsP5wQlsHJ2auF1RZJfypiSrCA7_bQiRm3ES_NI76-Y,1559 +pip/_vendor/chardet/__init__.pyc,, +pip/_vendor/chardet/big5freq.py,sha256=D_zK5GyzoVsRes0HkLJziltFQX0bKCLOrFe9_xDvO_8,31254 +pip/_vendor/chardet/big5freq.pyc,, +pip/_vendor/chardet/big5prober.py,sha256=kBxHbdetBpPe7xrlb-e990iot64g_eGSLd32lB7_h3M,1757 +pip/_vendor/chardet/big5prober.pyc,, +pip/_vendor/chardet/chardistribution.py,sha256=3woWS62KrGooKyqz4zQSnjFbJpa6V7g02daAibTwcl8,9411 +pip/_vendor/chardet/chardistribution.pyc,, +pip/_vendor/chardet/charsetgroupprober.py,sha256=6bDu8YIiRuScX4ca9Igb0U69TA2PGXXDej6Cc4_9kO4,3787 +pip/_vendor/chardet/charsetgroupprober.pyc,, +pip/_vendor/chardet/charsetprober.py,sha256=KSmwJErjypyj0bRZmC5F5eM7c8YQgLYIjZXintZNstg,5110 +pip/_vendor/chardet/charsetprober.pyc,, +pip/_vendor/chardet/cli/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +pip/_vendor/chardet/cli/__init__.pyc,, +pip/_vendor/chardet/cli/chardetect.py,sha256=DI8dlV3FBD0c0XA_y3sQ78z754DUv1J8n34RtDjOXNw,2774 +pip/_vendor/chardet/cli/chardetect.pyc,, +pip/_vendor/chardet/codingstatemachine.py,sha256=VYp_6cyyki5sHgXDSZnXW4q1oelHc3cu9AyQTX7uug8,3590 +pip/_vendor/chardet/codingstatemachine.pyc,, +pip/_vendor/chardet/compat.py,sha256=PKTzHkSbtbHDqS9PyujMbX74q1a8mMpeQTDVsQhZMRw,1134 +pip/_vendor/chardet/compat.pyc,, +pip/_vendor/chardet/cp949prober.py,sha256=TZ434QX8zzBsnUvL_8wm4AQVTZ2ZkqEEQL_lNw9f9ow,1855 +pip/_vendor/chardet/cp949prober.pyc,, +pip/_vendor/chardet/enums.py,sha256=Aimwdb9as1dJKZaFNUH2OhWIVBVd6ZkJJ_WK5sNY8cU,1661 +pip/_vendor/chardet/enums.pyc,, +pip/_vendor/chardet/escprober.py,sha256=kkyqVg1Yw3DIOAMJ2bdlyQgUFQhuHAW8dUGskToNWSc,3950 +pip/_vendor/chardet/escprober.pyc,, +pip/_vendor/chardet/escsm.py,sha256=RuXlgNvTIDarndvllNCk5WZBIpdCxQ0kcd9EAuxUh84,10510 +pip/_vendor/chardet/escsm.pyc,, +pip/_vendor/chardet/eucjpprober.py,sha256=iD8Jdp0ISRjgjiVN7f0e8xGeQJ5GM2oeZ1dA8nbSeUw,3749 +pip/_vendor/chardet/eucjpprober.pyc,, +pip/_vendor/chardet/euckrfreq.py,sha256=-7GdmvgWez4-eO4SuXpa7tBiDi5vRXQ8WvdFAzVaSfo,13546 +pip/_vendor/chardet/euckrfreq.pyc,, +pip/_vendor/chardet/euckrprober.py,sha256=MqFMTQXxW4HbzIpZ9lKDHB3GN8SP4yiHenTmf8g_PxY,1748 +pip/_vendor/chardet/euckrprober.pyc,, +pip/_vendor/chardet/euctwfreq.py,sha256=No1WyduFOgB5VITUA7PLyC5oJRNzRyMbBxaKI1l16MA,31621 +pip/_vendor/chardet/euctwfreq.pyc,, +pip/_vendor/chardet/euctwprober.py,sha256=13p6EP4yRaxqnP4iHtxHOJ6R2zxHq1_m8hTRjzVZ95c,1747 +pip/_vendor/chardet/euctwprober.pyc,, +pip/_vendor/chardet/gb2312freq.py,sha256=JX8lsweKLmnCwmk8UHEQsLgkr_rP_kEbvivC4qPOrlc,20715 +pip/_vendor/chardet/gb2312freq.pyc,, +pip/_vendor/chardet/gb2312prober.py,sha256=gGvIWi9WhDjE-xQXHvNIyrnLvEbMAYgyUSZ65HUfylw,1754 +pip/_vendor/chardet/gb2312prober.pyc,, +pip/_vendor/chardet/hebrewprober.py,sha256=c3SZ-K7hvyzGY6JRAZxJgwJ_sUS9k0WYkvMY00YBYFo,13838 +pip/_vendor/chardet/hebrewprober.pyc,, +pip/_vendor/chardet/jisfreq.py,sha256=vpmJv2Bu0J8gnMVRPHMFefTRvo_ha1mryLig8CBwgOg,25777 +pip/_vendor/chardet/jisfreq.pyc,, +pip/_vendor/chardet/jpcntx.py,sha256=PYlNqRUQT8LM3cT5FmHGP0iiscFlTWED92MALvBungo,19643 +pip/_vendor/chardet/jpcntx.pyc,, +pip/_vendor/chardet/langbulgarianmodel.py,sha256=1HqQS9Pbtnj1xQgxitJMvw8X6kKr5OockNCZWfEQrPE,12839 +pip/_vendor/chardet/langbulgarianmodel.pyc,, +pip/_vendor/chardet/langcyrillicmodel.py,sha256=LODajvsetH87yYDDQKA2CULXUH87tI223dhfjh9Zx9c,17948 +pip/_vendor/chardet/langcyrillicmodel.pyc,, +pip/_vendor/chardet/langgreekmodel.py,sha256=8YAW7bU8YwSJap0kIJSbPMw1BEqzGjWzqcqf0WgUKAA,12688 +pip/_vendor/chardet/langgreekmodel.pyc,, +pip/_vendor/chardet/langhebrewmodel.py,sha256=JSnqmE5E62tDLTPTvLpQsg5gOMO4PbdWRvV7Avkc0HA,11345 +pip/_vendor/chardet/langhebrewmodel.pyc,, +pip/_vendor/chardet/langhungarianmodel.py,sha256=RhapYSG5l0ZaO-VV4Fan5sW0WRGQqhwBM61yx3yxyOA,12592 +pip/_vendor/chardet/langhungarianmodel.pyc,, +pip/_vendor/chardet/langthaimodel.py,sha256=8l0173Gu_W6G8mxmQOTEF4ls2YdE7FxWf3QkSxEGXJQ,11290 +pip/_vendor/chardet/langthaimodel.pyc,, +pip/_vendor/chardet/langturkishmodel.py,sha256=W22eRNJsqI6uWAfwXSKVWWnCerYqrI8dZQTm_M0lRFk,11102 +pip/_vendor/chardet/langturkishmodel.pyc,, +pip/_vendor/chardet/latin1prober.py,sha256=S2IoORhFk39FEFOlSFWtgVybRiP6h7BlLldHVclNkU8,5370 +pip/_vendor/chardet/latin1prober.pyc,, +pip/_vendor/chardet/mbcharsetprober.py,sha256=AR95eFH9vuqSfvLQZN-L5ijea25NOBCoXqw8s5O9xLQ,3413 +pip/_vendor/chardet/mbcharsetprober.pyc,, +pip/_vendor/chardet/mbcsgroupprober.py,sha256=h6TRnnYq2OxG1WdD5JOyxcdVpn7dG0q-vB8nWr5mbh4,2012 +pip/_vendor/chardet/mbcsgroupprober.pyc,, +pip/_vendor/chardet/mbcssm.py,sha256=SY32wVIF3HzcjY3BaEspy9metbNSKxIIB0RKPn7tjpI,25481 +pip/_vendor/chardet/mbcssm.pyc,, +pip/_vendor/chardet/sbcharsetprober.py,sha256=LDSpCldDCFlYwUkGkwD2oFxLlPWIWXT09akH_2PiY74,5657 +pip/_vendor/chardet/sbcharsetprober.pyc,, +pip/_vendor/chardet/sbcsgroupprober.py,sha256=1IprcCB_k1qfmnxGC6MBbxELlKqD3scW6S8YIwdeyXA,3546 +pip/_vendor/chardet/sbcsgroupprober.pyc,, +pip/_vendor/chardet/sjisprober.py,sha256=IIt-lZj0WJqK4rmUZzKZP4GJlE8KUEtFYVuY96ek5MQ,3774 +pip/_vendor/chardet/sjisprober.pyc,, +pip/_vendor/chardet/universaldetector.py,sha256=qL0174lSZE442eB21nnktT9_VcAye07laFWUeUrjttY,12485 +pip/_vendor/chardet/universaldetector.pyc,, +pip/_vendor/chardet/utf8prober.py,sha256=IdD8v3zWOsB8OLiyPi-y_fqwipRFxV9Nc1eKBLSuIEw,2766 +pip/_vendor/chardet/utf8prober.pyc,, +pip/_vendor/chardet/version.py,sha256=sp3B08mrDXB-pf3K9fqJ_zeDHOCLC8RrngQyDFap_7g,242 +pip/_vendor/chardet/version.pyc,, +pip/_vendor/colorama/__init__.py,sha256=DqjXH9URVP3IJwmMt7peYw50ns1RNAymIB9-XdPEFV8,239 +pip/_vendor/colorama/__init__.pyc,, +pip/_vendor/colorama/ansi.py,sha256=Fi0un-QLqRm-v7o_nKiOqyC8PapBJK7DLV_q9LKtTO0,2524 +pip/_vendor/colorama/ansi.pyc,, +pip/_vendor/colorama/ansitowin32.py,sha256=u8QaqdqS_xYSfNkPM1eRJLHz6JMWPodaJaP0mxgHCDc,10462 +pip/_vendor/colorama/ansitowin32.pyc,, +pip/_vendor/colorama/initialise.py,sha256=PprovDNxMTrvoNHFcL2NZjpH2XzDc8BLxLxiErfUl4k,1915 +pip/_vendor/colorama/initialise.pyc,, +pip/_vendor/colorama/win32.py,sha256=bJ8Il9jwaBN5BJ8bmN6FoYZ1QYuMKv2j8fGrXh7TJjw,5404 +pip/_vendor/colorama/win32.pyc,, +pip/_vendor/colorama/winterm.py,sha256=2y_2b7Zsv34feAsP67mLOVc-Bgq51mdYGo571VprlrM,6438 +pip/_vendor/colorama/winterm.pyc,, +pip/_vendor/contextlib2.py,sha256=5HjGflUzwWAUfcILhSmC2GqvoYdZZzFzVfIDztHigUs,16915 +pip/_vendor/contextlib2.pyc,, +pip/_vendor/distlib/__init__.py,sha256=3veAk2rPznOB2gsK6tjbbh0TQMmGE5P82eE9wXq6NIk,581 +pip/_vendor/distlib/__init__.pyc,, +pip/_vendor/distlib/_backport/__init__.py,sha256=bqS_dTOH6uW9iGgd0uzfpPjo6vZ4xpPZ7kyfZJ2vNaw,274 +pip/_vendor/distlib/_backport/__init__.pyc,, +pip/_vendor/distlib/_backport/misc.py,sha256=KWecINdbFNOxSOP1fGF680CJnaC6S4fBRgEtaYTw0ig,971 +pip/_vendor/distlib/_backport/misc.pyc,, +pip/_vendor/distlib/_backport/shutil.py,sha256=IX_G2NPqwecJibkIDje04bqu0xpHkfSQ2GaGdEVqM5Y,25707 +pip/_vendor/distlib/_backport/shutil.pyc,, +pip/_vendor/distlib/_backport/sysconfig.cfg,sha256=swZKxq9RY5e9r3PXCrlvQPMsvOdiWZBTHLEbqS8LJLU,2617 +pip/_vendor/distlib/_backport/sysconfig.py,sha256=BQHFlb6pubCl_dvT1NjtzIthylofjKisox239stDg0U,26854 +pip/_vendor/distlib/_backport/sysconfig.pyc,, +pip/_vendor/distlib/_backport/tarfile.py,sha256=Ihp7rXRcjbIKw8COm9wSePV9ARGXbSF9gGXAMn2Q-KU,92628 +pip/_vendor/distlib/_backport/tarfile.pyc,, +pip/_vendor/distlib/compat.py,sha256=ADA56xiAxar3mU6qemlBhNbsrFPosXRhO44RzsbJPqk,41408 +pip/_vendor/distlib/compat.pyc,, +pip/_vendor/distlib/database.py,sha256=Kl0YvPQKc4OcpVi7k5cFziydM1xOK8iqdxLGXgbZHV4,51059 +pip/_vendor/distlib/database.pyc,, +pip/_vendor/distlib/index.py,sha256=SXKzpQCERctxYDMp_OLee2f0J0e19ZhGdCIoMlUfUQM,21066 +pip/_vendor/distlib/index.pyc,, +pip/_vendor/distlib/locators.py,sha256=c9E4cDEacJ_uKbuE5BqAVocoWp6rsuBGTkiNDQq3zV4,52100 +pip/_vendor/distlib/locators.pyc,, +pip/_vendor/distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811 +pip/_vendor/distlib/manifest.pyc,, +pip/_vendor/distlib/markers.py,sha256=6Ac3cCfFBERexiESWIOXmg-apIP8l2esafNSX3KMy-8,4387 +pip/_vendor/distlib/markers.pyc,, +pip/_vendor/distlib/metadata.py,sha256=z2KPy3h3tcDnb9Xs7nAqQ5Oz0bqjWAUFmKWcFKRoodg,38962 +pip/_vendor/distlib/metadata.pyc,, +pip/_vendor/distlib/resources.py,sha256=2FGv0ZHF14KXjLIlL0R991lyQQGcewOS4mJ-5n-JVnc,10766 +pip/_vendor/distlib/resources.pyc,, +pip/_vendor/distlib/scripts.py,sha256=_MAj3sMuv56kuM8FsiIWXqbT0gmumPGaOR_atOzn4a4,17180 +pip/_vendor/distlib/scripts.pyc,, +pip/_vendor/distlib/t32.exe,sha256=NS3xBCVAld35JVFNmb-1QRyVtThukMrwZVeXn4LhaEQ,96768 +pip/_vendor/distlib/t64.exe,sha256=oAqHes78rUWVM0OtVqIhUvequl_PKhAhXYQWnUf7zR0,105984 +pip/_vendor/distlib/util.py,sha256=f2jZCPrcLCt6LcnC0gUy-Fur60tXD8reA7k4rDpHMDw,59845 +pip/_vendor/distlib/util.pyc,, +pip/_vendor/distlib/version.py,sha256=_n7F6juvQGAcn769E_SHa7fOcf5ERlEVymJ_EjPRwGw,23391 +pip/_vendor/distlib/version.pyc,, +pip/_vendor/distlib/w32.exe,sha256=lJtnZdeUxTZWya_EW5DZos_K5rswRECGspIl8ZJCIXs,90112 +pip/_vendor/distlib/w64.exe,sha256=0aRzoN2BO9NWW4ENy4_4vHkHR4qZTFZNVSAJJYlODTI,99840 +pip/_vendor/distlib/wheel.py,sha256=v6DnwTqhNHwrEVFr8_YeiTW6G4ftP_evsywNgrmdb2o,41144 +pip/_vendor/distlib/wheel.pyc,, +pip/_vendor/distro.py,sha256=xxMIh2a3KmippeWEHzynTdHT3_jZM0o-pos0dAWJROM,43628 +pip/_vendor/distro.pyc,, +pip/_vendor/html5lib/__init__.py,sha256=BYzcKCqeEii52xDrqBFruhnmtmkiuHXFyFh-cglQ8mk,1160 +pip/_vendor/html5lib/__init__.pyc,, +pip/_vendor/html5lib/_ihatexml.py,sha256=ifOwF7pXqmyThIXc3boWc96s4MDezqRrRVp7FwDYUFs,16728 +pip/_vendor/html5lib/_ihatexml.pyc,, +pip/_vendor/html5lib/_inputstream.py,sha256=jErNASMlkgs7MpOM9Ve_VdLDJyFFweAjLuhVutZz33U,32353 +pip/_vendor/html5lib/_inputstream.pyc,, +pip/_vendor/html5lib/_tokenizer.py,sha256=04mgA2sNTniutl2fxFv-ei5bns4iRaPxVXXHh_HrV_4,77040 +pip/_vendor/html5lib/_tokenizer.pyc,, +pip/_vendor/html5lib/_trie/__init__.py,sha256=nqfgO910329BEVJ5T4psVwQtjd2iJyEXQ2-X8c1YxwU,109 +pip/_vendor/html5lib/_trie/__init__.pyc,, +pip/_vendor/html5lib/_trie/_base.py,sha256=CaybYyMro8uERQYjby2tTeSUatnWDfWroUN9N7ety5w,1013 +pip/_vendor/html5lib/_trie/_base.pyc,, +pip/_vendor/html5lib/_trie/py.py,sha256=wXmQLrZRf4MyWNyg0m3h81m9InhLR7GJ002mIIZh-8o,1775 +pip/_vendor/html5lib/_trie/py.pyc,, +pip/_vendor/html5lib/_utils.py,sha256=Dx9AKntksRjFT1veBj7I362pf5OgIaT0zglwq43RnfU,4931 +pip/_vendor/html5lib/_utils.pyc,, +pip/_vendor/html5lib/constants.py,sha256=Ll-yzLU_jcjyAI_h57zkqZ7aQWE5t5xA4y_jQgoUUhw,83464 +pip/_vendor/html5lib/constants.pyc,, +pip/_vendor/html5lib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/html5lib/filters/__init__.pyc,, +pip/_vendor/html5lib/filters/alphabeticalattributes.py,sha256=lViZc2JMCclXi_5gduvmdzrRxtO5Xo9ONnbHBVCsykU,919 +pip/_vendor/html5lib/filters/alphabeticalattributes.pyc,, +pip/_vendor/html5lib/filters/base.py,sha256=z-IU9ZAYjpsVsqmVt7kuWC63jR11hDMr6CVrvuao8W0,286 +pip/_vendor/html5lib/filters/base.pyc,, +pip/_vendor/html5lib/filters/inject_meta_charset.py,sha256=egDXUEHXmAG9504xz0K6ALDgYkvUrC2q15YUVeNlVQg,2945 +pip/_vendor/html5lib/filters/inject_meta_charset.pyc,, +pip/_vendor/html5lib/filters/lint.py,sha256=jk6q56xY0ojiYfvpdP-OZSm9eTqcAdRqhCoPItemPYA,3643 +pip/_vendor/html5lib/filters/lint.pyc,, +pip/_vendor/html5lib/filters/optionaltags.py,sha256=8lWT75J0aBOHmPgfmqTHSfPpPMp01T84NKu0CRedxcE,10588 +pip/_vendor/html5lib/filters/optionaltags.pyc,, +pip/_vendor/html5lib/filters/sanitizer.py,sha256=m6oGmkBhkGAnn2nV6D4hE78SCZ6WEnK9rKdZB3uXBIc,26897 +pip/_vendor/html5lib/filters/sanitizer.pyc,, +pip/_vendor/html5lib/filters/whitespace.py,sha256=8eWqZxd4UC4zlFGW6iyY6f-2uuT8pOCSALc3IZt7_t4,1214 +pip/_vendor/html5lib/filters/whitespace.pyc,, +pip/_vendor/html5lib/html5parser.py,sha256=anr-aXre_ImfrkQ35c_rftKXxC80vJCREKe06Tq15HA,117186 +pip/_vendor/html5lib/html5parser.pyc,, +pip/_vendor/html5lib/serializer.py,sha256=_PpvcZF07cwE7xr9uKkZqh5f4UEaI8ltCU2xPJzaTpk,15759 +pip/_vendor/html5lib/serializer.pyc,, +pip/_vendor/html5lib/treeadapters/__init__.py,sha256=A0rY5gXIe4bJOiSGRO_j_tFhngRBO8QZPzPtPw5dFzo,679 +pip/_vendor/html5lib/treeadapters/__init__.pyc,, +pip/_vendor/html5lib/treeadapters/genshi.py,sha256=CH27pAsDKmu4ZGkAUrwty7u0KauGLCZRLPMzaO3M5vo,1715 +pip/_vendor/html5lib/treeadapters/genshi.pyc,, +pip/_vendor/html5lib/treeadapters/sax.py,sha256=BKS8woQTnKiqeffHsxChUqL4q2ZR_wb5fc9MJ3zQC8s,1776 +pip/_vendor/html5lib/treeadapters/sax.pyc,, +pip/_vendor/html5lib/treebuilders/__init__.py,sha256=AysSJyvPfikCMMsTVvaxwkgDieELD5dfR8FJIAuq7hY,3592 +pip/_vendor/html5lib/treebuilders/__init__.pyc,, +pip/_vendor/html5lib/treebuilders/base.py,sha256=z-o51vt9r_l2IDG5IioTOKGzZne4Fy3_Fc-7ztrOh4I,14565 +pip/_vendor/html5lib/treebuilders/base.pyc,, +pip/_vendor/html5lib/treebuilders/dom.py,sha256=22whb0C71zXIsai5mamg6qzBEiigcBIvaDy4Asw3at0,8925 +pip/_vendor/html5lib/treebuilders/dom.pyc,, +pip/_vendor/html5lib/treebuilders/etree.py,sha256=w5ZFpKk6bAxnrwD2_BrF5EVC7vzz0L3LMi9Sxrbc_8w,12836 +pip/_vendor/html5lib/treebuilders/etree.pyc,, +pip/_vendor/html5lib/treebuilders/etree_lxml.py,sha256=9gqDjs-IxsPhBYa5cpvv2FZ1KZlG83Giusy2lFmvIkE,14766 +pip/_vendor/html5lib/treebuilders/etree_lxml.pyc,, +pip/_vendor/html5lib/treewalkers/__init__.py,sha256=OBPtc1TU5mGyy18QDMxKEyYEz0wxFUUNj5v0-XgmYhY,5719 +pip/_vendor/html5lib/treewalkers/__init__.pyc,, +pip/_vendor/html5lib/treewalkers/base.py,sha256=ouiOsuSzvI0KgzdWP8PlxIaSNs9falhbiinAEc_UIJY,7476 +pip/_vendor/html5lib/treewalkers/base.pyc,, +pip/_vendor/html5lib/treewalkers/dom.py,sha256=EHyFR8D8lYNnyDU9lx_IKigVJRyecUGua0mOi7HBukc,1413 +pip/_vendor/html5lib/treewalkers/dom.pyc,, +pip/_vendor/html5lib/treewalkers/etree.py,sha256=xo1L5m9VtkfpFJK0pFmkLVajhqYYVisVZn3k9kYpPkI,4551 +pip/_vendor/html5lib/treewalkers/etree.pyc,, +pip/_vendor/html5lib/treewalkers/etree_lxml.py,sha256=_b0LAVWLcVu9WaU_-w3D8f0IRSpCbjf667V-3NRdhTw,6357 +pip/_vendor/html5lib/treewalkers/etree_lxml.pyc,, +pip/_vendor/html5lib/treewalkers/genshi.py,sha256=4D2PECZ5n3ZN3qu3jMl9yY7B81jnQApBQSVlfaIuYbA,2309 +pip/_vendor/html5lib/treewalkers/genshi.pyc,, +pip/_vendor/idna/__init__.py,sha256=9Nt7xpyet3DmOrPUGooDdAwmHZZu1qUAy2EaJ93kGiQ,58 +pip/_vendor/idna/__init__.pyc,, +pip/_vendor/idna/codec.py,sha256=lvYb7yu7PhAqFaAIAdWcwgaWI2UmgseUua-1c0AsG0A,3299 +pip/_vendor/idna/codec.pyc,, +pip/_vendor/idna/compat.py,sha256=R-h29D-6mrnJzbXxymrWUW7iZUvy-26TQwZ0ij57i4U,232 +pip/_vendor/idna/compat.pyc,, +pip/_vendor/idna/core.py,sha256=jCoaLb3bA2tS_DDx9PpGuNTEZZN2jAzB369aP-IHYRE,11951 +pip/_vendor/idna/core.pyc,, +pip/_vendor/idna/idnadata.py,sha256=gmzFwZWjdms3kKZ_M_vwz7-LP_SCgYfSeE03B21Qpsk,42350 +pip/_vendor/idna/idnadata.pyc,, +pip/_vendor/idna/intranges.py,sha256=TY1lpxZIQWEP6tNqjZkFA5hgoMWOj1OBmnUG8ihT87E,1749 +pip/_vendor/idna/intranges.pyc,, +pip/_vendor/idna/package_data.py,sha256=bxBjpLnE06_1jSYKEy5svOMu1zM3OMztXVUb1tPlcp0,22 +pip/_vendor/idna/package_data.pyc,, +pip/_vendor/idna/uts46data.py,sha256=lMdw2zdjkH1JUWXPPEfFUSYT3Fyj60bBmfLvvy5m7ko,202084 +pip/_vendor/idna/uts46data.pyc,, +pip/_vendor/ipaddress.py,sha256=-0RmurI31XgAaN20WCi0zrcuoat90nNA70_6yGlx2PU,79875 +pip/_vendor/ipaddress.pyc,, +pip/_vendor/msgpack/__init__.py,sha256=2gJwcsTIaAtCM0GMi2rU-_Y6kILeeQuqRkrQ22jSANc,1118 +pip/_vendor/msgpack/__init__.pyc,, +pip/_vendor/msgpack/_version.py,sha256=hu7lzmZ_ClOaOOmRsWb4xomhzQ4UIsLsvv8KY6UysHE,20 +pip/_vendor/msgpack/_version.pyc,, +pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081 +pip/_vendor/msgpack/exceptions.pyc,, +pip/_vendor/msgpack/ext.py,sha256=nV19BzE9Be8SJHrxxYJHFbvEHJaXcP3avRkHVp5wovM,6034 +pip/_vendor/msgpack/ext.pyc,, +pip/_vendor/msgpack/fallback.py,sha256=Z8V3iYUUPqKVy4WWTk64Vq3G0PylQIOmlWvgnMhmkdU,37133 +pip/_vendor/msgpack/fallback.pyc,, +pip/_vendor/packaging/__about__.py,sha256=PNMsaZn4UcCHyubgROH1bl6CluduPjI5kFrSp_Zgklo,736 +pip/_vendor/packaging/__about__.pyc,, +pip/_vendor/packaging/__init__.py,sha256=6enbp5XgRfjBjsI9-bn00HjHf5TH21PDMOKkJW8xw-w,562 +pip/_vendor/packaging/__init__.pyc,, +pip/_vendor/packaging/_compat.py,sha256=MXdsGpSE_W-ZrHoC87andI4LV2FAwU7HLL-eHe_CjhU,1128 +pip/_vendor/packaging/_compat.pyc,, +pip/_vendor/packaging/_structures.py,sha256=ozkCX8Q8f2qE1Eic3YiQ4buDVfgz2iYevY9e7R2y3iY,2022 +pip/_vendor/packaging/_structures.pyc,, +pip/_vendor/packaging/_typing.py,sha256=VgA0AAvsc97KB5nF89zoudOyCMEsV7FlaXzZbYqEkzA,1824 +pip/_vendor/packaging/_typing.pyc,, +pip/_vendor/packaging/markers.py,sha256=V_RdoQqOUbSfy7y9o2vRk7BkzAh3yneC82cuWpKrqOg,9491 +pip/_vendor/packaging/markers.pyc,, +pip/_vendor/packaging/requirements.py,sha256=F93hkn7i8NKRZP-FtdTIlhz1PUsRjhe6eRbsBXX0Uh4,4903 +pip/_vendor/packaging/requirements.pyc,, +pip/_vendor/packaging/specifiers.py,sha256=uYp9l13F0LcknS6d4N60ytiBgFmIhKideOq9AnsxTco,31944 +pip/_vendor/packaging/specifiers.pyc,, +pip/_vendor/packaging/tags.py,sha256=NKMS37Zo_nWrZxgsD6zbXsXgc9edn9m160cBiLmHJdE,24067 +pip/_vendor/packaging/tags.pyc,, +pip/_vendor/packaging/utils.py,sha256=RShlvnjO2CtYSD8uri32frMMFMTmB-3ihsq1-ghzLEw,1811 +pip/_vendor/packaging/utils.pyc,, +pip/_vendor/packaging/version.py,sha256=Cnbm-OO9D_qd8ZTFxzFcjSavexSYFZmyeaoPvMsjgPc,15470 +pip/_vendor/packaging/version.pyc,, +pip/_vendor/pep517/__init__.py,sha256=r5uA106NGJa3slspaD2m32aFpFUiZX-mZ9vIlzAEOp4,84 +pip/_vendor/pep517/__init__.pyc,, +pip/_vendor/pep517/_in_process.py,sha256=XrKOTURJdia5R7i3i_OQmS89LASFXE3HQXfX63qZBIE,8438 +pip/_vendor/pep517/_in_process.pyc,, +pip/_vendor/pep517/build.py,sha256=DN4ouyj_bd00knOKqv0KHRtN0-JezJoNNZQmcDi4juk,3335 +pip/_vendor/pep517/build.pyc,, +pip/_vendor/pep517/check.py,sha256=YoaNE3poJGpz96biVCYwtcDshwEGE2HRU5KKya9yfpY,5961 +pip/_vendor/pep517/check.pyc,, +pip/_vendor/pep517/colorlog.py,sha256=Tk9AuYm_cLF3BKTBoSTJt9bRryn0aFojIQOwbfVUTxQ,4098 +pip/_vendor/pep517/colorlog.pyc,, +pip/_vendor/pep517/compat.py,sha256=M-5s4VNp8rjyT76ZZ_ibnPD44DYVzSQlyCEHayjtDPw,780 +pip/_vendor/pep517/compat.pyc,, +pip/_vendor/pep517/dirtools.py,sha256=2mkAkAL0mRz_elYFjRKuekTJVipH1zTn4tbf1EDev84,1129 +pip/_vendor/pep517/dirtools.pyc,, +pip/_vendor/pep517/envbuild.py,sha256=szKUFlO50X1ahQfXwz4hD9V2VE_bz9MLVPIeidsFo4w,6041 +pip/_vendor/pep517/envbuild.pyc,, +pip/_vendor/pep517/meta.py,sha256=8mnM5lDnT4zXQpBTliJbRGfesH7iioHwozbDxALPS9Y,2463 +pip/_vendor/pep517/meta.pyc,, +pip/_vendor/pep517/wrappers.py,sha256=yFU4Lp7TIYbmuVOTY-pXnlyGZ3F_grIi-JlLkpGN8Gk,10783 +pip/_vendor/pep517/wrappers.pyc,, +pip/_vendor/pkg_resources/__init__.py,sha256=XpGBfvS9fafA6bm5rx7vnxdxs7yqyoc_NnpzKApkJ64,108277 +pip/_vendor/pkg_resources/__init__.pyc,, +pip/_vendor/pkg_resources/py31compat.py,sha256=CRk8fkiPRDLsbi5pZcKsHI__Pbmh_94L8mr9Qy9Ab2U,562 +pip/_vendor/pkg_resources/py31compat.pyc,, +pip/_vendor/progress/__init__.py,sha256=fcbQQXo5np2CoQyhSH5XprkicwLZNLePR3uIahznSO0,4857 +pip/_vendor/progress/__init__.pyc,, +pip/_vendor/progress/bar.py,sha256=QuDuVNcmXgpxtNtxO0Fq72xKigxABaVmxYGBw4J3Z_E,2854 +pip/_vendor/progress/bar.pyc,, +pip/_vendor/progress/counter.py,sha256=MznyBrvPWrOlGe4MZAlGUb9q3aODe6_aNYeAE_VNoYA,1372 +pip/_vendor/progress/counter.pyc,, +pip/_vendor/progress/spinner.py,sha256=k8JbDW94T0-WXuXfxZIFhdoNPYp3jfnpXqBnfRv5fGs,1380 +pip/_vendor/progress/spinner.pyc,, +pip/_vendor/pyparsing.py,sha256=J1b4z3S_KwyJW7hKGnoN-hXW9pgMIzIP6QThyY5yJq4,273394 +pip/_vendor/pyparsing.pyc,, +pip/_vendor/requests/__init__.py,sha256=orzv4-1uejMDc2v3LnTVneINGXiwqXSfrASoFBsYblE,4465 +pip/_vendor/requests/__init__.pyc,, +pip/_vendor/requests/__version__.py,sha256=Xwky1FMlMkJJGidBM50JC7FKcosWzkjIW-WhQGrBdFM,441 +pip/_vendor/requests/__version__.pyc,, +pip/_vendor/requests/_internal_utils.py,sha256=Zx3PnEUccyfsB-ie11nZVAW8qClJy0gx1qNME7rgT18,1096 +pip/_vendor/requests/_internal_utils.pyc,, +pip/_vendor/requests/adapters.py,sha256=e-bmKEApNVqFdylxuMJJfiaHdlmS_zhWhIMEzlHvGuc,21548 +pip/_vendor/requests/adapters.pyc,, +pip/_vendor/requests/api.py,sha256=PlHM-HT3PQ5lyufoeGmV-nJxRi7UnUyGVh7OV7B9XV4,6496 +pip/_vendor/requests/api.pyc,, +pip/_vendor/requests/auth.py,sha256=OMoJIVKyRLy9THr91y8rxysZuclwPB-K1Xg1zBomUhQ,10207 +pip/_vendor/requests/auth.pyc,, +pip/_vendor/requests/certs.py,sha256=nXRVq9DtGmv_1AYbwjTu9UrgAcdJv05ZvkNeaoLOZxY,465 +pip/_vendor/requests/certs.pyc,, +pip/_vendor/requests/compat.py,sha256=LQWuCR4qXk6w7-qQopXyz0WNHUdAD40k0mKnaAEf1-g,2045 +pip/_vendor/requests/compat.pyc,, +pip/_vendor/requests/cookies.py,sha256=Y-bKX6TvW3FnYlE6Au0SXtVVWcaNdFvuAwQxw-G0iTI,18430 +pip/_vendor/requests/cookies.pyc,, +pip/_vendor/requests/exceptions.py,sha256=d9fJJw8YFBB9VzG9qhvxLuOx6be3c_Dwbck-dVUEAcs,3173 +pip/_vendor/requests/exceptions.pyc,, +pip/_vendor/requests/help.py,sha256=SJPVcoXeo7KfK4AxJN5eFVQCjr0im87tU2n7ubLsksU,3578 +pip/_vendor/requests/help.pyc,, +pip/_vendor/requests/hooks.py,sha256=QReGyy0bRcr5rkwCuObNakbYsc7EkiKeBwG4qHekr2Q,757 +pip/_vendor/requests/hooks.pyc,, +pip/_vendor/requests/models.py,sha256=_tKIbrscbGvaTdX1UHCwRaiYmPF9VBIuBeydr4Qx1Tg,34287 +pip/_vendor/requests/models.pyc,, +pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695 +pip/_vendor/requests/packages.pyc,, +pip/_vendor/requests/sessions.py,sha256=OBtwQs1vjkB1xamFdi_p5y8BVeX16BJoQcwSwx_Y3fI,29316 +pip/_vendor/requests/sessions.pyc,, +pip/_vendor/requests/status_codes.py,sha256=gT79Pbs_cQjBgp-fvrUgg1dn2DQO32bDj4TInjnMPSc,4188 +pip/_vendor/requests/status_codes.pyc,, +pip/_vendor/requests/structures.py,sha256=msAtr9mq1JxHd-JRyiILfdFlpbJwvvFuP3rfUQT_QxE,3005 +pip/_vendor/requests/structures.pyc,, +pip/_vendor/requests/utils.py,sha256=VBs99cvV8Z29WGXeWZqHzZ80_nu1AwwjYzJfe0wQIvs,30176 +pip/_vendor/requests/utils.pyc,, +pip/_vendor/resolvelib/__init__.py,sha256=sqMOy4CbVJQiaG9bCPj0oAntGAVy-RWdPfVaC9XDIEQ,537 +pip/_vendor/resolvelib/__init__.pyc,, +pip/_vendor/resolvelib/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/resolvelib/compat/__init__.pyc,, +pip/_vendor/resolvelib/compat/collections_abc.py,sha256=mtTkpr3Gf3OGvU1PD8YuvrJRhVbioxV82T-niFPoX3o,127 +pip/_vendor/resolvelib/compat/collections_abc.pyc,, +pip/_vendor/resolvelib/providers.py,sha256=TZDCmL-Ic-R5JRIZY8G4FLG5xB2343B0DfuK7aw2Yqw,4547 +pip/_vendor/resolvelib/providers.pyc,, +pip/_vendor/resolvelib/reporters.py,sha256=ZPSJnVfK8WvXTbX8jE0Nren0-_Hg9ym4epCUPtU8Y0U,1405 +pip/_vendor/resolvelib/reporters.pyc,, +pip/_vendor/resolvelib/resolvers.py,sha256=lQTGcc-2fgHbmdiLzeNDUxVmGc5ZFjkAL6JrVqnqJIw,15018 +pip/_vendor/resolvelib/resolvers.pyc,, +pip/_vendor/resolvelib/structs.py,sha256=yrdhd-n7DercimPGclXe20rgqhlxw8PnxC0wmcXO19Y,2016 +pip/_vendor/resolvelib/structs.pyc,, +pip/_vendor/retrying.py,sha256=k3fflf5_Mm0XcIJYhB7Tj34bqCCPhUDkYbx1NvW2FPE,9972 +pip/_vendor/retrying.pyc,, +pip/_vendor/six.py,sha256=U4Z_yv534W5CNyjY9i8V1OXY2SjAny8y2L5vDLhhThM,34159 +pip/_vendor/six.pyc,, +pip/_vendor/toml/__init__.py,sha256=rJ1pu933HgUtyeeNiusoPd5jJOPNhaKHhSSld3o8AQo,747 +pip/_vendor/toml/__init__.pyc,, +pip/_vendor/toml/common.py,sha256=ViBccAduP6eZNJAb1POhRhjOAi56TDsNgWJ1TjgXAug,242 +pip/_vendor/toml/common.pyc,, +pip/_vendor/toml/decoder.py,sha256=atpXmyFCzNGiqhkcYLySBuJQkPeSHDzBz47sEaX1amw,38696 +pip/_vendor/toml/decoder.pyc,, +pip/_vendor/toml/encoder.py,sha256=fPqLyFdPAam17X9SELz2TMp9affkfHCmgWZxRKcmzhY,9955 +pip/_vendor/toml/encoder.pyc,, +pip/_vendor/toml/ordered.py,sha256=UWt5Eka90IWVBYdvLgY5PXnkBcVYpHjnw9T67rM85T8,378 +pip/_vendor/toml/ordered.pyc,, +pip/_vendor/toml/tz.py,sha256=DrAgI3wZxZiGcLuV_l8ueA_nPrYoxQ3hZA9tJSjWRsQ,618 +pip/_vendor/toml/tz.pyc,, +pip/_vendor/urllib3/__init__.py,sha256=rdFZCO1L7e8861ZTvo8AiSKwxCe9SnWQUQwJ599YV9c,2683 +pip/_vendor/urllib3/__init__.pyc,, +pip/_vendor/urllib3/_collections.py,sha256=GouVsNzwg6jADZTmimMI6oqmwKSswnMo9dh5tGNVWO4,10792 +pip/_vendor/urllib3/_collections.pyc,, +pip/_vendor/urllib3/connection.py,sha256=Fln8a_bkegdNMkFoSOwyI0PJvL1OqzVUO6ifihKOTpc,14461 +pip/_vendor/urllib3/connection.pyc,, +pip/_vendor/urllib3/connectionpool.py,sha256=egdaX-Db_LVXifDxv3JY0dHIpQqDv0wC0_9Eeh8FkPM,35725 +pip/_vendor/urllib3/connectionpool.pyc,, +pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/__init__.pyc,, +pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957 +pip/_vendor/urllib3/contrib/_appengine_environ.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/_securetransport/__init__.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=mullWYFaghBdRWla6HYU-TBgFRTPLBEfxj3jplbeJmQ,16886 +pip/_vendor/urllib3/contrib/_securetransport/bindings.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=V7GnujxnWZh2N2sMsV5N4d9Imymokkm3zBwgt77_bSE,11956 +pip/_vendor/urllib3/contrib/_securetransport/low_level.pyc,, +pip/_vendor/urllib3/contrib/appengine.py,sha256=gfdK4T7CRin7v9HRhHDbDh-Hbk66hHDWeoz7nV3PJo8,11034 +pip/_vendor/urllib3/contrib/appengine.pyc,, +pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=a402AwGN_Ll3N-4ur_AS6UrU-ycUtlnYqoBF76lORg8,4160 +pip/_vendor/urllib3/contrib/ntlmpool.pyc,, +pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=9gm5kpC0ScbDCWobeCrh5LDqS8HgU8FNhmk5v8qQ5Bs,16582 +pip/_vendor/urllib3/contrib/pyopenssl.pyc,, +pip/_vendor/urllib3/contrib/securetransport.py,sha256=vBDFjSnH2gWa-ztMKVaiwW46K1mlDZKqvo_VAonfdcY,32401 +pip/_vendor/urllib3/contrib/securetransport.pyc,, +pip/_vendor/urllib3/contrib/socks.py,sha256=nzDMgDIFJWVubKHqvIn2-SKCO91hhJInP92WgHChGzA,7036 +pip/_vendor/urllib3/contrib/socks.pyc,, +pip/_vendor/urllib3/exceptions.py,sha256=D2Jvab7M7m_n0rnmBmq481paoVT32VvVeB6VeQM0y-w,7172 +pip/_vendor/urllib3/exceptions.pyc,, +pip/_vendor/urllib3/fields.py,sha256=kroD76QK-GdHHW7f_AUN4XxDC3OQPI2FFrS9eSL4BCs,8553 +pip/_vendor/urllib3/fields.pyc,, +pip/_vendor/urllib3/filepost.py,sha256=vj0qbrpT1AFzvvW4SuC8M5kJiw7wftHcSr-7b8UpPpw,2440 +pip/_vendor/urllib3/filepost.pyc,, +pip/_vendor/urllib3/packages/__init__.py,sha256=h4BLhD4tLaBx1adaDtKXfupsgqY0wWLXb_f1_yVlV6A,108 +pip/_vendor/urllib3/packages/__init__.pyc,, +pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/packages/backports/__init__.pyc,, +pip/_vendor/urllib3/packages/backports/makefile.py,sha256=005wrvH-_pWSnTFqQ2sdzzh4zVCtQUUQ4mR2Yyxwc0A,1418 +pip/_vendor/urllib3/packages/backports/makefile.pyc,, +pip/_vendor/urllib3/packages/six.py,sha256=adx4z-eM_D0Vvu0IIqVzFACQ_ux9l64y7DkSEfbxCDs,32536 +pip/_vendor/urllib3/packages/six.pyc,, +pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py,sha256=ywgKMtfHi1-DrXlzPfVAhzsLzzqcK7GT6eLgdode1Fg,688 +pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.pyc,, +pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py,sha256=rvQDQviqQLtPJB6MfEgABnBFj3nXft7ZJ3Dx-BC0AQY,5696 +pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.pyc,, +pip/_vendor/urllib3/poolmanager.py,sha256=iWEAIGrVNGoOmQyfiFwCqG-IyYy6GIQ-jJ9QCsX9li4,17861 +pip/_vendor/urllib3/poolmanager.pyc,, +pip/_vendor/urllib3/request.py,sha256=hhoHvEEatyd9Tn5EbGjQ0emn-ENMCyY591yNWTneINA,6018 +pip/_vendor/urllib3/request.pyc,, +pip/_vendor/urllib3/response.py,sha256=eo1Sfkn2x44FtjgP3qwwDsG9ak84spQAxEGy7Ovd4Pc,28221 +pip/_vendor/urllib3/response.pyc,, +pip/_vendor/urllib3/util/__init__.py,sha256=bWNaav_OT-1L7-sxm59cGb59rDORlbhb_4noduM5m0U,1038 +pip/_vendor/urllib3/util/__init__.pyc,, +pip/_vendor/urllib3/util/connection.py,sha256=NsxUAKQ98GKywta--zg57CdVpeTCI6N-GElCq78Dl8U,4637 +pip/_vendor/urllib3/util/connection.pyc,, +pip/_vendor/urllib3/util/queue.py,sha256=myTX3JDHntglKQNBf3b6dasHH-uF-W59vzGSQiFdAfI,497 +pip/_vendor/urllib3/util/queue.pyc,, +pip/_vendor/urllib3/util/request.py,sha256=C-6-AWffxZG03AdRGoY59uqsn4CVItKU6gjxz7Hc3Mc,3815 +pip/_vendor/urllib3/util/request.pyc,, +pip/_vendor/urllib3/util/response.py,sha256=_WbTQr8xRQuJuY2rTIZxVdJD6mnEOtQupjaK_bF_Vj8,2573 +pip/_vendor/urllib3/util/response.pyc,, +pip/_vendor/urllib3/util/retry.py,sha256=3wbv7SdzYNOxPcBiFkPCubTbK1_6vWSepznOXirhUfA,15543 +pip/_vendor/urllib3/util/retry.pyc,, +pip/_vendor/urllib3/util/ssl_.py,sha256=N7gqt2iqzKBsWGmc61YeKNSPri6Ns2iZ_MD5hV2y8tU,14523 +pip/_vendor/urllib3/util/ssl_.pyc,, +pip/_vendor/urllib3/util/timeout.py,sha256=3qawUo-TZq4q7tyeRToMIOdNGEOBjOOQVq7nHnLryP4,9947 +pip/_vendor/urllib3/util/timeout.pyc,, +pip/_vendor/urllib3/util/url.py,sha256=S4YyAwWKJPjFFECC7l9Vp9EKqRH1XAb-uQFANn1Tak0,13981 +pip/_vendor/urllib3/util/url.pyc,, +pip/_vendor/urllib3/util/wait.py,sha256=k46KzqIYu3Vnzla5YW3EvtInNlU_QycFqQAghIOxoAg,5406 +pip/_vendor/urllib3/util/wait.pyc,, +pip/_vendor/vendor.txt,sha256=bWUiaRjMJhuUsqFZHEJkBH_6lJ_Avl9cOyszcI74IHs,437 +pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579 +pip/_vendor/webencodings/__init__.pyc,, +pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979 +pip/_vendor/webencodings/labels.pyc,, +pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305 +pip/_vendor/webencodings/mklabels.pyc,, +pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563 +pip/_vendor/webencodings/tests.pyc,, +pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307 +pip/_vendor/webencodings/x_user_defined.pyc,, diff --git a/venv/lib/python2.7/site-packages/pip-20.2.4.dist-info/WHEEL b/venv/lib/python2.7/site-packages/pip-20.2.4.dist-info/WHEEL new file mode 100644 index 0000000..6d38aa0 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip-20.2.4.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.35.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/venv/lib/python2.7/site-packages/pip-20.2.4.dist-info/entry_points.txt b/venv/lib/python2.7/site-packages/pip-20.2.4.dist-info/entry_points.txt new file mode 100644 index 0000000..d48bd8a --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip-20.2.4.dist-info/entry_points.txt @@ -0,0 +1,5 @@ +[console_scripts] +pip = pip._internal.cli.main:main +pip3 = pip._internal.cli.main:main +pip3.8 = pip._internal.cli.main:main + diff --git a/venv/lib/python2.7/site-packages/pip-20.2.4.dist-info/top_level.txt b/venv/lib/python2.7/site-packages/pip-20.2.4.dist-info/top_level.txt new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip-20.2.4.dist-info/top_level.txt @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python2.7/site-packages/pip/__init__.py b/venv/lib/python2.7/site-packages/pip/__init__.py new file mode 100644 index 0000000..b2e0514 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/__init__.py @@ -0,0 +1,18 @@ +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Optional + + +__version__ = "20.2.4" + + +def main(args=None): + # type: (Optional[List[str]]) -> int + """This is an internal API only meant for use by pip's own console scripts. + + For additional details, see https://github.com/pypa/pip/issues/7498. + """ + from pip._internal.utils.entrypoints import _wrapper + + return _wrapper(args) diff --git a/venv/lib/python2.7/site-packages/pip/__init__.pyc b/venv/lib/python2.7/site-packages/pip/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d604a82eace0019c3d0f1d9d04c24640daa5d33 GIT binary patch literal 738 zcmb7>&2H2%5XZ;KvY-+n&p(sVc;;tM{PWW6$Jg(wgzbvx`-lwpNh;a`YJf(-N`No| zx@?R_P)E?ju!^CXz-j`*Q7-+TgNpV9zR-#D?7vQ?RLTCLl?d{}Ws;YN2Zw6$Y=7}w z6>sx=nLkaqahQ<2uo%Jxa$fmhTc>N}0`ptxJl!j~0%x)<$nYu&F;)aLVtyjb69Fdx zp9S@fIp-V6n~g1-xxJ)u-xRrVB6Rwig$<4uXi$V~_y?`PTChE0EzmTi;y!Rw4_W)`tGnBCdC zcQ+ji{q-(>)rYC{m0t`MoesqTG*ge>W6U#jka#ahj}0{-HGyq@dCg0zlg%%ty>qI z9C%vWf1Xw`4)!8>N_{XL(nysWo8+xC1!s?(XY${~jP{^utG+f5xg~O7Cz^^Y@ihJo D`aH4~ literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/__main__.py b/venv/lib/python2.7/site-packages/pip/__main__.py new file mode 100644 index 0000000..7c2505f --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/__main__.py @@ -0,0 +1,26 @@ +from __future__ import absolute_import + +import os +import sys + +# Remove '' and current working directory from the first entry +# of sys.path, if present to avoid using current directory +# in pip commands check, freeze, install, list and show, +# when invoked as python -m pip +if sys.path[0] in ('', os.getcwd()): + sys.path.pop(0) + +# 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.cli.main import main as _main # isort:skip # noqa + +if __name__ == '__main__': + sys.exit(_main()) diff --git a/venv/lib/python2.7/site-packages/pip/__main__.pyc b/venv/lib/python2.7/site-packages/pip/__main__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05a6750afbbf89226af035ca4e6488aa725738f8 GIT binary patch literal 592 zcmYjNJ8l~>5PjsXK9;4(Kmq}2oK}Eg8F1k$2-LbsVRzdQ8!hE<#rAHs1z~@AHcsAIudSnzG4%gvM{l8dtSV zN8jnaoU&WxuBIV7#)xao{EPz{#mst3+s+zu#}P=gX#&ajh37zmZgcucGW5aH>amEm zwrS~_M3cO W_{8Q+kJY&UMSV=iy>m6w62Ad=YIkG+ literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/__init__.py new file mode 100644 index 0000000..264c2ca --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/__init__.py @@ -0,0 +1,17 @@ +import pip._internal.utils.inject_securetransport # noqa +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, List + + +def main(args=None): + # type: (Optional[List[str]]) -> int + """This is preserved for old console scripts that may still be referencing + it. + + For additional details, see https://github.com/pypa/pip/issues/7498. + """ + from pip._internal.utils.entrypoints import _wrapper + + return _wrapper(args) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00a360b13fcede43a4ad7162f7f46275d31fea1e GIT binary patch literal 799 zcmbtS&2AGh5FTffP$G~jZg9cJ2+>^$@mD|yDdMLp1Qg)VTvqO`+qm+2EzblLR8DZ= zC3p*-hR5ImU}m?1OK(`7&*QOY=9{szUzaC8zx^mHI2!|ApRnLQL(Nlx2Ux03AAlb~ zlfg0rWiv<*J8K4h2+atVBWT939D@p-Up<7c3YJ?E>>=S^$lL&kEG3f>VGm zk};Dz-x=Pm9BQ61S+wbct@Tlxbn9zfwE(G=0e!Xd6L7WZ!N z-p~7p(v-d@Qg`_=nHX*AJ8_*Y?3I@;kWJi#F&%F-wZ{`s-v>Z!yu|U6U>9=Q)%6el Zqe7|dQPb9IZy!rC6vHL8Js7L2*&j_a$}0c> literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/build_env.py b/venv/lib/python2.7/site-packages/pip/_internal/build_env.py new file mode 100644 index 0000000..28d1ad6 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/build_env.py @@ -0,0 +1,241 @@ +"""Build Environment used for isolation during sdist building +""" + +import logging +import os +import sys +import textwrap +from collections import OrderedDict +from distutils.sysconfig import get_python_lib +from sysconfig import get_paths + +from pip._vendor.pkg_resources import Requirement, VersionConflict, WorkingSet + +from pip import __file__ as pip_location +from pip._internal.cli.spinners import open_spinner +from pip._internal.utils.subprocess import call_subprocess +from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from types import TracebackType + from typing import Tuple, Set, Iterable, Optional, List, Type + from pip._internal.index.package_finder import PackageFinder + +logger = logging.getLogger(__name__) + + +class _Prefix: + + def __init__(self, path): + # type: (str) -> None + self.path = path + self.setup = False + self.bin_dir = get_paths( + 'nt' if os.name == 'nt' else 'posix_prefix', + vars={'base': path, 'platbase': path} + )['scripts'] + # Note: prefer distutils' sysconfig to get the + # library paths so PyPy is correctly supported. + purelib = get_python_lib(plat_specific=False, prefix=path) + platlib = get_python_lib(plat_specific=True, prefix=path) + if purelib == platlib: + self.lib_dirs = [purelib] + else: + self.lib_dirs = [purelib, platlib] + + +class BuildEnvironment(object): + """Creates and manages an isolated environment to install build deps + """ + + def __init__(self): + # type: () -> None + temp_dir = TempDirectory( + kind=tempdir_kinds.BUILD_ENV, globally_managed=True + ) + + self._prefixes = OrderedDict(( + (name, _Prefix(os.path.join(temp_dir.path, name))) + for name in ('normal', 'overlay') + )) + + self._bin_dirs = [] # type: List[str] + self._lib_dirs = [] # type: List[str] + for prefix in reversed(list(self._prefixes.values())): + self._bin_dirs.append(prefix.bin_dir) + self._lib_dirs.extend(prefix.lib_dirs) + + # Customize site to: + # - ensure .pth files are honored + # - prevent access to system site packages + system_sites = { + os.path.normcase(site) for site in ( + get_python_lib(plat_specific=False), + get_python_lib(plat_specific=True), + ) + } + self._site_dir = os.path.join(temp_dir.path, 'site') + if not os.path.exists(self._site_dir): + os.mkdir(self._site_dir) + with open(os.path.join(self._site_dir, 'sitecustomize.py'), 'w') as fp: + fp.write(textwrap.dedent( + ''' + import os, site, sys + + # First, drop system-sites related paths. + original_sys_path = sys.path[:] + known_paths = set() + for path in {system_sites!r}: + site.addsitedir(path, known_paths=known_paths) + system_paths = set( + os.path.normcase(path) + for path in sys.path[len(original_sys_path):] + ) + original_sys_path = [ + path for path in original_sys_path + if os.path.normcase(path) not in system_paths + ] + sys.path = original_sys_path + + # Second, add lib directories. + # ensuring .pth file are processed. + for path in {lib_dirs!r}: + assert not path in sys.path + site.addsitedir(path) + ''' + ).format(system_sites=system_sites, lib_dirs=self._lib_dirs)) + + def __enter__(self): + # type: () -> None + self._save_env = { + name: os.environ.get(name, None) + for name in ('PATH', 'PYTHONNOUSERSITE', 'PYTHONPATH') + } + + path = self._bin_dirs[:] + old_path = self._save_env['PATH'] + if old_path: + path.extend(old_path.split(os.pathsep)) + + pythonpath = [self._site_dir] + + os.environ.update({ + 'PATH': os.pathsep.join(path), + 'PYTHONNOUSERSITE': '1', + 'PYTHONPATH': os.pathsep.join(pythonpath), + }) + + def __exit__( + self, + exc_type, # type: Optional[Type[BaseException]] + exc_val, # type: Optional[BaseException] + exc_tb # type: Optional[TracebackType] + ): + # type: (...) -> None + for varname, old_value in self._save_env.items(): + if old_value is None: + os.environ.pop(varname, None) + else: + os.environ[varname] = old_value + + def check_requirements(self, reqs): + # type: (Iterable[str]) -> Tuple[Set[Tuple[str, str]], Set[str]] + """Return 2 sets: + - conflicting requirements: set of (installed, wanted) reqs tuples + - missing requirements: set of reqs + """ + missing = set() + conflicting = set() + if reqs: + ws = WorkingSet(self._lib_dirs) + for req in reqs: + try: + if ws.find(Requirement.parse(req)) is None: + missing.add(req) + except VersionConflict as e: + conflicting.add((str(e.args[0].as_requirement()), + str(e.args[1]))) + return conflicting, missing + + def install_requirements( + self, + finder, # type: PackageFinder + requirements, # type: Iterable[str] + prefix_as_string, # type: str + message # type: str + ): + # type: (...) -> None + prefix = self._prefixes[prefix_as_string] + assert not prefix.setup + prefix.setup = True + if not requirements: + return + args = [ + sys.executable, os.path.dirname(pip_location), 'install', + '--ignore-installed', '--no-user', '--prefix', prefix.path, + '--no-warn-script-location', + ] # type: List[str] + if logger.getEffectiveLevel() <= logging.DEBUG: + args.append('-v') + for format_control in ('no_binary', 'only_binary'): + formats = getattr(finder.format_control, format_control) + args.extend(('--' + format_control.replace('_', '-'), + ','.join(sorted(formats or {':none:'})))) + + index_urls = finder.index_urls + if index_urls: + args.extend(['-i', index_urls[0]]) + for extra_index in index_urls[1:]: + args.extend(['--extra-index-url', extra_index]) + else: + args.append('--no-index') + for link in finder.find_links: + args.extend(['--find-links', link]) + + for host in finder.trusted_hosts: + args.extend(['--trusted-host', host]) + if finder.allow_all_prereleases: + args.append('--pre') + if finder.prefer_binary: + args.append('--prefer-binary') + args.append('--') + args.extend(requirements) + with open_spinner(message) as spinner: + call_subprocess(args, spinner=spinner) + + +class NoOpBuildEnvironment(BuildEnvironment): + """A no-op drop-in replacement for BuildEnvironment + """ + + def __init__(self): + # type: () -> None + pass + + def __enter__(self): + # type: () -> None + pass + + def __exit__( + self, + exc_type, # type: Optional[Type[BaseException]] + exc_val, # type: Optional[BaseException] + exc_tb # type: Optional[TracebackType] + ): + # type: (...) -> None + pass + + def cleanup(self): + # type: () -> None + pass + + def install_requirements( + self, + finder, # type: PackageFinder + requirements, # type: Iterable[str] + prefix_as_string, # type: str + message # type: str + ): + # type: (...) -> None + raise NotImplementedError() diff --git a/venv/lib/python2.7/site-packages/pip/_internal/build_env.pyc b/venv/lib/python2.7/site-packages/pip/_internal/build_env.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5120b912a01aaaf6f5ac6bd1cdd1497522ecd66 GIT binary patch literal 9059 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cache.py b/venv/lib/python2.7/site-packages/pip/_internal/cache.py new file mode 100644 index 0000000..07db948 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/cache.py @@ -0,0 +1,346 @@ +"""Cache Management +""" + +import hashlib +import json +import logging +import os + +from pip._vendor.packaging.tags import interpreter_name, interpreter_version +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.exceptions import InvalidWheelFilename +from pip._internal.models.link import Link +from pip._internal.models.wheel import Wheel +from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.urls import path_to_url + +if MYPY_CHECK_RUNNING: + from typing import Optional, Set, List, Any, Dict + + from pip._vendor.packaging.tags import Tag + + from pip._internal.models.format_control import FormatControl + +logger = logging.getLogger(__name__) + + +def _hash_dict(d): + # type: (Dict[str, str]) -> str + """Return a stable sha224 of a dictionary.""" + s = json.dumps(d, sort_keys=True, separators=(",", ":"), ensure_ascii=True) + return hashlib.sha224(s.encode("ascii")).hexdigest() + + +class Cache(object): + """An abstract class - provides cache directories for data from links + + + :param cache_dir: The root of the cache. + :param format_control: An object of FormatControl class to limit + binaries being read from the cache. + :param allowed_formats: which formats of files the cache should store. + ('binary' and 'source' are the only allowed values) + """ + + def __init__(self, cache_dir, format_control, allowed_formats): + # type: (str, FormatControl, Set[str]) -> None + super(Cache, self).__init__() + assert not cache_dir or os.path.isabs(cache_dir) + self.cache_dir = cache_dir or None + self.format_control = format_control + self.allowed_formats = allowed_formats + + _valid_formats = {"source", "binary"} + assert self.allowed_formats.union(_valid_formats) == _valid_formats + + def _get_cache_path_parts_legacy(self, link): + # type: (Link) -> List[str] + """Get parts of part that must be os.path.joined with cache_dir + + Legacy cache key (pip < 20) for compatibility with older caches. + """ + + # We want to generate an url to use as our cache key, we don't want to + # just re-use the URL because it might have other items in the fragment + # and we don't care about those. + key_parts = [link.url_without_fragment] + if link.hash_name is not None and link.hash is not None: + key_parts.append("=".join([link.hash_name, link.hash])) + key_url = "#".join(key_parts) + + # Encode our key url with sha224, we'll use this because it has similar + # security properties to sha256, but with a shorter total output (and + # thus less secure). However the differences don't make a lot of + # difference for our use case here. + hashed = hashlib.sha224(key_url.encode()).hexdigest() + + # We want to nest the directories some to prevent having a ton of top + # level directories where we might run out of sub directories on some + # FS. + parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]] + + return parts + + def _get_cache_path_parts(self, link): + # type: (Link) -> List[str] + """Get parts of part that must be os.path.joined with cache_dir + """ + + # We want to generate an url to use as our cache key, we don't want to + # just re-use the URL because it might have other items in the fragment + # and we don't care about those. + key_parts = {"url": link.url_without_fragment} + if link.hash_name is not None and link.hash is not None: + key_parts[link.hash_name] = link.hash + if link.subdirectory_fragment: + key_parts["subdirectory"] = link.subdirectory_fragment + + # Include interpreter name, major and minor version in cache key + # to cope with ill-behaved sdists that build a different wheel + # depending on the python version their setup.py is being run on, + # and don't encode the difference in compatibility tags. + # https://github.com/pypa/pip/issues/7296 + key_parts["interpreter_name"] = interpreter_name() + key_parts["interpreter_version"] = interpreter_version() + + # Encode our key url with sha224, we'll use this because it has similar + # security properties to sha256, but with a shorter total output (and + # thus less secure). However the differences don't make a lot of + # difference for our use case here. + hashed = _hash_dict(key_parts) + + # We want to nest the directories some to prevent having a ton of top + # level directories where we might run out of sub directories on some + # FS. + parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]] + + return parts + + def _get_candidates(self, link, canonical_package_name): + # type: (Link, str) -> List[Any] + can_not_cache = ( + not self.cache_dir or + not canonical_package_name or + not link + ) + if can_not_cache: + return [] + + formats = self.format_control.get_allowed_formats( + canonical_package_name + ) + if not self.allowed_formats.intersection(formats): + return [] + + candidates = [] + path = self.get_path_for_link(link) + if os.path.isdir(path): + for candidate in os.listdir(path): + candidates.append((candidate, path)) + # TODO remove legacy path lookup in pip>=21 + legacy_path = self.get_path_for_link_legacy(link) + if os.path.isdir(legacy_path): + for candidate in os.listdir(legacy_path): + candidates.append((candidate, legacy_path)) + return candidates + + def get_path_for_link_legacy(self, link): + # type: (Link) -> str + raise NotImplementedError() + + def get_path_for_link(self, link): + # type: (Link) -> str + """Return a directory to store cached items in for link. + """ + raise NotImplementedError() + + def get( + self, + link, # type: Link + package_name, # type: Optional[str] + supported_tags, # type: List[Tag] + ): + # type: (...) -> Link + """Returns a link to a cached item if it exists, otherwise returns the + passed link. + """ + raise NotImplementedError() + + +class SimpleWheelCache(Cache): + """A cache of wheels for future installs. + """ + + def __init__(self, cache_dir, format_control): + # type: (str, FormatControl) -> None + super(SimpleWheelCache, self).__init__( + cache_dir, format_control, {"binary"} + ) + + def get_path_for_link_legacy(self, link): + # type: (Link) -> str + parts = self._get_cache_path_parts_legacy(link) + assert self.cache_dir + return os.path.join(self.cache_dir, "wheels", *parts) + + def get_path_for_link(self, link): + # type: (Link) -> str + """Return a directory to store cached wheels for link + + Because there are M wheels for any one sdist, we provide a directory + to cache them in, and then consult that directory when looking up + cache hits. + + We only insert things into the cache if they have plausible version + numbers, so that we don't contaminate the cache with things that were + not unique. E.g. ./package might have dozens of installs done for it + and build a version of 0.0...and if we built and cached a wheel, we'd + end up using the same wheel even if the source has been edited. + + :param link: The link of the sdist for which this will cache wheels. + """ + parts = self._get_cache_path_parts(link) + assert self.cache_dir + # Store wheels within the root cache_dir + return os.path.join(self.cache_dir, "wheels", *parts) + + def get( + self, + link, # type: Link + package_name, # type: Optional[str] + supported_tags, # type: List[Tag] + ): + # type: (...) -> Link + candidates = [] + + if not package_name: + return link + + canonical_package_name = canonicalize_name(package_name) + for wheel_name, wheel_dir in self._get_candidates( + link, canonical_package_name + ): + try: + wheel = Wheel(wheel_name) + except InvalidWheelFilename: + continue + if canonicalize_name(wheel.name) != canonical_package_name: + logger.debug( + "Ignoring cached wheel %s for %s as it " + "does not match the expected distribution name %s.", + wheel_name, link, package_name, + ) + continue + if not wheel.supported(supported_tags): + # Built for a different python/arch/etc + continue + candidates.append( + ( + wheel.support_index_min(supported_tags), + wheel_name, + wheel_dir, + ) + ) + + if not candidates: + return link + + _, wheel_name, wheel_dir = min(candidates) + return Link(path_to_url(os.path.join(wheel_dir, wheel_name))) + + +class EphemWheelCache(SimpleWheelCache): + """A SimpleWheelCache that creates it's own temporary cache directory + """ + + def __init__(self, format_control): + # type: (FormatControl) -> None + self._temp_dir = TempDirectory( + kind=tempdir_kinds.EPHEM_WHEEL_CACHE, + globally_managed=True, + ) + + super(EphemWheelCache, self).__init__( + self._temp_dir.path, format_control + ) + + +class CacheEntry(object): + def __init__( + self, + link, # type: Link + persistent, # type: bool + ): + self.link = link + self.persistent = persistent + + +class WheelCache(Cache): + """Wraps EphemWheelCache and SimpleWheelCache into a single Cache + + This Cache allows for gracefully degradation, using the ephem wheel cache + when a certain link is not found in the simple wheel cache first. + """ + + def __init__(self, cache_dir, format_control): + # type: (str, FormatControl) -> None + super(WheelCache, self).__init__( + cache_dir, format_control, {'binary'} + ) + self._wheel_cache = SimpleWheelCache(cache_dir, format_control) + self._ephem_cache = EphemWheelCache(format_control) + + def get_path_for_link_legacy(self, link): + # type: (Link) -> str + return self._wheel_cache.get_path_for_link_legacy(link) + + def get_path_for_link(self, link): + # type: (Link) -> str + return self._wheel_cache.get_path_for_link(link) + + def get_ephem_path_for_link(self, link): + # type: (Link) -> str + return self._ephem_cache.get_path_for_link(link) + + def get( + self, + link, # type: Link + package_name, # type: Optional[str] + supported_tags, # type: List[Tag] + ): + # type: (...) -> Link + cache_entry = self.get_cache_entry(link, package_name, supported_tags) + if cache_entry is None: + return link + return cache_entry.link + + def get_cache_entry( + self, + link, # type: Link + package_name, # type: Optional[str] + supported_tags, # type: List[Tag] + ): + # type: (...) -> Optional[CacheEntry] + """Returns a CacheEntry with a link to a cached item if it exists or + None. The cache entry indicates if the item was found in the persistent + or ephemeral cache. + """ + retval = self._wheel_cache.get( + link=link, + package_name=package_name, + supported_tags=supported_tags, + ) + if retval is not link: + return CacheEntry(retval, persistent=True) + + retval = self._ephem_cache.get( + link=link, + package_name=package_name, + supported_tags=supported_tags, + ) + if retval is not link: + return CacheEntry(retval, persistent=False) + + return None diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cache.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cache.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39f9975abd47e7ac7d6cfb5d49626f0f43792fe4 GIT binary patch literal 10785 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 None + """Entry Point for completion of main and subcommand options. + """ + # Don't complete if user hasn't sourced bash_completion file. + if 'PIP_AUTO_COMPLETE' not in os.environ: + return + cwords = os.environ['COMP_WORDS'].split()[1:] + cword = int(os.environ['COMP_CWORD']) + try: + current = cwords[cword - 1] + except IndexError: + current = '' + + parser = create_main_parser() + subcommands = list(commands_dict) + options = [] + + # subcommand + subcommand_name = None # type: Optional[str] + for word in cwords: + if word in subcommands: + subcommand_name = word + break + # subcommand options + if subcommand_name is not None: + # special case: 'help' subcommand has no options + if subcommand_name == 'help': + sys.exit(1) + # special case: list locally installed dists for show and uninstall + should_list_installed = ( + subcommand_name in ['show', 'uninstall'] and + not current.startswith('-') + ) + if should_list_installed: + installed = [] + lc = current.lower() + for dist in get_installed_distributions(local_only=True): + if dist.key.startswith(lc) and dist.key not in cwords[1:]: + installed.append(dist.key) + # if there are no dists installed, fall back to option completion + if installed: + for dist in installed: + print(dist) + sys.exit(1) + + subcommand = create_command(subcommand_name) + + for opt in subcommand.parser.option_list_all: + if opt.help != optparse.SUPPRESS_HELP: + for opt_str in opt._long_opts + opt._short_opts: + options.append((opt_str, opt.nargs)) + + # filter out previously specified options from available options + prev_opts = [x.split('=')[0] for x in cwords[1:cword - 1]] + options = [(x, v) for (x, v) in options if x not in prev_opts] + # filter options by current input + options = [(k, v) for k, v in options if k.startswith(current)] + # get completion type given cwords and available subcommand options + completion_type = get_path_completion_type( + cwords, cword, subcommand.parser.option_list_all, + ) + # get completion files and directories if ``completion_type`` is + # ````, ```` or ```` + if completion_type: + paths = auto_complete_paths(current, completion_type) + options = [(path, 0) for path in paths] + for option in options: + opt_label = option[0] + # append '=' to options which require args + if option[1] and option[0][:2] == "--": + opt_label += '=' + print(opt_label) + else: + # show main parser options only when necessary + + opts = [i.option_list for i in parser.option_groups] + opts.append(parser.option_list) + flattened_opts = chain.from_iterable(opts) + if current.startswith('-'): + for opt in flattened_opts: + if opt.help != optparse.SUPPRESS_HELP: + subcommands += opt._long_opts + opt._short_opts + else: + # get completion type given cwords and all available options + completion_type = get_path_completion_type(cwords, cword, + flattened_opts) + if completion_type: + subcommands = list(auto_complete_paths(current, + completion_type)) + + print(' '.join([x for x in subcommands if x.startswith(current)])) + sys.exit(1) + + +def get_path_completion_type(cwords, cword, opts): + # type: (List[str], int, Iterable[Any]) -> Optional[str] + """Get the type of path completion (``file``, ``dir``, ``path`` or None) + + :param cwords: same as the environmental variable ``COMP_WORDS`` + :param cword: same as the environmental variable ``COMP_CWORD`` + :param opts: The available options to check + :return: path completion type (``file``, ``dir``, ``path`` or None) + """ + if cword < 2 or not cwords[cword - 2].startswith('-'): + return None + for opt in opts: + if opt.help == optparse.SUPPRESS_HELP: + continue + for o in str(opt).split('/'): + if cwords[cword - 2].split('=')[0] == o: + if not opt.metavar or any( + x in ('path', 'file', 'dir') + for x in opt.metavar.split('/')): + return opt.metavar + return None + + +def auto_complete_paths(current, completion_type): + # type: (str, str) -> Iterable[str] + """If ``completion_type`` is ``file`` or ``path``, list all regular files + and directories starting with ``current``; otherwise only list directories + starting with ``current``. + + :param current: The word to be completed + :param completion_type: path completion type(`file`, `path` or `dir`)i + :return: A generator of regular files and/or directories + """ + directory, filename = os.path.split(current) + current_path = os.path.abspath(directory) + # Don't complete paths if they can't be accessed + if not os.access(current_path, os.R_OK): + return + filename = os.path.normcase(filename) + # list all files that start with ``filename`` + file_list = (x for x in os.listdir(current_path) + if os.path.normcase(x).startswith(filename)) + for f in file_list: + opt = os.path.join(current_path, f) + comp_file = os.path.normcase(os.path.join(directory, f)) + # complete regular files when there is not ```` after option + # complete directories when there is ````, ```` or + # ````after option + if completion_type != 'dir' and os.path.isfile(opt): + yield comp_file + elif os.path.isdir(opt): + yield os.path.join(comp_file, '') diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a30cf4e8da8add8fb7ea46c47b0a30050fe9f7a GIT binary patch literal 5397 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/base_command.py b/venv/lib/python2.7/site-packages/pip/_internal/cli/base_command.py new file mode 100644 index 0000000..197400a --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/cli/base_command.py @@ -0,0 +1,265 @@ +"""Base Command class, and related routines""" + +from __future__ import absolute_import, print_function + +import logging +import logging.config +import optparse +import os +import platform +import sys +import traceback + +from pip._internal.cli import cmdoptions +from pip._internal.cli.command_context import CommandContextMixIn +from pip._internal.cli.parser import ( + ConfigOptionParser, + UpdatingDefaultsHelpFormatter, +) +from pip._internal.cli.status_codes import ( + ERROR, + PREVIOUS_BUILD_DIR_ERROR, + UNKNOWN_ERROR, + VIRTUALENV_NOT_FOUND, +) +from pip._internal.exceptions import ( + BadCommand, + CommandError, + InstallationError, + NetworkConnectionError, + PreviousBuildDirError, + SubProcessError, + UninstallationError, +) +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging +from pip._internal.utils.misc import get_prog, normalize_path +from pip._internal.utils.temp_dir import ( + global_tempdir_manager, + tempdir_registry, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.virtualenv import running_under_virtualenv + +if MYPY_CHECK_RUNNING: + from typing import List, Optional, Tuple, Any + from optparse import Values + + from pip._internal.utils.temp_dir import ( + TempDirectoryTypeRegistry as TempDirRegistry + ) + +__all__ = ['Command'] + +logger = logging.getLogger(__name__) + + +class Command(CommandContextMixIn): + usage = None # type: str + ignore_require_venv = False # type: bool + + def __init__(self, name, summary, isolated=False): + # type: (str, str, bool) -> None + super(Command, self).__init__() + parser_kw = { + 'usage': self.usage, + 'prog': '{} {}'.format(get_prog(), name), + 'formatter': UpdatingDefaultsHelpFormatter(), + 'add_help_option': False, + 'name': name, + 'description': self.__doc__, + 'isolated': isolated, + } + + self.name = name + self.summary = summary + self.parser = ConfigOptionParser(**parser_kw) + + self.tempdir_registry = None # type: Optional[TempDirRegistry] + + # Commands should add options to this option group + optgroup_name = '{} Options'.format(self.name.capitalize()) + self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name) + + # Add the general options + gen_opts = cmdoptions.make_option_group( + cmdoptions.general_group, + self.parser, + ) + self.parser.add_option_group(gen_opts) + + self.add_options() + + def add_options(self): + # type: () -> None + pass + + def handle_pip_version_check(self, options): + # type: (Values) -> None + """ + This is a no-op so that commands by default do not do the pip version + check. + """ + # Make sure we do the pip version check if the index_group options + # are present. + assert not hasattr(options, 'no_index') + + def run(self, options, args): + # type: (Values, List[Any]) -> int + raise NotImplementedError + + def parse_args(self, args): + # type: (List[str]) -> Tuple[Any, Any] + # factored out for testability + return self.parser.parse_args(args) + + def main(self, args): + # type: (List[str]) -> int + try: + with self.main_context(): + return self._main(args) + finally: + logging.shutdown() + + def _main(self, args): + # type: (List[str]) -> int + # We must initialize this before the tempdir manager, otherwise the + # configuration would not be accessible by the time we clean up the + # tempdir manager. + self.tempdir_registry = self.enter_context(tempdir_registry()) + # Intentionally set as early as possible so globally-managed temporary + # directories are available to the rest of the code. + self.enter_context(global_tempdir_manager()) + + options, args = self.parse_args(args) + + # Set verbosity so that it can be used elsewhere. + self.verbosity = options.verbose - options.quiet + + level_number = setup_logging( + verbosity=self.verbosity, + no_color=options.no_color, + user_log_file=options.log, + ) + + if ( + sys.version_info[:2] == (2, 7) and + not options.no_python_version_warning + ): + message = ( + "pip 21.0 will drop support for Python 2.7 in January 2021. " + "More details about Python 2 support in pip can be found at " + "https://pip.pypa.io/en/latest/development/release-process/#python-2-support" # noqa + ) + if platform.python_implementation() == "CPython": + message = ( + "Python 2.7 reached the end of its life on January " + "1st, 2020. Please upgrade your Python as Python 2.7 " + "is no longer maintained. " + ) + message + deprecated(message, replacement=None, gone_in="21.0") + + if ( + sys.version_info[:2] == (3, 5) and + not options.no_python_version_warning + ): + message = ( + "Python 3.5 reached the end of its life on September " + "13th, 2020. Please upgrade your Python as Python 3.5 " + "is no longer maintained. pip 21.0 will drop support " + "for Python 3.5 in January 2021." + ) + deprecated(message, replacement=None, gone_in="21.0") + + # TODO: Try to get these passing down from the command? + # without resorting to os.environ to hold these. + # This also affects isolated builds and it should. + + if options.no_input: + os.environ['PIP_NO_INPUT'] = '1' + + if options.exists_action: + os.environ['PIP_EXISTS_ACTION'] = ' '.join(options.exists_action) + + if options.require_venv and not self.ignore_require_venv: + # If a venv is required check if it can really be found + if not running_under_virtualenv(): + logger.critical( + 'Could not find an activated virtualenv (required).' + ) + sys.exit(VIRTUALENV_NOT_FOUND) + + if options.cache_dir: + options.cache_dir = normalize_path(options.cache_dir) + if not check_path_owner(options.cache_dir): + logger.warning( + "The directory '%s' or its parent directory is not owned " + "or is not writable by the current user. The cache " + "has been disabled. Check the permissions and owner of " + "that directory. If executing pip with sudo, you may want " + "sudo's -H flag.", + options.cache_dir, + ) + options.cache_dir = None + + if getattr(options, "build_dir", None): + deprecated( + reason=( + "The -b/--build/--build-dir/--build-directory " + "option is deprecated." + ), + replacement=( + "use the TMPDIR/TEMP/TMP environment variable, " + "possibly combined with --no-clean" + ), + gone_in="20.3", + issue=8333, + ) + + if 'resolver' in options.unstable_features: + logger.critical( + "--unstable-feature=resolver is no longer supported, and " + "has been replaced with --use-feature=2020-resolver instead." + ) + sys.exit(ERROR) + + try: + status = self.run(options, args) + assert isinstance(status, int) + return status + except PreviousBuildDirError as exc: + logger.critical(str(exc)) + logger.debug('Exception information:', exc_info=True) + + return PREVIOUS_BUILD_DIR_ERROR + except (InstallationError, UninstallationError, BadCommand, + SubProcessError, NetworkConnectionError) as exc: + logger.critical(str(exc)) + logger.debug('Exception information:', exc_info=True) + + return ERROR + except CommandError as exc: + logger.critical('%s', exc) + logger.debug('Exception information:', exc_info=True) + + return ERROR + except BrokenStdoutLoggingError: + # Bypass our logger and write any remaining messages to stderr + # because stdout no longer works. + print('ERROR: Pipe to stdout was broken', file=sys.stderr) + if level_number <= logging.DEBUG: + traceback.print_exc(file=sys.stderr) + + return ERROR + except KeyboardInterrupt: + logger.critical('Operation cancelled by user') + logger.debug('Exception information:', exc_info=True) + + return ERROR + except BaseException: + logger.critical('Exception:', exc_info=True) + + return UNKNOWN_ERROR + finally: + self.handle_pip_version_check(options) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/base_command.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/base_command.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b364619870e82c9b58dcf172880f158fa731cdc1 GIT binary patch literal 7902 zcmb_h&2Jn>c7NS79C9d1q)3VSmRquA(Y9tNQ8w+>+8axhY;!FQnIEf`- z{up=Fh@w_P0DCVBWRXh_Ipn`sERaJkIR*$ee?YD|n)-b8 zzTc}iwf{ao`R~8^eb}SwUk%@%e(I3^ABQL=3eY+fyOcVVxfHmR)hMWu!?QI?>lD;w z2l``2`V9&i2lL|;j34wTD400tHz{Zy^d~8plzyGkW0Xx%FlFx;qx3jsCnz{!#|=uS zDVw2ShO(0soV2s!l+IE%N5LFrrzki@*=Y(+Q#Mb*yxlQD=^4t-QgD{Ca}=DT>^ueM zDZ4~Tupq3m4>-lgn43f{A`Cn&u^S&M>}9Zyr*rfiXdMRHV& z%6}0)&ro`kvRf3~qHKwRCCYA7aGSFCDR|$WJ4tDSvJWWuz>a6-wq*)FBqxUm=cw;c z@DZsx?fi_?9r_-_pYyyrL0b^zDf%_h_e9?WAG2IH7EVJE^a7fDkyhSHk!4XHd%ZN$ z`i95dQl*hm_%4Pf$(2r6gBDygW*SY@)kQiqDonCLQ5tgsbAvL;O}I78dnPIJ&H_}7 z%p{s#78e7a({^qSbJdkAMQ+qH^C)??np^0zvY2lr{WUqW9+g^^<`SkK58?>O^zW;! zXqX!Pg-QpX6=fC~qsoOkc9=0V4}5>kH)qjX_a8i2U3BbmmI!o^{6hnP)n56Ojq_iu{-Hl;)y)1f4Ydgmb zdz>dfzTl98y4>w`+`PIm|(JKOE+RgH6y^Tr{y_N^c7~;1 zNqFQunSb}#c|Ji$!Fj^4;QVTAcEK38@Tk9r<%w&A!LeU-+49&a)}#ZESeFjm;h1!e zQQVNu6!{wqOi7RFVg&emg)jUsbPWC+dI2+bX~$(_c9L-(@6_0{F5{-1IvW61UO2o9 zS1y|dk8$TRNWzWFSi*hFd=5yBqle=YwEVKpr!XBh>4htuNixUiMV)>NfS8|R^0;$? z;wIn4FwmLi8{lwWju9lib5iD~=mjvbaAwKO(atGpPgkp0dfBM@JM;7cXgcID#4`-e z!Braz>^nLl&!L7QX*TX(z4U(d(lBR48=L5C9k>ANnc_IyhGPh=%aN^llqt{xMkw7Y z6Y(peGzq*ITaD(c0NN^%USQpmi}i4zO8*KESu|moV0O4-YOwr8L5lT)8X zDa?pP7>04t!~VBOt5og!DhTrFNR8YFNiurj$Ci7kA|XEc>y8B>RHEncvj!-NF&;o5(VyR4$KG9PWA}j zM9-~GS@FCkp-V{LMskuO?j(b-A|VviyUZWq?L?1x#UGZW@RrR9yk%Y<3Y%BqnAq&h zYKC}`DQH|Qkx1^zM(6ok70TZe{q3yv>LcX8f&~8j zYiuT!VuK`~ibRR)KhmHAyD8(*&^E%Ni@d4$_D^dGR&cb*cPU**8T~=pou8w!=5? zoZ!0=@_EPaIOrp`pTQbl5Qv-@Agn_YF;bIbK-}f0#SzeN%fShUZ)VUFPJBW@|I}ID zc#_I1PCQL!mUiYSo}rHclow7>`I!@+q#a}gG6bipO|zp-^HhFUB?VLH!2y5*jm|mR zInU1<9C8@N3uG?J;M?yQYle7<%0D>fa@A)!xD;L@^Ty$f#s)z0_fJd95>Yrd~h>AGN6JWuf%;n!K=*Ex!T&jp}Ymj~HJfp?X58&tO43f)Ub(S1_} z!1ejxIQxqtV3-XAEY6>EscW1+HTTv+-5_#HpJF+MT5GA6y4%RK*YT zPL)RqS3uai6kn$J4KnZHGRHADXrpdgWZGmF$=oD!i?+rD&VT$#aNcA%OLFjh?Fa&~ zCkTLtO!1Fzms7XpRIkS9yif5Jim!@}eIOVj7d6YY^C9gzRE9P45kF@ScaS3j5kPkY z(BBCls|}W;KY8=d<-k84Iq=p|-h50O;+5FaK4C#H6Rl&q4&&}fs)LBrEp%e`55i-w zNb&mPyl045$giewD@j$tE*RN4l=Yv{aJ*f*)xPQNC28u#B?s%_fZxp?(noK7-)tAT zx77a7OLFg*Q9eY1=q=sE5${n^DnxM;B`G3(7Z0}4_7Mym;v0HV?sXL);<4l*57;(l zpzkblGKGw35VezHQRR!A?`pFctEVb01|0Ji@zz(!uUg2c`OUfb=0GrNEww5%#p|wE zJoR6Lq9Z7mDnbB`C9zPrx!Cd&qrEiQQXZ%}Am^4gH<+fIZEsy}^M-?d8O6%mFNPx? zM0!LXb3-F*@zNs4BhnM^4=1eRwkJ7osRn7(lc+8D^^rXzU(p;vnA=GWorH68{ZEG| z-)?_^+Q$Eh@`f7Vwc5p1Gu7ilRbNbDFEQINkGQzO+6C3w_x2*-%~RL4*ZRWSN~3;TY`V+Umk`k8H3rqt zxbI%Yg;sa5)sh_t-!1Gs+OL>o(_JS2uoTnQYXAe1g__Mr>!?31Za#RlzKFhuDn?Qk zIUAt&G%6D&|AsdxKyWwR=PbU<$_}3aT3RjS_&wN7rQSE&w?-~Jh_ z`JC#CU$IVK3BO?`%J^UMIu{K6hrEe_!t=|w-q&KL2X7Om79oiUZz=0lN6(hMsN~v~ zFb1B?Fs}^P5vqNttlBq;(ChP~-oJ@P4#?ANFf>Rg@#fZoXr)n>s%NN+>5$DGDKxvp zodVf27cMJf2OjxTdH*DR)bmt$bl#WOC};JYYvYy2+J(xANqVTTF*x-sF+QigVnkxi zY(ze5fX`(;LFs@-4uz;7%F~evInd0o(oF61UH*MO$B(r{OH}|87Onzw|Ic{C3Esf` zMhQ^_607d8F9>axL*?^5J`?Hl!^vk*J{MGd4$(fBHhg~Z$x$g+i_t^pR9X689IV`b zaPRTwLYFBKVY*RoS4OtL4J8(r`=#3N7Eu|mvI3PT#0cZLo<34SpV{W$MI&XD!{>?r zDc{A2rW}XEe8}-eSe79Iqu5m;2D{ZlFm7GI_SaTG`5drb;-mkbp^lxd&A6v)b8Z7= zlcqCOpF;_yQJ-~dwMpk(O-5tq8ck=$Z8{g-IkXLDT)tonX(y@7(u zWQ}LX0kuXoXVy9GOkm%fGw0S(o;g+Zrkxp?IgT5qoq4Ps$A8|#ZPV>6u-ruXLMbSP zp{Pd~W<@+i86Xsk@ULQ*e}fymu}F$TJ{Mes^`cc`&i*fXjwwH6rSx7yLFx*i-oZz+ z?sLJZ;ZAwYdUFz=vF5}Am%RKInu>s}A$w#HfGP4hzFYlc4X@s}Z8#nvj^6){&+T% None + """ + Raise an option parsing error using parser.error(). + + Args: + parser: an OptionParser instance. + option: an Option instance. + msg: the error text. + """ + msg = '{} error: {}'.format(option, msg) + msg = textwrap.fill(' '.join(msg.split())) + parser.error(msg) + + +def make_option_group(group, parser): + # type: (Dict[str, Any], ConfigOptionParser) -> OptionGroup + """ + Return an OptionGroup object + group -- assumed to be dict with 'name' and 'options' keys + parser -- an optparse Parser + """ + option_group = OptionGroup(parser, group['name']) + for option in group['options']: + option_group.add_option(option()) + return option_group + + +def check_install_build_global(options, check_options=None): + # type: (Values, Optional[Values]) -> None + """Disable wheels if per-setup.py call options are set. + + :param options: The OptionParser options to update. + :param check_options: The options to check, if not supplied defaults to + options. + """ + if check_options is None: + check_options = options + + def getname(n): + # type: (str) -> Optional[Any] + return getattr(check_options, n, None) + names = ["build_options", "global_options", "install_options"] + if any(map(getname, names)): + control = options.format_control + control.disallow_binaries() + warnings.warn( + 'Disabling all use of wheels due to the use of --build-option ' + '/ --global-option / --install-option.', stacklevel=2, + ) + + +def check_dist_restriction(options, check_target=False): + # type: (Values, bool) -> None + """Function for determining if custom platform options are allowed. + + :param options: The OptionParser options. + :param check_target: Whether or not to check if --target is being used. + """ + dist_restriction_set = any([ + options.python_version, + options.platform, + options.abi, + options.implementation, + ]) + + binary_only = FormatControl(set(), {':all:'}) + sdist_dependencies_allowed = ( + options.format_control != binary_only and + not options.ignore_dependencies + ) + + # Installations or downloads using dist restrictions must not combine + # source distributions and dist-specific wheels, as they are not + # guaranteed to be locally compatible. + if dist_restriction_set and sdist_dependencies_allowed: + raise CommandError( + "When restricting platform and interpreter constraints using " + "--python-version, --platform, --abi, or --implementation, " + "either --no-deps must be set, or --only-binary=:all: must be " + "set and --no-binary must not be set (or must be set to " + ":none:)." + ) + + if check_target: + if dist_restriction_set and not options.target_dir: + raise CommandError( + "Can not use any platform or abi specific options unless " + "installing via '--target'" + ) + + +def _path_option_check(option, opt, value): + # type: (Option, str, str) -> str + return os.path.expanduser(value) + + +class PipOption(Option): + TYPES = Option.TYPES + ("path",) + TYPE_CHECKER = Option.TYPE_CHECKER.copy() + TYPE_CHECKER["path"] = _path_option_check + + +########### +# options # +########### + +help_ = partial( + Option, + '-h', '--help', + dest='help', + action='help', + help='Show help.', +) # type: Callable[..., Option] + +isolated_mode = partial( + Option, + "--isolated", + dest="isolated_mode", + action="store_true", + default=False, + help=( + "Run pip in an isolated mode, ignoring environment variables and user " + "configuration." + ), +) # type: Callable[..., Option] + +require_virtualenv = partial( + Option, + # Run only if inside a virtualenv, bail if not. + '--require-virtualenv', '--require-venv', + dest='require_venv', + action='store_true', + default=False, + help=SUPPRESS_HELP +) # type: Callable[..., Option] + +verbose = partial( + Option, + '-v', '--verbose', + dest='verbose', + action='count', + default=0, + help='Give more output. Option is additive, and can be used up to 3 times.' +) # type: Callable[..., Option] + +no_color = partial( + Option, + '--no-color', + dest='no_color', + action='store_true', + default=False, + help="Suppress colored output", +) # type: Callable[..., Option] + +version = partial( + Option, + '-V', '--version', + dest='version', + action='store_true', + help='Show version and exit.', +) # type: Callable[..., Option] + +quiet = partial( + Option, + '-q', '--quiet', + dest='quiet', + action='count', + default=0, + help=( + 'Give less output. Option is additive, and can be used up to 3' + ' times (corresponding to WARNING, ERROR, and CRITICAL logging' + ' levels).' + ), +) # type: Callable[..., Option] + +progress_bar = partial( + Option, + '--progress-bar', + dest='progress_bar', + type='choice', + choices=list(BAR_TYPES.keys()), + default='on', + help=( + 'Specify type of progress to be displayed [' + + '|'.join(BAR_TYPES.keys()) + '] (default: %default)' + ), +) # type: Callable[..., Option] + +log = partial( + PipOption, + "--log", "--log-file", "--local-log", + dest="log", + metavar="path", + type="path", + help="Path to a verbose appending log." +) # type: Callable[..., Option] + +no_input = partial( + Option, + # Don't ask for input + '--no-input', + dest='no_input', + action='store_true', + default=False, + help="Disable prompting for input." +) # type: Callable[..., Option] + +proxy = partial( + Option, + '--proxy', + dest='proxy', + type='str', + default='', + help="Specify a proxy in the form [user:passwd@]proxy.server:port." +) # type: Callable[..., Option] + +retries = partial( + Option, + '--retries', + dest='retries', + type='int', + default=5, + help="Maximum number of retries each connection should attempt " + "(default %default times).", +) # type: Callable[..., Option] + +timeout = partial( + Option, + '--timeout', '--default-timeout', + metavar='sec', + dest='timeout', + type='float', + default=15, + help='Set the socket timeout (default %default seconds).', +) # type: Callable[..., Option] + + +def exists_action(): + # type: () -> Option + return Option( + # Option when path already exist + '--exists-action', + dest='exists_action', + type='choice', + choices=['s', 'i', 'w', 'b', 'a'], + default=[], + action='append', + metavar='action', + help="Default action when a path already exists: " + "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.", + ) + + +cert = partial( + PipOption, + '--cert', + dest='cert', + type='path', + metavar='path', + help="Path to alternate CA bundle.", +) # type: Callable[..., Option] + +client_cert = partial( + PipOption, + '--client-cert', + dest='client_cert', + type='path', + default=None, + metavar='path', + help="Path to SSL client certificate, a single file containing the " + "private key and the certificate in PEM format.", +) # type: Callable[..., Option] + +index_url = partial( + Option, + '-i', '--index-url', '--pypi-url', + dest='index_url', + metavar='URL', + default=PyPI.simple_url, + help="Base URL of the Python Package Index (default %default). " + "This should point to a repository compliant with PEP 503 " + "(the simple repository API) or a local directory laid out " + "in the same format.", +) # type: Callable[..., Option] + + +def extra_index_url(): + # type: () -> Option + return Option( + '--extra-index-url', + dest='extra_index_urls', + metavar='URL', + action='append', + default=[], + help="Extra URLs of package indexes to use in addition to " + "--index-url. Should follow the same rules as " + "--index-url.", + ) + + +no_index = partial( + Option, + '--no-index', + dest='no_index', + action='store_true', + default=False, + help='Ignore package index (only looking at --find-links URLs instead).', +) # type: Callable[..., Option] + + +def find_links(): + # type: () -> Option + return Option( + '-f', '--find-links', + dest='find_links', + action='append', + default=[], + metavar='url', + help="If a URL or path to an html file, then parse for links to " + "archives such as sdist (.tar.gz) or wheel (.whl) files. " + "If a local path or file:// URL that's a directory, " + "then look for archives in the directory listing. " + "Links to VCS project URLs are not supported.", + ) + + +def trusted_host(): + # type: () -> Option + return Option( + "--trusted-host", + dest="trusted_hosts", + action="append", + metavar="HOSTNAME", + default=[], + help="Mark this host or host:port pair as trusted, even though it " + "does not have valid or any HTTPS.", + ) + + +def constraints(): + # type: () -> Option + return Option( + '-c', '--constraint', + dest='constraints', + action='append', + default=[], + metavar='file', + help='Constrain versions using the given constraints file. ' + 'This option can be used multiple times.' + ) + + +def requirements(): + # type: () -> Option + return Option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help='Install from the given requirements file. ' + 'This option can be used multiple times.' + ) + + +def editable(): + # type: () -> Option + return Option( + '-e', '--editable', + dest='editables', + action='append', + default=[], + metavar='path/url', + help=('Install a project in editable mode (i.e. setuptools ' + '"develop mode") from a local project path or a VCS url.'), + ) + + +def _handle_src(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + value = os.path.abspath(value) + setattr(parser.values, option.dest, value) + + +src = partial( + PipOption, + '--src', '--source', '--source-dir', '--source-directory', + dest='src_dir', + type='path', + metavar='dir', + default=get_src_prefix(), + action='callback', + callback=_handle_src, + help='Directory to check out editable projects into. ' + 'The default in a virtualenv is "/src". ' + 'The default for global installs is "/src".' +) # type: Callable[..., Option] + + +def _get_format_control(values, option): + # type: (Values, Option) -> Any + """Get a format_control object.""" + return getattr(values, option.dest) + + +def _handle_no_binary(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + existing = _get_format_control(parser.values, option) + FormatControl.handle_mutual_excludes( + value, existing.no_binary, existing.only_binary, + ) + + +def _handle_only_binary(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + existing = _get_format_control(parser.values, option) + FormatControl.handle_mutual_excludes( + value, existing.only_binary, existing.no_binary, + ) + + +def no_binary(): + # type: () -> Option + format_control = FormatControl(set(), set()) + return Option( + "--no-binary", dest="format_control", action="callback", + callback=_handle_no_binary, type="str", + default=format_control, + help='Do not use binary packages. Can be supplied multiple times, and ' + 'each time adds to the existing value. Accepts either ":all:" to ' + 'disable all binary packages, ":none:" to empty the set (notice ' + 'the colons), or one or more package names with commas between ' + 'them (no colons). Note that some packages are tricky to compile ' + 'and may fail to install when this option is used on them.', + ) + + +def only_binary(): + # type: () -> Option + format_control = FormatControl(set(), set()) + return Option( + "--only-binary", dest="format_control", action="callback", + callback=_handle_only_binary, type="str", + default=format_control, + help='Do not use source packages. Can be supplied multiple times, and ' + 'each time adds to the existing value. Accepts either ":all:" to ' + 'disable all source packages, ":none:" to empty the set, or one ' + 'or more package names with commas between them. Packages ' + 'without binary distributions will fail to install when this ' + 'option is used on them.', + ) + + +platform = partial( + Option, + '--platform', + dest='platform', + metavar='platform', + default=None, + help=("Only use wheels compatible with . " + "Defaults to the platform of the running system."), +) # type: Callable[..., Option] + + +# This was made a separate function for unit-testing purposes. +def _convert_python_version(value): + # type: (str) -> Tuple[Tuple[int, ...], Optional[str]] + """ + Convert a version string like "3", "37", or "3.7.3" into a tuple of ints. + + :return: A 2-tuple (version_info, error_msg), where `error_msg` is + non-None if and only if there was a parsing error. + """ + if not value: + # The empty string is the same as not providing a value. + return (None, None) + + parts = value.split('.') + if len(parts) > 3: + return ((), 'at most three version parts are allowed') + + if len(parts) == 1: + # Then we are in the case of "3" or "37". + value = parts[0] + if len(value) > 1: + parts = [value[0], value[1:]] + + try: + version_info = tuple(int(part) for part in parts) + except ValueError: + return ((), 'each version part must be an integer') + + return (version_info, None) + + +def _handle_python_version(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + """ + Handle a provided --python-version value. + """ + version_info, error_msg = _convert_python_version(value) + if error_msg is not None: + msg = ( + 'invalid --python-version value: {!r}: {}'.format( + value, error_msg, + ) + ) + raise_option_error(parser, option=option, msg=msg) + + parser.values.python_version = version_info + + +python_version = partial( + Option, + '--python-version', + dest='python_version', + metavar='python_version', + action='callback', + callback=_handle_python_version, type='str', + default=None, + help=dedent("""\ + The Python interpreter version to use for wheel and "Requires-Python" + compatibility checks. Defaults to a version derived from the running + interpreter. The version can be specified using up to three dot-separated + integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor + version can also be given as a string without dots (e.g. "37" for 3.7.0). + """), +) # type: Callable[..., Option] + + +implementation = partial( + Option, + '--implementation', + dest='implementation', + metavar='implementation', + default=None, + help=("Only use wheels compatible with Python " + "implementation , e.g. 'pp', 'jy', 'cp', " + " or 'ip'. If not specified, then the current " + "interpreter implementation is used. Use 'py' to force " + "implementation-agnostic wheels."), +) # type: Callable[..., Option] + + +abi = partial( + Option, + '--abi', + dest='abi', + metavar='abi', + default=None, + help=("Only use wheels compatible with Python " + "abi , e.g. 'pypy_41'. If not specified, then the " + "current interpreter abi tag is used. Generally " + "you will need to specify --implementation, " + "--platform, and --python-version when using " + "this option."), +) # type: Callable[..., Option] + + +def add_target_python_options(cmd_opts): + # type: (OptionGroup) -> None + cmd_opts.add_option(platform()) + cmd_opts.add_option(python_version()) + cmd_opts.add_option(implementation()) + cmd_opts.add_option(abi()) + + +def make_target_python(options): + # type: (Values) -> TargetPython + target_python = TargetPython( + platform=options.platform, + py_version_info=options.python_version, + abi=options.abi, + implementation=options.implementation, + ) + + return target_python + + +def prefer_binary(): + # type: () -> Option + return Option( + "--prefer-binary", + dest="prefer_binary", + action="store_true", + default=False, + help="Prefer older binary packages over newer source packages." + ) + + +cache_dir = partial( + PipOption, + "--cache-dir", + dest="cache_dir", + default=USER_CACHE_DIR, + metavar="dir", + type='path', + help="Store the cache data in ." +) # type: Callable[..., Option] + + +def _handle_no_cache_dir(option, opt, value, parser): + # type: (Option, str, str, OptionParser) -> None + """ + Process a value provided for the --no-cache-dir option. + + This is an optparse.Option callback for the --no-cache-dir option. + """ + # The value argument will be None if --no-cache-dir is passed via the + # command-line, since the option doesn't accept arguments. However, + # the value can be non-None if the option is triggered e.g. by an + # environment variable, like PIP_NO_CACHE_DIR=true. + if value is not None: + # Then parse the string value to get argument error-checking. + try: + strtobool(value) + except ValueError as exc: + raise_option_error(parser, option=option, msg=str(exc)) + + # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool() + # converted to 0 (like "false" or "no") caused cache_dir to be disabled + # rather than enabled (logic would say the latter). Thus, we disable + # the cache directory not just on values that parse to True, but (for + # backwards compatibility reasons) also on values that parse to False. + # In other words, always set it to False if the option is provided in + # some (valid) form. + parser.values.cache_dir = False + + +no_cache = partial( + Option, + "--no-cache-dir", + dest="cache_dir", + action="callback", + callback=_handle_no_cache_dir, + help="Disable the cache.", +) # type: Callable[..., Option] + +no_deps = partial( + Option, + '--no-deps', '--no-dependencies', + dest='ignore_dependencies', + action='store_true', + default=False, + help="Don't install package dependencies.", +) # type: Callable[..., Option] + + +def _handle_build_dir(option, opt, value, parser): + # type: (Option, str, str, OptionParser) -> None + if value: + value = os.path.abspath(value) + setattr(parser.values, option.dest, value) + + +build_dir = partial( + PipOption, + '-b', '--build', '--build-dir', '--build-directory', + dest='build_dir', + type='path', + metavar='dir', + action='callback', + callback=_handle_build_dir, + help='(DEPRECATED) ' + 'Directory to unpack packages into and build in. Note that ' + 'an initial build still takes place in a temporary directory. ' + 'The location of temporary directories can be controlled by setting ' + 'the TMPDIR environment variable (TEMP on Windows) appropriately. ' + 'When passed, build directories are not cleaned in case of failures.' +) # type: Callable[..., Option] + +ignore_requires_python = partial( + Option, + '--ignore-requires-python', + dest='ignore_requires_python', + action='store_true', + help='Ignore the Requires-Python information.' +) # type: Callable[..., Option] + +no_build_isolation = partial( + Option, + '--no-build-isolation', + dest='build_isolation', + action='store_false', + default=True, + help='Disable isolation when building a modern source distribution. ' + 'Build dependencies specified by PEP 518 must be already installed ' + 'if this option is used.' +) # type: Callable[..., Option] + + +def _handle_no_use_pep517(option, opt, value, parser): + # type: (Option, str, str, OptionParser) -> None + """ + Process a value provided for the --no-use-pep517 option. + + This is an optparse.Option callback for the no_use_pep517 option. + """ + # Since --no-use-pep517 doesn't accept arguments, the value argument + # will be None if --no-use-pep517 is passed via the command-line. + # However, the value can be non-None if the option is triggered e.g. + # by an environment variable, for example "PIP_NO_USE_PEP517=true". + if value is not None: + msg = """A value was passed for --no-use-pep517, + probably using either the PIP_NO_USE_PEP517 environment variable + or the "no-use-pep517" config file option. Use an appropriate value + of the PIP_USE_PEP517 environment variable or the "use-pep517" + config file option instead. + """ + raise_option_error(parser, option=option, msg=msg) + + # Otherwise, --no-use-pep517 was passed via the command-line. + parser.values.use_pep517 = False + + +use_pep517 = partial( + Option, + '--use-pep517', + dest='use_pep517', + action='store_true', + default=None, + help='Use PEP 517 for building source distributions ' + '(use --no-use-pep517 to force legacy behaviour).' +) # type: Any + +no_use_pep517 = partial( + Option, + '--no-use-pep517', + dest='use_pep517', + action='callback', + callback=_handle_no_use_pep517, + default=None, + help=SUPPRESS_HELP +) # type: Any + +install_options = partial( + Option, + '--install-option', + dest='install_options', + action='append', + metavar='options', + help="Extra arguments to be supplied to the setup.py install " + "command (use like --install-option=\"--install-scripts=/usr/local/" + "bin\"). Use multiple --install-option options to pass multiple " + "options to setup.py install. If you are using an option with a " + "directory path, be sure to use absolute path.", +) # type: Callable[..., Option] + +global_options = partial( + Option, + '--global-option', + dest='global_options', + action='append', + metavar='options', + help="Extra global options to be supplied to the setup.py " + "call before the install command.", +) # type: Callable[..., Option] + +no_clean = partial( + Option, + '--no-clean', + action='store_true', + default=False, + help="Don't clean up build directories." +) # type: Callable[..., Option] + +pre = partial( + Option, + '--pre', + action='store_true', + default=False, + help="Include pre-release and development versions. By default, " + "pip only finds stable versions.", +) # type: Callable[..., Option] + +disable_pip_version_check = partial( + Option, + "--disable-pip-version-check", + dest="disable_pip_version_check", + action="store_true", + default=False, + help="Don't periodically check PyPI to determine whether a new version " + "of pip is available for download. Implied with --no-index.", +) # type: Callable[..., Option] + + +def _handle_merge_hash(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + """Given a value spelled "algo:digest", append the digest to a list + pointed to in a dict by the algo name.""" + if not parser.values.hashes: + parser.values.hashes = {} + try: + algo, digest = value.split(':', 1) + except ValueError: + parser.error('Arguments to {} must be a hash name ' # noqa + 'followed by a value, like --hash=sha256:' + 'abcde...'.format(opt_str)) + if algo not in STRONG_HASHES: + parser.error('Allowed hash algorithms for {} are {}.'.format( # noqa + opt_str, ', '.join(STRONG_HASHES))) + parser.values.hashes.setdefault(algo, []).append(digest) + + +hash = partial( + Option, + '--hash', + # Hash values eventually end up in InstallRequirement.hashes due to + # __dict__ copying in process_line(). + dest='hashes', + action='callback', + callback=_handle_merge_hash, + type='string', + help="Verify that the package's archive matches this " + 'hash before installing. Example: --hash=sha256:abcdef...', +) # type: Callable[..., Option] + + +require_hashes = partial( + Option, + '--require-hashes', + dest='require_hashes', + action='store_true', + default=False, + help='Require a hash to check each requirement against, for ' + 'repeatable installs. This option is implied when any package in a ' + 'requirements file has a --hash option.', +) # type: Callable[..., Option] + + +list_path = partial( + PipOption, + '--path', + dest='path', + type='path', + action='append', + help='Restrict to the specified installation path for listing ' + 'packages (can be used multiple times).' +) # type: Callable[..., Option] + + +def check_list_path_option(options): + # type: (Values) -> None + if options.path and (options.user or options.local): + raise CommandError( + "Cannot combine '--path' with '--user' or '--local'" + ) + + +no_python_version_warning = partial( + Option, + '--no-python-version-warning', + dest='no_python_version_warning', + action='store_true', + default=False, + help='Silence deprecation warnings for upcoming unsupported Pythons.', +) # type: Callable[..., Option] + + +unstable_feature = partial( + Option, + '--unstable-feature', + dest='unstable_features', + metavar='feature', + action='append', + default=[], + choices=['resolver'], + help=SUPPRESS_HELP, # TODO: drop this in pip 20.3 +) # type: Callable[..., Option] + +use_new_feature = partial( + Option, + '--use-feature', + dest='features_enabled', + metavar='feature', + action='append', + default=[], + choices=['2020-resolver', 'fast-deps'], + help='Enable new functionality, that may be backward incompatible.', +) # type: Callable[..., Option] + +use_deprecated_feature = partial( + Option, + '--use-deprecated', + dest='deprecated_features_enabled', + metavar='feature', + action='append', + default=[], + choices=[], + help=( + 'Enable deprecated functionality, that will be removed in the future.' + ), +) # type: Callable[..., Option] + + +########## +# groups # +########## + +general_group = { + 'name': 'General Options', + 'options': [ + help_, + isolated_mode, + require_virtualenv, + verbose, + version, + quiet, + log, + no_input, + proxy, + retries, + timeout, + exists_action, + trusted_host, + cert, + client_cert, + cache_dir, + no_cache, + disable_pip_version_check, + no_color, + no_python_version_warning, + unstable_feature, + use_new_feature, + use_deprecated_feature, + ] +} # type: Dict[str, Any] + +index_group = { + 'name': 'Package Index Options', + 'options': [ + index_url, + extra_index_url, + no_index, + find_links, + ] +} # type: Dict[str, Any] diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03f38dc6149f9501ec116e58b7deceed82fa3d84 GIT binary patch literal 24890 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 None + super(CommandContextMixIn, self).__init__() + self._in_main_context = False + self._main_context = ExitStack() + + @contextmanager + def main_context(self): + # type: () -> Iterator[None] + assert not self._in_main_context + + self._in_main_context = True + try: + with self._main_context: + yield + finally: + self._in_main_context = False + + def enter_context(self, context_provider): + # type: (ContextManager[_T]) -> _T + assert self._in_main_context + + return self._main_context.enter_context(context_provider) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/command_context.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/command_context.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ad77f5bdb081315831ed957129864331deb9b3a GIT binary patch literal 1591 zcmcIk&2G~`5T3R3=QJgOf)EG^jz*%1)B`7k3Q>UwH3GL3>Wk&t+seUz@@}fO;sWKu ziKpRdcnlr@=36IiAD}qd$;ZWS9xJ9x{=R)`^ zlyl8C$sQdFiaYe3=$vTZU!~Zg9k0wO(UyTx8rsynHk{ndBEN;-Qzk)MGZ1Kpu0)*nEqm4N`%VNo{~o z#GB;pnC2n?#X_fJUg`-O&0j%Z_#umC7AO+hh95LYH{oO7!drF>{;3NPoZluN|RAk6S#cgusroJZp>J<*pRg*9C5)1phU=l6h=EE z>Zt)}`6h_R1OkZ8?wOoTKf6Ysd*UN=^8OR7ZY*y4bcH6A^?GcK5MC%HE1eYiR#mY! zfOEH+OAkDFD{KsY4?SKpc8wmcGJTtUg&^4j%MrHdioO*=S<3|?)I&Bk8>+t`11`&i z^&ud#r62&tAocp#0g{H17|L=AE{Yp`MimP&1Z7nmCovy4&R*xhaY`TYQfQ8>zU5-_ z3!Ua+CRwKtMG#~~JWts*8u4(qcM}E`F1xx$Eq1st=rLMs38&TXO int + 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: {}".format(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 = create_command(cmd_name, isolated=("--isolated" in cmd_args)) + + return command.main(cmd_args) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/main.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/main.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bbf3d0f9fc88a45ba0414dc9ec6a6b38c8ae5575 GIT binary patch literal 1726 zcmbVM%Wfk@6g|~`#BrS1aoz(1-VE|4j%FlSAcTUV2qKIp>Jgfm7E-InU1Qp*eyFNU z#$d0)h9w`vC-4ER+42W0*m7@moB?K5*zW7Pr*7TXxz&|FH=Doz^h-F#?Z>14(^J6w zL5mm&ND9OrltAhs@E};PKvfV_+#ao~2&$`f4MAPp~$f?I0_>tE4c>Sc`qC!oN#HCKsNY8swQK)1b*(A?;GP8PKWuax6R|$3r{ObAT^YHA8^Rq8Q|Lf7{V)S{RDYR7*!^Bw2 zz8)7`Or*w~e4U;eJ!hv>_g}PFIHIo_(C@+uOg--9`%8eDXDgUiaRUfjbAR)F*g7Af zZhqroDX{eLG#jF7*KpN@{uyFfA#-xnz;vBQXWGP~!UyR0dc$sD+PZ@_IVkUE0?+0L zuv?h6o$N48H#B!ovkxc=;oC0IZxpCX{<@g%Ag*FTd6E^Mx4T%-kkS}ZsvfTD90}kql8;x)=8ZE{$u~+-VaMl3d{o%7n3a4NjB+8W}^4N^sc{^SB96Jk3C#l07@H<3$HyzRzfY>;Vw7i+nn{l5#sQI@eCIO{mTi*E*hs1HI?@@r z4plyxNbPfSKJ)1_pVW9dZ)3`a*Z{6|VxseF zEnkgkAm}c-+*Y$r0QxM|Zza!*K?P->duld(!pIE6tm z_urwD57|YJ1iY5$RGQwJR}uT7Esn&F*sfN@f#`a>;?V1}wM!uk<9r;3mgx$^moq!l zG7Nq8;qR@Cm;@rj=X>V!#kM^Xl+WNUmjUH6_{V*xYvxF^_up#CS%>aLpdGD_`~NsB zUl6A3_Td|DsFg%3#WCef?7U$yvxze0Xx)4J=D^MiF3eHrM5*)O_&m;*M`R-H(2b!Z zH+0lekB-=g-$$Y_uOy06y}cVDkAj=c8$zX1v> BcV_?q literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/main_parser.py b/venv/lib/python2.7/site-packages/pip/_internal/cli/main_parser.py new file mode 100644 index 0000000..08c82c1 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/cli/main_parser.py @@ -0,0 +1,99 @@ +"""A single place for constructing and exposing the main parser +""" + +import os +import sys + +from pip._internal.cli import cmdoptions +from pip._internal.cli.parser import ( + ConfigOptionParser, + UpdatingDefaultsHelpFormatter, +) +from pip._internal.commands import commands_dict, get_similar_commands +from pip._internal.exceptions import CommandError +from pip._internal.utils.misc import get_pip_version, get_prog +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Tuple, List + + +__all__ = ["create_main_parser", "parse_command"] + + +def create_main_parser(): + # type: () -> ConfigOptionParser + """Creates and returns the main parser for pip's CLI + """ + + parser_kw = { + 'usage': '\n%prog [options]', + 'add_help_option': False, + 'formatter': UpdatingDefaultsHelpFormatter(), + 'name': 'global', + 'prog': get_prog(), + } + + parser = ConfigOptionParser(**parser_kw) + parser.disable_interspersed_args() + + parser.version = get_pip_version() + + # add the general options + gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser) + parser.add_option_group(gen_opts) + + # so the help formatter knows + parser.main = True # type: ignore + + # create command listing for description + description = [''] + [ + '{name:27} {command_info.summary}'.format(**locals()) + for name, command_info in commands_dict.items() + ] + parser.description = '\n'.join(description) + + return parser + + +def parse_command(args): + # type: (List[str]) -> Tuple[str, List[str]] + parser = create_main_parser() + + # Note: parser calls disable_interspersed_args(), so the result of this + # call is to split the initial args into the general options before the + # subcommand and everything else. + # For example: + # args: ['--timeout=5', 'install', '--user', 'INITools'] + # general_options: ['--timeout==5'] + # args_else: ['install', '--user', 'INITools'] + general_options, args_else = parser.parse_args(args) + + # --version + if general_options.version: + sys.stdout.write(parser.version) # type: ignore + sys.stdout.write(os.linesep) + sys.exit() + + # pip || pip help -> print_help() + if not args_else or (args_else[0] == 'help' and len(args_else) == 1): + parser.print_help() + sys.exit() + + # the subcommand name + cmd_name = args_else[0] + + if cmd_name not in commands_dict: + guess = get_similar_commands(cmd_name) + + msg = ['unknown command "{}"'.format(cmd_name)] + if guess: + msg.append('maybe you meant "{}"'.format(guess)) + + raise CommandError(' - '.join(msg)) + + # all the args without the subcommand + cmd_args = args[:] + cmd_args.remove(cmd_name) + + return cmd_name, cmd_args diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/main_parser.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/main_parser.pyc new file mode 100644 index 0000000000000000000000000000000000000000..494b4372f228c322764c45cd5ef4caaa20082ab3 GIT binary patch literal 2642 zcmb_e&5{&F5YFzNpPgZ5e_;V5#105$G=kj-4r_!Wp|OAv>Pj?lpcOls?%JVe`_Haw zU}feaUOX7yeF;y#gg4JVgC`$Azs&9h1aCSsm0g`xm6etGeOcrDIUfH0{Vzd8?Z?LR zLp1#xL`>vES`^!qTI8eC^lkEO={uA6o%*@|P)FA%CUOE>XHl*&6w4WT`c(ewKX)l&({@LH-71 z$H_lVRt`sp6d$80oI64Bh`xjOn-q_wbCS<+YqHEo`vBr2S10*2Rc@Jvk#hHo%8iO# zo2rfs2HY@@UG=yuc$RA(C^rj}+%3aOt7@41h0or^f*mu2h_bjSO@j3kj-OeF*e&w? zWcs)@4p)smzR*%_Yk!5f}2XPV^a~ztfGJ#IA zBn_+JXteQQB)iG{t5sFBR#w_IWl{zYRi)vbSvt~H#k5(=o_==s=G|cT`qkY}0`Jb= z-i^JF8$Y@jyIq&5G9C0jO|+4NMU@JT3OF7?6A!~4OZUh#fm07!wy}$*e}zc8Eq-9zTrr9!^xN`3deTfwgEjknrXtqLTl?SlnS2lh9Bb{8p zt0B$SXpT+AiC~@W-I^TZGwtxgEnVul?=Sw zRoxtj5$8E8 zK&Y@u?6ex@=TKJhE-$X--=u9_6?Jq>8#{pDfPGKo%a}SMFg^yO|1e(+qIz-3#u7Yo{bo?trHL2@y6ifH1)L zVS`X@;-WSJ+ea0Ei!w)4Xdz3QXse;WlsKt)h7SPK9E literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/parser.py b/venv/lib/python2.7/site-packages/pip/_internal/cli/parser.py new file mode 100644 index 0000000..04e00b7 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/cli/parser.py @@ -0,0 +1,266 @@ +"""Base option parser setup""" + +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import logging +import optparse +import sys +import textwrap +from distutils.util import strtobool + +from pip._vendor.six import string_types + +from pip._internal.cli.status_codes import UNKNOWN_ERROR +from pip._internal.configuration import Configuration, ConfigurationError +from pip._internal.utils.compat import get_terminal_size + +logger = logging.getLogger(__name__) + + +class PrettyHelpFormatter(optparse.IndentedHelpFormatter): + """A prettier/less verbose help formatter for optparse.""" + + def __init__(self, *args, **kwargs): + # help position must be aligned with __init__.parseopts.description + kwargs['max_help_position'] = 30 + kwargs['indent_increment'] = 1 + kwargs['width'] = get_terminal_size()[0] - 2 + optparse.IndentedHelpFormatter.__init__(self, *args, **kwargs) + + def format_option_strings(self, option): + return self._format_option_strings(option) + + def _format_option_strings(self, option, mvarfmt=' <{}>', optsep=', '): + """ + Return a comma-separated list of option strings and metavars. + + :param option: tuple of (short opt, long opt), e.g: ('-f', '--format') + :param mvarfmt: metavar format string + :param optsep: separator + """ + opts = [] + + if option._short_opts: + opts.append(option._short_opts[0]) + if option._long_opts: + opts.append(option._long_opts[0]) + if len(opts) > 1: + opts.insert(1, optsep) + + if option.takes_value(): + metavar = option.metavar or option.dest.lower() + opts.append(mvarfmt.format(metavar.lower())) + + return ''.join(opts) + + def format_heading(self, heading): + if heading == 'Options': + return '' + return heading + ':\n' + + def format_usage(self, usage): + """ + Ensure there is only one newline between usage and the first heading + if there is no description. + """ + msg = '\nUsage: {}\n'.format( + self.indent_lines(textwrap.dedent(usage), " ")) + return msg + + def format_description(self, description): + # leave full control over description to us + if description: + if hasattr(self.parser, 'main'): + label = 'Commands' + else: + label = 'Description' + # some doc strings have initial newlines, some don't + description = description.lstrip('\n') + # some doc strings have final newlines and spaces, some don't + description = description.rstrip() + # dedent, then reindent + description = self.indent_lines(textwrap.dedent(description), " ") + description = '{}:\n{}\n'.format(label, description) + return description + else: + return '' + + def format_epilog(self, epilog): + # leave full control over epilog to us + if epilog: + return epilog + else: + return '' + + def indent_lines(self, text, indent): + new_lines = [indent + line for line in text.split('\n')] + return "\n".join(new_lines) + + +class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter): + """Custom help formatter for use in ConfigOptionParser. + + This is updates the defaults before expanding them, allowing + them to show up correctly in the help listing. + """ + + def expand_default(self, option): + if self.parser is not None: + self.parser._update_defaults(self.parser.defaults) + return optparse.IndentedHelpFormatter.expand_default(self, option) + + +class CustomOptionParser(optparse.OptionParser): + + def insert_option_group(self, idx, *args, **kwargs): + """Insert an OptionGroup at a given position.""" + group = self.add_option_group(*args, **kwargs) + + self.option_groups.pop() + self.option_groups.insert(idx, group) + + return group + + @property + def option_list_all(self): + """Get a list of all options, including those in option groups.""" + res = self.option_list[:] + for i in self.option_groups: + res.extend(i.option_list) + + return res + + +class ConfigOptionParser(CustomOptionParser): + """Custom option parser which updates its defaults by checking the + configuration files and environmental variables""" + + def __init__(self, *args, **kwargs): + self.name = kwargs.pop('name') + + isolated = kwargs.pop("isolated", False) + self.config = Configuration(isolated) + + assert self.name + optparse.OptionParser.__init__(self, *args, **kwargs) + + def check_default(self, option, key, val): + try: + return option.check_value(key, val) + except optparse.OptionValueError as exc: + print("An error occurred during configuration: {}".format(exc)) + sys.exit(3) + + def _get_ordered_configuration_items(self): + # Configuration gives keys in an unordered manner. Order them. + override_order = ["global", self.name, ":env:"] + + # Pool the options into different groups + section_items = {name: [] for name in override_order} + for section_key, val in self.config.items(): + # ignore empty values + if not val: + logger.debug( + "Ignoring configuration key '%s' as it's value is empty.", + section_key + ) + continue + + section, key = section_key.split(".", 1) + if section in override_order: + section_items[section].append((key, val)) + + # Yield each group in their override order + for section in override_order: + for key, val in section_items[section]: + yield key, val + + def _update_defaults(self, defaults): + """Updates the given defaults with values from the config files and + the environ. Does a little special handling for certain types of + options (lists).""" + + # Accumulate complex default state. + self.values = optparse.Values(self.defaults) + late_eval = set() + # Then set the options with those values + for key, val in self._get_ordered_configuration_items(): + # '--' because configuration supports only long names + option = self.get_option('--' + key) + + # Ignore options not present in this parser. E.g. non-globals put + # in [global] by users that want them to apply to all applicable + # commands. + if option is None: + continue + + if option.action in ('store_true', 'store_false', 'count'): + try: + val = strtobool(val) + except ValueError: + error_msg = invalid_config_error_message( + option.action, key, val + ) + self.error(error_msg) + + elif option.action == 'append': + val = val.split() + val = [self.check_default(option, key, v) for v in val] + elif option.action == 'callback': + late_eval.add(option.dest) + opt_str = option.get_opt_string() + val = option.convert_value(opt_str, val) + # From take_action + args = option.callback_args or () + kwargs = option.callback_kwargs or {} + option.callback(option, opt_str, val, self, *args, **kwargs) + else: + val = self.check_default(option, key, val) + + defaults[option.dest] = val + + for key in late_eval: + defaults[key] = getattr(self.values, key) + self.values = None + return defaults + + def get_default_values(self): + """Overriding to make updating the defaults after instantiation of + the option parser possible, _update_defaults() does the dirty work.""" + if not self.process_default_values: + # Old, pre-Optik 1.5 behaviour. + return optparse.Values(self.defaults) + + # Load the configuration, or error out in case of an error + try: + self.config.load() + except ConfigurationError as err: + self.exit(UNKNOWN_ERROR, str(err)) + + defaults = self._update_defaults(self.defaults.copy()) # ours + for option in self._get_all_options(): + default = defaults.get(option.dest) + if isinstance(default, string_types): + opt_str = option.get_opt_string() + defaults[option.dest] = option.check_value(opt_str, default) + return optparse.Values(defaults) + + def error(self, msg): + self.print_usage(sys.stderr) + self.exit(UNKNOWN_ERROR, "{}\n".format(msg)) + + +def invalid_config_error_message(action, key, val): + """Returns a better error message when invalid configuration option + is provided.""" + if action in ('store_true', 'store_false'): + return ("{0} is not a valid value for {1} option, " + "please specify a boolean value like yes/no, " + "true/false or 1/0 instead.").format(val, key) + + return ("{0} is not a valid value for {1} option, " + "please specify a numerical value like 1/0 " + "instead.").format(val, key) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/parser.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/parser.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb418da07fc5fdcecd79d7b2c371f32f0edd2f43 GIT binary patch literal 10257 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 Bar + encoding = getattr(preferred.file, "encoding", None) + + # If we don't know what encoding this file is in, then we'll just assume + # that it doesn't support unicode and use the ASCII bar. + if not encoding: + return fallback + + # Collect all of the possible characters we want to use with the preferred + # bar. + characters = [ + getattr(preferred, "empty_fill", six.text_type()), + getattr(preferred, "fill", six.text_type()), + ] + characters += list(getattr(preferred, "phases", [])) + + # Try to decode the characters we're using for the bar using the encoding + # of the given file, if this works then we'll assume that we can use the + # fancier bar and if not we'll fall back to the plaintext bar. + try: + six.text_type().join(characters).encode(encoding) + except UnicodeEncodeError: + return fallback + else: + return preferred + + +_BaseBar = _select_progress_class(IncrementalBar, Bar) # type: Any + + +class InterruptibleMixin(object): + """ + Helper to ensure that self.finish() gets called on keyboard interrupt. + + This allows downloads to be interrupted without leaving temporary state + (like hidden cursors) behind. + + This class is similar to the progress library's existing SigIntMixin + helper, but as of version 1.2, that helper has the following problems: + + 1. It calls sys.exit(). + 2. It discards the existing SIGINT handler completely. + 3. It leaves its own handler in place even after an uninterrupted finish, + which will have unexpected delayed effects if the user triggers an + unrelated keyboard interrupt some time after a progress-displaying + download has already completed, for example. + """ + + def __init__(self, *args, **kwargs): + # type: (List[Any], Dict[Any, Any]) -> None + """ + Save the original SIGINT handler for later. + """ + # https://github.com/python/mypy/issues/5887 + super(InterruptibleMixin, self).__init__( # type: ignore + *args, + **kwargs + ) + + self.original_handler = signal(SIGINT, self.handle_sigint) + + # If signal() returns None, the previous handler was not installed from + # Python, and we cannot restore it. This probably should not happen, + # but if it does, we must restore something sensible instead, at least. + # The least bad option should be Python's default SIGINT handler, which + # just raises KeyboardInterrupt. + if self.original_handler is None: + self.original_handler = default_int_handler + + def finish(self): + # type: () -> None + """ + Restore the original SIGINT handler after finishing. + + This should happen regardless of whether the progress display finishes + normally, or gets interrupted. + """ + super(InterruptibleMixin, self).finish() # type: ignore + signal(SIGINT, self.original_handler) + + def handle_sigint(self, signum, frame): # type: ignore + """ + Call self.finish() before delegating to the original SIGINT handler. + + This handler should only be in place while the progress display is + active. + """ + self.finish() + self.original_handler(signum, frame) + + +class SilentBar(Bar): + + def update(self): + # type: () -> None + pass + + +class BlueEmojiBar(IncrementalBar): + + suffix = "%(percent)d%%" + bar_prefix = " " + bar_suffix = " " + phases = (u"\U0001F539", u"\U0001F537", u"\U0001F535") # type: Any + + +class DownloadProgressMixin(object): + + def __init__(self, *args, **kwargs): + # type: (List[Any], Dict[Any, Any]) -> None + # https://github.com/python/mypy/issues/5887 + super(DownloadProgressMixin, self).__init__( # type: ignore + *args, + **kwargs + ) + self.message = (" " * ( + get_indentation() + 2 + )) + self.message # type: str + + @property + def downloaded(self): + # type: () -> str + return format_size(self.index) # type: ignore + + @property + def download_speed(self): + # type: () -> str + # Avoid zero division errors... + if self.avg == 0.0: # type: ignore + return "..." + return format_size(1 / self.avg) + "/s" # type: ignore + + @property + def pretty_eta(self): + # type: () -> str + if self.eta: # type: ignore + return "eta {}".format(self.eta_td) # type: ignore + return "" + + def iter(self, it): # type: ignore + for x in it: + yield x + # B305 is incorrectly raised here + # https://github.com/PyCQA/flake8-bugbear/issues/59 + self.next(len(x)) # noqa: B305 + self.finish() + + +class WindowsMixin(object): + + def __init__(self, *args, **kwargs): + # type: (List[Any], Dict[Any, Any]) -> None + # The Windows terminal does not support the hide/show cursor ANSI codes + # even with colorama. So we'll ensure that hide_cursor is False on + # Windows. + # This call needs to go before the super() call, so that hide_cursor + # is set in time. The base progress bar class writes the "hide cursor" + # code to the terminal in its init, so if we don't set this soon + # enough, we get a "hide" with no corresponding "show"... + if WINDOWS and self.hide_cursor: # type: ignore + self.hide_cursor = False + + # https://github.com/python/mypy/issues/5887 + super(WindowsMixin, self).__init__(*args, **kwargs) # type: ignore + + # Check if we are running on Windows and we have the colorama module, + # if we do then wrap our file with it. + if WINDOWS and colorama: + self.file = colorama.AnsiToWin32(self.file) # type: ignore + # The progress code expects to be able to call self.file.isatty() + # but the colorama.AnsiToWin32() object doesn't have that, so we'll + # add it. + self.file.isatty = lambda: self.file.wrapped.isatty() + # The progress code expects to be able to call self.file.flush() + # but the colorama.AnsiToWin32() object doesn't have that, so we'll + # add it. + self.file.flush = lambda: self.file.wrapped.flush() + + +class BaseDownloadProgressBar(WindowsMixin, InterruptibleMixin, + DownloadProgressMixin): + + file = sys.stdout + message = "%(percent)d%%" + suffix = "%(downloaded)s %(download_speed)s %(pretty_eta)s" + + +class DefaultDownloadProgressBar(BaseDownloadProgressBar, + _BaseBar): + pass + + +class DownloadSilentBar(BaseDownloadProgressBar, SilentBar): + pass + + +class DownloadBar(BaseDownloadProgressBar, + Bar): + pass + + +class DownloadFillingCirclesBar(BaseDownloadProgressBar, + FillingCirclesBar): + pass + + +class DownloadBlueEmojiProgressBar(BaseDownloadProgressBar, + BlueEmojiBar): + pass + + +class DownloadProgressSpinner(WindowsMixin, InterruptibleMixin, + DownloadProgressMixin, Spinner): + + file = sys.stdout + suffix = "%(downloaded)s %(download_speed)s" + + def next_phase(self): + # type: () -> str + if not hasattr(self, "_phaser"): + self._phaser = itertools.cycle(self.phases) + return next(self._phaser) + + def update(self): + # type: () -> None + message = self.message % self + phase = self.next_phase() + suffix = self.suffix % self + line = ''.join([ + message, + " " if message else "", + phase, + " " if suffix else "", + suffix, + ]) + + self.writeln(line) + + +BAR_TYPES = { + "off": (DownloadSilentBar, DownloadSilentBar), + "on": (DefaultDownloadProgressBar, DownloadProgressSpinner), + "ascii": (DownloadBar, DownloadProgressSpinner), + "pretty": (DownloadFillingCirclesBar, DownloadProgressSpinner), + "emoji": (DownloadBlueEmojiProgressBar, DownloadProgressSpinner) +} + + +def DownloadProgressProvider(progress_bar, max=None): # type: ignore + if max is None or max == 0: + return BAR_TYPES[progress_bar][1]().iter + else: + return BAR_TYPES[progress_bar][0](max=max).iter diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/progress_bars.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/progress_bars.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bce018cd738ca6e091e6db0bbe865e29a03168d2 GIT binary patch literal 9708 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 None + super(SessionCommandMixin, self).__init__() + self._session = None # Optional[PipSession] + + @classmethod + def _get_index_urls(cls, options): + # type: (Values) -> Optional[List[str]] + """Return a list of index urls from user-provided options.""" + index_urls = [] + if not getattr(options, "no_index", False): + url = getattr(options, "index_url", None) + if url: + index_urls.append(url) + urls = getattr(options, "extra_index_urls", None) + if urls: + index_urls.extend(urls) + # Return None rather than an empty list + return index_urls or None + + def get_default_session(self, options): + # type: (Values) -> PipSession + """Get a default-managed session.""" + if self._session is None: + self._session = self.enter_context(self._build_session(options)) + # there's no type annotation on requests.Session, so it's + # automatically ContextManager[Any] and self._session becomes Any, + # then https://github.com/python/mypy/issues/7696 kicks in + assert self._session is not None + return self._session + + def _build_session(self, options, retries=None, timeout=None): + # type: (Values, Optional[int], Optional[int]) -> PipSession + assert not options.cache_dir or os.path.isabs(options.cache_dir) + session = PipSession( + cache=( + os.path.join(options.cache_dir, "http") + if options.cache_dir else None + ), + retries=retries if retries is not None else options.retries, + trusted_hosts=options.trusted_hosts, + index_urls=self._get_index_urls(options), + ) + + # Handle custom ca-bundles from the user + if options.cert: + session.verify = options.cert + + # Handle SSL client certificate + if options.client_cert: + session.cert = options.client_cert + + # Handle timeouts + if options.timeout or timeout: + session.timeout = ( + timeout if timeout is not None else options.timeout + ) + + # Handle configured proxies + if options.proxy: + session.proxies = { + "http": options.proxy, + "https": options.proxy, + } + + # Determine if we can prompt the user for authentication or not + session.auth.prompting = not options.no_input + + return session + + +class IndexGroupCommand(Command, SessionCommandMixin): + + """ + Abstract base class for commands with the index_group options. + + This also corresponds to the commands that permit the pip version check. + """ + + def handle_pip_version_check(self, options): + # type: (Values) -> None + """ + Do the pip version check if not disabled. + + This overrides the default behavior of not doing the check. + """ + # Make sure the index_group options are present. + assert hasattr(options, 'no_index') + + if options.disable_pip_version_check or options.no_index: + return + + # Otherwise, check if we're using the latest version of pip available. + session = self._build_session( + options, + retries=0, + timeout=min(5, options.timeout) + ) + with session: + pip_self_version_check(session, options) + + +KEEPABLE_TEMPDIR_TYPES = [ + tempdir_kinds.BUILD_ENV, + tempdir_kinds.EPHEM_WHEEL_CACHE, + tempdir_kinds.REQ_BUILD, +] + + +def with_cleanup(func): + # type: (Any) -> Any + """Decorator for common logic related to managing temporary + directories. + """ + def configure_tempdir_registry(registry): + # type: (TempDirectoryTypeRegistry) -> None + for t in KEEPABLE_TEMPDIR_TYPES: + registry.set_delete(t, False) + + def wrapper(self, options, args): + # type: (RequirementCommand, Values, List[Any]) -> Optional[int] + assert self.tempdir_registry is not None + if options.no_clean: + configure_tempdir_registry(self.tempdir_registry) + + try: + return func(self, options, args) + except PreviousBuildDirError: + # This kind of conflict can occur when the user passes an explicit + # build directory with a pre-existing folder. In that case we do + # not want to accidentally remove it. + configure_tempdir_registry(self.tempdir_registry) + raise + + return wrapper + + +class RequirementCommand(IndexGroupCommand): + + def __init__(self, *args, **kw): + # type: (Any, Any) -> None + super(RequirementCommand, self).__init__(*args, **kw) + + self.cmd_opts.add_option(cmdoptions.no_clean()) + + @staticmethod + def make_requirement_preparer( + temp_build_dir, # type: TempDirectory + options, # type: Values + req_tracker, # type: RequirementTracker + session, # type: PipSession + finder, # type: PackageFinder + use_user_site, # type: bool + download_dir=None, # type: str + wheel_download_dir=None, # type: str + ): + # type: (...) -> RequirementPreparer + """ + Create a RequirementPreparer instance for the given parameters. + """ + downloader = Downloader(session, progress_bar=options.progress_bar) + + temp_build_dir_path = temp_build_dir.path + assert temp_build_dir_path is not None + + return RequirementPreparer( + build_dir=temp_build_dir_path, + src_dir=options.src_dir, + download_dir=download_dir, + wheel_download_dir=wheel_download_dir, + build_isolation=options.build_isolation, + req_tracker=req_tracker, + downloader=downloader, + finder=finder, + require_hashes=options.require_hashes, + use_user_site=use_user_site, + ) + + @staticmethod + def make_resolver( + preparer, # type: RequirementPreparer + finder, # type: PackageFinder + options, # type: Values + wheel_cache=None, # type: Optional[WheelCache] + use_user_site=False, # type: bool + ignore_installed=True, # type: bool + ignore_requires_python=False, # type: bool + force_reinstall=False, # type: bool + upgrade_strategy="to-satisfy-only", # type: str + use_pep517=None, # type: Optional[bool] + py_version_info=None # type: Optional[Tuple[int, ...]] + ): + # type: (...) -> BaseResolver + """ + Create a Resolver instance for the given parameters. + """ + make_install_req = partial( + install_req_from_req_string, + isolated=options.isolated_mode, + use_pep517=use_pep517, + ) + # The long import name and duplicated invocation is needed to convince + # Mypy into correctly typechecking. Otherwise it would complain the + # "Resolver" class being redefined. + if '2020-resolver' in options.features_enabled: + import pip._internal.resolution.resolvelib.resolver + return pip._internal.resolution.resolvelib.resolver.Resolver( + preparer=preparer, + finder=finder, + wheel_cache=wheel_cache, + make_install_req=make_install_req, + use_user_site=use_user_site, + ignore_dependencies=options.ignore_dependencies, + ignore_installed=ignore_installed, + ignore_requires_python=ignore_requires_python, + force_reinstall=force_reinstall, + upgrade_strategy=upgrade_strategy, + py_version_info=py_version_info, + lazy_wheel='fast-deps' in options.features_enabled, + ) + import pip._internal.resolution.legacy.resolver + return pip._internal.resolution.legacy.resolver.Resolver( + preparer=preparer, + finder=finder, + wheel_cache=wheel_cache, + make_install_req=make_install_req, + use_user_site=use_user_site, + ignore_dependencies=options.ignore_dependencies, + ignore_installed=ignore_installed, + ignore_requires_python=ignore_requires_python, + force_reinstall=force_reinstall, + upgrade_strategy=upgrade_strategy, + py_version_info=py_version_info, + ) + + def get_requirements( + self, + args, # type: List[str] + options, # type: Values + finder, # type: PackageFinder + session, # type: PipSession + ): + # type: (...) -> List[InstallRequirement] + """ + Parse command-line arguments into the corresponding requirements. + """ + requirements = [] # type: List[InstallRequirement] + for filename in options.constraints: + for parsed_req in parse_requirements( + filename, + constraint=True, finder=finder, options=options, + session=session): + req_to_add = install_req_from_parsed_requirement( + parsed_req, + isolated=options.isolated_mode, + user_supplied=False, + ) + requirements.append(req_to_add) + + for req in args: + req_to_add = install_req_from_line( + req, None, isolated=options.isolated_mode, + use_pep517=options.use_pep517, + user_supplied=True, + ) + requirements.append(req_to_add) + + for req in options.editables: + req_to_add = install_req_from_editable( + req, + user_supplied=True, + isolated=options.isolated_mode, + use_pep517=options.use_pep517, + ) + requirements.append(req_to_add) + + # NOTE: options.require_hashes may be set if --require-hashes is True + for filename in options.requirements: + for parsed_req in parse_requirements( + filename, + finder=finder, options=options, session=session): + req_to_add = install_req_from_parsed_requirement( + parsed_req, + isolated=options.isolated_mode, + use_pep517=options.use_pep517, + user_supplied=True, + ) + requirements.append(req_to_add) + + # If any requirement has hash options, enable hash checking. + if any(req.has_hash_options for req in requirements): + options.require_hashes = True + + if not (args or options.editables or options.requirements): + opts = {'name': self.name} + if options.find_links: + raise CommandError( + 'You must give at least one requirement to {name} ' + '(maybe you meant "pip {name} {links}"?)'.format( + **dict(opts, links=' '.join(options.find_links)))) + else: + raise CommandError( + 'You must give at least one requirement to {name} ' + '(see "pip help {name}")'.format(**opts)) + + return requirements + + @staticmethod + def trace_basic_info(finder): + # type: (PackageFinder) -> None + """ + Trace basic information about the provided objects. + """ + # Display where finder is looking for packages + search_scope = finder.search_scope + locations = search_scope.get_formatted_locations() + if locations: + logger.info(locations) + + def _build_package_finder( + self, + options, # type: Values + session, # type: PipSession + target_python=None, # type: Optional[TargetPython] + ignore_requires_python=None, # type: Optional[bool] + ): + # type: (...) -> PackageFinder + """ + Create a package finder appropriate to this requirement command. + + :param ignore_requires_python: Whether to ignore incompatible + "Requires-Python" values in links. Defaults to False. + """ + link_collector = LinkCollector.create(session, options=options) + selection_prefs = SelectionPreferences( + allow_yanked=True, + format_control=options.format_control, + allow_all_prereleases=options.pre, + prefer_binary=options.prefer_binary, + ignore_requires_python=ignore_requires_python, + ) + + return PackageFinder.create( + link_collector=link_collector, + selection_prefs=selection_prefs, + target_python=target_python, + ) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/req_command.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/req_command.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef9ad29326f53f91ced7d9ac46eb65608e957760 GIT binary patch literal 11837 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 None + raise NotImplementedError() + + def finish(self, final_status): + # type: (str) -> None + raise NotImplementedError() + + +class InteractiveSpinner(SpinnerInterface): + def __init__(self, message, file=None, spin_chars="-\\|/", + # Empirically, 8 updates/second looks nice + min_update_interval_seconds=0.125): + # type: (str, IO[str], str, float) -> None + self._message = message + if file is None: + file = sys.stdout + self._file = file + self._rate_limiter = RateLimiter(min_update_interval_seconds) + self._finished = False + + self._spin_cycle = itertools.cycle(spin_chars) + + self._file.write(" " * get_indentation() + self._message + " ... ") + self._width = 0 + + def _write(self, status): + # type: (str) -> None + assert not self._finished + # Erase what we wrote before by backspacing to the beginning, writing + # spaces to overwrite the old text, and then backspacing again + backup = "\b" * self._width + self._file.write(backup + " " * self._width + backup) + # Now we have a blank slate to add our status + self._file.write(status) + self._width = len(status) + self._file.flush() + self._rate_limiter.reset() + + def spin(self): + # type: () -> None + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._write(next(self._spin_cycle)) + + def finish(self, final_status): + # type: (str) -> None + if self._finished: + return + self._write(final_status) + self._file.write("\n") + self._file.flush() + self._finished = True + + +# Used for dumb terminals, non-interactive installs (no tty), etc. +# We still print updates occasionally (once every 60 seconds by default) to +# act as a keep-alive for systems like Travis-CI that take lack-of-output as +# an indication that a task has frozen. +class NonInteractiveSpinner(SpinnerInterface): + def __init__(self, message, min_update_interval_seconds=60): + # type: (str, float) -> None + self._message = message + self._finished = False + self._rate_limiter = RateLimiter(min_update_interval_seconds) + self._update("started") + + def _update(self, status): + # type: (str) -> None + assert not self._finished + self._rate_limiter.reset() + logger.info("%s: %s", self._message, status) + + def spin(self): + # type: () -> None + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._update("still running...") + + def finish(self, final_status): + # type: (str) -> None + if self._finished: + return + self._update( + "finished with status '{final_status}'".format(**locals())) + self._finished = True + + +class RateLimiter(object): + def __init__(self, min_update_interval_seconds): + # type: (float) -> None + self._min_update_interval_seconds = min_update_interval_seconds + self._last_update = 0 # type: float + + def ready(self): + # type: () -> bool + now = time.time() + delta = now - self._last_update + return delta >= self._min_update_interval_seconds + + def reset(self): + # type: () -> None + self._last_update = time.time() + + +@contextlib.contextmanager +def open_spinner(message): + # type: (str) -> Iterator[SpinnerInterface] + # Interactive spinner goes directly to sys.stdout rather than being routed + # through the logging system, but it acts like it has level INFO, + # i.e. it's only displayed if we're at level INFO or better. + # Non-interactive spinner goes through the logging system, so it is always + # in sync with logging configuration. + if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO: + spinner = InteractiveSpinner(message) # type: SpinnerInterface + else: + spinner = NonInteractiveSpinner(message) + try: + with hidden_cursor(sys.stdout): + yield spinner + except KeyboardInterrupt: + spinner.finish("canceled") + raise + except Exception: + spinner.finish("error") + raise + else: + spinner.finish("done") + + +@contextlib.contextmanager +def hidden_cursor(file): + # type: (IO[str]) -> Iterator[None] + # The Windows terminal does not support the hide/show cursor ANSI codes, + # even via colorama. So don't even try. + if WINDOWS: + yield + # We don't want to clutter the output with control characters if we're + # writing to a file, or if the user is running with --quiet. + # See https://github.com/pypa/pip/issues/3418 + elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO: + yield + else: + file.write(HIDE_CURSOR) + try: + yield + finally: + file.write(SHOW_CURSOR) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/cli/spinners.pyc b/venv/lib/python2.7/site-packages/pip/_internal/cli/spinners.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c199d83bead16c2cf48e953c59fa5707956e6e48 GIT binary patch literal 6059 zcmcIo-EtJi6+W|n+7-K!_^|++7(pN?sUSHfKeo$>jTd25CQID14Qx_1T4qMltY&Ao zW_kfRkg6DNa*@glSx2B;k#1#Du1dE$Dc7W1 zo0R9IJE!HcBy|}yq}!0eymaT?j1@_a$)G9SrmI&aX~|$gx(lvelVni_OVV8uFItl9 zpE}o^B*$fNLb@kpa8kM_#Y;t^s`O7u^qM?_*vk^uB|0rTo`el~F7iy|e)o)o^AerW z)??Gwvl2EZt*vS6>k=+ZW>}oIz9CUr`sXBE(k86*y-CaQNz0p5)Yj?==rpE&S4+t3 zBC_6te3*=FH|J_~!FYXS4IMTZ*f1+9>N; z$U+%6@7N{$Y>nbHjk3)YeLKA%nxcejf3yvhypBR71P4$7Z-0lp zW*(z-pN0mqO=LSUmhvHq9p^_TY0XU>=X=z7A?qsTSMd0L+8ac^Zz+%O4~F45LDf(m zvw&v~sz_hfw+75w|x2SF7-Ol73@Hip2#<%uUxpa&EHNRj=zWETX` z?w93hNx%_k=YWdXsywNXDOj!1qgbemZAgD!o|GqD$JpMlNWV#h+ZK7`6q`g&V*{r# zgBOs0oQ60ow~9vGxq0?_S#ICp7|c2zg%nR6@FBe-3WjNT zbZ$|{IzFb4t?#c;1maLC4X=s6hPUW7N+(JeJ#}iTmU?b)Q^hDa^ELA&ftkofih_Pg zP5~tB1jAPpLavIA(*Tazde-d`A|7$1C3N`HuWN*f$FXzLuWLoIK~Xw6u~9dac$L;N zRGOu;Ue9w_7u>DfXI9vGn%Q||3XufVNQ>+w<9yGYWizW;1k0~-c4sPwA`+3B@UteaU|;CA|Qrnf^HEMaMzsCp=JKi-nrQs zDh&6hd;csON3#>jkRy(4?=lMsf%3qm;@8aR_QiV44VCgCWetHtjl z3kYncsnOp?WqSI6R%pf&eHO$4GqXAYc47FLi8Y)<+>jyaafW6zWO(2^xSwH3ot+$9 zkn7Cd%?0*fLUv>Zrv*Pl%InBzaB}K2M5>^zy^Y>qpn$Ext!He?x&mAQjgu3{xg*$` zQe{~K`w6<~)0gx2RxalbN#sKF17_T>`5`i;uw=Nq3vT4fak?`!)X*Wc|A8wU?2w{eoJWaBiA(_MrJ8aK??&0NJ8mE;vs zS&uS&1C`*h3~ia)M)wc1R;N@1*CvamH@kks9Sy1=u`L zw4f!Sixfz2GF$T)ODx$<<)0OSk6KH z;#$Tr9crVvxt>GG|CXpuZ$Ez0%k6}kID?+PN6$(*rq=5KSt+10xWDPPNFBIjf{~ty zJO%GK>ha_ZW4lQ_w_lwG75rLh#m0lkyn~t{tIgO|KI78l zVca&WjhY&q#-$yNUz_wqlW+}g9M(JI9PP1&Cbm`hC>bMMQ@LLafpW^KNx2@mSf*1(ZPdZFAFtx z%ElwBVVhncHy#JkNS~C{uP<;Cu2H&!l4#yHie;>svF5533|(vgHK zZOrpmBn>O1TJ!3ai(b9dg1Q=|RW4t=4(*KXIOFROn#6De+JT$7#l0zsADDCOP|+20 zBeHi!uQ7AHMILp2M#TV69U_su}7(t zuMIYvLP|~*V3&~P(`lS#*rq(@JmuJ@EN2faeP(i}9Fww0_&lG?Vz!Vhoy)s4XAz!K zNRE{z$TCvP7Y vrIWTH^%{%KdTGLy(IGv-#>!Qt3VT++qnpfCS*gYpH*N&>kTCE&-rxQO=x|jx literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/__init__.py new file mode 100644 index 0000000..6825fa6 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/__init__.py @@ -0,0 +1,122 @@ +""" +Package containing all pip commands +""" + +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False +# There is currently a bug in python/typeshed mentioned at +# https://github.com/python/typeshed/issues/3906 which causes the +# return type of difflib.get_close_matches to be reported +# as List[Sequence[str]] whereas it should have been List[str] + +from __future__ import absolute_import + +import importlib +from collections import OrderedDict, namedtuple + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any + from pip._internal.cli.base_command import Command + + +CommandInfo = namedtuple('CommandInfo', 'module_path, class_name, summary') + +# The ordering matters for help display. +# Also, even though the module path starts with the same +# "pip._internal.commands" prefix in each case, we include the full path +# because it makes testing easier (specifically when modifying commands_dict +# in test setup / teardown by adding info for a FakeCommand class defined +# in a test-related module). +# Finally, we need to pass an iterable of pairs here rather than a dict +# so that the ordering won't be lost when using Python 2.7. +commands_dict = OrderedDict([ + ('install', CommandInfo( + 'pip._internal.commands.install', 'InstallCommand', + 'Install packages.', + )), + ('download', CommandInfo( + 'pip._internal.commands.download', 'DownloadCommand', + 'Download packages.', + )), + ('uninstall', CommandInfo( + 'pip._internal.commands.uninstall', 'UninstallCommand', + 'Uninstall packages.', + )), + ('freeze', CommandInfo( + 'pip._internal.commands.freeze', 'FreezeCommand', + 'Output installed packages in requirements format.', + )), + ('list', CommandInfo( + 'pip._internal.commands.list', 'ListCommand', + 'List installed packages.', + )), + ('show', CommandInfo( + 'pip._internal.commands.show', 'ShowCommand', + 'Show information about installed packages.', + )), + ('check', CommandInfo( + 'pip._internal.commands.check', 'CheckCommand', + 'Verify installed packages have compatible dependencies.', + )), + ('config', CommandInfo( + 'pip._internal.commands.configuration', 'ConfigurationCommand', + 'Manage local and global configuration.', + )), + ('search', CommandInfo( + 'pip._internal.commands.search', 'SearchCommand', + 'Search PyPI for packages.', + )), + ('cache', CommandInfo( + 'pip._internal.commands.cache', 'CacheCommand', + "Inspect and manage pip's wheel cache.", + )), + ('wheel', CommandInfo( + 'pip._internal.commands.wheel', 'WheelCommand', + 'Build wheels from your requirements.', + )), + ('hash', CommandInfo( + 'pip._internal.commands.hash', 'HashCommand', + 'Compute hashes of package archives.', + )), + ('completion', CommandInfo( + 'pip._internal.commands.completion', 'CompletionCommand', + 'A helper command used for command completion.', + )), + ('debug', CommandInfo( + 'pip._internal.commands.debug', 'DebugCommand', + 'Show information useful for debugging.', + )), + ('help', CommandInfo( + 'pip._internal.commands.help', 'HelpCommand', + 'Show help for commands.', + )), +]) # type: OrderedDict[str, CommandInfo] + + +def create_command(name, **kwargs): + # type: (str, **Any) -> Command + """ + Create an instance of the Command class with the given name. + """ + module_path, class_name, summary = commands_dict[name] + module = importlib.import_module(module_path) + command_class = getattr(module, class_name) + command = command_class(name=name, summary=summary, **kwargs) + + return command + + +def get_similar_commands(name): + """Command name auto-correct.""" + from difflib import get_close_matches + + name = name.lower() + + close_commands = get_close_matches(name, commands_dict.keys()) + + if close_commands: + return close_commands[0] + else: + return False diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0112c04dc5cae2e14ac7fe5676c64e7a019094f GIT binary patch literal 3512 zcmb_eZF3Vh5Z<$6Cou^Lgtzc|lsA_Wr_dH?OCjJ8$WTJY8QQ_qnVZW=wvXJ4IqArl zaXzJA`k_Ckzoye)(Ld1L)hUE&;!oIPS$eeEm7d+zs{HSC?e9PS@&YJ6C-8r12|)eh z00@9Kwho9AL=MCyXqUjDaT%gAw97m<2GJPA6=+u=u0p$NBq|V%Lp%ZP32@{DWbatE z3ehCQHE7q2)Hp;(AfAHu6gUZhtb&*TF$ue9Y8qq(L=EILh$A4TKup7K89F5pM;V*} zF$?0D1&=d02jT>XlNLP1;As$NK+Ie4EQ9AjoCk5if)^RQ1i}Sz*@9m%cm>2&5Z5et zoxvL*>L9+f;7ta<0&xq(f(084E`s>FTB?4wYAl?XJ)R9bB~jO8I0qg zY0R_YqQ9DSQsv@YoQgb>Uf?7p%4N0n@ClD3sb`qt&P?ru@Y-O0RInZIyZMuJ0RgN3c7d9-8@cYUzFN}o6VhAYY!c9AtBbSH|-%|k4 z?HQn4B+0kxG7b;9!ahoAy0S>QS%f{lz84UE?Dk~Tml;JIfo`radC5H%!2e>Mp-{-p zygQ0Q7GMgONz_`SVEbQ!p|wsPu{~ba#WGWnh}#-TBF-BUv14tVwl?Tc`%j@70aYow zq$z`5EMb*H$ zGaQ4V1AjtkXB>v(SUjmxsTFK$E`FMs^wF7qVzN95BzaW#q+4v))F*d4)IEl~=;6er za@Al3d_~fbi&jy<>U3{%hM{BFjh>*YN;Sfi-6-7Tc{B1%MPwCSseP@pI?>Rg#Nq2? zYunGdin-iZJx!qP70?#BkHrgpR0fJ2cwA@MLV?tA61Y(hvA3w>{vt-{LQx(T?ySE3 za5pB1e|z^U_V_f_AUMIE?(va;{Ru6%{im&6cK0CredlqEx4|@}WFW zq=Dyg+<0Cm*LfyAuSN1L+8_s5kVX-bMK@QA60*fFL?ZUnODxx6gqPi*kM}`~Jj$V0 zj5z}ic)LYmW79{%3tC#lY>P-|W?S@3Y2C->BVC^@L?=+~1CtpKX}hYAO?47^a!w&z YRcF?jE6>!*P8GkCIR4!2@yg`%f0vk}mH+?% literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/cache.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/cache.py new file mode 100644 index 0000000..747277f --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/cache.py @@ -0,0 +1,182 @@ +from __future__ import absolute_import + +import logging +import os +import textwrap + +import pip._internal.utils.filesystem as filesystem +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.exceptions import CommandError, PipError +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from optparse import Values + from typing import Any, List + + +logger = logging.getLogger(__name__) + + +class CacheCommand(Command): + """ + Inspect and manage pip's wheel cache. + + Subcommands: + + - dir: Show the cache directory. + - info: Show information about the cache. + - list: List filenames of packages stored in the cache. + - remove: Remove one or more package from the cache. + - purge: Remove all items from the cache. + + ```` can be a glob expression or a package name. + """ + + ignore_require_venv = True + usage = """ + %prog dir + %prog info + %prog list [] + %prog remove + %prog purge + """ + + def run(self, options, args): + # type: (Values, List[Any]) -> int + handlers = { + "dir": self.get_cache_dir, + "info": self.get_cache_info, + "list": self.list_cache_items, + "remove": self.remove_cache_items, + "purge": self.purge_cache, + } + + if not options.cache_dir: + logger.error("pip cache commands can not " + "function since cache is disabled.") + return ERROR + + # Determine action + if not args or args[0] not in handlers: + logger.error( + "Need an action (%s) to perform.", + ", ".join(sorted(handlers)), + ) + return ERROR + + action = args[0] + + # Error handling happens here, not in the action-handlers. + try: + handlers[action](options, args[1:]) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + return SUCCESS + + def get_cache_dir(self, options, args): + # type: (Values, List[Any]) -> None + if args: + raise CommandError('Too many arguments') + + logger.info(options.cache_dir) + + def get_cache_info(self, options, args): + # type: (Values, List[Any]) -> None + if args: + raise CommandError('Too many arguments') + + num_packages = len(self._find_wheels(options, '*')) + + cache_location = self._wheels_cache_dir(options) + cache_size = filesystem.format_directory_size(cache_location) + + message = textwrap.dedent(""" + Location: {location} + Size: {size} + Number of wheels: {package_count} + """).format( + location=cache_location, + package_count=num_packages, + size=cache_size, + ).strip() + + logger.info(message) + + def list_cache_items(self, options, args): + # type: (Values, List[Any]) -> None + if len(args) > 1: + raise CommandError('Too many arguments') + + if args: + pattern = args[0] + else: + pattern = '*' + + files = self._find_wheels(options, pattern) + + if not files: + logger.info('Nothing cached.') + return + + results = [] + for filename in files: + wheel = os.path.basename(filename) + size = filesystem.format_file_size(filename) + results.append(' - {} ({})'.format(wheel, size)) + logger.info('Cache contents:\n') + logger.info('\n'.join(sorted(results))) + + def remove_cache_items(self, options, args): + # type: (Values, List[Any]) -> None + if len(args) > 1: + raise CommandError('Too many arguments') + + if not args: + raise CommandError('Please provide a pattern') + + files = self._find_wheels(options, args[0]) + if not files: + raise CommandError('No matching packages') + + for filename in files: + os.unlink(filename) + logger.debug('Removed %s', filename) + logger.info('Files removed: %s', len(files)) + + def purge_cache(self, options, args): + # type: (Values, List[Any]) -> None + if args: + raise CommandError('Too many arguments') + + return self.remove_cache_items(options, ['*']) + + def _wheels_cache_dir(self, options): + # type: (Values) -> str + return os.path.join(options.cache_dir, 'wheels') + + def _find_wheels(self, options, pattern): + # type: (Values, str) -> List[str] + wheel_dir = self._wheels_cache_dir(options) + + # The wheel filename format, as specified in PEP 427, is: + # {distribution}-{version}(-{build})?-{python}-{abi}-{platform}.whl + # + # Additionally, non-alphanumeric values in the distribution are + # normalized to underscores (_), meaning hyphens can never occur + # before `-{version}`. + # + # Given that information: + # - If the pattern we're given contains a hyphen (-), the user is + # providing at least the version. Thus, we can just append `*.whl` + # to match the rest of it. + # - If the pattern we're given doesn't contain a hyphen (-), the + # user is only providing the name. Thus, we append `-*.whl` to + # match the hyphen before the version, followed by anything else. + # + # PEP 427: https://www.python.org/dev/peps/pep-0427/ + pattern = pattern + ("*.whl" if "-" in pattern else "-*.whl") + + return filesystem.find_files(wheel_dir, pattern) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/cache.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/cache.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f80128f08aad359c763c2749d70ba8eece3a17a GIT binary patch literal 5398 zcmcIo+io1k5v`fMkh>yHik2wRR^oAD#Vf_604GoaMlcxDiY-K;g`qFe2EuB&(_GGS zF01KTNwmn9$S(%+nzuaUH6M^a$WIsn0^|eolppXp)w@fRvVs6%NKQ{r->d4>scKgK zJ>UHMSAXsFWc*XXdt*by{tJ}|f1V^FsV8kuJbwF<_|o>Z5A}+)E0cOv+SN(DCWE>R zW@Ioc?OAQCNYaqBDeb0Ps4B@hN#~?JC+WPj=Ur<}l2;^MkoJP4i_%_nt#wJxOS&ZO zCGpIX6o1ndXC!%5(hJhQ;6}|#a#7M{X)jB9N!pjh%S4PXgUe!8yh?`AjE8UA;K`mbNzmho*P1$Xd$iMY%CzgQWi^Q6Vm;X2%bx`0o^hku zh86STU`?m32648Vk4Lduq}?*kv!J_^kILhDlhFyZwH{Ds!ET(GteYAeO06Y6XZpZV*F%!uv_HmixY>VqJKQEn^Dkk{dbn6GFx}EI7wEtAMN~mo;Vv~5KH*9VI4gWwTt_cn{P$Id>8er&)*1#bZ zR|A7oT@Apj$<3pR9C|XSi4CPx8UYC5zaG42`_Pv;8w*|lRSs6zdsxMMPgiQn8yxj{){<&@PWGEpd@bHl4HI?$L+}~!j@grA z{I;AQbH-Ll$)RiYN@`du)GH>7I1MUEsJ84aG{PIkxSoJtEuQ6o=P2tbl5L#zCg_hX ztZBPDiHX*fr0g45Wy=7u07}=1P@sqsYH-(CC$bg|zCJAhi$C+x# zf)`B`5;&^5Zqc_PmD=J0+GI_#tL&N&sT&)<#vYRC9ylg3h1HduB1#HuS|~&d`wP@= zl;LwuCFLzI$iz#m$sW`gCv@_+B@;F|o)EM^nQCHE=P?RR!cL_N#ugQt?*21@D4a^VKUT3Z+)BxP}VATU?YO{sKii)wJBlfh48;|BV^!pFqxwBRtF$@@04~bU+Qhw8Gsr2x z7w7_4z>UETaL?ybf!jY9IjYn72j}F_afYgq$9kC>6)o58BMh068#(lD-qVP(9z09N z)uR&ww&O2A?$0b5eHFT{PTT3>t@-PA?y28YrysHZg9jUm+ey~!pnEh!h6Ad{pR>gI z0Erkv65u@}hqGh%@g5E3^YIQdJft`N!1Ot?J{`ox!tw4cioB(f;U(-6V}OKjqOeSb zxAJl?&iXEBMQfJ!3s!??M?ve^(KSm>*ko20^m6bh*lE3KNyAMIJmFPT9aa5^wJCl| z@?vfk=*WKd6oxxps|i|2D3n}!3|Ru%p_SCr9S%(vh3}vmUS_d^LIpbwNTO?;TPcXu zAvByIs~RPx)omwvp$<`}3g6<2c+Mt{gyiuAj}1_WzeFS=c+~wRzP+lJX!X8_FGVI% zNw?R~@fTG78)Vv>3Rfjd7h9%`3)}*yD?}#9wj#ExLlquw=+hsw{euTTR2Ej$Iu`bz z7hLK{w_s&tOON&dI<(=|0HnfWbVK$i=g#7^{}Ex9M!T07SUW(z`Z$hEz|>ZAV1=K( zz%>~6%ATTc!YB$qmySolRcqz z8be!D`Y8y7KWE!IiZg`6t61(!JY#xta9Hq{NlgAcAaKEffZ?2vf`I#fXJDm`k6=)r-NjSA88(qK;9i?-A*UUd#F>^Pl}N# ziM_a=;YQsl%%c%9lg?w4JyypYF)0WGjL^(8q^~QJhMW}=Q=zJZ$2pcxYxaN4{6ij| zfKnH&&)5C>Ox{9 zS24Y4mGqpGhcZulW_;J8ncVG+H;I$O+}X>6A%$dA)=-LD+OS(#6EgCu!;VJ~86m|} zP~zfwSFeZR`)t>&fEqtzE9#MMIRw5(-B`-8=+Alh^)Gsh-ZFj{5q%fEmC8cp8&lSm ALI3~& literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/check.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/check.py new file mode 100644 index 0000000..b557ca6 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/check.py @@ -0,0 +1,51 @@ +import logging + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.operations.check import ( + check_package_set, + create_package_set_from_installed, +) +from pip._internal.utils.misc import write_output +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +logger = logging.getLogger(__name__) + +if MYPY_CHECK_RUNNING: + from typing import List, Any + from optparse import Values + + +class CheckCommand(Command): + """Verify installed packages have compatible dependencies.""" + + usage = """ + %prog [options]""" + + def run(self, options, args): + # type: (Values, List[Any]) -> int + + package_set, parsing_probs = create_package_set_from_installed() + missing, conflicting = check_package_set(package_set) + + for project_name in missing: + version = package_set[project_name].version + for dependency in missing[project_name]: + write_output( + "%s %s requires %s, which is not installed.", + project_name, version, dependency[0], + ) + + for project_name in conflicting: + version = package_set[project_name].version + for dep_name, dep_version, req in conflicting[project_name]: + write_output( + "%s %s has requirement %s, but you have %s %s.", + project_name, version, req, dep_name, dep_version, + ) + + if missing or conflicting or parsing_probs: + return ERROR + else: + write_output("No broken requirements found.") + return SUCCESS diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/check.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/check.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9323a481cd59afdb41476df5a25d1b42858a79a8 GIT binary patch literal 1897 zcmb_cTW{P%6h32ny_f8gWD_D%RAeM78PqsZh2R0iZ5v9VY>`)O6w}D^+OxY(e2Zt? zX3_3bc;Ss-!9U=g-@pSe`~lwi0dUTE*%U$F>g=4HIk!2NZ$|&K*ZKX2pZyS4pN{`O z!6kk{65)?Q0^rrW1_^^y15X1+Ivo-nQUg2#(gt{qT53RILfQnc326(wRxNEn(uTAH zUZ>uhkZeHO1+NQ?1Dy4MzXDebyiMR;D1TCiHzC=AbQ`>FNc-URYu6SeJCN>zw+k%8 zG}^#5m@tSs@IAm4z=`)NB|fq@u!#6C{Dw9|RyL6g@-z*y$ks^EKyu`|4_&1iJsJ#- zMx$D_jjC|Q!*jm~!t-FteZi%ClcXgNB!6D)Ps%*?<4njPNqAHr)a7^yVrr6?rB#(I+Pv+J-Yim`fux7ziZiRVT1Tr2c z+=_U?vxsM5%!MQN(6?i$?^aRfQ|sHjka3=g(~x5KaJ6v_aEU*VNHvou8Z32K8Xy@g zbec3t8n86s@*XT2aQF0MST;$wXu|#(DqC>*Hfd;o_w*(#+klC68{dY3eHBpaS!CLLIAz_P1Csxv8M7Zx2@Y`~R?L4U-cB^+Z0 z;#cw}YC!oLNCQTci9uyB1knhaJ+cW*L-7vMTf)L$$uFw7anQMj+*l@x5j0D&a;0`A`f9r@+ylQn_%M-qFkDa z!uL~N3LKP6iMj+Cmo9-#6T^})51vev;cB2t7?e{X=^{OU4alVkFj_YC5d&kP+|pQ( zL|KP zi^C!=4ptaGxO4yPyZ2HOsf9OE@-hpOLj*HjdU2?3v{TIMh*h?aVZ>V$R^McOt;c$7 zo9XzsuM>Ym@vrNBW@sIzCae@mL3@2kMaT)IU;c#C=?mG3C zlD|vc+rcGh&L%T;Q?u!2suYrZI;F/dev/null ) ) + }} + complete -o default -F _pip_completion {prog} + """, + 'zsh': """ + function _pip_completion {{ + local words cword + read -Ac words + read -cn cword + reply=( $( COMP_WORDS="$words[*]" \\ + COMP_CWORD=$(( cword-1 )) \\ + PIP_AUTO_COMPLETE=1 $words[1] 2>/dev/null )) + }} + compctl -K _pip_completion {prog} + """, + 'fish': """ + function __fish_complete_pip + set -lx COMP_WORDS (commandline -o) "" + set -lx COMP_CWORD ( \\ + math (contains -i -- (commandline -t) $COMP_WORDS)-1 \\ + ) + set -lx PIP_AUTO_COMPLETE 1 + string split \\ -- (eval $COMP_WORDS[1]) + end + complete -fa "(__fish_complete_pip)" -c {prog} + """, +} + + +class CompletionCommand(Command): + """A helper command to be used for command completion.""" + + ignore_require_venv = True + + def add_options(self): + # type: () -> None + self.cmd_opts.add_option( + '--bash', '-b', + action='store_const', + const='bash', + dest='shell', + help='Emit completion code for bash') + self.cmd_opts.add_option( + '--zsh', '-z', + action='store_const', + const='zsh', + dest='shell', + help='Emit completion code for zsh') + self.cmd_opts.add_option( + '--fish', '-f', + action='store_const', + const='fish', + dest='shell', + help='Emit completion code for fish') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + # type: (Values, List[str]) -> int + """Prints the completion code of the given shell""" + shells = COMPLETION_SCRIPTS.keys() + shell_options = ['--' + shell for shell in sorted(shells)] + if options.shell in shells: + script = textwrap.dedent( + COMPLETION_SCRIPTS.get(options.shell, '').format( + prog=get_prog()) + ) + print(BASE_COMPLETION.format(script=script, shell=options.shell)) + return SUCCESS + else: + sys.stderr.write( + 'ERROR: You must pass {}\n' .format(' or '.join(shell_options)) + ) + return SUCCESS diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/completion.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/completion.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c1345eb2138d4537e730a39bc8f2a2152dca1c1 GIT binary patch literal 3523 zcmcIm+fo}x5ba&vkOT(XNqniqHNjMB<*J3ksp26CF0icFlx?6^I4NY4twlQ$EAP!a zv)EYZ3BUL;&-sj0{vv;n&&Us?dsawbE>8|g(X^(9+c$$~kD|l$--U4?zK1g-kCGei4Eav`SgO0R997 zWoVVNei8f%1XXBNLE}|OepgmX;7>v@1+A$}YXbZ$5KKdB8nh6-;zzN;)K=Vbt-e@+nfeF;;a%sm&)Xhf7`19?}ZM*)YQGaS%FV@%B)*okc zd7OLZ37PeZ*!#utQ!d0K6f1XG?8U4v_PFm4SUU=0pGz+anUGE*`=XtAu^e2e#Y49u z?%<9pZ1`uRJ$r1&sEua&{gFtz^^ND7R%7$o_Oij|4Ar%N-LM`tmuKhteVWa>FYoOP z2D9wdsl~_MhHs@^r`5}IWBKwmn`@i)>Wi%nn-)B4Y&Dh_+1w(#|6sx8`wL;}`>e*s z(GLcr0EWBc%#4`JJ5K6LX8z1R**WV|eX>=Oim>a5J@Ncxt~zPhR>?lI^kl01sO|Xd zZIrlzwdpkqgt3G>E;Co#+4Px-c6iQ;*grTY<;p(h`oc_)^SV4|7@1vjk=1G!rTN?h zXKogEPUrc;G`FSC%%_*8mMG&rW;Q)Pvv$W5d&hv}l;{&#VoY$Xo&W9x{Fs6DrPJqo zA(gnsW@j&6qCm%tb8-+ka*u3<((yvUOplr7C$?pcWpGuvuVFS%qkNne!ufHiXY$Gx zPsb+{FYGcA`<`U4m~zYa5ked5je4xhI?l^4Lu+OHiHp|TR8E{jU2v*ae;)?IFS!KvjF;9r1 z$SRW&+vO}3+-03;JUoma8En2y4(X}lQ(r+tf1q#((8C}4#vk4zNapApy%xbOfjdDY zkMw?|=e4nF6^QCbs#7OauY969O_#t}74L+R)oUYF9eQZ&`Y@OyUEMZK;|q*$T@Xc^ zreX`7#9c`vj$#T)dl529I6^uUQWmhUB#Z71#WOA+jw@1ELzFx54JtGO#Kbs9D7swb zPq`ywrb&lMIeu@^O(VX(Y#k|Q0TTkUbseir>n`<2+SzqT)F{bOJ8{hxP-o#V4>x|(;ms`=6yQ)Jz@WLwM4ysA`&hTUhiZByM8U zu&fR12euuhEJ%f9u_FZQ4=REX!tji*8>B1gV`q40uWhW`&APR=xz$uSf6Wg>W*fh! zxT|a{Y)Sr3zD=B1O}gCWp_Eh@{ESjVNFm7A77eLSvxlqA#_@*%ILqrSf7LI&w4AaJvG_=Us zSJ*&qQoE~7BX)0U)B0^Kk66B?tJqb(Y&&!UZrkcC+IA4RsZU+nl5M+D8)YiXR+94U zRCYrmrG&ppJ$z&N_bqZ{-NRe`vqFdtvJ>(FX3e-fJ&0s;;J#8jQ4TZ#dRM2CH13RMLJk0L&cCarI&AyaDW|3^-h)1R_pKcE~4%GHcMsZHuL Vn)=s^_`aSm>bY{MTB=s^{{h?uGm!uQ literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/configuration.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/configuration.py new file mode 100644 index 0000000..f9b3ab7 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/configuration.py @@ -0,0 +1,284 @@ +import logging +import os +import subprocess + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.configuration import ( + Configuration, + get_configuration_files, + kinds, +) +from pip._internal.exceptions import PipError +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import get_prog, write_output +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Any, Optional + from optparse import Values + + from pip._internal.configuration import Kind + +logger = logging.getLogger(__name__) + + +class ConfigurationCommand(Command): + """ + Manage local and global configuration. + + Subcommands: + + - list: List the active configuration (or from the file specified) + - edit: Edit the configuration file in an editor + - get: Get the value associated with name + - set: Set the name=value + - unset: Unset the value associated with name + - debug: List the configuration files and values defined under them + + If none of --user, --global and --site are passed, a virtual + environment configuration file is used if one is active and the file + exists. Otherwise, all modifications happen on the to the user file by + default. + """ + + ignore_require_venv = True + usage = """ + %prog [] list + %prog [] [--editor ] edit + + %prog [] get name + %prog [] set name value + %prog [] unset name + %prog [] debug + """ + + def add_options(self): + # type: () -> None + self.cmd_opts.add_option( + '--editor', + dest='editor', + action='store', + default=None, + help=( + 'Editor to use to edit the file. Uses VISUAL or EDITOR ' + 'environment variables if not provided.' + ) + ) + + self.cmd_opts.add_option( + '--global', + dest='global_file', + action='store_true', + default=False, + help='Use the system-wide configuration file only' + ) + + self.cmd_opts.add_option( + '--user', + dest='user_file', + action='store_true', + default=False, + help='Use the user configuration file only' + ) + + self.cmd_opts.add_option( + '--site', + dest='site_file', + action='store_true', + default=False, + help='Use the current environment configuration file only' + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + # type: (Values, List[str]) -> int + handlers = { + "list": self.list_values, + "edit": self.open_in_editor, + "get": self.get_name, + "set": self.set_name_value, + "unset": self.unset_name, + "debug": self.list_config_values, + } + + # Determine action + if not args or args[0] not in handlers: + logger.error( + "Need an action (%s) to perform.", + ", ".join(sorted(handlers)), + ) + return ERROR + + action = args[0] + + # Determine which configuration files are to be loaded + # Depends on whether the command is modifying. + try: + load_only = self._determine_file( + options, need_value=(action in ["get", "set", "unset", "edit"]) + ) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + # Load a new configuration + self.configuration = Configuration( + isolated=options.isolated_mode, load_only=load_only + ) + self.configuration.load() + + # Error handling happens here, not in the action-handlers. + try: + handlers[action](options, args[1:]) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + return SUCCESS + + def _determine_file(self, options, need_value): + # type: (Values, bool) -> Optional[Kind] + file_options = [key for key, value in ( + (kinds.USER, options.user_file), + (kinds.GLOBAL, options.global_file), + (kinds.SITE, options.site_file), + ) if value] + + if not file_options: + if not need_value: + return None + # Default to user, unless there's a site file. + elif any( + os.path.exists(site_config_file) + for site_config_file in get_configuration_files()[kinds.SITE] + ): + return kinds.SITE + else: + return kinds.USER + elif len(file_options) == 1: + return file_options[0] + + raise PipError( + "Need exactly one file to operate upon " + "(--user, --site, --global) to perform." + ) + + def list_values(self, options, args): + # type: (Values, List[str]) -> None + self._get_n_args(args, "list", n=0) + + for key, value in sorted(self.configuration.items()): + write_output("%s=%r", key, value) + + def get_name(self, options, args): + # type: (Values, List[str]) -> None + key = self._get_n_args(args, "get [name]", n=1) + value = self.configuration.get_value(key) + + write_output("%s", value) + + def set_name_value(self, options, args): + # type: (Values, List[str]) -> None + key, value = self._get_n_args(args, "set [name] [value]", n=2) + self.configuration.set_value(key, value) + + self._save_configuration() + + def unset_name(self, options, args): + # type: (Values, List[str]) -> None + key = self._get_n_args(args, "unset [name]", n=1) + self.configuration.unset_value(key) + + self._save_configuration() + + def list_config_values(self, options, args): + # type: (Values, List[str]) -> None + """List config key-value pairs across different config files""" + self._get_n_args(args, "debug", n=0) + + self.print_env_var_values() + # Iterate over config files and print if they exist, and the + # key-value pairs present in them if they do + for variant, files in sorted(self.configuration.iter_config_files()): + write_output("%s:", variant) + for fname in files: + with indent_log(): + file_exists = os.path.exists(fname) + write_output("%s, exists: %r", + fname, file_exists) + if file_exists: + self.print_config_file_values(variant) + + def print_config_file_values(self, variant): + # type: (Kind) -> None + """Get key-value pairs from the file of a variant""" + for name, value in self.configuration.\ + get_values_in_config(variant).items(): + with indent_log(): + write_output("%s: %s", name, value) + + def print_env_var_values(self): + # type: () -> None + """Get key-values pairs present as environment variables""" + write_output("%s:", 'env_var') + with indent_log(): + for key, value in sorted(self.configuration.get_environ_vars()): + env_var = 'PIP_{}'.format(key.upper()) + write_output("%s=%r", env_var, value) + + def open_in_editor(self, options, args): + # type: (Values, List[str]) -> None + editor = self._determine_editor(options) + + fname = self.configuration.get_file_to_edit() + if fname is None: + raise PipError("Could not determine appropriate file.") + + try: + subprocess.check_call([editor, fname]) + except subprocess.CalledProcessError as e: + raise PipError( + "Editor Subprocess exited with exit code {}" + .format(e.returncode) + ) + + def _get_n_args(self, args, example, n): + # type: (List[str], str, int) -> Any + """Helper to make sure the command got the right number of arguments + """ + if len(args) != n: + msg = ( + 'Got unexpected number of arguments, expected {}. ' + '(example: "{} config {}")' + ).format(n, get_prog(), example) + raise PipError(msg) + + if n == 1: + return args[0] + else: + return args + + def _save_configuration(self): + # type: () -> None + # We successfully ran a modifying command. Need to save the + # configuration. + try: + self.configuration.save() + except Exception: + logger.exception( + "Unable to save configuration. Please report this as a bug." + ) + raise PipError("Internal Error.") + + def _determine_editor(self, options): + # type: (Values) -> str + if options.editor is not None: + return options.editor + elif "VISUAL" in os.environ: + return os.environ["VISUAL"] + elif "EDITOR" in os.environ: + return os.environ["EDITOR"] + else: + raise PipError("Could not determine editor to use.") diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/configuration.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/configuration.pyc new file mode 100644 index 0000000000000000000000000000000000000000..656bb835a8a91f0e27a82fdd90c03025b24ee648 GIT binary patch literal 9440 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 None + logger.info('%s: %s', name, value) + + +def show_sys_implementation(): + # type: () -> None + logger.info('sys.implementation:') + if hasattr(sys, 'implementation'): + implementation = sys.implementation # type: ignore + implementation_name = implementation.name + else: + implementation_name = '' + + with indent_log(): + show_value('name', implementation_name) + + +def create_vendor_txt_map(): + # type: () -> Dict[str, str] + vendor_txt_path = os.path.join( + os.path.dirname(pip_location), + '_vendor', + 'vendor.txt' + ) + + with open(vendor_txt_path) as f: + # Purge non version specifying lines. + # Also, remove any space prefix or suffixes (including comments). + lines = [line.strip().split(' ', 1)[0] + for line in f.readlines() if '==' in line] + + # Transform into "module" -> version dict. + return dict(line.split('==', 1) for line in lines) # type: ignore + + +def get_module_from_module_name(module_name): + # type: (str) -> ModuleType + # Module name can be uppercase in vendor.txt for some reason... + module_name = module_name.lower() + # PATCH: setuptools is actually only pkg_resources. + if module_name == 'setuptools': + module_name = 'pkg_resources' + + __import__( + 'pip._vendor.{}'.format(module_name), + globals(), + locals(), + level=0 + ) + return getattr(pip._vendor, module_name) + + +def get_vendor_version_from_module(module_name): + # type: (str) -> Optional[str] + module = get_module_from_module_name(module_name) + version = getattr(module, '__version__', None) + + if not version: + # Try to find version in debundled module info + # The type for module.__file__ is Optional[str] in + # Python 2, and str in Python 3. The type: ignore is + # added to account for Python 2, instead of a cast + # and should be removed once we drop Python 2 support + pkg_set = pkg_resources.WorkingSet( + [os.path.dirname(module.__file__)] # type: ignore + ) + package = pkg_set.find(pkg_resources.Requirement.parse(module_name)) + version = getattr(package, 'version', None) + + return version + + +def show_actual_vendor_versions(vendor_txt_versions): + # type: (Dict[str, str]) -> None + """Log the actual version and print extra info if there is + a conflict or if the actual version could not be imported. + """ + for module_name, expected_version in vendor_txt_versions.items(): + extra_message = '' + actual_version = get_vendor_version_from_module(module_name) + if not actual_version: + extra_message = ' (Unable to locate actual module version, using'\ + ' vendor.txt specified version)' + actual_version = expected_version + elif actual_version != expected_version: + extra_message = ' (CONFLICT: vendor.txt suggests version should'\ + ' be {})'.format(expected_version) + logger.info('%s==%s%s', module_name, actual_version, extra_message) + + +def show_vendor_versions(): + # type: () -> None + logger.info('vendored library versions:') + + vendor_txt_versions = create_vendor_txt_map() + with indent_log(): + show_actual_vendor_versions(vendor_txt_versions) + + +def show_tags(options): + # type: (Values) -> None + tag_limit = 10 + + target_python = make_target_python(options) + tags = target_python.get_tags() + + # Display the target options that were explicitly provided. + formatted_target = target_python.format_given() + suffix = '' + if formatted_target: + suffix = ' (target: {})'.format(formatted_target) + + msg = 'Compatible tags: {}{}'.format(len(tags), suffix) + logger.info(msg) + + if options.verbose < 1 and len(tags) > tag_limit: + tags_limited = True + tags = tags[:tag_limit] + else: + tags_limited = False + + with indent_log(): + for tag in tags: + logger.info(str(tag)) + + if tags_limited: + msg = ( + '...\n' + '[First {tag_limit} tags shown. Pass --verbose to show all.]' + ).format(tag_limit=tag_limit) + logger.info(msg) + + +def ca_bundle_info(config): + # type: (Configuration) -> str + levels = set() + for key, _ in config.items(): + levels.add(key.split('.')[0]) + + if not levels: + return "Not specified" + + levels_that_override_global = ['install', 'wheel', 'download'] + global_overriding_level = [ + level for level in levels if level in levels_that_override_global + ] + if not global_overriding_level: + return 'global' + + if 'global' in levels: + levels.remove('global') + return ", ".join(levels) + + +class DebugCommand(Command): + """ + Display debug information. + """ + + usage = """ + %prog """ + ignore_require_venv = True + + def add_options(self): + # type: () -> None + cmdoptions.add_target_python_options(self.cmd_opts) + self.parser.insert_option_group(0, self.cmd_opts) + self.parser.config.load() + + def run(self, options, args): + # type: (Values, List[str]) -> int + logger.warning( + "This command is only meant for debugging. " + "Do not use this with automation for parsing and getting these " + "details, since the output and options of this command may " + "change without notice." + ) + show_value('pip version', get_pip_version()) + show_value('sys.version', sys.version) + show_value('sys.executable', sys.executable) + show_value('sys.getdefaultencoding', sys.getdefaultencoding()) + show_value('sys.getfilesystemencoding', sys.getfilesystemencoding()) + show_value( + 'locale.getpreferredencoding', locale.getpreferredencoding(), + ) + show_value('sys.platform', sys.platform) + show_sys_implementation() + + show_value("'cert' config value", ca_bundle_info(self.parser.config)) + show_value("REQUESTS_CA_BUNDLE", os.environ.get('REQUESTS_CA_BUNDLE')) + show_value("CURL_CA_BUNDLE", os.environ.get('CURL_CA_BUNDLE')) + show_value("pip._vendor.certifi.where()", where()) + show_value("pip._vendor.DEBUNDLED", pip._vendor.DEBUNDLED) + + show_vendor_versions() + + show_tags(options) + + return SUCCESS diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/debug.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/debug.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84efd63ebe02b6f5a1353bce1d0883e6e8f5417c GIT binary patch literal 7842 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 LNZai<+ZX>2quTAH literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/download.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/download.py new file mode 100644 index 0000000..46e8371 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/download.py @@ -0,0 +1,143 @@ +from __future__ import absolute_import + +import logging +import os + +from pip._internal.cli import cmdoptions +from pip._internal.cli.cmdoptions import make_target_python +from pip._internal.cli.req_command import RequirementCommand, with_cleanup +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.req.req_tracker import get_requirement_tracker +from pip._internal.utils.misc import ensure_dir, normalize_path, write_output +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from optparse import Values + from typing import List + +logger = logging.getLogger(__name__) + + +class DownloadCommand(RequirementCommand): + """ + Download packages from: + + - PyPI (and other indexes) using requirement specifiers. + - VCS project urls. + - Local project directories. + - Local or remote source archives. + + pip also supports downloading from "requirements files", which provide + an easy way to specify a whole environment to be downloaded. + """ + + usage = """ + %prog [options] [package-index-options] ... + %prog [options] -r [package-index-options] ... + %prog [options] ... + %prog [options] ... + %prog [options] ...""" + + def add_options(self): + # type: () -> None + self.cmd_opts.add_option(cmdoptions.constraints()) + self.cmd_opts.add_option(cmdoptions.requirements()) + self.cmd_opts.add_option(cmdoptions.build_dir()) + self.cmd_opts.add_option(cmdoptions.no_deps()) + self.cmd_opts.add_option(cmdoptions.global_options()) + self.cmd_opts.add_option(cmdoptions.no_binary()) + self.cmd_opts.add_option(cmdoptions.only_binary()) + self.cmd_opts.add_option(cmdoptions.prefer_binary()) + self.cmd_opts.add_option(cmdoptions.src()) + self.cmd_opts.add_option(cmdoptions.pre()) + self.cmd_opts.add_option(cmdoptions.require_hashes()) + self.cmd_opts.add_option(cmdoptions.progress_bar()) + self.cmd_opts.add_option(cmdoptions.no_build_isolation()) + self.cmd_opts.add_option(cmdoptions.use_pep517()) + self.cmd_opts.add_option(cmdoptions.no_use_pep517()) + + self.cmd_opts.add_option( + '-d', '--dest', '--destination-dir', '--destination-directory', + dest='download_dir', + metavar='dir', + default=os.curdir, + help=("Download packages into ."), + ) + + cmdoptions.add_target_python_options(self.cmd_opts) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, self.cmd_opts) + + @with_cleanup + def run(self, options, args): + # type: (Values, List[str]) -> int + + options.ignore_installed = True + # editable doesn't really make sense for `pip download`, but the bowels + # of the RequirementSet code require that property. + options.editables = [] + + cmdoptions.check_dist_restriction(options) + + options.download_dir = normalize_path(options.download_dir) + + ensure_dir(options.download_dir) + + session = self.get_default_session(options) + + target_python = make_target_python(options) + finder = self._build_package_finder( + options=options, + session=session, + target_python=target_python, + ) + build_delete = (not (options.no_clean or options.build_dir)) + + req_tracker = self.enter_context(get_requirement_tracker()) + + directory = TempDirectory( + options.build_dir, + delete=build_delete, + kind="download", + globally_managed=True, + ) + + reqs = self.get_requirements(args, options, finder, session) + + preparer = self.make_requirement_preparer( + temp_build_dir=directory, + options=options, + req_tracker=req_tracker, + session=session, + finder=finder, + download_dir=options.download_dir, + use_user_site=False, + ) + + resolver = self.make_resolver( + preparer=preparer, + finder=finder, + options=options, + py_version_info=options.python_version, + ) + + self.trace_basic_info(finder) + + requirement_set = resolver.resolve( + reqs, check_supported_wheels=True + ) + + downloaded = ' '.join([req.name # type: ignore + for req in requirement_set.requirements.values() + if req.successfully_downloaded]) + if downloaded: + write_output('Successfully downloaded %s', downloaded) + + return SUCCESS diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/download.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/download.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7b9f47f246e4f599c8f36fd4257575d909b3414 GIT binary patch literal 4737 zcmb_f-EJGl6+TN+lqgXWW!aMamo9=NV2em<0yO{)2bg|kUiA(Qa zc4p-;5U*4e=zH{{FVH9HWiR^(eSv=G%#xyFHW!6OaXEA5%$f81&DrLE)>r@a*MImS z)qhR=K6yfM^kBvU*Z^AP%d#Ml4kl|@?s`I2W%8%0`FU_%CS;b12 zMtNc4JkyqT3$!$Nt$Y)d=gRoS*bMWm-(X3+=BaP0xKydi%u$}EK^B=V$ZujZ^ut62 zSyfm;%b=cod35yo$%!TGg1{2XYYDz7gYdN~`y5Qe>ZnXtrShY=G#i*^d6@=D{GIZP zzzpq4Wehv=$`qBcg4euLTbOY$J9?VDvB``|ZEkZ~VlpokLRY9M z>{dF?&fPipxw=qcd={%xAJm(_Iy!NSG9SSaZdE2T`tv*tlGzH}E1rtg_ZadL^3&WX zSLan3DmN&@VSK@CazGImZjk8Q)m6cXq}`}?7OTc)xbM#?2+QI`>GwZ&-wfk$$md_g zkrGis=BhxC-8aG5H4rGKjNJgNd7@mEUBqRcah~z=shXXnB5SO^KXs_8e2!ryh^?DC*Ls!$b+uF4ZInB2xiCCw&g^vF1?k zN1CB+e?L;%=&ji>&H~2xeH6ZC9JUN|R12Jjfr_^Z(oRcT(3s&oRVKIyO2cT)2+g!e zods25Wam&Ng?TRmrSMNn#0nr#f@j7PN$ z%VKYKxu8^XCVE-{9FsowkUaEbj1Em&9O4Q9dTJ9S$^NI$M&EswGD*HZVx-C}NDf2W z8tB7m4jrJ6;9y<{SpNi5{TUwA*l~W~)95&xP8*+&v)t@8c+_ofJ0VAhdmH`=y!{<1 zV}NiD`3{}iL4y#zQA>)5>urfgBcK*)418@u63-}7V=Fc9q)A8^tbug`0Vp|?v1~)N zU!vNZbjeWJoLHf2RQyF`b*VdP%Z7DA&RB?@EORHuM|Bw|E&&o#sDRE_PIH2TaYm0W zAsxp+DB!t86DR@t79+|fK*eeRA~444vC7N<7;6U*14(#A%M;MC5%9B4mr&iZ+3g#` zd>d@72{wZ54hxa1V2wrqqYg!z?9D63nLy(njdsPSU5231UAF4!*LyU9>~$L5qcU}P zaG(Cvpl?!#orXg;sQjB_9#FK!V+JgAvgRQ$i|gcA5M)}Nj3ydogi@9IxRLi#7?Dbp zQ35ruk)#42(*!d;Y`67}l15*O#wwDEHE0d%dgQX=EJP7cTTc;u#wlNVEJBXvy2Q8i zHF`}s2IY@BLh*366=VMbJr@*3#-HV82efdg!qt);zb^kpqi&bBgl@deZb9BDw)@_}^5XLzb#U?mKKV`A;`qT)WE81$HWE?Wm zd5o)KjmJ)v(&x^*#%jOzvd5TX?%+|or*4jX>khFSASGSBCwR@Ug@z1{0Vo^wt??LO zJZ{{r|8KVUS};sdY7VshnJ<^H@3&|tl{mfT17yOv5;^`koDh z>AXo?ILhP9+hc`TwF~L-4PSYB&j0>2Yv5UizAQ+U$1e6*C3%7J_IdhKJcI);L)!a< zNuToLmrQ5uukRj7Oz#&=WiiOJxeFDxYwy>*#&M~YwV5>U7Pvuf8qfrWuXTL4FwD4F zR@pIrw1)?^I?YaFy>ScQ%|;h6D`4B$2BkTjHTM9+Ot+togFW@Q+gt}IZ(_df+y|}K z=u6hIvA)l)^?fnO_tQM85}q=Hk0^u~v&$=ua`g@|@;Dye0FP^{W%LeiAdg=uxokA+ z)?RBbw;P=g`ai;?R`9Gc{QBvOUqs6!KR?I2jrS2V@uiE)?qGJ&9fV12tMS32rGx9Y zYg=sG9K9vr01-z)$;-6I(GedQMuoR|aq*f;gB@*}WGm40`+SfmGV8Z%DN@5VaZ_An zV!R-xu?__$ENXE202f)58VhqAMg{Y-E+1Zo6Y|MhX{MG literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/freeze.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/freeze.py new file mode 100644 index 0000000..2071fba --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/freeze.py @@ -0,0 +1,103 @@ +from __future__ import absolute_import + +import sys + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.models.format_control import FormatControl +from pip._internal.operations.freeze import freeze +from pip._internal.utils.compat import stdlib_pkgs +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +DEV_PKGS = {'pip', 'setuptools', 'distribute', 'wheel'} + +if MYPY_CHECK_RUNNING: + from optparse import Values + from typing import List + + +class FreezeCommand(Command): + """ + Output installed packages in requirements format. + + packages are listed in a case-insensitive sorted order. + """ + + usage = """ + %prog [options]""" + log_streams = ("ext://sys.stderr", "ext://sys.stderr") + + def add_options(self): + # type: () -> None + self.cmd_opts.add_option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help="Use the order in the given requirements file and its " + "comments when generating output. This option can be " + "used multiple times.") + self.cmd_opts.add_option( + '-f', '--find-links', + dest='find_links', + action='append', + default=[], + metavar='URL', + help='URL for finding packages, which will be added to the ' + 'output.') + self.cmd_opts.add_option( + '-l', '--local', + dest='local', + action='store_true', + default=False, + help='If in a virtualenv that has global access, do not output ' + 'globally-installed packages.') + self.cmd_opts.add_option( + '--user', + dest='user', + action='store_true', + default=False, + help='Only output packages installed in user-site.') + self.cmd_opts.add_option(cmdoptions.list_path()) + self.cmd_opts.add_option( + '--all', + dest='freeze_all', + action='store_true', + help='Do not skip these packages in the output:' + ' {}'.format(', '.join(DEV_PKGS))) + self.cmd_opts.add_option( + '--exclude-editable', + dest='exclude_editable', + action='store_true', + help='Exclude editable package from output.') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + # type: (Values, List[str]) -> int + format_control = FormatControl(set(), set()) + wheel_cache = WheelCache(options.cache_dir, format_control) + skip = set(stdlib_pkgs) + if not options.freeze_all: + skip.update(DEV_PKGS) + + cmdoptions.check_list_path_option(options) + + freeze_kwargs = dict( + requirement=options.requirements, + find_links=options.find_links, + local_only=options.local, + user_only=options.user, + paths=options.path, + isolated=options.isolated_mode, + wheel_cache=wheel_cache, + skip=skip, + exclude_editable=options.exclude_editable, + ) + + for line in freeze(**freeze_kwargs): + sys.stdout.write(line + '\n') + return SUCCESS diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/freeze.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/freeze.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb8ebae6f61fdc87b5369ee6e839c8da15667e98 GIT binary patch literal 3705 zcmb_fUvC@75uYPPQj#T^k}Sz_^XG~n1q+x|(TAc)gF>k6q()phI8_PEAUK@vmgG@; ze{#ELTdDM7%#soh8s>^A$^~+E)Ba*UM0Or*%l4AAm5{8 zjgoarHfVw^Y?Ioe>L0SN`=lRGwnM`mXV)dYOW7U`_sGi;!zQU^8hMm#(VvN~h+YmK za%9K7ZA6{oOFa*by^kh3HHEIN3e&7CDtqK+Rx$IyW>ElQT8)286K z$I+QLXjXmvdr{l6wtku$8)>Z)zl`FuXsir|{7QXarZL=9HO>{=_Tl&`T> zSi&Ik0RYx*(e3gRt>I*oYYcBh)q}9U22_%ap88vPyvKRiowI7&z?0 zVB?O#eKF|XGT3Ce@(SBx@PJpaSQEZ?pt`i+dsp=K?&v+FD{ny$IGHXn{I5{kH#>Vz ztRKy-;r}NzMNIG0v`x0d+VW{G*nA*1A1>H@1SO}jOjD%5pC#+6AvJm2`zaE6WEevI z%5YZu{e`2p48KGHerxC~Oc=}9iDIrX*DXtxC)gM3kD^*z>1WDDucAu)j8d(nGf}!U zm(V;h%C{5c5W%2fVGO9;#v3es)UKZbd@<@+P>8C@{jthb71=Z&`-R|l;Qw)w8sEVP z7|i`s<<|zd%dn}mgeRM33W$=RM}{No_eW`-^mUq_xdLS|bRw7WN$}i!=6)IcK2P(K zbL>C%Ur*9_;=fL{=Jlc^!GgAM(YbxO^|av>_4~SrBQ3@6dO{Mms8nbx6#og7o{d}` zy-F)vM_T2t;4ZTMBr^V37pIZ-qc~Q^Job~q&kH-tz-&^VbMf6O<$>XI>-UimcPQKu z;&_qk^SOh0SXh7V0Efe>eU!2q7$&WLA1onk<_I!`D4w3U&6u;aqPZclG^ALXmK1MgW-J8d;;C4PSc+c&X@2NAEG%zLyZ-0#cR+0I?cDFg}Dy;*IM50g3b1Iztf1h0yu#j zpOEgq(6RV{g61s<<+904c;V5sNf%9!Azd!94iX2Zx@^f*i_CMnXx)$)KLwCckP|GK z0s$%TIJ?2y!ubPB!zD)W&RCL;&^3>MrQ0&nWhTA=?=Q1^&^^y?VuLG}ZFk3a>s`;zf%NBTpq!P&^NfjXtlS8Heh>sH{iVx@VNLFqcBOU zfVm_1fXBIv>oS4+fa}3Qmv2+}kIz6|GXT#)E<~QjHrQlsjwE=*&HHF%KZ16?0Oq?6 zvm#Nl!+;la+d6l|kJ}h*>)tLE7$IQyJ;q4D&=%^SUF70Cs>a4{V8)eF7`r!Cu+J91 zU<+P(#v^C1MV(!OftA#XH2;6WFp{e}e}NzKGc?rL@wU7*fW6yTZ?y4y^T&m;*4*|U zdOhZacfLp7IoRV<5&(o@9%U*F1vDWiwAL)LLKr4Rj6NTEZSc$zl;~m{;%TU&%mhEj zOmKkaCIdfC8UlV$@8D|~%z)3@}8&uX%#YAG9>Mrlf%Y z)8Uk1b!$?m4wVe@J5z&Gybgf_;k1Cy#lBk)7m%$DH1P}(nAwl-_+zAMGq?pVDW;F^ zC>NzX81R3Cfdia_H&?^kyR2;rr`RG&Ln_byFCBYc;x!N~!-Z6%96swXmU^A3 maUIAJ{MhFz%YNoi_FHBT!`0nwtTnpcTYrr$V7=>YH~$M;5N99& literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/hash.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/hash.py new file mode 100644 index 0000000..37831c3 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/hash.py @@ -0,0 +1,63 @@ +from __future__ import absolute_import + +import hashlib +import logging +import sys + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.utils.hashes import FAVORITE_HASH, STRONG_HASHES +from pip._internal.utils.misc import read_chunks, write_output +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from optparse import Values + from typing import List + +logger = logging.getLogger(__name__) + + +class HashCommand(Command): + """ + Compute a hash of a local package archive. + + These can be used with --hash in a requirements file to do repeatable + installs. + """ + + usage = '%prog [options] ...' + ignore_require_venv = True + + def add_options(self): + # type: () -> None + self.cmd_opts.add_option( + '-a', '--algorithm', + dest='algorithm', + choices=STRONG_HASHES, + action='store', + default=FAVORITE_HASH, + help='The hash algorithm to use: one of {}'.format( + ', '.join(STRONG_HASHES))) + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + # type: (Values, List[str]) -> int + if not args: + self.parser.print_usage(sys.stderr) + return ERROR + + algorithm = options.algorithm + for path in args: + write_output('%s:\n--hash=%s:%s', + path, algorithm, _hash_of_file(path, algorithm)) + return SUCCESS + + +def _hash_of_file(path, algorithm): + # type: (str, str) -> str + """Return the hash digest of a file.""" + with open(path, 'rb') as archive: + hash = hashlib.new(algorithm) + for chunk in read_chunks(archive): + hash.update(chunk) + return hash.hexdigest() diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/hash.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/hash.pyc new file mode 100644 index 0000000000000000000000000000000000000000..362808870f649b723f94edd4ea7a0b0af0d200b3 GIT binary patch literal 2639 zcmb_d+iu%N5FL^dZOL-&M7j6IqzNFjkqq>qD2z04>bP;xRB0(EZde!uO|B#=yoI~W zrL~{jmp&Bznm+eK`V~cgpl6nfg+Amdk;K*P?(FQ$oHIk~-_`ctzy0ZlH2+xm-`XOQ z|3HZFGbkZS4e|^!cy3Z+l4t5Y$QF6lYq>#QL(3K=O-gO@?D|ZDk|j!)$y=thMP933 zZBo*vbcMVXN;~9r>Q$SPRZ8C@?>$P_$Xlydmnd1M^bC1t$Pj0!{7c`nOvzbFyX19i ztrjKcC_PW!c``C0VbSaYiHmds_b*Y@CSlXqplF4DB|0H`;$5bw!xQfcM>guMBI+0q z^$ZMZ4MT7!^Q2P3kJBPA)v(@K!p?S{ra>0x8v{L8SN@w8SS|bhxhb+XRf${8 z2P5!B&MXqZw8^RA9N83ET38}?)ML}~cMNR@AJ~P1!U>!yZgKK4q$Cf6#3_RCX)wV~ z8BXKpV$jz5ds88W69$=cD4a@)$axW~snhT4<8g-LrFd4wrAS4lq%)2a;i%k+a;z63 zP{Cm$w52$cDo7GJ&@*`j9^EL)eB%6+7b?y(dEngQ)3=?$U=VV={4lcHTZrHQ!V%F7 zKZK4SLIA~6oCL}?pSkreVe zG?CaEf>UFhHe`6y$uq&g{Bo?Fx#`qIU&bNDLzqTBQYKZKFO2jAm%7Ysm;Kb9jPo)L z>N{t7oawb9D5WS>7dk)#65GL1e^TaEv0$PU$+!n4(u3TDw4u^sqlk9=cy7FIb74pXDP58=op z`QZY4fIYJqP6G)Y9T^Pqu|+RGWyQM(*XX#x8309&8gyh4AgBcZebOM~S)cZi$GVh< zave9^keltA(O*HlA$tt6dl7?nz9~$eZYS%vgauX4taS+pGg?U$~s>~eqx{{-Kf;Le1 zR0e(ksv`Y|!ydN=jc#6`OR|qlkR(3Te9FWNS8MQ46;YssZZlKyvNl7c`x1{%Hd$wlHIV0`(R-hrU;uo7Tpl20aa zHgP}T1vY~|F*xlJgD{B)hk+FSyji%$oAvP4P?dxx+HYNJ41i*S{oiP%V!T~A7f@t^ z>W-)`y+JXJWvJ6$m+hPEsaFLDa#|;-T-`=p?h(4H&NVn68a8x^2MAx3?kBHRI31WX td0o!N0-|?O6uN$I)fIc2GbuUk>t@Hm*IYL)=nSYu1J9{{faDNO=GN literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/help.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/help.py new file mode 100644 index 0000000..a2edc29 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/help.py @@ -0,0 +1,44 @@ +from __future__ import absolute_import + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.exceptions import CommandError +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List + from optparse import Values + + +class HelpCommand(Command): + """Show help for commands""" + + usage = """ + %prog """ + ignore_require_venv = True + + def run(self, options, args): + # type: (Values, List[str]) -> int + from pip._internal.commands import ( + commands_dict, create_command, get_similar_commands, + ) + + try: + # 'pip help' with no args is handled by pip.__init__.parseopt() + cmd_name = args[0] # the command we need help for + except IndexError: + return SUCCESS + + if cmd_name not in commands_dict: + guess = get_similar_commands(cmd_name) + + msg = ['unknown command "{}"'.format(cmd_name)] + if guess: + msg.append('maybe you meant "{}"'.format(guess)) + + raise CommandError(' - '.join(msg)) + + command = create_command(cmd_name) + command.parser.print_help() + + return SUCCESS diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/help.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/help.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83e99aa4f37689c39dfa8c7d550e57a98a78e7d0 GIT binary patch literal 1669 zcmb_c&2HO95S}F|>c^I2I7JZ`K|!P_z>8&|haQ5!Fe(_0kya?ErmcBd(BfL5yh}2> z%Oq;0OOiu-&I|MlfBeN~u=)7-JUs<4 z@9>i2kAVbG3{nP+bPuEl%7@f%bsuB^ssm}K)dP?rs4k@4R_}o9f$Brr2PXQUmo94v zasX-v(w#P{3vw6K5Yi#A607t;_;AG_@55VwHvkvu9^?a<#yi+ofd^uS!rnoVU7AWZ zR`5dAmA0*;i;i)nR95Dkg`1tYJ_z6#*PA2D* zZ(Co0zV8aNsSu*}Qzjc>EH(95$a+)o22E=5n^Q#d3%m#*5D~-FBUlkY5fE$$DbARN zkW6EO-+YQ<`mA~xJ;RjIRi&d@JBV?vLF7JP*1DQUk2bE88U1yDr-NsFifR7F3)Z2H zxecy;P#&ytTRyCDTgyFIxlRt(A^cn(Kwty79)Lap#+dEE^p{l#D<7`Ap#Owb2T*;( zVBLk>hXuNvI!8+nRv7a;ta`9OZ{WOL3dSET)b=3nz@kqPt@Sknw6B6~QgroUF@VJm zt=pB43E@e*Y?{svQEZ{$c`>tgk1SebxcrU7euAdCu-p`?keS}vjUh)a7gs>lb{7y66a+u zUO8GN9@%IV+@#8^yJmGQ$~udT!qDfm)iWoR^srxJrZsd1@>bRA%l{Y}${}1WuTTcssVLKE^qZ3e28KdGyu! z;@7VgncTS<|9Ct8F||0VmoB+(O2XOPr>x%n!1wmpkafIWw(A|RkR5vW@ILfn8Uk4X zz+I1=yO}vxRo+N}Dg|(!S2MiR0FB9Ttu*hCx)Js+UW$2HX~DI4-W2$JA<7rYA=+<8 z`WSO1)Cp0~P`e=ueLUVIrdQ9V>8r*z*Z@z^1om?j?=eLdqsz?PkTh}cuK$li)NNys zwz)7ZckX?VPrRCmmH;h BinaryAllowedPredicate + def check_binary_allowed(req): + # type: (InstallRequirement) -> bool + if req.use_pep517: + return True + canonical_name = canonicalize_name(req.name) + allowed_formats = format_control.get_allowed_formats(canonical_name) + return "binary" in allowed_formats + + return check_binary_allowed + + +class InstallCommand(RequirementCommand): + """ + Install packages from: + + - PyPI (and other indexes) using requirement specifiers. + - VCS project urls. + - Local project directories. + - Local or remote source archives. + + pip also supports installing from "requirements files", which provide + an easy way to specify a whole environment to be installed. + """ + + usage = """ + %prog [options] [package-index-options] ... + %prog [options] -r [package-index-options] ... + %prog [options] [-e] ... + %prog [options] [-e] ... + %prog [options] ...""" + + def add_options(self): + # type: () -> None + self.cmd_opts.add_option(cmdoptions.requirements()) + self.cmd_opts.add_option(cmdoptions.constraints()) + self.cmd_opts.add_option(cmdoptions.no_deps()) + self.cmd_opts.add_option(cmdoptions.pre()) + + self.cmd_opts.add_option(cmdoptions.editable()) + self.cmd_opts.add_option( + '-t', '--target', + dest='target_dir', + metavar='dir', + default=None, + help='Install packages into . ' + 'By default this will not replace existing files/folders in ' + '. Use --upgrade to replace existing packages in ' + 'with new versions.' + ) + cmdoptions.add_target_python_options(self.cmd_opts) + + self.cmd_opts.add_option( + '--user', + dest='use_user_site', + action='store_true', + help="Install to the Python user install directory for your " + "platform. Typically ~/.local/, or %APPDATA%\\Python on " + "Windows. (See the Python documentation for site.USER_BASE " + "for full details.)") + self.cmd_opts.add_option( + '--no-user', + dest='use_user_site', + action='store_false', + help=SUPPRESS_HELP) + self.cmd_opts.add_option( + '--root', + dest='root_path', + metavar='dir', + default=None, + help="Install everything relative to this alternate root " + "directory.") + self.cmd_opts.add_option( + '--prefix', + dest='prefix_path', + metavar='dir', + default=None, + help="Installation prefix where lib, bin and other top-level " + "folders are placed") + + self.cmd_opts.add_option(cmdoptions.build_dir()) + + self.cmd_opts.add_option(cmdoptions.src()) + + self.cmd_opts.add_option( + '-U', '--upgrade', + dest='upgrade', + action='store_true', + help='Upgrade all specified packages to the newest available ' + 'version. The handling of dependencies depends on the ' + 'upgrade-strategy used.' + ) + + self.cmd_opts.add_option( + '--upgrade-strategy', + dest='upgrade_strategy', + default='only-if-needed', + choices=['only-if-needed', 'eager'], + help='Determines how dependency upgrading should be handled ' + '[default: %default]. ' + '"eager" - dependencies are upgraded regardless of ' + 'whether the currently installed version satisfies the ' + 'requirements of the upgraded package(s). ' + '"only-if-needed" - are upgraded only when they do not ' + 'satisfy the requirements of the upgraded package(s).' + ) + + self.cmd_opts.add_option( + '--force-reinstall', + dest='force_reinstall', + action='store_true', + help='Reinstall all packages even if they are already ' + 'up-to-date.') + + self.cmd_opts.add_option( + '-I', '--ignore-installed', + dest='ignore_installed', + action='store_true', + help='Ignore the installed packages, overwriting them. ' + 'This can break your system if the existing package ' + 'is of a different version or was installed ' + 'with a different package manager!' + ) + + self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) + self.cmd_opts.add_option(cmdoptions.no_build_isolation()) + self.cmd_opts.add_option(cmdoptions.use_pep517()) + self.cmd_opts.add_option(cmdoptions.no_use_pep517()) + + self.cmd_opts.add_option(cmdoptions.install_options()) + self.cmd_opts.add_option(cmdoptions.global_options()) + + self.cmd_opts.add_option( + "--compile", + action="store_true", + dest="compile", + default=True, + help="Compile Python source files to bytecode", + ) + + self.cmd_opts.add_option( + "--no-compile", + action="store_false", + dest="compile", + help="Do not compile Python source files to bytecode", + ) + + self.cmd_opts.add_option( + "--no-warn-script-location", + action="store_false", + dest="warn_script_location", + default=True, + help="Do not warn when installing scripts outside PATH", + ) + self.cmd_opts.add_option( + "--no-warn-conflicts", + action="store_false", + dest="warn_about_conflicts", + default=True, + help="Do not warn about broken dependencies", + ) + + self.cmd_opts.add_option(cmdoptions.no_binary()) + self.cmd_opts.add_option(cmdoptions.only_binary()) + self.cmd_opts.add_option(cmdoptions.prefer_binary()) + self.cmd_opts.add_option(cmdoptions.require_hashes()) + self.cmd_opts.add_option(cmdoptions.progress_bar()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, self.cmd_opts) + + @with_cleanup + def run(self, options, args): + # type: (Values, List[str]) -> int + if options.use_user_site and options.target_dir is not None: + raise CommandError("Can not combine '--user' and '--target'") + + cmdoptions.check_install_build_global(options) + upgrade_strategy = "to-satisfy-only" + if options.upgrade: + upgrade_strategy = options.upgrade_strategy + + cmdoptions.check_dist_restriction(options, check_target=True) + + install_options = options.install_options or [] + + logger.debug("Using %s", get_pip_version()) + options.use_user_site = decide_user_install( + options.use_user_site, + prefix_path=options.prefix_path, + target_dir=options.target_dir, + root_path=options.root_path, + isolated_mode=options.isolated_mode, + ) + + target_temp_dir = None # type: Optional[TempDirectory] + target_temp_dir_path = None # type: Optional[str] + if options.target_dir: + options.ignore_installed = True + options.target_dir = os.path.abspath(options.target_dir) + if (os.path.exists(options.target_dir) and not + os.path.isdir(options.target_dir)): + raise CommandError( + "Target path exists but is not a directory, will not " + "continue." + ) + + # Create a target directory for using with the target option + target_temp_dir = TempDirectory(kind="target") + target_temp_dir_path = target_temp_dir.path + self.enter_context(target_temp_dir) + + global_options = options.global_options or [] + + session = self.get_default_session(options) + + target_python = make_target_python(options) + finder = self._build_package_finder( + options=options, + session=session, + target_python=target_python, + ignore_requires_python=options.ignore_requires_python, + ) + build_delete = (not (options.no_clean or options.build_dir)) + wheel_cache = WheelCache(options.cache_dir, options.format_control) + + req_tracker = self.enter_context(get_requirement_tracker()) + + directory = TempDirectory( + options.build_dir, + delete=build_delete, + kind="install", + globally_managed=True, + ) + + try: + reqs = self.get_requirements(args, options, finder, session) + + reject_location_related_install_options( + reqs, options.install_options + ) + + preparer = self.make_requirement_preparer( + temp_build_dir=directory, + options=options, + req_tracker=req_tracker, + session=session, + finder=finder, + use_user_site=options.use_user_site, + ) + resolver = self.make_resolver( + preparer=preparer, + finder=finder, + options=options, + wheel_cache=wheel_cache, + use_user_site=options.use_user_site, + ignore_installed=options.ignore_installed, + ignore_requires_python=options.ignore_requires_python, + force_reinstall=options.force_reinstall, + upgrade_strategy=upgrade_strategy, + use_pep517=options.use_pep517, + ) + + self.trace_basic_info(finder) + + requirement_set = resolver.resolve( + reqs, check_supported_wheels=not options.target_dir + ) + + try: + pip_req = requirement_set.get_requirement("pip") + except KeyError: + modifying_pip = False + else: + # If we're not replacing an already installed pip, + # we're not modifying it. + modifying_pip = pip_req.satisfied_by is None + protect_pip_from_modification_on_windows( + modifying_pip=modifying_pip + ) + + check_binary_allowed = get_check_binary_allowed( + finder.format_control + ) + + reqs_to_build = [ + r for r in requirement_set.requirements.values() + if should_build_for_install_command( + r, check_binary_allowed + ) + ] + + _, build_failures = build( + reqs_to_build, + wheel_cache=wheel_cache, + build_options=[], + global_options=[], + ) + + # If we're using PEP 517, we cannot do a direct install + # so we fail here. + pep517_build_failure_names = [ + r.name # type: ignore + for r in build_failures if r.use_pep517 + ] # type: List[str] + if pep517_build_failure_names: + raise InstallationError( + "Could not build wheels for {} which use" + " PEP 517 and cannot be installed directly".format( + ", ".join(pep517_build_failure_names) + ) + ) + + # For now, we just warn about failures building legacy + # requirements, as we'll fall through to a direct + # install for those. + for r in build_failures: + if not r.use_pep517: + r.legacy_install_reason = 8368 + + to_install = resolver.get_installation_order( + requirement_set + ) + + # Check for conflicts in the package set we're installing. + conflicts = None # type: Optional[ConflictDetails] + should_warn_about_conflicts = ( + not options.ignore_dependencies and + options.warn_about_conflicts + ) + if should_warn_about_conflicts: + conflicts = self._determine_conflicts(to_install) + + # Don't warn about script install locations if + # --target has been specified + warn_script_location = options.warn_script_location + if options.target_dir: + warn_script_location = False + + installed = install_given_reqs( + to_install, + install_options, + global_options, + root=options.root_path, + home=target_temp_dir_path, + prefix=options.prefix_path, + warn_script_location=warn_script_location, + use_user_site=options.use_user_site, + pycompile=options.compile, + ) + + lib_locations = get_lib_location_guesses( + user=options.use_user_site, + home=target_temp_dir_path, + root=options.root_path, + prefix=options.prefix_path, + isolated=options.isolated_mode, + ) + working_set = pkg_resources.WorkingSet(lib_locations) + + installed.sort(key=operator.attrgetter('name')) + items = [] + for result in installed: + item = result.name + try: + installed_version = get_installed_version( + result.name, working_set=working_set + ) + if installed_version: + item += '-' + installed_version + except Exception: + pass + items.append(item) + + if conflicts is not None: + self._warn_about_conflicts( + conflicts, + new_resolver='2020-resolver' in options.features_enabled, + ) + + installed_desc = ' '.join(items) + if installed_desc: + write_output( + 'Successfully installed %s', installed_desc, + ) + except EnvironmentError as error: + show_traceback = (self.verbosity >= 1) + + message = create_env_error_message( + error, show_traceback, options.use_user_site, + ) + logger.error(message, exc_info=show_traceback) # noqa + + return ERROR + + if options.target_dir: + assert target_temp_dir + self._handle_target_dir( + options.target_dir, target_temp_dir, options.upgrade + ) + + return SUCCESS + + def _handle_target_dir(self, target_dir, target_temp_dir, upgrade): + # type: (str, TempDirectory, bool) -> None + ensure_dir(target_dir) + + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + lib_dir_list = [] + + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + scheme = distutils_scheme('', home=target_temp_dir.path) + purelib_dir = scheme['purelib'] + platlib_dir = scheme['platlib'] + data_dir = scheme['data'] + + if os.path.exists(purelib_dir): + lib_dir_list.append(purelib_dir) + if os.path.exists(platlib_dir) and platlib_dir != purelib_dir: + lib_dir_list.append(platlib_dir) + if os.path.exists(data_dir): + lib_dir_list.append(data_dir) + + for lib_dir in lib_dir_list: + for item in os.listdir(lib_dir): + if lib_dir == data_dir: + ddir = os.path.join(data_dir, item) + if any(s.startswith(ddir) for s in lib_dir_list[:-1]): + continue + target_item_dir = os.path.join(target_dir, item) + if os.path.exists(target_item_dir): + if not upgrade: + logger.warning( + 'Target directory %s already exists. Specify ' + '--upgrade to force replacement.', + target_item_dir + ) + continue + if os.path.islink(target_item_dir): + logger.warning( + 'Target directory %s already exists and is ' + 'a link. pip will not automatically replace ' + 'links, please remove if replacement is ' + 'desired.', + target_item_dir + ) + continue + if os.path.isdir(target_item_dir): + shutil.rmtree(target_item_dir) + else: + os.remove(target_item_dir) + + shutil.move( + os.path.join(lib_dir, item), + target_item_dir + ) + + def _determine_conflicts(self, to_install): + # type: (List[InstallRequirement]) -> Optional[ConflictDetails] + try: + return check_install_conflicts(to_install) + except Exception: + logger.exception( + "Error while checking for conflicts. Please file an issue on " + "pip's issue tracker: https://github.com/pypa/pip/issues/new" + ) + return None + + def _warn_about_conflicts(self, conflict_details, new_resolver): + # type: (ConflictDetails, bool) -> None + package_set, (missing, conflicting) = conflict_details + if not missing and not conflicting: + return + + parts = [] # type: List[str] + if not new_resolver: + parts.append( + "After October 2020 you may experience errors when installing " + "or updating packages. This is because pip will change the " + "way that it resolves dependency conflicts.\n" + ) + parts.append( + "We recommend you use --use-feature=2020-resolver to test " + "your packages with the new resolver before it becomes the " + "default.\n" + ) + elif not today_is_later_than(year=2020, month=7, day=31): + # NOTE: trailing newlines here are intentional + parts.append( + "Pip will install or upgrade your package(s) and its " + "dependencies without taking into account other packages you " + "already have installed. This may cause an uncaught " + "dependency conflict.\n" + ) + form_link = "https://forms.gle/cWKMoDs8sUVE29hz9" + parts.append( + "If you would like pip to take your other packages into " + "account, please tell us here: {}\n".format(form_link) + ) + + # NOTE: There is some duplication here, with commands/check.py + for project_name in missing: + version = package_set[project_name][0] + for dependency in missing[project_name]: + message = ( + "{name} {version} requires {requirement}, " + "which is not installed." + ).format( + name=project_name, + version=version, + requirement=dependency[1], + ) + parts.append(message) + + for project_name in conflicting: + version = package_set[project_name][0] + for dep_name, dep_version, req in conflicting[project_name]: + message = ( + "{name} {version} requires {requirement}, but you'll have " + "{dep_name} {dep_version} which is incompatible." + ).format( + name=project_name, + version=version, + requirement=req, + dep_name=dep_name, + dep_version=dep_version, + ) + parts.append(message) + + logger.critical("\n".join(parts)) + + +def get_lib_location_guesses( + user=False, # type: bool + home=None, # type: Optional[str] + root=None, # type: Optional[str] + isolated=False, # type: bool + prefix=None # type: Optional[str] +): + # type:(...) -> List[str] + scheme = distutils_scheme('', user=user, home=home, root=root, + isolated=isolated, prefix=prefix) + return [scheme['purelib'], scheme['platlib']] + + +def site_packages_writable(root, isolated): + # type: (Optional[str], bool) -> bool + return all( + test_writable_dir(d) for d in set( + get_lib_location_guesses(root=root, isolated=isolated)) + ) + + +def decide_user_install( + use_user_site, # type: Optional[bool] + prefix_path=None, # type: Optional[str] + target_dir=None, # type: Optional[str] + root_path=None, # type: Optional[str] + isolated_mode=False, # type: bool +): + # type: (...) -> bool + """Determine whether to do a user install based on the input options. + + If use_user_site is False, no additional checks are done. + If use_user_site is True, it is checked for compatibility with other + options. + If use_user_site is None, the default behaviour depends on the environment, + which is provided by the other arguments. + """ + # In some cases (config from tox), use_user_site can be set to an integer + # rather than a bool, which 'use_user_site is False' wouldn't catch. + if (use_user_site is not None) and (not use_user_site): + logger.debug("Non-user install by explicit request") + return False + + if use_user_site: + if prefix_path: + raise CommandError( + "Can not combine '--user' and '--prefix' as they imply " + "different installation locations" + ) + if virtualenv_no_global(): + raise InstallationError( + "Can not perform a '--user' install. User site-packages " + "are not visible in this virtualenv." + ) + logger.debug("User install by explicit request") + return True + + # If we are here, user installs have not been explicitly requested/avoided + assert use_user_site is None + + # user install incompatible with --prefix/--target + if prefix_path or target_dir: + logger.debug("Non-user install due to --prefix or --target option") + return False + + # If user installs are not enabled, choose a non-user install + if not site.ENABLE_USER_SITE: + logger.debug("Non-user install because user site-packages disabled") + return False + + # If we have permission for a non-user install, do that, + # otherwise do a user install. + if site_packages_writable(root=root_path, isolated=isolated_mode): + logger.debug("Non-user install because site-packages writeable") + return False + + logger.info("Defaulting to user installation because normal site-packages " + "is not writeable") + return True + + +def reject_location_related_install_options(requirements, options): + # type: (List[InstallRequirement], Optional[List[str]]) -> None + """If any location-changing --install-option arguments were passed for + requirements or on the command-line, then show a deprecation warning. + """ + def format_options(option_names): + # type: (Iterable[str]) -> List[str] + return ["--{}".format(name.replace("_", "-")) for name in option_names] + + offenders = [] + + for requirement in requirements: + install_options = requirement.install_options + location_options = parse_distutils_args(install_options) + if location_options: + offenders.append( + "{!r} from {}".format( + format_options(location_options.keys()), requirement + ) + ) + + if options: + location_options = parse_distutils_args(options) + if location_options: + offenders.append( + "{!r} from command line".format( + format_options(location_options.keys()) + ) + ) + + if not offenders: + return + + raise CommandError( + "Location-changing options found in --install-option: {}." + " This is unsupported, use pip-level options like --user," + " --prefix, --root, and --target instead.".format( + "; ".join(offenders) + ) + ) + + +def create_env_error_message(error, show_traceback, using_user_site): + # type: (EnvironmentError, bool, bool) -> str + """Format an error message for an EnvironmentError + + It may occur anytime during the execution of the install command. + """ + parts = [] + + # Mention the error if we are not going to show a traceback + parts.append("Could not install packages due to an EnvironmentError") + if not show_traceback: + parts.append(": ") + parts.append(str(error)) + else: + parts.append(".") + + # Spilt the error indication from a helper message (if any) + parts[-1] += "\n" + + # Suggest useful actions to the user: + # (1) using user site-packages or (2) verifying the permissions + if error.errno == errno.EACCES: + user_option_part = "Consider using the `--user` option" + permissions_part = "Check the permissions" + + if not using_user_site: + parts.extend([ + user_option_part, " or ", + permissions_part.lower(), + ]) + else: + parts.append(permissions_part) + parts.append(".\n") + + return "".join(parts).strip() + "\n" diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/install.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/install.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d18c3c6dd6cac150751c67dd329b514b7cd37f60 GIT binary patch literal 19946 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 Xf&4%Y*~}N15Bo;PY None + self.cmd_opts.add_option( + '-o', '--outdated', + action='store_true', + default=False, + help='List outdated packages') + self.cmd_opts.add_option( + '-u', '--uptodate', + action='store_true', + default=False, + help='List uptodate packages') + self.cmd_opts.add_option( + '-e', '--editable', + action='store_true', + default=False, + help='List editable projects.') + self.cmd_opts.add_option( + '-l', '--local', + action='store_true', + default=False, + help=('If in a virtualenv that has global access, do not list ' + 'globally-installed packages.'), + ) + self.cmd_opts.add_option( + '--user', + dest='user', + action='store_true', + default=False, + help='Only output packages installed in user-site.') + self.cmd_opts.add_option(cmdoptions.list_path()) + self.cmd_opts.add_option( + '--pre', + action='store_true', + default=False, + help=("Include pre-release and development versions. By default, " + "pip only finds stable versions."), + ) + + self.cmd_opts.add_option( + '--format', + action='store', + dest='list_format', + default="columns", + choices=('columns', 'freeze', 'json'), + help="Select the output format among: columns (default), freeze, " + "or json", + ) + + self.cmd_opts.add_option( + '--not-required', + action='store_true', + dest='not_required', + help="List packages that are not dependencies of " + "installed packages.", + ) + + self.cmd_opts.add_option( + '--exclude-editable', + action='store_false', + dest='include_editable', + help='Exclude editable package from output.', + ) + self.cmd_opts.add_option( + '--include-editable', + action='store_true', + dest='include_editable', + help='Include editable package from output.', + default=True, + ) + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, self.parser + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, self.cmd_opts) + + def _build_package_finder(self, options, session): + # type: (Values, PipSession) -> PackageFinder + """ + Create a package finder appropriate to this list command. + """ + link_collector = LinkCollector.create(session, options=options) + + # Pass allow_yanked=False to ignore yanked versions. + selection_prefs = SelectionPreferences( + allow_yanked=False, + allow_all_prereleases=options.pre, + ) + + return PackageFinder.create( + link_collector=link_collector, + selection_prefs=selection_prefs, + ) + + def run(self, options, args): + # type: (Values, List[str]) -> int + if options.outdated and options.uptodate: + raise CommandError( + "Options --outdated and --uptodate cannot be combined.") + + cmdoptions.check_list_path_option(options) + + packages = get_installed_distributions( + local_only=options.local, + user_only=options.user, + editables_only=options.editable, + include_editables=options.include_editable, + paths=options.path, + ) + + # get_not_required must be called firstly in order to find and + # filter out all dependencies correctly. Otherwise a package + # can't be identified as requirement because some parent packages + # could be filtered out before. + if options.not_required: + packages = self.get_not_required(packages, options) + + if options.outdated: + packages = self.get_outdated(packages, options) + elif options.uptodate: + packages = self.get_uptodate(packages, options) + + self.output_package_listing(packages, options) + return SUCCESS + + def get_outdated(self, packages, options): + # type: (List[Distribution], Values) -> List[Distribution] + return [ + dist for dist in self.iter_packages_latest_infos(packages, options) + if dist.latest_version > dist.parsed_version + ] + + def get_uptodate(self, packages, options): + # type: (List[Distribution], Values) -> List[Distribution] + return [ + dist for dist in self.iter_packages_latest_infos(packages, options) + if dist.latest_version == dist.parsed_version + ] + + def get_not_required(self, packages, options): + # type: (List[Distribution], Values) -> List[Distribution] + dep_keys = set() # type: Set[Distribution] + for dist in packages: + dep_keys.update(requirement.key for requirement in dist.requires()) + + # Create a set to remove duplicate packages, and cast it to a list + # to keep the return type consistent with get_outdated and + # get_uptodate + return list({pkg for pkg in packages if pkg.key not in dep_keys}) + + def iter_packages_latest_infos(self, packages, options): + # type: (List[Distribution], Values) -> Iterator[Distribution] + with self._build_session(options) as session: + finder = self._build_package_finder(options, session) + + def latest_info(dist): + # type: (Distribution) -> Distribution + typ = 'unknown' + all_candidates = finder.find_all_candidates(dist.key) + if not options.pre: + # Remove prereleases + all_candidates = [candidate for candidate in all_candidates + if not candidate.version.is_prerelease] + + evaluator = finder.make_candidate_evaluator( + project_name=dist.project_name, + ) + best_candidate = evaluator.sort_best_candidate(all_candidates) + if best_candidate is None: + return None + + remote_version = best_candidate.version + if best_candidate.link.is_wheel: + typ = 'wheel' + else: + typ = 'sdist' + # This is dirty but makes the rest of the code much cleaner + dist.latest_version = remote_version + dist.latest_filetype = typ + return dist + + for dist in map_multithread(latest_info, packages): + if dist is not None: + yield dist + + def output_package_listing(self, packages, options): + # type: (List[Distribution], Values) -> None + packages = sorted( + packages, + key=lambda dist: dist.project_name.lower(), + ) + if options.list_format == 'columns' and packages: + data, header = format_for_columns(packages, options) + self.output_package_listing_columns(data, header) + elif options.list_format == 'freeze': + for dist in packages: + if options.verbose >= 1: + write_output("%s==%s (%s)", dist.project_name, + dist.version, dist.location) + else: + write_output("%s==%s", dist.project_name, dist.version) + elif options.list_format == 'json': + write_output(format_for_json(packages, options)) + + def output_package_listing_columns(self, data, header): + # type: (List[List[str]], List[str]) -> None + # insert the header first: we need to know the size of column names + if len(data) > 0: + data.insert(0, header) + + pkg_strings, sizes = tabulate(data) + + # Create and add a separator. + if len(data) > 0: + pkg_strings.insert(1, " ".join(map(lambda x: '-' * x, sizes))) + + for val in pkg_strings: + write_output(val) + + +def format_for_columns(pkgs, options): + # type: (List[Distribution], Values) -> Tuple[List[List[str]], List[str]] + """ + Convert the package data into something usable + by output_package_listing_columns. + """ + running_outdated = options.outdated + # Adjust the header for the `pip list --outdated` case. + if running_outdated: + header = ["Package", "Version", "Latest", "Type"] + else: + header = ["Package", "Version"] + + data = [] + if options.verbose >= 1 or any(dist_is_editable(x) for x in pkgs): + header.append("Location") + if options.verbose >= 1: + header.append("Installer") + + for proj in pkgs: + # if we're working on the 'outdated' list, separate out the + # latest_version and type + row = [proj.project_name, proj.version] + + if running_outdated: + row.append(proj.latest_version) + row.append(proj.latest_filetype) + + if options.verbose >= 1 or dist_is_editable(proj): + row.append(proj.location) + if options.verbose >= 1: + row.append(get_installer(proj)) + + data.append(row) + + return data, header + + +def format_for_json(packages, options): + # type: (List[Distribution], Values) -> str + data = [] + for dist in packages: + info = { + 'name': dist.project_name, + 'version': six.text_type(dist.version), + } + if options.verbose >= 1: + info['location'] = dist.location + info['installer'] = get_installer(dist) + if options.outdated: + info['latest_version'] = six.text_type(dist.latest_version) + info['latest_filetype'] = dist.latest_filetype + data.append(info) + return json.dumps(data) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/list.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/list.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd6104f721467eded7d25811ca6b9a429ed92a1a GIT binary patch literal 10233 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.""" + + usage = """ + %prog [options] """ + ignore_require_venv = True + + def add_options(self): + # type: () -> None + self.cmd_opts.add_option( + '-i', '--index', + dest='index', + metavar='URL', + default=PyPI.pypi_url, + help='Base URL of Python Package Index (default %default)') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + # type: (Values, List[str]) -> int + if not args: + raise CommandError('Missing required argument (search query).') + query = args + pypi_hits = self.search(query, options) + hits = transform_hits(pypi_hits) + + terminal_width = None + if sys.stdout.isatty(): + terminal_width = get_terminal_size()[0] + + print_results(hits, terminal_width=terminal_width) + if pypi_hits: + return SUCCESS + return NO_MATCHES_FOUND + + def search(self, query, options): + # type: (List[str], Values) -> List[Dict[str, str]] + index_url = options.index + + session = self.get_default_session(options) + + transport = PipXmlrpcTransport(index_url, session) + pypi = xmlrpc_client.ServerProxy(index_url, transport) + hits = pypi.search({'name': query, 'summary': query}, 'or') + return hits + + +def transform_hits(hits): + # type: (List[Dict[str, str]]) -> List[TransformedHit] + """ + The list from pypi is really a list of versions. We want a list of + packages with the list of versions stored inline. This converts the + list from pypi into one we can use. + """ + packages = OrderedDict() # type: OrderedDict[str, TransformedHit] + for hit in hits: + name = hit['name'] + summary = hit['summary'] + version = hit['version'] + + if name not in packages.keys(): + packages[name] = { + 'name': name, + 'summary': summary, + 'versions': [version], + } + else: + packages[name]['versions'].append(version) + + # if this is the highest version, replace summary and score + if version == highest_version(packages[name]['versions']): + packages[name]['summary'] = summary + + return list(packages.values()) + + +def print_results(hits, name_column_width=None, terminal_width=None): + # type: (List[TransformedHit], Optional[int], Optional[int]) -> None + if not hits: + return + if name_column_width is None: + name_column_width = max([ + len(hit['name']) + len(highest_version(hit.get('versions', ['-']))) + for hit in hits + ]) + 4 + + installed_packages = [p.project_name for p in pkg_resources.working_set] + for hit in hits: + name = hit['name'] + summary = hit['summary'] or '' + latest = highest_version(hit.get('versions', ['-'])) + if terminal_width is not None: + target_width = terminal_width - name_column_width - 5 + if target_width > 10: + # wrap and indent summary to fit terminal + summary_lines = textwrap.wrap(summary, target_width) + summary = ('\n' + ' ' * (name_column_width + 3)).join( + summary_lines) + + line = '{name_latest:{name_column_width}} - {summary}'.format( + name_latest='{name} ({latest})'.format(**locals()), + **locals()) + try: + write_output(line) + if name in installed_packages: + dist = get_distribution(name) + assert dist is not None + with indent_log(): + if dist.version == latest: + write_output('INSTALLED: %s (latest)', dist.version) + else: + write_output('INSTALLED: %s', dist.version) + if parse_version(latest).pre: + write_output('LATEST: %s (pre-release; install' + ' with "pip install --pre")', latest) + else: + write_output('LATEST: %s', latest) + except UnicodeEncodeError: + pass + + +def highest_version(versions): + # type: (List[str]) -> str + return max(versions, key=parse_version) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/search.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/search.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca7df059b50aba42dc7beabd0f1d7691374f0e69 GIT binary patch literal 5803 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 B44eP} literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/show.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/show.py new file mode 100644 index 0000000..3892c59 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/show.py @@ -0,0 +1,186 @@ +from __future__ import absolute_import + +import logging +import os +from email.parser import FeedParser + +from pip._vendor import pkg_resources +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.utils.misc import write_output +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from optparse import Values + from typing import List, Dict, Iterator + +logger = logging.getLogger(__name__) + + +class ShowCommand(Command): + """ + Show information about one or more installed packages. + + The output is in RFC-compliant mail header format. + """ + + usage = """ + %prog [options] ...""" + ignore_require_venv = True + + def add_options(self): + # type: () -> None + self.cmd_opts.add_option( + '-f', '--files', + dest='files', + action='store_true', + default=False, + help='Show the full list of installed files for each package.') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + # type: (Values, List[str]) -> int + if not args: + logger.warning('ERROR: Please provide a package name or names.') + return ERROR + query = args + + results = search_packages_info(query) + if not print_results( + results, list_files=options.files, verbose=options.verbose): + return ERROR + return SUCCESS + + +def search_packages_info(query): + # type: (List[str]) -> Iterator[Dict[str, str]] + """ + Gather details from installed distributions. Print distribution name, + version, location, and installed files. Installed files requires a + pip generated 'installed-files.txt' in the distributions '.egg-info' + directory. + """ + installed = {} + for p in pkg_resources.working_set: + installed[canonicalize_name(p.project_name)] = p + + query_names = [canonicalize_name(name) for name in query] + missing = sorted( + [name for name, pkg in zip(query, query_names) if pkg not in installed] + ) + if missing: + logger.warning('Package(s) not found: %s', ', '.join(missing)) + + def get_requiring_packages(package_name): + # type: (str) -> List[str] + canonical_name = canonicalize_name(package_name) + return [ + pkg.project_name for pkg in pkg_resources.working_set + if canonical_name in + [canonicalize_name(required.name) for required in + pkg.requires()] + ] + + for dist in [installed[pkg] for pkg in query_names if pkg in installed]: + package = { + 'name': dist.project_name, + 'version': dist.version, + 'location': dist.location, + 'requires': [dep.project_name for dep in dist.requires()], + 'required_by': get_requiring_packages(dist.project_name) + } + file_list = None + metadata = '' + if isinstance(dist, pkg_resources.DistInfoDistribution): + # RECORDs should be part of .dist-info metadatas + if dist.has_metadata('RECORD'): + lines = dist.get_metadata_lines('RECORD') + paths = [line.split(',')[0] for line in lines] + paths = [os.path.join(dist.location, p) for p in paths] + file_list = [os.path.relpath(p, dist.location) for p in paths] + + if dist.has_metadata('METADATA'): + metadata = dist.get_metadata('METADATA') + else: + # Otherwise use pip's log for .egg-info's + if dist.has_metadata('installed-files.txt'): + paths = dist.get_metadata_lines('installed-files.txt') + paths = [os.path.join(dist.egg_info, p) for p in paths] + file_list = [os.path.relpath(p, dist.location) for p in paths] + + if dist.has_metadata('PKG-INFO'): + metadata = dist.get_metadata('PKG-INFO') + + if dist.has_metadata('entry_points.txt'): + entry_points = dist.get_metadata_lines('entry_points.txt') + package['entry_points'] = entry_points + + if dist.has_metadata('INSTALLER'): + for line in dist.get_metadata_lines('INSTALLER'): + if line.strip(): + package['installer'] = line.strip() + break + + # @todo: Should pkg_resources.Distribution have a + # `get_pkg_info` method? + feed_parser = FeedParser() + feed_parser.feed(metadata) + pkg_info_dict = feed_parser.close() + for key in ('metadata-version', 'summary', + 'home-page', 'author', 'author-email', 'license'): + package[key] = pkg_info_dict.get(key) + + # It looks like FeedParser cannot deal with repeated headers + classifiers = [] + for line in metadata.splitlines(): + if line.startswith('Classifier: '): + classifiers.append(line[len('Classifier: '):]) + package['classifiers'] = classifiers + + if file_list: + package['files'] = sorted(file_list) + yield package + + +def print_results(distributions, list_files=False, verbose=False): + # type: (Iterator[Dict[str, str]], bool, bool) -> bool + """ + Print the information from installed distributions found. + """ + results_printed = False + for i, dist in enumerate(distributions): + results_printed = True + if i > 0: + write_output("---") + + write_output("Name: %s", dist.get('name', '')) + write_output("Version: %s", dist.get('version', '')) + write_output("Summary: %s", dist.get('summary', '')) + write_output("Home-page: %s", dist.get('home-page', '')) + write_output("Author: %s", dist.get('author', '')) + write_output("Author-email: %s", dist.get('author-email', '')) + write_output("License: %s", dist.get('license', '')) + write_output("Location: %s", dist.get('location', '')) + write_output("Requires: %s", ', '.join(dist.get('requires', []))) + write_output("Required-by: %s", ', '.join(dist.get('required_by', []))) + + if verbose: + write_output("Metadata-Version: %s", + dist.get('metadata-version', '')) + write_output("Installer: %s", dist.get('installer', '')) + write_output("Classifiers:") + for classifier in dist.get('classifiers', []): + write_output(" %s", classifier) + write_output("Entry-points:") + for entry in dist.get('entry_points', []): + write_output(" %s", entry.strip()) + if list_files: + write_output("Files:") + for line in dist.get('files', []): + write_output(" %s", line.strip()) + if "files" not in dist: + write_output("Cannot locate installed-files.txt") + return results_printed diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/show.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/show.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5641749729204c5762d715ab4772a01f831a1236 GIT binary patch literal 6619 zcmb_gOLH5?5$;`(;9I0fiqw-@TQ9^RAeYOLQ!HAcLQ*zkiBgubSw_O3R@fy8YJmlJ z782Ba}xJSyY&8qQlF6W zgnb{9_^i|?r93H4G%4wqI`*){Q&OLn^0bv2k@%d{XQVtM^;s#;O8vZ)&x_L#iCo#c zAkjs6i6vc)rxlg~t6ihNwYEa4fxl&?rM$4@vepJB~cx%iF31T0jewFc?nhDhI7m&DTG|+B&1XB6G%`smtwzR@&w^YH8cCy8 z4dU7-QKb>oBg+~9YdNXcgGN|z(a!quSoQr!en!^Dhs(>W8yi-36oeOP4HHRPS+kW{ z>LjQSKYsjiW%>Qp+e}!9=wl&xP^((^I0Dr4{9dU#!9W4WrLusWl-5A5M?x0kNQ z>qdbp*A3lU+%|M;vAA7}BcpBz@vC09B)Tl9a)ucr%)l>EB}-e8#zPow2d&upZ#RmY z<{ikWSu@yYyA{V?4F7t`_6bX>Vp_$Eg6eM1uq7Mij5m#fYCWvLG)9LFLVe*ZC~!ZB zO_XtJO^xSY;hvhyE*L~EYkQyE zsgtDNO09uFYy|ObxRo2i+%^c9Qu9y)^LR?;HE1(usNEfMhMc_q54csvIH${rstX^X z(RRhmO4jot5`zQ3ZGha#NtTm#j>)3a$KBC}_grZ^vIiG~g+?A+*L*-jMq}NRe znsu8lc#q>KFp-DgdR_}7FX$QA<1S}l^VgKru5?btI+}6tJW8J?CMs|js(IsNX9q?l z??sR{YK7lZ_I(|II(IaWA!MtIZsKm`XV@{uwcSoI^a|tcGb{e3fX|YmKLscsE zBy7bIUTKUx&*u<+?$C(lk8>b#y45A{|Bc0Ck98b5xZaJwm8}cXL4awDA)?Sg&OrDr z?oY_(j^>+{tx1hcaFz8tSN7lT#wR3T0%RHlDzeMU)|~uS{>{ijp z&PzKl>E9S&djs7>wl_#324;>z-LyHoGav_VdJ~sQC-<|Lb-J zrG`-lxd`ONJ8TUxJ!)&1S@I6GfjlBF1%1Y)GbHUHcA%PZ2U+w^d!VZW^Fcnn(?QQG z(ivf9?TiXy92&TR&v3fwtV@OC%(Li_e(mseqWjtz6OK5Bv0&;m(mo@5XC=h&&^>A= z|9hu1u2SQWnxjLqN!gnc8U?D5zFiK)3I6rFM5on>D%}Eu4wxt=5b zzyz?E{m9t~o1<$D)%edNX&hpo_vPl(MpQvuFKTdOrQer6;sa9aFOSc>fz0pH1k> z&QqpyR@!F?-`b;8>hJ|X4va}Tcum4N>(eP|!&{f6Jw+)fLt}COQI6ZEGc5=2vj5&? z8*jIJv$!Img2MFETzgvf<`@_mAfFPia=86ZbNFn6%L!hR#rBA#|ID!}X!MYJ*)Dxp zK63WIl1)VEM&T;546j4}Wc<87x&{X``Wk^a-#)0P5|lJ}U2+dE0r zS~0JhP#X*i>%12yRYgnl9%|wVWm-l`-r5mjvUR?j1dSJ{8dO(rCu$Jk0aV>O!dDi7 zl(K{D7Ib=q4<{#Lyj!JcX9u-~k z4Wn3R-m5y0AsQIKcVh{5+C&3885s;FM`nc2G89>+vUfEzDyf?mnJ~_2E<_K7R_MfC zIWNzUkaRPkP?ItPM{uz90*juX<3r&zq1THfeTGU}0fbSc)3cD)5Ekc*$Qt!~4-2%| zoRhXxyF#UAXFxr|@s`AqfcQ`94UY@X53DsA>kMjLx3F;yz3TrE9IZg&j=B@5r8&nh zfu_~68#+3vUiA1ya%qn4^25s0L%0G&HQDO&BYy?H5SdqCsGT3KKDoDY@5w#W#d{W- zABT=%-G2PRd&RZ&`;QEdPEjLE4=c?CfepxWkf{+*60;#lt*vi7x%c3~s;_Uom`qgz z+!2I978HA{VDOk05Mg>~*m*apN5v*F04E-_vfU&#^q_4PBc27+4sop-0i-H(IS!1e zZP%i7!BaC-j|dhs+0gmcDfqwO6i$upFOl@>sQx`r3mzUCeLiuI4aVDO>3j{&Sy2ew zDe_6J>0hD59GMKcJ=o3v8A*5eP?wRujw6!7qMA`-HL6iYNVtN0vW6YX-(Fr(i|+=e z(laEAn~kC#p%T{`ICKz8862N701=VIo<^F;UuwG)rwg{ZM229mv&IE7gN2`}14B1` zMvksw8)stGU5x>4b)o35v)9q=;Pz}2q?vh9!zk*>W;1G7%fwNmKrH27qgEQe7bBsD zXw$|zqglbL?nUFjMQMghy#`+cJHJf=4an4{QwgJ{N_6*;>So@AO(4N=K3XW(W+zJx zZ0WLS72_|0q+!J6VpsAGz=Clc|Cux^A&=K|^RwvC|0RBZw6x%}( z08jfQy~|SCVPyjR~XY0p5xiE+i!;TjdQa&n+uvfEph&|1PUMU zEaiZL?ARAy83Mq^GH{P|YEoC!pa-{l{JE~`m8~i1!4h!_w^#25>H7ed#UmE3)SyNTw_~wb z)UvgX!cVNCsl@*|*~}*&S=glsyjw+K@=6hP1w9gV1 zu{>IuEm7L-)e54+J+O64yRxEaoq5oOfl6h0P^xc_yhfEVkI#ErHjG{aSY}v!dZ@j4 zS!7r@9`879sf5!$uBc`~6P#h5#5J4IUaLd`MT-O$G+!EK z`TM;1TF_exy~kM&8ibAtQ%+p}9b=3FbB#|Vq{%vJwCW0G{WnNg<`cG7`S>*+1-e3W z@hL#-U!uTe@@SjxRY#>s433J$`c?C{$YyOiMhBYo6~XvbFn+u&?m^q1@HI<#NPphB zfIL0wjJX%kI{E*)^Sb8nDNu*;J*&@)kmlPg`b;|o4?4OxC)=&8g ... + %prog [options] -r ...""" + + def add_options(self): + # type: () -> None + self.cmd_opts.add_option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help='Uninstall all the packages listed in the given requirements ' + 'file. This option can be used multiple times.', + ) + self.cmd_opts.add_option( + '-y', '--yes', + dest='yes', + action='store_true', + help="Don't ask for confirmation of uninstall deletions.") + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + # type: (Values, List[str]) -> int + session = self.get_default_session(options) + + reqs_to_uninstall = {} + for name in args: + req = install_req_from_line( + name, isolated=options.isolated_mode, + ) + if req.name: + reqs_to_uninstall[canonicalize_name(req.name)] = req + for filename in options.requirements: + for parsed_req in parse_requirements( + filename, + options=options, + session=session): + req = install_req_from_parsed_requirement( + parsed_req, + isolated=options.isolated_mode + ) + if req.name: + reqs_to_uninstall[canonicalize_name(req.name)] = req + if not reqs_to_uninstall: + raise InstallationError( + 'You must give at least one requirement to {self.name} (see ' + '"pip help {self.name}")'.format(**locals()) + ) + + protect_pip_from_modification_on_windows( + modifying_pip="pip" in reqs_to_uninstall + ) + + for req in reqs_to_uninstall.values(): + uninstall_pathset = req.uninstall( + auto_confirm=options.yes, verbose=self.verbosity > 0, + ) + if uninstall_pathset: + uninstall_pathset.commit() + + return SUCCESS diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/uninstall.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/uninstall.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34aba972718bcf1be0411321e4d5c0581abe34d6 GIT binary patch literal 3486 zcmcIm+io015UrWLd3}j*Ap{7}0znpu-AEBaC<oDvdcEV!&C@-; z!1@LA!ULbfckltc^TZoJz^U%BcLU}Pc4vC}Qe9nLbxw6R{#=^>?WbS-km_Fp-;E6- z^#>{u9)}X5)S;n64!2!OTuK`>Y}j^#k|w1s8n$e^NlBa14h=iD-J)cU(k>0Vw%w*= zp3(&xF4%U5l0{0FXt-qCbCg`6beV?Bl&;Wl#rAe7S*3K1hHJJxPsuu^S7~^a9C?+> zUyZE`l)OagH5y*CQj3(lOzCwRUMDAm?MozEBs(;6DY`;G5}gq}9lk=*GHv%(u;Cal z^&Av>8AY(G@}$zzkJBPAwH;W+Kp13s7KcF+e<%GcNTnU>U}!T>(;$m%$2vN;rBZR8 z)%{<_$8k25-hRBf`Cxl{s`+82bdV&0#*_zTnU{8G4T_4ORMIcyK^2!Wm6=vO7v1_L z6tSJgqyDJOQ$L9_so%bA#Hfj8_1GnPyhNF68EU_X3#%s0qj-dkvN=AUqd1H5BQ-VZ z%coyG^*29%u=&XM9&c?u-1^LpwV~~sAgN?6+eG_|SZU2}ew@|z)=s%VAAA1Z2GI8| zDv}sS&z?MX;M6jDk zp>t84n;_C$X;IrFqv)1m^Gv5DAr@K zvs0Ytah?e!byWknLdcQjcM0$21|n9VG9lW>gCOHUkP%_T zwnb5!q7LnWv2zr4DVnEffzI5PGo7%=Y~~49%!Fklv;v`q5proCW2^NFXRgTy+dZby zmSWcQOU0)2`!n`xhEgN}(nVBe29#zv2O-12R^i<&(#-crj)E%Drp`e-3`(Piqhu;$ znG_1!oT6TU;6jh(6g3He1nk9`>E4SEWhQ3VH;x<#@%0!GwjmM7LBNZs6egyyATAi$ zaSFuS9iFHbR_*ssup>_E{GG>F>AaM_F2T*)Xx`7Wn_2|wxftc82=iD3feT&3O=5m8E7$4ElRzUKKV~7y`>=#0iK@ zp*}_JmQIUXU~Rt!dH?pq{qH_Zxy!tMoPicuklYGw%2l^6NDZRt1?ZSsquxPNy^4a| zuG4ke^}o|NZ*|;|y~G|ed3*!%j{sSVxrsw(4xKjmh&XN1@jaTjbpP2MI&G15Xadlp zbZFm&oO9ZyNt+>9-r&llNq~awftI@mHwe#@Z2oRfq50@@;cIh%_bZ|yb4kCI23)Jr%E)ZL&bGHm=Vw|i2FmHHMCmB;$_PA6YM4#prppEp*j1WkD$dYK~$b>WO;1v120)Pg5 z5}%5ml2W|I`JSmaJM`9jnn`aCwUap8<8#hXgTKuApwhWtQ@~hrD9hbkNsD;S9tO&L zQu{UU{n}oSF=Mo!@65+CHUqF(9w$GKFBKl=5|4@FF+WW{0rNmPQ%!PQE0otgA38LL zsOI(syuE8Y%3apJSf7}=OoUi_Oeo`O?*?k#n=H(ILAj?q!7aYSz=O)icBfiz@(^qhu%|IF zJTMm!126r?xzKrP9E3?c*bQ)PtaGGiZj8J$qwEDaMEydHz5g%ja6i?Rf+S8#12uj9 zAL^!;CW~>#+lvcgF++q)7QxT}98@@=LL61fP|FbJl9kNv2WhNAOBr_Hiz`_PeNw<# z9w#6J1*9AUXpfHxL!MfK(}0Q2{}6Sv@?8tNPdFi%18K#@A9%L^YfXHC+ZAWM@fY_$ BWheju literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/wheel.py b/venv/lib/python2.7/site-packages/pip/_internal/commands/wheel.py new file mode 100644 index 0000000..0f71856 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/commands/wheel.py @@ -0,0 +1,188 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import + +import logging +import os +import shutil + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.req_command import RequirementCommand, with_cleanup +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.exceptions import CommandError +from pip._internal.req.req_tracker import get_requirement_tracker +from pip._internal.utils.misc import ensure_dir, normalize_path +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.wheel_builder import build, should_build_for_wheel_command + +if MYPY_CHECK_RUNNING: + from optparse import Values + from typing import List + + +logger = logging.getLogger(__name__) + + +class WheelCommand(RequirementCommand): + """ + Build Wheel archives for your requirements and dependencies. + + Wheel is a built-package format, and offers the advantage of not + recompiling your software during every install. For more details, see the + wheel docs: https://wheel.readthedocs.io/en/latest/ + + Requirements: setuptools>=0.8, and wheel. + + 'pip wheel' uses the bdist_wheel setuptools extension from the wheel + package to build individual wheels. + + """ + + usage = """ + %prog [options] ... + %prog [options] -r ... + %prog [options] [-e] ... + %prog [options] [-e] ... + %prog [options] ...""" + + def add_options(self): + # type: () -> None + + self.cmd_opts.add_option( + '-w', '--wheel-dir', + dest='wheel_dir', + metavar='dir', + default=os.curdir, + help=("Build wheels into , where the default is the " + "current working directory."), + ) + self.cmd_opts.add_option(cmdoptions.no_binary()) + self.cmd_opts.add_option(cmdoptions.only_binary()) + self.cmd_opts.add_option(cmdoptions.prefer_binary()) + self.cmd_opts.add_option( + '--build-option', + dest='build_options', + metavar='options', + action='append', + help="Extra arguments to be supplied to 'setup.py bdist_wheel'.", + ) + self.cmd_opts.add_option(cmdoptions.no_build_isolation()) + self.cmd_opts.add_option(cmdoptions.use_pep517()) + self.cmd_opts.add_option(cmdoptions.no_use_pep517()) + self.cmd_opts.add_option(cmdoptions.constraints()) + self.cmd_opts.add_option(cmdoptions.editable()) + self.cmd_opts.add_option(cmdoptions.requirements()) + self.cmd_opts.add_option(cmdoptions.src()) + self.cmd_opts.add_option(cmdoptions.ignore_requires_python()) + self.cmd_opts.add_option(cmdoptions.no_deps()) + self.cmd_opts.add_option(cmdoptions.build_dir()) + self.cmd_opts.add_option(cmdoptions.progress_bar()) + + self.cmd_opts.add_option( + '--global-option', + dest='global_options', + action='append', + metavar='options', + help="Extra global options to be supplied to the setup.py " + "call before the 'bdist_wheel' command.") + + self.cmd_opts.add_option( + '--pre', + action='store_true', + default=False, + help=("Include pre-release and development versions. By default, " + "pip only finds stable versions."), + ) + + self.cmd_opts.add_option(cmdoptions.require_hashes()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, self.cmd_opts) + + @with_cleanup + def run(self, options, args): + # type: (Values, List[str]) -> int + cmdoptions.check_install_build_global(options) + + session = self.get_default_session(options) + + finder = self._build_package_finder(options, session) + build_delete = (not (options.no_clean or options.build_dir)) + wheel_cache = WheelCache(options.cache_dir, options.format_control) + + options.wheel_dir = normalize_path(options.wheel_dir) + ensure_dir(options.wheel_dir) + + req_tracker = self.enter_context(get_requirement_tracker()) + + directory = TempDirectory( + options.build_dir, + delete=build_delete, + kind="wheel", + globally_managed=True, + ) + + reqs = self.get_requirements(args, options, finder, session) + + preparer = self.make_requirement_preparer( + temp_build_dir=directory, + options=options, + req_tracker=req_tracker, + session=session, + finder=finder, + wheel_download_dir=options.wheel_dir, + use_user_site=False, + ) + + resolver = self.make_resolver( + preparer=preparer, + finder=finder, + options=options, + wheel_cache=wheel_cache, + ignore_requires_python=options.ignore_requires_python, + use_pep517=options.use_pep517, + ) + + self.trace_basic_info(finder) + + requirement_set = resolver.resolve( + reqs, check_supported_wheels=True + ) + + reqs_to_build = [ + r for r in requirement_set.requirements.values() + if should_build_for_wheel_command(r) + ] + + # build wheels + build_successes, build_failures = build( + reqs_to_build, + wheel_cache=wheel_cache, + build_options=options.build_options or [], + global_options=options.global_options or [], + ) + for req in build_successes: + assert req.link and req.link.is_wheel + assert req.local_file_path + # copy from cache to target directory + try: + shutil.copy(req.local_file_path, options.wheel_dir) + except OSError as e: + logger.warning( + "Building wheel for %s failed: %s", + req.name, e, + ) + build_failures.append(req) + if len(build_failures) != 0: + raise CommandError( + "Failed to build one or more wheels" + ) + + return SUCCESS diff --git a/venv/lib/python2.7/site-packages/pip/_internal/commands/wheel.pyc b/venv/lib/python2.7/site-packages/pip/_internal/commands/wheel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..588b642c2d00578e0116048ad508dd94ac850b7b GIT binary patch literal 5868 zcmb_gTX!5s5w6)?t!^u=F19S&aXh&gDa5;ioD&ip#~3RPqA4|s<+{s#{n{sC_s-ubF}R$kdlcp#E?)Lm2EU0qfEebrn4*V4k@ zfBzRhr0S=R|99^a>GvI?2!9SGM5#kPhaB$LD5+7eChyR$Q?EX5H>lT;cAb(LN}JSc z+A$4EW+|Pc-kj~vP%=;H0`(RsU8LTkl{P79QMyFECEK5+WSP=7_1d;SN68AMtJGVy z{dr2(C|#%CI;9t=cfm>*D7i@K2K6>Rq$C%apuI>2>N|CnqCPH5$02UZZDl$LkceNiEQUL(vNTj_4WDquv|r zpuO!?crj*=Zo`XY+IR%}I!}g1`Egq0rFmfAEa1(%3gRc3bcG!3%Iv><*Go4y|=D#(U~onRKyz0Y@d@9*td0jpI*?w4g=TInT7 z50&xD=kxle48kK-+C|womFZ!r{3tHXGP+q_ra=;at^6V|eLK$*@CNEE{ zm`(oqqhCJqcYk_+_h-KM`GW_aJot&7c?R$Hhj9{_SJBe_e3(SO2>gS*^q;Ut{LpUF z&enw97eO*q+V&ghe;R8eF0dZ7>SvkEe!F)Uv)@ER5hpP6mopd9L(bMXXh>K!Ls4A< z2zisdy=|Ub{~3{6aPf1G?Q~@cHz>n?e5|w!E8UZPSh^F=(=I~dMygO*q_Qwpy1O7V z*s(F*ySzu!Dd6PbQ1L8jU~bB|{NO;9+BJRU2GMbl8CJ*-+$=XT34EKUMV!Rhpn~`2cC; ze3PPCGJrHl<|vw{XSIfNrfnKDm|;u<)}5C&r%GpEl12-%*rF`fqG*YtWm&0>IbT?5 z?xoSZK1`aj{=!u0;#6sCs&r|pba|>2#!j(eWvX;_s&wroDfl9S(^tnnK``JS!~m+3 zo{82))L8|pEQ{1ZFieaL>#L;D zpF(KyR0eCDVjSq((7$t&k1^ni0iqh`0y4Q94$Bgx=RV2HBSt!?TcYV|=A=$Xn4@El zxnVjIfnS|_F=gCl9tlEbRwK=V(OUly()&+Aen9xcAu}vi2GS^34~rs+Rm9ybfxB*T zGKpYYUCs2~=^Q5cevpi;) zyP7$*(!u!=?Ll8-aea-olYjHWEi2!;mku=J3 ze?QKG^2Bhq@lxYHM-m2u7snE=DOjH=*^g0B1rkZ#FxbT}RPpZj-;)f0)`Wy-4zV>v z7#XLoPPO7!@C)0>{f-Bg>fB=HZ+9E8f|!rSU;)#pqtf>Nu}tjjBI zof~4yDk)r4avDE z6Ec|aj`@TMqxF$CM(B)@tfHoxz?ws&x?mli0KK}PUxV9&1{EJlV}@Fz8A2MebXK0A z9-w5CbCHE$7YugDUm$GuOd^QcBBYk3gAu56SzZIYF#yjox1!nyMvvyimK8b`>rP<^ zENajQ%fNnM{|uc1(8UxG@#!q%J9I$APzHJ0wWCEY{-4q82oekg4YcSK)N0l2@FhA0 zn_GLp7Ht^|s-Wfwd%!3Ff5WsruQqA4MCJ;e zV!IBNfrG|xYV)G@h9%W4ZntO+ca9Cr+=W+ zHl}_?BaB(4!K+mM&9RNab<+QEj7z_TC-Lev(*LZwCs)Y4PJ=fpc@+Q-p5%_7bg4Ehy556xQyIV8~qI;v9{)y#J- zxv~uza_ntTA)o&Tf>{wD(&17MU=YT#xb$mzCIUqQ>RUm;HA7wb2HG`@#ctnZIKauLHS&8qtM zD+lqufxdF-^*X!`m%akTviGy=s=Z+0CYhNsPdu(#Joc`~GYC(B_~1=e!1cppSofGs zB-EdQJ#B!`-;%Xqz7yD<;0=Eq32$dSd8GoL0=G^Cgp-DE+6n}r;}C#*kV`UvG+5Vr zixn94kLAkiap*l}mgfNz3vnAfk}Qa|ji{vFk2UiHl1eW7^6i7%FW|n!UfgAF-5(m< zMwv9i9N5mA|HYmi!)qt`;UVT>G47ce@z z6ja)~!=fMIA@o?0rJN~mmtTFzuQ)nqrJXDV?`rQJzvFmS&M9R>la2?q8cu*xBFck& zQxyrKYuD4mFvM8{=`s&n8K*YB-msL9fijKS#`|xHFPXr~VV2^b#x)E)xm0V{)|_?c zBA!dNwOW15oAu2JK4c!9KjTF1wJ@^jv>O}FW}_}l*>*N-OU_lNjXAD3ZOH1F@uIVa z|E>Bq$4&g^`y4Xgm#V<`(>xj?4SWf#@8hD6Hb-x$0bbsFXn7nskL`W#3Tgen^@GQm z{|Y{u1KM0_&NgfFA8fygPG#M}(D3(7z6TMBiJXSWJ?}aM-b0phmZ4bbo)s!xi+BP8 zTv5I7GKnn?U7Pj_UwAwof7Rr1xMcJ4z0^z7bW#19p@upxL6Y%?^ZdM?dKxPG)twv+ z^YW@#QC6+KY!lR(G7+Cn-A!X13S0?#8Ft?J^{krE4HJ!^7az~5S|=itD}fsZ9!Vn9ky3$re0T&tjGc>1Gda3|@J|IXyd#J_zU@f3zvUDXYi`>lzQgg- coINYGmV@8ginD^slb_@NTurVx>-Bd1KeOYMs{jB1 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/configuration.py b/venv/lib/python2.7/site-packages/pip/_internal/configuration.py new file mode 100644 index 0000000..e49a5f4 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/configuration.py @@ -0,0 +1,418 @@ +"""Configuration management setup + +Some terminology: +- name + As written in config files. +- value + Value associated with a name +- key + Name combined with it's section (section.name) +- variant + A single word describing where the configuration key-value pair came from +""" + +import locale +import logging +import os +import sys + +from pip._vendor.six.moves import configparser + +from pip._internal.exceptions import ( + ConfigurationError, + ConfigurationFileCouldNotBeLoaded, +) +from pip._internal.utils import appdirs +from pip._internal.utils.compat import WINDOWS, expanduser +from pip._internal.utils.misc import ensure_dir, enum +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Dict, Iterable, List, NewType, Optional, Tuple + ) + + RawConfigParser = configparser.RawConfigParser # Shorthand + Kind = NewType("Kind", str) + +logger = logging.getLogger(__name__) + + +# NOTE: Maybe use the optionx attribute to normalize keynames. +def _normalize_name(name): + # type: (str) -> str + """Make a name consistent regardless of source (environment or file) + """ + name = name.lower().replace('_', '-') + if name.startswith('--'): + name = name[2:] # only prefer long opts + return name + + +def _disassemble_key(name): + # type: (str) -> List[str] + if "." not in name: + error_message = ( + "Key does not contain dot separated section and key. " + "Perhaps you wanted to use 'global.{}' instead?" + ).format(name) + raise ConfigurationError(error_message) + return name.split(".", 1) + + +# The kinds of configurations there are. +kinds = enum( + USER="user", # User Specific + GLOBAL="global", # System Wide + SITE="site", # [Virtual] Environment Specific + ENV="env", # from PIP_CONFIG_FILE + ENV_VAR="env-var", # from Environment Variables +) + + +CONFIG_BASENAME = 'pip.ini' if WINDOWS else 'pip.conf' + + +def get_configuration_files(): + # type: () -> Dict[Kind, List[str]] + global_config_files = [ + os.path.join(path, CONFIG_BASENAME) + for path in appdirs.site_config_dirs('pip') + ] + + site_config_file = os.path.join(sys.prefix, CONFIG_BASENAME) + legacy_config_file = os.path.join( + expanduser('~'), + 'pip' if WINDOWS else '.pip', + CONFIG_BASENAME, + ) + new_config_file = os.path.join( + appdirs.user_config_dir("pip"), CONFIG_BASENAME + ) + return { + kinds.GLOBAL: global_config_files, + kinds.SITE: [site_config_file], + kinds.USER: [legacy_config_file, new_config_file], + } + + +class Configuration(object): + """Handles management of configuration. + + Provides an interface to accessing and managing configuration files. + + This class converts provides an API that takes "section.key-name" style + keys and stores the value associated with it as "key-name" under the + section "section". + + This allows for a clean interface wherein the both the section and the + key-name are preserved in an easy to manage form in the configuration files + and the data stored is also nice. + """ + + def __init__(self, isolated, load_only=None): + # type: (bool, Optional[Kind]) -> None + super(Configuration, self).__init__() + + _valid_load_only = [kinds.USER, kinds.GLOBAL, kinds.SITE, None] + if load_only not in _valid_load_only: + raise ConfigurationError( + "Got invalid value for load_only - should be one of {}".format( + ", ".join(map(repr, _valid_load_only[:-1])) + ) + ) + self.isolated = isolated + self.load_only = load_only + + # The order here determines the override order. + self._override_order = [ + kinds.GLOBAL, kinds.USER, kinds.SITE, kinds.ENV, kinds.ENV_VAR + ] + + self._ignore_env_names = ["version", "help"] + + # Because we keep track of where we got the data from + self._parsers = { + variant: [] for variant in self._override_order + } # type: Dict[Kind, List[Tuple[str, RawConfigParser]]] + self._config = { + variant: {} for variant in self._override_order + } # type: Dict[Kind, Dict[str, Any]] + self._modified_parsers = [] # type: List[Tuple[str, RawConfigParser]] + + def load(self): + # type: () -> None + """Loads configuration from configuration files and environment + """ + self._load_config_files() + if not self.isolated: + self._load_environment_vars() + + def get_file_to_edit(self): + # type: () -> Optional[str] + """Returns the file with highest priority in configuration + """ + assert self.load_only is not None, \ + "Need to be specified a file to be editing" + + try: + return self._get_parser_to_modify()[0] + except IndexError: + return None + + def items(self): + # type: () -> Iterable[Tuple[str, Any]] + """Returns key-value pairs like dict.items() representing the loaded + configuration + """ + return self._dictionary.items() + + def get_value(self, key): + # type: (str) -> Any + """Get a value from the configuration. + """ + try: + return self._dictionary[key] + except KeyError: + raise ConfigurationError("No such key - {}".format(key)) + + def set_value(self, key, value): + # type: (str, Any) -> None + """Modify a value in the configuration. + """ + self._ensure_have_load_only() + + assert self.load_only + fname, parser = self._get_parser_to_modify() + + if parser is not None: + section, name = _disassemble_key(key) + + # Modify the parser and the configuration + if not parser.has_section(section): + parser.add_section(section) + parser.set(section, name, value) + + self._config[self.load_only][key] = value + self._mark_as_modified(fname, parser) + + def unset_value(self, key): + # type: (str) -> None + """Unset a value in the configuration.""" + self._ensure_have_load_only() + + assert self.load_only + if key not in self._config[self.load_only]: + raise ConfigurationError("No such key - {}".format(key)) + + fname, parser = self._get_parser_to_modify() + + if parser is not None: + section, name = _disassemble_key(key) + if not (parser.has_section(section) + and parser.remove_option(section, name)): + # The option was not removed. + raise ConfigurationError( + "Fatal Internal error [id=1]. Please report as a bug." + ) + + # The section may be empty after the option was removed. + if not parser.items(section): + parser.remove_section(section) + self._mark_as_modified(fname, parser) + + del self._config[self.load_only][key] + + def save(self): + # type: () -> None + """Save the current in-memory state. + """ + self._ensure_have_load_only() + + for fname, parser in self._modified_parsers: + logger.info("Writing to %s", fname) + + # Ensure directory exists. + ensure_dir(os.path.dirname(fname)) + + with open(fname, "w") as f: + parser.write(f) + + # + # Private routines + # + + def _ensure_have_load_only(self): + # type: () -> None + if self.load_only is None: + raise ConfigurationError("Needed a specific file to be modifying.") + logger.debug("Will be working with %s variant only", self.load_only) + + @property + def _dictionary(self): + # type: () -> Dict[str, Any] + """A dictionary representing the loaded configuration. + """ + # NOTE: Dictionaries are not populated if not loaded. So, conditionals + # are not needed here. + retval = {} + + for variant in self._override_order: + retval.update(self._config[variant]) + + return retval + + def _load_config_files(self): + # type: () -> None + """Loads configuration from configuration files + """ + config_files = dict(self.iter_config_files()) + if config_files[kinds.ENV][0:1] == [os.devnull]: + logger.debug( + "Skipping loading configuration files due to " + "environment's PIP_CONFIG_FILE being os.devnull" + ) + return + + for variant, files in config_files.items(): + for fname in files: + # If there's specific variant set in `load_only`, load only + # that variant, not the others. + if self.load_only is not None and variant != self.load_only: + logger.debug( + "Skipping file '%s' (variant: %s)", fname, variant + ) + continue + + parser = self._load_file(variant, fname) + + # Keeping track of the parsers used + self._parsers[variant].append((fname, parser)) + + def _load_file(self, variant, fname): + # type: (Kind, str) -> RawConfigParser + logger.debug("For variant '%s', will try loading '%s'", variant, fname) + parser = self._construct_parser(fname) + + for section in parser.sections(): + items = parser.items(section) + self._config[variant].update(self._normalized_keys(section, items)) + + return parser + + def _construct_parser(self, fname): + # type: (str) -> RawConfigParser + parser = configparser.RawConfigParser() + # If there is no such file, don't bother reading it but create the + # parser anyway, to hold the data. + # Doing this is useful when modifying and saving files, where we don't + # need to construct a parser. + if os.path.exists(fname): + try: + parser.read(fname) + except UnicodeDecodeError: + # See https://github.com/pypa/pip/issues/4963 + raise ConfigurationFileCouldNotBeLoaded( + reason="contains invalid {} characters".format( + locale.getpreferredencoding(False) + ), + fname=fname, + ) + except configparser.Error as error: + # See https://github.com/pypa/pip/issues/4893 + raise ConfigurationFileCouldNotBeLoaded(error=error) + return parser + + def _load_environment_vars(self): + # type: () -> None + """Loads configuration from environment variables + """ + self._config[kinds.ENV_VAR].update( + self._normalized_keys(":env:", self.get_environ_vars()) + ) + + def _normalized_keys(self, section, items): + # type: (str, Iterable[Tuple[str, Any]]) -> Dict[str, Any] + """Normalizes items to construct a dictionary with normalized keys. + + This routine is where the names become keys and are made the same + regardless of source - configuration files or environment. + """ + normalized = {} + for name, val in items: + key = section + "." + _normalize_name(name) + normalized[key] = val + return normalized + + def get_environ_vars(self): + # type: () -> Iterable[Tuple[str, str]] + """Returns a generator with all environmental vars with prefix PIP_""" + for key, val in os.environ.items(): + should_be_yielded = ( + key.startswith("PIP_") and + key[4:].lower() not in self._ignore_env_names + ) + if should_be_yielded: + yield key[4:].lower(), val + + # XXX: This is patched in the tests. + def iter_config_files(self): + # type: () -> Iterable[Tuple[Kind, List[str]]] + """Yields variant and configuration files associated with it. + + This should be treated like items of a dictionary. + """ + # SMELL: Move the conditions out of this function + + # environment variables have the lowest priority + config_file = os.environ.get('PIP_CONFIG_FILE', None) + if config_file is not None: + yield kinds.ENV, [config_file] + else: + yield kinds.ENV, [] + + config_files = get_configuration_files() + + # at the base we have any global configuration + yield kinds.GLOBAL, config_files[kinds.GLOBAL] + + # per-user configuration next + should_load_user_config = not self.isolated and not ( + config_file and os.path.exists(config_file) + ) + if should_load_user_config: + # The legacy config file is overridden by the new config file + yield kinds.USER, config_files[kinds.USER] + + # finally virtualenv configuration first trumping others + yield kinds.SITE, config_files[kinds.SITE] + + def get_values_in_config(self, variant): + # type: (Kind) -> Dict[str, Any] + """Get values present in a config file""" + return self._config[variant] + + def _get_parser_to_modify(self): + # type: () -> Tuple[str, RawConfigParser] + # Determine which parser to modify + assert self.load_only + parsers = self._parsers[self.load_only] + if not parsers: + # This should not happen if everything works correctly. + raise ConfigurationError( + "Fatal Internal error [id=2]. Please report as a bug." + ) + + # Use the highest priority parser. + return parsers[-1] + + # XXX: This is patched in the tests. + def _mark_as_modified(self, fname, parser): + # type: (str, RawConfigParser) -> None + file_parser_tuple = (fname, parser) + if file_parser_tuple not in self._modified_parsers: + self._modified_parsers.append(file_parser_tuple) + + def __repr__(self): + # type: () -> str + return "{}({!r})".format(self.__class__.__name__, self._dictionary) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/configuration.pyc b/venv/lib/python2.7/site-packages/pip/_internal/configuration.pyc new file mode 100644 index 0000000000000000000000000000000000000000..179446660f480c7dbf8b26fb3144b2d1cf20b0c6 GIT binary patch literal 12992 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 AbstractDistribution + """Returns a Distribution for the given InstallRequirement + """ + # Editable requirements will always be source distributions. They use the + # legacy logic until we create a modern standard for them. + if install_req.editable: + return SourceDistribution(install_req) + + # If it's a wheel, it's a WheelDistribution + if install_req.is_wheel: + return WheelDistribution(install_req) + + # Otherwise, a SourceDistribution + return SourceDistribution(install_req) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/distributions/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/distributions/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..861aed4391a347bc37ced4c7323c1d01a227fb2e GIT binary patch literal 967 zcmb_a&2G~`5T3R3(-@F|aza8f7i11~5C={b0tEySB0`Q3iZ3fC-nQHBI<9vND&htg z9*C#mF?ax&u^SR(BrdEyo>WA%jMDc35h!*mD4N009XO30KsPu zj0e_-)Nju|m>$?ZqVX-69YQ*6QGGCbU`LRSKok^Z0AB#o0P-QsqdiKc zf6|Hs?eHe4`MR!F>X~*}>1B<2U9`3vWP5j_l-hUP_=PM7Ydw~At zYHMuryF>C!6xLPY!YtgaAUs-EA)cu4Sie_A*exRnX+=E>fXtK1HD*hr656*n+Q|>h zNW!(Y?OvgsZX1%7I*%CJD93$_(U#*$ zQpV*4-lsS=J5zEOBB>X`G(>XV4U++Z9V-}&MBuZ`BCZkdlA^Tn@09UwJQq7YwypjP zy5#_GccRiCWL%6Fr7n&Wo+pMK%%7Q;nNx|+$U7Y*wHA|XT1|L32@hvW^#5g>V;|ae UUK{n8r|hnhx-RJP2Bi1>Ul{rNX#fBK literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/distributions/base.py b/venv/lib/python2.7/site-packages/pip/_internal/distributions/base.py new file mode 100644 index 0000000..b836b98 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/distributions/base.py @@ -0,0 +1,45 @@ +import abc + +from pip._vendor.six import add_metaclass + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional + + from pip._vendor.pkg_resources import Distribution + from pip._internal.req import InstallRequirement + from pip._internal.index.package_finder import PackageFinder + + +@add_metaclass(abc.ABCMeta) +class AbstractDistribution(object): + """A base class for handling installable artifacts. + + The requirements for anything installable are as follows: + + - we must be able to determine the requirement name + (or we can't correctly handle the non-upgrade case). + + - for packages with setup requirements, we must also be able + to determine their requirements without installing additional + packages (for the same reason as run-time dependencies) + + - we must be able to create a Distribution object exposing the + above metadata. + """ + + def __init__(self, req): + # type: (InstallRequirement) -> None + super(AbstractDistribution, self).__init__() + self.req = req + + @abc.abstractmethod + def get_pkg_resources_distribution(self): + # type: () -> Optional[Distribution] + raise NotImplementedError() + + @abc.abstractmethod + def prepare_distribution_metadata(self, finder, build_isolation): + # type: (PackageFinder, bool) -> None + raise NotImplementedError() diff --git a/venv/lib/python2.7/site-packages/pip/_internal/distributions/base.pyc b/venv/lib/python2.7/site-packages/pip/_internal/distributions/base.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d655050984763fc66ace537034d696f2829fb15c GIT binary patch literal 2153 zcmcIl&2A($5U%d|Niv&k!iEb-APWi6i{*J)LA&2`*tWcI+xwxxT8eJiR~nMt}VJdtSi$)5rf`;IO~p zRN^-R1(1bx3@U;uhAf7NbUjc#sQQrgArgHst+(id8bCFKY#2@rKy5*_4cT_s4?*of zHG*su_FJItLA49nE<`neh(Q3X_TXg%FvrCX`~vV2;2fpdK81Cbj4(v`7k;Km zgiE)F6EDlW5{?&&TN}g=Q2gZl>3M$g&Eu1A^Yn-5^mO`l&~2mcyT(afa}^}JDEU%a zXXLCU`Hhd$+B&XODt>IG5tXQ2(9yL|dGU-d#8kQ=%1%ZjhM(`3f|(mU)?4!W$}L~DL~GJ3r7!Hq!JLiRgplLToAu#^l+RIMHo&FzY)B^Hi}^tQ!_;`{66my`_4R@r=C)7Kt^pNOgbb> zYLh&dwRCyz$SIO0p$nWRpiuL42X_gMFxk&>b>yn%sFBThO~LVpr>mbnsz~GqIz*;m z=N*-|8qOXOlPAqpO1Cl`mM($#Fe<3cyWw$B?;$S4^0RND4upRX4pBMP?zC!@Z&y)1 zHbxtdGo{DlZsT=tqsxVGdGl83Sslx*xtnxmhuL@g3?HXLj6xH={-D^&~YEQ zqpHlqW3!LTSu0hUORE+4Zx)K~t`6=k^wt>Ba3eO*_=lEQ_dXt2!%C=VYrassBVQ=f zd0y$VRkYpm+fo;K?knv1#Ak)Oj|#qiHIdItU8eLHrv&h(Qhs$O^r9S+Z%ZK$_lNP$ z;K3j{z)ecbail}4PV(p2y4p;vyi8F9?#)io@ppp16v|HARfEl$dhYqQ347lsZ*(?m zXB!+zsj%*~?#Q)U?6Q=&@7{SuMYX@2tRJ8}P$8wR_4z%1bn*mW1W%LjcKAO2AF}96 c{b?xfXN26+&+Tq}fPcdX=jb3h?CnQ?1B%rp9{>OV literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/distributions/installed.py b/venv/lib/python2.7/site-packages/pip/_internal/distributions/installed.py new file mode 100644 index 0000000..0d15bf4 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/distributions/installed.py @@ -0,0 +1,24 @@ +from pip._internal.distributions.base import AbstractDistribution +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional + + from pip._vendor.pkg_resources import Distribution + from pip._internal.index.package_finder import PackageFinder + + +class InstalledDistribution(AbstractDistribution): + """Represents an installed package. + + This does not need any preparation as the required information has already + been computed. + """ + + def get_pkg_resources_distribution(self): + # type: () -> Optional[Distribution] + return self.req.satisfied_by + + def prepare_distribution_metadata(self, finder, build_isolation): + # type: (PackageFinder, bool) -> None + pass diff --git a/venv/lib/python2.7/site-packages/pip/_internal/distributions/installed.pyc b/venv/lib/python2.7/site-packages/pip/_internal/distributions/installed.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d09b34091939da6a5b734c8d5d6ffc21e7040ff GIT binary patch literal 1388 zcmcIj&2AGh5T4EErwLS4{7E2zR-E?Ijno4tgn*Wx3K6O;9I_Y7Sv#p)uXkBHh#+oo zfCu7fcnlr@X1qyA)hk`?jK?!$d*=J>@b~uM*N>kphvgUI_yomTR0971G(ZtR7C=Dr z7U&ifA!H#0GK6~UvqI2qC_0dJnyfbHE)+e;dd<88dJBp^WPJz>?$QMrz%&5SgKq#| z0mj(?#1lffXu@7;;Aktn5&Oz9#c zrNHb(gi9-4b80B!HgYF2s^y2dsxhw2w5*FJc7j2!YstmJZ#R+BM0r_Mb0s~vSu{dB*-QcZe@x&;O<_?#D}bH;ue)Mvy^!AtSsmL^4(dj`6!Jj>*U;3 yNQrLuV3o4EQVFs8DOtWL){vaiZSZYe7Dk?}M-4xZsToU*>;yZlF3L`DBm4^$DPM>H literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/distributions/sdist.py b/venv/lib/python2.7/site-packages/pip/_internal/distributions/sdist.py new file mode 100644 index 0000000..be3d7d9 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/distributions/sdist.py @@ -0,0 +1,104 @@ +import logging + +from pip._internal.build_env import BuildEnvironment +from pip._internal.distributions.base import AbstractDistribution +from pip._internal.exceptions import InstallationError +from pip._internal.utils.subprocess import runner_with_spinner_message +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Set, Tuple + + from pip._vendor.pkg_resources import Distribution + from pip._internal.index.package_finder import PackageFinder + + +logger = logging.getLogger(__name__) + + +class SourceDistribution(AbstractDistribution): + """Represents a source distribution. + + The preparation step for these needs metadata for the packages to be + generated, either using PEP 517 or using the legacy `setup.py egg_info`. + """ + + def get_pkg_resources_distribution(self): + # type: () -> Distribution + return self.req.get_dist() + + def prepare_distribution_metadata(self, finder, build_isolation): + # type: (PackageFinder, bool) -> None + # Load pyproject.toml, to determine whether PEP 517 is to be used + self.req.load_pyproject_toml() + + # Set up the build isolation, if this requirement should be isolated + should_isolate = self.req.use_pep517 and build_isolation + if should_isolate: + self._setup_isolation(finder) + + self.req.prepare_metadata() + + def _setup_isolation(self, finder): + # type: (PackageFinder) -> None + def _raise_conflicts(conflicting_with, conflicting_reqs): + # type: (str, Set[Tuple[str, str]]) -> None + format_string = ( + "Some build dependencies for {requirement} " + "conflict with {conflicting_with}: {description}." + ) + error_message = format_string.format( + requirement=self.req, + conflicting_with=conflicting_with, + description=', '.join( + '{} is incompatible with {}'.format(installed, wanted) + for installed, wanted in sorted(conflicting) + ) + ) + raise InstallationError(error_message) + + # Isolate in a BuildEnvironment and install the build-time + # requirements. + pyproject_requires = self.req.pyproject_requires + assert pyproject_requires is not None + + self.req.build_env = BuildEnvironment() + self.req.build_env.install_requirements( + finder, pyproject_requires, 'overlay', + "Installing build dependencies" + ) + conflicting, missing = self.req.build_env.check_requirements( + self.req.requirements_to_check + ) + if conflicting: + _raise_conflicts("PEP 517/518 supported requirements", + conflicting) + if missing: + logger.warning( + "Missing build requirements in pyproject.toml for %s.", + self.req, + ) + logger.warning( + "The project does not specify a build backend, and " + "pip cannot fall back to setuptools without %s.", + " and ".join(map(repr, sorted(missing))) + ) + # Install any extra build dependencies that the backend requests. + # This must be done in a second pass, as the pyproject.toml + # dependencies must be installed before we can call the backend. + with self.req.build_env: + runner = runner_with_spinner_message( + "Getting requirements to build wheel" + ) + backend = self.req.pep517_backend + assert backend is not None + with backend.subprocess_runner(runner): + reqs = backend.get_requires_for_build_wheel() + + conflicting, missing = self.req.build_env.check_requirements(reqs) + if conflicting: + _raise_conflicts("the backend dependencies", conflicting) + self.req.build_env.install_requirements( + finder, missing, 'normal', + "Installing backend dependencies" + ) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/distributions/sdist.pyc b/venv/lib/python2.7/site-packages/pip/_internal/distributions/sdist.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02e9dab17c2df2eb20b41c0e5c27c735e54f8997 GIT binary patch literal 4027 zcmcIn-Etg96+SbwyV9;COO|63NCI78ij}5!y8HC$^ZT8%!N0Z!|NQ!| zQ9|t}!1sH2%-=Dj`1dF$8oPI&a*qn1#y)wx7f>Eh(V=n2%{!ELsp!$T=jL6?*Qi*h z@w%J$DDP7-pz(k_J)q_E+s8&qu4c$11P8gDt;b;_?$u}$M`H}6xvL&a4ZUnQ?3 z(nPae(%0yjN8=YL9gyzO#G`bB{z&wU=>GUR3x7D=gd*9$@!21Gc(pqi-k)cAdbfO( zHC0*Y(z=}&u=DdHW1Bd!A7uE>j^;M2O1FCzyZ1_C<2;Xf^={KtjoW$&Tg|*IbrU_# z>~Uo3OeTdkCZ1|Xv8JonJ=bXZ!p2_CFf>Shj5SLv3vr-=EIwygkCA zUle2us|RuN5S%~E%2YR&SszyOCef?ZXFg@M-^XKqhyjKh!%P@`whxRo4k-2IrNb`e zl`e&c!ww($8-`HVjW#foQL!>|k4jhUGa3vOKA#?I1;RRR#6HScU8_meD0__4s?<6) zs?au0V;e6wRP8h|%2w(~3!|xqC1b18n@Yo+x>0kJl~Z+a_dwl#^QQ_d-2(PhuBUNw zq8=D+=k=&QQF=O!vT{;A7zwk4wO>AWSS7aKDZ&T;9!JWd_-FsQCmQ{QT?f%r+lcja z{u6WPd@{ri$za~Y+nz1zy*jIJWiB>u{rKMO_iq)vBoAbZY3M#74F%a?6`@qoZ2aaEByRB<7DYQ@P}j zMHdV@TKZffD&(NHJq!~UyxVv^;(S~=eFbagxSF3W>dUtJE4X1P->PHIgk`rF)|7&+ zVAtz;JAT4O=fLRmDjxGC0_#us_h=&7^d-^4r?0#=xSZ`_+lPHJZ*ZFb!6PdccQjFV zN!+DbkDUWwAsLZ|&w!~dBkZj$>DJkOzxC;B+|;43fIEL?FQ@YU47dzzJnc~P53+rl z4JcjSz~XdVau}2~Y*)HpEO4 zyc|~h345r6haJb^YYs2~=HL}@oZ;QM2MCB5=;DZu;rAHsIB^Vt7_z)h0 zTQG(92eBO zlbW&knR=RPlQdb)#bq(F8(_b}K{D#UPYKb=F+qu&Dq+0i0A*7ceqP4_b$|B?$Ie3R z0Zm{J4mtSUr_a4F5PDoN*@lKO=jlRaMrCDE6*VCJDA%pVfsLqnZPsy~hag6Ru_bp6B{hl`z2>Uh`9FDOSW)*Ol5g;nBD7cEPwXyg_aNq(r@ln}KpFE1K&*V8WGl<|AHMag9KnD0?{-f;*O|i8Da% z@)mOwYlb%{=mmYR4}jvo8-eBEtRCqmk53GvT-&p70lgTg=2cL%b#?Fdn{O*KuWPZ8 zT8TYlegd+OGb3f#aar9)jHt63G2$8_3Gf3mG7oUjH3m{ZR9YcB%E~HJ>m-|;sJNBt z2z>zZ=cbCwRH1mPBrch5f__W!CN~IDWo%XDMk2AATg8{KzvZ0yKHfe;BgNXDlaRX$ zE;8!zvDUeH5p>)=w6~s1UI~+u{hpiefo|1+PRMiQL&g~wXxxXL*#X5|(%%3+02fuM zfwX8ajX}q@>>op{Fj6l|pe`R-ZbRGjS@K{AG1BHG$2xgPnP=oU<rfGfT3 zc?$f%%8|imq2(fwtIz+UvnTjvH4Qm5By8Hb;Jw(NL0=9&0+v+G=v-4BvIi^&(Rtq7 zhdvp#KSUzemWFIKNlXOzuOx@Ux3Lu7;(=}Z|8Sbb&pR$+-esE__SdGrgCLVX1mO+L Jt_9n{e*k2O>Fodj literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/distributions/wheel.py b/venv/lib/python2.7/site-packages/pip/_internal/distributions/wheel.py new file mode 100644 index 0000000..bf3482b --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/distributions/wheel.py @@ -0,0 +1,36 @@ +from zipfile import ZipFile + +from pip._internal.distributions.base import AbstractDistribution +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.wheel import pkg_resources_distribution_for_wheel + +if MYPY_CHECK_RUNNING: + from pip._vendor.pkg_resources import Distribution + from pip._internal.index.package_finder import PackageFinder + + +class WheelDistribution(AbstractDistribution): + """Represents a wheel distribution. + + This does not need any preparation as wheels can be directly unpacked. + """ + + def get_pkg_resources_distribution(self): + # type: () -> Distribution + """Loads the metadata from the wheel file into memory and returns a + Distribution that uses it, not relying on the wheel file or + requirement. + """ + # Set as part of preparation during download. + assert self.req.local_file_path + # Wheels are never unnamed. + assert self.req.name + + with ZipFile(self.req.local_file_path, allowZip64=True) as z: + return pkg_resources_distribution_for_wheel( + z, self.req.name, self.req.local_file_path + ) + + def prepare_distribution_metadata(self, finder, build_isolation): + # type: (PackageFinder, bool) -> None + pass diff --git a/venv/lib/python2.7/site-packages/pip/_internal/distributions/wheel.pyc b/venv/lib/python2.7/site-packages/pip/_internal/distributions/wheel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c5f61b14fcaa53fa10a3913cb4f6ac1e994a255 GIT binary patch literal 1781 zcmcIk&5qne5H8#EvpY#(v*ZE@)Pfx5K)g~Ei+F6-hOxZ=uqx|eSiNOnf)-EJ)C{jzq^ii?Xx3kwQD+?YbT41 z^>W!*`Qlh>(??%M^y~Sr!23w$&(x8AP}YUE{wh3Ac-dy~8eZ<<3k)YPz1mo^&UTv6!4vfT{f{tbUH^g4ecPzQ34g3brM)VY zS7K?KDtLMjmXLucYu_NEYU~RA7Q$-Z*&0ZNP8gU?DzI94(K(=0`p*JVR-08>9|_>Y zAKOUX*mVx8pLf8j0tr1toY=EEl`+i=X!7>0*_7q!nKp#`cX2mOu8ib5Wvl$Le+RyM z&Os=kaVSv!wX zZrptM^yGHMt}rCv(Y97*Z&NXDFLar2zd;z4MOT_amaZ{DmT$YIkMN0J_4?wTKG)GF2yl!o z#nU0I--3~nS&%Z2DrMCa9axj$$dR&Waw#(|K4U!oD>=;G3Kbcn#OI9T$!IW&w|8dK zfFJAXq-y1d#+K`gO=p zx-J@ None + """ + :param dist: A Distribution object. + :param metadata_name: The name of the metadata being accessed + (can be "METADATA" or "PKG-INFO"). + """ + self.dist = dist + self.metadata_name = metadata_name + + def __str__(self): + # type: () -> str + # Use `dist` in the error message because its stringification + # includes more information, like the version and location. + return ( + 'None {} metadata found for distribution: {}'.format( + self.metadata_name, self.dist, + ) + ) + + +class DistributionNotFound(InstallationError): + """Raised when a distribution cannot be found to satisfy a requirement""" + + +class RequirementsFileParseError(InstallationError): + """Raised when a general error occurs parsing a requirements file line.""" + + +class BestVersionAlreadyInstalled(PipError): + """Raised when the most up-to-date version of a package is already + installed.""" + + +class BadCommand(PipError): + """Raised when virtualenv or a command is not found""" + + +class CommandError(PipError): + """Raised when there is an error in command-line arguments""" + + +class SubProcessError(PipError): + """Raised when there is an error raised while executing a + command in subprocess""" + + +class PreviousBuildDirError(PipError): + """Raised when there's a previous conflicting build directory""" + + +class NetworkConnectionError(PipError): + """HTTP connection error""" + + def __init__(self, error_msg, response=None, request=None): + # type: (Text, Response, Request) -> None + """ + Initialize NetworkConnectionError with `request` and `response` + objects. + """ + self.response = response + self.request = request + self.error_msg = error_msg + if (self.response is not None and not self.request and + hasattr(response, 'request')): + self.request = self.response.request + super(NetworkConnectionError, self).__init__( + error_msg, response, request) + + def __str__(self): + # type: () -> str + return str(self.error_msg) + + +class InvalidWheelFilename(InstallationError): + """Invalid wheel filename.""" + + +class UnsupportedWheel(InstallationError): + """Unsupported wheel.""" + + +class MetadataInconsistent(InstallationError): + """Built metadata contains inconsistent information. + + This is raised when the metadata contains values (e.g. name and version) + that do not match the information previously obtained from sdist filename + or user-supplied ``#egg=`` value. + """ + def __init__(self, ireq, field, built): + # type: (InstallRequirement, str, Any) -> None + self.ireq = ireq + self.field = field + self.built = built + + def __str__(self): + # type: () -> str + return "Requested {} has different {} in metadata: {!r}".format( + self.ireq, self.field, self.built, + ) + + +class HashErrors(InstallationError): + """Multiple HashError instances rolled into one for reporting""" + + def __init__(self): + # type: () -> None + self.errors = [] # type: List[HashError] + + def append(self, error): + # type: (HashError) -> None + self.errors.append(error) + + def __str__(self): + # type: () -> str + lines = [] + self.errors.sort(key=lambda e: e.order) + for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__): + lines.append(cls.head) + lines.extend(e.body() for e in errors_of_cls) + if lines: + return '\n'.join(lines) + return '' + + def __nonzero__(self): + # type: () -> bool + return bool(self.errors) + + def __bool__(self): + # type: () -> bool + return self.__nonzero__() + + +class HashError(InstallationError): + """ + A failure to verify a package against known-good hashes + + :cvar order: An int sorting hash exception classes by difficulty of + recovery (lower being harder), so the user doesn't bother fretting + about unpinned packages when he has deeper issues, like VCS + dependencies, to deal with. Also keeps error reports in a + deterministic order. + :cvar head: A section heading for display above potentially many + exceptions of this kind + :ivar req: The InstallRequirement that triggered this error. This is + pasted on after the exception is instantiated, because it's not + typically available earlier. + + """ + req = None # type: Optional[InstallRequirement] + head = '' + order = None # type: Optional[int] + + def body(self): + # type: () -> str + """Return a summary of me for display under the heading. + + This default implementation simply prints a description of the + triggering requirement. + + :param req: The InstallRequirement that provoked this error, with + its link already populated by the resolver's _populate_link(). + + """ + return ' {}'.format(self._requirement_name()) + + def __str__(self): + # type: () -> str + return '{}\n{}'.format(self.head, self.body()) + + def _requirement_name(self): + # type: () -> str + """Return a description of the requirement that triggered me. + + This default implementation returns long description of the req, with + line numbers + + """ + return str(self.req) if self.req else 'unknown package' + + +class VcsHashUnsupported(HashError): + """A hash was provided for a version-control-system-based requirement, but + we don't have a method for hashing those.""" + + order = 0 + head = ("Can't verify hashes for these requirements because we don't " + "have a way to hash version control repositories:") + + +class DirectoryUrlHashUnsupported(HashError): + """A hash was provided for a version-control-system-based requirement, but + we don't have a method for hashing those.""" + + order = 1 + head = ("Can't verify hashes for these file:// requirements because they " + "point to directories:") + + +class HashMissing(HashError): + """A hash was needed for a requirement but is absent.""" + + order = 2 + head = ('Hashes are required in --require-hashes mode, but they are ' + 'missing from some requirements. Here is a list of those ' + 'requirements along with the hashes their downloaded archives ' + 'actually had. Add lines like these to your requirements files to ' + 'prevent tampering. (If you did not enable --require-hashes ' + 'manually, note that it turns on automatically when any package ' + 'has a hash.)') + + def __init__(self, gotten_hash): + # type: (str) -> None + """ + :param gotten_hash: The hash of the (possibly malicious) archive we + just downloaded + """ + self.gotten_hash = gotten_hash + + def body(self): + # type: () -> str + # Dodge circular import. + from pip._internal.utils.hashes import FAVORITE_HASH + + package = None + if self.req: + # In the case of URL-based requirements, display the original URL + # seen in the requirements file rather than the package name, + # so the output can be directly copied into the requirements file. + package = (self.req.original_link if self.req.original_link + # In case someone feeds something downright stupid + # to InstallRequirement's constructor. + else getattr(self.req, 'req', None)) + return ' {} --hash={}:{}'.format(package or 'unknown package', + FAVORITE_HASH, + self.gotten_hash) + + +class HashUnpinned(HashError): + """A requirement had a hash specified but was not pinned to a specific + version.""" + + order = 3 + head = ('In --require-hashes mode, all requirements must have their ' + 'versions pinned with ==. These do not:') + + +class HashMismatch(HashError): + """ + Distribution file hash values don't match. + + :ivar package_name: The name of the package that triggered the hash + mismatch. Feel free to write to this after the exception is raise to + improve its error message. + + """ + order = 4 + head = ('THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS ' + 'FILE. If you have updated the package versions, please update ' + 'the hashes. Otherwise, examine the package contents carefully; ' + 'someone may have tampered with them.') + + def __init__(self, allowed, gots): + # type: (Dict[str, List[str]], Dict[str, _Hash]) -> None + """ + :param allowed: A dict of algorithm names pointing to lists of allowed + hex digests + :param gots: A dict of algorithm names pointing to hashes we + actually got from the files under suspicion + """ + self.allowed = allowed + self.gots = gots + + def body(self): + # type: () -> str + return ' {}:\n{}'.format(self._requirement_name(), + self._hash_comparison()) + + def _hash_comparison(self): + # type: () -> str + """ + Return a comparison of actual and expected hash values. + + Example:: + + Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde + or 123451234512345123451234512345123451234512345 + Got bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef + + """ + def hash_then_or(hash_name): + # type: (str) -> chain[str] + # For now, all the decent hashes have 6-char names, so we can get + # away with hard-coding space literals. + return chain([hash_name], repeat(' or')) + + lines = [] # type: List[str] + for hash_name, expecteds in iteritems(self.allowed): + prefix = hash_then_or(hash_name) + lines.extend((' Expected {} {}'.format(next(prefix), e)) + for e in expecteds) + lines.append(' Got {}\n'.format( + self.gots[hash_name].hexdigest())) + return '\n'.join(lines) + + +class UnsupportedPythonVersion(InstallationError): + """Unsupported python version according to Requires-Python package + metadata.""" + + +class ConfigurationFileCouldNotBeLoaded(ConfigurationError): + """When there are errors while loading a configuration file + """ + + def __init__(self, reason="could not be loaded", fname=None, error=None): + # type: (str, Optional[str], Optional[configparser.Error]) -> None + super(ConfigurationFileCouldNotBeLoaded, self).__init__(error) + self.reason = reason + self.fname = fname + self.error = error + + def __str__(self): + # type: () -> str + if self.fname is not None: + message_part = " in {}.".format(self.fname) + else: + assert self.error is not None + message_part = ".\n{}\n".format(self.error) + return "Configuration file {}{}".format(self.reason, message_part) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/exceptions.pyc b/venv/lib/python2.7/site-packages/pip/_internal/exceptions.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c864e052432b1a0312b85b78946e328632a003c9 GIT binary patch literal 17784 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 Z+f$UU$lc3>#|O_1_T%4aTpthi{4YkCaoGR> literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/index/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/index/__init__.py new file mode 100644 index 0000000..7a17b7b --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/index/__init__.py @@ -0,0 +1,2 @@ +"""Index interaction code +""" diff --git a/venv/lib/python2.7/site-packages/pip/_internal/index/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/index/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0018d26552526a700ae7e11ca9c7a94c4157ac1 GIT binary patch literal 192 zcmZSn%*%DVb8CDu0~9aX;V0{w!_0^Q8K;*!Li99<*N ytSYlykPsNhgU!uL%+b#TS)(5h6v!-zkJl@xEa3p^x5>>1G%OIh#3Hqy)Eqk literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/index/collector.py b/venv/lib/python2.7/site-packages/pip/_internal/index/collector.py new file mode 100644 index 0000000..ef2100f --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/index/collector.py @@ -0,0 +1,678 @@ +""" +The main purpose of this module is to expose LinkCollector.collect_links(). +""" + +import cgi +import functools +import itertools +import logging +import mimetypes +import os +import re +from collections import OrderedDict + +from pip._vendor import html5lib, requests +from pip._vendor.distlib.compat import unescape +from pip._vendor.requests.exceptions import RetryError, SSLError +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request + +from pip._internal.exceptions import NetworkConnectionError +from pip._internal.models.link import Link +from pip._internal.models.search_scope import SearchScope +from pip._internal.network.utils import raise_for_status +from pip._internal.utils.compat import lru_cache +from pip._internal.utils.filetypes import ARCHIVE_EXTENSIONS +from pip._internal.utils.misc import pairwise, redact_auth_from_url +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.urls import path_to_url, url_to_path +from pip._internal.vcs import is_url, vcs + +if MYPY_CHECK_RUNNING: + from optparse import Values + from typing import ( + Callable, + Iterable, + List, + MutableMapping, + Optional, + Sequence, + Tuple, + Union, + ) + import xml.etree.ElementTree + + from pip._vendor.requests import Response + + from pip._internal.network.session import PipSession + + HTMLElement = xml.etree.ElementTree.Element + ResponseHeaders = MutableMapping[str, str] + + +logger = logging.getLogger(__name__) + + +def _match_vcs_scheme(url): + # type: (str) -> Optional[str] + """Look for VCS schemes in the URL. + + Returns the matched VCS scheme, or None if there's no match. + """ + for scheme in vcs.schemes: + if url.lower().startswith(scheme) and url[len(scheme)] in '+:': + return scheme + return None + + +def _is_url_like_archive(url): + # type: (str) -> bool + """Return whether the URL looks like an archive. + """ + filename = Link(url).filename + for bad_ext in ARCHIVE_EXTENSIONS: + if filename.endswith(bad_ext): + return True + return False + + +class _NotHTML(Exception): + def __init__(self, content_type, request_desc): + # type: (str, str) -> None + super(_NotHTML, self).__init__(content_type, request_desc) + self.content_type = content_type + self.request_desc = request_desc + + +def _ensure_html_header(response): + # type: (Response) -> None + """Check the Content-Type header to ensure the response contains HTML. + + Raises `_NotHTML` if the content type is not text/html. + """ + content_type = response.headers.get("Content-Type", "") + if not content_type.lower().startswith("text/html"): + raise _NotHTML(content_type, response.request.method) + + +class _NotHTTP(Exception): + pass + + +def _ensure_html_response(url, session): + # type: (str, PipSession) -> None + """Send a HEAD request to the URL, and ensure the response contains HTML. + + Raises `_NotHTTP` if the URL is not available for a HEAD request, or + `_NotHTML` if the content type is not text/html. + """ + scheme, netloc, path, query, fragment = urllib_parse.urlsplit(url) + if scheme not in {'http', 'https'}: + raise _NotHTTP() + + resp = session.head(url, allow_redirects=True) + raise_for_status(resp) + + _ensure_html_header(resp) + + +def _get_html_response(url, session): + # type: (str, PipSession) -> Response + """Access an HTML page with GET, and return the response. + + This consists of three parts: + + 1. If the URL looks suspiciously like an archive, send a HEAD first to + check the Content-Type is HTML, to avoid downloading a large file. + Raise `_NotHTTP` if the content type cannot be determined, or + `_NotHTML` if it is not HTML. + 2. Actually perform the request. Raise HTTP exceptions on network failures. + 3. Check the Content-Type header to make sure we got HTML, and raise + `_NotHTML` otherwise. + """ + if _is_url_like_archive(url): + _ensure_html_response(url, session=session) + + logger.debug('Getting page %s', redact_auth_from_url(url)) + + resp = session.get( + url, + headers={ + "Accept": "text/html", + # We don't want to blindly returned cached data for + # /simple/, because authors generally expecting that + # twine upload && pip install will function, but if + # they've done a pip install in the last ~10 minutes + # it won't. Thus by setting this to zero we will not + # blindly use any cached data, however the benefit of + # using max-age=0 instead of no-cache, is that we will + # still support conditional requests, so we will still + # minimize traffic sent in cases where the page hasn't + # changed at all, we will just always incur the round + # trip for the conditional GET now instead of only + # once per 10 minutes. + # For more information, please see pypa/pip#5670. + "Cache-Control": "max-age=0", + }, + ) + raise_for_status(resp) + + # The check for archives above only works if the url ends with + # something that looks like an archive. However that is not a + # requirement of an url. Unless we issue a HEAD request on every + # url we cannot know ahead of time for sure if something is HTML + # or not. However we can check after we've downloaded it. + _ensure_html_header(resp) + + return resp + + +def _get_encoding_from_headers(headers): + # type: (ResponseHeaders) -> Optional[str] + """Determine if we have any encoding information in our headers. + """ + if headers and "Content-Type" in headers: + content_type, params = cgi.parse_header(headers["Content-Type"]) + if "charset" in params: + return params['charset'] + return None + + +def _determine_base_url(document, page_url): + # type: (HTMLElement, str) -> str + """Determine the HTML document's base URL. + + This looks for a ```` tag in the HTML document. If present, its href + attribute denotes the base URL of anchor tags in the document. If there is + no such tag (or if it does not have a valid href attribute), the HTML + file's URL is used as the base URL. + + :param document: An HTML document representation. The current + implementation expects the result of ``html5lib.parse()``. + :param page_url: The URL of the HTML document. + """ + for base in document.findall(".//base"): + href = base.get("href") + if href is not None: + return href + return page_url + + +def _clean_url_path_part(part): + # type: (str) -> str + """ + Clean a "part" of a URL path (i.e. after splitting on "@" characters). + """ + # We unquote prior to quoting to make sure nothing is double quoted. + return urllib_parse.quote(urllib_parse.unquote(part)) + + +def _clean_file_url_path(part): + # type: (str) -> str + """ + Clean the first part of a URL path that corresponds to a local + filesystem path (i.e. the first part after splitting on "@" characters). + """ + # We unquote prior to quoting to make sure nothing is double quoted. + # Also, on Windows the path part might contain a drive letter which + # should not be quoted. On Linux where drive letters do not + # exist, the colon should be quoted. We rely on urllib.request + # to do the right thing here. + return urllib_request.pathname2url(urllib_request.url2pathname(part)) + + +# percent-encoded: / +_reserved_chars_re = re.compile('(@|%2F)', re.IGNORECASE) + + +def _clean_url_path(path, is_local_path): + # type: (str, bool) -> str + """ + Clean the path portion of a URL. + """ + if is_local_path: + clean_func = _clean_file_url_path + else: + clean_func = _clean_url_path_part + + # Split on the reserved characters prior to cleaning so that + # revision strings in VCS URLs are properly preserved. + parts = _reserved_chars_re.split(path) + + cleaned_parts = [] + for to_clean, reserved in pairwise(itertools.chain(parts, [''])): + cleaned_parts.append(clean_func(to_clean)) + # Normalize %xx escapes (e.g. %2f -> %2F) + cleaned_parts.append(reserved.upper()) + + return ''.join(cleaned_parts) + + +def _clean_link(url): + # type: (str) -> str + """ + Make sure a link is fully quoted. + For example, if ' ' occurs in the URL, it will be replaced with "%20", + and without double-quoting other characters. + """ + # Split the URL into parts according to the general structure + # `scheme://netloc/path;parameters?query#fragment`. + result = urllib_parse.urlparse(url) + # If the netloc is empty, then the URL refers to a local filesystem path. + is_local_path = not result.netloc + path = _clean_url_path(result.path, is_local_path=is_local_path) + return urllib_parse.urlunparse(result._replace(path=path)) + + +def _create_link_from_element( + anchor, # type: HTMLElement + page_url, # type: str + base_url, # type: str +): + # type: (...) -> Optional[Link] + """ + Convert an anchor element in a simple repository page to a Link. + """ + href = anchor.get("href") + if not href: + return None + + url = _clean_link(urllib_parse.urljoin(base_url, href)) + pyrequire = anchor.get('data-requires-python') + pyrequire = unescape(pyrequire) if pyrequire else None + + yanked_reason = anchor.get('data-yanked') + if yanked_reason: + # This is a unicode string in Python 2 (and 3). + yanked_reason = unescape(yanked_reason) + + link = Link( + url, + comes_from=page_url, + requires_python=pyrequire, + yanked_reason=yanked_reason, + ) + + return link + + +class CacheablePageContent(object): + def __init__(self, page): + # type: (HTMLPage) -> None + assert page.cache_link_parsing + self.page = page + + def __eq__(self, other): + # type: (object) -> bool + return (isinstance(other, type(self)) and + self.page.url == other.page.url) + + def __hash__(self): + # type: () -> int + return hash(self.page.url) + + +def with_cached_html_pages( + fn, # type: Callable[[HTMLPage], Iterable[Link]] +): + # type: (...) -> Callable[[HTMLPage], List[Link]] + """ + Given a function that parses an Iterable[Link] from an HTMLPage, cache the + function's result (keyed by CacheablePageContent), unless the HTMLPage + `page` has `page.cache_link_parsing == False`. + """ + + @lru_cache(maxsize=None) + def wrapper(cacheable_page): + # type: (CacheablePageContent) -> List[Link] + return list(fn(cacheable_page.page)) + + @functools.wraps(fn) + def wrapper_wrapper(page): + # type: (HTMLPage) -> List[Link] + if page.cache_link_parsing: + return wrapper(CacheablePageContent(page)) + return list(fn(page)) + + return wrapper_wrapper + + +@with_cached_html_pages +def parse_links(page): + # type: (HTMLPage) -> Iterable[Link] + """ + Parse an HTML document, and yield its anchor elements as Link objects. + """ + document = html5lib.parse( + page.content, + transport_encoding=page.encoding, + namespaceHTMLElements=False, + ) + + url = page.url + base_url = _determine_base_url(document, url) + for anchor in document.findall(".//a"): + link = _create_link_from_element( + anchor, + page_url=url, + base_url=base_url, + ) + if link is None: + continue + yield link + + +class HTMLPage(object): + """Represents one page, along with its URL""" + + def __init__( + self, + content, # type: bytes + encoding, # type: Optional[str] + url, # type: str + cache_link_parsing=True, # type: bool + ): + # type: (...) -> None + """ + :param encoding: the encoding to decode the given content. + :param url: the URL from which the HTML was downloaded. + :param cache_link_parsing: whether links parsed from this page's url + should be cached. PyPI index urls should + have this set to False, for example. + """ + self.content = content + self.encoding = encoding + self.url = url + self.cache_link_parsing = cache_link_parsing + + def __str__(self): + # type: () -> str + return redact_auth_from_url(self.url) + + +def _handle_get_page_fail( + link, # type: Link + reason, # type: Union[str, Exception] + meth=None # type: Optional[Callable[..., None]] +): + # type: (...) -> None + if meth is None: + meth = logger.debug + meth("Could not fetch URL %s: %s - skipping", link, reason) + + +def _make_html_page(response, cache_link_parsing=True): + # type: (Response, bool) -> HTMLPage + encoding = _get_encoding_from_headers(response.headers) + return HTMLPage( + response.content, + encoding=encoding, + url=response.url, + cache_link_parsing=cache_link_parsing) + + +def _get_html_page(link, session=None): + # type: (Link, Optional[PipSession]) -> Optional[HTMLPage] + if session is None: + raise TypeError( + "_get_html_page() missing 1 required keyword argument: 'session'" + ) + + url = link.url.split('#', 1)[0] + + # Check for VCS schemes that do not support lookup as web pages. + vcs_scheme = _match_vcs_scheme(url) + if vcs_scheme: + logger.warning('Cannot look at %s URL %s because it does not support ' + 'lookup as web pages.', vcs_scheme, link) + return None + + # Tack index.html onto file:// URLs that point to directories + scheme, _, path, _, _, _ = urllib_parse.urlparse(url) + if (scheme == 'file' and os.path.isdir(urllib_request.url2pathname(path))): + # add trailing slash if not present so urljoin doesn't trim + # final segment + if not url.endswith('/'): + url += '/' + url = urllib_parse.urljoin(url, 'index.html') + logger.debug(' file: URL is directory, getting %s', url) + + try: + resp = _get_html_response(url, session=session) + except _NotHTTP: + logger.warning( + 'Skipping page %s because it looks like an archive, and cannot ' + 'be checked by a HTTP HEAD request.', link, + ) + except _NotHTML as exc: + logger.warning( + 'Skipping page %s because the %s request got Content-Type: %s.' + 'The only supported Content-Type is text/html', + link, exc.request_desc, exc.content_type, + ) + except NetworkConnectionError as exc: + _handle_get_page_fail(link, exc) + except RetryError as exc: + _handle_get_page_fail(link, exc) + except SSLError as exc: + reason = "There was a problem confirming the ssl certificate: " + reason += str(exc) + _handle_get_page_fail(link, reason, meth=logger.info) + except requests.ConnectionError as exc: + _handle_get_page_fail(link, "connection error: {}".format(exc)) + except requests.Timeout: + _handle_get_page_fail(link, "timed out") + else: + return _make_html_page(resp, + cache_link_parsing=link.cache_link_parsing) + return None + + +def _remove_duplicate_links(links): + # type: (Iterable[Link]) -> List[Link] + """ + Return a list of links, with duplicates removed and ordering preserved. + """ + # We preserve the ordering when removing duplicates because we can. + return list(OrderedDict.fromkeys(links)) + + +def group_locations(locations, expand_dir=False): + # type: (Sequence[str], bool) -> Tuple[List[str], List[str]] + """ + Divide a list of locations into two groups: "files" (archives) and "urls." + + :return: A pair of lists (files, urls). + """ + files = [] + urls = [] + + # puts the url for the given file path into the appropriate list + def sort_path(path): + # type: (str) -> None + url = path_to_url(path) + if mimetypes.guess_type(url, strict=False)[0] == 'text/html': + urls.append(url) + else: + files.append(url) + + for url in locations: + + is_local_path = os.path.exists(url) + is_file_url = url.startswith('file:') + + if is_local_path or is_file_url: + if is_local_path: + path = url + else: + path = url_to_path(url) + if os.path.isdir(path): + if expand_dir: + path = os.path.realpath(path) + for item in os.listdir(path): + sort_path(os.path.join(path, item)) + elif is_file_url: + urls.append(url) + else: + logger.warning( + "Path '%s' is ignored: it is a directory.", path, + ) + elif os.path.isfile(path): + sort_path(path) + else: + logger.warning( + "Url '%s' is ignored: it is neither a file " + "nor a directory.", url, + ) + elif is_url(url): + # Only add url with clear scheme + urls.append(url) + else: + logger.warning( + "Url '%s' is ignored. It is either a non-existing " + "path or lacks a specific scheme.", url, + ) + + return files, urls + + +class CollectedLinks(object): + + """ + Encapsulates the return value of a call to LinkCollector.collect_links(). + + The return value includes both URLs to project pages containing package + links, as well as individual package Link objects collected from other + sources. + + This info is stored separately as: + + (1) links from the configured file locations, + (2) links from the configured find_links, and + (3) urls to HTML project pages, as described by the PEP 503 simple + repository API. + """ + + def __init__( + self, + files, # type: List[Link] + find_links, # type: List[Link] + project_urls, # type: List[Link] + ): + # type: (...) -> None + """ + :param files: Links from file locations. + :param find_links: Links from find_links. + :param project_urls: URLs to HTML project pages, as described by + the PEP 503 simple repository API. + """ + self.files = files + self.find_links = find_links + self.project_urls = project_urls + + +class LinkCollector(object): + + """ + Responsible for collecting Link objects from all configured locations, + making network requests as needed. + + The class's main method is its collect_links() method. + """ + + def __init__( + self, + session, # type: PipSession + search_scope, # type: SearchScope + ): + # type: (...) -> None + self.search_scope = search_scope + self.session = session + + @classmethod + def create(cls, session, options, suppress_no_index=False): + # type: (PipSession, Values, bool) -> LinkCollector + """ + :param session: The Session to use to make requests. + :param suppress_no_index: Whether to ignore the --no-index option + when constructing the SearchScope object. + """ + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index and not suppress_no_index: + logger.debug( + 'Ignoring indexes: %s', + ','.join(redact_auth_from_url(url) for url in index_urls), + ) + index_urls = [] + + # Make sure find_links is a list before passing to create(). + find_links = options.find_links or [] + + search_scope = SearchScope.create( + find_links=find_links, index_urls=index_urls, + ) + link_collector = LinkCollector( + session=session, search_scope=search_scope, + ) + return link_collector + + @property + def find_links(self): + # type: () -> List[str] + return self.search_scope.find_links + + def fetch_page(self, location): + # type: (Link) -> Optional[HTMLPage] + """ + Fetch an HTML page containing package links. + """ + return _get_html_page(location, session=self.session) + + def collect_links(self, project_name): + # type: (str) -> CollectedLinks + """Find all available links for the given project name. + + :return: All the Link objects (unfiltered), as a CollectedLinks object. + """ + search_scope = self.search_scope + index_locations = search_scope.get_index_urls_locations(project_name) + index_file_loc, index_url_loc = group_locations(index_locations) + fl_file_loc, fl_url_loc = group_locations( + self.find_links, expand_dir=True, + ) + + file_links = [ + Link(url) for url in itertools.chain(index_file_loc, fl_file_loc) + ] + + # We trust every directly linked archive in find_links + find_link_links = [Link(url, '-f') for url in self.find_links] + + # We trust every url that the user has given us whether it was given + # via --index-url or --find-links. + # We want to filter out anything that does not have a secure origin. + url_locations = [ + link for link in itertools.chain( + # Mark PyPI indices as "cache_link_parsing == False" -- this + # will avoid caching the result of parsing the page for links. + (Link(url, cache_link_parsing=False) for url in index_url_loc), + (Link(url) for url in fl_url_loc), + ) + if self.session.is_secure_origin(link) + ] + + url_locations = _remove_duplicate_links(url_locations) + lines = [ + '{} location(s) to search for versions of {}:'.format( + len(url_locations), project_name, + ), + ] + for link in url_locations: + lines.append('* {}'.format(link)) + logger.debug('\n'.join(lines)) + + return CollectedLinks( + files=file_links, + find_links=find_link_links, + project_urls=url_locations, + ) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/index/collector.pyc b/venv/lib/python2.7/site-packages/pip/_internal/index/collector.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f26281edba334582617167e85a850508e08634f GIT binary patch literal 21630 zcmch9TWlOxn%=2y-kKss>MqJ2sVrL~$`V_)WXrR(?3GMiERRKLi?n6;SleoK70IUh zLRD2u;*69`A}2GG-A#bq&2_PhY!=u6StJOO>`O4Y>>vp+c?pm_Q6H0Y>>eQ)o`Okm({{Ng}@xM-v|KX2*zglMEnk7hQAAwMwp1avs|q za?Nqq+TkiYTx-HrCaiSWH78wbr>pF=`w`cia;<4snRcyRuCmKYM_qHbYwdBBy>>sQ z`+csm-|kDUdBC*}y2?SjA9u|e*E-}XhwOfbYrf=KFT2Xic0b{o-*BzNu5#G!CtdT1 zYx%C?+x<@0e8shny2??zpK{GtUF$VhdCj$sxymssop#M{y4G=5Id1p6Tyxg7PPobm z*LvMmUboWSu6fe6PPxh{*P3&cIp;;kUA(_Qn(T4SvTL1omD5&tuWP>HT5r0_o33@n zRnEB9SywshT5q|^TdwuCtGw-6=UnBSYrW$t@3_{tT;*H#CRXt0TxDLA-{+d|y4HDD zId9MQyXJeY^}egTkG|*K`p>)d3vT_Qt9;<1w_LQq|0@MIQ@P~Y&P79R{j!U$xTj!= zt1dj?z676q=)!}_Tyx=!i#~EI82%xaJaz8#%C}wkk{*BT!k6>M-{?KQ?!v=*yy(Is z%G_|FugpyszM{-8xbUblfeT+%X30gPZhhH>uPO71dkV(<)P=|N^p*?1smy0CJg&^= zE}V5yMMFEm5)JJ;E__{&zi`nPES0G&_$68&!}+4g=h2T-s&~C>cY44(sRAiH8!?1`wj*1I+F3_wa9PP8f|~0 z8*g-y$nUK9=~^T4Tb;1mjC|zMjvqbJvyU6?dkdXrGpeVZxLmhfwTaSX_C$HS@xSo1 zIP0O^bO(|faTvu>c&SlOXA3MGL$a2(nr}B7cXbm-_q$P&CiV^=ciT}?uWdy3!Z=ET zD2+ES$8jgtD@#is>&9LgMum-9oJ4jzircJBE7*^M#VCE)i81hY8v}22+5_(o;W=kz zwK?des211Pmg*ghK{J_Vo3%y~RaZK3HA!n}HydvWPnvPJTCdgDvdX(rbTL@?@Y<)B ztCv4pzPz|}?Z)C#fA$--M*I+MrF+?G6xQl#wbo77sw;7)Rqe)2>yyn~|NQ3X)rAi) zFMPWie6qNBZSkr#!$EG;@Jia@3!*fB^OnU{X#|xTiJnvOKB#9yX8EVJCWt;uYKx)^ zwPv$+w;Ac?S{lW=G0G%qx)b%TcT*N#uWf8J+N-K~V}qouHEmJ2j_rDsay^#28)%HV zPui$rGh%N+lx%d``C4&pZ#FiTq9j4BI%!QNVZRHwlB-A_U2v&$>z=!G`)&8cbB}RT zpm41h-D8h>A|7X9I+WecK)2l+QK{#a?vJ}$;&;*@Sw-@3r*qH8I{Ke3EcpqRtraCc zxIcv$d=h+I9v}Dd1D5N?ZE(JXBSp1v;Du8@-e2srAsmzyu=w%BZ+9R@s99D631@P0 zesPxc4!G7SSu^WUv}tx8MsZ3afTiLzdDuwTQjW73wJ{yAEqbuUWGPpgjad`3$T=m+ zdE`!~t&P(gjg7fR8;v!ab7!utfA?IAMY^huHkK8Ob-K|GqerJR$%PDWY^J-=KviR} zf=#N{!M9MDaLwGvw0F`Q^Rzx32(JZP33Uh-2h_(hV2Q9ik6v+U0c$nmo)owsTqP_Q zR%t(%XzBibcMFqW5=$g!(120ef4CNrkohwBO)OL5HyigNzt;9Ckc|hCk=95`(G%yb zG(fLfD+(s_lBgXTF-gSbxNEF=gtBOF;S;oW~pnrS)J2U<#^E>##UWQ58=n-Hj*?%Dm;;SHU-pv|3Fk za8vJqhuUd1-Q0*&km=cK2!$=eiffaoxe~mI`T>`B8>t$+f%b0VN+<@dFyoax>(+)! zCcsch-fGp1SGB5_`h!sJg(XG=y1|i9%12BznB{V4DXt&`Dz8g*5p8J^sJ|c+x&8`^ zl#JwqOnI^Xuv;JDa{XD4a43YtXl;@|$A;IU`aKB<3>jBqZW$}#uSGQ&S=s1z(v2h4 zh%-g&bJ1Yj6QAsrD>vG*#J`hs-JML0sWRI2xx%#j?GEw~jng#QnO-9&4E7I(105ud zdCkRHsyfM*4K9&dTaD7-6+8%zG9ixzs>juALHavk-%94=7bEqT?}b+`-Gk1mkqA}g ztg1G`TPQZR8rkRV8x+drn{_wqP{QCMFx3~sRKQP)?#YmQg8T^8fbrp4!QC5m@p&rhr!M2POjU#B zisZ(pp7&&w8sYIMTk~LevRt1f|24W?f~xgv{)d+@Uh*?-Kt{}L=_#o0&^KcLtX#Q# zv&WUN$~iOE9@H8_Dze~PJEl>V>HWXrYpJfaG~JLIWF|?cFhkhV&ciBjS|bK@OfuG{ z5WpS-!~$^vdrDcNAlYa(QmvM?2hj{(N8NysEqE7+K$i@V;Q_-w!8h?p*1a92%}!l! z6U%8dKvwal*}Ay4+Jc1YIc22JX)nxV={}5Mi)iFRxPk`>r|d=#d%L}f!ai@jP|x)p z#aBGIfed)i7%)DP*m9v@I=i2iK7T@0F})fAbhjzUlZ0NNX*bl(oHrR^+u`(=Mc8(+5HTer{!il>1iB z#_{3u@=dsk^+>J(NZIzm(Dc3h6-X|uQ(_}OTlW8t=B!l%_>)C@82PIhztM&|Mc!CW z%z@E&h#~1+SucV3l45){N>kEMY;i0JR7ZCUFp!})1&oqg z7ZlFW!oa)$@WYG66nY7ZjF>L#p1y(8{! zw8>O8x|DRsI^8%!HW|lA0c`;u1P}E!sozDzft*5pwIOgSy_{M1;59rj=+A{0sL-mR zQmvJ2=NcSB`&xs1V&>OpIOy--X@>uIdo$jIx5JYjC7pWoe-Ag0&XMwfkDxY)ed+cw zIaE-eh9yCHAbF_LqPtge@ig;G_ov-0=-Q0z{~Zh4Cp%5D6l2(_cWFZ4vEHpgb@Y8+ zX+iV5=pWboJ9o~r%KLZj_-So5capcXBCWUqRzr)Y{06k=S{$uNGHYoXH|};*DjjGa z08Wk}?~_`#)~>IiBedP~!1K}N+7@uOk*GPi*Gad&rjg9zE$|T(RoFqh)NRI4{)1W* zT9ae&d;On)KFwyYmZ(25`wUie6S(%Zt%J+V!o1i6eHg{&{fn7#$xDEFvbl?I%lAH;$kpoUVU)v z3e!EasP;-i$ta&bO|3bkkHLuczo>4l@rqGlr(aJnDs}hzN!D0voP|1646=neL8ZE&YnO^hhuw5cJ{CJqp@ZWoE zMI&x~%srJvc=xX$28ysl$>AaDSTH)FU-Hc2YvDE!W~ULRf;Q_w&JWI^`s_H8;0}{7 zkfZ_}RQ~aUD6GmBW2Gb-<_Ya&EyAn@gedKFnu#8wCgPEVO$a9gCabWEY%Eo?-f6TI zLI^JNec~^~(!^?Fe1&*S7FN3Ly51(oCaS6j7><>Uv4xIFj+9zH-0fr!V!daC^N&!J zkUnmB#48m>hNghKW`VyB7~&#l^tj_HZcLSBjF88PCdeTQbg#oHLMeH`1D~)qTqdk4 zyd>zpA{N`z+7{7P^0$#_ZLjw*G-MUK97OgjU7~pDtI*Wi71-10QH_QQMtsFTj(?px z3|Y@E!{E@o!=q|8=|{luHEVTPPPte|kDYnr=qYtbbk4F)m&Un^ErU7sMC>haKA=;r z?_dpM)k52nU%;&v3Q~H0r#Yti!3RAC$uBt>V*e7vLrehV2aZx7QMfJ4qDts{qZ~}6eG>TBXbK)S zYCiRfi1i@6lR48LVVtHHI_(FLNV?P+Qi}}85DC`&M8Jle&`BED4TNJzpIc^u8*16| z5;7#TUSTb*%~6jdl9J3}+hGk3H_506o3-}6C^X6LU`s}@SrM50m8!iW8MoS4_FB?u zTTG^pW`YEb1{aW+X^xvzC;^ZXsTMre9}m}spd6g^xgrZo*ZUxr78GsLxqC?MF$JW7p4kDl<;4vs2xQ) zs@$o&iN(m=r8-~b55WPwvE)@G(bioBXqPWhqUa1WL)>Q|&1B3N?BTV5D|s0SRS&YT zXC6a{xCIYZ;r{hE75K7DM4isFO^Y(i{X-gtiwO)zZ#PzCB?nn7^(-m`-$$~IRMuX= zDH4-Q=s>{U+*qKwokRx874ylqQDk^KuS>+tRx5&!FxEZBpGeY0=^gQI1GB>h95+JQ zBm?Q1g_x;7Gnp*u!)=_N3~IF+-LF>P>`xM^h-2i{Tfk`!&9spwBg0`c(V}taYqex; zVCZ}ra8b5%z+-5yT4hhw>N)gaK(?SQkA5^=%NBge0sQ$b1JF=jSd|A)(CA6_PL%*b z8ZHfsWF!~K!7CwifMk#oXi(VNAHa>0D~=(7d_Mxeh&z6$TRi=N$8#<4&#i)O{baj2 zgpE?MSFx!{T`Cwu&?S^D!=_MXz8C);D%9IPj|fm5(*>t|pYkPI^d;3?-VD53vwi;T zy=W6w`tGK`Kp}iaF~BqKwgKDC8_io)Q+Fteci>iIpNQG=SB2Pr?>%3es+p%MZHus3 z()e!F<2e#<4++Qw1O$C(tOQmE*p9T$6l;>2+>_&^C)6`X4oC;}pmNqSh$XxtBD zLecngj|+=mox%xpYL+&haX%c?5CGL!ew!O+H83&GKloEj$YuemICD|H&m5-_`~@bz z#9LhMh51=VGn-B|`~6YQ-mX~kraeXR0~2G9mQ2=-w-YGlA#Bg9xuu11j;B<}UC<)C0CGlB-2upD3-k6Iw-TiCaoJGl}9k<_p*VrM8*x#pPFz@un8J1n&U>v2}nS3e6~X%;FGr+(EM41`ZMO1 znSg-CCU)@R`@H>xi6Yr-KX}CCdq~8>+r-B^(4JJGoiAG^H@u88Hv%Qif8gaQZ$Dz$ z!as!x{MKx8MMfUc55?>QTw8Gu&Y4DXuD`^2J0RnN0MKxbdy?aLBgg}M+{@sO5S4DN z*?~JF&xa9D_(pX`gLtv01zd_LXP^kIqUcl=%m-giFbPPU8Fioe<1Nfjs+aC|7WK>5 zWnSUJ{EiqqjKBxB*S{(wk}an(%|H`ymF#WC3}rwbt~D4(%|fF7L$F=G%@k!0;lTS} z)%){)eprVnH~~?>?4h--gM*|JOb~kR&4&$s%})Yf5ds0HQeA~*|K{e+Yw$5}PKj+K zzSa1Xw52Gp#(>Bt$t3%9O1s6GgWD%irUic$%N6_@6Y(>3wE+;Ko#1&-QNB&OTF_>L zj6KFir^MFJ0c<+jG+;S%+$sB^ohFXm3=4<7onlCBTg9ozxLSpv^e`IrNFSp~qg1O1 zALGc)>wNSElfQzbKbGy$3jw2+6qXFHjf_rA$=jx>?cw-SxPjP(*uH|!K1ehV1Hs6f zmCG(bK%W+IPMJOnNx7Jij0@sNZYr!qIM1h8@v&syKbH7&esZs&6Oa}Oeht-wZ!`HA ziIq_e3W}R|DpbScEqyw?xXs*$K7gCsAwUr~{3vl%?yv%f=I2-@5I2{9L%NLNl3wD$ zESO9vAH!f4g5<4q5lJRx#dwnfPY4g#hSK75g(N_G+D+B6n7D`+*=sP*MCgYCww)AE z$c;P1eZ27NoI5cMJ-Z?d1kHpfFpe_vt0-^^D~*NEIO8R925Mep z!y%HrK56k7zKBO?VSOh9Jh)B%K-@g)-Z2(tA5$tqm{)uamvVjDg$VKr;PAA?CeB>$ zQY9Rb{aHv~{|Z`{R4a4N&&iwGj_AWxtvuU*3PJ$il}Z;avekJXr9jmKkd zeXr7e?&%O}|DhX7_p5d@t9>A=r^bGa#|QQJm!9|dH}QBzkAG^9!%6o9b11p=5PQMY z-@$!qZI)cPQ&fKmBgKJ|D&BtCt$#xe{I|jO!zs6ZIBP)Tc+09DQPsV8*|RpoX`A$3 z_gU&Q3KoK5V1ZXit|e)P-Qb+XS_erNCC`!{Net2W%fHGbWV>NRXmGV0pf<;3w! zqClNL>244(K8)@Pl_X^;8tzW0o737qlMyX*Yf;cgM@Qz>0ph@RqzQq$Q$BQvLbNy; zAsM-Yfh}d4PR&0vpy!^>HF#U^oi%~KSw~Ed&L>W4@np#0Ik9p=8hmXhgeM>Z$%@Yd zbo^s*^Pk$dyo@@XHe%TsSLRBhB5(9&EJSSa4B0n_Jchy9En*K zBubK|UuRfqrBO#PZr%_6I$l%&6E(BX2mFX1Bh35XdtwJ48!dE=h__VT>`}bXcdK|t zQ=c0cytvDULY6ceGMf);aU0z$Vi|N;N?X)PZ1-ar`9^}Z3T`78RGH8b4S23YW+%AL z+<7KtCTE!F04}wD@HdzYF=10Wi3wvaZsD1WfSt)_1nmYtkB|+sGZ`A@GG@s+{sx;8 zN}^g7>bK)8RQn2o^$(HTxi&I2$r^2WWP;w#?qB2QuO#;!~ee#9i66mhbRG1el^$xOjhwrd2r8PuD>?_CAH zUFV#56>&*q_8syi~L8sOClv}c)04^k1X}v4|*{&k1;aXwMXxHP`z-(^BpduC0%e@Q8-WL+Vd73 z`H)LK(~d})yPokXD`4}ZJt0$VZ(*BNNQawc+6#&QCrx4e@AC3&3xqE|`do$B3sKEW zw~sh(jKK0+6R_#14Rb8Z?%n^p?$-U29=BxvGowM=Usb0bN+AcZ=|oUy3r6*R#micO z6}5r9!~=|$*JFD_)6^TsxbtZ(#vgfGJHRumZV?K0aLnBTE1(*pj!W{?lRpEpi|Z~m z9yH)A4sac|?HPIJ{vNy}oY3=E<4$)2DEFu~@{jtn*(VFh2{GYOdSd0Hb{KNrj#A=4 z42(k~Ha_Oj$yvROs3Iz7M8n+km_(m7 zSo|YG4GVK!MoxNLw~E?phSHv#qy+25@jSfm4AeXW|G&~0E109WWW}9y2A!X#=^;kmR8v~;vev}e~9G87o9GQq)ta0G|2zR zrKcr#qljr0caKdLc6(EbY?YAihGp6fOXcJDG|m(7=_G#BYE2YaQuKBd6*SL2(u_hz z6q7oenvUAipYS-1r zqBR6=a4GHkwgl7zb8n)GkDL67>3|7Af z%dWOE<0%-75#TofFLfObD&tL6+!9hnL;7|VmQ|rJZNaIj1P4xWfPC;kIMEShD#7M9 zUPvMYxgo zSABsie*_8CEA%tKCT$cl1EEVe%Q=gnVz2EiV#ztfiiqosC|jw}55M(Z$fx|wTY2$U z-pE*kVv3$}hWQharZ-m7;;UqOE_qnhj!p&?eQ6P%pR`r7^JvDZ8jqboIg6UA9{e-r z{y7p;A;`SA;;?OOESCacZjwPm>-Q}*uMd!dzsej#aQ%Ljdtt2={8Kdg5<4f)j7*Ib zbRc7k(+ofr$BEe<5U(LR=%BL+(=C|AfnGmCjv@*E&paA^FFmR(~hE$ z$Xi`fiPf96Bte*4-_G0jYcj}yLD>k5M;Ip1*KL`+ktn=+^2QCYOw4+Mr})%hlvkXV z=*x6`po>q_<#U+}Aa+|oE5T2Y^jG}F7n>Y(HD7Euf^ZsFeGJzyE_RvxB_tUAI&2w~ z1TvmGK(LM+;M)x%*a`fy(@oGFSZjcBTVlZWOIT+92ZV)P$BT$t@!b)(@g1Fp9Hx_u zcp4aidvL=2PhA0c9Y_vgG~z~s>?lO0caG^_VPHLp&y-CTiLpb}*>~r(HjK02m%cd3 z7yT=GhfxM>t0&cV2cN}acVgbZm4CGiLm?n0wK6x??%+dg?q78DAxv)=)F#+GX_Ezk zRlC5dS=?dZj}BxE+wWh|hihz~wbd|n?6E|Vo>O%ib#fEAD&h4K5@_w)y9BSrRG=|- zD-q-EpU>fI`b@>ZEn6tRVQ3dwK#7Q+uooYhTo)$;= z2|H(OK~TN-G@V8fJ~54JMt!{@l$ftaKN4>kQOZ{hQDNBWs^AaUIyqQjh2qVOBP<==(WXmw%Ef|@kQRQ#OzzK79Z8?d@Kva6g2;&!(sPCdj!zM40Y__c;g>4!=`@ho*?dmeTE5^BM(h&yBb!) zxfW<5o=mz&ud&*t+b^rdN$z_NDOp8 z1~KkJ>(XJ9iY{F87m-|n&cG%;9D?5G!eSSp1L8j0G0$BLo}$R?I$5b7+&~Mgy#++f zb^-63IL#h~I6VdIT|>+{^C?&n=LB?mqp!V#f6Q@_HRo396h3BYKBcN(K?ZAd`#@h+ zLq$WeW64cn=Wtsw*F|G$dbWyH*zLdI?J*?V$lF^L_pj!xJ>q(ED568n;b$;69QgmQ zG5=bB%n7%HzxSl)jLjmd1$%FJN^F6X&fKHX*T3I;GB0%dIs^P%vGHfYyrL98!4vFl z0r+4Cwr8g7Lj`&B!9T%6Ga0WlS7(CNwPVQAQ8H?XJ0uZK+ecMc_*EQL{(G$RyG&kX z5;0M%gP}9CZG_<#OOb-(wrB1ak)NgS71g(a<;pLS-Lf(|W(++D!1uDR|?uT4{(w(?< z3UQO7cW~(B(6NzHand_bI9!~75#5LUAv#rGMUcmGgB--}XsNPyp0v&*vNlC(x0AkFN~#xUEb%kXjw)^M+&7<(VIFnHC!5a4Ck`kAwoP;hxq&C;5Ft5y zo`pXI)~7F<9r{jm^jf=TE! zjQp<}l?U1$LtX4CX9Mlkz#oK(5W%J)&{qH{HSg9&vMO7=EOLHI1-G?o<{_55X#)t7 zY=iykXDjJpP8&*S`i-xtLs3*b+Wv?UmCDxstSM|a*8{G-VEfnhh?cn6#LLeil{LlS zNx*oxBCdkGTYJPNoHS2*Cr zb!71o{*Vm*oLdx?v-66}$P0?&iN0XaFpTrcIqw9A`Tkd_moG!+*9GJ~Md{UrxO=c0 zg0bvg&jyZ72EW5s8IsMy3DJl8yE=)S5NP<1^?|=B2kGMDtUJfIXw)v}fAqliVBh7# z^GvQW(GD$zEBK7b7fkLTk#JIYxc+3dYgZR<1eX^sE?o|4tkh;gBdb%GBD&!VJ5EgJ zJNR`bJQSr(XWQ?k-m{(B-(yY&NgJNGzrFN6wLt>R??w>1 z9{e|5*bje(*K`3_@1K=Y8Bcrj;|yp|V-t2yajICFDDBukhHI#_t8})sqqMhFDoyPx gmJXDrOaA`p(#+J%{v#7(6XO# bool + """ + Return whether the given Python version is compatible with a link's + "Requires-Python" value. + + :param version_info: A 3-tuple of ints representing the Python + major-minor-micro version to check. + :param ignore_requires_python: Whether to ignore the "Requires-Python" + value if the given Python version isn't compatible. + """ + try: + is_compatible = check_requires_python( + link.requires_python, version_info=version_info, + ) + except specifiers.InvalidSpecifier: + logger.debug( + "Ignoring invalid Requires-Python (%r) for link: %s", + link.requires_python, link, + ) + else: + if not is_compatible: + version = '.'.join(map(str, version_info)) + if not ignore_requires_python: + logger.debug( + 'Link requires a different Python (%s not in: %r): %s', + version, link.requires_python, link, + ) + return False + + logger.debug( + 'Ignoring failed Requires-Python check (%s not in: %r) ' + 'for link: %s', + version, link.requires_python, link, + ) + + return True + + +class LinkEvaluator(object): + + """ + Responsible for evaluating links for a particular project. + """ + + _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$') + + # Don't include an allow_yanked default value to make sure each call + # site considers whether yanked releases are allowed. This also causes + # that decision to be made explicit in the calling code, which helps + # people when reading the code. + def __init__( + self, + project_name, # type: str + canonical_name, # type: str + formats, # type: FrozenSet[str] + target_python, # type: TargetPython + allow_yanked, # type: bool + ignore_requires_python=None, # type: Optional[bool] + ): + # type: (...) -> None + """ + :param project_name: The user supplied package name. + :param canonical_name: The canonical package name. + :param formats: The formats allowed for this package. Should be a set + with 'binary' or 'source' or both in it. + :param target_python: The target Python interpreter to use when + evaluating link compatibility. This is used, for example, to + check wheel compatibility, as well as when checking the Python + version, e.g. the Python version embedded in a link filename + (or egg fragment) and against an HTML link's optional PEP 503 + "data-requires-python" attribute. + :param allow_yanked: Whether files marked as yanked (in the sense + of PEP 592) are permitted to be candidates for install. + :param ignore_requires_python: Whether to ignore incompatible + PEP 503 "data-requires-python" values in HTML links. Defaults + to False. + """ + if ignore_requires_python is None: + ignore_requires_python = False + + self._allow_yanked = allow_yanked + self._canonical_name = canonical_name + self._ignore_requires_python = ignore_requires_python + self._formats = formats + self._target_python = target_python + + self.project_name = project_name + + def evaluate_link(self, link): + # type: (Link) -> Tuple[bool, Optional[Text]] + """ + Determine whether a link is a candidate for installation. + + :return: A tuple (is_candidate, result), where `result` is (1) a + version string if `is_candidate` is True, and (2) if + `is_candidate` is False, an optional string to log the reason + the link fails to qualify. + """ + version = None + if link.is_yanked and not self._allow_yanked: + reason = link.yanked_reason or '' + # Mark this as a unicode string to prevent "UnicodeEncodeError: + # 'ascii' codec can't encode character" in Python 2 when + # the reason contains non-ascii characters. + return (False, u'yanked for reason: {}'.format(reason)) + + if link.egg_fragment: + egg_info = link.egg_fragment + ext = link.ext + else: + egg_info, ext = link.splitext() + if not ext: + return (False, 'not a file') + if ext not in SUPPORTED_EXTENSIONS: + return (False, 'unsupported archive format: {}'.format(ext)) + if "binary" not in self._formats and ext == WHEEL_EXTENSION: + reason = 'No binaries permitted for {}'.format( + self.project_name) + return (False, reason) + if "macosx10" in link.path and ext == '.zip': + return (False, 'macosx10 one') + if ext == WHEEL_EXTENSION: + try: + wheel = Wheel(link.filename) + except InvalidWheelFilename: + return (False, 'invalid wheel filename') + if canonicalize_name(wheel.name) != self._canonical_name: + reason = 'wrong project name (not {})'.format( + self.project_name) + return (False, reason) + + supported_tags = self._target_python.get_tags() + if not wheel.supported(supported_tags): + # Include the wheel's tags in the reason string to + # simplify troubleshooting compatibility issues. + file_tags = wheel.get_formatted_file_tags() + reason = ( + "none of the wheel's tags match: {}".format( + ', '.join(file_tags) + ) + ) + return (False, reason) + + version = wheel.version + + # This should be up by the self.ok_binary check, but see issue 2700. + if "source" not in self._formats and ext != WHEEL_EXTENSION: + reason = 'No sources permitted for {}'.format(self.project_name) + return (False, reason) + + if not version: + version = _extract_version_from_fragment( + egg_info, self._canonical_name, + ) + if not version: + reason = 'Missing project version for {}'.format(self.project_name) + return (False, reason) + + match = self._py_version_re.search(version) + if match: + version = version[:match.start()] + py_version = match.group(1) + if py_version != self._target_python.py_version: + return (False, 'Python version is incorrect') + + supports_python = _check_link_requires_python( + link, version_info=self._target_python.py_version_info, + ignore_requires_python=self._ignore_requires_python, + ) + if not supports_python: + # Return None for the reason text to suppress calling + # _log_skipped_link(). + return (False, None) + + logger.debug('Found link %s, version: %s', link, version) + + return (True, version) + + +def filter_unallowed_hashes( + candidates, # type: List[InstallationCandidate] + hashes, # type: Hashes + project_name, # type: str +): + # type: (...) -> List[InstallationCandidate] + """ + Filter out candidates whose hashes aren't allowed, and return a new + list of candidates. + + If at least one candidate has an allowed hash, then all candidates with + either an allowed hash or no hash specified are returned. Otherwise, + the given candidates are returned. + + Including the candidates with no hash specified when there is a match + allows a warning to be logged if there is a more preferred candidate + with no hash specified. Returning all candidates in the case of no + matches lets pip report the hash of the candidate that would otherwise + have been installed (e.g. permitting the user to more easily update + their requirements file with the desired hash). + """ + if not hashes: + logger.debug( + 'Given no hashes to check %s links for project %r: ' + 'discarding no candidates', + len(candidates), + project_name, + ) + # Make sure we're not returning back the given value. + return list(candidates) + + matches_or_no_digest = [] + # Collect the non-matches for logging purposes. + non_matches = [] + match_count = 0 + for candidate in candidates: + link = candidate.link + if not link.has_hash: + pass + elif link.is_hash_allowed(hashes=hashes): + match_count += 1 + else: + non_matches.append(candidate) + continue + + matches_or_no_digest.append(candidate) + + if match_count: + filtered = matches_or_no_digest + else: + # Make sure we're not returning back the given value. + filtered = list(candidates) + + if len(filtered) == len(candidates): + discard_message = 'discarding no candidates' + else: + discard_message = 'discarding {} non-matches:\n {}'.format( + len(non_matches), + '\n '.join(str(candidate.link) for candidate in non_matches) + ) + + logger.debug( + 'Checked %s links for project %r against %s hashes ' + '(%s matches, %s no digest): %s', + len(candidates), + project_name, + hashes.digest_count, + match_count, + len(matches_or_no_digest) - match_count, + discard_message + ) + + return filtered + + +class CandidatePreferences(object): + + """ + Encapsulates some of the preferences for filtering and sorting + InstallationCandidate objects. + """ + + def __init__( + self, + prefer_binary=False, # type: bool + allow_all_prereleases=False, # type: bool + ): + # type: (...) -> None + """ + :param allow_all_prereleases: Whether to allow all pre-releases. + """ + self.allow_all_prereleases = allow_all_prereleases + self.prefer_binary = prefer_binary + + +class BestCandidateResult(object): + """A collection of candidates, returned by `PackageFinder.find_best_candidate`. + + This class is only intended to be instantiated by CandidateEvaluator's + `compute_best_candidate()` method. + """ + + def __init__( + self, + candidates, # type: List[InstallationCandidate] + applicable_candidates, # type: List[InstallationCandidate] + best_candidate, # type: Optional[InstallationCandidate] + ): + # type: (...) -> None + """ + :param candidates: A sequence of all available candidates found. + :param applicable_candidates: The applicable candidates. + :param best_candidate: The most preferred candidate found, or None + if no applicable candidates were found. + """ + assert set(applicable_candidates) <= set(candidates) + + if best_candidate is None: + assert not applicable_candidates + else: + assert best_candidate in applicable_candidates + + self._applicable_candidates = applicable_candidates + self._candidates = candidates + + self.best_candidate = best_candidate + + def iter_all(self): + # type: () -> Iterable[InstallationCandidate] + """Iterate through all candidates. + """ + return iter(self._candidates) + + def iter_applicable(self): + # type: () -> Iterable[InstallationCandidate] + """Iterate through the applicable candidates. + """ + return iter(self._applicable_candidates) + + +class CandidateEvaluator(object): + + """ + Responsible for filtering and sorting candidates for installation based + on what tags are valid. + """ + + @classmethod + def create( + cls, + project_name, # type: str + target_python=None, # type: Optional[TargetPython] + prefer_binary=False, # type: bool + allow_all_prereleases=False, # type: bool + specifier=None, # type: Optional[specifiers.BaseSpecifier] + hashes=None, # type: Optional[Hashes] + ): + # type: (...) -> CandidateEvaluator + """Create a CandidateEvaluator object. + + :param target_python: The target Python interpreter to use when + checking compatibility. If None (the default), a TargetPython + object will be constructed from the running Python. + :param specifier: An optional object implementing `filter` + (e.g. `packaging.specifiers.SpecifierSet`) to filter applicable + versions. + :param hashes: An optional collection of allowed hashes. + """ + if target_python is None: + target_python = TargetPython() + if specifier is None: + specifier = specifiers.SpecifierSet() + + supported_tags = target_python.get_tags() + + return cls( + project_name=project_name, + supported_tags=supported_tags, + specifier=specifier, + prefer_binary=prefer_binary, + allow_all_prereleases=allow_all_prereleases, + hashes=hashes, + ) + + def __init__( + self, + project_name, # type: str + supported_tags, # type: List[Tag] + specifier, # type: specifiers.BaseSpecifier + prefer_binary=False, # type: bool + allow_all_prereleases=False, # type: bool + hashes=None, # type: Optional[Hashes] + ): + # type: (...) -> None + """ + :param supported_tags: The PEP 425 tags supported by the target + Python in order of preference (most preferred first). + """ + self._allow_all_prereleases = allow_all_prereleases + self._hashes = hashes + self._prefer_binary = prefer_binary + self._project_name = project_name + self._specifier = specifier + self._supported_tags = supported_tags + + def get_applicable_candidates( + self, + candidates, # type: List[InstallationCandidate] + ): + # type: (...) -> List[InstallationCandidate] + """ + Return the applicable candidates from a list of candidates. + """ + # Using None infers from the specifier instead. + allow_prereleases = self._allow_all_prereleases or None + specifier = self._specifier + versions = { + str(v) for v in specifier.filter( + # We turn the version object into a str here because otherwise + # when we're debundled but setuptools isn't, Python will see + # packaging.version.Version and + # pkg_resources._vendor.packaging.version.Version as different + # types. This way we'll use a str as a common data interchange + # format. If we stop using the pkg_resources provided specifier + # and start using our own, we can drop the cast to str(). + (str(c.version) for c in candidates), + prereleases=allow_prereleases, + ) + } + + # Again, converting version to str to deal with debundling. + applicable_candidates = [ + c for c in candidates if str(c.version) in versions + ] + + filtered_applicable_candidates = filter_unallowed_hashes( + candidates=applicable_candidates, + hashes=self._hashes, + project_name=self._project_name, + ) + + return sorted(filtered_applicable_candidates, key=self._sort_key) + + def _sort_key(self, candidate): + # type: (InstallationCandidate) -> CandidateSortingKey + """ + Function to pass as the `key` argument to a call to sorted() to sort + InstallationCandidates by preference. + + Returns a tuple such that tuples sorting as greater using Python's + default comparison operator are more preferred. + + The preference is as follows: + + First and foremost, candidates with allowed (matching) hashes are + always preferred over candidates without matching hashes. This is + because e.g. if the only candidate with an allowed hash is yanked, + we still want to use that candidate. + + Second, excepting hash considerations, candidates that have been + yanked (in the sense of PEP 592) are always less preferred than + candidates that haven't been yanked. Then: + + If not finding wheels, they are sorted by version only. + If finding wheels, then the sort order is by version, then: + 1. existing installs + 2. wheels ordered via Wheel.support_index_min(self._supported_tags) + 3. source archives + If prefer_binary was set, then all wheels are sorted above sources. + + Note: it was considered to embed this logic into the Link + comparison operators, but then different sdist links + with the same version, would have to be considered equal + """ + valid_tags = self._supported_tags + support_num = len(valid_tags) + build_tag = () # type: BuildTag + binary_preference = 0 + link = candidate.link + if link.is_wheel: + # can raise InvalidWheelFilename + wheel = Wheel(link.filename) + if not wheel.supported(valid_tags): + raise UnsupportedWheel( + "{} is not a supported wheel for this platform. It " + "can't be sorted.".format(wheel.filename) + ) + if self._prefer_binary: + binary_preference = 1 + pri = -(wheel.support_index_min(valid_tags)) + if wheel.build_tag is not None: + match = re.match(r'^(\d+)(.*)$', wheel.build_tag) + build_tag_groups = match.groups() + build_tag = (int(build_tag_groups[0]), build_tag_groups[1]) + else: # sdist + pri = -(support_num) + has_allowed_hash = int(link.is_hash_allowed(self._hashes)) + yank_value = -1 * int(link.is_yanked) # -1 for yanked. + return ( + has_allowed_hash, yank_value, binary_preference, candidate.version, + build_tag, pri, + ) + + def sort_best_candidate( + self, + candidates, # type: List[InstallationCandidate] + ): + # type: (...) -> Optional[InstallationCandidate] + """ + Return the best candidate per the instance's sort order, or None if + no candidate is acceptable. + """ + if not candidates: + return None + best_candidate = max(candidates, key=self._sort_key) + return best_candidate + + def compute_best_candidate( + self, + candidates, # type: List[InstallationCandidate] + ): + # type: (...) -> BestCandidateResult + """ + Compute and return a `BestCandidateResult` instance. + """ + applicable_candidates = self.get_applicable_candidates(candidates) + + best_candidate = self.sort_best_candidate(applicable_candidates) + + return BestCandidateResult( + candidates, + applicable_candidates=applicable_candidates, + best_candidate=best_candidate, + ) + + +class PackageFinder(object): + """This finds packages. + + This is meant to match easy_install's technique for looking for + packages, by reading pages and looking for appropriate links. + """ + + def __init__( + self, + link_collector, # type: LinkCollector + target_python, # type: TargetPython + allow_yanked, # type: bool + format_control=None, # type: Optional[FormatControl] + candidate_prefs=None, # type: CandidatePreferences + ignore_requires_python=None, # type: Optional[bool] + ): + # type: (...) -> None + """ + This constructor is primarily meant to be used by the create() class + method and from tests. + + :param format_control: A FormatControl object, used to control + the selection of source packages / binary packages when consulting + the index and links. + :param candidate_prefs: Options to use when creating a + CandidateEvaluator object. + """ + if candidate_prefs is None: + candidate_prefs = CandidatePreferences() + + format_control = format_control or FormatControl(set(), set()) + + self._allow_yanked = allow_yanked + self._candidate_prefs = candidate_prefs + self._ignore_requires_python = ignore_requires_python + self._link_collector = link_collector + self._target_python = target_python + + self.format_control = format_control + + # These are boring links that have already been logged somehow. + self._logged_links = set() # type: Set[Link] + + # Don't include an allow_yanked default value to make sure each call + # site considers whether yanked releases are allowed. This also causes + # that decision to be made explicit in the calling code, which helps + # people when reading the code. + @classmethod + def create( + cls, + link_collector, # type: LinkCollector + selection_prefs, # type: SelectionPreferences + target_python=None, # type: Optional[TargetPython] + ): + # type: (...) -> PackageFinder + """Create a PackageFinder. + + :param selection_prefs: The candidate selection preferences, as a + SelectionPreferences object. + :param target_python: The target Python interpreter to use when + checking compatibility. If None (the default), a TargetPython + object will be constructed from the running Python. + """ + if target_python is None: + target_python = TargetPython() + + candidate_prefs = CandidatePreferences( + prefer_binary=selection_prefs.prefer_binary, + allow_all_prereleases=selection_prefs.allow_all_prereleases, + ) + + return cls( + candidate_prefs=candidate_prefs, + link_collector=link_collector, + target_python=target_python, + allow_yanked=selection_prefs.allow_yanked, + format_control=selection_prefs.format_control, + ignore_requires_python=selection_prefs.ignore_requires_python, + ) + + @property + def target_python(self): + # type: () -> TargetPython + return self._target_python + + @property + def search_scope(self): + # type: () -> SearchScope + return self._link_collector.search_scope + + @search_scope.setter + def search_scope(self, search_scope): + # type: (SearchScope) -> None + self._link_collector.search_scope = search_scope + + @property + def find_links(self): + # type: () -> List[str] + return self._link_collector.find_links + + @property + def index_urls(self): + # type: () -> List[str] + return self.search_scope.index_urls + + @property + def trusted_hosts(self): + # type: () -> Iterable[str] + for host_port in self._link_collector.session.pip_trusted_origins: + yield build_netloc(*host_port) + + @property + def allow_all_prereleases(self): + # type: () -> bool + return self._candidate_prefs.allow_all_prereleases + + def set_allow_all_prereleases(self): + # type: () -> None + self._candidate_prefs.allow_all_prereleases = True + + @property + def prefer_binary(self): + # type: () -> bool + return self._candidate_prefs.prefer_binary + + def set_prefer_binary(self): + # type: () -> None + self._candidate_prefs.prefer_binary = True + + def make_link_evaluator(self, project_name): + # type: (str) -> LinkEvaluator + canonical_name = canonicalize_name(project_name) + formats = self.format_control.get_allowed_formats(canonical_name) + + return LinkEvaluator( + project_name=project_name, + canonical_name=canonical_name, + formats=formats, + target_python=self._target_python, + allow_yanked=self._allow_yanked, + ignore_requires_python=self._ignore_requires_python, + ) + + def _sort_links(self, links): + # type: (Iterable[Link]) -> List[Link] + """ + Returns elements of links in order, non-egg links first, egg links + second, while eliminating duplicates + """ + eggs, no_eggs = [], [] + seen = set() # type: Set[Link] + for link in links: + if link not in seen: + seen.add(link) + if link.egg_fragment: + eggs.append(link) + else: + no_eggs.append(link) + return no_eggs + eggs + + def _log_skipped_link(self, link, reason): + # type: (Link, Text) -> None + if link not in self._logged_links: + # Mark this as a unicode string to prevent "UnicodeEncodeError: + # 'ascii' codec can't encode character" in Python 2 when + # the reason contains non-ascii characters. + # Also, put the link at the end so the reason is more visible + # and because the link string is usually very long. + logger.debug(u'Skipping link: %s: %s', reason, link) + self._logged_links.add(link) + + def get_install_candidate(self, link_evaluator, link): + # type: (LinkEvaluator, Link) -> Optional[InstallationCandidate] + """ + If the link is a candidate for install, convert it to an + InstallationCandidate and return it. Otherwise, return None. + """ + is_candidate, result = link_evaluator.evaluate_link(link) + if not is_candidate: + if result: + self._log_skipped_link(link, reason=result) + return None + + return InstallationCandidate( + name=link_evaluator.project_name, + link=link, + # Convert the Text result to str since InstallationCandidate + # accepts str. + version=str(result), + ) + + def evaluate_links(self, link_evaluator, links): + # type: (LinkEvaluator, Iterable[Link]) -> List[InstallationCandidate] + """ + Convert links that are candidates to InstallationCandidate objects. + """ + candidates = [] + for link in self._sort_links(links): + candidate = self.get_install_candidate(link_evaluator, link) + if candidate is not None: + candidates.append(candidate) + + return candidates + + def process_project_url(self, project_url, link_evaluator): + # type: (Link, LinkEvaluator) -> List[InstallationCandidate] + logger.debug( + 'Fetching project page and analyzing links: %s', project_url, + ) + html_page = self._link_collector.fetch_page(project_url) + if html_page is None: + return [] + + page_links = list(parse_links(html_page)) + + with indent_log(): + package_links = self.evaluate_links( + link_evaluator, + links=page_links, + ) + + return package_links + + @lru_cache(maxsize=None) + def find_all_candidates(self, project_name): + # type: (str) -> List[InstallationCandidate] + """Find all available InstallationCandidate for project_name + + This checks index_urls and find_links. + All versions found are returned as an InstallationCandidate list. + + See LinkEvaluator.evaluate_link() for details on which files + are accepted. + """ + collected_links = self._link_collector.collect_links(project_name) + + link_evaluator = self.make_link_evaluator(project_name) + + find_links_versions = self.evaluate_links( + link_evaluator, + links=collected_links.find_links, + ) + + page_versions = [] + for project_url in collected_links.project_urls: + package_links = self.process_project_url( + project_url, link_evaluator=link_evaluator, + ) + page_versions.extend(package_links) + + file_versions = self.evaluate_links( + link_evaluator, + links=collected_links.files, + ) + if file_versions: + file_versions.sort(reverse=True) + logger.debug( + 'Local files found: %s', + ', '.join([ + url_to_path(candidate.link.url) + for candidate in file_versions + ]) + ) + + # This is an intentional priority ordering + return file_versions + find_links_versions + page_versions + + def make_candidate_evaluator( + self, + project_name, # type: str + specifier=None, # type: Optional[specifiers.BaseSpecifier] + hashes=None, # type: Optional[Hashes] + ): + # type: (...) -> CandidateEvaluator + """Create a CandidateEvaluator object to use. + """ + candidate_prefs = self._candidate_prefs + return CandidateEvaluator.create( + project_name=project_name, + target_python=self._target_python, + prefer_binary=candidate_prefs.prefer_binary, + allow_all_prereleases=candidate_prefs.allow_all_prereleases, + specifier=specifier, + hashes=hashes, + ) + + def find_best_candidate( + self, + project_name, # type: str + specifier=None, # type: Optional[specifiers.BaseSpecifier] + hashes=None, # type: Optional[Hashes] + ): + # type: (...) -> BestCandidateResult + """Find matches for the given project and specifier. + + :param specifier: An optional object implementing `filter` + (e.g. `packaging.specifiers.SpecifierSet`) to filter applicable + versions. + + :return: A `BestCandidateResult` instance. + """ + candidates = self.find_all_candidates(project_name) + candidate_evaluator = self.make_candidate_evaluator( + project_name=project_name, + specifier=specifier, + hashes=hashes, + ) + return candidate_evaluator.compute_best_candidate(candidates) + + def find_requirement(self, req, upgrade): + # type: (InstallRequirement, bool) -> Optional[InstallationCandidate] + """Try to find a Link matching req + + Expects req, an InstallRequirement and upgrade, a boolean + Returns a InstallationCandidate if found, + Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise + """ + hashes = req.hashes(trust_internet=False) + best_candidate_result = self.find_best_candidate( + req.name, specifier=req.specifier, hashes=hashes, + ) + best_candidate = best_candidate_result.best_candidate + + installed_version = None # type: Optional[_BaseVersion] + if req.satisfied_by is not None: + installed_version = parse_version(req.satisfied_by.version) + + def _format_versions(cand_iter): + # type: (Iterable[InstallationCandidate]) -> str + # This repeated parse_version and str() conversion is needed to + # handle different vendoring sources from pip and pkg_resources. + # If we stop using the pkg_resources provided specifier and start + # using our own, we can drop the cast to str(). + return ", ".join(sorted( + {str(c.version) for c in cand_iter}, + key=parse_version, + )) or "none" + + if installed_version is None and best_candidate is None: + logger.critical( + 'Could not find a version that satisfies the requirement %s ' + '(from versions: %s)', + req, + _format_versions(best_candidate_result.iter_all()), + ) + + raise DistributionNotFound( + 'No matching distribution found for {}'.format( + req) + ) + + best_installed = False + if installed_version and ( + best_candidate is None or + best_candidate.version <= installed_version): + best_installed = True + + if not upgrade and installed_version is not None: + if best_installed: + logger.debug( + 'Existing installed version (%s) is most up-to-date and ' + 'satisfies requirement', + installed_version, + ) + else: + logger.debug( + 'Existing installed version (%s) satisfies requirement ' + '(most up-to-date version is %s)', + installed_version, + best_candidate.version, + ) + return None + + if best_installed: + # We have an existing version, and its the best version + logger.debug( + 'Installed version (%s) is most up-to-date (past versions: ' + '%s)', + installed_version, + _format_versions(best_candidate_result.iter_applicable()), + ) + raise BestVersionAlreadyInstalled + + logger.debug( + 'Using version %s (newest of versions: %s)', + best_candidate.version, + _format_versions(best_candidate_result.iter_applicable()), + ) + return best_candidate + + +def _find_name_version_sep(fragment, canonical_name): + # type: (str, str) -> int + """Find the separator's index based on the package's canonical name. + + :param fragment: A + filename "fragment" (stem) or + egg fragment. + :param canonical_name: The package's canonical name. + + This function is needed since the canonicalized name does not necessarily + have the same length as the egg info's name part. An example:: + + >>> fragment = 'foo__bar-1.0' + >>> canonical_name = 'foo-bar' + >>> _find_name_version_sep(fragment, canonical_name) + 8 + """ + # Project name and version must be separated by one single dash. Find all + # occurrences of dashes; if the string in front of it matches the canonical + # name, this is the one separating the name and version parts. + for i, c in enumerate(fragment): + if c != "-": + continue + if canonicalize_name(fragment[:i]) == canonical_name: + return i + raise ValueError("{} does not match {}".format(fragment, canonical_name)) + + +def _extract_version_from_fragment(fragment, canonical_name): + # type: (str, str) -> Optional[str] + """Parse the version string from a + filename + "fragment" (stem) or egg fragment. + + :param fragment: The string to parse. E.g. foo-2.1 + :param canonical_name: The canonicalized name of the package this + belongs to. + """ + try: + version_start = _find_name_version_sep(fragment, canonical_name) + 1 + except ValueError: + return None + version = fragment[version_start:] + if not version: + return None + return version diff --git a/venv/lib/python2.7/site-packages/pip/_internal/index/package_finder.pyc b/venv/lib/python2.7/site-packages/pip/_internal/index/package_finder.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc2504e87040bf6dca46b604677004ee03327f0f GIT binary patch literal 30058 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 G^uGZR1VFd| literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/locations.py b/venv/lib/python2.7/site-packages/pip/_internal/locations.py new file mode 100644 index 0000000..0c12354 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/locations.py @@ -0,0 +1,194 @@ +"""Locations where we look for configs, install stuff, etc""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +from __future__ import absolute_import + +import os +import os.path +import platform +import site +import sys +import sysconfig +from distutils import sysconfig as distutils_sysconfig +from distutils.command.install import SCHEME_KEYS # type: ignore +from distutils.command.install import install as distutils_install_command + +from pip._internal.models.scheme import Scheme +from pip._internal.utils import appdirs +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.typing import MYPY_CHECK_RUNNING, cast +from pip._internal.utils.virtualenv import running_under_virtualenv + +if MYPY_CHECK_RUNNING: + from typing import Dict, List, Optional, Union + + from distutils.cmd import Command as DistutilsCommand + + +# Application Directories +USER_CACHE_DIR = appdirs.user_cache_dir("pip") + + +def get_major_minor_version(): + # type: () -> str + """ + Return the major-minor version of the current Python as a string, e.g. + "3.7" or "3.10". + """ + return '{}.{}'.format(*sys.version_info) + + +def get_src_prefix(): + # type: () -> str + if running_under_virtualenv(): + src_prefix = os.path.join(sys.prefix, 'src') + else: + # FIXME: keep src in cwd for now (it is not a temporary folder) + try: + src_prefix = os.path.join(os.getcwd(), 'src') + except OSError: + # In case the current working directory has been renamed or deleted + sys.exit( + "The folder you are executing pip from can no longer be found." + ) + + # under macOS + virtualenv sys.prefix is not properly resolved + # it is something like /path/to/python/bin/.. + return os.path.abspath(src_prefix) + + +# FIXME doesn't account for venv linked to global site-packages + +site_packages = sysconfig.get_path("purelib") # type: Optional[str] + +# This is because of a bug in PyPy's sysconfig module, see +# https://bitbucket.org/pypy/pypy/issues/2506/sysconfig-returns-incorrect-paths +# for more information. +if platform.python_implementation().lower() == "pypy": + site_packages = distutils_sysconfig.get_python_lib() +try: + # Use getusersitepackages if this is present, as it ensures that the + # value is initialised properly. + user_site = site.getusersitepackages() +except AttributeError: + user_site = site.USER_SITE + +if WINDOWS: + bin_py = os.path.join(sys.prefix, 'Scripts') + bin_user = os.path.join(user_site, 'Scripts') + # buildout uses 'bin' on Windows too? + if not os.path.exists(bin_py): + bin_py = os.path.join(sys.prefix, 'bin') + bin_user = os.path.join(user_site, 'bin') +else: + bin_py = os.path.join(sys.prefix, 'bin') + bin_user = os.path.join(user_site, 'bin') + + # Forcing to use /usr/local/bin for standard macOS framework installs + # Also log to ~/Library/Logs/ for use with the Console.app log viewer + if sys.platform[:6] == 'darwin' and sys.prefix[:16] == '/System/Library/': + bin_py = '/usr/local/bin' + + +def distutils_scheme( + dist_name, user=False, home=None, root=None, isolated=False, prefix=None +): + # type:(str, bool, str, str, bool, str) -> Dict[str, str] + """ + Return a distutils install scheme + """ + from distutils.dist import Distribution + + dist_args = {'name': dist_name} # type: Dict[str, Union[str, List[str]]] + if isolated: + dist_args["script_args"] = ["--no-user-cfg"] + + d = Distribution(dist_args) + d.parse_config_files() + obj = None # type: Optional[DistutilsCommand] + obj = d.get_command_obj('install', create=True) + assert obj is not None + i = cast(distutils_install_command, obj) + # NOTE: setting user or home has the side-effect of creating the home dir + # or user base for installations during finalize_options() + # ideally, we'd prefer a scheme class that has no side-effects. + assert not (user and prefix), "user={} prefix={}".format(user, prefix) + assert not (home and prefix), "home={} prefix={}".format(home, prefix) + i.user = user or i.user + if user or home: + i.prefix = "" + i.prefix = prefix or i.prefix + i.home = home or i.home + i.root = root or i.root + i.finalize_options() + + scheme = {} + for key in SCHEME_KEYS: + scheme[key] = getattr(i, 'install_' + key) + + # install_lib specified in setup.cfg should install *everything* + # into there (i.e. it takes precedence over both purelib and + # platlib). Note, i.install_lib is *always* set after + # finalize_options(); we only want to override here if the user + # has explicitly requested it hence going back to the config + if 'install_lib' in d.get_option_dict('install'): + scheme.update(dict(purelib=i.install_lib, platlib=i.install_lib)) + + if running_under_virtualenv(): + scheme['headers'] = os.path.join( + i.prefix, + 'include', + 'site', + 'python{}'.format(get_major_minor_version()), + dist_name, + ) + + if root is not None: + path_no_drive = os.path.splitdrive( + os.path.abspath(scheme["headers"]))[1] + scheme["headers"] = os.path.join( + root, + path_no_drive[1:], + ) + + return scheme + + +def get_scheme( + dist_name, # type: str + user=False, # type: bool + home=None, # type: Optional[str] + root=None, # type: Optional[str] + isolated=False, # type: bool + prefix=None, # type: Optional[str] +): + # type: (...) -> Scheme + """ + Get the "scheme" corresponding to the input parameters. The distutils + documentation provides the context for the available schemes: + https://docs.python.org/3/install/index.html#alternate-installation + + :param dist_name: the name of the package to retrieve the scheme for, used + in the headers scheme path + :param user: indicates to use the "user" scheme + :param home: indicates to use the "home" scheme and provides the base + directory for the same + :param root: root under which other directories are re-based + :param isolated: equivalent to --no-user-cfg, i.e. do not consider + ~/.pydistutils.cfg (posix) or ~/pydistutils.cfg (non-posix) for + scheme paths + :param prefix: indicates to use the "prefix" scheme and provides the + base directory for the same + """ + scheme = distutils_scheme( + dist_name, user, home, root, isolated, prefix + ) + return Scheme( + platlib=scheme["platlib"], + purelib=scheme["purelib"], + headers=scheme["headers"], + scripts=scheme["scripts"], + data=scheme["data"], + ) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/locations.pyc b/venv/lib/python2.7/site-packages/pip/_internal/locations.pyc new file mode 100644 index 0000000000000000000000000000000000000000..484040ca7ecdc7c21d76d204de5b6798cd0bdd04 GIT binary patch literal 5433 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/main.py b/venv/lib/python2.7/site-packages/pip/_internal/main.py new file mode 100644 index 0000000..3208d5b --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/main.py @@ -0,0 +1,16 @@ +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, List + + +def main(args=None): + # type: (Optional[List[str]]) -> int + """This is preserved for old console scripts that may still be referencing + it. + + For additional details, see https://github.com/pypa/pip/issues/7498. + """ + from pip._internal.utils.entrypoints import _wrapper + + return _wrapper(args) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/main.pyc b/venv/lib/python2.7/site-packages/pip/_internal/main.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38e226949349bf6abd5a6bfeec463d0bc740ae0c GIT binary patch literal 722 zcmbVJ&2H2%5FRJX7OjL-af1s!=0FpH5Pw1iX;q*C0t#^GULrSfca0p!vS+D+$_XyK z1aHC9@EAM*%p?`PaKiF@nHi5~zI;x9U0MA6_M>j#d?oaKLKYtrw6q0SfKI?lfY1U$ zF=i9633Mr}Qs`!|nt^asJA*cbuT(o{|7~`OdYIp|GC>|*C3to8=BQpiKUlt~tM_Gj zSU$^mBwi+X?a}m3S)5Vu(nM_d8XvPQ$>MbaqSVs-k=18nbtd2p;ESMvDc5`_c(*Z8 z()K||9X{$-p7cTXwv|oqVsEvKO)ws##EnAPsX<0G*2-fogFewgyT-WnLeesrFGlAn zwNPzqCYG|*sEmy_Wz<@35Pf`D6l;T3U7R2V%+Lj+`IGOem-@)(1icH zJ`Kuy9VR7iP=;>hwQ;Be$&qh~SB#N^{*x!G_NeRIt=0QHD01uFWG=3ye*hbwvD5$n literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/models/__init__.py new file mode 100644 index 0000000..7855226 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/models/__init__.py @@ -0,0 +1,2 @@ +"""A package that contains models that represent entities. +""" diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/models/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8887bce03e68fbc9e1fbf1e19c5a1f8522de392d GIT binary patch literal 226 zcmYL@F%H5o3`J8IK$W;d#x89n2E7+@T&Xcx2%C>9J#XpKA=BJ`Is9;0Mm86|3=iBpr(I)i`SWnn{?bNVO W0UJvIRk+cV3u^XPhpY5o;)oAaNjjwf literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/candidate.py b/venv/lib/python2.7/site-packages/pip/_internal/models/candidate.py new file mode 100644 index 0000000..9149e0f --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/models/candidate.py @@ -0,0 +1,38 @@ +from pip._vendor.packaging.version import parse as parse_version + +from pip._internal.utils.models import KeyBasedCompareMixin +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from pip._vendor.packaging.version import _BaseVersion + from pip._internal.models.link import Link + + +class InstallationCandidate(KeyBasedCompareMixin): + """Represents a potential "candidate" for installation. + """ + + __slots__ = ["name", "version", "link"] + + def __init__(self, name, version, link): + # type: (str, str, Link) -> None + self.name = name + self.version = parse_version(version) # type: _BaseVersion + self.link = link + + super(InstallationCandidate, self).__init__( + key=(self.name, self.version, self.link), + defining_class=InstallationCandidate + ) + + def __repr__(self): + # type: () -> str + return "".format( + self.name, self.version, self.link, + ) + + def __str__(self): + # type: () -> str + return '{!r} candidate (version {} at {})'.format( + self.name, self.version, self.link, + ) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/candidate.pyc b/venv/lib/python2.7/site-packages/pip/_internal/models/candidate.pyc new file mode 100644 index 0000000000000000000000000000000000000000..976f7dd52c22f75ed46cae22d3beeecb9ffc7a91 GIT binary patch literal 1739 zcmcgs&2G~`5FXo!)1;J!0umsQ+@4&CrVa%(%5cZ(=( zPvOD?@iaUJ4*=h+la}8Ls<5)-*_qkNeBaL4`?}Ej^69f2()980evYLzM2w$9DN*Lo zz$J(GE~Or2H5$~ay+>)CGM@%MIm)N9Z%@_isRj)iRaBkQIm((eXp)m7i%+UXBZuM! zeI%L?^#?7A=V&i%;(wEGctQu7sY4V|sa3VTh3$?y*^0D^yWLFdG2&}{&9e6bGD6TOi&=c3KQfIVm@k#834bJcsLa3rtTIEIuQBaHx zv?NM{mEr7a+qphHK8FOc~Dgu0mstDS!;w%ZrKYV(EQ|Gl$LqAACY_ zX;N)nI`gdEBb*1-h?%%_=rbhfhd2m{Fi4L^z~*w;gj{Zgz0gDIo?&^UPRw<@V>L?h zBtMYDG}79l6+Y}{0m9y+oK`HjdNId7E>#~FsuZjlwn>RJM#_+(Sa4dUBb(~-UB*og4v$aRthaVniY_ba}jVkjfUC+j`O7;2$)t%x*aDg|lG&c&lO=r<* zx=YR-XUKiXi%YSL-iHE)ru0-)%}APf;KfBiPp?95{IRFP)8+E~VQ?u|H!Gk_6>dF? z%&$saF?qHhocwBahXm}JIVDLJ#@j?Iz8+&gSJL~_>u}M Optional[T] + """Get value from dictionary and verify expected type.""" + if key not in d: + return default + value = d[key] + if six.PY2 and expected_type is str: + expected_type = six.string_types # type: ignore + if not isinstance(value, expected_type): + raise DirectUrlValidationError( + "{!r} has unexpected type for {} (expected {})".format( + value, key, expected_type + ) + ) + return value + + +def _get_required(d, expected_type, key, default=None): + # type: (Dict[str, Any], Type[T], str, Optional[T]) -> T + value = _get(d, expected_type, key, default) + if value is None: + raise DirectUrlValidationError("{} must have a value".format(key)) + return value + + +def _exactly_one_of(infos): + # type: (Iterable[Optional[InfoType]]) -> InfoType + infos = [info for info in infos if info is not None] + if not infos: + raise DirectUrlValidationError( + "missing one of archive_info, dir_info, vcs_info" + ) + if len(infos) > 1: + raise DirectUrlValidationError( + "more than one of archive_info, dir_info, vcs_info" + ) + assert infos[0] is not None + return infos[0] + + +def _filter_none(**kwargs): + # type: (Any) -> Dict[str, Any] + """Make dict excluding None values.""" + return {k: v for k, v in kwargs.items() if v is not None} + + +class VcsInfo(object): + name = "vcs_info" + + def __init__( + self, + vcs, # type: str + commit_id, # type: str + requested_revision=None, # type: Optional[str] + resolved_revision=None, # type: Optional[str] + resolved_revision_type=None, # type: Optional[str] + ): + self.vcs = vcs + self.requested_revision = requested_revision + self.commit_id = commit_id + self.resolved_revision = resolved_revision + self.resolved_revision_type = resolved_revision_type + + @classmethod + def _from_dict(cls, d): + # type: (Optional[Dict[str, Any]]) -> Optional[VcsInfo] + if d is None: + return None + return cls( + vcs=_get_required(d, str, "vcs"), + commit_id=_get_required(d, str, "commit_id"), + requested_revision=_get(d, str, "requested_revision"), + resolved_revision=_get(d, str, "resolved_revision"), + resolved_revision_type=_get(d, str, "resolved_revision_type"), + ) + + def _to_dict(self): + # type: () -> Dict[str, Any] + return _filter_none( + vcs=self.vcs, + requested_revision=self.requested_revision, + commit_id=self.commit_id, + resolved_revision=self.resolved_revision, + resolved_revision_type=self.resolved_revision_type, + ) + + +class ArchiveInfo(object): + name = "archive_info" + + def __init__( + self, + hash=None, # type: Optional[str] + ): + self.hash = hash + + @classmethod + def _from_dict(cls, d): + # type: (Optional[Dict[str, Any]]) -> Optional[ArchiveInfo] + if d is None: + return None + return cls(hash=_get(d, str, "hash")) + + def _to_dict(self): + # type: () -> Dict[str, Any] + return _filter_none(hash=self.hash) + + +class DirInfo(object): + name = "dir_info" + + def __init__( + self, + editable=False, # type: bool + ): + self.editable = editable + + @classmethod + def _from_dict(cls, d): + # type: (Optional[Dict[str, Any]]) -> Optional[DirInfo] + if d is None: + return None + return cls( + editable=_get_required(d, bool, "editable", default=False) + ) + + def _to_dict(self): + # type: () -> Dict[str, Any] + return _filter_none(editable=self.editable or None) + + +if MYPY_CHECK_RUNNING: + InfoType = Union[ArchiveInfo, DirInfo, VcsInfo] + + +class DirectUrl(object): + + def __init__( + self, + url, # type: str + info, # type: InfoType + subdirectory=None, # type: Optional[str] + ): + self.url = url + self.info = info + self.subdirectory = subdirectory + + def _remove_auth_from_netloc(self, netloc): + # type: (str) -> str + if "@" not in netloc: + return netloc + user_pass, netloc_no_user_pass = netloc.split("@", 1) + if ( + isinstance(self.info, VcsInfo) and + self.info.vcs == "git" and + user_pass == "git" + ): + return netloc + if ENV_VAR_RE.match(user_pass): + return netloc + return netloc_no_user_pass + + @property + def redacted_url(self): + # type: () -> str + """url with user:password part removed unless it is formed with + environment variables as specified in PEP 610, or it is ``git`` + in the case of a git URL. + """ + purl = urllib_parse.urlsplit(self.url) + netloc = self._remove_auth_from_netloc(purl.netloc) + surl = urllib_parse.urlunsplit( + (purl.scheme, netloc, purl.path, purl.query, purl.fragment) + ) + return surl + + def validate(self): + # type: () -> None + self.from_dict(self.to_dict()) + + @classmethod + def from_dict(cls, d): + # type: (Dict[str, Any]) -> DirectUrl + return DirectUrl( + url=_get_required(d, str, "url"), + subdirectory=_get(d, str, "subdirectory"), + info=_exactly_one_of( + [ + ArchiveInfo._from_dict(_get(d, dict, "archive_info")), + DirInfo._from_dict(_get(d, dict, "dir_info")), + VcsInfo._from_dict(_get(d, dict, "vcs_info")), + ] + ), + ) + + def to_dict(self): + # type: () -> Dict[str, Any] + res = _filter_none( + url=self.redacted_url, + subdirectory=self.subdirectory, + ) + res[self.info.name] = self.info._to_dict() + return res + + @classmethod + def from_json(cls, s): + # type: (str) -> DirectUrl + return cls.from_dict(json.loads(s)) + + def to_json(self): + # type: () -> str + return json.dumps(self.to_dict(), sort_keys=True) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/direct_url.pyc b/venv/lib/python2.7/site-packages/pip/_internal/models/direct_url.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b86cc5378937b26091ba0c481927d0b1aaceeb1 GIT binary patch literal 8512 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 None + if no_binary is None: + no_binary = set() + if only_binary is None: + only_binary = set() + + self.no_binary = no_binary + self.only_binary = only_binary + + def __eq__(self, other): + # type: (object) -> bool + if not isinstance(other, self.__class__): + return NotImplemented + + if self.__slots__ != other.__slots__: + return False + + return all( + getattr(self, k) == getattr(other, k) + for k in self.__slots__ + ) + + def __ne__(self, other): + # type: (object) -> bool + return not self.__eq__(other) + + def __repr__(self): + # type: () -> str + return "{}({}, {})".format( + self.__class__.__name__, + self.no_binary, + self.only_binary + ) + + @staticmethod + def handle_mutual_excludes(value, target, other): + # type: (str, Set[str], Set[str]) -> None + if value.startswith('-'): + raise CommandError( + "--no-binary / --only-binary option requires 1 argument." + ) + new = value.split(',') + while ':all:' in new: + other.clear() + target.clear() + target.add(':all:') + del new[:new.index(':all:') + 1] + # Without a none, we want to discard everything as :all: covers it + if ':none:' not in new: + return + for name in new: + if name == ':none:': + target.clear() + continue + name = canonicalize_name(name) + other.discard(name) + target.add(name) + + def get_allowed_formats(self, canonical_name): + # type: (str) -> FrozenSet[str] + result = {"binary", "source"} + if canonical_name in self.only_binary: + result.discard('source') + elif canonical_name in self.no_binary: + result.discard('binary') + elif ':all:' in self.only_binary: + result.discard('source') + elif ':all:' in self.no_binary: + result.discard('binary') + return frozenset(result) + + def disallow_binaries(self): + # type: () -> None + self.handle_mutual_excludes( + ':all:', self.no_binary, self.only_binary, + ) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/format_control.pyc b/venv/lib/python2.7/site-packages/pip/_internal/models/format_control.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57bc6f485836866ae0b66bad56b98f61c5ee26c9 GIT binary patch literal 3501 zcmcguTW=dh6h5=-ICh$lP^z{9K`j*tqt;Hj2&Aa05b2eRsWvL5ma5Tqcam(f7iVYO zByI9SD_SI;_#wRUYv5n-1K>Mn>@<~l4A`FWoHH|L&i$P5uZ6ike*Rr2H2H-1{{q8S zm{R-{A>|D!W@tD=%FIxGPi{3RZ&EQ!!&xd?G;C4PreT{@ z2?{f0=4f3}+N9@1&xjrjPfKrwtFUr!VoKt&DzhZcvnNKEabf({JhoP= zqKM1%MqO96$DRiE+Xr_a=+)adR=?KKy}{tl;8vGqa!mWXk;|$w&K+acjB{=L->j=A zretV=p{g!ow_261uJQy3`SAHKF|5Ia0cAiJ!+_NTjcf$0j&x3bAw35;LurG>8#Y;B zUd&DehB8c>t+dWAas*?@!=_CFBuc ztYX-km<~kD?H1MN$tgC~p(2>@0D==S{>l^|2wu?vkq-C(FQ60XS!^@tHbBtvG^k1= z7O=)evp_^_8*e4vwa4z}_beyDPrrjFSDC#hA-p>%b_ zlxA;KU%Lpv^7BpAZQ{?(Valx7tW1pfqSi?sTdTEu1Dk`&-6=-7DGcnFP7c_-a(sZ< zz8UB67q$qTTBH#fBDSCi;&BYh#z}b#v#+(;(fVzyEb~giY1NPss>N5{!t$<8&%laX z5(Xfb0aInxC=h>R9yrQ`(+gN2g)yh#7Ym77xH5wc zdKOMy)v^Jf9(JD|UhX_S{IJUwar}r6uZT16B(OM1Yke$$Md~AeJ4vUTyjYu2t@S0a zU|X0dXsWhqD#>ZgC_9aa`zIFOFc2Dsso&%Dg#?cEk3O?OZiH;en8T3vP|X^2fY5GI z{hZSpbn}czArgj6i(u|CCMK!GXJ?xQRbMyEGNqp>2T)?-QT;*xa$vZ(;>*? zdXo^<^=};Q6S_OUa7KlWvCYij9A2NDfWm-WQ?nNVL5_J%Gn>S9>fMQ-dmQIuBaQ{aNM;h= zLZLLfQaz*xU;-!VNM}KC6U{_!bTM}0IM-$`$;YX&l9%7-2g5}bs`+3MF+Ydzf;xkm z(Zc^cpeE)8p9@&tqg?PS0N*5R26TwKYhnsjPH9-cMMolnr9abgMXEzp90Xt-y!Yf?Swh`#10&hSI9 z&7xX*Z6xfXJdX0;y8w<70x!IEpd{bjP73ugm9TLm7U%y-aNGhTNJL8Cs%6Ih0HkFZ zIMWTf+_pwsoFpQ(M&mPvA8Uy)t~maKELV?a&wULB0 None + super(PackageIndex, self).__init__() + self.url = url + self.netloc = urllib_parse.urlsplit(url).netloc + self.simple_url = self._url_for_path('simple') + self.pypi_url = self._url_for_path('pypi') + + # This is part of a temporary hack used to block installs of PyPI + # packages which depend on external urls only necessary until PyPI can + # block such packages themselves + self.file_storage_domain = file_storage_domain + + def _url_for_path(self, path): + # type: (str) -> str + return urllib_parse.urljoin(self.url, path) + + +PyPI = PackageIndex( + 'https://pypi.org/', file_storage_domain='files.pythonhosted.org' +) +TestPyPI = PackageIndex( + 'https://test.pypi.org/', file_storage_domain='test-files.pythonhosted.org' +) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/index.pyc b/venv/lib/python2.7/site-packages/pip/_internal/models/index.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c86451264392e1e3bfa7a131e46e04c363aa7d92 GIT binary patch literal 1411 zcmb_by>8S%5T3Q~F1aJ&ClL_{3YTtjmXJUKA%sYQ(wriPhHF-iy_Z|#KY2D$g3^VC z2jXdX3?2Z!Strm?#`2DLXXodeZ^q%T?b*-oKXgtv&j{c5SiFEJ@G7c^YDLR{R1uH~ zX{D$L=^N2C(dXre%!mrSV=5+et<-YtH5*>D=`|B7rgR+75Yqm}6D#c87^2I1Hf{^M zqb&cDotnd@Fc*K(h{*>mehFcSmPid52rPgBj3M*sn3mX21Qie!8-6pU^f=xW_m2>% z>3YMaaU5mQO}5CVi?XJOy1qTPh2h9#Y)v0!d2W~^*G8r(y4J#P7U6LrVx9Gso8a3R zSGBp5!r0bbWwhK#%I>nW{;-R~%HoDy+oM2Tv~^~iT*BP01MxqBaCjA6f!ct|KnPY> z{;WfCBPz#)YjwR>9gC7th?0`1DCjf+T zKI=@M`W{IsTHD4tt5<^Hc!_HN|E`NzN_Wp8Fcousj(@f7=WH+Lb$gCn!=$FTr=gF+ tWqVSZ+zkURRUBO&9eRF0A(I^Llq?_l?a-@tLYyb None + """ + :param url: url of the resource pointed to (href of the link) + :param comes_from: instance of HTMLPage where the link was found, + or string. + :param requires_python: String containing the `Requires-Python` + metadata field, specified in PEP 345. This may be specified by + a data-requires-python attribute in the HTML link tag, as + described in PEP 503. + :param yanked_reason: the reason the file has been yanked, if the + file has been yanked, or None if the file hasn't been yanked. + This is the value of the "data-yanked" attribute, if present, in + a simple repository HTML link. If the file has been yanked but + no reason was provided, this should be the empty string. See + PEP 592 for more information and the specification. + :param cache_link_parsing: A flag that is used elsewhere to determine + whether resources retrieved from this link + should be cached. PyPI index urls should + generally have this set to False, for + example. + """ + + # url can be a UNC windows share + if url.startswith('\\\\'): + url = path_to_url(url) + + self._parsed_url = urllib_parse.urlsplit(url) + # Store the url as a private attribute to prevent accidentally + # trying to set a new value. + self._url = url + + self.comes_from = comes_from + self.requires_python = requires_python if requires_python else None + self.yanked_reason = yanked_reason + + super(Link, self).__init__(key=url, defining_class=Link) + + self.cache_link_parsing = cache_link_parsing + + def __str__(self): + # type: () -> str + if self.requires_python: + rp = ' (requires-python:{})'.format(self.requires_python) + else: + rp = '' + if self.comes_from: + return '{} (from {}){}'.format( + redact_auth_from_url(self._url), self.comes_from, rp) + else: + return redact_auth_from_url(str(self._url)) + + def __repr__(self): + # type: () -> str + return ''.format(self) + + @property + def url(self): + # type: () -> str + return self._url + + @property + def filename(self): + # type: () -> str + path = self.path.rstrip('/') + name = posixpath.basename(path) + if not name: + # Make sure we don't leak auth information if the netloc + # includes a username and password. + netloc, user_pass = split_auth_from_netloc(self.netloc) + return netloc + + name = urllib_parse.unquote(name) + assert name, ( + 'URL {self._url!r} produced no filename'.format(**locals())) + return name + + @property + def file_path(self): + # type: () -> str + return url_to_path(self.url) + + @property + def scheme(self): + # type: () -> str + return self._parsed_url.scheme + + @property + def netloc(self): + # type: () -> str + """ + This can contain auth information. + """ + return self._parsed_url.netloc + + @property + def path(self): + # type: () -> str + return urllib_parse.unquote(self._parsed_url.path) + + def splitext(self): + # type: () -> Tuple[str, str] + return splitext(posixpath.basename(self.path.rstrip('/'))) + + @property + def ext(self): + # type: () -> str + return self.splitext()[1] + + @property + def url_without_fragment(self): + # type: () -> str + scheme, netloc, path, query, fragment = self._parsed_url + return urllib_parse.urlunsplit((scheme, netloc, path, query, None)) + + _egg_fragment_re = re.compile(r'[#&]egg=([^&]*)') + + @property + def egg_fragment(self): + # type: () -> Optional[str] + match = self._egg_fragment_re.search(self._url) + if not match: + return None + return match.group(1) + + _subdirectory_fragment_re = re.compile(r'[#&]subdirectory=([^&]*)') + + @property + def subdirectory_fragment(self): + # type: () -> Optional[str] + match = self._subdirectory_fragment_re.search(self._url) + if not match: + return None + return match.group(1) + + _hash_re = re.compile( + r'(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)' + ) + + @property + def hash(self): + # type: () -> Optional[str] + match = self._hash_re.search(self._url) + if match: + return match.group(2) + return None + + @property + def hash_name(self): + # type: () -> Optional[str] + match = self._hash_re.search(self._url) + if match: + return match.group(1) + return None + + @property + def show_url(self): + # type: () -> str + return posixpath.basename(self._url.split('#', 1)[0].split('?', 1)[0]) + + @property + def is_file(self): + # type: () -> bool + return self.scheme == 'file' + + def is_existing_dir(self): + # type: () -> bool + return self.is_file and os.path.isdir(self.file_path) + + @property + def is_wheel(self): + # type: () -> bool + return self.ext == WHEEL_EXTENSION + + @property + def is_vcs(self): + # type: () -> bool + from pip._internal.vcs import vcs + + return self.scheme in vcs.all_schemes + + @property + def is_yanked(self): + # type: () -> bool + return self.yanked_reason is not None + + @property + def has_hash(self): + # type: () -> bool + return self.hash_name is not None + + def is_hash_allowed(self, hashes): + # type: (Optional[Hashes]) -> bool + """ + Return True if the link has a hash and it is allowed. + """ + if hashes is None or not self.has_hash: + return False + # Assert non-None so mypy knows self.hash_name and self.hash are str. + assert self.hash_name is not None + assert self.hash is not None + + return hashes.is_hash_allowed(self.hash_name, hex_digest=self.hash) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/link.pyc b/venv/lib/python2.7/site-packages/pip/_internal/models/link.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce504236c615d430bae41b9f5984587931aedd40 GIT binary patch literal 9011 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/scheme.py b/venv/lib/python2.7/site-packages/pip/_internal/models/scheme.py new file mode 100644 index 0000000..5040551 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/models/scheme.py @@ -0,0 +1,31 @@ +""" +For types associated with installation schemes. + +For a general overview of available schemes and their context, see +https://docs.python.org/3/install/index.html#alternate-installation. +""" + + +SCHEME_KEYS = ['platlib', 'purelib', 'headers', 'scripts', 'data'] + + +class Scheme(object): + """A Scheme holds paths which are used as the base directories for + artifacts associated with a Python package. + """ + + __slots__ = SCHEME_KEYS + + def __init__( + self, + platlib, # type: str + purelib, # type: str + headers, # type: str + scripts, # type: str + data, # type: str + ): + self.platlib = platlib + self.purelib = purelib + self.headers = headers + self.scripts = scripts + self.data = data diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/scheme.pyc b/venv/lib/python2.7/site-packages/pip/_internal/models/scheme.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d18f7f852bfbbd8485d746b00b042ebca269f25 GIT binary patch literal 1089 zcmbtSO>fjN5cMYAZ5!Z(I3ii%k^|ic5F9FmfT{?Ds8IIQy;$COcH`oWBYXOVdV>o; zhzoy(pTQqs#%U=M;?zX*^6ZSq&(D+px>Nl8_FXmN@)^_jB}IHnV1$?xj)cjC$%WYv zW-L}?F{hb{fJ`ijY>KZ!d=cVsP8nNbR&Mk19|Xl4A0(dl5T%aMH&!DUd1|qhwu`8p z(`bDsW7EPK;k@m3}GpiMCEJ99(5f-5H53*dQCZ56($~P*w8gc1pdCW!NY>8Zf~Ey-lKh_JIlCD6aeyn{ zf;JFhnvYGeJx1JMw=`;;5SgX({IPUIQ?DuFeF7j$$uz=DKrZHF>4*)Sk3~HzGfqQ- zS8^yKTklMiy~Z}m)7Cbv)B)siBqMd?^UH;fAdL;spbwV3Uiwf-dUQa$)D8aYzLp=8 zF;uttq*pLa`3-C5U=@25@e#qrNL&b^h-8V-Fi(Vr8;Q_xoCuwT4qx(l4@z#NnnKh( zuDNENGq6=9Z<9=m;FkYSqbyM}#9e|4*L~I7{_3)J9=|*K{A|rrDU_u?pzCzi+8c1O z8XAkcV2hS3`fpLGyIijz5L?@$;T`l0Nu6GUQpgEPQK4hULv9GAsHuqGB0k%DyZ>Qd zz285aAve5I(RqwY)ts3$U&9U6*X-qOikNOFpJbElpkyCwR#~&2)OdbzL|u^5uQyNZ Uh6<8@&j&MJu!zXJPx5>DZ=r+--T(jq literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/search_scope.py b/venv/lib/python2.7/site-packages/pip/_internal/models/search_scope.py new file mode 100644 index 0000000..d732504 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/models/search_scope.py @@ -0,0 +1,135 @@ +import itertools +import logging +import os +import posixpath + +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.models.index import PyPI +from pip._internal.utils.compat import has_tls +from pip._internal.utils.misc import normalize_path, redact_auth_from_url +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List + + +logger = logging.getLogger(__name__) + + +class SearchScope(object): + + """ + Encapsulates the locations that pip is configured to search. + """ + + __slots__ = ["find_links", "index_urls"] + + @classmethod + def create( + cls, + find_links, # type: List[str] + index_urls, # type: List[str] + ): + # type: (...) -> SearchScope + """ + Create a SearchScope object after normalizing the `find_links`. + """ + # Build find_links. If an argument starts with ~, it may be + # a local file relative to a home directory. So try normalizing + # it and if it exists, use the normalized version. + # This is deliberately conservative - it might be fine just to + # blindly normalize anything starting with a ~... + built_find_links = [] # type: List[str] + for link in find_links: + if link.startswith('~'): + new_link = normalize_path(link) + if os.path.exists(new_link): + link = new_link + built_find_links.append(link) + + # If we don't have TLS enabled, then WARN if anyplace we're looking + # relies on TLS. + if not has_tls(): + for link in itertools.chain(index_urls, built_find_links): + parsed = urllib_parse.urlparse(link) + if parsed.scheme == 'https': + logger.warning( + 'pip is configured with locations that require ' + 'TLS/SSL, however the ssl module in Python is not ' + 'available.' + ) + break + + return cls( + find_links=built_find_links, + index_urls=index_urls, + ) + + def __init__( + self, + find_links, # type: List[str] + index_urls, # type: List[str] + ): + # type: (...) -> None + self.find_links = find_links + self.index_urls = index_urls + + def get_formatted_locations(self): + # type: () -> str + lines = [] + redacted_index_urls = [] + if self.index_urls and self.index_urls != [PyPI.simple_url]: + for url in self.index_urls: + + redacted_index_url = redact_auth_from_url(url) + + # Parse the URL + purl = urllib_parse.urlsplit(redacted_index_url) + + # URL is generally invalid if scheme and netloc is missing + # there are issues with Python and URL parsing, so this test + # is a bit crude. See bpo-20271, bpo-23505. Python doesn't + # always parse invalid URLs correctly - it should raise + # exceptions for malformed URLs + if not purl.scheme and not purl.netloc: + logger.warning( + 'The index url "%s" seems invalid, ' + 'please provide a scheme.', redacted_index_url) + + redacted_index_urls.append(redacted_index_url) + + lines.append('Looking in indexes: {}'.format( + ', '.join(redacted_index_urls))) + + if self.find_links: + lines.append( + 'Looking in links: {}'.format(', '.join( + redact_auth_from_url(url) for url in self.find_links)) + ) + return '\n'.join(lines) + + def get_index_urls_locations(self, project_name): + # type: (str) -> List[str] + """Returns the locations found via self.index_urls + + Checks the url_name on the main (first in the list) index and + use this url_name to produce all locations + """ + + def mkurl_pypi_url(url): + # type: (str) -> str + loc = posixpath.join( + url, + urllib_parse.quote(canonicalize_name(project_name))) + # For maximum compatibility with easy_install, ensure the path + # ends in a trailing slash. Although this isn't in the spec + # (and PyPI can handle it without the slash) some other index + # implementations might break if they relied on easy_install's + # behavior. + if not loc.endswith('/'): + loc = loc + '/' + return loc + + return [mkurl_pypi_url(url) for url in self.index_urls] diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/search_scope.pyc b/venv/lib/python2.7/site-packages/pip/_internal/models/search_scope.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2dc275828a203a0b6426a7d338208deef1484ba GIT binary patch literal 3957 zcmcIm>uwvz6+XKpmm*D>mhAY_Ht9lWQ3i0RAea6K(jcvrv_@4`T{ja%gK_YKNC%G)&Fuzn%<`@CxRaEQCWfRMz^P>m$u#MF;(xJ)pzy)otV=Brzx35%@nVMVJs#Oxj zCX5zl8cymm4;OW2U)aX!uO1&g4)=cX+1@Y1;ETh<2ZukmXUyv$)yA;6BNf&0bQG7B zS~-hZ{tQF!V^VOFxQ3kq!lh$4s6nd9PGAGTDlJNyOpiTET0*ob@r2l*U^HNb^yiqm zK7Kwc;;7P#EHX;_W~%(Gj3bkl1+OCGS83&^+KB(uG6&PY&oslP;PxlTd^T^#K`&cR;^r zk#T9(pc(G8cn7B-@X7pu5D^zRYF%D-=9~1$cpL}%YdXU-ZJKS+h0C{Iy5RL8e`q>1 z>n`8-=)$AfH8$pnOZ7RK9?dq{p5Wyi&CdyckC+j}gA7Okuyet~9SuCz=r@?e6l~AE zTEUclgFjsx@2NE@zXJmh{ob(Irp8oSr=VVU#`Dxn zzwNSG%@=8{{D%jl-O=dazCSIWt5a}h_iCN_d6_IS<)?*zbZ(|)!457;$afm0S@bMZ z!=M9h0eg19;Vw?qCaR5Qh5<({yh2oJ!?Yv;+d`comNh&;6jhZfl7RgWdm|U2yD7^| zi%#)0N()$;2vL%y&qB#Rvtc*vLW~qq>0kB$N$vh%>zw+1$X+ zvqhSjaBW(VlOt4k6zaKzt2`{+k^w#RG!rt$s1r*P+ciww2`|8IzZ^;ND zzN(8T+l4h%rgv>lgqpK=Se?tuu>`}LcuwzNqQ2*BI(?_-Y-4OSJI+0<`i|$co7Y?q z|0P{mAvW$FhQ5snS%TmTK_HMp2n37-Kn?|y*18YG-s}^tvdJs^*ttsW*ij*DkeV?3 zoVhVe@;Xk;am$`tCH#M|;DmQ%77dW;fOn_@0)ajQjyZJF;LWqAm;3uqzF?4mdpUOj z1jt)p#4^=^3qXOHN4@$&sJ2k>?ySSu$mrop$$-&T+3w6gphqw#HjwX}^+1oFq_e|J zIOT1s0|M%QvE}(H_%5$nNM+GCY2SXa{tht9ugN{VG$DR(@5Nr)k3Qp(XH#;{SuPJYlpz!pbX3f8_t}h2|K!?`tkTuiOw6 z=JS|6!FM<$G>`9Mg5*!O*cnFR3bKFc%%!X^1ByQj*n76z@e9LuCCj*?VReOZq!}4L zK30V~tLjg3EJQ1hG)vJH@DUgaSPTn8X%1s?aSv60AYF2m%w5rv=#*zL3CK4EV%emq98vXVyKuW{ux?66~x$Sna>N#(^G24>!m4^h! zE{H#&iUU|2`Xh1`2`Qn1{M>)C&3SlPLmm39OY?i^ulN!DH%x&ti(1-+SDS}PxhN9< zG>s7H*<`pjU3Xn7rz$?NO$V$c{g{tp#8oOsb?^t1wAO~BUiuPLmbY#E`%#gsURfY* z%oG)D^#&Rgtq_=o9KnlnXZS@EaInZLjIMJ-7dM zr_$$alymk^4> zygXHU2rr}U3dC0eq2F0vT{bqj$c>FnU5mf3-w|HJxXcmZw%22KiCn99?43N-u{4eX z+va~gWe|eUlRF4O>dQ5IPF#jaIFLp#_z+uy?Q+ky*kaHBhodB{KDL4M2^&qb0zKd< Te%%|uTMXwm{(H{NM!)e5>WYfO literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/selection_prefs.py b/venv/lib/python2.7/site-packages/pip/_internal/models/selection_prefs.py new file mode 100644 index 0000000..5db3ca9 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/models/selection_prefs.py @@ -0,0 +1,49 @@ +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional + from pip._internal.models.format_control import FormatControl + + +class SelectionPreferences(object): + """ + Encapsulates the candidate selection preferences for downloading + and installing files. + """ + + __slots__ = ['allow_yanked', 'allow_all_prereleases', 'format_control', + 'prefer_binary', 'ignore_requires_python'] + + # Don't include an allow_yanked default value to make sure each call + # site considers whether yanked releases are allowed. This also causes + # that decision to be made explicit in the calling code, which helps + # people when reading the code. + def __init__( + self, + allow_yanked, # type: bool + allow_all_prereleases=False, # type: bool + format_control=None, # type: Optional[FormatControl] + prefer_binary=False, # type: bool + ignore_requires_python=None, # type: Optional[bool] + ): + # type: (...) -> None + """Create a SelectionPreferences object. + + :param allow_yanked: Whether files marked as yanked (in the sense + of PEP 592) are permitted to be candidates for install. + :param format_control: A FormatControl object or None. Used to control + the selection of source packages / binary packages when consulting + the index and links. + :param prefer_binary: Whether to prefer an old, but valid, binary + dist over a new source dist. + :param ignore_requires_python: Whether to ignore incompatible + "Requires-Python" values in links. Defaults to False. + """ + if ignore_requires_python is None: + ignore_requires_python = False + + self.allow_yanked = allow_yanked + self.allow_all_prereleases = allow_all_prereleases + self.format_control = format_control + self.prefer_binary = prefer_binary + self.ignore_requires_python = ignore_requires_python diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/selection_prefs.pyc b/venv/lib/python2.7/site-packages/pip/_internal/models/selection_prefs.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a52b52fe6a1870bbd7d7b8591df3cca25a541962 GIT binary patch literal 1878 zcmb_dQEwwP5T4B@>9y*i6Hp#_vW}M^(L_24#8n6Zp@kD7L>rw@^RjYwop!Ig_F_91 zioz53!Vlut@H6-U@QrtyG`i#McGr$Qo*94h&De?md3f~qpMRwpwNH%Suh85KU5+oJ zlBkMk9#NzsvQLAwLuH4mnC3A>tQAw)rK(5s9z`1SE~!2(Bg%X9is%ob%lQH2eVPpp z;J5e}&mh9czl-k2%jso0{{DRYLz+CFOrA}?Yt|lM?WfuoM$591JcQ)J*h>1b(cYTU zzYobwl`3PksZ~p5mClsg2GoPXH)!s2bc#3*0G@X^vK)QPU;*iwnXKKalwLXEua(H8&WjvV;qI`AdIv@(a=)&{x3;Ohlob zmt_f&SQe#n!?5Cyu@S^(o!&})qjG<;6+oQAv&A;jDd*q83cQ1nG;1kglA6uaMWLm= z^&db|TxnxfYSk~R!YY^6xBlAbtdAvb9kel;yFj<;F*`R8$exgo==UBWr<;g2L}`aM z_%MiRgAao)ZSY~xV?!SF*?cx&pKgtQY!!1O#hWrE%;E*oH#`clGrecEw6YTS88{O^ zUn?+e8=gcZEqD>qiH0FDD0Ik#Q`)JmC-!ERVtPImpFVx^v5;1YTG^`b9@gH7#l76Q zkft^zO(yQ4*(do-d@c40v5i6?(G#Q9P&{|d4sBNUAaTj;3Izb2S=kKGWOgI3P*Wq( zWNs%}Un?!(3svXuDu~hX!|n>5t6v4z6sqZ_EhJuS$=oZ59h;z_S%IlAW&Vj+th{(B z%YuiYdiId#h4aF^L>{EjYJCTs#ji2;=8D_fyHNr7%v81X#iHEL-Q%P!*VAbz*T)QP z1%i<6CQk9KT1s$&b7;hcES=inn1sv5cTt9%6VF#cP)S&n@HFAtPxwws_=pd98Vr!0 z<^QWeiw4{|J~Ja<)uXzoPuto#ee&$ZZ=Y2x3N0 None + """ + :param platform: A string or None. If None, searches for packages + that are supported by the current system. Otherwise, will find + packages that can be built on the platform passed in. These + packages will only be downloaded for distribution: they will + not be built locally. + :param py_version_info: An optional tuple of ints representing the + Python version information to use (e.g. `sys.version_info[:3]`). + This can have length 1, 2, or 3 when provided. + :param abi: A string or None. This is passed to compatibility_tags.py's + get_supported() function as is. + :param implementation: A string or None. This is passed to + compatibility_tags.py's get_supported() function as is. + """ + # Store the given py_version_info for when we call get_supported(). + self._given_py_version_info = py_version_info + + if py_version_info is None: + py_version_info = sys.version_info[:3] + else: + py_version_info = normalize_version_info(py_version_info) + + py_version = '.'.join(map(str, py_version_info[:2])) + + self.abi = abi + self.implementation = implementation + self.platform = platform + self.py_version = py_version + self.py_version_info = py_version_info + + # This is used to cache the return value of get_tags(). + self._valid_tags = None # type: Optional[List[Tag]] + + def format_given(self): + # type: () -> str + """ + Format the given, non-None attributes for display. + """ + display_version = None + if self._given_py_version_info is not None: + display_version = '.'.join( + str(part) for part in self._given_py_version_info + ) + + key_values = [ + ('platform', self.platform), + ('version_info', display_version), + ('abi', self.abi), + ('implementation', self.implementation), + ] + return ' '.join( + '{}={!r}'.format(key, value) for key, value in key_values + if value is not None + ) + + def get_tags(self): + # type: () -> List[Tag] + """ + Return the supported PEP 425 tags to check wheel candidates against. + + The tags are returned in order of preference (most preferred first). + """ + if self._valid_tags is None: + # Pass versions=None if no py_version_info was given since + # versions=None uses special default logic. + py_version_info = self._given_py_version_info + if py_version_info is None: + version = None + else: + version = version_info_to_nodot(py_version_info) + + tags = get_supported( + version=version, + platform=self.platform, + abi=self.abi, + impl=self.implementation, + ) + self._valid_tags = tags + + return self._valid_tags diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/target_python.pyc b/venv/lib/python2.7/site-packages/pip/_internal/models/target_python.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2ae889223d78df739ebbf69ee4588e96fa78ee1 GIT binary patch literal 3957 zcmcIn-EJGl6+XNC6D2BklGbTbUrd6gp#hn0?X(w08YFex)=A3b)cWuK?tlLA?=Yt3 z)57mZc+5XBB>3|vBbqqcr_7_=r-@H_izY4dct?w}Hsu|fblkj6S(ox2O?u?%9@S^U zr$gBe<$ap;Dc_~ZF6DbP*>fkllnp4~r^!Bf1vvIdzd}=wk{$XR(KDhalWQ!=(XbDx z(*NNz9{M2dK8BgLp;=Z{SzDdhA7bTH*Cs8CFfFEKXv?rDlhO`7K5zp=QPz2srC;mt z>PGkeHN5}Blfx(BgWo-T@L3rAaXfxB{_T*>V%r#gpBig-Kzv?VToGlqgURD%m1)O- zcRr40b|Aksggac>d0E7m%cqC&*Lch!1`XRnPmDe*m|$#C(x#+CNtX>VgB`K5cjXU8 zX|u7DK3ivkZM#DBC^#DOwdN}fy9%F&MI2RTnMGC`W#?K|by?}!rkIvf6)7j1N(-y& zs@51)S!k7Fcf_)%#Y`AY%No0@C_ag1cwHD9W!ZsB%CjOXqvSwo8;@kCSU8-er@9EM z)s}@V+a@|r?JM|AbC@jGg^k#bV$uq7;-cK{;{E2Vy|y(Kui8DVg{Sah6542HV)jB8 z5C1;EWB!ie+^2JF6C!ET$qv=;lJ#i;i+ZFkd@2U)R_uG`5vH*JqC>Vzw#SR`g?i@R zb?Ce$%y#G;2f(#Y=bjL|bdI-J*}J@Oz%JyKeI|~EER=Z<+KYwQG54#ej&gOW@qP8N zGPZ`b6%0Lw3r6bEREPs*bX3Q4c#NIUxWKGAF*iGptcq%_)@h)QSK{w@S=X?!GAmUf!E7J=bHsPPg+F-9i{hLL&<@$`%N z$Tek=t(eheyxYdi0wx^RjCfaF5lCTRtX`DxIJ3&5%5ArGz}ONndIWqh-~ti| zcSe~ZLx@~qbT)N6iao7rYJz{mBb`Tu6mDK^(G;72SDp|8WsA1ZT{+fade#Fo)64#G^o5`?4KpI3z!q=|X>1 z)gK0!7{0OF1lQ}JHvuOBt=9hI2o=TdfnddM(HB1JhC0Nx#}hA#a_}728dM^moWk4- z@lA%iiEl1`_08M$g=>j|SFwT$M&z(dT9@EWUSw0A=#_LVD4k3F{hH$oTxVFzF7>^! zq?QOLc^v!zFIw0gt2gt&K_nP1J#EYyO2fzb7<`e^`6Y{Dfokl5B@hF_vEZ%0K={wL*xNP(pa^P?F zx^yh)LC|_IH#B$BNi2G3gWDHabX^FV*vspV#IojJxPP5}fws%qmFrDQaQN_0y?^%? z=+iI#4QGzM6i~+k202U!#G71(^HK` zBSwMDOJkdbn(KU88+)ZPqO)4#^~V2_put33+Fax*K-lWE(kbc9EQIG zN?5UuFFit7GA?1v{3&SjBMj8L*5arDRwFLDg3|-gPLT%LizwG&C=ncnC<4ojr)-HZ zOv)HE$59xXth6Q!o#xCv;A#-Oi(#XUP%o$O1gsLnt+|Pz+v&Di-saoyIC}7t{*58; z3i!Vx`%?@kZKHKr8=-;A%;@>5?_9>tv#iXE4&|wdUB!OuTXxu0g;p(K@Df;S=Hhv- zfq~TQ^=bUyk(Bkw^|3fOVs8a(YB^mVFLZ20@9)K;;_wfgi$7$|4fhWN|3>>dN_p42 I>A&9kKkFQ=#sB~S literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/wheel.py b/venv/lib/python2.7/site-packages/pip/_internal/models/wheel.py new file mode 100644 index 0000000..4d4068f --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/models/wheel.py @@ -0,0 +1,78 @@ +"""Represents a wheel file and provides access to the various parts of the +name that have meaning. +""" +import re + +from pip._vendor.packaging.tags import Tag + +from pip._internal.exceptions import InvalidWheelFilename +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List + + +class Wheel(object): + """A wheel file""" + + wheel_file_re = re.compile( + r"""^(?P(?P.+?)-(?P.*?)) + ((-(?P\d[^-]*?))?-(?P.+?)-(?P.+?)-(?P.+?) + \.whl|\.dist-info)$""", + re.VERBOSE + ) + + def __init__(self, filename): + # type: (str) -> None + """ + :raises InvalidWheelFilename: when the filename is invalid for a wheel + """ + wheel_info = self.wheel_file_re.match(filename) + if not wheel_info: + raise InvalidWheelFilename( + "{} is not a valid wheel filename.".format(filename) + ) + self.filename = filename + self.name = wheel_info.group('name').replace('_', '-') + # we'll assume "_" means "-" due to wheel naming scheme + # (https://github.com/pypa/pip/issues/1150) + self.version = wheel_info.group('ver').replace('_', '-') + self.build_tag = wheel_info.group('build') + self.pyversions = wheel_info.group('pyver').split('.') + self.abis = wheel_info.group('abi').split('.') + self.plats = wheel_info.group('plat').split('.') + + # All the tag combinations from this file + self.file_tags = { + Tag(x, y, z) for x in self.pyversions + for y in self.abis for z in self.plats + } + + def get_formatted_file_tags(self): + # type: () -> List[str] + """Return the wheel's tags as a sorted list of strings.""" + return sorted(str(tag) for tag in self.file_tags) + + def support_index_min(self, tags): + # type: (List[Tag]) -> int + """Return the lowest index that one of the wheel's file_tag combinations + achieves in the given list of supported tags. + + For example, if there are 8 supported tags and one of the file tags + is first in the list, then return 0. + + :param tags: the PEP 425 tags to check the wheel against, in order + with most preferred first. + + :raises ValueError: If none of the wheel's file tags match one of + the supported tags. + """ + return min(tags.index(tag) for tag in self.file_tags if tag in tags) + + def supported(self, tags): + # type: (List[Tag]) -> bool + """Return whether the wheel is compatible with one of the given tags. + + :param tags: the PEP 425 tags to check the wheel against. + """ + return not self.file_tags.isdisjoint(tags) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/models/wheel.pyc b/venv/lib/python2.7/site-packages/pip/_internal/models/wheel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50308d718a6513f737ab3eecc2b7187fdf7c406d GIT binary patch literal 3793 zcmb_fUvt|;5MNn|6FX^1{|%)biaNm5X&a?eN~dHx3DBl(1_&7i3Qd~|#X8$cWl7bY z)1)LXq{E*VnBlwdY2aJ%!W;Z{WjhY-@Ic~No4eb)-PP`IchB~pN2L~XqV{0${6ceu2oq5Hz1zMa-~&bv=cbbT1v%EBZ`$1 zB%zb#=|&VPaO!oXwPRApw3M?E>ngnfyL13I#u%Vo`3X&*ky4C1! zd=_gKR2hEnFM?(UoI{#EZ!}6 zL*RWHX=8>lkh66R3Jo^>zHO-}KQSKW(qlap1a`>EB0 zvDS&=aQ0F7@bT0t^XFtW+mZvl)4^J_Cn}2rBeTA!NA9y$y#2@x;fbjzX{3|y)Jw35 zUC?{T}`aYYsSBke>5M4d*OJKY57i__;J{M#J| z+mh6PEodG92@7$}5O(p%a1!`Jrz95;Zo#m?K}G@r+2P6#U_g#@`0IR}WsTxFfk!ja zTL>7@>J8cvMqX;ihyq0v}@C^L-f?4rzhxX8GeEksxf3l z6;$fN7UxxJ{v3LZ9y?rB-o6r0EZ^ciObG=`6|sPHloXp1QiQ{``8I zm*nxI#Hc(8;^}r8s#s4;^>MQ;&Bf`aR;He|v)O4(G#gMM+ghx>hLPdO%5I-S<>yKa zZo@|{Pbv+kEFy*#Gs?qmKxJDqPdk|z!E&zP*Shk!j>rN6qN6l1Y=8vCH$hVl=`4L^L!~hMq0&Q}XeeH^>UOCb%=`08%^%x@+I*V#_-+GF&LQuzc z4fF{J5(~TutV=FHXW=_6(81hRAgrkpwVCC!*I6FhS|(9xq~ObYd2eA^Op{<8mVU#2 zZz|(=F{;7>$n4hlde)FF^}Odqj+uTF1itH*K8s5qeEL$<{(v(Fq86vm6v7iFq1r5Z zbegDc<1VTdLfV6`gREPNlE5&;`=u_Zw<2^ou7^@0o6!b}Wk2ejEGuxpZ{Sw@$L^qN zs?DIC#p<#X$xR_wPJrizqxT(>3&((2Y>vRJFAG(+5#{n8Vgf6_%%j9X0bqn)8PGg~ z+ey$C2{W>NX@1GMcJ=)Ny12>ITdMv4xSoh8|d6&r~lS?3b75NYl>hU#$`?=<(Q?|;bvTa-AcI8ZExH3`Wp8%fAgzqHg z3<&Nru8&F>rn#F1^(R4-fAnxn<>F+x8_S;FUB^|Mb(KkNEp94(Dg7NC6UEv!TNy-o v>=x-q-8pB8%+s}XRX1Ysq541qcC!f4ENjzz%PCvqrHRsnHBl;CC+vR!xZ`{2 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/network/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/network/__init__.py new file mode 100644 index 0000000..b51bde9 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/network/__init__.py @@ -0,0 +1,2 @@ +"""Contains purely network-related utilities. +""" diff --git a/venv/lib/python2.7/site-packages/pip/_internal/network/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/network/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b767de34212bacf2f3487e0c0bb491540eb1212 GIT binary patch literal 214 zcmZSn%*%DVb8CDu0~9aDDoXnEU)M7m@KMjy+CG0>VK0YNsIX+$k$Yeke#kN4M zeo1bDenDn|F3`}D#GD*mBhRcVvs{o67{_Pkm82HsCFbZut1G%vTh#3H0_BP}I literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/network/auth.py b/venv/lib/python2.7/site-packages/pip/_internal/network/auth.py new file mode 100644 index 0000000..c49deaa --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/network/auth.py @@ -0,0 +1,310 @@ +"""Network Authentication Helpers + +Contains interface (MultiDomainBasicAuth) and associated glue code for +providing credentials in the context of network requests. +""" + +import logging + +from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth +from pip._vendor.requests.utils import get_netrc_auth +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.utils.misc import ( + ask, + ask_input, + ask_password, + remove_auth_from_url, + split_auth_netloc_from_url, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Dict, Optional, Tuple, List, Any + + from pip._internal.vcs.versioncontrol import AuthInfo + + from pip._vendor.requests.models import Response, Request + + Credentials = Tuple[str, str, str] + +logger = logging.getLogger(__name__) + +try: + import keyring # noqa +except ImportError: + keyring = None +except Exception as exc: + logger.warning( + "Keyring is skipped due to an exception: %s", str(exc), + ) + keyring = None + + +def get_keyring_auth(url, username): + # type: (str, str) -> Optional[AuthInfo] + """Return the tuple auth for a given url from keyring.""" + global keyring + if not url or not keyring: + return None + + try: + try: + get_credential = keyring.get_credential + except AttributeError: + pass + else: + logger.debug("Getting credentials from keyring for %s", url) + cred = get_credential(url, username) + if cred is not None: + return cred.username, cred.password + return None + + if username: + logger.debug("Getting password from keyring for %s", url) + password = keyring.get_password(url, username) + if password: + return username, password + + except Exception as exc: + logger.warning( + "Keyring is skipped due to an exception: %s", str(exc), + ) + keyring = None + return None + + +class MultiDomainBasicAuth(AuthBase): + + def __init__(self, prompting=True, index_urls=None): + # type: (bool, Optional[List[str]]) -> None + self.prompting = prompting + self.index_urls = index_urls + self.passwords = {} # type: Dict[str, AuthInfo] + # When the user is prompted to enter credentials and keyring is + # available, we will offer to save them. If the user accepts, + # this value is set to the credentials they entered. After the + # request authenticates, the caller should call + # ``save_credentials`` to save these. + self._credentials_to_save = None # type: Optional[Credentials] + + def _get_index_url(self, url): + # type: (str) -> Optional[str] + """Return the original index URL matching the requested URL. + + Cached or dynamically generated credentials may work against + the original index URL rather than just the netloc. + + The provided url should have had its username and password + removed already. If the original index url had credentials then + they will be included in the return value. + + Returns None if no matching index was found, or if --no-index + was specified by the user. + """ + if not url or not self.index_urls: + return None + + for u in self.index_urls: + prefix = remove_auth_from_url(u).rstrip("/") + "/" + if url.startswith(prefix): + return u + return None + + def _get_new_credentials(self, original_url, allow_netrc=True, + allow_keyring=True): + # type: (str, bool, bool) -> AuthInfo + """Find and return credentials for the specified URL.""" + # Split the credentials and netloc from the url. + url, netloc, url_user_password = split_auth_netloc_from_url( + original_url, + ) + + # Start with the credentials embedded in the url + username, password = url_user_password + if username is not None and password is not None: + logger.debug("Found credentials in url for %s", netloc) + return url_user_password + + # Find a matching index url for this request + index_url = self._get_index_url(url) + if index_url: + # Split the credentials from the url. + index_info = split_auth_netloc_from_url(index_url) + if index_info: + index_url, _, index_url_user_password = index_info + logger.debug("Found index url %s", index_url) + + # If an index URL was found, try its embedded credentials + if index_url and index_url_user_password[0] is not None: + username, password = index_url_user_password + if username is not None and password is not None: + logger.debug("Found credentials in index url for %s", netloc) + return index_url_user_password + + # Get creds from netrc if we still don't have them + if allow_netrc: + netrc_auth = get_netrc_auth(original_url) + if netrc_auth: + logger.debug("Found credentials in netrc for %s", netloc) + return netrc_auth + + # If we don't have a password and keyring is available, use it. + if allow_keyring: + # The index url is more specific than the netloc, so try it first + kr_auth = ( + get_keyring_auth(index_url, username) or + get_keyring_auth(netloc, username) + ) + if kr_auth: + logger.debug("Found credentials in keyring for %s", netloc) + return kr_auth + + return username, password + + def _get_url_and_credentials(self, original_url): + # type: (str) -> Tuple[str, Optional[str], Optional[str]] + """Return the credentials to use for the provided URL. + + If allowed, netrc and keyring may be used to obtain the + correct credentials. + + Returns (url_without_credentials, username, password). Note + that even if the original URL contains credentials, this + function may return a different username and password. + """ + url, netloc, _ = split_auth_netloc_from_url(original_url) + + # Use any stored credentials that we have for this netloc + username, password = self.passwords.get(netloc, (None, None)) + + if username is None and password is None: + # No stored credentials. Acquire new credentials without prompting + # the user. (e.g. from netrc, keyring, or the URL itself) + username, password = self._get_new_credentials(original_url) + + if username is not None or password is not None: + # Convert the username and password if they're None, so that + # this netloc will show up as "cached" in the conditional above. + # Further, HTTPBasicAuth doesn't accept None, so it makes sense to + # cache the value that is going to be used. + username = username or "" + password = password or "" + + # Store any acquired credentials. + self.passwords[netloc] = (username, password) + + assert ( + # Credentials were found + (username is not None and password is not None) or + # Credentials were not found + (username is None and password is None) + ), "Could not load credentials from url: {}".format(original_url) + + return url, username, password + + def __call__(self, req): + # type: (Request) -> Request + # Get credentials for this request + url, username, password = self._get_url_and_credentials(req.url) + + # Set the url of the request to the url without any credentials + req.url = url + + if username is not None and password is not None: + # Send the basic auth with this request + req = HTTPBasicAuth(username, password)(req) + + # Attach a hook to handle 401 responses + req.register_hook("response", self.handle_401) + + return req + + # Factored out to allow for easy patching in tests + def _prompt_for_password(self, netloc): + # type: (str) -> Tuple[Optional[str], Optional[str], bool] + username = ask_input("User for {}: ".format(netloc)) + if not username: + return None, None, False + auth = get_keyring_auth(netloc, username) + if auth and auth[0] is not None and auth[1] is not None: + return auth[0], auth[1], False + password = ask_password("Password: ") + return username, password, True + + # Factored out to allow for easy patching in tests + def _should_save_password_to_keyring(self): + # type: () -> bool + if not keyring: + return False + return ask("Save credentials to keyring [y/N]: ", ["y", "n"]) == "y" + + def handle_401(self, resp, **kwargs): + # type: (Response, **Any) -> Response + # We only care about 401 responses, anything else we want to just + # pass through the actual response + if resp.status_code != 401: + return resp + + # We are not able to prompt the user so simply return the response + if not self.prompting: + return resp + + parsed = urllib_parse.urlparse(resp.url) + + # Prompt the user for a new username and password + username, password, save = self._prompt_for_password(parsed.netloc) + + # Store the new username and password to use for future requests + self._credentials_to_save = None + if username is not None and password is not None: + self.passwords[parsed.netloc] = (username, password) + + # Prompt to save the password to keyring + if save and self._should_save_password_to_keyring(): + self._credentials_to_save = (parsed.netloc, username, password) + + # Consume content and release the original connection to allow our new + # request to reuse the same one. + resp.content + resp.raw.release_conn() + + # Add our new username and password to the request + req = HTTPBasicAuth(username or "", password or "")(resp.request) + req.register_hook("response", self.warn_on_401) + + # On successful request, save the credentials that were used to + # keyring. (Note that if the user responded "no" above, this member + # is not set and nothing will be saved.) + if self._credentials_to_save: + req.register_hook("response", self.save_credentials) + + # Send our new request + new_resp = resp.connection.send(req, **kwargs) + new_resp.history.append(resp) + + return new_resp + + def warn_on_401(self, resp, **kwargs): + # type: (Response, **Any) -> None + """Response callback to warn about incorrect credentials.""" + if resp.status_code == 401: + logger.warning( + '401 Error, Credentials not correct for %s', resp.request.url, + ) + + def save_credentials(self, resp, **kwargs): + # type: (Response, **Any) -> None + """Response callback to save credentials on success.""" + assert keyring is not None, "should never reach here without keyring" + if not keyring: + return + + creds = self._credentials_to_save + self._credentials_to_save = None + if creds and resp.status_code < 400: + try: + logger.info('Saving credentials to keyring') + keyring.set_password(*creds) + except Exception: + logger.exception('Failed to save credentials') diff --git a/venv/lib/python2.7/site-packages/pip/_internal/network/auth.pyc b/venv/lib/python2.7/site-packages/pip/_internal/network/auth.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1478caf96142295294c326665ee8621979bc030 GIT binary patch literal 8448 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 AI{*Lx literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/network/cache.py b/venv/lib/python2.7/site-packages/pip/_internal/network/cache.py new file mode 100644 index 0000000..a0d55b5 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/network/cache.py @@ -0,0 +1,79 @@ +"""HTTP cache implementation. +""" + +import os +from contextlib import contextmanager + +from pip._vendor.cachecontrol.cache import BaseCache +from pip._vendor.cachecontrol.caches import FileCache +from pip._vendor.requests.models import Response + +from pip._internal.utils.filesystem import adjacent_tmp_file, replace +from pip._internal.utils.misc import ensure_dir +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Iterator + + +def is_from_cache(response): + # type: (Response) -> bool + return getattr(response, "from_cache", False) + + +@contextmanager +def suppressed_cache_errors(): + # type: () -> Iterator[None] + """If we can't access the cache then we can just skip caching and process + requests as if caching wasn't enabled. + """ + try: + yield + except (OSError, IOError): + pass + + +class SafeFileCache(BaseCache): + """ + A file based cache which is safe to use even when the target directory may + not be accessible or writable. + """ + + def __init__(self, directory): + # type: (str) -> None + assert directory is not None, "Cache directory must not be None." + super(SafeFileCache, self).__init__() + self.directory = directory + + def _get_cache_path(self, name): + # type: (str) -> str + # From cachecontrol.caches.file_cache.FileCache._fn, brought into our + # class for backwards-compatibility and to avoid using a non-public + # method. + hashed = FileCache.encode(name) + parts = list(hashed[:5]) + [hashed] + return os.path.join(self.directory, *parts) + + def get(self, key): + # type: (str) -> Optional[bytes] + path = self._get_cache_path(key) + with suppressed_cache_errors(): + with open(path, 'rb') as f: + return f.read() + + def set(self, key, value): + # type: (str, bytes) -> None + path = self._get_cache_path(key) + with suppressed_cache_errors(): + ensure_dir(os.path.dirname(path)) + + with adjacent_tmp_file(path) as f: + f.write(value) + + replace(f.name, path) + + def delete(self, key): + # type: (str) -> None + path = self._get_cache_path(key) + with suppressed_cache_errors(): + os.remove(path) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/network/cache.pyc b/venv/lib/python2.7/site-packages/pip/_internal/network/cache.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a71abb317c5ef057a34f6c00308a4ddf9327c0f9 GIT binary patch literal 3307 zcmb_e+io015UrWni+6pE9qe!s3<$^ylr`c3afwh8DhpyE9ZGCU9qKz|VO^u7Mrob;^=e(Gq(Nzu`ps(Hpk#s47WG@z zx=Bf!(naboQo2O_rAoU%$ugxY)L*IAElO4?U8DXQS!#{S-{tH!C6_2&r~W#n8`R$* zD`N*2=@<6&GAW0mCCty*+1DsqCRL{aySO4sqNn{$#In~}MTl>*xclhQLpKbS4 zk*HK zdQiaqATe0%8dU}+FGECuQRA`0L$9$gM5mHpW6_zzu)w#T!Ks5X zPkq6qvJBS_6hmW5Q|I}eAmLa98=O;4qvJVsAoQ0kwmG!zA}+4QnKnU^T>Er)_|s=8 zR5JXSAuZY2?M#`Iygb^LBfG`eEc4G}?a%$#fKfO|_Kd9!USXlHvKY5Ok?*a?*%s9} zG!AND(@~qs_sFuW%%Ug!yb4ku^AC0h?up{$XIG6IgrU;fHOvEX0kdrK*d30varIGL z$g?;*aDyyzi!#S=+Ae=e^}|SMquoHe@nE*?B+xLfvS2?^QCGJ1=72ufyIq!fDS6+0 zAalWPE?yPIEr2sB3eJyKQI$|%;ZS`AkB~cRI9AKrumtkGV4!B~o#Bi;-@^W{SSYSF zt|^u_07vO@-Ptm!p*=uTM_<6CK~Y^MP4f0SNSHohAyC|OL3?+f3n-evesUOxhiKM5|LXaO5l*~kz3qplV?XjB%V={Y96ty>`;Ai=mzcJTCw#S1tvJ1QLR3l4LtaQH$i zi?hja@Z$MpdRC)TW>OR6VvSYd!es(&OZM4Qt)PWKdmS9_&0zAtF%K7i1qR5+bp_^l z08TiAmZ3cO?!C>TBQpT$eK6f}93&$pCcF=^g~!EQdq7Pqa|2&XEJ)zoWVvBW9byB5 z5J+pHAy7uyus<4N0%W|iT04V`Ki z-uRClW?b;gkcXTIcP4A(&qMq3@Y*cxNkF{Vya-LMSH$=lJyFBWhP`C1*=rX6*_$F8 L*6U8IzPj`;)TGi< literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/network/download.py b/venv/lib/python2.7/site-packages/pip/_internal/network/download.py new file mode 100644 index 0000000..44f9985 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/network/download.py @@ -0,0 +1,182 @@ +"""Download files with progress indicators. +""" +import cgi +import logging +import mimetypes +import os + +from pip._vendor.requests.models import CONTENT_CHUNK_SIZE + +from pip._internal.cli.progress_bars import DownloadProgressProvider +from pip._internal.exceptions import NetworkConnectionError +from pip._internal.models.index import PyPI +from pip._internal.network.cache import is_from_cache +from pip._internal.network.utils import ( + HEADERS, + raise_for_status, + response_chunks, +) +from pip._internal.utils.misc import ( + format_size, + redact_auth_from_url, + splitext, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Iterable, Optional + + from pip._vendor.requests.models import Response + + from pip._internal.models.link import Link + from pip._internal.network.session import PipSession + +logger = logging.getLogger(__name__) + + +def _get_http_response_size(resp): + # type: (Response) -> Optional[int] + try: + return int(resp.headers['content-length']) + except (ValueError, KeyError, TypeError): + return None + + +def _prepare_download( + resp, # type: Response + link, # type: Link + progress_bar # type: str +): + # type: (...) -> Iterable[bytes] + total_length = _get_http_response_size(resp) + + if link.netloc == PyPI.file_storage_domain: + url = link.show_url + else: + url = link.url_without_fragment + + logged_url = redact_auth_from_url(url) + + if total_length: + logged_url = '{} ({})'.format(logged_url, format_size(total_length)) + + if is_from_cache(resp): + logger.info("Using cached %s", logged_url) + else: + logger.info("Downloading %s", logged_url) + + if logger.getEffectiveLevel() > logging.INFO: + show_progress = False + elif is_from_cache(resp): + show_progress = False + elif not total_length: + show_progress = True + elif total_length > (40 * 1000): + show_progress = True + else: + show_progress = False + + chunks = response_chunks(resp, CONTENT_CHUNK_SIZE) + + if not show_progress: + return chunks + + return DownloadProgressProvider( + progress_bar, max=total_length + )(chunks) + + +def sanitize_content_filename(filename): + # type: (str) -> str + """ + Sanitize the "filename" value from a Content-Disposition header. + """ + return os.path.basename(filename) + + +def parse_content_disposition(content_disposition, default_filename): + # type: (str, str) -> str + """ + Parse the "filename" value from a Content-Disposition header, and + return the default filename if the result is empty. + """ + _type, params = cgi.parse_header(content_disposition) + filename = params.get('filename') + if filename: + # We need to sanitize the filename to prevent directory traversal + # in case the filename contains ".." path parts. + filename = sanitize_content_filename(filename) + return filename or default_filename + + +def _get_http_response_filename(resp, link): + # type: (Response, Link) -> str + """Get an ideal filename from the given HTTP response, falling back to + the link filename if not provided. + """ + filename = link.filename # fallback + # Have a look at the Content-Disposition header for a better guess + content_disposition = resp.headers.get('content-disposition') + if content_disposition: + filename = parse_content_disposition(content_disposition, filename) + ext = splitext(filename)[1] # type: Optional[str] + if not ext: + ext = mimetypes.guess_extension( + resp.headers.get('content-type', '') + ) + if ext: + filename += ext + if not ext and link.url != resp.url: + ext = os.path.splitext(resp.url)[1] + if ext: + filename += ext + return filename + + +def _http_get_download(session, link): + # type: (PipSession, Link) -> Response + target_url = link.url.split('#', 1)[0] + resp = session.get(target_url, headers=HEADERS, stream=True) + raise_for_status(resp) + return resp + + +class Download(object): + def __init__( + self, + response, # type: Response + filename, # type: str + chunks, # type: Iterable[bytes] + ): + # type: (...) -> None + self.response = response + self.filename = filename + self.chunks = chunks + + +class Downloader(object): + def __init__( + self, + session, # type: PipSession + progress_bar, # type: str + ): + # type: (...) -> None + self._session = session + self._progress_bar = progress_bar + + def __call__(self, link): + # type: (Link) -> Download + try: + resp = _http_get_download(self._session, link) + except NetworkConnectionError as e: + assert e.response is not None + logger.critical( + "HTTP error %s while getting %s", e.response.status_code, link + ) + raise + + return Download( + resp, + _get_http_response_filename(resp, link), + _prepare_download(resp, link, self._progress_bar), + ) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/network/download.pyc b/venv/lib/python2.7/site-packages/pip/_internal/network/download.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b443e7183d8dd5da21099423378917f597f3481e GIT binary patch literal 5695 zcmb_gOLH7o6+S&9jWn`s$qy+~;!Cq*c|P=Zp#G-Uf*VlK&JNalG-XXHzW z>)VpfYUi?~XSMT!r02BrqNL}w(~mw{HJV*GoV`jV ztalcvn=5E;Ru9X(O44v6%Z&{mW^OAS)YWEftPQg=&H9O}YP&p@{R^LN2kI1e4$X}Z zx_4K)cjFtkKJ4C(*H?Qher@5{rfb8E@ckf5P3LD4ntVO8(ksLImxT~?JVbzKeD z$FRP(x3=o3Ph*tXc%!b0xS#a5Ooz7RCeYkkdF$p%wC-lnuanH0c%!Og>k_wX-3%v< z9aJUe`&+x^j`eSz!UE`u#KkuI%(x3mm?nJ}C%bOTpR`-&ZW0T2kY~<3a!2=m|K8d? zTzcik?Kt|d+g;4LtTWG<$R6MD|6t6+w%znDvj!B^h%KaZPb!veA^CDXCwUAP7>C^^e&o ze_eY9JM^p4nbKX$O}Xi|IxS4$MF_ZbD$y;IKuy+>o1Y~4u2HqYvgdZBNMlI8}`qEIn>;6&QAS5vU8K z{+U2_+ouRJP=X*RXGc>w+fR{Xnjm$jW&4cmj7j}Rfx#ZMqm3TKYiVbnAB3IH z53X1u=R=#7o1x+@4KG_Yo{_8I%4M5Tz1cq?Z?&Kzd6d2RTPU4yis%F&K@sRPulf_&VmqLy_s zuQoSL4Fu4ZH!2801SYexu|fCpz}ztpOs*zQO58w6SG(_g;Ko7vPLf-rQ+MlK6Hyuw z9*KxS6;VVhREiv!b<-G)++=(|sdd6tFz(o6ONGJ<5lYHks`sNi)60(DR`!Sf32P^Y z8cHA@)Mk*>l(hHq*LeENJf=0>I2TMe+KuT(D_Ckw2j?5Jjk%y5Oyg*@yVdsvwY@mWvG%mJsN+cM!LD!)t$b18g4-xAWN zhe?Papib##25)UaUzMSEM9aE~ciTL+vZ{eW;v`TI8^UpZ21e88Bc^-g@!#8hFVo6 z*RQBn(Ql|jZfLlG!ZFkwc+qR$9tdu|4d;Bg3tT(`kkSn;Abu8?+_&2=<- zb@lMk3!I~cN3Wt$LuUGi{)yS$688Frd}icO23WSw^1$&nd~_=~7tEq<1q<-Sv%w<% z_^sAROJta(pRsSF@z&_`L*yVZpR_59L+ganF-C3!(?S}<^rit{1jEymKmvTNYf{*C zl>PInfebxSF)JFat4&fUl}ZtB<7}qMUJD#Xm)Vdp?^Z%#$(L31iS9mm- zwgNqLq#IK|shy`m`ybkY=lv3DYEn(qj8+2-Qip0{?fImdj%kOKY8LU(V3DIkRHJN- zxtS@KMYwc!8HhKzjj$|^+EAiVt-jpP zv*qKsuv#rS)_z|nG>`g5e+;pzbw}iWox&fqjNhBgBVQ~Y@^pCI@TY<0K7R!AmEV6S z+I1NiAICu&hP0yl2F{dhxyWqa*OP6&pee+YJbGHB6tL%rmZ;%yIA)d-sfE*!9V>=! zydl$}hy}KL<_VI~1xJxm>nm~u5Z%%GHc~61CbYu#R?i&U=RS%AB1}1}?r)>^^%$XH zoVd9u2wwM5;m3rt{T`YYOkV#`PtGDw;orsai{rD%UgmY~d}F5Bo@`&mGt*vZPtKqI EH*u5w3IG5A literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/network/lazy_wheel.py b/venv/lib/python2.7/site-packages/pip/_internal/network/lazy_wheel.py new file mode 100644 index 0000000..a0f9e15 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/network/lazy_wheel.py @@ -0,0 +1,235 @@ +"""Lazy ZIP over HTTP""" + +__all__ = ['HTTPRangeRequestUnsupported', 'dist_from_wheel_url'] + +from bisect import bisect_left, bisect_right +from contextlib import contextmanager +from tempfile import NamedTemporaryFile +from zipfile import BadZipfile, ZipFile + +from pip._vendor.requests.models import CONTENT_CHUNK_SIZE +from pip._vendor.six.moves import range + +from pip._internal.network.utils import ( + HEADERS, + raise_for_status, + response_chunks, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.wheel import pkg_resources_distribution_for_wheel + +if MYPY_CHECK_RUNNING: + from typing import Any, Dict, Iterator, List, Optional, Tuple + + from pip._vendor.pkg_resources import Distribution + from pip._vendor.requests.models import Response + + from pip._internal.network.session import PipSession + + +class HTTPRangeRequestUnsupported(Exception): + pass + + +def dist_from_wheel_url(name, url, session): + # type: (str, str, PipSession) -> Distribution + """Return a pkg_resources.Distribution from the given wheel URL. + + This uses HTTP range requests to only fetch the potion of the wheel + containing metadata, just enough for the object to be constructed. + If such requests are not supported, HTTPRangeRequestUnsupported + is raised. + """ + with LazyZipOverHTTP(url, session) as wheel: + # For read-only ZIP files, ZipFile only needs methods read, + # seek, seekable and tell, not the whole IO protocol. + zip_file = ZipFile(wheel) # type: ignore + # After context manager exit, wheel.name + # is an invalid file by intention. + return pkg_resources_distribution_for_wheel(zip_file, name, wheel.name) + + +class LazyZipOverHTTP(object): + """File-like object mapped to a ZIP file over HTTP. + + This uses HTTP range requests to lazily fetch the file's content, + which is supposed to be fed to ZipFile. If such requests are not + supported by the server, raise HTTPRangeRequestUnsupported + during initialization. + """ + + def __init__(self, url, session, chunk_size=CONTENT_CHUNK_SIZE): + # type: (str, PipSession, int) -> None + head = session.head(url, headers=HEADERS) + raise_for_status(head) + assert head.status_code == 200 + self._session, self._url, self._chunk_size = session, url, chunk_size + self._length = int(head.headers['Content-Length']) + self._file = NamedTemporaryFile() + self.truncate(self._length) + self._left = [] # type: List[int] + self._right = [] # type: List[int] + if 'bytes' not in head.headers.get('Accept-Ranges', 'none'): + raise HTTPRangeRequestUnsupported('range request is not supported') + self._check_zip() + + @property + def mode(self): + # type: () -> str + """Opening mode, which is always rb.""" + return 'rb' + + @property + def name(self): + # type: () -> str + """Path to the underlying file.""" + return self._file.name + + def seekable(self): + # type: () -> bool + """Return whether random access is supported, which is True.""" + return True + + def close(self): + # type: () -> None + """Close the file.""" + self._file.close() + + @property + def closed(self): + # type: () -> bool + """Whether the file is closed.""" + return self._file.closed + + def read(self, size=-1): + # type: (int) -> bytes + """Read up to size bytes from the object and return them. + + As a convenience, if size is unspecified or -1, + all bytes until EOF are returned. Fewer than + size bytes may be returned if EOF is reached. + """ + download_size = max(size, self._chunk_size) + start, length = self.tell(), self._length + stop = length if size < 0 else min(start+download_size, length) + start = max(0, stop-download_size) + self._download(start, stop-1) + return self._file.read(size) + + def readable(self): + # type: () -> bool + """Return whether the file is readable, which is True.""" + return True + + def seek(self, offset, whence=0): + # type: (int, int) -> int + """Change stream position and return the new absolute position. + + Seek to offset relative position indicated by whence: + * 0: Start of stream (the default). pos should be >= 0; + * 1: Current position - pos may be negative; + * 2: End of stream - pos usually negative. + """ + return self._file.seek(offset, whence) + + def tell(self): + # type: () -> int + """Return the current possition.""" + return self._file.tell() + + def truncate(self, size=None): + # type: (Optional[int]) -> int + """Resize the stream to the given size in bytes. + + If size is unspecified resize to the current position. + The current stream position isn't changed. + + Return the new file size. + """ + return self._file.truncate(size) + + def writable(self): + # type: () -> bool + """Return False.""" + return False + + def __enter__(self): + # type: () -> LazyZipOverHTTP + self._file.__enter__() + return self + + def __exit__(self, *exc): + # type: (*Any) -> Optional[bool] + return self._file.__exit__(*exc) + + @contextmanager + def _stay(self): + # type: ()-> Iterator[None] + """Return a context manager keeping the position. + + At the end of the block, seek back to original position. + """ + pos = self.tell() + try: + yield + finally: + self.seek(pos) + + def _check_zip(self): + # type: () -> None + """Check and download until the file is a valid ZIP.""" + end = self._length - 1 + for start in reversed(range(0, end, self._chunk_size)): + self._download(start, end) + with self._stay(): + try: + # For read-only ZIP files, ZipFile only needs + # methods read, seek, seekable and tell. + ZipFile(self) # type: ignore + except BadZipfile: + pass + else: + break + + def _stream_response(self, start, end, base_headers=HEADERS): + # type: (int, int, Dict[str, str]) -> Response + """Return HTTP response to a range request from start to end.""" + headers = base_headers.copy() + headers['Range'] = 'bytes={}-{}'.format(start, end) + # TODO: Get range requests to be correctly cached + headers['Cache-Control'] = 'no-cache' + return self._session.get(self._url, headers=headers, stream=True) + + def _merge(self, start, end, left, right): + # type: (int, int, int, int) -> Iterator[Tuple[int, int]] + """Return an iterator of intervals to be fetched. + + Args: + start (int): Start of needed interval + end (int): End of needed interval + left (int): Index of first overlapping downloaded data + right (int): Index after last overlapping downloaded data + """ + lslice, rslice = self._left[left:right], self._right[left:right] + i = start = min([start]+lslice[:1]) + end = max([end]+rslice[-1:]) + for j, k in zip(lslice, rslice): + if j > i: + yield i, j-1 + i = k + 1 + if i <= end: + yield i, end + self._left[left:right], self._right[left:right] = [start], [end] + + def _download(self, start, end): + # type: (int, int) -> None + """Download bytes from start to end inclusively.""" + with self._stay(): + left = bisect_left(self._right, start) + right = bisect_right(self._left, end) + for start, end in self._merge(start, end, left, right): + response = self._stream_response(start, end) + response.raise_for_status() + self.seek(start) + for chunk in response_chunks(response, self._chunk_size): + self._file.write(chunk) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/network/lazy_wheel.pyc b/venv/lib/python2.7/site-packages/pip/_internal/network/lazy_wheel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ac3e3eed30de5818a234b6b8bab59e5c36e951f GIT binary patch literal 9693 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 bool + """ + Return whether it looks like pip is running under CI. + """ + # We don't use the method of checking for a tty (e.g. using isatty()) + # because some CI systems mimic a tty (e.g. Travis CI). Thus that + # method doesn't provide definitive information in either direction. + return any(name in os.environ for name in CI_ENVIRONMENT_VARIABLES) + + +def user_agent(): + """ + Return a string representing the user agent. + """ + data = { + "installer": {"name": "pip", "version": __version__}, + "python": platform.python_version(), + "implementation": { + "name": platform.python_implementation(), + }, + } + + if data["implementation"]["name"] == 'CPython': + data["implementation"]["version"] = platform.python_version() + elif data["implementation"]["name"] == 'PyPy': + if sys.pypy_version_info.releaselevel == 'final': + pypy_version_info = sys.pypy_version_info[:3] + else: + pypy_version_info = sys.pypy_version_info + data["implementation"]["version"] = ".".join( + [str(x) for x in pypy_version_info] + ) + elif data["implementation"]["name"] == 'Jython': + # Complete Guess + data["implementation"]["version"] = platform.python_version() + elif data["implementation"]["name"] == 'IronPython': + # Complete Guess + data["implementation"]["version"] = platform.python_version() + + if sys.platform.startswith("linux"): + from pip._vendor import distro + distro_infos = dict(filter( + lambda x: x[1], + zip(["name", "version", "id"], distro.linux_distribution()), + )) + libc = dict(filter( + lambda x: x[1], + zip(["lib", "version"], libc_ver()), + )) + if libc: + distro_infos["libc"] = libc + if distro_infos: + data["distro"] = distro_infos + + if sys.platform.startswith("darwin") and platform.mac_ver()[0]: + data["distro"] = {"name": "macOS", "version": platform.mac_ver()[0]} + + if platform.system(): + data.setdefault("system", {})["name"] = platform.system() + + if platform.release(): + data.setdefault("system", {})["release"] = platform.release() + + if platform.machine(): + data["cpu"] = platform.machine() + + if has_tls(): + import _ssl as ssl + data["openssl_version"] = ssl.OPENSSL_VERSION + + setuptools_version = get_installed_version("setuptools") + if setuptools_version is not None: + data["setuptools_version"] = setuptools_version + + # Use None rather than False so as not to give the impression that + # pip knows it is not being run under CI. Rather, it is a null or + # inconclusive result. Also, we include some value rather than no + # value to make it easier to know that the check has been run. + data["ci"] = True if looks_like_ci() else None + + user_data = os.environ.get("PIP_USER_AGENT_USER_DATA") + if user_data is not None: + data["user_data"] = user_data + + return "{data[installer][name]}/{data[installer][version]} {json}".format( + data=data, + json=json.dumps(data, separators=(",", ":"), sort_keys=True), + ) + + +class LocalFSAdapter(BaseAdapter): + + def send(self, request, stream=None, timeout=None, verify=None, cert=None, + proxies=None): + pathname = url_to_path(request.url) + + resp = Response() + resp.status_code = 200 + resp.url = request.url + + try: + stats = os.stat(pathname) + except OSError as exc: + resp.status_code = 404 + resp.raw = exc + else: + modified = email.utils.formatdate(stats.st_mtime, usegmt=True) + content_type = mimetypes.guess_type(pathname)[0] or "text/plain" + resp.headers = CaseInsensitiveDict({ + "Content-Type": content_type, + "Content-Length": stats.st_size, + "Last-Modified": modified, + }) + + resp.raw = open(pathname, "rb") + resp.close = resp.raw.close + + return resp + + def close(self): + pass + + +class InsecureHTTPAdapter(HTTPAdapter): + + def cert_verify(self, conn, url, verify, cert): + super(InsecureHTTPAdapter, self).cert_verify( + conn=conn, url=url, verify=False, cert=cert + ) + + +class InsecureCacheControlAdapter(CacheControlAdapter): + + def cert_verify(self, conn, url, verify, cert): + super(InsecureCacheControlAdapter, self).cert_verify( + conn=conn, url=url, verify=False, cert=cert + ) + + +class PipSession(requests.Session): + + timeout = None # type: Optional[int] + + def __init__(self, *args, **kwargs): + """ + :param trusted_hosts: Domains not to emit warnings for when not using + HTTPS. + """ + retries = kwargs.pop("retries", 0) + cache = kwargs.pop("cache", None) + trusted_hosts = kwargs.pop("trusted_hosts", []) # type: List[str] + index_urls = kwargs.pop("index_urls", None) + + super(PipSession, self).__init__(*args, **kwargs) + + # Namespace the attribute with "pip_" just in case to prevent + # possible conflicts with the base class. + self.pip_trusted_origins = [] # type: List[Tuple[str, Optional[int]]] + + # Attach our User Agent to the request + self.headers["User-Agent"] = user_agent() + + # Attach our Authentication handler to the session + self.auth = MultiDomainBasicAuth(index_urls=index_urls) + + # Create our urllib3.Retry instance which will allow us to customize + # how we handle retries. + retries = urllib3.Retry( + # Set the total number of retries that a particular request can + # have. + total=retries, + + # A 503 error from PyPI typically means that the Fastly -> Origin + # connection got interrupted in some way. A 503 error in general + # is typically considered a transient error so we'll go ahead and + # retry it. + # A 500 may indicate transient error in Amazon S3 + # A 520 or 527 - may indicate transient error in CloudFlare + status_forcelist=[500, 503, 520, 527], + + # Add a small amount of back off between failed requests in + # order to prevent hammering the service. + backoff_factor=0.25, + ) + + # Our Insecure HTTPAdapter disables HTTPS validation. It does not + # support caching so we'll use it for all http:// URLs. + # If caching is disabled, we will also use it for + # https:// hosts that we've marked as ignoring + # TLS errors for (trusted-hosts). + insecure_adapter = InsecureHTTPAdapter(max_retries=retries) + + # We want to _only_ cache responses on securely fetched origins or when + # the host is specified as trusted. We do this because + # we can't validate the response of an insecurely/untrusted fetched + # origin, and we don't want someone to be able to poison the cache and + # require manual eviction from the cache to fix it. + if cache: + secure_adapter = CacheControlAdapter( + cache=SafeFileCache(cache), + max_retries=retries, + ) + self._trusted_host_adapter = InsecureCacheControlAdapter( + cache=SafeFileCache(cache), + max_retries=retries, + ) + else: + secure_adapter = HTTPAdapter(max_retries=retries) + self._trusted_host_adapter = insecure_adapter + + self.mount("https://", secure_adapter) + self.mount("http://", insecure_adapter) + + # Enable file:// urls + self.mount("file://", LocalFSAdapter()) + + for host in trusted_hosts: + self.add_trusted_host(host, suppress_logging=True) + + def add_trusted_host(self, host, source=None, suppress_logging=False): + # type: (str, Optional[str], bool) -> None + """ + :param host: It is okay to provide a host that has previously been + added. + :param source: An optional source string, for logging where the host + string came from. + """ + if not suppress_logging: + msg = 'adding trusted host: {!r}'.format(host) + if source is not None: + msg += ' (from {})'.format(source) + logger.info(msg) + + host_port = parse_netloc(host) + if host_port not in self.pip_trusted_origins: + self.pip_trusted_origins.append(host_port) + + self.mount( + build_url_from_netloc(host) + '/', + self._trusted_host_adapter + ) + if not host_port[1]: + # Mount wildcard ports for the same host. + self.mount( + build_url_from_netloc(host) + ':', + self._trusted_host_adapter + ) + + def iter_secure_origins(self): + # type: () -> Iterator[SecureOrigin] + for secure_origin in SECURE_ORIGINS: + yield secure_origin + for host, port in self.pip_trusted_origins: + yield ('*', host, '*' if port is None else port) + + def is_secure_origin(self, location): + # type: (Link) -> bool + # Determine if this url used a secure transport mechanism + parsed = urllib_parse.urlparse(str(location)) + origin_protocol, origin_host, origin_port = ( + parsed.scheme, parsed.hostname, parsed.port, + ) + + # The protocol to use to see if the protocol matches. + # Don't count the repository type as part of the protocol: in + # cases such as "git+ssh", only use "ssh". (I.e., Only verify against + # the last scheme.) + origin_protocol = origin_protocol.rsplit('+', 1)[-1] + + # Determine if our origin is a secure origin by looking through our + # hardcoded list of secure origins, as well as any additional ones + # configured on this PackageFinder instance. + for secure_origin in self.iter_secure_origins(): + secure_protocol, secure_host, secure_port = secure_origin + if origin_protocol != secure_protocol and secure_protocol != "*": + continue + + try: + addr = ipaddress.ip_address( + None + if origin_host is None + else six.ensure_text(origin_host) + ) + network = ipaddress.ip_network( + six.ensure_text(secure_host) + ) + except ValueError: + # We don't have both a valid address or a valid network, so + # we'll check this origin against hostnames. + if ( + origin_host and + origin_host.lower() != secure_host.lower() and + secure_host != "*" + ): + continue + else: + # We have a valid address and network, so see if the address + # is contained within the network. + if addr not in network: + continue + + # Check to see if the port matches. + if ( + origin_port != secure_port and + secure_port != "*" and + secure_port is not None + ): + continue + + # If we've gotten here, then this origin matches the current + # secure origin and we should return True + return True + + # If we've gotten to this point, then the origin isn't secure and we + # will not accept it as a valid location to search. We will however + # log a warning that we are ignoring it. + logger.warning( + "The repository located at %s is not a trusted or secure host and " + "is being ignored. If this repository is available via HTTPS we " + "recommend you use HTTPS instead, otherwise you may silence " + "this warning and allow it anyway with '--trusted-host %s'.", + origin_host, + origin_host, + ) + + return False + + def request(self, method, url, *args, **kwargs): + # Allow setting a default timeout on a session + kwargs.setdefault("timeout", self.timeout) + + # Dispatch the actual request + return super(PipSession, self).request(method, url, *args, **kwargs) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/network/session.pyc b/venv/lib/python2.7/site-packages/pip/_internal/network/session.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c1ea44b0a99174d710b5611eb6cd980adad7582f GIT binary patch literal 11517 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 None + http_error_msg = u'' + if isinstance(resp.reason, bytes): + # We attempt to decode utf-8 first because some servers + # choose to localize their reason strings. If the string + # isn't utf-8, we fall back to iso-8859-1 for all other + # encodings. + try: + reason = resp.reason.decode('utf-8') + except UnicodeDecodeError: + reason = resp.reason.decode('iso-8859-1') + else: + reason = resp.reason + + if 400 <= resp.status_code < 500: + http_error_msg = u'%s Client Error: %s for url: %s' % ( + resp.status_code, reason, resp.url) + + elif 500 <= resp.status_code < 600: + http_error_msg = u'%s Server Error: %s for url: %s' % ( + resp.status_code, reason, resp.url) + + if http_error_msg: + raise NetworkConnectionError(http_error_msg, response=resp) + + +def response_chunks(response, chunk_size=CONTENT_CHUNK_SIZE): + # type: (Response, int) -> Iterator[bytes] + """Given a requests Response, provide the data chunks. + """ + try: + # Special case for urllib3. + for chunk in response.raw.stream( + chunk_size, + # We use decode_content=False here because we don't + # want urllib3 to mess with the raw bytes we get + # from the server. If we decompress inside of + # urllib3 then we cannot verify the checksum + # because the checksum will be of the compressed + # file. This breakage will only occur if the + # server adds a Content-Encoding header, which + # depends on how the server was configured: + # - Some servers will notice that the file isn't a + # compressible file and will leave the file alone + # and with an empty Content-Encoding + # - Some servers will notice that the file is + # already compressed and will leave the file + # alone and will add a Content-Encoding: gzip + # header + # - Some servers won't notice anything at all and + # will take a file that's already been compressed + # and compress it again and set the + # Content-Encoding: gzip header + # + # By setting this not to decode automatically we + # hope to eliminate problems with the second case. + decode_content=False, + ): + yield chunk + except AttributeError: + # Standard file-like object. + while True: + chunk = response.raw.read(chunk_size) + if not chunk: + break + yield chunk diff --git a/venv/lib/python2.7/site-packages/pip/_internal/network/utils.pyc b/venv/lib/python2.7/site-packages/pip/_internal/network/utils.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10e51d51a5b29ca070783e46d9f69eb2b634924a GIT binary patch literal 1729 zcmb_cL37(g6n-n&itW@8GJ~O%p}KU&huR*Pp%V&2$vCFXbPydm!Kr5$p-P)(V`-)A zuF^P^3+aU$cYa6z3KxC_1DxT#l??~r1RCr4?bCa2cfar3b${u0e){fZl)&n7@&6Ni z_19=p{4vM?at3n-xdU?t7)2e(T*w`v5p7FF7$9k@A zK>ZA6gB+v@^R5{C7Q0%p)T{*+ZXYzEQJLexj_@Ed|nrspl0^n^-2?coyWnk_6> zvCuq1h@yH`1fqTi4LBa#Zn~_;y6n2sc5X5k|7+{9gx0%OX+kv$&GI%}+_H3Al@hD9 zRvFv-a+9Qq`uT#Ly$!ROyoVZftwwXw=*5V(uEe?=RmE0f#UdTUBUD9Qeh+4n!4c|x zY9Z4*IQM;V&ZQswil0@;g!b15`LrMI zA3Oa2$fT=eE!e2uAjw114Th)MxyHOVx=xpMoi^KM9&50m-^EYn1{xI0Fhcy&LJijd z4s(=lrbDU^?Pd7pI&&?lA-|xz3$H|N1#I5>TShH5vn=sy3kgvR=W0xdg>-uG3IKR8 v+1;Cj)9^Kl(yIOf$9n%&?k#Nj5pJr=_{X##O$V&!Y_Tnr`t{elZu`a`ix!2g literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/network/xmlrpc.py b/venv/lib/python2.7/site-packages/pip/_internal/network/xmlrpc.py new file mode 100644 index 0000000..e611262 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/network/xmlrpc.py @@ -0,0 +1,52 @@ +"""xmlrpclib.Transport implementation +""" + +import logging + +# NOTE: XMLRPC Client is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import +from pip._vendor.six.moves import xmlrpc_client # type: ignore +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.exceptions import NetworkConnectionError +from pip._internal.network.utils import raise_for_status +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Dict + from pip._internal.network.session import PipSession + + +logger = logging.getLogger(__name__) + + +class PipXmlrpcTransport(xmlrpc_client.Transport): + """Provide a `xmlrpclib.Transport` implementation via a `PipSession` + object. + """ + + def __init__(self, index_url, session, use_datetime=False): + # type: (str, PipSession, bool) -> None + xmlrpc_client.Transport.__init__(self, use_datetime) + index_parts = urllib_parse.urlparse(index_url) + self._scheme = index_parts.scheme + self._session = session + + def request(self, host, handler, request_body, verbose=False): + # type: (str, str, Dict[str, str], bool) -> None + parts = (self._scheme, host, handler, None, None, None) + url = urllib_parse.urlunparse(parts) + try: + headers = {'Content-Type': 'text/xml'} + response = self._session.post(url, data=request_body, + headers=headers, stream=True) + raise_for_status(response) + self.verbose = verbose + return self.parse_response(response.raw) + except NetworkConnectionError as exc: + assert exc.response + logger.critical( + "HTTP error %s while getting %s", + exc.response.status_code, url, + ) + raise diff --git a/venv/lib/python2.7/site-packages/pip/_internal/network/xmlrpc.pyc b/venv/lib/python2.7/site-packages/pip/_internal/network/xmlrpc.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e142a038cde38bb79aa235f8efadee7731e91883 GIT binary patch literal 2256 zcmb_d-EJFI5T4!jf1KED8bB0~r3z#aaU?E!1FC>fXa!i&CKZWqHk;j(WZnJaoa6i; z=cefm;xTvz#634W1dqW3z&EpwE79Ij%V&J%=bSS$-^|$id$se|&%Xr`Ej}K8KgTk^ zgTzD=P={idQimqk;OkN9Qs&XbBZv7Kr8UaxG-*_Pozf;{Et<3{zCmf5vJOo;72l+E zg|aS9y5y)X>0jj57Nx6{tqpVMpJ~=s&a%g&s)NQ(kAL|r%NO?59L&tDn zg`N{#6CF%8*wfu%mjk#5a*?IFjMC(2w5P+|l!dl~Br8*usoaJ(De_M84?g3e18cjw zJQCm#Oe%35;xg1mRqPvJ$I6};`ssF&=PKfR9%^0aO5cZGhlx?aaiIf)cV?#2+=k}+ zgPnt5`_aSgZv+3yc>H+$O{J?r_f--tp6r0zNy=Si3@*2P5bVB$vkYYknhW)pSmpx| z1<;TbP?vKAgq|a1HQBqeuamz!WT1@?vZIT$BvylPaQKRJ9sVa@gR>-L(-+Pib_Vzq zM^hwXB>RYC;iT~!+gRpP5KA-#h%U{E<{n+Ulrh87)X(U_Zim!%Srko{0#IaOh-w1KP0lhrEB%zM~A z+S}V1DDKX|`(|){nxtxQqO48w69|U4VB&M%%VpytS3alIG6CSTTW5sk& z&y>#vE{~rneN-5Q$QGj_&&XiU^&XlpiQ4wGIciEKdMJiK#LUjHH zBtBAAnUtBhHlZ#d6+45 zGshVOSrN}tW~FC?xQMXlXub|pqoh0h55d0h{h9NEhf{`y=sQfv!eX5PCmow>PqG4gx?h=&n6=sPJ> p|08hzfJuu9r|dPuAQkahRRa&Wiwt7`Flv1i4HjqvblvND{{r213%mdT literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/operations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/operations/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2371088be4aa6ce9ae482d43d6c343637ad6703e GIT binary patch literal 151 zcmZSn%*%DVb8CDu0~9aQ(bd5Z-s?2ghLSP)9nOBlpl$V&JpI?w#lvt9PpI59O4;0NTiI3MSs4U?C8e)^1 PpHiBWY6r5a1c(^`>1QJ% literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/build/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/operations/build/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/build/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/operations/build/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6fa8de8a65d7d500ed3561f1acf73b19efdd6687 GIT binary patch literal 157 zcmZSn%*%DVb8CDu0~9aQ(bd5Z-s?2ghLSP)9nOBlpl$V&JpI?w#lvt9PpI5A(RGOKSq8|^G%PfhH*DI(j V;Q$(ClbfGXnv-e=vake*835nKC1(Ht literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata.py b/venv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata.py new file mode 100644 index 0000000..cf52f8d --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata.py @@ -0,0 +1,37 @@ +"""Metadata generation logic for source distributions. +""" + +import os + +from pip._internal.utils.subprocess import runner_with_spinner_message +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from pip._internal.build_env import BuildEnvironment + from pip._vendor.pep517.wrappers import Pep517HookCaller + + +def generate_metadata(build_env, backend): + # type: (BuildEnvironment, Pep517HookCaller) -> str + """Generate metadata using mechanisms described in PEP 517. + + Returns the generated metadata directory. + """ + metadata_tmpdir = TempDirectory( + kind="modern-metadata", globally_managed=True + ) + + metadata_dir = metadata_tmpdir.path + + with build_env: + # Note that Pep517HookCaller implements a fallback for + # prepare_metadata_for_build_wheel, so we don't have to + # consider the possibility that this hook doesn't exist. + runner = runner_with_spinner_message("Preparing wheel metadata") + with backend.subprocess_runner(runner): + distinfo_dir = backend.prepare_metadata_for_build_wheel( + metadata_dir + ) + + return os.path.join(metadata_dir, distinfo_dir) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata.pyc b/venv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8469a1a4a5abc197a44e21fdf28a3f1b914a4f1 GIT binary patch literal 1366 zcmb_b&2G~`5FXo!)26K`6a)f3i2J_?N{}a6CGm;!&gw%uFhr)vq ze&8>F!iO?|Q2-wCEht)0wqew6_%;+FlpPp#z~ddzNA6V!#R`T!YaX zcoKuGz*mg6PNClQRw;w~NZxRp=BZ7iF_&DYRwx-2YAmwoQ0d61T4y}Ug|S*3)TA|W zSNz5^=y~|u-a?{liEr77uoGq~;h2&ela6^~w1GzNd09OZnrBw&(?)!S;_nal+3w4| z-PbJnFc`cVyl8ZrsC!zABHxq8LMvHvX)iQGUOl+`@TF2myJ=Byoe`=b-Y(u%lqrXFkk)nEG%QzzpE~4tO>ofX_WRYr)KeDN@INzX~4lZI}g4-G+~O8{U3u zs13=@v_sli8_o$-O28CIUNl(ps9d018zINYW|LG3Q<^B}CPPSh9tjx@_l6PH6L-52 zo`l<4OB2}%Uvve{mag&zh_SP_Eev=hWNt3uN2zkI<@UnZ5{%X-gWK&a1i zARW!BkcWz)u7^B0VxHqyA6@h-QEdxpEF!Xf@746nPDvtnnUEIION+j$=DT3}F0=k3 zVqBfN`sdqnQ7WZsXrLhsy-UHW-)XITn_lQ$3wkvEt}e!Ml`)pAk>Cyzj2thc#<*XF zi7%jS;J*D2JBtfNMK-;<`7f(eT*z@kz}xG8*(_mC0y3awb}1br`bx)@TeJ8?rxgNX o5*mnP3&{nr{~g^GbpHs)xGwl(%G%HfhyJ?1iEwWEA=0hj4=W>MoB#j- literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata_legacy.py b/venv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata_legacy.py new file mode 100644 index 0000000..14762ae --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata_legacy.py @@ -0,0 +1,77 @@ +"""Metadata generation logic for legacy source distributions. +""" + +import logging +import os + +from pip._internal.exceptions import InstallationError +from pip._internal.utils.setuptools_build import make_setuptools_egg_info_args +from pip._internal.utils.subprocess import call_subprocess +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from pip._internal.build_env import BuildEnvironment + +logger = logging.getLogger(__name__) + + +def _find_egg_info(directory): + # type: (str) -> str + """Find an .egg-info subdirectory in `directory`. + """ + filenames = [ + f for f in os.listdir(directory) if f.endswith(".egg-info") + ] + + if not filenames: + raise InstallationError( + "No .egg-info directory found in {}".format(directory) + ) + + if len(filenames) > 1: + raise InstallationError( + "More than one .egg-info directory found in {}".format( + directory + ) + ) + + return os.path.join(directory, filenames[0]) + + +def generate_metadata( + build_env, # type: BuildEnvironment + setup_py_path, # type: str + source_dir, # type: str + isolated, # type: bool + details, # type: str +): + # type: (...) -> str + """Generate metadata using setup.py-based defacto mechanisms. + + Returns the generated metadata directory. + """ + logger.debug( + 'Running setup.py (path:%s) egg_info for package %s', + setup_py_path, details, + ) + + egg_info_dir = TempDirectory( + kind="pip-egg-info", globally_managed=True + ).path + + args = make_setuptools_egg_info_args( + setup_py_path, + egg_info_dir=egg_info_dir, + no_user_config=isolated, + ) + + with build_env: + call_subprocess( + args, + cwd=source_dir, + command_desc='python setup.py egg_info', + ) + + # Return the .egg-info directory. + return _find_egg_info(egg_info_dir) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata_legacy.pyc b/venv/lib/python2.7/site-packages/pip/_internal/operations/build/metadata_legacy.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5756abf51241ffdd56839c9a34bc7563906d506f GIT binary patch literal 2238 zcmcJQ-*4PR5XZ;%os(QIO`3oT6p)3ebRgv-io^pTgh)e)AO|%?(34>6v-ccdY_IXI zTMm*Jf`oX2KZIBQ8vYFa0Qk=O?ubMyp6ZkL_Q%Zb?96Az-d~%&KY#f{#I$%^{J)P^ z|Bfah8l!b6aVd9bj85BkY3$m*N4ZBuhsGUpc&$TumkOW8emm|`zDC75jn~_;Px%HF zJsS7g@fzh)z&>Tw>C6S4ORF<-iOs2{pS7{apQ&k7KOrv-nXw}rQ43bQnI-4{sq=&ui zZ#<)cgI&xuG)JX2QJ&j94(nRg?b1tFDxy;XCKm3=qPm^cGB&E7xAHrfKED6ieR1&7;lalu{9-gZ8r^Bvwz2j>ljX@_ z`7oDz5Ocj?R} z{V5rb-8kzk)FAewLvX(7vH*sON2eXC=T@@wI7yu9(`=1*fJ)M(=Px)gK3n!Cnh&!w z38FF>!dH9js{oEkmOcowGI+2WJs9=^JbD9qD|!72Mk94;gOxmD+hBL>@xyt>e$jhq zj#VuKbAmHfDgRdu3N%kcKg!HWh&~y<7l%2LDDP3_z?gHlvTJ-`&%MjxZMZ;EQa$|^X?^0#;EX!iYE1y9)* zpcz@0QNFLL1>t&s!gTBx3;0FL`LLRstJqOY;rkV%yO_~T8+G6Ce8+R1^>)zu&Q>Sx zVwUgS!)uwU&}o4}f`gm04qbTUz(?Q(P$1`V{|j=#&Ux4J0$4yzmlB`Ou;jSs=n(yS z18V5`lmHSauX8SA+4&NweD^E(8%jWJk<6fv?zA~9gXP77MrUOj*v!N2_9l^*Ns!2C zgiL}|jA&=NKr&l^LS$%NYCs^D^#J0l%~nxa;C2f~hD}*sJ|Y-!NZ-DxUkjE=ZYxO@ z#ivm!gPYoh`xGA5edu%GmV_J5+cZ}bl!3V@q7n*;VX5U-g5ly2l}a>P)*@ErG)pZ~ z@uOBYRs~cOkw_iu=lF=ZIYCuhI$>qksKuAbM8!*GjqC+_a?+%sC6NKWS2r@`Y8f(# zA+sK`nF9{H<v5+nN}!~xEF7b0KhEQAv0$EV(TFW zPmOOb)QeIt#WJ$5V^Y7&$MzZU9x&hW7;)d(@YXEszO&gGJOc@9w-AYng=ljgz5@Xv z`_Wi`XVq|(bVK=FEGzrPXbZus5JS)}N#J{u>*1xZgY~HOw_&3mE4}(i*pQePpCD)O z;b7Od0e#^~QuB&$!0|TM|0A;saL9bvn5WWw(jvnl6@u%M5FzVYI>G?Gf9urKDpq{> fyM;=cT)xL-THJlN@ATbmXYq4=XV=~GHm?5z!Ok>W literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel.py b/venv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel.py new file mode 100644 index 0000000..0c28c49 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel.py @@ -0,0 +1,46 @@ +import logging +import os + +from pip._internal.utils.subprocess import runner_with_spinner_message +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Optional + from pip._vendor.pep517.wrappers import Pep517HookCaller + +logger = logging.getLogger(__name__) + + +def build_wheel_pep517( + name, # type: str + backend, # type: Pep517HookCaller + metadata_directory, # type: str + build_options, # type: List[str] + tempd, # type: str +): + # type: (...) -> Optional[str] + """Build one InstallRequirement using the PEP 517 build process. + + Returns path to wheel if successfully built. Otherwise, returns None. + """ + assert metadata_directory is not None + if build_options: + # PEP 517 does not support --build-options + logger.error('Cannot build wheel for %s using PEP 517 when ' + '--build-option is present', name) + return None + try: + logger.debug('Destination directory: %s', tempd) + + runner = runner_with_spinner_message( + 'Building wheel for {} (PEP 517)'.format(name) + ) + with backend.subprocess_runner(runner): + wheel_name = backend.build_wheel( + tempd, + metadata_directory=metadata_directory, + ) + except Exception: + logger.error('Failed building wheel for %s', name) + return None + return os.path.join(tempd, wheel_name) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel.pyc b/venv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ce76e4444df4b2da44fce5a5483330bd850e0c8 GIT binary patch literal 1553 zcmb_cQIFe15T3PT=Pu2);gAp%1glDwg48&oQb9rp0mqe|DCyxAwats=i}!NQ*=w`A z<_P3oI9_-_{0aU7690vt!4H6$v3my(yy3)~oyqLX_kBCN{+~O8KYscxSwQ!A`1=vQ z_5z0tzXA$?`Q==|T(IAR!h_O>xetQkd?9lBU;0J_n@jy_tK(JW)Yy1Kv4J|zV>$@MJ6k)>E=V7ow}EmP_315snU+j7# z5#r}%Z%2$oAjUT^iusY!xJNNN-b63rh%PZijmrxgUFqA(fAc@$+!`;MWz2UFZDVJX z+_6tKT})iy8`QKiQ42geGii-vZA|wL@6}Sdhiwngm6EWKNfMJ0zly_^sQ<6BRN#ZM a%9=ubNHi>6cSA8m{YG9WUO@$K_ str + """Format command information for logging.""" + command_desc = format_command_args(command_args) + text = 'Command arguments: {}\n'.format(command_desc) + + if not command_output: + text += 'Command output: None' + elif logger.getEffectiveLevel() > logging.DEBUG: + text += 'Command output: [use --verbose to show]' + else: + if not command_output.endswith('\n'): + command_output += '\n' + text += 'Command output:\n{}{}'.format(command_output, LOG_DIVIDER) + + return text + + +def get_legacy_build_wheel_path( + names, # type: List[str] + temp_dir, # type: str + name, # type: str + command_args, # type: List[str] + command_output, # type: Text +): + # type: (...) -> Optional[str] + """Return the path to the wheel in the temporary build directory.""" + # Sort for determinism. + names = sorted(names) + if not names: + msg = ( + 'Legacy build of wheel for {!r} created no files.\n' + ).format(name) + msg += format_command_result(command_args, command_output) + logger.warning(msg) + return None + + if len(names) > 1: + msg = ( + 'Legacy build of wheel for {!r} created more than one file.\n' + 'Filenames (choosing first): {}\n' + ).format(name, names) + msg += format_command_result(command_args, command_output) + logger.warning(msg) + + return os.path.join(temp_dir, names[0]) + + +def build_wheel_legacy( + name, # type: str + setup_py_path, # type: str + source_dir, # type: str + global_options, # type: List[str] + build_options, # type: List[str] + tempd, # type: str +): + # type: (...) -> Optional[str] + """Build one unpacked package using the "legacy" build process. + + Returns path to wheel if successfully built. Otherwise, returns None. + """ + wheel_args = make_setuptools_bdist_wheel_args( + setup_py_path, + global_options=global_options, + build_options=build_options, + destination_dir=tempd, + ) + + spin_message = 'Building wheel for {} (setup.py)'.format(name) + with open_spinner(spin_message) as spinner: + logger.debug('Destination directory: %s', tempd) + + try: + output = call_subprocess( + wheel_args, + cwd=source_dir, + spinner=spinner, + ) + except Exception: + spinner.finish("error") + logger.error('Failed building wheel for %s', name) + return None + + names = os.listdir(tempd) + wheel_path = get_legacy_build_wheel_path( + names=names, + temp_dir=tempd, + name=name, + command_args=wheel_args, + command_output=output, + ) + return wheel_path diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel_legacy.pyc b/venv/lib/python2.7/site-packages/pip/_internal/operations/build/wheel_legacy.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00a5eefd2add960031386c3f75029b455f1d4802 GIT binary patch literal 3179 zcmcJRTW=dh6vxl5FR@*_POnfX?Y5%AMbr^}pi+e@)HJ<7NXw?Btr1#nb|=odd$D%L zO+)RcBBV-{c;<-*J_F*zAn_&m0PsI&oHP|6c%V)^o;fpfX6BsVIWv{tJFQ=z{~Sa# z|G4=51Yi9NiWvV6r9^|hxmQ+b zfxgA2j#Au^$}x(YQaR51UGKH9_v8bN_(%m>naS7` zMXH01IMF89-cl+J!g8p46`p?p#p>-F!L?go-nzEpn=aZ>n5KcAY>dkyQd*lMkZl%a z7MdU`vMkJFt3Wnz7@eO#yz?+vzPYmeS>WGWTf4P(!z!<`a;$0^sN5c#q{ze6u=K8a zVj^}3H~71Zul^2&A(|2!V+Ln9G;(O_O0z;!hjgE&6^dQDG^8Bwt#F7l*No#HC%&?z@jzch0Qwr5o}S;8T+K+mjNNY{IH-p_j|uFJu_`N6#; zx0b+BJk-3j7!H$s*w@D~cG+6TgLx;J%8kD4J)O1m(S2RT#Ed8AvbR>`O7!o}+3omh zqLp{y!edo#6sVcP(_6*%*P4y}x2jrCXHRE6wy@8JG`w@WN2&4#RcQ`EI#gz5b5lho zd8}5|W0m5}MDr7v8tT_puHL&L-cot2w-dAFvy*zFm{HsBe{*o3z;0h~+#M4u9f`9I zoZZ7%l0tuq+LFn}OXFmGA<4A?ZWk`z8h!Io#v=I!Np4gLT9yEJ88SI~X=9S4@scGt zRl_ja>5q5JF{rcW-J`QqdXh?q*q-Wbr|Z_8j&scExLy1ncOyP7n`#ffpU`*-pHQe* zUPZ7*(;6cOLZ$$UaY4I6qbhd*Fb6oT!|aw|V9G$g;0$6pX1Pn4^ly3qC!8~C(5T7C zVjieHfw^-suVAx2V!O;ev!%RoXto#?u8V!ZsWgnr#zh&HJDwQNi<1)mFUp<1{tzlw z#ftO3Vsk#1xqf=4oOw~HLZf0YFTBkpRl46w7(pq!TU2NYZZo)LHq zZJ|ZZrjg31NOB2lAzjuN(%D1->>`6$>~jwE7kLrZm+9f_gZFJLfUpcK&Ve{-o}+o= z@1tA4g@Rgbrw)Xh&Jo~Sbq~9Bw~hLu8!^Njn!M{}eD!ZA7-VERkR#a=w1Polv@(-y z$UNFKyC6g(`#JRek2Gt{fd4wAM?L>z)E`T9Q^{tRZaPa?kkHYaInqsR2U+fY|-Ct7{rl@fhg5_w-VNj@B=#YUJ0gkQkhKJ-NV<=FaOA7?)4C17h4;=y3RT6GlxEp^55ZNF9Ozjd;*`N-Uc8l^8n-o8mo=T(B~*I z9G)vrA|(fxxZOoTXR{}q31vr1pQmD|q>jvm&0P e>WbWY%y8RjyNk|Z Tuple[PackageSet, bool] + """Converts a list of distributions into a PackageSet. + """ + # Default to using all packages installed on the system + if kwargs == {}: + kwargs = {"local_only": False, "skip": ()} + + package_set = {} + problems = False + for dist in get_installed_distributions(**kwargs): + name = canonicalize_name(dist.project_name) + try: + package_set[name] = PackageDetails(dist.version, dist.requires()) + except (OSError, RequirementParseError) as e: + # Don't crash on unreadable or broken metadata + logger.warning("Error parsing requirements for %s: %s", name, e) + problems = True + return package_set, problems + + +def check_package_set(package_set, should_ignore=None): + # type: (PackageSet, Optional[Callable[[str], bool]]) -> CheckResult + """Check if a package set is consistent + + If should_ignore is passed, it should be a callable that takes a + package name and returns a boolean. + """ + + missing = {} + conflicting = {} + + for package_name in package_set: + # Info about dependencies of package_name + missing_deps = set() # type: Set[Missing] + conflicting_deps = set() # type: Set[Conflicting] + + if should_ignore and should_ignore(package_name): + continue + + for req in package_set[package_name].requires: + name = canonicalize_name(req.project_name) # type: str + + # Check if it's missing + if name not in package_set: + missed = True + if req.marker is not None: + missed = req.marker.evaluate() + if missed: + missing_deps.add((name, req)) + continue + + # Check if there's a conflict + version = package_set[name].version # type: str + if not req.specifier.contains(version, prereleases=True): + conflicting_deps.add((name, version, req)) + + if missing_deps: + missing[package_name] = sorted(missing_deps, key=str) + if conflicting_deps: + conflicting[package_name] = sorted(conflicting_deps, key=str) + + return missing, conflicting + + +def check_install_conflicts(to_install): + # type: (List[InstallRequirement]) -> ConflictDetails + """For checking if the dependency graph would be consistent after \ + installing given requirements + """ + # Start from the current state + package_set, _ = create_package_set_from_installed() + # Install packages + would_be_installed = _simulate_installation_of(to_install, package_set) + + # Only warn about directly-dependent packages; create a whitelist of them + whitelist = _create_whitelist(would_be_installed, package_set) + + return ( + package_set, + check_package_set( + package_set, should_ignore=lambda name: name not in whitelist + ) + ) + + +def _simulate_installation_of(to_install, package_set): + # type: (List[InstallRequirement], PackageSet) -> Set[str] + """Computes the version of packages after installing to_install. + """ + + # Keep track of packages that were installed + installed = set() + + # Modify it as installing requirement_set would (assuming no errors) + for inst_req in to_install: + abstract_dist = make_distribution_for_install_requirement(inst_req) + dist = abstract_dist.get_pkg_resources_distribution() + + assert dist is not None + name = canonicalize_name(dist.key) + package_set[name] = PackageDetails(dist.version, dist.requires()) + + installed.add(name) + + return installed + + +def _create_whitelist(would_be_installed, package_set): + # type: (Set[str], PackageSet) -> Set[str] + packages_affected = set(would_be_installed) + + for package_name in package_set: + if package_name in packages_affected: + continue + + for req in package_set[package_name].requires: + if canonicalize_name(req.name) in packages_affected: + packages_affected.add(package_name) + break + + return packages_affected diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/check.pyc b/venv/lib/python2.7/site-packages/pip/_internal/operations/check.pyc new file mode 100644 index 0000000000000000000000000000000000000000..116a16fee280c953ae1ab598f770b21131b5068d GIT binary patch literal 4563 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 MeYJV3zFJ@VF9zln`Tzg` literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/freeze.py b/venv/lib/python2.7/site-packages/pip/_internal/operations/freeze.py new file mode 100644 index 0000000..ddb9cb2 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/operations/freeze.py @@ -0,0 +1,272 @@ +from __future__ import absolute_import + +import collections +import logging +import os + +from pip._vendor import six +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.pkg_resources import RequirementParseError + +from pip._internal.exceptions import BadCommand, InstallationError +from pip._internal.req.constructors import ( + install_req_from_editable, + install_req_from_line, +) +from pip._internal.req.req_file import COMMENT_RE +from pip._internal.utils.direct_url_helpers import ( + direct_url_as_pep440_direct_reference, + dist_get_direct_url, +) +from pip._internal.utils.misc import ( + dist_is_editable, + get_installed_distributions, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Iterator, Optional, List, Container, Set, Dict, Tuple, Iterable, Union + ) + from pip._internal.cache import WheelCache + from pip._vendor.pkg_resources import ( + Distribution, Requirement + ) + + RequirementInfo = Tuple[Optional[Union[str, Requirement]], bool, List[str]] + + +logger = logging.getLogger(__name__) + + +def freeze( + requirement=None, # type: Optional[List[str]] + find_links=None, # type: Optional[List[str]] + local_only=False, # type: bool + user_only=False, # type: bool + paths=None, # type: Optional[List[str]] + isolated=False, # type: bool + wheel_cache=None, # type: Optional[WheelCache] + exclude_editable=False, # type: bool + skip=() # type: Container[str] +): + # type: (...) -> Iterator[str] + find_links = find_links or [] + + for link in find_links: + yield '-f {}'.format(link) + installations = {} # type: Dict[str, FrozenRequirement] + + for dist in get_installed_distributions( + local_only=local_only, + skip=(), + user_only=user_only, + paths=paths + ): + try: + req = FrozenRequirement.from_dist(dist) + except RequirementParseError as exc: + # We include dist rather than dist.project_name because the + # dist string includes more information, like the version and + # location. We also include the exception message to aid + # troubleshooting. + logger.warning( + 'Could not generate requirement for distribution %r: %s', + dist, exc + ) + continue + if exclude_editable and req.editable: + continue + installations[req.canonical_name] = req + + if requirement: + # the options that don't get turned into an InstallRequirement + # should only be emitted once, even if the same option is in multiple + # requirements files, so we need to keep track of what has been emitted + # so that we don't emit it again if it's seen again + emitted_options = set() # type: Set[str] + # keep track of which files a requirement is in so that we can + # give an accurate warning if a requirement appears multiple times. + req_files = collections.defaultdict(list) # type: Dict[str, List[str]] + for req_file_path in requirement: + with open(req_file_path) as req_file: + for line in req_file: + if (not line.strip() or + line.strip().startswith('#') or + line.startswith(( + '-r', '--requirement', + '-f', '--find-links', + '-i', '--index-url', + '--pre', + '--trusted-host', + '--process-dependency-links', + '--extra-index-url', + '--use-feature'))): + line = line.rstrip() + if line not in emitted_options: + emitted_options.add(line) + yield line + continue + + if line.startswith('-e') or line.startswith('--editable'): + if line.startswith('-e'): + line = line[2:].strip() + else: + line = line[len('--editable'):].strip().lstrip('=') + line_req = install_req_from_editable( + line, + isolated=isolated, + ) + else: + line_req = install_req_from_line( + COMMENT_RE.sub('', line).strip(), + isolated=isolated, + ) + + if not line_req.name: + logger.info( + "Skipping line in requirement file [%s] because " + "it's not clear what it would install: %s", + req_file_path, line.strip(), + ) + logger.info( + " (add #egg=PackageName to the URL to avoid" + " this warning)" + ) + else: + line_req_canonical_name = canonicalize_name( + line_req.name) + if line_req_canonical_name not in installations: + # either it's not installed, or it is installed + # but has been processed already + if not req_files[line_req.name]: + logger.warning( + "Requirement file [%s] contains %s, but " + "package %r is not installed", + req_file_path, + COMMENT_RE.sub('', line).strip(), + line_req.name + ) + else: + req_files[line_req.name].append(req_file_path) + else: + yield str(installations[ + line_req_canonical_name]).rstrip() + del installations[line_req_canonical_name] + req_files[line_req.name].append(req_file_path) + + # Warn about requirements that were included multiple times (in a + # single requirements file or in different requirements files). + for name, files in six.iteritems(req_files): + if len(files) > 1: + logger.warning("Requirement %s included multiple times [%s]", + name, ', '.join(sorted(set(files)))) + + yield( + '## The following requirements were added by ' + 'pip freeze:' + ) + for installation in sorted( + installations.values(), key=lambda x: x.name.lower()): + if installation.canonical_name not in skip: + yield str(installation).rstrip() + + +def get_requirement_info(dist): + # type: (Distribution) -> RequirementInfo + """ + Compute and return values (req, editable, comments) for use in + FrozenRequirement.from_dist(). + """ + if not dist_is_editable(dist): + return (None, False, []) + + location = os.path.normcase(os.path.abspath(dist.location)) + + from pip._internal.vcs import vcs, RemoteNotFoundError + vcs_backend = vcs.get_backend_for_dir(location) + + if vcs_backend is None: + req = dist.as_requirement() + logger.debug( + 'No VCS found for editable requirement "%s" in: %r', req, + location, + ) + comments = [ + '# Editable install with no version control ({})'.format(req) + ] + return (location, True, comments) + + try: + req = vcs_backend.get_src_requirement(location, dist.project_name) + except RemoteNotFoundError: + req = dist.as_requirement() + comments = [ + '# Editable {} install with no remote ({})'.format( + type(vcs_backend).__name__, req, + ) + ] + return (location, True, comments) + + except BadCommand: + logger.warning( + 'cannot determine version of editable source in %s ' + '(%s command not found in path)', + location, + vcs_backend.name, + ) + return (None, True, []) + + except InstallationError as exc: + logger.warning( + "Error when trying to get requirement for VCS system %s, " + "falling back to uneditable format", exc + ) + else: + if req is not None: + return (req, True, []) + + logger.warning( + 'Could not determine repository location of %s', location + ) + comments = ['## !! Could not determine repository location'] + + return (None, False, comments) + + +class FrozenRequirement(object): + def __init__(self, name, req, editable, comments=()): + # type: (str, Union[str, Requirement], bool, Iterable[str]) -> None + self.name = name + self.canonical_name = canonicalize_name(name) + self.req = req + self.editable = editable + self.comments = comments + + @classmethod + def from_dist(cls, dist): + # type: (Distribution) -> FrozenRequirement + # TODO `get_requirement_info` is taking care of editable requirements. + # TODO This should be refactored when we will add detection of + # editable that provide .dist-info metadata. + req, editable, comments = get_requirement_info(dist) + if req is None and not editable: + # if PEP 610 metadata is present, attempt to use it + direct_url = dist_get_direct_url(dist) + if direct_url: + req = direct_url_as_pep440_direct_reference( + direct_url, dist.project_name + ) + comments = [] + if req is None: + # name==version requirement + req = dist.as_requirement() + + return cls(dist.project_name, req, editable, comments=comments) + + def __str__(self): + # type: () -> str + req = self.req + if self.editable: + req = '-e {}'.format(req) + return '\n'.join(list(self.comments) + [str(req)]) + '\n' diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/freeze.pyc b/venv/lib/python2.7/site-packages/pip/_internal/operations/freeze.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0a769bed7e97e9e568a18eea1d4038e34e30539 GIT binary patch literal 7362 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 C0G4(D literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/install/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/operations/install/__init__.py new file mode 100644 index 0000000..24d6a5d --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/operations/install/__init__.py @@ -0,0 +1,2 @@ +"""For modules related to installing packages. +""" diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/install/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/operations/install/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6f99b015433064b4babd271ccffbde668cee702 GIT binary patch literal 226 zcmYL@JqiLb5QVc^C=1>pn7Bn;~q%63r$d84JCE2l6x?!wWdk1qa?Y zzdUCAo|Ui16IwPzL3u+;B|$NEA{Ojejq+?x*!swOudY@n9<`OI6-UpFODL^1uH!+r z7uo65l!q$Y;e-I7d<#%f$^J+?Y6bQ|1QY7Pqh9RK_hp|)Ux9I`qmx$nprb_NT@u5s W0NNS^Xu=JrWVZVKw$A?|iG2Y2pF0!) literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/install/editable_legacy.py b/venv/lib/python2.7/site-packages/pip/_internal/operations/install/editable_legacy.py new file mode 100644 index 0000000..a668a61 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/operations/install/editable_legacy.py @@ -0,0 +1,52 @@ +"""Legacy editable installation process, i.e. `setup.py develop`. +""" +import logging + +from pip._internal.utils.logging import indent_log +from pip._internal.utils.setuptools_build import make_setuptools_develop_args +from pip._internal.utils.subprocess import call_subprocess +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Optional, Sequence + + from pip._internal.build_env import BuildEnvironment + + +logger = logging.getLogger(__name__) + + +def install_editable( + install_options, # type: List[str] + global_options, # type: Sequence[str] + prefix, # type: Optional[str] + home, # type: Optional[str] + use_user_site, # type: bool + name, # type: str + setup_py_path, # type: str + isolated, # type: bool + build_env, # type: BuildEnvironment + unpacked_source_directory, # type: str +): + # type: (...) -> None + """Install a package in editable mode. Most arguments are pass-through + to setuptools. + """ + logger.info('Running setup.py develop for %s', name) + + args = make_setuptools_develop_args( + setup_py_path, + global_options=global_options, + install_options=install_options, + no_user_config=isolated, + prefix=prefix, + home=home, + use_user_site=use_user_site, + ) + + with indent_log(): + with build_env: + call_subprocess( + args, + cwd=unpacked_source_directory, + ) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/install/editable_legacy.pyc b/venv/lib/python2.7/site-packages/pip/_internal/operations/install/editable_legacy.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42395b18386c1d07a03b0f327b730eac5242901c GIT binary patch literal 1566 zcmcIj-EQ4P5FXp-KS^_FiV#qNg+MwN3I5)h{q_5wB8C3(>Hh%@`v;i} zASUZU=7aVirV0H5&^{Ca!~uA`9)KP|F@$*7t%smTP>dlSck2=82^3R^r{Kvc)W5kb zW6(1wwjkbuVjJRZD0U#;=}t^Q--2Qn;$84c0O`Tm9OPSYK{eclYzn_pVS8NFlf{gS z{esMq%#(Bz%1mK$tYxT5i;30=DpQ74ZBl9Nr=eQPW%$fWY^r6o2{U;vwW*#hXX+n% z)(ej^A?H+OCQB6B`HJMZ6z(hq9nzHh^pl?SLR2 z{W1d#-~!Ojdpzs-F6KJOt;(0$13E%zLS(^4V{6tqDcCd#@SS9K6BxfS7 zNhwT5_&+ihLjtYgFR(O|6m0E2p4O(xPiG-LXu@lxm(FEBr2J7+ma5FV%{M3vPfQ(t zVv%vkwK-0-Fb+zKOiHhYD<6lIMl@E|A~ofS%5g-ls+K3}m1E@86cTsHM=@QTRVWD= zV)$jYUJPmC&X7cMS-Uf;JTVbVD53!oH`9X2iKc9r-pDPtdB(ZjsWRzravv46w|EHBFsLk*QjyXzGp2=_E-}uwY{!lUZR=ttwUR z_gL(Ic6j#ly@FkC2vwr2NqQ?&$=daeUG=f6%eE5QwHX1AEXPY&FSqyjGHw-^&;7s~ zz41x41+5I3^=RW>O*CoM9wl@qO}BNz1EpmJKRxm;Js&7C*ir=vp$uq2_I=!$OgkbK4 rh*+W#CvbFKoBxG4zWF|NVx#5fEK$pRjJ$1s?zz_=d3XK2U^n;|4hf3N literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/install/legacy.py b/venv/lib/python2.7/site-packages/pip/_internal/operations/install/legacy.py new file mode 100644 index 0000000..87227d5 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/operations/install/legacy.py @@ -0,0 +1,130 @@ +"""Legacy installation process, i.e. `setup.py install`. +""" + +import logging +import os +import sys +from distutils.util import change_root + +from pip._internal.exceptions import InstallationError +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ensure_dir +from pip._internal.utils.setuptools_build import make_setuptools_install_args +from pip._internal.utils.subprocess import runner_with_spinner_message +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Optional, Sequence + + from pip._internal.build_env import BuildEnvironment + from pip._internal.models.scheme import Scheme + + +logger = logging.getLogger(__name__) + + +class LegacyInstallFailure(Exception): + def __init__(self): + # type: () -> None + self.parent = sys.exc_info() + + +def install( + install_options, # type: List[str] + global_options, # type: Sequence[str] + root, # type: Optional[str] + home, # type: Optional[str] + prefix, # type: Optional[str] + use_user_site, # type: bool + pycompile, # type: bool + scheme, # type: Scheme + setup_py_path, # type: str + isolated, # type: bool + req_name, # type: str + build_env, # type: BuildEnvironment + unpacked_source_directory, # type: str + req_description, # type: str +): + # type: (...) -> bool + + header_dir = scheme.headers + + with TempDirectory(kind="record") as temp_dir: + try: + record_filename = os.path.join(temp_dir.path, 'install-record.txt') + install_args = make_setuptools_install_args( + setup_py_path, + global_options=global_options, + install_options=install_options, + record_filename=record_filename, + root=root, + prefix=prefix, + header_dir=header_dir, + home=home, + use_user_site=use_user_site, + no_user_config=isolated, + pycompile=pycompile, + ) + + runner = runner_with_spinner_message( + "Running setup.py install for {}".format(req_name) + ) + with indent_log(), build_env: + runner( + cmd=install_args, + cwd=unpacked_source_directory, + ) + + if not os.path.exists(record_filename): + logger.debug('Record file %s not found', record_filename) + # Signal to the caller that we didn't install the new package + return False + + except Exception: + # Signal to the caller that we didn't install the new package + raise LegacyInstallFailure + + # At this point, we have successfully installed the requirement. + + # We intentionally do not use any encoding to read the file because + # setuptools writes the file using distutils.file_util.write_file, + # which does not specify an encoding. + with open(record_filename) as f: + record_lines = f.read().splitlines() + + def prepend_root(path): + # type: (str) -> str + if root is None or not os.path.isabs(path): + return path + else: + return change_root(root, path) + + for line in record_lines: + directory = os.path.dirname(line) + if directory.endswith('.egg-info'): + egg_info_dir = prepend_root(directory) + break + else: + message = ( + "{} did not indicate that it installed an " + ".egg-info directory. Only setup.py projects " + "generating .egg-info directories are supported." + ).format(req_description) + raise InstallationError(message) + + new_lines = [] + for line in record_lines: + filename = line.strip() + if os.path.isdir(filename): + filename += os.path.sep + new_lines.append( + os.path.relpath(prepend_root(filename), egg_info_dir) + ) + new_lines.sort() + ensure_dir(egg_info_dir) + inst_files_path = os.path.join(egg_info_dir, 'installed-files.txt') + with open(inst_files_path, 'w') as f: + f.write('\n'.join(new_lines) + '\n') + + return True diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/install/legacy.pyc b/venv/lib/python2.7/site-packages/pip/_internal/operations/install/legacy.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94a6a046b594215ae61b7c818c89e3cf7f634825 GIT binary patch literal 3907 zcmb_fOLH5?5$;`(APEwD0DO~@R*6;SAp%pWlzmC1QkEq}6@|8!PRT-*Yqi`Rf(z|S zI|Gx97njJD$4UPq_xz6hfShv7DTn-k5asNaxzgVH(5=BYnV4)e`X+N5lO`U{qx zr*x6BCF(C(x=Cq^vSsQoTY7=g70TMwZ(Dki(pAdVsJ~|EB}&&R+o1l2rCXGCDC<(c zOOEPN^>49anbJ+lwy3{F**5jJDchm`j@_|B=`Lk^)Zepoo6>#C4yb=XPEMp88Xl6m zK`-I!O^R1Z-J)}NvPRz#y(D_t_b6UxqJNuXa(cAEq525JV>Jk)YcI*Q3DYz*Ns)VH zRYXebpLj`6^}J_VnNis*XH3s}t>nM>oE#z4WR@{R7hyh7K~)sSF0%YbZ^*n~RYhfA zweTv*W0jjAEe5aGRIW#r3gTqKcL=^Le69k~Z;B$-!NklUtOnZdJOEcU%5zl(mx;Lu zbeRZ|!GUm~EK?gyU#hJ9G^tc%it5@fcd-21r=LF!?*01yz25}>?@mr0ojg2ZD4977 zj}vXoA|{`e9G5T^;#9pDsXUs9UdQWCMoAjq&%a5kBG2HLmEOdg)96BF%51VQ3G^f; z55gpcvorK^AV0yQIc^GRLh?xR<&u9Y@*?Kp$Hj9GkM3eHL_>#DToVO=HdG4tiS>eA z(brn+R#y??cU~AatPHD}q3o(w>G=_UNe2A@vtyH$$7NF9odo^v&mIkb|53(E@<5nT z6{2!nl&TWs=;I0RaVp*dG@?2HZ(@RgQ>xj1a;<$F+#txqOa*~qU<5%{#G@3X&)Iox z()+f{XG}17#Ga-Ttzv!y&psXr+c^xa7idT{UL}Ks;OipP&Z`|~yhhi5C*#tvLBlz! z*LV^)=%q{Jbu#l*FLEELu?2Iqq9)br6fe-9F<+#5j^ZV%S1E2$jg8Ax&r`fY^%BKx zs+%a})_8-EDb(_Cf$A2QHooHyA)rY2t2^Y>%k*j&KOHXgdV?#xUcpP(c>)}K@s%AX zMnc^>OVIx!1bVnk@rJCpFOS_1;SnLaxS6AdGS~033KhUSjQX?zryGtRfx?5^NENfp+d!qxlPjsb3l+v_qG-Rua#4VnYhv!2ABe;hh(i_wCp;z!PP${k@De zyYGv?9-Hai(OzB{aF6mhnzlXO#2run90QjTg0)D{hteEMA)?L@*OltWTydxH0$jX? z^A60@zBrHV;^9e=DgJ|-ls)W0*Eac_9vjR@6;_*JS@c`OI$ zGtioQG`Y8&IahOhdulL1A3iVicc8uIA4XSe(hc;KK)*oQ@u`*XY`nPCpVBnyqtxe=7AD;&gHrnoT-R3&MO z)!Aquvj<@csBxU`UqwplLE5{>$KjOAqyoSN>AFl4lP0;+VjDsug|UeJ$bsf-gwOVi zY;CHfoWO!>gJGzlgY67UPMQd*R4VvkM>HbjGoNg`thjD?{mW{kj`)c21@JpOV?_C~ z#%Gbw0rNc!B469v16QGxQczw8qJ>RObb;%disgW<)C)O9B?xDH9SKzajoAa=C@;h4 zxrzf_jH*cPR~8A zNND{Jc^|vYq}VmXpfCf`avhP5!x)*|*n~A#mx0X?+cN82(;g??OiL_|@P1OK9Lx84 zb77+J!5r&IeZ+1!R;reGwLtAh&-rnZ0GNwAD`hFnD_;qTinkp8uqegk{U0Cf)i3O& g`InqC%^7LBD}dDsz_;$a@dvmaVx`+yYiu|F2WcRc*Z=?k literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/install/wheel.py b/venv/lib/python2.7/site-packages/pip/_internal/operations/install/wheel.py new file mode 100644 index 0000000..e91b1b8 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/operations/install/wheel.py @@ -0,0 +1,861 @@ +"""Support for installing and building the "wheel" binary package format. +""" + +from __future__ import absolute_import + +import collections +import compileall +import contextlib +import csv +import importlib +import logging +import os.path +import re +import shutil +import sys +import warnings +from base64 import urlsafe_b64encode +from itertools import chain, starmap +from zipfile import ZipFile + +from pip._vendor import pkg_resources +from pip._vendor.distlib.scripts import ScriptMaker +from pip._vendor.distlib.util import get_export_entry +from pip._vendor.six import ( + PY2, + ensure_str, + ensure_text, + itervalues, + reraise, + text_type, +) +from pip._vendor.six.moves import filterfalse, map + +from pip._internal.exceptions import InstallationError +from pip._internal.locations import get_major_minor_version +from pip._internal.models.direct_url import DIRECT_URL_METADATA_NAME, DirectUrl +from pip._internal.models.scheme import SCHEME_KEYS +from pip._internal.utils.filesystem import adjacent_tmp_file, replace +from pip._internal.utils.misc import ( + captured_stdout, + ensure_dir, + hash_file, + partition, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.unpacking import ( + current_umask, + is_within_directory, + set_extracted_file_to_default_mode_plus_executable, + zip_item_is_executable, +) +from pip._internal.utils.wheel import ( + parse_wheel, + pkg_resources_distribution_for_wheel, +) + +# Use the custom cast function at runtime to make cast work, +# and import typing.cast when performing pre-commit and type +# checks +if not MYPY_CHECK_RUNNING: + from pip._internal.utils.typing import cast +else: + from email.message import Message + from typing import ( + Any, + Callable, + Dict, + IO, + Iterable, + Iterator, + List, + NewType, + Optional, + Protocol, + Sequence, + Set, + Tuple, + Union, + cast, + ) + from zipfile import ZipInfo + + from pip._vendor.pkg_resources import Distribution + + from pip._internal.models.scheme import Scheme + from pip._internal.utils.filesystem import NamedTemporaryFileResult + + RecordPath = NewType('RecordPath', text_type) + InstalledCSVRow = Tuple[RecordPath, str, Union[int, str]] + + class File(Protocol): + src_record_path = None # type: RecordPath + dest_path = None # type: text_type + changed = None # type: bool + + def save(self): + # type: () -> None + pass + + +logger = logging.getLogger(__name__) + + +def rehash(path, blocksize=1 << 20): + # type: (text_type, int) -> Tuple[str, str] + """Return (encoded_digest, length) for path using hashlib.sha256()""" + h, length = hash_file(path, blocksize) + digest = 'sha256=' + urlsafe_b64encode( + h.digest() + ).decode('latin1').rstrip('=') + # unicode/str python2 issues + return (digest, str(length)) # type: ignore + + +def csv_io_kwargs(mode): + # type: (str) -> Dict[str, Any] + """Return keyword arguments to properly open a CSV file + in the given mode. + """ + if PY2: + return {'mode': '{}b'.format(mode)} + else: + return {'mode': mode, 'newline': '', 'encoding': 'utf-8'} + + +def fix_script(path): + # type: (text_type) -> bool + """Replace #!python with #!/path/to/python + Return True if file was changed. + """ + # XXX RECORD hashes will need to be updated + assert os.path.isfile(path) + + with open(path, 'rb') as script: + firstline = script.readline() + if not firstline.startswith(b'#!python'): + return False + exename = sys.executable.encode(sys.getfilesystemencoding()) + firstline = b'#!' + exename + os.linesep.encode("ascii") + rest = script.read() + with open(path, 'wb') as script: + script.write(firstline) + script.write(rest) + return True + + +def wheel_root_is_purelib(metadata): + # type: (Message) -> bool + return metadata.get("Root-Is-Purelib", "").lower() == "true" + + +def get_entrypoints(distribution): + # type: (Distribution) -> Tuple[Dict[str, str], Dict[str, str]] + # get the entry points and then the script names + try: + console = distribution.get_entry_map('console_scripts') + gui = distribution.get_entry_map('gui_scripts') + except KeyError: + # Our dict-based Distribution raises KeyError if entry_points.txt + # doesn't exist. + return {}, {} + + def _split_ep(s): + # type: (pkg_resources.EntryPoint) -> Tuple[str, str] + """get the string representation of EntryPoint, + remove space and split on '=' + """ + split_parts = str(s).replace(" ", "").split("=") + return split_parts[0], split_parts[1] + + # convert the EntryPoint objects into strings with module:function + console = dict(_split_ep(v) for v in console.values()) + gui = dict(_split_ep(v) for v in gui.values()) + return console, gui + + +def message_about_scripts_not_on_PATH(scripts): + # type: (Sequence[str]) -> Optional[str] + """Determine if any scripts are not on PATH and format a warning. + Returns a warning message if one or more scripts are not on PATH, + otherwise None. + """ + if not scripts: + return None + + # Group scripts by the path they were installed in + grouped_by_dir = collections.defaultdict(set) # type: Dict[str, Set[str]] + for destfile in scripts: + parent_dir = os.path.dirname(destfile) + script_name = os.path.basename(destfile) + grouped_by_dir[parent_dir].add(script_name) + + # We don't want to warn for directories that are on PATH. + not_warn_dirs = [ + os.path.normcase(i).rstrip(os.sep) for i in + os.environ.get("PATH", "").split(os.pathsep) + ] + # If an executable sits with sys.executable, we don't warn for it. + # This covers the case of venv invocations without activating the venv. + not_warn_dirs.append(os.path.normcase(os.path.dirname(sys.executable))) + warn_for = { + parent_dir: scripts for parent_dir, scripts in grouped_by_dir.items() + if os.path.normcase(parent_dir) not in not_warn_dirs + } # type: Dict[str, Set[str]] + if not warn_for: + return None + + # Format a message + msg_lines = [] + for parent_dir, dir_scripts in warn_for.items(): + sorted_scripts = sorted(dir_scripts) # type: List[str] + if len(sorted_scripts) == 1: + start_text = "script {} is".format(sorted_scripts[0]) + else: + start_text = "scripts {} are".format( + ", ".join(sorted_scripts[:-1]) + " and " + sorted_scripts[-1] + ) + + msg_lines.append( + "The {} installed in '{}' which is not on PATH." + .format(start_text, parent_dir) + ) + + last_line_fmt = ( + "Consider adding {} to PATH or, if you prefer " + "to suppress this warning, use --no-warn-script-location." + ) + if len(msg_lines) == 1: + msg_lines.append(last_line_fmt.format("this directory")) + else: + msg_lines.append(last_line_fmt.format("these directories")) + + # Add a note if any directory starts with ~ + warn_for_tilde = any( + i[0] == "~" for i in os.environ.get("PATH", "").split(os.pathsep) if i + ) + if warn_for_tilde: + tilde_warning_msg = ( + "NOTE: The current PATH contains path(s) starting with `~`, " + "which may not be expanded by all applications." + ) + msg_lines.append(tilde_warning_msg) + + # Returns the formatted multiline message + return "\n".join(msg_lines) + + +def _normalized_outrows(outrows): + # type: (Iterable[InstalledCSVRow]) -> List[Tuple[str, str, str]] + """Normalize the given rows of a RECORD file. + + Items in each row are converted into str. Rows are then sorted to make + the value more predictable for tests. + + Each row is a 3-tuple (path, hash, size) and corresponds to a record of + a RECORD file (see PEP 376 and PEP 427 for details). For the rows + passed to this function, the size can be an integer as an int or string, + or the empty string. + """ + # Normally, there should only be one row per path, in which case the + # second and third elements don't come into play when sorting. + # However, in cases in the wild where a path might happen to occur twice, + # we don't want the sort operation to trigger an error (but still want + # determinism). Since the third element can be an int or string, we + # coerce each element to a string to avoid a TypeError in this case. + # For additional background, see-- + # https://github.com/pypa/pip/issues/5868 + return sorted( + (ensure_str(record_path, encoding='utf-8'), hash_, str(size)) + for record_path, hash_, size in outrows + ) + + +def _record_to_fs_path(record_path): + # type: (RecordPath) -> text_type + return record_path + + +def _fs_to_record_path(path, relative_to=None): + # type: (text_type, Optional[text_type]) -> RecordPath + if relative_to is not None: + # On Windows, do not handle relative paths if they belong to different + # logical disks + if os.path.splitdrive(path)[0].lower() == \ + os.path.splitdrive(relative_to)[0].lower(): + path = os.path.relpath(path, relative_to) + path = path.replace(os.path.sep, '/') + return cast('RecordPath', path) + + +def _parse_record_path(record_column): + # type: (str) -> RecordPath + p = ensure_text(record_column, encoding='utf-8') + return cast('RecordPath', p) + + +def get_csv_rows_for_installed( + old_csv_rows, # type: List[List[str]] + installed, # type: Dict[RecordPath, RecordPath] + changed, # type: Set[RecordPath] + generated, # type: List[str] + lib_dir, # type: str +): + # type: (...) -> List[InstalledCSVRow] + """ + :param installed: A map from archive RECORD path to installation RECORD + path. + """ + installed_rows = [] # type: List[InstalledCSVRow] + for row in old_csv_rows: + if len(row) > 3: + logger.warning('RECORD line has more than three elements: %s', row) + old_record_path = _parse_record_path(row[0]) + new_record_path = installed.pop(old_record_path, old_record_path) + if new_record_path in changed: + digest, length = rehash(_record_to_fs_path(new_record_path)) + else: + digest = row[1] if len(row) > 1 else '' + length = row[2] if len(row) > 2 else '' + installed_rows.append((new_record_path, digest, length)) + for f in generated: + path = _fs_to_record_path(f, lib_dir) + digest, length = rehash(f) + installed_rows.append((path, digest, length)) + for installed_record_path in itervalues(installed): + installed_rows.append((installed_record_path, '', '')) + return installed_rows + + +def get_console_script_specs(console): + # type: (Dict[str, str]) -> List[str] + """ + Given the mapping from entrypoint name to callable, return the relevant + console script specs. + """ + # Don't mutate caller's version + console = console.copy() + + scripts_to_generate = [] + + # Special case pip and setuptools to generate versioned wrappers + # + # The issue is that some projects (specifically, pip and setuptools) use + # code in setup.py to create "versioned" entry points - pip2.7 on Python + # 2.7, pip3.3 on Python 3.3, etc. But these entry points are baked into + # the wheel metadata at build time, and so if the wheel is installed with + # a *different* version of Python the entry points will be wrong. The + # correct fix for this is to enhance the metadata to be able to describe + # such versioned entry points, but that won't happen till Metadata 2.0 is + # available. + # In the meantime, projects using versioned entry points will either have + # incorrect versioned entry points, or they will not be able to distribute + # "universal" wheels (i.e., they will need a wheel per Python version). + # + # Because setuptools and pip are bundled with _ensurepip and virtualenv, + # we need to use universal wheels. So, as a stopgap until Metadata 2.0, we + # override the versioned entry points in the wheel and generate the + # correct ones. This code is purely a short-term measure until Metadata 2.0 + # is available. + # + # To add the level of hack in this section of code, in order to support + # ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment + # variable which will control which version scripts get installed. + # + # ENSUREPIP_OPTIONS=altinstall + # - Only pipX.Y and easy_install-X.Y will be generated and installed + # ENSUREPIP_OPTIONS=install + # - pipX.Y, pipX, easy_install-X.Y will be generated and installed. Note + # that this option is technically if ENSUREPIP_OPTIONS is set and is + # not altinstall + # DEFAULT + # - The default behavior is to install pip, pipX, pipX.Y, easy_install + # and easy_install-X.Y. + pip_script = console.pop('pip', None) + if pip_script: + if "ENSUREPIP_OPTIONS" not in os.environ: + scripts_to_generate.append('pip = ' + pip_script) + + if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall": + scripts_to_generate.append( + 'pip{} = {}'.format(sys.version_info[0], pip_script) + ) + + scripts_to_generate.append( + 'pip{} = {}'.format(get_major_minor_version(), pip_script) + ) + # Delete any other versioned pip entry points + pip_ep = [k for k in console if re.match(r'pip(\d(\.\d)?)?$', k)] + for k in pip_ep: + del console[k] + easy_install_script = console.pop('easy_install', None) + if easy_install_script: + if "ENSUREPIP_OPTIONS" not in os.environ: + scripts_to_generate.append( + 'easy_install = ' + easy_install_script + ) + + scripts_to_generate.append( + 'easy_install-{} = {}'.format( + get_major_minor_version(), easy_install_script + ) + ) + # Delete any other versioned easy_install entry points + easy_install_ep = [ + k for k in console if re.match(r'easy_install(-\d\.\d)?$', k) + ] + for k in easy_install_ep: + del console[k] + + # Generate the console entry points specified in the wheel + scripts_to_generate.extend(starmap('{} = {}'.format, console.items())) + + return scripts_to_generate + + +class ZipBackedFile(object): + def __init__(self, src_record_path, dest_path, zip_file): + # type: (RecordPath, text_type, ZipFile) -> None + self.src_record_path = src_record_path + self.dest_path = dest_path + self._zip_file = zip_file + self.changed = False + + def _getinfo(self): + # type: () -> ZipInfo + if not PY2: + return self._zip_file.getinfo(self.src_record_path) + # Python 2 does not expose a way to detect a ZIP's encoding, but the + # wheel specification (PEP 427) explicitly mandates that paths should + # use UTF-8, so we assume it is true. + return self._zip_file.getinfo(self.src_record_path.encode("utf-8")) + + def save(self): + # type: () -> None + # directory creation is lazy and after file filtering + # to ensure we don't install empty dirs; empty dirs can't be + # uninstalled. + parent_dir = os.path.dirname(self.dest_path) + ensure_dir(parent_dir) + + # When we open the output file below, any existing file is truncated + # before we start writing the new contents. This is fine in most + # cases, but can cause a segfault if pip has loaded a shared + # object (e.g. from pyopenssl through its vendored urllib3) + # Since the shared object is mmap'd an attempt to call a + # symbol in it will then cause a segfault. Unlinking the file + # allows writing of new contents while allowing the process to + # continue to use the old copy. + if os.path.exists(self.dest_path): + os.unlink(self.dest_path) + + zipinfo = self._getinfo() + + with self._zip_file.open(zipinfo) as f: + with open(self.dest_path, "wb") as dest: + shutil.copyfileobj(f, dest) + + if zip_item_is_executable(zipinfo): + set_extracted_file_to_default_mode_plus_executable(self.dest_path) + + +class ScriptFile(object): + def __init__(self, file): + # type: (File) -> None + self._file = file + self.src_record_path = self._file.src_record_path + self.dest_path = self._file.dest_path + self.changed = False + + def save(self): + # type: () -> None + self._file.save() + self.changed = fix_script(self.dest_path) + + +class MissingCallableSuffix(InstallationError): + def __init__(self, entry_point): + # type: (str) -> None + super(MissingCallableSuffix, self).__init__( + "Invalid script entry point: {} - A callable " + "suffix is required. Cf https://packaging.python.org/" + "specifications/entry-points/#use-for-scripts for more " + "information.".format(entry_point) + ) + + +def _raise_for_invalid_entrypoint(specification): + # type: (str) -> None + entry = get_export_entry(specification) + if entry is not None and entry.suffix is None: + raise MissingCallableSuffix(str(entry)) + + +class PipScriptMaker(ScriptMaker): + def make(self, specification, options=None): + # type: (str, Dict[str, Any]) -> List[str] + _raise_for_invalid_entrypoint(specification) + return super(PipScriptMaker, self).make(specification, options) + + +def _install_wheel( + name, # type: str + wheel_zip, # type: ZipFile + wheel_path, # type: str + scheme, # type: Scheme + pycompile=True, # type: bool + warn_script_location=True, # type: bool + direct_url=None, # type: Optional[DirectUrl] + requested=False, # type: bool +): + # type: (...) -> None + """Install a wheel. + + :param name: Name of the project to install + :param wheel_zip: open ZipFile for wheel being installed + :param scheme: Distutils scheme dictating the install directories + :param req_description: String used in place of the requirement, for + logging + :param pycompile: Whether to byte-compile installed Python files + :param warn_script_location: Whether to check that scripts are installed + into a directory on PATH + :raises UnsupportedWheel: + * when the directory holds an unpacked wheel with incompatible + Wheel-Version + * when the .dist-info dir does not match the wheel + """ + info_dir, metadata = parse_wheel(wheel_zip, name) + + if wheel_root_is_purelib(metadata): + lib_dir = scheme.purelib + else: + lib_dir = scheme.platlib + + # Record details of the files moved + # installed = files copied from the wheel to the destination + # changed = files changed while installing (scripts #! line typically) + # generated = files newly generated during the install (script wrappers) + installed = {} # type: Dict[RecordPath, RecordPath] + changed = set() # type: Set[RecordPath] + generated = [] # type: List[str] + + def record_installed(srcfile, destfile, modified=False): + # type: (RecordPath, text_type, bool) -> None + """Map archive RECORD paths to installation RECORD paths.""" + newpath = _fs_to_record_path(destfile, lib_dir) + installed[srcfile] = newpath + if modified: + changed.add(_fs_to_record_path(destfile)) + + def all_paths(): + # type: () -> Iterable[RecordPath] + names = wheel_zip.namelist() + # If a flag is set, names may be unicode in Python 2. We convert to + # text explicitly so these are valid for lookup in RECORD. + decoded_names = map(ensure_text, names) + for name in decoded_names: + yield cast("RecordPath", name) + + def is_dir_path(path): + # type: (RecordPath) -> bool + return path.endswith("/") + + def assert_no_path_traversal(dest_dir_path, target_path): + # type: (text_type, text_type) -> None + if not is_within_directory(dest_dir_path, target_path): + message = ( + "The wheel {!r} has a file {!r} trying to install" + " outside the target directory {!r}" + ) + raise InstallationError( + message.format(wheel_path, target_path, dest_dir_path) + ) + + def root_scheme_file_maker(zip_file, dest): + # type: (ZipFile, text_type) -> Callable[[RecordPath], File] + def make_root_scheme_file(record_path): + # type: (RecordPath) -> File + normed_path = os.path.normpath(record_path) + dest_path = os.path.join(dest, normed_path) + assert_no_path_traversal(dest, dest_path) + return ZipBackedFile(record_path, dest_path, zip_file) + + return make_root_scheme_file + + def data_scheme_file_maker(zip_file, scheme): + # type: (ZipFile, Scheme) -> Callable[[RecordPath], File] + scheme_paths = {} + for key in SCHEME_KEYS: + encoded_key = ensure_text(key) + scheme_paths[encoded_key] = ensure_text( + getattr(scheme, key), encoding=sys.getfilesystemencoding() + ) + + def make_data_scheme_file(record_path): + # type: (RecordPath) -> File + normed_path = os.path.normpath(record_path) + try: + _, scheme_key, dest_subpath = normed_path.split(os.path.sep, 2) + except ValueError: + message = ( + "Unexpected file in {}: {!r}. .data directory contents" + " should be named like: '/'." + ).format(wheel_path, record_path) + raise InstallationError(message) + + try: + scheme_path = scheme_paths[scheme_key] + except KeyError: + valid_scheme_keys = ", ".join(sorted(scheme_paths)) + message = ( + "Unknown scheme key used in {}: {} (for file {!r}). .data" + " directory contents should be in subdirectories named" + " with a valid scheme key ({})" + ).format( + wheel_path, scheme_key, record_path, valid_scheme_keys + ) + raise InstallationError(message) + + dest_path = os.path.join(scheme_path, dest_subpath) + assert_no_path_traversal(scheme_path, dest_path) + return ZipBackedFile(record_path, dest_path, zip_file) + + return make_data_scheme_file + + def is_data_scheme_path(path): + # type: (RecordPath) -> bool + return path.split("/", 1)[0].endswith(".data") + + paths = all_paths() + file_paths = filterfalse(is_dir_path, paths) + root_scheme_paths, data_scheme_paths = partition( + is_data_scheme_path, file_paths + ) + + make_root_scheme_file = root_scheme_file_maker( + wheel_zip, + ensure_text(lib_dir, encoding=sys.getfilesystemencoding()), + ) + files = map(make_root_scheme_file, root_scheme_paths) + + def is_script_scheme_path(path): + # type: (RecordPath) -> bool + parts = path.split("/", 2) + return ( + len(parts) > 2 and + parts[0].endswith(".data") and + parts[1] == "scripts" + ) + + other_scheme_paths, script_scheme_paths = partition( + is_script_scheme_path, data_scheme_paths + ) + + make_data_scheme_file = data_scheme_file_maker(wheel_zip, scheme) + other_scheme_files = map(make_data_scheme_file, other_scheme_paths) + files = chain(files, other_scheme_files) + + # Get the defined entry points + distribution = pkg_resources_distribution_for_wheel( + wheel_zip, name, wheel_path + ) + console, gui = get_entrypoints(distribution) + + def is_entrypoint_wrapper(file): + # type: (File) -> bool + # EP, EP.exe and EP-script.py are scripts generated for + # entry point EP by setuptools + path = file.dest_path + name = os.path.basename(path) + if name.lower().endswith('.exe'): + matchname = name[:-4] + elif name.lower().endswith('-script.py'): + matchname = name[:-10] + elif name.lower().endswith(".pya"): + matchname = name[:-4] + else: + matchname = name + # Ignore setuptools-generated scripts + return (matchname in console or matchname in gui) + + script_scheme_files = map(make_data_scheme_file, script_scheme_paths) + script_scheme_files = filterfalse( + is_entrypoint_wrapper, script_scheme_files + ) + script_scheme_files = map(ScriptFile, script_scheme_files) + files = chain(files, script_scheme_files) + + for file in files: + file.save() + record_installed(file.src_record_path, file.dest_path, file.changed) + + def pyc_source_file_paths(): + # type: () -> Iterator[text_type] + # We de-duplicate installation paths, since there can be overlap (e.g. + # file in .data maps to same location as file in wheel root). + # Sorting installation paths makes it easier to reproduce and debug + # issues related to permissions on existing files. + for installed_path in sorted(set(installed.values())): + full_installed_path = os.path.join(lib_dir, installed_path) + if not os.path.isfile(full_installed_path): + continue + if not full_installed_path.endswith('.py'): + continue + yield full_installed_path + + def pyc_output_path(path): + # type: (text_type) -> text_type + """Return the path the pyc file would have been written to. + """ + if PY2: + if sys.flags.optimize: + return path + 'o' + else: + return path + 'c' + else: + return importlib.util.cache_from_source(path) + + # Compile all of the pyc files for the installed files + if pycompile: + with captured_stdout() as stdout: + with warnings.catch_warnings(): + warnings.filterwarnings('ignore') + for path in pyc_source_file_paths(): + # Python 2's `compileall.compile_file` requires a str in + # error cases, so we must convert to the native type. + path_arg = ensure_str( + path, encoding=sys.getfilesystemencoding() + ) + success = compileall.compile_file( + path_arg, force=True, quiet=True + ) + if success: + pyc_path = pyc_output_path(path) + assert os.path.exists(pyc_path) + pyc_record_path = cast( + "RecordPath", pyc_path.replace(os.path.sep, "/") + ) + record_installed(pyc_record_path, pyc_path) + logger.debug(stdout.getvalue()) + + maker = PipScriptMaker(None, scheme.scripts) + + # Ensure old scripts are overwritten. + # See https://github.com/pypa/pip/issues/1800 + maker.clobber = True + + # Ensure we don't generate any variants for scripts because this is almost + # never what somebody wants. + # See https://bitbucket.org/pypa/distlib/issue/35/ + maker.variants = {''} + + # This is required because otherwise distlib creates scripts that are not + # executable. + # See https://bitbucket.org/pypa/distlib/issue/32/ + maker.set_mode = True + + # Generate the console and GUI entry points specified in the wheel + scripts_to_generate = get_console_script_specs(console) + + gui_scripts_to_generate = list(starmap('{} = {}'.format, gui.items())) + + generated_console_scripts = maker.make_multiple(scripts_to_generate) + generated.extend(generated_console_scripts) + + generated.extend( + maker.make_multiple(gui_scripts_to_generate, {'gui': True}) + ) + + if warn_script_location: + msg = message_about_scripts_not_on_PATH(generated_console_scripts) + if msg is not None: + logger.warning(msg) + + generated_file_mode = 0o666 & ~current_umask() + + @contextlib.contextmanager + def _generate_file(path, **kwargs): + # type: (str, **Any) -> Iterator[NamedTemporaryFileResult] + with adjacent_tmp_file(path, **kwargs) as f: + yield f + os.chmod(f.name, generated_file_mode) + replace(f.name, path) + + dest_info_dir = os.path.join(lib_dir, info_dir) + + # Record pip as the installer + installer_path = os.path.join(dest_info_dir, 'INSTALLER') + with _generate_file(installer_path) as installer_file: + installer_file.write(b'pip\n') + generated.append(installer_path) + + # Record the PEP 610 direct URL reference + if direct_url is not None: + direct_url_path = os.path.join(dest_info_dir, DIRECT_URL_METADATA_NAME) + with _generate_file(direct_url_path) as direct_url_file: + direct_url_file.write(direct_url.to_json().encode("utf-8")) + generated.append(direct_url_path) + + # Record the REQUESTED file + if requested: + requested_path = os.path.join(dest_info_dir, 'REQUESTED') + with open(requested_path, "w"): + pass + generated.append(requested_path) + + record_text = distribution.get_metadata('RECORD') + record_rows = list(csv.reader(record_text.splitlines())) + + rows = get_csv_rows_for_installed( + record_rows, + installed=installed, + changed=changed, + generated=generated, + lib_dir=lib_dir) + + # Record details of all files installed + record_path = os.path.join(dest_info_dir, 'RECORD') + + with _generate_file(record_path, **csv_io_kwargs('w')) as record_file: + # The type mypy infers for record_file is different for Python 3 + # (typing.IO[Any]) and Python 2 (typing.BinaryIO). We explicitly + # cast to typing.IO[str] as a workaround. + writer = csv.writer(cast('IO[str]', record_file)) + writer.writerows(_normalized_outrows(rows)) + + +@contextlib.contextmanager +def req_error_context(req_description): + # type: (str) -> Iterator[None] + try: + yield + except InstallationError as e: + message = "For req: {}. {}".format(req_description, e.args[0]) + reraise( + InstallationError, InstallationError(message), sys.exc_info()[2] + ) + + +def install_wheel( + name, # type: str + wheel_path, # type: str + scheme, # type: Scheme + req_description, # type: str + pycompile=True, # type: bool + warn_script_location=True, # type: bool + direct_url=None, # type: Optional[DirectUrl] + requested=False, # type: bool +): + # type: (...) -> None + with ZipFile(wheel_path, allowZip64=True) as z: + with req_error_context(req_description): + _install_wheel( + name=name, + wheel_zip=z, + wheel_path=wheel_path, + scheme=scheme, + pycompile=pycompile, + warn_script_location=warn_script_location, + direct_url=direct_url, + requested=requested, + ) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/install/wheel.pyc b/venv/lib/python2.7/site-packages/pip/_internal/operations/install/wheel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0d7c36171efb5606885589a4129ca4f73d68192 GIT binary patch literal 25919 zcmcJ1du&`+df#_vNQ$H=QKFvI!@7D|BU>bGNtV5`WK$MtuWX5uFD1*Km3DSGb4d<4 zFU`G_#5K8%*KRCtuyN9)K>o;LH*FFWL3i7vy8(jyQDD>l(InlV#Wqc{DT<^(TcCLq z*hdqfK>GXr&YcHkEm{``d?s%rggakFT=%dBXY zMe12GWo6GQDa)qJ<8#`|Y0IYd4*4$2b~W?emhEoldo0`2%x|#lhGxFkvc1iGpJn@- z`Hhy{*vt=DcA%NxWZ6y4{ASB;R=&&1gI3vM*)48P-B#Xel_ARxS!J7Lx4F_DD{r^T z4$JOv&l{|~(<-|xyURWIT6woshAlhnp8Kr4$0~a*yVpJUTX~;V_FHzpRi3cy6IMB3 z*#lPbE$dt5pk)tQ<&b3$x!N18eAp^SEPKQ%M=g8Ql@3_>Nvj;Q>@oMe$;uh49JlOo z_q^H4Pg&(@%RX(D6P7*UN(ZexVwF+Lj=JY9Rvxp;GnReED$iQ>Sy#H%$|tRI%Ce`d za@w+|t@4~@pR>vt%bsyHhOGR&RbH^{3+{QFl|N;bvz9$;l@~4hqE*gW_MBDDTlT!G zvE9lqS>asi_J(`jBj~+l*|*&DUP14s zWp83Nm#w(Z!bA2xF#2r^-?R|vI~E2OW|^5y+3;-IhO?is;(iOKY!)LvVIP>iZ}v|1 zmW92xaNEMq+WVemb5=ZHMc-a39<&ee{5dNgV%==siiee%vEmVB3RXO-Owo!@Did1q zm@>0g%qTNw;k*@(tE-X~pHkt16`xjS(TXRODO+*G!iuIg$`VbjYQ?c;=`*d;niZe5 z@R;hJY?aoncuHN}vEpe9hxPio*6W6ak$&bajIDUaJ^-07S=en0cdhum>S49_)>eB# z)$Wr;OlLj?ZW6tQWO}JyuQg(Sw$|`V)hN!F%cbg^pRX4EnWa*>$cK17^bg&e55w{y zf2LH;H`@&gB|mR9k8k!pIeG zMDcW?QL4vR@{3`^6>dS{To~uV`ac#@&2*DU39`M%c)gqA>1bH>i_~m+Q$g*m|~9M*Z1*8C5t)Yav|zB?sbs zT&h(k8;x2r&0ToKX;$(JwMMQ|sv^A`HX_t=@Y#(D6PJR?i`R2Eg3Gxplh-dyT)2KA zH+A94q$V;^YJ`ROMx)#TjEkS1yfT@4WAdG8*9j+(FD~Q@07EXW)N`0>m@KJYMscPK zHMD_+d_4w8ihxP6w&cK&fTdV!XvFz^H1B#KAnN%>T;i(S_(LeV^3Jt)a+t%#H*&#^ zsi{j-uetuYe}$z+gR@wwqMK8oEFvGYn8MIeR@F<)DLp}HLR;^88wNi$-biBchs ziR_oI>g6S1iC(g%9cZx)vwk$nS5Cf*BZ6BR;am$>F~}HXvtyQ zbQp`6t}oRA36j-~D%u5ykZaEv^mM5@TXO{ics0?nU{^{anJ&zSm4xbufm8WPSiByR zrojYAkwF+?8$=~RSg19M*Yfea7Qwd#w9!8@hF8Y1nTL@HLC@gY;80RioPt8t#K^gz zmjn)93vAW=y~x%C4r)znhEo|lC2Qh~C@jyqB9=#!NXCHVWA##fB;jl$Coe60{!E2M z`ptpggbe_7tX9Wn5Wvw`Qg=+aFC#o!fGZtvClZIhc=$Q93Hh=?M}(mSwSgWk4Oi!553 z#9hTEHTD>`5_GkIjnS51Kh8{-(tKhTyHf1JACOuPUKBTAJBSF;H6+P)EQZVXfTn)F zF}G9!hmQQX=GPmfkMgpQKUF{PUz~o+CnxUr@vl^sf-qOQi+AM5qbiO#y?0k<1WguW zhL|RIts35gk`YD(_EJ1M@`4CScz~Ur5|a)%F#*D<7$W)L4HP~Wh)X6#cXOp$Zt))0 z9z_@_B3fB@kGI_co%7}VMH#)uR;nws*pD0r25 z0>2ay&En0-UWlR)Dn_C<39E>WLY+pKFA}4~gQ+~m5ht%vUTrC2(Q>2;ZFN9nIQ|pw zz!*@$I36oP?omAjJ_==puVG!oax`^)uK^81MFfO+M|cJl8cnjy0V^25bb2z_{2+FsEc! zQ`}NF8Sn^9beMm-VP|ujIb=kY0ox}&Pk9M(+z9Kizd(P|n*7?VKS|r_S`8}I3GoQZ zhDKPa-3|Q+=3*$DGOCwLu@B~Q?EJA-ElE~icoST}Pyizm3hoT&A51c#QZM{b7Y?mh z#jRb1(5687j|GwXFjCG964w7Qho#DC-3J}%G(ml89B=mG1>k&pE3xK*b{*h-%ew=9 z{*dx2;$SlRjDT?0i8%@%Eo1#SLc|rEn+vP3gc~pYQ#=U$du$D={Qt~909skF#3^$> zg2z7jueT@PHYjO50~;I5u%YV`3U7qVvarR9iZs56%g&A$Ud1$gIxRhM`hue@$Fi16 z4x3sFTfYqv8MkI#C*4H9z?IQ-wse}hp0_EzG1b?1$UEfFjB>EWrA`8GfM(DRi$l;L zK-DQST1UzEFY?{Q?H8$V00K}xpmR7?0D47IvY}Z5eFY2-ezk?(riyUKx0`byIkc5# z(q!@FG771Y~e#f|EtU#5-I zuVT~b zSmS7_xW!hn39d_x;#Gm-fH0P%2~B6V5y!rQWFmy^3s;jgxO{clPh<&H|In}2#HFuY zxc+JJZKs6$d1!f!D)_(C@SGYLwTu0VbA?bTgzf9YsaUC@yC2iF6BIT07aRBBQS)gp zC%PlqD@T`9D3Jar3Rt>r91Eby12I81JECpJE&|bkW1<6KGe85BTijp`;XO)z4yf1z zk%p#;V7ZQ*)7W~EgVU{2$VZ_QI^=3n7a>%@Sm>1!e@K=hUKi7B0H|_=3TrswvwloM zrr$X-uR^U-f9ZEIoCHsw^?4GI5qX%KlK<|iUy1+}6p&FgVUA*~K-~U>U-~=zli}sW z@hB=@hkKW8oog~I(xN-|?&>lB-h8Prk3KuGVKfTS4feY^gOc z%B;U!TY}jb&Y}+9MDQ|W4lpL?(OrT=Ct%r!{>VtRHo}q-H{lW3+tMjUwF)(8c?6@a z7#!$=cFnR<7zsU^A~+hy(vPAVabs^{1~p(uftJmN!N$M@oG_+-L#z_aB!9nNg;TT zub7)_)RyY-BhM_0pgCLm;b`>*Kfy}$4Ld}XUoZH8g{&qL2OE?{SBd6wG6@}YN{y!C ztwG$pT1B+Qv`;ymD3E8A;XhUfx!FprHqGvHF%Dfq2t^FboLCDsIENuKC`^>BFCw>o zY$iU4?h@9W%g?~!-<*7o+zmc(lJ>82%vX?DPmkA?9)#sc`*BBC+Pl=1N$pFsw8tBU zeL3XqO!at&@YLgN?dnMndBdrl&}l|fJ*l4bmb56g$iIKj z&HU+;&ua=mnS7}n9Ut}mS0QvcVZuh;)bnti6ghyH>FiQflzl?AI2pf?ulisVNCA{^ zj(i=n*Aqp!Gx-u>?K;O9Kn#sRwxE;P+EP*lF}nq&Oahv!Ckn-ivDNQ; z9#m5B*u+1aeuyy#Q|yZ!%1xMf2K(?Vn^4-nW78ztP6s>N=zvNLfs1s+gW`3ho3%WA z6Oh#LaL-vnKZC)Xos^XSBj(O++4Wyb7NHLd;^*3BCtsdK+1|_zrj+7^=<9=a_ zK5?KDd<`!i%S>tAG><}XjyDUB3`k?B2|7#Z41$u73|x~W3w9{8*k_F#@dc(1+$5O! z`#>cRW((Y!;2*6QQvcd7sP?zo;WR@1!K1Zmb|+_5!2sq_(jLJu@^|4aI6s^t9H-^- zYAXw4!5PdfBXm56T!%yy%crZO*nnF+fEUe)J2=R=Tsbp>FSE@dcERO3J=Ebbk23D^ zob&N*0RRv1caY33ZUMDPOAVxly#wA}cnF0toE;HGn{faclCW5{eApgH8;~QM0QMG~ z9->_bD=n13X|G#4bTSX99ZQueI>UMF<6F8r`t4ZyVJ@93G&n~KWF1r$_*YAQ8?R|^ zcH8|w}{YZjBR9KjsXE- zZsR9qi#^tOkNOQ18)vzq<6EfEC+l>gV>DQ?80{#KhBz7w;@#O~H}6l91y9^QFY6T*Hp&fv@dtE#ha-uO=_LKY>Ri*$ ze?>n}8T2FK0eu7eWR1E(5haFWr|#CEr@fo#COLk{0n`#zXR$Z=3ZxM9C1{|}L%MW-?sva6k=hm!bq-cB!vK(^h5Ip36i> z@-DIC4m4L8&fYr9bcPvR;xMGTS;vLwHt*=SeQ^C)h;k1`qa&;d0|i{PhCfc?Jc24V z&?Aj=o3{n}<$$+0MZee{lnvr}54>f29KRxjTEzQxGzZNtfQ5sE9U(hkz6iGnmkY2Q zBnuJomt_3dI8Z4423JI_z*^97%IN(`C>rnG0UkU`Xbr4hOk3lpn$_Wv+Ca$xzZrZ= z!)S|2No&%-j$c`&pL1%z29FVUd4lKbFf4H72X7QrBh2j^%+Q(k4a2GW{oSO`iQAi4 z6^-!j{GC6>nS@&`mWHw2(je}-t??yq&C)VD4#Y&n6q-v*CWnz*lY>9c&HYi60|RiA zd&5g6_l5_?$jS9QJh{7`CWqy3q9q0&7+DcE23|smR{{tVm{t@`w1_nHw_s2&!ewv$gdYDF9X z?XJnG=^Mf1wM*A>SFc^abaiT4DimTy{PXURLT({M;v_gKCkE8ogCK{_^pckBHjCe6)dV1DM8O~{nu9eQ`2a^=CkvvkXB!4mJ%@)Bh_OAj7k~Gsd%T_Lr@@3ag9$M}qsQBf zvL0_s_tPnqrVpf~;UMDb6~s)2#aH2KD6lX7BhP(h9K9b#CUkL8E(!{4MW!%gq*Anr z5hjJWD1yAet>rJJ(ZzAJCR+yWfSe#n!BCiyQN@f{8Z!vXX{-8VkimH-FCmeP$uVY5 zo)E;An`Do(uwGbOw-=Ais*gn=aDW_euoUNVzeL!xz*2o4{}%`|{t^^g{d34b8HAL<|DeZ4@}ujv#q_YflFK zCtSPCH#k$ab!p|?H>wX>`EMbEm3J->YoE#d{H)e_VGyxBiTWEbTS$Qt1)VE&9NfyR3i820AdE(Jqz?Hk`RkieSJ zgos4nsbCtZbJB@Dy^6=+0Tbe7K(Z8@2=608(YgJWs?gmQgMY{O+^67Xvr;sVh|RKm za%6qP<=V_bK$|6a0*TvTq4Q6$4L2B=tPK_{NmcX*K8~$bXy31MOSfYb>)zq@_wPVF z*Fb8Ax5L|)8t~lo&f;b8B9lL0qGi&R(w>uY>*xIoejmMmt%++rUf+hkKJn{m@$pA9 zEGlh3j$t+9H@U&hU*YR%6twviun9koZ8?<;kB)i$c%CH}u;WrK?iIB86^9GB!SeeM z0oq_&M~HD}{(uncMTVSd5dTG=C~Wg(a&_XpmI>POAWmC!fXpLU@*ks#FeQM-l@I}~ zfXB;rG~yp}L8JhK;BuV*AzXaCX!u7M`8&-y5DgWRb)^(B{<9fMJ-sxGxTXSU$$td* zE900qm6eC^5opNQg(eE7@o#}P(rW=U|T>sFf}@qWVn)Twi#6Pk5Kzk74F|s zv8g#q`}C!Lp5@Wmh<~A_e&Vc)Gvu*Z1A*CyWiO8U7iazXIIc%$#}G}&n-f?OLyHk+ zH(G1VjZw`g%{C8Z#?=3aiwPJzj8n1^96TiFW0Cy5I#ng#;`Ivz#f`d12ucT>wS|q~ zd&oHkauqq}VG>ibje`{|M%xMp18P42Gb;tH~ ziKazo1l}v-m_KD#LT3Wm2MXhFa(u$K`FoMo52Ju^7GZgyIL84=bRsur{Wks2U8o)W z8IwO{^5<;KG9JV@1d{Cj&nzdzYq}HhSX}DCe?k9$O#pEMmg@JW9%hN>P_An2-CJ)w zCItS9lOX(o$G!MN8lqK{9!L4Fg5m++2k;Y!mEDq0kx?&TZi;$oj8H!Vi~Fd@s?gz( zPcske?;}O-ypN102PeXhyX`~IK1A9>PaU}8Pl7x)+K0WyAjTAfa^Mn#N8|%!Hra<8 zRIcF0k8DjO`l6Y;_6`g0Ln2=vG&nOrAra6AshBr5r4bK>PCouOwt9%cNr-de<2Rv@;9(cNF%)|D zziKN!-%Q;8d0Rbfh(cO9{4m5x|rgXR1lvxWV(@Pw^A$&%T!!lEFQJuc3T*;2k`Mdqki4nr`T`-dvjdtdYTUOg_E}Ov<6NdT#cs~yGpq1 zurpi@CPo+Bchm8yr2gs&TRFjbQsAH*D>=;)R=xAxH08@qi=X50gX14T{+zLe=k3F^ zh;0|Q7&TWhTL;@0NEkdd0Nh5~g)3N#L+deH0T&o!tB<$a>NB?Tj4gc1ia=0|=)lP( zoJ}fuJhO1K`&L(L5cC(ns6hY*^!Kd#J8Y`}!%6msRtx7i>4o!F+{3q@=w5APZ^FU) zqcwdO9nGDx_$6C8#e2Y5&&S;l&F_@@1cX3@3or8$FveItt-Tw!g$uTF+7@0(5Q49s zv-qN|JjYwY58&`TU=P5^d~P2u1p{vHdtIw%)&dQE0+P>bkL6*CvEkQ{x` zn|aosqE8cX4Rm4R^34KbaXOAV;-Br?qfQ~9#qk@{G6pRfqa zBX7Cu!L9O+?nfEaj609BHBQzq)#t1@y zqLwDrK*Kl(eXa4FJ&-}$((8!mwMEja`7Q(X z()oXd6m$ZwH^lld0uE;s=@C8I0u|y67(-Uz1o+G4O^*XqoGg$HpaK+tT+NmLD$3n- zx&JtU&@C^O=-g8CUhm1%UdFv45R&FU#_4mWNu&zN20C~^xI`6L7=^1w%#F$$r-#(&!7>z5+#^pD7 zk2{zY+c>hIJs1#sb?Dk5u59i^VD^s^~%mlLIWM_iDM2`L~(dp$A~JZoWK=b z^+P<9W{|_(f1XR_%clr?ZoQ=j5k{Ey3IrN=fWKm1!^lt{N9r{#7?2y>ZVXHjjD>G( zKpIk`31qNsEjKz)jy`l(;#i-y6Ww6{9yBS_qgw#`iBeE1zp6njP8I%bGVKKR7POPnWn(Na4$2p33+Eov;{ zfmW{B{g=6$6Stpl(<1j6inU|H%^d}?y5s-%sbPEAY)HOy43J51DlN3a8IrSvvHxAz zb|TZ1;+=$BWOuDe{0I-9#I0pmO7b`+uh63~>=sN+NnD(*+^mk_f+1oHaKUh%7Ys2d z!VZ9IWFM#n>mAmzZrqTMc=q-(3}vhZ(MC9izgc}9?R(Y!chnw65gY^ktb^qf0tj_e zECV}*n8$iy=5{@*>tv#EAi&hnVGm-L2%x6r;n4`kGfKhQNDYL+ltN~r8Dwwp>KPPS z=r|PQP^aKJh5HozY1AL(70?c@#Xxtch)_u9YfEK>uH#AygjLZmmlmN89y^yPs<^KH z(%3nY%}d8d#g`FZ`z4LGSgqYdG_O-=QIEF`q>pOURX+pmv&~i!Is5-G2h2HInrW(U zxO$MxO6ppkF~V{ZONZu=nRi!@XBbr1jtvZm5ek4;0H6+9-r~n)bXm=v$BRkdV?FVU zpJ7f+gQyjJjmiH)0_=r{Pdy~GfidC0pr{8+$4tdfzR#)@V@V|zD$v3C1KUj_ow+$T z7in5ubu@~CAE5N{@*?5^)OAA8o$`>z4`EnCY+l+s>TN;@`GB`2mBxwtCT~Zor)wy+ z1xIM$Qbf35I}^$%NiN93d>l926@t&A)KwxEbDmm_r0@^I&N;{Vafo6L&w&RBJI*Fn z%;mdBDl7uTIy1V5m+u(eB?4hH1~(i8Z$j)-+Iup+d%w61aexd+niEAlh|pVj_?pT z1R`A?al%i4`B~I+&|wQF;|ajWclnrt8gNRC*bahx4>L#1;$q7)7<`*s zKq9xU9*DEv)W(#=acK^Qkc&2ic7{)yk+I?s9oG%dASXsWrBLk7h)0od={F$>wTBcF zZ1>_g2AMzx<--2(J!Afpx$>m__iGF0)IX3B@QE!cHN6ZoxXnKWt zc%lNb7+vddl7ehUD{@~G3VsXE0a7lbrL*7OR z3*pG6sp;z%E?=Gu#9tAN+24+bQ-xsi%^Q=`*C!{0fA_Q~7een`Y;v~!3$C6-tZlh; z^)t8`c02QFmikP}NTiP?pI>o#Tyx>~V#Haptj0+PdzcV6+De;qZjmm7gG}H)v*3@I zkVM;IjEY$dcA-qfki_Fh;zOQ18zr8f63ern5046LdVvb z0FE@#$s?Tm8rGR;IecwYt$6AHlL*dY0+^n0I=q5Kb}iif@67!blmE%&Z<+L9%wPit zcIq8&Dywf=uTGN4it6-DkheuDeORfD0{TnT6Wd2YA3G+1_4$LQ$>Tbp!2G1P7s(v? zWE96BkM7(F#WJEYQCfX!-S#n80exlh%!Xeyq4)$|?E!SjoyVj@{ z&Kvts5!b01wzt1M>y9$jBeQAYg{wyMFIkwbYIi*Aat_Ilnc!>4$XHBjv%}zd%sPV? z$(6t#BIg*A)XaSZJj77P$%I2~BKbP1JzQ2((Q=yETLO?hKz8*f@x?!4xcvt*kMSLJ1-S`@Q|C zq0N1pD8M)2{}$AOIj-LU+#O7NPo#X@10U+@>mKOtOAn-;KuehK-W~+VV;+co-HbWx zNbkTH{MO9?w6Q_l>Dhw!J8;VfLG);`7p8vlsY$S$ASMwK* zwS*QdYgycIlYaar?=dp4OXlIn_!=5086XC>1B~zp!d7Gh1fc`;(30Wql;^UDuq8wq zz^Ta4^WH=wy9s!|>3~iNG9{)9VO+b1!|gMtA0--sPm#LLGI^27IV8@HMUo99v~eTC z0(^KjA?1ojW}~I zSF9CUpPZdt;-{K(xqvN$zt7|tSMv;$(@eG@QN!erUHMuxN{;T7nQybzcbU+r2#&A; zv3VvRg#bAoo%qGaHyUxRR*r%c>yZT28BPtw0|{<1Mre|w_=I(}SZf574~U0>;Aj`> zj2c?VsFQP1z|nO2^QcO+T>>d0l0O~YM5X)A7$TNBwUJ!gksKkcAmYwG(PETerHh=p z$qw7&^7{w;ATV4J1>8#F2Z2S<5^CzDRihb95V?y|2hh*j3RK(55f%y|fiGP*%F?F- zisv>oTHPhJop(oG%$Qde)^@2NjZs3{eWNmvDMFNa#1dTPN+~KxCDvUE_f1@?*fEnw z^^UKZ<9spTekp|XQFUCj0;^H64Cr>$1q)rZkdS{=E1en!J}Vz&LX}x!KCIy56{E>1 zV{n+oLI*dKBdmLr$&*ZuF(E+)$C*6E8-9by>rANfx@i6~ zb246}ng22$e}&08Ccnny>r8%|$?qW%7;uFJ2o(H23uW|tkGVf%^5;xum}HfJPJ?He zh}q2`*XCTxt)rsRixJNOYw@{j9>iJn07(yg@f7W!{J+K9330v!VttD@+PhOZl%Vub z&lddd?A-u`V2fAWiduXN(Z4^nvwtwXWn AbstractDistribution + """Prepare a distribution for installation. + """ + abstract_dist = make_distribution_for_install_requirement(req) + with req_tracker.track(req): + abstract_dist.prepare_distribution_metadata(finder, build_isolation) + return abstract_dist + + +def unpack_vcs_link(link, location): + # type: (Link, str) -> None + vcs_backend = vcs.get_backend_for_scheme(link.scheme) + assert vcs_backend is not None + vcs_backend.unpack(location, url=hide_url(link.url)) + + +class File(object): + def __init__(self, path, content_type): + # type: (str, str) -> None + self.path = path + self.content_type = content_type + + +def get_http_url( + link, # type: Link + downloader, # type: Downloader + download_dir=None, # type: Optional[str] + hashes=None, # type: Optional[Hashes] +): + # type: (...) -> File + temp_dir = TempDirectory(kind="unpack", globally_managed=True) + # If a download dir is specified, is the file already downloaded there? + already_downloaded_path = None + if download_dir: + already_downloaded_path = _check_download_dir( + link, download_dir, hashes + ) + + if already_downloaded_path: + from_path = already_downloaded_path + content_type = mimetypes.guess_type(from_path)[0] + else: + # let's download to a tmp dir + from_path, content_type = _download_http_url( + link, downloader, temp_dir.path, hashes + ) + + return File(from_path, content_type) + + +def _copy2_ignoring_special_files(src, dest): + # type: (str, str) -> None + """Copying special files is not supported, but as a convenience to users + we skip errors copying them. This supports tools that may create e.g. + socket files in the project source directory. + """ + try: + copy2_fixed(src, dest) + except shutil.SpecialFileError as e: + # SpecialFileError may be raised due to either the source or + # destination. If the destination was the cause then we would actually + # care, but since the destination directory is deleted prior to + # copy we ignore all of them assuming it is caused by the source. + logger.warning( + "Ignoring special file error '%s' encountered copying %s to %s.", + str(e), + path_to_display(src), + path_to_display(dest), + ) + + +def _copy_source_tree(source, target): + # type: (str, str) -> None + target_abspath = os.path.abspath(target) + target_basename = os.path.basename(target_abspath) + target_dirname = os.path.dirname(target_abspath) + + def ignore(d, names): + # type: (str, List[str]) -> List[str] + skipped = [] # type: List[str] + if d == source: + # Pulling in those directories can potentially be very slow, + # exclude the following directories if they appear in the top + # level dir (and only it). + # See discussion at https://github.com/pypa/pip/pull/6770 + skipped += ['.tox', '.nox'] + if os.path.abspath(d) == target_dirname: + # Prevent an infinite recursion if the target is in source. + # This can happen when TMPDIR is set to ${PWD}/... + # and we copy PWD to TMPDIR. + skipped += [target_basename] + return skipped + + kwargs = dict(ignore=ignore, symlinks=True) # type: CopytreeKwargs + + if not PY2: + # Python 2 does not support copy_function, so we only ignore + # errors on special file copy in Python 3. + kwargs['copy_function'] = _copy2_ignoring_special_files + + shutil.copytree(source, target, **kwargs) + + +def get_file_url( + link, # type: Link + download_dir=None, # type: Optional[str] + hashes=None # type: Optional[Hashes] +): + # type: (...) -> File + """Get file and optionally check its hash. + """ + # If a download dir is specified, is the file already there and valid? + already_downloaded_path = None + if download_dir: + already_downloaded_path = _check_download_dir( + link, download_dir, hashes + ) + + if already_downloaded_path: + from_path = already_downloaded_path + else: + from_path = link.file_path + + # If --require-hashes is off, `hashes` is either empty, the + # link's embedded hash, or MissingHashes; it is required to + # match. If --require-hashes is on, we are satisfied by any + # hash in `hashes` matching: a URL-based or an option-based + # one; no internet-sourced hash will be in `hashes`. + if hashes: + hashes.check_against_path(from_path) + + content_type = mimetypes.guess_type(from_path)[0] + + return File(from_path, content_type) + + +def unpack_url( + link, # type: Link + location, # type: str + downloader, # type: Downloader + download_dir=None, # type: Optional[str] + hashes=None, # type: Optional[Hashes] +): + # type: (...) -> Optional[File] + """Unpack link into location, downloading if required. + + :param hashes: A Hashes object, one of whose embedded hashes must match, + or HashMismatch will be raised. If the Hashes is empty, no matches are + required, and unhashable types of requirements (like VCS ones, which + would ordinarily raise HashUnsupported) are allowed. + """ + # non-editable vcs urls + if link.is_vcs: + unpack_vcs_link(link, location) + return None + + # If it's a url to a local directory + if link.is_existing_dir(): + if os.path.isdir(location): + rmtree(location) + _copy_source_tree(link.file_path, location) + return None + + # file urls + if link.is_file: + file = get_file_url(link, download_dir, hashes=hashes) + + # http urls + else: + file = get_http_url( + link, + downloader, + download_dir, + hashes=hashes, + ) + + # unpack the archive to the build dir location. even when only downloading + # archives, they have to be unpacked to parse dependencies, except wheels + if not link.is_wheel: + unpack_file(file.path, location, file.content_type) + + return file + + +def _download_http_url( + link, # type: Link + downloader, # type: Downloader + temp_dir, # type: str + hashes, # type: Optional[Hashes] +): + # type: (...) -> Tuple[str, str] + """Download link url into temp_dir using provided session""" + download = downloader(link) + + file_path = os.path.join(temp_dir, download.filename) + with open(file_path, 'wb') as content_file: + for chunk in download.chunks: + content_file.write(chunk) + + if hashes: + hashes.check_against_path(file_path) + + return file_path, download.response.headers.get('content-type', '') + + +def _check_download_dir(link, download_dir, hashes): + # type: (Link, str, Optional[Hashes]) -> Optional[str] + """ Check download_dir for previously downloaded file with correct hash + If a correct file is found return its path else None + """ + download_path = os.path.join(download_dir, link.filename) + + if not os.path.exists(download_path): + return None + + # If already downloaded, does its hash match? + logger.info('File was already downloaded %s', download_path) + if hashes: + try: + hashes.check_against_path(download_path) + except HashMismatch: + logger.warning( + 'Previously-downloaded file %s has bad hash. ' + 'Re-downloading.', + download_path + ) + os.unlink(download_path) + return None + return download_path + + +class RequirementPreparer(object): + """Prepares a Requirement + """ + + def __init__( + self, + build_dir, # type: str + download_dir, # type: Optional[str] + src_dir, # type: str + wheel_download_dir, # type: Optional[str] + build_isolation, # type: bool + req_tracker, # type: RequirementTracker + downloader, # type: Downloader + finder, # type: PackageFinder + require_hashes, # type: bool + use_user_site, # type: bool + ): + # type: (...) -> None + super(RequirementPreparer, self).__init__() + + self.src_dir = src_dir + self.build_dir = build_dir + self.req_tracker = req_tracker + self.downloader = downloader + self.finder = finder + + # Where still-packed archives should be written to. If None, they are + # not saved, and are deleted immediately after unpacking. + self.download_dir = download_dir + + # Where still-packed .whl files should be written to. If None, they are + # written to the download_dir parameter. Separate to download_dir to + # permit only keeping wheel archives for pip wheel. + self.wheel_download_dir = wheel_download_dir + + # NOTE + # download_dir and wheel_download_dir overlap semantically and may + # be combined if we're willing to have non-wheel archives present in + # the wheelhouse output by 'pip wheel'. + + # Is build isolation allowed? + self.build_isolation = build_isolation + + # Should hash-checking be required? + self.require_hashes = require_hashes + + # Should install in user site-packages? + self.use_user_site = use_user_site + + @property + def _download_should_save(self): + # type: () -> bool + if not self.download_dir: + return False + + if os.path.exists(self.download_dir): + return True + + logger.critical('Could not find download directory') + raise InstallationError( + "Could not find or access download directory '{}'" + .format(self.download_dir)) + + def _log_preparing_link(self, req): + # type: (InstallRequirement) -> None + """Log the way the link prepared.""" + if req.link.is_file: + path = req.link.file_path + logger.info('Processing %s', display_path(path)) + else: + logger.info('Collecting %s', req.req or req) + + def _ensure_link_req_src_dir(self, req, download_dir, parallel_builds): + # type: (InstallRequirement, Optional[str], bool) -> None + """Ensure source_dir of a linked InstallRequirement.""" + # Since source_dir is only set for editable requirements. + if req.link.is_wheel: + # We don't need to unpack wheels, so no need for a source + # directory. + return + assert req.source_dir is None + # We always delete unpacked sdists after pip runs. + req.ensure_has_source_dir( + self.build_dir, + autodelete=True, + parallel_builds=parallel_builds, + ) + + # If a checkout exists, it's unwise to keep going. version + # inconsistencies are logged later, but do not fail the + # installation. + # FIXME: this won't upgrade when there's an existing + # package unpacked in `req.source_dir` + if os.path.exists(os.path.join(req.source_dir, 'setup.py')): + raise PreviousBuildDirError( + "pip can't proceed with requirements '{}' due to a" + "pre-existing build directory ({}). This is likely " + "due to a previous installation that failed . pip is " + "being responsible and not assuming it can delete this. " + "Please delete it and try again.".format(req, req.source_dir) + ) + + def _get_linked_req_hashes(self, req): + # type: (InstallRequirement) -> Hashes + # By the time this is called, the requirement's link should have + # been checked so we can tell what kind of requirements req is + # and raise some more informative errors than otherwise. + # (For example, we can raise VcsHashUnsupported for a VCS URL + # rather than HashMissing.) + if not self.require_hashes: + return req.hashes(trust_internet=True) + + # We could check these first 2 conditions inside unpack_url + # and save repetition of conditions, but then we would + # report less-useful error messages for unhashable + # requirements, complaining that there's no hash provided. + if req.link.is_vcs: + raise VcsHashUnsupported() + if req.link.is_existing_dir(): + raise DirectoryUrlHashUnsupported() + + # Unpinned packages are asking for trouble when a new version + # is uploaded. This isn't a security check, but it saves users + # a surprising hash mismatch in the future. + # file:/// URLs aren't pinnable, so don't complain about them + # not being pinned. + if req.original_link is None and not req.is_pinned: + raise HashUnpinned() + + # If known-good hashes are missing for this requirement, + # shim it with a facade object that will provoke hash + # computation and then raise a HashMissing exception + # showing the user what the hash should be. + return req.hashes(trust_internet=False) or MissingHashes() + + def prepare_linked_requirement(self, req, parallel_builds=False): + # type: (InstallRequirement, bool) -> AbstractDistribution + """Prepare a requirement to be obtained from req.link.""" + assert req.link + link = req.link + self._log_preparing_link(req) + if link.is_wheel and self.wheel_download_dir: + # Download wheels to a dedicated dir when doing `pip wheel`. + download_dir = self.wheel_download_dir + else: + download_dir = self.download_dir + + with indent_log(): + self._ensure_link_req_src_dir(req, download_dir, parallel_builds) + try: + local_file = unpack_url( + link, req.source_dir, self.downloader, download_dir, + hashes=self._get_linked_req_hashes(req) + ) + except NetworkConnectionError as exc: + raise InstallationError( + 'Could not install requirement {} because of HTTP ' + 'error {} for URL {}'.format(req, exc, link) + ) + + # For use in later processing, preserve the file path on the + # requirement. + if local_file: + req.local_file_path = local_file.path + + abstract_dist = _get_prepared_distribution( + req, self.req_tracker, self.finder, self.build_isolation, + ) + + if download_dir: + if link.is_existing_dir(): + logger.info('Link is a directory, ignoring download_dir') + elif local_file: + download_location = os.path.join( + download_dir, link.filename + ) + if not os.path.exists(download_location): + shutil.copy(local_file.path, download_location) + download_path = display_path(download_location) + logger.info('Saved %s', download_path) + + if self._download_should_save: + # Make a .zip of the source_dir we already created. + if link.is_vcs: + req.archive(self.download_dir) + return abstract_dist + + def prepare_editable_requirement( + self, + req, # type: InstallRequirement + ): + # type: (...) -> AbstractDistribution + """Prepare an editable requirement + """ + assert req.editable, "cannot prepare a non-editable req as editable" + + logger.info('Obtaining %s', req) + + with indent_log(): + if self.require_hashes: + raise InstallationError( + 'The editable requirement {} cannot be installed when ' + 'requiring hashes, because there is no single file to ' + 'hash.'.format(req) + ) + req.ensure_has_source_dir(self.src_dir) + req.update_editable(not self._download_should_save) + + abstract_dist = _get_prepared_distribution( + req, self.req_tracker, self.finder, self.build_isolation, + ) + + if self._download_should_save: + req.archive(self.download_dir) + req.check_if_exists(self.use_user_site) + + return abstract_dist + + def prepare_installed_requirement( + self, + req, # type: InstallRequirement + skip_reason # type: str + ): + # type: (...) -> AbstractDistribution + """Prepare an already-installed requirement + """ + assert req.satisfied_by, "req should have been satisfied but isn't" + assert skip_reason is not None, ( + "did not get skip reason skipped but req.satisfied_by " + "is set to {}".format(req.satisfied_by) + ) + logger.info( + 'Requirement %s: %s (%s)', + skip_reason, req, req.satisfied_by.version + ) + with indent_log(): + if self.require_hashes: + logger.debug( + 'Since it is already installed, we are trusting this ' + 'package without checking its hash. To ensure a ' + 'completely repeatable environment, install into an ' + 'empty virtualenv.' + ) + abstract_dist = InstalledDistribution(req) + + return abstract_dist diff --git a/venv/lib/python2.7/site-packages/pip/_internal/operations/prepare.pyc b/venv/lib/python2.7/site-packages/pip/_internal/operations/prepare.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a491d437709da6ecd1b1c6a01fec87997389cb46 GIT binary patch literal 13915 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 bool + return ( + isinstance(obj, list) and + all(isinstance(item, six.string_types) for item in obj) + ) + + +def make_pyproject_path(unpacked_source_directory): + # type: (str) -> str + path = os.path.join(unpacked_source_directory, 'pyproject.toml') + + # Python2 __file__ should not be unicode + if six.PY2 and isinstance(path, six.text_type): + path = path.encode(sys.getfilesystemencoding()) + + return path + + +BuildSystemDetails = namedtuple('BuildSystemDetails', [ + 'requires', 'backend', 'check', 'backend_path' +]) + + +def load_pyproject_toml( + use_pep517, # type: Optional[bool] + pyproject_toml, # type: str + setup_py, # type: str + req_name # type: str +): + # type: (...) -> Optional[BuildSystemDetails] + """Load the pyproject.toml file. + + Parameters: + use_pep517 - Has the user requested PEP 517 processing? None + means the user hasn't explicitly specified. + pyproject_toml - Location of the project's pyproject.toml file + setup_py - Location of the project's setup.py file + req_name - The name of the requirement we're processing (for + error reporting) + + Returns: + None if we should use the legacy code path, otherwise a tuple + ( + requirements from pyproject.toml, + name of PEP 517 backend, + requirements we should check are installed after setting + up the build environment + directory paths to import the backend from (backend-path), + relative to the project root. + ) + """ + has_pyproject = os.path.isfile(pyproject_toml) + has_setup = os.path.isfile(setup_py) + + if has_pyproject: + with io.open(pyproject_toml, encoding="utf-8") as f: + pp_toml = toml.load(f) + build_system = pp_toml.get("build-system") + else: + build_system = None + + # The following cases must use PEP 517 + # We check for use_pep517 being non-None and falsey because that means + # the user explicitly requested --no-use-pep517. The value 0 as + # opposed to False can occur when the value is provided via an + # environment variable or config file option (due to the quirk of + # strtobool() returning an integer in pip's configuration code). + if has_pyproject and not has_setup: + if use_pep517 is not None and not use_pep517: + raise InstallationError( + "Disabling PEP 517 processing is invalid: " + "project does not have a setup.py" + ) + use_pep517 = True + elif build_system and "build-backend" in build_system: + if use_pep517 is not None and not use_pep517: + raise InstallationError( + "Disabling PEP 517 processing is invalid: " + "project specifies a build backend of {} " + "in pyproject.toml".format( + build_system["build-backend"] + ) + ) + use_pep517 = True + + # If we haven't worked out whether to use PEP 517 yet, + # and the user hasn't explicitly stated a preference, + # we do so if the project has a pyproject.toml file. + elif use_pep517 is None: + use_pep517 = has_pyproject + + # At this point, we know whether we're going to use PEP 517. + assert use_pep517 is not None + + # If we're using the legacy code path, there is nothing further + # for us to do here. + if not use_pep517: + return None + + if build_system is None: + # Either the user has a pyproject.toml with no build-system + # section, or the user has no pyproject.toml, but has opted in + # explicitly via --use-pep517. + # In the absence of any explicit backend specification, we + # assume the setuptools backend that most closely emulates the + # traditional direct setup.py execution, and require wheel and + # a version of setuptools that supports that backend. + + build_system = { + "requires": ["setuptools>=40.8.0", "wheel"], + "build-backend": "setuptools.build_meta:__legacy__", + } + + # If we're using PEP 517, we have build system information (either + # from pyproject.toml, or defaulted by the code above). + # Note that at this point, we do not know if the user has actually + # specified a backend, though. + assert build_system is not None + + # Ensure that the build-system section in pyproject.toml conforms + # to PEP 518. + error_template = ( + "{package} has a pyproject.toml file that does not comply " + "with PEP 518: {reason}" + ) + + # Specifying the build-system table but not the requires key is invalid + if "requires" not in build_system: + raise InstallationError( + error_template.format(package=req_name, reason=( + "it has a 'build-system' table but not " + "'build-system.requires' which is mandatory in the table" + )) + ) + + # Error out if requires is not a list of strings + requires = build_system["requires"] + if not _is_list_of_str(requires): + raise InstallationError(error_template.format( + package=req_name, + reason="'build-system.requires' is not a list of strings.", + )) + + # Each requirement must be valid as per PEP 508 + for requirement in requires: + try: + Requirement(requirement) + except InvalidRequirement: + raise InstallationError( + error_template.format( + package=req_name, + reason=( + "'build-system.requires' contains an invalid " + "requirement: {!r}".format(requirement) + ), + ) + ) + + backend = build_system.get("build-backend") + backend_path = build_system.get("backend-path", []) + check = [] # type: List[str] + if backend is None: + # If the user didn't specify a backend, we assume they want to use + # the setuptools backend. But we can't be sure they have included + # a version of setuptools which supplies the backend, or wheel + # (which is needed by the backend) in their requirements. So we + # make a note to check that those requirements are present once + # we have set up the environment. + # This is quite a lot of work to check for a very specific case. But + # the problem is, that case is potentially quite common - projects that + # adopted PEP 518 early for the ability to specify requirements to + # execute setup.py, but never considered needing to mention the build + # tools themselves. The original PEP 518 code had a similar check (but + # implemented in a different way). + backend = "setuptools.build_meta:__legacy__" + check = ["setuptools>=40.8.0", "wheel"] + + return BuildSystemDetails(requires, backend, check, backend_path) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/pyproject.pyc b/venv/lib/python2.7/site-packages/pip/_internal/pyproject.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4372e4d3658ac40c2c4fad9352785183893d2392 GIT binary patch literal 4430 zcmb_f&2k&Z5$*xNB>@5?MTz=Jlz6QiNTp23b|s2RWh=5JRjjf?DJv(kP^H>hVh7}s z`vdI^BryUmVJ&}KBm#-S{Pgs6fBiE(^?!F- z|NPT8VV|ZS55Ko>6PbUZ6XRb|N|Y(;DN;PHQCg#3P1ew_Q?EYjH>lT;ex1?<$~@|M zZcl^KMaq__w?tW!dQCUGKxvDzW$Gvp0r2tGR19*I~1=_yh?iwI))Y( zC|(nqi>%k_wyG~n#6&AK1xcR>D=07OwWxSS3drJZfumMkxh#HURf5UTVgi9e){NX zc;}0IcfJgR-|p<(-}%)RpD71_mLJ(A3?2@7W0Z;%4-#YhtO(0$t-9+@V#ezK=?{c2d=I*)}Y!0=9!3m;x(7 z65uFU70?c$E*aC1E2naLgbvkHJ z`32bp8oQy#OPIm%V3FVm2TeLAHY4Z}5}2Rb)2x8)2|nVdY#?|5v^4_7FtYp7IVh6c z*^8xm^z>r~7b9x*D=Vh6oG^6WFJkQ?;KjP1;P3Cp8=81)Zz z9GYTO_H`H|F#5JAkAibpeK(k&1*a@J)M2G>$g2GS(`E?`)i&xsR2OTOE%Es%N#n;N z?Oko7BsCIGrHff(7eTYjBIhx1C+hF({-I?*p3VyIKHHPi24f`AHU_XKW|YvHH0EXy zH?R^c36myM+rnJ1HZsz&Qhz>A6OT=O;L#X%2Js?2iR<*6ug8mQ?HH*HlS`B%%hkEV zto}yh1#0sTJf}{FO)CG&{WgAVli~&5^apVc+oB1wSxDn0D!-!`=Pc2o$NiJd-@47; z%4VFq%tRo)1U7GS+L-MFKTkm#W-m#@Nn$Q40EffD-ds_be9X)sB{qDi5+oxGo3w{c zi>`C(_UJlm2quoON#@y<3DWum3bjP)MJoTIpx?O3A|l<7k&h(fA5*Q8lbN*W(xgQe z6fIW3{QYg))@Xj)t0zo+_t`_5EYr~n*%cZu^Jewr`9D+xF@D&h@^Ve7xA8h7pb34& z6x+VW_Xz}IOFHwmSrZpfbU51{79-j$LC3K{f_)hmIQv zdyWG0IRf}W5yigU*M1caT@HVr!?fFK`S?7FN?dBlqUNTId2VD7KzjJ|kAC5A`(H#x zSYWdBIW{!HJN6&ld*m|#(r#ZH6Pq6S zW~lqgAklHRVo=E(ip<;ogQ72Yq+bl2QZD0fnzyM}u`wDKHu3>f`F;jMgsVf4skTDf zkgt4f{R$vTcY5|TN$|z)zto#0Ag+M$w+2O7F{v={ea)9UFyyKNfL(PK2q0jY&%w_y z`pE!%eY0PT(wGe*8mD?M>L2->d40}nANU2VTfR)N9{Ez3ROfD0J(gfjUgHnSB6|a~ z4^C0fG@TiFn(s~%onm<+t7J((0wU8(8_p69;9x#LX0=b9#IlWsqTDX0V_)YllCsDd z*i(enZ6S)omkQsNXKt@c(@wLkskqw=(bdyJJ1n@?dI3m_c|Y>YqOd3KcU6v;8)0^r z8NLNZcCdY8$H+Cn5^uZv&fLe^-NZz@DRg{Gc=(9{B2pFJWM|=G#g7YZ{JgOKegt_U zhG;b85~c%g0?77M8MFJp@Sla10dI%zlpV*=>j?yU!w-yA&1h`ul97EXw1E%Mu2MbEoV#AK`@W+lyUn!^r1SkCAnCuIZXj|I4m^k)!B9T8#3U zW6XyslzzXQI6rgVE&ePImVh(7luZIcVmP5oJ(m&fS)mekLKOgnvCp;{37H}aeztD(B*ZtUh~vNwZXqj9d%aKRlD9)>(cY;XY0*{ zwrbYb8=h*^+ReJ^sLta0f`{3oHtETe6^}@m`_;{+_!D?-b z3v4k)7!F3bPjnatEJLu#jkt@D@Z+anq$!dQ9*rhoj0G(`sk-3{l)6PJ^}q9;D_EXe z>AKKEf}2GS=V{}dg5ASjoNbuB%)0tjU&{;CIFI96Tv%2VBa70zi$@{&23&NDGfu}` zwFm4M0lS)W#LL`c9}I4yIkBen{*Q;FxaTKX5sy-Ri;*#$?AB^*gSJ|$omb~;Yxwol Od-dj0bJ None + self.name = name + + def __repr__(self): + # type: () -> str + return "InstallationResult(name={!r})".format(self.name) + + +def _validate_requirements( + requirements, # type: List[InstallRequirement] +): + # type: (...) -> Iterator[Tuple[str, InstallRequirement]] + for req in requirements: + assert req.name, "invalid to-be-installed requirement: {}".format(req) + yield req.name, req + + +def install_given_reqs( + requirements, # type: List[InstallRequirement] + install_options, # type: List[str] + global_options, # type: Sequence[str] + root, # type: Optional[str] + home, # type: Optional[str] + prefix, # type: Optional[str] + warn_script_location, # type: bool + use_user_site, # type: bool + pycompile, # type: bool +): + # type: (...) -> List[InstallationResult] + """ + Install everything in the given list. + + (to be called after having downloaded and unpacked the packages) + """ + to_install = collections.OrderedDict(_validate_requirements(requirements)) + + if to_install: + logger.info( + 'Installing collected packages: %s', + ', '.join(to_install.keys()), + ) + + installed = [] + + with indent_log(): + for req_name, requirement in to_install.items(): + if requirement.should_reinstall: + logger.info('Attempting uninstall: %s', req_name) + with indent_log(): + uninstalled_pathset = requirement.uninstall( + auto_confirm=True + ) + else: + uninstalled_pathset = None + + try: + requirement.install( + install_options, + global_options, + root=root, + home=home, + prefix=prefix, + warn_script_location=warn_script_location, + use_user_site=use_user_site, + pycompile=pycompile, + ) + except Exception: + # if install did not succeed, rollback previous uninstall + if uninstalled_pathset and not requirement.install_succeeded: + uninstalled_pathset.rollback() + raise + else: + if uninstalled_pathset and requirement.install_succeeded: + uninstalled_pathset.commit() + + installed.append(InstallationResult(req_name)) + + return installed diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/req/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..779b3c72f183879747f5ce5ae50d9be67c4fef82 GIT binary patch literal 3061 zcmb_eUvC>l5T89ecI?=VlhS`c!5|@Am8PN(2r7zF+6pR43KyX533R&Lt(|l4UvAfF zL!B4kg(toQFMI$#4IhC=BqZMW&D=SO1aEDU-OSF+&d&e2#$WyJA3y)@hgAPG@qcrZ z$ovf;!k?mqC{^SsQhatOamaIo2Dm|9L*ND_O-h%@TdMe)l(Z;qlh?+1iJ}%I%anG= z>s049C0$Ba$Xlt-%arse?UUChrQ1~gCQ>_;oT7A=BQnW%*kD@+Jn&iDixl6b~iINND}v$SkX>F!U^QIwxcDW>@v2y zR+oW=Voex62Y{~Hw76Qt#g(|y|H`$y)9>F)870e)Gk6HDxC)c5 z`Z&hc_cw|Ian0g<0g?=>M^4CQ@#3RsIsgEBrqGvYsyMGIqqfXNkpAnT5vzXV*&F5I zrOJR7*v5I82DUPR#k(BU7i>(ai_-U5soIzkJF>QvmGXVdnd|#$9?cRQT~2X#4coCQ z0zIE|-5w;K$1!`qM*XZt}CM?;%m+0l!1(9sZaU)0+5;j_aLXS{^Las+M~qf1Wi zJ7t-dF2}lx8C!7Ts4AMG{=O1;$ZI5yv@yg4mF&XdXT+KO~mMNm&!BHQO)~QuF7+( z)MKbm(*bMDbKnOwjEnS;d9Kww41i^A!7}gCbe-&JF+n`0_B?t}X$#`^h+}SM*t$df z)P+6N`?@@^yKy!d#@W#B>Y?<=VS;YE(G}K_&4)XB7@~V406q!I%r{{f7d+BJY50~K z?hNw^tMpB5wdGta4#GSw;zW=5BEpV}u5?8m89CoCBVFp~b{tyw95eB2n3NL~8+U*> z8|MN{b2MniJk|%sMP8GPDLj=L%hhOh^H~z1K5F|!gClF@>R07V3$T@E8i~o`Ws(Z- zou{FeacH^C)fC^%!cc2OMY>}N^>+{qQ4_|cu@x{V3Y|sL%|={-E|;Ku7A)lCBHBnV znI!p6koYyq<)Py8Y;<4Y?N#2mH@mN4lRk_9oz%337dq)ZpL@3W^F(_<0wXAkaO=n~ z0=sMQO#t+Z7>q8*^D>s%#71jpP>U_qP!}34r>icgjvA;g_H~>aLSg#icg5*D1Jze; zXI1r`i_VD6u7}QeW@jZ29hU39&IAq?rv*~jvX?NnH;zX3#>~cv*{JDNaqt{PEYj^fdMb< REp@rkQoY7%<7~In`4`p>u?qkI literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/constructors.py b/venv/lib/python2.7/site-packages/pip/_internal/req/constructors.py new file mode 100644 index 0000000..7a4641e --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/req/constructors.py @@ -0,0 +1,486 @@ +"""Backing implementation for InstallRequirement's various constructors + +The idea here is that these formed a major chunk of InstallRequirement's size +so, moving them and support code dedicated to them outside of that class +helps creates for better understandability for the rest of the code. + +These are meant to be used elsewhere within pip to create instances of +InstallRequirement. +""" + +import logging +import os +import re + +from pip._vendor.packaging.markers import Marker +from pip._vendor.packaging.requirements import InvalidRequirement, Requirement +from pip._vendor.packaging.specifiers import Specifier +from pip._vendor.pkg_resources import RequirementParseError, parse_requirements + +from pip._internal.exceptions import InstallationError +from pip._internal.models.index import PyPI, TestPyPI +from pip._internal.models.link import Link +from pip._internal.models.wheel import Wheel +from pip._internal.pyproject import make_pyproject_path +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.filetypes import ARCHIVE_EXTENSIONS +from pip._internal.utils.misc import is_installable_dir, splitext +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.urls import path_to_url +from pip._internal.vcs import is_url, vcs + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Dict, Optional, Set, Tuple, Union, + ) + from pip._internal.req.req_file import ParsedRequirement + + +__all__ = [ + "install_req_from_editable", "install_req_from_line", + "parse_editable" +] + +logger = logging.getLogger(__name__) +operators = Specifier._operators.keys() + + +def is_archive_file(name): + # type: (str) -> bool + """Return True if `name` is a considered as an archive file.""" + ext = splitext(name)[1].lower() + if ext in ARCHIVE_EXTENSIONS: + return True + return False + + +def _strip_extras(path): + # type: (str) -> Tuple[str, Optional[str]] + m = re.match(r'^(.+)(\[[^\]]+\])$', path) + extras = None + if m: + path_no_extras = m.group(1) + extras = m.group(2) + else: + path_no_extras = path + + return path_no_extras, extras + + +def convert_extras(extras): + # type: (Optional[str]) -> Set[str] + if not extras: + return set() + return Requirement("placeholder" + extras.lower()).extras + + +def parse_editable(editable_req): + # type: (str) -> Tuple[Optional[str], str, Set[str]] + """Parses an editable requirement into: + - a requirement name + - an URL + - extras + - editable options + Accepted requirements: + svn+http://blahblah@rev#egg=Foobar[baz]&subdirectory=version_subdir + .[some_extra] + """ + + url = editable_req + + # If a file path is specified with extras, strip off the extras. + url_no_extras, extras = _strip_extras(url) + + if os.path.isdir(url_no_extras): + if not os.path.exists(os.path.join(url_no_extras, 'setup.py')): + msg = ( + 'File "setup.py" not found. Directory cannot be installed ' + 'in editable mode: {}'.format(os.path.abspath(url_no_extras)) + ) + pyproject_path = make_pyproject_path(url_no_extras) + if os.path.isfile(pyproject_path): + msg += ( + '\n(A "pyproject.toml" file was found, but editable ' + 'mode currently requires a setup.py based build.)' + ) + raise InstallationError(msg) + + # Treating it as code that has already been checked out + url_no_extras = path_to_url(url_no_extras) + + if url_no_extras.lower().startswith('file:'): + package_name = Link(url_no_extras).egg_fragment + if extras: + return ( + package_name, + url_no_extras, + Requirement("placeholder" + extras.lower()).extras, + ) + else: + return package_name, url_no_extras, set() + + for version_control in vcs: + if url.lower().startswith('{}:'.format(version_control)): + url = '{}+{}'.format(version_control, url) + break + + if '+' not in url: + raise InstallationError( + '{} is not a valid editable requirement. ' + 'It should either be a path to a local project or a VCS URL ' + '(beginning with svn+, git+, hg+, or bzr+).'.format(editable_req) + ) + + vc_type = url.split('+', 1)[0].lower() + + if not vcs.get_backend(vc_type): + backends = ", ".join([bends.name + '+URL' for bends in vcs.backends]) + error_message = "For --editable={}, " \ + "only {} are currently supported".format( + editable_req, backends) + raise InstallationError(error_message) + + package_name = Link(url).egg_fragment + if not package_name: + raise InstallationError( + "Could not detect requirement name for '{}', please specify one " + "with #egg=your_package_name".format(editable_req) + ) + return package_name, url, set() + + +def deduce_helpful_msg(req): + # type: (str) -> str + """Returns helpful msg in case requirements file does not exist, + or cannot be parsed. + + :params req: Requirements file path + """ + msg = "" + if os.path.exists(req): + msg = " It does exist." + # Try to parse and check if it is a requirements file. + try: + with open(req, 'r') as fp: + # parse first line only + next(parse_requirements(fp.read())) + msg += ( + "The argument you provided " + "({}) appears to be a" + " requirements file. If that is the" + " case, use the '-r' flag to install" + " the packages specified within it." + ).format(req) + except RequirementParseError: + logger.debug( + "Cannot parse '%s' as requirements file", req, exc_info=True + ) + else: + msg += " File '{}' does not exist.".format(req) + return msg + + +class RequirementParts(object): + def __init__( + self, + requirement, # type: Optional[Requirement] + link, # type: Optional[Link] + markers, # type: Optional[Marker] + extras, # type: Set[str] + ): + self.requirement = requirement + self.link = link + self.markers = markers + self.extras = extras + + +def parse_req_from_editable(editable_req): + # type: (str) -> RequirementParts + name, url, extras_override = parse_editable(editable_req) + + if name is not None: + try: + req = Requirement(name) + except InvalidRequirement: + raise InstallationError("Invalid requirement: '{}'".format(name)) + else: + req = None + + link = Link(url) + + return RequirementParts(req, link, None, extras_override) + + +# ---- The actual constructors follow ---- + + +def install_req_from_editable( + editable_req, # type: str + comes_from=None, # type: Optional[Union[InstallRequirement, str]] + use_pep517=None, # type: Optional[bool] + isolated=False, # type: bool + options=None, # type: Optional[Dict[str, Any]] + constraint=False, # type: bool + user_supplied=False, # type: bool +): + # type: (...) -> InstallRequirement + + parts = parse_req_from_editable(editable_req) + + return InstallRequirement( + parts.requirement, + comes_from=comes_from, + user_supplied=user_supplied, + editable=True, + link=parts.link, + constraint=constraint, + use_pep517=use_pep517, + isolated=isolated, + install_options=options.get("install_options", []) if options else [], + global_options=options.get("global_options", []) if options else [], + hash_options=options.get("hashes", {}) if options else {}, + extras=parts.extras, + ) + + +def _looks_like_path(name): + # type: (str) -> bool + """Checks whether the string "looks like" a path on the filesystem. + + This does not check whether the target actually exists, only judge from the + appearance. + + Returns true if any of the following conditions is true: + * a path separator is found (either os.path.sep or os.path.altsep); + * a dot is found (which represents the current directory). + """ + if os.path.sep in name: + return True + if os.path.altsep is not None and os.path.altsep in name: + return True + if name.startswith("."): + return True + return False + + +def _get_url_from_path(path, name): + # type: (str, str) -> Optional[str] + """ + First, it checks whether a provided path is an installable directory + (e.g. it has a setup.py). If it is, returns the path. + + If false, check if the path is an archive file (such as a .whl). + The function checks if the path is a file. If false, if the path has + an @, it will treat it as a PEP 440 URL requirement and return the path. + """ + if _looks_like_path(name) and os.path.isdir(path): + if is_installable_dir(path): + return path_to_url(path) + raise InstallationError( + "Directory {name!r} is not installable. Neither 'setup.py' " + "nor 'pyproject.toml' found.".format(**locals()) + ) + if not is_archive_file(path): + return None + if os.path.isfile(path): + return path_to_url(path) + urlreq_parts = name.split('@', 1) + if len(urlreq_parts) >= 2 and not _looks_like_path(urlreq_parts[0]): + # If the path contains '@' and the part before it does not look + # like a path, try to treat it as a PEP 440 URL req instead. + return None + logger.warning( + 'Requirement %r looks like a filename, but the ' + 'file does not exist', + name + ) + return path_to_url(path) + + +def parse_req_from_line(name, line_source): + # type: (str, Optional[str]) -> RequirementParts + if is_url(name): + marker_sep = '; ' + else: + marker_sep = ';' + if marker_sep in name: + name, markers_as_string = name.split(marker_sep, 1) + markers_as_string = markers_as_string.strip() + if not markers_as_string: + markers = None + else: + markers = Marker(markers_as_string) + else: + markers = None + name = name.strip() + req_as_string = None + path = os.path.normpath(os.path.abspath(name)) + link = None + extras_as_string = None + + if is_url(name): + link = Link(name) + else: + p, extras_as_string = _strip_extras(path) + url = _get_url_from_path(p, name) + if url is not None: + link = Link(url) + + # it's a local file, dir, or url + if link: + # Handle relative file URLs + if link.scheme == 'file' and re.search(r'\.\./', link.url): + link = Link( + path_to_url(os.path.normpath(os.path.abspath(link.path)))) + # wheel file + if link.is_wheel: + wheel = Wheel(link.filename) # can raise InvalidWheelFilename + req_as_string = "{wheel.name}=={wheel.version}".format(**locals()) + else: + # set the req to the egg fragment. when it's not there, this + # will become an 'unnamed' requirement + req_as_string = link.egg_fragment + + # a requirement specifier + else: + req_as_string = name + + extras = convert_extras(extras_as_string) + + def with_source(text): + # type: (str) -> str + if not line_source: + return text + return '{} (from {})'.format(text, line_source) + + if req_as_string is not None: + try: + req = Requirement(req_as_string) + except InvalidRequirement: + if os.path.sep in req_as_string: + add_msg = "It looks like a path." + add_msg += deduce_helpful_msg(req_as_string) + elif ('=' in req_as_string and + not any(op in req_as_string for op in operators)): + add_msg = "= is not a valid operator. Did you mean == ?" + else: + add_msg = '' + msg = with_source( + 'Invalid requirement: {!r}'.format(req_as_string) + ) + if add_msg: + msg += '\nHint: {}'.format(add_msg) + raise InstallationError(msg) + else: + # Deprecate extras after specifiers: "name>=1.0[extras]" + # This currently works by accident because _strip_extras() parses + # any extras in the end of the string and those are saved in + # RequirementParts + for spec in req.specifier: + spec_str = str(spec) + if spec_str.endswith(']'): + msg = "Extras after version '{}'.".format(spec_str) + replace = "moving the extras before version specifiers" + deprecated(msg, replacement=replace, gone_in="21.0") + else: + req = None + + return RequirementParts(req, link, markers, extras) + + +def install_req_from_line( + name, # type: str + comes_from=None, # type: Optional[Union[str, InstallRequirement]] + use_pep517=None, # type: Optional[bool] + isolated=False, # type: bool + options=None, # type: Optional[Dict[str, Any]] + constraint=False, # type: bool + line_source=None, # type: Optional[str] + user_supplied=False, # type: bool +): + # type: (...) -> InstallRequirement + """Creates an InstallRequirement from a name, which might be a + requirement, directory containing 'setup.py', filename, or URL. + + :param line_source: An optional string describing where the line is from, + for logging purposes in case of an error. + """ + parts = parse_req_from_line(name, line_source) + + return InstallRequirement( + parts.requirement, comes_from, link=parts.link, markers=parts.markers, + use_pep517=use_pep517, isolated=isolated, + install_options=options.get("install_options", []) if options else [], + global_options=options.get("global_options", []) if options else [], + hash_options=options.get("hashes", {}) if options else {}, + constraint=constraint, + extras=parts.extras, + user_supplied=user_supplied, + ) + + +def install_req_from_req_string( + req_string, # type: str + comes_from=None, # type: Optional[InstallRequirement] + isolated=False, # type: bool + use_pep517=None, # type: Optional[bool] + user_supplied=False, # type: bool +): + # type: (...) -> InstallRequirement + try: + req = Requirement(req_string) + except InvalidRequirement: + raise InstallationError("Invalid requirement: '{}'".format(req_string)) + + domains_not_allowed = [ + PyPI.file_storage_domain, + TestPyPI.file_storage_domain, + ] + if (req.url and comes_from and comes_from.link and + comes_from.link.netloc in domains_not_allowed): + # Explicitly disallow pypi packages that depend on external urls + raise InstallationError( + "Packages installed from PyPI cannot depend on packages " + "which are not also hosted on PyPI.\n" + "{} depends on {} ".format(comes_from.name, req) + ) + + return InstallRequirement( + req, + comes_from, + isolated=isolated, + use_pep517=use_pep517, + user_supplied=user_supplied, + ) + + +def install_req_from_parsed_requirement( + parsed_req, # type: ParsedRequirement + isolated=False, # type: bool + use_pep517=None, # type: Optional[bool] + user_supplied=False, # type: bool +): + # type: (...) -> InstallRequirement + if parsed_req.is_editable: + req = install_req_from_editable( + parsed_req.requirement, + comes_from=parsed_req.comes_from, + use_pep517=use_pep517, + constraint=parsed_req.constraint, + isolated=isolated, + user_supplied=user_supplied, + ) + + else: + req = install_req_from_line( + parsed_req.requirement, + comes_from=parsed_req.comes_from, + use_pep517=use_pep517, + isolated=isolated, + options=parsed_req.options, + constraint=parsed_req.constraint, + line_source=parsed_req.line_source, + user_supplied=user_supplied, + ) + return req diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/constructors.pyc b/venv/lib/python2.7/site-packages/pip/_internal/req/constructors.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2cd641c87e8f92e0a224d64dca0886d163c019b1 GIT binary patch literal 13672 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\$\{(?P[A-Z0-9_]+)\})') + +SUPPORTED_OPTIONS = [ + cmdoptions.index_url, + cmdoptions.extra_index_url, + cmdoptions.no_index, + cmdoptions.constraints, + cmdoptions.requirements, + cmdoptions.editable, + cmdoptions.find_links, + cmdoptions.no_binary, + cmdoptions.only_binary, + cmdoptions.prefer_binary, + cmdoptions.require_hashes, + cmdoptions.pre, + cmdoptions.trusted_host, + cmdoptions.use_new_feature, +] # type: List[Callable[..., optparse.Option]] + +# options to be passed to requirements +SUPPORTED_OPTIONS_REQ = [ + cmdoptions.install_options, + cmdoptions.global_options, + cmdoptions.hash, +] # type: List[Callable[..., optparse.Option]] + +# the 'dest' string values +SUPPORTED_OPTIONS_REQ_DEST = [str(o().dest) for o in SUPPORTED_OPTIONS_REQ] + + +class ParsedRequirement(object): + def __init__( + self, + requirement, # type:str + is_editable, # type: bool + comes_from, # type: str + constraint, # type: bool + options=None, # type: Optional[Dict[str, Any]] + line_source=None, # type: Optional[str] + ): + # type: (...) -> None + self.requirement = requirement + self.is_editable = is_editable + self.comes_from = comes_from + self.options = options + self.constraint = constraint + self.line_source = line_source + + +class ParsedLine(object): + def __init__( + self, + filename, # type: str + lineno, # type: int + comes_from, # type: Optional[str] + args, # type: str + opts, # type: Values + constraint, # type: bool + ): + # type: (...) -> None + self.filename = filename + self.lineno = lineno + self.comes_from = comes_from + self.opts = opts + self.constraint = constraint + + if args: + self.is_requirement = True + self.is_editable = False + self.requirement = args + elif opts.editables: + self.is_requirement = True + self.is_editable = True + # We don't support multiple -e on one line + self.requirement = opts.editables[0] + else: + self.is_requirement = False + + +def parse_requirements( + filename, # type: str + session, # type: PipSession + finder=None, # type: Optional[PackageFinder] + comes_from=None, # type: Optional[str] + options=None, # type: Optional[optparse.Values] + constraint=False, # type: bool +): + # type: (...) -> Iterator[ParsedRequirement] + """Parse a requirements file and yield ParsedRequirement instances. + + :param filename: Path or url of requirements file. + :param session: PipSession instance. + :param finder: Instance of pip.index.PackageFinder. + :param comes_from: Origin description of requirements. + :param options: cli options. + :param constraint: If true, parsing a constraint file rather than + requirements file. + """ + line_parser = get_line_parser(finder) + parser = RequirementsFileParser(session, line_parser, comes_from) + + for parsed_line in parser.parse(filename, constraint): + parsed_req = handle_line( + parsed_line, + options=options, + finder=finder, + session=session + ) + if parsed_req is not None: + yield parsed_req + + +def preprocess(content): + # type: (Text) -> ReqFileLines + """Split, filter, and join lines, and return a line iterator + + :param content: the content of the requirements file + """ + lines_enum = enumerate(content.splitlines(), start=1) # type: ReqFileLines + lines_enum = join_lines(lines_enum) + lines_enum = ignore_comments(lines_enum) + lines_enum = expand_env_variables(lines_enum) + return lines_enum + + +def handle_requirement_line( + line, # type: ParsedLine + options=None, # type: Optional[optparse.Values] +): + # type: (...) -> ParsedRequirement + + # preserve for the nested code path + line_comes_from = '{} {} (line {})'.format( + '-c' if line.constraint else '-r', line.filename, line.lineno, + ) + + assert line.is_requirement + + if line.is_editable: + # For editable requirements, we don't support per-requirement + # options, so just return the parsed requirement. + return ParsedRequirement( + requirement=line.requirement, + is_editable=line.is_editable, + comes_from=line_comes_from, + constraint=line.constraint, + ) + else: + if options: + # Disable wheels if the user has specified build options + cmdoptions.check_install_build_global(options, line.opts) + + # get the options that apply to requirements + req_options = {} + for dest in SUPPORTED_OPTIONS_REQ_DEST: + if dest in line.opts.__dict__ and line.opts.__dict__[dest]: + req_options[dest] = line.opts.__dict__[dest] + + line_source = 'line {} of {}'.format(line.lineno, line.filename) + return ParsedRequirement( + requirement=line.requirement, + is_editable=line.is_editable, + comes_from=line_comes_from, + constraint=line.constraint, + options=req_options, + line_source=line_source, + ) + + +def handle_option_line( + opts, # type: Values + filename, # type: str + lineno, # type: int + finder=None, # type: Optional[PackageFinder] + options=None, # type: Optional[optparse.Values] + session=None, # type: Optional[PipSession] +): + # type: (...) -> None + + if options: + # percolate options upward + if opts.require_hashes: + options.require_hashes = opts.require_hashes + if opts.features_enabled: + options.features_enabled.extend( + f for f in opts.features_enabled + if f not in options.features_enabled + ) + + # set finder options + if finder: + find_links = finder.find_links + index_urls = finder.index_urls + if opts.index_url: + index_urls = [opts.index_url] + if opts.no_index is True: + index_urls = [] + if opts.extra_index_urls: + index_urls.extend(opts.extra_index_urls) + if opts.find_links: + # FIXME: it would be nice to keep track of the source + # of the find_links: support a find-links local path + # relative to a requirements file. + value = opts.find_links[0] + req_dir = os.path.dirname(os.path.abspath(filename)) + relative_to_reqs_file = os.path.join(req_dir, value) + if os.path.exists(relative_to_reqs_file): + value = relative_to_reqs_file + find_links.append(value) + + search_scope = SearchScope( + find_links=find_links, + index_urls=index_urls, + ) + finder.search_scope = search_scope + + if opts.pre: + finder.set_allow_all_prereleases() + + if opts.prefer_binary: + finder.set_prefer_binary() + + if session: + for host in opts.trusted_hosts or []: + source = 'line {} of {}'.format(lineno, filename) + session.add_trusted_host(host, source=source) + + +def handle_line( + line, # type: ParsedLine + options=None, # type: Optional[optparse.Values] + finder=None, # type: Optional[PackageFinder] + session=None, # type: Optional[PipSession] +): + # type: (...) -> Optional[ParsedRequirement] + """Handle a single parsed requirements line; This can result in + creating/yielding requirements, or updating the finder. + + :param line: The parsed line to be processed. + :param options: CLI options. + :param finder: The finder - updated by non-requirement lines. + :param session: The session - updated by non-requirement lines. + + Returns a ParsedRequirement object if the line is a requirement line, + otherwise returns None. + + For lines that contain requirements, the only options that have an effect + are from SUPPORTED_OPTIONS_REQ, and they are scoped to the + requirement. Other options from SUPPORTED_OPTIONS may be present, but are + ignored. + + For lines that do not contain requirements, the only options that have an + effect are from SUPPORTED_OPTIONS. Options from SUPPORTED_OPTIONS_REQ may + be present, but are ignored. These lines may contain multiple options + (although our docs imply only one is supported), and all our parsed and + affect the finder. + """ + + if line.is_requirement: + parsed_req = handle_requirement_line(line, options) + return parsed_req + else: + handle_option_line( + line.opts, + line.filename, + line.lineno, + finder, + options, + session, + ) + return None + + +class RequirementsFileParser(object): + def __init__( + self, + session, # type: PipSession + line_parser, # type: LineParser + comes_from, # type: Optional[str] + ): + # type: (...) -> None + self._session = session + self._line_parser = line_parser + self._comes_from = comes_from + + def parse(self, filename, constraint): + # type: (str, bool) -> Iterator[ParsedLine] + """Parse a given file, yielding parsed lines. + """ + for line in self._parse_and_recurse(filename, constraint): + yield line + + def _parse_and_recurse(self, filename, constraint): + # type: (str, bool) -> Iterator[ParsedLine] + for line in self._parse_file(filename, constraint): + if ( + not line.is_requirement and + (line.opts.requirements or line.opts.constraints) + ): + # parse a nested requirements file + if line.opts.requirements: + req_path = line.opts.requirements[0] + nested_constraint = False + else: + req_path = line.opts.constraints[0] + nested_constraint = True + + # original file is over http + if SCHEME_RE.search(filename): + # do a url join so relative paths work + req_path = urllib_parse.urljoin(filename, req_path) + # original file and nested file are paths + elif not SCHEME_RE.search(req_path): + # do a join so relative paths work + req_path = os.path.join( + os.path.dirname(filename), req_path, + ) + + for inner_line in self._parse_and_recurse( + req_path, nested_constraint, + ): + yield inner_line + else: + yield line + + def _parse_file(self, filename, constraint): + # type: (str, bool) -> Iterator[ParsedLine] + _, content = get_file_content( + filename, self._session, comes_from=self._comes_from + ) + + lines_enum = preprocess(content) + + for line_number, line in lines_enum: + try: + args_str, opts = self._line_parser(line) + except OptionParsingError as e: + # add offending line + msg = 'Invalid requirement: {}\n{}'.format(line, e.msg) + raise RequirementsFileParseError(msg) + + yield ParsedLine( + filename, + line_number, + self._comes_from, + args_str, + opts, + constraint, + ) + + +def get_line_parser(finder): + # type: (Optional[PackageFinder]) -> LineParser + def parse_line(line): + # type: (Text) -> Tuple[str, Values] + # Build new parser for each line since it accumulates appendable + # options. + parser = build_parser() + defaults = parser.get_default_values() + defaults.index_url = None + if finder: + defaults.format_control = finder.format_control + + args_str, options_str = break_args_options(line) + # Prior to 2.7.3, shlex cannot deal with unicode entries + if sys.version_info < (2, 7, 3): + # https://github.com/python/mypy/issues/1174 + options_str = options_str.encode('utf8') # type: ignore + + # https://github.com/python/mypy/issues/1174 + opts, _ = parser.parse_args( + shlex.split(options_str), defaults) # type: ignore + + return args_str, opts + + return parse_line + + +def break_args_options(line): + # type: (Text) -> Tuple[str, Text] + """Break up the line into an args and options string. We only want to shlex + (and then optparse) the options, not the args. args can contain markers + which are corrupted by shlex. + """ + tokens = line.split(' ') + args = [] + options = tokens[:] + for token in tokens: + if token.startswith('-') or token.startswith('--'): + break + else: + args.append(token) + options.pop(0) + return ' '.join(args), ' '.join(options) # type: ignore + + +class OptionParsingError(Exception): + def __init__(self, msg): + # type: (str) -> None + self.msg = msg + + +def build_parser(): + # type: () -> optparse.OptionParser + """ + Return a parser for parsing requirement lines + """ + parser = optparse.OptionParser(add_help_option=False) + + option_factories = SUPPORTED_OPTIONS + SUPPORTED_OPTIONS_REQ + for option_factory in option_factories: + option = option_factory() + parser.add_option(option) + + # By default optparse sys.exits on parsing errors. We want to wrap + # that in our own exception. + def parser_exit(self, msg): + # type: (Any, str) -> NoReturn + raise OptionParsingError(msg) + # NOTE: mypy disallows assigning to a method + # https://github.com/python/mypy/issues/2427 + parser.exit = parser_exit # type: ignore + + return parser + + +def join_lines(lines_enum): + # type: (ReqFileLines) -> ReqFileLines + """Joins a line ending in '\' with the previous line (except when following + comments). The joined line takes on the index of the first line. + """ + primary_line_number = None + new_line = [] # type: List[Text] + for line_number, line in lines_enum: + if not line.endswith('\\') or COMMENT_RE.match(line): + if COMMENT_RE.match(line): + # this ensures comments are always matched later + line = ' ' + line + if new_line: + new_line.append(line) + assert primary_line_number is not None + yield primary_line_number, ''.join(new_line) + new_line = [] + else: + yield line_number, line + else: + if not new_line: + primary_line_number = line_number + new_line.append(line.strip('\\')) + + # last line contains \ + if new_line: + assert primary_line_number is not None + yield primary_line_number, ''.join(new_line) + + # TODO: handle space after '\'. + + +def ignore_comments(lines_enum): + # type: (ReqFileLines) -> ReqFileLines + """ + Strips comments and filter empty lines. + """ + for line_number, line in lines_enum: + line = COMMENT_RE.sub('', line) + line = line.strip() + if line: + yield line_number, line + + +def expand_env_variables(lines_enum): + # type: (ReqFileLines) -> ReqFileLines + """Replace all environment variables that can be retrieved via `os.getenv`. + + The only allowed format for environment variables defined in the + requirement file is `${MY_VARIABLE_1}` to ensure two things: + + 1. Strings that contain a `$` aren't accidentally (partially) expanded. + 2. Ensure consistency across platforms for requirement files. + + These points are the result of a discussion on the `github pull + request #3514 `_. + + Valid characters in variable names follow the `POSIX standard + `_ and are limited + to uppercase letter, digits and the `_` (underscore). + """ + for line_number, line in lines_enum: + for env_var, var_name in ENV_VAR_RE.findall(line): + value = os.getenv(var_name) + if not value: + continue + + line = line.replace(env_var, value) + + yield line_number, line + + +def get_file_content(url, session, comes_from=None): + # type: (str, PipSession, Optional[str]) -> Tuple[str, Text] + """Gets the content of a file; it may be a filename, file: URL, or + http: URL. Returns (location, content). Content is unicode. + Respects # -*- coding: declarations on the retrieved files. + + :param url: File path or url. + :param session: PipSession instance. + :param comes_from: Origin description of requirements. + """ + scheme = get_url_scheme(url) + + if scheme in ['http', 'https']: + # FIXME: catch some errors + resp = session.get(url) + raise_for_status(resp) + return resp.url, resp.text + + elif scheme == 'file': + if comes_from and comes_from.startswith('http'): + raise InstallationError( + 'Requirements file {} references URL {}, ' + 'which is local'.format(comes_from, url) + ) + + path = url.split(':', 1)[1] + path = path.replace('\\', '/') + match = _url_slash_drive_re.match(path) + if match: + path = match.group(1) + ':' + path.split('|', 1)[1] + path = urllib_parse.unquote(path) + if path.startswith('/'): + path = '/' + path.lstrip('/') + url = path + + try: + with open(url, 'rb') as f: + content = auto_decode(f.read()) + except IOError as exc: + raise InstallationError( + 'Could not open requirements file: {}'.format(exc) + ) + return url, content + + +_url_slash_drive_re = re.compile(r'/*([a-z])\|', re.I) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_file.pyc b/venv/lib/python2.7/site-packages/pip/_internal/req/req_file.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11ca6a77c0e495e4833fd8af78714902c09ef728 GIT binary patch literal 16071 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 N&%617{GoyI{{*~YZv+4U literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_install.py b/venv/lib/python2.7/site-packages/pip/_internal/req/req_install.py new file mode 100644 index 0000000..f25cec9 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/req/req_install.py @@ -0,0 +1,905 @@ +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +from __future__ import absolute_import + +import logging +import os +import shutil +import sys +import uuid +import zipfile + +from pip._vendor import pkg_resources, six +from pip._vendor.packaging.requirements import Requirement +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import Version +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.pep517.wrappers import Pep517HookCaller + +from pip._internal.build_env import NoOpBuildEnvironment +from pip._internal.exceptions import InstallationError +from pip._internal.locations import get_scheme +from pip._internal.models.link import Link +from pip._internal.operations.build.metadata import generate_metadata +from pip._internal.operations.build.metadata_legacy import \ + generate_metadata as generate_metadata_legacy +from pip._internal.operations.install.editable_legacy import \ + install_editable as install_editable_legacy +from pip._internal.operations.install.legacy import LegacyInstallFailure +from pip._internal.operations.install.legacy import install as install_legacy +from pip._internal.operations.install.wheel import install_wheel +from pip._internal.pyproject import load_pyproject_toml, make_pyproject_path +from pip._internal.req.req_uninstall import UninstallPathSet +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.direct_url_helpers import direct_url_from_link +from pip._internal.utils.hashes import Hashes +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + ask_path_exists, + backup_dir, + display_path, + dist_in_site_packages, + dist_in_usersite, + get_distribution, + get_installed_version, + hide_url, + redact_auth_from_url, +) +from pip._internal.utils.packaging import get_metadata +from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.virtualenv import running_under_virtualenv +from pip._internal.vcs import vcs + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Dict, Iterable, List, Optional, Sequence, Union, + ) + from pip._internal.build_env import BuildEnvironment + from pip._vendor.pkg_resources import Distribution + from pip._vendor.packaging.specifiers import SpecifierSet + from pip._vendor.packaging.markers import Marker + + +logger = logging.getLogger(__name__) + + +def _get_dist(metadata_directory): + # type: (str) -> Distribution + """Return a pkg_resources.Distribution for the provided + metadata directory. + """ + dist_dir = metadata_directory.rstrip(os.sep) + + # Build a PathMetadata object, from path to metadata. :wink: + base_dir, dist_dir_name = os.path.split(dist_dir) + metadata = pkg_resources.PathMetadata(base_dir, dist_dir) + + # Determine the correct Distribution object type. + if dist_dir.endswith(".egg-info"): + dist_cls = pkg_resources.Distribution + dist_name = os.path.splitext(dist_dir_name)[0] + else: + assert dist_dir.endswith(".dist-info") + dist_cls = pkg_resources.DistInfoDistribution + dist_name = os.path.splitext(dist_dir_name)[0].split("-")[0] + + return dist_cls( + base_dir, + project_name=dist_name, + metadata=metadata, + ) + + +class InstallRequirement(object): + """ + Represents something that may be installed later on, may have information + about where to fetch the relevant requirement and also contains logic for + installing the said requirement. + """ + + def __init__( + self, + req, # type: Optional[Requirement] + comes_from, # type: Optional[Union[str, InstallRequirement]] + editable=False, # type: bool + link=None, # type: Optional[Link] + markers=None, # type: Optional[Marker] + use_pep517=None, # type: Optional[bool] + isolated=False, # type: bool + install_options=None, # type: Optional[List[str]] + global_options=None, # type: Optional[List[str]] + hash_options=None, # type: Optional[Dict[str, List[str]]] + constraint=False, # type: bool + extras=(), # type: Iterable[str] + user_supplied=False, # type: bool + ): + # type: (...) -> None + assert req is None or isinstance(req, Requirement), req + self.req = req + self.comes_from = comes_from + self.constraint = constraint + self.editable = editable + self.legacy_install_reason = None # type: Optional[int] + + # source_dir is the local directory where the linked requirement is + # located, or unpacked. In case unpacking is needed, creating and + # populating source_dir is done by the RequirementPreparer. Note this + # is not necessarily the directory where pyproject.toml or setup.py is + # located - that one is obtained via unpacked_source_directory. + self.source_dir = None # type: Optional[str] + if self.editable: + assert link + if link.is_file: + self.source_dir = os.path.normpath( + os.path.abspath(link.file_path) + ) + + if link is None and req and req.url: + # PEP 508 URL requirement + link = Link(req.url) + self.link = self.original_link = link + self.original_link_is_in_wheel_cache = False + + # Path to any downloaded or already-existing package. + self.local_file_path = None # type: Optional[str] + if self.link and self.link.is_file: + self.local_file_path = self.link.file_path + + if extras: + self.extras = extras + elif req: + self.extras = { + pkg_resources.safe_extra(extra) for extra in req.extras + } + else: + self.extras = set() + if markers is None and req: + markers = req.marker + self.markers = markers + + # This holds the pkg_resources.Distribution object if this requirement + # is already available: + self.satisfied_by = None # type: Optional[Distribution] + # Whether the installation process should try to uninstall an existing + # distribution before installing this requirement. + self.should_reinstall = False + # Temporary build location + self._temp_build_dir = None # type: Optional[TempDirectory] + # Set to True after successful installation + self.install_succeeded = None # type: Optional[bool] + # Supplied options + self.install_options = install_options if install_options else [] + self.global_options = global_options if global_options else [] + self.hash_options = hash_options if hash_options else {} + # Set to True after successful preparation of this requirement + self.prepared = False + # User supplied requirement are explicitly requested for installation + # by the user via CLI arguments or requirements files, as opposed to, + # e.g. dependencies, extras or constraints. + self.user_supplied = user_supplied + + # Set by the legacy resolver when the requirement has been downloaded + # TODO: This introduces a strong coupling between the resolver and the + # requirement (the coupling was previously between the resolver + # and the requirement set). This should be refactored to allow + # the requirement to decide for itself when it has been + # successfully downloaded - but that is more tricky to get right, + # se we are making the change in stages. + self.successfully_downloaded = False + + self.isolated = isolated + self.build_env = NoOpBuildEnvironment() # type: BuildEnvironment + + # For PEP 517, the directory where we request the project metadata + # gets stored. We need this to pass to build_wheel, so the backend + # can ensure that the wheel matches the metadata (see the PEP for + # details). + self.metadata_directory = None # type: Optional[str] + + # The static build requirements (from pyproject.toml) + self.pyproject_requires = None # type: Optional[List[str]] + + # Build requirements that we will check are available + self.requirements_to_check = [] # type: List[str] + + # The PEP 517 backend we should use to build the project + self.pep517_backend = None # type: Optional[Pep517HookCaller] + + # Are we using PEP 517 for this requirement? + # After pyproject.toml has been loaded, the only valid values are True + # and False. Before loading, None is valid (meaning "use the default"). + # Setting an explicit value before loading pyproject.toml is supported, + # but after loading this flag should be treated as read only. + self.use_pep517 = use_pep517 + + def __str__(self): + # type: () -> str + if self.req: + s = str(self.req) + if self.link: + s += ' from {}'.format(redact_auth_from_url(self.link.url)) + elif self.link: + s = redact_auth_from_url(self.link.url) + else: + s = '' + if self.satisfied_by is not None: + s += ' in {}'.format(display_path(self.satisfied_by.location)) + if self.comes_from: + if isinstance(self.comes_from, six.string_types): + comes_from = self.comes_from # type: Optional[str] + else: + comes_from = self.comes_from.from_path() + if comes_from: + s += ' (from {})'.format(comes_from) + return s + + def __repr__(self): + # type: () -> str + return '<{} object: {} editable={!r}>'.format( + self.__class__.__name__, str(self), self.editable) + + def format_debug(self): + # type: () -> str + """An un-tested helper for getting state, for debugging. + """ + attributes = vars(self) + names = sorted(attributes) + + state = ( + "{}={!r}".format(attr, attributes[attr]) for attr in sorted(names) + ) + return '<{name} object: {{{state}}}>'.format( + name=self.__class__.__name__, + state=", ".join(state), + ) + + # Things that are valid for all kinds of requirements? + @property + def name(self): + # type: () -> Optional[str] + if self.req is None: + return None + return six.ensure_str(pkg_resources.safe_name(self.req.name)) + + @property + def specifier(self): + # type: () -> SpecifierSet + return self.req.specifier + + @property + def is_pinned(self): + # type: () -> bool + """Return whether I am pinned to an exact version. + + For example, some-package==1.2 is pinned; some-package>1.2 is not. + """ + specifiers = self.specifier + return (len(specifiers) == 1 and + next(iter(specifiers)).operator in {'==', '==='}) + + @property + def installed_version(self): + # type: () -> Optional[str] + return get_installed_version(self.name) + + def match_markers(self, extras_requested=None): + # type: (Optional[Iterable[str]]) -> bool + if not extras_requested: + # Provide an extra to safely evaluate the markers + # without matching any extra + extras_requested = ('',) + if self.markers is not None: + return any( + self.markers.evaluate({'extra': extra}) + for extra in extras_requested) + else: + return True + + @property + def has_hash_options(self): + # type: () -> bool + """Return whether any known-good hashes are specified as options. + + These activate --require-hashes mode; hashes specified as part of a + URL do not. + + """ + return bool(self.hash_options) + + def hashes(self, trust_internet=True): + # type: (bool) -> Hashes + """Return a hash-comparer that considers my option- and URL-based + hashes to be known-good. + + Hashes in URLs--ones embedded in the requirements file, not ones + downloaded from an index server--are almost peers with ones from + flags. They satisfy --require-hashes (whether it was implicitly or + explicitly activated) but do not activate it. md5 and sha224 are not + allowed in flags, which should nudge people toward good algos. We + always OR all hashes together, even ones from URLs. + + :param trust_internet: Whether to trust URL-based (#md5=...) hashes + downloaded from the internet, as by populate_link() + + """ + good_hashes = self.hash_options.copy() + link = self.link if trust_internet else self.original_link + if link and link.hash: + good_hashes.setdefault(link.hash_name, []).append(link.hash) + return Hashes(good_hashes) + + def from_path(self): + # type: () -> Optional[str] + """Format a nice indicator to show where this "comes from" + """ + if self.req is None: + return None + s = str(self.req) + if self.comes_from: + if isinstance(self.comes_from, six.string_types): + comes_from = self.comes_from + else: + comes_from = self.comes_from.from_path() + if comes_from: + s += '->' + comes_from + return s + + def ensure_build_location(self, build_dir, autodelete, parallel_builds): + # type: (str, bool, bool) -> str + assert build_dir is not None + if self._temp_build_dir is not None: + assert self._temp_build_dir.path + return self._temp_build_dir.path + if self.req is None: + # Some systems have /tmp as a symlink which confuses custom + # builds (such as numpy). Thus, we ensure that the real path + # is returned. + self._temp_build_dir = TempDirectory( + kind=tempdir_kinds.REQ_BUILD, globally_managed=True + ) + + return self._temp_build_dir.path + + # When parallel builds are enabled, add a UUID to the build directory + # name so multiple builds do not interfere with each other. + dir_name = canonicalize_name(self.name) + if parallel_builds: + dir_name = "{}_{}".format(dir_name, uuid.uuid4().hex) + + # FIXME: Is there a better place to create the build_dir? (hg and bzr + # need this) + if not os.path.exists(build_dir): + logger.debug('Creating directory %s', build_dir) + os.makedirs(build_dir) + actual_build_dir = os.path.join(build_dir, dir_name) + # `None` indicates that we respect the globally-configured deletion + # settings, which is what we actually want when auto-deleting. + delete_arg = None if autodelete else False + return TempDirectory( + path=actual_build_dir, + delete=delete_arg, + kind=tempdir_kinds.REQ_BUILD, + globally_managed=True, + ).path + + def _set_requirement(self): + # type: () -> None + """Set requirement after generating metadata. + """ + assert self.req is None + assert self.metadata is not None + assert self.source_dir is not None + + # Construct a Requirement object from the generated metadata + if isinstance(parse_version(self.metadata["Version"]), Version): + op = "==" + else: + op = "===" + + self.req = Requirement( + "".join([ + self.metadata["Name"], + op, + self.metadata["Version"], + ]) + ) + + def warn_on_mismatching_name(self): + # type: () -> None + metadata_name = canonicalize_name(self.metadata["Name"]) + if canonicalize_name(self.req.name) == metadata_name: + # Everything is fine. + return + + # If we're here, there's a mismatch. Log a warning about it. + logger.warning( + 'Generating metadata for package %s ' + 'produced metadata for project name %s. Fix your ' + '#egg=%s fragments.', + self.name, metadata_name, self.name + ) + self.req = Requirement(metadata_name) + + def check_if_exists(self, use_user_site): + # type: (bool) -> None + """Find an installed distribution that satisfies or conflicts + with this requirement, and set self.satisfied_by or + self.should_reinstall appropriately. + """ + if self.req is None: + return + existing_dist = get_distribution(self.req.name) + if not existing_dist: + return + + existing_version = existing_dist.parsed_version + if not self.req.specifier.contains(existing_version, prereleases=True): + self.satisfied_by = None + if use_user_site: + if dist_in_usersite(existing_dist): + self.should_reinstall = True + elif (running_under_virtualenv() and + dist_in_site_packages(existing_dist)): + raise InstallationError( + "Will not install to the user site because it will " + "lack sys.path precedence to {} in {}".format( + existing_dist.project_name, existing_dist.location) + ) + else: + self.should_reinstall = True + else: + if self.editable: + self.should_reinstall = True + # when installing editables, nothing pre-existing should ever + # satisfy + self.satisfied_by = None + else: + self.satisfied_by = existing_dist + + # Things valid for wheels + @property + def is_wheel(self): + # type: () -> bool + if not self.link: + return False + return self.link.is_wheel + + # Things valid for sdists + @property + def unpacked_source_directory(self): + # type: () -> str + return os.path.join( + self.source_dir, + self.link and self.link.subdirectory_fragment or '') + + @property + def setup_py_path(self): + # type: () -> str + assert self.source_dir, "No source dir for {}".format(self) + setup_py = os.path.join(self.unpacked_source_directory, 'setup.py') + + # Python2 __file__ should not be unicode + if six.PY2 and isinstance(setup_py, six.text_type): + setup_py = setup_py.encode(sys.getfilesystemencoding()) + + return setup_py + + @property + def pyproject_toml_path(self): + # type: () -> str + assert self.source_dir, "No source dir for {}".format(self) + return make_pyproject_path(self.unpacked_source_directory) + + def load_pyproject_toml(self): + # type: () -> None + """Load the pyproject.toml file. + + After calling this routine, all of the attributes related to PEP 517 + processing for this requirement have been set. In particular, the + use_pep517 attribute can be used to determine whether we should + follow the PEP 517 or legacy (setup.py) code path. + """ + pyproject_toml_data = load_pyproject_toml( + self.use_pep517, + self.pyproject_toml_path, + self.setup_py_path, + str(self) + ) + + if pyproject_toml_data is None: + self.use_pep517 = False + return + + self.use_pep517 = True + requires, backend, check, backend_path = pyproject_toml_data + self.requirements_to_check = check + self.pyproject_requires = requires + self.pep517_backend = Pep517HookCaller( + self.unpacked_source_directory, backend, backend_path=backend_path, + ) + + def _generate_metadata(self): + # type: () -> str + """Invokes metadata generator functions, with the required arguments. + """ + if not self.use_pep517: + assert self.unpacked_source_directory + + return generate_metadata_legacy( + build_env=self.build_env, + setup_py_path=self.setup_py_path, + source_dir=self.unpacked_source_directory, + isolated=self.isolated, + details=self.name or "from {}".format(self.link) + ) + + assert self.pep517_backend is not None + + return generate_metadata( + build_env=self.build_env, + backend=self.pep517_backend, + ) + + def prepare_metadata(self): + # type: () -> None + """Ensure that project metadata is available. + + Under PEP 517, call the backend hook to prepare the metadata. + Under legacy processing, call setup.py egg-info. + """ + assert self.source_dir + + with indent_log(): + self.metadata_directory = self._generate_metadata() + + # Act on the newly generated metadata, based on the name and version. + if not self.name: + self._set_requirement() + else: + self.warn_on_mismatching_name() + + self.assert_source_matches_version() + + @property + def metadata(self): + # type: () -> Any + if not hasattr(self, '_metadata'): + self._metadata = get_metadata(self.get_dist()) + + return self._metadata + + def get_dist(self): + # type: () -> Distribution + return _get_dist(self.metadata_directory) + + def assert_source_matches_version(self): + # type: () -> None + assert self.source_dir + version = self.metadata['version'] + if self.req.specifier and version not in self.req.specifier: + logger.warning( + 'Requested %s, but installing version %s', + self, + version, + ) + else: + logger.debug( + 'Source in %s has version %s, which satisfies requirement %s', + display_path(self.source_dir), + version, + self, + ) + + # For both source distributions and editables + def ensure_has_source_dir( + self, + parent_dir, + autodelete=False, + parallel_builds=False, + ): + # type: (str, bool, bool) -> None + """Ensure that a source_dir is set. + + This will create a temporary build dir if the name of the requirement + isn't known yet. + + :param parent_dir: The ideal pip parent_dir for the source_dir. + Generally src_dir for editables and build_dir for sdists. + :return: self.source_dir + """ + if self.source_dir is None: + self.source_dir = self.ensure_build_location( + parent_dir, + autodelete=autodelete, + parallel_builds=parallel_builds, + ) + + # For editable installations + def update_editable(self, obtain=True): + # type: (bool) -> None + if not self.link: + logger.debug( + "Cannot update repository at %s; repository location is " + "unknown", + self.source_dir, + ) + return + assert self.editable + assert self.source_dir + if self.link.scheme == 'file': + # Static paths don't get updated + return + assert '+' in self.link.url, \ + "bad url: {self.link.url!r}".format(**locals()) + vc_type, url = self.link.url.split('+', 1) + vcs_backend = vcs.get_backend(vc_type) + if vcs_backend: + if not self.link.is_vcs: + reason = ( + "This form of VCS requirement is being deprecated: {}." + ).format( + self.link.url + ) + replacement = None + if self.link.url.startswith("git+git@"): + replacement = ( + "git+https://git@example.com/..., " + "git+ssh://git@example.com/..., " + "or the insecure git+git://git@example.com/..." + ) + deprecated(reason, replacement, gone_in="21.0", issue=7554) + hidden_url = hide_url(self.link.url) + if obtain: + vcs_backend.obtain(self.source_dir, url=hidden_url) + else: + vcs_backend.export(self.source_dir, url=hidden_url) + else: + assert 0, ( + 'Unexpected version control type (in {}): {}'.format( + self.link, vc_type)) + + # Top-level Actions + def uninstall(self, auto_confirm=False, verbose=False): + # type: (bool, bool) -> Optional[UninstallPathSet] + """ + Uninstall the distribution currently satisfying this requirement. + + Prompts before removing or modifying files unless + ``auto_confirm`` is True. + + Refuses to delete or modify files outside of ``sys.prefix`` - + thus uninstallation within a virtual environment can only + modify that virtual environment, even if the virtualenv is + linked to global site-packages. + + """ + assert self.req + dist = get_distribution(self.req.name) + if not dist: + logger.warning("Skipping %s as it is not installed.", self.name) + return None + logger.info('Found existing installation: %s', dist) + + uninstalled_pathset = UninstallPathSet.from_dist(dist) + uninstalled_pathset.remove(auto_confirm, verbose) + return uninstalled_pathset + + def _get_archive_name(self, path, parentdir, rootdir): + # type: (str, str, str) -> str + + def _clean_zip_name(name, prefix): + # type: (str, str) -> str + assert name.startswith(prefix + os.path.sep), ( + "name {name!r} doesn't start with prefix {prefix!r}" + .format(**locals()) + ) + name = name[len(prefix) + 1:] + name = name.replace(os.path.sep, '/') + return name + + path = os.path.join(parentdir, path) + name = _clean_zip_name(path, rootdir) + return self.name + '/' + name + + def archive(self, build_dir): + # type: (str) -> None + """Saves archive to provided build_dir. + + Used for saving downloaded VCS requirements as part of `pip download`. + """ + assert self.source_dir + + create_archive = True + archive_name = '{}-{}.zip'.format(self.name, self.metadata["version"]) + archive_path = os.path.join(build_dir, archive_name) + + if os.path.exists(archive_path): + response = ask_path_exists( + 'The file {} exists. (i)gnore, (w)ipe, ' + '(b)ackup, (a)bort '.format( + display_path(archive_path)), + ('i', 'w', 'b', 'a')) + if response == 'i': + create_archive = False + elif response == 'w': + logger.warning('Deleting %s', display_path(archive_path)) + os.remove(archive_path) + elif response == 'b': + dest_file = backup_dir(archive_path) + logger.warning( + 'Backing up %s to %s', + display_path(archive_path), + display_path(dest_file), + ) + shutil.move(archive_path, dest_file) + elif response == 'a': + sys.exit(-1) + + if not create_archive: + return + + zip_output = zipfile.ZipFile( + archive_path, 'w', zipfile.ZIP_DEFLATED, allowZip64=True, + ) + with zip_output: + dir = os.path.normcase( + os.path.abspath(self.unpacked_source_directory) + ) + for dirpath, dirnames, filenames in os.walk(dir): + for dirname in dirnames: + dir_arcname = self._get_archive_name( + dirname, parentdir=dirpath, rootdir=dir, + ) + zipdir = zipfile.ZipInfo(dir_arcname + '/') + zipdir.external_attr = 0x1ED << 16 # 0o755 + zip_output.writestr(zipdir, '') + for filename in filenames: + file_arcname = self._get_archive_name( + filename, parentdir=dirpath, rootdir=dir, + ) + filename = os.path.join(dirpath, filename) + zip_output.write(filename, file_arcname) + + logger.info('Saved %s', display_path(archive_path)) + + def install( + self, + install_options, # type: List[str] + global_options=None, # type: Optional[Sequence[str]] + root=None, # type: Optional[str] + home=None, # type: Optional[str] + prefix=None, # type: Optional[str] + warn_script_location=True, # type: bool + use_user_site=False, # type: bool + pycompile=True # type: bool + ): + # type: (...) -> None + scheme = get_scheme( + self.name, + user=use_user_site, + home=home, + root=root, + isolated=self.isolated, + prefix=prefix, + ) + + global_options = global_options if global_options is not None else [] + if self.editable: + install_editable_legacy( + install_options, + global_options, + prefix=prefix, + home=home, + use_user_site=use_user_site, + name=self.name, + setup_py_path=self.setup_py_path, + isolated=self.isolated, + build_env=self.build_env, + unpacked_source_directory=self.unpacked_source_directory, + ) + self.install_succeeded = True + return + + if self.is_wheel: + assert self.local_file_path + direct_url = None + if self.original_link: + direct_url = direct_url_from_link( + self.original_link, + self.source_dir, + self.original_link_is_in_wheel_cache, + ) + install_wheel( + self.name, + self.local_file_path, + scheme=scheme, + req_description=str(self.req), + pycompile=pycompile, + warn_script_location=warn_script_location, + direct_url=direct_url, + requested=self.user_supplied, + ) + self.install_succeeded = True + return + + # TODO: Why don't we do this for editable installs? + + # Extend the list of global and install options passed on to + # the setup.py call with the ones from the requirements file. + # Options specified in requirements file override those + # specified on the command line, since the last option given + # to setup.py is the one that is used. + global_options = list(global_options) + self.global_options + install_options = list(install_options) + self.install_options + + try: + success = install_legacy( + install_options=install_options, + global_options=global_options, + root=root, + home=home, + prefix=prefix, + use_user_site=use_user_site, + pycompile=pycompile, + scheme=scheme, + setup_py_path=self.setup_py_path, + isolated=self.isolated, + req_name=self.name, + build_env=self.build_env, + unpacked_source_directory=self.unpacked_source_directory, + req_description=str(self.req), + ) + except LegacyInstallFailure as exc: + self.install_succeeded = False + six.reraise(*exc.parent) + except Exception: + self.install_succeeded = True + raise + + self.install_succeeded = success + + if success and self.legacy_install_reason == 8368: + deprecated( + reason=( + "{} was installed using the legacy 'setup.py install' " + "method, because a wheel could not be built for it.". + format(self.name) + ), + replacement="to fix the wheel build issue reported above", + gone_in="21.0", + issue=8368, + ) + + +def check_invalid_constraint_type(req): + # type: (InstallRequirement) -> str + + # Check for unsupported forms + problem = "" + if not req.name: + problem = "Unnamed requirements are not allowed as constraints" + elif req.link: + problem = "Links are not allowed as constraints" + elif req.extras: + problem = "Constraints cannot have extras" + + if problem: + deprecated( + reason=( + "Constraints are only allowed to take the form of a package " + "name and a version specifier. Other forms were originally " + "permitted as an accident of the implementation, but were " + "undocumented. The new implementation of the resolver no " + "longer supports these forms." + ), + replacement=( + "replacing the constraint with a requirement." + ), + # No plan yet for when the new resolver becomes default + gone_in=None, + issue=8210 + ) + + return problem diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_install.pyc b/venv/lib/python2.7/site-packages/pip/_internal/req/req_install.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c40448ade070e6a38800f4ec7c180529fccb31f1 GIT binary patch literal 25686 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 N#t!WHiPO*a{|~mIN#y_l literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_set.py b/venv/lib/python2.7/site-packages/pip/_internal/req/req_set.py new file mode 100644 index 0000000..ab4b6f8 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/req/req_set.py @@ -0,0 +1,203 @@ +from __future__ import absolute_import + +import logging +from collections import OrderedDict + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.exceptions import InstallationError +from pip._internal.models.wheel import Wheel +from pip._internal.utils import compatibility_tags +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Dict, Iterable, List, Optional, Tuple + from pip._internal.req.req_install import InstallRequirement + + +logger = logging.getLogger(__name__) + + +class RequirementSet(object): + + def __init__(self, check_supported_wheels=True): + # type: (bool) -> None + """Create a RequirementSet. + """ + + self.requirements = OrderedDict() # type: Dict[str, InstallRequirement] # noqa: E501 + self.check_supported_wheels = check_supported_wheels + + self.unnamed_requirements = [] # type: List[InstallRequirement] + + def __str__(self): + # type: () -> str + requirements = sorted( + (req for req in self.requirements.values() if not req.comes_from), + key=lambda req: canonicalize_name(req.name), + ) + return ' '.join(str(req.req) for req in requirements) + + def __repr__(self): + # type: () -> str + requirements = sorted( + self.requirements.values(), + key=lambda req: canonicalize_name(req.name), + ) + + format_string = '<{classname} object; {count} requirement(s): {reqs}>' + return format_string.format( + classname=self.__class__.__name__, + count=len(requirements), + reqs=', '.join(str(req.req) for req in requirements), + ) + + def add_unnamed_requirement(self, install_req): + # type: (InstallRequirement) -> None + assert not install_req.name + self.unnamed_requirements.append(install_req) + + def add_named_requirement(self, install_req): + # type: (InstallRequirement) -> None + assert install_req.name + + project_name = canonicalize_name(install_req.name) + self.requirements[project_name] = install_req + + def add_requirement( + self, + install_req, # type: InstallRequirement + parent_req_name=None, # type: Optional[str] + extras_requested=None # type: Optional[Iterable[str]] + ): + # type: (...) -> Tuple[List[InstallRequirement], Optional[InstallRequirement]] # noqa: E501 + """Add install_req as a requirement to install. + + :param parent_req_name: The name of the requirement that needed this + added. The name is used because when multiple unnamed requirements + resolve to the same name, we could otherwise end up with dependency + links that point outside the Requirements set. parent_req must + already be added. Note that None implies that this is a user + supplied requirement, vs an inferred one. + :param extras_requested: an iterable of extras used to evaluate the + environment markers. + :return: Additional requirements to scan. That is either [] if + the requirement is not applicable, or [install_req] if the + requirement is applicable and has just been added. + """ + # If the markers do not match, ignore this requirement. + if not install_req.match_markers(extras_requested): + logger.info( + "Ignoring %s: markers '%s' don't match your environment", + install_req.name, install_req.markers, + ) + return [], None + + # If the wheel is not supported, raise an error. + # Should check this after filtering out based on environment markers to + # allow specifying different wheels based on the environment/OS, in a + # single requirements file. + if install_req.link and install_req.link.is_wheel: + wheel = Wheel(install_req.link.filename) + tags = compatibility_tags.get_supported() + if (self.check_supported_wheels and not wheel.supported(tags)): + raise InstallationError( + "{} is not a supported wheel on this platform.".format( + wheel.filename) + ) + + # This next bit is really a sanity check. + assert not install_req.user_supplied or parent_req_name is None, ( + "a user supplied req shouldn't have a parent" + ) + + # Unnamed requirements are scanned again and the requirement won't be + # added as a dependency until after scanning. + if not install_req.name: + self.add_unnamed_requirement(install_req) + return [install_req], None + + try: + existing_req = self.get_requirement( + install_req.name) # type: Optional[InstallRequirement] + except KeyError: + existing_req = None + + has_conflicting_requirement = ( + parent_req_name is None and + existing_req and + not existing_req.constraint and + existing_req.extras == install_req.extras and + existing_req.req.specifier != install_req.req.specifier + ) + if has_conflicting_requirement: + raise InstallationError( + "Double requirement given: {} (already in {}, name={!r})" + .format(install_req, existing_req, install_req.name) + ) + + # When no existing requirement exists, add the requirement as a + # dependency and it will be scanned again after. + if not existing_req: + self.add_named_requirement(install_req) + # We'd want to rescan this requirement later + return [install_req], install_req + + # Assume there's no need to scan, and that we've already + # encountered this for scanning. + if install_req.constraint or not existing_req.constraint: + return [], existing_req + + does_not_satisfy_constraint = ( + install_req.link and + not ( + existing_req.link and + install_req.link.path == existing_req.link.path + ) + ) + if does_not_satisfy_constraint: + raise InstallationError( + "Could not satisfy constraints for '{}': " + "installation from path or url cannot be " + "constrained to a version".format(install_req.name) + ) + # If we're now installing a constraint, mark the existing + # object for real installation. + existing_req.constraint = False + # If we're now installing a user supplied requirement, + # mark the existing object as such. + if install_req.user_supplied: + existing_req.user_supplied = True + existing_req.extras = tuple(sorted( + set(existing_req.extras) | set(install_req.extras) + )) + logger.debug( + "Setting %s extras to: %s", + existing_req, existing_req.extras, + ) + # Return the existing requirement for addition to the parent and + # scanning again. + return [existing_req], existing_req + + def has_requirement(self, name): + # type: (str) -> bool + project_name = canonicalize_name(name) + + return ( + project_name in self.requirements and + not self.requirements[project_name].constraint + ) + + def get_requirement(self, name): + # type: (str) -> InstallRequirement + project_name = canonicalize_name(name) + + if project_name in self.requirements: + return self.requirements[project_name] + + raise KeyError("No project with the name {name!r}".format(**locals())) + + @property + def all_requirements(self): + # type: () -> List[InstallRequirement] + return self.unnamed_requirements + list(self.requirements.values()) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_set.pyc b/venv/lib/python2.7/site-packages/pip/_internal/req/req_set.pyc new file mode 100644 index 0000000000000000000000000000000000000000..957476a63e80701e1ba39fa962a6ba666809b7dc GIT binary patch literal 6923 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 ItIO4Y1IX4hxBvhE literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.py b/venv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.py new file mode 100644 index 0000000..13fb245 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.py @@ -0,0 +1,150 @@ +from __future__ import absolute_import + +import contextlib +import errno +import hashlib +import logging +import os + +from pip._vendor import contextlib2 + +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from types import TracebackType + from typing import Dict, Iterator, Optional, Set, Type, Union + from pip._internal.req.req_install import InstallRequirement + from pip._internal.models.link import Link + +logger = logging.getLogger(__name__) + + +@contextlib.contextmanager +def update_env_context_manager(**changes): + # type: (str) -> Iterator[None] + target = os.environ + + # Save values from the target and change them. + non_existent_marker = object() + saved_values = {} # type: Dict[str, Union[object, str]] + for name, new_value in changes.items(): + try: + saved_values[name] = target[name] + except KeyError: + saved_values[name] = non_existent_marker + target[name] = new_value + + try: + yield + finally: + # Restore original values in the target. + for name, original_value in saved_values.items(): + if original_value is non_existent_marker: + del target[name] + else: + assert isinstance(original_value, str) # for mypy + target[name] = original_value + + +@contextlib.contextmanager +def get_requirement_tracker(): + # type: () -> Iterator[RequirementTracker] + root = os.environ.get('PIP_REQ_TRACKER') + with contextlib2.ExitStack() as ctx: + if root is None: + root = ctx.enter_context( + TempDirectory(kind='req-tracker') + ).path + ctx.enter_context(update_env_context_manager(PIP_REQ_TRACKER=root)) + logger.debug("Initialized build tracking at %s", root) + + with RequirementTracker(root) as tracker: + yield tracker + + +class RequirementTracker(object): + + def __init__(self, root): + # type: (str) -> None + self._root = root + self._entries = set() # type: Set[InstallRequirement] + logger.debug("Created build tracker: %s", self._root) + + def __enter__(self): + # type: () -> RequirementTracker + logger.debug("Entered build tracker: %s", self._root) + return self + + def __exit__( + self, + exc_type, # type: Optional[Type[BaseException]] + exc_val, # type: Optional[BaseException] + exc_tb # type: Optional[TracebackType] + ): + # type: (...) -> None + self.cleanup() + + def _entry_path(self, link): + # type: (Link) -> str + hashed = hashlib.sha224(link.url_without_fragment.encode()).hexdigest() + return os.path.join(self._root, hashed) + + def add(self, req): + # type: (InstallRequirement) -> None + """Add an InstallRequirement to build tracking. + """ + + assert req.link + # Get the file to write information about this requirement. + entry_path = self._entry_path(req.link) + + # Try reading from the file. If it exists and can be read from, a build + # is already in progress, so a LookupError is raised. + try: + with open(entry_path) as fp: + contents = fp.read() + except IOError as e: + # if the error is anything other than "file does not exist", raise. + if e.errno != errno.ENOENT: + raise + else: + message = '{} is already being built: {}'.format( + req.link, contents) + raise LookupError(message) + + # If we're here, req should really not be building already. + assert req not in self._entries + + # Start tracking this requirement. + with open(entry_path, 'w') as fp: + fp.write(str(req)) + self._entries.add(req) + + logger.debug('Added %s to build tracker %r', req, self._root) + + def remove(self, req): + # type: (InstallRequirement) -> None + """Remove an InstallRequirement from build tracking. + """ + + assert req.link + # Delete the created file and the corresponding entries. + os.unlink(self._entry_path(req.link)) + self._entries.remove(req) + + logger.debug('Removed %s from build tracker %r', req, self._root) + + def cleanup(self): + # type: () -> None + for req in set(self._entries): + self.remove(req) + + logger.debug("Removed build tracker: %r", self._root) + + @contextlib.contextmanager + def track(self, req): + # type: (InstallRequirement) -> Iterator[None] + self.add(req) + yield + self.remove(req) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.pyc b/venv/lib/python2.7/site-packages/pip/_internal/req/req_tracker.pyc new file mode 100644 index 0000000000000000000000000000000000000000..26c3fdc49561526d73113354eb883aa4374fc36a GIT binary patch literal 5127 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.py b/venv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.py new file mode 100644 index 0000000..69719d3 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.py @@ -0,0 +1,648 @@ +from __future__ import absolute_import + +import csv +import functools +import logging +import os +import sys +import sysconfig + +from pip._vendor import pkg_resources + +from pip._internal.exceptions import UninstallationError +from pip._internal.locations import bin_py, bin_user +from pip._internal.utils.compat import WINDOWS, cache_from_source, uses_pycache +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + FakeFile, + ask, + dist_in_usersite, + dist_is_local, + egg_link_path, + is_local, + normalize_path, + renames, + rmtree, +) +from pip._internal.utils.temp_dir import AdjacentTempDirectory, TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Callable, Dict, Iterable, Iterator, List, Optional, Set, Tuple, + ) + from pip._vendor.pkg_resources import Distribution + +logger = logging.getLogger(__name__) + + +def _script_names(dist, script_name, is_gui): + # type: (Distribution, str, bool) -> List[str] + """Create the fully qualified name of the files created by + {console,gui}_scripts for the given ``dist``. + Returns the list of file names + """ + if dist_in_usersite(dist): + bin_dir = bin_user + else: + bin_dir = bin_py + exe_name = os.path.join(bin_dir, script_name) + paths_to_remove = [exe_name] + if WINDOWS: + paths_to_remove.append(exe_name + '.exe') + paths_to_remove.append(exe_name + '.exe.manifest') + if is_gui: + paths_to_remove.append(exe_name + '-script.pyw') + else: + paths_to_remove.append(exe_name + '-script.py') + return paths_to_remove + + +def _unique(fn): + # type: (Callable[..., Iterator[Any]]) -> Callable[..., Iterator[Any]] + @functools.wraps(fn) + def unique(*args, **kw): + # type: (Any, Any) -> Iterator[Any] + seen = set() # type: Set[Any] + for item in fn(*args, **kw): + if item not in seen: + seen.add(item) + yield item + return unique + + +@_unique +def uninstallation_paths(dist): + # type: (Distribution) -> Iterator[str] + """ + Yield all the uninstallation paths for dist based on RECORD-without-.py[co] + + Yield paths to all the files in RECORD. For each .py file in RECORD, add + the .pyc and .pyo in the same directory. + + UninstallPathSet.add() takes care of the __pycache__ .py[co]. + """ + r = csv.reader(FakeFile(dist.get_metadata_lines('RECORD'))) + for row in r: + path = os.path.join(dist.location, row[0]) + yield path + if path.endswith('.py'): + dn, fn = os.path.split(path) + base = fn[:-3] + path = os.path.join(dn, base + '.pyc') + yield path + path = os.path.join(dn, base + '.pyo') + yield path + + +def compact(paths): + # type: (Iterable[str]) -> Set[str] + """Compact a path set to contain the minimal number of paths + necessary to contain all paths in the set. If /a/path/ and + /a/path/to/a/file.txt are both in the set, leave only the + shorter path.""" + + sep = os.path.sep + short_paths = set() # type: Set[str] + for path in sorted(paths, key=len): + should_skip = any( + path.startswith(shortpath.rstrip("*")) and + path[len(shortpath.rstrip("*").rstrip(sep))] == sep + for shortpath in short_paths + ) + if not should_skip: + short_paths.add(path) + return short_paths + + +def compress_for_rename(paths): + # type: (Iterable[str]) -> Set[str] + """Returns a set containing the paths that need to be renamed. + + This set may include directories when the original sequence of paths + included every file on disk. + """ + case_map = dict((os.path.normcase(p), p) for p in paths) + remaining = set(case_map) + unchecked = sorted(set(os.path.split(p)[0] + for p in case_map.values()), key=len) + wildcards = set() # type: Set[str] + + def norm_join(*a): + # type: (str) -> str + return os.path.normcase(os.path.join(*a)) + + for root in unchecked: + if any(os.path.normcase(root).startswith(w) + for w in wildcards): + # This directory has already been handled. + continue + + all_files = set() # type: Set[str] + all_subdirs = set() # type: Set[str] + for dirname, subdirs, files in os.walk(root): + all_subdirs.update(norm_join(root, dirname, d) + for d in subdirs) + all_files.update(norm_join(root, dirname, f) + for f in files) + # If all the files we found are in our remaining set of files to + # remove, then remove them from the latter set and add a wildcard + # for the directory. + if not (all_files - remaining): + remaining.difference_update(all_files) + wildcards.add(root + os.sep) + + return set(map(case_map.__getitem__, remaining)) | wildcards + + +def compress_for_output_listing(paths): + # type: (Iterable[str]) -> Tuple[Set[str], Set[str]] + """Returns a tuple of 2 sets of which paths to display to user + + The first set contains paths that would be deleted. Files of a package + are not added and the top-level directory of the package has a '*' added + at the end - to signify that all it's contents are removed. + + The second set contains files that would have been skipped in the above + folders. + """ + + will_remove = set(paths) + will_skip = set() + + # Determine folders and files + folders = set() + files = set() + for path in will_remove: + if path.endswith(".pyc"): + continue + if path.endswith("__init__.py") or ".dist-info" in path: + folders.add(os.path.dirname(path)) + files.add(path) + + # probably this one https://github.com/python/mypy/issues/390 + _normcased_files = set(map(os.path.normcase, files)) # type: ignore + + folders = compact(folders) + + # This walks the tree using os.walk to not miss extra folders + # that might get added. + for folder in folders: + for dirpath, _, dirfiles in os.walk(folder): + for fname in dirfiles: + if fname.endswith(".pyc"): + continue + + file_ = os.path.join(dirpath, fname) + if (os.path.isfile(file_) and + os.path.normcase(file_) not in _normcased_files): + # We are skipping this file. Add it to the set. + will_skip.add(file_) + + will_remove = files | { + os.path.join(folder, "*") for folder in folders + } + + return will_remove, will_skip + + +class StashedUninstallPathSet(object): + """A set of file rename operations to stash files while + tentatively uninstalling them.""" + def __init__(self): + # type: () -> None + # Mapping from source file root to [Adjacent]TempDirectory + # for files under that directory. + self._save_dirs = {} # type: Dict[str, TempDirectory] + # (old path, new path) tuples for each move that may need + # to be undone. + self._moves = [] # type: List[Tuple[str, str]] + + def _get_directory_stash(self, path): + # type: (str) -> str + """Stashes a directory. + + Directories are stashed adjacent to their original location if + possible, or else moved/copied into the user's temp dir.""" + + try: + save_dir = AdjacentTempDirectory(path) # type: TempDirectory + except OSError: + save_dir = TempDirectory(kind="uninstall") + self._save_dirs[os.path.normcase(path)] = save_dir + + return save_dir.path + + def _get_file_stash(self, path): + # type: (str) -> str + """Stashes a file. + + If no root has been provided, one will be created for the directory + in the user's temp directory.""" + path = os.path.normcase(path) + head, old_head = os.path.dirname(path), None + save_dir = None + + while head != old_head: + try: + save_dir = self._save_dirs[head] + break + except KeyError: + pass + head, old_head = os.path.dirname(head), head + else: + # Did not find any suitable root + head = os.path.dirname(path) + save_dir = TempDirectory(kind='uninstall') + self._save_dirs[head] = save_dir + + relpath = os.path.relpath(path, head) + if relpath and relpath != os.path.curdir: + return os.path.join(save_dir.path, relpath) + return save_dir.path + + def stash(self, path): + # type: (str) -> str + """Stashes the directory or file and returns its new location. + Handle symlinks as files to avoid modifying the symlink targets. + """ + path_is_dir = os.path.isdir(path) and not os.path.islink(path) + if path_is_dir: + new_path = self._get_directory_stash(path) + else: + new_path = self._get_file_stash(path) + + self._moves.append((path, new_path)) + if (path_is_dir and os.path.isdir(new_path)): + # If we're moving a directory, we need to + # remove the destination first or else it will be + # moved to inside the existing directory. + # We just created new_path ourselves, so it will + # be removable. + os.rmdir(new_path) + renames(path, new_path) + return new_path + + def commit(self): + # type: () -> None + """Commits the uninstall by removing stashed files.""" + for _, save_dir in self._save_dirs.items(): + save_dir.cleanup() + self._moves = [] + self._save_dirs = {} + + def rollback(self): + # type: () -> None + """Undoes the uninstall by moving stashed files back.""" + for p in self._moves: + logger.info("Moving to %s\n from %s", *p) + + for new_path, path in self._moves: + try: + logger.debug('Replacing %s from %s', new_path, path) + if os.path.isfile(new_path) or os.path.islink(new_path): + os.unlink(new_path) + elif os.path.isdir(new_path): + rmtree(new_path) + renames(path, new_path) + except OSError as ex: + logger.error("Failed to restore %s", new_path) + logger.debug("Exception: %s", ex) + + self.commit() + + @property + def can_rollback(self): + # type: () -> bool + return bool(self._moves) + + +class UninstallPathSet(object): + """A set of file paths to be removed in the uninstallation of a + requirement.""" + def __init__(self, dist): + # type: (Distribution) -> None + self.paths = set() # type: Set[str] + self._refuse = set() # type: Set[str] + self.pth = {} # type: Dict[str, UninstallPthEntries] + self.dist = dist + self._moved_paths = StashedUninstallPathSet() + + def _permitted(self, path): + # type: (str) -> bool + """ + Return True if the given path is one we are permitted to + remove/modify, False otherwise. + + """ + return is_local(path) + + def add(self, path): + # type: (str) -> None + head, tail = os.path.split(path) + + # we normalize the head to resolve parent directory symlinks, but not + # the tail, since we only want to uninstall symlinks, not their targets + path = os.path.join(normalize_path(head), os.path.normcase(tail)) + + if not os.path.exists(path): + return + if self._permitted(path): + self.paths.add(path) + else: + self._refuse.add(path) + + # __pycache__ files can show up after 'installed-files.txt' is created, + # due to imports + if os.path.splitext(path)[1] == '.py' and uses_pycache: + self.add(cache_from_source(path)) + + def add_pth(self, pth_file, entry): + # type: (str, str) -> None + pth_file = normalize_path(pth_file) + if self._permitted(pth_file): + if pth_file not in self.pth: + self.pth[pth_file] = UninstallPthEntries(pth_file) + self.pth[pth_file].add(entry) + else: + self._refuse.add(pth_file) + + def remove(self, auto_confirm=False, verbose=False): + # type: (bool, bool) -> None + """Remove paths in ``self.paths`` with confirmation (unless + ``auto_confirm`` is True).""" + + if not self.paths: + logger.info( + "Can't uninstall '%s'. No files were found to uninstall.", + self.dist.project_name, + ) + return + + dist_name_version = ( + self.dist.project_name + "-" + self.dist.version + ) + logger.info('Uninstalling %s:', dist_name_version) + + with indent_log(): + if auto_confirm or self._allowed_to_proceed(verbose): + moved = self._moved_paths + + for_rename = compress_for_rename(self.paths) + + for path in sorted(compact(for_rename)): + moved.stash(path) + logger.debug('Removing file or directory %s', path) + + for pth in self.pth.values(): + pth.remove() + + logger.info('Successfully uninstalled %s', dist_name_version) + + def _allowed_to_proceed(self, verbose): + # type: (bool) -> bool + """Display which files would be deleted and prompt for confirmation + """ + + def _display(msg, paths): + # type: (str, Iterable[str]) -> None + if not paths: + return + + logger.info(msg) + with indent_log(): + for path in sorted(compact(paths)): + logger.info(path) + + if not verbose: + will_remove, will_skip = compress_for_output_listing(self.paths) + else: + # In verbose mode, display all the files that are going to be + # deleted. + will_remove = set(self.paths) + will_skip = set() + + _display('Would remove:', will_remove) + _display('Would not remove (might be manually added):', will_skip) + _display('Would not remove (outside of prefix):', self._refuse) + if verbose: + _display('Will actually move:', compress_for_rename(self.paths)) + + return ask('Proceed (y/n)? ', ('y', 'n')) == 'y' + + def rollback(self): + # type: () -> None + """Rollback the changes previously made by remove().""" + if not self._moved_paths.can_rollback: + logger.error( + "Can't roll back %s; was not uninstalled", + self.dist.project_name, + ) + return + logger.info('Rolling back uninstall of %s', self.dist.project_name) + self._moved_paths.rollback() + for pth in self.pth.values(): + pth.rollback() + + def commit(self): + # type: () -> None + """Remove temporary save dir: rollback will no longer be possible.""" + self._moved_paths.commit() + + @classmethod + def from_dist(cls, dist): + # type: (Distribution) -> UninstallPathSet + dist_path = normalize_path(dist.location) + if not dist_is_local(dist): + logger.info( + "Not uninstalling %s at %s, outside environment %s", + dist.key, + dist_path, + sys.prefix, + ) + return cls(dist) + + if dist_path in {p for p in {sysconfig.get_path("stdlib"), + sysconfig.get_path("platstdlib")} + if p}: + logger.info( + "Not uninstalling %s at %s, as it is in the standard library.", + dist.key, + dist_path, + ) + return cls(dist) + + paths_to_remove = cls(dist) + develop_egg_link = egg_link_path(dist) + develop_egg_link_egg_info = '{}.egg-info'.format( + pkg_resources.to_filename(dist.project_name)) + egg_info_exists = dist.egg_info and os.path.exists(dist.egg_info) + # Special case for distutils installed package + distutils_egg_info = getattr(dist._provider, 'path', None) + + # Uninstall cases order do matter as in the case of 2 installs of the + # same package, pip needs to uninstall the currently detected version + if (egg_info_exists and dist.egg_info.endswith('.egg-info') and + not dist.egg_info.endswith(develop_egg_link_egg_info)): + # if dist.egg_info.endswith(develop_egg_link_egg_info), we + # are in fact in the develop_egg_link case + paths_to_remove.add(dist.egg_info) + if dist.has_metadata('installed-files.txt'): + for installed_file in dist.get_metadata( + 'installed-files.txt').splitlines(): + path = os.path.normpath( + os.path.join(dist.egg_info, installed_file) + ) + paths_to_remove.add(path) + # FIXME: need a test for this elif block + # occurs with --single-version-externally-managed/--record outside + # of pip + elif dist.has_metadata('top_level.txt'): + if dist.has_metadata('namespace_packages.txt'): + namespaces = dist.get_metadata('namespace_packages.txt') + else: + namespaces = [] + for top_level_pkg in [ + p for p + in dist.get_metadata('top_level.txt').splitlines() + if p and p not in namespaces]: + path = os.path.join(dist.location, top_level_pkg) + paths_to_remove.add(path) + paths_to_remove.add(path + '.py') + paths_to_remove.add(path + '.pyc') + paths_to_remove.add(path + '.pyo') + + elif distutils_egg_info: + raise UninstallationError( + "Cannot uninstall {!r}. It is a distutils installed project " + "and thus we cannot accurately determine which files belong " + "to it which would lead to only a partial uninstall.".format( + dist.project_name, + ) + ) + + elif dist.location.endswith('.egg'): + # package installed by easy_install + # We cannot match on dist.egg_name because it can slightly vary + # i.e. setuptools-0.6c11-py2.6.egg vs setuptools-0.6rc11-py2.6.egg + paths_to_remove.add(dist.location) + easy_install_egg = os.path.split(dist.location)[1] + easy_install_pth = os.path.join(os.path.dirname(dist.location), + 'easy-install.pth') + paths_to_remove.add_pth(easy_install_pth, './' + easy_install_egg) + + elif egg_info_exists and dist.egg_info.endswith('.dist-info'): + for path in uninstallation_paths(dist): + paths_to_remove.add(path) + + elif develop_egg_link: + # develop egg + with open(develop_egg_link, 'r') as fh: + link_pointer = os.path.normcase(fh.readline().strip()) + assert (link_pointer == dist.location), ( + 'Egg-link {} does not match installed location of {} ' + '(at {})'.format( + link_pointer, dist.project_name, dist.location) + ) + paths_to_remove.add(develop_egg_link) + easy_install_pth = os.path.join(os.path.dirname(develop_egg_link), + 'easy-install.pth') + paths_to_remove.add_pth(easy_install_pth, dist.location) + + else: + logger.debug( + 'Not sure how to uninstall: %s - Check: %s', + dist, dist.location, + ) + + # find distutils scripts= scripts + if dist.has_metadata('scripts') and dist.metadata_isdir('scripts'): + for script in dist.metadata_listdir('scripts'): + if dist_in_usersite(dist): + bin_dir = bin_user + else: + bin_dir = bin_py + paths_to_remove.add(os.path.join(bin_dir, script)) + if WINDOWS: + paths_to_remove.add(os.path.join(bin_dir, script) + '.bat') + + # find console_scripts + _scripts_to_remove = [] + console_scripts = dist.get_entry_map(group='console_scripts') + for name in console_scripts.keys(): + _scripts_to_remove.extend(_script_names(dist, name, False)) + # find gui_scripts + gui_scripts = dist.get_entry_map(group='gui_scripts') + for name in gui_scripts.keys(): + _scripts_to_remove.extend(_script_names(dist, name, True)) + + for s in _scripts_to_remove: + paths_to_remove.add(s) + + return paths_to_remove + + +class UninstallPthEntries(object): + def __init__(self, pth_file): + # type: (str) -> None + self.file = pth_file + self.entries = set() # type: Set[str] + self._saved_lines = None # type: Optional[List[bytes]] + + def add(self, entry): + # type: (str) -> None + entry = os.path.normcase(entry) + # On Windows, os.path.normcase converts the entry to use + # backslashes. This is correct for entries that describe absolute + # paths outside of site-packages, but all the others use forward + # slashes. + # os.path.splitdrive is used instead of os.path.isabs because isabs + # treats non-absolute paths with drive letter markings like c:foo\bar + # as absolute paths. It also does not recognize UNC paths if they don't + # have more than "\\sever\share". Valid examples: "\\server\share\" or + # "\\server\share\folder". Python 2.7.8+ support UNC in splitdrive. + if WINDOWS and not os.path.splitdrive(entry)[0]: + entry = entry.replace('\\', '/') + self.entries.add(entry) + + def remove(self): + # type: () -> None + logger.debug('Removing pth entries from %s:', self.file) + + # If the file doesn't exist, log a warning and return + if not os.path.isfile(self.file): + logger.warning( + "Cannot remove entries from nonexistent file %s", self.file + ) + return + with open(self.file, 'rb') as fh: + # windows uses '\r\n' with py3k, but uses '\n' with py2.x + lines = fh.readlines() + self._saved_lines = lines + if any(b'\r\n' in line for line in lines): + endline = '\r\n' + else: + endline = '\n' + # handle missing trailing newline + if lines and not lines[-1].endswith(endline.encode("utf-8")): + lines[-1] = lines[-1] + endline.encode("utf-8") + for entry in self.entries: + try: + logger.debug('Removing entry: %s', entry) + lines.remove((entry + endline).encode("utf-8")) + except ValueError: + pass + with open(self.file, 'wb') as fh: + fh.writelines(lines) + + def rollback(self): + # type: () -> bool + if self._saved_lines is None: + logger.error( + 'Cannot roll back changes to %s, none were made', self.file + ) + return False + logger.debug('Rolling %s back to previous state', self.file) + with open(self.file, 'wb') as fh: + fh.writelines(self._saved_lines) + return True diff --git a/venv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.pyc b/venv/lib/python2.7/site-packages/pip/_internal/req/req_uninstall.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72ff44e9fc0d614a2c94d52687d9fc10ec795408 GIT binary patch literal 21550 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%0A@i7#HU*jwFhGmD^p#9%1K^JSI2>;uQnX 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolution/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/resolution/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolution/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/resolution/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..829f1c4554e9ff4cc1b7e3992b07e579a5a227c5 GIT binary patch literal 151 zcmZSn%*%DVb8CDu0~9aQ(bd5Z-s?2ghLSP)9nOBlpl$V&JUzA#$pHo_rnV+X04;0NTiI3MSs4U?C8e)^1 PpHiBWY6r5a1c(^`>-!@z literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolution/base.py b/venv/lib/python2.7/site-packages/pip/_internal/resolution/base.py new file mode 100644 index 0000000..2fa118b --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/resolution/base.py @@ -0,0 +1,20 @@ +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Callable, List + from pip._internal.req.req_install import InstallRequirement + from pip._internal.req.req_set import RequirementSet + + InstallRequirementProvider = Callable[ + [str, InstallRequirement], InstallRequirement + ] + + +class BaseResolver(object): + def resolve(self, root_reqs, check_supported_wheels): + # type: (List[InstallRequirement], bool) -> RequirementSet + raise NotImplementedError() + + def get_installation_order(self, req_set): + # type: (RequirementSet) -> List[InstallRequirement] + raise NotImplementedError() diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolution/base.pyc b/venv/lib/python2.7/site-packages/pip/_internal/resolution/base.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c96cf771b1633ba71a560e3b8c8e51687a536a66 GIT binary patch literal 1202 zcmb_b&2G~`5T3OYCoL_CK&n(E?!GjUIB=>EYE(f4MAb$d;>#+Hr>)ESC%cnW<$?rU zcp#pJ$KU~AW)oTvLgG-%Gv4`Iee=yY{=U2Y?aNm)hs_i7_c@FIz$)igfdwcPWC|22 za2UK1*a*rPvKY!1WGzsV8-r~_nLw7T?H1S$lwHWWTpI&!0VZ%Bi9U;9Kih_itJ;9~ z;7mcDz-NF@0Ml#-@(xVWE@LQu@RKS&(F0a*rYBP~e0e;4W%S$ecr<>IMiP_M;mq3E zsYPnB@w)JITQ;gZaa7}CSvV}Q+Qja2=5Njk678_-Xy#F)uk8xm4K;${h{Zo*g&>S@ z(+oL_geEz}peF&(TzC|bq9KdlWksRAkD+c7z>U`sA98S9)2M800EhXpbG1w5hR}^i zdq!Jqxwt@#Dc-xC!85*(Q@79&V}(v zcL`MpIY;7l!mMY~hpAnTP8Mf_JeA!D+hR;LE72I*W{)vtoi8n$T1+iVaEtA3xYTXF zRMx-?hD2?(#%b6J*(V-G|7H+xfb&2F{?idc{BPfzc|og zf%gBI#uLzi5Xtl8NTB@vubjAgRWOeMMSXgSa|+GeHA7)8hwDi^lQzBVTrW!0p6aPy I6sx_~Pw1f+Z2$lO literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolution/legacy/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/resolution/legacy/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolution/legacy/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/resolution/legacy/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0960abe398571d6347dd427af8d6fa5f42832f10 GIT binary patch literal 158 zcmZSn%*%DVb8CDu0~9aQ(bd5Z-s?2ghLSP)9nOBlpl$V&JUzA#$pHo_rnV+YhlbW8GT&W)ql*}xNkJl@x WEa3o}Ws{qqQks)$2ePpQh#3G4-6h=s literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolution/legacy/resolver.py b/venv/lib/python2.7/site-packages/pip/_internal/resolution/legacy/resolver.py new file mode 100644 index 0000000..c9b4c66 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/resolution/legacy/resolver.py @@ -0,0 +1,485 @@ +"""Dependency Resolution + +The dependency resolution in pip is performed as follows: + +for top-level requirements: + a. only one spec allowed per project, regardless of conflicts or not. + otherwise a "double requirement" exception is raised + b. they override sub-dependency requirements. +for sub-dependencies + a. "first found, wins" (where the order is breadth first) +""" + +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False +# mypy: disallow-untyped-defs=False + +import logging +import sys +from collections import defaultdict +from itertools import chain + +from pip._vendor.packaging import specifiers + +from pip._internal.exceptions import ( + BestVersionAlreadyInstalled, + DistributionNotFound, + HashError, + HashErrors, + UnsupportedPythonVersion, +) +from pip._internal.req.req_install import check_invalid_constraint_type +from pip._internal.req.req_set import RequirementSet +from pip._internal.resolution.base import BaseResolver +from pip._internal.utils.compatibility_tags import get_supported +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import dist_in_usersite, normalize_version_info +from pip._internal.utils.packaging import ( + check_requires_python, + get_requires_python, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import DefaultDict, List, Optional, Set, Tuple + from pip._vendor import pkg_resources + + from pip._internal.cache import WheelCache + from pip._internal.distributions import AbstractDistribution + from pip._internal.index.package_finder import PackageFinder + from pip._internal.models.link import Link + from pip._internal.operations.prepare import RequirementPreparer + from pip._internal.req.req_install import InstallRequirement + from pip._internal.resolution.base import InstallRequirementProvider + + DiscoveredDependencies = DefaultDict[str, List[InstallRequirement]] + +logger = logging.getLogger(__name__) + + +def _check_dist_requires_python( + dist, # type: pkg_resources.Distribution + version_info, # type: Tuple[int, int, int] + ignore_requires_python=False, # type: bool +): + # type: (...) -> None + """ + Check whether the given Python version is compatible with a distribution's + "Requires-Python" value. + + :param version_info: A 3-tuple of ints representing the Python + major-minor-micro version to check. + :param ignore_requires_python: Whether to ignore the "Requires-Python" + value if the given Python version isn't compatible. + + :raises UnsupportedPythonVersion: When the given Python version isn't + compatible. + """ + requires_python = get_requires_python(dist) + try: + is_compatible = check_requires_python( + requires_python, version_info=version_info, + ) + except specifiers.InvalidSpecifier as exc: + logger.warning( + "Package %r has an invalid Requires-Python: %s", + dist.project_name, exc, + ) + return + + if is_compatible: + return + + version = '.'.join(map(str, version_info)) + if ignore_requires_python: + logger.debug( + 'Ignoring failed Requires-Python check for package %r: ' + '%s not in %r', + dist.project_name, version, requires_python, + ) + return + + raise UnsupportedPythonVersion( + 'Package {!r} requires a different Python: {} not in {!r}'.format( + dist.project_name, version, requires_python, + )) + + +class Resolver(BaseResolver): + """Resolves which packages need to be installed/uninstalled to perform \ + the requested operation without breaking the requirements of any package. + """ + + _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"} + + def __init__( + self, + preparer, # type: RequirementPreparer + finder, # type: PackageFinder + wheel_cache, # type: Optional[WheelCache] + make_install_req, # type: InstallRequirementProvider + use_user_site, # type: bool + ignore_dependencies, # type: bool + ignore_installed, # type: bool + ignore_requires_python, # type: bool + force_reinstall, # type: bool + upgrade_strategy, # type: str + py_version_info=None, # type: Optional[Tuple[int, ...]] + ): + # type: (...) -> None + super(Resolver, self).__init__() + assert upgrade_strategy in self._allowed_strategies + + if py_version_info is None: + py_version_info = sys.version_info[:3] + else: + py_version_info = normalize_version_info(py_version_info) + + self._py_version_info = py_version_info + + self.preparer = preparer + self.finder = finder + self.wheel_cache = wheel_cache + + self.upgrade_strategy = upgrade_strategy + self.force_reinstall = force_reinstall + self.ignore_dependencies = ignore_dependencies + self.ignore_installed = ignore_installed + self.ignore_requires_python = ignore_requires_python + self.use_user_site = use_user_site + self._make_install_req = make_install_req + + self._discovered_dependencies = \ + defaultdict(list) # type: DiscoveredDependencies + + def resolve(self, root_reqs, check_supported_wheels): + # type: (List[InstallRequirement], bool) -> RequirementSet + """Resolve what operations need to be done + + As a side-effect of this method, the packages (and their dependencies) + are downloaded, unpacked and prepared for installation. This + preparation is done by ``pip.operations.prepare``. + + Once PyPI has static dependency metadata available, it would be + possible to move the preparation to become a step separated from + dependency resolution. + """ + requirement_set = RequirementSet( + check_supported_wheels=check_supported_wheels + ) + for req in root_reqs: + if req.constraint: + check_invalid_constraint_type(req) + requirement_set.add_requirement(req) + + # Actually prepare the files, and collect any exceptions. Most hash + # exceptions cannot be checked ahead of time, because + # _populate_link() needs to be called before we can make decisions + # based on link type. + discovered_reqs = [] # type: List[InstallRequirement] + hash_errors = HashErrors() + for req in chain(requirement_set.all_requirements, discovered_reqs): + try: + discovered_reqs.extend(self._resolve_one(requirement_set, req)) + except HashError as exc: + exc.req = req + hash_errors.append(exc) + + if hash_errors: + raise hash_errors + + return requirement_set + + def _is_upgrade_allowed(self, req): + # type: (InstallRequirement) -> bool + if self.upgrade_strategy == "to-satisfy-only": + return False + elif self.upgrade_strategy == "eager": + return True + else: + assert self.upgrade_strategy == "only-if-needed" + return req.user_supplied or req.constraint + + def _set_req_to_reinstall(self, req): + # type: (InstallRequirement) -> None + """ + Set a requirement to be installed. + """ + # Don't uninstall the conflict if doing a user install and the + # conflict is not a user install. + if not self.use_user_site or dist_in_usersite(req.satisfied_by): + req.should_reinstall = True + req.satisfied_by = None + + def _check_skip_installed(self, req_to_install): + # type: (InstallRequirement) -> Optional[str] + """Check if req_to_install should be skipped. + + This will check if the req is installed, and whether we should upgrade + or reinstall it, taking into account all the relevant user options. + + After calling this req_to_install will only have satisfied_by set to + None if the req_to_install is to be upgraded/reinstalled etc. Any + other value will be a dist recording the current thing installed that + satisfies the requirement. + + Note that for vcs urls and the like we can't assess skipping in this + routine - we simply identify that we need to pull the thing down, + then later on it is pulled down and introspected to assess upgrade/ + reinstalls etc. + + :return: A text reason for why it was skipped, or None. + """ + if self.ignore_installed: + return None + + req_to_install.check_if_exists(self.use_user_site) + if not req_to_install.satisfied_by: + return None + + if self.force_reinstall: + self._set_req_to_reinstall(req_to_install) + return None + + if not self._is_upgrade_allowed(req_to_install): + if self.upgrade_strategy == "only-if-needed": + return 'already satisfied, skipping upgrade' + return 'already satisfied' + + # Check for the possibility of an upgrade. For link-based + # requirements we have to pull the tree down and inspect to assess + # the version #, so it's handled way down. + if not req_to_install.link: + try: + self.finder.find_requirement(req_to_install, upgrade=True) + except BestVersionAlreadyInstalled: + # Then the best version is installed. + return 'already up-to-date' + except DistributionNotFound: + # No distribution found, so we squash the error. It will + # be raised later when we re-try later to do the install. + # Why don't we just raise here? + pass + + self._set_req_to_reinstall(req_to_install) + return None + + def _find_requirement_link(self, req): + # type: (InstallRequirement) -> Optional[Link] + upgrade = self._is_upgrade_allowed(req) + best_candidate = self.finder.find_requirement(req, upgrade) + if not best_candidate: + return None + + # Log a warning per PEP 592 if necessary before returning. + link = best_candidate.link + if link.is_yanked: + reason = link.yanked_reason or '' + msg = ( + # Mark this as a unicode string to prevent + # "UnicodeEncodeError: 'ascii' codec can't encode character" + # in Python 2 when the reason contains non-ascii characters. + u'The candidate selected for download or install is a ' + 'yanked version: {candidate}\n' + 'Reason for being yanked: {reason}' + ).format(candidate=best_candidate, reason=reason) + logger.warning(msg) + + return link + + def _populate_link(self, req): + # type: (InstallRequirement) -> None + """Ensure that if a link can be found for this, that it is found. + + Note that req.link may still be None - if the requirement is already + installed and not needed to be upgraded based on the return value of + _is_upgrade_allowed(). + + If preparer.require_hashes is True, don't use the wheel cache, because + cached wheels, always built locally, have different hashes than the + files downloaded from the index server and thus throw false hash + mismatches. Furthermore, cached wheels at present have undeterministic + contents due to file modification times. + """ + if req.link is None: + req.link = self._find_requirement_link(req) + + if self.wheel_cache is None or self.preparer.require_hashes: + return + cache_entry = self.wheel_cache.get_cache_entry( + link=req.link, + package_name=req.name, + supported_tags=get_supported(), + ) + if cache_entry is not None: + logger.debug('Using cached wheel link: %s', cache_entry.link) + if req.link is req.original_link and cache_entry.persistent: + req.original_link_is_in_wheel_cache = True + req.link = cache_entry.link + + def _get_abstract_dist_for(self, req): + # type: (InstallRequirement) -> AbstractDistribution + """Takes a InstallRequirement and returns a single AbstractDist \ + representing a prepared variant of the same. + """ + if req.editable: + return self.preparer.prepare_editable_requirement(req) + + # satisfied_by is only evaluated by calling _check_skip_installed, + # so it must be None here. + assert req.satisfied_by is None + skip_reason = self._check_skip_installed(req) + + if req.satisfied_by: + return self.preparer.prepare_installed_requirement( + req, skip_reason + ) + + # We eagerly populate the link, since that's our "legacy" behavior. + self._populate_link(req) + abstract_dist = self.preparer.prepare_linked_requirement(req) + + # NOTE + # The following portion is for determining if a certain package is + # going to be re-installed/upgraded or not and reporting to the user. + # This should probably get cleaned up in a future refactor. + + # req.req is only avail after unpack for URL + # pkgs repeat check_if_exists to uninstall-on-upgrade + # (#14) + if not self.ignore_installed: + req.check_if_exists(self.use_user_site) + + if req.satisfied_by: + should_modify = ( + self.upgrade_strategy != "to-satisfy-only" or + self.force_reinstall or + self.ignore_installed or + req.link.scheme == 'file' + ) + if should_modify: + self._set_req_to_reinstall(req) + else: + logger.info( + 'Requirement already satisfied (use --upgrade to upgrade):' + ' %s', req, + ) + + return abstract_dist + + def _resolve_one( + self, + requirement_set, # type: RequirementSet + req_to_install, # type: InstallRequirement + ): + # type: (...) -> List[InstallRequirement] + """Prepare a single requirements file. + + :return: A list of additional InstallRequirements to also install. + """ + # Tell user what we are doing for this requirement: + # obtain (editable), skipping, processing (local url), collecting + # (remote url or package name) + if req_to_install.constraint or req_to_install.prepared: + return [] + + req_to_install.prepared = True + + abstract_dist = self._get_abstract_dist_for(req_to_install) + + # Parse and return dependencies + dist = abstract_dist.get_pkg_resources_distribution() + # This will raise UnsupportedPythonVersion if the given Python + # version isn't compatible with the distribution's Requires-Python. + _check_dist_requires_python( + dist, version_info=self._py_version_info, + ignore_requires_python=self.ignore_requires_python, + ) + + more_reqs = [] # type: List[InstallRequirement] + + def add_req(subreq, extras_requested): + sub_install_req = self._make_install_req( + str(subreq), + req_to_install, + ) + parent_req_name = req_to_install.name + to_scan_again, add_to_parent = requirement_set.add_requirement( + sub_install_req, + parent_req_name=parent_req_name, + extras_requested=extras_requested, + ) + if parent_req_name and add_to_parent: + self._discovered_dependencies[parent_req_name].append( + add_to_parent + ) + more_reqs.extend(to_scan_again) + + with indent_log(): + # We add req_to_install before its dependencies, so that we + # can refer to it when adding dependencies. + if not requirement_set.has_requirement(req_to_install.name): + # 'unnamed' requirements will get added here + # 'unnamed' requirements can only come from being directly + # provided by the user. + assert req_to_install.user_supplied + requirement_set.add_requirement( + req_to_install, parent_req_name=None, + ) + + if not self.ignore_dependencies: + if req_to_install.extras: + logger.debug( + "Installing extra requirements: %r", + ','.join(req_to_install.extras), + ) + missing_requested = sorted( + set(req_to_install.extras) - set(dist.extras) + ) + for missing in missing_requested: + logger.warning( + "%s does not provide the extra '%s'", + dist, missing + ) + + available_requested = sorted( + set(dist.extras) & set(req_to_install.extras) + ) + for subreq in dist.requires(available_requested): + add_req(subreq, extras_requested=available_requested) + + if not req_to_install.editable and not req_to_install.satisfied_by: + # XXX: --no-install leads this to report 'Successfully + # downloaded' for only non-editable reqs, even though we took + # action on them. + req_to_install.successfully_downloaded = True + + return more_reqs + + def get_installation_order(self, req_set): + # type: (RequirementSet) -> List[InstallRequirement] + """Create the installation order. + + The installation order is topological - requirements are installed + before the requiring thing. We break cycles at an arbitrary point, + and make no other guarantees. + """ + # The current implementation, which we may change at any point + # installs the user specified things in the order given, except when + # dependencies must come earlier to achieve topological order. + order = [] + ordered_reqs = set() # type: Set[InstallRequirement] + + def schedule(req): + if req.satisfied_by or req in ordered_reqs: + return + if req.constraint: + return + ordered_reqs.add(req) + for dep in self._discovered_dependencies[req.name]: + schedule(dep) + order.append(req) + + for install_req in req_set.requirements.values(): + schedule(install_req) + return order diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolution/legacy/resolver.pyc b/venv/lib/python2.7/site-packages/pip/_internal/resolution/legacy/resolver.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7148dfcfff3512349f8d106445c932c5ae0784bc GIT binary patch literal 13858 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 WmT&;gv&qd*Da}c>1KC;v#0&t&J}099 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/base.py b/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/base.py new file mode 100644 index 0000000..7c09cd7 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/base.py @@ -0,0 +1,117 @@ +from pip._vendor.packaging.specifiers import SpecifierSet +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.hashes import Hashes +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import FrozenSet, Iterable, Optional, Tuple + + from pip._vendor.packaging.version import _BaseVersion + + from pip._internal.models.link import Link + + CandidateLookup = Tuple[ + Optional["Candidate"], + Optional[InstallRequirement], + ] + + +def format_name(project, extras): + # type: (str, FrozenSet[str]) -> str + if not extras: + return project + canonical_extras = sorted(canonicalize_name(e) for e in extras) + return "{}[{}]".format(project, ",".join(canonical_extras)) + + +class Constraint(object): + def __init__(self, specifier, hashes): + # type: (SpecifierSet, Hashes) -> None + self.specifier = specifier + self.hashes = hashes + + @classmethod + def empty(cls): + # type: () -> Constraint + return Constraint(SpecifierSet(), Hashes()) + + @classmethod + def from_ireq(cls, ireq): + # type: (InstallRequirement) -> Constraint + return Constraint(ireq.specifier, ireq.hashes(trust_internet=False)) + + def __nonzero__(self): + # type: () -> bool + return bool(self.specifier) or bool(self.hashes) + + def __bool__(self): + # type: () -> bool + return self.__nonzero__() + + def __and__(self, other): + # type: (InstallRequirement) -> Constraint + if not isinstance(other, InstallRequirement): + return NotImplemented + specifier = self.specifier & other.specifier + hashes = self.hashes & other.hashes(trust_internet=False) + return Constraint(specifier, hashes) + + +class Requirement(object): + @property + def name(self): + # type: () -> str + raise NotImplementedError("Subclass should override") + + def is_satisfied_by(self, candidate): + # type: (Candidate) -> bool + return False + + def get_candidate_lookup(self): + # type: () -> CandidateLookup + raise NotImplementedError("Subclass should override") + + def format_for_error(self): + # type: () -> str + raise NotImplementedError("Subclass should override") + + +class Candidate(object): + @property + def name(self): + # type: () -> str + raise NotImplementedError("Override in subclass") + + @property + def version(self): + # type: () -> _BaseVersion + raise NotImplementedError("Override in subclass") + + @property + def is_installed(self): + # type: () -> bool + raise NotImplementedError("Override in subclass") + + @property + def is_editable(self): + # type: () -> bool + raise NotImplementedError("Override in subclass") + + @property + def source_link(self): + # type: () -> Optional[Link] + raise NotImplementedError("Override in subclass") + + def iter_dependencies(self, with_requires): + # type: (bool) -> Iterable[Optional[Requirement]] + raise NotImplementedError("Override in subclass") + + def get_install_requirement(self): + # type: () -> Optional[InstallRequirement] + raise NotImplementedError("Override in subclass") + + def format_for_error(self): + # type: () -> str + raise NotImplementedError("Subclass should override") diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/base.pyc b/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/base.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1ac13c5b175a5a8665a0cadd3286bf6b1d6f8ba GIT binary patch literal 6187 zcmdT|>v9}N6+Sb2kyf@Ywi6{HK#A~!r4maaKq{$98JCrd1!e;y2<3%T*J!3?jXan2 zbgzjV>ksyyJWq2k;&7> z?`;$p1|li`1Ia~-K!$+?Y=@GEQnX~)YT7Ny+fsC7*lF5r$-7c4$#AJ@cO+kyq9?)`Hg>8neV`#s0 zKF;&VJ{o7WEo?b?t&6d{u{*YIKKHlxe|O*P-TiRyHzxYyV6Z>Z*HjnPzG1 zZ4#opg~H)I6!#v;(?HycJcZa^(Ewed>w{;3;QuTnAWi~~r!6@NKtg@JQGV+QDYvS5V)ppt(ARo)Ql6q3Cx|+^<0_ z3<`E6YFVLJY*e6j0!1w z!k_{Wp`st0qJc9NtZr(1s?X!bc(|5o-r4*pdIhcMRgeX#l&N9DSK3J?z1JOhPgzz@+fIBB2|i70x6A`#ze%#*bwcMIa59>NwQfBIuo6ywrT z)2EU-xX1qQgEYoT>keqz*mU2541vnP*#p1EY4zCoiIu@4QXP$0vz<_{^iiBUtJWOR z1?Yys9X?u+m^A03x+=`{8&grKe3lvdrlP`f)fJ6iQ_0a(Uv_@Glc^O$o#T_L zCM;N#&wW%HbkR0KaW`ll2V}jaXlu!B#1^*O+HNcQIz->?vlhKC-2~7`b5bZqKfs!O zdR+BsnbUAkCN|=*0(DUN{Q{wp5!j~lEsSW!3fTs{)R029^2fHG&s)$2lV@WPg^l?o zs))9D!gcuPjbJP26UZ9l0Rp5I#;AP86jeIT(Tu*w2}DVf$IcbjA6IEaP)FM&-1&&M z9{mJlE`!!CGJ>iGxeJb2M>pto*74VC_u9(cx%4N&xIWyPJ1FjLkS5GnI2w&KND7c+ zHjxHl26@JF#FcXa2H}K&nppuCQ*<%D0$q3&Yy52zNH{uhj0*?jL)Fx_JFdogx?MfC zb)BV?jEO$`MWB3G*Hyi6+o34j-(TT(>Z-^y%gnwx36i~F*#vLnRu#8|OEOLA=DU57 z8|~Nejm#Mr`^+H`PR-%z2k81ww{#&J61_?J7VTtT!bcuhZ)Tb^c~w0ekM3S>v1kdC z^bbD1B%lwmJTE1ok3LrgW((~GR?kavX5t;rkcjHvhpW?P!+z2BT5Z_$b! ePZ1lzMu-C14PFmX4_m=faIM{2-u%(#jei4%)M)|$ literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/candidates.py b/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/candidates.py new file mode 100644 index 0000000..8b39d2d --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/candidates.py @@ -0,0 +1,594 @@ +import logging +import sys + +from pip._vendor.contextlib2 import suppress +from pip._vendor.packaging.specifiers import InvalidSpecifier, SpecifierSet +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import Version + +from pip._internal.exceptions import HashError, MetadataInconsistent +from pip._internal.network.lazy_wheel import ( + HTTPRangeRequestUnsupported, + dist_from_wheel_url, +) +from pip._internal.req.constructors import ( + install_req_from_editable, + install_req_from_line, +) +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import dist_is_editable, normalize_version_info +from pip._internal.utils.packaging import get_requires_python +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +from .base import Candidate, format_name + +if MYPY_CHECK_RUNNING: + from typing import Any, FrozenSet, Iterable, Optional, Tuple, Union + + from pip._vendor.packaging.version import _BaseVersion + from pip._vendor.pkg_resources import Distribution + + from pip._internal.distributions import AbstractDistribution + from pip._internal.models.link import Link + + from .base import Requirement + from .factory import Factory + + BaseCandidate = Union[ + "AlreadyInstalledCandidate", + "EditableCandidate", + "LinkCandidate", + ] + + +logger = logging.getLogger(__name__) + + +def make_install_req_from_link(link, template): + # type: (Link, InstallRequirement) -> InstallRequirement + assert not template.editable, "template is editable" + if template.req: + line = str(template.req) + else: + line = link.url + ireq = install_req_from_line( + line, + user_supplied=template.user_supplied, + comes_from=template.comes_from, + use_pep517=template.use_pep517, + isolated=template.isolated, + constraint=template.constraint, + options=dict( + install_options=template.install_options, + global_options=template.global_options, + hashes=template.hash_options + ), + ) + ireq.original_link = template.original_link + ireq.link = link + return ireq + + +def make_install_req_from_editable(link, template): + # type: (Link, InstallRequirement) -> InstallRequirement + assert template.editable, "template not editable" + return install_req_from_editable( + link.url, + user_supplied=template.user_supplied, + comes_from=template.comes_from, + use_pep517=template.use_pep517, + isolated=template.isolated, + constraint=template.constraint, + options=dict( + install_options=template.install_options, + global_options=template.global_options, + hashes=template.hash_options + ), + ) + + +def make_install_req_from_dist(dist, template): + # type: (Distribution, InstallRequirement) -> InstallRequirement + project_name = canonicalize_name(dist.project_name) + if template.req: + line = str(template.req) + elif template.link: + line = "{} @ {}".format(project_name, template.link.url) + else: + line = "{}=={}".format(project_name, dist.parsed_version) + ireq = install_req_from_line( + line, + user_supplied=template.user_supplied, + comes_from=template.comes_from, + use_pep517=template.use_pep517, + isolated=template.isolated, + constraint=template.constraint, + options=dict( + install_options=template.install_options, + global_options=template.global_options, + hashes=template.hash_options + ), + ) + ireq.satisfied_by = dist + return ireq + + +class _InstallRequirementBackedCandidate(Candidate): + """A candidate backed by an ``InstallRequirement``. + + This represents a package request with the target not being already + in the environment, and needs to be fetched and installed. The backing + ``InstallRequirement`` is responsible for most of the leg work; this + class exposes appropriate information to the resolver. + + :param link: The link passed to the ``InstallRequirement``. The backing + ``InstallRequirement`` will use this link to fetch the distribution. + :param source_link: The link this candidate "originates" from. This is + different from ``link`` when the link is found in the wheel cache. + ``link`` would point to the wheel cache, while this points to the + found remote link (e.g. from pypi.org). + """ + is_installed = False + + def __init__( + self, + link, # type: Link + source_link, # type: Link + ireq, # type: InstallRequirement + factory, # type: Factory + name=None, # type: Optional[str] + version=None, # type: Optional[_BaseVersion] + ): + # type: (...) -> None + self._link = link + self._source_link = source_link + self._factory = factory + self._ireq = ireq + self._name = name + self._version = version + self._dist = None # type: Optional[Distribution] + self._prepared = False + + def __repr__(self): + # type: () -> str + return "{class_name}({link!r})".format( + class_name=self.__class__.__name__, + link=str(self._link), + ) + + def __hash__(self): + # type: () -> int + return hash((self.__class__, self._link)) + + def __eq__(self, other): + # type: (Any) -> bool + if isinstance(other, self.__class__): + return self._link == other._link + return False + + # Needed for Python 2, which does not implement this by default + def __ne__(self, other): + # type: (Any) -> bool + return not self.__eq__(other) + + @property + def source_link(self): + # type: () -> Optional[Link] + return self._source_link + + @property + def name(self): + # type: () -> str + """The normalised name of the project the candidate refers to""" + if self._name is None: + self._name = canonicalize_name(self.dist.project_name) + return self._name + + @property + def version(self): + # type: () -> _BaseVersion + if self._version is None: + self._version = self.dist.parsed_version + return self._version + + def format_for_error(self): + # type: () -> str + return "{} {} (from {})".format( + self.name, + self.version, + self._link.file_path if self._link.is_file else self._link + ) + + def _prepare_abstract_distribution(self): + # type: () -> AbstractDistribution + raise NotImplementedError("Override in subclass") + + def _check_metadata_consistency(self): + # type: () -> None + """Check for consistency of project name and version of dist.""" + # TODO: (Longer term) Rather than abort, reject this candidate + # and backtrack. This would need resolvelib support. + dist = self._dist # type: Distribution + name = canonicalize_name(dist.project_name) + if self._name is not None and self._name != name: + raise MetadataInconsistent(self._ireq, "name", dist.project_name) + version = dist.parsed_version + if self._version is not None and self._version != version: + raise MetadataInconsistent(self._ireq, "version", dist.version) + + def _prepare(self): + # type: () -> None + if self._prepared: + return + try: + abstract_dist = self._prepare_abstract_distribution() + except HashError as e: + e.req = self._ireq + raise + + self._dist = abstract_dist.get_pkg_resources_distribution() + assert self._dist is not None, "Distribution already installed" + self._check_metadata_consistency() + self._prepared = True + + def _fetch_metadata(self): + # type: () -> None + """Fetch metadata, using lazy wheel if possible.""" + preparer = self._factory.preparer + use_lazy_wheel = self._factory.use_lazy_wheel + remote_wheel = self._link.is_wheel and not self._link.is_file + if use_lazy_wheel and remote_wheel and not preparer.require_hashes: + assert self._name is not None + logger.info('Collecting %s', self._ireq.req or self._ireq) + # If HTTPRangeRequestUnsupported is raised, fallback silently. + with indent_log(), suppress(HTTPRangeRequestUnsupported): + logger.info( + 'Obtaining dependency information from %s %s', + self._name, self._version, + ) + url = self._link.url.split('#', 1)[0] + session = preparer.downloader._session + self._dist = dist_from_wheel_url(self._name, url, session) + self._check_metadata_consistency() + if self._dist is None: + self._prepare() + + @property + def dist(self): + # type: () -> Distribution + if self._dist is None: + self._fetch_metadata() + return self._dist + + def _get_requires_python_dependency(self): + # type: () -> Optional[Requirement] + requires_python = get_requires_python(self.dist) + if requires_python is None: + return None + try: + spec = SpecifierSet(requires_python) + except InvalidSpecifier as e: + message = "Package %r has an invalid Requires-Python: %s" + logger.warning(message, self.name, e) + return None + return self._factory.make_requires_python_requirement(spec) + + def iter_dependencies(self, with_requires): + # type: (bool) -> Iterable[Optional[Requirement]] + requires = self.dist.requires() if with_requires else () + for r in requires: + yield self._factory.make_requirement_from_spec(str(r), self._ireq) + yield self._get_requires_python_dependency() + + def get_install_requirement(self): + # type: () -> Optional[InstallRequirement] + self._prepare() + return self._ireq + + +class LinkCandidate(_InstallRequirementBackedCandidate): + is_editable = False + + def __init__( + self, + link, # type: Link + template, # type: InstallRequirement + factory, # type: Factory + name=None, # type: Optional[str] + version=None, # type: Optional[_BaseVersion] + ): + # type: (...) -> None + source_link = link + cache_entry = factory.get_wheel_cache_entry(link, name) + if cache_entry is not None: + logger.debug("Using cached wheel link: %s", cache_entry.link) + link = cache_entry.link + ireq = make_install_req_from_link(link, template) + + if (cache_entry is not None and + cache_entry.persistent and + template.link is template.original_link): + ireq.original_link_is_in_wheel_cache = True + + super(LinkCandidate, self).__init__( + link=link, + source_link=source_link, + ireq=ireq, + factory=factory, + name=name, + version=version, + ) + + def _prepare_abstract_distribution(self): + # type: () -> AbstractDistribution + return self._factory.preparer.prepare_linked_requirement( + self._ireq, parallel_builds=True, + ) + + +class EditableCandidate(_InstallRequirementBackedCandidate): + is_editable = True + + def __init__( + self, + link, # type: Link + template, # type: InstallRequirement + factory, # type: Factory + name=None, # type: Optional[str] + version=None, # type: Optional[_BaseVersion] + ): + # type: (...) -> None + super(EditableCandidate, self).__init__( + link=link, + source_link=link, + ireq=make_install_req_from_editable(link, template), + factory=factory, + name=name, + version=version, + ) + + def _prepare_abstract_distribution(self): + # type: () -> AbstractDistribution + return self._factory.preparer.prepare_editable_requirement(self._ireq) + + +class AlreadyInstalledCandidate(Candidate): + is_installed = True + source_link = None + + def __init__( + self, + dist, # type: Distribution + template, # type: InstallRequirement + factory, # type: Factory + ): + # type: (...) -> None + self.dist = dist + self._ireq = make_install_req_from_dist(dist, template) + self._factory = factory + + # This is just logging some messages, so we can do it eagerly. + # The returned dist would be exactly the same as self.dist because we + # set satisfied_by in make_install_req_from_dist. + # TODO: Supply reason based on force_reinstall and upgrade_strategy. + skip_reason = "already satisfied" + factory.preparer.prepare_installed_requirement(self._ireq, skip_reason) + + def __repr__(self): + # type: () -> str + return "{class_name}({distribution!r})".format( + class_name=self.__class__.__name__, + distribution=self.dist, + ) + + def __hash__(self): + # type: () -> int + return hash((self.__class__, self.name, self.version)) + + def __eq__(self, other): + # type: (Any) -> bool + if isinstance(other, self.__class__): + return self.name == other.name and self.version == other.version + return False + + # Needed for Python 2, which does not implement this by default + def __ne__(self, other): + # type: (Any) -> bool + return not self.__eq__(other) + + @property + def name(self): + # type: () -> str + return canonicalize_name(self.dist.project_name) + + @property + def version(self): + # type: () -> _BaseVersion + return self.dist.parsed_version + + @property + def is_editable(self): + # type: () -> bool + return dist_is_editable(self.dist) + + def format_for_error(self): + # type: () -> str + return "{} {} (Installed)".format(self.name, self.version) + + def iter_dependencies(self, with_requires): + # type: (bool) -> Iterable[Optional[Requirement]] + if not with_requires: + return + for r in self.dist.requires(): + yield self._factory.make_requirement_from_spec(str(r), self._ireq) + + def get_install_requirement(self): + # type: () -> Optional[InstallRequirement] + return None + + +class ExtrasCandidate(Candidate): + """A candidate that has 'extras', indicating additional dependencies. + + Requirements can be for a project with dependencies, something like + foo[extra]. The extras don't affect the project/version being installed + directly, but indicate that we need additional dependencies. We model that + by having an artificial ExtrasCandidate that wraps the "base" candidate. + + The ExtrasCandidate differs from the base in the following ways: + + 1. It has a unique name, of the form foo[extra]. This causes the resolver + to treat it as a separate node in the dependency graph. + 2. When we're getting the candidate's dependencies, + a) We specify that we want the extra dependencies as well. + b) We add a dependency on the base candidate. + See below for why this is needed. + 3. We return None for the underlying InstallRequirement, as the base + candidate will provide it, and we don't want to end up with duplicates. + + The dependency on the base candidate is needed so that the resolver can't + decide that it should recommend foo[extra1] version 1.0 and foo[extra2] + version 2.0. Having those candidates depend on foo=1.0 and foo=2.0 + respectively forces the resolver to recognise that this is a conflict. + """ + def __init__( + self, + base, # type: BaseCandidate + extras, # type: FrozenSet[str] + ): + # type: (...) -> None + self.base = base + self.extras = extras + + def __repr__(self): + # type: () -> str + return "{class_name}(base={base!r}, extras={extras!r})".format( + class_name=self.__class__.__name__, + base=self.base, + extras=self.extras, + ) + + def __hash__(self): + # type: () -> int + return hash((self.base, self.extras)) + + def __eq__(self, other): + # type: (Any) -> bool + if isinstance(other, self.__class__): + return self.base == other.base and self.extras == other.extras + return False + + # Needed for Python 2, which does not implement this by default + def __ne__(self, other): + # type: (Any) -> bool + return not self.__eq__(other) + + @property + def name(self): + # type: () -> str + """The normalised name of the project the candidate refers to""" + return format_name(self.base.name, self.extras) + + @property + def version(self): + # type: () -> _BaseVersion + return self.base.version + + def format_for_error(self): + # type: () -> str + return "{} [{}]".format( + self.base.format_for_error(), + ", ".join(sorted(self.extras)) + ) + + @property + def is_installed(self): + # type: () -> bool + return self.base.is_installed + + @property + def is_editable(self): + # type: () -> bool + return self.base.is_editable + + @property + def source_link(self): + # type: () -> Optional[Link] + return self.base.source_link + + def iter_dependencies(self, with_requires): + # type: (bool) -> Iterable[Optional[Requirement]] + factory = self.base._factory + + # Add a dependency on the exact base + # (See note 2b in the class docstring) + yield factory.make_requirement_from_candidate(self.base) + if not with_requires: + return + + # The user may have specified extras that the candidate doesn't + # support. We ignore any unsupported extras here. + valid_extras = self.extras.intersection(self.base.dist.extras) + invalid_extras = self.extras.difference(self.base.dist.extras) + for extra in sorted(invalid_extras): + logger.warning( + "%s %s does not provide the extra '%s'", + self.base.name, + self.version, + extra + ) + + for r in self.base.dist.requires(valid_extras): + requirement = factory.make_requirement_from_spec( + str(r), self.base._ireq, valid_extras, + ) + if requirement: + yield requirement + + def get_install_requirement(self): + # type: () -> Optional[InstallRequirement] + # We don't return anything here, because we always + # depend on the base candidate, and we'll get the + # install requirement from that. + return None + + +class RequiresPythonCandidate(Candidate): + is_installed = False + source_link = None + + def __init__(self, py_version_info): + # type: (Optional[Tuple[int, ...]]) -> None + if py_version_info is not None: + version_info = normalize_version_info(py_version_info) + else: + version_info = sys.version_info[:3] + self._version = Version(".".join(str(c) for c in version_info)) + + # We don't need to implement __eq__() and __ne__() since there is always + # only one RequiresPythonCandidate in a resolution, i.e. the host Python. + # The built-in object.__eq__() and object.__ne__() do exactly what we want. + + @property + def name(self): + # type: () -> str + # Avoid conflicting with the PyPI package "Python". + return "" + + @property + def version(self): + # type: () -> _BaseVersion + return self._version + + def format_for_error(self): + # type: () -> str + return "Python {}".format(self.version) + + def iter_dependencies(self, with_requires): + # type: (bool) -> Iterable[Optional[Requirement]] + return () + + def get_install_requirement(self): + # type: () -> Optional[InstallRequirement] + return None diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/candidates.pyc b/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/candidates.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ffc58de9f5aac33b4ed06671f3cef0aa2cd5043 GIT binary patch literal 22365 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 None + self._finder = finder + self.preparer = preparer + self._wheel_cache = wheel_cache + self._python_candidate = RequiresPythonCandidate(py_version_info) + self._make_install_req_from_spec = make_install_req + self._use_user_site = use_user_site + self._force_reinstall = force_reinstall + self._ignore_requires_python = ignore_requires_python + self.use_lazy_wheel = lazy_wheel + + self._link_candidate_cache = {} # type: Cache[LinkCandidate] + self._editable_candidate_cache = {} # type: Cache[EditableCandidate] + + if not ignore_installed: + self._installed_dists = { + canonicalize_name(dist.project_name): dist + for dist in get_installed_distributions(local_only=False) + } + else: + self._installed_dists = {} + + @property + def force_reinstall(self): + # type: () -> bool + return self._force_reinstall + + def _make_candidate_from_dist( + self, + dist, # type: Distribution + extras, # type: FrozenSet[str] + template, # type: InstallRequirement + ): + # type: (...) -> Candidate + base = AlreadyInstalledCandidate(dist, template, factory=self) + if extras: + return ExtrasCandidate(base, extras) + return base + + def _make_candidate_from_link( + self, + link, # type: Link + extras, # type: FrozenSet[str] + template, # type: InstallRequirement + name, # type: Optional[str] + version, # type: Optional[_BaseVersion] + ): + # type: (...) -> Candidate + # TODO: Check already installed candidate, and use it if the link and + # editable flag match. + if template.editable: + if link not in self._editable_candidate_cache: + self._editable_candidate_cache[link] = EditableCandidate( + link, template, factory=self, name=name, version=version, + ) + base = self._editable_candidate_cache[link] # type: BaseCandidate + else: + if link not in self._link_candidate_cache: + self._link_candidate_cache[link] = LinkCandidate( + link, template, factory=self, name=name, version=version, + ) + base = self._link_candidate_cache[link] + if extras: + return ExtrasCandidate(base, extras) + return base + + def _iter_found_candidates( + self, + ireqs, # type: Sequence[InstallRequirement] + specifier, # type: SpecifierSet + hashes, # type: Hashes + prefers_installed, # type: bool + ): + # type: (...) -> Iterable[Candidate] + if not ireqs: + return () + + # The InstallRequirement implementation requires us to give it a + # "template". Here we just choose the first requirement to represent + # all of them. + # Hopefully the Project model can correct this mismatch in the future. + template = ireqs[0] + name = canonicalize_name(template.req.name) + + extras = frozenset() # type: FrozenSet[str] + for ireq in ireqs: + specifier &= ireq.req.specifier + hashes &= ireq.hashes(trust_internet=False) + extras |= frozenset(ireq.extras) + + # Get the installed version, if it matches, unless the user + # specified `--force-reinstall`, when we want the version from + # the index instead. + installed_candidate = None + if not self._force_reinstall and name in self._installed_dists: + installed_dist = self._installed_dists[name] + if specifier.contains(installed_dist.version, prereleases=True): + installed_candidate = self._make_candidate_from_dist( + dist=installed_dist, + extras=extras, + template=template, + ) + + def iter_index_candidates(): + # type: () -> Iterator[Candidate] + result = self._finder.find_best_candidate( + project_name=name, + specifier=specifier, + hashes=hashes, + ) + # PackageFinder returns earlier versions first, so we reverse. + for ican in reversed(list(result.iter_applicable())): + yield self._make_candidate_from_link( + link=ican.link, + extras=extras, + template=template, + name=name, + version=ican.version, + ) + + return FoundCandidates( + iter_index_candidates, + installed_candidate, + prefers_installed, + ) + + def find_candidates( + self, + requirements, # type: Sequence[Requirement] + constraint, # type: Constraint + prefers_installed, # type: bool + ): + # type: (...) -> Iterable[Candidate] + explicit_candidates = set() # type: Set[Candidate] + ireqs = [] # type: List[InstallRequirement] + for req in requirements: + cand, ireq = req.get_candidate_lookup() + if cand is not None: + explicit_candidates.add(cand) + if ireq is not None: + ireqs.append(ireq) + + # If none of the requirements want an explicit candidate, we can ask + # the finder for candidates. + if not explicit_candidates: + return self._iter_found_candidates( + ireqs, + constraint.specifier, + constraint.hashes, + prefers_installed, + ) + + if constraint: + name = explicit_candidates.pop().name + raise InstallationError( + "Could not satisfy constraints for {!r}: installation from " + "path or url cannot be constrained to a version".format(name) + ) + + return ( + c for c in explicit_candidates + if all(req.is_satisfied_by(c) for req in requirements) + ) + + def make_requirement_from_install_req(self, ireq, requested_extras): + # type: (InstallRequirement, Iterable[str]) -> Optional[Requirement] + if not ireq.match_markers(requested_extras): + logger.info( + "Ignoring %s: markers '%s' don't match your environment", + ireq.name, ireq.markers, + ) + return None + if not ireq.link: + return SpecifierRequirement(ireq) + if ireq.link.is_wheel: + wheel = Wheel(ireq.link.filename) + if not wheel.supported(self._finder.target_python.get_tags()): + msg = "{} is not a supported wheel on this platform.".format( + wheel.filename, + ) + raise UnsupportedWheel(msg) + cand = self._make_candidate_from_link( + ireq.link, + extras=frozenset(ireq.extras), + template=ireq, + name=canonicalize_name(ireq.name) if ireq.name else None, + version=None, + ) + return self.make_requirement_from_candidate(cand) + + def make_requirement_from_candidate(self, candidate): + # type: (Candidate) -> ExplicitRequirement + return ExplicitRequirement(candidate) + + def make_requirement_from_spec( + self, + specifier, # type: str + comes_from, # type: InstallRequirement + requested_extras=(), # type: Iterable[str] + ): + # type: (...) -> Optional[Requirement] + ireq = self._make_install_req_from_spec(specifier, comes_from) + return self.make_requirement_from_install_req(ireq, requested_extras) + + def make_requires_python_requirement(self, specifier): + # type: (Optional[SpecifierSet]) -> Optional[Requirement] + if self._ignore_requires_python or specifier is None: + return None + return RequiresPythonRequirement(specifier, self._python_candidate) + + def get_wheel_cache_entry(self, link, name): + # type: (Link, Optional[str]) -> Optional[CacheEntry] + """Look up the link in the wheel cache. + + If ``preparer.require_hashes`` is True, don't use the wheel cache, + because cached wheels, always built locally, have different hashes + than the files downloaded from the index server and thus throw false + hash mismatches. Furthermore, cached wheels at present have + nondeterministic contents due to file modification times. + """ + if self._wheel_cache is None or self.preparer.require_hashes: + return None + return self._wheel_cache.get_cache_entry( + link=link, + package_name=name, + supported_tags=get_supported(), + ) + + def get_dist_to_uninstall(self, candidate): + # type: (Candidate) -> Optional[Distribution] + # TODO: Are there more cases this needs to return True? Editable? + dist = self._installed_dists.get(candidate.name) + if dist is None: # Not installed, no uninstallation required. + return None + + # We're installing into global site. The current installation must + # be uninstalled, no matter it's in global or user site, because the + # user site installation has precedence over global. + if not self._use_user_site: + return dist + + # We're installing into user site. Remove the user site installation. + if dist_in_usersite(dist): + return dist + + # We're installing into user site, but the installed incompatible + # package is in global site. We can't uninstall that, and would let + # the new user installation to "shadow" it. But shadowing won't work + # in virtual environments, so we error out. + if running_under_virtualenv() and dist_in_site_packages(dist): + raise InstallationError( + "Will not install to the user site because it will " + "lack sys.path precedence to {} in {}".format( + dist.project_name, dist.location, + ) + ) + return None + + def _report_requires_python_error( + self, + requirement, # type: RequiresPythonRequirement + template, # type: Candidate + ): + # type: (...) -> UnsupportedPythonVersion + message_format = ( + "Package {package!r} requires a different Python: " + "{version} not in {specifier!r}" + ) + message = message_format.format( + package=template.name, + version=self._python_candidate.version, + specifier=str(requirement.specifier), + ) + return UnsupportedPythonVersion(message) + + def get_installation_error(self, e): + # type: (ResolutionImpossible) -> InstallationError + + assert e.causes, "Installation error reported with no cause" + + # If one of the things we can't solve is "we need Python X.Y", + # that is what we report. + for cause in e.causes: + if isinstance(cause.requirement, RequiresPythonRequirement): + return self._report_requires_python_error( + cause.requirement, + cause.parent, + ) + + # Otherwise, we have a set of causes which can't all be satisfied + # at once. + + # The simplest case is when we have *one* cause that can't be + # satisfied. We just report that case. + if len(e.causes) == 1: + req, parent = e.causes[0] + if parent is None: + req_disp = str(req) + else: + req_disp = '{} (from {})'.format(req, parent.name) + logger.critical( + "Could not find a version that satisfies the requirement %s", + req_disp, + ) + return DistributionNotFound( + 'No matching distribution found for {}'.format(req) + ) + + # OK, we now have a list of requirements that can't all be + # satisfied at once. + + # A couple of formatting helpers + def text_join(parts): + # type: (List[str]) -> str + if len(parts) == 1: + return parts[0] + + return ", ".join(parts[:-1]) + " and " + parts[-1] + + def readable_form(cand): + # type: (Candidate) -> str + return "{} {}".format(cand.name, cand.version) + + def describe_trigger(parent): + # type: (Candidate) -> str + ireq = parent.get_install_requirement() + if not ireq or not ireq.comes_from: + return "{} {}".format(parent.name, parent.version) + if isinstance(ireq.comes_from, InstallRequirement): + return str(ireq.comes_from.name) + return str(ireq.comes_from) + + triggers = [] + for req, parent in e.causes: + if parent is None: + # This is a root requirement, so we can report it directly + trigger = req.format_for_error() + else: + trigger = describe_trigger(parent) + triggers.append(trigger) + + if triggers: + info = text_join(triggers) + else: + info = "the requested packages" + + msg = "Cannot install {} because these package versions " \ + "have conflicting dependencies.".format(info) + logger.critical(msg) + msg = "\nThe conflict is caused by:" + for req, parent in e.causes: + msg = msg + "\n " + if parent: + msg = msg + "{} {} depends on ".format( + parent.name, + parent.version + ) + else: + msg = msg + "The user requested " + msg = msg + req.format_for_error() + + msg = msg + "\n\n" + \ + "To fix this you could try to:\n" + \ + "1. loosen the range of package versions you've specified\n" + \ + "2. remove package versions to allow pip attempt to solve " + \ + "the dependency conflict\n" + + logger.info(msg) + + return DistributionNotFound( + "ResolutionImpossible: for help visit " + "https://pip.pypa.io/en/latest/user_guide/" + "#fixing-conflicting-dependencies" + ) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/factory.pyc b/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/factory.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6626785f1673ae340a2f10817d439d7432993090 GIT binary patch literal 13472 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 D+IVzj literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py b/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py new file mode 100644 index 0000000..a669e89 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py @@ -0,0 +1,98 @@ +import itertools +import operator + +from pip._vendor.six.moves import collections_abc # type: ignore + +from pip._internal.utils.compat import lru_cache +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Callable, Iterator, Optional, Set + + from pip._vendor.packaging.version import _BaseVersion + + from .base import Candidate + + +def _deduplicated_by_version(candidates): + # type: (Iterator[Candidate]) -> Iterator[Candidate] + returned = set() # type: Set[_BaseVersion] + for candidate in candidates: + if candidate.version in returned: + continue + returned.add(candidate.version) + yield candidate + + +def _insert_installed(installed, others): + # type: (Candidate, Iterator[Candidate]) -> Iterator[Candidate] + """Iterator for ``FoundCandidates``. + + This iterator is used when the resolver prefers to upgrade an + already-installed package. Candidates from index are returned in their + normal ordering, except replaced when the version is already installed. + + Since candidates from index are already sorted by reverse version order, + `sorted()` here would keep the ordering mostly intact, only shuffling the + already-installed candidate into the correct position. We put the already- + installed candidate in front of those from the index, so it's put in front + after sorting due to Python sorting's stableness guarentee. + """ + candidates = sorted( + itertools.chain([installed], others), + key=operator.attrgetter("version"), + reverse=True, + ) + return iter(candidates) + + +class FoundCandidates(collections_abc.Sequence): + """A lazy sequence to provide candidates to the resolver. + + The intended usage is to return this from `find_matches()` so the resolver + can iterate through the sequence multiple times, but only access the index + page when remote packages are actually needed. This improve performances + when suitable candidates are already installed on disk. + """ + def __init__( + self, + get_others, # type: Callable[[], Iterator[Candidate]] + installed, # type: Optional[Candidate] + prefers_installed, # type: bool + ): + self._get_others = get_others + self._installed = installed + self._prefers_installed = prefers_installed + + def __getitem__(self, index): + # type: (int) -> Candidate + # Implemented to satisfy the ABC check. This is not needed by the + # resolver, and should not be used by the provider either (for + # performance reasons). + raise NotImplementedError("don't do this") + + def __iter__(self): + # type: () -> Iterator[Candidate] + if not self._installed: + candidates = self._get_others() + elif self._prefers_installed: + candidates = itertools.chain([self._installed], self._get_others()) + else: + candidates = _insert_installed(self._installed, self._get_others()) + return _deduplicated_by_version(candidates) + + def __len__(self): + # type: () -> int + # Implemented to satisfy the ABC check. This is not needed by the + # resolver, and should not be used by the provider either (for + # performance reasons). + raise NotImplementedError("don't do this") + + @lru_cache(maxsize=1) + def __bool__(self): + # type: () -> bool + if self._prefers_installed and self._installed: + return True + return any(self) + + __nonzero__ = __bool__ # XXX: Python 2. diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/found_candidates.pyc b/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/found_candidates.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d887280e6102346b7b0f960e92dbaac2776484f GIT binary patch literal 4123 zcmcgv-Etg96+W{ot+cXiD|TYUfAdp#sVHmUf&z-7z#gB_uv1ibLxLX z{Qo7I{};Lfe+gAY^EI8&JdybURRgMrG#^sJ`-W6)P`yd>%{bnmYDD!G&9^8qTjc&B zr#7kDrg}{CG1WUX-=X>z&2Le?OY_}$Zba2>s_)SJ4#rzlY*TfY>OGq8QPSX^G5rnl zyhX*15cjCKMP^9n_h|vac6ss@(ewG+Ec$G68)}sQ#qVg6fDCuh<+iF!9!lGIot@-y zVT^^!bvn=TGZUxoVd@XhpFY=zAH09~d!7F2=;+DOZzmhfXB*vNR#n+aWn}Oq7?%a> zWbnt9xo1^iIAs5!B-ci=-R5x0aKw*mb#bv zEv$LQmj>hHc5*ivC3{Iez?k(Mp&g?6pP>VeA>u=HD$u*qkW7L$)!;h9_KkOEX|eaXHzRUaAEc0m?bpbNXT=GWRXu7JD=$}Vug zLMyQV+f=M@puC0MA9`WA+8w1^z#Xvc0?S-Go2`&VjLGG~7)%lbo?gk>CqZ=8+Lqh(?3B?p&#iVEX>CP~D2O&QmNOpfC z7&(8+j}yUTH2)NxK@E{QHka5((LfzT>@$HRFce~wiVYz~gbG$*I6`gVs)TJw2=i?+ z+g!@h*@RK`ITH7;RFz%9FU`lD;TVB=TW4RCi0QQ-N~E*5tTMnlU$6rOgGerrD-h-! zgWwP&8oq|1xZ3doj;8A@pjdeh95~$T48>P)U!Q#-#+kF->6vU=%T{+)DBB9FWo`U{ zIza$PRAqV2zPEO0Vb`)elDwR$Z9u%lRD>*nphZY_u**_4#z6dOpZsc89$Sq=s;o00 z;)R*;@m(p7{yH+kD`q`l(c2nQsiO23F$QvWQ*NB!C9i)I1d1NYq6UG|2Li*P5U}tY zW$zZYYq-3QZXDQ)t{p3I-Pe6izMhVCpRe_%TF9Ae7U`EUAJ|Vndk&LdaAjoY(~z_b zTK^QZ=QKd0aWalIka1dLwTA&}ASxbQ_^%QKvk9*rd44Pvws{y-!R}Q0_&B-Gi#9x| z;VL!fqT+q$tdm2j!lGms$$U4E48(YBJ>;iaYq39zPn#Tmq9=#C%){{P0_T8aUkE5o zgf~?4ScU^~kNd(OxAB7j`(+!R1-x^g)r+fdEb+@gP+YyKI0dKQ;O^_(u~()HUivn7 zoUl@Ue_jK3Qwg+p5F~W1e+LQHPbFl{zv2;0bEE)_;Z&F~o=Wl8t1-=}XGG)=gF$tz$ydwJo}ehY_g4=31xUVTHcO-9zr! zOsN>{T~HwgS7VziNjU`+9CQTb_Z>oyCb>F4eV%NCEal-)=kIsJHu zaVmbmkEoP$YvA~PU5Z!=aeCUnZ&Suxo>3?G;7i$j68n+`#8|Wbg&@k`5YTe*&!b=b cg01c!pxaG$2YZ9PWN$D^z76XB5YRvPALlM4Jpcdz literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/provider.py b/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/provider.py new file mode 100644 index 0000000..7d679e5 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/provider.py @@ -0,0 +1,112 @@ +from pip._vendor.resolvelib.providers import AbstractProvider + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +from .base import Constraint + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, + Dict, + Iterable, + Optional, + Sequence, + Set, + Tuple, + Union, + ) + + from .base import Requirement, Candidate + from .factory import Factory + +# Notes on the relationship between the provider, the factory, and the +# candidate and requirement classes. +# +# The provider is a direct implementation of the resolvelib class. Its role +# is to deliver the API that resolvelib expects. +# +# Rather than work with completely abstract "requirement" and "candidate" +# concepts as resolvelib does, pip has concrete classes implementing these two +# ideas. The API of Requirement and Candidate objects are defined in the base +# classes, but essentially map fairly directly to the equivalent provider +# methods. In particular, `find_matches` and `is_satisfied_by` are +# requirement methods, and `get_dependencies` is a candidate method. +# +# The factory is the interface to pip's internal mechanisms. It is stateless, +# and is created by the resolver and held as a property of the provider. It is +# responsible for creating Requirement and Candidate objects, and provides +# services to those objects (access to pip's finder and preparer). + + +class PipProvider(AbstractProvider): + def __init__( + self, + factory, # type: Factory + constraints, # type: Dict[str, Constraint] + ignore_dependencies, # type: bool + upgrade_strategy, # type: str + user_requested, # type: Set[str] + ): + # type: (...) -> None + self._factory = factory + self._constraints = constraints + self._ignore_dependencies = ignore_dependencies + self._upgrade_strategy = upgrade_strategy + self._user_requested = user_requested + + def identify(self, dependency): + # type: (Union[Requirement, Candidate]) -> str + return dependency.name + + def get_preference( + self, + resolution, # type: Optional[Candidate] + candidates, # type: Sequence[Candidate] + information # type: Sequence[Tuple[Requirement, Candidate]] + ): + # type: (...) -> Any + transitive = all(parent is not None for _, parent in information) + return (transitive, bool(candidates)) + + def find_matches(self, requirements): + # type: (Sequence[Requirement]) -> Iterable[Candidate] + if not requirements: + return [] + name = requirements[0].name + + def _eligible_for_upgrade(name): + # type: (str) -> bool + """Are upgrades allowed for this project? + + This checks the upgrade strategy, and whether the project was one + that the user specified in the command line, in order to decide + whether we should upgrade if there's a newer version available. + + (Note that we don't need access to the `--upgrade` flag, because + an upgrade strategy of "to-satisfy-only" means that `--upgrade` + was not specified). + """ + if self._upgrade_strategy == "eager": + return True + elif self._upgrade_strategy == "only-if-needed": + return (name in self._user_requested) + return False + + return self._factory.find_candidates( + requirements, + constraint=self._constraints.get(name, Constraint.empty()), + prefers_installed=(not _eligible_for_upgrade(name)), + ) + + def is_satisfied_by(self, requirement, candidate): + # type: (Requirement, Candidate) -> bool + return requirement.is_satisfied_by(candidate) + + def get_dependencies(self, candidate): + # type: (Candidate) -> Sequence[Requirement] + with_requires = not self._ignore_dependencies + return [ + r + for r in candidate.iter_dependencies(with_requires) + if r is not None + ] diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/provider.pyc b/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/provider.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2e389cf2096ba000f1940ef2633a10cddb2df98 GIT binary patch literal 3791 zcmcIn>uwuG6h6CloY+a4G@%7rQ7!#JT@*XqREeq-NQykWP+X;?O6eT+=EzYMDt?z!bClF5ou}SBr3=(s zptMfCI;9QjH7H%A-Xf(-)LWu-nR?5Vo}u2El3z{utx#`;(pBoMmehGl&QiKYy)|+& zNU=c5p}s?Loqi%ZB6`$Yr?^4g<|5?Q|KihhFtV%YZtWObgps{pw#|8DLtK0j6^@z$FB)uw0!c>nwH&`eQwo zKnbF$k&S(W33`y_g$iOdR9OuBX=UtLUf3TFiZE6I`^2ij$gT+0s3IuX)W)h<W@-n?Ru^cjhj-O`8rkhkDr3z)YAVt&i^P{dg^9 zlC%IQQU#!~Styey`;3!vc%Tx!vpF2YvppP@M#2GYgW!F>fWb)hx>J55b_X}MtGI>L zgj@EGjm=A9hAd2#fXrv(TIMvh>`25vJst4eGOPQePjRVXfys@k=otz8mPGdVFt8G8 z074*X`^X{uy#$o1WC1Rhr+pVVViui$t)~$ZGV8905QvGABF|wK0VtQe%?0*DpNlUi<{e+h;eFE1_Krf021%* z=%~v}Y=U=3{isSWx%OrDC0d)*X{vV$vo< ziYb`ZsEZih6}Xtc!0J|^ym5#y9(Ar>#IumM?rzx{bbfz|# zm={QWp3S`&JL6eilRFQUXLj@bB%bKz={|ES)D>vyW$F+t4pdZ~}+P8lMm8CLRW`AQA)izF&2$L~@^_c^0VTJ7sB4vu4s&q-107`$_zA5v+qbZAGV zZ6v#JLg!RGu47EebOTf|#j#~xd&=aSMP|f4JTmh&=7xnPw+34*yDMvTr{-LAA`U>@ zScxq(vy84xo@M-))GHh^#1`5FCED=7f}N3sfifO*NpV77soSPTD^8HM{dKdIO|SX zyE7#SxEcxqc@;sB=J7sWP~cy{n*R=WEUVAyK}_sl$LLsm8NF`g`W$Soq8Wy8&8e@{ ztMx|xQoY(~%A4{)MiJQ#4p0u~MO*T})Qs&(&1ih=A)tS#LzQhGKoX-`D&!NSae^ppipW~3vJ{J{E*-TOs-zYtH UlQoebz3TF}=3HMq@2sEu59iy5y8r+H literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/requirements.py b/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/requirements.py new file mode 100644 index 0000000..bc1061f --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/requirements.py @@ -0,0 +1,137 @@ +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +from .base import Requirement, format_name + +if MYPY_CHECK_RUNNING: + from pip._vendor.packaging.specifiers import SpecifierSet + + from pip._internal.req.req_install import InstallRequirement + + from .base import Candidate, CandidateLookup + + +class ExplicitRequirement(Requirement): + def __init__(self, candidate): + # type: (Candidate) -> None + self.candidate = candidate + + def __repr__(self): + # type: () -> str + return "{class_name}({candidate!r})".format( + class_name=self.__class__.__name__, + candidate=self.candidate, + ) + + @property + def name(self): + # type: () -> str + # No need to canonicalise - the candidate did this + return self.candidate.name + + def format_for_error(self): + # type: () -> str + return self.candidate.format_for_error() + + def get_candidate_lookup(self): + # type: () -> CandidateLookup + return self.candidate, None + + def is_satisfied_by(self, candidate): + # type: (Candidate) -> bool + return candidate == self.candidate + + +class SpecifierRequirement(Requirement): + def __init__(self, ireq): + # type: (InstallRequirement) -> None + assert ireq.link is None, "This is a link, not a specifier" + self._ireq = ireq + self._extras = frozenset(ireq.extras) + + def __str__(self): + # type: () -> str + return str(self._ireq.req) + + def __repr__(self): + # type: () -> str + return "{class_name}({requirement!r})".format( + class_name=self.__class__.__name__, + requirement=str(self._ireq.req), + ) + + @property + def name(self): + # type: () -> str + canonical_name = canonicalize_name(self._ireq.req.name) + return format_name(canonical_name, self._extras) + + def format_for_error(self): + # type: () -> str + + # Convert comma-separated specifiers into "A, B, ..., F and G" + # This makes the specifier a bit more "human readable", without + # risking a change in meaning. (Hopefully! Not all edge cases have + # been checked) + parts = [s.strip() for s in str(self).split(",")] + if len(parts) == 0: + return "" + elif len(parts) == 1: + return parts[0] + + return ", ".join(parts[:-1]) + " and " + parts[-1] + + def get_candidate_lookup(self): + # type: () -> CandidateLookup + return None, self._ireq + + def is_satisfied_by(self, candidate): + # type: (Candidate) -> bool + assert candidate.name == self.name, \ + "Internal issue: Candidate is not for this requirement " \ + " {} vs {}".format(candidate.name, self.name) + # We can safely always allow prereleases here since PackageFinder + # already implements the prerelease logic, and would have filtered out + # prerelease candidates if the user does not expect them. + spec = self._ireq.req.specifier + return spec.contains(candidate.version, prereleases=True) + + +class RequiresPythonRequirement(Requirement): + """A requirement representing Requires-Python metadata. + """ + def __init__(self, specifier, match): + # type: (SpecifierSet, Candidate) -> None + self.specifier = specifier + self._candidate = match + + def __repr__(self): + # type: () -> str + return "{class_name}({specifier!r})".format( + class_name=self.__class__.__name__, + specifier=str(self.specifier), + ) + + @property + def name(self): + # type: () -> str + return self._candidate.name + + def format_for_error(self): + # type: () -> str + return "Python " + str(self.specifier) + + def get_candidate_lookup(self): + # type: () -> CandidateLookup + if self.specifier.contains(self._candidate.version, prereleases=True): + return self._candidate, None + return None, None + + def is_satisfied_by(self, candidate): + # type: (Candidate) -> bool + assert candidate.name == self._candidate.name, "Not Python candidate" + # We can safely always allow prereleases here since PackageFinder + # already implements the prerelease logic, and would have filtered out + # prerelease candidates if the user does not expect them. + return self.specifier.contains(candidate.version, prereleases=True) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/requirements.pyc b/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/requirements.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eafebc166c26e08d071b80b6008363086b143e8b GIT binary patch literal 6416 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 RequirementSet + + constraints = {} # type: Dict[str, Constraint] + user_requested = set() # type: Set[str] + requirements = [] + for req in root_reqs: + if req.constraint: + # Ensure we only accept valid constraints + problem = check_invalid_constraint_type(req) + if problem: + raise InstallationError(problem) + if not req.match_markers(): + continue + name = canonicalize_name(req.name) + if name in constraints: + constraints[name] &= req + else: + constraints[name] = Constraint.from_ireq(req) + else: + if req.user_supplied and req.name: + user_requested.add(canonicalize_name(req.name)) + r = self.factory.make_requirement_from_install_req( + req, requested_extras=(), + ) + if r is not None: + requirements.append(r) + + provider = PipProvider( + factory=self.factory, + constraints=constraints, + ignore_dependencies=self.ignore_dependencies, + upgrade_strategy=self.upgrade_strategy, + user_requested=user_requested, + ) + reporter = BaseReporter() + resolver = RLResolver(provider, reporter) + + try: + try_to_avoid_resolution_too_deep = 2000000 + self._result = resolver.resolve( + requirements, max_rounds=try_to_avoid_resolution_too_deep, + ) + + except ResolutionImpossible as e: + error = self.factory.get_installation_error(e) + six.raise_from(error, e) + + req_set = RequirementSet(check_supported_wheels=check_supported_wheels) + for candidate in self._result.mapping.values(): + ireq = candidate.get_install_requirement() + if ireq is None: + continue + + # Check if there is already an installation under the same name, + # and set a flag for later stages to uninstall it, if needed. + # * There isn't, good -- no uninstalltion needed. + # * The --force-reinstall flag is set. Always reinstall. + # * The installation is different in version or editable-ness, so + # we need to uninstall it to install the new distribution. + # * The installed version is the same as the pending distribution. + # Skip this distrubiton altogether to save work. + installed_dist = self.factory.get_dist_to_uninstall(candidate) + if installed_dist is None: + ireq.should_reinstall = False + elif self.factory.force_reinstall: + ireq.should_reinstall = True + elif installed_dist.parsed_version != candidate.version: + ireq.should_reinstall = True + elif dist_is_editable(installed_dist) != candidate.is_editable: + ireq.should_reinstall = True + else: + continue + + link = candidate.source_link + if link and link.is_yanked: + # The reason can contain non-ASCII characters, Unicode + # is required for Python 2. + msg = ( + u'The candidate selected for download or install is a ' + u'yanked version: {name!r} candidate (version {version} ' + u'at {link})\nReason for being yanked: {reason}' + ).format( + name=candidate.name, + version=candidate.version, + link=link, + reason=link.yanked_reason or u'', + ) + logger.warning(msg) + + req_set.add_named_requirement(ireq) + + return req_set + + def get_installation_order(self, req_set): + # type: (RequirementSet) -> List[InstallRequirement] + """Get order for installation of requirements in RequirementSet. + + The returned list contains a requirement before another that depends on + it. This helps ensure that the environment is kept consistent as they + get installed one-by-one. + + The current implementation creates a topological ordering of the + dependency graph, while breaking any cycles in the graph at arbitrary + points. We make no guarantees about where the cycle would be broken, + other than they would be broken. + """ + assert self._result is not None, "must call resolve() first" + + graph = self._result.graph + weights = get_topological_weights(graph) + + sorted_items = sorted( + req_set.requirements.items(), + key=functools.partial(_req_set_item_sorter, weights=weights), + reverse=True, + ) + return [ireq for _, ireq in sorted_items] + + +def get_topological_weights(graph): + # type: (Graph) -> Dict[Optional[str], int] + """Assign weights to each node based on how "deep" they are. + + This implementation may change at any point in the future without prior + notice. + + We take the length for the longest path to any node from root, ignoring any + paths that contain a single node twice (i.e. cycles). This is done through + a depth-first search through the graph, while keeping track of the path to + the node. + + Cycles in the graph result would result in node being revisited while also + being it's own path. In this case, take no action. This helps ensure we + don't get stuck in a cycle. + + When assigning weight, the longer path (i.e. larger length) is preferred. + """ + path = set() # type: Set[Optional[str]] + weights = {} # type: Dict[Optional[str], int] + + def visit(node): + # type: (Optional[str]) -> None + if node in path: + # We hit a cycle, so we'll break it here. + return + + # Time to visit the children! + path.add(node) + for child in graph.iter_children(node): + visit(child) + path.remove(node) + + last_known_parent_count = weights.get(node, 0) + weights[node] = max(last_known_parent_count, len(path)) + + # `None` is guaranteed to be the root node by resolvelib. + visit(None) + + # Sanity checks + assert weights[None] == 0 + assert len(weights) == len(graph) + + return weights + + +def _req_set_item_sorter( + item, # type: Tuple[str, InstallRequirement] + weights, # type: Dict[Optional[str], int] +): + # type: (...) -> Tuple[int, str] + """Key function used to sort install requirements for installation. + + Based on the "weight" mapping calculated in ``get_installation_order()``. + The canonical package name is returned as the second member as a tie- + breaker to ensure the result is predictable, which is useful in tests. + """ + name = canonicalize_name(item[0]) + return weights[name], name diff --git a/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/resolver.pyc b/venv/lib/python2.7/site-packages/pip/_internal/resolution/resolvelib/resolver.pyc new file mode 100644 index 0000000000000000000000000000000000000000..041cb0f6ca27dc1dfe7e18cd49a0c02eb174dd53 GIT binary patch literal 8342 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 RE&ZMJo^LKUFaB!2{lBnBL(u>L literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/self_outdated_check.py b/venv/lib/python2.7/site-packages/pip/_internal/self_outdated_check.py new file mode 100644 index 0000000..fbd9dfd --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/self_outdated_check.py @@ -0,0 +1,205 @@ +from __future__ import absolute_import + +import datetime +import hashlib +import json +import logging +import os.path +import sys + +from pip._vendor.packaging import version as packaging_version +from pip._vendor.six import ensure_binary + +from pip._internal.index.collector import LinkCollector +from pip._internal.index.package_finder import PackageFinder +from pip._internal.models.selection_prefs import SelectionPreferences +from pip._internal.utils.filesystem import ( + adjacent_tmp_file, + check_path_owner, + replace, +) +from pip._internal.utils.misc import ( + ensure_dir, + get_distribution, + get_installed_version, +) +from pip._internal.utils.packaging import get_installer +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + import optparse + from typing import Any, Dict, Text, Union + + from pip._internal.network.session import PipSession + + +SELFCHECK_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ" + + +logger = logging.getLogger(__name__) + + +def _get_statefile_name(key): + # type: (Union[str, Text]) -> str + key_bytes = ensure_binary(key) + name = hashlib.sha224(key_bytes).hexdigest() + return name + + +class SelfCheckState(object): + def __init__(self, cache_dir): + # type: (str) -> None + self.state = {} # type: Dict[str, Any] + self.statefile_path = None + + # Try to load the existing state + if cache_dir: + self.statefile_path = os.path.join( + cache_dir, "selfcheck", _get_statefile_name(self.key) + ) + try: + with open(self.statefile_path) as statefile: + self.state = json.load(statefile) + except (IOError, ValueError, KeyError): + # Explicitly suppressing exceptions, since we don't want to + # error out if the cache file is invalid. + pass + + @property + def key(self): + # type: () -> str + return sys.prefix + + def save(self, pypi_version, current_time): + # type: (str, datetime.datetime) -> None + # If we do not have a path to cache in, don't bother saving. + if not self.statefile_path: + return + + # Check to make sure that we own the directory + if not check_path_owner(os.path.dirname(self.statefile_path)): + return + + # Now that we've ensured the directory is owned by this user, we'll go + # ahead and make sure that all our directories are created. + ensure_dir(os.path.dirname(self.statefile_path)) + + state = { + # Include the key so it's easy to tell which pip wrote the + # file. + "key": self.key, + "last_check": current_time.strftime(SELFCHECK_DATE_FMT), + "pypi_version": pypi_version, + } + + text = json.dumps(state, sort_keys=True, separators=(",", ":")) + + with adjacent_tmp_file(self.statefile_path) as f: + f.write(ensure_binary(text)) + + try: + # Since we have a prefix-specific state file, we can just + # overwrite whatever is there, no need to check. + replace(f.name, self.statefile_path) + except OSError: + # Best effort. + pass + + +def was_installed_by_pip(pkg): + # type: (str) -> bool + """Checks whether pkg was installed by pip + + This is used not to display the upgrade message when pip is in fact + installed by system package manager, such as dnf on Fedora. + """ + dist = get_distribution(pkg) + if not dist: + return False + return "pip" == get_installer(dist) + + +def pip_self_version_check(session, options): + # type: (PipSession, optparse.Values) -> None + """Check for an update for pip. + + Limit the frequency of checks to once per week. State is stored either in + the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix + of the pip script path. + """ + installed_version = get_installed_version("pip") + if not installed_version: + return + + pip_version = packaging_version.parse(installed_version) + pypi_version = None + + try: + state = SelfCheckState(cache_dir=options.cache_dir) + + current_time = datetime.datetime.utcnow() + # Determine if we need to refresh the state + if "last_check" in state.state and "pypi_version" in state.state: + last_check = datetime.datetime.strptime( + state.state["last_check"], + SELFCHECK_DATE_FMT + ) + if (current_time - last_check).total_seconds() < 7 * 24 * 60 * 60: + pypi_version = state.state["pypi_version"] + + # Refresh the version if we need to or just see if we need to warn + if pypi_version is None: + # Lets use PackageFinder to see what the latest pip version is + link_collector = LinkCollector.create( + session, + options=options, + suppress_no_index=True, + ) + + # Pass allow_yanked=False so we don't suggest upgrading to a + # yanked version. + selection_prefs = SelectionPreferences( + allow_yanked=False, + allow_all_prereleases=False, # Explicitly set to False + ) + + finder = PackageFinder.create( + link_collector=link_collector, + selection_prefs=selection_prefs, + ) + best_candidate = finder.find_best_candidate("pip").best_candidate + if best_candidate is None: + return + pypi_version = str(best_candidate.version) + + # save that we've performed a check + state.save(pypi_version, current_time) + + remote_version = packaging_version.parse(pypi_version) + + local_version_is_older = ( + pip_version < remote_version and + pip_version.base_version != remote_version.base_version and + was_installed_by_pip('pip') + ) + + # Determine if our pypi_version is older + if not local_version_is_older: + return + + # We cannot tell how the current pip is available in the current + # command context, so be pragmatic here and suggest the command + # that's always available. This does not accommodate spaces in + # `sys.executable`. + pip_cmd = "{} -m pip".format(sys.executable) + logger.warning( + "You are using pip version %s; however, version %s is " + "available.\nYou should consider upgrading via the " + "'%s install --upgrade pip' command.", + pip_version, pypi_version, pip_cmd + ) + except Exception: + logger.debug( + "There was an error checking the latest version of pip", + exc_info=True, + ) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/self_outdated_check.pyc b/venv/lib/python2.7/site-packages/pip/_internal/self_outdated_check.pyc new file mode 100644 index 0000000000000000000000000000000000000000..142334bf51c4db18947f87f2010cf166fb51ef6f GIT binary patch literal 5666 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 LZA>k{-I)C^S+f_D literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a72fb6eb72f59bf182f7508e8da945862c4a7795 GIT binary patch literal 146 zcmZSn%*%DVb8CDu0~9aQ(bd5Z-s?2ghLSP)9nOBlpl$V&JUs{rxQ>-5k6v!-zkJl@xEa3p^x5>> K1KCmn#0&r+E+Gm4 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.py new file mode 100644 index 0000000..3989ed3 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.py @@ -0,0 +1,44 @@ +""" +This code wraps the vendored appdirs module to so the return values are +compatible for the current pip code base. + +The intention is to rewrite current usages gradually, keeping the tests pass, +and eventually drop this after all usages are changed. +""" + +from __future__ import absolute_import + +import os + +from pip._vendor import appdirs as _appdirs + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List + + +def user_cache_dir(appname): + # type: (str) -> str + return _appdirs.user_cache_dir(appname, appauthor=False) + + +def user_config_dir(appname, roaming=True): + # type: (str, bool) -> str + path = _appdirs.user_config_dir(appname, appauthor=False, roaming=roaming) + if _appdirs.system == "darwin" and not os.path.isdir(path): + path = os.path.expanduser('~/.config/') + if appname: + path = os.path.join(path, appname) + return path + + +# for the discussion regarding site_config_dir locations +# see +def site_config_dirs(appname): + # type: (str) -> List[str] + dirval = _appdirs.site_config_dir(appname, appauthor=False, multipath=True) + if _appdirs.system not in ["win32", "darwin"]: + # always look in /etc directly as well + return dirval.split(os.pathsep) + ['/etc'] + return [dirval] diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/appdirs.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f38503c1dcf62307e29376d2c1d55c61f8417b2d GIT binary patch literal 1744 zcmb_cOOG5i5H9yTw=3g&)MP;b(B-MpgA>SL~IHWKX-QT#xT7*WmBN^shhuR0ZsR3H~1+1BBQ3VF1>+ z3or?k0;&Yo2?#n5pd7$@z`7xnL#Rfu9{0KtloP0?u%3djQ}92t)fmbHs8U#`AZm0v zfw$=W4%iu(DZCZ1J_K{X!n@>um8Fb5n` z2U#_yE3J%;3=La&8#`aiSGw$MklNd{XsT96cZz0bjc22x^WN4`wyy0Xoa$ibDTcJt z)e%*$sU?O-zusPW7p;7Erwe+6o;O~bPM787V|i|E>*@`AjyA*~TOGpVRM$pY%s8^0 zG`?xk2EFRDXuZVCa_C@1ZU9`$oZR6vz*Gx#$W6%rk zqu_^^KfY8a&%QqSPUSx>m(Q2q_PQbJzIP!OIb^@-L@|eIIAyyeR z#4;Y>jzM%6w~fyRWIM%8?E}ZVc<6%ls?f#ODkLP1Q1p#1gZ)pMwXST28sIH_j$eyd zwF|`miK|0ID4slhzWeR7ibT8=@!)G+F1qN-u-M0(x0m@CuYZ6mP?nGs^he2&oU6i$ zZdZl9d?m29?@D9RrBcGBfO5P--`lSVI zZIrAss(zUhx{(O-jjpgUA|+5wvn?*(l=X8sy?y+PQftiyJz8o$? zv=x#A&;-mE06TiiV7oxDlUw_1iycQk*kaeXnmNmfvz#LlVegNJJLv5rTw#VAB#*?$ z;=UM*M}qr|lD%f+86Ix+88Q+F%!pvs5X>0PC*Z##rjQY=d^aKZ%?LIE9FNvL*_=vaoI_i> zm><%S;#0g}+uk)f>`8VW2hV#$I3A(nTls}gNJbF}@q5WbkgQ-qv!HK3;*mA)p52_E-8^2>Xv>LAu5f>*=f>|ar-zu6-~2<| mZc68`|M}8++I-QE_%8|dKvQm<93?YcN6A<`7#xgdvws0MjE#i= literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/compat.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/compat.py new file mode 100644 index 0000000..9a2bb78 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/compat.py @@ -0,0 +1,293 @@ +"""Stuff that differs in different Python versions and platform +distributions.""" + +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import, division + +import codecs +import functools +import locale +import logging +import os +import shutil +import sys + +from pip._vendor.six import PY2, text_type + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Callable, Optional, Protocol, Text, Tuple, TypeVar, Union + + # Used in the @lru_cache polyfill. + F = TypeVar('F') + + class LruCache(Protocol): + def __call__(self, maxsize=None): + # type: (Optional[int]) -> Callable[[F], F] + raise NotImplementedError + +try: + import ipaddress +except ImportError: + try: + from pip._vendor import ipaddress # type: ignore + except ImportError: + import ipaddr as ipaddress # type: ignore + ipaddress.ip_address = ipaddress.IPAddress # type: ignore + ipaddress.ip_network = ipaddress.IPNetwork # type: ignore + + +__all__ = [ + "ipaddress", "uses_pycache", "console_to_str", + "get_path_uid", "stdlib_pkgs", "WINDOWS", "samefile", "get_terminal_size", +] + + +logger = logging.getLogger(__name__) + +if PY2: + import imp + + try: + cache_from_source = imp.cache_from_source # type: ignore + except AttributeError: + # does not use __pycache__ + cache_from_source = None + + uses_pycache = cache_from_source is not None +else: + uses_pycache = True + from importlib.util import cache_from_source + + +if PY2: + # In Python 2.7, backslashreplace exists + # but does not support use for decoding. + # We implement our own replace handler for this + # situation, so that we can consistently use + # backslash replacement for all versions. + def backslashreplace_decode_fn(err): + raw_bytes = (err.object[i] for i in range(err.start, err.end)) + # Python 2 gave us characters - convert to numeric bytes + raw_bytes = (ord(b) for b in raw_bytes) + return u"".join(map(u"\\x{:x}".format, raw_bytes)), err.end + codecs.register_error( + "backslashreplace_decode", + backslashreplace_decode_fn, + ) + backslashreplace_decode = "backslashreplace_decode" +else: + backslashreplace_decode = "backslashreplace" + + +def has_tls(): + # type: () -> bool + try: + import _ssl # noqa: F401 # ignore unused + return True + except ImportError: + pass + + from pip._vendor.urllib3.util import IS_PYOPENSSL + return IS_PYOPENSSL + + +def str_to_display(data, desc=None): + # type: (Union[bytes, Text], Optional[str]) -> Text + """ + For display or logging purposes, convert a bytes object (or text) to + text (e.g. unicode in Python 2) safe for output. + + :param desc: An optional phrase describing the input data, for use in + the log message if a warning is logged. Defaults to "Bytes object". + + This function should never error out and so can take a best effort + approach. It is okay to be lossy if needed since the return value is + just for display. + + We assume the data is in the locale preferred encoding. If it won't + decode properly, we warn the user but decode as best we can. + + We also ensure that the output can be safely written to standard output + without encoding errors. + """ + if isinstance(data, text_type): + return data + + # Otherwise, data is a bytes object (str in Python 2). + # First, get the encoding we assume. This is the preferred + # encoding for the locale, unless that is not found, or + # it is ASCII, in which case assume UTF-8 + encoding = locale.getpreferredencoding() + if (not encoding) or codecs.lookup(encoding).name == "ascii": + encoding = "utf-8" + + # Now try to decode the data - if we fail, warn the user and + # decode with replacement. + try: + decoded_data = data.decode(encoding) + except UnicodeDecodeError: + logger.warning( + '%s does not appear to be encoded as %s', + desc or 'Bytes object', + encoding, + ) + decoded_data = data.decode(encoding, errors=backslashreplace_decode) + + # Make sure we can print the output, by encoding it to the output + # encoding with replacement of unencodable characters, and then + # decoding again. + # We use stderr's encoding because it's less likely to be + # redirected and if we don't find an encoding we skip this + # step (on the assumption that output is wrapped by something + # that won't fail). + # The double getattr is to deal with the possibility that we're + # being called in a situation where sys.__stderr__ doesn't exist, + # or doesn't have an encoding attribute. Neither of these cases + # should occur in normal pip use, but there's no harm in checking + # in case people use pip in (unsupported) unusual situations. + output_encoding = getattr(getattr(sys, "__stderr__", None), + "encoding", None) + + if output_encoding: + output_encoded = decoded_data.encode( + output_encoding, + errors="backslashreplace" + ) + decoded_data = output_encoded.decode(output_encoding) + + return decoded_data + + +def console_to_str(data): + # type: (bytes) -> Text + """Return a string, safe for output, of subprocess output. + """ + return str_to_display(data, desc='Subprocess output') + + +def get_path_uid(path): + # type: (str) -> int + """ + Return path's uid. + + Does not follow symlinks: + https://github.com/pypa/pip/pull/935#discussion_r5307003 + + Placed this function in compat due to differences on AIX and + Jython, that should eventually go away. + + :raises OSError: When path is a symlink or can't be read. + """ + if hasattr(os, 'O_NOFOLLOW'): + fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW) + file_uid = os.fstat(fd).st_uid + os.close(fd) + else: # AIX and Jython + # WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW + if not os.path.islink(path): + # older versions of Jython don't have `os.fstat` + file_uid = os.stat(path).st_uid + else: + # raise OSError for parity with os.O_NOFOLLOW above + raise OSError( + "{} is a symlink; Will not return uid for symlinks".format( + path) + ) + return file_uid + + +def expanduser(path): + # type: (str) -> str + """ + Expand ~ and ~user constructions. + + Includes a workaround for https://bugs.python.org/issue14768 + """ + expanded = os.path.expanduser(path) + if path.startswith('~/') and expanded.startswith('//'): + expanded = expanded[1:] + return expanded + + +# packages in the stdlib that may have installation metadata, but should not be +# considered 'installed'. this theoretically could be determined based on +# dist.location (py27:`sysconfig.get_paths()['stdlib']`, +# py26:sysconfig.get_config_vars('LIBDEST')), but fear platform variation may +# make this ineffective, so hard-coding +stdlib_pkgs = {"python", "wsgiref", "argparse"} + + +# windows detection, covers cpython and ironpython +WINDOWS = (sys.platform.startswith("win") or + (sys.platform == 'cli' and os.name == 'nt')) + + +def samefile(file1, file2): + # type: (str, str) -> bool + """Provide an alternative for os.path.samefile on Windows/Python2""" + if hasattr(os.path, 'samefile'): + return os.path.samefile(file1, file2) + else: + path1 = os.path.normcase(os.path.abspath(file1)) + path2 = os.path.normcase(os.path.abspath(file2)) + return path1 == path2 + + +if hasattr(shutil, 'get_terminal_size'): + def get_terminal_size(): + # type: () -> Tuple[int, int] + """ + Returns a tuple (x, y) representing the width(x) and the height(y) + in characters of the terminal window. + """ + return tuple(shutil.get_terminal_size()) # type: ignore +else: + def get_terminal_size(): + # type: () -> Tuple[int, int] + """ + Returns a tuple (x, y) representing the width(x) and the height(y) + in characters of the terminal window. + """ + def ioctl_GWINSZ(fd): + try: + import fcntl + import termios + import struct + cr = struct.unpack_from( + 'hh', + fcntl.ioctl(fd, termios.TIOCGWINSZ, '12345678') + ) + except Exception: + return None + if cr == (0, 0): + return None + return cr + cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) + if not cr: + if sys.platform != "win32": + try: + fd = os.open(os.ctermid(), os.O_RDONLY) + cr = ioctl_GWINSZ(fd) + os.close(fd) + except Exception: + pass + if not cr: + cr = (os.environ.get('LINES', 25), os.environ.get('COLUMNS', 80)) + return int(cr[1]), int(cr[0]) + + +# Fallback to noop_lru_cache in Python 2 +# TODO: this can be removed when python 2 support is dropped! +def noop_lru_cache(maxsize=None): + # type: (Optional[int]) -> Callable[[F], F] + def _wrapper(f): + # type: (F) -> F + return f + return _wrapper + + +lru_cache = getattr(functools, "lru_cache", noop_lru_cache) # type: LruCache diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/compat.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/compat.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f07f168374d1812ceea9fa55ce4fc3efb55f0db GIT binary patch literal 8525 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/compatibility_tags.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/compatibility_tags.py new file mode 100644 index 0000000..4f21874 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/compatibility_tags.py @@ -0,0 +1,166 @@ +"""Generate and work with PEP 425 Compatibility Tags. +""" + +from __future__ import absolute_import + +import re + +from pip._vendor.packaging.tags import ( + Tag, + compatible_tags, + cpython_tags, + generic_tags, + interpreter_name, + interpreter_version, + mac_platforms, +) + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Optional, Tuple + + from pip._vendor.packaging.tags import PythonVersion + +_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)') + + +def version_info_to_nodot(version_info): + # type: (Tuple[int, ...]) -> str + # Only use up to the first two numbers. + return ''.join(map(str, version_info[:2])) + + +def _mac_platforms(arch): + # type: (str) -> List[str] + match = _osx_arch_pat.match(arch) + if match: + name, major, minor, actual_arch = match.groups() + mac_version = (int(major), int(minor)) + arches = [ + # Since we have always only checked that the platform starts + # with "macosx", for backwards-compatibility we extract the + # actual prefix provided by the user in case they provided + # something like "macosxcustom_". It may be good to remove + # this as undocumented or deprecate it in the future. + '{}_{}'.format(name, arch[len('macosx_'):]) + for arch in mac_platforms(mac_version, actual_arch) + ] + else: + # arch pattern didn't match (?!) + arches = [arch] + return arches + + +def _custom_manylinux_platforms(arch): + # type: (str) -> List[str] + arches = [arch] + arch_prefix, arch_sep, arch_suffix = arch.partition('_') + if arch_prefix == 'manylinux2014': + # manylinux1/manylinux2010 wheels run on most manylinux2014 systems + # with the exception of wheels depending on ncurses. PEP 599 states + # manylinux1/manylinux2010 wheels should be considered + # manylinux2014 wheels: + # https://www.python.org/dev/peps/pep-0599/#backwards-compatibility-with-manylinux2010-wheels + if arch_suffix in {'i686', 'x86_64'}: + arches.append('manylinux2010' + arch_sep + arch_suffix) + arches.append('manylinux1' + arch_sep + arch_suffix) + elif arch_prefix == 'manylinux2010': + # manylinux1 wheels run on most manylinux2010 systems with the + # exception of wheels depending on ncurses. PEP 571 states + # manylinux1 wheels should be considered manylinux2010 wheels: + # https://www.python.org/dev/peps/pep-0571/#backwards-compatibility-with-manylinux1-wheels + arches.append('manylinux1' + arch_sep + arch_suffix) + return arches + + +def _get_custom_platforms(arch): + # type: (str) -> List[str] + arch_prefix, arch_sep, arch_suffix = arch.partition('_') + if arch.startswith('macosx'): + arches = _mac_platforms(arch) + elif arch_prefix in ['manylinux2014', 'manylinux2010']: + arches = _custom_manylinux_platforms(arch) + else: + arches = [arch] + return arches + + +def _get_python_version(version): + # type: (str) -> PythonVersion + if len(version) > 1: + return int(version[0]), int(version[1:]) + else: + return (int(version[0]),) + + +def _get_custom_interpreter(implementation=None, version=None): + # type: (Optional[str], Optional[str]) -> str + if implementation is None: + implementation = interpreter_name() + if version is None: + version = interpreter_version() + return "{}{}".format(implementation, version) + + +def get_supported( + version=None, # type: Optional[str] + platform=None, # type: Optional[str] + impl=None, # type: Optional[str] + abi=None # type: Optional[str] +): + # type: (...) -> List[Tag] + """Return a list of supported tags for each version specified in + `versions`. + + :param version: a string version, of the form "33" or "32", + or None. The version will be assumed to support our ABI. + :param platform: specify the exact platform you want valid + tags for, or None. If None, use the local system platform. + :param impl: specify the exact implementation you want valid + tags for, or None. If None, use the local interpreter impl. + :param abi: specify the exact abi you want valid + tags for, or None. If None, use the local interpreter abi. + """ + supported = [] # type: List[Tag] + + python_version = None # type: Optional[PythonVersion] + if version is not None: + python_version = _get_python_version(version) + + interpreter = _get_custom_interpreter(impl, version) + + abis = None # type: Optional[List[str]] + if abi is not None: + abis = [abi] + + platforms = None # type: Optional[List[str]] + if platform is not None: + platforms = _get_custom_platforms(platform) + + is_cpython = (impl or interpreter_name()) == "cp" + if is_cpython: + supported.extend( + cpython_tags( + python_version=python_version, + abis=abis, + platforms=platforms, + ) + ) + else: + supported.extend( + generic_tags( + interpreter=interpreter, + abis=abis, + platforms=platforms, + ) + ) + supported.extend( + compatible_tags( + python_version=python_version, + interpreter=interpreter, + platforms=platforms, + ) + ) + + return supported diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/compatibility_tags.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/compatibility_tags.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4500b1b397fab5ed0585805f73ff8d26aa16c36b GIT binary patch literal 4387 zcmcInUvt~W5nq55Mbeb1$WbiUPKv6TmThd>mK@dfWHL%rPwHvIx{%WubKD>>07{_n zFSuhY)#6Mu_Dde}l!rd_bL7+HWAwSx{&oS7RO7c=qPRTl-R-+b?Q zRQ@gDcXyXa{Rab|Xb5VMZ&GAXY|_vqgP&^@)o56gxjIF4ikE1(L~(|dg&L-7g?SI7ufDF3HOYEX2M;w}xl6tB{7mEt#O_(ri~ zSx#A_;TjnUQBb4tCGwl}!l2=s#iuCVs}f016| zLRYKDg4v~)bsAn{=6-J#Hc;Cjp9D#eyE?Gk#J8TM`H}T3)Q8r?`wy)TffKCvFT2ddu=v5k5Li0*>8PgNRCbl`+>mgaiUTjrS>2$stVuM`pmj)nx?!JL*m9~}F$!QjE*lO8Lk>mYv&mDWuR{*-BmaU;zh@@SGpK_P(UJ`^qgQkI7be5HFIo&V)=+4I%(WV) zxHsz_(Us3-*E8|N2gAb`l-H#3B{^XO)krZW1!`--(rBvj19gf?l;B2 zp#1Ml$G9=klR8aJn$~EF!4kX2X^mI%pw5F4W*c-M*qk=#bctZ9-~DxyriC4s=v0iT z8*E2x_$lT;H|fjIXu3>Ei%&kl$;))QT-jGK8qcTB^QmT4;UlR!b_)Mwa2(=c%0!g@YcSn#tzPsb> z-1*U}Te^+iv0LuD-D79hEs)I3b;v0~w!2vtBz}(}wK>Rb3#7nRJSh)G;j!cu@hlZ& z^GP)sVe(v%y$UTHZ=!S>1K{!!^OX1-Oe@ZaWVQfur?FThOs+GrK+eVF9PQ3QpewV_>d&W`P#kJx zZWvvBIz|^}_t-u8%eUFv#hUvVAaBB^upnaTs80DUE*Rh-imrfLK5)L1B)NZPb_Cz| zsmgaD3ooiOJFk6($z_nDfN%~g^US%}gX^={qb%*^S&zY1j5nEU#yh6Rs_}Q0S9bBh z7bZGtQog}genFh~i{LK#u!~d@)E4l$w4!uK^rH~$i^B{QTlV?%`LxFa3Hw2s1h)7F zt6*<{6p_vNpks-GI7l>FoHVg-^CZ5ny{a+>i=ML3+PIifoO#IXz)$$&vGUAn;wygg zZwycx5o5@bD4%St1|791|7GbQa1QWc7;ZJBP{JxGsJtE}5m~rc|A@y$on$Lwwkbhd z%uXa|C8vXr1rU{e&4vUZ?4OW{NXEI}a~O|N$fX>kS|ib;@FLfrqH(1f^f8jnY7r)& zG?xB&Q7NX${?1~Gb&FyoU$F10eYlMs=t-Vft`(tuv(k~JCKBM^GCffSSjY5BResy=~T50lNBr09ECMpm~QR=yorB0L%;+eoR8gM+k z>h!a5^8f3w;QtoOKBI*DG<=l~V87mjA+R_XA;a$@nlr-L)Fl}N>r~MPRPPs3&=>A7 z=y981Z!_6q@;;MWOgQsMg$s@~+6KGEOpb4x5AAW3OWKi!p#r(+S6~-uGjYBgKXY`O zi@AM|$z3MD1(CWKDyMv{I+rZQEi;$9nIdB_6zf5k8fHVPTvvWO<Pjos3nJC2`vjw2UwoY4ef9ypH8(gh&A2y(lH*O@-L<-||(e&%{d?g1jT&+cz? z^%Ju$Sb3iLrGuYI5cKde)R&i`zCOty#^!`8XqC?bt6;=^yUlN4qAR~Ug;8L?$z1NL z=6y&3yLf^4gSf&+STcu1Mz8UmjkW$DPW?#~e8^s<-UVrxt7gZ%(_RG>*UU?1x7KR3 Q)?072I<026T{HOeUuf#-ApigX literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/datetime.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/datetime.py new file mode 100644 index 0000000..4d0503c --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/datetime.py @@ -0,0 +1,14 @@ +"""For when pip wants to check the date or time. +""" + +from __future__ import absolute_import + +import datetime + + +def today_is_later_than(year, month, day): + # type: (int, int, int) -> bool + today = datetime.date.today() + given = datetime.date(year, month, day) + + return today > given diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/datetime.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/datetime.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38b1e93ddc4fae45c86f01fb3670c5c10cf34878 GIT binary patch literal 589 zcmb_a%}T>S5T5MDzoJwS?>Y9;20VCCq#y`hdWg4PmYA$&+szNziKUXB^x^~gG(Lte z;LNt-3%IafX1>gP^9`*0J{f#{e5wp~N6>dV1#mG1Il!DSfLwqLpcF6{5O6NRN|;N? zLwKj6keP?k9`(2h!Cl=(t3p>%W147{R_G$EqpZ-`GQvVfd5Sus8Z@Pz3=DO^C?LQg zLHg)w+o4vbZ0Z(gnIw{>L%O%q-3SC&1h5eB2C$K^O?!YofSyPRn-F>leF)2ttg-rR z#7cNbzy^3YvZhaX0M>cB_FH&;w2QhA*zg##Zyb=b99se~&N-Z$Y*|NQ-rN!GkB>%6o2h98S}wl7Y_vHSsm^n?lk literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.py new file mode 100644 index 0000000..2f20cfd --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.py @@ -0,0 +1,104 @@ +""" +A module that implements tooling to enable easy warnings about deprecations. +""" + +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import logging +import warnings + +from pip._vendor.packaging.version import parse + +from pip import __version__ as current_version +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Optional + + +DEPRECATION_MSG_PREFIX = "DEPRECATION: " + + +class PipDeprecationWarning(Warning): + pass + + +_original_showwarning = None # type: Any + + +# Warnings <-> Logging Integration +def _showwarning(message, category, filename, lineno, file=None, line=None): + if file is not None: + if _original_showwarning is not None: + _original_showwarning( + message, category, filename, lineno, file, line, + ) + elif issubclass(category, PipDeprecationWarning): + # We use a specially named logger which will handle all of the + # deprecation messages for pip. + logger = logging.getLogger("pip._internal.deprecations") + logger.warning(message) + else: + _original_showwarning( + message, category, filename, lineno, file, line, + ) + + +def install_warning_logger(): + # type: () -> None + # Enable our Deprecation Warnings + warnings.simplefilter("default", PipDeprecationWarning, append=True) + + global _original_showwarning + + if _original_showwarning is None: + _original_showwarning = warnings.showwarning + warnings.showwarning = _showwarning + + +def deprecated(reason, replacement, gone_in, issue=None): + # type: (str, Optional[str], Optional[str], Optional[int]) -> None + """Helper to deprecate existing functionality. + + reason: + Textual reason shown to the user about why this functionality has + been deprecated. + replacement: + Textual suggestion shown to the user about what alternative + functionality they can use. + gone_in: + The version of pip does this functionality should get removed in. + Raises errors if pip's current version is greater than or equal to + this. + issue: + Issue number on the tracker that would serve as a useful place for + users to find related discussion and provide feedback. + + Always pass replacement, gone_in and issue as keyword arguments for clarity + at the call site. + """ + + # Construct a nice message. + # This is eagerly formatted as we want it to get logged as if someone + # typed this entire message out. + sentences = [ + (reason, DEPRECATION_MSG_PREFIX + "{}"), + (gone_in, "pip {} will remove support for this functionality."), + (replacement, "A possible replacement is {}."), + (issue, ( + "You can find discussion regarding this at " + "https://github.com/pypa/pip/issues/{}." + )), + ] + message = " ".join( + template.format(val) for val, template in sentences if val is not None + ) + + # Raise as an error if it has to be removed. + if gone_in is not None and parse(current_version) >= parse(gone_in): + raise PipDeprecationWarning(message) + + warnings.warn(message, category=PipDeprecationWarning, stacklevel=2) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/deprecation.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e1624fb58d77161288761f10a536e124dc29158 GIT binary patch literal 3416 zcmb_e>uwyy60X@>;4jf7x-kTv4RIZ_Ua?309GK{nAiT(Sa<#xuR^vFDcV z9y?2He&GD!3C@$8M>skU!DH|Od{wPG+{cr!Q4sRee?M-`4xT{_@`_q4{4M zzuVhH_Wux4qA}h9r7g+>Dq1vdQNZIir#G&imNnU z@#7xleJWOIyh?#yC37abu28;4#X61GsklbtYZR2Y7P~emT_L?m6I|J+7ewboPsXqD z{qY<8=Krho0*bv!=^C#Xza^9F^dg|~b(Z%A*ImIyP4O;VOnvbgYfV8BydXU&rKwCy$;)cfPoH=gTPkdNkS{-5<0t?bsnZ z<;-2h@57pJj&r+?!QFe0!h3gi9`8OJ-BRu?%sk5KyB7+6>s4QPmi7GiHh|!hG=K^y z+#5h9e-TedQ5hFHida9AfZ)T-+ah~7&bocPbe-u0=Pn4BT z8z{TgxGc9@OVADLS=hr7H}F_CvKJ&gzA}IAY-9ds3{DYLL`N%R{z(oY;N_oKKE+qO zTXfpyWv5*_N60<>iOT!rFdHy(=PfdtT!#+39B1bNo%QInM~8SLmIB1tjlVt&*X;>3 zBl`}NfnmdiQNty3?0^-=EkvWL)Z&V$GTAhP^^rZOPUcZ0sAkqS`$-;KD;PN5n^#jT zp1KvtQ|-ROP#gI&-|27QrG>UO#v1k(0#Q#Z<6~ozVH9SM2GM&+}2{Y5$6Q~ z6lbSjl>oqs9>pC3FjyV+h)IHd#3?coxKcfdo7{<+ab4>&9WYRW*2`2DU9F@(utAJ^ zKd}2An?{Em`XPJ5ajq`8FT9TN1#BW+26lYxJc**Yk`YIQHlMNrYyh>dch-WHAYm=p z!Tbnz|ABy51|Y!h?Fk}Z@MA$}ngwuVhagNlbOu1Xf^?6`5}9)sX~2omm7RUbwjUXP zV2^nSI1$28mkj2y45=2-&jG^^pbxL`ObVaieU%D>C_dg`~7do%CVQzhy zHlWvMnRU##lcr2Otz~XD?DrM^49K@CZ;8y~$NHIT;(R`@*eN9+=MJ=LEROc{d~z_u zRA&EpraFl2;-r18%L^^i;rzNfj}xf`uij}JxB{wH<=@q!;-IRD0_Ui-(kM@_S_KfAJXPQVz*1DlI#pTek7dZhIJ4NO zjj4=PnVj{JRY_wE3f|%pfHei$P#t$bwaO^{l%aOj!V13JAI#*XFSOm|p(>kVAKQTs zyTh3{Ir67Dbs{RlLC0FfD57lnq{)@QttORO+`(StDy$}1nZlqPDy1sTY|>aRl`6(` zZK~re)oP-3x{qt-(Xx}D#51dEa4L2#T=}t@!z+75byng?&rT|ns@O~$U;Ckl0wWv5 zpXdW;vLy+snzEUj`${U+^E1my$$oi$rcN@f@Zc-k)Lix1s6X-6(7uOlJF2c=4R;qy zdMfzf`PtAu!ipzVBM~AfELm^#G&ZR;C>#mU@W8p+-rCxlX6~TbA0`z_@2rlc_KK}` z3x}do5~+mW%#!@rZ9Jbq0B!v6A${MXGo-)g3twO*<-x{a5M=r{!BY?j^DLh-l8Wg0 zkx2;V7O@iw26Gb)KLKM99U~irc{N%rxblKFFM%;Fv-4+DUFv7GxgBHRy9f$5Axo7- zOOhPr`dH@~Yc=v^fSGowZHgZ3-H*^jeZKphRLH|BE5)*qEtQ^bo-QvNHYpV$_bsx4 z*?PbzNWt->B~@d|yHc0tfe4BO)pOEFskcZ(T_)Ow+&*3^L;}KsY*TL7?3;MeJL@PT zD=5foonG)p=YwFQHFz8IqGlAORkG;*CXH(hn!%9wg~AsR%TcO>X`eN z;hecVd>jT?7Bc?fhj_VHyC`W5hi+D5cgPzA$oZISUC4-qAMh9Me!lfRt#<=Qfv?u= z*O1i;Z{l?Uq)3+#a1zR&`EK~Oowl>k&^nx4h9?EpDv+>%>+V9^Q BRG|O> literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/direct_url_helpers.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/direct_url_helpers.py new file mode 100644 index 0000000..f1fe209 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/direct_url_helpers.py @@ -0,0 +1,130 @@ +import logging + +from pip._internal.models.direct_url import ( + DIRECT_URL_METADATA_NAME, + ArchiveInfo, + DirectUrl, + DirectUrlValidationError, + DirInfo, + VcsInfo, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.vcs import vcs + +try: + from json import JSONDecodeError +except ImportError: + # PY2 + JSONDecodeError = ValueError # type: ignore + +if MYPY_CHECK_RUNNING: + from typing import Optional + + from pip._internal.models.link import Link + + from pip._vendor.pkg_resources import Distribution + +logger = logging.getLogger(__name__) + + +def direct_url_as_pep440_direct_reference(direct_url, name): + # type: (DirectUrl, str) -> str + """Convert a DirectUrl to a pip requirement string.""" + direct_url.validate() # if invalid, this is a pip bug + requirement = name + " @ " + fragments = [] + if isinstance(direct_url.info, VcsInfo): + requirement += "{}+{}@{}".format( + direct_url.info.vcs, direct_url.url, direct_url.info.commit_id + ) + elif isinstance(direct_url.info, ArchiveInfo): + requirement += direct_url.url + if direct_url.info.hash: + fragments.append(direct_url.info.hash) + else: + assert isinstance(direct_url.info, DirInfo) + # pip should never reach this point for editables, since + # pip freeze inspects the editable project location to produce + # the requirement string + assert not direct_url.info.editable + requirement += direct_url.url + if direct_url.subdirectory: + fragments.append("subdirectory=" + direct_url.subdirectory) + if fragments: + requirement += "#" + "&".join(fragments) + return requirement + + +def direct_url_from_link(link, source_dir=None, link_is_in_wheel_cache=False): + # type: (Link, Optional[str], bool) -> DirectUrl + if link.is_vcs: + vcs_backend = vcs.get_backend_for_scheme(link.scheme) + assert vcs_backend + url, requested_revision, _ = ( + vcs_backend.get_url_rev_and_auth(link.url_without_fragment) + ) + # For VCS links, we need to find out and add commit_id. + if link_is_in_wheel_cache: + # If the requested VCS link corresponds to a cached + # wheel, it means the requested revision was an + # immutable commit hash, otherwise it would not have + # been cached. In that case we don't have a source_dir + # with the VCS checkout. + assert requested_revision + commit_id = requested_revision + else: + # If the wheel was not in cache, it means we have + # had to checkout from VCS to build and we have a source_dir + # which we can inspect to find out the commit id. + assert source_dir + commit_id = vcs_backend.get_revision(source_dir) + return DirectUrl( + url=url, + info=VcsInfo( + vcs=vcs_backend.name, + commit_id=commit_id, + requested_revision=requested_revision, + ), + subdirectory=link.subdirectory_fragment, + ) + elif link.is_existing_dir(): + return DirectUrl( + url=link.url_without_fragment, + info=DirInfo(), + subdirectory=link.subdirectory_fragment, + ) + else: + hash = None + hash_name = link.hash_name + if hash_name: + hash = "{}={}".format(hash_name, link.hash) + return DirectUrl( + url=link.url_without_fragment, + info=ArchiveInfo(hash=hash), + subdirectory=link.subdirectory_fragment, + ) + + +def dist_get_direct_url(dist): + # type: (Distribution) -> Optional[DirectUrl] + """Obtain a DirectUrl from a pkg_resource.Distribution. + + Returns None if the distribution has no `direct_url.json` metadata, + or if `direct_url.json` is invalid. + """ + if not dist.has_metadata(DIRECT_URL_METADATA_NAME): + return None + try: + return DirectUrl.from_json(dist.get_metadata(DIRECT_URL_METADATA_NAME)) + except ( + DirectUrlValidationError, + JSONDecodeError, + UnicodeDecodeError + ) as e: + logger.warning( + "Error parsing %s for %s: %s", + DIRECT_URL_METADATA_NAME, + dist.project_name, + e, + ) + return None diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/direct_url_helpers.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/direct_url_helpers.pyc new file mode 100644 index 0000000000000000000000000000000000000000..109a54d572a9fc2dae4fc4d3a018bed6fdca5bf1 GIT binary patch literal 3377 zcmcIm-Et#G6+S(qA4`^3UVAs*p8!)p5~Uz=Dr^Nv5o%pt1BP8KHQvo8s!)@$rfrRO zew68!7h~xLr;6ekcms+%iU;5(FOWNUj1<@KoimcGO>T+pX?LGKeY(#%-*>v*FE^V1 z{_{VA0nLA^_Ke%W^@QItB=cPMqK?^0T!eudI1^{bTDs9&SBPW?J5 zUg=V@MrnikjdEO}q)F*I_18(A-w@+fN?Md|P=ABevuuYd`WiiNQt>BJO6fMsGesZj z1{MF51vN@GDZNhp>!r;)C0mqkQ-8Z0uTgS?(wo%3Nh%}KM59+o@6e^9{w<0c^ckGF z&0gud6gBBHIP)q+>mvUa%a1xOcpm>3KfO*3U3&}7gG2vd|4H!Fe;7PEc(V6k@5x@! z+k13i*D<+Q42JQUKFm&X+hFCm&;$FlNXn&)(Fb7?N1=`L?4T&}!q!VwS;qYj28R0` zg}&WF^XQ}BeiZEg>R|sjf&aAEJM8_koO3aEHZbL&jlr*v9`_#TK^|$bTu!WE;_;Zb z3zJe(f#hMFJugS>=7ZSSB0iq5*1&;)RTu*M_{uS4xJLsT(U|g z9kMQ6I#fKPsY8)Nqsm-9s!FG}7}n|1r5|H`HeFe~CX4^Vi+Qh_XmAgfkoGTV>e8sW zu+iX5s!zY5>?bQW*4c*nJJ}ZfadE2A2DQxR3(;4NU!&s7xnJoTCq;P55i%WUku>H2 zyz%{VAKpz_Bwr9`Ru@3`F7TU}-K+hAp-#rSFx~OFeGQgYWSLE?6`ECP2C9HazoTiD%#(#O z6wIuvs7|9z?z64y%t7dYK=b1)&23SHwIDjFuNpn- zFerOImph+fE{OHF(UTI$SkcDnC@Az90H0?*mt(^?znHy$G4pSr*Aab&eQW|$#uE0g zV0@}=a2yVv1J?m45tzXcY!tMYU7xiq8(~#ol{X4PsD~3flnEBTi0v?+*kFNG!9TB9 z9*e7|(9gfi7H^_iCG^!wF4#Dx{yl0h3IgM>q#To^muFf?!K4hBGX8al#YItA4w!sW3^d!Z>;$KP z3!dQ~@w>Ed#$NuDnAusTnQ>WQ5tI z7FW)?P_F_w!{UeBbX;s_{)*=Du?^$QTfGk0Q3%G*PXU)QTiw;0x7%!b`0=%!6q)fD z173XM*`fBLl?&PfCcG^7KDmlvcVzPH6Ay?E@v;biD0cFKSAShAHeQ^`4bl}o!$6e> zgEtNfTqdX9YsLdh@b5i*J$VTU(y?=}*u=*w@);mL2Yg<_kxD+xk{3&D4vfFXip=q+ zSPyVn)$%^S^EC@{;dSl#7#sNVNaZT=@-E9d$c8vKWfu6tI!woSf0nOMt|xezPRggF zWMgiZE3>_g=4HF{(=%~>UVNo;hANvE-Bp|$pZ61tAe;}&G&33kNoo-I_b~7|XaXtA zh5Z*{Vzj@@vY(>4%ChwSk8cA$$j{) Dict[str, str] + """Parse provided arguments, returning an object that has the + matched arguments. + + Any unknown arguments are ignored. + """ + result = {} + for arg in args: + try: + _, match = _distutils_getopt.getopt(args=[arg]) + except DistutilsArgError: + # We don't care about any other options, which here may be + # considered unrecognized since our option list is not + # exhaustive. + pass + else: + result.update(match.__dict__) + return result diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/distutils_args.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/distutils_args.pyc new file mode 100644 index 0000000000000000000000000000000000000000..006c0b23462c1e8b2a8656d16caa5a3b9c120bcd GIT binary patch literal 1607 zcmb_c&2k$>5dLO&Wjl&RIl%-HAl?H99k5)*fm1}qWlV4ZB5aCEq5`(oI}>S@{maZO zSd`5rT)6TsJPnV*13>pkiZ=+~*wu`>znUGGQ_!Ss$L%xYe{gBei{-&odNU}F* z`ZP1Pu~}{o_2gLVN-s>;$@E!Lrt=5NR<&J#Hwpae>BFb-(dWlUU&PV3qtVIeLEmFv zf%BDGCwxgx%{C$GOr`s^R?o7tp(P!rL({Y>)X?-u%1UFCJl{V}%)bzs*kovST5F~% zkxHAPbG+J^XQ!{Ps`JFIgN;^ephM>Nb2 zG-berz}YuArxJdDf(sAxJU5@3 z8`^1N!)anjP~DK8BC+YTy>HNU_+dE@oAP;C{ZwB1BuRzYq^z`(1Gmf-fnu6I7r^l) zmMg-<6Gsipbyutj}PXZ8N7?H`@Ye*U;%$c;EFtT;|Bh59+zyB`-DCvXwvE?h@`; zhRqGp6Ta9Jy&&**#i-Azt&w;XagGZcOODEIaE;Yh86Cmf#{c4a+s@}{_5DodwynK) zbpo!mFAu|2_SLy)+gnGZ4RZzDX=#BG^I@rTF)Ziysv!f#cZ^vu<<@JKXMEi(Nfo*K z=?>Yc#e-Mv9k})m?7Sx4NABL?XiJ?N7V$mgXgjLPB?0OF%Bs>t%*Kebxn$S>NilYR guc%~`t4}z6^8rmeV#nL@HpK0~CvvU7*E-w&KOK&ELI3~& literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/encoding.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/encoding.py new file mode 100644 index 0000000..5b83d61 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/encoding.py @@ -0,0 +1,41 @@ +import codecs +import locale +import re +import sys + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Tuple, Text + +BOMS = [ + (codecs.BOM_UTF8, 'utf-8'), + (codecs.BOM_UTF16, 'utf-16'), + (codecs.BOM_UTF16_BE, 'utf-16-be'), + (codecs.BOM_UTF16_LE, 'utf-16-le'), + (codecs.BOM_UTF32, 'utf-32'), + (codecs.BOM_UTF32_BE, 'utf-32-be'), + (codecs.BOM_UTF32_LE, 'utf-32-le'), +] # type: List[Tuple[bytes, Text]] + +ENCODING_RE = re.compile(br'coding[:=]\s*([-\w.]+)') + + +def auto_decode(data): + # type: (bytes) -> Text + """Check a bytes string for a BOM to correctly detect the encoding + + Fallback to locale.getpreferredencoding(False) like open() on Python3""" + for bom, encoding in BOMS: + if data.startswith(bom): + return data[len(bom):].decode(encoding) + # Lets check the first two lines as in PEP263 + for line in data.split(b'\n')[:2]: + if line[0:1] == b'#' and ENCODING_RE.search(line): + result = ENCODING_RE.search(line) + assert result is not None + encoding = result.groups()[0].decode('ascii') + return data.decode(encoding) + return data.decode( + locale.getpreferredencoding(False) or sys.getdefaultencoding(), + ) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/encoding.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/encoding.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea68c40c106644beb60f42f1b211ad8ac44b7b5a GIT binary patch literal 1613 zcmb_b+iu%N5FL`b`x-kfniOc*_JwXC8Ib@ZNH1t(D{W9mNoWT_6dM9ft}MzclI4yN ztFT|1ytJRt|LE7`tq=Wyen5M6Eh%cy$5PtinVGY@bEEUuO6|=rzxP6#J{7#b!BTG^ zBK$3qMBO>IsB6vaHg)Y8cBtzZY?Ca|s7T!+S)xd}Fjj|TiAH7WmT6R>ZiPlw>Q>20 zhy>BFMp1$Kw!upj6=!&vqS6enP*k4bRf;Mzyhc%VhSw>oX?%*Cu92{5xIxhpy+YKR z6fM(hq;g&7bl|NZzxZ!F9nS*f4Ty)&A3yKye&62xq31vCbRKlR^BnCfKSb67tSi<%U3TB|vCw3>@FXrR51Bf>O_lhYS>zdAlr zpLs9pM=u-4pKpaaUVW_&YZpuX32}axm}u{~Nk=waT6AgC1uARNg{AY)%UWd^je2Y7 z(1ooX2S1kS+4*ZjF6h$07TM(P9j9~&61s|ifj&l8&TPt`5UMaNX@@@c-|A(7E^tVh z&Z?w-Bd*ZT2%td2D!sx8IdlW}qNUh5jqhz3Pw1Hr*deabaEW+Xv$8*kS7^AZw?jSf z^n9vcb>agNp1Fa0GGU=y#W^bF_R}1udygKvoVsC}=OSb|aU;P1E)Rq&lB=TDYA&Ap zfs`i!&H-JfVIW20RB)DyzQEpSM)tr{V#}5BnQ+rgB;J;rChp@257MNibU$jb4H;um zZ01RePtCvtDvaZfw+4e58-#a&9FYeHIjfg357>b!MZ$W9B7qQv*{U)bGcUo|?(9C= z!$9`@wjn7ItKfXAl*l3njbu-yY9Bh(i_+dRs)vpB2A z3CbX4z4>7H)6Phn%<9Dni#!SB_LyU-wr58-vWcljFy^#(RjChfocUa+xM{6fAKEvq zPw?KbZdli>lI6VzzX?Q_HB|n()^)dX;cseu69V@(=65#CoeiF37%Cs$tNl}5ch=YY zecd&aI9l3!dU*d1>kogb+}^XMQx|V$5X+YN+3R-6y5&qYW7}}noPPk^VPm%d literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/entrypoints.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/entrypoints.py new file mode 100644 index 0000000..befd01c --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/entrypoints.py @@ -0,0 +1,31 @@ +import sys + +from pip._internal.cli.main import main +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, List + + +def _wrapper(args=None): + # type: (Optional[List[str]]) -> int + """Central wrapper for all old entrypoints. + + Historically pip has had several entrypoints defined. Because of issues + arising from PATH, sys.path, multiple Pythons, their interactions, and most + of them having a pip installed, users suffer every time an entrypoint gets + moved. + + To alleviate this pain, and provide a mechanism for warning users and + directing them to an appropriate place for help, we now define all of + our old entrypoints as wrappers for the current one. + """ + sys.stderr.write( + "WARNING: pip is being invoked by an old script wrapper. This will " + "fail in a future version of pip.\n" + "Please see https://github.com/pypa/pip/issues/5599 for advice on " + "fixing the underlying issue.\n" + "To avoid this problem you can invoke Python with '-m pip' instead of " + "running pip directly.\n" + ) + return main(args) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/entrypoints.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/entrypoints.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1a5efdfc7252d07d79f9d191013c6d8815b594b GIT binary patch literal 1431 zcmb_c&5jf|5O&YZ?uHRaD2GTvIn<3g%yvtWhy;pI$O^HDWLOQ0A|{8Cx7)q#joY?d z?io7DExGVOJWbvL9w1b?8`$KW*4X3UufD3U%G39^=6}C=yDi1|P3ZpzYWOR475y?{ zgxCz@i7=UHCt@=Z8ShPnnTmEMHZzf_nF!C)jhQe9qCFIwL(v|I&5_7#!l@3#Uzyn4 zV9XbbL&Dep(6?G-G>kLqTB+?Y`;ulqzdC!hJvn`R@@%_)xmrD4Jy|fj_yu*(ebmlM zldk=wF_sL%jgOpA!#mVPA+9oUHDQx~W+IDI@rU5iiv)%5=*Ee%F-QaZAiY-sY8OBn z1I|>yTfKMMM$G4PpzoAyxu8or(Sz3>8i~{@K($j0bL|RLs@7IjIsB+f*`WeggGTHW zCM+2=YI_NFa4noYIzL?k_LzGan=>Wuq?3C<2tw~!!>o6uf zLZ>q=(b+MqO#HOPNMu#D1Y!^nu&Zlwlj-&lb*l*E8f&;zaiG__9dRGrK6e}wwbL>x zGNKVYX*JmQ!R>TKFwm;9kyc}yg1DE#GLOM5F-;^Z9Tc&r^~5z2umy^Ia6Tk-Z)B+w zK%|dolwAm<3OK9sbP>NH*?)Po=9GFc1PS3n zF(++z?l)DzMbET21+Wa-$B(EvoU`+LO$kyezG_dFk51_g)rst{5_+xOeaV{UQ0Pou&v7P_18&fr8FfDwsZTePHtznCx_YB F(+|vuo%jF% literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.py new file mode 100644 index 0000000..303243f --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.py @@ -0,0 +1,224 @@ +import errno +import fnmatch +import os +import os.path +import random +import shutil +import stat +import sys +from contextlib import contextmanager +from tempfile import NamedTemporaryFile + +# NOTE: retrying is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import. +from pip._vendor.retrying import retry # type: ignore +from pip._vendor.six import PY2 + +from pip._internal.utils.compat import get_path_uid +from pip._internal.utils.misc import format_size +from pip._internal.utils.typing import MYPY_CHECK_RUNNING, cast + +if MYPY_CHECK_RUNNING: + from typing import Any, BinaryIO, Iterator, List, Union + + class NamedTemporaryFileResult(BinaryIO): + @property + def file(self): + # type: () -> BinaryIO + pass + + +def check_path_owner(path): + # type: (str) -> bool + # If we don't have a way to check the effective uid of this process, then + # we'll just assume that we own the directory. + if sys.platform == "win32" or not hasattr(os, "geteuid"): + return True + + assert os.path.isabs(path) + + previous = None + while path != previous: + if os.path.lexists(path): + # Check if path is writable by current user. + if os.geteuid() == 0: + # Special handling for root user in order to handle properly + # cases where users use sudo without -H flag. + try: + path_uid = get_path_uid(path) + except OSError: + return False + return path_uid == 0 + else: + return os.access(path, os.W_OK) + else: + previous, path = path, os.path.dirname(path) + return False # assume we don't own the path + + +def copy2_fixed(src, dest): + # type: (str, str) -> None + """Wrap shutil.copy2() but map errors copying socket files to + SpecialFileError as expected. + + See also https://bugs.python.org/issue37700. + """ + try: + shutil.copy2(src, dest) + except (OSError, IOError): + for f in [src, dest]: + try: + is_socket_file = is_socket(f) + except OSError: + # An error has already occurred. Another error here is not + # a problem and we can ignore it. + pass + else: + if is_socket_file: + raise shutil.SpecialFileError( + "`{f}` is a socket".format(**locals())) + + raise + + +def is_socket(path): + # type: (str) -> bool + return stat.S_ISSOCK(os.lstat(path).st_mode) + + +@contextmanager +def adjacent_tmp_file(path, **kwargs): + # type: (str, **Any) -> Iterator[NamedTemporaryFileResult] + """Return a file-like object pointing to a tmp file next to path. + + The file is created securely and is ensured to be written to disk + after the context reaches its end. + + kwargs will be passed to tempfile.NamedTemporaryFile to control + the way the temporary file will be opened. + """ + with NamedTemporaryFile( + delete=False, + dir=os.path.dirname(path), + prefix=os.path.basename(path), + suffix='.tmp', + **kwargs + ) as f: + result = cast('NamedTemporaryFileResult', f) + try: + yield result + finally: + result.file.flush() + os.fsync(result.file.fileno()) + + +_replace_retry = retry(stop_max_delay=1000, wait_fixed=250) + +if PY2: + @_replace_retry + def replace(src, dest): + # type: (str, str) -> None + try: + os.rename(src, dest) + except OSError: + os.remove(dest) + os.rename(src, dest) + +else: + replace = _replace_retry(os.replace) + + +# test_writable_dir and _test_writable_dir_win are copied from Flit, +# with the author's agreement to also place them under pip's license. +def test_writable_dir(path): + # type: (str) -> bool + """Check if a directory is writable. + + Uses os.access() on POSIX, tries creating files on Windows. + """ + # If the directory doesn't exist, find the closest parent that does. + while not os.path.isdir(path): + parent = os.path.dirname(path) + if parent == path: + break # Should never get here, but infinite loops are bad + path = parent + + if os.name == 'posix': + return os.access(path, os.W_OK) + + return _test_writable_dir_win(path) + + +def _test_writable_dir_win(path): + # type: (str) -> bool + # os.access doesn't work on Windows: http://bugs.python.org/issue2528 + # and we can't use tempfile: http://bugs.python.org/issue22107 + basename = 'accesstest_deleteme_fishfingers_custard_' + alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789' + for _ in range(10): + name = basename + ''.join(random.choice(alphabet) for _ in range(6)) + file = os.path.join(path, name) + try: + fd = os.open(file, os.O_RDWR | os.O_CREAT | os.O_EXCL) + # Python 2 doesn't support FileExistsError and PermissionError. + except OSError as e: + # exception FileExistsError + if e.errno == errno.EEXIST: + continue + # exception PermissionError + if e.errno == errno.EPERM or e.errno == errno.EACCES: + # This could be because there's a directory with the same name. + # But it's highly unlikely there's a directory called that, + # so we'll assume it's because the parent dir is not writable. + # This could as well be because the parent dir is not readable, + # due to non-privileged user access. + return False + raise + else: + os.close(fd) + os.unlink(file) + return True + + # This should never be reached + raise EnvironmentError( + 'Unexpected condition testing for writable directory' + ) + + +def find_files(path, pattern): + # type: (str, str) -> List[str] + """Returns a list of absolute paths of files beneath path, recursively, + with filenames which match the UNIX-style shell glob pattern.""" + result = [] # type: List[str] + for root, _, files in os.walk(path): + matches = fnmatch.filter(files, pattern) + result.extend(os.path.join(root, f) for f in matches) + return result + + +def file_size(path): + # type: (str) -> Union[int, float] + # If it's a symlink, return 0. + if os.path.islink(path): + return 0 + return os.path.getsize(path) + + +def format_file_size(path): + # type: (str) -> str + return format_size(file_size(path)) + + +def directory_size(path): + # type: (str) -> Union[int, float] + size = 0.0 + for root, _dirs, files in os.walk(path): + for filename in files: + file_path = os.path.join(root, filename) + size += file_size(file_path) + return size + + +def format_directory_size(path): + # type: (str) -> str + return format_size(directory_size(path)) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/filesystem.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09bd3960b31a8f9436640323563e7d30e7abe181 GIT binary patch literal 7273 zcmcIpO>i7X6@Ih3`dQhEY}s-w$H9|0B%6@P#snYL4fZABF9(V$;J}RocWxZ0;zku5siJ@bP#idMq>39C_`cV(l1bo#g{1B6e%;eQ z?|tukuSeCtPfz{v{hziwQvQtL`xSi5FFlb6f1acwt^K+uEpH^RNUJicS0Ad^q*WWq z$D}njs*g)+d{m#1)`Zq8l1@smF0HzFT(2tWl=O~B>xgUDBt0sj~+dmDX9zF(vW5baCh-@^z8-L~gg9lngsP%697`5>0F6oJ5al z#h17)(Tt9Ux}K7FTB2hT9hYcUq7#^+(t29r87Zt6KP}P8(a7_X%?KoMMYhk&dwBM| zL~}alGZLNB%10%7Tr1B?bXqIVNi?sOhD2wy^1MV(XypZ(uh}>YdnW(H&q@PE75f;9 zPM+C#&-TJB+>8q+pM`uS?8VWIxYy5%uo%9Uq_OKGE{fO|L)WaLdHwb!*EovCW^CL2 z&~CK{N#vwQAnoQwFSKowyc0JnXj?Av=I!gZ+lyaXT7117++0~%UiqS}LEH(AZEzXO z$**QZJBjaClMMSFcg^qtCG1hYY%`CxTPNVkW%?Gg=q;?jg&=Pk}c9=NrIuYgO3n(twUjITr>A#d@ z#)fJ7(xv6?cRtmlNI&fa1}L&Hy)dvzYA$r4YBMx8?k)6(dO%9%IURQ`)dm+*HMH9q ztkiDXDM;GwULFlnHmR?Ek@w@m4ucsq4z{GVN8eX4jajK_-P5?IYNEMl2UXJ_P_ZK0 z@E1>ZDq_xwt=fqCPyUHvNJlXpm<@Yf`Rf^y7 zX%4QJgNvW3WQx8By1*jEk7amF?2&T7gNm$Wvr@B1WoJr?AByLBc3PV2_hD;&K-Yha z!#Vd1chw-Lgw5N0z(KQgsJc1Sq1opn8&;@8Q2!Ctuie#Rw1L#fFs`);4 zw^oFG-)zyx7dm-=c&YKczcH|W58{|sH9o~jw&|O^vlCliiNLq{l#icgKkg)9N*-3j z`l0dTJqT?aEljx~aqPp=xxZy?-+cDMg^j_cA%|?`*+O1yUPz1?#FwvJxp;9wA27t| z+h6NGc-v2mAC~K`G>BG(i`%YZQMVk>J_?%URR^y+1c_<89ji${xKW+R(Z5#Hyn{_T z4kP4D(NWY#F<6{L+f~HxPuiv$4*2U3fX8^G$HCNlar8NEf>b6GRqv#C0>6s3Y7OWc z_s&-KLjbqC$k8NY$8EsYcD1C4?Ha)|iVJi+Js3#es!KK7%gyHM;_CqyQ>CWbM|U-r z?CnCVI^kiSICudo+~6u2K-_`oJ`5W>lz$rq4g^rc1i-C377heA!I{97rDSX*L0*Tt z2kh6r`x+ex#*M(@O73u=cRBuzP0KLl^>1sj z#Gp5YyToT60i%C@fE%kR0wIauJx z3n&g%kF;j(Rm@QZwEO7Yb;6!i?56GoS>R1cpN#cpp~&n?{BzQGD&rUr6<^ zU{qsf|1Cso)W_tTSQC%IXc&YK{vJmVD1(Lq06_p5*@K!4pHn$vOHC_dT8_)B96ceg za?}_Suv_q^NzK{*B;JE@@$Qc^a@ab<2I2G*xjWDM_ksL~UNnC5kOYZ8M*d!yv%d?} z&C5EMLB>Dk+!Bo$?gTsbkiRrBVhyZ`qhq#EeqGl=+Xqwh>F0NnQ#B6l|q_{Bc z4l?Gjh}!lU=rY{sL~(a>E7{&jds*JUTNpdIx4Sod=ie_| zTs(5J%cyH24EWzUNo&w4JVBtwzHWJNpXh)+_>^N1cGY%w z)k#Rgw7(T@#14Lso>v*>f}h_+WZLT&FaHP)cQ=%T*fKoPP4;QZ%7_;wywUgstGZ!c z?ECP6XE*qwKwYi~p<>Obwh{dw@<%!#BcdLAwH;hr3p7VvZ7&8(S8tT!rS-)(T>eVO zM#i1x+OxE@zTCW_D=b}K3f^?WtBZ?EO%06N(@FF41~tgiB-;rz1EfPOW%rUI&w5y1 zGvWrF$;DA7mO+yRBZiBgv_v;jOO#2iM&KI|Ke`2iFJqb?aw?)vY7BlSyyv|+guUk~ zGnH9yyz`#fv??pS>CFW5#ZQxW9QrO z90oXbS>%48^O6%hasr&JWCQQ+DOtmSlE=|kW_P@Iq`1HOIS75jVVSzdq1*kKyu`V}KF z+f4Hf&c(Mb3;SM24XD>qcl5e52VRE&2gh><{h;qrYX@KqZlUQ&K41rPpM$qUMV|kE zyzLiQrt~&_bLLVB9%(mBchnoYnW{wL4Q1i*T1Cc;^tC|@xUfY0mdXiUp_B+#C(t;l zbLmX6adArl9AVI-16cDfP-&!TocTE?)l39XK8LvVl*>d$M7hZRXSqG)#{D#;IK>Fo zETyAV#6fQ*!FX|r>VC?rnn(;iTh9lc(KnTPG`+iun%Gg90SuCoo={8hi^IsjT;cMifiU(CfH_k5(Q7md=805X(!Ur zq3V?H-S=}>g~4wjF?@Y4c^$e4{$If`z%2hKFw9}<5)A*o|39OnL`36bs0UwV z(Pg1;JE(sot}Jy<(NZ`v31O*>x0^{^rL&Xl|SPh)zC>8OwW*IDea&n+l} z@|a2{rI2_Eh@*fs7U-3mR@N(cKz&9^+#VkOJ?0&&;ZwoKI|cAID)STdv-SD< a*vy$Zv}dPg#_A{P&(x39C+lPNseb{n*F|3d literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/filetypes.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/filetypes.py new file mode 100644 index 0000000..daa0ca7 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/filetypes.py @@ -0,0 +1,16 @@ +"""Filetype information. +""" +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Tuple + +WHEEL_EXTENSION = '.whl' +BZ2_EXTENSIONS = ('.tar.bz2', '.tbz') # type: Tuple[str, ...] +XZ_EXTENSIONS = ('.tar.xz', '.txz', '.tlz', + '.tar.lz', '.tar.lzma') # type: Tuple[str, ...] +ZIP_EXTENSIONS = ('.zip', WHEEL_EXTENSION) # type: Tuple[str, ...] +TAR_EXTENSIONS = ('.tar.gz', '.tgz', '.tar') # type: Tuple[str, ...] +ARCHIVE_EXTENSIONS = ( + ZIP_EXTENSIONS + BZ2_EXTENSIONS + TAR_EXTENSIONS + XZ_EXTENSIONS +) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/filetypes.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/filetypes.pyc new file mode 100644 index 0000000000000000000000000000000000000000..765413ab170473a4dc2b9f8fd163077fbbd648ab GIT binary patch literal 774 zcmaKq-EPw`6vvO#HvOQ3u^}pP#bs`mNWI`{LX0ZV2nbbMVD*ia&2DGpq*3AumN(b~ z?P>NHdw}gYZPS7fmd?rFzjKa{9lLga(7C(0WtXrS4g9`C%OyGvK+zN67AOL-1=Io} zEXcf))SQ;BW}W^%1%+v(bzVhW_9a8-EMKApE$FnaxjE zsSTz$P)$aJ^BV!J>kqAYYQ ztonCr$Lw)eUbU^n|N1+%KZ>iCm54Iu38rXsKF0X+k}>@Xbt+Sr$wZ4RiIlt2QsplG zWtl9-7zJ$`x1N_j`5DfC41NDI^UtS#I0?Rn`YE#aw7(-0eSqkk?h}(lgVEn;dN$ri z<_^!sgJJO9-@^`4*tz@^r=E^e4|jhelUzqio%DmB#hcim(yBvw<)OU!=K17qdacdf cpT@~ literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/glibc.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/glibc.py new file mode 100644 index 0000000..3610424 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/glibc.py @@ -0,0 +1,98 @@ +# The following comment should be removed at some point in the future. +# mypy: strict-optional=False + +from __future__ import absolute_import + +import os +import sys + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple + + +def glibc_version_string(): + # type: () -> Optional[str] + "Returns glibc version string, or None if not using glibc." + return glibc_version_string_confstr() or glibc_version_string_ctypes() + + +def glibc_version_string_confstr(): + # type: () -> Optional[str] + "Primary implementation of glibc_version_string using os.confstr." + # os.confstr is quite a bit faster than ctypes.DLL. It's also less likely + # to be broken or missing. This strategy is used in the standard library + # platform module: + # https://github.com/python/cpython/blob/fcf1d003bf4f0100c9d0921ff3d70e1127ca1b71/Lib/platform.py#L175-L183 + if sys.platform == "win32": + return None + try: + # os.confstr("CS_GNU_LIBC_VERSION") returns a string like "glibc 2.17": + _, version = os.confstr("CS_GNU_LIBC_VERSION").split() + except (AttributeError, OSError, ValueError): + # os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)... + return None + return version + + +def glibc_version_string_ctypes(): + # type: () -> Optional[str] + "Fallback implementation of glibc_version_string using ctypes." + + try: + import ctypes + except ImportError: + return None + + # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen + # manpage says, "If filename is NULL, then the returned handle is for the + # main program". This way we can let the linker do the work to figure out + # which libc our process is actually using. + process_namespace = ctypes.CDLL(None) + try: + gnu_get_libc_version = process_namespace.gnu_get_libc_version + except AttributeError: + # Symbol doesn't exist -> therefore, we are not linked to + # glibc. + return None + + # Call gnu_get_libc_version, which returns a string like "2.5" + gnu_get_libc_version.restype = ctypes.c_char_p + version_str = gnu_get_libc_version() + # py2 / py3 compatibility: + if not isinstance(version_str, str): + version_str = version_str.decode("ascii") + + return version_str + + +# platform.libc_ver regularly returns completely nonsensical glibc +# versions. E.g. on my computer, platform says: +# +# ~$ python2.7 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.7') +# ~$ python3.5 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.9') +# +# But the truth is: +# +# ~$ ldd --version +# ldd (Debian GLIBC 2.22-11) 2.22 +# +# This is unfortunate, because it means that the linehaul data on libc +# versions that was generated by pip 8.1.2 and earlier is useless and +# misleading. Solution: instead of using platform, use our code that actually +# works. +def libc_ver(): + # type: () -> Tuple[str, str] + """Try to determine the glibc version + + Returns a tuple of strings (lib, version) which default to empty strings + in case the lookup fails. + """ + glibc_version = glibc_version_string() + if glibc_version is None: + return ("", "") + else: + return ("glibc", glibc_version) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/glibc.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/glibc.pyc new file mode 100644 index 0000000000000000000000000000000000000000..986726e1a7f1e15e4ac37642ae246e5d7f0aec44 GIT binary patch literal 2153 zcmb_dZEGY&5U!rt_uH75Q}I0E1{7T3ZX+j%f=YCaXE1J#+2nG!2*YHyH<@JKnC|gd zN$^AbBKSe@xA<%P8U6vEs@c8sg!>?7*{P|X>aMP?=c#JA3Yns!KK z@X@57iKbnewM6OBtS!n7nsr3!^FEV77csu=v_mWoEpSBtDM3A9QKp&@;A-vy;1CUV7s^(_TFHvfO%=!Pk1~unyvFxR9m6 za%oU64Wc}oL$$YGI>9aqZ3ZyYb74NlaLcB}RuLEX;>_4EN$%a>J^S&alt0N6#F^D4 zPQ6vxI5AtY|FBrt*Iu$0=htw~$d&Z4+QuX4Ie>!noGGTnxkKemnz=Mt+#&1IS%U$) zQgqhjynXM`CDEm#qwF>{Y>RB0ahSVw-lKA#lv2F*@r6Q)8*ps4As&`-8kP$W$R;|~ znGG2A8 zxG=(uA_?t0FH_55Fou>-of||`%J-z_OsAxeG2rkwLC;{I~XStv$3l3jc(4q^6f;LOQf9W#X7m!`La>)G3 z`WdR+Ws1Ox9)K@P=s!bbUxU8KVRZiAu#coPhSDL%f_`YCI3C=9N01Kq$pp*eU1=AB zk}r17&giSXy}BB*Dmc+L;No8K%;$0tjzmFp8kRvJAeP#&SIbbxsB@HF7U`N(sAJxC zrlWkOh1fm=WM73S$~@A>1X-ABQ-qQB-((ZV@{g8qUEE;Y-@{|L@leB68){88TkFcj zd(CaSebsf=)utm%VTv;Cg(|3XW zU94t{vpDmj(A0Y+d466M-aJI78;TWYz(F`dX?$a;M&H9&L_K7j;~e4g|Hks;?T(fVUMw1;M<+J)?ubXS?5L!MC7&3j&RO_^hc9rKu0WMcg$$ zBPiTkju}m#`XzGW JbvL^o{0%nu_+|hA literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/hashes.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/hashes.py new file mode 100644 index 0000000..d9f74a6 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/hashes.py @@ -0,0 +1,153 @@ +from __future__ import absolute_import + +import hashlib + +from pip._vendor.six import iteritems, iterkeys, itervalues + +from pip._internal.exceptions import ( + HashMismatch, + HashMissing, + InstallationError, +) +from pip._internal.utils.misc import read_chunks +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Dict, List, BinaryIO, NoReturn, Iterator + ) + from pip._vendor.six import PY3 + if PY3: + from hashlib import _Hash + else: + from hashlib import _hash as _Hash + + +# The recommended hash algo of the moment. Change this whenever the state of +# the art changes; it won't hurt backward compatibility. +FAVORITE_HASH = 'sha256' + + +# Names of hashlib algorithms allowed by the --hash option and ``pip hash`` +# Currently, those are the ones at least as collision-resistant as sha256. +STRONG_HASHES = ['sha256', 'sha384', 'sha512'] + + +class Hashes(object): + """A wrapper that builds multiple hashes at once and checks them against + known-good values + + """ + def __init__(self, hashes=None): + # type: (Dict[str, List[str]]) -> None + """ + :param hashes: A dict of algorithm names pointing to lists of allowed + hex digests + """ + self._allowed = {} if hashes is None else hashes + + def __and__(self, other): + # type: (Hashes) -> Hashes + if not isinstance(other, Hashes): + return NotImplemented + + # If either of the Hashes object is entirely empty (i.e. no hash + # specified at all), all hashes from the other object are allowed. + if not other: + return self + if not self: + return other + + # Otherwise only hashes that present in both objects are allowed. + new = {} + for alg, values in iteritems(other._allowed): + if alg not in self._allowed: + continue + new[alg] = [v for v in values if v in self._allowed[alg]] + return Hashes(new) + + @property + def digest_count(self): + # type: () -> int + return sum(len(digests) for digests in self._allowed.values()) + + def is_hash_allowed( + self, + hash_name, # type: str + hex_digest, # type: str + ): + # type: (...) -> bool + """Return whether the given hex digest is allowed.""" + return hex_digest in self._allowed.get(hash_name, []) + + def check_against_chunks(self, chunks): + # type: (Iterator[bytes]) -> None + """Check good hashes against ones built from iterable of chunks of + data. + + Raise HashMismatch if none match. + + """ + gots = {} + for hash_name in iterkeys(self._allowed): + try: + gots[hash_name] = hashlib.new(hash_name) + except (ValueError, TypeError): + raise InstallationError( + 'Unknown hash name: {}'.format(hash_name) + ) + + for chunk in chunks: + for hash in itervalues(gots): + hash.update(chunk) + + for hash_name, got in iteritems(gots): + if got.hexdigest() in self._allowed[hash_name]: + return + self._raise(gots) + + def _raise(self, gots): + # type: (Dict[str, _Hash]) -> NoReturn + raise HashMismatch(self._allowed, gots) + + def check_against_file(self, file): + # type: (BinaryIO) -> None + """Check good hashes against a file-like object + + Raise HashMismatch if none match. + + """ + return self.check_against_chunks(read_chunks(file)) + + def check_against_path(self, path): + # type: (str) -> None + with open(path, 'rb') as file: + return self.check_against_file(file) + + def __nonzero__(self): + # type: () -> bool + """Return whether I know any known-good hashes.""" + return bool(self._allowed) + + def __bool__(self): + # type: () -> bool + return self.__nonzero__() + + +class MissingHashes(Hashes): + """A workalike for Hashes used when we're missing a hash for a requirement + + It computes the actual hash of the requirement and raises a HashMissing + exception showing it to the user. + + """ + def __init__(self): + # type: () -> None + """Don't offer the ``hashes`` kwarg.""" + # Pass our favorite hash in to generate a "gotten hash". With the + # empty list, it will never match, so an error will always raise. + super(MissingHashes, self).__init__(hashes={FAVORITE_HASH: []}) + + def _raise(self, gots): + # type: (Dict[str, _Hash]) -> NoReturn + raise HashMissing(gots[FAVORITE_HASH].hexdigest()) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/hashes.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/hashes.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b65fa5e31ff750b1dec7a80bac19f4ac9b7892cb GIT binary patch literal 5526 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 KYt@`p literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/inject_securetransport.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/inject_securetransport.py new file mode 100644 index 0000000..5b93b1d --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/inject_securetransport.py @@ -0,0 +1,36 @@ +"""A helper module that injects SecureTransport, on import. + +The import should be done as early as possible, to ensure all requests and +sessions (or whatever) are created after injecting SecureTransport. + +Note that we only do the injection on macOS, when the linked OpenSSL is too +old to handle TLSv1.2. +""" + +import sys + + +def inject_securetransport(): + # type: () -> None + # Only relevant on macOS + if sys.platform != "darwin": + return + + try: + import ssl + except ImportError: + return + + # Checks for OpenSSL 1.0.1 + if ssl.OPENSSL_VERSION_NUMBER >= 0x1000100f: + return + + try: + from pip._vendor.urllib3.contrib import securetransport + except (ImportError, OSError): + return + + securetransport.inject_into_urllib3() + + +inject_securetransport() diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/inject_securetransport.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/inject_securetransport.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2da3115b97dff100750698cda14db06587d8d3d3 GIT binary patch literal 1058 zcmcIj&2AGh5FYO){aL6Q(Fzb;d_s%VZbXsbf)GE-A)+KG8z|~!wb^xv6R*A4PNN`t zf&)AdPs3yI05J9jRjRnMlE>p2&&)UTdBa~j(a-NcvI5p$fcrCC<{pX?;1nf+G5|r~ z6qOLZqA>s#z!w05jx=t$`-cSJIh`_5GfgX1E(D`?np?`{j1|_B zeh0tGi(z_zMVRzX!Q~v&4{IjV^q6vkI8~&u8^k+Ba5$6kaeDqBIZ7h_8^3`cyc_xk zu9t3*-%wb984jDkJOsVxct}?r#{z01fD3>Vc>`KDgn0z|F%UxBo%f$HuH{IYw?V&Z z;`V)93q%{L4Y(jcPULMLYd7I6@EKN@83@d_8fr0N+(s}1>#&u%UUKO{^W6?~V&og_ zE(+s`wSS3?x1A$&j+L=nxYr`LXG&L%(Fl7DjeSpjPiuStH}O1t(;MK>vUj~v+8++G z!Q0m_dLw(+#q&DJ&Y3KgP8M1SK6#iFN?Oe)BadR!#ivcKJ=7bLGA^yk)&a4b@yNYY z9}=SiUYI^=U0c;%EOW@EvG}46kNUGuk1A*K%cWvk=Ayf>T$t{Bc2h%E0J5x9MV5^`>Ie;&fd2>TEv)dQ`Dvdz-8jZK Jg6rY-tv`Rd8e;$e literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/logging.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/logging.py new file mode 100644 index 0000000..9a017cf --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/logging.py @@ -0,0 +1,399 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import contextlib +import errno +import logging +import logging.handlers +import os +import sys +from logging import Filter, getLogger + +from pip._vendor.six import PY2 + +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.deprecation import DEPRECATION_MSG_PREFIX +from pip._internal.utils.misc import ensure_dir + +try: + import threading +except ImportError: + import dummy_threading as threading # type: ignore + + +try: + # Use "import as" and set colorama in the else clause to avoid mypy + # errors and get the following correct revealed type for colorama: + # `Union[_importlib_modulespec.ModuleType, None]` + # Otherwise, we get an error like the following in the except block: + # > Incompatible types in assignment (expression has type "None", + # variable has type Module) + # TODO: eliminate the need to use "import as" once mypy addresses some + # of its issues with conditional imports. Here is an umbrella issue: + # https://github.com/python/mypy/issues/1297 + from pip._vendor import colorama as _colorama +# Lots of different errors can come from this, including SystemError and +# ImportError. +except Exception: + colorama = None +else: + # Import Fore explicitly rather than accessing below as colorama.Fore + # to avoid the following error running mypy: + # > Module has no attribute "Fore" + # TODO: eliminate the need to import Fore once mypy addresses some of its + # issues with conditional imports. This particular case could be an + # instance of the following issue (but also see the umbrella issue above): + # https://github.com/python/mypy/issues/3500 + from pip._vendor.colorama import Fore + + colorama = _colorama + + +_log_state = threading.local() +subprocess_logger = getLogger('pip.subprocessor') + + +class BrokenStdoutLoggingError(Exception): + """ + Raised if BrokenPipeError occurs for the stdout stream while logging. + """ + pass + + +# BrokenPipeError does not exist in Python 2 and, in addition, manifests +# differently in Windows and non-Windows. +if WINDOWS: + # In Windows, a broken pipe can show up as EINVAL rather than EPIPE: + # https://bugs.python.org/issue19612 + # https://bugs.python.org/issue30418 + if PY2: + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return (exc_class is IOError and + exc.errno in (errno.EINVAL, errno.EPIPE)) + else: + # In Windows, a broken pipe IOError became OSError in Python 3. + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return ((exc_class is BrokenPipeError) or # noqa: F821 + (exc_class is OSError and + exc.errno in (errno.EINVAL, errno.EPIPE))) +elif PY2: + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return (exc_class is IOError and exc.errno == errno.EPIPE) +else: + # Then we are in the non-Windows Python 3 case. + def _is_broken_pipe_error(exc_class, exc): + """ + Return whether an exception is a broken pipe error. + + Args: + exc_class: an exception class. + exc: an exception instance. + """ + return (exc_class is BrokenPipeError) # noqa: F821 + + +@contextlib.contextmanager +def indent_log(num=2): + """ + A context manager which will cause the log output to be indented for any + log messages emitted inside it. + """ + # For thread-safety + _log_state.indentation = get_indentation() + _log_state.indentation += num + try: + yield + finally: + _log_state.indentation -= num + + +def get_indentation(): + return getattr(_log_state, 'indentation', 0) + + +class IndentingFormatter(logging.Formatter): + + def __init__(self, *args, **kwargs): + """ + A logging.Formatter that obeys the indent_log() context manager. + + :param add_timestamp: A bool indicating output lines should be prefixed + with their record's timestamp. + """ + self.add_timestamp = kwargs.pop("add_timestamp", False) + super(IndentingFormatter, self).__init__(*args, **kwargs) + + def get_message_start(self, formatted, levelno): + """ + Return the start of the formatted log message (not counting the + prefix to add to each line). + """ + if levelno < logging.WARNING: + return '' + if formatted.startswith(DEPRECATION_MSG_PREFIX): + # Then the message already has a prefix. We don't want it to + # look like "WARNING: DEPRECATION: ...." + return '' + if levelno < logging.ERROR: + return 'WARNING: ' + + return 'ERROR: ' + + def format(self, record): + """ + Calls the standard formatter, but will indent all of the log message + lines by our current indentation level. + """ + formatted = super(IndentingFormatter, self).format(record) + message_start = self.get_message_start(formatted, record.levelno) + formatted = message_start + formatted + + prefix = '' + if self.add_timestamp: + # TODO: Use Formatter.default_time_format after dropping PY2. + t = self.formatTime(record, "%Y-%m-%dT%H:%M:%S") + prefix = '{t},{record.msecs:03.0f} '.format(**locals()) + prefix += " " * get_indentation() + formatted = "".join([ + prefix + line + for line in formatted.splitlines(True) + ]) + return formatted + + +def _color_wrap(*colors): + def wrapped(inp): + return "".join(list(colors) + [inp, colorama.Style.RESET_ALL]) + return wrapped + + +class ColorizedStreamHandler(logging.StreamHandler): + + # Don't build up a list of colors if we don't have colorama + if colorama: + COLORS = [ + # This needs to be in order from highest logging level to lowest. + (logging.ERROR, _color_wrap(Fore.RED)), + (logging.WARNING, _color_wrap(Fore.YELLOW)), + ] + else: + COLORS = [] + + def __init__(self, stream=None, no_color=None): + logging.StreamHandler.__init__(self, stream) + self._no_color = no_color + + if WINDOWS and colorama: + self.stream = colorama.AnsiToWin32(self.stream) + + def _using_stdout(self): + """ + Return whether the handler is using sys.stdout. + """ + if WINDOWS and colorama: + # Then self.stream is an AnsiToWin32 object. + return self.stream.wrapped is sys.stdout + + return self.stream is sys.stdout + + def should_color(self): + # Don't colorize things if we do not have colorama or if told not to + if not colorama or self._no_color: + return False + + real_stream = ( + self.stream if not isinstance(self.stream, colorama.AnsiToWin32) + else self.stream.wrapped + ) + + # If the stream is a tty we should color it + if hasattr(real_stream, "isatty") and real_stream.isatty(): + return True + + # If we have an ANSI term we should color it + if os.environ.get("TERM") == "ANSI": + return True + + # If anything else we should not color it + return False + + def format(self, record): + msg = logging.StreamHandler.format(self, record) + + if self.should_color(): + for level, color in self.COLORS: + if record.levelno >= level: + msg = color(msg) + break + + return msg + + # The logging module says handleError() can be customized. + def handleError(self, record): + exc_class, exc = sys.exc_info()[:2] + # If a broken pipe occurred while calling write() or flush() on the + # stdout stream in logging's Handler.emit(), then raise our special + # exception so we can handle it in main() instead of logging the + # broken pipe error and continuing. + if (exc_class and self._using_stdout() and + _is_broken_pipe_error(exc_class, exc)): + raise BrokenStdoutLoggingError() + + return super(ColorizedStreamHandler, self).handleError(record) + + +class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler): + + def _open(self): + ensure_dir(os.path.dirname(self.baseFilename)) + return logging.handlers.RotatingFileHandler._open(self) + + +class MaxLevelFilter(Filter): + + def __init__(self, level): + self.level = level + + def filter(self, record): + return record.levelno < self.level + + +class ExcludeLoggerFilter(Filter): + + """ + A logging Filter that excludes records from a logger (or its children). + """ + + def filter(self, record): + # The base Filter class allows only records from a logger (or its + # children). + return not super(ExcludeLoggerFilter, self).filter(record) + + +def setup_logging(verbosity, no_color, user_log_file): + """Configures and sets up all of the logging + + Returns the requested logging level, as its integer value. + """ + + # Determine the level to be logging at. + if verbosity >= 1: + level = "DEBUG" + elif verbosity == -1: + level = "WARNING" + elif verbosity == -2: + level = "ERROR" + elif verbosity <= -3: + level = "CRITICAL" + else: + level = "INFO" + + level_number = getattr(logging, level) + + # The "root" logger should match the "console" level *unless* we also need + # to log to a user log file. + include_user_log = user_log_file is not None + if include_user_log: + additional_log_file = user_log_file + root_level = "DEBUG" + else: + additional_log_file = "/dev/null" + root_level = level + + # Disable any logging besides WARNING unless we have DEBUG level logging + # enabled for vendored libraries. + vendored_log_level = "WARNING" if level in ["INFO", "ERROR"] else "DEBUG" + + # Shorthands for clarity + log_streams = { + "stdout": "ext://sys.stdout", + "stderr": "ext://sys.stderr", + } + handler_classes = { + "stream": "pip._internal.utils.logging.ColorizedStreamHandler", + "file": "pip._internal.utils.logging.BetterRotatingFileHandler", + } + handlers = ["console", "console_errors", "console_subprocess"] + ( + ["user_log"] if include_user_log else [] + ) + + logging.config.dictConfig({ + "version": 1, + "disable_existing_loggers": False, + "filters": { + "exclude_warnings": { + "()": "pip._internal.utils.logging.MaxLevelFilter", + "level": logging.WARNING, + }, + "restrict_to_subprocess": { + "()": "logging.Filter", + "name": subprocess_logger.name, + }, + "exclude_subprocess": { + "()": "pip._internal.utils.logging.ExcludeLoggerFilter", + "name": subprocess_logger.name, + }, + }, + "formatters": { + "indent": { + "()": IndentingFormatter, + "format": "%(message)s", + }, + "indent_with_timestamp": { + "()": IndentingFormatter, + "format": "%(message)s", + "add_timestamp": True, + }, + }, + "handlers": { + "console": { + "level": level, + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stdout"], + "filters": ["exclude_subprocess", "exclude_warnings"], + "formatter": "indent", + }, + "console_errors": { + "level": "WARNING", + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stderr"], + "filters": ["exclude_subprocess"], + "formatter": "indent", + }, + # A handler responsible for logging to the console messages + # from the "subprocessor" logger. + "console_subprocess": { + "level": level, + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stderr"], + "filters": ["restrict_to_subprocess"], + "formatter": "indent", + }, + "user_log": { + "level": "DEBUG", + "class": handler_classes["file"], + "filename": additional_log_file, + "delay": True, + "formatter": "indent_with_timestamp", + }, + }, + "root": { + "level": root_level, + "handlers": handlers, + }, + "loggers": { + "pip._vendor": { + "level": vendored_log_level + } + }, + }) + + return level_number diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/logging.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/logging.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5974da27a9414b29b36e69e11db29b2a79e8d68b GIT binary patch literal 11368 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 str + pip_pkg_dir = os.path.join(os.path.dirname(__file__), "..", "..") + pip_pkg_dir = os.path.abspath(pip_pkg_dir) + + return ( + 'pip {} from {} (python {})'.format( + __version__, pip_pkg_dir, get_major_minor_version(), + ) + ) + + +def normalize_version_info(py_version_info): + # type: (Tuple[int, ...]) -> Tuple[int, int, int] + """ + Convert a tuple of ints representing a Python version to one of length + three. + + :param py_version_info: a tuple of ints representing a Python version, + or None to specify no version. The tuple can have any length. + + :return: a tuple of length three if `py_version_info` is non-None. + Otherwise, return `py_version_info` unchanged (i.e. None). + """ + if len(py_version_info) < 3: + py_version_info += (3 - len(py_version_info)) * (0,) + elif len(py_version_info) > 3: + py_version_info = py_version_info[:3] + + return cast('VersionInfo', py_version_info) + + +def ensure_dir(path): + # type: (AnyStr) -> None + """os.path.makedirs without EEXIST.""" + try: + os.makedirs(path) + except OSError as e: + # Windows can raise spurious ENOTEMPTY errors. See #6426. + if e.errno != errno.EEXIST and e.errno != errno.ENOTEMPTY: + raise + + +def get_prog(): + # type: () -> str + try: + prog = os.path.basename(sys.argv[0]) + if prog in ('__main__.py', '-c'): + return "{} -m pip".format(sys.executable) + else: + return prog + except (AttributeError, TypeError, IndexError): + pass + return 'pip' + + +# Retry every half second for up to 3 seconds +@retry(stop_max_delay=3000, wait_fixed=500) +def rmtree(dir, ignore_errors=False): + # type: (Text, bool) -> None + shutil.rmtree(dir, ignore_errors=ignore_errors, + onerror=rmtree_errorhandler) + + +def rmtree_errorhandler(func, path, exc_info): + """On Windows, the files in .svn are read-only, so when rmtree() tries to + remove them, an exception is thrown. We catch that here, remove the + read-only attribute, and hopefully continue without problems.""" + try: + has_attr_readonly = not (os.stat(path).st_mode & stat.S_IWRITE) + except (IOError, OSError): + # it's equivalent to os.path.exists + return + + if has_attr_readonly: + # convert to read/write + os.chmod(path, stat.S_IWRITE) + # use the original function to repeat the operation + func(path) + return + else: + raise + + +def path_to_display(path): + # type: (Optional[Union[str, Text]]) -> Optional[Text] + """ + Convert a bytes (or text) path to text (unicode in Python 2) for display + and logging purposes. + + This function should never error out. Also, this function is mainly needed + for Python 2 since in Python 3 str paths are already text. + """ + if path is None: + return None + if isinstance(path, text_type): + return path + # Otherwise, path is a bytes object (str in Python 2). + try: + display_path = path.decode(sys.getfilesystemencoding(), 'strict') + except UnicodeDecodeError: + # Include the full bytes to make troubleshooting easier, even though + # it may not be very human readable. + if PY2: + # Convert the bytes to a readable str representation using + # repr(), and then convert the str to unicode. + # Also, we add the prefix "b" to the repr() return value both + # to make the Python 2 output look like the Python 3 output, and + # to signal to the user that this is a bytes representation. + display_path = str_to_display('b{!r}'.format(path)) + else: + # Silence the "F821 undefined name 'ascii'" flake8 error since + # in Python 3 ascii() is a built-in. + display_path = ascii(path) # noqa: F821 + + return display_path + + +def display_path(path): + # type: (Union[str, Text]) -> str + """Gives the display value for a given path, making it relative to cwd + if possible.""" + path = os.path.normcase(os.path.abspath(path)) + if sys.version_info[0] == 2: + path = path.decode(sys.getfilesystemencoding(), 'replace') + path = path.encode(sys.getdefaultencoding(), 'replace') + if path.startswith(os.getcwd() + os.path.sep): + path = '.' + path[len(os.getcwd()):] + return path + + +def backup_dir(dir, ext='.bak'): + # type: (str, str) -> str + """Figure out the name of a directory to back up the given dir to + (adding .bak, .bak2, etc)""" + n = 1 + extension = ext + while os.path.exists(dir + extension): + n += 1 + extension = ext + str(n) + return dir + extension + + +def ask_path_exists(message, options): + # type: (str, Iterable[str]) -> str + for action in os.environ.get('PIP_EXISTS_ACTION', '').split(): + if action in options: + return action + return ask(message, options) + + +def _check_no_input(message): + # type: (str) -> None + """Raise an error if no input is allowed.""" + if os.environ.get('PIP_NO_INPUT'): + raise Exception( + 'No input was expected ($PIP_NO_INPUT set); question: {}'.format( + message) + ) + + +def ask(message, options): + # type: (str, Iterable[str]) -> str + """Ask the message interactively, with the given possible responses""" + while 1: + _check_no_input(message) + response = input(message) + response = response.strip().lower() + if response not in options: + print( + 'Your response ({!r}) was not one of the expected responses: ' + '{}'.format(response, ', '.join(options)) + ) + else: + return response + + +def ask_input(message): + # type: (str) -> str + """Ask for input interactively.""" + _check_no_input(message) + return input(message) + + +def ask_password(message): + # type: (str) -> str + """Ask for a password interactively.""" + _check_no_input(message) + return getpass.getpass(message) + + +def format_size(bytes): + # type: (float) -> str + if bytes > 1000 * 1000: + return '{:.1f} MB'.format(bytes / 1000.0 / 1000) + elif bytes > 10 * 1000: + return '{} kB'.format(int(bytes / 1000)) + elif bytes > 1000: + return '{:.1f} kB'.format(bytes / 1000.0) + else: + return '{} bytes'.format(int(bytes)) + + +def tabulate(rows): + # type: (Iterable[Iterable[Any]]) -> Tuple[List[str], List[int]] + """Return a list of formatted rows and a list of column sizes. + + For example:: + + >>> tabulate([['foobar', 2000], [0xdeadbeef]]) + (['foobar 2000', '3735928559'], [10, 4]) + """ + rows = [tuple(map(str, row)) for row in rows] + sizes = [max(map(len, col)) for col in zip_longest(*rows, fillvalue='')] + table = [" ".join(map(str.ljust, row, sizes)).rstrip() for row in rows] + return table, sizes + + +def is_installable_dir(path): + # type: (str) -> bool + """Is path is a directory containing setup.py or pyproject.toml? + """ + if not os.path.isdir(path): + return False + setup_py = os.path.join(path, 'setup.py') + if os.path.isfile(setup_py): + return True + pyproject_toml = os.path.join(path, 'pyproject.toml') + if os.path.isfile(pyproject_toml): + return True + return False + + +def read_chunks(file, size=io.DEFAULT_BUFFER_SIZE): + """Yield pieces of data from a file-like object until EOF.""" + while True: + chunk = file.read(size) + if not chunk: + break + yield chunk + + +def normalize_path(path, resolve_symlinks=True): + # type: (str, bool) -> str + """ + Convert a path to its canonical, case-normalized, absolute version. + + """ + path = expanduser(path) + if resolve_symlinks: + path = os.path.realpath(path) + else: + path = os.path.abspath(path) + return os.path.normcase(path) + + +def splitext(path): + # type: (str) -> Tuple[str, str] + """Like os.path.splitext, but take off .tar too""" + base, ext = posixpath.splitext(path) + if base.lower().endswith('.tar'): + ext = base[-4:] + ext + base = base[:-4] + return base, ext + + +def renames(old, new): + # type: (str, str) -> None + """Like os.renames(), but handles renaming across devices.""" + # Implementation borrowed from os.renames(). + head, tail = os.path.split(new) + if head and tail and not os.path.exists(head): + os.makedirs(head) + + shutil.move(old, new) + + head, tail = os.path.split(old) + if head and tail: + try: + os.removedirs(head) + except OSError: + pass + + +def is_local(path): + # type: (str) -> bool + """ + Return True if path is within sys.prefix, if we're running in a virtualenv. + + If we're not in a virtualenv, all paths are considered "local." + + Caution: this function assumes the head of path has been normalized + with normalize_path. + """ + if not running_under_virtualenv(): + return True + return path.startswith(normalize_path(sys.prefix)) + + +def dist_is_local(dist): + # type: (Distribution) -> bool + """ + Return True if given Distribution object is installed locally + (i.e. within current virtualenv). + + Always True if we're not in a virtualenv. + + """ + return is_local(dist_location(dist)) + + +def dist_in_usersite(dist): + # type: (Distribution) -> bool + """ + Return True if given Distribution is installed in user site. + """ + return dist_location(dist).startswith(normalize_path(user_site)) + + +def dist_in_site_packages(dist): + # type: (Distribution) -> bool + """ + Return True if given Distribution is installed in + sysconfig.get_python_lib(). + """ + return dist_location(dist).startswith(normalize_path(site_packages)) + + +def dist_is_editable(dist): + # type: (Distribution) -> bool + """ + Return True if given Distribution is an editable install. + """ + for path_item in sys.path: + egg_link = os.path.join(path_item, dist.project_name + '.egg-link') + if os.path.isfile(egg_link): + return True + return False + + +def get_installed_distributions( + local_only=True, # type: bool + skip=stdlib_pkgs, # type: Container[str] + include_editables=True, # type: bool + editables_only=False, # type: bool + user_only=False, # type: bool + paths=None # type: Optional[List[str]] +): + # type: (...) -> List[Distribution] + """ + Return a list of installed Distribution objects. + + If ``local_only`` is True (default), only return installations + local to the current virtualenv, if in a virtualenv. + + ``skip`` argument is an iterable of lower-case project names to + ignore; defaults to stdlib_pkgs + + If ``include_editables`` is False, don't report editables. + + If ``editables_only`` is True , only report editables. + + If ``user_only`` is True , only report installations in the user + site directory. + + If ``paths`` is set, only report the distributions present at the + specified list of locations. + """ + if paths: + working_set = pkg_resources.WorkingSet(paths) + else: + working_set = pkg_resources.working_set + + if local_only: + local_test = dist_is_local + else: + def local_test(d): + return True + + if include_editables: + def editable_test(d): + return True + else: + def editable_test(d): + return not dist_is_editable(d) + + if editables_only: + def editables_only_test(d): + return dist_is_editable(d) + else: + def editables_only_test(d): + return True + + if user_only: + user_test = dist_in_usersite + else: + def user_test(d): + return True + + return [d for d in working_set + if local_test(d) and + d.key not in skip and + editable_test(d) and + editables_only_test(d) and + user_test(d) + ] + + +def _search_distribution(req_name): + # type: (str) -> Optional[Distribution] + """Find a distribution matching the ``req_name`` in the environment. + + This searches from *all* distributions available in the environment, to + match the behavior of ``pkg_resources.get_distribution()``. + """ + # Canonicalize the name before searching in the list of + # installed distributions and also while creating the package + # dictionary to get the Distribution object + req_name = canonicalize_name(req_name) + packages = get_installed_distributions( + local_only=False, + skip=(), + include_editables=True, + editables_only=False, + user_only=False, + paths=None, + ) + pkg_dict = {canonicalize_name(p.key): p for p in packages} + return pkg_dict.get(req_name) + + +def get_distribution(req_name): + # type: (str) -> Optional[Distribution] + """Given a requirement name, return the installed Distribution object. + + This searches from *all* distributions available in the environment, to + match the behavior of ``pkg_resources.get_distribution()``. + """ + + # Search the distribution by looking through the working set + dist = _search_distribution(req_name) + + # If distribution could not be found, call working_set.require + # to update the working set, and try to find the distribution + # again. + # This might happen for e.g. when you install a package + # twice, once using setup.py develop and again using setup.py install. + # Now when run pip uninstall twice, the package gets removed + # from the working set in the first uninstall, so we have to populate + # the working set again so that pip knows about it and the packages + # gets picked up and is successfully uninstalled the second time too. + if not dist: + try: + pkg_resources.working_set.require(req_name) + except pkg_resources.DistributionNotFound: + return None + return _search_distribution(req_name) + + +def egg_link_path(dist): + # type: (Distribution) -> Optional[str] + """ + Return the path for the .egg-link file if it exists, otherwise, None. + + There's 3 scenarios: + 1) not in a virtualenv + try to find in site.USER_SITE, then site_packages + 2) in a no-global virtualenv + try to find in site_packages + 3) in a yes-global virtualenv + try to find in site_packages, then site.USER_SITE + (don't look in global location) + + For #1 and #3, there could be odd cases, where there's an egg-link in 2 + locations. + + This method will just return the first one found. + """ + sites = [] + if running_under_virtualenv(): + sites.append(site_packages) + if not virtualenv_no_global() and user_site: + sites.append(user_site) + else: + if user_site: + sites.append(user_site) + sites.append(site_packages) + + for site in sites: + egglink = os.path.join(site, dist.project_name) + '.egg-link' + if os.path.isfile(egglink): + return egglink + return None + + +def dist_location(dist): + # type: (Distribution) -> str + """ + Get the site-packages location of this distribution. Generally + this is dist.location, except in the case of develop-installed + packages, where dist.location is the source code location, and we + want to know where the egg-link file is. + + The returned location is normalized (in particular, with symlinks removed). + """ + egg_link = egg_link_path(dist) + if egg_link: + return normalize_path(egg_link) + return normalize_path(dist.location) + + +def write_output(msg, *args): + # type: (Any, Any) -> None + logger.info(msg, *args) + + +class FakeFile(object): + """Wrap a list of lines in an object with readline() to make + ConfigParser happy.""" + def __init__(self, lines): + self._gen = iter(lines) + + def readline(self): + try: + return next(self._gen) + except StopIteration: + return '' + + def __iter__(self): + return self._gen + + +class StreamWrapper(StringIO): + + @classmethod + def from_stream(cls, orig_stream): + cls.orig_stream = orig_stream + return cls() + + # compileall.compile_dir() needs stdout.encoding to print to stdout + @property + def encoding(self): + return self.orig_stream.encoding + + +@contextlib.contextmanager +def captured_output(stream_name): + """Return a context manager used by captured_stdout/stdin/stderr + that temporarily replaces the sys stream *stream_name* with a StringIO. + + Taken from Lib/support/__init__.py in the CPython repo. + """ + orig_stdout = getattr(sys, stream_name) + setattr(sys, stream_name, StreamWrapper.from_stream(orig_stdout)) + try: + yield getattr(sys, stream_name) + finally: + setattr(sys, stream_name, orig_stdout) + + +def captured_stdout(): + """Capture the output of sys.stdout: + + with captured_stdout() as stdout: + print('hello') + self.assertEqual(stdout.getvalue(), 'hello\n') + + Taken from Lib/support/__init__.py in the CPython repo. + """ + return captured_output('stdout') + + +def captured_stderr(): + """ + See captured_stdout(). + """ + return captured_output('stderr') + + +def get_installed_version(dist_name, working_set=None): + """Get the installed version of dist_name avoiding pkg_resources cache""" + # Create a requirement that we'll look for inside of setuptools. + req = pkg_resources.Requirement.parse(dist_name) + + if working_set is None: + # We want to avoid having this cached, so we need to construct a new + # working set each time. + working_set = pkg_resources.WorkingSet() + + # Get the installed distribution from our working set + dist = working_set.find(req) + + # Check to see if we got an installed distribution or not, if we did + # we want to return it's version. + return dist.version if dist else None + + +def consume(iterator): + """Consume an iterable at C speed.""" + deque(iterator, maxlen=0) + + +# Simulates an enum +def enum(*sequential, **named): + enums = dict(zip(sequential, range(len(sequential))), **named) + reverse = {value: key for key, value in enums.items()} + enums['reverse_mapping'] = reverse + return type('Enum', (), enums) + + +def build_netloc(host, port): + # type: (str, Optional[int]) -> str + """ + Build a netloc from a host-port pair + """ + if port is None: + return host + if ':' in host: + # Only wrap host with square brackets when it is IPv6 + host = '[{}]'.format(host) + return '{}:{}'.format(host, port) + + +def build_url_from_netloc(netloc, scheme='https'): + # type: (str, str) -> str + """ + Build a full URL from a netloc. + """ + if netloc.count(':') >= 2 and '@' not in netloc and '[' not in netloc: + # It must be a bare IPv6 address, so wrap it with brackets. + netloc = '[{}]'.format(netloc) + return '{}://{}'.format(scheme, netloc) + + +def parse_netloc(netloc): + # type: (str) -> Tuple[str, Optional[int]] + """ + Return the host-port pair from a netloc. + """ + url = build_url_from_netloc(netloc) + parsed = urllib_parse.urlparse(url) + return parsed.hostname, parsed.port + + +def split_auth_from_netloc(netloc): + """ + Parse out and remove the auth information from a netloc. + + Returns: (netloc, (username, password)). + """ + if '@' not in netloc: + return netloc, (None, None) + + # Split from the right because that's how urllib.parse.urlsplit() + # behaves if more than one @ is present (which can be checked using + # the password attribute of urlsplit()'s return value). + auth, netloc = netloc.rsplit('@', 1) + if ':' in auth: + # Split from the left because that's how urllib.parse.urlsplit() + # behaves if more than one : is present (which again can be checked + # using the password attribute of the return value) + user_pass = auth.split(':', 1) + else: + user_pass = auth, None + + user_pass = tuple( + None if x is None else urllib_unquote(x) for x in user_pass + ) + + return netloc, user_pass + + +def redact_netloc(netloc): + # type: (str) -> str + """ + Replace the sensitive data in a netloc with "****", if it exists. + + For example: + - "user:pass@example.com" returns "user:****@example.com" + - "accesstoken@example.com" returns "****@example.com" + """ + netloc, (user, password) = split_auth_from_netloc(netloc) + if user is None: + return netloc + if password is None: + user = '****' + password = '' + else: + user = urllib_parse.quote(user) + password = ':****' + return '{user}{password}@{netloc}'.format(user=user, + password=password, + netloc=netloc) + + +def _transform_url(url, transform_netloc): + """Transform and replace netloc in a url. + + transform_netloc is a function taking the netloc and returning a + tuple. The first element of this tuple is the new netloc. The + entire tuple is returned. + + Returns a tuple containing the transformed url as item 0 and the + original tuple returned by transform_netloc as item 1. + """ + purl = urllib_parse.urlsplit(url) + netloc_tuple = transform_netloc(purl.netloc) + # stripped url + url_pieces = ( + purl.scheme, netloc_tuple[0], purl.path, purl.query, purl.fragment + ) + surl = urllib_parse.urlunsplit(url_pieces) + return surl, netloc_tuple + + +def _get_netloc(netloc): + return split_auth_from_netloc(netloc) + + +def _redact_netloc(netloc): + return (redact_netloc(netloc),) + + +def split_auth_netloc_from_url(url): + # type: (str) -> Tuple[str, str, Tuple[str, str]] + """ + Parse a url into separate netloc, auth, and url with no auth. + + Returns: (url_without_auth, netloc, (username, password)) + """ + url_without_auth, (netloc, auth) = _transform_url(url, _get_netloc) + return url_without_auth, netloc, auth + + +def remove_auth_from_url(url): + # type: (str) -> str + """Return a copy of url with 'username:password@' removed.""" + # username/pass params are passed to subversion through flags + # and are not recognized in the url. + return _transform_url(url, _get_netloc)[0] + + +def redact_auth_from_url(url): + # type: (str) -> str + """Replace the password in a given url with ****.""" + return _transform_url(url, _redact_netloc)[0] + + +class HiddenText(object): + def __init__( + self, + secret, # type: str + redacted, # type: str + ): + # type: (...) -> None + self.secret = secret + self.redacted = redacted + + def __repr__(self): + # type: (...) -> str + return ''.format(str(self)) + + def __str__(self): + # type: (...) -> str + return self.redacted + + # This is useful for testing. + def __eq__(self, other): + # type: (Any) -> bool + if type(self) != type(other): + return False + + # The string being used for redaction doesn't also have to match, + # just the raw, original string. + return (self.secret == other.secret) + + # We need to provide an explicit __ne__ implementation for Python 2. + # TODO: remove this when we drop PY2 support. + def __ne__(self, other): + # type: (Any) -> bool + return not self == other + + +def hide_value(value): + # type: (str) -> HiddenText + return HiddenText(value, redacted='****') + + +def hide_url(url): + # type: (str) -> HiddenText + redacted = redact_auth_from_url(url) + return HiddenText(url, redacted=redacted) + + +def protect_pip_from_modification_on_windows(modifying_pip): + # type: (bool) -> None + """Protection of pip.exe from modification on Windows + + On Windows, any operation modifying pip should be run as: + python -m pip ... + """ + pip_names = [ + "pip.exe", + "pip{}.exe".format(sys.version_info[0]), + "pip{}.{}.exe".format(*sys.version_info[:2]) + ] + + # See https://github.com/pypa/pip/issues/1299 for more discussion + should_show_use_python_msg = ( + modifying_pip and + WINDOWS and + os.path.basename(sys.argv[0]) in pip_names + ) + + if should_show_use_python_msg: + new_command = [ + sys.executable, "-m", "pip" + ] + sys.argv[1:] + raise CommandError( + 'To modify pip, please run the following command:\n{}' + .format(" ".join(new_command)) + ) + + +def is_console_interactive(): + # type: () -> bool + """Is this console interactive? + """ + return sys.stdin is not None and sys.stdin.isatty() + + +def hash_file(path, blocksize=1 << 20): + # type: (Text, int) -> Tuple[Any, int] + """Return (hash, length) for path using hashlib.sha256() + """ + + h = hashlib.sha256() + length = 0 + with open(path, 'rb') as f: + for block in read_chunks(f, size=blocksize): + length += len(block) + h.update(block) + return h, length + + +def is_wheel_installed(): + """ + Return whether the wheel package is installed. + """ + try: + import wheel # noqa: F401 + except ImportError: + return False + + return True + + +def pairwise(iterable): + # type: (Iterable[Any]) -> Iterator[Tuple[Any, Any]] + """ + Return paired elements. + + For example: + s -> (s0, s1), (s2, s3), (s4, s5), ... + """ + iterable = iter(iterable) + return zip_longest(iterable, iterable) + + +def partition( + pred, # type: Callable[[T], bool] + iterable, # type: Iterable[T] +): + # type: (...) -> Tuple[Iterable[T], Iterable[T]] + """ + Use a predicate to partition entries into false entries and true entries, + like + + partition(is_odd, range(10)) --> 0 2 4 6 8 and 1 3 5 7 9 + """ + t1, t2 = tee(iterable) + return filterfalse(pred, t1), filter(pred, t2) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/misc.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/misc.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9333492e8a77394306c65600264da6c8b10dd45c GIT binary patch literal 31074 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/models.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/models.py new file mode 100644 index 0000000..d1c2f22 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/models.py @@ -0,0 +1,44 @@ +"""Utilities for defining models +""" +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +import operator + + +class KeyBasedCompareMixin(object): + """Provides comparison capabilities that is based on a key + """ + + __slots__ = ['_compare_key', '_defining_class'] + + def __init__(self, key, defining_class): + self._compare_key = key + self._defining_class = defining_class + + def __hash__(self): + return hash(self._compare_key) + + def __lt__(self, other): + return self._compare(other, operator.__lt__) + + def __le__(self, other): + return self._compare(other, operator.__le__) + + def __gt__(self, other): + return self._compare(other, operator.__gt__) + + def __ge__(self, other): + return self._compare(other, operator.__ge__) + + def __eq__(self, other): + return self._compare(other, operator.__eq__) + + def __ne__(self, other): + return self._compare(other, operator.__ne__) + + def _compare(self, other, method): + if not isinstance(other, self._defining_class): + return NotImplemented + + return method(self._compare_key, other._compare_key) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/models.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/models.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b289e5fa81a2cd492c64a2c67216a08b3bf36f09 GIT binary patch literal 2415 zcmcIl&2AGh5T4yl((qkSc_lQ-!FID-PshZFik!)BPiM5kREyC1Hvob3W!lFt|ZU@;v{_VQ^ zJn@4$-j1zF$5m0s3-dAio|R`ne4elkmxnA21L2q~{Uw|OpAa|zib-b)XR=1=nv8TQ z?TWHa>AEOAN_(R8Dea3gpmZS02BjOK3`y-pLj>Jo@o70i zo5e27Y`BjkLbk@?p*bFe{B!W4n}tU6sJn%MRWWpu$JQn&HX3prbF&XvoOpD?Q(5sv zk-YaJk4?J~W-6!(T7<=}!@`<;>d-@|oBX{TDdG_lVc)Vgaz#C=vwAZtt&8(~^YzaB z$D0B}(sWijvnb1+L$EP73nL&(-JM5spH6X_8?2bt(zk83beThTH(01h8H{k zh+CU@4=xqCUA(w2kK4w3jrGOFd)hKy^Y!}9!)?a;tYy6AHP-hIV|{)BFRt~fjWPa$ z1*lD!8tmqSx*hXI!`bryHkKEt1Vrg@0W&MCTP8+0T-bWIayvzxo5C>hrVS|~qL88- zcDc5NakDCI?Vf@Y;LL)@$h+%x{76{4$6c+ bool + """ + Check if the given Python version matches a "Requires-Python" specifier. + + :param version_info: A 3-tuple of ints representing a Python + major-minor-micro version to check (e.g. `sys.version_info[:3]`). + + :return: `True` if the given Python version satisfies the requirement. + Otherwise, return `False`. + + :raises InvalidSpecifier: If `requires_python` has an invalid format. + """ + if requires_python is None: + # The package provides no information + return True + requires_python_specifier = specifiers.SpecifierSet(requires_python) + + python_version = version.parse('.'.join(map(str, version_info))) + return python_version in requires_python_specifier + + +def get_metadata(dist): + # type: (Distribution) -> Message + """ + :raises NoneMetadataError: if the distribution reports `has_metadata()` + True but `get_metadata()` returns None. + """ + metadata_name = 'METADATA' + if (isinstance(dist, pkg_resources.DistInfoDistribution) and + dist.has_metadata(metadata_name)): + metadata = dist.get_metadata(metadata_name) + elif dist.has_metadata('PKG-INFO'): + metadata_name = 'PKG-INFO' + metadata = dist.get_metadata(metadata_name) + else: + logger.warning("No metadata found in %s", display_path(dist.location)) + metadata = '' + + if metadata is None: + raise NoneMetadataError(dist, metadata_name) + + feed_parser = FeedParser() + # The following line errors out if with a "NoneType" TypeError if + # passed metadata=None. + feed_parser.feed(metadata) + return feed_parser.close() + + +def get_requires_python(dist): + # type: (pkg_resources.Distribution) -> Optional[str] + """ + Return the "Requires-Python" metadata for a distribution, or None + if not present. + """ + pkg_info_dict = get_metadata(dist) + requires_python = pkg_info_dict.get('Requires-Python') + + if requires_python is not None: + # Convert to a str to satisfy the type checker, since requires_python + # can be a Header object. + requires_python = str(requires_python) + + return requires_python + + +def get_installer(dist): + # type: (Distribution) -> str + if dist.has_metadata('INSTALLER'): + for line in dist.get_metadata_lines('INSTALLER'): + if line.strip(): + return line.strip() + return '' diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/packaging.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/packaging.pyc new file mode 100644 index 0000000000000000000000000000000000000000..335aa85ae4d62a137105cecf33363c0a316030ed GIT binary patch literal 3258 zcmb_eU2hvj6urB4+&FRSByH1A$WVdgqQ*f~szg+whO{Z6jT>!(phnetYmc3E_NzPN zwn6O!lo$R1FZ>K1dEj^OGkD>Vb7$7ZZ6sc(lii(pJ?Gpl{k1Un=g+_ST`GPq zp0{rkslU5 z+c}EPP<)o!XKjC;qH`3lPR|^EIS(bxm4*W z?@HC+plUW%ne2xBQ07XXLiZUOVVc<2mN3vt6S*sO&}P>K zv@a}UbobHTBY*45yIc2t@9S1;r*+RRHjBB3nTGQq(lh8BjIv1D_ju)9sZ=m12H5?b zQ0Y8;GU8Xdyx%e|esSwIw*3_vFHQ1~W+`7J?a;nPY)d?f*uHW}muWb|a2Zwzhtsq4 z(xKNb&$0n5@$b@61>r5ho%#i#ofG(N9m?*J2>U`GN-+qZ$wcfO>%%k=MSMgY=8BfFQ`}h7908H`MVM$Ma+$%4OmvtG z;MaOH4tPs(Fii8cI84mFo2O%cLZ<>-!G0UEIcSQGI#$hMn`W)=Hf}ubTpRBtmwJ>Z z8=`ZNk7VaR&!_?&DnLV-Fy!`_F*ewo?CK!`ls^xZypHX&W6{|TA|*SM5ER`Qu&z)Zbuvjh-iXv7;Di_bHv%MhWrvWTa79nNUQ~>Y4AZj&Yxz~ zOqSS}+G9I|HDo|ZV?9g}Y_^Vr%sc_IhOuKxy|p9baXOaz;z=Wal5c$)v-T|hm`E6* z2H(^z+}3rRt!H7j7A8suQMC5y&hY!2F%Ovw3DYtML)HQNNUdi<_b3uf%lY*;&Ii7eZKOLV|3)8DhTv%HjhHOUNG` zf->rPdQAl_hc!0FVh%VuT;PfQMg=EOKj3Crm0M_?5U7nYsG(020bzDQBbDd?V}4u+ zTH{)00%eAgfZB-8K1~^V>0N3LO_UA>GB+yz zJjfG(#^Yhg9?x|_<}~rR5_l}49s|TMqK{%>NYaf`B`p^iH5@+8_T#hoNq{E18;>Am zMEpK#fT=d1`dt>IZMEm){CqdABM>KkZSkh9JM zsDQe|;ODM|A!NTw`AvcZSfDY^fk!U2>`VE$8Ekk~*SHd#l=^WXSgJ%IrV)2tV2B}O zyr7mOsTPI8TNEi)9PiEQ(K7Kjhd1hkEZdx&fvwq@_aRy)FI>^NnE1W0t35_f1J^r> zzvcxQV{d8AJq%l|snnn}wNl;fGL$&@lLTy|!~8djgP`YM(2GyZ$T$sm9$y(}20VxG zu9_^F_WsjV`Uc4`-#wg+mS)x8Y3(0uK6r4~^Dd!hWAPqZn!h@x+2BWEB9(zO3qWSR zKWx|-*F5_!1H}~K}j-fs@QBsm#np>^lS}-+;7m7k*DxocW7sfW@qSBNvy3%}tDWd`Uq=hLv z%{WwDD;^wbv(Chawa~{I3k>hxh)>aHaqvuu=BU`S#P-9^;{s*s=NtQ;{wnqOs3zBl z=L0Ke?9n&MgNUu7PTXEVOMe=h-w-UH5LUI<}MP~&U U{@egDRvKPN;MQ~&?~ literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/parallel.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/parallel.py new file mode 100644 index 0000000..9fe1fe8 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/parallel.py @@ -0,0 +1,107 @@ +"""Convenient parallelization of higher order functions. + +This module provides two helper functions, with appropriate fallbacks on +Python 2 and on systems lacking support for synchronization mechanisms: + +- map_multiprocess +- map_multithread + +These helpers work like Python 3's map, with two differences: + +- They don't guarantee the order of processing of + the elements of the iterable. +- The underlying process/thread pools chop the iterable into + a number of chunks, so that for very long iterables using + a large value for chunksize can make the job complete much faster + than using the default value of 1. +""" + +__all__ = ['map_multiprocess', 'map_multithread'] + +from contextlib import contextmanager +from multiprocessing import Pool as ProcessPool +from multiprocessing.dummy import Pool as ThreadPool + +from pip._vendor.requests.adapters import DEFAULT_POOLSIZE +from pip._vendor.six import PY2 +from pip._vendor.six.moves import map + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Callable, Iterable, Iterator, Union, TypeVar + from multiprocessing import pool + + Pool = Union[pool.Pool, pool.ThreadPool] + S = TypeVar('S') + T = TypeVar('T') + +# On platforms without sem_open, multiprocessing[.dummy] Pool +# cannot be created. +try: + import multiprocessing.synchronize # noqa +except ImportError: + LACK_SEM_OPEN = True +else: + LACK_SEM_OPEN = False + +# Incredibly large timeout to work around bpo-8296 on Python 2. +TIMEOUT = 2000000 + + +@contextmanager +def closing(pool): + # type: (Pool) -> Iterator[Pool] + """Return a context manager making sure the pool closes properly.""" + try: + yield pool + finally: + # For Pool.imap*, close and join are needed + # for the returned iterator to begin yielding. + pool.close() + pool.join() + pool.terminate() + + +def _map_fallback(func, iterable, chunksize=1): + # type: (Callable[[S], T], Iterable[S], int) -> Iterator[T] + """Make an iterator applying func to each element in iterable. + + This function is the sequential fallback either on Python 2 + where Pool.imap* doesn't react to KeyboardInterrupt + or when sem_open is unavailable. + """ + return map(func, iterable) + + +def _map_multiprocess(func, iterable, chunksize=1): + # type: (Callable[[S], T], Iterable[S], int) -> Iterator[T] + """Chop iterable into chunks and submit them to a process pool. + + For very long iterables using a large value for chunksize can make + the job complete much faster than using the default value of 1. + + Return an unordered iterator of the results. + """ + with closing(ProcessPool()) as pool: + return pool.imap_unordered(func, iterable, chunksize) + + +def _map_multithread(func, iterable, chunksize=1): + # type: (Callable[[S], T], Iterable[S], int) -> Iterator[T] + """Chop iterable into chunks and submit them to a thread pool. + + For very long iterables using a large value for chunksize can make + the job complete much faster than using the default value of 1. + + Return an unordered iterator of the results. + """ + with closing(ThreadPool(DEFAULT_POOLSIZE)) as pool: + return pool.imap_unordered(func, iterable, chunksize) + + +if LACK_SEM_OPEN or PY2: + map_multiprocess = map_multithread = _map_fallback +else: + map_multiprocess = _map_multiprocess + map_multithread = _map_multithread diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/parallel.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/parallel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d012e6900661651006b8d427a715c04502bb218 GIT binary patch literal 3615 zcmds3S#KOg5U$x>U+eV|pNVtONr0?SvK9s*1SldH2du=78QVGLWi`9g>m7S8rhDwH zWhA8Jg(rRuzXpl_fOsc-)iY}^K_Nm!Jh0Z3tNN&}uH&mN|29$m`G=pHZ7P04`2RUR z^~@sjh#XLhyb|q|$N^I(uR=kI!ZJB!vREFXphDpgIm4&&h>=Hgd6Tc2tXU*y5xeI}F4F#xp`+9((FF&>0(mvU{hafLpD_FdiimpC=B!BymdL5l zqiB&T@**8nDP6Mglb6W3OwkBEmRFebrpS4VB%Cl!&&lW!DH)C~d| z_{XmH<4D9E(e?MbG8J*^fp)T}%@e9ot?qPvCBoRt0x6O-KJ-1Qgg%NzR|d)8+MD9Y z*InTzSe2x{tEK4Rl$P5*P$G`1TRq*ySu4VgJjg=zl$N0q0T%eto={nm#HkjYIK^Dl z?xu0nH!zg#t{eF(RG(CQs}NMd<35rr?c^Krz*^(3}grw zHHQgb;hGz!g1Pj*~Hpil{$-fvX(G;;0b*yyRj!ThfN3;gN;2-1@v z?HIm&szWz&_hg!nS1`T>kK__7{&MZ^o!$F8&8-Iy?r*O*F9M|6L5Ym%wT5Y z$<~wR>ep+l_nP+Z=H~k5S9Jy`Jqoglt z_>2#Ql^;Tts-imgCA88#6Y*oD%J+(Xwl z3D_`;@(>K;o_WYPP{vly)qY8vsGZjC8;ljZy~(B9hwLvfpg0L>)C7smF;&CkoX`jo zvi_NAT0bt)cV#*$(|)Ol+zE2IOxv98-wY)53v66vgzI0(pj&}PrZK3j75eaHSBC6R zw~vwr9*a2Mg+pHnci8fJurnV2JHUehuZ26Kq+g!E#>g~J>76BL(F0Pc0F`K_oP>Er z+OzD!ageRNg>hCHFyzc?p6aTz-|aaj+{o<(CU3Y-&q1e&{a{Poz@Xy8X>7*&YX+=f zBF_MgNFxs{I!gkif+^ouB*E|4`wx>~phf;aa=?Vu=J}$a7mg zi+t{6JlOkzpSSAoLNY+!YvqI&#o|^zsm2r$U*Cz01O<>I*TE4%q literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/pkg_resources.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/pkg_resources.py new file mode 100644 index 0000000..0bc129a --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/pkg_resources.py @@ -0,0 +1,44 @@ +from pip._vendor.pkg_resources import yield_lines +from pip._vendor.six import ensure_str + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Dict, Iterable, List + + +class DictMetadata(object): + """IMetadataProvider that reads metadata files from a dictionary. + """ + def __init__(self, metadata): + # type: (Dict[str, bytes]) -> None + self._metadata = metadata + + def has_metadata(self, name): + # type: (str) -> bool + return name in self._metadata + + def get_metadata(self, name): + # type: (str) -> str + try: + return ensure_str(self._metadata[name]) + except UnicodeDecodeError as e: + # Mirrors handling done in pkg_resources.NullProvider. + e.reason += " in {} file".format(name) + raise + + def get_metadata_lines(self, name): + # type: (str) -> Iterable[str] + return yield_lines(self.get_metadata(name)) + + def metadata_isdir(self, name): + # type: (str) -> bool + return False + + def metadata_listdir(self, name): + # type: (str) -> List[str] + return [] + + def run_script(self, script_name, namespace): + # type: (str, str) -> None + pass diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/pkg_resources.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/pkg_resources.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0bd942e5cc67d25caa8922f8a08b0ac0cd1fec9 GIT binary patch literal 2290 zcmcIl&2AGh5FYPtk|w3J{8VZ=z={KkkeW&y;DS&^TcALr%2fr;#oF#Vt<(L9Y^Ng7 zUMLqHh^OH(cmSAjewuRVDcQu6@r>90=9}@v|Fcm0{qvWIVfgs?yMewdOMt`HJR}v^ug~F`>MuTZhMJv6(N{7}M5=OW2F4m1Wo~*}3S;%ab{B2ChkJ)& z^WFC52f+`T&7J1kI>llG6k95`mNwt9Qb$Lrbk>i`SbJ;e-jy~=A{&i~AOx>*m|YYS zD1HpT zB(kBFQDVYuh$w8URGP4@i!6-71Vd3p9_fCg7UC0oxX)HN})6d zOjS`8qn+#Yo}Ek#7omq<%cQ{zg@WO*XcA)X>=4=s`rCj#YG~wB*|^9 z3vJ72#@aDO?$manv&gzz;P~RStEF9L!q~C2W5$;85JNW=JfAJIMQ??TQ%&qS=I)^~ zNgL8Z#0|@ph~PMY6a80NcTr3`<3#8r{z1ceh}Oxx6C|R~p$||&^dq=rx0I$gQEKFj z;oin`MmJR`lPLWdEjL0vzJiKNXU*r*B)}B=EJA!T0g-Be#x*u4dKJ3hs&L&Ofr+*1 zT0!^SQWqn|bfb9cwM=EJd$|}K_!MVDV(a7?b}~9$2ul_rvLflFG^PF|L{h{;aB^|# zB(8orRT#fdg6;-iL2*^Y)9YQFdH@}5C List[str] + """ + Get setuptools command arguments with shim wrapped setup file invocation. + + :param setup_py_path: The path to setup.py to be wrapped. + :param global_options: Additional global options. + :param no_user_config: If True, disables personal user configuration. + :param unbuffered_output: If True, adds the unbuffered switch to the + argument list. + """ + args = [sys.executable] + if unbuffered_output: + args += ["-u"] + args += ["-c", _SETUPTOOLS_SHIM.format(setup_py_path)] + if global_options: + args += global_options + if no_user_config: + args += ["--no-user-cfg"] + return args + + +def make_setuptools_bdist_wheel_args( + setup_py_path, # type: str + global_options, # type: Sequence[str] + build_options, # type: Sequence[str] + destination_dir, # type: str +): + # type: (...) -> List[str] + # NOTE: Eventually, we'd want to also -S to the flags here, when we're + # isolating. Currently, it breaks Python in virtualenvs, because it + # relies on site.py to find parts of the standard library outside the + # virtualenv. + args = make_setuptools_shim_args( + setup_py_path, + global_options=global_options, + unbuffered_output=True + ) + args += ["bdist_wheel", "-d", destination_dir] + args += build_options + return args + + +def make_setuptools_clean_args( + setup_py_path, # type: str + global_options, # type: Sequence[str] +): + # type: (...) -> List[str] + args = make_setuptools_shim_args( + setup_py_path, + global_options=global_options, + unbuffered_output=True + ) + args += ["clean", "--all"] + return args + + +def make_setuptools_develop_args( + setup_py_path, # type: str + global_options, # type: Sequence[str] + install_options, # type: Sequence[str] + no_user_config, # type: bool + prefix, # type: Optional[str] + home, # type: Optional[str] + use_user_site, # type: bool +): + # type: (...) -> List[str] + assert not (use_user_site and prefix) + + args = make_setuptools_shim_args( + setup_py_path, + global_options=global_options, + no_user_config=no_user_config, + ) + + args += ["develop", "--no-deps"] + + args += install_options + + if prefix: + args += ["--prefix", prefix] + if home is not None: + args += ["--home", home] + + if use_user_site: + args += ["--user", "--prefix="] + + return args + + +def make_setuptools_egg_info_args( + setup_py_path, # type: str + egg_info_dir, # type: Optional[str] + no_user_config, # type: bool +): + # type: (...) -> List[str] + args = make_setuptools_shim_args( + setup_py_path, no_user_config=no_user_config + ) + + args += ["egg_info"] + + if egg_info_dir: + args += ["--egg-base", egg_info_dir] + + return args + + +def make_setuptools_install_args( + setup_py_path, # type: str + global_options, # type: Sequence[str] + install_options, # type: Sequence[str] + record_filename, # type: str + root, # type: Optional[str] + prefix, # type: Optional[str] + header_dir, # type: Optional[str] + home, # type: Optional[str] + use_user_site, # type: bool + no_user_config, # type: bool + pycompile # type: bool +): + # type: (...) -> List[str] + assert not (use_user_site and prefix) + assert not (use_user_site and root) + + args = make_setuptools_shim_args( + setup_py_path, + global_options=global_options, + no_user_config=no_user_config, + unbuffered_output=True + ) + args += ["install", "--record", record_filename] + args += ["--single-version-externally-managed"] + + if root is not None: + args += ["--root", root] + if prefix is not None: + args += ["--prefix", prefix] + if home is not None: + args += ["--home", home] + if use_user_site: + args += ["--user", "--prefix="] + + if pycompile: + args += ["--compile"] + else: + args += ["--no-compile"] + + if header_dir: + args += ["--install-headers", header_dir] + + args += install_options + + return args diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/setuptools_build.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3e803b7f9b8f623b1ecc72e3a1de1af4f9d3096 GIT binary patch literal 3796 zcmcIm-E!PC6qfB|limC@G|*BgQ- zZQ7LNhV}w@04})X9e4mPcnNq3W_SSj&XISsE#-n4va^;Y9ZA;tbiPl=`*W`K`*%M_ ziKu@Qcz=vXe~%)?-x0YGTej|s+!1|OY`Mabu27eGgeP)O^e4pDgy>I-tx3^uh^>Zj z3QR)p6s;kf^iLDiL}X;d6Blba*U>L1T)x9_7{HZ zfrF|!j^gIs+jpZYpI*K4S=70+zJ7iETHuk5e7KQmW2RBLRhg_T;+z{B@~eR?5~+WM zCF@tEGQQr^E54RyP?@sKQ8(oSS!9ppDw*1`>g|4h{tJK2|N8t{b+GD3Q8&wF6s_5I zcdaK)Y>Wzq^H%(&vXaHpichcQU^roUH7QfM)@>^pr@=B_RURiYSh}a~(dZ?V%d6dX zl9yTr%d7H{OoF8BSNI&>sazR-8-vNZw7i^`Y$xz!B#ufKHu`k3E*j%>lJ3_6K8I|E!9CgYwyk}R~2=MGPT2fLe$TS-7<;kwAw9R?qU_IxNnC< z)m~J^X6K^6xg&k5;he0gUF}hQTMid(kI(Mq<#wD$C5M5&=wD9L%tnN7O*kcL>t|*a zWi-%IMM+t7v))Djde`4n1Drsb>3BPr+OMS26jwftgR3-dpz7@t81?Q4#rB}vl}e^j zIWX10j4c+YsrC*0IUM9`V3e?PFt8&d{QMk2ZMUgi03QzQE75b*3X2jwQiVyk#|LAG z4TxdW!kgk{U}*1V0nKRR>gJu>o40P=*oZbhy?)a)(Ah0jKQ;k{lc6Q~EQiROdGtJs zCU-pxm3axH4&AAJW=bLqbO5X1LQ}AwGyUpZl~rL@XcOmoc;Wi}$M5y2i=QYfj8s7R z+`weHK6e;g(e@zAQyjfHg?0Mz0~w7ODa0cB-bolWX@yvrbsElsa|-1g*G9}C&zU(N zq5|fC4xkFcp9tcB8ZNO2eDO%nK&PH(nSw^mnF%Nqp|;*>qU?}Z87j6BE+%@oBV}%n zDh=r1Is`6bLP5ndJET=Sn~`VlhCyqN!InyGvV!9)N;B1&Mc)yi>0{aF(H!%FLA`)6 znxa9>c!09uG~Gp~|x6*OK9s7ugUKv{RV{Z9-D( zFp}I}RjO2nJXkLa888L7pwDsC*SaudLWeg-U$iSThv?Hx8hqHQw$6+^sz^AEk3Sy? zHA)-{cVO2vNVFE+IvTtMx8*jRMQ7Goq_>+8P3Z0%-P)JXIHZb;5O5A~GvoYSd*`Bo zoB0Fo;yNFz$9K7h)1#HvEj|RH?DZg?-BJ@`VTfk99V4xvGF7C;+rn)Li^PknA)`mK> z<)db48Fo+x5sor~9VE-xh7H#fFmd#<_IK!Z4=5_eE`V3jWa+RDak5^-PzWLj?YBb- z1E)lGX^wc(_s;87u)>i3RD1P?j*1B{Qj($G5fQ${CiHm}Vtx^tVYS3wwsS6&gw%u| zQWWGiuBA%L4Jg6ukiUlfLNe7JB~oopq}pb$!V!016`c9iZB_@)P)MLUB(w~&q3idP zIM>pmPZ?F`Wh%&t&KWA+K@s2?EB?0}k63@HU#5dxenflJbjq{t0^B~+Y_vSbb7oIA MUun)a&o+<$4gN`Z6#xJL literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/subprocess.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/subprocess.py new file mode 100644 index 0000000..d398e68 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/subprocess.py @@ -0,0 +1,280 @@ +from __future__ import absolute_import + +import logging +import os +import subprocess + +from pip._vendor.six.moves import shlex_quote + +from pip._internal.cli.spinners import SpinnerInterface, open_spinner +from pip._internal.exceptions import InstallationError +from pip._internal.utils.compat import console_to_str, str_to_display +from pip._internal.utils.logging import subprocess_logger +from pip._internal.utils.misc import HiddenText, path_to_display +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Callable, Iterable, List, Mapping, Optional, Text, Union, + ) + + CommandArgs = List[Union[str, HiddenText]] + + +LOG_DIVIDER = '----------------------------------------' + + +def make_command(*args): + # type: (Union[str, HiddenText, CommandArgs]) -> CommandArgs + """ + Create a CommandArgs object. + """ + command_args = [] # type: CommandArgs + for arg in args: + # Check for list instead of CommandArgs since CommandArgs is + # only known during type-checking. + if isinstance(arg, list): + command_args.extend(arg) + else: + # Otherwise, arg is str or HiddenText. + command_args.append(arg) + + return command_args + + +def format_command_args(args): + # type: (Union[List[str], CommandArgs]) -> str + """ + Format command arguments for display. + """ + # For HiddenText arguments, display the redacted form by calling str(). + # Also, we don't apply str() to arguments that aren't HiddenText since + # this can trigger a UnicodeDecodeError in Python 2 if the argument + # has type unicode and includes a non-ascii character. (The type + # checker doesn't ensure the annotations are correct in all cases.) + return ' '.join( + shlex_quote(str(arg)) if isinstance(arg, HiddenText) + else shlex_quote(arg) for arg in args + ) + + +def reveal_command_args(args): + # type: (Union[List[str], CommandArgs]) -> List[str] + """ + Return the arguments in their raw, unredacted form. + """ + return [ + arg.secret if isinstance(arg, HiddenText) else arg for arg in args + ] + + +def make_subprocess_output_error( + cmd_args, # type: Union[List[str], CommandArgs] + cwd, # type: Optional[str] + lines, # type: List[Text] + exit_status, # type: int +): + # type: (...) -> Text + """ + Create and return the error message to use to log a subprocess error + with command output. + + :param lines: A list of lines, each ending with a newline. + """ + command = format_command_args(cmd_args) + # Convert `command` and `cwd` to text (unicode in Python 2) so we can use + # them as arguments in the unicode format string below. This avoids + # "UnicodeDecodeError: 'ascii' codec can't decode byte ..." in Python 2 + # if either contains a non-ascii character. + command_display = str_to_display(command, desc='command bytes') + cwd_display = path_to_display(cwd) + + # We know the joined output value ends in a newline. + output = ''.join(lines) + msg = ( + # Use a unicode string to avoid "UnicodeEncodeError: 'ascii' + # codec can't encode character ..." in Python 2 when a format + # argument (e.g. `output`) has a non-ascii character. + u'Command errored out with exit status {exit_status}:\n' + ' command: {command_display}\n' + ' cwd: {cwd_display}\n' + 'Complete output ({line_count} lines):\n{output}{divider}' + ).format( + exit_status=exit_status, + command_display=command_display, + cwd_display=cwd_display, + line_count=len(lines), + output=output, + divider=LOG_DIVIDER, + ) + return msg + + +def call_subprocess( + cmd, # type: Union[List[str], CommandArgs] + show_stdout=False, # type: bool + cwd=None, # type: Optional[str] + on_returncode='raise', # type: str + extra_ok_returncodes=None, # type: Optional[Iterable[int]] + command_desc=None, # type: Optional[str] + extra_environ=None, # type: Optional[Mapping[str, Any]] + unset_environ=None, # type: Optional[Iterable[str]] + spinner=None, # type: Optional[SpinnerInterface] + log_failed_cmd=True # type: Optional[bool] +): + # type: (...) -> Text + """ + Args: + show_stdout: if true, use INFO to log the subprocess's stderr and + stdout streams. Otherwise, use DEBUG. Defaults to False. + extra_ok_returncodes: an iterable of integer return codes that are + acceptable, in addition to 0. Defaults to None, which means []. + unset_environ: an iterable of environment variable names to unset + prior to calling subprocess.Popen(). + log_failed_cmd: if false, failed commands are not logged, only raised. + """ + if extra_ok_returncodes is None: + extra_ok_returncodes = [] + if unset_environ is None: + unset_environ = [] + # Most places in pip use show_stdout=False. What this means is-- + # + # - We connect the child's output (combined stderr and stdout) to a + # single pipe, which we read. + # - We log this output to stderr at DEBUG level as it is received. + # - If DEBUG logging isn't enabled (e.g. if --verbose logging wasn't + # requested), then we show a spinner so the user can still see the + # subprocess is in progress. + # - If the subprocess exits with an error, we log the output to stderr + # at ERROR level if it hasn't already been displayed to the console + # (e.g. if --verbose logging wasn't enabled). This way we don't log + # the output to the console twice. + # + # If show_stdout=True, then the above is still done, but with DEBUG + # replaced by INFO. + if show_stdout: + # Then log the subprocess output at INFO level. + log_subprocess = subprocess_logger.info + used_level = logging.INFO + else: + # Then log the subprocess output using DEBUG. This also ensures + # it will be logged to the log file (aka user_log), if enabled. + log_subprocess = subprocess_logger.debug + used_level = logging.DEBUG + + # Whether the subprocess will be visible in the console. + showing_subprocess = subprocess_logger.getEffectiveLevel() <= used_level + + # Only use the spinner if we're not showing the subprocess output + # and we have a spinner. + use_spinner = not showing_subprocess and spinner is not None + + if command_desc is None: + command_desc = format_command_args(cmd) + + log_subprocess("Running command %s", command_desc) + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + for name in unset_environ: + env.pop(name, None) + try: + proc = subprocess.Popen( + # Convert HiddenText objects to the underlying str. + reveal_command_args(cmd), + stderr=subprocess.STDOUT, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, cwd=cwd, env=env, + ) + assert proc.stdin + assert proc.stdout + proc.stdin.close() + except Exception as exc: + if log_failed_cmd: + subprocess_logger.critical( + "Error %s while executing command %s", exc, command_desc, + ) + raise + all_output = [] + while True: + # The "line" value is a unicode string in Python 2. + line = console_to_str(proc.stdout.readline()) + if not line: + break + line = line.rstrip() + all_output.append(line + '\n') + + # Show the line immediately. + log_subprocess(line) + # Update the spinner. + if use_spinner: + assert spinner + spinner.spin() + try: + proc.wait() + finally: + if proc.stdout: + proc.stdout.close() + proc_had_error = ( + proc.returncode and proc.returncode not in extra_ok_returncodes + ) + if use_spinner: + assert spinner + if proc_had_error: + spinner.finish("error") + else: + spinner.finish("done") + if proc_had_error: + if on_returncode == 'raise': + if not showing_subprocess and log_failed_cmd: + # Then the subprocess streams haven't been logged to the + # console yet. + msg = make_subprocess_output_error( + cmd_args=cmd, + cwd=cwd, + lines=all_output, + exit_status=proc.returncode, + ) + subprocess_logger.error(msg) + exc_msg = ( + 'Command errored out with exit status {}: {} ' + 'Check the logs for full command output.' + ).format(proc.returncode, command_desc) + raise InstallationError(exc_msg) + elif on_returncode == 'warn': + subprocess_logger.warning( + 'Command "%s" had error code %s in %s', + command_desc, + proc.returncode, + cwd, + ) + elif on_returncode == 'ignore': + pass + else: + raise ValueError('Invalid value: on_returncode={!r}'.format( + on_returncode)) + return ''.join(all_output) + + +def runner_with_spinner_message(message): + # type: (str) -> Callable[..., None] + """Provide a subprocess_runner that shows a spinner message. + + Intended for use with for pep517's Pep517HookCaller. Thus, the runner has + an API that matches what's expected by Pep517HookCaller.subprocess_runner. + """ + + def runner( + cmd, # type: List[str] + cwd=None, # type: Optional[str] + extra_environ=None # type: Optional[Mapping[str, Any]] + ): + # type: (...) -> None + with open_spinner(message) as spinner: + call_subprocess( + cmd, + cwd=cwd, + extra_environ=extra_environ, + spinner=spinner, + ) + + return runner diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/subprocess.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/subprocess.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28b93942e8d76f5ea90c0980eb9f319022dba931 GIT binary patch literal 6769 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.py new file mode 100644 index 0000000..03aa828 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.py @@ -0,0 +1,274 @@ +from __future__ import absolute_import + +import errno +import itertools +import logging +import os.path +import tempfile +from contextlib import contextmanager + +from pip._vendor.contextlib2 import ExitStack +from pip._vendor.six import ensure_text + +from pip._internal.utils.misc import enum, rmtree +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Dict, Iterator, Optional, TypeVar, Union + + _T = TypeVar('_T', bound='TempDirectory') + + +logger = logging.getLogger(__name__) + + +# Kinds of temporary directories. Only needed for ones that are +# globally-managed. +tempdir_kinds = enum( + BUILD_ENV="build-env", + EPHEM_WHEEL_CACHE="ephem-wheel-cache", + REQ_BUILD="req-build", +) + + +_tempdir_manager = None # type: Optional[ExitStack] + + +@contextmanager +def global_tempdir_manager(): + # type: () -> Iterator[None] + global _tempdir_manager + with ExitStack() as stack: + old_tempdir_manager, _tempdir_manager = _tempdir_manager, stack + try: + yield + finally: + _tempdir_manager = old_tempdir_manager + + +class TempDirectoryTypeRegistry(object): + """Manages temp directory behavior + """ + + def __init__(self): + # type: () -> None + self._should_delete = {} # type: Dict[str, bool] + + def set_delete(self, kind, value): + # type: (str, bool) -> None + """Indicate whether a TempDirectory of the given kind should be + auto-deleted. + """ + self._should_delete[kind] = value + + def get_delete(self, kind): + # type: (str) -> bool + """Get configured auto-delete flag for a given TempDirectory type, + default True. + """ + return self._should_delete.get(kind, True) + + +_tempdir_registry = None # type: Optional[TempDirectoryTypeRegistry] + + +@contextmanager +def tempdir_registry(): + # type: () -> Iterator[TempDirectoryTypeRegistry] + """Provides a scoped global tempdir registry that can be used to dictate + whether directories should be deleted. + """ + global _tempdir_registry + old_tempdir_registry = _tempdir_registry + _tempdir_registry = TempDirectoryTypeRegistry() + try: + yield _tempdir_registry + finally: + _tempdir_registry = old_tempdir_registry + + +class _Default(object): + pass + + +_default = _Default() + + +class TempDirectory(object): + """Helper class that owns and cleans up a temporary directory. + + This class can be used as a context manager or as an OO representation of a + temporary directory. + + Attributes: + path + Location to the created temporary directory + delete + Whether the directory should be deleted when exiting + (when used as a contextmanager) + + Methods: + cleanup() + Deletes the temporary directory + + When used as a context manager, if the delete attribute is True, on + exiting the context the temporary directory is deleted. + """ + + def __init__( + self, + path=None, # type: Optional[str] + delete=_default, # type: Union[bool, None, _Default] + kind="temp", # type: str + globally_managed=False, # type: bool + ): + super(TempDirectory, self).__init__() + + if delete is _default: + if path is not None: + # If we were given an explicit directory, resolve delete option + # now. + delete = False + else: + # Otherwise, we wait until cleanup and see what + # tempdir_registry says. + delete = None + + if path is None: + path = self._create(kind) + + self._path = path + self._deleted = False + self.delete = delete + self.kind = kind + + if globally_managed: + assert _tempdir_manager is not None + _tempdir_manager.enter_context(self) + + @property + def path(self): + # type: () -> str + assert not self._deleted, ( + "Attempted to access deleted path: {}".format(self._path) + ) + return self._path + + def __repr__(self): + # type: () -> str + return "<{} {!r}>".format(self.__class__.__name__, self.path) + + def __enter__(self): + # type: (_T) -> _T + return self + + def __exit__(self, exc, value, tb): + # type: (Any, Any, Any) -> None + if self.delete is not None: + delete = self.delete + elif _tempdir_registry: + delete = _tempdir_registry.get_delete(self.kind) + else: + delete = True + + if delete: + self.cleanup() + + def _create(self, kind): + # type: (str) -> str + """Create a temporary directory and store its path in self.path + """ + # We realpath here because some systems have their default tmpdir + # symlinked to another directory. This tends to confuse build + # scripts, so we canonicalize the path by traversing potential + # symlinks here. + path = os.path.realpath( + tempfile.mkdtemp(prefix="pip-{}-".format(kind)) + ) + logger.debug("Created temporary directory: %s", path) + return path + + def cleanup(self): + # type: () -> None + """Remove the temporary directory created and reset state + """ + self._deleted = True + if os.path.exists(self._path): + # Make sure to pass unicode on Python 2 to make the contents also + # use unicode, ensuring non-ASCII names and can be represented. + rmtree(ensure_text(self._path)) + + +class AdjacentTempDirectory(TempDirectory): + """Helper class that creates a temporary directory adjacent to a real one. + + Attributes: + original + The original directory to create a temp directory for. + path + After calling create() or entering, contains the full + path to the temporary directory. + delete + Whether the directory should be deleted when exiting + (when used as a contextmanager) + + """ + # The characters that may be used to name the temp directory + # We always prepend a ~ and then rotate through these until + # a usable name is found. + # pkg_resources raises a different error for .dist-info folder + # with leading '-' and invalid metadata + LEADING_CHARS = "-~.=%0123456789" + + def __init__(self, original, delete=None): + # type: (str, Optional[bool]) -> None + self.original = original.rstrip('/\\') + super(AdjacentTempDirectory, self).__init__(delete=delete) + + @classmethod + def _generate_names(cls, name): + # type: (str) -> Iterator[str] + """Generates a series of temporary names. + + The algorithm replaces the leading characters in the name + with ones that are valid filesystem characters, but are not + valid package names (for both Python and pip definitions of + package). + """ + for i in range(1, len(name)): + for candidate in itertools.combinations_with_replacement( + cls.LEADING_CHARS, i - 1): + new_name = '~' + ''.join(candidate) + name[i:] + if new_name != name: + yield new_name + + # If we make it this far, we will have to make a longer name + for i in range(len(cls.LEADING_CHARS)): + for candidate in itertools.combinations_with_replacement( + cls.LEADING_CHARS, i): + new_name = '~' + ''.join(candidate) + name + if new_name != name: + yield new_name + + def _create(self, kind): + # type: (str) -> str + root, name = os.path.split(self.original) + for candidate in self._generate_names(name): + path = os.path.join(root, candidate) + try: + os.mkdir(path) + except OSError as ex: + # Continue if the name exists already + if ex.errno != errno.EEXIST: + raise + else: + path = os.path.realpath(path) + break + else: + # Final fallback on the default behavior. + path = os.path.realpath( + tempfile.mkdtemp(prefix="pip-{}-".format(kind)) + ) + + logger.debug("Created temporary directory: %s", path) + return path diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/temp_dir.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b794ac96f4e305551d20d236661f466cb45ef5b5 GIT binary patch literal 8599 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/typing.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/typing.py new file mode 100644 index 0000000..8505a29 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/typing.py @@ -0,0 +1,38 @@ +"""For neatly implementing static typing in pip. + +`mypy` - the static type analysis tool we use - uses the `typing` module, which +provides core functionality fundamental to mypy's functioning. + +Generally, `typing` would be imported at runtime and used in that fashion - +it acts as a no-op at runtime and does not have any run-time overhead by +design. + +As it turns out, `typing` is not vendorable - it uses separate sources for +Python 2/Python 3. Thus, this codebase can not expect it to be present. +To work around this, mypy allows the typing import to be behind a False-y +optional to prevent it from running at runtime and type-comments can be used +to remove the need for the types to be accessible directly during runtime. + +This module provides the False-y guard in a nicely named fashion so that a +curious maintainer can reach here to read this. + +In pip, all static-typing related imports should be guarded as follows: + + from pip._internal.utils.typing import MYPY_CHECK_RUNNING + + if MYPY_CHECK_RUNNING: + from typing import ... + +Ref: https://github.com/python/mypy/issues/3216 +""" + +MYPY_CHECK_RUNNING = False + + +if MYPY_CHECK_RUNNING: + from typing import cast +else: + # typing's cast() is needed at runtime, but we don't want to import typing. + # Thus, we use a dummy no-op version, which we tell mypy to ignore. + def cast(type_, value): # type: ignore + return value diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/typing.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/typing.pyc new file mode 100644 index 0000000000000000000000000000000000000000..77b20e93697a0c6791d04494a1db9613c52d260b GIT binary patch literal 1523 zcmbtUO^@3)5T(8DHWkoId+ddmAbYSRbOQwFqA1cXnsiar2)5fp_Tr_<@rtcP3M6Gm zMUTDY2j$n~XY>cOZzyN;b*x~?5;=VH=FKCI{`tIk{qogXi^Da?|6|jBhf9y^+L?tXTltbzY(_(W+8q(`GnX0un^*j57LoJ?I>;6x73kK z*4@gORI*y8vF9)AWN-VbC~ms3A8%wSQ$z2>kW@~!W3*8w?_0SiIYdGjo)|*x&4hF# zJ8y=TmU7=%-4uQBJ8KZ5eIU6VoKDsQ%BGROjAA~j1*+uC58_=6Xo1gDauihCj?1?h z_I_xM+z=P!Ln0$pl3_qy9rH9y%5X`k!NgX@1}SA(*d&!sQ7ZhT^QG@UTxdL)I-g{t zb__K#Y?*QWjzU8UdB+0v*jop7-$x11Gz1r=AJRJlUHl_wFPwT_W!%AK?LtLT=U}sl!Xl~yp~x9Qo4~1 z!Lpe++Rkl2?u)!pmMrFBdz1$;1GVTW(q>VkjLjRHW;&RG@3uZS;jAbmt}G?*yEU>? zz_zG{WZPK1-=ANeKYPAD|LMo`pVybatyUMSr_*w~l^;)?W#l{b_mQd!C0x?>Og1U? z@vN?IZEA*1g`U-Yc3{ohu(mM{6zhklUq34Bzqn3jI8YMK6QNa1nvW;GdGs82iQZgl-A);YTNSk;`cuvfsf6@^_@6% z7N?#{s`~MgA?`B_XA-kjKK0V4cweuL*Xt=~c18LEqaUl4jxjs|X0*4|^4tI8m+k@l W+sUZkeTDbP1IP2@qvP3^i~j)mz1?U4 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/unpacking.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/unpacking.py new file mode 100644 index 0000000..620f31e --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/unpacking.py @@ -0,0 +1,281 @@ +"""Utilities related archives. +""" + +from __future__ import absolute_import + +import logging +import os +import shutil +import stat +import tarfile +import zipfile + +from pip._internal.exceptions import InstallationError +from pip._internal.utils.filetypes import ( + BZ2_EXTENSIONS, + TAR_EXTENSIONS, + XZ_EXTENSIONS, + ZIP_EXTENSIONS, +) +from pip._internal.utils.misc import ensure_dir +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Iterable, List, Optional, Text, Union + from zipfile import ZipInfo + + +logger = logging.getLogger(__name__) + + +SUPPORTED_EXTENSIONS = ZIP_EXTENSIONS + TAR_EXTENSIONS + +try: + import bz2 # noqa + SUPPORTED_EXTENSIONS += BZ2_EXTENSIONS +except ImportError: + logger.debug('bz2 module is not available') + +try: + # Only for Python 3.3+ + import lzma # noqa + SUPPORTED_EXTENSIONS += XZ_EXTENSIONS +except ImportError: + logger.debug('lzma module is not available') + + +def current_umask(): + # type: () -> int + """Get the current umask which involves having to set it temporarily.""" + mask = os.umask(0) + os.umask(mask) + return mask + + +def split_leading_dir(path): + # type: (Union[str, Text]) -> List[Union[str, Text]] + path = path.lstrip('/').lstrip('\\') + if ( + '/' in path and ( + ('\\' in path and path.find('/') < path.find('\\')) or + '\\' not in path + ) + ): + return path.split('/', 1) + elif '\\' in path: + return path.split('\\', 1) + else: + return [path, ''] + + +def has_leading_dir(paths): + # type: (Iterable[Union[str, Text]]) -> bool + """Returns true if all the paths have the same leading path name + (i.e., everything is in one subdirectory in an archive)""" + common_prefix = None + for path in paths: + prefix, rest = split_leading_dir(path) + if not prefix: + return False + elif common_prefix is None: + common_prefix = prefix + elif prefix != common_prefix: + return False + return True + + +def is_within_directory(directory, target): + # type: ((Union[str, Text]), (Union[str, Text])) -> bool + """ + Return true if the absolute path of target is within the directory + """ + abs_directory = os.path.abspath(directory) + abs_target = os.path.abspath(target) + + prefix = os.path.commonprefix([abs_directory, abs_target]) + return prefix == abs_directory + + +def set_extracted_file_to_default_mode_plus_executable(path): + # type: (Union[str, Text]) -> None + """ + Make file present at path have execute for user/group/world + (chmod +x) is no-op on windows per python docs + """ + os.chmod(path, (0o777 & ~current_umask() | 0o111)) + + +def zip_item_is_executable(info): + # type: (ZipInfo) -> bool + mode = info.external_attr >> 16 + # if mode and regular file and any execute permissions for + # user/group/world? + return bool(mode and stat.S_ISREG(mode) and mode & 0o111) + + +def unzip_file(filename, location, flatten=True): + # type: (str, str, bool) -> None + """ + Unzip the file (with path `filename`) to the destination `location`. All + files are written based on system defaults and umask (i.e. permissions are + not preserved), except that regular file members with any execute + permissions (user, group, or world) have "chmod +x" applied after being + written. Note that for windows, any execute changes using os.chmod are + no-ops per the python docs. + """ + ensure_dir(location) + zipfp = open(filename, 'rb') + try: + zip = zipfile.ZipFile(zipfp, allowZip64=True) + leading = has_leading_dir(zip.namelist()) and flatten + for info in zip.infolist(): + name = info.filename + fn = name + if leading: + fn = split_leading_dir(name)[1] + fn = os.path.join(location, fn) + dir = os.path.dirname(fn) + if not is_within_directory(location, fn): + message = ( + 'The zip file ({}) has a file ({}) trying to install ' + 'outside target directory ({})' + ) + raise InstallationError(message.format(filename, fn, location)) + if fn.endswith('/') or fn.endswith('\\'): + # A directory + ensure_dir(fn) + else: + ensure_dir(dir) + # Don't use read() to avoid allocating an arbitrarily large + # chunk of memory for the file's content + fp = zip.open(name) + try: + with open(fn, 'wb') as destfp: + shutil.copyfileobj(fp, destfp) + finally: + fp.close() + if zip_item_is_executable(info): + set_extracted_file_to_default_mode_plus_executable(fn) + finally: + zipfp.close() + + +def untar_file(filename, location): + # type: (str, str) -> None + """ + Untar the file (with path `filename`) to the destination `location`. + All files are written based on system defaults and umask (i.e. permissions + are not preserved), except that regular file members with any execute + permissions (user, group, or world) have "chmod +x" applied after being + written. Note that for windows, any execute changes using os.chmod are + no-ops per the python docs. + """ + ensure_dir(location) + if filename.lower().endswith('.gz') or filename.lower().endswith('.tgz'): + mode = 'r:gz' + elif filename.lower().endswith(BZ2_EXTENSIONS): + mode = 'r:bz2' + elif filename.lower().endswith(XZ_EXTENSIONS): + mode = 'r:xz' + elif filename.lower().endswith('.tar'): + mode = 'r' + else: + logger.warning( + 'Cannot determine compression type for file %s', filename, + ) + mode = 'r:*' + tar = tarfile.open(filename, mode) + try: + leading = has_leading_dir([ + member.name for member in tar.getmembers() + ]) + for member in tar.getmembers(): + fn = member.name + if leading: + # https://github.com/python/mypy/issues/1174 + fn = split_leading_dir(fn)[1] # type: ignore + path = os.path.join(location, fn) + if not is_within_directory(location, path): + message = ( + 'The tar file ({}) has a file ({}) trying to install ' + 'outside target directory ({})' + ) + raise InstallationError( + message.format(filename, path, location) + ) + if member.isdir(): + ensure_dir(path) + elif member.issym(): + try: + # https://github.com/python/typeshed/issues/2673 + tar._extract_member(member, path) # type: ignore + except Exception as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + 'In the tar file %s the member %s is invalid: %s', + filename, member.name, exc, + ) + continue + else: + try: + fp = tar.extractfile(member) + except (KeyError, AttributeError) as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + 'In the tar file %s the member %s is invalid: %s', + filename, member.name, exc, + ) + continue + ensure_dir(os.path.dirname(path)) + assert fp is not None + with open(path, 'wb') as destfp: + shutil.copyfileobj(fp, destfp) + fp.close() + # Update the timestamp (useful for cython compiled files) + # https://github.com/python/typeshed/issues/2673 + tar.utime(member, path) # type: ignore + # member have any execute permissions for user/group/world? + if member.mode & 0o111: + set_extracted_file_to_default_mode_plus_executable(path) + finally: + tar.close() + + +def unpack_file( + filename, # type: str + location, # type: str + content_type=None, # type: Optional[str] +): + # type: (...) -> None + filename = os.path.realpath(filename) + if ( + content_type == 'application/zip' or + filename.lower().endswith(ZIP_EXTENSIONS) or + zipfile.is_zipfile(filename) + ): + unzip_file( + filename, + location, + flatten=not filename.endswith('.whl') + ) + elif ( + content_type == 'application/x-gzip' or + tarfile.is_tarfile(filename) or + filename.lower().endswith( + TAR_EXTENSIONS + BZ2_EXTENSIONS + XZ_EXTENSIONS + ) + ): + untar_file(filename, location) + else: + # FIXME: handle? + # FIXME: magic signatures? + logger.critical( + 'Cannot unpack file %s (downloaded from %s, content-type: %s); ' + 'cannot detect archive format', + filename, location, content_type, + ) + raise InstallationError( + 'Cannot determine archive format of {}'.format(location) + ) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/unpacking.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/unpacking.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c7c2112e5ba5cb37205291eb201211bd48356cb GIT binary patch literal 7837 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 Optional[Text] + if ':' not in url: + return None + return url.split(':', 1)[0].lower() + + +def path_to_url(path): + # type: (Union[str, Text]) -> str + """ + Convert a path to a file: URL. The path will be made absolute and have + quoted path parts. + """ + path = os.path.normpath(os.path.abspath(path)) + url = urllib_parse.urljoin('file:', urllib_request.pathname2url(path)) + return url + + +def url_to_path(url): + # type: (str) -> str + """ + Convert a file: URL to a path. + """ + assert url.startswith('file:'), ( + "You can only turn file: urls into filenames (not {url!r})" + .format(**locals())) + + _, netloc, path, _, _ = urllib_parse.urlsplit(url) + + if not netloc or netloc == 'localhost': + # According to RFC 8089, same as empty authority. + netloc = '' + elif sys.platform == 'win32': + # If we have a UNC path, prepend UNC share notation. + netloc = '\\\\' + netloc + else: + raise ValueError( + 'non-local file URIs are not supported on this platform: {url!r}' + .format(**locals()) + ) + + path = urllib_request.url2pathname(netloc + path) + return path diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/urls.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/urls.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cdd68d8a9649225ab654e2bd0a18a292b2f7f45c GIT binary patch literal 1919 zcmb_c+io015UrWnyVuDoK?>KT5f3a#UP}gnu(-;KzycODi4k5|T8(!*+1d1TPo{hA z7~&Vg3ljVZuY3)k!3V&pn%y8pyphpNO;um2y6T*+shfmG+?? zxQ2nRkH0;h9(-~8;LB-xG#($0KOZK%w*&D_8FFVc6B;n?>PJC59$5^|H~@dV_yC`O z8v>_zO!S~l)qr!k17nF=;Em}?%oTWP2@Nwtb~z60VLxY?Mg345xg@pdCcRPp+vIcs*~lS)unZC#j}f(zFNhoIu-JN0|o4z`X#oMyz!+ zdZk8;(c+{9vEQLE9fhQT$iGQoA9%?CCd|p-1ihbtm_S#9dD3LWE`eJj3ebzG@4x3C z==>n2Dx-OWSJ-#gSkId>e#!S0%Wm-8i+rPSZT}-$mzF(V_c);&%pLG30YMlf&&7I% zAWvygvxF=CEWrK)Y&&)v0$V?KojOxgHHU$&~L?`Wi%d6#~s{G(FRH?y8Z`AB_rkru_(haX(YclT;?< zmRe`aA!O60`;DagjlxBl+xscwDG9G_u42kJCuPi2#wg{>mA(P-ZzV+gUtO26`>=5H bmC+ybX+2}pkNWW-8pMOR72Qg@?e5k;cT}!? literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/virtualenv.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/virtualenv.py new file mode 100644 index 0000000..4a78128 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/virtualenv.py @@ -0,0 +1,119 @@ +from __future__ import absolute_import + +import io +import logging +import os +import re +import site +import sys + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Optional + +logger = logging.getLogger(__name__) +_INCLUDE_SYSTEM_SITE_PACKAGES_REGEX = re.compile( + r"include-system-site-packages\s*=\s*(?Ptrue|false)" +) + + +def _running_under_venv(): + # type: () -> bool + """Checks if sys.base_prefix and sys.prefix match. + + This handles PEP 405 compliant virtual environments. + """ + return sys.prefix != getattr(sys, "base_prefix", sys.prefix) + + +def _running_under_regular_virtualenv(): + # type: () -> bool + """Checks if sys.real_prefix is set. + + This handles virtual environments created with pypa's virtualenv. + """ + # pypa/virtualenv case + return hasattr(sys, 'real_prefix') + + +def running_under_virtualenv(): + # type: () -> bool + """Return True if we're running inside a virtualenv, False otherwise. + """ + return _running_under_venv() or _running_under_regular_virtualenv() + + +def _get_pyvenv_cfg_lines(): + # type: () -> Optional[List[str]] + """Reads {sys.prefix}/pyvenv.cfg and returns its contents as list of lines + + Returns None, if it could not read/access the file. + """ + pyvenv_cfg_file = os.path.join(sys.prefix, 'pyvenv.cfg') + try: + # Although PEP 405 does not specify, the built-in venv module always + # writes with UTF-8. (pypa/pip#8717) + with io.open(pyvenv_cfg_file, encoding='utf-8') as f: + return f.read().splitlines() # avoids trailing newlines + except IOError: + return None + + +def _no_global_under_venv(): + # type: () -> bool + """Check `{sys.prefix}/pyvenv.cfg` for system site-packages inclusion + + PEP 405 specifies that when system site-packages are not supposed to be + visible from a virtual environment, `pyvenv.cfg` must contain the following + line: + + include-system-site-packages = false + + Additionally, log a warning if accessing the file fails. + """ + cfg_lines = _get_pyvenv_cfg_lines() + if cfg_lines is None: + # We're not in a "sane" venv, so assume there is no system + # site-packages access (since that's PEP 405's default state). + logger.warning( + "Could not access 'pyvenv.cfg' despite a virtual environment " + "being active. Assuming global site-packages is not accessible " + "in this environment." + ) + return True + + for line in cfg_lines: + match = _INCLUDE_SYSTEM_SITE_PACKAGES_REGEX.match(line) + if match is not None and match.group('value') == 'false': + return True + return False + + +def _no_global_under_regular_virtualenv(): + # type: () -> bool + """Check if "no-global-site-packages.txt" exists beside site.py + + This mirrors logic in pypa/virtualenv for determining whether system + site-packages are visible in the virtual environment. + """ + site_mod_dir = os.path.dirname(os.path.abspath(site.__file__)) + no_global_site_packages_file = os.path.join( + site_mod_dir, 'no-global-site-packages.txt', + ) + return os.path.exists(no_global_site_packages_file) + + +def virtualenv_no_global(): + # type: () -> bool + """Returns a boolean, whether running in venv with no system site-packages. + """ + # PEP 405 compliance needs to be checked first since virtualenv >=20 would + # return True for both checks, but is only able to use the PEP 405 config. + if _running_under_venv(): + return _no_global_under_venv() + + if _running_under_regular_virtualenv(): + return _no_global_under_regular_virtualenv() + + return False diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/virtualenv.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/virtualenv.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25a61e70e8988dcb42b637cd8b0677affdade943 GIT binary patch literal 4067 zcmb_f+j1Mn5$y#)fS^c`mT$6?az;vGAt?e(x$Kn7W!X|_SY}zG89**cs5q-7b^t86 zx9rT4Vj?{;sZ?H)ugNFmEAj(*&ky8u4=$9<_=%J-=$+Z!={bG+bffy;jkSOO?VtXT zW`7lY-?>9%{sSY#e~)6K#G`>n9$!}|uF#+&Yp|;{sLt&g4Qg|Hg$65gyH11p+-}gI zA$FDGRZ5yPXp*O!RQy$DYZR|ha)kz0C|Re$I(aFPuF`aa^i?{88=It8Xu3t=id?=% zVV(X=G`L1#LyXrcTovOD3Y%iQN#U9pZ&7$fjJGLV7vnk~sNdSaVIzE~g1>Pb-ckZ$~2AAv0tX4F8pIGy@_eVz)*dGD7z+za_9k}^%%=D zCWAnj@cK&-7CMOM5CSEm?M0wn1d$rzS*t^J64{B$PxIiGnPbVGFA+SqhvO8(H3lwwQZZ z>1kUQsd@-jGZ|0xtwO6=j1;0Ag<1vY(AZXAGWS(xC%QO^jCSw{9KBV3Aye)0ak!4R zzCxYF@p(6Q{F)q}8L~)8o^d%iMM^@dpn<}q7euEYkcC>+>A5IpScPVJ|9G2Tc=X(( zX@jwvt_ot0!W#Yd@uTz_)ohcF)~NVBd7g*a{$n0myrKCEhMo>WqyEHc?UL%nPJYTf z?+iy{$?ifhNAg>P>_x^PPgP)440Tf32;ZqTF5_KzjM~pqz0CoNEFLN2P^Fnw;A6NG z42Rkng?Ok@6wl&e*5JuVgkDx%DYK<0s+h%wEgR4CnJ zb&y-4OjfcS{<4_z?w0p4&>t&Ki+=2V(=7^UGT*~~yHsJ(b`JT#!Dm-NMxxP@E0>Ti ztR+4K%s;o4c(#KDvyOr4*S%`>y7#WP;R#!+nB$KmO9sOw3+TbDsL|0X74I_wQ&dtg z2Za_#>p%MquYd8~C(M=^i)8ghg`T7S;z5+nHrpT)$`~F5!Hz0C$uIarn;s!9Gv=Uv zJ3&)V{||MZs!>*OWk8KmFV!gIDGHcDL35;;R|b>oVKjSUtRi=PjW^UNnx z=6PnIgf>%$T6FI?GSOiSY86?c7D8~o#B8glOQJnhNeL1&tAi+Yq|D+tI|1+HeH@HW zoSR(HeyH@S+e+%JyZde!My_VZr`sydkV@(#D7cnzUbrmai+Lj8VU!>zPv-9&;6>id zQs&mu?^`O=CP(4F_>4ebgVn-t}$i86XQ5LM8SO}8b-jJdBore5-3U#fq7x> zfHFkVQivrd-ETE9*?WhFw=hU$#!<(*kj$E$S2Bwg+x`?c`Fs1j_rLw3>-V4ZA9f%3 z{k?}>|KRTK*LUxA`+l!`ulrbbkVZnRagmj|Sfb^w8Q`5cF3lmj)K{AGtJu0!I!(ij(uitD*X&XZNLesjvRb+H;$#! zp(PRPAM`vMM?(%i_Y~)PAxY#=qf-Kjm`2Dp#Lt ze!&0MD%N{fd0BpB8J96nikCM9Zkb1x!)zHD2I8m~{$d z7G_DmQ0N|eDqVzq7Z!dcbQZr5I`RvlV^4E_h(jQ1H@oIk?^St{bqNLizEeStpYJnQ zu|Km+w&tHe=qGwV!Njr&?J+H#mO`ZGR?c^|`8W!+o+t87*3 Y-aC~|ukJN#&1Q40*=TMx-)mm|A5>@@ApigX literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/wheel.py b/venv/lib/python2.7/site-packages/pip/_internal/utils/wheel.py new file mode 100644 index 0000000..9ce371c --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/utils/wheel.py @@ -0,0 +1,225 @@ +"""Support functions for working with wheel files. +""" + +from __future__ import absolute_import + +import logging +from email.parser import Parser +from zipfile import ZipFile + +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.pkg_resources import DistInfoDistribution +from pip._vendor.six import PY2, ensure_str + +from pip._internal.exceptions import UnsupportedWheel +from pip._internal.utils.pkg_resources import DictMetadata +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from email.message import Message + from typing import Dict, Tuple + + from pip._vendor.pkg_resources import Distribution + +if PY2: + from zipfile import BadZipfile as BadZipFile +else: + from zipfile import BadZipFile + + +VERSION_COMPATIBLE = (1, 0) + + +logger = logging.getLogger(__name__) + + +class WheelMetadata(DictMetadata): + """Metadata provider that maps metadata decoding exceptions to our + internal exception type. + """ + def __init__(self, metadata, wheel_name): + # type: (Dict[str, bytes], str) -> None + super(WheelMetadata, self).__init__(metadata) + self._wheel_name = wheel_name + + def get_metadata(self, name): + # type: (str) -> str + try: + return super(WheelMetadata, self).get_metadata(name) + except UnicodeDecodeError as e: + # Augment the default error with the origin of the file. + raise UnsupportedWheel( + "Error decoding metadata for {}: {}".format( + self._wheel_name, e + ) + ) + + +def pkg_resources_distribution_for_wheel(wheel_zip, name, location): + # type: (ZipFile, str, str) -> Distribution + """Get a pkg_resources distribution given a wheel. + + :raises UnsupportedWheel: on any errors + """ + info_dir, _ = parse_wheel(wheel_zip, name) + + metadata_files = [ + p for p in wheel_zip.namelist() if p.startswith("{}/".format(info_dir)) + ] + + metadata_text = {} # type: Dict[str, bytes] + for path in metadata_files: + # If a flag is set, namelist entries may be unicode in Python 2. + # We coerce them to native str type to match the types used in the rest + # of the code. This cannot fail because unicode can always be encoded + # with UTF-8. + full_path = ensure_str(path) + _, metadata_name = full_path.split("/", 1) + + try: + metadata_text[metadata_name] = read_wheel_metadata_file( + wheel_zip, full_path + ) + except UnsupportedWheel as e: + raise UnsupportedWheel( + "{} has an invalid wheel, {}".format(name, str(e)) + ) + + metadata = WheelMetadata(metadata_text, location) + + return DistInfoDistribution( + location=location, metadata=metadata, project_name=name + ) + + +def parse_wheel(wheel_zip, name): + # type: (ZipFile, str) -> Tuple[str, Message] + """Extract information from the provided wheel, ensuring it meets basic + standards. + + Returns the name of the .dist-info directory and the parsed WHEEL metadata. + """ + try: + info_dir = wheel_dist_info_dir(wheel_zip, name) + metadata = wheel_metadata(wheel_zip, info_dir) + version = wheel_version(metadata) + except UnsupportedWheel as e: + raise UnsupportedWheel( + "{} has an invalid wheel, {}".format(name, str(e)) + ) + + check_compatibility(version, name) + + return info_dir, metadata + + +def wheel_dist_info_dir(source, name): + # type: (ZipFile, str) -> str + """Returns the name of the contained .dist-info directory. + + Raises AssertionError or UnsupportedWheel if not found, >1 found, or + it doesn't match the provided name. + """ + # Zip file path separators must be / + subdirs = set(p.split("/", 1)[0] for p in source.namelist()) + + info_dirs = [s for s in subdirs if s.endswith('.dist-info')] + + if not info_dirs: + raise UnsupportedWheel(".dist-info directory not found") + + if len(info_dirs) > 1: + raise UnsupportedWheel( + "multiple .dist-info directories found: {}".format( + ", ".join(info_dirs) + ) + ) + + info_dir = info_dirs[0] + + info_dir_name = canonicalize_name(info_dir) + canonical_name = canonicalize_name(name) + if not info_dir_name.startswith(canonical_name): + raise UnsupportedWheel( + ".dist-info directory {!r} does not start with {!r}".format( + info_dir, canonical_name + ) + ) + + # Zip file paths can be unicode or str depending on the zip entry flags, + # so normalize it. + return ensure_str(info_dir) + + +def read_wheel_metadata_file(source, path): + # type: (ZipFile, str) -> bytes + try: + return source.read(path) + # BadZipFile for general corruption, KeyError for missing entry, + # and RuntimeError for password-protected files + except (BadZipFile, KeyError, RuntimeError) as e: + raise UnsupportedWheel( + "could not read {!r} file: {!r}".format(path, e) + ) + + +def wheel_metadata(source, dist_info_dir): + # type: (ZipFile, str) -> Message + """Return the WHEEL metadata of an extracted wheel, if possible. + Otherwise, raise UnsupportedWheel. + """ + path = "{}/WHEEL".format(dist_info_dir) + # Zip file path separators must be / + wheel_contents = read_wheel_metadata_file(source, path) + + try: + wheel_text = ensure_str(wheel_contents) + except UnicodeDecodeError as e: + raise UnsupportedWheel("error decoding {!r}: {!r}".format(path, e)) + + # FeedParser (used by Parser) does not raise any exceptions. The returned + # message may have .defects populated, but for backwards-compatibility we + # currently ignore them. + return Parser().parsestr(wheel_text) + + +def wheel_version(wheel_data): + # type: (Message) -> Tuple[int, ...] + """Given WHEEL metadata, return the parsed Wheel-Version. + Otherwise, raise UnsupportedWheel. + """ + version_text = wheel_data["Wheel-Version"] + if version_text is None: + raise UnsupportedWheel("WHEEL is missing Wheel-Version") + + version = version_text.strip() + + try: + return tuple(map(int, version.split('.'))) + except ValueError: + raise UnsupportedWheel("invalid Wheel-Version: {!r}".format(version)) + + +def check_compatibility(version, name): + # type: (Tuple[int, ...], str) -> None + """Raises errors or warns if called with an incompatible Wheel-Version. + + pip should refuse to install a Wheel-Version that's a major series + ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when + installing a version only minor version ahead (e.g 1.2 > 1.1). + + version: a 2-tuple representing a Wheel-Version (Major, Minor) + name: name of wheel or package to raise exception about + + :raises UnsupportedWheel: when an incompatible Wheel-Version is given + """ + if version[0] > VERSION_COMPATIBLE[0]: + raise UnsupportedWheel( + "{}'s Wheel-Version ({}) is not compatible with this version " + "of pip".format(name, '.'.join(map(str, version))) + ) + elif version > VERSION_COMPATIBLE: + logger.warning( + 'Installing from a newer Wheel-Version (%s)', + '.'.join(map(str, version)), + ) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/utils/wheel.pyc b/venv/lib/python2.7/site-packages/pip/_internal/utils/wheel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b81d358f4cf99238fb24657cb708d6aa23c06c89 GIT binary patch literal 7229 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 JW@+ZYe*sFiq-OvC literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.py b/venv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.py new file mode 100644 index 0000000..2a4eb13 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.py @@ -0,0 +1,15 @@ +# Expose a limited set of classes and functions so callers outside of +# the vcs package don't need to import deeper than `pip._internal.vcs`. +# (The test directory and imports protected by MYPY_CHECK_RUNNING may +# still need to import from a vcs sub-package.) +# Import all vcs modules to register each VCS in the VcsSupport object. +import pip._internal.vcs.bazaar +import pip._internal.vcs.git +import pip._internal.vcs.mercurial +import pip._internal.vcs.subversion # noqa: F401 +from pip._internal.vcs.versioncontrol import ( # noqa: F401 + RemoteNotFoundError, + is_url, + make_vcs_requirement_url, + vcs, +) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_internal/vcs/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c7b339765fdacdb0146361c38b152f0404b0810 GIT binary patch literal 501 zcmZut!Ait15S_Mbx4Y;`1VIlTd)XE|2!eR~G3cGxIXw?a&auuaJSC|4 zt6;0jF)Q9WX@wRI_N4De^>j+PSGKavm~2qkhO3OIY{}Q0Tl7jI@nn<#iJm3m*&w5Z ztvV~Y!t+7ib<35oPMQWU1_fKTB7rrkAPp3O5B|RkKUPY<7u+=+bJT54^Uh@BkSjI2 poWHEEv@iAk_r{#wm@_&`WGrjnF`?Tx+SHvAxBeTQFB}G&^$YnlfvNxi literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.py b/venv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.py new file mode 100644 index 0000000..94408c5 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.py @@ -0,0 +1,119 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import logging +import os + +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.utils.misc import display_path, rmtree +from pip._internal.utils.subprocess import make_command +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.urls import path_to_url +from pip._internal.vcs.versioncontrol import VersionControl, vcs + +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple + from pip._internal.utils.misc import HiddenText + from pip._internal.vcs.versioncontrol import AuthInfo, RevOptions + + +logger = logging.getLogger(__name__) + + +class Bazaar(VersionControl): + name = 'bzr' + dirname = '.bzr' + repo_name = 'branch' + schemes = ( + 'bzr', 'bzr+http', 'bzr+https', 'bzr+ssh', 'bzr+sftp', 'bzr+ftp', + 'bzr+lp', + ) + + def __init__(self, *args, **kwargs): + super(Bazaar, self).__init__(*args, **kwargs) + # This is only needed for python <2.7.5 + # Register lp but do not expose as a scheme to support bzr+lp. + if getattr(urllib_parse, 'uses_fragment', None): + urllib_parse.uses_fragment.extend(['lp']) + + @staticmethod + def get_base_rev_args(rev): + return ['-r', rev] + + def export(self, location, url): + # type: (str, HiddenText) -> None + """ + Export the Bazaar repository at the url to the destination location + """ + # Remove the location to make sure Bazaar can export it correctly + if os.path.exists(location): + rmtree(location) + + url, rev_options = self.get_url_rev_options(url) + self.run_command( + make_command('export', location, url, rev_options.to_args()) + ) + + def fetch_new(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + rev_display = rev_options.to_display() + logger.info( + 'Checking out %s%s to %s', + url, + rev_display, + display_path(dest), + ) + cmd_args = ( + make_command('branch', '-q', rev_options.to_args(), url, dest) + ) + self.run_command(cmd_args) + + def switch(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + self.run_command(make_command('switch', url), cwd=dest) + + def update(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + cmd_args = make_command('pull', '-q', rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + + @classmethod + def get_url_rev_and_auth(cls, url): + # type: (str) -> Tuple[str, Optional[str], AuthInfo] + # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it + url, rev, user_pass = super(Bazaar, cls).get_url_rev_and_auth(url) + if url.startswith('ssh://'): + url = 'bzr+' + url + return url, rev, user_pass + + @classmethod + def get_remote_url(cls, location): + urls = cls.run_command(['info'], cwd=location) + for line in urls.splitlines(): + line = line.strip() + for x in ('checkout of branch: ', + 'parent branch: '): + if line.startswith(x): + repo = line.split(x)[1] + if cls._is_local_repository(repo): + return path_to_url(repo) + return repo + return None + + @classmethod + def get_revision(cls, location): + revision = cls.run_command( + ['revno'], cwd=location, + ) + return revision.splitlines()[-1] + + @classmethod + def is_commit_id_equal(cls, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Bazaar) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.pyc b/venv/lib/python2.7/site-packages/pip/_internal/vcs/bazaar.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dfd3a688b344efba222fc5701f710386a39546f2 GIT binary patch literal 4779 zcmb_f+j1Mn5$y#?kl+oxNR;TvHc}34#4dp;=T_x%6iO6rD~ajU(vC_ftG1TdA-U8p zcDXa)MI}`pl$X3DulbRDOe&v|4@l1G0YH^64=EGC4(7Hq)7_^}_tgKhIQQ?r{xj;! z=u^l4_O^&^1tJN4fn*|iAiY2Wwri5rq*v21)a%l#YrQVnl;qRWYxsFnlFdjyE4^9C zo6>9g-f79^B%hbwyl*!oTabKFdW*h2BiWMVE$Ovpako>0fZu&Robl-L9t^4-8u5e3wwj@1r$kY%PhW(%Ge#d20E(TRmS-FoRG)QOw=#(JRT&zcNM*#Kl$U6Xy>!t zo!>{{S9^Pp_CEDv^BCh&kt?EMmHB;mzCW4Dro~{V7`Up)9PN45w|;yUjW0@v;W%?V zPStYoys}ehbWu@p4yt(2Kep5ox;{8|uC&e9 z85z#^C3bBid4*4XH$_|B46Wd{Fs*uQV z?2Dpwkh&;xJn@lnv2&H;6Cldc1Hcog#kN?y7?^N{?@=IN!T^`tRY$GK4z&_jM;;8% z&ROkXf@ooXjoOyW%dIjk@1_Im;w-!S;iHr1zslLA4^HDu1vqX2q+17yr*3%}(n#;% zQDsW7QC|&InN%nx+}Xw$5eaQUlSlMU_U~DicPoDk^->j>6wIMIi?<4Adhnwx$TPSyq zP5)UsIBFL|*WR?7mPXpN;WCe?$Ug1Rag~grxKU71D`myek*U-$Dfl|%bk%bB6V~2A z(V;kA$J~>a58q|idnhIv9xqBW^z+192lXHB){bm?Xk7m|8kqBs(XfO00e}GVLu4lOD(HcUT{rS>pnt@JCx)x-;XgH!S(bhdaiQ*O>@;RTLwe zQRhK4svL20tgm^jWY(kM4o^(1BD7WriT1j}+Rw4(J|4|6Wa`I3D_Hazqc$f9`8ygO z?obHg{sicV3>PKY#AD{+(*unZzz|}GuzvBmBn^4^bXU=Y0pLiZMRiZH28d}hnU;+a z8G(|NjH*8~+W7iD{`ODr$>Y;ad7RL@NIQGs`zRH5mfG!;u1HnIVcRE9AGIyBVq_7> zMJ9bI1F^c{|Mi+CG3vP9WM!7REFFNgh;QqvvpAe3Y;K}ZpF(``5sj;ZVMH#ppYLCjw=7{%g0V7rf!hLh{2D!W9RfT< zc;?VjKcWv!Q1LDr--n6`B)}URqlltvL5eac)MDv>@p+94nVxy_xKaiwA8(|*L0psI zyxMrd{j%WjQC3%L1gkz@qL|dW(go#pL>zl8g}$Gi$CtJZHyq|hbCxrI$+7LE7`*4& zc?`Pu_aY+WlQ_f8i;IRT8fjkbIf!#}O=9tG2AuJ}hIBejB6B*7vs3hX-mj~}gmi{$ zyijzw?I@3@Fv#QQ&=W;@kqk35!-t$eUrkb^)wxj`BaS0&am2!Hb7M8f*3=(d=+Zvs z9v4aYCT3__6f!Rg8LYw&QD}P5&tQbnL~>d9TNV#k?4r2Rt=4|f4S){w1|G{4t%3Xi z-6PyGcl)+s4TdUyS)E&7)-{1K|8abThf@HnX1`KB*!4fhP59yX6 zZ;uKPIOrcVeGETg|4&)a01CCr93j0oqdOIPuOWHh=|1+Ly+?;vD=#AtT&OMA)`MmJ Pu7e?1->A3h>rej&SZerj literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/git.py b/venv/lib/python2.7/site-packages/pip/_internal/vcs/git.py new file mode 100644 index 0000000..a9c7fb6 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/vcs/git.py @@ -0,0 +1,397 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import logging +import os.path +import re + +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request + +from pip._internal.exceptions import BadCommand, SubProcessError +from pip._internal.utils.misc import display_path, hide_url +from pip._internal.utils.subprocess import make_command +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.vcs.versioncontrol import ( + RemoteNotFoundError, + VersionControl, + find_path_to_setup_from_repo_root, + vcs, +) + +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple + from pip._internal.utils.misc import HiddenText + from pip._internal.vcs.versioncontrol import AuthInfo, RevOptions + + +urlsplit = urllib_parse.urlsplit +urlunsplit = urllib_parse.urlunsplit + + +logger = logging.getLogger(__name__) + + +HASH_REGEX = re.compile('^[a-fA-F0-9]{40}$') + + +def looks_like_hash(sha): + return bool(HASH_REGEX.match(sha)) + + +class Git(VersionControl): + name = 'git' + dirname = '.git' + repo_name = 'clone' + schemes = ( + 'git', 'git+http', 'git+https', 'git+ssh', 'git+git', 'git+file', + ) + # Prevent the user's environment variables from interfering with pip: + # https://github.com/pypa/pip/issues/1130 + unset_environ = ('GIT_DIR', 'GIT_WORK_TREE') + default_arg_rev = 'HEAD' + + @staticmethod + def get_base_rev_args(rev): + return [rev] + + def is_immutable_rev_checkout(self, url, dest): + # type: (str, str) -> bool + _, rev_options = self.get_url_rev_options(hide_url(url)) + if not rev_options.rev: + return False + if not self.is_commit_id_equal(dest, rev_options.rev): + # the current commit is different from rev, + # which means rev was something else than a commit hash + return False + # return False in the rare case rev is both a commit hash + # and a tag or a branch; we don't want to cache in that case + # because that branch/tag could point to something else in the future + is_tag_or_branch = bool( + self.get_revision_sha(dest, rev_options.rev)[0] + ) + return not is_tag_or_branch + + def get_git_version(self): + VERSION_PFX = 'git version ' + version = self.run_command(['version']) + if version.startswith(VERSION_PFX): + version = version[len(VERSION_PFX):].split()[0] + else: + version = '' + # get first 3 positions of the git version because + # on windows it is x.y.z.windows.t, and this parses as + # LegacyVersion which always smaller than a Version. + version = '.'.join(version.split('.')[:3]) + return parse_version(version) + + @classmethod + def get_current_branch(cls, location): + """ + Return the current branch, or None if HEAD isn't at a branch + (e.g. detached HEAD). + """ + # git-symbolic-ref exits with empty stdout if "HEAD" is a detached + # HEAD rather than a symbolic ref. In addition, the -q causes the + # command to exit with status code 1 instead of 128 in this case + # and to suppress the message to stderr. + args = ['symbolic-ref', '-q', 'HEAD'] + output = cls.run_command( + args, extra_ok_returncodes=(1, ), cwd=location, + ) + ref = output.strip() + + if ref.startswith('refs/heads/'): + return ref[len('refs/heads/'):] + + return None + + def export(self, location, url): + # type: (str, HiddenText) -> None + """Export the Git repository at the url to the destination location""" + if not location.endswith('/'): + location = location + '/' + + with TempDirectory(kind="export") as temp_dir: + self.unpack(temp_dir.path, url=url) + self.run_command( + ['checkout-index', '-a', '-f', '--prefix', location], + cwd=temp_dir.path + ) + + @classmethod + def get_revision_sha(cls, dest, rev): + """ + Return (sha_or_none, is_branch), where sha_or_none is a commit hash + if the revision names a remote branch or tag, otherwise None. + + Args: + dest: the repository directory. + rev: the revision name. + """ + # Pass rev to pre-filter the list. + + output = '' + try: + output = cls.run_command(['show-ref', rev], cwd=dest) + except SubProcessError: + pass + + refs = {} + for line in output.strip().splitlines(): + try: + sha, ref = line.split() + except ValueError: + # Include the offending line to simplify troubleshooting if + # this error ever occurs. + raise ValueError('unexpected show-ref line: {!r}'.format(line)) + + refs[ref] = sha + + branch_ref = 'refs/remotes/origin/{}'.format(rev) + tag_ref = 'refs/tags/{}'.format(rev) + + sha = refs.get(branch_ref) + if sha is not None: + return (sha, True) + + sha = refs.get(tag_ref) + + return (sha, False) + + @classmethod + def resolve_revision(cls, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> RevOptions + """ + Resolve a revision to a new RevOptions object with the SHA1 of the + branch, tag, or ref if found. + + Args: + rev_options: a RevOptions object. + """ + rev = rev_options.arg_rev + # The arg_rev property's implementation for Git ensures that the + # rev return value is always non-None. + assert rev is not None + + sha, is_branch = cls.get_revision_sha(dest, rev) + + if sha is not None: + rev_options = rev_options.make_new(sha) + rev_options.branch_name = rev if is_branch else None + + return rev_options + + # Do not show a warning for the common case of something that has + # the form of a Git commit hash. + if not looks_like_hash(rev): + logger.warning( + "Did not find branch or tag '%s', assuming revision or ref.", + rev, + ) + + if not rev.startswith('refs/'): + return rev_options + + # If it looks like a ref, we have to fetch it explicitly. + cls.run_command( + make_command('fetch', '-q', url, rev_options.to_args()), + cwd=dest, + ) + # Change the revision to the SHA of the ref we fetched + sha = cls.get_revision(dest, rev='FETCH_HEAD') + rev_options = rev_options.make_new(sha) + + return rev_options + + @classmethod + def is_commit_id_equal(cls, dest, name): + """ + Return whether the current commit hash equals the given name. + + Args: + dest: the repository directory. + name: a string name. + """ + if not name: + # Then avoid an unnecessary subprocess call. + return False + + return cls.get_revision(dest) == name + + def fetch_new(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + rev_display = rev_options.to_display() + logger.info('Cloning %s%s to %s', url, rev_display, display_path(dest)) + self.run_command(make_command('clone', '-q', url, dest)) + + if rev_options.rev: + # Then a specific revision was requested. + rev_options = self.resolve_revision(dest, url, rev_options) + branch_name = getattr(rev_options, 'branch_name', None) + if branch_name is None: + # Only do a checkout if the current commit id doesn't match + # the requested revision. + if not self.is_commit_id_equal(dest, rev_options.rev): + cmd_args = make_command( + 'checkout', '-q', rev_options.to_args(), + ) + self.run_command(cmd_args, cwd=dest) + elif self.get_current_branch(dest) != branch_name: + # Then a specific branch was requested, and that branch + # is not yet checked out. + track_branch = 'origin/{}'.format(branch_name) + cmd_args = [ + 'checkout', '-b', branch_name, '--track', track_branch, + ] + self.run_command(cmd_args, cwd=dest) + + #: repo may contain submodules + self.update_submodules(dest) + + def switch(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + self.run_command( + make_command('config', 'remote.origin.url', url), + cwd=dest, + ) + cmd_args = make_command('checkout', '-q', rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + + self.update_submodules(dest) + + def update(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + # First fetch changes from the default remote + if self.get_git_version() >= parse_version('1.9.0'): + # fetch tags in addition to everything else + self.run_command(['fetch', '-q', '--tags'], cwd=dest) + else: + self.run_command(['fetch', '-q'], cwd=dest) + # Then reset to wanted revision (maybe even origin/master) + rev_options = self.resolve_revision(dest, url, rev_options) + cmd_args = make_command('reset', '--hard', '-q', rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + #: update submodules + self.update_submodules(dest) + + @classmethod + def get_remote_url(cls, location): + """ + Return URL of the first remote encountered. + + Raises RemoteNotFoundError if the repository does not have a remote + url configured. + """ + # We need to pass 1 for extra_ok_returncodes since the command + # exits with return code 1 if there are no matching lines. + stdout = cls.run_command( + ['config', '--get-regexp', r'remote\..*\.url'], + extra_ok_returncodes=(1, ), cwd=location, + ) + remotes = stdout.splitlines() + try: + found_remote = remotes[0] + except IndexError: + raise RemoteNotFoundError + + for remote in remotes: + if remote.startswith('remote.origin.url '): + found_remote = remote + break + url = found_remote.split(' ')[1] + return url.strip() + + @classmethod + def get_revision(cls, location, rev=None): + if rev is None: + rev = 'HEAD' + current_rev = cls.run_command( + ['rev-parse', rev], cwd=location, + ) + return current_rev.strip() + + @classmethod + def get_subdirectory(cls, location): + """ + Return the path to setup.py, relative to the repo root. + Return None if setup.py is in the repo root. + """ + # find the repo root + git_dir = cls.run_command( + ['rev-parse', '--git-dir'], + cwd=location).strip() + if not os.path.isabs(git_dir): + git_dir = os.path.join(location, git_dir) + repo_root = os.path.abspath(os.path.join(git_dir, '..')) + return find_path_to_setup_from_repo_root(location, repo_root) + + @classmethod + def get_url_rev_and_auth(cls, url): + # type: (str) -> Tuple[str, Optional[str], AuthInfo] + """ + Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'. + That's required because although they use SSH they sometimes don't + work with a ssh:// scheme (e.g. GitHub). But we need a scheme for + parsing. Hence we remove it again afterwards and return it as a stub. + """ + # Works around an apparent Git bug + # (see https://article.gmane.org/gmane.comp.version-control.git/146500) + scheme, netloc, path, query, fragment = urlsplit(url) + if scheme.endswith('file'): + initial_slashes = path[:-len(path.lstrip('/'))] + newpath = ( + initial_slashes + + urllib_request.url2pathname(path) + .replace('\\', '/').lstrip('/') + ) + url = urlunsplit((scheme, netloc, newpath, query, fragment)) + after_plus = scheme.find('+') + 1 + url = scheme[:after_plus] + urlunsplit( + (scheme[after_plus:], netloc, newpath, query, fragment), + ) + + if '://' not in url: + assert 'file:' not in url + url = url.replace('git+', 'git+ssh://') + url, rev, user_pass = super(Git, cls).get_url_rev_and_auth(url) + url = url.replace('ssh://', '') + else: + url, rev, user_pass = super(Git, cls).get_url_rev_and_auth(url) + + return url, rev, user_pass + + @classmethod + def update_submodules(cls, location): + if not os.path.exists(os.path.join(location, '.gitmodules')): + return + cls.run_command( + ['submodule', 'update', '--init', '--recursive', '-q'], + cwd=location, + ) + + @classmethod + def get_repository_root(cls, location): + loc = super(Git, cls).get_repository_root(location) + if loc: + return loc + try: + r = cls.run_command( + ['rev-parse', '--show-toplevel'], + cwd=location, + log_failed_cmd=False, + ) + except BadCommand: + logger.debug("could not determine if %s is under git control " + "because git is not available", location) + return None + except SubProcessError: + return None + return os.path.normpath(r.rstrip('\r\n')) + + +vcs.register(Git) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/git.pyc b/venv/lib/python2.7/site-packages/pip/_internal/vcs/git.pyc new file mode 100644 index 0000000000000000000000000000000000000000..58a14845c0968be481b7b47579a17815b6131633 GIT binary patch literal 11793 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 Xh`fX6%hj4wt2XezHg)>H)Sv!01 None + """Export the Hg repository at the url to the destination location""" + with TempDirectory(kind="export") as temp_dir: + self.unpack(temp_dir.path, url=url) + + self.run_command( + ['archive', location], cwd=temp_dir.path + ) + + def fetch_new(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + rev_display = rev_options.to_display() + logger.info( + 'Cloning hg %s%s to %s', + url, + rev_display, + display_path(dest), + ) + self.run_command(make_command('clone', '--noupdate', '-q', url, dest)) + self.run_command( + make_command('update', '-q', rev_options.to_args()), + cwd=dest, + ) + + def switch(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + repo_config = os.path.join(dest, self.dirname, 'hgrc') + config = configparser.RawConfigParser() + try: + config.read(repo_config) + config.set('paths', 'default', url.secret) + with open(repo_config, 'w') as config_file: + config.write(config_file) + except (OSError, configparser.NoSectionError) as exc: + logger.warning( + 'Could not switch Mercurial repository to %s: %s', url, exc, + ) + else: + cmd_args = make_command('update', '-q', rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + + def update(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + self.run_command(['pull', '-q'], cwd=dest) + cmd_args = make_command('update', '-q', rev_options.to_args()) + self.run_command(cmd_args, cwd=dest) + + @classmethod + def get_remote_url(cls, location): + url = cls.run_command( + ['showconfig', 'paths.default'], + cwd=location).strip() + if cls._is_local_repository(url): + url = path_to_url(url) + return url.strip() + + @classmethod + def get_revision(cls, location): + """ + Return the repository-local changeset revision number, as an integer. + """ + current_revision = cls.run_command( + ['parents', '--template={rev}'], cwd=location).strip() + return current_revision + + @classmethod + def get_requirement_revision(cls, location): + """ + Return the changeset identification hash, as a 40-character + hexadecimal string + """ + current_rev_hash = cls.run_command( + ['parents', '--template={node}'], + cwd=location).strip() + return current_rev_hash + + @classmethod + def is_commit_id_equal(cls, dest, name): + """Always assume the versions don't match""" + return False + + @classmethod + def get_subdirectory(cls, location): + """ + Return the path to setup.py, relative to the repo root. + Return None if setup.py is in the repo root. + """ + # find the repo root + repo_root = cls.run_command( + ['root'], cwd=location).strip() + if not os.path.isabs(repo_root): + repo_root = os.path.abspath(os.path.join(location, repo_root)) + return find_path_to_setup_from_repo_root(location, repo_root) + + @classmethod + def get_repository_root(cls, location): + loc = super(Mercurial, cls).get_repository_root(location) + if loc: + return loc + try: + r = cls.run_command( + ['root'], + cwd=location, + log_failed_cmd=False, + ) + except BadCommand: + logger.debug("could not determine if %s is under hg control " + "because hg is not available", location) + return None + except SubProcessError: + return None + return os.path.normpath(r.rstrip('\r\n')) + + +vcs.register(Mercurial) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.pyc b/venv/lib/python2.7/site-packages/pip/_internal/vcs/mercurial.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6103c6af5d8068888e78cac56b19a278d68f2e0d GIT binary patch literal 6131 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.py b/venv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.py new file mode 100644 index 0000000..ab13497 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.py @@ -0,0 +1,336 @@ +# The following comment should be removed at some point in the future. +# mypy: disallow-untyped-defs=False + +from __future__ import absolute_import + +import logging +import os +import re + +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + display_path, + is_console_interactive, + rmtree, + split_auth_from_netloc, +) +from pip._internal.utils.subprocess import make_command +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.vcs.versioncontrol import VersionControl, vcs + +_svn_xml_url_re = re.compile('url="([^"]+)"') +_svn_rev_re = re.compile(r'committed-rev="(\d+)"') +_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"') +_svn_info_xml_url_re = re.compile(r'(.*)') + + +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple + from pip._internal.utils.subprocess import CommandArgs + from pip._internal.utils.misc import HiddenText + from pip._internal.vcs.versioncontrol import AuthInfo, RevOptions + + +logger = logging.getLogger(__name__) + + +class Subversion(VersionControl): + name = 'svn' + dirname = '.svn' + repo_name = 'checkout' + schemes = ('svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn') + + @classmethod + def should_add_vcs_url_prefix(cls, remote_url): + return True + + @staticmethod + def get_base_rev_args(rev): + return ['-r', rev] + + @classmethod + def get_revision(cls, location): + """ + Return the maximum revision for all files under a given location + """ + # Note: taken from setuptools.command.egg_info + revision = 0 + + for base, dirs, _ in os.walk(location): + if cls.dirname not in dirs: + dirs[:] = [] + continue # no sense walking uncontrolled subdirs + dirs.remove(cls.dirname) + entries_fn = os.path.join(base, cls.dirname, 'entries') + if not os.path.exists(entries_fn): + # FIXME: should we warn? + continue + + dirurl, localrev = cls._get_svn_url_rev(base) + + if base == location: + base = dirurl + '/' # save the root url + elif not dirurl or not dirurl.startswith(base): + dirs[:] = [] + continue # not part of the same svn tree, skip it + revision = max(revision, localrev) + return revision + + @classmethod + def get_netloc_and_auth(cls, netloc, scheme): + """ + This override allows the auth information to be passed to svn via the + --username and --password options instead of via the URL. + """ + if scheme == 'ssh': + # The --username and --password options can't be used for + # svn+ssh URLs, so keep the auth information in the URL. + return super(Subversion, cls).get_netloc_and_auth(netloc, scheme) + + return split_auth_from_netloc(netloc) + + @classmethod + def get_url_rev_and_auth(cls, url): + # type: (str) -> Tuple[str, Optional[str], AuthInfo] + # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it + url, rev, user_pass = super(Subversion, cls).get_url_rev_and_auth(url) + if url.startswith('ssh://'): + url = 'svn+' + url + return url, rev, user_pass + + @staticmethod + def make_rev_args(username, password): + # type: (Optional[str], Optional[HiddenText]) -> CommandArgs + extra_args = [] # type: CommandArgs + if username: + extra_args += ['--username', username] + if password: + extra_args += ['--password', password] + + return extra_args + + @classmethod + def get_remote_url(cls, location): + # In cases where the source is in a subdirectory, not alongside + # setup.py we have to look up in the location until we find a real + # setup.py + orig_location = location + while not os.path.exists(os.path.join(location, 'setup.py')): + last_location = location + location = os.path.dirname(location) + if location == last_location: + # We've traversed up to the root of the filesystem without + # finding setup.py + logger.warning( + "Could not find setup.py for directory %s (tried all " + "parent directories)", + orig_location, + ) + return None + + return cls._get_svn_url_rev(location)[0] + + @classmethod + def _get_svn_url_rev(cls, location): + from pip._internal.exceptions import SubProcessError + + entries_path = os.path.join(location, cls.dirname, 'entries') + if os.path.exists(entries_path): + with open(entries_path) as f: + data = f.read() + else: # subversion >= 1.7 does not have the 'entries' file + data = '' + + if (data.startswith('8') or + data.startswith('9') or + data.startswith('10')): + data = list(map(str.splitlines, data.split('\n\x0c\n'))) + del data[0][0] # get rid of the '8' + url = data[0][3] + revs = [int(d[9]) for d in data if len(d) > 9 and d[9]] + [0] + elif data.startswith('= 1.7 + # Note that using get_remote_call_options is not necessary here + # because `svn info` is being run against a local directory. + # We don't need to worry about making sure interactive mode + # is being used to prompt for passwords, because passwords + # are only potentially needed for remote server requests. + xml = cls.run_command( + ['info', '--xml', location], + ) + url = _svn_info_xml_url_re.search(xml).group(1) + revs = [ + int(m.group(1)) for m in _svn_info_xml_rev_re.finditer(xml) + ] + except SubProcessError: + url, revs = None, [] + + if revs: + rev = max(revs) + else: + rev = 0 + + return url, rev + + @classmethod + def is_commit_id_equal(cls, dest, name): + """Always assume the versions don't match""" + return False + + def __init__(self, use_interactive=None): + # type: (bool) -> None + if use_interactive is None: + use_interactive = is_console_interactive() + self.use_interactive = use_interactive + + # This member is used to cache the fetched version of the current + # ``svn`` client. + # Special value definitions: + # None: Not evaluated yet. + # Empty tuple: Could not parse version. + self._vcs_version = None # type: Optional[Tuple[int, ...]] + + super(Subversion, self).__init__() + + def call_vcs_version(self): + # type: () -> Tuple[int, ...] + """Query the version of the currently installed Subversion client. + + :return: A tuple containing the parts of the version information or + ``()`` if the version returned from ``svn`` could not be parsed. + :raises: BadCommand: If ``svn`` is not installed. + """ + # Example versions: + # svn, version 1.10.3 (r1842928) + # compiled Feb 25 2019, 14:20:39 on x86_64-apple-darwin17.0.0 + # svn, version 1.7.14 (r1542130) + # compiled Mar 28 2018, 08:49:13 on x86_64-pc-linux-gnu + # svn, version 1.12.0-SlikSvn (SlikSvn/1.12.0) + # compiled May 28 2019, 13:44:56 on x86_64-microsoft-windows6.2 + version_prefix = 'svn, version ' + version = self.run_command(['--version']) + + if not version.startswith(version_prefix): + return () + + version = version[len(version_prefix):].split()[0] + version_list = version.partition('-')[0].split('.') + try: + parsed_version = tuple(map(int, version_list)) + except ValueError: + return () + + return parsed_version + + def get_vcs_version(self): + # type: () -> Tuple[int, ...] + """Return the version of the currently installed Subversion client. + + If the version of the Subversion client has already been queried, + a cached value will be used. + + :return: A tuple containing the parts of the version information or + ``()`` if the version returned from ``svn`` could not be parsed. + :raises: BadCommand: If ``svn`` is not installed. + """ + if self._vcs_version is not None: + # Use cached version, if available. + # If parsing the version failed previously (empty tuple), + # do not attempt to parse it again. + return self._vcs_version + + vcs_version = self.call_vcs_version() + self._vcs_version = vcs_version + return vcs_version + + def get_remote_call_options(self): + # type: () -> CommandArgs + """Return options to be used on calls to Subversion that contact the server. + + These options are applicable for the following ``svn`` subcommands used + in this class. + + - checkout + - export + - switch + - update + + :return: A list of command line arguments to pass to ``svn``. + """ + if not self.use_interactive: + # --non-interactive switch is available since Subversion 0.14.4. + # Subversion < 1.8 runs in interactive mode by default. + return ['--non-interactive'] + + svn_version = self.get_vcs_version() + # By default, Subversion >= 1.8 runs in non-interactive mode if + # stdin is not a TTY. Since that is how pip invokes SVN, in + # call_subprocess(), pip must pass --force-interactive to ensure + # the user can be prompted for a password, if required. + # SVN added the --force-interactive option in SVN 1.8. Since + # e.g. RHEL/CentOS 7, which is supported until 2024, ships with + # SVN 1.7, pip should continue to support SVN 1.7. Therefore, pip + # can't safely add the option if the SVN version is < 1.8 (or unknown). + if svn_version >= (1, 8): + return ['--force-interactive'] + + return [] + + def export(self, location, url): + # type: (str, HiddenText) -> None + """Export the svn repository at the url to the destination location""" + url, rev_options = self.get_url_rev_options(url) + + logger.info('Exporting svn repository %s to %s', url, location) + with indent_log(): + if os.path.exists(location): + # Subversion doesn't like to check out over an existing + # directory --force fixes this, but was only added in svn 1.5 + rmtree(location) + cmd_args = make_command( + 'export', self.get_remote_call_options(), + rev_options.to_args(), url, location, + ) + self.run_command(cmd_args) + + def fetch_new(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + rev_display = rev_options.to_display() + logger.info( + 'Checking out %s%s to %s', + url, + rev_display, + display_path(dest), + ) + cmd_args = make_command( + 'checkout', '-q', self.get_remote_call_options(), + rev_options.to_args(), url, dest, + ) + self.run_command(cmd_args) + + def switch(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + cmd_args = make_command( + 'switch', self.get_remote_call_options(), rev_options.to_args(), + url, dest, + ) + self.run_command(cmd_args) + + def update(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + cmd_args = make_command( + 'update', self.get_remote_call_options(), rev_options.to_args(), + dest, + ) + self.run_command(cmd_args) + + +vcs.register(Subversion) diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.pyc b/venv/lib/python2.7/site-packages/pip/_internal/vcs/subversion.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd1bc7feaa096382d35772486f1c516e93c4d89c GIT binary patch literal 9973 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/versioncontrol.py b/venv/lib/python2.7/site-packages/pip/_internal/vcs/versioncontrol.py new file mode 100644 index 0000000..96f830f --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/vcs/versioncontrol.py @@ -0,0 +1,811 @@ +"""Handles all VCS (version control) support""" + +from __future__ import absolute_import + +import errno +import logging +import os +import shutil +import subprocess +import sys + +from pip._vendor import pkg_resources +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.exceptions import ( + BadCommand, + InstallationError, + SubProcessError, +) +from pip._internal.utils.compat import console_to_str, samefile +from pip._internal.utils.logging import subprocess_logger +from pip._internal.utils.misc import ( + ask_path_exists, + backup_dir, + display_path, + hide_url, + hide_value, + rmtree, +) +from pip._internal.utils.subprocess import ( + format_command_args, + make_command, + make_subprocess_output_error, + reveal_command_args, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.urls import get_url_scheme + +if MYPY_CHECK_RUNNING: + from typing import ( + Dict, Iterable, Iterator, List, Optional, Text, Tuple, + Type, Union, Mapping, Any + ) + from pip._internal.utils.misc import HiddenText + from pip._internal.utils.subprocess import CommandArgs + + AuthInfo = Tuple[Optional[str], Optional[str]] + + +__all__ = ['vcs'] + + +logger = logging.getLogger(__name__) + + +def is_url(name): + # type: (Union[str, Text]) -> bool + """ + Return true if the name looks like a URL. + """ + scheme = get_url_scheme(name) + if scheme is None: + return False + return scheme in ['http', 'https', 'file', 'ftp'] + vcs.all_schemes + + +def make_vcs_requirement_url(repo_url, rev, project_name, subdir=None): + # type: (str, str, str, Optional[str]) -> str + """ + Return the URL for a VCS requirement. + + Args: + repo_url: the remote VCS url, with any needed VCS prefix (e.g. "git+"). + project_name: the (unescaped) project name. + """ + egg_project_name = pkg_resources.to_filename(project_name) + req = '{}@{}#egg={}'.format(repo_url, rev, egg_project_name) + if subdir: + req += '&subdirectory={}'.format(subdir) + + return req + + +def call_subprocess( + cmd, # type: Union[List[str], CommandArgs] + cwd=None, # type: Optional[str] + extra_environ=None, # type: Optional[Mapping[str, Any]] + extra_ok_returncodes=None, # type: Optional[Iterable[int]] + log_failed_cmd=True # type: Optional[bool] +): + # type: (...) -> Text + """ + Args: + extra_ok_returncodes: an iterable of integer return codes that are + acceptable, in addition to 0. Defaults to None, which means []. + log_failed_cmd: if false, failed commands are not logged, + only raised. + """ + if extra_ok_returncodes is None: + extra_ok_returncodes = [] + + # log the subprocess output at DEBUG level. + log_subprocess = subprocess_logger.debug + + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + + # Whether the subprocess will be visible in the console. + showing_subprocess = True + + command_desc = format_command_args(cmd) + try: + proc = subprocess.Popen( + # Convert HiddenText objects to the underlying str. + reveal_command_args(cmd), + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + cwd=cwd + ) + if proc.stdin: + proc.stdin.close() + except Exception as exc: + if log_failed_cmd: + subprocess_logger.critical( + "Error %s while executing command %s", exc, command_desc, + ) + raise + all_output = [] + while True: + # The "line" value is a unicode string in Python 2. + line = None + if proc.stdout: + line = console_to_str(proc.stdout.readline()) + if not line: + break + line = line.rstrip() + all_output.append(line + '\n') + + # Show the line immediately. + log_subprocess(line) + try: + proc.wait() + finally: + if proc.stdout: + proc.stdout.close() + + proc_had_error = ( + proc.returncode and proc.returncode not in extra_ok_returncodes + ) + if proc_had_error: + if not showing_subprocess and log_failed_cmd: + # Then the subprocess streams haven't been logged to the + # console yet. + msg = make_subprocess_output_error( + cmd_args=cmd, + cwd=cwd, + lines=all_output, + exit_status=proc.returncode, + ) + subprocess_logger.error(msg) + exc_msg = ( + 'Command errored out with exit status {}: {} ' + 'Check the logs for full command output.' + ).format(proc.returncode, command_desc) + raise SubProcessError(exc_msg) + return ''.join(all_output) + + +def find_path_to_setup_from_repo_root(location, repo_root): + # type: (str, str) -> Optional[str] + """ + Find the path to `setup.py` by searching up the filesystem from `location`. + Return the path to `setup.py` relative to `repo_root`. + Return None if `setup.py` is in `repo_root` or cannot be found. + """ + # find setup.py + orig_location = location + while not os.path.exists(os.path.join(location, 'setup.py')): + last_location = location + location = os.path.dirname(location) + if location == last_location: + # We've traversed up to the root of the filesystem without + # finding setup.py + logger.warning( + "Could not find setup.py for directory %s (tried all " + "parent directories)", + orig_location, + ) + return None + + if samefile(repo_root, location): + return None + + return os.path.relpath(location, repo_root) + + +class RemoteNotFoundError(Exception): + pass + + +class RevOptions(object): + + """ + Encapsulates a VCS-specific revision to install, along with any VCS + install options. + + Instances of this class should be treated as if immutable. + """ + + def __init__( + self, + vc_class, # type: Type[VersionControl] + rev=None, # type: Optional[str] + extra_args=None, # type: Optional[CommandArgs] + ): + # type: (...) -> None + """ + Args: + vc_class: a VersionControl subclass. + rev: the name of the revision to install. + extra_args: a list of extra options. + """ + if extra_args is None: + extra_args = [] + + self.extra_args = extra_args + self.rev = rev + self.vc_class = vc_class + self.branch_name = None # type: Optional[str] + + def __repr__(self): + # type: () -> str + return ''.format(self.vc_class.name, self.rev) + + @property + def arg_rev(self): + # type: () -> Optional[str] + if self.rev is None: + return self.vc_class.default_arg_rev + + return self.rev + + def to_args(self): + # type: () -> CommandArgs + """ + Return the VCS-specific command arguments. + """ + args = [] # type: CommandArgs + rev = self.arg_rev + if rev is not None: + args += self.vc_class.get_base_rev_args(rev) + args += self.extra_args + + return args + + def to_display(self): + # type: () -> str + if not self.rev: + return '' + + return ' (to revision {})'.format(self.rev) + + def make_new(self, rev): + # type: (str) -> RevOptions + """ + Make a copy of the current instance, but with a new rev. + + Args: + rev: the name of the revision for the new object. + """ + return self.vc_class.make_rev_options(rev, extra_args=self.extra_args) + + +class VcsSupport(object): + _registry = {} # type: Dict[str, VersionControl] + schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn'] + + def __init__(self): + # type: () -> None + # Register more schemes with urlparse for various version control + # systems + urllib_parse.uses_netloc.extend(self.schemes) + # Python >= 2.7.4, 3.3 doesn't have uses_fragment + if getattr(urllib_parse, 'uses_fragment', None): + urllib_parse.uses_fragment.extend(self.schemes) + super(VcsSupport, self).__init__() + + def __iter__(self): + # type: () -> Iterator[str] + return self._registry.__iter__() + + @property + def backends(self): + # type: () -> List[VersionControl] + return list(self._registry.values()) + + @property + def dirnames(self): + # type: () -> List[str] + return [backend.dirname for backend in self.backends] + + @property + def all_schemes(self): + # type: () -> List[str] + schemes = [] # type: List[str] + for backend in self.backends: + schemes.extend(backend.schemes) + return schemes + + def register(self, cls): + # type: (Type[VersionControl]) -> None + if not hasattr(cls, 'name'): + logger.warning('Cannot register VCS %s', cls.__name__) + return + if cls.name not in self._registry: + self._registry[cls.name] = cls() + logger.debug('Registered VCS backend: %s', cls.name) + + def unregister(self, name): + # type: (str) -> None + if name in self._registry: + del self._registry[name] + + def get_backend_for_dir(self, location): + # type: (str) -> Optional[VersionControl] + """ + Return a VersionControl object if a repository of that type is found + at the given directory. + """ + vcs_backends = {} + for vcs_backend in self._registry.values(): + repo_path = vcs_backend.get_repository_root(location) + if not repo_path: + continue + logger.debug('Determine that %s uses VCS: %s', + location, vcs_backend.name) + vcs_backends[repo_path] = vcs_backend + + if not vcs_backends: + return None + + # Choose the VCS in the inner-most directory. Since all repository + # roots found here would be either `location` or one of its + # parents, the longest path should have the most path components, + # i.e. the backend representing the inner-most repository. + inner_most_repo_path = max(vcs_backends, key=len) + return vcs_backends[inner_most_repo_path] + + def get_backend_for_scheme(self, scheme): + # type: (str) -> Optional[VersionControl] + """ + Return a VersionControl object or None. + """ + for vcs_backend in self._registry.values(): + if scheme in vcs_backend.schemes: + return vcs_backend + return None + + def get_backend(self, name): + # type: (str) -> Optional[VersionControl] + """ + Return a VersionControl object or None. + """ + name = name.lower() + return self._registry.get(name) + + +vcs = VcsSupport() + + +class VersionControl(object): + name = '' + dirname = '' + repo_name = '' + # List of supported schemes for this Version Control + schemes = () # type: Tuple[str, ...] + # Iterable of environment variable names to pass to call_subprocess(). + unset_environ = () # type: Tuple[str, ...] + default_arg_rev = None # type: Optional[str] + + @classmethod + def should_add_vcs_url_prefix(cls, remote_url): + # type: (str) -> bool + """ + Return whether the vcs prefix (e.g. "git+") should be added to a + repository's remote url when used in a requirement. + """ + return not remote_url.lower().startswith('{}:'.format(cls.name)) + + @classmethod + def get_subdirectory(cls, location): + # type: (str) -> Optional[str] + """ + Return the path to setup.py, relative to the repo root. + Return None if setup.py is in the repo root. + """ + return None + + @classmethod + def get_requirement_revision(cls, repo_dir): + # type: (str) -> str + """ + Return the revision string that should be used in a requirement. + """ + return cls.get_revision(repo_dir) + + @classmethod + def get_src_requirement(cls, repo_dir, project_name): + # type: (str, str) -> Optional[str] + """ + Return the requirement string to use to redownload the files + currently at the given repository directory. + + Args: + project_name: the (unescaped) project name. + + The return value has a form similar to the following: + + {repository_url}@{revision}#egg={project_name} + """ + repo_url = cls.get_remote_url(repo_dir) + if repo_url is None: + return None + + if cls.should_add_vcs_url_prefix(repo_url): + repo_url = '{}+{}'.format(cls.name, repo_url) + + revision = cls.get_requirement_revision(repo_dir) + subdir = cls.get_subdirectory(repo_dir) + req = make_vcs_requirement_url(repo_url, revision, project_name, + subdir=subdir) + + return req + + @staticmethod + def get_base_rev_args(rev): + # type: (str) -> List[str] + """ + Return the base revision arguments for a vcs command. + + Args: + rev: the name of a revision to install. Cannot be None. + """ + raise NotImplementedError + + def is_immutable_rev_checkout(self, url, dest): + # type: (str, str) -> bool + """ + Return true if the commit hash checked out at dest matches + the revision in url. + + Always return False, if the VCS does not support immutable commit + hashes. + + This method does not check if there are local uncommitted changes + in dest after checkout, as pip currently has no use case for that. + """ + return False + + @classmethod + def make_rev_options(cls, rev=None, extra_args=None): + # type: (Optional[str], Optional[CommandArgs]) -> RevOptions + """ + Return a RevOptions object. + + Args: + rev: the name of a revision to install. + extra_args: a list of extra options. + """ + return RevOptions(cls, rev, extra_args=extra_args) + + @classmethod + def _is_local_repository(cls, repo): + # type: (str) -> bool + """ + posix absolute paths start with os.path.sep, + win32 ones start with drive (like c:\\folder) + """ + drive, tail = os.path.splitdrive(repo) + return repo.startswith(os.path.sep) or bool(drive) + + def export(self, location, url): + # type: (str, HiddenText) -> None + """ + Export the repository at the url to the destination location + i.e. only download the files, without vcs informations + + :param url: the repository URL starting with a vcs prefix. + """ + raise NotImplementedError + + @classmethod + def get_netloc_and_auth(cls, netloc, scheme): + # type: (str, str) -> Tuple[str, Tuple[Optional[str], Optional[str]]] + """ + Parse the repository URL's netloc, and return the new netloc to use + along with auth information. + + Args: + netloc: the original repository URL netloc. + scheme: the repository URL's scheme without the vcs prefix. + + This is mainly for the Subversion class to override, so that auth + information can be provided via the --username and --password options + instead of through the URL. For other subclasses like Git without + such an option, auth information must stay in the URL. + + Returns: (netloc, (username, password)). + """ + return netloc, (None, None) + + @classmethod + def get_url_rev_and_auth(cls, url): + # type: (str) -> Tuple[str, Optional[str], AuthInfo] + """ + Parse the repository URL to use, and return the URL, revision, + and auth info to use. + + Returns: (url, rev, (username, password)). + """ + scheme, netloc, path, query, frag = urllib_parse.urlsplit(url) + if '+' not in scheme: + raise ValueError( + "Sorry, {!r} is a malformed VCS url. " + "The format is +://, " + "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp".format(url) + ) + # Remove the vcs prefix. + scheme = scheme.split('+', 1)[1] + netloc, user_pass = cls.get_netloc_and_auth(netloc, scheme) + rev = None + if '@' in path: + path, rev = path.rsplit('@', 1) + if not rev: + raise InstallationError( + "The URL {!r} has an empty revision (after @) " + "which is not supported. Include a revision after @ " + "or remove @ from the URL.".format(url) + ) + url = urllib_parse.urlunsplit((scheme, netloc, path, query, '')) + return url, rev, user_pass + + @staticmethod + def make_rev_args(username, password): + # type: (Optional[str], Optional[HiddenText]) -> CommandArgs + """ + Return the RevOptions "extra arguments" to use in obtain(). + """ + return [] + + def get_url_rev_options(self, url): + # type: (HiddenText) -> Tuple[HiddenText, RevOptions] + """ + Return the URL and RevOptions object to use in obtain() and in + some cases export(), as a tuple (url, rev_options). + """ + secret_url, rev, user_pass = self.get_url_rev_and_auth(url.secret) + username, secret_password = user_pass + password = None # type: Optional[HiddenText] + if secret_password is not None: + password = hide_value(secret_password) + extra_args = self.make_rev_args(username, password) + rev_options = self.make_rev_options(rev, extra_args=extra_args) + + return hide_url(secret_url), rev_options + + @staticmethod + def normalize_url(url): + # type: (str) -> str + """ + Normalize a URL for comparison by unquoting it and removing any + trailing slash. + """ + return urllib_parse.unquote(url).rstrip('/') + + @classmethod + def compare_urls(cls, url1, url2): + # type: (str, str) -> bool + """ + Compare two repo URLs for identity, ignoring incidental differences. + """ + return (cls.normalize_url(url1) == cls.normalize_url(url2)) + + def fetch_new(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + """ + Fetch a revision from a repository, in the case that this is the + first fetch from the repository. + + Args: + dest: the directory to fetch the repository to. + rev_options: a RevOptions object. + """ + raise NotImplementedError + + def switch(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + """ + Switch the repo at ``dest`` to point to ``URL``. + + Args: + rev_options: a RevOptions object. + """ + raise NotImplementedError + + def update(self, dest, url, rev_options): + # type: (str, HiddenText, RevOptions) -> None + """ + Update an already-existing repo to the given ``rev_options``. + + Args: + rev_options: a RevOptions object. + """ + raise NotImplementedError + + @classmethod + def is_commit_id_equal(cls, dest, name): + # type: (str, Optional[str]) -> bool + """ + Return whether the id of the current commit equals the given name. + + Args: + dest: the repository directory. + name: a string name. + """ + raise NotImplementedError + + def obtain(self, dest, url): + # type: (str, HiddenText) -> None + """ + Install or update in editable mode the package represented by this + VersionControl object. + + :param dest: the repository directory in which to install or update. + :param url: the repository URL starting with a vcs prefix. + """ + url, rev_options = self.get_url_rev_options(url) + + if not os.path.exists(dest): + self.fetch_new(dest, url, rev_options) + return + + rev_display = rev_options.to_display() + if self.is_repository_directory(dest): + existing_url = self.get_remote_url(dest) + if self.compare_urls(existing_url, url.secret): + logger.debug( + '%s in %s exists, and has correct URL (%s)', + self.repo_name.title(), + display_path(dest), + url, + ) + if not self.is_commit_id_equal(dest, rev_options.rev): + logger.info( + 'Updating %s %s%s', + display_path(dest), + self.repo_name, + rev_display, + ) + self.update(dest, url, rev_options) + else: + logger.info('Skipping because already up-to-date.') + return + + logger.warning( + '%s %s in %s exists with URL %s', + self.name, + self.repo_name, + display_path(dest), + existing_url, + ) + prompt = ('(s)witch, (i)gnore, (w)ipe, (b)ackup ', + ('s', 'i', 'w', 'b')) + else: + logger.warning( + 'Directory %s already exists, and is not a %s %s.', + dest, + self.name, + self.repo_name, + ) + # https://github.com/python/mypy/issues/1174 + prompt = ('(i)gnore, (w)ipe, (b)ackup ', # type: ignore + ('i', 'w', 'b')) + + logger.warning( + 'The plan is to install the %s repository %s', + self.name, + url, + ) + response = ask_path_exists('What to do? {}'.format( + prompt[0]), prompt[1]) + + if response == 'a': + sys.exit(-1) + + if response == 'w': + logger.warning('Deleting %s', display_path(dest)) + rmtree(dest) + self.fetch_new(dest, url, rev_options) + return + + if response == 'b': + dest_dir = backup_dir(dest) + logger.warning( + 'Backing up %s to %s', display_path(dest), dest_dir, + ) + shutil.move(dest, dest_dir) + self.fetch_new(dest, url, rev_options) + return + + # Do nothing if the response is "i". + if response == 's': + logger.info( + 'Switching %s %s to %s%s', + self.repo_name, + display_path(dest), + url, + rev_display, + ) + self.switch(dest, url, rev_options) + + def unpack(self, location, url): + # type: (str, HiddenText) -> None + """ + Clean up current location and download the url repository + (and vcs infos) into location + + :param url: the repository URL starting with a vcs prefix. + """ + if os.path.exists(location): + rmtree(location) + self.obtain(location, url=url) + + @classmethod + def get_remote_url(cls, location): + # type: (str) -> str + """ + Return the url used at location + + Raises RemoteNotFoundError if the repository does not have a remote + url configured. + """ + raise NotImplementedError + + @classmethod + def get_revision(cls, location): + # type: (str) -> str + """ + Return the current commit id of the files at the given location. + """ + raise NotImplementedError + + @classmethod + def run_command( + cls, + cmd, # type: Union[List[str], CommandArgs] + cwd=None, # type: Optional[str] + extra_environ=None, # type: Optional[Mapping[str, Any]] + extra_ok_returncodes=None, # type: Optional[Iterable[int]] + log_failed_cmd=True # type: bool + ): + # type: (...) -> Text + """ + Run a VCS subcommand + This is simply a wrapper around call_subprocess that adds the VCS + command name, and checks that the VCS is available + """ + cmd = make_command(cls.name, *cmd) + try: + return call_subprocess(cmd, cwd, + extra_environ=extra_environ, + extra_ok_returncodes=extra_ok_returncodes, + log_failed_cmd=log_failed_cmd) + except OSError as e: + # errno.ENOENT = no such file or directory + # In other words, the VCS executable isn't available + if e.errno == errno.ENOENT: + raise BadCommand( + 'Cannot find command {cls.name!r} - do you have ' + '{cls.name!r} installed and in your ' + 'PATH?'.format(**locals())) + else: + raise # re-raise exception if a different error occurred + + @classmethod + def is_repository_directory(cls, path): + # type: (str) -> bool + """ + Return whether a directory path is a repository directory. + """ + logger.debug('Checking in %s for %s (%s)...', + path, cls.dirname, cls.name) + return os.path.exists(os.path.join(path, cls.dirname)) + + @classmethod + def get_repository_root(cls, location): + # type: (str) -> Optional[str] + """ + Return the "root" (top-level) directory controlled by the vcs, + or `None` if the directory is not in any. + + It is meant to be overridden to implement smarter detection + mechanisms for specific vcs. + + This can do more than is_repository_directory() alone. For + example, the Git override checks that Git is actually available. + """ + if cls.is_repository_directory(location): + return location + return None diff --git a/venv/lib/python2.7/site-packages/pip/_internal/vcs/versioncontrol.pyc b/venv/lib/python2.7/site-packages/pip/_internal/vcs/versioncontrol.pyc new file mode 100644 index 0000000000000000000000000000000000000000..344b899d7c1533b4b774eb57da3649af287c991a GIT binary patch literal 25099 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 CONSo- literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_internal/wheel_builder.py b/venv/lib/python2.7/site-packages/pip/_internal/wheel_builder.py new file mode 100644 index 0000000..fa08016 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_internal/wheel_builder.py @@ -0,0 +1,308 @@ +"""Orchestrator for building wheels from InstallRequirements. +""" + +import logging +import os.path +import re +import shutil + +from pip._internal.models.link import Link +from pip._internal.operations.build.wheel import build_wheel_pep517 +from pip._internal.operations.build.wheel_legacy import build_wheel_legacy +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ensure_dir, hash_file, is_wheel_installed +from pip._internal.utils.setuptools_build import make_setuptools_clean_args +from pip._internal.utils.subprocess import call_subprocess +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.urls import path_to_url +from pip._internal.vcs import vcs + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Callable, Iterable, List, Optional, Tuple, + ) + + from pip._internal.cache import WheelCache + from pip._internal.req.req_install import InstallRequirement + + BinaryAllowedPredicate = Callable[[InstallRequirement], bool] + BuildResult = Tuple[List[InstallRequirement], List[InstallRequirement]] + +logger = logging.getLogger(__name__) + +_egg_info_re = re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.IGNORECASE) + + +def _contains_egg_info(s): + # type: (str) -> bool + """Determine whether the string looks like an egg_info. + + :param s: The string to parse. E.g. foo-2.1 + """ + return bool(_egg_info_re.search(s)) + + +def _should_build( + req, # type: InstallRequirement + need_wheel, # type: bool + check_binary_allowed, # type: BinaryAllowedPredicate +): + # type: (...) -> bool + """Return whether an InstallRequirement should be built into a wheel.""" + if req.constraint: + # never build requirements that are merely constraints + return False + if req.is_wheel: + if need_wheel: + logger.info( + 'Skipping %s, due to already being wheel.', req.name, + ) + return False + + if need_wheel: + # i.e. pip wheel, not pip install + return True + + # From this point, this concerns the pip install command only + # (need_wheel=False). + + if req.editable or not req.source_dir: + return False + + if not check_binary_allowed(req): + logger.info( + "Skipping wheel build for %s, due to binaries " + "being disabled for it.", req.name, + ) + return False + + if not req.use_pep517 and not is_wheel_installed(): + # we don't build legacy requirements if wheel is not installed + logger.info( + "Using legacy 'setup.py install' for %s, " + "since package 'wheel' is not installed.", req.name, + ) + return False + + return True + + +def should_build_for_wheel_command( + req, # type: InstallRequirement +): + # type: (...) -> bool + return _should_build( + req, need_wheel=True, check_binary_allowed=_always_true + ) + + +def should_build_for_install_command( + req, # type: InstallRequirement + check_binary_allowed, # type: BinaryAllowedPredicate +): + # type: (...) -> bool + return _should_build( + req, need_wheel=False, check_binary_allowed=check_binary_allowed + ) + + +def _should_cache( + req, # type: InstallRequirement +): + # type: (...) -> Optional[bool] + """ + Return whether a built InstallRequirement can be stored in the persistent + wheel cache, assuming the wheel cache is available, and _should_build() + has determined a wheel needs to be built. + """ + if req.editable or not req.source_dir: + # never cache editable requirements + return False + + if req.link and req.link.is_vcs: + # VCS checkout. Do not cache + # unless it points to an immutable commit hash. + assert not req.editable + assert req.source_dir + vcs_backend = vcs.get_backend_for_scheme(req.link.scheme) + assert vcs_backend + if vcs_backend.is_immutable_rev_checkout(req.link.url, req.source_dir): + return True + return False + + assert req.link + base, ext = req.link.splitext() + if _contains_egg_info(base): + return True + + # Otherwise, do not cache. + return False + + +def _get_cache_dir( + req, # type: InstallRequirement + wheel_cache, # type: WheelCache +): + # type: (...) -> str + """Return the persistent or temporary cache directory where the built + wheel need to be stored. + """ + cache_available = bool(wheel_cache.cache_dir) + assert req.link + if cache_available and _should_cache(req): + cache_dir = wheel_cache.get_path_for_link(req.link) + else: + cache_dir = wheel_cache.get_ephem_path_for_link(req.link) + return cache_dir + + +def _always_true(_): + # type: (Any) -> bool + return True + + +def _build_one( + req, # type: InstallRequirement + output_dir, # type: str + build_options, # type: List[str] + global_options, # type: List[str] +): + # type: (...) -> Optional[str] + """Build one wheel. + + :return: The filename of the built wheel, or None if the build failed. + """ + try: + ensure_dir(output_dir) + except OSError as e: + logger.warning( + "Building wheel for %s failed: %s", + req.name, e, + ) + return None + + # Install build deps into temporary directory (PEP 518) + with req.build_env: + return _build_one_inside_env( + req, output_dir, build_options, global_options + ) + + +def _build_one_inside_env( + req, # type: InstallRequirement + output_dir, # type: str + build_options, # type: List[str] + global_options, # type: List[str] +): + # type: (...) -> Optional[str] + with TempDirectory(kind="wheel") as temp_dir: + assert req.name + if req.use_pep517: + assert req.metadata_directory + wheel_path = build_wheel_pep517( + name=req.name, + backend=req.pep517_backend, + metadata_directory=req.metadata_directory, + build_options=build_options, + tempd=temp_dir.path, + ) + else: + wheel_path = build_wheel_legacy( + name=req.name, + setup_py_path=req.setup_py_path, + source_dir=req.unpacked_source_directory, + global_options=global_options, + build_options=build_options, + tempd=temp_dir.path, + ) + + if wheel_path is not None: + wheel_name = os.path.basename(wheel_path) + dest_path = os.path.join(output_dir, wheel_name) + try: + wheel_hash, length = hash_file(wheel_path) + shutil.move(wheel_path, dest_path) + logger.info('Created wheel for %s: ' + 'filename=%s size=%d sha256=%s', + req.name, wheel_name, length, + wheel_hash.hexdigest()) + logger.info('Stored in directory: %s', output_dir) + return dest_path + except Exception as e: + logger.warning( + "Building wheel for %s failed: %s", + req.name, e, + ) + # Ignore return, we can't do anything else useful. + if not req.use_pep517: + _clean_one_legacy(req, global_options) + return None + + +def _clean_one_legacy(req, global_options): + # type: (InstallRequirement, List[str]) -> bool + clean_args = make_setuptools_clean_args( + req.setup_py_path, + global_options=global_options, + ) + + logger.info('Running setup.py clean for %s', req.name) + try: + call_subprocess(clean_args, cwd=req.source_dir) + return True + except Exception: + logger.error('Failed cleaning build dir for %s', req.name) + return False + + +def build( + requirements, # type: Iterable[InstallRequirement] + wheel_cache, # type: WheelCache + build_options, # type: List[str] + global_options, # type: List[str] +): + # type: (...) -> BuildResult + """Build wheels. + + :return: The list of InstallRequirement that succeeded to build and + the list of InstallRequirement that failed to build. + """ + if not requirements: + return [], [] + + # Build the wheels. + logger.info( + 'Building wheels for collected packages: %s', + ', '.join(req.name for req in requirements), # type: ignore + ) + + with indent_log(): + build_successes, build_failures = [], [] + for req in requirements: + cache_dir = _get_cache_dir(req, wheel_cache) + wheel_file = _build_one( + req, cache_dir, build_options, global_options + ) + if wheel_file: + # Update the link for this. + req.link = Link(path_to_url(wheel_file)) + req.local_file_path = req.link.file_path + assert req.link.is_wheel + build_successes.append(req) + else: + build_failures.append(req) + + # notify success/failure + if build_successes: + logger.info( + 'Successfully built %s', + ' '.join([req.name for req in build_successes]), # type: ignore + ) + if build_failures: + logger.info( + 'Failed to build %s', + ' '.join([req.name for req in build_failures]), # type: ignore + ) + # Return a list of requirements that failed to build + return build_successes, build_failures diff --git a/venv/lib/python2.7/site-packages/pip/_internal/wheel_builder.pyc b/venv/lib/python2.7/site-packages/pip/_internal/wheel_builder.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f8f1a82aba33216188d91cca01c98b760be90c6 GIT binary patch literal 8221 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/__init__.py new file mode 100644 index 0000000..581db54 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/__init__.py @@ -0,0 +1,110 @@ +""" +pip._vendor is for vendoring dependencies of pip to prevent needing pip to +depend on something external. + +Files inside of pip._vendor should be considered immutable and should only be +updated to versions from upstream. +""" +from __future__ import absolute_import + +import glob +import os.path +import sys + +# Downstream redistributors which have debundled our dependencies should also +# patch this value to be true. This will trigger the additional patching +# to cause things like "six" to be available as pip. +DEBUNDLED = False + +# By default, look in this directory for a bunch of .whl files which we will +# add to the beginning of sys.path before attempting to import anything. This +# is done to support downstream re-distributors like Debian and Fedora who +# wish to create their own Wheels for our dependencies to aid in debundling. +WHEEL_DIR = os.path.abspath(os.path.dirname(__file__)) + + +# Define a small helper function to alias our vendored modules to the real ones +# if the vendored ones do not exist. This idea of this was taken from +# https://github.com/kennethreitz/requests/pull/2567. +def vendored(modulename): + vendored_name = "{0}.{1}".format(__name__, modulename) + + try: + __import__(modulename, globals(), locals(), level=0) + except ImportError: + # This error used to be silenced in earlier variants of this file, to instead + # raise the error when pip actually tries to use the missing module. + # Based on inputs in #5354, this was changed to explicitly raise the error. + # Re-raising the exception without modifying it is an intentional choice. + raise + else: + sys.modules[vendored_name] = sys.modules[modulename] + base, head = vendored_name.rsplit(".", 1) + setattr(sys.modules[base], head, sys.modules[modulename]) + + +# If we're operating in a debundled setup, then we want to go ahead and trigger +# the aliasing of our vendored libraries as well as looking for wheels to add +# to our sys.path. This will cause all of this code to be a no-op typically +# however downstream redistributors can enable it in a consistent way across +# all platforms. +if DEBUNDLED: + # Actually look inside of WHEEL_DIR to find .whl files and add them to the + # front of our sys.path. + sys.path[:] = glob.glob(os.path.join(WHEEL_DIR, "*.whl")) + sys.path + + # Actually alias all of our vendored dependencies. + vendored("appdirs") + vendored("cachecontrol") + vendored("certifi") + vendored("colorama") + vendored("contextlib2") + vendored("distlib") + vendored("distro") + vendored("html5lib") + vendored("six") + vendored("six.moves") + vendored("six.moves.urllib") + vendored("six.moves.urllib.parse") + vendored("packaging") + vendored("packaging.version") + vendored("packaging.specifiers") + vendored("pep517") + vendored("pkg_resources") + vendored("progress") + vendored("retrying") + vendored("requests") + vendored("requests.exceptions") + vendored("requests.packages") + vendored("requests.packages.urllib3") + vendored("requests.packages.urllib3._collections") + vendored("requests.packages.urllib3.connection") + vendored("requests.packages.urllib3.connectionpool") + vendored("requests.packages.urllib3.contrib") + vendored("requests.packages.urllib3.contrib.ntlmpool") + vendored("requests.packages.urllib3.contrib.pyopenssl") + vendored("requests.packages.urllib3.exceptions") + vendored("requests.packages.urllib3.fields") + vendored("requests.packages.urllib3.filepost") + vendored("requests.packages.urllib3.packages") + vendored("requests.packages.urllib3.packages.ordered_dict") + vendored("requests.packages.urllib3.packages.six") + vendored("requests.packages.urllib3.packages.ssl_match_hostname") + vendored("requests.packages.urllib3.packages.ssl_match_hostname." + "_implementation") + vendored("requests.packages.urllib3.poolmanager") + vendored("requests.packages.urllib3.request") + vendored("requests.packages.urllib3.response") + vendored("requests.packages.urllib3.util") + vendored("requests.packages.urllib3.util.connection") + vendored("requests.packages.urllib3.util.request") + vendored("requests.packages.urllib3.util.response") + vendored("requests.packages.urllib3.util.retry") + vendored("requests.packages.urllib3.util.ssl_") + vendored("requests.packages.urllib3.util.timeout") + vendored("requests.packages.urllib3.util.url") + vendored("resolvelib") + vendored("toml") + vendored("toml.encoder") + vendored("toml.decoder") + vendored("urllib3") diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ddd4aa2c575b25b483f7286ae28a0f14b5c75b07 GIT binary patch literal 3422 zcmb_e-EQ1O6h2-jn`GPcH?$4V;{I=2>a-1M`KeF^N!5y~7eT0Kg=9JQBrttgV z0g?H&MU)fuFb0&jNCs54sMn&v%|ntQ^+LY}JVm|f5pGkjO=5<6vm~Zzdycj{BXEes zVcHAae{Y`hDf$ry93e4F`j?gnX*(P-kCFgkn)X_bEZR=b>E@>^j!@oq;=rL9Mzf6O z7 ziWr?|bb--DMwb{}W^{$oRYqM#*BD)Abc50RjBYZD87(oo#ppJpJB*eYeZXji(OpLO z7=6g-BSs&4R3S)1`m*~8g4g_kp;H%ioV*ZKu5?tGXcIrptf;o4T+~<*RaOWSsm%!F z$f~H;0vsDvLgbFth&v5CQdMMBDQw>@i5)9+mCCr&d00qjDJoOsVyKKyHhndad9)#- zOnHJ9c~q3;z@{5gL}`^rLyD^8E_j_mou?KgnDattQ(#-PsZ|*bYGbuX%eYhE`KTLU zutzbZ8%D{26-iOnO53NITX9+3#`p6FaLCU9$k}ad2i<@DRk0y`R>!hPOh@&93qEQso0&rKf9C%ffoG z5f*3Zu5+nBrQx|_?L1^nSc%*l0xuG6q}by?U!-{#zvKtA476m+dI^Db69HpWDR16+ zy#4*%(uw?c7_&=wl&Y{v64$%_IY+0Qg${Gf=?qS^!XOIfr)OFV!I{7~zg>^N>q~ES zTGx4@jXex$mS%l{0JK^)i@!8MhiIaJLj$qyExZD(<2hGF|xm!;aC3@f%{T zlr-ljk*&scTt5gauB=3|K!fK2(;~#CGi=(lMam6w>=E4M$6t%)Vj;D=o z$}El5HloE!=K|$A$&1WRxK-YRs5dJIQx7jC$hxeb^kKWJCT8v5?u=dClcGfPN_}Wu z9ETBcRHh5Q*GEu)|t?^$G5jdT&_+}L9Wwvgu9M9RK+p5S(;FdmtBb+Tf%b9{6T z)uK?Ci<6bQdpwApwkU-fObSweHY%oXG_H for details and usage. +""" +# Dev Notes: +# - MSDN on where to store app data files: +# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120 +# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html +# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html + +__version__ = "1.4.4" +__version_info__ = tuple(int(segment) for segment in __version__.split(".")) + + +import sys +import os + +PY3 = sys.version_info[0] == 3 + +if PY3: + unicode = str + +if sys.platform.startswith('java'): + import platform + os_name = platform.java_ver()[3][0] + if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc. + system = 'win32' + elif os_name.startswith('Mac'): # "Mac OS X", etc. + system = 'darwin' + else: # "Linux", "SunOS", "FreeBSD", etc. + # Setting this to "linux2" is not ideal, but only Windows or Mac + # are actually checked for and the rest of the module expects + # *sys.platform* style strings. + system = 'linux2' +elif sys.platform == 'cli' and os.name == 'nt': + # Detect Windows in IronPython to match pip._internal.utils.compat.WINDOWS + # Discussion: + system = 'win32' +else: + system = sys.platform + + + +def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user data directories are: + Mac OS X: ~/Library/Application Support/ # or ~/.config/, if the other does not exist + Unix: ~/.local/share/ # or in $XDG_DATA_HOME, if defined + Win XP (not roaming): C:\Documents and Settings\\Application Data\\ + Win XP (roaming): C:\Documents and Settings\\Local Settings\Application Data\\ + Win 7 (not roaming): C:\Users\\AppData\Local\\ + Win 7 (roaming): C:\Users\\AppData\Roaming\\ + + For Unix, we follow the XDG spec and support $XDG_DATA_HOME. + That means, by default "~/.local/share/". + """ + if system == "win32": + if appauthor is None: + appauthor = appname + const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" + path = os.path.normpath(_get_win_folder(const)) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('~/Library/Application Support/') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_data_dir(appname=None, appauthor=None, version=None, multipath=False): + r"""Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of data dirs should be + returned. By default, the first item from XDG_DATA_DIRS is + returned, or '/usr/local/share/', + if XDG_DATA_DIRS is not set + + Typical site data directories are: + Mac OS X: /Library/Application Support/ + Unix: /usr/local/share/ or /usr/share/ + Win XP: C:\Documents and Settings\All Users\Application Data\\ + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + Win 7: C:\ProgramData\\ # Hidden, but writeable on Win 7. + + For Unix, this is using the $XDG_DATA_DIRS[0] default. + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('/Library/Application Support') + if appname: + path = os.path.join(path, appname) + else: + # XDG default for $XDG_DATA_DIRS + # only first, if multipath is False + path = os.getenv('XDG_DATA_DIRS', + os.pathsep.join(['/usr/local/share', '/usr/share'])) + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.path.join(x, appname) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + if appname and version: + path = os.path.join(path, version) + return path + + +def user_config_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific config dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user config directories are: + Mac OS X: same as user_data_dir + Unix: ~/.config/ # or in $XDG_CONFIG_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. + That means, by default "~/.config/". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +# for the discussion regarding site_config_dir locations +# see +def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): + r"""Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of config dirs should be + returned. By default, the first item from XDG_CONFIG_DIRS is + returned, or '/etc/xdg/', if XDG_CONFIG_DIRS is not set + + Typical site config directories are: + Mac OS X: same as site_data_dir + Unix: /etc/xdg/ or $XDG_CONFIG_DIRS[i]/ for each value in + $XDG_CONFIG_DIRS + Win *: same as site_data_dir + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + + For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system in ["win32", "darwin"]: + path = site_data_dir(appname, appauthor) + if appname and version: + path = os.path.join(path, version) + else: + # XDG default for $XDG_CONFIG_DIRS (missing or empty) + # see + # only first, if multipath is False + path = os.getenv('XDG_CONFIG_DIRS') or '/etc/xdg' + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep) if x] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.path.join(x, appname) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + +def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific cache dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Cache" to the base app data dir for Windows. See + discussion below. + + Typical user cache directories are: + Mac OS X: ~/Library/Caches/ + Unix: ~/.cache/ (XDG default) + Win XP: C:\Documents and Settings\\Local Settings\Application Data\\\Cache + Vista: C:\Users\\AppData\Local\\\Cache + + On Windows the only suggestion in the MSDN docs is that local settings go in + the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming + app data dir (the default returned by `user_data_dir` above). Apps typically + put cache data somewhere *under* the given dir here. Some examples: + ...\Mozilla\Firefox\Profiles\\Cache + ...\Acme\SuperApp\Cache\1.0 + OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. + This can be disabled with the `opinion=False` option. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) + # When using Python 2, return paths as bytes on Windows like we do on + # other operating systems. See helper function docs for more details. + if not PY3 and isinstance(path, unicode): + path = _win_path_to_bytes(path) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + if opinion: + path = os.path.join(path, "Cache") + elif system == 'darwin': + path = os.path.expanduser('~/Library/Caches') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def user_state_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific state dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user state directories are: + Mac OS X: same as user_data_dir + Unix: ~/.local/state/ # or in $XDG_STATE_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow this Debian proposal + to extend the XDG spec and support $XDG_STATE_HOME. + + That means, by default "~/.local/state/". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_STATE_HOME', os.path.expanduser("~/.local/state")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def user_log_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific log dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Logs" to the base app data dir for Windows, and "log" to the + base cache dir for Unix. See discussion below. + + Typical user log directories are: + Mac OS X: ~/Library/Logs/ + Unix: ~/.cache//log # or under $XDG_CACHE_HOME if defined + Win XP: C:\Documents and Settings\\Local Settings\Application Data\\\Logs + Vista: C:\Users\\AppData\Local\\\Logs + + On Windows the only suggestion in the MSDN docs is that local settings + go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in + examples of what some windows apps use for a logs dir.) + + OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA` + value for Windows and appends "log" to the user cache dir for Unix. + This can be disabled with the `opinion=False` option. + """ + if system == "darwin": + path = os.path.join( + os.path.expanduser('~/Library/Logs'), + appname) + elif system == "win32": + path = user_data_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "Logs") + else: + path = user_cache_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "log") + if appname and version: + path = os.path.join(path, version) + return path + + +class AppDirs(object): + """Convenience wrapper for getting application dirs.""" + def __init__(self, appname=None, appauthor=None, version=None, + roaming=False, multipath=False): + self.appname = appname + self.appauthor = appauthor + self.version = version + self.roaming = roaming + self.multipath = multipath + + @property + def user_data_dir(self): + return user_data_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_data_dir(self): + return site_data_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_config_dir(self): + return user_config_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_config_dir(self): + return site_config_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_cache_dir(self): + return user_cache_dir(self.appname, self.appauthor, + version=self.version) + + @property + def user_state_dir(self): + return user_state_dir(self.appname, self.appauthor, + version=self.version) + + @property + def user_log_dir(self): + return user_log_dir(self.appname, self.appauthor, + version=self.version) + + +#---- internal support stuff + +def _get_win_folder_from_registry(csidl_name): + """This is a fallback technique at best. I'm not sure if using the + registry for this guarantees us the correct answer for all CSIDL_* + names. + """ + if PY3: + import winreg as _winreg + else: + import _winreg + + shell_folder_name = { + "CSIDL_APPDATA": "AppData", + "CSIDL_COMMON_APPDATA": "Common AppData", + "CSIDL_LOCAL_APPDATA": "Local AppData", + }[csidl_name] + + key = _winreg.OpenKey( + _winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" + ) + dir, type = _winreg.QueryValueEx(key, shell_folder_name) + return dir + + +def _get_win_folder_with_pywin32(csidl_name): + from win32com.shell import shellcon, shell + dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0) + # Try to make this a unicode path because SHGetFolderPath does + # not return unicode strings when there is unicode data in the + # path. + try: + dir = unicode(dir) + + # Downgrade to short path name if have highbit chars. See + # . + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + try: + import win32api + dir = win32api.GetShortPathName(dir) + except ImportError: + pass + except UnicodeError: + pass + return dir + + +def _get_win_folder_with_ctypes(csidl_name): + import ctypes + + csidl_const = { + "CSIDL_APPDATA": 26, + "CSIDL_COMMON_APPDATA": 35, + "CSIDL_LOCAL_APPDATA": 28, + }[csidl_name] + + buf = ctypes.create_unicode_buffer(1024) + ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) + + # Downgrade to short path name if have highbit chars. See + # . + has_high_char = False + for c in buf: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf2 = ctypes.create_unicode_buffer(1024) + if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): + buf = buf2 + + return buf.value + +def _get_win_folder_with_jna(csidl_name): + import array + from com.sun import jna + from com.sun.jna.platform import win32 + + buf_size = win32.WinDef.MAX_PATH * 2 + buf = array.zeros('c', buf_size) + shell = win32.Shell32.INSTANCE + shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf) + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + # Downgrade to short path name if have highbit chars. See + # . + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf = array.zeros('c', buf_size) + kernel = win32.Kernel32.INSTANCE + if kernel.GetShortPathName(dir, buf, buf_size): + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + return dir + +if system == "win32": + try: + from ctypes import windll + _get_win_folder = _get_win_folder_with_ctypes + except ImportError: + try: + import com.sun.jna + _get_win_folder = _get_win_folder_with_jna + except ImportError: + _get_win_folder = _get_win_folder_from_registry + + +def _win_path_to_bytes(path): + """Encode Windows paths to bytes. Only used on Python 2. + + Motivation is to be consistent with other operating systems where paths + are also returned as bytes. This avoids problems mixing bytes and Unicode + elsewhere in the codebase. For more details and discussion see + . + + If encoding using ASCII and MBCS fails, return the original Unicode path. + """ + for encoding in ('ASCII', 'MBCS'): + try: + return path.encode(encoding) + except (UnicodeEncodeError, LookupError): + pass + return path + + +#---- self test code + +if __name__ == "__main__": + appname = "MyApp" + appauthor = "MyCompany" + + props = ("user_data_dir", + "user_config_dir", + "user_cache_dir", + "user_state_dir", + "user_log_dir", + "site_data_dir", + "site_config_dir") + + print("-- app dirs %s --" % __version__) + + print("-- app dirs (with optional 'version')") + dirs = AppDirs(appname, appauthor, version="1.0") + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'version')") + dirs = AppDirs(appname, appauthor) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'appauthor')") + dirs = AppDirs(appname) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (with disabled 'appauthor')") + dirs = AppDirs(appname, appauthor=False) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/appdirs.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/appdirs.pyc new file mode 100644 index 0000000000000000000000000000000000000000..748f80832d072d8f60d68ea9767cad52cde9c915 GIT binary patch literal 23875 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 J+4(pdXFp_ikd6QV literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.py new file mode 100644 index 0000000..f1e0ad9 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.py @@ -0,0 +1,57 @@ +import logging + +from pip._vendor import requests + +from pip._vendor.cachecontrol.adapter import CacheControlAdapter +from pip._vendor.cachecontrol.cache import DictCache +from pip._vendor.cachecontrol.controller import logger + +from argparse import ArgumentParser + + +def setup_logging(): + logger.setLevel(logging.DEBUG) + handler = logging.StreamHandler() + logger.addHandler(handler) + + +def get_session(): + adapter = CacheControlAdapter( + DictCache(), cache_etags=True, serializer=None, heuristic=None + ) + sess = requests.Session() + sess.mount("http://", adapter) + sess.mount("https://", adapter) + + sess.cache_controller = adapter.controller + return sess + + +def get_args(): + parser = ArgumentParser() + parser.add_argument("url", help="The URL to try and cache") + return parser.parse_args() + + +def main(args=None): + args = get_args() + sess = get_session() + + # Make a request to get a response + resp = sess.get(args.url) + + # Turn on logging + setup_logging() + + # try setting the cache + sess.cache_controller.cache_response(resp.request, resp.raw) + + # Now try to get it + if sess.cache_controller.cached_request(resp.request): + print("Cached!") + else: + print("Not cached :(") + + +if __name__ == "__main__": + main() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/_cmd.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eca00c1548d9aae8259a634baaa5c245377a7d73 GIT binary patch literal 2028 zcmb_cO^+Kz5UrlEz4oq`m?V51h>QqmF1waEaEKyA*q~jc$U@`fVhN2#o|ZqD8Jp>L zP@>(_=E6_lz|Y{<@H6-U@Lu)6a)AqL&6KOFdb+FMd)4vp$A`cD^lP?|_7~y*OT6wE zm;#THQe+Kt>=;!xfgncopRlHy3dkEHoo>>arlF|}4TONOX${Re*2#K84^ zn8yCFx6Zo|xrfMEzF66_ZS9+F`J~8q-ZmjQK=SE&;dMd?^$;qz%jI8F-op4vv)os< z_TT1>vyI}!-H6i}UUvfHMK(r!B%4^SjTm|z)_N6kUAYuZ0JNEIHBGoz8uMe;?W})h zU)s_iV89aA_0o6YKmGcv7w7&M-pn^PuP*YsC~e~p5y^|99ftDx?JDFGxT3~AhBxum zZn9hNPS&;ad0C!(_RZ$?=M_WxW-o1BY@5k~U@ZbzlWb8Hr@L3WIqKW*vbHb+?^wT> zkr^7rgm~~Eiph6yfQdK60Biz}0*@*N_S(b*rX!oKf@I{<$fhSnM{$C<+Ht^*V*q@> zSy`WUrsz%m5%$rNGwbuEQ&2$CIxp9+fe{&A*?qHie!Xytj`zDqlZj)cEBFqBgws-T zn(`1ROXPX8x9Uu{wM`KaC1z%wTLT>uQ*HOP*Bx8D$jS(bP|!^<(N(#79^|JBJ1ljZ zBoT_G^%>ViiFYw{l&_fBJcx!MY6PoP@u)ncQuQeuPz9bq31LR>;Q?EevQgwCre_Ji znfe%Z-;{cYl`VJfeFUDb?D$3cZ0xsV-@F<_gJXpu;p~(jdWr^u&GNRN6uKRoilMe) zDJqRMw}}neCN|vX0sL0G19Q(T2nLJfd&b-b=5IiPg0F%=BgIEM{3@bOu7NI<+NF3e z(escfY+tTh2_rFR6Sx+doY0E9hBc-ELc>WhuJ$M%1sG{KuPV1?K5xsWm8{1Sox%i;*%e zbDK19%_?8l5ApBVDPjg@5Z{dt;t%3?Oh3|_Fv~b6%aXS-A*CR+&2dwmwzpL1$1yVh z2%hTE+parpJ59UVlk$I^sh@?$|M)-Wg-a1lesgI9E)}Z^JTO6m0#!U<`Uy;XsyeSM tPK7|Ym(~0Kmov5fxY`!`(tbfLJJL6dMiCkwEkB9}y}@wM8{Qw9KLL=Oybk~X literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.py new file mode 100644 index 0000000..815650e --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.py @@ -0,0 +1,133 @@ +import types +import functools +import zlib + +from pip._vendor.requests.adapters import HTTPAdapter + +from .controller import CacheController +from .cache import DictCache +from .filewrapper import CallbackFileWrapper + + +class CacheControlAdapter(HTTPAdapter): + invalidating_methods = {"PUT", "DELETE"} + + def __init__( + self, + cache=None, + cache_etags=True, + controller_class=None, + serializer=None, + heuristic=None, + cacheable_methods=None, + *args, + **kw + ): + super(CacheControlAdapter, self).__init__(*args, **kw) + self.cache = DictCache() if cache is None else cache + self.heuristic = heuristic + self.cacheable_methods = cacheable_methods or ("GET",) + + controller_factory = controller_class or CacheController + self.controller = controller_factory( + self.cache, cache_etags=cache_etags, serializer=serializer + ) + + def send(self, request, cacheable_methods=None, **kw): + """ + Send a request. Use the request information to see if it + exists in the cache and cache the response if we need to and can. + """ + cacheable = cacheable_methods or self.cacheable_methods + if request.method in cacheable: + try: + cached_response = self.controller.cached_request(request) + except zlib.error: + cached_response = None + if cached_response: + return self.build_response(request, cached_response, from_cache=True) + + # check for etags and add headers if appropriate + request.headers.update(self.controller.conditional_headers(request)) + + resp = super(CacheControlAdapter, self).send(request, **kw) + + return resp + + def build_response( + self, request, response, from_cache=False, cacheable_methods=None + ): + """ + Build a response by making a request or using the cache. + + This will end up calling send and returning a potentially + cached response + """ + cacheable = cacheable_methods or self.cacheable_methods + if not from_cache and request.method in cacheable: + # Check for any heuristics that might update headers + # before trying to cache. + if self.heuristic: + response = self.heuristic.apply(response) + + # apply any expiration heuristics + if response.status == 304: + # We must have sent an ETag request. This could mean + # that we've been expired already or that we simply + # have an etag. In either case, we want to try and + # update the cache if that is the case. + cached_response = self.controller.update_cached_response( + request, response + ) + + if cached_response is not response: + from_cache = True + + # We are done with the server response, read a + # possible response body (compliant servers will + # not return one, but we cannot be 100% sure) and + # release the connection back to the pool. + response.read(decode_content=False) + response.release_conn() + + response = cached_response + + # We always cache the 301 responses + elif response.status == 301: + self.controller.cache_response(request, response) + else: + # Wrap the response file with a wrapper that will cache the + # response when the stream has been consumed. + response._fp = CallbackFileWrapper( + response._fp, + functools.partial( + self.controller.cache_response, request, response + ), + ) + if response.chunked: + super_update_chunk_length = response._update_chunk_length + + def _update_chunk_length(self): + super_update_chunk_length() + if self.chunk_left == 0: + self._fp._close() + + response._update_chunk_length = types.MethodType( + _update_chunk_length, response + ) + + resp = super(CacheControlAdapter, self).build_response(request, response) + + # See if we should invalidate the cache. + if request.method in self.invalidating_methods and resp.ok: + cache_url = self.controller.cache_url(request.url) + self.cache.delete(cache_url) + + # Give the request a from_cache attr to let people use it + resp.from_cache = from_cache + + return resp + + def close(self): + self.cache.close() + super(CacheControlAdapter, self).close() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/adapter.pyc new file mode 100644 index 0000000000000000000000000000000000000000..619f79e6d0ccea6407e5d0f592e8065f8b23c291 GIT binary patch literal 3695 zcmcIn-Et#W5$-c1$&yxHd)chR#z`0;6-27mrcwnI6u;SQ!d8OW8atKXo2jwpXg$(s zMwxSz#alKvy9G%Va0S;~am6)nz+3PbJOF%OkA9YdOC!y+&h+%@)2I9EKCSSd+x>rh z@wa3o%TI{kpWt@C2FY+4DMU`!Vc^l;?0AWVZCNCC@RdD_NVH zKJ7_-JmdnN{(tn*iSOX|-3K2&IC(H4zmJ=&U*L9EARd>IOE@f$Ng$V7a@mzXh?q+? zYuc6iKzxh-EJFbkqDfmWabeJr%Z|(+GE#iR=UDUbr2S-26RCxb+#DC+Ze=L z&+q<+STZV7=VC4r-y|WN)Rwfyc4*7=iT@IQHmZ|xI`UP0F$7nXxF2J5=x6i8c|O0F zm(Hg}aqsPilc(RAk)?O?nJu%bKGbb3wH>Ano)6|1F(J;?9qo`Ccg^djXLf>t3C)Pm zpd0Cy4{*D`f*?TifyPVZ3ehw&L9AOc?MVGQx!BWJfQVw?nUSlud|bXFEo=`Fp7y1F zB*qwo8gEJ?p8z5COlJWVPz4wmM(J5#j;XyTlm1HS4N5>ME>pr~1M%B@M@-(-*`fR% zYbxB1hunbsBS=45evaXdD2;0S>B2gH5PjrqC9(s^h^*^lXtAlx*x!(UW>%J!5%p)6CXR(|s||Qg5{m z0U24&U8hB|6p4xDCS@8xmzh?KnAxDZmbR$P@k`_q(P}6Y#dAYzvtKZVmR&Q9BP{g> zZnp;_?H#iN0PmSy(>EQn7k(w!4@QJB_eAe1GX8`N268uWMy(2EP`|~RMpOf@Ks6pw zodT)vuV4sl2gKl2AV49;6BJ@2Q^@>TW!f?U1fc<90J_2v<7rRoOZx6ATunqp4(PXM zND3u4B)&2LCZcT$mw}BASfO6Xe%4FxighJW?fdr`nv0dE}2Dju3 zk>83Qg)R9F(s@fzbSAg8xU1!yb&GZ|*NFDNrhKkzVjMyy{stAWWQ`Xk&ep1MTGr-i&A{te zU1hVFG1Ddd#T*9*%gE2Q4LHH`rc%cHl%pr|@-uWJsIP$2s$*K_duE=OYp_t1i6-mfjgvb z_k9rQ?V!5$%$;zj-7|x5V0spZQ^>9|iYR45ven8fgc5S@+F6hcdj5FjKFJ|GbZ+DaUH0t77}RYDQCNI)-^u{YGMzhrNbia1d& zocJ~T8h!>p0NxuXjpzkXL)w|lZq~E!?d+Sx`?1*n{^eU3%lPHt{UNM*3YUoNz#B~tlW6Wi6<-tp|5B=fR8IKzBz;rcIktsh4*eED|I z#?F8Ae9Iq|wV&oyW^-G(w0PI9XjXl$PV6W;$ef=xe&oB|+D1vgiAL5>iVl=YgPYg`ttF0*#9S{-W6 zch>chsNrs6Vs1nGE9e0q8gO}_j^y1O-1{gyurr6+SjU5$K;`DNe}Ky6Q>Zfq*hA{X zX4ctdL=%j}HnC04^N13`z31$(MZi!|%@h#p5NBm$dB4VZ21M!3z=dHE$YwJ=tx zz)E6R7IsP^Ag@_s*Nv_t=|l>IKx54n@ofYx;;+}lFfy{&krePdtjYS35%UT>Uc82z zC`OsE4Fsg)c%cufBy#pd9}4)%ObJmHK5Sfs{F_IIM4>buZ7?o-32zQTm G^3pHGM%+38 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py new file mode 100644 index 0000000..0e1658f --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py @@ -0,0 +1,2 @@ +from .file_cache import FileCache # noqa +from .redis_cache import RedisCache # noqa diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a38d2e3323e90e1ccb13482d2f2d0916c56db19c GIT binary patch literal 277 zcmX|+K?=e!5Je}g3#|wq!bLZ=;KG%NASiBJ)Ll2BG!Y|7Tbd~74Lp#i@fcpfnY0)( zFZn+|6B2$W(dYH%CG;b}b%SMR2!WG<1~3eA28?t7Isg+w9- v>vL(y^2P765_OyU)@5C}w$`1nDd(zEj`Ml*a6|01GPSsAxu&-){eH@RAFMpM literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py new file mode 100644 index 0000000..607b945 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py @@ -0,0 +1,146 @@ +import hashlib +import os +from textwrap import dedent + +from ..cache import BaseCache +from ..controller import CacheController + +try: + FileNotFoundError +except NameError: + # py2.X + FileNotFoundError = (IOError, OSError) + + +def _secure_open_write(filename, fmode): + # We only want to write to this file, so open it in write only mode + flags = os.O_WRONLY + + # os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only + # will open *new* files. + # We specify this because we want to ensure that the mode we pass is the + # mode of the file. + flags |= os.O_CREAT | os.O_EXCL + + # Do not follow symlinks to prevent someone from making a symlink that + # we follow and insecurely open a cache file. + if hasattr(os, "O_NOFOLLOW"): + flags |= os.O_NOFOLLOW + + # On Windows we'll mark this file as binary + if hasattr(os, "O_BINARY"): + flags |= os.O_BINARY + + # Before we open our file, we want to delete any existing file that is + # there + try: + os.remove(filename) + except (IOError, OSError): + # The file must not exist already, so we can just skip ahead to opening + pass + + # Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a + # race condition happens between the os.remove and this line, that an + # error will be raised. Because we utilize a lockfile this should only + # happen if someone is attempting to attack us. + fd = os.open(filename, flags, fmode) + try: + return os.fdopen(fd, "wb") + + except: + # An error occurred wrapping our FD in a file object + os.close(fd) + raise + + +class FileCache(BaseCache): + + def __init__( + self, + directory, + forever=False, + filemode=0o0600, + dirmode=0o0700, + use_dir_lock=None, + lock_class=None, + ): + + if use_dir_lock is not None and lock_class is not None: + raise ValueError("Cannot use use_dir_lock and lock_class together") + + try: + from lockfile import LockFile + from lockfile.mkdirlockfile import MkdirLockFile + except ImportError: + notice = dedent( + """ + NOTE: In order to use the FileCache you must have + lockfile installed. You can install it via pip: + pip install lockfile + """ + ) + raise ImportError(notice) + + else: + if use_dir_lock: + lock_class = MkdirLockFile + + elif lock_class is None: + lock_class = LockFile + + self.directory = directory + self.forever = forever + self.filemode = filemode + self.dirmode = dirmode + self.lock_class = lock_class + + @staticmethod + def encode(x): + return hashlib.sha224(x.encode()).hexdigest() + + def _fn(self, name): + # NOTE: This method should not change as some may depend on it. + # See: https://github.com/ionrock/cachecontrol/issues/63 + hashed = self.encode(name) + parts = list(hashed[:5]) + [hashed] + return os.path.join(self.directory, *parts) + + def get(self, key): + name = self._fn(key) + try: + with open(name, "rb") as fh: + return fh.read() + + except FileNotFoundError: + return None + + def set(self, key, value): + name = self._fn(key) + + # Make sure the directory exists + try: + os.makedirs(os.path.dirname(name), self.dirmode) + except (IOError, OSError): + pass + + with self.lock_class(name) as lock: + # Write our actual file + with _secure_open_write(lock.path, self.filemode) as fh: + fh.write(value) + + def delete(self, key): + name = self._fn(key) + if not self.forever: + try: + os.remove(name) + except FileNotFoundError: + pass + + +def url_to_file_path(url, filecache): + """Return the file cache path based on the URL. + + This does not ensure the file exists! + """ + key = CacheController.cache_url(url) + return filecache._fn(key) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a5ac61c995847512c7a535679193c11a8571031 GIT binary patch literal 4211 zcmcIn-EJI76+YEHGxj)kY-gQKkof5(%dT^gSc+glQM6=Z5@cb zZqrqEVq{Bb6OfQr$_1D31l)7a1HcpT7(4)c-zm@7=6XHjIzCl(>hGNI{7n3xxtV|e z>F-%z&OUAYe~jk-3R2+D$WUZw!W-E!Iv&X|l2I%>v6v#3q9wzYjM}o(4*j+aJ2IM* zohdQL(_*K^Y*pWqmhH;^j5M_vW9*FBYqA^3&a_lUwu_Fu!(p>hOo?sFE>4=}$Xk&Y zJ9AQWb^1ClwYfZl3zq-Ir?+gt`VKE_3tRaz0viUq;GX2puIBxL4MX!7((Y_hMRWfG@gjRhP9r&qln*qPCmR^^Eso(LZzE|QjYZnRxe9B;bfnY29#411 z)5nXtafX_?B`rTKzDsRTKYyTps1x2|hH|*Y366{9G?wEfU4KnZp!t}GY;p@M zq4+F^x$Tz{)GAOHpV#wL+D6vfc($>=zOjW9*?qFs`yzeesf5=rm*?1Z( z^%s6hg;&$3Up!Z3Z)8umSJ!oTkh|RbCXFGI@+1{#?5IAnDzLWkv}x)l?6Dbm%GC$3 z7qz}yC`9Qs4NnCs zy8j901UrlDccuAMPO$Ts_i#GE%*dC9KtBGMm%$x^x1YkB*&loRsk-%DfVZQtJyHzn z{jkMpmq0k_j<@@sY~$GGk8(0CryZ$oj!&MJ<}Y$GrGvPdA>OlTg*=!p@yrqUK}#6` zANyhip@QJ1Mtg3B@5`&I_Q|2MY*|q@*|6^KCwWyQWU~G+cP{buE9(cg(Et+S0)1f} z60}zsp(p%&A6txv-QO@WlU(@pHl9Cyn50`R+Jr+Bsqs#iM1m`~aOYlKS@r#2<-h@aFH3Ks<3GGGa(~2!Pv&oP{u;>I=m2i4JEZ6`Vj&EcjqUroIadGPts8q}n~C$P z%MybSQ=VAl&cPNM$Pq8$4|celej7~s9g>9PBM?6ea?zUUcR9s7r+P7(A675>_R1mw zwUuRMRr)M@2;O}RA~Uzmd=#4nvt;H>-0nsTamRF{S+uSR-#(KQ8^f!5-#5U7+yVse zAw{Tn?;&Ip$`tK|=trF)vJQsjOO26kkUx0vePwOcXCS2V2lh=-zOv2-&~p8ot5QRH z7rWN@y@T8jl-aAxNVCg9TaPmYJw%5`BA^`acyNe{!xRB=h%+O!Cl3K*#15g4{2*x2hY6v$4k6HO5(t zZf=tVrD-y3UM};X^a06r5LHrR^TIEp$Eeh+{j>V8DuNRejTcnMN9^0zq03NK{RY9wd*$M(~53Hw*$UutO>qTyljkw3c!dLx%tj*s( z2Buqz=|{8-`r9ZwE@<`~&YBgd-jtar{Q<}_PgbW_6{%vbOcgx3utV$ZTW}M|b^+Q& z#Q)whucc`(%V_5;)0~@S$a;q;D>F6ivwY}mO1Dctp*(SbG8NeiHSVA;G~xv){fI)J zll&Ou{9Vd@y`^r-RfI5P8f#uGEX^(%}y zdabnQ%`$&Qq@R*ZB8Inb{Ocw^2$dCqA8yJJqfk2gv4WqhDIcsZps(ryZXuqZhZT(| rG;8`(kn@*b0eTelj{?j;=WQL&oi(#&AzDC-&9s?Aan!y0;q(6iow0aE literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py new file mode 100644 index 0000000..ed705ce --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py @@ -0,0 +1,33 @@ +from __future__ import division + +from datetime import datetime +from pip._vendor.cachecontrol.cache import BaseCache + + +class RedisCache(BaseCache): + + def __init__(self, conn): + self.conn = conn + + def get(self, key): + return self.conn.get(key) + + def set(self, key, value, expires=None): + if not expires: + self.conn.set(key, value) + else: + expires = expires - datetime.utcnow() + self.conn.setex(key, int(expires.total_seconds()), value) + + def delete(self, key): + self.conn.delete(key) + + def clear(self): + """Helper for clearing all the keys in a database. Use with + caution!""" + for key in self.conn.keys(): + self.conn.delete(key) + + def close(self): + """Redis uses connection pooling, no need to close the connection.""" + pass diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7bd2d85a77d55588d22cb7c85c1b280375cb7f5b GIT binary patch literal 2084 zcmcgtOK;Oa5FXn}`cNw(KoLj?mJ>NZBK5!t@hS((AqQ6o5eZqw-n0&W1n;H~l%CoP zKZsw$&)^5Zd}EuG$B|%V-I-bM?l<3jJN3S8Z+`v!C5WhgJpTJs5t&zP#Qbw8CCVHc zJLJH3DRn7xY3x?MN2y0yi^eVXTclewaVT!n1<^Ut+i{!X4(<2Xc)R2~KYfQSyN=zH zqr@adekl@KZIet_kq!Rld1&-*7#(W6$)2y{#EAP7uZxcq<9)`4CctErd^qD{>@Yka zVB8m+1f%gJ$dQ&9Yc<&MI{6jM2zxeT7kh7WVBye$C=gQi1>mTH+2YBl$n!pySa?RK z6CXyONA(gqhc=rHXUXhAk{cVQ>4TlU>8FPoLNbCQoySEvjF2#IY0Dz595XDDdLT1{ z*{Sds1WBIQAOKGWhm-Rs^e%@P_mqE}fJ5gF7Xu|230{F|QS<|Ct4Nz2iG0wfD@(wK z9=3Qiz(H3tgma$*3y;jLU*IoXI%nbKJD9UBO+BdW#+lcA)k2cCjp=CzbDS_1d7{=P zb)3FT-DvBJDmxsW+bA!Nc?ZJyQaC>dpsHu zpa=j2J&FhhY@FO%;^%t4c-Nydxr@-WTWi|+*rhjo-}eQ(+2eIDbvo0fniQpqQXQ5_ zexUf$DSN0DOWUXz4w+*I`wg>%d8>F%fxJQYbOITrhX{=aw< zWl0V<`BVc884!Dm}QPJ~UqUx;)Hu5XirQAjpb%p0evhw9-qY@s5gI z`&c98@vp+V#;+x8vHo#0_8|{kd4q=5aW}jTZ)=U;olzh7YRr?lotMDOA*%Y#ZML}i j59-E0xZL5k^)bqAfV|5crR)6wlTgYJ literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.py new file mode 100644 index 0000000..33b5aed --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.py @@ -0,0 +1,29 @@ +try: + from urllib.parse import urljoin +except ImportError: + from urlparse import urljoin + + +try: + import cPickle as pickle +except ImportError: + import pickle + + +# Handle the case where the requests module has been patched to not have +# urllib3 bundled as part of its source. +try: + from pip._vendor.requests.packages.urllib3.response import HTTPResponse +except ImportError: + from pip._vendor.urllib3.response import HTTPResponse + +try: + from pip._vendor.requests.packages.urllib3.util import is_fp_closed +except ImportError: + from pip._vendor.urllib3.util import is_fp_closed + +# Replicate some six behaviour +try: + text_type = unicode +except NameError: + text_type = str diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/compat.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ea94996f83dda38da60f695e36036c575039d19 GIT binary patch literal 797 zcmZ{g&2AGh5XZ;6Nz-l{$RQFv&_gdMLh42;5?oNl1&Lm&DpYE&o{Uo5P;QkxzAU5L+MzPz~S>I?7%B(bQCE$J)s#r~`{?!9SFyv5w8q z2fvHvR2pslTWis7Cn^%LAU)@FE|}lKgh|&jUQJnlW~$Y;wCvM@Iq&dYI&ZF-D^r~p zm`Q!jV*gJ!beoiaz5zV^@WOL3%Mkbb8=CIXK%|K&PIb%tPN3NrU;Cv=-dQ7A`gM*u z=j{X!SQ~eO?$k>&HQXF=<$NQ=(edf+*OxMc;$975N*j8^s8-%;F{N6X#+POp=lNRd fb|KhF7=n9-CMRPuB;!0MBRog_m7lHS1;+0Hd{DS! literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.py new file mode 100644 index 0000000..dafe55c --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.py @@ -0,0 +1,376 @@ +""" +The httplib2 algorithms ported for use with requests. +""" +import logging +import re +import calendar +import time +from email.utils import parsedate_tz + +from pip._vendor.requests.structures import CaseInsensitiveDict + +from .cache import DictCache +from .serialize import Serializer + + +logger = logging.getLogger(__name__) + +URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?") + + +def parse_uri(uri): + """Parses a URI using the regex given in Appendix B of RFC 3986. + + (scheme, authority, path, query, fragment) = parse_uri(uri) + """ + groups = URI.match(uri).groups() + return (groups[1], groups[3], groups[4], groups[6], groups[8]) + + +class CacheController(object): + """An interface to see if request should cached or not. + """ + + def __init__( + self, cache=None, cache_etags=True, serializer=None, status_codes=None + ): + self.cache = DictCache() if cache is None else cache + self.cache_etags = cache_etags + self.serializer = serializer or Serializer() + self.cacheable_status_codes = status_codes or (200, 203, 300, 301) + + @classmethod + def _urlnorm(cls, uri): + """Normalize the URL to create a safe key for the cache""" + (scheme, authority, path, query, fragment) = parse_uri(uri) + if not scheme or not authority: + raise Exception("Only absolute URIs are allowed. uri = %s" % uri) + + scheme = scheme.lower() + authority = authority.lower() + + if not path: + path = "/" + + # Could do syntax based normalization of the URI before + # computing the digest. See Section 6.2.2 of Std 66. + request_uri = query and "?".join([path, query]) or path + defrag_uri = scheme + "://" + authority + request_uri + + return defrag_uri + + @classmethod + def cache_url(cls, uri): + return cls._urlnorm(uri) + + def parse_cache_control(self, headers): + known_directives = { + # https://tools.ietf.org/html/rfc7234#section-5.2 + "max-age": (int, True), + "max-stale": (int, False), + "min-fresh": (int, True), + "no-cache": (None, False), + "no-store": (None, False), + "no-transform": (None, False), + "only-if-cached": (None, False), + "must-revalidate": (None, False), + "public": (None, False), + "private": (None, False), + "proxy-revalidate": (None, False), + "s-maxage": (int, True), + } + + cc_headers = headers.get("cache-control", headers.get("Cache-Control", "")) + + retval = {} + + for cc_directive in cc_headers.split(","): + if not cc_directive.strip(): + continue + + parts = cc_directive.split("=", 1) + directive = parts[0].strip() + + try: + typ, required = known_directives[directive] + except KeyError: + logger.debug("Ignoring unknown cache-control directive: %s", directive) + continue + + if not typ or not required: + retval[directive] = None + if typ: + try: + retval[directive] = typ(parts[1].strip()) + except IndexError: + if required: + logger.debug( + "Missing value for cache-control " "directive: %s", + directive, + ) + except ValueError: + logger.debug( + "Invalid value for cache-control directive " "%s, must be %s", + directive, + typ.__name__, + ) + + return retval + + def cached_request(self, request): + """ + Return a cached response if it exists in the cache, otherwise + return False. + """ + cache_url = self.cache_url(request.url) + logger.debug('Looking up "%s" in the cache', cache_url) + cc = self.parse_cache_control(request.headers) + + # Bail out if the request insists on fresh data + if "no-cache" in cc: + logger.debug('Request header has "no-cache", cache bypassed') + return False + + if "max-age" in cc and cc["max-age"] == 0: + logger.debug('Request header has "max_age" as 0, cache bypassed') + return False + + # Request allows serving from the cache, let's see if we find something + cache_data = self.cache.get(cache_url) + if cache_data is None: + logger.debug("No cache entry available") + return False + + # Check whether it can be deserialized + resp = self.serializer.loads(request, cache_data) + if not resp: + logger.warning("Cache entry deserialization failed, entry ignored") + return False + + # If we have a cached 301, return it immediately. We don't + # need to test our response for other headers b/c it is + # intrinsically "cacheable" as it is Permanent. + # See: + # https://tools.ietf.org/html/rfc7231#section-6.4.2 + # + # Client can try to refresh the value by repeating the request + # with cache busting headers as usual (ie no-cache). + if resp.status == 301: + msg = ( + 'Returning cached "301 Moved Permanently" response ' + "(ignoring date and etag information)" + ) + logger.debug(msg) + return resp + + headers = CaseInsensitiveDict(resp.headers) + if not headers or "date" not in headers: + if "etag" not in headers: + # Without date or etag, the cached response can never be used + # and should be deleted. + logger.debug("Purging cached response: no date or etag") + self.cache.delete(cache_url) + logger.debug("Ignoring cached response: no date") + return False + + now = time.time() + date = calendar.timegm(parsedate_tz(headers["date"])) + current_age = max(0, now - date) + logger.debug("Current age based on date: %i", current_age) + + # TODO: There is an assumption that the result will be a + # urllib3 response object. This may not be best since we + # could probably avoid instantiating or constructing the + # response until we know we need it. + resp_cc = self.parse_cache_control(headers) + + # determine freshness + freshness_lifetime = 0 + + # Check the max-age pragma in the cache control header + if "max-age" in resp_cc: + freshness_lifetime = resp_cc["max-age"] + logger.debug("Freshness lifetime from max-age: %i", freshness_lifetime) + + # If there isn't a max-age, check for an expires header + elif "expires" in headers: + expires = parsedate_tz(headers["expires"]) + if expires is not None: + expire_time = calendar.timegm(expires) - date + freshness_lifetime = max(0, expire_time) + logger.debug("Freshness lifetime from expires: %i", freshness_lifetime) + + # Determine if we are setting freshness limit in the + # request. Note, this overrides what was in the response. + if "max-age" in cc: + freshness_lifetime = cc["max-age"] + logger.debug( + "Freshness lifetime from request max-age: %i", freshness_lifetime + ) + + if "min-fresh" in cc: + min_fresh = cc["min-fresh"] + # adjust our current age by our min fresh + current_age += min_fresh + logger.debug("Adjusted current age from min-fresh: %i", current_age) + + # Return entry if it is fresh enough + if freshness_lifetime > current_age: + logger.debug('The response is "fresh", returning cached response') + logger.debug("%i > %i", freshness_lifetime, current_age) + return resp + + # we're not fresh. If we don't have an Etag, clear it out + if "etag" not in headers: + logger.debug('The cached response is "stale" with no etag, purging') + self.cache.delete(cache_url) + + # return the original handler + return False + + def conditional_headers(self, request): + cache_url = self.cache_url(request.url) + resp = self.serializer.loads(request, self.cache.get(cache_url)) + new_headers = {} + + if resp: + headers = CaseInsensitiveDict(resp.headers) + + if "etag" in headers: + new_headers["If-None-Match"] = headers["ETag"] + + if "last-modified" in headers: + new_headers["If-Modified-Since"] = headers["Last-Modified"] + + return new_headers + + def cache_response(self, request, response, body=None, status_codes=None): + """ + Algorithm for caching requests. + + This assumes a requests Response object. + """ + # From httplib2: Don't cache 206's since we aren't going to + # handle byte range requests + cacheable_status_codes = status_codes or self.cacheable_status_codes + if response.status not in cacheable_status_codes: + logger.debug( + "Status code %s not in %s", response.status, cacheable_status_codes + ) + return + + response_headers = CaseInsensitiveDict(response.headers) + + # If we've been given a body, our response has a Content-Length, that + # Content-Length is valid then we can check to see if the body we've + # been given matches the expected size, and if it doesn't we'll just + # skip trying to cache it. + if ( + body is not None + and "content-length" in response_headers + and response_headers["content-length"].isdigit() + and int(response_headers["content-length"]) != len(body) + ): + return + + cc_req = self.parse_cache_control(request.headers) + cc = self.parse_cache_control(response_headers) + + cache_url = self.cache_url(request.url) + logger.debug('Updating cache with response from "%s"', cache_url) + + # Delete it from the cache if we happen to have it stored there + no_store = False + if "no-store" in cc: + no_store = True + logger.debug('Response header has "no-store"') + if "no-store" in cc_req: + no_store = True + logger.debug('Request header has "no-store"') + if no_store and self.cache.get(cache_url): + logger.debug('Purging existing cache entry to honor "no-store"') + self.cache.delete(cache_url) + if no_store: + return + + # https://tools.ietf.org/html/rfc7234#section-4.1: + # A Vary header field-value of "*" always fails to match. + # Storing such a response leads to a deserialization warning + # during cache lookup and is not allowed to ever be served, + # so storing it can be avoided. + if "*" in response_headers.get("vary", ""): + logger.debug('Response header has "Vary: *"') + return + + # If we've been given an etag, then keep the response + if self.cache_etags and "etag" in response_headers: + logger.debug("Caching due to etag") + self.cache.set( + cache_url, self.serializer.dumps(request, response, body=body) + ) + + # Add to the cache any 301s. We do this before looking that + # the Date headers. + elif response.status == 301: + logger.debug("Caching permanant redirect") + self.cache.set(cache_url, self.serializer.dumps(request, response)) + + # Add to the cache if the response headers demand it. If there + # is no date header then we can't do anything about expiring + # the cache. + elif "date" in response_headers: + # cache when there is a max-age > 0 + if "max-age" in cc and cc["max-age"] > 0: + logger.debug("Caching b/c date exists and max-age > 0") + self.cache.set( + cache_url, self.serializer.dumps(request, response, body=body) + ) + + # If the request can expire, it means we should cache it + # in the meantime. + elif "expires" in response_headers: + if response_headers["expires"]: + logger.debug("Caching b/c of expires header") + self.cache.set( + cache_url, self.serializer.dumps(request, response, body=body) + ) + + def update_cached_response(self, request, response): + """On a 304 we will get a new set of headers that we want to + update our cached value with, assuming we have one. + + This should only ever be called when we've sent an ETag and + gotten a 304 as the response. + """ + cache_url = self.cache_url(request.url) + + cached_response = self.serializer.loads(request, self.cache.get(cache_url)) + + if not cached_response: + # we didn't have a cached response + return response + + # Lets update our headers with the headers from the new request: + # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1 + # + # The server isn't supposed to send headers that would make + # the cached body invalid. But... just in case, we'll be sure + # to strip out ones we know that might be problmatic due to + # typical assumptions. + excluded_headers = ["content-length"] + + cached_response.headers.update( + dict( + (k, v) + for k, v in response.headers.items() + if k.lower() not in excluded_headers + ) + ) + + # we want a 200 b/c we have content via the cache + cached_response.status = 200 + + # update our cache + self.cache.set(cache_url, self.serializer.dumps(request, cached_response)) + + return cached_response diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.pyc new file mode 100644 index 0000000000000000000000000000000000000000..949330589c9dbf00f362a2389c692d472eb09aa2 GIT binary patch literal 9615 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py new file mode 100644 index 0000000..30ed4c5 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py @@ -0,0 +1,80 @@ +from io import BytesIO + + +class CallbackFileWrapper(object): + """ + Small wrapper around a fp object which will tee everything read into a + buffer, and when that file is closed it will execute a callback with the + contents of that buffer. + + All attributes are proxied to the underlying file object. + + This class uses members with a double underscore (__) leading prefix so as + not to accidentally shadow an attribute. + """ + + def __init__(self, fp, callback): + self.__buf = BytesIO() + self.__fp = fp + self.__callback = callback + + def __getattr__(self, name): + # The vaguaries of garbage collection means that self.__fp is + # not always set. By using __getattribute__ and the private + # name[0] allows looking up the attribute value and raising an + # AttributeError when it doesn't exist. This stop thigns from + # infinitely recursing calls to getattr in the case where + # self.__fp hasn't been set. + # + # [0] https://docs.python.org/2/reference/expressions.html#atom-identifiers + fp = self.__getattribute__("_CallbackFileWrapper__fp") + return getattr(fp, name) + + def __is_fp_closed(self): + try: + return self.__fp.fp is None + + except AttributeError: + pass + + try: + return self.__fp.closed + + except AttributeError: + pass + + # We just don't cache it then. + # TODO: Add some logging here... + return False + + def _close(self): + if self.__callback: + self.__callback(self.__buf.getvalue()) + + # We assign this to None here, because otherwise we can get into + # really tricky problems where the CPython interpreter dead locks + # because the callback is holding a reference to something which + # has a __del__ method. Setting this to None breaks the cycle + # and allows the garbage collector to do it's thing normally. + self.__callback = None + + def read(self, amt=None): + data = self.__fp.read(amt) + self.__buf.write(data) + if self.__is_fp_closed(): + self._close() + + return data + + def _safe_read(self, amt): + data = self.__fp._safe_read(amt) + if amt == 2 and data == b"\r\n": + # urllib executes this read to toss the CRLF at the end + # of the chunk. + return data + + self.__buf.write(data) + if self.__is_fp_closed(): + self._close() + + return data diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.pyc new file mode 100644 index 0000000000000000000000000000000000000000..21a2f2f5543dad78cd3c459fbd5dc249a8ee98f3 GIT binary patch literal 2627 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.py new file mode 100644 index 0000000..3b6ec2d --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.py @@ -0,0 +1,188 @@ +import base64 +import io +import json +import zlib + +from pip._vendor import msgpack +from pip._vendor.requests.structures import CaseInsensitiveDict + +from .compat import HTTPResponse, pickle, text_type + + +def _b64_decode_bytes(b): + return base64.b64decode(b.encode("ascii")) + + +def _b64_decode_str(s): + return _b64_decode_bytes(s).decode("utf8") + + +class Serializer(object): + + def dumps(self, request, response, body=None): + response_headers = CaseInsensitiveDict(response.headers) + + if body is None: + body = response.read(decode_content=False) + + # NOTE: 99% sure this is dead code. I'm only leaving it + # here b/c I don't have a test yet to prove + # it. Basically, before using + # `cachecontrol.filewrapper.CallbackFileWrapper`, + # this made an effort to reset the file handle. The + # `CallbackFileWrapper` short circuits this code by + # setting the body as the content is consumed, the + # result being a `body` argument is *always* passed + # into cache_response, and in turn, + # `Serializer.dump`. + response._fp = io.BytesIO(body) + + # NOTE: This is all a bit weird, but it's really important that on + # Python 2.x these objects are unicode and not str, even when + # they contain only ascii. The problem here is that msgpack + # understands the difference between unicode and bytes and we + # have it set to differentiate between them, however Python 2 + # doesn't know the difference. Forcing these to unicode will be + # enough to have msgpack know the difference. + data = { + u"response": { + u"body": body, + u"headers": dict( + (text_type(k), text_type(v)) for k, v in response.headers.items() + ), + u"status": response.status, + u"version": response.version, + u"reason": text_type(response.reason), + u"strict": response.strict, + u"decode_content": response.decode_content, + } + } + + # Construct our vary headers + data[u"vary"] = {} + if u"vary" in response_headers: + varied_headers = response_headers[u"vary"].split(",") + for header in varied_headers: + header = text_type(header).strip() + header_value = request.headers.get(header, None) + if header_value is not None: + header_value = text_type(header_value) + data[u"vary"][header] = header_value + + return b",".join([b"cc=4", msgpack.dumps(data, use_bin_type=True)]) + + def loads(self, request, data): + # Short circuit if we've been given an empty set of data + if not data: + return + + # Determine what version of the serializer the data was serialized + # with + try: + ver, data = data.split(b",", 1) + except ValueError: + ver = b"cc=0" + + # Make sure that our "ver" is actually a version and isn't a false + # positive from a , being in the data stream. + if ver[:3] != b"cc=": + data = ver + data + ver = b"cc=0" + + # Get the version number out of the cc=N + ver = ver.split(b"=", 1)[-1].decode("ascii") + + # Dispatch to the actual load method for the given version + try: + return getattr(self, "_loads_v{}".format(ver))(request, data) + + except AttributeError: + # This is a version we don't have a loads function for, so we'll + # just treat it as a miss and return None + return + + def prepare_response(self, request, cached): + """Verify our vary headers match and construct a real urllib3 + HTTPResponse object. + """ + # Special case the '*' Vary value as it means we cannot actually + # determine if the cached response is suitable for this request. + # This case is also handled in the controller code when creating + # a cache entry, but is left here for backwards compatibility. + if "*" in cached.get("vary", {}): + return + + # Ensure that the Vary headers for the cached response match our + # request + for header, value in cached.get("vary", {}).items(): + if request.headers.get(header, None) != value: + return + + body_raw = cached["response"].pop("body") + + headers = CaseInsensitiveDict(data=cached["response"]["headers"]) + if headers.get("transfer-encoding", "") == "chunked": + headers.pop("transfer-encoding") + + cached["response"]["headers"] = headers + + try: + body = io.BytesIO(body_raw) + except TypeError: + # This can happen if cachecontrol serialized to v1 format (pickle) + # using Python 2. A Python 2 str(byte string) will be unpickled as + # a Python 3 str (unicode string), which will cause the above to + # fail with: + # + # TypeError: 'str' does not support the buffer interface + body = io.BytesIO(body_raw.encode("utf8")) + + return HTTPResponse(body=body, preload_content=False, **cached["response"]) + + def _loads_v0(self, request, data): + # The original legacy cache data. This doesn't contain enough + # information to construct everything we need, so we'll treat this as + # a miss. + return + + def _loads_v1(self, request, data): + try: + cached = pickle.loads(data) + except ValueError: + return + + return self.prepare_response(request, cached) + + def _loads_v2(self, request, data): + try: + cached = json.loads(zlib.decompress(data).decode("utf8")) + except (ValueError, zlib.error): + return + + # We need to decode the items that we've base64 encoded + cached["response"]["body"] = _b64_decode_bytes(cached["response"]["body"]) + cached["response"]["headers"] = dict( + (_b64_decode_str(k), _b64_decode_str(v)) + for k, v in cached["response"]["headers"].items() + ) + cached["response"]["reason"] = _b64_decode_str(cached["response"]["reason"]) + cached["vary"] = dict( + (_b64_decode_str(k), _b64_decode_str(v) if v is not None else v) + for k, v in cached["vary"].items() + ) + + return self.prepare_response(request, cached) + + def _loads_v3(self, request, data): + # Due to Python 2 encoding issues, it's impossible to know for sure + # exactly how to load v3 entries, thus we'll treat these as a miss so + # that they get rewritten out as v4 entries. + return + + def _loads_v4(self, request, data): + try: + cached = msgpack.loads(data, raw=False) + except ValueError: + return + + return self.prepare_response(request, cached) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad1e1447186fbe30d2e715055d964518ecf1fc3b GIT binary patch literal 5621 zcmd5=OLH7o6+X9nG%riCZ21vkIT_03Wb&|VVq290#Yy}K7z#nPTy{|5YFgbbyGJuU zD6SjhWCmjGt#X~uOXWa={04uDZLZ2c>-fq`5Xt$N>bC#oFsKg=VcqmH7I#0@{7%r zywFCwiOXgG!q0l!pj+0^^z4&C6z@2}A_R9Lo8HfDn%k_*cGJ6ATxOizrjF$-njbxQ z@be(GgFa@JRR{)Iywgp~1}CJ?%di{`(wJ-baM>L^_8gj0q+?_cElgnKrT%WTJq)dv zGiW0lXPG;SJ8$7Kt2cD#t<@Vz8ut@-WSX<3? zqvTCCCW;p^-t>oB-Ns`#(4>GE^r;i7p99OltWmfDnVxoL2w5VrDoI5fwWiSK<5;% z1IeCZrgNHdnE9nA`*qn>>u(7LLAmvlw?lIGtxP$ z6XvBnhgIf@$F&=6!ePCfM>_^K(Vyn!kiOXJC!=^0wG>!BSI_{}k1xqDaVt2*Qy-}X zowKm>wkHqGGxgPm!r75bz+GHG6H+VJN^ZZS?e1}7-4aV{PtrVnJ}7Qo$BUx8DnnA; z(=GkU}}MD&B=G>*p#i(#Vdx2oq4>@CZZIvA!7dpIU758#dYJMGas*R^nwSX+38`wcNb6ZjAfu8atE%lU6Kg$D5bTgA- zZ(vpapctka!}?~^?zSFVq|b(_EfI4EHqseHR>>15mJ1J?Ac^1)ni{6e(quYDSGjp= zP}dE2qb?4|&~Xxe@D}!CjG0aM(IShK z4w94Gz6P+q4Ybr1EgrCHrsK$~$aq8-?tv@}_`>737xUSylt_;5w!af^qdf;x*WvK6&JV%^rT=ytQM>&@2q=WspR>Th+@ zxLlbIDm>p&3gZ6j!Miv#c#jPs6llb=)+>uBx7%rPMN7*pe}c?5259_rnD3-XaDoEn z&q0wA9^p83wh86nGMm@gaL<5zuK*qN2g>`wcPPF+2Ng z8Wl0C)FdD=DK?b=m19Y(VG;e>ok_KhJs3#ZPw$^x4}d<1L`_ljUUL@Kpm5}>MQ$HMfcIKUCyWtS^_t97ORf6xJb`KbG z`t|}zLTe6w=k&l})@se6@u)PKY8}#~Di_%(d8=mMUbMddC)~s`RWMpFn{#HyUq-Kr zQp5d!!4(|D?f(_6UjKqOCpzQ^TD=AFXz74f!6~2+e3wqi)mJLHGNlrRuvS3`a~7)O zzY) zzdoEM#9nZh%{?|OL4%*L`6-$MF45lc{H-fsO~W$ZGS^qV*&B`58*etMje6ruquQo0 z&@x^tm{0loLo_Jq__x2o%J`3I?lbX?SA{F%FG9QGint--(0vATM+Rn8y5fh9)z4M^ s<5<8r)Z)igbb81CiuPJZtvPSpVnkUo_bfi_@XuR7L9^^PDvip&0aYhw_y7O^ literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.py b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.py new file mode 100644 index 0000000..d8e6fc6 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.py @@ -0,0 +1,29 @@ +from .adapter import CacheControlAdapter +from .cache import DictCache + + +def CacheControl( + sess, + cache=None, + cache_etags=True, + serializer=None, + heuristic=None, + controller_class=None, + adapter_class=None, + cacheable_methods=None, +): + + cache = DictCache() if cache is None else cache + adapter_class = adapter_class or CacheControlAdapter + adapter = adapter_class( + cache, + cache_etags=cache_etags, + serializer=serializer, + heuristic=heuristic, + controller_class=controller_class, + cacheable_methods=cacheable_methods, + ) + sess.mount("http://", adapter) + sess.mount("https://", adapter) + + return sess diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/cachecontrol/wrapper.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b523642e7e50f7756f45e53d82c35af3b7d53f1a GIT binary patch literal 819 zcmb_ZJ8#rL5T3PTpYxIqAtWSP3OB(L1qDJp5*nH-9I9(9W3M=e^+UU3A|hXPY4}0> z8h!?Ufce%J2tD4N&-2=yZ)U?^r$;}(|0pWje~J9xinw!uTDBrX)GAslQm_Lu0kt8m zL$MD?Mq4(WD5>ln_p2^QNzzTi_t`@G{FBDnWN*qz7U!VAXdz$NX{;V$8Jd$Bt9f^chae z_3(Rwc_3OI0&qM>fKLU=dE7IdJcb+9_wH0w^5EWxmT@~|Lo=K;o#WD&v*#bKZeFx- zc`3f?uI_E-OYVEku5CFC+CCe;v46OGZw(giF=`w?Q70-?@t<`VEY&htr67~zoNqM8 pgy+5y@Qr@7qt4OFU$Xy?aU%D=YWsRL`ZdPw@QT7L3We?6`VHswr{Mqq literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.py new file mode 100644 index 0000000..5d52a62 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.py @@ -0,0 +1,3 @@ +from .core import contents, where + +__version__ = "2020.06.20" diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd14cc882273afaac1aae945be1efd4d500daccb GIT binary patch literal 259 zcmYL@v5vwp42GTdkWkUBH{aNWw(8IYbh?%0hO)6(s0kvdNvgzff;ZrScp4sq7r?2I zi0to=6aR_R$7goG-mrt$N?3n6!#6{62n87vs literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.py b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.py new file mode 100644 index 0000000..0037634 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.py @@ -0,0 +1,12 @@ +import argparse + +from pip._vendor.certifi import contents, where + +parser = argparse.ArgumentParser() +parser.add_argument("-c", "--contents", action="store_true") +args = parser.parse_args() + +if args.contents: + print(contents()) +else: + print(where()) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/certifi/__main__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e56678653e7c10e4ba3f322ceb5f0e63c69419a GIT binary patch literal 467 zcmYLEJ5Izf5FI<4{Sj!8_6%vVktk?D2r8gKXz8}GqS!2s;v}+XLC{ihAWp+EH~`Fe zS76!mdGFb8oO~b7zdk-y4f~Z+zN8Zd3YxZn7GS-rCA0#ZgtY{hz&Zh80GbiJlOhF^ zLNf-PfF6NPL66~G3c=_kDyCqj&`9tajAZ2crXwubm1OjgPsr5%(7MYdl{lqP_Z^xJ z1M+AuPsW?TTv3NPr{a$vQ(M(&NzY8c-W!E}Yw{Vj@vX{lhRO$n$Ak=aSgL2!>E17E zKKY=KU2A%sZ`2Uwo__3yv9$QyIyZwbHQT<9y5~*nTdtSfgM7=E3!U6-{&<5P%BE}&f2BE-i5gqW&H>{3BmX;Uv&NL=bJi6h%%3~gMx z3nzXJzlNW|4}kY|!io?#7RgU+$FZO1d7s4p(GR|V`NmUdt~TCZVKXNP8NdvYLFPfu zV8-Bd=!QPz9uz*zT2QoM)&_5h-HBW&g|f^`NRbwNJ_>oqp5&;g(Ju|6!@umV^yNB~N=eiG3RV{-$slGT8J5M`$H zppj_;oL^IoI&?}8fsb}ad-0UN*`2<29LK5@wu?{R3(Fnhtv{BHriXYu(zMzM;T)9; z&3S~Aum_7I`*4BxAszezR1vjF)MRcm&K;U&w94Tj2OjfytSz?o`aU&*nq|MN|!0xfs z-4T3jBW&hA0!m*pl8E)eV4PphwBXG7f%%!ZD31RQ16hbM15hSLti@$gmq}4af%Cb{ z1?NuMQpqwRQqH&e6{#ePpI~cLUiX|zoLCo_qD^0h`)Oo8{S2_WlZfb#T|xdGc2|{{ zK08O-8MgGnH~4Q=BcSkVU1m&E>m+7DgTGRMf`D zRAR?3rrO4&ET-M+1X8;8-K%?AD;?j#@l^|XQD^!ki8414I;`jU?6%io9j|}4-|lt# FonKd6L`DDr literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.py new file mode 100644 index 0000000..0f9f820 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.py @@ -0,0 +1,39 @@ +######################## BEGIN LICENSE BLOCK ######################## +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +from .compat import PY2, PY3 +from .universaldetector import UniversalDetector +from .version import __version__, VERSION + + +def detect(byte_str): + """ + Detect the encoding of the given byte string. + + :param byte_str: The byte sequence to examine. + :type byte_str: ``bytes`` or ``bytearray`` + """ + if not isinstance(byte_str, bytearray): + if not isinstance(byte_str, bytes): + raise TypeError('Expected object of type bytes or bytearray, got: ' + '{0}'.format(type(byte_str))) + else: + byte_str = bytearray(byte_str) + detector = UniversalDetector() + detector.feed(byte_str) + return detector.close() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..26fc74d2e492e89ec94bf0e2d37bbb953939e430 GIT binary patch literal 984 zcmbtSO>Wab6nw5_>E8`Nj%vtj55o?@A_Bq7&%?5e6ni!_SbQP8C;cWD?ve zF0K=qmts_x*-cgF+*R>7rXmx^T}t$2)H%Jb@NPxM)%glHPTr2nP#saY zs>gh(?1X=Pax>hcTkRv{CNGUmP?06yZ7$wrZ5ii3L&mArO5^dswe*ijb>OCe ztc4Jnt4s@JME$pW4H30v$;fuYfO{Acm=_3RE30vpS4U1zQ5+r5R$rb=a=C>AQ)Wt! z(~CqS#W;%cGPhAQsy0qkP5X%G4v4fnU<0aJ)un@J6PDxfxl0fJM02mjpzUCoJ9*}4!fAK>1Q)I)Z_4*h?AujefQ literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.py new file mode 100644 index 0000000..38f3251 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.py @@ -0,0 +1,386 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Big5 frequency table +# by Taiwan's Mandarin Promotion Council +# +# +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +#Char to FreqOrder table +BIG5_TABLE_SIZE = 5376 + +BIG5_CHAR_TO_FREQ_ORDER = ( + 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 +3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 +1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 + 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 +3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 +4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 +5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 + 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 + 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 + 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 +2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 +1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 +3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 + 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 +3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 +2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 + 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 +3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 +1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 +5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 + 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 +5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 +1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 + 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 + 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 +3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 +3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 + 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 +2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 +2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 + 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 + 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 +3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 +1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 +1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 +1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 +2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 + 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 +4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 +1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 +5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 +2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 + 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 + 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 + 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 + 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 +5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 + 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 +1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 + 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 + 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 +5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 +1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 + 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 +3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 +4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 +3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 + 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 + 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 +1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 +4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 +3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 +3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 +2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 +5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 +3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 +5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 +1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 +2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 +1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 + 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 +1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 +4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 +3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 + 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 + 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 + 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 +2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 +5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 +1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 +2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 +1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 +1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 +5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 +5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 +5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 +3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 +4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 +4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 +2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 +5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 +3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 + 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 +5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 +5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 +1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 +2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 +3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 +4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 +5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 +3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 +4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 +1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 +1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 +4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 +1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 + 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 +1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 +1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 +3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 + 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 +5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 +2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 +1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 +1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 +5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 + 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 +4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 + 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 +2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 + 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 +1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 +1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 + 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 +4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 +4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 +1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 +3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 +5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 +5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 +1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 +2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 +1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 +3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 +2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 +3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 +2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 +4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 +4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 +3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 + 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 +3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 + 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 +3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 +4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 +3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 +1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 +5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 + 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 +5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 +1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 + 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 +4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 +4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 + 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 +2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 +2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 +3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 +1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 +4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 +2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 +1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 +1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 +2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 +3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 +1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 +5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 +1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 +4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 +1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 + 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 +1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 +4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 +4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 +2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 +1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 +4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 + 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 +5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 +2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 +3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 +4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 + 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 +5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 +5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 +1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 +4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 +4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 +2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 +3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 +3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 +2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 +1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 +4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 +3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 +3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 +2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 +4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 +5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 +3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 +2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 +3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 +1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 +2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 +3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 +4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 +2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 +2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 +5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 +1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 +2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 +1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 +3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 +4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 +2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 +3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 +3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 +2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 +4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 +2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 +3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 +4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 +5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 +3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 + 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 +1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 +4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 +1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 +4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 +5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 + 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 +5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 +5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 +2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 +3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 +2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 +2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 + 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 +1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 +4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 +3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 +3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 + 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 +2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 + 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 +2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 +4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 +1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 +4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 +1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 +3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 + 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 +3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 +5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 +5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 +3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 +3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 +1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 +2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 +5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 +1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 +1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 +3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 + 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 +1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 +4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 +5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 +2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 +3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 + 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 +1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 +2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 +2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 +5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 +5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 +5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 +2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 +2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 +1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 +4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 +3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 +3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 +4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 +4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 +2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 +2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 +5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 +4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 +5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 +4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 + 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 + 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 +1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 +3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 +4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 +1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 +5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 +2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 +2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 +3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 +5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 +1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 +3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 +5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 +1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 +5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 +2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 +3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 +2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 +3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 +3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 +3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 +4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 + 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 +2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 +4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 +3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 +5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 +1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 +5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 + 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 +1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 + 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 +4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 +1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 +4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 +1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 + 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 +3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 +4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 +5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 + 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 +3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 + 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 +) + diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/big5freq.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa75917c91ec63a7502d58059f08812f6dfcc861 GIT binary patch literal 54696 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

    w=zpJ;tyH>pv${2!Rj6IQR zpg!HAnqHM%uJB{Go~zF9-=+QOy3)-u#}d`7TwLi!`MrmjCT4&>f=Ox$EE}-QzGZ z2i&x(%OW-zLn(EmQOb;yW}FrI=)z$oZJlvTc%M{t3m#cAKG&*qAv78>G1KDerP_LO4&k#l)-Jr-DY=4 z{l(C&b}(Wd)?*UOWhG)S8AUy3N93sIJ;= 0: + self._total_chars += 1 + # order is valid + if order < self._table_size: + if 512 > self._char_to_freq_order[order]: + self._freq_chars += 1 + + def get_confidence(self): + """return confidence based on existing data""" + # if we didn't receive any character in our consideration range, + # return negative answer + if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: + return self.SURE_NO + + if self._total_chars != self._freq_chars: + r = (self._freq_chars / ((self._total_chars - self._freq_chars) + * self.typical_distribution_ratio)) + if r < self.SURE_YES: + return r + + # normalize confidence (we don't want to be 100% sure) + return self.SURE_YES + + def got_enough_data(self): + # It is not necessary to receive all data to draw conclusion. + # For charset detection, certain amount of data is enough + return self._total_chars > self.ENOUGH_DATA_THRESHOLD + + def get_order(self, byte_str): + # We do not handle characters based on the original encoding string, + # but convert this encoding string to a number, here called order. + # This allows multiple encodings of a language to share one frequency + # table. + return -1 + + +class EUCTWDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCTWDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER + self._table_size = EUCTW_TABLE_SIZE + self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-TW encoding, we are interested + # first byte range: 0xc4 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xC4: + return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 + else: + return -1 + + +class EUCKRDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCKRDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER + self._table_size = EUCKR_TABLE_SIZE + self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-KR encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xB0: + return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 + else: + return -1 + + +class GB2312DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(GB2312DistributionAnalysis, self).__init__() + self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER + self._table_size = GB2312_TABLE_SIZE + self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for GB2312 encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0xB0) and (second_char >= 0xA1): + return 94 * (first_char - 0xB0) + second_char - 0xA1 + else: + return -1 + + +class Big5DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(Big5DistributionAnalysis, self).__init__() + self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER + self._table_size = BIG5_TABLE_SIZE + self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for big5 encoding, we are interested + # first byte range: 0xa4 -- 0xfe + # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if first_char >= 0xA4: + if second_char >= 0xA1: + return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 + else: + return 157 * (first_char - 0xA4) + second_char - 0x40 + else: + return -1 + + +class SJISDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(SJISDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for sjis encoding, we are interested + # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe + # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0x81) and (first_char <= 0x9F): + order = 188 * (first_char - 0x81) + elif (first_char >= 0xE0) and (first_char <= 0xEF): + order = 188 * (first_char - 0xE0 + 31) + else: + return -1 + order = order + second_char - 0x40 + if second_char > 0x7F: + order = -1 + return order + + +class EUCJPDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCJPDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-JP encoding, we are interested + # first byte range: 0xa0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + char = byte_str[0] + if char >= 0xA0: + return 94 * (char - 0xA1) + byte_str[1] - 0xa1 + else: + return -1 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/chardistribution.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e47d7b5c774e75d6030ae95081e2ff784162c032 GIT binary patch literal 7721 zcmd5>TXP#p6+SZ>NtUniUEbYVlr1h|**GNBE-#S87bVedA}=i)Dk_R8Su=LVl19!< zJ6VUgC@SHB;*AI3gF(3t`TBGx_3yFafBx`~ZiBjiDgM62PyD(?|Q7uIl>TGH` z)J{_^P3;WTGStpeEoT<@(a{y^>ok*Gjr@sC@8ld1dLIyIQWUtMc;3dU>tl zswMt9V*4HSF}At#xNRs;vAw{fxU+oyE7z`{WPI|lw$J+IKJ6*y=eg-}`Ocds8K3CY z^_l)mqC3U#95;NsTs_I|c(o(9jHZ0nKs3V1{OxJOMLD zi>elf*>pe-(f0dy{`GX`{SR+$e|HAO7dHbyt${({vH4lyCthXY5j`VvWjrYGkc@^$ zWePknQ{b_gLIywC$s)86-PIzjR*FL`wS!_O^z}3s+y*n?IR26QNuvvO&EM}G81q0#c| z5x?&jc+lDp&|jqpXN!k!*ITi#X82WsUldR-UQpndv-f~Pe14suIKzS*p0nKm$S@*& z!_)Bri)S*$rcKeSf*RIX^xUF@6org&8--^)`xG_P6z!vpv%~&z=&LrPlB<9^unzEkE4W4+Dfn@E`sY=L$s!h?Pnaz|uJu+rBm^HeQ}$l>*fne`D_AZ-E}V5}=^q zav!o#5(8(y9?~P`c$>!%W7{Bm)Sj|4)~GdMPgv8I;1N?yR%ef2;7r-Nn-;~FR%(^(2t*kx8 zD>7nDSlQHZp1|rI@wbyOEF32u(1`LY$9Fy4(n~- zbv3q4*KK#aJ>HRA^*Mf3uR&afC_o_B5yn%XX7yQ!&qKiaA$-mhLkhlz#TcxfvAQ2S zH<8Qb#&ef)X^mk?>iEf04{WqPXAQE|zuziarTd6G ziHBGaMsJRI}n&=@M{QcFa|Q{OlU}bflGqJt$@=S$!<&&*3(&$l7RI+7?i1}hk0wr z+mb>k^rpTDAy6MAtO0^Y7=^)H5n<*Hl1g2ecN?4K;gCmT*BxeGtVn$BUJX7+? zY%ClsfEFSaUOr@F31eg=!p4GSIbg;FC{{vG#p3bH+JatgA)-G}VbNyz3jW4?-0a6jU+ zjQEg`z(d^>1fJ-oAOiZ|@Vm)AevZ;jh+7aJ3x9Q$n+%B0|G=hW!Kf{ z7R`7>I99`V{gLv0eh+>L@h6B6AU=e^!OvU{-9qVmEKF!f(sy*dBr41d6;&4fR#j2=t>cZ{Nk+e#7hm5W|~ zuc4pdzZMj0NWn`A7Zkn9W+av3F8o}92IL68y@~%5lUhl&CCkRbnwu`psiaPl70FYO zqR55iP7q6#@VQVqSX{$OXLHAIXt@$Hw literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py new file mode 100644 index 0000000..8b3738e --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py @@ -0,0 +1,106 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState +from .charsetprober import CharSetProber + + +class CharSetGroupProber(CharSetProber): + def __init__(self, lang_filter=None): + super(CharSetGroupProber, self).__init__(lang_filter=lang_filter) + self._active_num = 0 + self.probers = [] + self._best_guess_prober = None + + def reset(self): + super(CharSetGroupProber, self).reset() + self._active_num = 0 + for prober in self.probers: + if prober: + prober.reset() + prober.active = True + self._active_num += 1 + self._best_guess_prober = None + + @property + def charset_name(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.charset_name + + @property + def language(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.language + + def feed(self, byte_str): + for prober in self.probers: + if not prober: + continue + if not prober.active: + continue + state = prober.feed(byte_str) + if not state: + continue + if state == ProbingState.FOUND_IT: + self._best_guess_prober = prober + return self.state + elif state == ProbingState.NOT_ME: + prober.active = False + self._active_num -= 1 + if self._active_num <= 0: + self._state = ProbingState.NOT_ME + return self.state + return self.state + + def get_confidence(self): + state = self.state + if state == ProbingState.FOUND_IT: + return 0.99 + elif state == ProbingState.NOT_ME: + return 0.01 + best_conf = 0.0 + self._best_guess_prober = None + for prober in self.probers: + if not prober: + continue + if not prober.active: + self.logger.debug('%s not active', prober.charset_name) + continue + conf = prober.get_confidence() + self.logger.debug('%s %s confidence = %s', prober.charset_name, prober.language, conf) + if best_conf < conf: + best_conf = conf + self._best_guess_prober = prober + if not self._best_guess_prober: + return 0.0 + return best_conf diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetgroupprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36b5fe6609433314e6371fa52b344cc4ab380bee GIT binary patch literal 2833 zcmcImU2j`O5S{gPoY+n4Ktm;@NCZKP1qxAlfPxAInx^eT-Re43MWkru_-t5T zm6k*xB`=5{!doSfc;k;C!~?&82mS!(%-TuS=Q_DN-jBJvGiT1s-sHdYmA`)a-L_=% zm*DqnH2(!ehQ~-xq;F)~h~c;(y@K=;*-kJ{#3iz4BrD2^$g#+G+eOLdq){v3^^Sq4 zQG`W^2l;TfGiWzLGq^Z=9|PEPspU??E`BQCW#* zp1{C_#=;Dk;O1y3O~QOhhsks}Ke2XuftFIgENP=Qj~!dwpN%NoMDy1m0v;oW*sLJk z0uMPf@YNU`fmxeKTeJh$V@FMD)VNDMoP+E&2W`98=>?Z}Fcdv4%%SJUBbTQ+E!kvaxejjuhPd3Lys8R0K>I*b=ph zT?DxxpA`W5{uMrtCXgeT0@~5px!Aw|0cdw#(f-Hry zdOSZ1kJBm+h(0pD%*k=HJ!}8oz)_#0z3SgIM;H)|=pX1D{5A>d#?CKtgz{1lzask; zVJK03jQEdU8bSeKH*%E7VIqEWx|B#rm{Cs(U^`y~EiBRqd?`r-s$8DeDe)yAkGPmJWhPF~?gmFY&X3(up;wv*f=Lp1?wWVEJO$~v!kw&z@yVi1en z=KY8D4SRP>Gc8s_-VK^*_4`})-YuQnZ1%jHR=dFW4-ln#TiVVRio7}S1 characters. + Also retains English alphabet and high byte characters immediately + before occurrences of >. + + This filter can be applied to all scripts which contain both English + characters and extended ASCII characters, but is currently only used by + ``Latin1Prober``. + """ + filtered = bytearray() + in_tag = False + prev = 0 + + for curr in range(len(buf)): + # Slice here to get bytes instead of an int with Python 3 + buf_char = buf[curr:curr + 1] + # Check if we're coming out of or entering an HTML tag + if buf_char == b'>': + in_tag = False + elif buf_char == b'<': + in_tag = True + + # If current character is not extended-ASCII and not alphabetic... + if buf_char < b'\x80' and not buf_char.isalpha(): + # ...and we're not in a tag + if curr > prev and not in_tag: + # Keep everything after last non-extended-ASCII, + # non-alphabetic character + filtered.extend(buf[prev:curr]) + # Output a space to delimit stretch we kept + filtered.extend(b' ') + prev = curr + 1 + + # If we're not in a tag... + if not in_tag: + # Keep everything after last non-extended-ASCII, non-alphabetic + # character + filtered.extend(buf[prev:]) + + return filtered diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/charsetprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc00d85f1564dddaa4ad0b0d70eac5081d83eb27 GIT binary patch literal 4094 zcmcIn-EJF26rNrGG)W!O&=v>?IxVVjX_E*Ly@*QMGzm0P6{?Ls@ze z+|*SfDy28P1P_741#iGRaLWZ(-0%S9J7?{+gQ&PkZ0~sH?ChCu&YbU?*}~tmGr#}% zi|dQwr-1)Exb$5V0e+T8e!bpF`iLo7KZhcrYx6RAmB25MVzefQ#%?Y|o&G2D}pnl{uORcjheIEoE|mb z5YA5ZEI_oH{Q2v)PuND+I_kQL0_YBea4m6wA1bym1<@%AQzB4g0Y-tyP$agiXHc3V zRg+j5ik7Q6Bs5gy#VxlPMn<;TP64zCKNlE<(Yw`zwd+ z94CineA4Jk@R=%1=msj9aEdW(g3hohZWB<+?oi*;!$s_%kOLX7>N46HJUdUh*TF+q z!3)n3L*@z5=r>O~auk!MQo(2Ve{J9>VUg~gajtXhPJd0AKR0t|cAkpIgGTB^3%T7w z!JjNljPf+{?F|e9*1CQYH^V^1zFL9h-|?f^a^fwZlJNyP2Zci{j|$?DgSu0tFmCH9 zl+{OK@rS)@*9`%e8S80Ysp93={YI9mH2g^?!bSMZ^vP|9t+v}38098$H24BHG)+a= z7c){3+w!?RM+0*^65`Mj0N#O~vo0Lj;?Ne)z7+?y*w}j@4hy8C9h3!%frNxwS@qIk zQ5+OWS>dIUDr!LcAJfE1_;EW%tg?sE2@gKGA|Ar9Qzb0=a|CHd4nGf-3{*3Wl{D>C zp&ay-mPu36jPy$0&x?9(uc6F}RB4T9L<^ zk{Is!=zs@bEWR2))%DWHD#ZX#RXQ+j=)F{tR`SvJnSbt_k5OwYIPUe01kal)mA)6t z22CUBx7tRUL?Yje7sk?)TBTt&t^FhoG^QMd-O#8Ych?xmY<#^WYwb|WWP4Qf0xSzn2eFBi)IFG_r~NP-M|Ei?e=wT|@1oM{^&$!Z=0OwCej4_Smiz6{Z_6N& zabjd2!QLFM?s%1!a)0_N(r2{TAM@f}A2%mf={6sHH1YC<^Cn78Jl^9dt-Lh#2F`id zd2>hh1;E5RxO!%=^|CqCoMHT^LmcK^H(LZ1;8Y<5F9YxNRAc`ULhlmzlV<$87;nh< zWBKedh`YF}FQ5=}({)BRJYy~3Kro-_Fr5$x^Exj5CyGfK0QDgQ;QX_nh2et} ziJnEjjlG|U(rAO{M0H!defh8?4sgx{>ur(NNJ!uzzR1QR8$&t)krB_KXNmQpO7#xT zVE&hh8dbW8|jer;y{uZ zvviFKG2|(+h>{!{wy#tyZ>>&r8Rz&~q!X|$127`P{|^y%yDA8AqK^hSu!d?T7&P(y zewya&UVRNghw_#2H280xjs&fdnD&UN`EX;#awIY)K{3{L*0;7M=6VByX(SXbgJlq7 z4m8+L@{;?j*Y88Y<4>~pl6rj{qYw)!_^pPw-c>GdP12o~+<6NH)AUOZGS0OW=lX1S zj#SLVt)+eC(2noCgM#0hnCuSmjU^$BUE{U5b1zj-xkAuc4v;mc!uIzt`jGAWp=rCr zP0x*#p`D9PPWlQ8QJJ>NR@q*#=j{r}j;pX>pD$dn&sp<@GXA%#bLi$!M9d5d*X<@j zKcZI_QpTNoUpuw+Z)$Gsp0kO@{S7{3JJi*o12In%Zyr6o@C+P!Uv$_Zy;V5#)PZ`@ z(J%D73cFw6(BZ`SfQoA<#zM%o6L|r0NZLQd#hO>P%XXzSU6?BluhQJrY$ZwXGNGrM miu+xiz3z}2CXJ5r4ZAuGj2yUIS+G~%C#*DR#j4on3jYB5gVY}Y literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.py @@ -0,0 +1 @@ + diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe6fddda08801dd81117af1be4b02fe8ed714fdf GIT binary patch literal 150 zcmZSn%*%DVb8CDu0~9aQ(bd5Z-s?2ghLSP(UmYSE6U!?0I+8wPyhe` literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.py new file mode 100644 index 0000000..c61136b --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +""" +Script which takes one or more file paths and reports on their detected +encodings + +Example:: + + % chardetect somefile someotherfile + somefile: windows-1252 with confidence 0.5 + someotherfile: ascii with confidence 1.0 + +If no paths are provided, it takes its input from stdin. + +""" + +from __future__ import absolute_import, print_function, unicode_literals + +import argparse +import sys + +from pip._vendor.chardet import __version__ +from pip._vendor.chardet.compat import PY2 +from pip._vendor.chardet.universaldetector import UniversalDetector + + +def description_of(lines, name='stdin'): + """ + Return a string describing the probable encoding of a file or + list of strings. + + :param lines: The lines to get the encoding of. + :type lines: Iterable of bytes + :param name: Name of file or collection of lines + :type name: str + """ + u = UniversalDetector() + for line in lines: + line = bytearray(line) + u.feed(line) + # shortcut out of the loop to save reading further - particularly useful if we read a BOM. + if u.done: + break + u.close() + result = u.result + if PY2: + name = name.decode(sys.getfilesystemencoding(), 'ignore') + if result['encoding']: + return '{0}: {1} with confidence {2}'.format(name, result['encoding'], + result['confidence']) + else: + return '{0}: no result'.format(name) + + +def main(argv=None): + """ + Handles command line arguments and gets things started. + + :param argv: List of arguments, as if specified on the command-line. + If None, ``sys.argv[1:]`` is used instead. + :type argv: list of str + """ + # Get command line arguments + parser = argparse.ArgumentParser( + description="Takes one or more file paths and reports their detected \ + encodings") + parser.add_argument('input', + help='File whose encoding we would like to determine. \ + (default: stdin)', + type=argparse.FileType('rb'), nargs='*', + default=[sys.stdin if PY2 else sys.stdin.buffer]) + parser.add_argument('--version', action='version', + version='%(prog)s {0}'.format(__version__)) + args = parser.parse_args(argv) + + for f in args.input: + if f.isatty(): + print("You are running chardetect interactively. Press " + + "CTRL-D twice at the start of a blank line to signal the " + + "end of your input. If you want help, run chardetect " + + "--help\n", file=sys.stderr) + print(description_of(f, f.name)) + + +if __name__ == '__main__': + main() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cli/chardetect.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8cf8436dbb95c6deccb6131d49e226ce9a9038f1 GIT binary patch literal 3175 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 E0;iZsIsgCw literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.py new file mode 100644 index 0000000..ddd7468 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.py @@ -0,0 +1,34 @@ +######################## BEGIN LICENSE BLOCK ######################## +# Contributor(s): +# Dan Blanchard +# Ian Cordasco +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys + + +if sys.version_info < (3, 0): + PY2 = True + PY3 = False + base_str = (str, unicode) + text_type = unicode +else: + PY2 = False + PY3 = True + base_str = (bytes, str) + text_type = str diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/compat.pyc new file mode 100644 index 0000000000000000000000000000000000000000..164dd0380d8017a00b4d2e01377f68dc50b54f09 GIT binary patch literal 399 zcmYLC%SyvQ6uo&gZE8et;nH129UQ~&?~ literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.py new file mode 100644 index 0000000..efd793a --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.py @@ -0,0 +1,49 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .chardistribution import EUCKRDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import CP949_SM_MODEL + + +class CP949Prober(MultiByteCharSetProber): + def __init__(self): + super(CP949Prober, self).__init__() + self.coding_sm = CodingStateMachine(CP949_SM_MODEL) + # NOTE: CP949 is a superset of EUC-KR, so the distribution should be + # not different. + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "CP949" + + @property + def language(self): + return "Korean" diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/cp949prober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29af359cc705a11797bfdb6acc91768990975d64 GIT binary patch literal 1340 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 aUL4NaKtc3|gZ@(n)D%IgaN=ceCHEJKLX?^S literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.py new file mode 100644 index 0000000..0069523 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.py @@ -0,0 +1,246 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +HZ_CLS = ( +1,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,0,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,4,0,5,2,0, # 78 - 7f +1,1,1,1,1,1,1,1, # 80 - 87 +1,1,1,1,1,1,1,1, # 88 - 8f +1,1,1,1,1,1,1,1, # 90 - 97 +1,1,1,1,1,1,1,1, # 98 - 9f +1,1,1,1,1,1,1,1, # a0 - a7 +1,1,1,1,1,1,1,1, # a8 - af +1,1,1,1,1,1,1,1, # b0 - b7 +1,1,1,1,1,1,1,1, # b8 - bf +1,1,1,1,1,1,1,1, # c0 - c7 +1,1,1,1,1,1,1,1, # c8 - cf +1,1,1,1,1,1,1,1, # d0 - d7 +1,1,1,1,1,1,1,1, # d8 - df +1,1,1,1,1,1,1,1, # e0 - e7 +1,1,1,1,1,1,1,1, # e8 - ef +1,1,1,1,1,1,1,1, # f0 - f7 +1,1,1,1,1,1,1,1, # f8 - ff +) + +HZ_ST = ( +MachineState.START,MachineState.ERROR, 3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START, 4,MachineState.ERROR,# 10-17 + 5,MachineState.ERROR, 6,MachineState.ERROR, 5, 5, 4,MachineState.ERROR,# 18-1f + 4,MachineState.ERROR, 4, 4, 4,MachineState.ERROR, 4,MachineState.ERROR,# 20-27 + 4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f +) + +HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +HZ_SM_MODEL = {'class_table': HZ_CLS, + 'class_factor': 6, + 'state_table': HZ_ST, + 'char_len_table': HZ_CHAR_LEN_TABLE, + 'name': "HZ-GB-2312", + 'language': 'Chinese'} + +ISO2022CN_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,3,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,4,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022CN_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27 + 5, 6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f +) + +ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS, + 'class_factor': 9, + 'state_table': ISO2022CN_ST, + 'char_len_table': ISO2022CN_CHAR_LEN_TABLE, + 'name': "ISO-2022-CN", + 'language': 'Chinese'} + +ISO2022JP_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,2,2, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,7,0,0,0, # 20 - 27 +3,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +6,0,4,0,8,0,0,0, # 40 - 47 +0,9,5,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022JP_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 20-27 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47 +) + +ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS, + 'class_factor': 10, + 'state_table': ISO2022JP_ST, + 'char_len_table': ISO2022JP_CHAR_LEN_TABLE, + 'name': "ISO-2022-JP", + 'language': 'Japanese'} + +ISO2022KR_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,3,0,0,0, # 20 - 27 +0,4,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,5,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022KR_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 10-17 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27 +) + +ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS, + 'class_factor': 6, + 'state_table': ISO2022KR_ST, + 'char_len_table': ISO2022KR_CHAR_LEN_TABLE, + 'name': "ISO-2022-KR", + 'language': 'Korean'} + + diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/escsm.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ae6dc93fcb2d10fb52e44996500eb9afb7480d5 GIT binary patch literal 8010 zcmeHL+iu!G5FLjE0tvaNP22R6KA}o3lt`!#Rh5LIk_3_nc=C(ovLa!4=jm43&0j3r_2J| z1SRhH%5j=7KByvGwY$u4H}>NWc5FXx5be@q;i?5laEg$mD7ZlhpBpyIlkAV|$@D|; z&y7H12b2V`m!Qn?sKrIpmPFK$Ls6R(QCki~4P*EUl;mxr=I*`g4IaFZevukX4`Nyz9NPka@4AD)KlT84dE#CZ?G7l>@E#ga-LRvsa|gJArJhd zaT0Ojh(~rriVEW3!XxS=KMh8otM^kU`KdP2#d!5#q-Oj-%K84AG|pq$#1W6|h*TU? zWpJJB;ofK2^um41gdM7E^5^RwMWd>i-tpvBO#bNKV;>*#81d(;Fz#5=yqz=YJ#xtq zf1tBV6H&5SvzKuq%_;6y z)KcL{t?llW3j9Ww_+_*@dZp-b5g)gNMyh1TUuV@QzN)Qbv-c lEqrfBqEiVe=DZX4f=t*M=^cJ^4}wnEq~T%kWyB8J{SOwANlO3# literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.py new file mode 100644 index 0000000..20ce8f7 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState, MachineState +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCJPDistributionAnalysis +from .jpcntx import EUCJPContextAnalysis +from .mbcssm import EUCJP_SM_MODEL + + +class EUCJPProber(MultiByteCharSetProber): + def __init__(self): + super(EUCJPProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) + self.distribution_analyzer = EUCJPDistributionAnalysis() + self.context_analyzer = EUCJPContextAnalysis() + self.reset() + + def reset(self): + super(EUCJPProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return "EUC-JP" + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char, char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/eucjpprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dcadebaa895a5e1c0b284a67ca6e3ef6a99dff69 GIT binary patch literal 3006 zcmcImZEqVz5S}}~Bu`h8*Ux1W9uyE6He z@csg=_#Pz2PyELk6d2{B}vQDDZ6n=1{F!G(y6*}Sq3wb&Pr$2jVm&! zNjfK;IXAA#;EJU4(wWD2Mod|bJc(!JN0A>yo^}=_u1Tvt2PYB_r0#>*d60vAc$j3p zmW`}Y#%|O-PBNp6I(6+D$nJPxlSil4G>)UZWh_54xsxwL-WbMHD-#1wwhmeINn__= zD=BQA9FA==%pPXZ;Iv2zr*eI&(impeoY=ohuTG_5Yd758-)eqsuS{9ai8HLZrblSS z4u}y#3~T`bPzLVoln4#bCN9{6iVjQDVO8R?s?A7T(ax*{t$G#ax1cD5jP4~_VWYv|-pAYh7oVnNX$!wISv<@)yNHe0*iAF;_D3U)kPkIBC-5z-Bz>RY_zxczOr=Yl zAShgdBVVScqn3Nt_uyR;g`OtU=%miK1B(h>caaG3K2oSA$D%SW7ah9t6irLLC=zu> z!Q|X#H4Z};Lt#3M#{&%YK-A+(wU9YD?d|EgKqlt8$~Vqx?=tq2w~9OTm`GK<+Dxsy zh=1+&UY)_I8DX+_aW@sF pXn)kr?1{UYa18SWZZhoZaenzLSFrE9O?dD&=1~OJylc~c=`Xa=aPI&B literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.py new file mode 100644 index 0000000..b68078c --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.py @@ -0,0 +1,195 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology + +# 128 --> 0.79 +# 256 --> 0.92 +# 512 --> 0.986 +# 1024 --> 0.99944 +# 2048 --> 0.99999 +# +# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 +# Random Distribution Ration = 512 / (2350-512) = 0.279. +# +# Typical Distribution Ratio + +EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 + +EUCKR_TABLE_SIZE = 2352 + +# Char to FreqOrder table , +EUCKR_CHAR_TO_FREQ_ORDER = ( + 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, + 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, + 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, + 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, + 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, + 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, + 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, + 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, + 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, + 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, + 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, + 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, + 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, + 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, + 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, + 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, + 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, + 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, + 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, + 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, + 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, + 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, + 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, + 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, + 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, + 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, + 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, + 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, + 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, + 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, + 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, + 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, + 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, + 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, + 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, + 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, + 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, + 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, + 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, + 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, + 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, + 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, + 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, + 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, + 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, + 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, + 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, + 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, + 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, + 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, + 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 +) + diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euckrfreq.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6dcdf949562958b15263bbcb48fb257166ea8a0 GIT binary patch literal 24082 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 mF`@1d*V38$rf{0*&5SpGlq3@9}fA + +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +# Char to FreqOrder table , +EUCTW_TABLE_SIZE = 5376 + +EUCTW_CHAR_TO_FREQ_ORDER = ( + 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 +3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 +1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 + 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 +3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 +4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 +7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 + 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 + 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 + 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 +2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 +1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 +3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 + 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 +3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 +2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 + 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 +3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 +1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 +7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 + 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 +7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 +1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 + 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 + 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 +3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 +3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 + 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 +2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 +2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 + 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 + 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 +3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 +1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 +1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 +1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 +2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 + 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 +4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 +1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 +7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 +2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 + 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 + 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 + 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 + 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 +7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 + 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 +1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 + 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 + 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 +7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 +1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 + 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 +3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 +4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 +3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 + 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 + 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 +1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 +4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 +3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 +3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 +2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 +7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 +3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 +7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 +1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 +2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 +1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 + 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 +1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 +4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 +3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 + 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 + 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 + 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 +2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 +7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 +1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 +2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 +1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 +1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 +7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 +7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 +7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 +3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 +4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 +1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 +7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 +2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 +7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 +3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 +3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 +7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 +2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 +7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 + 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 +4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 +2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 +7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 +3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 +2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 +2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 + 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 +2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 +1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 +1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 +2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 +1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 +7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 +7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 +2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 +4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 +1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 +7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 + 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 +4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 + 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 +2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 + 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 +1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 +1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 + 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 +3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 +3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 +1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 +3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 +7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 +7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 +1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 +2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 +1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 +3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 +2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 +3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 +2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 +4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 +4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 +3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 + 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 +3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 + 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 +3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 +3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 +3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 +1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 +7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 + 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 +7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 +1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 + 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 +4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 +3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 + 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 +2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 +2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 +3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 +1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 +4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 +2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 +1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 +1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 +2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 +3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 +1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 +7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 +1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 +4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 +1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 + 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 +1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 +3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 +3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 +2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 +1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 +4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 + 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 +7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 +2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 +3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 +4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 + 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 +7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 +7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 +1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 +4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 +3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 +2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 +3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 +3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 +2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 +1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 +4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 +3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 +3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 +2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 +4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 +7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 +3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 +2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 +3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 +1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 +2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 +3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 +4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 +2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 +2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 +7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 +1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 +2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 +1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 +3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 +4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 +2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 +3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 +3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 +2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 +4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 +2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 +3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 +4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 +7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 +3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 + 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 +1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 +4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 +1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 +4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 +7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 + 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 +7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 +2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 +1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 +1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 +3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 + 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 + 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 + 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 +3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 +2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 + 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 +7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 +1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 +3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 +7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 +1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 +7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 +4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 +1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 +2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 +2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 +4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 + 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 + 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 +3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 +3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 +1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 +2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 +7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 +1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 +1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 +3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 + 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 +1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 +4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 +7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 +2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 +3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 + 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 +1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 +2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 +2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 +7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 +7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 +7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 +2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 +2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 +1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 +4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 +3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 +3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 +4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 +4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 +2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 +2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 +7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 +4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 +7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 +2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 +1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 +3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 +4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 +2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 + 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 +2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 +1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 +2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 +2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 +4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 +7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 +1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 +3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 +7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 +1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 +8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 +2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 +8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 +2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 +2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 +8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 +8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 +8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 + 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 +8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 +4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 +3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 +8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 +1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 +8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 + 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 +1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 + 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 +4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 +1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 +4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 +1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 + 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 +3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 +4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 +8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 + 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 +3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 + 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 +2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 +) + diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwfreq.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61b57188cdca2542b2cba4e077110c386e5d61cd GIT binary patch literal 54705 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 D8;(IL literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.py new file mode 100644 index 0000000..35669cc --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCTWDistributionAnalysis +from .mbcssm import EUCTW_SM_MODEL + +class EUCTWProber(MultiByteCharSetProber): + def __init__(self): + super(EUCTWProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) + self.distribution_analyzer = EUCTWDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-TW" + + @property + def language(self): + return "Taiwan" diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/euctwprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c3e6c2ab70ab115cf7e8e3c4a1674ad54eea4cc GIT binary patch literal 1341 zcmcIj&2G~`5T5lB|s%06(HF5 zp!A^fA@!Z@Lm5C7LK-?dfU*ZwAJRVAAt(VC0*W4d2lxi?IUPXJha?(Mcr8dptne|Z zX;-2?UZI*?Wo@GHW4oNI*6lx_{mHV>^<{z?s%e&A=~}tHC$x9^X)-%M(FR*R?@%x6 zw{=#oj5hAb{ml`XOy%^$$?1E%w{f{Nw*YwLKPE9_QVO_lYMZK0Jy1U5!JQBufi=C2 z8A6;yj9$(Sv9K{AF^8m(9sytJQx6s%Lm|)y3^){dWeC_~FR%No7Xy2UawoQjvuKCI zgdDJIR2v6uGK^B{TBDRPCyhBP^3mMFB~2A`OZbRXaR(roF+w-0wIN$&6gsRpu2JPh zL~pRl9MNiwRWojMGt#xetSm>b-YsrkSM0JPzo@!cw&R?JS125-F30P}j__r(ihC5| zIf>zlK|B;gu_tb!;>s;loSYy|BCh$&@K-e2(d^t+V>{d>=T?iuJ&MS669%%*D#g(a zR{-9>N~Ea)%rbqQ)&I4`0i`Lk`m)O|)eBm$%ZoVungv|Bl*sT%SuKmMB+~+K56~=# zHn@tJ`SCufzaZMxHpa~Jdq!d>*AqLvVX!9dki6A=jk4oKOfEpa+K#KlD^!)c+Lp|C oz 0.79 -- 0.79 +# 1024 --> 0.92 -- 0.13 +# 2048 --> 0.98 -- 0.06 +# 6768 --> 1.00 -- 0.02 +# +# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 +# Random Distribution Ration = 512 / (3755 - 512) = 0.157 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR + +GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 + +GB2312_TABLE_SIZE = 3760 + +GB2312_CHAR_TO_FREQ_ORDER = ( +1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, +2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, +2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, + 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, +1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, +1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, + 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, +1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, +2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, +3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, + 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, +1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, + 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, +2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, + 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, +2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, +1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, +3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, + 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, +1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, + 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, +2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, +1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, +3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, +1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, +2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, +1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, + 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, +3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, +3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, + 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, +3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, + 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, +1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, +3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, +2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, +1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, + 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, +1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, +4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, + 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, +3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, +3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, + 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, +1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, +2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, +1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, +1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, + 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, +3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, +3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, +4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, + 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, +3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, +1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, +1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, +4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, + 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, + 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, +3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, +1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, + 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, +1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, +2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, + 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, + 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, + 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, +3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, +4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, +3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, + 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, +2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, +2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, +2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, + 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, +2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, + 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, + 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, + 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, +3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, +2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, +2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, +1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, + 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, +2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, + 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, + 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, +1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, +1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, + 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, + 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, +1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, +2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, +3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, +2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, +2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, +2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, +3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, +1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, +1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, +2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, +1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, +3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, +1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, +1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, +3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, + 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, +2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, +1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, +4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, +1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, +1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, +3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, +1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, + 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, + 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, +1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, + 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, +1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, +1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, + 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, +3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, +4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, +3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, +2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, +2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, +1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, +3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, +2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, +1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, +1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, + 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, +2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, +2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, +3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, +4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, +3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, + 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, +3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, +2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, +1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, + 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, + 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, +3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, +4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, +2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, +1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, +1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, + 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, +1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, +3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, + 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, + 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, +1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, + 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, +1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, + 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, +2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, + 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, +2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, +2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, +1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, +1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, +2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, + 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, +1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, +1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, +2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, +2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, +3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, +1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, +4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, + 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, + 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, +3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, +1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, + 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, +3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, +1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, +4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, +1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, +2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, +1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, + 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, +1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, +3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, + 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, +2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, + 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, +1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, +1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, +1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, +3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, +2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, +3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, +3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, +3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, + 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, +2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, + 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, +2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, + 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, +1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, + 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, + 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, +1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, +3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, +3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, +1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, +1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, +3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, +2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, +2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, +1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, +3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, + 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, +4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, +1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, +2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, +3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, +3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, +1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, + 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, + 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, +2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, + 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, +1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, + 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, +1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, +1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, +1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, +1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, +1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, + 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 +) + diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312freq.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aaf48fd48a92117854bd05a2161b9126ef019a79 GIT binary patch literal 38347 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.py new file mode 100644 index 0000000..8446d2d --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import GB2312DistributionAnalysis +from .mbcssm import GB2312_SM_MODEL + +class GB2312Prober(MultiByteCharSetProber): + def __init__(self): + super(GB2312Prober, self).__init__() + self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) + self.distribution_analyzer = GB2312DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "GB2312" + + @property + def language(self): + return "Chinese" diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/gb2312prober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d555e0e06c9897af18c82e146f762a1aed66b08c GIT binary patch literal 1350 zcmcIj&2G~`5T5m4(yEXO1P8{gQf>g>1ACj7` z4eId*)#Re=a)qC})l7AM{~qm6R+VlRIhLrV<@`c7%I`g*z4znM@r%)^w%F;}8uhAq z+mvQwwe@EPyE8JM%IT-mcOUU!=ku9%7zDI2Cb2_O3b=LZoEj(sP$5IY%@8D!GlMHL zhAdARz&ZEC!p4Neo{&O%1bm}U16T%(hQJUo;!xz3F<`=8UiVlp`|c3s&RrL0=^lrP zIpDfgT^6y)NJ^<2jZ$WuG~=wuN9PVPY3qzz!Uv?PYY@qjF}hTp3)v~F(4)n1tup5+ zy}>E_npQ)s+hMEQBi&dmjX4^9SYE!Y+2urjRZX?(hI5)!OODM)u z63ZonxGx6cK=5@ zO#kdIsed@S)s2jrXZVD~a$$+sO9s)Fy?hhv*%oNejf`A?e8oLsiCm~^f5jc6@sRhJ lRoB?-InD7YoF$Gk?cJ5Qg@zn-CmzjLk13Jk@S$-3;4dUiAK(B0 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.py new file mode 100644 index 0000000..b0e1bf4 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.py @@ -0,0 +1,292 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Shy Shalom +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +# This prober doesn't actually recognize a language or a charset. +# It is a helper prober for the use of the Hebrew model probers + +### General ideas of the Hebrew charset recognition ### +# +# Four main charsets exist in Hebrew: +# "ISO-8859-8" - Visual Hebrew +# "windows-1255" - Logical Hebrew +# "ISO-8859-8-I" - Logical Hebrew +# "x-mac-hebrew" - ?? Logical Hebrew ?? +# +# Both "ISO" charsets use a completely identical set of code points, whereas +# "windows-1255" and "x-mac-hebrew" are two different proper supersets of +# these code points. windows-1255 defines additional characters in the range +# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific +# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. +# x-mac-hebrew defines similar additional code points but with a different +# mapping. +# +# As far as an average Hebrew text with no diacritics is concerned, all four +# charsets are identical with respect to code points. Meaning that for the +# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters +# (including final letters). +# +# The dominant difference between these charsets is their directionality. +# "Visual" directionality means that the text is ordered as if the renderer is +# not aware of a BIDI rendering algorithm. The renderer sees the text and +# draws it from left to right. The text itself when ordered naturally is read +# backwards. A buffer of Visual Hebrew generally looks like so: +# "[last word of first line spelled backwards] [whole line ordered backwards +# and spelled backwards] [first word of first line spelled backwards] +# [end of line] [last word of second line] ... etc' " +# adding punctuation marks, numbers and English text to visual text is +# naturally also "visual" and from left to right. +# +# "Logical" directionality means the text is ordered "naturally" according to +# the order it is read. It is the responsibility of the renderer to display +# the text from right to left. A BIDI algorithm is used to place general +# punctuation marks, numbers and English text in the text. +# +# Texts in x-mac-hebrew are almost impossible to find on the Internet. From +# what little evidence I could find, it seems that its general directionality +# is Logical. +# +# To sum up all of the above, the Hebrew probing mechanism knows about two +# charsets: +# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are +# backwards while line order is natural. For charset recognition purposes +# the line order is unimportant (In fact, for this implementation, even +# word order is unimportant). +# Logical Hebrew - "windows-1255" - normal, naturally ordered text. +# +# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be +# specifically identified. +# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew +# that contain special punctuation marks or diacritics is displayed with +# some unconverted characters showing as question marks. This problem might +# be corrected using another model prober for x-mac-hebrew. Due to the fact +# that x-mac-hebrew texts are so rare, writing another model prober isn't +# worth the effort and performance hit. +# +#### The Prober #### +# +# The prober is divided between two SBCharSetProbers and a HebrewProber, +# all of which are managed, created, fed data, inquired and deleted by the +# SBCSGroupProber. The two SBCharSetProbers identify that the text is in +# fact some kind of Hebrew, Logical or Visual. The final decision about which +# one is it is made by the HebrewProber by combining final-letter scores +# with the scores of the two SBCharSetProbers to produce a final answer. +# +# The SBCSGroupProber is responsible for stripping the original text of HTML +# tags, English characters, numbers, low-ASCII punctuation characters, spaces +# and new lines. It reduces any sequence of such characters to a single space. +# The buffer fed to each prober in the SBCS group prober is pure text in +# high-ASCII. +# The two SBCharSetProbers (model probers) share the same language model: +# Win1255Model. +# The first SBCharSetProber uses the model normally as any other +# SBCharSetProber does, to recognize windows-1255, upon which this model was +# built. The second SBCharSetProber is told to make the pair-of-letter +# lookup in the language model backwards. This in practice exactly simulates +# a visual Hebrew model using the windows-1255 logical Hebrew model. +# +# The HebrewProber is not using any language model. All it does is look for +# final-letter evidence suggesting the text is either logical Hebrew or visual +# Hebrew. Disjointed from the model probers, the results of the HebrewProber +# alone are meaningless. HebrewProber always returns 0.00 as confidence +# since it never identifies a charset by itself. Instead, the pointer to the +# HebrewProber is passed to the model probers as a helper "Name Prober". +# When the Group prober receives a positive identification from any prober, +# it asks for the name of the charset identified. If the prober queried is a +# Hebrew model prober, the model prober forwards the call to the +# HebrewProber to make the final decision. In the HebrewProber, the +# decision is made according to the final-letters scores maintained and Both +# model probers scores. The answer is returned in the form of the name of the +# charset identified, either "windows-1255" or "ISO-8859-8". + +class HebrewProber(CharSetProber): + # windows-1255 / ISO-8859-8 code points of interest + FINAL_KAF = 0xea + NORMAL_KAF = 0xeb + FINAL_MEM = 0xed + NORMAL_MEM = 0xee + FINAL_NUN = 0xef + NORMAL_NUN = 0xf0 + FINAL_PE = 0xf3 + NORMAL_PE = 0xf4 + FINAL_TSADI = 0xf5 + NORMAL_TSADI = 0xf6 + + # Minimum Visual vs Logical final letter score difference. + # If the difference is below this, don't rely solely on the final letter score + # distance. + MIN_FINAL_CHAR_DISTANCE = 5 + + # Minimum Visual vs Logical model score difference. + # If the difference is below this, don't rely at all on the model score + # distance. + MIN_MODEL_DISTANCE = 0.01 + + VISUAL_HEBREW_NAME = "ISO-8859-8" + LOGICAL_HEBREW_NAME = "windows-1255" + + def __init__(self): + super(HebrewProber, self).__init__() + self._final_char_logical_score = None + self._final_char_visual_score = None + self._prev = None + self._before_prev = None + self._logical_prober = None + self._visual_prober = None + self.reset() + + def reset(self): + self._final_char_logical_score = 0 + self._final_char_visual_score = 0 + # The two last characters seen in the previous buffer, + # mPrev and mBeforePrev are initialized to space in order to simulate + # a word delimiter at the beginning of the data + self._prev = ' ' + self._before_prev = ' ' + # These probers are owned by the group prober. + + def set_model_probers(self, logicalProber, visualProber): + self._logical_prober = logicalProber + self._visual_prober = visualProber + + def is_final(self, c): + return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, + self.FINAL_PE, self.FINAL_TSADI] + + def is_non_final(self, c): + # The normal Tsadi is not a good Non-Final letter due to words like + # 'lechotet' (to chat) containing an apostrophe after the tsadi. This + # apostrophe is converted to a space in FilterWithoutEnglishLetters + # causing the Non-Final tsadi to appear at an end of a word even + # though this is not the case in the original text. + # The letters Pe and Kaf rarely display a related behavior of not being + # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' + # for example legally end with a Non-Final Pe or Kaf. However, the + # benefit of these letters as Non-Final letters outweighs the damage + # since these words are quite rare. + return c in [self.NORMAL_KAF, self.NORMAL_MEM, + self.NORMAL_NUN, self.NORMAL_PE] + + def feed(self, byte_str): + # Final letter analysis for logical-visual decision. + # Look for evidence that the received buffer is either logical Hebrew + # or visual Hebrew. + # The following cases are checked: + # 1) A word longer than 1 letter, ending with a final letter. This is + # an indication that the text is laid out "naturally" since the + # final letter really appears at the end. +1 for logical score. + # 2) A word longer than 1 letter, ending with a Non-Final letter. In + # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, + # should not end with the Non-Final form of that letter. Exceptions + # to this rule are mentioned above in isNonFinal(). This is an + # indication that the text is laid out backwards. +1 for visual + # score + # 3) A word longer than 1 letter, starting with a final letter. Final + # letters should not appear at the beginning of a word. This is an + # indication that the text is laid out backwards. +1 for visual + # score. + # + # The visual score and logical score are accumulated throughout the + # text and are finally checked against each other in GetCharSetName(). + # No checking for final letters in the middle of words is done since + # that case is not an indication for either Logical or Visual text. + # + # We automatically filter out all 7-bit characters (replace them with + # spaces) so the word boundary detection works properly. [MAP] + + if self.state == ProbingState.NOT_ME: + # Both model probers say it's not them. No reason to continue. + return ProbingState.NOT_ME + + byte_str = self.filter_high_byte_only(byte_str) + + for cur in byte_str: + if cur == ' ': + # We stand on a space - a word just ended + if self._before_prev != ' ': + # next-to-last char was not a space so self._prev is not a + # 1 letter word + if self.is_final(self._prev): + # case (1) [-2:not space][-1:final letter][cur:space] + self._final_char_logical_score += 1 + elif self.is_non_final(self._prev): + # case (2) [-2:not space][-1:Non-Final letter][ + # cur:space] + self._final_char_visual_score += 1 + else: + # Not standing on a space + if ((self._before_prev == ' ') and + (self.is_final(self._prev)) and (cur != ' ')): + # case (3) [-2:space][-1:final letter][cur:not space] + self._final_char_visual_score += 1 + self._before_prev = self._prev + self._prev = cur + + # Forever detecting, till the end or until both model probers return + # ProbingState.NOT_ME (handled above) + return ProbingState.DETECTING + + @property + def charset_name(self): + # Make the decision: is it Logical or Visual? + # If the final letter score distance is dominant enough, rely on it. + finalsub = self._final_char_logical_score - self._final_char_visual_score + if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # It's not dominant enough, try to rely on the model scores instead. + modelsub = (self._logical_prober.get_confidence() + - self._visual_prober.get_confidence()) + if modelsub > self.MIN_MODEL_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if modelsub < -self.MIN_MODEL_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # Still no good, back to final letter distance, maybe it'll save the + # day. + if finalsub < 0.0: + return self.VISUAL_HEBREW_NAME + + # (finalsub > 0 - Logical) or (don't know what to do) default to + # Logical. + return self.LOGICAL_HEBREW_NAME + + @property + def language(self): + return 'Hebrew' + + @property + def state(self): + # Remain active as long as any of the model probers are active. + if (self._logical_prober.state == ProbingState.NOT_ME) and \ + (self._visual_prober.state == ProbingState.NOT_ME): + return ProbingState.NOT_ME + return ProbingState.DETECTING diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/hebrewprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..200261db46e21c6cae884d767ab8c09835080fd9 GIT binary patch literal 3759 zcmcImOK%%h6h1S4#d+DyqfJ{V1wkVhqZhg4vP;C$zf9n(szT-*2foHKXsJ&*64do%aP zhJX0*E3ZN6C&T}5@JL=};`7g_f;nuBYr{Y`h0VgwY*r4&xOrIN7Rb+&J4Akg+#>lywA0c;) z{84hp$sZ%PME*D&am(bFggHQdS(pj(4+t|!{)8}7*e+z0sslKypl)?@fJi;m4bI&nCkx)#@v= z^Ydq3nw?J&xf@~RcWxxJr%sRcx z*7h0<3$NX2h7A^yMkfyR%mYuahskd5A=dYH;^4Y~#aj9&0c-I4tc033B z{Xoxc3T(|5CwKM~mi?GVQf5Ndq*d(u_OgQ*Np`R?V;QOFF^q9rGz@dYFw%*u3psT{ zCdeky@d`Fms5w;tLC{r^iFl|`eFOFmaQmD`f~^RiWs6n=c473qI>^GUu2;8=4^p{Z z$Y7=dloh}uj)}R_G163;Rv_s%i8PAAdZZ8V{)`E4yWP4;#{s@b9G+t4f8x;0_D2BW)JVCr zqL$MT^ofW;pNJqJTDuK2kD{1K)5#9RHgcG>c`U*Q zL|VUjx;95w;p1?(6)ALCbKLKr0XWbVK(A3R&dRE{T-DReZiHbl`QO z_MWsWh0brfmo&4-A)=!R1eU6+)y37CbD^(I0Hm@;qGOHJG|OxP3FL}n&avW_t~YK>*3xx*IJr@-VhW(-U~Et+9Cr1ip>$x(bl z9%mRc-3~Ic#i@TSO`kw1M=b_~S*VcmGX_dnb%?gI6nA8Nq%-|;(+IH{{%gJL*C|kBlR>3M;h0G|^l+TV@1(SMU9z#+O^l-$} z@JcC|3$8I2^B%$ZEP-jSMa|u{W^jZzNq|MNAHH|Yv)VwDajE%Mn2}C#Dn-WwN;9F3 zKiu+Ry(4#hbA}&dSxR0#0S>)DJ;~&eT|= 0.77094 +# 256 --> 0.85710 +# 512 --> 0.92635 +# 1024 --> 0.97130 +# 2048 --> 0.99431 +# +# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 +# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 +# +# Typical Distribution Ratio, 25% of IDR + +JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 + +# Char to FreqOrder table , +JIS_TABLE_SIZE = 4368 + +JIS_CHAR_TO_FREQ_ORDER = ( + 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 +3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 +1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 +2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 +2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 +5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 +1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 +5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 +5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 +5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 +5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 +5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 +5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 +1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 +1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 +1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 +2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 +3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 +3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 + 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 + 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 +1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 + 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 +5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 + 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 + 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 + 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 + 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 + 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 +5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 +5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 +5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 +4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 +5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 +5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 +5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 +5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 +5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 +5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 +5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 +5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 +5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 +3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 +5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 +5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 +5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 +5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 +5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 +5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 +5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 +5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 +5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 +5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 +5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 +5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 +5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 +5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 +5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 +5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 +5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 +5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 +5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 +5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 +5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 +5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 +5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 +5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 +5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 +5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 +5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 +5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 +5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 +5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 +5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 +5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 +5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 +6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 +6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 +6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 +6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 +6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 +6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 +6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 +6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 +4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 + 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 + 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 +1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 +1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 + 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 +3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 +3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 + 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 +3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 +3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 + 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 +2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 + 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 +3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 +1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 + 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 +1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 + 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 +2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 +2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 +2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 +2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 +1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 +1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 +1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 +1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 +2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 +1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 +2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 +1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 +1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 +1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 +1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 +1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 +1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 + 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 + 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 +1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 +2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 +2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 +2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 +3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 +3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 + 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 +3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 +1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 + 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 +2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 +1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 + 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 +3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 +4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 +2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 +1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 +2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 +1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 + 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 + 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 +1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 +2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 +2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 +2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 +3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 +1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 +2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 + 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 + 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 + 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 +1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 +2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 + 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 +1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 +1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 + 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 +1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 +1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 +1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 + 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 +2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 + 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 +2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 +3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 +2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 +1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 +6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 +1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 +2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 +1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 + 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 + 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 +3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 +3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 +1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 +1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 +1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 +1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 + 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 + 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 +2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 + 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 +3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 +2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 + 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 +1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 +2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 + 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 +1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 + 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 +4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 +2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 +1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 + 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 +1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 +2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 + 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 +6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 +1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 +1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 +2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 +3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 + 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 +3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 +1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 + 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 +1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 + 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 +3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 + 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 +2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 + 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 +4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 +2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 +1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 +1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 +1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 + 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 +1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 +3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 +1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 +3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 + 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 + 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 + 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 +2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 +1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 + 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 +1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 + 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 +1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 + 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 + 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 + 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 +1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 +1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 +2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 +4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 + 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 +1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 + 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 +1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 +3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 +1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 +2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 +2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 +1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 +1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 +2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 + 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 +2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 +1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 +1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 +1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 +1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 +3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 +2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 +2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 + 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 +3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 +3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 +1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 +2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 +1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 +2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 +) + + diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jisfreq.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0d69d05ca96fc7c426ca40bb707e921a7dba18f GIT binary patch literal 44491 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 num_bytes: + self._need_to_skip_char_num = i - num_bytes + self._last_char_order = -1 + else: + if (order != -1) and (self._last_char_order != -1): + self._total_rel += 1 + if self._total_rel > self.MAX_REL_THRESHOLD: + self._done = True + break + self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 + self._last_char_order = order + + def got_enough_data(self): + return self._total_rel > self.ENOUGH_REL_THRESHOLD + + def get_confidence(self): + # This is just one way to calculate confidence. It works well for me. + if self._total_rel > self.MINIMUM_DATA_THRESHOLD: + return (self._total_rel - self._rel_sample[0]) / self._total_rel + else: + return self.DONT_KNOW + + def get_order(self, byte_str): + return -1, 1 + +class SJISContextAnalysis(JapaneseContextAnalysis): + def __init__(self): + super(SJISContextAnalysis, self).__init__() + self._charset_name = "SHIFT_JIS" + + @property + def charset_name(self): + return self._charset_name + + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): + char_len = 2 + if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): + self._charset_name = "CP932" + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 202) and (0x9F <= second_char <= 0xF1): + return second_char - 0x9F, char_len + + return -1, char_len + +class EUCJPContextAnalysis(JapaneseContextAnalysis): + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): + char_len = 2 + elif first_char == 0x8F: + char_len = 3 + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): + return second_char - 0xA1, char_len + + return -1, char_len + + diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/jpcntx.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa5c22afb8e8a66e52945ff1e60936836c9f9e2f GIT binary patch literal 25260 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py new file mode 100644 index 0000000..2aa4fb2 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py @@ -0,0 +1,228 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +# this table is modified base on win1251BulgarianCharToOrderMap, so +# only number <64 is sure valid + +Latin5_BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 +210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 + 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 + 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 +) + +win1251BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 +221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 + 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 + 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 96.9392% +# first 1024 sequences:3.0618% +# rest sequences: 0.2992% +# negative sequences: 0.0020% +BulgarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, +3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, +0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, +0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, +0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, +0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, +0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, +2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, +3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, +1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, +3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, +1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, +2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, +2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, +3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, +1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, +2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, +2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, +1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, +2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, +2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, +2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, +1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, +2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, +1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, +3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, +1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, +3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, +1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, +2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, +1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, +2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, +1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, +2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, +1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, +2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, +1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, +0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, +1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, +1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, +1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, +0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, +1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, +1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +) + +Latin5BulgarianModel = { + 'char_to_order_map': Latin5_BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Bulgairan', +} + +Win1251BulgarianModel = { + 'char_to_order_map': win1251BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Bulgarian', +} diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ddf22234df7349ec3036348227fea416745707a GIT binary patch literal 24959 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 I+28Q~4Q$;7oB#j- literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py new file mode 100644 index 0000000..e5f9a1f --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py @@ -0,0 +1,333 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# KOI8-R language model +# Character Mapping Table: +KOI8R_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 +223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 +238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 + 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 + 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 + 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 + 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 +) + +win1251_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +) + +latin5_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +macCyrillic_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, +) + +IBM855_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, +206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, + 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, +220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, +230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, + 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, + 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, +250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, +) + +IBM866_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 97.6601% +# first 1024 sequences: 2.3389% +# rest sequences: 0.1237% +# negative sequences: 0.0009% +RussianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, +1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, +1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, +2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, +1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, +3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, +1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, +2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, +1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, +1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, +1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, +1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, +3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, +1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, +2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, +1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, +2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, +1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, +1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, +1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, +3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, +3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, +1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, +1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, +0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, +1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, +1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, +0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, +1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, +2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, +1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, +1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, +2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, +1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, +1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, +1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, +0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, +0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, +0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, +2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, +0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +) + +Koi8rModel = { + 'char_to_order_map': KOI8R_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "KOI8-R", + 'language': 'Russian', +} + +Win1251CyrillicModel = { + 'char_to_order_map': win1251_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Russian', +} + +Latin5CyrillicModel = { + 'char_to_order_map': latin5_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Russian', +} + +MacCyrillicModel = { + 'char_to_order_map': macCyrillic_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "MacCyrillic", + 'language': 'Russian', +} + +Ibm866Model = { + 'char_to_order_map': IBM866_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM866", + 'language': 'Russian', +} + +Ibm855Model = { + 'char_to_order_map': IBM855_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM855", + 'language': 'Russian', +} diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7409eb0c3b5c5bcb8a7940e750a42a243eaf7af2 GIT binary patch literal 30679 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.py new file mode 100644 index 0000000..5332221 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin7_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +win1253_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.2851% +# first 1024 sequences:1.7001% +# rest sequences: 0.0359% +# negative sequences: 0.0148% +GreekLangModel = ( +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, +2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, +2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, +2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, +0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, +3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, +2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, +0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, +0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, +0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, +0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, +0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, +0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, +0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, +0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, +0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, +0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, +0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, +0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, +0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, +0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, +0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, +0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, +0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, +0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin7GreekModel = { + 'char_to_order_map': Latin7_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-7", + 'language': 'Greek', +} + +Win1253GreekModel = { + 'char_to_order_map': win1253_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "windows-1253", + 'language': 'Greek', +} diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langgreekmodel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4dcf6cd7bcbd7d0241a0c991d29f75de27c6305 GIT binary patch literal 24634 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py new file mode 100644 index 0000000..bb7c095 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin2_HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, +175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, + 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, + 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, +245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +win1250HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, +177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, + 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, + 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, +245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 94.7368% +# first 1024 sequences:5.2623% +# rest sequences: 0.8894% +# negative sequences: 0.0009% +HungarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, +3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, +0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, +1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, +1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, +3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, +2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, +2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, +2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, +2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, +1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, +1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, +3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, +1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, +1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, +2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, +2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, +2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, +3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, +1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, +1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, +1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, +2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, +1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, +2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, +2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, +1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, +1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, +0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, +2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, +2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, +1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, +1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, +2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, +2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, +2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, +1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, +0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +) + +Latin2HungarianModel = { + 'char_to_order_map': Latin2_HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-2", + 'language': 'Hungarian', +} + +Win1250HungarianModel = { + 'char_to_order_map': win1250HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "windows-1250", + 'language': 'Hungarian', +} diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langhungarianmodel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..12a046dc0ad064fdced5868655bbc7c38d230a18 GIT binary patch literal 24929 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 MxBaHS7e6oiH+QcacK`qY literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.py new file mode 100644 index 0000000..15f94c2 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.py @@ -0,0 +1,199 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# The following result for thai was collected from a limited sample (1M). + +# Character Mapping Table: +TIS620CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 +188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 +253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 + 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 +209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, +223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, +236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, + 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, + 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, + 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, + 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, + 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 92.6386% +# first 1024 sequences:7.3177% +# rest sequences: 1.0230% +# negative sequences: 0.0436% +ThaiLangModel = ( +0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, +0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, +3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, +0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, +3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, +3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, +3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, +3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, +2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, +3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, +1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, +3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, +1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, +0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, +0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, +2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, +0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, +3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, +2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, +2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, +3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, +3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, +3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, +3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, +1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, +0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, +0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, +3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, +3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, +1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, +3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, +3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, +0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, +1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, +1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, +3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, +0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, +3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, +0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, +0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, +0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, +0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, +0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, +0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, +0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, +0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, +3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, +2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, +0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, +3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, +1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, +1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +TIS620ThaiModel = { + 'char_to_order_map': TIS620CharToOrderMap, + 'precedence_matrix': ThaiLangModel, + 'typical_positive_ratio': 0.926386, + 'keep_english_letter': False, + 'charset_name': "TIS-620", + 'language': 'Thai', +} diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langthaimodel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18504983832a0542c256d4e8e5a654f77504dc26 GIT binary patch literal 23424 zcmeI4S(ltu8HFoEf<_SsR8#~fG%6t&HBJao6bX<-NKgn$)251~lAh?UMDZW^KfL!! zGLK$?SIk40=P4)zX9mB$4LrKn`D%TY?lgfFSvdtht9yo`2xCe;8WZ zdgDJIXtkDB@s!Zs*IH9?e{0R0R(D>jQ^i|aOFDB}?X9gP?QO00_9{D})!tEMJ6r8t z)qm}7wfD4^teM+t?`^GG@W;xe`?~O&@T%~NaFeh>*eJAxEy7k|n^2wB>Ru~s7j_6E z!l*DNj0-!3UBYhRYGFv25N;6m2z!Nn!hT_?aIvsVm=rD%ri7kwy>Pj3v#?31-lNrB zC#(>z5Uvw$5v~zd3af?nLRT0TekuH1_>*v}aGP+uaEEZGaFuYEaJO)eaIbKma6q_U z*epCCJSaRQJS^zb>|QCX5*`sA6&@2F7oHHF6rK{E7M>BF6`m8G7fuw;5Dp5b2`>nj z3hx#^A$(o(jED$~^ zd|LRN@KfP0!i&O7!Xe>h;l0A?!k2_k37--EDl8Vx66Ogf2^R{>g)a!d5dJ3oUHGB! zE#bSu_k|w`=Lr`HKM{T`{7m?V@K51i!oP*;?^aI_yLSEXhB{;GM!Hk$hekTRUT1Pjw_3ey)xsr<&+X~6(3w-6-q6_aXs4&=U%h^~+tasb zWO!`drr~v+6$@I`>;L!9jMuArI&B8=iu?vbgTrr<=>}n=&=$4` zTZL^xN4QqlF61JB5%voEg#AMQC6`Kav9L^-6fO~_ zgr0D{aJg`^ut``WtP@rUR|wY$w+Pn=D}~jYmN_bj$MtD|uPIz88 zQ8+_5D4Zs|AY3ZwpQ_`3Hdk-(q8{QU;gE0)|Jm$60Q8+)(5n8Grf==xe;3VF6mZv| z(LY63ib{Ugg(k>{c0nuIEcvIn03wTqVu)F%H7b# zEHC5+DbEzoNh6}t`>{By5tUY>>j(oPBn@hogcSy{0V!h^yW#t~LFyWkQa8l$YEF?j zV!u-4Gh#nE;eDdII8dDDnU`**G5<{@@k zTcc|Or$nT#`5?A(jq77Y&EmMe$C!<-Q(MJs|6O7=Oli0lDLcF2t*Egn>(X_^x=xv( z5wom@0TOp3rG|Y;f^%)e7!Tn!BE^7)Ylum0>PCPDej&ld4NtHnHFRO+G{!JM98pLj z4RI;uUA&~zh&<*R_dw?(BMk#mteC*mQNZ@pN>^~#4aB6b8PptkgXp@^0QlL3%al^K zcZ9f<+PT#5n7d(65>rFWEDzzD;hM*&MZ_2pv#vFO&p;OjUe{emB`}NFrg7<*Wy}$G z!zCpBHw`f7Ozb$0XTD7xLD$vC0-H< z2AI+%;%=TWsLf#HBfTka5K*K|5FuexYStOSAsWn!#YxK zM9pVdhuAfoxw&gGK`qvG!=~Zq)TTt}5F>GIrojar@gzjt&HHg9-YTM!j$4L-#kB~r zw+h58FNBWT3`X3NgV@D2B)*4hM762M!qlm^#~^e}IO1^9lEgZ|3zcegZAE&7kuTE# zT*hLb#7o3bR%+}vYMsiBM6NImNs+q;H=BTG2QQGnM71CC?@vF&Lby~szh3-{%M z?1Iiwq-@Vs(GlTHEhe1OWdk09#jT@3M1u(Dh!`W{3~DiENxi`W$rAF=h#im%X(gRaEk?(= zj*x_D$q$#>Zf%3dsdWhnsUvU7EZe)wE!hAAYK}@`>_a@AG)zn9_P6&HxIS04b98Ob z8J0L@4QjRL+BCYQnkCV&JqVZnDNFX(4b)}7xVamk^mHub2rD*-F&d6M5iTJaDD7{> z2S1Q$e=(P~JvWNeoU$J}+q=Pp(*Or~0s~BKz(LWdy$3oXwu%~!TEBrBwb$Y`?8n{M z00~Pv;&FJ5*oxWM0DC5|r#5&rGcIv1+uPoVw_<`z$Gb3VF)4nIunLJAn9>bD3`$Yy zjFPUl76v695+ZcGkh^@5oB}3@EDi&@j%$~TPrT3l;ooh3viv1_G< z$7n=E%Ffg{GM4l`qJ}{nNn_d(@5hq0YjB#yM%*YQk@~baC?utBspc_W4VQ=-NSa!O zGhx7ViF4_?;aO@vyKcV^f>m$Tv4)wbB}1m#>N?@fzV07mRM{jDcz;KOe~l8XMTYG*&v-v;D=q9|j&P z%~EsZ3B;uurd|UvvqB96YOujT6AeE721gz}iT8^e z`K?M1*8egr*;L2G5k{pYOSL1kZ!i{5*I?qf>R1zz_r@T#6;-~YIgAiwd2v@A7PrAhp7FaX2!mO3;*Eo zNfX%sNh#$k6*?NRM%cUCKwKIN=V_;Lg$91H)ogsAab)e1O?9;fv(cE12b+z1%=8)Y zP4s73`anZB_!=eC{x0vRkF56nY8&x5O?A98QCPhl)27#dJKk+NJI9CYwDb?o@%Q`R z|24sj$GgOHqN{BnA*vO}X-w2MkjzFj8*BJ+;)Q%})cU8h@fxKwX5)p9^0{x-6-w8d zt=arPa@;URM2b>hke+XQZd!gS=>X zr22u?Q{Ehs!rcW`srp^PH!!udiWc=oCl*a~Cl+?crh3C8BMTQV+whwuqbm9Dq0ODK z_W0x?{cLNy(_5q;Y3)^pqdM-Ki5vaPt>;zQrjgG1XH|w%XX~GUIsN{cH@{!^o!^@` LckY~%-u&x7TXnt* literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.py new file mode 100644 index 0000000..a427a45 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Özgür Baskın - Turkish Language Model +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin5_TurkishCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42, + 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255, +255, 1, 21, 28, 12, 2, 18, 27, 25, 3, 24, 10, 5, 13, 4, 15, + 26, 64, 7, 8, 9, 14, 32, 57, 58, 11, 22,255,255,255,255,255, +180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165, +164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106, +150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136, + 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125, +124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119, + 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86, + 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96, + 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17, 6, 19,107, +) + +TurkishLangModel = ( +3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3, +3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3, +3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1, +3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3, +3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1, +3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2, +2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1, +3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0, +1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2, +3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1, +3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2, +2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2, +2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2, +3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3, +0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1, +3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0, +3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0, +0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0, +1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2, +3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1, +1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0, +3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0, +0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0, +3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1, +1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, +1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3, +2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1, +2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, +3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1, +1,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2, +0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1, +3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1, +0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0, +3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0, +1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2, +2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1, +0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0, +3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0, +0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0, +0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0, +3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0, +0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0, +0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0, +3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0, +0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1, +3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0, +0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1, +0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0, +3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0, +0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0, +3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0, +0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0, +0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0, +0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0, +0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0, +0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0, +0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0, +1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0, +0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1, +0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0, +3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0, +0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0, +2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0, +2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0, +0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,1, +0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin5TurkishModel = { + 'char_to_order_map': Latin5_TurkishCharToOrderMap, + 'precedence_matrix': TurkishLangModel, + 'typical_positive_ratio': 0.970290, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-9", + 'language': 'Turkish', +} diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/langturkishmodel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3f8adfff3eadf7fc2234b263bd7552b8897afa9 GIT binary patch literal 23441 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py new file mode 100644 index 0000000..6256ecf --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py @@ -0,0 +1,91 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState + + +class MultiByteCharSetProber(CharSetProber): + """ + MultiByteCharSetProber + """ + + def __init__(self, lang_filter=None): + super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) + self.distribution_analyzer = None + self.coding_sm = None + self._last_char = [0, 0] + + def reset(self): + super(MultiByteCharSetProber, self).reset() + if self.coding_sm: + self.coding_sm.reset() + if self.distribution_analyzer: + self.distribution_analyzer.reset() + self._last_char = [0, 0] + + @property + def charset_name(self): + raise NotImplementedError + + @property + def language(self): + raise NotImplementedError + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.distribution_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + return self.distribution_analyzer.get_confidence() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcharsetprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5abf389c52af8d3c37da8937855dffa547ef0520 GIT binary patch literal 2755 zcmcIm+fEx-6x}l(93T(^1QOJXoJv*wP=Zvcl`5rC8*m$>VxqC5w3ezP+jB7E%*D(c zS0RFzl9x*ToqkPU`VH*|v}^4FnzVVT6wI8>KDRyVtg|mu`*U&rx1WDCLplG|@c&D+ zk|M(6Ng|SZ((}Y)-gJ@E? zMTqUge$lb+agh&f(eydI0KtBojXJLHtPbq;hlg=ytATZ_*qbIUet7KcYZfkn)6zq< zvIAj-cmcQPOLUEgc!?7PL=S{OXX^skM2qoj+O5E&J4@_bHYZVCm3av}%~=|6K+HGr zdovoH8WIW{x!gu8A3!)fo}A!~zKnqix(BX2l8R9SaFqh;Fzw68*Kq(9FiBf&cO5e6 zXCreEC(afzy3)J`;btJp>BJTxS2}_nF!A zY~kiGGt490fGJZq&)rGCbY_U#sxFB}N}C*nRGMg&D9QPjOD9{Cc(NI1rRyij<|n)3 z7oVjZ(q?|NS(F!Bv=&*nl@6$t)=kt4?oEzEddf#=C6SA_;mzT1NUveLWb!+7{>9`O zmVm%f!(M$;)2U4_jB6wv2{Np+27?hJ^-dVfilyE|FTG2_ZumBvAsE`;# zlB8}O@>bqHBaDhow33Q=tKj3Nwo6vX%r;jL3Rw9`UB08B+Ev7@Vy2zD-E@-J)Mm~` zt)j?_E5xnAdw#tp>!fdBXitvhWv?e z8(-&;S&+v^s~5W$b@wmA=^Ou@Ueal-hCv{>Nsm7bXcM`E@BN*apl@)+GSl6CYAZ6X zHZ99Zz+~hd&1n2o6M77+y+cDaxqbIy(W(I2Q<@AeP5PC|TZ(Z_-#WOkwN5}q)xAxf zFTW$t5RC&p^2M2s1{Z;P3o%IQ+vQ!z56cFgDnm35W7n|s+(zFu1}FlU(@53o690u? za|4?+4;Hvq>uTsGHq(gJjF#Ew&LBTI8}gEMX)6r(L&v*L^3e#1knfM|U^)tKKns^B z7-zbsz27x^EmbQ+s_u3>9Hm2jz5k@WV|Kf0rqlf@>^epu(3s)0C=h^}Q3;DNtBFL@ z^MSRIZc==jj(1w!)^>Nd{f#4tQSOY*^6BW%M17or=+tbU9mJ8%hSsfMsPkw)>~25l zn(m{ph0eD-%BZF&MM&;|y+AEOX|96xJnw7iT?&?hx%b-o{ia`Suhr`iE35Fa*)%ORJ~X7XSY8cIrRRRd Pq0 z>_gPIehb7N$bE?R(QgB1uw;;Q;2Piyz?-somehTWc{Lh`mCXO>NpNav4FA-T!I<_#RncigMi{SwQ?h*GV>K&ac%aC zspIrqECZ^qk7hxQur<&!ALMC%m}W}Pgg6|Ytv^4OL>Y@e@GRLBg9Vf=@ zbGi&=s3`*JkD>32k|Zh3_(hJFp(IIKv(OwbL&=f8zZcRUOOli~XXgKu%t-dciuCjj NuBGU&V~_1T?k}sd4jljh literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.py new file mode 100644 index 0000000..8360d0f --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.py @@ -0,0 +1,572 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +# BIG5 + +BIG5_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 4,4,4,4,4,4,4,4, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 4,3,3,3,3,3,3,3, # a0 - a7 + 3,3,3,3,3,3,3,3, # a8 - af + 3,3,3,3,3,3,3,3, # b0 - b7 + 3,3,3,3,3,3,3,3, # b8 - bf + 3,3,3,3,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +BIG5_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 +) + +BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) + +BIG5_SM_MODEL = {'class_table': BIG5_CLS, + 'class_factor': 5, + 'state_table': BIG5_ST, + 'char_len_table': BIG5_CHAR_LEN_TABLE, + 'name': 'Big5'} + +# CP949 + +CP949_CLS = ( + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f + 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f + 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f + 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f + 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f + 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f + 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f + 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f + 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af + 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf + 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff +) + +CP949_ST = ( +#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 +) + +CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) + +CP949_SM_MODEL = {'class_table': CP949_CLS, + 'class_factor': 10, + 'state_table': CP949_ST, + 'char_len_table': CP949_CHAR_LEN_TABLE, + 'name': 'CP949'} + +# EUC-JP + +EUCJP_CLS = ( + 4,4,4,4,4,4,4,4, # 00 - 07 + 4,4,4,4,4,4,5,5, # 08 - 0f + 4,4,4,4,4,4,4,4, # 10 - 17 + 4,4,4,5,4,4,4,4, # 18 - 1f + 4,4,4,4,4,4,4,4, # 20 - 27 + 4,4,4,4,4,4,4,4, # 28 - 2f + 4,4,4,4,4,4,4,4, # 30 - 37 + 4,4,4,4,4,4,4,4, # 38 - 3f + 4,4,4,4,4,4,4,4, # 40 - 47 + 4,4,4,4,4,4,4,4, # 48 - 4f + 4,4,4,4,4,4,4,4, # 50 - 57 + 4,4,4,4,4,4,4,4, # 58 - 5f + 4,4,4,4,4,4,4,4, # 60 - 67 + 4,4,4,4,4,4,4,4, # 68 - 6f + 4,4,4,4,4,4,4,4, # 70 - 77 + 4,4,4,4,4,4,4,4, # 78 - 7f + 5,5,5,5,5,5,5,5, # 80 - 87 + 5,5,5,5,5,5,1,3, # 88 - 8f + 5,5,5,5,5,5,5,5, # 90 - 97 + 5,5,5,5,5,5,5,5, # 98 - 9f + 5,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,0,5 # f8 - ff +) + +EUCJP_ST = ( + 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f + 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 +) + +EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) + +EUCJP_SM_MODEL = {'class_table': EUCJP_CLS, + 'class_factor': 6, + 'state_table': EUCJP_ST, + 'char_len_table': EUCJP_CHAR_LEN_TABLE, + 'name': 'EUC-JP'} + +# EUC-KR + +EUCKR_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,3,3,3, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,3,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 2,2,2,2,2,2,2,2, # e0 - e7 + 2,2,2,2,2,2,2,2, # e8 - ef + 2,2,2,2,2,2,2,2, # f0 - f7 + 2,2,2,2,2,2,2,0 # f8 - ff +) + +EUCKR_ST = ( + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f +) + +EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) + +EUCKR_SM_MODEL = {'class_table': EUCKR_CLS, + 'class_factor': 4, + 'state_table': EUCKR_ST, + 'char_len_table': EUCKR_CHAR_LEN_TABLE, + 'name': 'EUC-KR'} + +# EUC-TW + +EUCTW_CLS = ( + 2,2,2,2,2,2,2,2, # 00 - 07 + 2,2,2,2,2,2,0,0, # 08 - 0f + 2,2,2,2,2,2,2,2, # 10 - 17 + 2,2,2,0,2,2,2,2, # 18 - 1f + 2,2,2,2,2,2,2,2, # 20 - 27 + 2,2,2,2,2,2,2,2, # 28 - 2f + 2,2,2,2,2,2,2,2, # 30 - 37 + 2,2,2,2,2,2,2,2, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,2, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,6,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,3,4,4,4,4,4,4, # a0 - a7 + 5,5,1,1,1,1,1,1, # a8 - af + 1,1,1,1,1,1,1,1, # b0 - b7 + 1,1,1,1,1,1,1,1, # b8 - bf + 1,1,3,1,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +EUCTW_ST = ( + MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 + MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 + MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) + +EUCTW_SM_MODEL = {'class_table': EUCTW_CLS, + 'class_factor': 7, + 'state_table': EUCTW_ST, + 'char_len_table': EUCTW_CHAR_LEN_TABLE, + 'name': 'x-euc-tw'} + +# GB2312 + +GB2312_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 3,3,3,3,3,3,3,3, # 30 - 37 + 3,3,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,4, # 78 - 7f + 5,6,6,6,6,6,6,6, # 80 - 87 + 6,6,6,6,6,6,6,6, # 88 - 8f + 6,6,6,6,6,6,6,6, # 90 - 97 + 6,6,6,6,6,6,6,6, # 98 - 9f + 6,6,6,6,6,6,6,6, # a0 - a7 + 6,6,6,6,6,6,6,6, # a8 - af + 6,6,6,6,6,6,6,6, # b0 - b7 + 6,6,6,6,6,6,6,6, # b8 - bf + 6,6,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 6,6,6,6,6,6,6,6, # e0 - e7 + 6,6,6,6,6,6,6,6, # e8 - ef + 6,6,6,6,6,6,6,6, # f0 - f7 + 6,6,6,6,6,6,6,0 # f8 - ff +) + +GB2312_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 + 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +# To be accurate, the length of class 6 can be either 2 or 4. +# But it is not necessary to discriminate between the two since +# it is used for frequency analysis only, and we are validating +# each code range there as well. So it is safe to set it to be +# 2 here. +GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) + +GB2312_SM_MODEL = {'class_table': GB2312_CLS, + 'class_factor': 7, + 'state_table': GB2312_ST, + 'char_len_table': GB2312_CHAR_LEN_TABLE, + 'name': 'GB2312'} + +# Shift_JIS + +SJIS_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 3,3,3,3,3,2,2,3, # 80 - 87 + 3,3,3,3,3,3,3,3, # 88 - 8f + 3,3,3,3,3,3,3,3, # 90 - 97 + 3,3,3,3,3,3,3,3, # 98 - 9f + #0xa0 is illegal in sjis encoding, but some pages does + #contain such byte. We need to be more error forgiven. + 2,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,4,4,4, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,0,0,0) # f8 - ff + + +SJIS_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 +) + +SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) + +SJIS_SM_MODEL = {'class_table': SJIS_CLS, + 'class_factor': 6, + 'state_table': SJIS_ST, + 'char_len_table': SJIS_CHAR_LEN_TABLE, + 'name': 'Shift_JIS'} + +# UCS2-BE + +UCS2BE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2BE_ST = ( + 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 + 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f + 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 + 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f + 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) + +UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS, + 'class_factor': 6, + 'state_table': UCS2BE_ST, + 'char_len_table': UCS2BE_CHAR_LEN_TABLE, + 'name': 'UTF-16BE'} + +# UCS2-LE + +UCS2LE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2LE_ST = ( + 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f + 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 + 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) + +UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS, + 'class_factor': 6, + 'state_table': UCS2LE_ST, + 'char_len_table': UCS2LE_CHAR_LEN_TABLE, + 'name': 'UTF-16LE'} + +# UTF-8 + +UTF8_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 2,2,2,2,3,3,3,3, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 5,5,5,5,5,5,5,5, # a0 - a7 + 5,5,5,5,5,5,5,5, # a8 - af + 5,5,5,5,5,5,5,5, # b0 - b7 + 5,5,5,5,5,5,5,5, # b8 - bf + 0,0,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 7,8,8,8,8,8,8,8, # e0 - e7 + 8,8,8,8,8,9,8,8, # e8 - ef + 10,11,11,11,11,11,11,11, # f0 - f7 + 12,13,13,13,14,15,0,0 # f8 - ff +) + +UTF8_ST = ( + MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07 + 9, 11, 8, 7, 6, 5, 4, 3,#08-0f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f + MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f + MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f + MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f + MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af + MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf +) + +UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) + +UTF8_SM_MODEL = {'class_table': UTF8_CLS, + 'class_factor': 16, + 'state_table': UTF8_ST, + 'char_len_table': UTF8_CHAR_LEN_TABLE, + 'name': 'UTF-8'} diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/mbcssm.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05f4743aeabae989ff6f80f204934f47728c6d66 GIT binary patch literal 19116 zcmeHOZFAE`5MCw0d4Z5npg?(RAP^HU2?0DX!*q&MLjwsgwwcc8i^urvMob(sSoG~5 z^au4n^kcvGXY>zrcTdutWXX{%2TTw)=e@hVM|;oitxk4s{J+_mfB*ce-URob0q{M_ z-M^0m2z(o`1JE(RG{6v7z#M~?0dL2-oN!8UL~E2?QKi(3D)mt=I9)DUZl47+2jVK2 zlVBn27>FDc#UzL+D7LU?8b7c$gN;W)9D|}c1!57*Y0cyb@Xf%zn!xr+M@`IX`ns9% z<)}%=Y1gmfny35_)hjjo_v&c9vK-sn9;c=M*l4TTPr#f3aShC)?9yrJ(i769*h4Nw zUy@6|k}f?4;yReK*nIePHt6yK2bsNKE%0KQ~$MhPdAcHB;NY#LCSj7~^fD$caNbkMaC9M4b%qt-7 zfO(Zk!ntcH5_^cGtCA#KH$>7Rh&3>;xsyPi@ZyP9N*F70y3V9=PW+Y=QeERtyBG6H zkc>)WkPm$OK>}5UtYJzW+2tWqRcGruh`V4eFhH`Z}cn; zJz`v0;HtuV0p5dfmEjEJY;Ycl*mcqLDaMue^9!%^xpLHaFHo^+;@80q7d*BQC&&fDdydG(y{UN@e=Ws`)eMcwQiar19Uko&iflF zd)xnjxeVeym^V3H-H_=D?|HO0!X8RjH)XoQTOXyXTObyonlIuLt%Xmvkf*{vhQ(H+ zxoz#Xs&>O}Sy%^ajEV^=#<8%EV$s}bbh~xC@n)xm50}nJ+1PG0?RW24t4kPC%f_c> zXl^&&*LPaGP7^_vte@}OBPdbbPDl43om52!T8?VJtFDO@V z!pMq4L*YiUCmu9L5_nb>HGtuc}|T#7U5Lty+rovZJ=mQ#5g~QdMp*hqLU}q8kv8 z0R|kK4RfBDK1U){?9vtopGj8OQ5>*3_@QKC_TRGcf>RFzXAnz^M-Msdhaqi$J@ZmT>Mbm(I z3^3r>Y?$uz&x{QfIcX%`3#0+)KbEsf|2?|efqtqxtlIko5^`1z|Av`-p69PNl=oGN zRO^WN`!ctZ$s?zK@GDL;DPhj$?88ZBG{2 zKbkR_S#`*g%pq`S|2*lXNdD{l?72Jpy<0tNd@9Kwlk!+d*keK9@#~{i)h{)pDXFBD z=KH#X8_U0#s6Q!9E=}VM<;fi$%YOsOCu{l_>f8+A&Dxoo{ z;!lNzM`FH!gZX$-YxhH^TOlZ$tS@amybJSBBp2(sq&dUdT-_N;NL zjx}zlABe1R^@32FekiPJP}CU?MS3n2O$<+@J@6*R6=!0y!w*6elR6GW9vkrce7ER6 zL}|tD?5*rsdj)G3kM8a46xKH0{!#2u6aTOO(%Kd8-mlO(KGCvQI&YfYZs+#i@4R9j zb>4{&JFV|7AX0Z5Zw&KC@DEW^ymAu-W7Q~*=f-A?Nq)`jgP1$AYCQ5@r354Qvoklb zh_^2eQ45LY7uQO%GYN0|+EH`@_Q>_at9DB=>MQj%v+KETEl>#(91% p57k$f5P8YCgvblVaFLgdv&=7XOmVj4d@ehm#6GptC-wPP#sBXRj!ggn literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py new file mode 100644 index 0000000..0adb51d --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py @@ -0,0 +1,132 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import CharacterCategory, ProbingState, SequenceLikelihood + + +class SingleByteCharSetProber(CharSetProber): + SAMPLE_SIZE = 64 + SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 + POSITIVE_SHORTCUT_THRESHOLD = 0.95 + NEGATIVE_SHORTCUT_THRESHOLD = 0.05 + + def __init__(self, model, reversed=False, name_prober=None): + super(SingleByteCharSetProber, self).__init__() + self._model = model + # TRUE if we need to reverse every pair in the model lookup + self._reversed = reversed + # Optional auxiliary prober for name decision + self._name_prober = name_prober + self._last_order = None + self._seq_counters = None + self._total_seqs = None + self._total_char = None + self._freq_char = None + self.reset() + + def reset(self): + super(SingleByteCharSetProber, self).reset() + # char order of last character + self._last_order = 255 + self._seq_counters = [0] * SequenceLikelihood.get_num_categories() + self._total_seqs = 0 + self._total_char = 0 + # characters that fall in our sampling range + self._freq_char = 0 + + @property + def charset_name(self): + if self._name_prober: + return self._name_prober.charset_name + else: + return self._model['charset_name'] + + @property + def language(self): + if self._name_prober: + return self._name_prober.language + else: + return self._model.get('language') + + def feed(self, byte_str): + if not self._model['keep_english_letter']: + byte_str = self.filter_international_words(byte_str) + if not byte_str: + return self.state + char_to_order_map = self._model['char_to_order_map'] + for i, c in enumerate(byte_str): + # XXX: Order is in range 1-64, so one would think we want 0-63 here, + # but that leads to 27 more test failures than before. + order = char_to_order_map[c] + # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but + # CharacterCategory.SYMBOL is actually 253, so we use CONTROL + # to make it closer to the original intent. The only difference + # is whether or not we count digits and control characters for + # _total_char purposes. + if order < CharacterCategory.CONTROL: + self._total_char += 1 + if order < self.SAMPLE_SIZE: + self._freq_char += 1 + if self._last_order < self.SAMPLE_SIZE: + self._total_seqs += 1 + if not self._reversed: + i = (self._last_order * self.SAMPLE_SIZE) + order + model = self._model['precedence_matrix'][i] + else: # reverse the order of the letters in the lookup + i = (order * self.SAMPLE_SIZE) + self._last_order + model = self._model['precedence_matrix'][i] + self._seq_counters[model] += 1 + self._last_order = order + + charset_name = self._model['charset_name'] + if self.state == ProbingState.DETECTING: + if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD: + confidence = self.get_confidence() + if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, we have a winner', + charset_name, confidence) + self._state = ProbingState.FOUND_IT + elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, below negative ' + 'shortcut threshhold %s', charset_name, + confidence, + self.NEGATIVE_SHORTCUT_THRESHOLD) + self._state = ProbingState.NOT_ME + + return self.state + + def get_confidence(self): + r = 0.01 + if self._total_seqs > 0: + r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) / + self._total_seqs / self._model['typical_positive_ratio']) + r = r * self._freq_char / self._total_char + if r >= 1.0: + r = 0.99 + return r diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sbcharsetprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2d7cb4505ae9bc22e69bf4a72eed6c33c28010f GIT binary patch literal 3634 zcmcIm-ESL35T8BUN$ey|Kirh?AxxoQ)RrJ5KuCqOO`Q)Zb;{WV5rI~Yy*ZzAzH{z2 zZBvq`^o2hG{)4{sjlYH`UXc0#RN@s0elzPNjc9plec8$G?Ck7(?abuDB4ie$%l*tM58`W`K7G7mQd7@xLet*mb zKmEwRhjVRUd572v^B7qOVDYDD7l!nx=dn4}uB>&Ac0JzEdD_JslLD*3lhK0-BzBnM z!31(U%s5l_CWIqU4e?36%1*HbzI}UOQa{hjF#xT@IJ8<@cB1Yl9TV9iPg8Tpq?zf6 zhjiTP8$A$jT0UD(Vq;lz9knv6leA+}alFpVmTo88F`S$^3Y*wg#Q0h`XlwegXNkGO?Fl+mR*+DqC9L5<0h%SG$+`Iot zpHVXO9TRtwbe3=K7(1J-^9+|eH9r{a_-vE+FtRcLsWYnR;ZsLnn**N5p>My$;u*e0 z1hNAq2m?j1VXwe0Dl-xfS+fI z^8g&R@a>u5q^GFCD0#dyjSfdL)7K>)hn|wK6yx|Dv;H)LQGl1J7hf`mk#Teov?@JA zBaWKqYScp*DB6dHPpQR`9kt?MyA>D-f2R`XJyFTBYvI+GsTyClfbq0yY;-m*N1Hh7 z3F6(U1|?>)H)VnF7LE24#n@JqT@t+KyeM^LX3wL0e-jjOv^T!{gTD1>FGqVwb%^&o z&FmFuw=jGjn+S(J=92H>h2-c{4=;teg9ec?N=$H32>~9A5RA!I@xKJfk3vwAt#QhJ zKSo&w({qqys2C(c?w#4geHV`IfxS+%9C5b`o!dvRnDQav{4^ zxoaxj)*Vx6Rqlpyj56}sa|qW>l-#YvCTQ6Z^jSAaZF}2RY!^kO+fAYl_*GxQY4?I& z#cU&tATf#_V2pD~jM{V;^(%ALQF;)LcZ2L{Qe;nGni|e3^Q-lyzq%snQ%YOo+Ra-l zHQiWVt4TU_IapFG8_Z=~en3)EZ`7K#`Q~zc(KR#Ib*;X7dvQtowH4i5@@tKy)s-8T zb2BIJBeU4ofV#EXSZ*$Vh0B&!{pS4b=2J&F5k*N5z!UsRJ7#@5kmA0udb@r@FE?Fr zM-@bW#mwrp#cTh^tiIaRH)~bNsaza{**f|zo!Qi9Gop7vEfUz4OQi$wxp@=kN@YJ% z;e}ThX+k!P>Dj>3URj+|GiuUfy3=X`_z6`K znhBM|S5jwPCTEXvwv}{;B*WPniH)C%Br<-Q0p}COpqQhBL$Z+UKy;RoXfu&Q&hjC5 zt{{~jd2EQo;mv|@DKP7;V3;;tGhGk9FF#uR_5Opo5VupnfauAb<=SI+24NdPJ4mvS z<6a|3!z5t(@}ocJsvN1V%uB&%MZ|vx5hQQHg)7IJR8?sK#GC00ca{G(Zh=uKn>tY}O^r^C7H8|?6={%2jY=!Dj)a(-)!Lpq>&~pL-Eko( zy$Uxx5O2aAuh6@`K+l=+rb#Pt1-9q-{OX3Dq24n-K3EA}C8_=6DEyxy38?x=S z73eLP4rB+W3)%JBD)cr?53=Xw8uSj#F66G4>(F~JeaOC-8_@eO2apFOH=zVx3QRZg z2XF)YB0s~lh0&l*jirLffQju9IlD~qk+M(n#cKIez8I_A+xE#eO0$_(r&m_3z19v@ z4&Ej5bDA9;50B2S@>J_|@_aE>+BV7XY>__7y|_c-kBLpQ;eEF*>7OT)`^rsHo{!C= zlM^3Y%EO_P2LahFN4h6|`y^NDmG|5xr7!234_fcfmHG-!S9+G@X_EPvz1x_h`xZZf z4w)~`M<>T$UtA`sFW`1=KG*Q68t3ZQJGK@DdF9<{@}zwU7pweLT3q@9IK$}lY;D0MW=*IANa+I=t62I>lQemVN@)wD|z@fcGzK2)ltB0cI*C zQ!SZV$<#}xQ8LYv*({k>$+Symt7JON%vzi~?!s;iZG9zA+WtXLUJ&I_HwLEf{@^PXIMbjm$ zSA(5E(4BnfrZj9EkE$mp=lju8J>DEODBnr?^_tr zuhU}nv0*@ZI8rcl4y{=pF4N_MG%IYP^@HQ{`R^x&Rqn*Esh~xEIH5aWs_bDgo)j~_ z2z=QOmsb%3_bWOD6NsIlAwKz58lp$~s%SY|S9C-(81SIiOUM$V;@DjbF%M>?Npz3? zQ1E|RH3Q&FIt8!1Dqaje=VG`QZk1+#r^|@6u)Jhy-&=kA4m56`I>}~}^&RK-`tMM( z3=oc)@%7{b>ZEe$a#gT#T;4_A;TCib2<%|#((yKip{tP99tqyyK*(0FT-VL%-6iRs p;_n;p&t1B= self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/sjisprober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da00f9bd4829ba145acb4bf91665ec742e9eb82e GIT binary patch literal 3027 zcmb_eZEqVz5S}}~#d&F(gd`0hH5IL72}%$`6+#8kCV{3RPIY#LY6+b#_QpB)?(E*J zQBt)M5`018m-HJS_%-|tz5~xQYo|fsqwU+d-I=-FnP+EaxAfQ2{GY%65q4$rE8+b$ zTJaM|5058_Na{()6OUtG5?|7ibV_bqlB6tYMLHEXE=y9Cv?iUJ8&@Qmle8|Kx*Jy| znU{1yIt!96N@o$=nix+`Jn7BJFCssSJnJk;uP&{|JdB7vkOqm}0682dHhy?+&F*QG zw~T#~506dmD^2XU55HK-PME(AtX&o5#mv8xOMwS(Ka?ap5%9 zCK|iL%$hU%U*Xb37`6_>!=t_Z?;1Whb`gXYOqW!~WL>qv(gm*T?7YC4Uq3`E9)lPm zyg(Q3cYI>bPDxCecoP%gU(sP{I;={stZFssRkSlFL90>4bX|hQ#?9PCD;|MZJf6J5 zWWEf1!tB|S*fJ*vH>`-QlFNQg?A)|pCucCPAHc+xg4Jv+aLNiNACF8P)Hs|23Bx#x zZ5ReLASjbv2kGjzghd)CZtGz6F6~4ZaVuV8BHC=P>leBW7ZP18H-)ioyEt`Wl9LAB zqNMl|y&ap5c1H2&Zk!c1N|L*u9t>XIOUcp}{%Eq^FyHASe0s+26oa@JX$*ZlIuB^- z9khbmCf=I2>@DJd717%e{|};ssx*c75?VAiAUq0Gz-S5>JL*bsjXkuPxxx8ALMyl~ z-MDaoyP_dM2Wc%H?_yKAH)@y0F(CrnVHTw>iDqx;G8X&DVyUp12sARk(qZcUA_ z$I&Rt5C;x14YOGTsOuzA)*nZG^Vuc)XeNW6X{Ip#j`h!)-Xs(}CKH~$AHMKj`-(4; ztt79IV!mua@)`rpxd8Qd9gPAdP%?j zO(?#0RlKZXXk&X}!F6Wu>oVs=LE*Z8(&g^UP1V8&Qw{is=X;t~y)eyprmd^58*2TV>8hJ_ zEO)~j?99JH<90R{*w8W4mqge3)-XcKaA-3}i8s z+!+*e^Wzf9KlnA?Mb8x_1d2f|6-i7MFtN1iXE;Pc)F5jDhKs812fNJnq;o-h^-9*|wXt&5^HTmY~X>%_;XzMhs_Jg2pd5XcBushCk zli`gdhFNM+m_&u+xFlzCofy*#-WGG3s|9;+zrDZPK4^YxX;^<~Lz4~1{nM})L5B&a zs|>S~xM#Aiu{?ZRkB)-&?$dVIeiZCu@ZDa6&S>3Gg9$2J$#D_^MptDfCxfm`r)Y5q zlV@5HZ(`!l(TaN@;%#{wTH4o8+{@Y{WwBrJHocm+DzUN)@SNv7**S%F&oVd$u zyJ*FSAPhJ>NPA?M%U~p&8~TE%aJi2Znx33`7O?mSACM^aoHC8h8hksnsL*vckr3|_ z#cFb7Dr2Vb(2{3p1w&I5iU!X@-Lz0ofG~716sE)8I59Zksh~%hY9WVk5wPc%0-2zz zlW%R+-V6?EX7Fvaf;d&ZdaYhw#=m~6*a9IEV literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.py new file mode 100644 index 0000000..7b4e92d --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.py @@ -0,0 +1,286 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### +""" +Module containing the UniversalDetector detector class, which is the primary +class a user of ``chardet`` should use. + +:author: Mark Pilgrim (initial port to Python) +:author: Shy Shalom (original C code) +:author: Dan Blanchard (major refactoring for 3.0) +:author: Ian Cordasco +""" + + +import codecs +import logging +import re + +from .charsetgroupprober import CharSetGroupProber +from .enums import InputState, LanguageFilter, ProbingState +from .escprober import EscCharSetProber +from .latin1prober import Latin1Prober +from .mbcsgroupprober import MBCSGroupProber +from .sbcsgroupprober import SBCSGroupProber + + +class UniversalDetector(object): + """ + The ``UniversalDetector`` class underlies the ``chardet.detect`` function + and coordinates all of the different charset probers. + + To get a ``dict`` containing an encoding and its confidence, you can simply + run: + + .. code:: + + u = UniversalDetector() + u.feed(some_bytes) + u.close() + detected = u.result + + """ + + MINIMUM_THRESHOLD = 0.20 + HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]') + ESC_DETECTOR = re.compile(b'(\033|~{)') + WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]') + ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252', + 'iso-8859-2': 'Windows-1250', + 'iso-8859-5': 'Windows-1251', + 'iso-8859-6': 'Windows-1256', + 'iso-8859-7': 'Windows-1253', + 'iso-8859-8': 'Windows-1255', + 'iso-8859-9': 'Windows-1254', + 'iso-8859-13': 'Windows-1257'} + + def __init__(self, lang_filter=LanguageFilter.ALL): + self._esc_charset_prober = None + self._charset_probers = [] + self.result = None + self.done = None + self._got_data = None + self._input_state = None + self._last_char = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + self._has_win_bytes = None + self.reset() + + def reset(self): + """ + Reset the UniversalDetector and all of its probers back to their + initial states. This is called by ``__init__``, so you only need to + call this directly in between analyses of different documents. + """ + self.result = {'encoding': None, 'confidence': 0.0, 'language': None} + self.done = False + self._got_data = False + self._has_win_bytes = False + self._input_state = InputState.PURE_ASCII + self._last_char = b'' + if self._esc_charset_prober: + self._esc_charset_prober.reset() + for prober in self._charset_probers: + prober.reset() + + def feed(self, byte_str): + """ + Takes a chunk of a document and feeds it through all of the relevant + charset probers. + + After calling ``feed``, you can check the value of the ``done`` + attribute to see if you need to continue feeding the + ``UniversalDetector`` more data, or if it has made a prediction + (in the ``result`` attribute). + + .. note:: + You should always call ``close`` when you're done feeding in your + document if ``done`` is not already ``True``. + """ + if self.done: + return + + if not len(byte_str): + return + + if not isinstance(byte_str, bytearray): + byte_str = bytearray(byte_str) + + # First check for known BOMs, since these are guaranteed to be correct + if not self._got_data: + # If the data starts with BOM, we know it is UTF + if byte_str.startswith(codecs.BOM_UTF8): + # EF BB BF UTF-8 with BOM + self.result = {'encoding': "UTF-8-SIG", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_UTF32_LE, + codecs.BOM_UTF32_BE)): + # FF FE 00 00 UTF-32, little-endian BOM + # 00 00 FE FF UTF-32, big-endian BOM + self.result = {'encoding': "UTF-32", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\xFE\xFF\x00\x00'): + # FE FF 00 00 UCS-4, unusual octet order BOM (3412) + self.result = {'encoding': "X-ISO-10646-UCS-4-3412", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\x00\x00\xFF\xFE'): + # 00 00 FF FE UCS-4, unusual octet order BOM (2143) + self.result = {'encoding': "X-ISO-10646-UCS-4-2143", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): + # FF FE UTF-16, little endian BOM + # FE FF UTF-16, big endian BOM + self.result = {'encoding': "UTF-16", + 'confidence': 1.0, + 'language': ''} + + self._got_data = True + if self.result['encoding'] is not None: + self.done = True + return + + # If none of those matched and we've only see ASCII so far, check + # for high bytes and escape sequences + if self._input_state == InputState.PURE_ASCII: + if self.HIGH_BYTE_DETECTOR.search(byte_str): + self._input_state = InputState.HIGH_BYTE + elif self._input_state == InputState.PURE_ASCII and \ + self.ESC_DETECTOR.search(self._last_char + byte_str): + self._input_state = InputState.ESC_ASCII + + self._last_char = byte_str[-1:] + + # If we've seen escape sequences, use the EscCharSetProber, which + # uses a simple state machine to check for known escape sequences in + # HZ and ISO-2022 encodings, since those are the only encodings that + # use such sequences. + if self._input_state == InputState.ESC_ASCII: + if not self._esc_charset_prober: + self._esc_charset_prober = EscCharSetProber(self.lang_filter) + if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': + self._esc_charset_prober.charset_name, + 'confidence': + self._esc_charset_prober.get_confidence(), + 'language': + self._esc_charset_prober.language} + self.done = True + # If we've seen high bytes (i.e., those with values greater than 127), + # we need to do more complicated checks using all our multi-byte and + # single-byte probers that are left. The single-byte probers + # use character bigram distributions to determine the encoding, whereas + # the multi-byte probers use a combination of character unigram and + # bigram distributions. + elif self._input_state == InputState.HIGH_BYTE: + if not self._charset_probers: + self._charset_probers = [MBCSGroupProber(self.lang_filter)] + # If we're checking non-CJK encodings, use single-byte prober + if self.lang_filter & LanguageFilter.NON_CJK: + self._charset_probers.append(SBCSGroupProber()) + self._charset_probers.append(Latin1Prober()) + for prober in self._charset_probers: + if prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': prober.charset_name, + 'confidence': prober.get_confidence(), + 'language': prober.language} + self.done = True + break + if self.WIN_BYTE_DETECTOR.search(byte_str): + self._has_win_bytes = True + + def close(self): + """ + Stop analyzing the current document and come up with a final + prediction. + + :returns: The ``result`` attribute, a ``dict`` with the keys + `encoding`, `confidence`, and `language`. + """ + # Don't bother with checks if we're already done + if self.done: + return self.result + self.done = True + + if not self._got_data: + self.logger.debug('no data received!') + + # Default to ASCII if it is all we've seen so far + elif self._input_state == InputState.PURE_ASCII: + self.result = {'encoding': 'ascii', + 'confidence': 1.0, + 'language': ''} + + # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD + elif self._input_state == InputState.HIGH_BYTE: + prober_confidence = None + max_prober_confidence = 0.0 + max_prober = None + for prober in self._charset_probers: + if not prober: + continue + prober_confidence = prober.get_confidence() + if prober_confidence > max_prober_confidence: + max_prober_confidence = prober_confidence + max_prober = prober + if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): + charset_name = max_prober.charset_name + lower_charset_name = max_prober.charset_name.lower() + confidence = max_prober.get_confidence() + # Use Windows encoding name instead of ISO-8859 if we saw any + # extra Windows-specific bytes + if lower_charset_name.startswith('iso-8859'): + if self._has_win_bytes: + charset_name = self.ISO_WIN_MAP.get(lower_charset_name, + charset_name) + self.result = {'encoding': charset_name, + 'confidence': confidence, + 'language': max_prober.language} + + # Log all prober confidences if none met MINIMUM_THRESHOLD + if self.logger.getEffectiveLevel() == logging.DEBUG: + if self.result['encoding'] is None: + self.logger.debug('no probers hit minimum threshold') + for group_prober in self._charset_probers: + if not group_prober: + continue + if isinstance(group_prober, CharSetGroupProber): + for prober in group_prober.probers: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + else: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + return self.result diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/universaldetector.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2ffbcc48bc7b5456be1168f0537bf726250b5e5 GIT binary patch literal 7091 zcmcIpTW=f36`my}N~A87<(nMmvQFcMZY(*nY}s)xj&-rERFd7L1UD+2<%&Bbms;*p zJ4?$-?4W4UhrIPEK#Kx>Z4sa-Q1r1spnsq!kiHe@OI}j+F=*WHoY^HM*-l^TrFM2M zXU?2CbLO0HM%jOl6u$iIPj*!#PZr;I@v1){afR4GY6v$Yd_!y?qw^WDkxBDev5^%n z{`!R9CtCetqhA%ENS6nMKP*}!Vq-*? z2ZcW>T1Bx@)aAVJ$3*Lp*f@l8LCA4YgCs-ZQz1SP;{A=oBx1QVOp+fpgea_pZpW8q zH4I|M3%sCi#tmt%2i`pyDaT)sv8={nWV&gl>N`rEHFp|bwPAXS$=i|Fa-!V=x0#OF zQ8F^anpvq-8%~6-m5QkvVaIo=X{u1T;&kFh7+o<}oM_9u?fG?ZFiQ|1_8i}Ahf!?C zp?P~3RKb}ZdAYG`mK%;Af;f!4x)*?Y9@4vV57mMbm~*}p@Ze^t-*c!A8eoA-+u96`|SSq*@Nvf``a%aY`?g_{qn)~3;WyOIM{wk4eguXOf`dY z`pzS-wvk|SJrKe+L|tdF(R2pRUuXK#47QT4$)%YA@xb8jgCfq0Wz5gcM>1}TMr53bua?F9#@9M<8o>&yvzW*J5J$3g072M$ct z=7EU}_2f$JhNJ8qFVIFDlleg`8J9@OESi#j%_4tS!mAUtfZVyb)jrqu+LK-Y`Fwx! z{8ID7*%nptYu}Tw)94&&1BQRDlZHIK3&Losy_<+eVac|C1g7d34PxXE{KiqPk~1c$ z$h-2=e};^QCB{-3aC%tvEIugpiCJwAafa71E0RoKn&}r%L=#I74X}fyOrBS{AfkGb zf$O9d4}`dXlBTvp=o z%uT1dMS&T9(Tlo_(y+~Tpr*(-0~p}13KnoDo4fFhHjIVTSgD*fRmhGn4E$X)fS&@( zE;H%_{^;#`5wHhHyujR)@s5-Me5m8^DmZ93=bmGB!)m7m4-J=`IzV2!)b(QD>4&3r z&;K$J87W2Um`GMjBStoE!x-0^Giz>Z8(ee zlSK{IaY|?(u(etf$gzEEZ9W5gjfs0Wu=rWAd5HaF^MyNL_gCd$?X0SZ!+9%XU2AN!HwrGuZ*!B~nhkxtW zwm+b4e^3N}V=L8N@@($~QDe{%{gL~^@M*(5sqe3oz5p9E)<2lO@N{}VrDxw69X4oR z!hJrC|66-x8)DgpQ`v5DU#RM7eX+>wkL^BI4$tBQ6uXrd(MLwo#;1jHqQ9bm6K)<7 zTNx33WspY4Me{I;K$H8uL9IuKnOzjyn&9y+N4X379;1%OspnVR^LVc(jR&kZDqbRH zAOyMQbesqOd4_5xgeqm?6Wsb-8fzxf#hwsNI2#r%eqJyQns2WLM-gAPu>jj^TSZSDRH5^UYK@&8sRERCP<`j@t8x_lH01RjV8VW4Cou7=~TVVv$4UBQt#5oQ8Fj>F= zv*oxF+Gs~$)I;tx85|s0)JjETmP*C!%5^4z=|l%W9fYw2pr%styblPT98Mj7$Jy0k z3o2oV3|2c01Rm(+RT2xc?@k4yqPiCc!LYkj5IfZsMM4aVg^Hx(QY>7HI?!P+Sgk4w zIO}WICofNymu^_kp_Ig|udiAsQL(tJsGIzDr>r7�goF?2H$lcd7wn}q=9U6$g0hTW0V?bs+Ti75 zJYdnBEQYWI%T{l#+Vk)IkVSRcZQxRisx3mhe3ZYlw7P#*3_0B|XNxvs`eI{=l1{@ja8#l&{ zBHk0mcxEI=5c;Tb(#RSknX$}aqd34dnK9!Seq+XjF@oP1s0PueO3O}rhV(R#SG@ym zlFJ2*8RHBg84a&>LsqDZ+@NnaIDi?!G>6-qhzCS-ki$;nJ8=sz&$rA)cgb^?ngJ{U zIE3pD#1hJ9#r*{)8v-JKLp%f&07&|+*#4ZuC`1^hXrz%kBFt8wh(4#NO0lSq`hyaG zcOGO#R5L(9a~okg6ti^Ld)O~@1|ghy<+!N%;^cty!+PmGU$3a8NuL6zb2$_7}u9o}eON2SkbnGxtBBV)HrZ?={vR=C4@|k%lmT zN`Z=y@|-{E!(r#I#vO1YUHxy`FF<=KlRyMm3nPEE?}Sv2!?r$he3*nTv)YOHE~xA1 z_03UBnw_>up3ij58eL0vLrgDT?TJKJA{lq0KwU{MvK|jyXTb>}L|-W}XNtyKa#wX( zry&gAN_y5o46pQj4oW0oB|YTq2|9`n%|XbK7RaG0apmit;sXzEK|Sv~qfio^u<^+C zq&Gau)GX8EVgr%8g=1f<(;~Pc5oUc?9R<;8W#X?VC$5}MtJM;RIzDJoh_GIxgrbW@ zeONSCZg%SWpw)H#))bNOnT<|c)&(M_*{v+CF0HJu*lRbf#q!Nt%L~>FHIZNS!yOq} zuOP?1l&>ogKW%cgE7xvw;Dh^SpUu2bSj0sjfX6+#EbmF*qFZ6+wXit1e#3g1c;O{q zB1EEs5=+G=KN3jS?uiL8O|0eIPcCEjwovTpwXj#$;?uY+e)raf0uI9j4nuXiqD~k- zgE+ubW^D9#2%;)TL>>;^$dhZ&jvMU$@y+pXjMHHRh8!IDQ8@6TF`O;pi%`L|$FdU$ z33NK89z}eKHfJ0`c%kocqr_)wI@2=DujsjZ-Z=MvyHT=eyO0qoGM8L2m!TQc zkF?hN6*9$<{GoiSM3c6bC^=0Dt-bXg5{5eo;NS(!-cy`|Ux9ooKp T)sf4RfeiyKJkN#%W6J&)CL~3H literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.py new file mode 100644 index 0000000..6c3196c --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.py @@ -0,0 +1,82 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState +from .codingstatemachine import CodingStateMachine +from .mbcssm import UTF8_SM_MODEL + + + +class UTF8Prober(CharSetProber): + ONE_CHAR_PROB = 0.5 + + def __init__(self): + super(UTF8Prober, self).__init__() + self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) + self._num_mb_chars = None + self.reset() + + def reset(self): + super(UTF8Prober, self).reset() + self.coding_sm.reset() + self._num_mb_chars = 0 + + @property + def charset_name(self): + return "utf-8" + + @property + def language(self): + return "" + + def feed(self, byte_str): + for c in byte_str: + coding_state = self.coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + if self.coding_sm.get_current_charlen() >= 2: + self._num_mb_chars += 1 + + if self.state == ProbingState.DETECTING: + if self.get_confidence() > self.SHORTCUT_THRESHOLD: + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + unlike = 0.99 + if self._num_mb_chars < 6: + unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars + return 1.0 - unlike + else: + return unlike diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/utf8prober.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3fdcc91cce3314f94b54414ca2b8db981d3c7f2 GIT binary patch literal 2476 zcmcIm&2A$_5Uw7N|MIhml3fG{0TL4OfeA9{(_LNDRrS?RyYScY!mmI4Yf8y*ZxD{Lmt^76H9QLz3zAb zf{kad839auvPB9D;t``$lBGXemWjQFSY_%pd#r<6nGfyr;NNfCJ@||P%EiL`I2vz6 zN#?r4;l?L>gXf>cV97Aw*(4mLn>aJHZgb*Jw#E|XkH_a4(0s@vgR!L6)rzXB*CE>A z&3}OiP!wi(ai{>052OM~p=N|bYXC!+KxDRv8PsVcgZQSAYjgDrNzZ; z<&qq^EZ<*=dAIN}wpQrWr}XL{I?t{s$#<7H9SZDTGlJK7mt5tUWUREW#6EL|OU+pg z5h>G#)-A0O6^Ddtw%X>PA=6w^rhDxGT%i1@b=2H3du{nRXg| z*Xz(GQY3k2ktU4pvD0Wb>g~PeV|Q!z(I`2ILYwrgLq867Te@98YMb`1Zt!A%r-s-` zHjDn_b7$GIlzSdGqdY06EeTrYS&Gu(POJ^lX0vyh5EtVbH<~5oU(-A4EpJWTQEPb> z09Zt!&O`b$NBvUz%Rnx}Q=;@P@(%%>@z?LMNXV(D=*@sh5TX&m@n-+kVBA&} zuZHFH@<4|$M$*ohcoa^CywvZrfOKw+HYcLo(fQtS=Nf+K6_EEppyMW*GMmG#flm1W zj|}-&QYEiisuoxL6~DUP%*}@x(>9l1HkuiEtysR~GO3lkevq*FeJDj0=l?L|!W87= i<6f4y-cYM*)&CnNj`GF; literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/version.py b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/version.py new file mode 100644 index 0000000..bb2a34a --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/version.py @@ -0,0 +1,9 @@ +""" +This module exists only to simplify retrieving the version number of chardet +from within setup.py and from chardet subpackages. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + +__version__ = "3.0.4" +VERSION = __version__.split('.') diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/chardet/version.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/chardet/version.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85f279aa2541f801fbc49c1d60876ded710760dd GIT binary patch literal 426 zcmYLFK~BRk5Oh)~D2O+($8xBH0CA`gst_D{DH25-dWqcFZCqkIvNwft<-~gsui+Vd zfK3R((vD}=v-0ltz7LbH_s=Y6-HGWQQ-mV|$=IAQV)KZph^=ELWA;X}$7GMq20M-M zgCKb*bO7UIT`Ev7I$!{2%PpXTpiNckr&X(1_LQ9U;N4O z$_QQZ+?nGf>{8!n{DhxlM2t_{X>gBtmPwaq86LE}>yva-5oi`{U5~f-v&r3bKuPuw zVMH=TQ>B%zhS~-cWjQ>ZtY0rolWHT|C@Y;$yHV2a3mOymsr>SHkym}JGpyg2!pjJ`j=)Ea+JOy5gd{)wQVH-Z6d1R24`kTGlmnZR}+JBYX=hUvog zAbYTV$Uf`}fM*C7w1;IkWw;~dPHYFzu!P5#h5InBv^CA25VQ_EkF9v&3sn@dc+Eq%W z#NhybNo5vnoz=QN(UlLmF(>o8=Z|yCRJ%xB6|Twlzn>|^V=6VPw}C^J))gC5Uhtfr L=b1*+=s5lbgq~mH literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.py b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.py new file mode 100644 index 0000000..7877658 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.py @@ -0,0 +1,102 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +''' +This module generates ANSI character codes to printing colors to terminals. +See: http://en.wikipedia.org/wiki/ANSI_escape_code +''' + +CSI = '\033[' +OSC = '\033]' +BEL = '\007' + + +def code_to_chars(code): + return CSI + str(code) + 'm' + +def set_title(title): + return OSC + '2;' + title + BEL + +def clear_screen(mode=2): + return CSI + str(mode) + 'J' + +def clear_line(mode=2): + return CSI + str(mode) + 'K' + + +class AnsiCodes(object): + def __init__(self): + # the subclasses declare class attributes which are numbers. + # Upon instantiation we define instance attributes, which are the same + # as the class attributes but wrapped with the ANSI escape sequence + for name in dir(self): + if not name.startswith('_'): + value = getattr(self, name) + setattr(self, name, code_to_chars(value)) + + +class AnsiCursor(object): + def UP(self, n=1): + return CSI + str(n) + 'A' + def DOWN(self, n=1): + return CSI + str(n) + 'B' + def FORWARD(self, n=1): + return CSI + str(n) + 'C' + def BACK(self, n=1): + return CSI + str(n) + 'D' + def POS(self, x=1, y=1): + return CSI + str(y) + ';' + str(x) + 'H' + + +class AnsiFore(AnsiCodes): + BLACK = 30 + RED = 31 + GREEN = 32 + YELLOW = 33 + BLUE = 34 + MAGENTA = 35 + CYAN = 36 + WHITE = 37 + RESET = 39 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 90 + LIGHTRED_EX = 91 + LIGHTGREEN_EX = 92 + LIGHTYELLOW_EX = 93 + LIGHTBLUE_EX = 94 + LIGHTMAGENTA_EX = 95 + LIGHTCYAN_EX = 96 + LIGHTWHITE_EX = 97 + + +class AnsiBack(AnsiCodes): + BLACK = 40 + RED = 41 + GREEN = 42 + YELLOW = 43 + BLUE = 44 + MAGENTA = 45 + CYAN = 46 + WHITE = 47 + RESET = 49 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 100 + LIGHTRED_EX = 101 + LIGHTGREEN_EX = 102 + LIGHTYELLOW_EX = 103 + LIGHTBLUE_EX = 104 + LIGHTMAGENTA_EX = 105 + LIGHTCYAN_EX = 106 + LIGHTWHITE_EX = 107 + + +class AnsiStyle(AnsiCodes): + BRIGHT = 1 + DIM = 2 + NORMAL = 22 + RESET_ALL = 0 + +Fore = AnsiFore() +Back = AnsiBack() +Style = AnsiStyle() +Cursor = AnsiCursor() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/ansi.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40c9472407f0dfa4ffc2762bec727332975aedbd GIT binary patch literal 4352 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.py b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.py new file mode 100644 index 0000000..c2d8360 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.py @@ -0,0 +1,152 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. + +# from winbase.h +STDOUT = -11 +STDERR = -12 + +try: + import ctypes + from ctypes import LibraryLoader + windll = LibraryLoader(ctypes.WinDLL) + from ctypes import wintypes +except (AttributeError, ImportError): + windll = None + SetConsoleTextAttribute = lambda *_: None + winapi_test = lambda *_: None +else: + from ctypes import byref, Structure, c_char, POINTER + + COORD = wintypes._COORD + + class CONSOLE_SCREEN_BUFFER_INFO(Structure): + """struct in wincon.h.""" + _fields_ = [ + ("dwSize", COORD), + ("dwCursorPosition", COORD), + ("wAttributes", wintypes.WORD), + ("srWindow", wintypes.SMALL_RECT), + ("dwMaximumWindowSize", COORD), + ] + def __str__(self): + return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % ( + self.dwSize.Y, self.dwSize.X + , self.dwCursorPosition.Y, self.dwCursorPosition.X + , self.wAttributes + , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right + , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X + ) + + _GetStdHandle = windll.kernel32.GetStdHandle + _GetStdHandle.argtypes = [ + wintypes.DWORD, + ] + _GetStdHandle.restype = wintypes.HANDLE + + _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo + _GetConsoleScreenBufferInfo.argtypes = [ + wintypes.HANDLE, + POINTER(CONSOLE_SCREEN_BUFFER_INFO), + ] + _GetConsoleScreenBufferInfo.restype = wintypes.BOOL + + _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute + _SetConsoleTextAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + ] + _SetConsoleTextAttribute.restype = wintypes.BOOL + + _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition + _SetConsoleCursorPosition.argtypes = [ + wintypes.HANDLE, + COORD, + ] + _SetConsoleCursorPosition.restype = wintypes.BOOL + + _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA + _FillConsoleOutputCharacterA.argtypes = [ + wintypes.HANDLE, + c_char, + wintypes.DWORD, + COORD, + POINTER(wintypes.DWORD), + ] + _FillConsoleOutputCharacterA.restype = wintypes.BOOL + + _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute + _FillConsoleOutputAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + wintypes.DWORD, + COORD, + POINTER(wintypes.DWORD), + ] + _FillConsoleOutputAttribute.restype = wintypes.BOOL + + _SetConsoleTitleW = windll.kernel32.SetConsoleTitleW + _SetConsoleTitleW.argtypes = [ + wintypes.LPCWSTR + ] + _SetConsoleTitleW.restype = wintypes.BOOL + + def _winapi_test(handle): + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return bool(success) + + def winapi_test(): + return any(_winapi_test(h) for h in + (_GetStdHandle(STDOUT), _GetStdHandle(STDERR))) + + def GetConsoleScreenBufferInfo(stream_id=STDOUT): + handle = _GetStdHandle(stream_id) + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return csbi + + def SetConsoleTextAttribute(stream_id, attrs): + handle = _GetStdHandle(stream_id) + return _SetConsoleTextAttribute(handle, attrs) + + def SetConsoleCursorPosition(stream_id, position, adjust=True): + position = COORD(*position) + # If the position is out of range, do nothing. + if position.Y <= 0 or position.X <= 0: + return + # Adjust for Windows' SetConsoleCursorPosition: + # 1. being 0-based, while ANSI is 1-based. + # 2. expecting (x,y), while ANSI uses (y,x). + adjusted_position = COORD(position.Y - 1, position.X - 1) + if adjust: + # Adjust for viewport's scroll position + sr = GetConsoleScreenBufferInfo(STDOUT).srWindow + adjusted_position.Y += sr.Top + adjusted_position.X += sr.Left + # Resume normal processing + handle = _GetStdHandle(stream_id) + return _SetConsoleCursorPosition(handle, adjusted_position) + + def FillConsoleOutputCharacter(stream_id, char, length, start): + handle = _GetStdHandle(stream_id) + char = c_char(char.encode()) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + success = _FillConsoleOutputCharacterA( + handle, char, length, start, byref(num_written)) + return num_written.value + + def FillConsoleOutputAttribute(stream_id, attr, length, start): + ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )''' + handle = _GetStdHandle(stream_id) + attribute = wintypes.WORD(attr) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + return _FillConsoleOutputAttribute( + handle, attribute, length, start, byref(num_written)) + + def SetConsoleTitle(title): + return _SetConsoleTitleW(title) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/win32.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a29247031d97d2df7590a20d16c50fe9208a19c GIT binary patch literal 5134 zcmb_fZBHE66+Sb&EG!0N@Jsv>+r)O_uRMhoVO|bYkKk@fBJjS zlKxK#|Gz}bwtbOMq=DX(h9?JKNa#ygkhU)k5cn&S?i8d^5YHCG`m$G)Lr9P5^q5YU zq)`%YGhURU9Tz(x*!cORq%XzuJZwkdlDx)AlM;?AaZ2KUdf)Pd3Eg5!8dK7lmd3Pn zPD|sobY`S6gELFAcSahs5|+hI%eE)sBsVw|`K~c1c1-rp%HBC?oEM5-kR4C#c?mwy z;YFn{4a6=>VnY=;894(zrEPuD8lp{mc%xj_d$>xWmWN zxUD<k^((=3NPAmAEP4 zoD!eVp6Zpeu(#+xZ{EC#{>={U&056+(@mqRMO$ezJ*Xwk(55+i0_^=Lb_ZRXspV3b z?JKmbhz^!pSK0nXjsGt+=vfqGObe-;EH|pMx;>k^ybg`ARleF1sF5&{8Jy_@-INs)AyV=Hzw zm6f$%>DlV)iV2>qt*-0iAR%16gqA%;2RlHVfaVz<;AsWAI=r|~AV3slZ%mm*rAtb~ znpF~J-54Llf(bG83NMt=I5NHNd=$?^>8&JQ*j>9h{x{7RQK#3*dEBWru%ju=SJARv3VQNVWDkEs z!dFgVzyXnSipodaDGiA60WmQk%1TTQ)`IY5`;=U$S7;4u*$woSkHdTa^Y2cD?=$Qi zFa4eN-x^-r&})oZBCTp8={lM~4cM#JmJ;WZj#`9?c6ObispO79xy-h=Ps$S2rh)+Y z1;I7$&HIU0@aFJa@@{z*TBBkU1aY%tgTPIK69k)b8T1Hb0B>w|qk!)9 zdyKOQbOL1%-xg{9C}{Yf-9`shz@1)$fHw5iBno^!g2ghGLPe-2vCiZ7t7@okSt;+UrfRN};_LEsL;b+(ZL zd&f3T$>>G`*X-LQK_WP8RkZ99y3zCTYItbwp8n7uxkxc`7eNK}p+9ce7jBqg)cwpo z?njGnBJ*VW@DqD3BiS*BcQDlldCF_?b%bIF^4~DvD?RzM#vu^MWpKpjo@95)M-Iw| z>4LgaE=?g{F81d^4Xq&kBfSr;T@X~L zksO~1P~AbDKz1|S>t)XIh@7-xFccvCS$eWi(vU__zJ1Z}dEPm6uv`C{S1evdikU$~ zJ?{fsV#<`rrWV`;F|y#ITCn1IICN>0C%{LeZJuv11loNNfBRE^;8dtR)wdy~Va%c^3vHg1Y5dEYl|KX(tVZp2KYgwDT({?{C^efcXVb@d`l9>~ z&34afxt9aPM`}q*aN0KBal7hND9lr*NN9N%_d3CT8aZdGcoim}JUZUx(FCof z-^d13KE}7sa;>IQDBi+$J9k<})1l$4q-m0>gFWeVLFrgORn4c6GoP?ii%?)01xy*8 z?i%FvxyEhP8mFJzG`8)}9yn_HXg!q25w#@BHPaovukQ5q+3bc`X#r=&q@7~lRW$ZV!d4BuCKTHUN~7%eFE z*p0Mj%@>$4tLR49D)pYV8(C^PG1U-%Vw2+P~qK{R?wb p{)|6`-;y`i|34U$OMU_J1?CPNVXxtclI2plI5mzoSDq|S{uhHX8> 4) & 7 + self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND) + + def reset_all(self, on_stderr=None): + self.set_attrs(self._default) + self.set_console(attrs=self._default) + self._light = 0 + + def fore(self, fore=None, light=False, on_stderr=False): + if fore is None: + fore = self._default_fore + self._fore = fore + # Emulate LIGHT_EX with BRIGHT Style + if light: + self._light |= WinStyle.BRIGHT + else: + self._light &= ~WinStyle.BRIGHT + self.set_console(on_stderr=on_stderr) + + def back(self, back=None, light=False, on_stderr=False): + if back is None: + back = self._default_back + self._back = back + # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style + if light: + self._light |= WinStyle.BRIGHT_BACKGROUND + else: + self._light &= ~WinStyle.BRIGHT_BACKGROUND + self.set_console(on_stderr=on_stderr) + + def style(self, style=None, on_stderr=False): + if style is None: + style = self._default_style + self._style = style + self.set_console(on_stderr=on_stderr) + + def set_console(self, attrs=None, on_stderr=False): + if attrs is None: + attrs = self.get_attrs() + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleTextAttribute(handle, attrs) + + def get_position(self, handle): + position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition + # Because Windows coordinates are 0-based, + # and win32.SetConsoleCursorPosition expects 1-based. + position.X += 1 + position.Y += 1 + return position + + def set_cursor_position(self, position=None, on_stderr=False): + if position is None: + # I'm not currently tracking the position, so there is no default. + # position = self.get_position() + return + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleCursorPosition(handle, position) + + def cursor_adjust(self, x, y, on_stderr=False): + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + position = self.get_position(handle) + adjusted_position = (position.Y + y, position.X + x) + win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False) + + def erase_screen(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the screen. + # 1 should clear from the cursor to the beginning of the screen. + # 2 should clear the entire screen, and move cursor to (1,1) + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + # get the number of character cells in the current buffer + cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y + # get number of character cells before current cursor position + cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = cells_in_screen - cells_before_cursor + elif mode == 1: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_before_cursor + elif mode == 2: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_in_screen + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + if mode == 2: + # put the cursor where needed + win32.SetConsoleCursorPosition(handle, (1, 1)) + + def erase_line(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the line. + # 1 should clear from the cursor to the beginning of the line. + # 2 should clear the entire line. + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X + elif mode == 1: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwCursorPosition.X + elif mode == 2: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwSize.X + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + + def set_title(self, title): + win32.SetConsoleTitle(title) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/colorama/winterm.pyc new file mode 100644 index 0000000000000000000000000000000000000000..414c0d494b5f2a22f08f5d094cbbdeb00a65fda1 GIT binary patch literal 5999 zcmd5=-Etg974Dh+(XO=e%Cck0u>nD1*bp3n0|`GSv9yvE6M03oWD;!^Os#fi?U6@2 zs+rz6PFYnH)(yo4uMr-AJ1WnRdme)uF8RLGvokA4fl7HVu-s=)pXurDbNV|!J*9um z&;IkzfA{(-`&Yv69kld!AU^&(DpKmmQC&wlzN-RP4IJf{)TvU>mD=x?lwTf8E4j3+ z{OVXblS?bguc_Tu9aD!6NQ=Z&K%Rudw{MvmxR1hNJC5Qc-x0^GqoqFw2^2SieRW-K zjjOw=i`7c1i`mPnTUCBVb!WJKx2F6V)vYVN+v3zAnq4?_$x+v^Ou{XMRgxKy)+~r@ z#`A`~qrmeFC7yQ_`=f|mj$hwiYkz3?`ug^RO%ZMB&CQO8+WTuA!};~*hT)v|*S0o0 zduxV^>~C&w?|dZV@Wy@%B2|#|SLm*qqvO@%@c3ppOieF}Zr-|g_}M#06iM?w35I^0 ztoCWD-cfHA1~fr(^w#lHO@ncnbb*X>_HS(CUGp>wzG~xF@ygfP7*-UEVTcOFo__?_ zqAfJ-srghC?Cj|KYum!E>w8-t?3s&rWLa+=X4}#`4>}u#&ceO4;tedqg;Hv7)fU?W zQhTsXuC1II$Nd8&*YT1^$q@IR1t3djLqxdh;cq@GCtzf&M{ zcHD&%pgTtg;Ixggye{&2nR8a1VwDTZpObDw9$|IcotN%{@-N5?7l~?~aG&SR#xrQ6 zrTZX8sY6GotDZaRu%w;=!DZ6JiqJCU4*OMkHY3uS@O9y5g~y&9VX$Wf@8vQbai!Kg zSdFF(akCYec05euDA?^MK`>k&4F*ASZ#akr3A=k6I}i5E97aA_GbRZSMkYwDoB6?@ zH;Rm5WJm+!_3%6um+}U25*RMzWrM7QsPhhb{l{mYiG;`Rr3ARSF!`bt$|Q@w{bDPh=`**;#NJ{Hx?=MwgK@TLHtfuoNNAQJ0q}a7A2F z>q}$P^Uzz|wZ1~a1vKriuY-tA`dj4CEO}{tcq|Xc$MQNlDM6r|K7ZJ9HGYB4Guize zY~HgSSG^B)L;xfKl`io}T2|{KM(8HAI88@Fu!Q9nk7`0mT2b>vb(4fT3mQdTLCYt- zXcSCOas3LG_yL+k6y?l27thi8#~3hqbYr)Y48;cyGNr@hNs}P5I+LT~6>ud?S$b6bUZD)A6N_k$#vp3>rkNg!?*ML)tKnf43LC8y6VvgIe~;mc^2D^YeFIBup`|sD3>;3M3v*Ze6+M3grqJ_R=1$L5 z=213up1?=oQSW3i6kRwQA0e~j5#o)DVx7vfF6h`eDtdnheaYB*5!^U0Z)$DmM!R_i z-wQr9d6F)iNPm~_zczmLQE%u+(~P$~jQeO=!fZHAr;Y-)VWTdM#Mb7BpMuyThx($z zan*?g8ip7^;9ZF%E+P&}IO(GJar63xhOwn97^PV@8YWi%Nqdx}aq`?8ciBI4}6|s-2mdK&+sHFjHS(TSi zE@KW!P`F+^cPHbFcvR0n9HmCCoQ1E66*bd?UL|>pN(2}Ym4Flj8BE_6oIR#C7c0)?x@EIfPa#)GwK9)7ra+h%O^E8 z)H1@A5r322;F>1yAS`ldRdLvxGOQ%SzC3SOMTQ}I(3!AtT#67`uxs3raPDR0P>M?u zGzBwR1%;FUO zlil#Mz#>YpbrV8?ReNVgZ^-5BZWu+`?QCacjz^~bsF(Em_-1ha<2?9lNf`vHe7CXi zq<`UKNKjx?%By~Q5E|AI{UC}`FGO)FH$g+^wX%bNHJE1sCZAOXNqmG7H%@%Ht=VBF z_JX7bm%xkDsm=_8gv^<3Dn>t*`O6us-7D@2a!nm|e#2SBuh3E%^6O5+6||p;D*wh5 z-vI47Za>a2o`D@PMq&zmff%l;;o$^^{~~MPn*-_^>l!tpsPGiv8LzxMf#)y&>npMz zUpWWc*a$FsKDP5`0$%$3i{RD2gs??RzZm$KU^Q{6`FYD?mBpV8hQB8F9tqJ_#6iu( zR)9?3VV412Z-7h@9Q?j#!4ZYS;IHVVD= (3, 4): + _abc_ABC = abc.ABC +else: + _abc_ABC = abc.ABCMeta('ABC', (object,), {'__slots__': ()}) + + +# Backport classic class MRO +def _classic_mro(C, result): + if C in result: + return + result.append(C) + for B in C.__bases__: + _classic_mro(B, result) + return result + + +# Backport _collections_abc._check_methods +def _check_methods(C, *methods): + try: + mro = C.__mro__ + except AttributeError: + mro = tuple(_classic_mro(C, [])) + + for method in methods: + for B in mro: + if method in B.__dict__: + if B.__dict__[method] is None: + return NotImplemented + break + else: + return NotImplemented + return True + + +class AbstractContextManager(_abc_ABC): + """An abstract base class for context managers.""" + + def __enter__(self): + """Return `self` upon entering the runtime context.""" + return self + + @abc.abstractmethod + def __exit__(self, exc_type, exc_value, traceback): + """Raise any exception triggered within the runtime context.""" + return None + + @classmethod + def __subclasshook__(cls, C): + """Check whether subclass is considered a subclass of this ABC.""" + if cls is AbstractContextManager: + return _check_methods(C, "__enter__", "__exit__") + return NotImplemented + + +class ContextDecorator(object): + """A base class or mixin that enables context managers to work as decorators.""" + + def refresh_cm(self): + """Returns the context manager used to actually wrap the call to the + decorated function. + + The default implementation just returns *self*. + + Overriding this method allows otherwise one-shot context managers + like _GeneratorContextManager to support use as decorators via + implicit recreation. + + DEPRECATED: refresh_cm was never added to the standard library's + ContextDecorator API + """ + warnings.warn("refresh_cm was never added to the standard library", + DeprecationWarning) + return self._recreate_cm() + + def _recreate_cm(self): + """Return a recreated instance of self. + + Allows an otherwise one-shot context manager like + _GeneratorContextManager to support use as + a decorator via implicit recreation. + + This is a private interface just for _GeneratorContextManager. + See issue #11647 for details. + """ + return self + + def __call__(self, func): + @wraps(func) + def inner(*args, **kwds): + with self._recreate_cm(): + return func(*args, **kwds) + return inner + + +class _GeneratorContextManager(ContextDecorator): + """Helper for @contextmanager decorator.""" + + def __init__(self, func, args, kwds): + self.gen = func(*args, **kwds) + self.func, self.args, self.kwds = func, args, kwds + # Issue 19330: ensure context manager instances have good docstrings + doc = getattr(func, "__doc__", None) + if doc is None: + doc = type(self).__doc__ + self.__doc__ = doc + # Unfortunately, this still doesn't provide good help output when + # inspecting the created context manager instances, since pydoc + # currently bypasses the instance docstring and shows the docstring + # for the class instead. + # See http://bugs.python.org/issue19404 for more details. + + def _recreate_cm(self): + # _GCM instances are one-shot context managers, so the + # CM must be recreated each time a decorated function is + # called + return self.__class__(self.func, self.args, self.kwds) + + def __enter__(self): + try: + return next(self.gen) + except StopIteration: + raise RuntimeError("generator didn't yield") + + def __exit__(self, type, value, traceback): + if type is None: + try: + next(self.gen) + except StopIteration: + return + else: + raise RuntimeError("generator didn't stop") + else: + if value is None: + # Need to force instantiation so we can reliably + # tell if we get the same exception back + value = type() + try: + self.gen.throw(type, value, traceback) + raise RuntimeError("generator didn't stop after throw()") + except StopIteration as exc: + # Suppress StopIteration *unless* it's the same exception that + # was passed to throw(). This prevents a StopIteration + # raised inside the "with" statement from being suppressed. + return exc is not value + except RuntimeError as exc: + # Don't re-raise the passed in exception + if exc is value: + return False + # Likewise, avoid suppressing if a StopIteration exception + # was passed to throw() and later wrapped into a RuntimeError + # (see PEP 479). + if _HAVE_EXCEPTION_CHAINING and exc.__cause__ is value: + return False + raise + except: + # only re-raise if it's *not* the exception that was + # passed to throw(), because __exit__() must not raise + # an exception unless __exit__() itself failed. But throw() + # has to raise the exception to signal propagation, so this + # fixes the impedance mismatch between the throw() protocol + # and the __exit__() protocol. + # + if sys.exc_info()[1] is not value: + raise + + +def contextmanager(func): + """@contextmanager decorator. + + Typical usage: + + @contextmanager + def some_generator(): + + try: + yield + finally: + + + This makes this: + + with some_generator() as : + + + equivalent to this: + + + try: + = + + finally: + + + """ + @wraps(func) + def helper(*args, **kwds): + return _GeneratorContextManager(func, args, kwds) + return helper + + +class closing(object): + """Context to automatically close something at the end of a block. + + Code like this: + + with closing(.open()) as f: + + + is equivalent to this: + + f = .open() + try: + + finally: + f.close() + + """ + def __init__(self, thing): + self.thing = thing + + def __enter__(self): + return self.thing + + def __exit__(self, *exc_info): + self.thing.close() + + +class _RedirectStream(object): + + _stream = None + + def __init__(self, new_target): + self._new_target = new_target + # We use a list of old targets to make this CM re-entrant + self._old_targets = [] + + def __enter__(self): + self._old_targets.append(getattr(sys, self._stream)) + setattr(sys, self._stream, self._new_target) + return self._new_target + + def __exit__(self, exctype, excinst, exctb): + setattr(sys, self._stream, self._old_targets.pop()) + + +class redirect_stdout(_RedirectStream): + """Context manager for temporarily redirecting stdout to another file. + + # How to send help() to stderr + with redirect_stdout(sys.stderr): + help(dir) + + # How to write help() to a file + with open('help.txt', 'w') as f: + with redirect_stdout(f): + help(pow) + """ + + _stream = "stdout" + + +class redirect_stderr(_RedirectStream): + """Context manager for temporarily redirecting stderr to another file.""" + + _stream = "stderr" + + +class suppress(object): + """Context manager to suppress specified exceptions + + After the exception is suppressed, execution proceeds with the next + statement following the with statement. + + with suppress(FileNotFoundError): + os.remove(somefile) + # Execution still resumes here if the file was already removed + """ + + def __init__(self, *exceptions): + self._exceptions = exceptions + + def __enter__(self): + pass + + def __exit__(self, exctype, excinst, exctb): + # Unlike isinstance and issubclass, CPython exception handling + # currently only looks at the concrete type hierarchy (ignoring + # the instance and subclass checking hooks). While Guido considers + # that a bug rather than a feature, it's a fairly hard one to fix + # due to various internal implementation details. suppress provides + # the simpler issubclass based semantics, rather than trying to + # exactly reproduce the limitations of the CPython interpreter. + # + # See http://bugs.python.org/issue12029 for more details + return exctype is not None and issubclass(exctype, self._exceptions) + + +# Context manipulation is Python 3 only +_HAVE_EXCEPTION_CHAINING = sys.version_info[0] >= 3 +if _HAVE_EXCEPTION_CHAINING: + def _make_context_fixer(frame_exc): + def _fix_exception_context(new_exc, old_exc): + # Context may not be correct, so find the end of the chain + while 1: + exc_context = new_exc.__context__ + if exc_context is old_exc: + # Context is already set correctly (see issue 20317) + return + if exc_context is None or exc_context is frame_exc: + break + new_exc = exc_context + # Change the end of the chain to point to the exception + # we expect it to reference + new_exc.__context__ = old_exc + return _fix_exception_context + + def _reraise_with_existing_context(exc_details): + try: + # bare "raise exc_details[1]" replaces our carefully + # set-up context + fixed_ctx = exc_details[1].__context__ + raise exc_details[1] + except BaseException: + exc_details[1].__context__ = fixed_ctx + raise +else: + # No exception context in Python 2 + def _make_context_fixer(frame_exc): + return lambda new_exc, old_exc: None + + # Use 3 argument raise in Python 2, + # but use exec to avoid SyntaxError in Python 3 + def _reraise_with_existing_context(exc_details): + exc_type, exc_value, exc_tb = exc_details + exec("raise exc_type, exc_value, exc_tb") + +# Handle old-style classes if they exist +try: + from types import InstanceType +except ImportError: + # Python 3 doesn't have old-style classes + _get_type = type +else: + # Need to handle old-style context managers on Python 2 + def _get_type(obj): + obj_type = type(obj) + if obj_type is InstanceType: + return obj.__class__ # Old-style class + return obj_type # New-style class + + +# Inspired by discussions on http://bugs.python.org/issue13585 +class ExitStack(object): + """Context manager for dynamic management of a stack of exit callbacks + + For example: + + with ExitStack() as stack: + files = [stack.enter_context(open(fname)) for fname in filenames] + # All opened files will automatically be closed at the end of + # the with statement, even if attempts to open files later + # in the list raise an exception + + """ + def __init__(self): + self._exit_callbacks = deque() + + def pop_all(self): + """Preserve the context stack by transferring it to a new instance""" + new_stack = type(self)() + new_stack._exit_callbacks = self._exit_callbacks + self._exit_callbacks = deque() + return new_stack + + def _push_cm_exit(self, cm, cm_exit): + """Helper to correctly register callbacks to __exit__ methods""" + def _exit_wrapper(*exc_details): + return cm_exit(cm, *exc_details) + _exit_wrapper.__self__ = cm + self.push(_exit_wrapper) + + def push(self, exit): + """Registers a callback with the standard __exit__ method signature + + Can suppress exceptions the same way __exit__ methods can. + + Also accepts any object with an __exit__ method (registering a call + to the method instead of the object itself) + """ + # We use an unbound method rather than a bound method to follow + # the standard lookup behaviour for special methods + _cb_type = _get_type(exit) + try: + exit_method = _cb_type.__exit__ + except AttributeError: + # Not a context manager, so assume its a callable + self._exit_callbacks.append(exit) + else: + self._push_cm_exit(exit, exit_method) + return exit # Allow use as a decorator + + def callback(self, callback, *args, **kwds): + """Registers an arbitrary callback and arguments. + + Cannot suppress exceptions. + """ + def _exit_wrapper(exc_type, exc, tb): + callback(*args, **kwds) + # We changed the signature, so using @wraps is not appropriate, but + # setting __wrapped__ may still help with introspection + _exit_wrapper.__wrapped__ = callback + self.push(_exit_wrapper) + return callback # Allow use as a decorator + + def enter_context(self, cm): + """Enters the supplied context manager + + If successful, also pushes its __exit__ method as a callback and + returns the result of the __enter__ method. + """ + # We look up the special methods on the type to match the with statement + _cm_type = _get_type(cm) + _exit = _cm_type.__exit__ + result = _cm_type.__enter__(cm) + self._push_cm_exit(cm, _exit) + return result + + def close(self): + """Immediately unwind the context stack""" + self.__exit__(None, None, None) + + def __enter__(self): + return self + + def __exit__(self, *exc_details): + received_exc = exc_details[0] is not None + + # We manipulate the exception state so it behaves as though + # we were actually nesting multiple with statements + frame_exc = sys.exc_info()[1] + _fix_exception_context = _make_context_fixer(frame_exc) + + # Callbacks are invoked in LIFO order to match the behaviour of + # nested context managers + suppressed_exc = False + pending_raise = False + while self._exit_callbacks: + cb = self._exit_callbacks.pop() + try: + if cb(*exc_details): + suppressed_exc = True + pending_raise = False + exc_details = (None, None, None) + except: + new_exc_details = sys.exc_info() + # simulate the stack of exceptions by setting the context + _fix_exception_context(new_exc_details[1], exc_details[1]) + pending_raise = True + exc_details = new_exc_details + if pending_raise: + _reraise_with_existing_context(exc_details) + return received_exc and suppressed_exc + + +# Preserve backwards compatibility +class ContextStack(ExitStack): + """Backwards compatibility alias for ExitStack""" + + def __init__(self): + warnings.warn("ContextStack has been renamed to ExitStack", + DeprecationWarning) + super(ContextStack, self).__init__() + + def register_exit(self, callback): + return self.push(callback) + + def register(self, callback, *args, **kwds): + return self.callback(callback, *args, **kwds) + + def preserve(self): + return self.pop_all() + + +class nullcontext(AbstractContextManager): + """Context manager that does no additional processing. + Used as a stand-in for a normal context manager, when a particular + block of code is only sometimes used with a normal context manager: + cm = optional_cm if condition else nullcontext() + with cm: + # Perform operation, using optional_cm if condition is True + """ + + def __init__(self, enter_result=None): + self.enter_result = enter_result + + def __enter__(self): + return self.enter_result + + def __exit__(self, *excinfo): + pass diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/contextlib2.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/contextlib2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e6d042aebbe390148b2fe89d3b8317f64898e58 GIT binary patch literal 18653 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

    }`?3;tB$Jdy4 zB|~r0`15weN>@S?E)8}@Nq3F3*H{H>Ak&$~BSH-DBu$z-XUpem!Q`!+L1TyJxtcAA zI@>TEGHk#;#^}ytl%xP&C28k@^9MrRd!s%M`YIENl2prbM+R-<&0?P41!TQ;CV?yg zeUX3^JP2@&uHs3yMW$w^U9pCe7xg=M=>`n)FufOwA)arzArO0I8~LtYtXJWJ(QN?9 zG3yQ)W1D3HlSvm5c5Y)dK}e6yO|Ob(h)~sFn3-w^K^Ygs4>g>#a_z7%vtP$U%1Yve zb;)jqz1Ew?17Z9KxTs6UggNcUAwL3OaO3h+SFY!p$;`lt@x1~+N|0E^8t4Z{rR7Ew zBSoHVo&>0Uye(uz2%f+t9?K(3rd8_ul`LdOLn?g7h(Utxn;@Fsrf$vzZ~fRmjI_&0 zE;A*OZ$i0K#+Eo?o-@HzG#t+ogPpFv(_{2^(B$wK(n(R6o#cy7`JitAIU~~d1kmph zK<4MD+GMS1iDf~kO5=>-I?}rw-@~xxR|`0xhyH=R9Md#2`46*Vnqimg64sRNR(wR= zhI-DA^Rf9%LM?VhAHv*DXf~R;ZpB_#&NZmnd0R(ov4_<6(8v=?o_UCw!fCJM zjY(|Pkeu*)xA#yG=IqTJbEK0K)jY!I(~S@X57i0i{p{y;7p) z`Kk}aHuh!+~b3Z+OgV%AsLbjnULQW>6cL$QSez!t%^m4!*L{PfHRS* z0i{oxkUFISTJtF8xA9^RLEu}7bR~jhOmW6IC!z+eR@1V)ya!w(#UfD&@i(8!Hf{TCQvfhn&!{~}1%V(_len|X}8;{NN% zis*uIwO;MEE+Rb~j7&KPTMJCKhjC$>^~f6tnUZabM09c~LuklX&v_QiPl#MM=jn>B z3{O^UYXf>mn3ZTTd3Y4xIit1>qw<-^U}q9Fp__h*N4(t~Cgopow`c;Zk#R%<4kO)0 z{0cNz2Ub*_WJz%|=|5qE>fnWvF)56$x7#=aguw^(+>H_5#HRtkQL!Upcq|%=L}ZtQ zNH~qGe;~_qehb6>16L%xQ60T;8lgO@F07<*fpGVwL;?S)gu!5w))%L~ic9|+3eYsL zCtuz*RlkVMgsVj07MU6X%RpAG?^T-~CC>P&ilnh`J%^UuPva(;X$}~?apP^M0L?r zb)I4oqA+iq=BKZc$sme27b21U6>$ynFr1sm zbOu9mq~(9+cFSB;EWaQQtL-%(~Q?#z%f*C%)~?e5&S#WJcxgdW}Vw0Kjb2An|x7%z3M${ zeE692mtc3U^@|(?zA`=}!7+)Sv^z-IS&3RvwhgHqF_8xDbLl6S!iWSl&&kiDfbxKS z01l!%MS3+^)i_X=+|UPwqNW&F)GzQ=^BMG#`0aNv%Ss3@HN|ICkXrN|${CG~^%CB3 zW?0Z#kz-|$T9`W2w9YIF<1Ua;tIgnxVCbCb^5_}!nvsPUB(S++xKTk6@yrytt#WFL@9^U_V>5k|-xZ1pCJr7xvlpR& zfJc(H(Z8@Max3qmjqhOL4A>nnMfzX2<(Zh1B*)P@^O@g=GutGFZ6Yaw_~u!g&llzR z^>HJc&>X(cdmAw{11!JRL%<6l81U^7Dc5$-Utd6;9oucp309!T`oG%)}ihQY3HDo5s>JR;sbQM6W)=^MNp#Q0OlzDlUaJ zArR)Gaxu)cgR=wzb{e4VXJfb;h_;YR9G*1H-&b+%J_A9M3G@gIayAF^LK5KR5sQBK z>m1%6s^Hm^IwUMkBiQh{%^KgSc1CLbfItcRGpyg7r;ZFGr@mPiLa6>ShnbEOniH%NJ6NseM zVF(_sA8Z_jVR*XH9BUq#IyN;ub*=gA)XAyIsfnrKsnbW%r#UfxfEizP>lgwmWA*0f J)ZMAc{|6jYJ(d6f literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.py new file mode 100644 index 0000000..63d916e --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2019 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import logging + +__version__ = '0.3.1' + +class DistlibException(Exception): + pass + +try: + from logging import NullHandler +except ImportError: # pragma: no cover + class NullHandler(logging.Handler): + def handle(self, record): pass + def emit(self, record): pass + def createLock(self): self.lock = None + +logger = logging.getLogger(__name__) +logger.addHandler(NullHandler()) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec860a1874a861136f71c660f5186857599fcf9a GIT binary patch literal 1311 zcmb_cOK;Oa5T3Oi=K&F~h#My^7E%+S5*H9cKqV?wIk*SFmzA-%sZ+n?-6D#(l?xJo zhhM|b;0M4rlPE#rg48&k_3Z5I%r~$2zs94V-+t(f)=v-L7a;o`OO97jNtA%`C{dLA zWIQ?n6VO+pOQQFQPZtwW?XhYVP!f=OTR)({^yq9v-6<)h@{kPCGL*~x&Ei06@iWJafw+A5QnDkK9dguM6wS;={qG%(Sj(>P;*P zhc7{vufhfJ$Hx(Piaaci#ah>CWwdr9*;Gw_UShk_f{28(Pr=Px)y~?Y-79MA(z4up ze7OAlq+*ef{%GpF>1O!~&rIv0E}YiW_9A9W*FcsXhbm%djs^4cvV4=)d1<=X$NpdN z_aR+@M>&x5#N(nc<8x7%2{)Si$lA zc~cu<$|gILj0)5pqU0{jI+Hqc1Q!$R1Z%{}h#73mU}COWJm7_UXzO3Ns}@iC@D}V^ zb`z>0ei8d|oVK!AEQ)#|&8yM!oyEvueug;PjG*+p*b%+Ms%<)V&~;eZ#=7C<&ce7O wm_++?c+xoR!gMl`X`Zi@cO0Y)|FhM&KW9vq|4OcVp?BB!)kKZez1|J=2XLYg5C8xG literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.py new file mode 100644 index 0000000..f7dbf4c --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.py @@ -0,0 +1,6 @@ +"""Modules copied from Python 3 standard libraries, for internal use only. + +Individual classes and functions are found in d2._backport.misc. Intended +usage is to always import things missing from 3.1 from that module: the +built-in/stdlib objects will be used if found. +""" diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba20d67f26247e5032524da86b557aa1eb44dc0a GIT binary patch literal 446 zcmYLF!A`?44DCPyRK!2{xC3j&CUHOrapAB72#Fh)C{5DUBTcH<-BkX758`Y141NH2 zMG(m^wqw6M`}q4J|N8h;Ci^`zx$ng&7qD6ODmcqt=0{`hTwWie?Y$!~u|sE}PO*jO zftwg$1;jd7oh*2)l1}L866%-$1G^Nohn^h7;D;j5*TLcrZ7*5lHIZ;iGt_-Bj4?=* zoHX~6!vJ(zZZK>Jq=Cel)UJxF z$>Bybw1;_aq|)V8kDeD8N@6P$K&-aTFu@+ZhsurWMNB=ZD)OiKxGg>vP|8N5)Lh)` zALv2ClH0EAuoGTckN1n^di#Fej;VvGoeU9EX^~hyE&s+WmBN6mRM8E5CQP@J*1Hq& HSuFbjEDVVg literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.py new file mode 100644 index 0000000..cfb318d --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Backports for individual classes and functions.""" + +import os +import sys + +__all__ = ['cache_from_source', 'callable', 'fsencode'] + + +try: + from imp import cache_from_source +except ImportError: + def cache_from_source(py_file, debug=__debug__): + ext = debug and 'c' or 'o' + return py_file + ext + + +try: + callable = callable +except NameError: + from collections import Callable + + def callable(obj): + return isinstance(obj, Callable) + + +try: + fsencode = os.fsencode +except AttributeError: + def fsencode(filename): + if isinstance(filename, bytes): + return filename + elif isinstance(filename, str): + return filename.encode(sys.getfilesystemencoding()) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/misc.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f82f35825e7f8a59f35de7c4b086547e9ac7bb6 GIT binary patch literal 1408 zcmb_b&1w`u5U!rt-E20yMomnMVDV2=Npjy1*VB&a6vkt zOi&D=kpqeY(jn;<={6mO6o<6j^sgPtT9mgbZj(4H9#PA5=(tDqM-oDq71AqoflzHK z1btZc$aE?0(qZuwmaE?KJ6m$1E@eH+*C<{ip;zew)pQ%T0U1H_KE-`_ZozZlJ%4)7 zp116KOB8-ETw^>Vu(ydiuFBfkXjaxyTIlp7)r%yHRF+t4Y?Kr_nk@?D(z38S>0f+f zcL$y-QJ;*Q)nzVixu}(KU9ZiuWSTXXnKgwfwHXS$OhBXpun@%O9>{Kioe8S@+^TAw z`}!rIGbjUka4=-sv15Pbc{zkgUhP&ORZBTbk&cI?&2(|(*u$K<#tt&sU9geMt5KC! z+i784l4aY^_vfEq=B)B0PfVf9dZbh9vUEC<)62$;^3dA~_shz>t7~jFgLAm~Nl95Gxsmc}cI?l(8*euE_%X=#!APu&7HA{rh~X{V{qjnw zOC_aa)6!0^>9J7I^B$ymw%Afr7>U!Rc2UA|L^+! zns6$|iFTc<)9J!B##iXQbThw<@A#{{)Qil#<_X#etP}J_KUfb#u_*@Pb~_Y3K7&Ck I#5oZE03|{**Z=?k literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.py new file mode 100644 index 0000000..10ed362 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.py @@ -0,0 +1,764 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Utility functions for copying and archiving files and directory trees. + +XXX The functions here don't copy the resource fork or other metadata on Mac. + +""" + +import os +import sys +import stat +from os.path import abspath +import fnmatch +try: + from collections.abc import Callable +except ImportError: + from collections import Callable +import errno +from . import tarfile + +try: + import bz2 + _BZ2_SUPPORTED = True +except ImportError: + _BZ2_SUPPORTED = False + +try: + from pwd import getpwnam +except ImportError: + getpwnam = None + +try: + from grp import getgrnam +except ImportError: + getgrnam = None + +__all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2", + "copytree", "move", "rmtree", "Error", "SpecialFileError", + "ExecError", "make_archive", "get_archive_formats", + "register_archive_format", "unregister_archive_format", + "get_unpack_formats", "register_unpack_format", + "unregister_unpack_format", "unpack_archive", "ignore_patterns"] + +class Error(EnvironmentError): + pass + +class SpecialFileError(EnvironmentError): + """Raised when trying to do a kind of operation (e.g. copying) which is + not supported on a special file (e.g. a named pipe)""" + +class ExecError(EnvironmentError): + """Raised when a command could not be executed""" + +class ReadError(EnvironmentError): + """Raised when an archive cannot be read""" + +class RegistryError(Exception): + """Raised when a registry operation with the archiving + and unpacking registries fails""" + + +try: + WindowsError +except NameError: + WindowsError = None + +def copyfileobj(fsrc, fdst, length=16*1024): + """copy data from file-like object fsrc to file-like object fdst""" + while 1: + buf = fsrc.read(length) + if not buf: + break + fdst.write(buf) + +def _samefile(src, dst): + # Macintosh, Unix. + if hasattr(os.path, 'samefile'): + try: + return os.path.samefile(src, dst) + except OSError: + return False + + # All other platforms: check for same pathname. + return (os.path.normcase(os.path.abspath(src)) == + os.path.normcase(os.path.abspath(dst))) + +def copyfile(src, dst): + """Copy data from src to dst""" + if _samefile(src, dst): + raise Error("`%s` and `%s` are the same file" % (src, dst)) + + for fn in [src, dst]: + try: + st = os.stat(fn) + except OSError: + # File most likely does not exist + pass + else: + # XXX What about other special files? (sockets, devices...) + if stat.S_ISFIFO(st.st_mode): + raise SpecialFileError("`%s` is a named pipe" % fn) + + with open(src, 'rb') as fsrc: + with open(dst, 'wb') as fdst: + copyfileobj(fsrc, fdst) + +def copymode(src, dst): + """Copy mode bits from src to dst""" + if hasattr(os, 'chmod'): + st = os.stat(src) + mode = stat.S_IMODE(st.st_mode) + os.chmod(dst, mode) + +def copystat(src, dst): + """Copy all stat info (mode bits, atime, mtime, flags) from src to dst""" + st = os.stat(src) + mode = stat.S_IMODE(st.st_mode) + if hasattr(os, 'utime'): + os.utime(dst, (st.st_atime, st.st_mtime)) + if hasattr(os, 'chmod'): + os.chmod(dst, mode) + if hasattr(os, 'chflags') and hasattr(st, 'st_flags'): + try: + os.chflags(dst, st.st_flags) + except OSError as why: + if (not hasattr(errno, 'EOPNOTSUPP') or + why.errno != errno.EOPNOTSUPP): + raise + +def copy(src, dst): + """Copy data and mode bits ("cp src dst"). + + The destination may be a directory. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst) + copymode(src, dst) + +def copy2(src, dst): + """Copy data and all stat info ("cp -p src dst"). + + The destination may be a directory. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst) + copystat(src, dst) + +def ignore_patterns(*patterns): + """Function that can be used as copytree() ignore parameter. + + Patterns is a sequence of glob-style patterns + that are used to exclude files""" + def _ignore_patterns(path, names): + ignored_names = [] + for pattern in patterns: + ignored_names.extend(fnmatch.filter(names, pattern)) + return set(ignored_names) + return _ignore_patterns + +def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, + ignore_dangling_symlinks=False): + """Recursively copy a directory tree. + + The destination directory must not already exist. + If exception(s) occur, an Error is raised with a list of reasons. + + If the optional symlinks flag is true, symbolic links in the + source tree result in symbolic links in the destination tree; if + it is false, the contents of the files pointed to by symbolic + links are copied. If the file pointed by the symlink doesn't + exist, an exception will be added in the list of errors raised in + an Error exception at the end of the copy process. + + You can set the optional ignore_dangling_symlinks flag to true if you + want to silence this exception. Notice that this has no effect on + platforms that don't support os.symlink. + + The optional ignore argument is a callable. If given, it + is called with the `src` parameter, which is the directory + being visited by copytree(), and `names` which is the list of + `src` contents, as returned by os.listdir(): + + callable(src, names) -> ignored_names + + Since copytree() is called recursively, the callable will be + called once for each directory that is copied. It returns a + list of names relative to the `src` directory that should + not be copied. + + The optional copy_function argument is a callable that will be used + to copy each file. It will be called with the source path and the + destination path as arguments. By default, copy2() is used, but any + function that supports the same signature (like copy()) can be used. + + """ + names = os.listdir(src) + if ignore is not None: + ignored_names = ignore(src, names) + else: + ignored_names = set() + + os.makedirs(dst) + errors = [] + for name in names: + if name in ignored_names: + continue + srcname = os.path.join(src, name) + dstname = os.path.join(dst, name) + try: + if os.path.islink(srcname): + linkto = os.readlink(srcname) + if symlinks: + os.symlink(linkto, dstname) + else: + # ignore dangling symlink if the flag is on + if not os.path.exists(linkto) and ignore_dangling_symlinks: + continue + # otherwise let the copy occurs. copy2 will raise an error + copy_function(srcname, dstname) + elif os.path.isdir(srcname): + copytree(srcname, dstname, symlinks, ignore, copy_function) + else: + # Will raise a SpecialFileError for unsupported file types + copy_function(srcname, dstname) + # catch the Error from the recursive copytree so that we can + # continue with other files + except Error as err: + errors.extend(err.args[0]) + except EnvironmentError as why: + errors.append((srcname, dstname, str(why))) + try: + copystat(src, dst) + except OSError as why: + if WindowsError is not None and isinstance(why, WindowsError): + # Copying file access times may fail on Windows + pass + else: + errors.extend((src, dst, str(why))) + if errors: + raise Error(errors) + +def rmtree(path, ignore_errors=False, onerror=None): + """Recursively delete a directory tree. + + If ignore_errors is set, errors are ignored; otherwise, if onerror + is set, it is called to handle the error with arguments (func, + path, exc_info) where func is os.listdir, os.remove, or os.rmdir; + path is the argument to that function that caused it to fail; and + exc_info is a tuple returned by sys.exc_info(). If ignore_errors + is false and onerror is None, an exception is raised. + + """ + if ignore_errors: + def onerror(*args): + pass + elif onerror is None: + def onerror(*args): + raise + try: + if os.path.islink(path): + # symlinks to directories are forbidden, see bug #1669 + raise OSError("Cannot call rmtree on a symbolic link") + except OSError: + onerror(os.path.islink, path, sys.exc_info()) + # can't continue even if onerror hook returns + return + names = [] + try: + names = os.listdir(path) + except os.error: + onerror(os.listdir, path, sys.exc_info()) + for name in names: + fullname = os.path.join(path, name) + try: + mode = os.lstat(fullname).st_mode + except os.error: + mode = 0 + if stat.S_ISDIR(mode): + rmtree(fullname, ignore_errors, onerror) + else: + try: + os.remove(fullname) + except os.error: + onerror(os.remove, fullname, sys.exc_info()) + try: + os.rmdir(path) + except os.error: + onerror(os.rmdir, path, sys.exc_info()) + + +def _basename(path): + # A basename() variant which first strips the trailing slash, if present. + # Thus we always get the last component of the path, even for directories. + return os.path.basename(path.rstrip(os.path.sep)) + +def move(src, dst): + """Recursively move a file or directory to another location. This is + similar to the Unix "mv" command. + + If the destination is a directory or a symlink to a directory, the source + is moved inside the directory. The destination path must not already + exist. + + If the destination already exists but is not a directory, it may be + overwritten depending on os.rename() semantics. + + If the destination is on our current filesystem, then rename() is used. + Otherwise, src is copied to the destination and then removed. + A lot more could be done here... A look at a mv.c shows a lot of + the issues this implementation glosses over. + + """ + real_dst = dst + if os.path.isdir(dst): + if _samefile(src, dst): + # We might be on a case insensitive filesystem, + # perform the rename anyway. + os.rename(src, dst) + return + + real_dst = os.path.join(dst, _basename(src)) + if os.path.exists(real_dst): + raise Error("Destination path '%s' already exists" % real_dst) + try: + os.rename(src, real_dst) + except OSError: + if os.path.isdir(src): + if _destinsrc(src, dst): + raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst)) + copytree(src, real_dst, symlinks=True) + rmtree(src) + else: + copy2(src, real_dst) + os.unlink(src) + +def _destinsrc(src, dst): + src = abspath(src) + dst = abspath(dst) + if not src.endswith(os.path.sep): + src += os.path.sep + if not dst.endswith(os.path.sep): + dst += os.path.sep + return dst.startswith(src) + +def _get_gid(name): + """Returns a gid, given a group name.""" + if getgrnam is None or name is None: + return None + try: + result = getgrnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _get_uid(name): + """Returns an uid, given a user name.""" + if getpwnam is None or name is None: + return None + try: + result = getpwnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0, + owner=None, group=None, logger=None): + """Create a (possibly compressed) tar file from all the files under + 'base_dir'. + + 'compress' must be "gzip" (the default), "bzip2", or None. + + 'owner' and 'group' can be used to define an owner and a group for the + archive that is being built. If not provided, the current owner and group + will be used. + + The output tar file will be named 'base_name' + ".tar", possibly plus + the appropriate compression extension (".gz", or ".bz2"). + + Returns the output filename. + """ + tar_compression = {'gzip': 'gz', None: ''} + compress_ext = {'gzip': '.gz'} + + if _BZ2_SUPPORTED: + tar_compression['bzip2'] = 'bz2' + compress_ext['bzip2'] = '.bz2' + + # flags for compression program, each element of list will be an argument + if compress is not None and compress not in compress_ext: + raise ValueError("bad value for 'compress', or compression format not " + "supported : {0}".format(compress)) + + archive_name = base_name + '.tar' + compress_ext.get(compress, '') + archive_dir = os.path.dirname(archive_name) + + if not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # creating the tarball + if logger is not None: + logger.info('Creating tar archive') + + uid = _get_uid(owner) + gid = _get_gid(group) + + def _set_uid_gid(tarinfo): + if gid is not None: + tarinfo.gid = gid + tarinfo.gname = group + if uid is not None: + tarinfo.uid = uid + tarinfo.uname = owner + return tarinfo + + if not dry_run: + tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress]) + try: + tar.add(base_dir, filter=_set_uid_gid) + finally: + tar.close() + + return archive_name + +def _call_external_zip(base_dir, zip_filename, verbose=False, dry_run=False): + # XXX see if we want to keep an external call here + if verbose: + zipoptions = "-r" + else: + zipoptions = "-rq" + from distutils.errors import DistutilsExecError + from distutils.spawn import spawn + try: + spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run) + except DistutilsExecError: + # XXX really should distinguish between "couldn't find + # external 'zip' command" and "zip failed". + raise ExecError("unable to create zip file '%s': " + "could neither import the 'zipfile' module nor " + "find a standalone zip utility") % zip_filename + +def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None): + """Create a zip file from all the files under 'base_dir'. + + The output zip file will be named 'base_name' + ".zip". Uses either the + "zipfile" Python module (if available) or the InfoZIP "zip" utility + (if installed and found on the default search path). If neither tool is + available, raises ExecError. Returns the name of the output zip + file. + """ + zip_filename = base_name + ".zip" + archive_dir = os.path.dirname(base_name) + + if not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # If zipfile module is not available, try spawning an external 'zip' + # command. + try: + import zipfile + except ImportError: + zipfile = None + + if zipfile is None: + _call_external_zip(base_dir, zip_filename, verbose, dry_run) + else: + if logger is not None: + logger.info("creating '%s' and adding '%s' to it", + zip_filename, base_dir) + + if not dry_run: + zip = zipfile.ZipFile(zip_filename, "w", + compression=zipfile.ZIP_DEFLATED) + + for dirpath, dirnames, filenames in os.walk(base_dir): + for name in filenames: + path = os.path.normpath(os.path.join(dirpath, name)) + if os.path.isfile(path): + zip.write(path, path) + if logger is not None: + logger.info("adding '%s'", path) + zip.close() + + return zip_filename + +_ARCHIVE_FORMATS = { + 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), + 'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), + 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), + 'zip': (_make_zipfile, [], "ZIP file"), + } + +if _BZ2_SUPPORTED: + _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')], + "bzip2'ed tar-file") + +def get_archive_formats(): + """Returns a list of supported formats for archiving and unarchiving. + + Each element of the returned sequence is a tuple (name, description) + """ + formats = [(name, registry[2]) for name, registry in + _ARCHIVE_FORMATS.items()] + formats.sort() + return formats + +def register_archive_format(name, function, extra_args=None, description=''): + """Registers an archive format. + + name is the name of the format. function is the callable that will be + used to create archives. If provided, extra_args is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_archive_formats() function. + """ + if extra_args is None: + extra_args = [] + if not isinstance(function, Callable): + raise TypeError('The %s object is not callable' % function) + if not isinstance(extra_args, (tuple, list)): + raise TypeError('extra_args needs to be a sequence') + for element in extra_args: + if not isinstance(element, (tuple, list)) or len(element) !=2: + raise TypeError('extra_args elements are : (arg_name, value)') + + _ARCHIVE_FORMATS[name] = (function, extra_args, description) + +def unregister_archive_format(name): + del _ARCHIVE_FORMATS[name] + +def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, + dry_run=0, owner=None, group=None, logger=None): + """Create an archive file (eg. zip or tar). + + 'base_name' is the name of the file to create, minus any format-specific + extension; 'format' is the archive format: one of "zip", "tar", "bztar" + or "gztar". + + 'root_dir' is a directory that will be the root directory of the + archive; ie. we typically chdir into 'root_dir' before creating the + archive. 'base_dir' is the directory where we start archiving from; + ie. 'base_dir' will be the common prefix of all files and + directories in the archive. 'root_dir' and 'base_dir' both default + to the current directory. Returns the name of the archive file. + + 'owner' and 'group' are used when creating a tar archive. By default, + uses the current owner and group. + """ + save_cwd = os.getcwd() + if root_dir is not None: + if logger is not None: + logger.debug("changing into '%s'", root_dir) + base_name = os.path.abspath(base_name) + if not dry_run: + os.chdir(root_dir) + + if base_dir is None: + base_dir = os.curdir + + kwargs = {'dry_run': dry_run, 'logger': logger} + + try: + format_info = _ARCHIVE_FORMATS[format] + except KeyError: + raise ValueError("unknown archive format '%s'" % format) + + func = format_info[0] + for arg, val in format_info[1]: + kwargs[arg] = val + + if format != 'zip': + kwargs['owner'] = owner + kwargs['group'] = group + + try: + filename = func(base_name, base_dir, **kwargs) + finally: + if root_dir is not None: + if logger is not None: + logger.debug("changing back to '%s'", save_cwd) + os.chdir(save_cwd) + + return filename + + +def get_unpack_formats(): + """Returns a list of supported formats for unpacking. + + Each element of the returned sequence is a tuple + (name, extensions, description) + """ + formats = [(name, info[0], info[3]) for name, info in + _UNPACK_FORMATS.items()] + formats.sort() + return formats + +def _check_unpack_options(extensions, function, extra_args): + """Checks what gets registered as an unpacker.""" + # first make sure no other unpacker is registered for this extension + existing_extensions = {} + for name, info in _UNPACK_FORMATS.items(): + for ext in info[0]: + existing_extensions[ext] = name + + for extension in extensions: + if extension in existing_extensions: + msg = '%s is already registered for "%s"' + raise RegistryError(msg % (extension, + existing_extensions[extension])) + + if not isinstance(function, Callable): + raise TypeError('The registered function must be a callable') + + +def register_unpack_format(name, extensions, function, extra_args=None, + description=''): + """Registers an unpack format. + + `name` is the name of the format. `extensions` is a list of extensions + corresponding to the format. + + `function` is the callable that will be + used to unpack archives. The callable will receive archives to unpack. + If it's unable to handle an archive, it needs to raise a ReadError + exception. + + If provided, `extra_args` is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_unpack_formats() function. + """ + if extra_args is None: + extra_args = [] + _check_unpack_options(extensions, function, extra_args) + _UNPACK_FORMATS[name] = extensions, function, extra_args, description + +def unregister_unpack_format(name): + """Removes the pack format from the registry.""" + del _UNPACK_FORMATS[name] + +def _ensure_directory(path): + """Ensure that the parent directory of `path` exists""" + dirname = os.path.dirname(path) + if not os.path.isdir(dirname): + os.makedirs(dirname) + +def _unpack_zipfile(filename, extract_dir): + """Unpack zip `filename` to `extract_dir` + """ + try: + import zipfile + except ImportError: + raise ReadError('zlib not supported, cannot unpack this archive.') + + if not zipfile.is_zipfile(filename): + raise ReadError("%s is not a zip file" % filename) + + zip = zipfile.ZipFile(filename) + try: + for info in zip.infolist(): + name = info.filename + + # don't extract absolute paths or ones with .. in them + if name.startswith('/') or '..' in name: + continue + + target = os.path.join(extract_dir, *name.split('/')) + if not target: + continue + + _ensure_directory(target) + if not name.endswith('/'): + # file + data = zip.read(info.filename) + f = open(target, 'wb') + try: + f.write(data) + finally: + f.close() + del data + finally: + zip.close() + +def _unpack_tarfile(filename, extract_dir): + """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` + """ + try: + tarobj = tarfile.open(filename) + except tarfile.TarError: + raise ReadError( + "%s is not a compressed or uncompressed tar file" % filename) + try: + tarobj.extractall(extract_dir) + finally: + tarobj.close() + +_UNPACK_FORMATS = { + 'gztar': (['.tar.gz', '.tgz'], _unpack_tarfile, [], "gzip'ed tar-file"), + 'tar': (['.tar'], _unpack_tarfile, [], "uncompressed tar file"), + 'zip': (['.zip'], _unpack_zipfile, [], "ZIP file") + } + +if _BZ2_SUPPORTED: + _UNPACK_FORMATS['bztar'] = (['.bz2'], _unpack_tarfile, [], + "bzip2'ed tar-file") + +def _find_unpack_format(filename): + for name, info in _UNPACK_FORMATS.items(): + for extension in info[0]: + if filename.endswith(extension): + return name + return None + +def unpack_archive(filename, extract_dir=None, format=None): + """Unpack an archive. + + `filename` is the name of the archive. + + `extract_dir` is the name of the target directory, where the archive + is unpacked. If not provided, the current working directory is used. + + `format` is the archive format: one of "zip", "tar", or "gztar". Or any + other registered format. If not provided, unpack_archive will use the + filename extension and see if an unpacker was registered for that + extension. + + In case none is found, a ValueError is raised. + """ + if extract_dir is None: + extract_dir = os.getcwd() + + if format is not None: + try: + format_info = _UNPACK_FORMATS[format] + except KeyError: + raise ValueError("Unknown unpack format '{0}'".format(format)) + + func = format_info[1] + func(filename, extract_dir, **dict(format_info[2])) + else: + # we need to look at the registered unpackers supported extensions + format = _find_unpack_format(filename) + if format is None: + raise ReadError("Unknown archive format '{0}'".format(filename)) + + func = _UNPACK_FORMATS[format][1] + kwargs = dict(_UNPACK_FORMATS[format][2]) + func(filename, extract_dir, **kwargs) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/shutil.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d20b4b135bb9038794f1ff7becca4a956a878326 GIT binary patch literal 26318 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 0: + for name in tuple(variables): + value = notdone[name] + m = _findvar1_rx.search(value) or _findvar2_rx.search(value) + if m is not None: + n = m.group(1) + found = True + if n in done: + item = str(done[n]) + elif n in notdone: + # get it on a subsequent round + found = False + elif n in os.environ: + # do it like make: fall back to environment + item = os.environ[n] + + elif n in renamed_variables: + if (name.startswith('PY_') and + name[3:] in renamed_variables): + item = "" + + elif 'PY_' + n in notdone: + found = False + + else: + item = str(done['PY_' + n]) + + else: + done[n] = item = "" + + if found: + after = value[m.end():] + value = value[:m.start()] + item + after + if "$" in after: + notdone[name] = value + else: + try: + value = int(value) + except ValueError: + done[name] = value.strip() + else: + done[name] = value + variables.remove(name) + + if (name.startswith('PY_') and + name[3:] in renamed_variables): + + name = name[3:] + if name not in done: + done[name] = value + + else: + # bogus variable reference (e.g. "prefix=$/opt/python"); + # just drop it since we can't deal + done[name] = value + variables.remove(name) + + # strip spurious spaces + for k, v in done.items(): + if isinstance(v, str): + done[k] = v.strip() + + # save the results in the global dictionary + vars.update(done) + return vars + + +def get_makefile_filename(): + """Return the path of the Makefile.""" + if _PYTHON_BUILD: + return os.path.join(_PROJECT_BASE, "Makefile") + if hasattr(sys, 'abiflags'): + config_dir_name = 'config-%s%s' % (_PY_VERSION_SHORT, sys.abiflags) + else: + config_dir_name = 'config' + return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile') + + +def _init_posix(vars): + """Initialize the module as appropriate for POSIX systems.""" + # load the installed Makefile: + makefile = get_makefile_filename() + try: + _parse_makefile(makefile, vars) + except IOError as e: + msg = "invalid Python installation: unable to open %s" % makefile + if hasattr(e, "strerror"): + msg = msg + " (%s)" % e.strerror + raise IOError(msg) + # load the installed pyconfig.h: + config_h = get_config_h_filename() + try: + with open(config_h) as f: + parse_config_h(f, vars) + except IOError as e: + msg = "invalid Python installation: unable to open %s" % config_h + if hasattr(e, "strerror"): + msg = msg + " (%s)" % e.strerror + raise IOError(msg) + # On AIX, there are wrong paths to the linker scripts in the Makefile + # -- these paths are relative to the Python source, but when installed + # the scripts are in another directory. + if _PYTHON_BUILD: + vars['LDSHARED'] = vars['BLDSHARED'] + + +def _init_non_posix(vars): + """Initialize the module as appropriate for NT""" + # set basic install directories + vars['LIBDEST'] = get_path('stdlib') + vars['BINLIBDEST'] = get_path('platstdlib') + vars['INCLUDEPY'] = get_path('include') + vars['SO'] = '.pyd' + vars['EXE'] = '.exe' + vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT + vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) + +# +# public APIs +# + + +def parse_config_h(fp, vars=None): + """Parse a config.h-style file. + + A dictionary containing name/value pairs is returned. If an + optional dictionary is passed in as the second argument, it is + used instead of a new dictionary. + """ + if vars is None: + vars = {} + define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n") + undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n") + + while True: + line = fp.readline() + if not line: + break + m = define_rx.match(line) + if m: + n, v = m.group(1, 2) + try: + v = int(v) + except ValueError: + pass + vars[n] = v + else: + m = undef_rx.match(line) + if m: + vars[m.group(1)] = 0 + return vars + + +def get_config_h_filename(): + """Return the path of pyconfig.h.""" + if _PYTHON_BUILD: + if os.name == "nt": + inc_dir = os.path.join(_PROJECT_BASE, "PC") + else: + inc_dir = _PROJECT_BASE + else: + inc_dir = get_path('platinclude') + return os.path.join(inc_dir, 'pyconfig.h') + + +def get_scheme_names(): + """Return a tuple containing the schemes names.""" + return tuple(sorted(_SCHEMES.sections())) + + +def get_path_names(): + """Return a tuple containing the paths names.""" + # xxx see if we want a static list + return _SCHEMES.options('posix_prefix') + + +def get_paths(scheme=_get_default_scheme(), vars=None, expand=True): + """Return a mapping containing an install scheme. + + ``scheme`` is the install scheme name. If not provided, it will + return the default scheme for the current platform. + """ + _ensure_cfg_read() + if expand: + return _expand_vars(scheme, vars) + else: + return dict(_SCHEMES.items(scheme)) + + +def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True): + """Return a path corresponding to the scheme. + + ``scheme`` is the install scheme name. + """ + return get_paths(scheme, vars, expand)[name] + + +def get_config_vars(*args): + """With no arguments, return a dictionary of all configuration + variables relevant for the current platform. + + On Unix, this means every variable defined in Python's installed Makefile; + On Windows and Mac OS it's a much smaller set. + + With arguments, return a list of values that result from looking up + each argument in the configuration variable dictionary. + """ + global _CONFIG_VARS + if _CONFIG_VARS is None: + _CONFIG_VARS = {} + # Normalized versions of prefix and exec_prefix are handy to have; + # in fact, these are the standard versions used most places in the + # distutils2 module. + _CONFIG_VARS['prefix'] = _PREFIX + _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX + _CONFIG_VARS['py_version'] = _PY_VERSION + _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT + _CONFIG_VARS['py_version_nodot'] = _PY_VERSION[0] + _PY_VERSION[2] + _CONFIG_VARS['base'] = _PREFIX + _CONFIG_VARS['platbase'] = _EXEC_PREFIX + _CONFIG_VARS['projectbase'] = _PROJECT_BASE + try: + _CONFIG_VARS['abiflags'] = sys.abiflags + except AttributeError: + # sys.abiflags may not be defined on all platforms. + _CONFIG_VARS['abiflags'] = '' + + if os.name in ('nt', 'os2'): + _init_non_posix(_CONFIG_VARS) + if os.name == 'posix': + _init_posix(_CONFIG_VARS) + # Setting 'userbase' is done below the call to the + # init function to enable using 'get_config_var' in + # the init-function. + if sys.version >= '2.6': + _CONFIG_VARS['userbase'] = _getuserbase() + + if 'srcdir' not in _CONFIG_VARS: + _CONFIG_VARS['srcdir'] = _PROJECT_BASE + else: + _CONFIG_VARS['srcdir'] = _safe_realpath(_CONFIG_VARS['srcdir']) + + # Convert srcdir into an absolute path if it appears necessary. + # Normally it is relative to the build directory. However, during + # testing, for example, we might be running a non-installed python + # from a different directory. + if _PYTHON_BUILD and os.name == "posix": + base = _PROJECT_BASE + try: + cwd = os.getcwd() + except OSError: + cwd = None + if (not os.path.isabs(_CONFIG_VARS['srcdir']) and + base != cwd): + # srcdir is relative and we are not in the same directory + # as the executable. Assume executable is in the build + # directory and make srcdir absolute. + srcdir = os.path.join(base, _CONFIG_VARS['srcdir']) + _CONFIG_VARS['srcdir'] = os.path.normpath(srcdir) + + if sys.platform == 'darwin': + kernel_version = os.uname()[2] # Kernel version (8.4.3) + major_version = int(kernel_version.split('.')[0]) + + if major_version < 8: + # On Mac OS X before 10.4, check if -arch and -isysroot + # are in CFLAGS or LDFLAGS and remove them if they are. + # This is needed when building extensions on a 10.3 system + # using a universal build of python. + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + flags = _CONFIG_VARS[key] + flags = re.sub(r'-arch\s+\w+\s', ' ', flags) + flags = re.sub('-isysroot [^ \t]*', ' ', flags) + _CONFIG_VARS[key] = flags + else: + # Allow the user to override the architecture flags using + # an environment variable. + # NOTE: This name was introduced by Apple in OSX 10.5 and + # is used by several scripting languages distributed with + # that OS release. + if 'ARCHFLAGS' in os.environ: + arch = os.environ['ARCHFLAGS'] + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _CONFIG_VARS[key] + flags = re.sub(r'-arch\s+\w+\s', ' ', flags) + flags = flags + ' ' + arch + _CONFIG_VARS[key] = flags + + # If we're on OSX 10.5 or later and the user tries to + # compiles an extension using an SDK that is not present + # on the current machine it is better to not use an SDK + # than to fail. + # + # The major usecase for this is users using a Python.org + # binary installer on OSX 10.6: that installer uses + # the 10.4u SDK, but that SDK is not installed by default + # when you install Xcode. + # + CFLAGS = _CONFIG_VARS.get('CFLAGS', '') + m = re.search(r'-isysroot\s+(\S+)', CFLAGS) + if m is not None: + sdk = m.group(1) + if not os.path.exists(sdk): + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _CONFIG_VARS[key] + flags = re.sub(r'-isysroot\s+\S+(\s|$)', ' ', flags) + _CONFIG_VARS[key] = flags + + if args: + vals = [] + for name in args: + vals.append(_CONFIG_VARS.get(name)) + return vals + else: + return _CONFIG_VARS + + +def get_config_var(name): + """Return the value of a single variable using the dictionary returned by + 'get_config_vars()'. + + Equivalent to get_config_vars().get(name) + """ + return get_config_vars().get(name) + + +def get_platform(): + """Return a string that identifies the current platform. + + This is used mainly to distinguish platform-specific build directories and + platform-specific built distributions. Typically includes the OS name + and version and the architecture (as supplied by 'os.uname()'), + although the exact information included depends on the OS; eg. for IRIX + the architecture isn't particularly important (IRIX only runs on SGI + hardware), but for Linux the kernel version isn't particularly + important. + + Examples of returned values: + linux-i586 + linux-alpha (?) + solaris-2.6-sun4u + irix-5.3 + irix64-6.2 + + Windows will return one of: + win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) + win-ia64 (64bit Windows on Itanium) + win32 (all others - specifically, sys.platform is returned) + + For other non-POSIX platforms, currently just returns 'sys.platform'. + """ + if os.name == 'nt': + # sniff sys.version for architecture. + prefix = " bit (" + i = sys.version.find(prefix) + if i == -1: + return sys.platform + j = sys.version.find(")", i) + look = sys.version[i+len(prefix):j].lower() + if look == 'amd64': + return 'win-amd64' + if look == 'itanium': + return 'win-ia64' + return sys.platform + + if os.name != "posix" or not hasattr(os, 'uname'): + # XXX what about the architecture? NT is Intel or Alpha, + # Mac OS is M68k or PPC, etc. + return sys.platform + + # Try to distinguish various flavours of Unix + osname, host, release, version, machine = os.uname() + + # Convert the OS name to lowercase, remove '/' characters + # (to accommodate BSD/OS), and translate spaces (for "Power Macintosh") + osname = osname.lower().replace('/', '') + machine = machine.replace(' ', '_') + machine = machine.replace('/', '-') + + if osname[:5] == "linux": + # At least on Linux/Intel, 'machine' is the processor -- + # i386, etc. + # XXX what about Alpha, SPARC, etc? + return "%s-%s" % (osname, machine) + elif osname[:5] == "sunos": + if release[0] >= "5": # SunOS 5 == Solaris 2 + osname = "solaris" + release = "%d.%s" % (int(release[0]) - 3, release[2:]) + # fall through to standard osname-release-machine representation + elif osname[:4] == "irix": # could be "irix64"! + return "%s-%s" % (osname, release) + elif osname[:3] == "aix": + return "%s-%s.%s" % (osname, version, release) + elif osname[:6] == "cygwin": + osname = "cygwin" + rel_re = re.compile(r'[\d.]+') + m = rel_re.match(release) + if m: + release = m.group() + elif osname[:6] == "darwin": + # + # For our purposes, we'll assume that the system version from + # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set + # to. This makes the compatibility story a bit more sane because the + # machine is going to compile and link as if it were + # MACOSX_DEPLOYMENT_TARGET. + cfgvars = get_config_vars() + macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET') + + if True: + # Always calculate the release of the running machine, + # needed to determine if we can build fat binaries or not. + + macrelease = macver + # Get the system version. Reading this plist is a documented + # way to get the system version (see the documentation for + # the Gestalt Manager) + try: + f = open('/System/Library/CoreServices/SystemVersion.plist') + except IOError: + # We're on a plain darwin box, fall back to the default + # behaviour. + pass + else: + try: + m = re.search(r'ProductUserVisibleVersion\s*' + r'(.*?)', f.read()) + finally: + f.close() + if m is not None: + macrelease = '.'.join(m.group(1).split('.')[:2]) + # else: fall back to the default behaviour + + if not macver: + macver = macrelease + + if macver: + release = macver + osname = "macosx" + + if ((macrelease + '.') >= '10.4.' and + '-arch' in get_config_vars().get('CFLAGS', '').strip()): + # The universal build will build fat binaries, but not on + # systems before 10.4 + # + # Try to detect 4-way universal builds, those have machine-type + # 'universal' instead of 'fat'. + + machine = 'fat' + cflags = get_config_vars().get('CFLAGS') + + archs = re.findall(r'-arch\s+(\S+)', cflags) + archs = tuple(sorted(set(archs))) + + if len(archs) == 1: + machine = archs[0] + elif archs == ('i386', 'ppc'): + machine = 'fat' + elif archs == ('i386', 'x86_64'): + machine = 'intel' + elif archs == ('i386', 'ppc', 'x86_64'): + machine = 'fat3' + elif archs == ('ppc64', 'x86_64'): + machine = 'fat64' + elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'): + machine = 'universal' + else: + raise ValueError( + "Don't know machine value for archs=%r" % (archs,)) + + elif machine == 'i386': + # On OSX the machine type returned by uname is always the + # 32-bit variant, even if the executable architecture is + # the 64-bit variant + if sys.maxsize >= 2**32: + machine = 'x86_64' + + elif machine in ('PowerPC', 'Power_Macintosh'): + # Pick a sane name for the PPC architecture. + # See 'i386' case + if sys.maxsize >= 2**32: + machine = 'ppc64' + else: + machine = 'ppc' + + return "%s-%s-%s" % (osname, release, machine) + + +def get_python_version(): + return _PY_VERSION_SHORT + + +def _print_dict(title, data): + for index, (key, value) in enumerate(sorted(data.items())): + if index == 0: + print('%s: ' % (title)) + print('\t%s = "%s"' % (key, value)) + + +def _main(): + """Display all information sysconfig detains.""" + print('Platform: "%s"' % get_platform()) + print('Python version: "%s"' % get_python_version()) + print('Current installation scheme: "%s"' % _get_default_scheme()) + print() + _print_dict('Paths', get_paths()) + print() + _print_dict('Variables', get_config_vars()) + + +if __name__ == '__main__': + _main() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2f3585162884092f03e6288b5e242f88e3b2762 GIT binary patch literal 20670 zcmdUXYit}@cHXV(R+CMUB1MXnC}}jM*QzOr9bI(1`dzty~T^;}S!|#;JD*3k`zu&^AA7qsB zmAa46QogM!mb#CKiQDSFoyIfjekP4))%~o*Gpe#rt>@JJoLX;F_uG`U)st3gSNGf1 zeDwvD4f1NOLq#7b%d(Q5J6Kq?)IA>^?NfeE`EAN?SAJgk9m?OY{7&U}DgS_axL@5z zvRi!#v+PtsR;_la=wGV9R;vfpYPSl~%%_&Z&;1@%?UhVaIH;bgB$M@fmEWV*Y!wwO z|DXym)n4`DY9A}D<(SL9OuvU%9OTqfJMC0SQL~Gx<@ZS!hg!R+KBEivlKCro`L^Zv zOD_Yhy?pzx@5MhX072t^PXGRZ3Jxppi1Lp}{-6rl)#_0xI;Mh*T0O4(L7Bu0%0DV~ zPADHmfailM=b8{8JJcR{m*;j41z%L`Ic=Rw6I4t^XPICG6?T%0DNWmy}+V#O|B~cWr~MuAtUd+|!# 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 z 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py new file mode 100644 index 0000000..d66d856 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py @@ -0,0 +1,2607 @@ +#------------------------------------------------------------------- +# tarfile.py +#------------------------------------------------------------------- +# Copyright (C) 2002 Lars Gustaebel +# All rights reserved. +# +# 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. +# +from __future__ import print_function + +"""Read from and write to tar format archives. +""" + +__version__ = "$Revision$" + +version = "0.9.0" +__author__ = "Lars Gust\u00e4bel (lars@gustaebel.de)" +__date__ = "$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $" +__cvsid__ = "$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $" +__credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend." + +#--------- +# Imports +#--------- +import sys +import os +import stat +import errno +import time +import struct +import copy +import re + +try: + import grp, pwd +except ImportError: + grp = pwd = None + +# os.symlink on Windows prior to 6.0 raises NotImplementedError +symlink_exception = (AttributeError, NotImplementedError) +try: + # WindowsError (1314) will be raised if the caller does not hold the + # SeCreateSymbolicLinkPrivilege privilege + symlink_exception += (WindowsError,) +except NameError: + pass + +# from tarfile import * +__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError"] + +if sys.version_info[0] < 3: + import __builtin__ as builtins +else: + import builtins + +_open = builtins.open # Since 'open' is TarFile.open + +#--------------------------------------------------------- +# tar constants +#--------------------------------------------------------- +NUL = b"\0" # the null character +BLOCKSIZE = 512 # length of processing blocks +RECORDSIZE = BLOCKSIZE * 20 # length of records +GNU_MAGIC = b"ustar \0" # magic gnu tar string +POSIX_MAGIC = b"ustar\x0000" # magic posix tar string + +LENGTH_NAME = 100 # maximum length of a filename +LENGTH_LINK = 100 # maximum length of a linkname +LENGTH_PREFIX = 155 # maximum length of the prefix field + +REGTYPE = b"0" # regular file +AREGTYPE = b"\0" # regular file +LNKTYPE = b"1" # link (inside tarfile) +SYMTYPE = b"2" # symbolic link +CHRTYPE = b"3" # character special device +BLKTYPE = b"4" # block special device +DIRTYPE = b"5" # directory +FIFOTYPE = b"6" # fifo special device +CONTTYPE = b"7" # contiguous file + +GNUTYPE_LONGNAME = b"L" # GNU tar longname +GNUTYPE_LONGLINK = b"K" # GNU tar longlink +GNUTYPE_SPARSE = b"S" # GNU tar sparse file + +XHDTYPE = b"x" # POSIX.1-2001 extended header +XGLTYPE = b"g" # POSIX.1-2001 global header +SOLARIS_XHDTYPE = b"X" # Solaris extended header + +USTAR_FORMAT = 0 # POSIX.1-1988 (ustar) format +GNU_FORMAT = 1 # GNU tar format +PAX_FORMAT = 2 # POSIX.1-2001 (pax) format +DEFAULT_FORMAT = GNU_FORMAT + +#--------------------------------------------------------- +# tarfile constants +#--------------------------------------------------------- +# File types that tarfile supports: +SUPPORTED_TYPES = (REGTYPE, AREGTYPE, LNKTYPE, + SYMTYPE, DIRTYPE, FIFOTYPE, + CONTTYPE, CHRTYPE, BLKTYPE, + GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, + GNUTYPE_SPARSE) + +# File types that will be treated as a regular file. +REGULAR_TYPES = (REGTYPE, AREGTYPE, + CONTTYPE, GNUTYPE_SPARSE) + +# File types that are part of the GNU tar format. +GNU_TYPES = (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, + GNUTYPE_SPARSE) + +# Fields from a pax header that override a TarInfo attribute. +PAX_FIELDS = ("path", "linkpath", "size", "mtime", + "uid", "gid", "uname", "gname") + +# Fields from a pax header that are affected by hdrcharset. +PAX_NAME_FIELDS = set(("path", "linkpath", "uname", "gname")) + +# Fields in a pax header that are numbers, all other fields +# are treated as strings. +PAX_NUMBER_FIELDS = { + "atime": float, + "ctime": float, + "mtime": float, + "uid": int, + "gid": int, + "size": int +} + +#--------------------------------------------------------- +# Bits used in the mode field, values in octal. +#--------------------------------------------------------- +S_IFLNK = 0o120000 # symbolic link +S_IFREG = 0o100000 # regular file +S_IFBLK = 0o060000 # block device +S_IFDIR = 0o040000 # directory +S_IFCHR = 0o020000 # character device +S_IFIFO = 0o010000 # fifo + +TSUID = 0o4000 # set UID on execution +TSGID = 0o2000 # set GID on execution +TSVTX = 0o1000 # reserved + +TUREAD = 0o400 # read by owner +TUWRITE = 0o200 # write by owner +TUEXEC = 0o100 # execute/search by owner +TGREAD = 0o040 # read by group +TGWRITE = 0o020 # write by group +TGEXEC = 0o010 # execute/search by group +TOREAD = 0o004 # read by other +TOWRITE = 0o002 # write by other +TOEXEC = 0o001 # execute/search by other + +#--------------------------------------------------------- +# initialization +#--------------------------------------------------------- +if os.name in ("nt", "ce"): + ENCODING = "utf-8" +else: + ENCODING = sys.getfilesystemencoding() + +#--------------------------------------------------------- +# Some useful functions +#--------------------------------------------------------- + +def stn(s, length, encoding, errors): + """Convert a string to a null-terminated bytes object. + """ + s = s.encode(encoding, errors) + return s[:length] + (length - len(s)) * NUL + +def nts(s, encoding, errors): + """Convert a null-terminated bytes object to a string. + """ + p = s.find(b"\0") + if p != -1: + s = s[:p] + return s.decode(encoding, errors) + +def nti(s): + """Convert a number field to a python number. + """ + # There are two possible encodings for a number field, see + # itn() below. + if s[0] != chr(0o200): + try: + n = int(nts(s, "ascii", "strict") or "0", 8) + except ValueError: + raise InvalidHeaderError("invalid header") + else: + n = 0 + for i in range(len(s) - 1): + n <<= 8 + n += ord(s[i + 1]) + return n + +def itn(n, digits=8, format=DEFAULT_FORMAT): + """Convert a python number to a number field. + """ + # POSIX 1003.1-1988 requires numbers to be encoded as a string of + # octal digits followed by a null-byte, this allows values up to + # (8**(digits-1))-1. GNU tar allows storing numbers greater than + # that if necessary. A leading 0o200 byte indicates this particular + # encoding, the following digits-1 bytes are a big-endian + # representation. This allows values up to (256**(digits-1))-1. + if 0 <= n < 8 ** (digits - 1): + s = ("%0*o" % (digits - 1, n)).encode("ascii") + NUL + else: + if format != GNU_FORMAT or n >= 256 ** (digits - 1): + raise ValueError("overflow in number field") + + if n < 0: + # XXX We mimic GNU tar's behaviour with negative numbers, + # this could raise OverflowError. + n = struct.unpack("L", struct.pack("l", n))[0] + + s = bytearray() + for i in range(digits - 1): + s.insert(0, n & 0o377) + n >>= 8 + s.insert(0, 0o200) + return s + +def calc_chksums(buf): + """Calculate the checksum for a member's header by summing up all + characters except for the chksum field which is treated as if + it was filled with spaces. According to the GNU tar sources, + some tars (Sun and NeXT) calculate chksum with signed char, + which will be different if there are chars in the buffer with + the high bit set. So we calculate two checksums, unsigned and + signed. + """ + unsigned_chksum = 256 + sum(struct.unpack("148B", buf[:148]) + struct.unpack("356B", buf[156:512])) + signed_chksum = 256 + sum(struct.unpack("148b", buf[:148]) + struct.unpack("356b", buf[156:512])) + return unsigned_chksum, signed_chksum + +def copyfileobj(src, dst, length=None): + """Copy length bytes from fileobj src to fileobj dst. + If length is None, copy the entire content. + """ + if length == 0: + return + if length is None: + while True: + buf = src.read(16*1024) + if not buf: + break + dst.write(buf) + return + + BUFSIZE = 16 * 1024 + blocks, remainder = divmod(length, BUFSIZE) + for b in range(blocks): + buf = src.read(BUFSIZE) + if len(buf) < BUFSIZE: + raise IOError("end of file reached") + dst.write(buf) + + if remainder != 0: + buf = src.read(remainder) + if len(buf) < remainder: + raise IOError("end of file reached") + dst.write(buf) + return + +filemode_table = ( + ((S_IFLNK, "l"), + (S_IFREG, "-"), + (S_IFBLK, "b"), + (S_IFDIR, "d"), + (S_IFCHR, "c"), + (S_IFIFO, "p")), + + ((TUREAD, "r"),), + ((TUWRITE, "w"),), + ((TUEXEC|TSUID, "s"), + (TSUID, "S"), + (TUEXEC, "x")), + + ((TGREAD, "r"),), + ((TGWRITE, "w"),), + ((TGEXEC|TSGID, "s"), + (TSGID, "S"), + (TGEXEC, "x")), + + ((TOREAD, "r"),), + ((TOWRITE, "w"),), + ((TOEXEC|TSVTX, "t"), + (TSVTX, "T"), + (TOEXEC, "x")) +) + +def filemode(mode): + """Convert a file's mode to a string of the form + -rwxrwxrwx. + Used by TarFile.list() + """ + perm = [] + for table in filemode_table: + for bit, char in table: + if mode & bit == bit: + perm.append(char) + break + else: + perm.append("-") + return "".join(perm) + +class TarError(Exception): + """Base exception.""" + pass +class ExtractError(TarError): + """General exception for extract errors.""" + pass +class ReadError(TarError): + """Exception for unreadable tar archives.""" + pass +class CompressionError(TarError): + """Exception for unavailable compression methods.""" + pass +class StreamError(TarError): + """Exception for unsupported operations on stream-like TarFiles.""" + pass +class HeaderError(TarError): + """Base exception for header errors.""" + pass +class EmptyHeaderError(HeaderError): + """Exception for empty headers.""" + pass +class TruncatedHeaderError(HeaderError): + """Exception for truncated headers.""" + pass +class EOFHeaderError(HeaderError): + """Exception for end of file headers.""" + pass +class InvalidHeaderError(HeaderError): + """Exception for invalid headers.""" + pass +class SubsequentHeaderError(HeaderError): + """Exception for missing and invalid extended headers.""" + pass + +#--------------------------- +# internal stream interface +#--------------------------- +class _LowLevelFile(object): + """Low-level file object. Supports reading and writing. + It is used instead of a regular file object for streaming + access. + """ + + def __init__(self, name, mode): + mode = { + "r": os.O_RDONLY, + "w": os.O_WRONLY | os.O_CREAT | os.O_TRUNC, + }[mode] + if hasattr(os, "O_BINARY"): + mode |= os.O_BINARY + self.fd = os.open(name, mode, 0o666) + + def close(self): + os.close(self.fd) + + def read(self, size): + return os.read(self.fd, size) + + def write(self, s): + os.write(self.fd, s) + +class _Stream(object): + """Class that serves as an adapter between TarFile and + a stream-like object. The stream-like object only + needs to have a read() or write() method and is accessed + blockwise. Use of gzip or bzip2 compression is possible. + A stream-like object could be for example: sys.stdin, + sys.stdout, a socket, a tape device etc. + + _Stream is intended to be used only internally. + """ + + def __init__(self, name, mode, comptype, fileobj, bufsize): + """Construct a _Stream object. + """ + self._extfileobj = True + if fileobj is None: + fileobj = _LowLevelFile(name, mode) + self._extfileobj = False + + if comptype == '*': + # Enable transparent compression detection for the + # stream interface + fileobj = _StreamProxy(fileobj) + comptype = fileobj.getcomptype() + + self.name = name or "" + self.mode = mode + self.comptype = comptype + self.fileobj = fileobj + self.bufsize = bufsize + self.buf = b"" + self.pos = 0 + self.closed = False + + try: + if comptype == "gz": + try: + import zlib + except ImportError: + raise CompressionError("zlib module is not available") + self.zlib = zlib + self.crc = zlib.crc32(b"") + if mode == "r": + self._init_read_gz() + else: + self._init_write_gz() + + if comptype == "bz2": + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + if mode == "r": + self.dbuf = b"" + self.cmp = bz2.BZ2Decompressor() + else: + self.cmp = bz2.BZ2Compressor() + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise + + def __del__(self): + if hasattr(self, "closed") and not self.closed: + self.close() + + def _init_write_gz(self): + """Initialize for writing with gzip compression. + """ + self.cmp = self.zlib.compressobj(9, self.zlib.DEFLATED, + -self.zlib.MAX_WBITS, + self.zlib.DEF_MEM_LEVEL, + 0) + timestamp = struct.pack(" self.bufsize: + self.fileobj.write(self.buf[:self.bufsize]) + self.buf = self.buf[self.bufsize:] + + def close(self): + """Close the _Stream object. No operation should be + done on it afterwards. + """ + if self.closed: + return + + if self.mode == "w" and self.comptype != "tar": + self.buf += self.cmp.flush() + + if self.mode == "w" and self.buf: + self.fileobj.write(self.buf) + self.buf = b"" + if self.comptype == "gz": + # The native zlib crc is an unsigned 32-bit integer, but + # the Python wrapper implicitly casts that to a signed C + # long. So, on a 32-bit box self.crc may "look negative", + # while the same crc on a 64-bit box may "look positive". + # To avoid irksome warnings from the `struct` module, force + # it to look positive on all boxes. + self.fileobj.write(struct.pack("= 0: + blocks, remainder = divmod(pos - self.pos, self.bufsize) + for i in range(blocks): + self.read(self.bufsize) + self.read(remainder) + else: + raise StreamError("seeking backwards is not allowed") + return self.pos + + def read(self, size=None): + """Return the next size number of bytes from the stream. + If size is not defined, return all bytes of the stream + up to EOF. + """ + if size is None: + t = [] + while True: + buf = self._read(self.bufsize) + if not buf: + break + t.append(buf) + buf = "".join(t) + else: + buf = self._read(size) + self.pos += len(buf) + return buf + + def _read(self, size): + """Return size bytes from the stream. + """ + if self.comptype == "tar": + return self.__read(size) + + c = len(self.dbuf) + while c < size: + buf = self.__read(self.bufsize) + if not buf: + break + try: + buf = self.cmp.decompress(buf) + except IOError: + raise ReadError("invalid compressed data") + self.dbuf += buf + c += len(buf) + buf = self.dbuf[:size] + self.dbuf = self.dbuf[size:] + return buf + + def __read(self, size): + """Return size bytes from stream. If internal buffer is empty, + read another block from the stream. + """ + c = len(self.buf) + while c < size: + buf = self.fileobj.read(self.bufsize) + if not buf: + break + self.buf += buf + c += len(buf) + buf = self.buf[:size] + self.buf = self.buf[size:] + return buf +# class _Stream + +class _StreamProxy(object): + """Small proxy class that enables transparent compression + detection for the Stream interface (mode 'r|*'). + """ + + def __init__(self, fileobj): + self.fileobj = fileobj + self.buf = self.fileobj.read(BLOCKSIZE) + + def read(self, size): + self.read = self.fileobj.read + return self.buf + + def getcomptype(self): + if self.buf.startswith(b"\037\213\010"): + return "gz" + if self.buf.startswith(b"BZh91"): + return "bz2" + return "tar" + + def close(self): + self.fileobj.close() +# class StreamProxy + +class _BZ2Proxy(object): + """Small proxy class that enables external file object + support for "r:bz2" and "w:bz2" modes. This is actually + a workaround for a limitation in bz2 module's BZ2File + class which (unlike gzip.GzipFile) has no support for + a file object argument. + """ + + blocksize = 16 * 1024 + + def __init__(self, fileobj, mode): + self.fileobj = fileobj + self.mode = mode + self.name = getattr(self.fileobj, "name", None) + self.init() + + def init(self): + import bz2 + self.pos = 0 + if self.mode == "r": + self.bz2obj = bz2.BZ2Decompressor() + self.fileobj.seek(0) + self.buf = b"" + else: + self.bz2obj = bz2.BZ2Compressor() + + def read(self, size): + x = len(self.buf) + while x < size: + raw = self.fileobj.read(self.blocksize) + if not raw: + break + data = self.bz2obj.decompress(raw) + self.buf += data + x += len(data) + + buf = self.buf[:size] + self.buf = self.buf[size:] + self.pos += len(buf) + return buf + + def seek(self, pos): + if pos < self.pos: + self.init() + self.read(pos - self.pos) + + def tell(self): + return self.pos + + def write(self, data): + self.pos += len(data) + raw = self.bz2obj.compress(data) + self.fileobj.write(raw) + + def close(self): + if self.mode == "w": + raw = self.bz2obj.flush() + self.fileobj.write(raw) +# class _BZ2Proxy + +#------------------------ +# Extraction file object +#------------------------ +class _FileInFile(object): + """A thin wrapper around an existing file object that + provides a part of its data as an individual file + object. + """ + + def __init__(self, fileobj, offset, size, blockinfo=None): + self.fileobj = fileobj + self.offset = offset + self.size = size + self.position = 0 + + if blockinfo is None: + blockinfo = [(0, size)] + + # Construct a map with data and zero blocks. + self.map_index = 0 + self.map = [] + lastpos = 0 + realpos = self.offset + for offset, size in blockinfo: + if offset > lastpos: + self.map.append((False, lastpos, offset, None)) + self.map.append((True, offset, offset + size, realpos)) + realpos += size + lastpos = offset + size + if lastpos < self.size: + self.map.append((False, lastpos, self.size, None)) + + def seekable(self): + if not hasattr(self.fileobj, "seekable"): + # XXX gzip.GzipFile and bz2.BZ2File + return True + return self.fileobj.seekable() + + def tell(self): + """Return the current file position. + """ + return self.position + + def seek(self, position): + """Seek to a position in the file. + """ + self.position = position + + def read(self, size=None): + """Read data from the file. + """ + if size is None: + size = self.size - self.position + else: + size = min(size, self.size - self.position) + + buf = b"" + while size > 0: + while True: + data, start, stop, offset = self.map[self.map_index] + if start <= self.position < stop: + break + else: + self.map_index += 1 + if self.map_index == len(self.map): + self.map_index = 0 + length = min(size, stop - self.position) + if data: + self.fileobj.seek(offset + (self.position - start)) + buf += self.fileobj.read(length) + else: + buf += NUL * length + size -= length + self.position += length + return buf +#class _FileInFile + + +class ExFileObject(object): + """File-like object for reading an archive member. + Is returned by TarFile.extractfile(). + """ + blocksize = 1024 + + def __init__(self, tarfile, tarinfo): + self.fileobj = _FileInFile(tarfile.fileobj, + tarinfo.offset_data, + tarinfo.size, + tarinfo.sparse) + self.name = tarinfo.name + self.mode = "r" + self.closed = False + self.size = tarinfo.size + + self.position = 0 + self.buffer = b"" + + def readable(self): + return True + + def writable(self): + return False + + def seekable(self): + return self.fileobj.seekable() + + def read(self, size=None): + """Read at most size bytes from the file. If size is not + present or None, read all data until EOF is reached. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + buf = b"" + if self.buffer: + if size is None: + buf = self.buffer + self.buffer = b"" + else: + buf = self.buffer[:size] + self.buffer = self.buffer[size:] + + if size is None: + buf += self.fileobj.read() + else: + buf += self.fileobj.read(size - len(buf)) + + self.position += len(buf) + return buf + + # XXX TextIOWrapper uses the read1() method. + read1 = read + + def readline(self, size=-1): + """Read one entire line from the file. If size is present + and non-negative, return a string with at most that + size, which may be an incomplete line. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + pos = self.buffer.find(b"\n") + 1 + if pos == 0: + # no newline found. + while True: + buf = self.fileobj.read(self.blocksize) + self.buffer += buf + if not buf or b"\n" in buf: + pos = self.buffer.find(b"\n") + 1 + if pos == 0: + # no newline found. + pos = len(self.buffer) + break + + if size != -1: + pos = min(size, pos) + + buf = self.buffer[:pos] + self.buffer = self.buffer[pos:] + self.position += len(buf) + return buf + + def readlines(self): + """Return a list with all remaining lines. + """ + result = [] + while True: + line = self.readline() + if not line: break + result.append(line) + return result + + def tell(self): + """Return the current file position. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + return self.position + + def seek(self, pos, whence=os.SEEK_SET): + """Seek to a position in the file. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + if whence == os.SEEK_SET: + self.position = min(max(pos, 0), self.size) + elif whence == os.SEEK_CUR: + if pos < 0: + self.position = max(self.position + pos, 0) + else: + self.position = min(self.position + pos, self.size) + elif whence == os.SEEK_END: + self.position = max(min(self.size + pos, self.size), 0) + else: + raise ValueError("Invalid argument") + + self.buffer = b"" + self.fileobj.seek(self.position) + + def close(self): + """Close the file object. + """ + self.closed = True + + def __iter__(self): + """Get an iterator over the file's lines. + """ + while True: + line = self.readline() + if not line: + break + yield line +#class ExFileObject + +#------------------ +# Exported Classes +#------------------ +class TarInfo(object): + """Informational class which holds the details about an + archive member given by a tar header block. + TarInfo objects are returned by TarFile.getmember(), + TarFile.getmembers() and TarFile.gettarinfo() and are + usually created internally. + """ + + __slots__ = ("name", "mode", "uid", "gid", "size", "mtime", + "chksum", "type", "linkname", "uname", "gname", + "devmajor", "devminor", + "offset", "offset_data", "pax_headers", "sparse", + "tarfile", "_sparse_structs", "_link_target") + + def __init__(self, name=""): + """Construct a TarInfo object. name is the optional name + of the member. + """ + self.name = name # member name + self.mode = 0o644 # file permissions + self.uid = 0 # user id + self.gid = 0 # group id + self.size = 0 # file size + self.mtime = 0 # modification time + self.chksum = 0 # header checksum + self.type = REGTYPE # member type + self.linkname = "" # link name + self.uname = "" # user name + self.gname = "" # group name + self.devmajor = 0 # device major number + self.devminor = 0 # device minor number + + self.offset = 0 # the tar header starts here + self.offset_data = 0 # the file's data starts here + + self.sparse = None # sparse member information + self.pax_headers = {} # pax header information + + # In pax headers the "name" and "linkname" field are called + # "path" and "linkpath". + def _getpath(self): + return self.name + def _setpath(self, name): + self.name = name + path = property(_getpath, _setpath) + + def _getlinkpath(self): + return self.linkname + def _setlinkpath(self, linkname): + self.linkname = linkname + linkpath = property(_getlinkpath, _setlinkpath) + + def __repr__(self): + return "<%s %r at %#x>" % (self.__class__.__name__,self.name,id(self)) + + def get_info(self): + """Return the TarInfo's attributes as a dictionary. + """ + info = { + "name": self.name, + "mode": self.mode & 0o7777, + "uid": self.uid, + "gid": self.gid, + "size": self.size, + "mtime": self.mtime, + "chksum": self.chksum, + "type": self.type, + "linkname": self.linkname, + "uname": self.uname, + "gname": self.gname, + "devmajor": self.devmajor, + "devminor": self.devminor + } + + if info["type"] == DIRTYPE and not info["name"].endswith("/"): + info["name"] += "/" + + return info + + def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING, errors="surrogateescape"): + """Return a tar header as a string of 512 byte blocks. + """ + info = self.get_info() + + if format == USTAR_FORMAT: + return self.create_ustar_header(info, encoding, errors) + elif format == GNU_FORMAT: + return self.create_gnu_header(info, encoding, errors) + elif format == PAX_FORMAT: + return self.create_pax_header(info, encoding) + else: + raise ValueError("invalid format") + + def create_ustar_header(self, info, encoding, errors): + """Return the object as a ustar header block. + """ + info["magic"] = POSIX_MAGIC + + if len(info["linkname"]) > LENGTH_LINK: + raise ValueError("linkname is too long") + + if len(info["name"]) > LENGTH_NAME: + info["prefix"], info["name"] = self._posix_split_name(info["name"]) + + return self._create_header(info, USTAR_FORMAT, encoding, errors) + + def create_gnu_header(self, info, encoding, errors): + """Return the object as a GNU header block sequence. + """ + info["magic"] = GNU_MAGIC + + buf = b"" + if len(info["linkname"]) > LENGTH_LINK: + buf += self._create_gnu_long_header(info["linkname"], GNUTYPE_LONGLINK, encoding, errors) + + if len(info["name"]) > LENGTH_NAME: + buf += self._create_gnu_long_header(info["name"], GNUTYPE_LONGNAME, encoding, errors) + + return buf + self._create_header(info, GNU_FORMAT, encoding, errors) + + def create_pax_header(self, info, encoding): + """Return the object as a ustar header block. If it cannot be + represented this way, prepend a pax extended header sequence + with supplement information. + """ + info["magic"] = POSIX_MAGIC + pax_headers = self.pax_headers.copy() + + # Test string fields for values that exceed the field length or cannot + # be represented in ASCII encoding. + for name, hname, length in ( + ("name", "path", LENGTH_NAME), ("linkname", "linkpath", LENGTH_LINK), + ("uname", "uname", 32), ("gname", "gname", 32)): + + if hname in pax_headers: + # The pax header has priority. + continue + + # Try to encode the string as ASCII. + try: + info[name].encode("ascii", "strict") + except UnicodeEncodeError: + pax_headers[hname] = info[name] + continue + + if len(info[name]) > length: + pax_headers[hname] = info[name] + + # Test number fields for values that exceed the field limit or values + # that like to be stored as float. + for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)): + if name in pax_headers: + # The pax header has priority. Avoid overflow. + info[name] = 0 + continue + + val = info[name] + if not 0 <= val < 8 ** (digits - 1) or isinstance(val, float): + pax_headers[name] = str(val) + info[name] = 0 + + # Create a pax extended header if necessary. + if pax_headers: + buf = self._create_pax_generic_header(pax_headers, XHDTYPE, encoding) + else: + buf = b"" + + return buf + self._create_header(info, USTAR_FORMAT, "ascii", "replace") + + @classmethod + def create_pax_global_header(cls, pax_headers): + """Return the object as a pax global header block sequence. + """ + return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf8") + + def _posix_split_name(self, name): + """Split a name longer than 100 chars into a prefix + and a name part. + """ + prefix = name[:LENGTH_PREFIX + 1] + while prefix and prefix[-1] != "/": + prefix = prefix[:-1] + + name = name[len(prefix):] + prefix = prefix[:-1] + + if not prefix or len(name) > LENGTH_NAME: + raise ValueError("name is too long") + return prefix, name + + @staticmethod + def _create_header(info, format, encoding, errors): + """Return a header block. info is a dictionary with file + information, format must be one of the *_FORMAT constants. + """ + parts = [ + stn(info.get("name", ""), 100, encoding, errors), + itn(info.get("mode", 0) & 0o7777, 8, format), + itn(info.get("uid", 0), 8, format), + itn(info.get("gid", 0), 8, format), + itn(info.get("size", 0), 12, format), + itn(info.get("mtime", 0), 12, format), + b" ", # checksum field + info.get("type", REGTYPE), + stn(info.get("linkname", ""), 100, encoding, errors), + info.get("magic", POSIX_MAGIC), + stn(info.get("uname", ""), 32, encoding, errors), + stn(info.get("gname", ""), 32, encoding, errors), + itn(info.get("devmajor", 0), 8, format), + itn(info.get("devminor", 0), 8, format), + stn(info.get("prefix", ""), 155, encoding, errors) + ] + + buf = struct.pack("%ds" % BLOCKSIZE, b"".join(parts)) + chksum = calc_chksums(buf[-BLOCKSIZE:])[0] + buf = buf[:-364] + ("%06o\0" % chksum).encode("ascii") + buf[-357:] + return buf + + @staticmethod + def _create_payload(payload): + """Return the string payload filled with zero bytes + up to the next 512 byte border. + """ + blocks, remainder = divmod(len(payload), BLOCKSIZE) + if remainder > 0: + payload += (BLOCKSIZE - remainder) * NUL + return payload + + @classmethod + def _create_gnu_long_header(cls, name, type, encoding, errors): + """Return a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence + for name. + """ + name = name.encode(encoding, errors) + NUL + + info = {} + info["name"] = "././@LongLink" + info["type"] = type + info["size"] = len(name) + info["magic"] = GNU_MAGIC + + # create extended header + name blocks. + return cls._create_header(info, USTAR_FORMAT, encoding, errors) + \ + cls._create_payload(name) + + @classmethod + def _create_pax_generic_header(cls, pax_headers, type, encoding): + """Return a POSIX.1-2008 extended or global header sequence + that contains a list of keyword, value pairs. The values + must be strings. + """ + # Check if one of the fields contains surrogate characters and thereby + # forces hdrcharset=BINARY, see _proc_pax() for more information. + binary = False + for keyword, value in pax_headers.items(): + try: + value.encode("utf8", "strict") + except UnicodeEncodeError: + binary = True + break + + records = b"" + if binary: + # Put the hdrcharset field at the beginning of the header. + records += b"21 hdrcharset=BINARY\n" + + for keyword, value in pax_headers.items(): + keyword = keyword.encode("utf8") + if binary: + # Try to restore the original byte representation of `value'. + # Needless to say, that the encoding must match the string. + value = value.encode(encoding, "surrogateescape") + else: + value = value.encode("utf8") + + l = len(keyword) + len(value) + 3 # ' ' + '=' + '\n' + n = p = 0 + while True: + n = l + len(str(p)) + if n == p: + break + p = n + records += bytes(str(p), "ascii") + b" " + keyword + b"=" + value + b"\n" + + # We use a hardcoded "././@PaxHeader" name like star does + # instead of the one that POSIX recommends. + info = {} + info["name"] = "././@PaxHeader" + info["type"] = type + info["size"] = len(records) + info["magic"] = POSIX_MAGIC + + # Create pax header + record blocks. + return cls._create_header(info, USTAR_FORMAT, "ascii", "replace") + \ + cls._create_payload(records) + + @classmethod + def frombuf(cls, buf, encoding, errors): + """Construct a TarInfo object from a 512 byte bytes object. + """ + if len(buf) == 0: + raise EmptyHeaderError("empty header") + if len(buf) != BLOCKSIZE: + raise TruncatedHeaderError("truncated header") + if buf.count(NUL) == BLOCKSIZE: + raise EOFHeaderError("end of file header") + + chksum = nti(buf[148:156]) + if chksum not in calc_chksums(buf): + raise InvalidHeaderError("bad checksum") + + obj = cls() + obj.name = nts(buf[0:100], encoding, errors) + obj.mode = nti(buf[100:108]) + obj.uid = nti(buf[108:116]) + obj.gid = nti(buf[116:124]) + obj.size = nti(buf[124:136]) + obj.mtime = nti(buf[136:148]) + obj.chksum = chksum + obj.type = buf[156:157] + obj.linkname = nts(buf[157:257], encoding, errors) + obj.uname = nts(buf[265:297], encoding, errors) + obj.gname = nts(buf[297:329], encoding, errors) + obj.devmajor = nti(buf[329:337]) + obj.devminor = nti(buf[337:345]) + prefix = nts(buf[345:500], encoding, errors) + + # Old V7 tar format represents a directory as a regular + # file with a trailing slash. + if obj.type == AREGTYPE and obj.name.endswith("/"): + obj.type = DIRTYPE + + # The old GNU sparse format occupies some of the unused + # space in the buffer for up to 4 sparse structures. + # Save the them for later processing in _proc_sparse(). + if obj.type == GNUTYPE_SPARSE: + pos = 386 + structs = [] + for i in range(4): + try: + offset = nti(buf[pos:pos + 12]) + numbytes = nti(buf[pos + 12:pos + 24]) + except ValueError: + break + structs.append((offset, numbytes)) + pos += 24 + isextended = bool(buf[482]) + origsize = nti(buf[483:495]) + obj._sparse_structs = (structs, isextended, origsize) + + # Remove redundant slashes from directories. + if obj.isdir(): + obj.name = obj.name.rstrip("/") + + # Reconstruct a ustar longname. + if prefix and obj.type not in GNU_TYPES: + obj.name = prefix + "/" + obj.name + return obj + + @classmethod + def fromtarfile(cls, tarfile): + """Return the next TarInfo object from TarFile object + tarfile. + """ + buf = tarfile.fileobj.read(BLOCKSIZE) + obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors) + obj.offset = tarfile.fileobj.tell() - BLOCKSIZE + return obj._proc_member(tarfile) + + #-------------------------------------------------------------------------- + # The following are methods that are called depending on the type of a + # member. The entry point is _proc_member() which can be overridden in a + # subclass to add custom _proc_*() methods. A _proc_*() method MUST + # implement the following + # operations: + # 1. Set self.offset_data to the position where the data blocks begin, + # if there is data that follows. + # 2. Set tarfile.offset to the position where the next member's header will + # begin. + # 3. Return self or another valid TarInfo object. + def _proc_member(self, tarfile): + """Choose the right processing method depending on + the type and call it. + """ + if self.type in (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK): + return self._proc_gnulong(tarfile) + elif self.type == GNUTYPE_SPARSE: + return self._proc_sparse(tarfile) + elif self.type in (XHDTYPE, XGLTYPE, SOLARIS_XHDTYPE): + return self._proc_pax(tarfile) + else: + return self._proc_builtin(tarfile) + + def _proc_builtin(self, tarfile): + """Process a builtin type or an unknown type which + will be treated as a regular file. + """ + self.offset_data = tarfile.fileobj.tell() + offset = self.offset_data + if self.isreg() or self.type not in SUPPORTED_TYPES: + # Skip the following data blocks. + offset += self._block(self.size) + tarfile.offset = offset + + # Patch the TarInfo object with saved global + # header information. + self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors) + + return self + + def _proc_gnulong(self, tarfile): + """Process the blocks that hold a GNU longname + or longlink member. + """ + buf = tarfile.fileobj.read(self._block(self.size)) + + # Fetch the next header and process it. + try: + next = self.fromtarfile(tarfile) + except HeaderError: + raise SubsequentHeaderError("missing or bad subsequent header") + + # Patch the TarInfo object from the next header with + # the longname information. + next.offset = self.offset + if self.type == GNUTYPE_LONGNAME: + next.name = nts(buf, tarfile.encoding, tarfile.errors) + elif self.type == GNUTYPE_LONGLINK: + next.linkname = nts(buf, tarfile.encoding, tarfile.errors) + + return next + + def _proc_sparse(self, tarfile): + """Process a GNU sparse header plus extra headers. + """ + # We already collected some sparse structures in frombuf(). + structs, isextended, origsize = self._sparse_structs + del self._sparse_structs + + # Collect sparse structures from extended header blocks. + while isextended: + buf = tarfile.fileobj.read(BLOCKSIZE) + pos = 0 + for i in range(21): + try: + offset = nti(buf[pos:pos + 12]) + numbytes = nti(buf[pos + 12:pos + 24]) + except ValueError: + break + if offset and numbytes: + structs.append((offset, numbytes)) + pos += 24 + isextended = bool(buf[504]) + self.sparse = structs + + self.offset_data = tarfile.fileobj.tell() + tarfile.offset = self.offset_data + self._block(self.size) + self.size = origsize + return self + + def _proc_pax(self, tarfile): + """Process an extended or global header as described in + POSIX.1-2008. + """ + # Read the header information. + buf = tarfile.fileobj.read(self._block(self.size)) + + # A pax header stores supplemental information for either + # the following file (extended) or all following files + # (global). + if self.type == XGLTYPE: + pax_headers = tarfile.pax_headers + else: + pax_headers = tarfile.pax_headers.copy() + + # Check if the pax header contains a hdrcharset field. This tells us + # the encoding of the path, linkpath, uname and gname fields. Normally, + # these fields are UTF-8 encoded but since POSIX.1-2008 tar + # implementations are allowed to store them as raw binary strings if + # the translation to UTF-8 fails. + match = re.search(br"\d+ hdrcharset=([^\n]+)\n", buf) + if match is not None: + pax_headers["hdrcharset"] = match.group(1).decode("utf8") + + # For the time being, we don't care about anything other than "BINARY". + # The only other value that is currently allowed by the standard is + # "ISO-IR 10646 2000 UTF-8" in other words UTF-8. + hdrcharset = pax_headers.get("hdrcharset") + if hdrcharset == "BINARY": + encoding = tarfile.encoding + else: + encoding = "utf8" + + # Parse pax header information. A record looks like that: + # "%d %s=%s\n" % (length, keyword, value). length is the size + # of the complete record including the length field itself and + # the newline. keyword and value are both UTF-8 encoded strings. + regex = re.compile(br"(\d+) ([^=]+)=") + pos = 0 + while True: + match = regex.match(buf, pos) + if not match: + break + + length, keyword = match.groups() + length = int(length) + value = buf[match.end(2) + 1:match.start(1) + length - 1] + + # Normally, we could just use "utf8" as the encoding and "strict" + # as the error handler, but we better not take the risk. For + # example, GNU tar <= 1.23 is known to store filenames it cannot + # translate to UTF-8 as raw strings (unfortunately without a + # hdrcharset=BINARY header). + # We first try the strict standard encoding, and if that fails we + # fall back on the user's encoding and error handler. + keyword = self._decode_pax_field(keyword, "utf8", "utf8", + tarfile.errors) + if keyword in PAX_NAME_FIELDS: + value = self._decode_pax_field(value, encoding, tarfile.encoding, + tarfile.errors) + else: + value = self._decode_pax_field(value, "utf8", "utf8", + tarfile.errors) + + pax_headers[keyword] = value + pos += length + + # Fetch the next header. + try: + next = self.fromtarfile(tarfile) + except HeaderError: + raise SubsequentHeaderError("missing or bad subsequent header") + + # Process GNU sparse information. + if "GNU.sparse.map" in pax_headers: + # GNU extended sparse format version 0.1. + self._proc_gnusparse_01(next, pax_headers) + + elif "GNU.sparse.size" in pax_headers: + # GNU extended sparse format version 0.0. + self._proc_gnusparse_00(next, pax_headers, buf) + + elif pax_headers.get("GNU.sparse.major") == "1" and pax_headers.get("GNU.sparse.minor") == "0": + # GNU extended sparse format version 1.0. + self._proc_gnusparse_10(next, pax_headers, tarfile) + + if self.type in (XHDTYPE, SOLARIS_XHDTYPE): + # Patch the TarInfo object with the extended header info. + next._apply_pax_info(pax_headers, tarfile.encoding, tarfile.errors) + next.offset = self.offset + + if "size" in pax_headers: + # If the extended header replaces the size field, + # we need to recalculate the offset where the next + # header starts. + offset = next.offset_data + if next.isreg() or next.type not in SUPPORTED_TYPES: + offset += next._block(next.size) + tarfile.offset = offset + + return next + + def _proc_gnusparse_00(self, next, pax_headers, buf): + """Process a GNU tar extended sparse header, version 0.0. + """ + offsets = [] + for match in re.finditer(br"\d+ GNU.sparse.offset=(\d+)\n", buf): + offsets.append(int(match.group(1))) + numbytes = [] + for match in re.finditer(br"\d+ GNU.sparse.numbytes=(\d+)\n", buf): + numbytes.append(int(match.group(1))) + next.sparse = list(zip(offsets, numbytes)) + + def _proc_gnusparse_01(self, next, pax_headers): + """Process a GNU tar extended sparse header, version 0.1. + """ + sparse = [int(x) for x in pax_headers["GNU.sparse.map"].split(",")] + next.sparse = list(zip(sparse[::2], sparse[1::2])) + + def _proc_gnusparse_10(self, next, pax_headers, tarfile): + """Process a GNU tar extended sparse header, version 1.0. + """ + fields = None + sparse = [] + buf = tarfile.fileobj.read(BLOCKSIZE) + fields, buf = buf.split(b"\n", 1) + fields = int(fields) + while len(sparse) < fields * 2: + if b"\n" not in buf: + buf += tarfile.fileobj.read(BLOCKSIZE) + number, buf = buf.split(b"\n", 1) + sparse.append(int(number)) + next.offset_data = tarfile.fileobj.tell() + next.sparse = list(zip(sparse[::2], sparse[1::2])) + + def _apply_pax_info(self, pax_headers, encoding, errors): + """Replace fields with supplemental information from a previous + pax extended or global header. + """ + for keyword, value in pax_headers.items(): + if keyword == "GNU.sparse.name": + setattr(self, "path", value) + elif keyword == "GNU.sparse.size": + setattr(self, "size", int(value)) + elif keyword == "GNU.sparse.realsize": + setattr(self, "size", int(value)) + elif keyword in PAX_FIELDS: + if keyword in PAX_NUMBER_FIELDS: + try: + value = PAX_NUMBER_FIELDS[keyword](value) + except ValueError: + value = 0 + if keyword == "path": + value = value.rstrip("/") + setattr(self, keyword, value) + + self.pax_headers = pax_headers.copy() + + def _decode_pax_field(self, value, encoding, fallback_encoding, fallback_errors): + """Decode a single field from a pax record. + """ + try: + return value.decode(encoding, "strict") + except UnicodeDecodeError: + return value.decode(fallback_encoding, fallback_errors) + + def _block(self, count): + """Round up a byte count by BLOCKSIZE and return it, + e.g. _block(834) => 1024. + """ + blocks, remainder = divmod(count, BLOCKSIZE) + if remainder: + blocks += 1 + return blocks * BLOCKSIZE + + def isreg(self): + return self.type in REGULAR_TYPES + def isfile(self): + return self.isreg() + def isdir(self): + return self.type == DIRTYPE + def issym(self): + return self.type == SYMTYPE + def islnk(self): + return self.type == LNKTYPE + def ischr(self): + return self.type == CHRTYPE + def isblk(self): + return self.type == BLKTYPE + def isfifo(self): + return self.type == FIFOTYPE + def issparse(self): + return self.sparse is not None + def isdev(self): + return self.type in (CHRTYPE, BLKTYPE, FIFOTYPE) +# class TarInfo + +class TarFile(object): + """The TarFile Class provides an interface to tar archives. + """ + + debug = 0 # May be set from 0 (no msgs) to 3 (all msgs) + + dereference = False # If true, add content of linked file to the + # tar file, else the link. + + ignore_zeros = False # If true, skips empty or invalid blocks and + # continues processing. + + errorlevel = 1 # If 0, fatal errors only appear in debug + # messages (if debug >= 0). If > 0, errors + # are passed to the caller as exceptions. + + format = DEFAULT_FORMAT # The format to use when creating an archive. + + encoding = ENCODING # Encoding for 8-bit character strings. + + errors = None # Error handler for unicode conversion. + + tarinfo = TarInfo # The default TarInfo class to use. + + fileobject = ExFileObject # The default ExFileObject class to use. + + def __init__(self, name=None, mode="r", fileobj=None, format=None, + tarinfo=None, dereference=None, ignore_zeros=None, encoding=None, + errors="surrogateescape", pax_headers=None, debug=None, errorlevel=None): + """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to + read from an existing archive, 'a' to append data to an existing + file or 'w' to create a new file overwriting an existing one. `mode' + defaults to 'r'. + If `fileobj' is given, it is used for reading or writing data. If it + can be determined, `mode' is overridden by `fileobj's mode. + `fileobj' is not closed, when TarFile is closed. + """ + if len(mode) > 1 or mode not in "raw": + raise ValueError("mode must be 'r', 'a' or 'w'") + self.mode = mode + self._mode = {"r": "rb", "a": "r+b", "w": "wb"}[mode] + + if not fileobj: + if self.mode == "a" and not os.path.exists(name): + # Create nonexistent files in append mode. + self.mode = "w" + self._mode = "wb" + fileobj = bltn_open(name, self._mode) + self._extfileobj = False + else: + if name is None and hasattr(fileobj, "name"): + name = fileobj.name + if hasattr(fileobj, "mode"): + self._mode = fileobj.mode + self._extfileobj = True + self.name = os.path.abspath(name) if name else None + self.fileobj = fileobj + + # Init attributes. + if format is not None: + self.format = format + if tarinfo is not None: + self.tarinfo = tarinfo + if dereference is not None: + self.dereference = dereference + if ignore_zeros is not None: + self.ignore_zeros = ignore_zeros + if encoding is not None: + self.encoding = encoding + self.errors = errors + + if pax_headers is not None and self.format == PAX_FORMAT: + self.pax_headers = pax_headers + else: + self.pax_headers = {} + + if debug is not None: + self.debug = debug + if errorlevel is not None: + self.errorlevel = errorlevel + + # Init datastructures. + self.closed = False + self.members = [] # list of members as TarInfo objects + self._loaded = False # flag if all members have been read + self.offset = self.fileobj.tell() + # current position in the archive file + self.inodes = {} # dictionary caching the inodes of + # archive members already added + + try: + if self.mode == "r": + self.firstmember = None + self.firstmember = self.next() + + if self.mode == "a": + # Move to the end of the archive, + # before the first empty block. + while True: + self.fileobj.seek(self.offset) + try: + tarinfo = self.tarinfo.fromtarfile(self) + self.members.append(tarinfo) + except EOFHeaderError: + self.fileobj.seek(self.offset) + break + except HeaderError as e: + raise ReadError(str(e)) + + if self.mode in "aw": + self._loaded = True + + if self.pax_headers: + buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy()) + self.fileobj.write(buf) + self.offset += len(buf) + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise + + #-------------------------------------------------------------------------- + # Below are the classmethods which act as alternate constructors to the + # TarFile class. The open() method is the only one that is needed for + # public use; it is the "super"-constructor and is able to select an + # adequate "sub"-constructor for a particular compression using the mapping + # from OPEN_METH. + # + # This concept allows one to subclass TarFile without losing the comfort of + # the super-constructor. A sub-constructor is registered and made available + # by adding it to the mapping in OPEN_METH. + + @classmethod + def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs): + """Open a tar archive for reading, writing or appending. Return + an appropriate TarFile class. + + mode: + 'r' or 'r:*' open for reading with transparent compression + 'r:' open for reading exclusively uncompressed + 'r:gz' open for reading with gzip compression + 'r:bz2' open for reading with bzip2 compression + 'a' or 'a:' open for appending, creating the file if necessary + 'w' or 'w:' open for writing without compression + 'w:gz' open for writing with gzip compression + 'w:bz2' open for writing with bzip2 compression + + 'r|*' open a stream of tar blocks with transparent compression + 'r|' open an uncompressed stream of tar blocks for reading + 'r|gz' open a gzip compressed stream of tar blocks + 'r|bz2' open a bzip2 compressed stream of tar blocks + 'w|' open an uncompressed stream for writing + 'w|gz' open a gzip compressed stream for writing + 'w|bz2' open a bzip2 compressed stream for writing + """ + + if not name and not fileobj: + raise ValueError("nothing to open") + + if mode in ("r", "r:*"): + # Find out which *open() is appropriate for opening the file. + for comptype in cls.OPEN_METH: + func = getattr(cls, cls.OPEN_METH[comptype]) + if fileobj is not None: + saved_pos = fileobj.tell() + try: + return func(name, "r", fileobj, **kwargs) + except (ReadError, CompressionError) as e: + if fileobj is not None: + fileobj.seek(saved_pos) + continue + raise ReadError("file could not be opened successfully") + + elif ":" in mode: + filemode, comptype = mode.split(":", 1) + filemode = filemode or "r" + comptype = comptype or "tar" + + # Select the *open() function according to + # given compression. + if comptype in cls.OPEN_METH: + func = getattr(cls, cls.OPEN_METH[comptype]) + else: + raise CompressionError("unknown compression type %r" % comptype) + return func(name, filemode, fileobj, **kwargs) + + elif "|" in mode: + filemode, comptype = mode.split("|", 1) + filemode = filemode or "r" + comptype = comptype or "tar" + + if filemode not in "rw": + raise ValueError("mode must be 'r' or 'w'") + + stream = _Stream(name, filemode, comptype, fileobj, bufsize) + try: + t = cls(name, filemode, stream, **kwargs) + except: + stream.close() + raise + t._extfileobj = False + return t + + elif mode in "aw": + return cls.taropen(name, mode, fileobj, **kwargs) + + raise ValueError("undiscernible mode") + + @classmethod + def taropen(cls, name, mode="r", fileobj=None, **kwargs): + """Open uncompressed tar archive name for reading or writing. + """ + if len(mode) > 1 or mode not in "raw": + raise ValueError("mode must be 'r', 'a' or 'w'") + return cls(name, mode, fileobj, **kwargs) + + @classmethod + def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): + """Open gzip compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if len(mode) > 1 or mode not in "rw": + raise ValueError("mode must be 'r' or 'w'") + + try: + import gzip + gzip.GzipFile + except (ImportError, AttributeError): + raise CompressionError("gzip module is not available") + + extfileobj = fileobj is not None + try: + fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj) + t = cls.taropen(name, mode, fileobj, **kwargs) + except IOError: + if not extfileobj and fileobj is not None: + fileobj.close() + if fileobj is None: + raise + raise ReadError("not a gzip file") + except: + if not extfileobj and fileobj is not None: + fileobj.close() + raise + t._extfileobj = extfileobj + return t + + @classmethod + def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): + """Open bzip2 compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if len(mode) > 1 or mode not in "rw": + raise ValueError("mode must be 'r' or 'w'.") + + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + + if fileobj is not None: + fileobj = _BZ2Proxy(fileobj, mode) + else: + fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel) + + try: + t = cls.taropen(name, mode, fileobj, **kwargs) + except (IOError, EOFError): + fileobj.close() + raise ReadError("not a bzip2 file") + t._extfileobj = False + return t + + # All *open() methods are registered here. + OPEN_METH = { + "tar": "taropen", # uncompressed tar + "gz": "gzopen", # gzip compressed tar + "bz2": "bz2open" # bzip2 compressed tar + } + + #-------------------------------------------------------------------------- + # The public methods which TarFile provides: + + def close(self): + """Close the TarFile. In write-mode, two finishing zero blocks are + appended to the archive. + """ + if self.closed: + return + + if self.mode in "aw": + self.fileobj.write(NUL * (BLOCKSIZE * 2)) + self.offset += (BLOCKSIZE * 2) + # fill up the end with zero-blocks + # (like option -b20 for tar does) + blocks, remainder = divmod(self.offset, RECORDSIZE) + if remainder > 0: + self.fileobj.write(NUL * (RECORDSIZE - remainder)) + + if not self._extfileobj: + self.fileobj.close() + self.closed = True + + def getmember(self, name): + """Return a TarInfo object for member `name'. If `name' can not be + found in the archive, KeyError is raised. If a member occurs more + than once in the archive, its last occurrence is assumed to be the + most up-to-date version. + """ + tarinfo = self._getmember(name) + if tarinfo is None: + raise KeyError("filename %r not found" % name) + return tarinfo + + def getmembers(self): + """Return the members of the archive as a list of TarInfo objects. The + list has the same order as the members in the archive. + """ + self._check() + if not self._loaded: # if we want to obtain a list of + self._load() # all members, we first have to + # scan the whole archive. + return self.members + + def getnames(self): + """Return the members of the archive as a list of their names. It has + the same order as the list returned by getmembers(). + """ + return [tarinfo.name for tarinfo in self.getmembers()] + + def gettarinfo(self, name=None, arcname=None, fileobj=None): + """Create a TarInfo object for either the file `name' or the file + object `fileobj' (using os.fstat on its file descriptor). You can + modify some of the TarInfo's attributes before you add it using + addfile(). If given, `arcname' specifies an alternative name for the + file in the archive. + """ + self._check("aw") + + # When fileobj is given, replace name by + # fileobj's real name. + if fileobj is not None: + name = fileobj.name + + # Building the name of the member in the archive. + # Backward slashes are converted to forward slashes, + # Absolute paths are turned to relative paths. + if arcname is None: + arcname = name + drv, arcname = os.path.splitdrive(arcname) + arcname = arcname.replace(os.sep, "/") + arcname = arcname.lstrip("/") + + # Now, fill the TarInfo object with + # information specific for the file. + tarinfo = self.tarinfo() + tarinfo.tarfile = self + + # Use os.stat or os.lstat, depending on platform + # and if symlinks shall be resolved. + if fileobj is None: + if hasattr(os, "lstat") and not self.dereference: + statres = os.lstat(name) + else: + statres = os.stat(name) + else: + statres = os.fstat(fileobj.fileno()) + linkname = "" + + stmd = statres.st_mode + if stat.S_ISREG(stmd): + inode = (statres.st_ino, statres.st_dev) + if not self.dereference and statres.st_nlink > 1 and \ + inode in self.inodes and arcname != self.inodes[inode]: + # Is it a hardlink to an already + # archived file? + type = LNKTYPE + linkname = self.inodes[inode] + else: + # The inode is added only if its valid. + # For win32 it is always 0. + type = REGTYPE + if inode[0]: + self.inodes[inode] = arcname + elif stat.S_ISDIR(stmd): + type = DIRTYPE + elif stat.S_ISFIFO(stmd): + type = FIFOTYPE + elif stat.S_ISLNK(stmd): + type = SYMTYPE + linkname = os.readlink(name) + elif stat.S_ISCHR(stmd): + type = CHRTYPE + elif stat.S_ISBLK(stmd): + type = BLKTYPE + else: + return None + + # Fill the TarInfo object with all + # information we can get. + tarinfo.name = arcname + tarinfo.mode = stmd + tarinfo.uid = statres.st_uid + tarinfo.gid = statres.st_gid + if type == REGTYPE: + tarinfo.size = statres.st_size + else: + tarinfo.size = 0 + tarinfo.mtime = statres.st_mtime + tarinfo.type = type + tarinfo.linkname = linkname + if pwd: + try: + tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0] + except KeyError: + pass + if grp: + try: + tarinfo.gname = grp.getgrgid(tarinfo.gid)[0] + except KeyError: + pass + + if type in (CHRTYPE, BLKTYPE): + if hasattr(os, "major") and hasattr(os, "minor"): + tarinfo.devmajor = os.major(statres.st_rdev) + tarinfo.devminor = os.minor(statres.st_rdev) + return tarinfo + + def list(self, verbose=True): + """Print a table of contents to sys.stdout. If `verbose' is False, only + the names of the members are printed. If it is True, an `ls -l'-like + output is produced. + """ + self._check() + + for tarinfo in self: + if verbose: + print(filemode(tarinfo.mode), end=' ') + print("%s/%s" % (tarinfo.uname or tarinfo.uid, + tarinfo.gname or tarinfo.gid), end=' ') + if tarinfo.ischr() or tarinfo.isblk(): + print("%10s" % ("%d,%d" \ + % (tarinfo.devmajor, tarinfo.devminor)), end=' ') + else: + print("%10d" % tarinfo.size, end=' ') + print("%d-%02d-%02d %02d:%02d:%02d" \ + % time.localtime(tarinfo.mtime)[:6], end=' ') + + print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ') + + if verbose: + if tarinfo.issym(): + print("->", tarinfo.linkname, end=' ') + if tarinfo.islnk(): + print("link to", tarinfo.linkname, end=' ') + print() + + def add(self, name, arcname=None, recursive=True, exclude=None, filter=None): + """Add the file `name' to the archive. `name' may be any type of file + (directory, fifo, symbolic link, etc.). If given, `arcname' + specifies an alternative name for the file in the archive. + Directories are added recursively by default. This can be avoided by + setting `recursive' to False. `exclude' is a function that should + return True for each filename to be excluded. `filter' is a function + that expects a TarInfo object argument and returns the changed + TarInfo object, if it returns None the TarInfo object will be + excluded from the archive. + """ + self._check("aw") + + if arcname is None: + arcname = name + + # Exclude pathnames. + if exclude is not None: + import warnings + warnings.warn("use the filter argument instead", + DeprecationWarning, 2) + if exclude(name): + self._dbg(2, "tarfile: Excluded %r" % name) + return + + # Skip if somebody tries to archive the archive... + if self.name is not None and os.path.abspath(name) == self.name: + self._dbg(2, "tarfile: Skipped %r" % name) + return + + self._dbg(1, name) + + # Create a TarInfo object from the file. + tarinfo = self.gettarinfo(name, arcname) + + if tarinfo is None: + self._dbg(1, "tarfile: Unsupported type %r" % name) + return + + # Change or exclude the TarInfo object. + if filter is not None: + tarinfo = filter(tarinfo) + if tarinfo is None: + self._dbg(2, "tarfile: Excluded %r" % name) + return + + # Append the tar header and data to the archive. + if tarinfo.isreg(): + f = bltn_open(name, "rb") + self.addfile(tarinfo, f) + f.close() + + elif tarinfo.isdir(): + self.addfile(tarinfo) + if recursive: + for f in os.listdir(name): + self.add(os.path.join(name, f), os.path.join(arcname, f), + recursive, exclude, filter=filter) + + else: + self.addfile(tarinfo) + + def addfile(self, tarinfo, fileobj=None): + """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is + given, tarinfo.size bytes are read from it and added to the archive. + You can create TarInfo objects using gettarinfo(). + On Windows platforms, `fileobj' should always be opened with mode + 'rb' to avoid irritation about the file size. + """ + self._check("aw") + + tarinfo = copy.copy(tarinfo) + + buf = tarinfo.tobuf(self.format, self.encoding, self.errors) + self.fileobj.write(buf) + self.offset += len(buf) + + # If there's data to follow, append it. + if fileobj is not None: + copyfileobj(fileobj, self.fileobj, tarinfo.size) + blocks, remainder = divmod(tarinfo.size, BLOCKSIZE) + if remainder > 0: + self.fileobj.write(NUL * (BLOCKSIZE - remainder)) + blocks += 1 + self.offset += blocks * BLOCKSIZE + + self.members.append(tarinfo) + + def extractall(self, path=".", members=None): + """Extract all members from the archive to the current working + directory and set owner, modification time and permissions on + directories afterwards. `path' specifies a different directory + to extract to. `members' is optional and must be a subset of the + list returned by getmembers(). + """ + directories = [] + + if members is None: + members = self + + for tarinfo in members: + if tarinfo.isdir(): + # Extract directories with a safe mode. + directories.append(tarinfo) + tarinfo = copy.copy(tarinfo) + tarinfo.mode = 0o700 + # Do not set_attrs directories, as we will do that further down + self.extract(tarinfo, path, set_attrs=not tarinfo.isdir()) + + # Reverse sort directories. + directories.sort(key=lambda a: a.name) + directories.reverse() + + # Set correct owner, mtime and filemode on directories. + for tarinfo in directories: + dirpath = os.path.join(path, tarinfo.name) + try: + self.chown(tarinfo, dirpath) + self.utime(tarinfo, dirpath) + self.chmod(tarinfo, dirpath) + except ExtractError as e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + def extract(self, member, path="", set_attrs=True): + """Extract a member from the archive to the current working directory, + using its full name. Its file information is extracted as accurately + as possible. `member' may be a filename or a TarInfo object. You can + specify a different directory using `path'. File attributes (owner, + mtime, mode) are set unless `set_attrs' is False. + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + # Prepare the link target for makelink(). + if tarinfo.islnk(): + tarinfo._link_target = os.path.join(path, tarinfo.linkname) + + try: + self._extract_member(tarinfo, os.path.join(path, tarinfo.name), + set_attrs=set_attrs) + except EnvironmentError as e: + if self.errorlevel > 0: + raise + else: + if e.filename is None: + self._dbg(1, "tarfile: %s" % e.strerror) + else: + self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename)) + except ExtractError as e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + def extractfile(self, member): + """Extract a member from the archive as a file object. `member' may be + a filename or a TarInfo object. If `member' is a regular file, a + file-like object is returned. If `member' is a link, a file-like + object is constructed from the link's target. If `member' is none of + the above, None is returned. + The file-like object is read-only and provides the following + methods: read(), readline(), readlines(), seek() and tell() + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + if tarinfo.isreg(): + return self.fileobject(self, tarinfo) + + elif tarinfo.type not in SUPPORTED_TYPES: + # If a member's type is unknown, it is treated as a + # regular file. + return self.fileobject(self, tarinfo) + + elif tarinfo.islnk() or tarinfo.issym(): + if isinstance(self.fileobj, _Stream): + # A small but ugly workaround for the case that someone tries + # to extract a (sym)link as a file-object from a non-seekable + # stream of tar blocks. + raise StreamError("cannot extract (sym)link as file object") + else: + # A (sym)link's file object is its target's file object. + return self.extractfile(self._find_link_target(tarinfo)) + else: + # If there's no data associated with the member (directory, chrdev, + # blkdev, etc.), return None instead of a file object. + return None + + def _extract_member(self, tarinfo, targetpath, set_attrs=True): + """Extract the TarInfo object tarinfo to a physical + file called targetpath. + """ + # Fetch the TarInfo object for the given name + # and build the destination pathname, replacing + # forward slashes to platform specific separators. + targetpath = targetpath.rstrip("/") + targetpath = targetpath.replace("/", os.sep) + + # Create all upper directories. + upperdirs = os.path.dirname(targetpath) + if upperdirs and not os.path.exists(upperdirs): + # Create directories that are not part of the archive with + # default permissions. + os.makedirs(upperdirs) + + if tarinfo.islnk() or tarinfo.issym(): + self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname)) + else: + self._dbg(1, tarinfo.name) + + if tarinfo.isreg(): + self.makefile(tarinfo, targetpath) + elif tarinfo.isdir(): + self.makedir(tarinfo, targetpath) + elif tarinfo.isfifo(): + self.makefifo(tarinfo, targetpath) + elif tarinfo.ischr() or tarinfo.isblk(): + self.makedev(tarinfo, targetpath) + elif tarinfo.islnk() or tarinfo.issym(): + self.makelink(tarinfo, targetpath) + elif tarinfo.type not in SUPPORTED_TYPES: + self.makeunknown(tarinfo, targetpath) + else: + self.makefile(tarinfo, targetpath) + + if set_attrs: + self.chown(tarinfo, targetpath) + if not tarinfo.issym(): + self.chmod(tarinfo, targetpath) + self.utime(tarinfo, targetpath) + + #-------------------------------------------------------------------------- + # Below are the different file methods. They are called via + # _extract_member() when extract() is called. They can be replaced in a + # subclass to implement other functionality. + + def makedir(self, tarinfo, targetpath): + """Make a directory called targetpath. + """ + try: + # Use a safe mode for the directory, the real mode is set + # later in _extract_member(). + os.mkdir(targetpath, 0o700) + except EnvironmentError as e: + if e.errno != errno.EEXIST: + raise + + def makefile(self, tarinfo, targetpath): + """Make a file called targetpath. + """ + source = self.fileobj + source.seek(tarinfo.offset_data) + target = bltn_open(targetpath, "wb") + if tarinfo.sparse is not None: + for offset, size in tarinfo.sparse: + target.seek(offset) + copyfileobj(source, target, size) + else: + copyfileobj(source, target, tarinfo.size) + target.seek(tarinfo.size) + target.truncate() + target.close() + + def makeunknown(self, tarinfo, targetpath): + """Make a file from a TarInfo object with an unknown type + at targetpath. + """ + self.makefile(tarinfo, targetpath) + self._dbg(1, "tarfile: Unknown file type %r, " \ + "extracted as regular file." % tarinfo.type) + + def makefifo(self, tarinfo, targetpath): + """Make a fifo called targetpath. + """ + if hasattr(os, "mkfifo"): + os.mkfifo(targetpath) + else: + raise ExtractError("fifo not supported by system") + + def makedev(self, tarinfo, targetpath): + """Make a character or block device called targetpath. + """ + if not hasattr(os, "mknod") or not hasattr(os, "makedev"): + raise ExtractError("special devices not supported by system") + + mode = tarinfo.mode + if tarinfo.isblk(): + mode |= stat.S_IFBLK + else: + mode |= stat.S_IFCHR + + os.mknod(targetpath, mode, + os.makedev(tarinfo.devmajor, tarinfo.devminor)) + + def makelink(self, tarinfo, targetpath): + """Make a (symbolic) link called targetpath. If it cannot be created + (platform limitation), we try to make a copy of the referenced file + instead of a link. + """ + try: + # For systems that support symbolic and hard links. + if tarinfo.issym(): + os.symlink(tarinfo.linkname, targetpath) + else: + # See extract(). + if os.path.exists(tarinfo._link_target): + os.link(tarinfo._link_target, targetpath) + else: + self._extract_member(self._find_link_target(tarinfo), + targetpath) + except symlink_exception: + if tarinfo.issym(): + linkpath = os.path.join(os.path.dirname(tarinfo.name), + tarinfo.linkname) + else: + linkpath = tarinfo.linkname + else: + try: + self._extract_member(self._find_link_target(tarinfo), + targetpath) + except KeyError: + raise ExtractError("unable to resolve link inside archive") + + def chown(self, tarinfo, targetpath): + """Set owner of targetpath according to tarinfo. + """ + if pwd and hasattr(os, "geteuid") and os.geteuid() == 0: + # We have to be root to do so. + try: + g = grp.getgrnam(tarinfo.gname)[2] + except KeyError: + g = tarinfo.gid + try: + u = pwd.getpwnam(tarinfo.uname)[2] + except KeyError: + u = tarinfo.uid + try: + if tarinfo.issym() and hasattr(os, "lchown"): + os.lchown(targetpath, u, g) + else: + if sys.platform != "os2emx": + os.chown(targetpath, u, g) + except EnvironmentError as e: + raise ExtractError("could not change owner") + + def chmod(self, tarinfo, targetpath): + """Set file permissions of targetpath according to tarinfo. + """ + if hasattr(os, 'chmod'): + try: + os.chmod(targetpath, tarinfo.mode) + except EnvironmentError as e: + raise ExtractError("could not change mode") + + def utime(self, tarinfo, targetpath): + """Set modification time of targetpath according to tarinfo. + """ + if not hasattr(os, 'utime'): + return + try: + os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime)) + except EnvironmentError as e: + raise ExtractError("could not change modification time") + + #-------------------------------------------------------------------------- + def next(self): + """Return the next member of the archive as a TarInfo object, when + TarFile is opened for reading. Return None if there is no more + available. + """ + self._check("ra") + if self.firstmember is not None: + m = self.firstmember + self.firstmember = None + return m + + # Read the next block. + self.fileobj.seek(self.offset) + tarinfo = None + while True: + try: + tarinfo = self.tarinfo.fromtarfile(self) + except EOFHeaderError as e: + if self.ignore_zeros: + self._dbg(2, "0x%X: %s" % (self.offset, e)) + self.offset += BLOCKSIZE + continue + except InvalidHeaderError as e: + if self.ignore_zeros: + self._dbg(2, "0x%X: %s" % (self.offset, e)) + self.offset += BLOCKSIZE + continue + elif self.offset == 0: + raise ReadError(str(e)) + except EmptyHeaderError: + if self.offset == 0: + raise ReadError("empty file") + except TruncatedHeaderError as e: + if self.offset == 0: + raise ReadError(str(e)) + except SubsequentHeaderError as e: + raise ReadError(str(e)) + break + + if tarinfo is not None: + self.members.append(tarinfo) + else: + self._loaded = True + + return tarinfo + + #-------------------------------------------------------------------------- + # Little helper methods: + + def _getmember(self, name, tarinfo=None, normalize=False): + """Find an archive member by name from bottom to top. + If tarinfo is given, it is used as the starting point. + """ + # Ensure that all members have been loaded. + members = self.getmembers() + + # Limit the member search list up to tarinfo. + if tarinfo is not None: + members = members[:members.index(tarinfo)] + + if normalize: + name = os.path.normpath(name) + + for member in reversed(members): + if normalize: + member_name = os.path.normpath(member.name) + else: + member_name = member.name + + if name == member_name: + return member + + def _load(self): + """Read through the entire archive file and look for readable + members. + """ + while True: + tarinfo = self.next() + if tarinfo is None: + break + self._loaded = True + + def _check(self, mode=None): + """Check if TarFile is still open, and if the operation's mode + corresponds to TarFile's mode. + """ + if self.closed: + raise IOError("%s is closed" % self.__class__.__name__) + if mode is not None and self.mode not in mode: + raise IOError("bad operation for mode %r" % self.mode) + + def _find_link_target(self, tarinfo): + """Find the target member of a symlink or hardlink member in the + archive. + """ + if tarinfo.issym(): + # Always search the entire archive. + linkname = os.path.dirname(tarinfo.name) + "/" + tarinfo.linkname + limit = None + else: + # Search the archive before the link, because a hard link is + # just a reference to an already archived file. + linkname = tarinfo.linkname + limit = tarinfo + + member = self._getmember(linkname, tarinfo=limit, normalize=True) + if member is None: + raise KeyError("linkname %r not found" % linkname) + return member + + def __iter__(self): + """Provide an iterator object. + """ + if self._loaded: + return iter(self.members) + else: + return TarIter(self) + + def _dbg(self, level, msg): + """Write debugging output to sys.stderr. + """ + if level <= self.debug: + print(msg, file=sys.stderr) + + def __enter__(self): + self._check() + return self + + def __exit__(self, type, value, traceback): + if type is None: + self.close() + else: + # An exception occurred. We must not call close() because + # it would try to write end-of-archive blocks and padding. + if not self._extfileobj: + self.fileobj.close() + self.closed = True +# class TarFile + +class TarIter(object): + """Iterator Class. + + for tarinfo in TarFile(...): + suite... + """ + + def __init__(self, tarfile): + """Construct a TarIter object. + """ + self.tarfile = tarfile + self.index = 0 + def __iter__(self): + """Return iterator object. + """ + return self + + def __next__(self): + """Return the next item using TarFile's next() method. + When all members have been read, set TarFile as _loaded. + """ + # Fix for SF #1100429: Under rare circumstances it can + # happen that getmembers() is called during iteration, + # which will cause TarIter to stop prematurely. + if not self.tarfile._loaded: + tarinfo = self.tarfile.next() + if not tarinfo: + self.tarfile._loaded = True + raise StopIteration + else: + try: + tarinfo = self.tarfile.members[self.index] + except IndexError: + raise StopIteration + self.index += 1 + return tarinfo + + next = __next__ # for Python 2.x + +#-------------------- +# exported functions +#-------------------- +def is_tarfile(name): + """Return True if name points to a tar archive that we + are able to handle, else return False. + """ + try: + t = open(name) + t.close() + return True + except TarError: + return False + +bltn_open = open +open = TarFile.open diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/_backport/tarfile.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7182f5ddda4c4b2631d72637e9895305888ddf5 GIT binary patch literal 78929 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.py new file mode 100644 index 0000000..c316fd9 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.py @@ -0,0 +1,1120 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import absolute_import + +import os +import re +import sys + +try: + import ssl +except ImportError: # pragma: no cover + ssl = None + +if sys.version_info[0] < 3: # pragma: no cover + from StringIO import StringIO + string_types = basestring, + text_type = unicode + from types import FileType as file_type + import __builtin__ as builtins + import ConfigParser as configparser + from ._backport import shutil + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit + from urllib import (urlretrieve, quote as _quote, unquote, url2pathname, + pathname2url, ContentTooShortError, splittype) + + def quote(s): + if isinstance(s, unicode): + s = s.encode('utf-8') + return _quote(s) + + import urllib2 + from urllib2 import (Request, urlopen, URLError, HTTPError, + HTTPBasicAuthHandler, HTTPPasswordMgr, + HTTPHandler, HTTPRedirectHandler, + build_opener) + if ssl: + from urllib2 import HTTPSHandler + import httplib + import xmlrpclib + import Queue as queue + from HTMLParser import HTMLParser + import htmlentitydefs + raw_input = raw_input + from itertools import ifilter as filter + from itertools import ifilterfalse as filterfalse + + _userprog = None + def splituser(host): + """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" + global _userprog + if _userprog is None: + import re + _userprog = re.compile('^(.*)@(.*)$') + + match = _userprog.match(host) + if match: return match.group(1, 2) + return None, host + +else: # pragma: no cover + from io import StringIO + string_types = str, + text_type = str + from io import TextIOWrapper as file_type + import builtins + import configparser + import shutil + from urllib.parse import (urlparse, urlunparse, urljoin, splituser, quote, + unquote, urlsplit, urlunsplit, splittype) + from urllib.request import (urlopen, urlretrieve, Request, url2pathname, + pathname2url, + HTTPBasicAuthHandler, HTTPPasswordMgr, + HTTPHandler, HTTPRedirectHandler, + build_opener) + if ssl: + from urllib.request import HTTPSHandler + from urllib.error import HTTPError, URLError, ContentTooShortError + import http.client as httplib + import urllib.request as urllib2 + import xmlrpc.client as xmlrpclib + import queue + from html.parser import HTMLParser + import html.entities as htmlentitydefs + raw_input = input + from itertools import filterfalse + filter = filter + +try: + from ssl import match_hostname, CertificateError +except ImportError: # pragma: no cover + class CertificateError(ValueError): + pass + + + def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + parts = dn.split('.') + leftmost, remainder = parts[0], parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + + def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate, match_hostname needs a " + "SSL socket or SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") + + +try: + from types import SimpleNamespace as Container +except ImportError: # pragma: no cover + class Container(object): + """ + A generic container for when multiple values need to be returned + """ + def __init__(self, **kwargs): + self.__dict__.update(kwargs) + + +try: + from shutil import which +except ImportError: # pragma: no cover + # Implementation from Python 3.3 + def which(cmd, mode=os.F_OK | os.X_OK, path=None): + """Given a command, mode, and a PATH string, return the path which + conforms to the given mode on the PATH, or None if there is no such + file. + + `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result + of os.environ.get("PATH"), or can be overridden with a custom search + path. + + """ + # Check that a given file can be accessed with the correct mode. + # Additionally check that `file` is not a directory, as on Windows + # directories pass the os.access check. + def _access_check(fn, mode): + return (os.path.exists(fn) and os.access(fn, mode) + and not os.path.isdir(fn)) + + # If we're given a path with a directory part, look it up directly rather + # than referring to PATH directories. This includes checking relative to the + # current directory, e.g. ./script + if os.path.dirname(cmd): + if _access_check(cmd, mode): + return cmd + return None + + if path is None: + path = os.environ.get("PATH", os.defpath) + if not path: + return None + path = path.split(os.pathsep) + + if sys.platform == "win32": + # The current directory takes precedence on Windows. + if not os.curdir in path: + path.insert(0, os.curdir) + + # PATHEXT is necessary to check on Windows. + pathext = os.environ.get("PATHEXT", "").split(os.pathsep) + # See if the given file matches any of the expected path extensions. + # This will allow us to short circuit when given "python.exe". + # If it does match, only test that one, otherwise we have to try + # others. + if any(cmd.lower().endswith(ext.lower()) for ext in pathext): + files = [cmd] + else: + files = [cmd + ext for ext in pathext] + else: + # On other platforms you don't have things like PATHEXT to tell you + # what file suffixes are executable, so just pass on cmd as-is. + files = [cmd] + + seen = set() + for dir in path: + normdir = os.path.normcase(dir) + if not normdir in seen: + seen.add(normdir) + for thefile in files: + name = os.path.join(dir, thefile) + if _access_check(name, mode): + return name + return None + + +# ZipFile is a context manager in 2.7, but not in 2.6 + +from zipfile import ZipFile as BaseZipFile + +if hasattr(BaseZipFile, '__enter__'): # pragma: no cover + ZipFile = BaseZipFile +else: # pragma: no cover + from zipfile import ZipExtFile as BaseZipExtFile + + class ZipExtFile(BaseZipExtFile): + def __init__(self, base): + self.__dict__.update(base.__dict__) + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + class ZipFile(BaseZipFile): + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + def open(self, *args, **kwargs): + base = BaseZipFile.open(self, *args, **kwargs) + return ZipExtFile(base) + +try: + from platform import python_implementation +except ImportError: # pragma: no cover + def python_implementation(): + """Return a string identifying the Python implementation.""" + if 'PyPy' in sys.version: + return 'PyPy' + if os.name == 'java': + return 'Jython' + if sys.version.startswith('IronPython'): + return 'IronPython' + return 'CPython' + +try: + import sysconfig +except ImportError: # pragma: no cover + from ._backport import sysconfig + +try: + callable = callable +except NameError: # pragma: no cover + from collections.abc import Callable + + def callable(obj): + return isinstance(obj, Callable) + + +try: + fsencode = os.fsencode + fsdecode = os.fsdecode +except AttributeError: # pragma: no cover + # Issue #99: on some systems (e.g. containerised), + # sys.getfilesystemencoding() returns None, and we need a real value, + # so fall back to utf-8. From the CPython 2.7 docs relating to Unix and + # sys.getfilesystemencoding(): the return value is "the user’s preference + # according to the result of nl_langinfo(CODESET), or None if the + # nl_langinfo(CODESET) failed." + _fsencoding = sys.getfilesystemencoding() or 'utf-8' + if _fsencoding == 'mbcs': + _fserrors = 'strict' + else: + _fserrors = 'surrogateescape' + + def fsencode(filename): + if isinstance(filename, bytes): + return filename + elif isinstance(filename, text_type): + return filename.encode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + + def fsdecode(filename): + if isinstance(filename, text_type): + return filename + elif isinstance(filename, bytes): + return filename.decode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + +try: + from tokenize import detect_encoding +except ImportError: # pragma: no cover + from codecs import BOM_UTF8, lookup + import re + + cookie_re = re.compile(r"coding[:=]\s*([-\w.]+)") + + def _get_normal_name(orig_enc): + """Imitates get_normal_name in tokenizer.c.""" + # Only care about the first 12 characters. + enc = orig_enc[:12].lower().replace("_", "-") + if enc == "utf-8" or enc.startswith("utf-8-"): + return "utf-8" + if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \ + enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")): + return "iso-8859-1" + return orig_enc + + def detect_encoding(readline): + """ + The detect_encoding() function is used to detect the encoding that should + be used to decode a Python source file. It requires one argument, readline, + in the same way as the tokenize() generator. + + It will call readline a maximum of twice, and return the encoding used + (as a string) and a list of any lines (left as bytes) it has read in. + + It detects the encoding from the presence of a utf-8 bom or an encoding + cookie as specified in pep-0263. If both a bom and a cookie are present, + but disagree, a SyntaxError will be raised. If the encoding cookie is an + invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, + 'utf-8-sig' is returned. + + If no encoding is specified, then the default of 'utf-8' will be returned. + """ + try: + filename = readline.__self__.name + except AttributeError: + filename = None + bom_found = False + encoding = None + default = 'utf-8' + def read_or_stop(): + try: + return readline() + except StopIteration: + return b'' + + def find_cookie(line): + try: + # Decode as UTF-8. Either the line is an encoding declaration, + # in which case it should be pure ASCII, or it must be UTF-8 + # per default encoding. + line_string = line.decode('utf-8') + except UnicodeDecodeError: + msg = "invalid or missing encoding declaration" + if filename is not None: + msg = '{} for {!r}'.format(msg, filename) + raise SyntaxError(msg) + + matches = cookie_re.findall(line_string) + if not matches: + return None + encoding = _get_normal_name(matches[0]) + try: + codec = lookup(encoding) + except LookupError: + # This behaviour mimics the Python interpreter + if filename is None: + msg = "unknown encoding: " + encoding + else: + msg = "unknown encoding for {!r}: {}".format(filename, + encoding) + raise SyntaxError(msg) + + if bom_found: + if codec.name != 'utf-8': + # This behaviour mimics the Python interpreter + if filename is None: + msg = 'encoding problem: utf-8' + else: + msg = 'encoding problem for {!r}: utf-8'.format(filename) + raise SyntaxError(msg) + encoding += '-sig' + return encoding + + first = read_or_stop() + if first.startswith(BOM_UTF8): + bom_found = True + first = first[3:] + default = 'utf-8-sig' + if not first: + return default, [] + + encoding = find_cookie(first) + if encoding: + return encoding, [first] + + second = read_or_stop() + if not second: + return default, [first] + + encoding = find_cookie(second) + if encoding: + return encoding, [first, second] + + return default, [first, second] + +# For converting & <-> & etc. +try: + from html import escape +except ImportError: + from cgi import escape +if sys.version_info[:2] < (3, 4): + unescape = HTMLParser().unescape +else: + from html import unescape + +try: + from collections import ChainMap +except ImportError: # pragma: no cover + from collections import MutableMapping + + try: + from reprlib import recursive_repr as _recursive_repr + except ImportError: + def _recursive_repr(fillvalue='...'): + ''' + Decorator to make a repr function return fillvalue for a recursive + call + ''' + + def decorating_function(user_function): + repr_running = set() + + def wrapper(self): + key = id(self), get_ident() + if key in repr_running: + return fillvalue + repr_running.add(key) + try: + result = user_function(self) + finally: + repr_running.discard(key) + return result + + # Can't use functools.wraps() here because of bootstrap issues + wrapper.__module__ = getattr(user_function, '__module__') + wrapper.__doc__ = getattr(user_function, '__doc__') + wrapper.__name__ = getattr(user_function, '__name__') + wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) + return wrapper + + return decorating_function + + class ChainMap(MutableMapping): + ''' A ChainMap groups multiple dicts (or other mappings) together + to create a single, updateable view. + + The underlying mappings are stored in a list. That list is public and can + accessed or updated using the *maps* attribute. There is no other state. + + Lookups search the underlying mappings successively until a key is found. + In contrast, writes, updates, and deletions only operate on the first + mapping. + + ''' + + def __init__(self, *maps): + '''Initialize a ChainMap by setting *maps* to the given mappings. + If no mappings are provided, a single empty dictionary is used. + + ''' + self.maps = list(maps) or [{}] # always at least one map + + def __missing__(self, key): + raise KeyError(key) + + def __getitem__(self, key): + for mapping in self.maps: + try: + return mapping[key] # can't use 'key in mapping' with defaultdict + except KeyError: + pass + return self.__missing__(key) # support subclasses that define __missing__ + + def get(self, key, default=None): + return self[key] if key in self else default + + def __len__(self): + return len(set().union(*self.maps)) # reuses stored hash values if possible + + def __iter__(self): + return iter(set().union(*self.maps)) + + def __contains__(self, key): + return any(key in m for m in self.maps) + + def __bool__(self): + return any(self.maps) + + @_recursive_repr() + def __repr__(self): + return '{0.__class__.__name__}({1})'.format( + self, ', '.join(map(repr, self.maps))) + + @classmethod + def fromkeys(cls, iterable, *args): + 'Create a ChainMap with a single dict created from the iterable.' + return cls(dict.fromkeys(iterable, *args)) + + def copy(self): + 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]' + return self.__class__(self.maps[0].copy(), *self.maps[1:]) + + __copy__ = copy + + def new_child(self): # like Django's Context.push() + 'New ChainMap with a new dict followed by all previous maps.' + return self.__class__({}, *self.maps) + + @property + def parents(self): # like Django's Context.pop() + 'New ChainMap from maps[1:].' + return self.__class__(*self.maps[1:]) + + def __setitem__(self, key, value): + self.maps[0][key] = value + + def __delitem__(self, key): + try: + del self.maps[0][key] + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def popitem(self): + 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' + try: + return self.maps[0].popitem() + except KeyError: + raise KeyError('No keys found in the first mapping.') + + def pop(self, key, *args): + 'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].' + try: + return self.maps[0].pop(key, *args) + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def clear(self): + 'Clear maps[0], leaving maps[1:] intact.' + self.maps[0].clear() + +try: + from importlib.util import cache_from_source # Python >= 3.4 +except ImportError: # pragma: no cover + try: + from imp import cache_from_source + except ImportError: # pragma: no cover + def cache_from_source(path, debug_override=None): + assert path.endswith('.py') + if debug_override is None: + debug_override = __debug__ + if debug_override: + suffix = 'c' + else: + suffix = 'o' + return path + suffix + +try: + from collections import OrderedDict +except ImportError: # pragma: no cover +## {{{ http://code.activestate.com/recipes/576693/ (r9) +# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. +# Passes Python2.7's test suite and incorporates all the latest updates. + try: + from thread import get_ident as _get_ident + except ImportError: + from dummy_thread import get_ident as _get_ident + + try: + from _abcoll import KeysView, ValuesView, ItemsView + except ImportError: + pass + + + class OrderedDict(dict): + 'Dictionary that remembers insertion order' + # An inherited dict maps keys to values. + # The inherited dict provides __getitem__, __len__, __contains__, and get. + # The remaining methods are order-aware. + # Big-O running times for all methods are the same as for regular dictionaries. + + # The internal self.__map dictionary maps keys to links in a doubly linked list. + # The circular doubly linked list starts and ends with a sentinel element. + # The sentinel element never gets deleted (this simplifies the algorithm). + # Each link is stored as a list of length three: [PREV, NEXT, KEY]. + + def __init__(self, *args, **kwds): + '''Initialize an ordered dictionary. Signature is the same as for + regular dictionaries, but keyword arguments are not recommended + because their insertion order is arbitrary. + + ''' + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__root + except AttributeError: + self.__root = root = [] # sentinel node + root[:] = [root, root, None] + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, dict_setitem=dict.__setitem__): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link which goes at the end of the linked + # list, and the inherited dictionary is updated with the new key/value pair. + if key not in self: + root = self.__root + last = root[0] + last[1] = root[0] = self.__map[key] = [last, root, key] + dict_setitem(self, key, value) + + def __delitem__(self, key, dict_delitem=dict.__delitem__): + 'od.__delitem__(y) <==> del od[y]' + # Deleting an existing item uses self.__map to find the link which is + # then removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link_prev, link_next, key = self.__map.pop(key) + link_prev[1] = link_next + link_next[0] = link_prev + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + root = self.__root + curr = root[1] + while curr is not root: + yield curr[2] + curr = curr[1] + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + root = self.__root + curr = root[0] + while curr is not root: + yield curr[2] + curr = curr[0] + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + try: + for node in self.__map.itervalues(): + del node[:] + root = self.__root + root[:] = [root, root, None] + self.__map.clear() + except AttributeError: + pass + dict.clear(self) + + def popitem(self, last=True): + '''od.popitem() -> (k, v), return and remove a (key, value) pair. + Pairs are returned in LIFO order if last is true or FIFO order if false. + + ''' + if not self: + raise KeyError('dictionary is empty') + root = self.__root + if last: + link = root[0] + link_prev = link[0] + link_prev[1] = root + root[0] = link_prev + else: + link = root[1] + link_next = link[1] + root[1] = link_next + link_next[0] = root + key = link[2] + del self.__map[key] + value = dict.pop(self, key) + return key, value + + # -- the following methods do not depend on the internal structure -- + + def keys(self): + 'od.keys() -> list of keys in od' + return list(self) + + def values(self): + 'od.values() -> list of values in od' + return [self[key] for key in self] + + def items(self): + 'od.items() -> list of (key, value) pairs in od' + return [(key, self[key]) for key in self] + + def iterkeys(self): + 'od.iterkeys() -> an iterator over the keys in od' + return iter(self) + + def itervalues(self): + 'od.itervalues -> an iterator over the values in od' + for k in self: + yield self[k] + + def iteritems(self): + 'od.iteritems -> an iterator over the (key, value) items in od' + for k in self: + yield (k, self[k]) + + def update(*args, **kwds): + '''od.update(E, **F) -> None. Update od from dict/iterable E and F. + + If E is a dict instance, does: for k in E: od[k] = E[k] + If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] + Or if E is an iterable of items, does: for k, v in E: od[k] = v + In either case, this is followed by: for k, v in F.items(): od[k] = v + + ''' + if len(args) > 2: + raise TypeError('update() takes at most 2 positional ' + 'arguments (%d given)' % (len(args),)) + elif not args: + raise TypeError('update() takes at least 1 argument (0 given)') + self = args[0] + # Make progressively weaker assumptions about "other" + other = () + if len(args) == 2: + other = args[1] + if isinstance(other, dict): + for key in other: + self[key] = other[key] + elif hasattr(other, 'keys'): + for key in other.keys(): + self[key] = other[key] + else: + for key, value in other: + self[key] = value + for key, value in kwds.items(): + self[key] = value + + __update = update # let subclasses override update without breaking __init__ + + __marker = object() + + def pop(self, key, default=__marker): + '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + + ''' + if key in self: + result = self[key] + del self[key] + return result + if default is self.__marker: + raise KeyError(key) + return default + + def setdefault(self, key, default=None): + 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' + if key in self: + return self[key] + self[key] = default + return default + + def __repr__(self, _repr_running=None): + 'od.__repr__() <==> repr(od)' + if not _repr_running: _repr_running = {} + call_key = id(self), _get_ident() + if call_key in _repr_running: + return '...' + _repr_running[call_key] = 1 + try: + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, self.items()) + finally: + del _repr_running[call_key] + + def __reduce__(self): + 'Return state information for pickling' + items = [[k, self[k]] for k in self] + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) + + def copy(self): + 'od.copy() -> a shallow copy of od' + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S + and values equal to v (which defaults to None). + + ''' + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive + while comparison to a regular mapping is order-insensitive. + + ''' + if isinstance(other, OrderedDict): + return len(self)==len(other) and self.items() == other.items() + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other + + # -- the following methods are only used in Python 2.7 -- + + def viewkeys(self): + "od.viewkeys() -> a set-like object providing a view on od's keys" + return KeysView(self) + + def viewvalues(self): + "od.viewvalues() -> an object providing a view on od's values" + return ValuesView(self) + + def viewitems(self): + "od.viewitems() -> a set-like object providing a view on od's items" + return ItemsView(self) + +try: + from logging.config import BaseConfigurator, valid_ident +except ImportError: # pragma: no cover + IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I) + + + def valid_ident(s): + m = IDENTIFIER.match(s) + if not m: + raise ValueError('Not a valid Python identifier: %r' % s) + return True + + + # The ConvertingXXX classes are wrappers around standard Python containers, + # and they serve to convert any suitable values in the container. The + # conversion converts base dicts, lists and tuples to their wrapped + # equivalents, whereas strings which match a conversion format are converted + # appropriately. + # + # Each wrapper should have a configurator attribute holding the actual + # configurator to use for conversion. + + class ConvertingDict(dict): + """A converting dictionary wrapper.""" + + def __getitem__(self, key): + value = dict.__getitem__(self, key) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def get(self, key, default=None): + value = dict.get(self, key, default) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, key, default=None): + value = dict.pop(self, key, default) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class ConvertingList(list): + """A converting list wrapper.""" + def __getitem__(self, key): + value = list.__getitem__(self, key) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, idx=-1): + value = list.pop(self, idx) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + return result + + class ConvertingTuple(tuple): + """A converting tuple wrapper.""" + def __getitem__(self, key): + value = tuple.__getitem__(self, key) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class BaseConfigurator(object): + """ + The configurator base class which defines some useful defaults. + """ + + CONVERT_PATTERN = re.compile(r'^(?P[a-z]+)://(?P.*)$') + + WORD_PATTERN = re.compile(r'^\s*(\w+)\s*') + DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*') + INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*') + DIGIT_PATTERN = re.compile(r'^\d+$') + + value_converters = { + 'ext' : 'ext_convert', + 'cfg' : 'cfg_convert', + } + + # We might want to use a different one, e.g. importlib + importer = staticmethod(__import__) + + def __init__(self, config): + self.config = ConvertingDict(config) + self.config.configurator = self + + def resolve(self, s): + """ + Resolve strings to objects using standard import and attribute + syntax. + """ + name = s.split('.') + used = name.pop(0) + try: + found = self.importer(used) + for frag in name: + used += '.' + frag + try: + found = getattr(found, frag) + except AttributeError: + self.importer(used) + found = getattr(found, frag) + return found + except ImportError: + e, tb = sys.exc_info()[1:] + v = ValueError('Cannot resolve %r: %s' % (s, e)) + v.__cause__, v.__traceback__ = e, tb + raise v + + def ext_convert(self, value): + """Default converter for the ext:// protocol.""" + return self.resolve(value) + + def cfg_convert(self, value): + """Default converter for the cfg:// protocol.""" + rest = value + m = self.WORD_PATTERN.match(rest) + if m is None: + raise ValueError("Unable to convert %r" % value) + else: + rest = rest[m.end():] + d = self.config[m.groups()[0]] + #print d, rest + while rest: + m = self.DOT_PATTERN.match(rest) + if m: + d = d[m.groups()[0]] + else: + m = self.INDEX_PATTERN.match(rest) + if m: + idx = m.groups()[0] + if not self.DIGIT_PATTERN.match(idx): + d = d[idx] + else: + try: + n = int(idx) # try as number first (most likely) + d = d[n] + except TypeError: + d = d[idx] + if m: + rest = rest[m.end():] + else: + raise ValueError('Unable to convert ' + '%r at %r' % (value, rest)) + #rest should be empty + return d + + def convert(self, value): + """ + Convert values to an appropriate type. dicts, lists and tuples are + replaced by their converting alternatives. Strings are checked to + see if they have a conversion format and are converted if they do. + """ + if not isinstance(value, ConvertingDict) and isinstance(value, dict): + value = ConvertingDict(value) + value.configurator = self + elif not isinstance(value, ConvertingList) and isinstance(value, list): + value = ConvertingList(value) + value.configurator = self + elif not isinstance(value, ConvertingTuple) and\ + isinstance(value, tuple): + value = ConvertingTuple(value) + value.configurator = self + elif isinstance(value, string_types): + m = self.CONVERT_PATTERN.match(value) + if m: + d = m.groupdict() + prefix = d['prefix'] + converter = self.value_converters.get(prefix, None) + if converter: + suffix = d['suffix'] + converter = getattr(self, converter) + value = converter(suffix) + return value + + def configure_custom(self, config): + """Configure an object with a user-supplied factory.""" + c = config.pop('()') + if not callable(c): + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + kwargs = dict([(k, config[k]) for k in config if valid_ident(k)]) + result = c(**kwargs) + if props: + for name, value in props.items(): + setattr(result, name, value) + return result + + def as_tuple(self, value): + """Utility function which converts lists to tuples.""" + if isinstance(value, list): + value = tuple(value) + return value diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/compat.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f381ca48b2e642d3c51533628ff19f4bf9ec3282 GIT binary patch literal 39336 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 BY_tFX literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/database.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/database.py new file mode 100644 index 0000000..0a90c30 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/database.py @@ -0,0 +1,1339 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""PEP 376 implementation.""" + +from __future__ import unicode_literals + +import base64 +import codecs +import contextlib +import hashlib +import logging +import os +import posixpath +import sys +import zipimport + +from . import DistlibException, resources +from .compat import StringIO +from .version import get_scheme, UnsupportedVersionError +from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME, + LEGACY_METADATA_FILENAME) +from .util import (parse_requirement, cached_property, parse_name_and_version, + read_exports, write_exports, CSVReader, CSVWriter) + + +__all__ = ['Distribution', 'BaseInstalledDistribution', + 'InstalledDistribution', 'EggInfoDistribution', + 'DistributionPath'] + + +logger = logging.getLogger(__name__) + +EXPORTS_FILENAME = 'pydist-exports.json' +COMMANDS_FILENAME = 'pydist-commands.json' + +DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED', + 'RESOURCES', EXPORTS_FILENAME, 'SHARED') + +DISTINFO_EXT = '.dist-info' + + +class _Cache(object): + """ + A simple cache mapping names and .dist-info paths to distributions + """ + def __init__(self): + """ + Initialise an instance. There is normally one for each DistributionPath. + """ + self.name = {} + self.path = {} + self.generated = False + + def clear(self): + """ + Clear the cache, setting it to its initial state. + """ + self.name.clear() + self.path.clear() + self.generated = False + + def add(self, dist): + """ + Add a distribution to the cache. + :param dist: The distribution to add. + """ + if dist.path not in self.path: + self.path[dist.path] = dist + self.name.setdefault(dist.key, []).append(dist) + + +class DistributionPath(object): + """ + Represents a set of distributions installed on a path (typically sys.path). + """ + def __init__(self, path=None, include_egg=False): + """ + Create an instance from a path, optionally including legacy (distutils/ + setuptools/distribute) distributions. + :param path: The path to use, as a list of directories. If not specified, + sys.path is used. + :param include_egg: If True, this instance will look for and return legacy + distributions as well as those based on PEP 376. + """ + if path is None: + path = sys.path + self.path = path + self._include_dist = True + self._include_egg = include_egg + + self._cache = _Cache() + self._cache_egg = _Cache() + self._cache_enabled = True + self._scheme = get_scheme('default') + + def _get_cache_enabled(self): + return self._cache_enabled + + def _set_cache_enabled(self, value): + self._cache_enabled = value + + cache_enabled = property(_get_cache_enabled, _set_cache_enabled) + + def clear_cache(self): + """ + Clears the internal cache. + """ + self._cache.clear() + self._cache_egg.clear() + + + def _yield_distributions(self): + """ + Yield .dist-info and/or .egg(-info) distributions. + """ + # We need to check if we've seen some resources already, because on + # some Linux systems (e.g. some Debian/Ubuntu variants) there are + # symlinks which alias other files in the environment. + seen = set() + for path in self.path: + finder = resources.finder_for_path(path) + if finder is None: + continue + r = finder.find('') + if not r or not r.is_container: + continue + rset = sorted(r.resources) + for entry in rset: + r = finder.find(entry) + if not r or r.path in seen: + continue + if self._include_dist and entry.endswith(DISTINFO_EXT): + possible_filenames = [METADATA_FILENAME, + WHEEL_METADATA_FILENAME, + LEGACY_METADATA_FILENAME] + for metadata_filename in possible_filenames: + metadata_path = posixpath.join(entry, metadata_filename) + pydist = finder.find(metadata_path) + if pydist: + break + else: + continue + + with contextlib.closing(pydist.as_stream()) as stream: + metadata = Metadata(fileobj=stream, scheme='legacy') + logger.debug('Found %s', r.path) + seen.add(r.path) + yield new_dist_class(r.path, metadata=metadata, + env=self) + elif self._include_egg and entry.endswith(('.egg-info', + '.egg')): + logger.debug('Found %s', r.path) + seen.add(r.path) + yield old_dist_class(r.path, self) + + def _generate_cache(self): + """ + Scan the path for distributions and populate the cache with + those that are found. + """ + gen_dist = not self._cache.generated + gen_egg = self._include_egg and not self._cache_egg.generated + if gen_dist or gen_egg: + for dist in self._yield_distributions(): + if isinstance(dist, InstalledDistribution): + self._cache.add(dist) + else: + self._cache_egg.add(dist) + + if gen_dist: + self._cache.generated = True + if gen_egg: + self._cache_egg.generated = True + + @classmethod + def distinfo_dirname(cls, name, version): + """ + The *name* and *version* parameters are converted into their + filename-escaped form, i.e. any ``'-'`` characters are replaced + with ``'_'`` other than the one in ``'dist-info'`` and the one + separating the name from the version number. + + :parameter name: is converted to a standard distribution name by replacing + any runs of non- alphanumeric characters with a single + ``'-'``. + :type name: string + :parameter version: is converted to a standard version string. Spaces + become dots, and all other non-alphanumeric characters + (except dots) become dashes, with runs of multiple + dashes condensed to a single dash. + :type version: string + :returns: directory name + :rtype: string""" + name = name.replace('-', '_') + return '-'.join([name, version]) + DISTINFO_EXT + + def get_distributions(self): + """ + Provides an iterator that looks for distributions and returns + :class:`InstalledDistribution` or + :class:`EggInfoDistribution` instances for each one of them. + + :rtype: iterator of :class:`InstalledDistribution` and + :class:`EggInfoDistribution` instances + """ + if not self._cache_enabled: + for dist in self._yield_distributions(): + yield dist + else: + self._generate_cache() + + for dist in self._cache.path.values(): + yield dist + + if self._include_egg: + for dist in self._cache_egg.path.values(): + yield dist + + def get_distribution(self, name): + """ + Looks for a named distribution on the path. + + This function only returns the first result found, as no more than one + value is expected. If nothing is found, ``None`` is returned. + + :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution` + or ``None`` + """ + result = None + name = name.lower() + if not self._cache_enabled: + for dist in self._yield_distributions(): + if dist.key == name: + result = dist + break + else: + self._generate_cache() + + if name in self._cache.name: + result = self._cache.name[name][0] + elif self._include_egg and name in self._cache_egg.name: + result = self._cache_egg.name[name][0] + return result + + def provides_distribution(self, name, version=None): + """ + Iterates over all distributions to find which distributions provide *name*. + If a *version* is provided, it will be used to filter the results. + + This function only returns the first result found, since no more than + one values are expected. If the directory is not found, returns ``None``. + + :parameter version: a version specifier that indicates the version + required, conforming to the format in ``PEP-345`` + + :type name: string + :type version: string + """ + matcher = None + if version is not None: + try: + matcher = self._scheme.matcher('%s (%s)' % (name, version)) + except ValueError: + raise DistlibException('invalid name or version: %r, %r' % + (name, version)) + + for dist in self.get_distributions(): + # We hit a problem on Travis where enum34 was installed and doesn't + # have a provides attribute ... + if not hasattr(dist, 'provides'): + logger.debug('No "provides": %s', dist) + else: + provided = dist.provides + + for p in provided: + p_name, p_ver = parse_name_and_version(p) + if matcher is None: + if p_name == name: + yield dist + break + else: + if p_name == name and matcher.match(p_ver): + yield dist + break + + def get_file_path(self, name, relative_path): + """ + Return the path to a resource file. + """ + dist = self.get_distribution(name) + if dist is None: + raise LookupError('no distribution named %r found' % name) + return dist.get_resource_path(relative_path) + + def get_exported_entries(self, category, name=None): + """ + Return all of the exported entries in a particular category. + + :param category: The category to search for entries. + :param name: If specified, only entries with that name are returned. + """ + for dist in self.get_distributions(): + r = dist.exports + if category in r: + d = r[category] + if name is not None: + if name in d: + yield d[name] + else: + for v in d.values(): + yield v + + +class Distribution(object): + """ + A base class for distributions, whether installed or from indexes. + Either way, it must have some metadata, so that's all that's needed + for construction. + """ + + build_time_dependency = False + """ + Set to True if it's known to be only a build-time dependency (i.e. + not needed after installation). + """ + + requested = False + """A boolean that indicates whether the ``REQUESTED`` metadata file is + present (in other words, whether the package was installed by user + request or it was installed as a dependency).""" + + def __init__(self, metadata): + """ + Initialise an instance. + :param metadata: The instance of :class:`Metadata` describing this + distribution. + """ + self.metadata = metadata + self.name = metadata.name + self.key = self.name.lower() # for case-insensitive comparisons + self.version = metadata.version + self.locator = None + self.digest = None + self.extras = None # additional features requested + self.context = None # environment marker overrides + self.download_urls = set() + self.digests = {} + + @property + def source_url(self): + """ + The source archive download URL for this distribution. + """ + return self.metadata.source_url + + download_url = source_url # Backward compatibility + + @property + def name_and_version(self): + """ + A utility property which displays the name and version in parentheses. + """ + return '%s (%s)' % (self.name, self.version) + + @property + def provides(self): + """ + A set of distribution names and versions provided by this distribution. + :return: A set of "name (version)" strings. + """ + plist = self.metadata.provides + s = '%s (%s)' % (self.name, self.version) + if s not in plist: + plist.append(s) + return plist + + def _get_requirements(self, req_attr): + md = self.metadata + logger.debug('Getting requirements from metadata %r', md.todict()) + reqts = getattr(md, req_attr) + return set(md.get_requirements(reqts, extras=self.extras, + env=self.context)) + + @property + def run_requires(self): + return self._get_requirements('run_requires') + + @property + def meta_requires(self): + return self._get_requirements('meta_requires') + + @property + def build_requires(self): + return self._get_requirements('build_requires') + + @property + def test_requires(self): + return self._get_requirements('test_requires') + + @property + def dev_requires(self): + return self._get_requirements('dev_requires') + + def matches_requirement(self, req): + """ + Say if this instance matches (fulfills) a requirement. + :param req: The requirement to match. + :rtype req: str + :return: True if it matches, else False. + """ + # Requirement may contain extras - parse to lose those + # from what's passed to the matcher + r = parse_requirement(req) + scheme = get_scheme(self.metadata.scheme) + try: + matcher = scheme.matcher(r.requirement) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + result = False + for p in self.provides: + p_name, p_ver = parse_name_and_version(p) + if p_name != name: + continue + try: + result = matcher.match(p_ver) + break + except UnsupportedVersionError: + pass + return result + + def __repr__(self): + """ + Return a textual representation of this instance, + """ + if self.source_url: + suffix = ' [%s]' % self.source_url + else: + suffix = '' + return '' % (self.name, self.version, suffix) + + def __eq__(self, other): + """ + See if this distribution is the same as another. + :param other: The distribution to compare with. To be equal to one + another. distributions must have the same type, name, + version and source_url. + :return: True if it is the same, else False. + """ + if type(other) is not type(self): + result = False + else: + result = (self.name == other.name and + self.version == other.version and + self.source_url == other.source_url) + return result + + def __hash__(self): + """ + Compute hash in a way which matches the equality test. + """ + return hash(self.name) + hash(self.version) + hash(self.source_url) + + +class BaseInstalledDistribution(Distribution): + """ + This is the base class for installed distributions (whether PEP 376 or + legacy). + """ + + hasher = None + + def __init__(self, metadata, path, env=None): + """ + Initialise an instance. + :param metadata: An instance of :class:`Metadata` which describes the + distribution. This will normally have been initialised + from a metadata file in the ``path``. + :param path: The path of the ``.dist-info`` or ``.egg-info`` + directory for the distribution. + :param env: This is normally the :class:`DistributionPath` + instance where this distribution was found. + """ + super(BaseInstalledDistribution, self).__init__(metadata) + self.path = path + self.dist_path = env + + def get_hash(self, data, hasher=None): + """ + Get the hash of some data, using a particular hash algorithm, if + specified. + + :param data: The data to be hashed. + :type data: bytes + :param hasher: The name of a hash implementation, supported by hashlib, + or ``None``. Examples of valid values are ``'sha1'``, + ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and + ``'sha512'``. If no hasher is specified, the ``hasher`` + attribute of the :class:`InstalledDistribution` instance + is used. If the hasher is determined to be ``None``, MD5 + is used as the hashing algorithm. + :returns: The hash of the data. If a hasher was explicitly specified, + the returned hash will be prefixed with the specified hasher + followed by '='. + :rtype: str + """ + if hasher is None: + hasher = self.hasher + if hasher is None: + hasher = hashlib.md5 + prefix = '' + else: + hasher = getattr(hashlib, hasher) + prefix = '%s=' % self.hasher + digest = hasher(data).digest() + digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii') + return '%s%s' % (prefix, digest) + + +class InstalledDistribution(BaseInstalledDistribution): + """ + Created with the *path* of the ``.dist-info`` directory provided to the + constructor. It reads the metadata contained in ``pydist.json`` when it is + instantiated., or uses a passed in Metadata instance (useful for when + dry-run mode is being used). + """ + + hasher = 'sha256' + + def __init__(self, path, metadata=None, env=None): + self.modules = [] + self.finder = finder = resources.finder_for_path(path) + if finder is None: + raise ValueError('finder unavailable for %s' % path) + if env and env._cache_enabled and path in env._cache.path: + metadata = env._cache.path[path].metadata + elif metadata is None: + r = finder.find(METADATA_FILENAME) + # Temporary - for Wheel 0.23 support + if r is None: + r = finder.find(WHEEL_METADATA_FILENAME) + # Temporary - for legacy support + if r is None: + r = finder.find(LEGACY_METADATA_FILENAME) + if r is None: + raise ValueError('no %s found in %s' % (METADATA_FILENAME, + path)) + with contextlib.closing(r.as_stream()) as stream: + metadata = Metadata(fileobj=stream, scheme='legacy') + + super(InstalledDistribution, self).__init__(metadata, path, env) + + if env and env._cache_enabled: + env._cache.add(self) + + r = finder.find('REQUESTED') + self.requested = r is not None + p = os.path.join(path, 'top_level.txt') + if os.path.exists(p): + with open(p, 'rb') as f: + data = f.read().decode('utf-8') + self.modules = data.splitlines() + + def __repr__(self): + return '' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def _get_records(self): + """ + Get the list of installed files for the distribution + :return: A list of tuples of path, hash and size. Note that hash and + size might be ``None`` for some entries. The path is exactly + as stored in the file (which is as in PEP 376). + """ + results = [] + r = self.get_distinfo_resource('RECORD') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as record_reader: + # Base location is parent dir of .dist-info dir + #base_location = os.path.dirname(self.path) + #base_location = os.path.abspath(base_location) + for row in record_reader: + missing = [None for i in range(len(row), 3)] + path, checksum, size = row + missing + #if not os.path.isabs(path): + # path = path.replace('/', os.sep) + # path = os.path.join(base_location, path) + results.append((path, checksum, size)) + return results + + @cached_property + def exports(self): + """ + Return the information exported by this distribution. + :return: A dictionary of exports, mapping an export category to a dict + of :class:`ExportEntry` instances describing the individual + export entries, and keyed by name. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + result = self.read_exports() + return result + + def read_exports(self): + """ + Read exports data from a file in .ini format. + + :return: A dictionary of exports, mapping an export category to a list + of :class:`ExportEntry` instances describing the individual + export entries. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + with contextlib.closing(r.as_stream()) as stream: + result = read_exports(stream) + return result + + def write_exports(self, exports): + """ + Write a dictionary of exports to a file in .ini format. + :param exports: A dictionary of exports, mapping an export category to + a list of :class:`ExportEntry` instances describing the + individual export entries. + """ + rf = self.get_distinfo_file(EXPORTS_FILENAME) + with open(rf, 'w') as f: + write_exports(exports, f) + + def get_resource_path(self, relative_path): + """ + NOTE: This API may change in the future. + + Return the absolute path to a resource file with the given relative + path. + + :param relative_path: The path, relative to .dist-info, of the resource + of interest. + :return: The absolute path where the resource is to be found. + """ + r = self.get_distinfo_resource('RESOURCES') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as resources_reader: + for relative, destination in resources_reader: + if relative == relative_path: + return destination + raise KeyError('no resource file with relative path %r ' + 'is installed' % relative_path) + + def list_installed_files(self): + """ + Iterates over the ``RECORD`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: iterator of (path, hash, size) + """ + for result in self._get_records(): + yield result + + def write_installed_files(self, paths, prefix, dry_run=False): + """ + Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any + existing ``RECORD`` file is silently overwritten. + + prefix is used to determine when to write absolute paths. + """ + prefix = os.path.join(prefix, '') + base = os.path.dirname(self.path) + base_under_prefix = base.startswith(prefix) + base = os.path.join(base, '') + record_path = self.get_distinfo_file('RECORD') + logger.info('creating %s', record_path) + if dry_run: + return None + with CSVWriter(record_path) as writer: + for path in paths: + if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')): + # do not put size and hash, as in PEP-376 + hash_value = size = '' + else: + size = '%d' % os.path.getsize(path) + with open(path, 'rb') as fp: + hash_value = self.get_hash(fp.read()) + if path.startswith(base) or (base_under_prefix and + path.startswith(prefix)): + path = os.path.relpath(path, base) + writer.writerow((path, hash_value, size)) + + # add the RECORD file itself + if record_path.startswith(base): + record_path = os.path.relpath(record_path, base) + writer.writerow((record_path, '', '')) + return record_path + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + base = os.path.dirname(self.path) + record_path = self.get_distinfo_file('RECORD') + for path, hash_value, size in self.list_installed_files(): + if not os.path.isabs(path): + path = os.path.join(base, path) + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + elif os.path.isfile(path): + actual_size = str(os.path.getsize(path)) + if size and actual_size != size: + mismatches.append((path, 'size', size, actual_size)) + elif hash_value: + if '=' in hash_value: + hasher = hash_value.split('=', 1)[0] + else: + hasher = None + + with open(path, 'rb') as f: + actual_hash = self.get_hash(f.read(), hasher) + if actual_hash != hash_value: + mismatches.append((path, 'hash', hash_value, actual_hash)) + return mismatches + + @cached_property + def shared_locations(self): + """ + A dictionary of shared locations whose keys are in the set 'prefix', + 'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'. + The corresponding value is the absolute path of that category for + this distribution, and takes into account any paths selected by the + user at installation time (e.g. via command-line arguments). In the + case of the 'namespace' key, this would be a list of absolute paths + for the roots of namespace packages in this distribution. + + The first time this property is accessed, the relevant information is + read from the SHARED file in the .dist-info directory. + """ + result = {} + shared_path = os.path.join(self.path, 'SHARED') + if os.path.isfile(shared_path): + with codecs.open(shared_path, 'r', encoding='utf-8') as f: + lines = f.read().splitlines() + for line in lines: + key, value = line.split('=', 1) + if key == 'namespace': + result.setdefault(key, []).append(value) + else: + result[key] = value + return result + + def write_shared_locations(self, paths, dry_run=False): + """ + Write shared location information to the SHARED file in .dist-info. + :param paths: A dictionary as described in the documentation for + :meth:`shared_locations`. + :param dry_run: If True, the action is logged but no file is actually + written. + :return: The path of the file written to. + """ + shared_path = os.path.join(self.path, 'SHARED') + logger.info('creating %s', shared_path) + if dry_run: + return None + lines = [] + for key in ('prefix', 'lib', 'headers', 'scripts', 'data'): + path = paths[key] + if os.path.isdir(paths[key]): + lines.append('%s=%s' % (key, path)) + for ns in paths.get('namespace', ()): + lines.append('namespace=%s' % ns) + + with codecs.open(shared_path, 'w', encoding='utf-8') as f: + f.write('\n'.join(lines)) + return shared_path + + def get_distinfo_resource(self, path): + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + finder = resources.finder_for_path(self.path) + if finder is None: + raise DistlibException('Unable to get a finder for %s' % self.path) + return finder.find(path) + + def get_distinfo_file(self, path): + """ + Returns a path located under the ``.dist-info`` directory. Returns a + string representing the path. + + :parameter path: a ``'/'``-separated path relative to the + ``.dist-info`` directory or an absolute path; + If *path* is an absolute path and doesn't start + with the ``.dist-info`` directory path, + a :class:`DistlibException` is raised + :type path: str + :rtype: str + """ + # Check if it is an absolute path # XXX use relpath, add tests + if path.find(os.sep) >= 0: + # it's an absolute path? + distinfo_dirname, path = path.split(os.sep)[-2:] + if distinfo_dirname != self.path.split(os.sep)[-1]: + raise DistlibException( + 'dist-info file %r does not belong to the %r %s ' + 'distribution' % (path, self.name, self.version)) + + # The file must be relative + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + + return os.path.join(self.path, path) + + def list_distinfo_files(self): + """ + Iterates over the ``RECORD`` entries and returns paths for each line if + the path is pointing to a file located in the ``.dist-info`` directory + or one of its subdirectories. + + :returns: iterator of paths + """ + base = os.path.dirname(self.path) + for path, checksum, size in self._get_records(): + # XXX add separator or use real relpath algo + if not os.path.isabs(path): + path = os.path.join(base, path) + if path.startswith(self.path): + yield path + + def __eq__(self, other): + return (isinstance(other, InstalledDistribution) and + self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + + +class EggInfoDistribution(BaseInstalledDistribution): + """Created with the *path* of the ``.egg-info`` directory or file provided + to the constructor. It reads the metadata contained in the file itself, or + if the given path happens to be a directory, the metadata is read from the + file ``PKG-INFO`` under that directory.""" + + requested = True # as we have no way of knowing, assume it was + shared_locations = {} + + def __init__(self, path, env=None): + def set_name_and_version(s, n, v): + s.name = n + s.key = n.lower() # for case-insensitive comparisons + s.version = v + + self.path = path + self.dist_path = env + if env and env._cache_enabled and path in env._cache_egg.path: + metadata = env._cache_egg.path[path].metadata + set_name_and_version(self, metadata.name, metadata.version) + else: + metadata = self._get_metadata(path) + + # Need to be set before caching + set_name_and_version(self, metadata.name, metadata.version) + + if env and env._cache_enabled: + env._cache_egg.add(self) + super(EggInfoDistribution, self).__init__(metadata, path, env) + + def _get_metadata(self, path): + requires = None + + def parse_requires_data(data): + """Create a list of dependencies from a requires.txt file. + + *data*: the contents of a setuptools-produced requires.txt file. + """ + reqs = [] + lines = data.splitlines() + for line in lines: + line = line.strip() + if line.startswith('['): + logger.warning('Unexpected line: quitting requirement scan: %r', + line) + break + r = parse_requirement(line) + if not r: + logger.warning('Not recognised as a requirement: %r', line) + continue + if r.extras: + logger.warning('extra requirements in requires.txt are ' + 'not supported') + if not r.constraints: + reqs.append(r.name) + else: + cons = ', '.join('%s%s' % c for c in r.constraints) + reqs.append('%s (%s)' % (r.name, cons)) + return reqs + + def parse_requires_path(req_path): + """Create a list of dependencies from a requires.txt file. + + *req_path*: the path to a setuptools-produced requires.txt file. + """ + + reqs = [] + try: + with codecs.open(req_path, 'r', 'utf-8') as fp: + reqs = parse_requires_data(fp.read()) + except IOError: + pass + return reqs + + tl_path = tl_data = None + if path.endswith('.egg'): + if os.path.isdir(path): + p = os.path.join(path, 'EGG-INFO') + meta_path = os.path.join(p, 'PKG-INFO') + metadata = Metadata(path=meta_path, scheme='legacy') + req_path = os.path.join(p, 'requires.txt') + tl_path = os.path.join(p, 'top_level.txt') + requires = parse_requires_path(req_path) + else: + # FIXME handle the case where zipfile is not available + zipf = zipimport.zipimporter(path) + fileobj = StringIO( + zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8')) + metadata = Metadata(fileobj=fileobj, scheme='legacy') + try: + data = zipf.get_data('EGG-INFO/requires.txt') + tl_data = zipf.get_data('EGG-INFO/top_level.txt').decode('utf-8') + requires = parse_requires_data(data.decode('utf-8')) + except IOError: + requires = None + elif path.endswith('.egg-info'): + if os.path.isdir(path): + req_path = os.path.join(path, 'requires.txt') + requires = parse_requires_path(req_path) + path = os.path.join(path, 'PKG-INFO') + tl_path = os.path.join(path, 'top_level.txt') + metadata = Metadata(path=path, scheme='legacy') + else: + raise DistlibException('path must end with .egg-info or .egg, ' + 'got %r' % path) + + if requires: + metadata.add_requirements(requires) + # look for top-level modules in top_level.txt, if present + if tl_data is None: + if tl_path is not None and os.path.exists(tl_path): + with open(tl_path, 'rb') as f: + tl_data = f.read().decode('utf-8') + if not tl_data: + tl_data = [] + else: + tl_data = tl_data.splitlines() + self.modules = tl_data + return metadata + + def __repr__(self): + return '' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + for path, _, _ in self.list_installed_files(): + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + return mismatches + + def list_installed_files(self): + """ + Iterates over the ``installed-files.txt`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: a list of (path, hash, size) + """ + + def _md5(path): + f = open(path, 'rb') + try: + content = f.read() + finally: + f.close() + return hashlib.md5(content).hexdigest() + + def _size(path): + return os.stat(path).st_size + + record_path = os.path.join(self.path, 'installed-files.txt') + result = [] + if os.path.exists(record_path): + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + p = os.path.normpath(os.path.join(self.path, line)) + # "./" is present as a marker between installed files + # and installation metadata files + if not os.path.exists(p): + logger.warning('Non-existent file: %s', p) + if p.endswith(('.pyc', '.pyo')): + continue + #otherwise fall through and fail + if not os.path.isdir(p): + result.append((p, _md5(p), _size(p))) + result.append((record_path, None, None)) + return result + + def list_distinfo_files(self, absolute=False): + """ + Iterates over the ``installed-files.txt`` entries and returns paths for + each line if the path is pointing to a file located in the + ``.egg-info`` directory or one of its subdirectories. + + :parameter absolute: If *absolute* is ``True``, each returned path is + transformed into a local absolute path. Otherwise the + raw value from ``installed-files.txt`` is returned. + :type absolute: boolean + :returns: iterator of paths + """ + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + skip = True + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + if line == './': + skip = False + continue + if not skip: + p = os.path.normpath(os.path.join(self.path, line)) + if p.startswith(self.path): + if absolute: + yield p + else: + yield line + + def __eq__(self, other): + return (isinstance(other, EggInfoDistribution) and + self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + +new_dist_class = InstalledDistribution +old_dist_class = EggInfoDistribution + + +class DependencyGraph(object): + """ + Represents a dependency graph between distributions. + + The dependency relationships are stored in an ``adjacency_list`` that maps + distributions to a list of ``(other, label)`` tuples where ``other`` + is a distribution and the edge is labeled with ``label`` (i.e. the version + specifier, if such was provided). Also, for more efficient traversal, for + every distribution ``x``, a list of predecessors is kept in + ``reverse_list[x]``. An edge from distribution ``a`` to + distribution ``b`` means that ``a`` depends on ``b``. If any missing + dependencies are found, they are stored in ``missing``, which is a + dictionary that maps distributions to a list of requirements that were not + provided by any other distributions. + """ + + def __init__(self): + self.adjacency_list = {} + self.reverse_list = {} + self.missing = {} + + def add_distribution(self, distribution): + """Add the *distribution* to the graph. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + """ + self.adjacency_list[distribution] = [] + self.reverse_list[distribution] = [] + #self.missing[distribution] = [] + + def add_edge(self, x, y, label=None): + """Add an edge from distribution *x* to distribution *y* with the given + *label*. + + :type x: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type y: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type label: ``str`` or ``None`` + """ + self.adjacency_list[x].append((y, label)) + # multiple edges are allowed, so be careful + if x not in self.reverse_list[y]: + self.reverse_list[y].append(x) + + def add_missing(self, distribution, requirement): + """ + Add a missing *requirement* for the given *distribution*. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + :type requirement: ``str`` + """ + logger.debug('%s missing %r', distribution, requirement) + self.missing.setdefault(distribution, []).append(requirement) + + def _repr_dist(self, dist): + return '%s %s' % (dist.name, dist.version) + + def repr_node(self, dist, level=1): + """Prints only a subgraph""" + output = [self._repr_dist(dist)] + for other, label in self.adjacency_list[dist]: + dist = self._repr_dist(other) + if label is not None: + dist = '%s [%s]' % (dist, label) + output.append(' ' * level + str(dist)) + suboutput = self.repr_node(other, level + 1) + subs = suboutput.split('\n') + output.extend(subs[1:]) + return '\n'.join(output) + + def to_dot(self, f, skip_disconnected=True): + """Writes a DOT output for the graph to the provided file *f*. + + If *skip_disconnected* is set to ``True``, then all distributions + that are not dependent on any other distribution are skipped. + + :type f: has to support ``file``-like operations + :type skip_disconnected: ``bool`` + """ + disconnected = [] + + f.write("digraph dependencies {\n") + for dist, adjs in self.adjacency_list.items(): + if len(adjs) == 0 and not skip_disconnected: + disconnected.append(dist) + for other, label in adjs: + if not label is None: + f.write('"%s" -> "%s" [label="%s"]\n' % + (dist.name, other.name, label)) + else: + f.write('"%s" -> "%s"\n' % (dist.name, other.name)) + if not skip_disconnected and len(disconnected) > 0: + f.write('subgraph disconnected {\n') + f.write('label = "Disconnected"\n') + f.write('bgcolor = red\n') + + for dist in disconnected: + f.write('"%s"' % dist.name) + f.write('\n') + f.write('}\n') + f.write('}\n') + + def topological_sort(self): + """ + Perform a topological sort of the graph. + :return: A tuple, the first element of which is a topologically sorted + list of distributions, and the second element of which is a + list of distributions that cannot be sorted because they have + circular dependencies and so form a cycle. + """ + result = [] + # Make a shallow copy of the adjacency list + alist = {} + for k, v in self.adjacency_list.items(): + alist[k] = v[:] + while True: + # See what we can remove in this run + to_remove = [] + for k, v in list(alist.items())[:]: + if not v: + to_remove.append(k) + del alist[k] + if not to_remove: + # What's left in alist (if anything) is a cycle. + break + # Remove from the adjacency list of others + for k, v in alist.items(): + alist[k] = [(d, r) for d, r in v if d not in to_remove] + logger.debug('Moving to result: %s', + ['%s (%s)' % (d.name, d.version) for d in to_remove]) + result.extend(to_remove) + return result, list(alist.keys()) + + def __repr__(self): + """Representation of the graph""" + output = [] + for dist, adjs in self.adjacency_list.items(): + output.append(self.repr_node(dist)) + return '\n'.join(output) + + +def make_graph(dists, scheme='default'): + """Makes a dependency graph from the given distributions. + + :parameter dists: a list of distributions + :type dists: list of :class:`distutils2.database.InstalledDistribution` and + :class:`distutils2.database.EggInfoDistribution` instances + :rtype: a :class:`DependencyGraph` instance + """ + scheme = get_scheme(scheme) + graph = DependencyGraph() + provided = {} # maps names to lists of (version, dist) tuples + + # first, build the graph and find out what's provided + for dist in dists: + graph.add_distribution(dist) + + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + provided.setdefault(name, []).append((version, dist)) + + # now make the edges + for dist in dists: + requires = (dist.run_requires | dist.meta_requires | + dist.build_requires | dist.dev_requires) + for req in requires: + try: + matcher = scheme.matcher(req) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + matched = False + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + graph.add_edge(dist, provider, req) + matched = True + break + if not matched: + graph.add_missing(dist, req) + return graph + + +def get_dependent_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + dependent on *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + dep = [dist] # dependent distributions + todo = graph.reverse_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop() + dep.append(d) + for succ in graph.reverse_list[d]: + if succ not in dep: + todo.append(succ) + + dep.pop(0) # remove dist from dep, was there to prevent infinite loops + return dep + + +def get_required_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + required by *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + req = [] # required distributions + todo = graph.adjacency_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop()[0] + req.append(d) + for pred in graph.adjacency_list[d]: + if pred not in req: + todo.append(pred) + + return req + + +def make_dist(name, version, **kwargs): + """ + A convenience method for making a dist given just a name and version. + """ + summary = kwargs.pop('summary', 'Placeholder for summary') + md = Metadata(**kwargs) + md.name = name + md.version = version + md.summary = summary or 'Placeholder for summary' + return Distribution(md) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/database.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/database.pyc new file mode 100644 index 0000000000000000000000000000000000000000..566219eb6357b5c22fc94357461a2ce1f671daf7 GIT binary patch literal 49596 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 T8~uIc_l$mc=)r+o2gd#nYvW87 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/index.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/index.py new file mode 100644 index 0000000..7a87cdc --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/index.py @@ -0,0 +1,516 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import hashlib +import logging +import os +import shutil +import subprocess +import tempfile +try: + from threading import Thread +except ImportError: + from dummy_threading import Thread + +from . import DistlibException +from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr, + urlparse, build_opener, string_types) +from .util import cached_property, zip_dir, ServerProxy + +logger = logging.getLogger(__name__) + +DEFAULT_INDEX = 'https://pypi.org/pypi' +DEFAULT_REALM = 'pypi' + +class PackageIndex(object): + """ + This class represents a package index compatible with PyPI, the Python + Package Index. + """ + + boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$' + + def __init__(self, url=None): + """ + Initialise an instance. + + :param url: The URL of the index. If not specified, the URL for PyPI is + used. + """ + self.url = url or DEFAULT_INDEX + self.read_configuration() + scheme, netloc, path, params, query, frag = urlparse(self.url) + if params or query or frag or scheme not in ('http', 'https'): + raise DistlibException('invalid repository: %s' % self.url) + self.password_handler = None + self.ssl_verifier = None + self.gpg = None + self.gpg_home = None + with open(os.devnull, 'w') as sink: + # Use gpg by default rather than gpg2, as gpg2 insists on + # prompting for passwords + for s in ('gpg', 'gpg2'): + try: + rc = subprocess.check_call([s, '--version'], stdout=sink, + stderr=sink) + if rc == 0: + self.gpg = s + break + except OSError: + pass + + def _get_pypirc_command(self): + """ + Get the distutils command for interacting with PyPI configurations. + :return: the command. + """ + from distutils.core import Distribution + from distutils.config import PyPIRCCommand + d = Distribution() + return PyPIRCCommand(d) + + def read_configuration(self): + """ + Read the PyPI access configuration as supported by distutils, getting + PyPI to do the actual work. This populates ``username``, ``password``, + ``realm`` and ``url`` attributes from the configuration. + """ + # get distutils to do the work + c = self._get_pypirc_command() + c.repository = self.url + cfg = c._read_pypirc() + self.username = cfg.get('username') + self.password = cfg.get('password') + self.realm = cfg.get('realm', 'pypi') + self.url = cfg.get('repository', self.url) + + def save_configuration(self): + """ + Save the PyPI access configuration. You must have set ``username`` and + ``password`` attributes before calling this method. + + Again, distutils is used to do the actual work. + """ + self.check_credentials() + # get distutils to do the work + c = self._get_pypirc_command() + c._store_pypirc(self.username, self.password) + + def check_credentials(self): + """ + Check that ``username`` and ``password`` have been set, and raise an + exception if not. + """ + if self.username is None or self.password is None: + raise DistlibException('username and password must be set') + pm = HTTPPasswordMgr() + _, netloc, _, _, _, _ = urlparse(self.url) + pm.add_password(self.realm, netloc, self.username, self.password) + self.password_handler = HTTPBasicAuthHandler(pm) + + def register(self, metadata): + """ + Register a distribution on PyPI, using the provided metadata. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the distribution to be + registered. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + metadata.validate() + d = metadata.todict() + d[':action'] = 'verify' + request = self.encode_request(d.items(), []) + response = self.send_request(request) + d[':action'] = 'submit' + request = self.encode_request(d.items(), []) + return self.send_request(request) + + def _reader(self, name, stream, outbuf): + """ + Thread runner for reading lines of from a subprocess into a buffer. + + :param name: The logical name of the stream (used for logging only). + :param stream: The stream to read from. This will typically a pipe + connected to the output stream of a subprocess. + :param outbuf: The list to append the read lines to. + """ + while True: + s = stream.readline() + if not s: + break + s = s.decode('utf-8').rstrip() + outbuf.append(s) + logger.debug('%s: %s' % (name, s)) + stream.close() + + def get_sign_command(self, filename, signer, sign_password, + keystore=None): + """ + Return a suitable command for signing a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The signing command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + if sign_password is not None: + cmd.extend(['--batch', '--passphrase-fd', '0']) + td = tempfile.mkdtemp() + sf = os.path.join(td, os.path.basename(filename) + '.asc') + cmd.extend(['--detach-sign', '--armor', '--local-user', + signer, '--output', sf, filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd, sf + + def run_command(self, cmd, input_data=None): + """ + Run a command in a child process , passing it any input data specified. + + :param cmd: The command to run. + :param input_data: If specified, this must be a byte string containing + data to be sent to the child process. + :return: A tuple consisting of the subprocess' exit code, a list of + lines read from the subprocess' ``stdout``, and a list of + lines read from the subprocess' ``stderr``. + """ + kwargs = { + 'stdout': subprocess.PIPE, + 'stderr': subprocess.PIPE, + } + if input_data is not None: + kwargs['stdin'] = subprocess.PIPE + stdout = [] + stderr = [] + p = subprocess.Popen(cmd, **kwargs) + # We don't use communicate() here because we may need to + # get clever with interacting with the command + t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout)) + t1.start() + t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr)) + t2.start() + if input_data is not None: + p.stdin.write(input_data) + p.stdin.close() + + p.wait() + t1.join() + t2.join() + return p.returncode, stdout, stderr + + def sign_file(self, filename, signer, sign_password, keystore=None): + """ + Sign a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The absolute pathname of the file where the signature is + stored. + """ + cmd, sig_file = self.get_sign_command(filename, signer, sign_password, + keystore) + rc, stdout, stderr = self.run_command(cmd, + sign_password.encode('utf-8')) + if rc != 0: + raise DistlibException('sign command failed with error ' + 'code %s' % rc) + return sig_file + + def upload_file(self, metadata, filename, signer=None, sign_password=None, + filetype='sdist', pyversion='source', keystore=None): + """ + Upload a release file to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the file to be uploaded. + :param filename: The pathname of the file to be uploaded. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param filetype: The type of the file being uploaded. This is the + distutils command which produced that file, e.g. + ``sdist`` or ``bdist_wheel``. + :param pyversion: The version of Python which the release relates + to. For code compatible with any Python, this would + be ``source``, otherwise it would be e.g. ``3.2``. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.exists(filename): + raise DistlibException('not found: %s' % filename) + metadata.validate() + d = metadata.todict() + sig_file = None + if signer: + if not self.gpg: + logger.warning('no signing program available - not signed') + else: + sig_file = self.sign_file(filename, signer, sign_password, + keystore) + with open(filename, 'rb') as f: + file_data = f.read() + md5_digest = hashlib.md5(file_data).hexdigest() + sha256_digest = hashlib.sha256(file_data).hexdigest() + d.update({ + ':action': 'file_upload', + 'protocol_version': '1', + 'filetype': filetype, + 'pyversion': pyversion, + 'md5_digest': md5_digest, + 'sha256_digest': sha256_digest, + }) + files = [('content', os.path.basename(filename), file_data)] + if sig_file: + with open(sig_file, 'rb') as f: + sig_data = f.read() + files.append(('gpg_signature', os.path.basename(sig_file), + sig_data)) + shutil.rmtree(os.path.dirname(sig_file)) + request = self.encode_request(d.items(), files) + return self.send_request(request) + + def upload_documentation(self, metadata, doc_dir): + """ + Upload documentation to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the documentation to be + uploaded. + :param doc_dir: The pathname of the directory which contains the + documentation. This should be the directory that + contains the ``index.html`` for the documentation. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.isdir(doc_dir): + raise DistlibException('not a directory: %r' % doc_dir) + fn = os.path.join(doc_dir, 'index.html') + if not os.path.exists(fn): + raise DistlibException('not found: %r' % fn) + metadata.validate() + name, version = metadata.name, metadata.version + zip_data = zip_dir(doc_dir).getvalue() + fields = [(':action', 'doc_upload'), + ('name', name), ('version', version)] + files = [('content', name, zip_data)] + request = self.encode_request(fields, files) + return self.send_request(request) + + def get_verify_command(self, signature_filename, data_filename, + keystore=None): + """ + Return a suitable command for verifying a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The verifying command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + cmd.extend(['--verify', signature_filename, data_filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd + + def verify_signature(self, signature_filename, data_filename, + keystore=None): + """ + Verify a signature for a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: True if the signature was verified, else False. + """ + if not self.gpg: + raise DistlibException('verification unavailable because gpg ' + 'unavailable') + cmd = self.get_verify_command(signature_filename, data_filename, + keystore) + rc, stdout, stderr = self.run_command(cmd) + if rc not in (0, 1): + raise DistlibException('verify command failed with error ' + 'code %s' % rc) + return rc == 0 + + def download_file(self, url, destfile, digest=None, reporthook=None): + """ + This is a convenience method for downloading a file from an URL. + Normally, this will be a file from the index, though currently + no check is made for this (i.e. a file can be downloaded from + anywhere). + + The method is just like the :func:`urlretrieve` function in the + standard library, except that it allows digest computation to be + done during download and checking that the downloaded data + matched any expected value. + + :param url: The URL of the file to be downloaded (assumed to be + available via an HTTP GET request). + :param destfile: The pathname where the downloaded file is to be + saved. + :param digest: If specified, this must be a (hasher, value) + tuple, where hasher is the algorithm used (e.g. + ``'md5'``) and ``value`` is the expected value. + :param reporthook: The same as for :func:`urlretrieve` in the + standard library. + """ + if digest is None: + digester = None + logger.debug('No digest specified') + else: + if isinstance(digest, (list, tuple)): + hasher, digest = digest + else: + hasher = 'md5' + digester = getattr(hashlib, hasher)() + logger.debug('Digest specified: %s' % digest) + # The following code is equivalent to urlretrieve. + # We need to do it this way so that we can compute the + # digest of the file as we go. + with open(destfile, 'wb') as dfp: + # addinfourl is not a context manager on 2.x + # so we have to use try/finally + sfp = self.send_request(Request(url)) + try: + headers = sfp.info() + blocksize = 8192 + size = -1 + read = 0 + blocknum = 0 + if "content-length" in headers: + size = int(headers["Content-Length"]) + if reporthook: + reporthook(blocknum, blocksize, size) + while True: + block = sfp.read(blocksize) + if not block: + break + read += len(block) + dfp.write(block) + if digester: + digester.update(block) + blocknum += 1 + if reporthook: + reporthook(blocknum, blocksize, size) + finally: + sfp.close() + + # check that we got the whole file, if we can + if size >= 0 and read < size: + raise DistlibException( + 'retrieval incomplete: got only %d out of %d bytes' + % (read, size)) + # if we have a digest, it must match. + if digester: + actual = digester.hexdigest() + if digest != actual: + raise DistlibException('%s digest mismatch for %s: expected ' + '%s, got %s' % (hasher, destfile, + digest, actual)) + logger.debug('Digest verified: %s', digest) + + def send_request(self, req): + """ + Send a standard library :class:`Request` to PyPI and return its + response. + + :param req: The request to send. + :return: The HTTP response from PyPI (a standard library HTTPResponse). + """ + handlers = [] + if self.password_handler: + handlers.append(self.password_handler) + if self.ssl_verifier: + handlers.append(self.ssl_verifier) + opener = build_opener(*handlers) + return opener.open(req) + + def encode_request(self, fields, files): + """ + Encode fields and files for posting to an HTTP server. + + :param fields: The fields to send as a list of (fieldname, value) + tuples. + :param files: The files to send as a list of (fieldname, filename, + file_bytes) tuple. + """ + # Adapted from packaging, which in turn was adapted from + # http://code.activestate.com/recipes/146306 + + parts = [] + boundary = self.boundary + for k, values in fields: + if not isinstance(values, (list, tuple)): + values = [values] + + for v in values: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"' % + k).encode('utf-8'), + b'', + v.encode('utf-8'))) + for key, filename, value in files: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"; filename="%s"' % + (key, filename)).encode('utf-8'), + b'', + value)) + + parts.extend((b'--' + boundary + b'--', b'')) + + body = b'\r\n'.join(parts) + ct = b'multipart/form-data; boundary=' + boundary + headers = { + 'Content-type': ct, + 'Content-length': str(len(body)) + } + return Request(self.url, body, headers) + + def search(self, terms, operator=None): + if isinstance(terms, string_types): + terms = {'name': terms} + rpc_proxy = ServerProxy(self.url, timeout=3.0) + try: + return rpc_proxy.search(terms, operator or 'and') + finally: + rpc_proxy('close')() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/index.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d029c41488f58078731dcab8a7421255fc0b3fe3 GIT binary patch literal 19940 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 n s2: + result = url1 + if result != url2: + logger.debug('Not replacing %r with %r', url1, url2) + else: + logger.debug('Replacing %r with %r', url1, url2) + return result + + def split_filename(self, filename, project_name): + """ + Attempt to split a filename in project name, version and Python version. + """ + return split_filename(filename, project_name) + + def convert_url_to_download_info(self, url, project_name): + """ + See if a URL is a candidate for a download URL for a project (the URL + has typically been scraped from an HTML page). + + If it is, a dictionary is returned with keys "name", "version", + "filename" and "url"; otherwise, None is returned. + """ + def same_project(name1, name2): + return normalize_name(name1) == normalize_name(name2) + + result = None + scheme, netloc, path, params, query, frag = urlparse(url) + if frag.lower().startswith('egg='): # pragma: no cover + logger.debug('%s: version hint in fragment: %r', + project_name, frag) + m = HASHER_HASH.match(frag) + if m: + algo, digest = m.groups() + else: + algo, digest = None, None + origpath = path + if path and path[-1] == '/': # pragma: no cover + path = path[:-1] + if path.endswith('.whl'): + try: + wheel = Wheel(path) + if not is_compatible(wheel, self.wheel_tags): + logger.debug('Wheel not compatible: %s', path) + else: + if project_name is None: + include = True + else: + include = same_project(wheel.name, project_name) + if include: + result = { + 'name': wheel.name, + 'version': wheel.version, + 'filename': wheel.filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + 'python-version': ', '.join( + ['.'.join(list(v[2:])) for v in wheel.pyver]), + } + except Exception as e: # pragma: no cover + logger.warning('invalid path for wheel: %s', path) + elif not path.endswith(self.downloadable_extensions): # pragma: no cover + logger.debug('Not downloadable: %s', path) + else: # downloadable extension + path = filename = posixpath.basename(path) + for ext in self.downloadable_extensions: + if path.endswith(ext): + path = path[:-len(ext)] + t = self.split_filename(path, project_name) + if not t: # pragma: no cover + logger.debug('No match for project/version: %s', path) + else: + name, version, pyver = t + if not project_name or same_project(project_name, name): + result = { + 'name': name, + 'version': version, + 'filename': filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + #'packagetype': 'sdist', + } + if pyver: # pragma: no cover + result['python-version'] = pyver + break + if result and algo: + result['%s_digest' % algo] = digest + return result + + def _get_digest(self, info): + """ + Get a digest from a dictionary by looking at a "digests" dictionary + or keys of the form 'algo_digest'. + + Returns a 2-tuple (algo, digest) if found, else None. Currently + looks only for SHA256, then MD5. + """ + result = None + if 'digests' in info: + digests = info['digests'] + for algo in ('sha256', 'md5'): + if algo in digests: + result = (algo, digests[algo]) + break + if not result: + for algo in ('sha256', 'md5'): + key = '%s_digest' % algo + if key in info: + result = (algo, info[key]) + break + return result + + def _update_version_data(self, result, info): + """ + Update a result dictionary (the final result from _get_project) with a + dictionary for a specific version, which typically holds information + gleaned from a filename or URL for an archive for the distribution. + """ + name = info.pop('name') + version = info.pop('version') + if version in result: + dist = result[version] + md = dist.metadata + else: + dist = make_dist(name, version, scheme=self.scheme) + md = dist.metadata + dist.digest = digest = self._get_digest(info) + url = info['url'] + result['digests'][url] = digest + if md.source_url != info['url']: + md.source_url = self.prefer_url(md.source_url, url) + result['urls'].setdefault(version, set()).add(url) + dist.locator = self + result[version] = dist + + def locate(self, requirement, prereleases=False): + """ + Find the most recent distribution which matches the given + requirement. + + :param requirement: A requirement of the form 'foo (1.0)' or perhaps + 'foo (>= 1.0, < 2.0, != 1.3)' + :param prereleases: If ``True``, allow pre-release versions + to be located. Otherwise, pre-release versions + are not returned. + :return: A :class:`Distribution` instance, or ``None`` if no such + distribution could be located. + """ + result = None + r = parse_requirement(requirement) + if r is None: # pragma: no cover + raise DistlibException('Not a valid requirement: %r' % requirement) + scheme = get_scheme(self.scheme) + self.matcher = matcher = scheme.matcher(r.requirement) + logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__) + versions = self.get_project(r.name) + if len(versions) > 2: # urls and digests keys are present + # sometimes, versions are invalid + slist = [] + vcls = matcher.version_class + for k in versions: + if k in ('urls', 'digests'): + continue + try: + if not matcher.match(k): + logger.debug('%s did not match %r', matcher, k) + else: + if prereleases or not vcls(k).is_prerelease: + slist.append(k) + else: + logger.debug('skipping pre-release ' + 'version %s of %s', k, matcher.name) + except Exception: # pragma: no cover + logger.warning('error matching %s with %r', matcher, k) + pass # slist.append(k) + if len(slist) > 1: + slist = sorted(slist, key=scheme.key) + if slist: + logger.debug('sorted list: %s', slist) + version = slist[-1] + result = versions[version] + if result: + if r.extras: + result.extras = r.extras + result.download_urls = versions.get('urls', {}).get(version, set()) + d = {} + sd = versions.get('digests', {}) + for url in result.download_urls: + if url in sd: # pragma: no cover + d[url] = sd[url] + result.digests = d + self.matcher = None + return result + + +class PyPIRPCLocator(Locator): + """ + This locator uses XML-RPC to locate distributions. It therefore + cannot be used with simple mirrors (that only mirror file content). + """ + def __init__(self, url, **kwargs): + """ + Initialise an instance. + + :param url: The URL to use for XML-RPC. + :param kwargs: Passed to the superclass constructor. + """ + super(PyPIRPCLocator, self).__init__(**kwargs) + self.base_url = url + self.client = ServerProxy(url, timeout=3.0) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + return set(self.client.list_packages()) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + versions = self.client.package_releases(name, True) + for v in versions: + urls = self.client.release_urls(name, v) + data = self.client.release_data(name, v) + metadata = Metadata(scheme=self.scheme) + metadata.name = data['name'] + metadata.version = data['version'] + metadata.license = data.get('license') + metadata.keywords = data.get('keywords', []) + metadata.summary = data.get('summary') + dist = Distribution(metadata) + if urls: + info = urls[0] + metadata.source_url = info['url'] + dist.digest = self._get_digest(info) + dist.locator = self + result[v] = dist + for info in urls: + url = info['url'] + digest = self._get_digest(info) + result['urls'].setdefault(v, set()).add(url) + result['digests'][url] = digest + return result + +class PyPIJSONLocator(Locator): + """ + This locator uses PyPI's JSON interface. It's very limited in functionality + and probably not worth using. + """ + def __init__(self, url, **kwargs): + super(PyPIJSONLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + url = urljoin(self.base_url, '%s/json' % quote(name)) + try: + resp = self.opener.open(url) + data = resp.read().decode() # for now + d = json.loads(data) + md = Metadata(scheme=self.scheme) + data = d['info'] + md.name = data['name'] + md.version = data['version'] + md.license = data.get('license') + md.keywords = data.get('keywords', []) + md.summary = data.get('summary') + dist = Distribution(md) + dist.locator = self + urls = d['urls'] + result[md.version] = dist + for info in d['urls']: + url = info['url'] + dist.download_urls.add(url) + dist.digests[url] = self._get_digest(info) + result['urls'].setdefault(md.version, set()).add(url) + result['digests'][url] = self._get_digest(info) + # Now get other releases + for version, infos in d['releases'].items(): + if version == md.version: + continue # already done + omd = Metadata(scheme=self.scheme) + omd.name = md.name + omd.version = version + odist = Distribution(omd) + odist.locator = self + result[version] = odist + for info in infos: + url = info['url'] + odist.download_urls.add(url) + odist.digests[url] = self._get_digest(info) + result['urls'].setdefault(version, set()).add(url) + result['digests'][url] = self._get_digest(info) +# for info in urls: +# md.source_url = info['url'] +# dist.digest = self._get_digest(info) +# dist.locator = self +# for info in urls: +# url = info['url'] +# result['urls'].setdefault(md.version, set()).add(url) +# result['digests'][url] = self._get_digest(info) + except Exception as e: + self.errors.put(text_type(e)) + logger.exception('JSON fetch failed: %s', e) + return result + + +class Page(object): + """ + This class represents a scraped HTML page. + """ + # The following slightly hairy-looking regex just looks for the contents of + # an anchor link, which has an attribute "href" either immediately preceded + # or immediately followed by a "rel" attribute. The attribute values can be + # declared with double quotes, single quotes or no quotes - which leads to + # the length of the expression. + _href = re.compile(""" +(rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*))\\s+)? +href\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*)) +(\\s+rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*)))? +""", re.I | re.S | re.X) + _base = re.compile(r"""]+)""", re.I | re.S) + + def __init__(self, data, url): + """ + Initialise an instance with the Unicode page contents and the URL they + came from. + """ + self.data = data + self.base_url = self.url = url + m = self._base.search(self.data) + if m: + self.base_url = m.group(1) + + _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) + + @cached_property + def links(self): + """ + Return the URLs of all the links on a page together with information + about their "rel" attribute, for determining which ones to treat as + downloads and which ones to queue for further scraping. + """ + def clean(url): + "Tidy up an URL." + scheme, netloc, path, params, query, frag = urlparse(url) + return urlunparse((scheme, netloc, quote(path), + params, query, frag)) + + result = set() + for match in self._href.finditer(self.data): + d = match.groupdict('') + rel = (d['rel1'] or d['rel2'] or d['rel3'] or + d['rel4'] or d['rel5'] or d['rel6']) + url = d['url1'] or d['url2'] or d['url3'] + url = urljoin(self.base_url, url) + url = unescape(url) + url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url) + result.add((url, rel)) + # We sort the result, hoping to bring the most recent versions + # to the front + result = sorted(result, key=lambda t: t[0], reverse=True) + return result + + +class SimpleScrapingLocator(Locator): + """ + A locator which scrapes HTML pages to locate downloads for a distribution. + This runs multiple threads to do the I/O; performance is at least as good + as pip's PackageFinder, which works in an analogous fashion. + """ + + # These are used to deal with various Content-Encoding schemes. + decoders = { + 'deflate': zlib.decompress, + 'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(d)).read(), + 'none': lambda b: b, + } + + def __init__(self, url, timeout=None, num_workers=10, **kwargs): + """ + Initialise an instance. + :param url: The root URL to use for scraping. + :param timeout: The timeout, in seconds, to be applied to requests. + This defaults to ``None`` (no timeout specified). + :param num_workers: The number of worker threads you want to do I/O, + This defaults to 10. + :param kwargs: Passed to the superclass. + """ + super(SimpleScrapingLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + self.timeout = timeout + self._page_cache = {} + self._seen = set() + self._to_fetch = queue.Queue() + self._bad_hosts = set() + self.skip_externals = False + self.num_workers = num_workers + self._lock = threading.RLock() + # See issue #45: we need to be resilient when the locator is used + # in a thread, e.g. with concurrent.futures. We can't use self._lock + # as it is for coordinating our internal threads - the ones created + # in _prepare_threads. + self._gplock = threading.RLock() + self.platform_check = False # See issue #112 + + def _prepare_threads(self): + """ + Threads are created only when get_project is called, and terminate + before it returns. They are there primarily to parallelise I/O (i.e. + fetching web pages). + """ + self._threads = [] + for i in range(self.num_workers): + t = threading.Thread(target=self._fetch) + t.setDaemon(True) + t.start() + self._threads.append(t) + + def _wait_threads(self): + """ + Tell all the threads to terminate (by sending a sentinel value) and + wait for them to do so. + """ + # Note that you need two loops, since you can't say which + # thread will get each sentinel + for t in self._threads: + self._to_fetch.put(None) # sentinel + for t in self._threads: + t.join() + self._threads = [] + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + with self._gplock: + self.result = result + self.project_name = name + url = urljoin(self.base_url, '%s/' % quote(name)) + self._seen.clear() + self._page_cache.clear() + self._prepare_threads() + try: + logger.debug('Queueing %s', url) + self._to_fetch.put(url) + self._to_fetch.join() + finally: + self._wait_threads() + del self.result + return result + + platform_dependent = re.compile(r'\b(linux_(i\d86|x86_64|arm\w+)|' + r'win(32|_amd64)|macosx_?\d+)\b', re.I) + + def _is_platform_dependent(self, url): + """ + Does an URL refer to a platform-specific download? + """ + return self.platform_dependent.search(url) + + def _process_download(self, url): + """ + See if an URL is a suitable download for a project. + + If it is, register information in the result dictionary (for + _get_project) about the specific version it's for. + + Note that the return value isn't actually used other than as a boolean + value. + """ + if self.platform_check and self._is_platform_dependent(url): + info = None + else: + info = self.convert_url_to_download_info(url, self.project_name) + logger.debug('process_download: %s -> %s', url, info) + if info: + with self._lock: # needed because self.result is shared + self._update_version_data(self.result, info) + return info + + def _should_queue(self, link, referrer, rel): + """ + Determine whether a link URL from a referring page and with a + particular "rel" attribute should be queued for scraping. + """ + scheme, netloc, path, _, _, _ = urlparse(link) + if path.endswith(self.source_extensions + self.binary_extensions + + self.excluded_extensions): + result = False + elif self.skip_externals and not link.startswith(self.base_url): + result = False + elif not referrer.startswith(self.base_url): + result = False + elif rel not in ('homepage', 'download'): + result = False + elif scheme not in ('http', 'https', 'ftp'): + result = False + elif self._is_platform_dependent(link): + result = False + else: + host = netloc.split(':', 1)[0] + if host.lower() == 'localhost': + result = False + else: + result = True + logger.debug('should_queue: %s (%s) from %s -> %s', link, rel, + referrer, result) + return result + + def _fetch(self): + """ + Get a URL to fetch from the work queue, get the HTML page, examine its + links for download candidates and candidates for further scraping. + + This is a handy method to run in a thread. + """ + while True: + url = self._to_fetch.get() + try: + if url: + page = self.get_page(url) + if page is None: # e.g. after an error + continue + for link, rel in page.links: + if link not in self._seen: + try: + self._seen.add(link) + if (not self._process_download(link) and + self._should_queue(link, url, rel)): + logger.debug('Queueing %s from %s', link, url) + self._to_fetch.put(link) + except MetadataInvalidError: # e.g. invalid versions + pass + except Exception as e: # pragma: no cover + self.errors.put(text_type(e)) + finally: + # always do this, to avoid hangs :-) + self._to_fetch.task_done() + if not url: + #logger.debug('Sentinel seen, quitting.') + break + + def get_page(self, url): + """ + Get the HTML for an URL, possibly from an in-memory cache. + + XXX TODO Note: this cache is never actually cleared. It's assumed that + the data won't get stale over the lifetime of a locator instance (not + necessarily true for the default_locator). + """ + # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api + scheme, netloc, path, _, _, _ = urlparse(url) + if scheme == 'file' and os.path.isdir(url2pathname(path)): + url = urljoin(ensure_slash(url), 'index.html') + + if url in self._page_cache: + result = self._page_cache[url] + logger.debug('Returning %s from cache: %s', url, result) + else: + host = netloc.split(':', 1)[0] + result = None + if host in self._bad_hosts: + logger.debug('Skipping %s due to bad host %s', url, host) + else: + req = Request(url, headers={'Accept-encoding': 'identity'}) + try: + logger.debug('Fetching %s', url) + resp = self.opener.open(req, timeout=self.timeout) + logger.debug('Fetched %s', url) + headers = resp.info() + content_type = headers.get('Content-Type', '') + if HTML_CONTENT_TYPE.match(content_type): + final_url = resp.geturl() + data = resp.read() + encoding = headers.get('Content-Encoding') + if encoding: + decoder = self.decoders[encoding] # fail if not found + data = decoder(data) + encoding = 'utf-8' + m = CHARSET.search(content_type) + if m: + encoding = m.group(1) + try: + data = data.decode(encoding) + except UnicodeError: # pragma: no cover + data = data.decode('latin-1') # fallback + result = Page(data, final_url) + self._page_cache[final_url] = result + except HTTPError as e: + if e.code != 404: + logger.exception('Fetch failed: %s: %s', url, e) + except URLError as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + with self._lock: + self._bad_hosts.add(host) + except Exception as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + finally: + self._page_cache[url] = result # even if None (failure) + return result + + _distname_re = re.compile(']*>([^<]+)<') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + page = self.get_page(self.base_url) + if not page: + raise DistlibException('Unable to get %s' % self.base_url) + for match in self._distname_re.finditer(page.data): + result.add(match.group(1)) + return result + +class DirectoryLocator(Locator): + """ + This class locates distributions in a directory tree. + """ + + def __init__(self, path, **kwargs): + """ + Initialise an instance. + :param path: The root of the directory tree to search. + :param kwargs: Passed to the superclass constructor, + except for: + * recursive - if True (the default), subdirectories are + recursed into. If False, only the top-level directory + is searched, + """ + self.recursive = kwargs.pop('recursive', True) + super(DirectoryLocator, self).__init__(**kwargs) + path = os.path.abspath(path) + if not os.path.isdir(path): # pragma: no cover + raise DistlibException('Not a directory: %r' % path) + self.base_dir = path + + def should_include(self, filename, parent): + """ + Should a filename be considered as a candidate for a distribution + archive? As well as the filename, the directory which contains it + is provided, though not used by the current implementation. + """ + return filename.endswith(self.downloadable_extensions) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, name) + if info: + self._update_version_data(result, info) + if not self.recursive: + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, None) + if info: + result.add(info['name']) + if not self.recursive: + break + return result + +class JSONLocator(Locator): + """ + This locator uses special extended metadata (not available on PyPI) and is + the basis of performant dependency resolution in distlib. Other locators + require archive downloads before dependencies can be determined! As you + might imagine, that can be slow. + """ + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + data = get_project_data(name) + if data: + for info in data.get('files', []): + if info['ptype'] != 'sdist' or info['pyversion'] != 'source': + continue + # We don't store summary in project metadata as it makes + # the data bigger for no benefit during dependency + # resolution + dist = make_dist(data['name'], info['version'], + summary=data.get('summary', + 'Placeholder for summary'), + scheme=self.scheme) + md = dist.metadata + md.source_url = info['url'] + # TODO SHA256 digest + if 'digest' in info and info['digest']: + dist.digest = ('md5', info['digest']) + md.dependencies = info.get('requirements', {}) + dist.exports = info.get('exports', {}) + result[dist.version] = dist + result['urls'].setdefault(dist.version, set()).add(info['url']) + return result + +class DistPathLocator(Locator): + """ + This locator finds installed distributions in a path. It can be useful for + adding to an :class:`AggregatingLocator`. + """ + def __init__(self, distpath, **kwargs): + """ + Initialise an instance. + + :param distpath: A :class:`DistributionPath` instance to search. + """ + super(DistPathLocator, self).__init__(**kwargs) + assert isinstance(distpath, DistributionPath) + self.distpath = distpath + + def _get_project(self, name): + dist = self.distpath.get_distribution(name) + if dist is None: + result = {'urls': {}, 'digests': {}} + else: + result = { + dist.version: dist, + 'urls': {dist.version: set([dist.source_url])}, + 'digests': {dist.version: set([None])} + } + return result + + +class AggregatingLocator(Locator): + """ + This class allows you to chain and/or merge a list of locators. + """ + def __init__(self, *locators, **kwargs): + """ + Initialise an instance. + + :param locators: The list of locators to search. + :param kwargs: Passed to the superclass constructor, + except for: + * merge - if False (the default), the first successful + search from any of the locators is returned. If True, + the results from all locators are merged (this can be + slow). + """ + self.merge = kwargs.pop('merge', False) + self.locators = locators + super(AggregatingLocator, self).__init__(**kwargs) + + def clear_cache(self): + super(AggregatingLocator, self).clear_cache() + for locator in self.locators: + locator.clear_cache() + + def _set_scheme(self, value): + self._scheme = value + for locator in self.locators: + locator.scheme = value + + scheme = property(Locator.scheme.fget, _set_scheme) + + def _get_project(self, name): + result = {} + for locator in self.locators: + d = locator.get_project(name) + if d: + if self.merge: + files = result.get('urls', {}) + digests = result.get('digests', {}) + # next line could overwrite result['urls'], result['digests'] + result.update(d) + df = result.get('urls') + if files and df: + for k, v in files.items(): + if k in df: + df[k] |= v + else: + df[k] = v + dd = result.get('digests') + if digests and dd: + dd.update(digests) + else: + # See issue #18. If any dists are found and we're looking + # for specific constraints, we only return something if + # a match is found. For example, if a DirectoryLocator + # returns just foo (1.0) while we're looking for + # foo (>= 2.0), we'll pretend there was nothing there so + # that subsequent locators can be queried. Otherwise we + # would just return foo (1.0) which would then lead to a + # failure to find foo (>= 2.0), because other locators + # weren't searched. Note that this only matters when + # merge=False. + if self.matcher is None: + found = True + else: + found = False + for k in d: + if self.matcher.match(k): + found = True + break + if found: + result = d + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for locator in self.locators: + try: + result |= locator.get_distribution_names() + except NotImplementedError: + pass + return result + + +# We use a legacy scheme simply because most of the dists on PyPI use legacy +# versions which don't conform to PEP 426 / PEP 440. +default_locator = AggregatingLocator( + JSONLocator(), + SimpleScrapingLocator('https://pypi.org/simple/', + timeout=3.0), + scheme='legacy') + +locate = default_locator.locate + +NAME_VERSION_RE = re.compile(r'(?P[\w-]+)\s*' + r'\(\s*(==\s*)?(?P[^)]+)\)$') + +class DependencyFinder(object): + """ + Locate dependencies for distributions. + """ + + def __init__(self, locator=None): + """ + Initialise an instance, using the specified locator + to locate distributions. + """ + self.locator = locator or default_locator + self.scheme = get_scheme(self.locator.scheme) + + def add_distribution(self, dist): + """ + Add a distribution to the finder. This will update internal information + about who provides what. + :param dist: The distribution to add. + """ + logger.debug('adding distribution %s', dist) + name = dist.key + self.dists_by_name[name] = dist + self.dists[(name, dist.version)] = dist + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + self.provided.setdefault(name, set()).add((version, dist)) + + def remove_distribution(self, dist): + """ + Remove a distribution from the finder. This will update internal + information about who provides what. + :param dist: The distribution to remove. + """ + logger.debug('removing distribution %s', dist) + name = dist.key + del self.dists_by_name[name] + del self.dists[(name, dist.version)] + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Remove from provided: %s, %s, %s', name, version, dist) + s = self.provided[name] + s.remove((version, dist)) + if not s: + del self.provided[name] + + def get_matcher(self, reqt): + """ + Get a version matcher for a requirement. + :param reqt: The requirement + :type reqt: str + :return: A version matcher (an instance of + :class:`distlib.version.Matcher`). + """ + try: + matcher = self.scheme.matcher(reqt) + except UnsupportedVersionError: # pragma: no cover + # XXX compat-mode if cannot read the version + name = reqt.split()[0] + matcher = self.scheme.matcher(name) + return matcher + + def find_providers(self, reqt): + """ + Find the distributions which can fulfill a requirement. + + :param reqt: The requirement. + :type reqt: str + :return: A set of distribution which can fulfill the requirement. + """ + matcher = self.get_matcher(reqt) + name = matcher.key # case-insensitive + result = set() + provided = self.provided + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + result.add(provider) + break + return result + + def try_to_replace(self, provider, other, problems): + """ + Attempt to replace one provider with another. This is typically used + when resolving dependencies from multiple sources, e.g. A requires + (B >= 1.0) while C requires (B >= 1.1). + + For successful replacement, ``provider`` must meet all the requirements + which ``other`` fulfills. + + :param provider: The provider we are trying to replace with. + :param other: The provider we're trying to replace. + :param problems: If False is returned, this will contain what + problems prevented replacement. This is currently + a tuple of the literal string 'cantreplace', + ``provider``, ``other`` and the set of requirements + that ``provider`` couldn't fulfill. + :return: True if we can replace ``other`` with ``provider``, else + False. + """ + rlist = self.reqts[other] + unmatched = set() + for s in rlist: + matcher = self.get_matcher(s) + if not matcher.match(provider.version): + unmatched.add(s) + if unmatched: + # can't replace other with provider + problems.add(('cantreplace', provider, other, + frozenset(unmatched))) + result = False + else: + # can replace other with provider + self.remove_distribution(other) + del self.reqts[other] + for s in rlist: + self.reqts.setdefault(provider, set()).add(s) + self.add_distribution(provider) + result = True + return result + + def find(self, requirement, meta_extras=None, prereleases=False): + """ + Find a distribution and all distributions it depends on. + + :param requirement: The requirement specifying the distribution to + find, or a Distribution instance. + :param meta_extras: A list of meta extras such as :test:, :build: and + so on. + :param prereleases: If ``True``, allow pre-release versions to be + returned - otherwise, don't return prereleases + unless they're all that's available. + + Return a set of :class:`Distribution` instances and a set of + problems. + + The distributions returned should be such that they have the + :attr:`required` attribute set to ``True`` if they were + from the ``requirement`` passed to ``find()``, and they have the + :attr:`build_time_dependency` attribute set to ``True`` unless they + are post-installation dependencies of the ``requirement``. + + The problems should be a tuple consisting of the string + ``'unsatisfied'`` and the requirement which couldn't be satisfied + by any distribution known to the locator. + """ + + self.provided = {} + self.dists = {} + self.dists_by_name = {} + self.reqts = {} + + meta_extras = set(meta_extras or []) + if ':*:' in meta_extras: + meta_extras.remove(':*:') + # :meta: and :run: are implicitly included + meta_extras |= set([':test:', ':build:', ':dev:']) + + if isinstance(requirement, Distribution): + dist = odist = requirement + logger.debug('passed %s as requirement', odist) + else: + dist = odist = self.locator.locate(requirement, + prereleases=prereleases) + if dist is None: + raise DistlibException('Unable to locate %r' % requirement) + logger.debug('located %s', odist) + dist.requested = True + problems = set() + todo = set([dist]) + install_dists = set([odist]) + while todo: + dist = todo.pop() + name = dist.key # case-insensitive + if name not in self.dists_by_name: + self.add_distribution(dist) + else: + #import pdb; pdb.set_trace() + other = self.dists_by_name[name] + if other != dist: + self.try_to_replace(dist, other, problems) + + ireqts = dist.run_requires | dist.meta_requires + sreqts = dist.build_requires + ereqts = set() + if meta_extras and dist in install_dists: + for key in ('test', 'build', 'dev'): + e = ':%s:' % key + if e in meta_extras: + ereqts |= getattr(dist, '%s_requires' % key) + all_reqts = ireqts | sreqts | ereqts + for r in all_reqts: + providers = self.find_providers(r) + if not providers: + logger.debug('No providers found for %r', r) + provider = self.locator.locate(r, prereleases=prereleases) + # If no provider is found and we didn't consider + # prereleases, consider them now. + if provider is None and not prereleases: + provider = self.locator.locate(r, prereleases=True) + if provider is None: + logger.debug('Cannot satisfy %r', r) + problems.add(('unsatisfied', r)) + else: + n, v = provider.key, provider.version + if (n, v) not in self.dists: + todo.add(provider) + providers.add(provider) + if r in ireqts and dist in install_dists: + install_dists.add(provider) + logger.debug('Adding %s to install_dists', + provider.name_and_version) + for p in providers: + name = p.key + if name not in self.dists_by_name: + self.reqts.setdefault(p, set()).add(r) + else: + other = self.dists_by_name[name] + if other != p: + # see if other can be replaced by p + self.try_to_replace(p, other, problems) + + dists = set(self.dists.values()) + for dist in dists: + dist.build_time_dependency = dist not in install_dists + if dist.build_time_dependency: + logger.debug('%s is a build-time dependency only.', + dist.name_and_version) + logger.debug('find done for %s', odist) + return dists, problems diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/locators.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/locators.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d3df7e509118b6436e5541f88138db6be9f5869 GIT binary patch literal 46033 zcmd75dvqPwec!v!0SE#hNPsVplqhLPi6SVGph!uyO_AaYltf!1=^8ee|u)m0HhSVgxgC38+-Qb*|Q(N_wTp&^!z{T2mkpW`H@n^CI9;Pdy?OH ze~)ujehRMc+?3B3UA^EMMK@J+h2&n3o9apH^}4CvG{448tx5BJZmKWMuXR&v-O@;U z+3%+M-DLAI*BcGETZ69s?XFNr+aA=-X2D%a-nGt6t#egg*X!y-uCd-tt*0McuW|Ja zt}*PUhFxRCO^vw5MmM$5H8#1aO|G%oO>K6KEpBRyYixB>TU}$+O^v$7HaE4+HMYB{ z?XI!IO+DfokGiQxU1O)4+UXjPxv9ro<8e3jxPM2Vt3Tlyftw0kW0#xSYdqtoo^g$5-PE(LvENPY zcZ~yX>VRvEyQy*4IOwJh`sW8+{W;e-wf}485HC}X6FS

      uw%#(TCiJxi%z)eu=_NP zoOIO@7d_&p3$D7+ecHKu&V6#~l&fxX(P=B)oRyw&)h#YMW2IZO(g{}`O-r|BrDt7r zd)mT|tn?LEeI%{>Xjb~FtL{uoAInN#bJfSw(kHUgbFLbsrMt4ykGksawDifW^kXjK z=bVNV@s6ilb&sn)%|sNcdtG&m2`Wsz?xNS-%{ScC8|h5#vza>Ys?VhTe>Q9Jf{^6W z*nY64_Ivz0KUN^ySxa(ysT0NLF4R=uOGn5})Z$LPcH`_~C7SEhTFtTHwEjZ7ezR3; zcKRtGKUZ$YQD@L!EHwS)kiR@USMJO<%Z;d`g7o4rPj%K%FuxEjL`kmIiF}LAD6W*} z{1b7fU2D#iI!kj=Y)#x)sMV{b)?Cz#+MUfb@!I9f7sIGpYe$vNYvpFOPWb@kooKOR z&)E>eh*!lOyQ3%0w%e_?z3$EMb-NgYk~n*X2HvjSSkRz5=}e>r7a5PW(kS1GN>!?k z74@Lz;*F?Nu9iFH&X(N8x#m0Ndadf;VI9*vR?3yxs9Kt9Gm>^^sk4zXo48V?9aW=d zr&g}}0Y}Yvp&gatdO4o$Y@k{^SFd$S)3thJ^QsQcL>)DClPM@!2fEF*88~y(pvlf? z_7Xi=VzNr_MD19^T*s|TQJc$)?bhOwy{Or0H|YAiQAySPFty5hTTJ&^)NNe8NeAcV zn9ZpA3E!F@t4)g*d2%+2>YerEYH_L3Y5)bb8}%sOM9JG@S8qSN@A%kT_?gPA!4Pg?R4hiqX!SpEzQ-&TkRRkR0QGbm%4R^-}s{>cVHVm?pD8RZ*`r5yX#z&R}`%r z(oz)G-7UCxH@G_mce6)0d1;a-xT^LF<0vRxq2SV(+Ks=PWH8`g7wc6J9(cn~2 zr)kyDYkZsczsxsnn9!*;qSiuZhEDRY|Kxc?ze>FoM`OK|bd;QLH6vTGiL=#&UR$J|Z>OFMlV7+>J$F zT;EV(ps=aXQ`k`K2+dXyhKlOwpJ3oLzwsWD2+4t^BrS?Y!blJnq8`_aoY0GWfLIV- zvO&gYscx%uDyV>vanNZ6w_EL7LAl*pXjX%AaARSHbqeBEBML4qb!J=5;Q8^xEGiv3blG)}U{Bh-P z_Sq|~LSgAF!_xoi{pYD<`VbL(xLJ*5QvclG2Xm z>g7sQnvKfUsBLo^iX(*wNX9fDp;jc+g9b^S&V*Voqs;<>=>?!bpr*N-Eyv|fryU+t z4e^81O!A6lw^xfGlp>M+((}(9ws#q*$5DOSItrx(>7ARNv+_!-8d-TGp7C$8KF8Lr zW^`K}P&aQyOP*~RBkaVh2le3#G=Gv`qj|2Uudu!_R2VGullJmET-eI*=Hhz(j%hBe zA0@+yQpp%{snlpy7wQq0s!%FbTa{AD8oqy04&7h${QX5A>JD&Ka65dKj(td@6ae-0 z^z{vFvCh8k@xMZ;{nKs3*c1N6f4ananug zs_PBI2PIAl)wzW@NoGjmq%!LhadK*di-uja-bEWsAVnS6WED2Ls!5iJ?MRh+WV5T9 zREhA8M5&Uku4)n`B0SQhO18PGNs|cjNRleqA?dY>Fo`hxsA$YCMi#$HlF*nNz;Z%p zrd#bGrHH`+*a2b@Ec zZ{0{T(ael5i54TDxjkF=nYrq;EmSp{E-%zO6(LXhdxm^`lB8z*wd6?#5Lggr1##{n zu0up9VbOdBa%A*{TPkO%B(SQ*_-z=s&579Rxn@n`QH{AV)(JOhRw7SVbwA;to^%`y zPDhpU0(G<5tG8OW0?lWm1?NO=gjWTLAQbNxr(Me4rS@|Fno(30%@?0FmYh5m_?PJx zuNsGO*Ww_aiz>D0S`@!uYvSpZg?3x-zj*fI0lLy^AgNV(Nz&i}wHI8!zPBFDlq*Yn zuU~(^#%j~SQfnbddzi>%L9_@v1y+`WM*v&8xODMcchb&}NwhQKRx;rX_^X5g;{w|HIfb(0?x-Qrod^kiD%VH5rdcSG2NyGi_W zg~{e4t~YrKc8m#NQYL`;0n_}G8!$~ILCPk1_L6B*@rQYBwq&V5*jx(y`~Mv?>M*)$W=YQ4b}env51T=Fk*0D7c`Nyn>Pt*~%aX125jh{r# zU>EOSraYUyGYC*^P=3YaHOfnV0&hf76D*&ZiE?x3)!gth4cUU&EUe<7C3aTSv1Hia z&UGxB<<{IkOsQpg(31(t!^wFs3%x=GTSRN}o6=!nwC}K?`DeNG{e8f)2(NvA(_U)D z4D}NY@SE1fk|4HOP@RB54$AVDfXmqu~{9`iT_@vWZ0*Usz3`*L0RZ z!lbXC=Q5qn`}!(X9a$LghNOI}sg{=vHRI#VYX;}9z?#azObvY~NVNL>0nH(I$6;_#kB{N!HiC1K>hxJB4&`yU&>CHUJdhp zwLh^3Fqg=SaVi1*56xP5RZ}7KUu_C1tCWyE-+iyw{{VOV9QB%T*~7Jd&!`;!ozN!m zNgD7jyEMKHdcnY(XA{amRVmOXllqX09lHIrU7ILc5S7b4D&^Kh1nM5+A`wIXG4IS~ z|9?K33hUw^4@E+gDkzmefJ_nl;gHqf<^rN^hRiWYDrzr!Q7Vif`ho#~_>qK5 z0|0R@s3|Mtmm7ITOIS1$9RScHQ`TK1xE^;CmC#qi-eH$oU2iBc`$l_OTn+u1yR@de z17;%Wl`T+hqAwO@NvUG<;BuWHDzS~&E2d=v5#5LvNHQRK6)G+*1#1Co5La65D3SRp zltL5{?@gnq%(k$=LGPn!4O5E4 z-P{Xzk(lk_w#>ezPI)Fa+215jtcoxTFV~t@AV@Mnv=dg+2fHR>do@O5Ysw6IT;$)r zih!sovGtK@>1(=>ecG)V0u1{AL8XrtwihZrlnMwnKWF%j{{RUv0l)!^?b}_-A-DuM zJRvbX;x6z<2^vJNYoAbko)Ux^RNd-v?Xsprb~~VuAD-$#rMR7z8jVUy{d0)~@dxq} z#2F7va7Z&9-)bRMIf3 z^RnlHF|`yemc?85XRRbAh~S-gJiyklZ<+kj)qyj5W%m4Fy8KRSp&bXQDc=vGh01M3 z826!dN&m7}nMfklHn55qV8JRYG%3RKKtbz%O-ED@QfRB;RapwgP@}s7iq+U>1eLLS zVIp~>8S!(tw;dorr~oTv;S{0W(?(Wds`s?xE!+$raKqD9*3m28rn|Had#e$KWHYIH zwN1bVTplv?By-s4u-Pl)L;la zh7S_SJz*B0ig`+Gi1E&M>EfwQN9wGJdGcokopRgGSL*9k^++hMt>Un14hZMA`76o zXI)qO9Ap7wJl1~9_IC%|-9dL}P(l(b^JSNC(Uy~Nul}YMa3AiWVGP|?xVXSuDQub z-mtq#9}Gw+yffn3|3{$)iL~-+zdNGbu&WOE90u4ycLZOlJQA>9o`qx6xpfZqONTJ> z9>KnQbCWDRdUi8zlqcL>47M9oievT;`C<12mHBzQ=;m)1^x%j)!kRGL$@yO`_IBtk zCZ4~G-*1yEXxg#j@>)jCh^TR;Ia2TwBkI0QZN>lDDzZL|%~x#x->$RW-Q1B(SFaX$ zvs?Tno3Cwj?PuLxdSnxPXNwwXZz^($yUSm$(;DavkE&KOQCr=et#GPh0u7t9w=L+# z)gE_u)ZN|Y?rzruL-8LjdggLxRGn}C(_#$<#Bembn4~qeSg(Koc@-zyuIEYNVa(XE z`F~nu#xBlpD)KW)Vf%NBcZMv*Sw$TNH{?d;IpXTlm}G}|Q=U;>iqPqxxFYQV8j8f! zgee(MLgP(j4XfeBpp-a_i68M`M*Hyv1w;zq53bjj5U!xuaivWtL8_@XgV!#<@p>?a z*D}w8P-vk*HCVzj4V(UWFDuU*CCAkh2fIZ(cJB{%CnRWhm(A@?Y0Yk98M`5!yI<;R zulob(tQuz8Y?pjhQe#06b971bB(+FX)a>M$oC|_3vv9~8Zi=gM4R!5MmRn7RAki_V z^;Ay(_qsM}S1_>?H^Fh!!S}>RGkT4_!L&AEzvUSPARL7kTI`8Qd{Z~L>$k0fz@6-X1t~@#T!U)8smFCkUV2S1vMXu!SchE z1xm)=^$ufh;@&B=NwT#Y0ZpB6VQj(BZOdA?AwDqTMlxI&7)l9Ek;Cymso+YiGlf{@6m=n@x6}!NoimhtsOQOUZ5} zvq~Z*rkw#U&QFje29p*nR7Y>0TcXoeB=@}qv1GwLHo>>c?Iw~-2=R2`4J8#dB9J85 z#JJp;*qVtXHu>RgUB0VCdZG6j)Re1|Shp>lA-1t#9BMCF2LuteVhy`2*JoN**-xSI z?N+-sV|s|XZYyPdtTik31w6A_?sr0AiVfE~i7FDxERdTDIPPj{t6I}atEqXEU{va~ zGIa!B#B}R7xF19AOpqegy$A1swlmp2d}RF4`Cqh zD;zHl7q;2`&4m%3-DtYUW=cn?xz_$8d(r-g`GPU13+$KaB!7|u_&H_{uSm%LaZv&X zmphO_77vM~Ph5N2G!#fXVFFZn($o_K48(zHB!?o@{Yl5qq-Z$&{qt_|C0AX`lh5f% z#0IL4O0D4sI}B}Hvo?@!)^yvr=H{=ZZCo1br*rXtBFQNCtBG|}2$WhCbGA-`WaP9n zbEibb-5yTj-8qA3))t6uggObD0nr=5UO`xbpnG%Lhqs`K?;JkRSwLqA##D1Z?W!yL z#GIxT*|9%}aJ3i#9}muWpIyD{CRFcYj4H4l5td7@ojUyD5pyLrgEuB#?9zFI;iUHl z@$qb#ss_G|>WlFMNJ;o7n5po4NW6uzdnp_+3bR5{5F~nh{BG6wP9?|mJin`GwlPDL zAIl-S5(_z8e;-gh2$T;2o$G++^#<3#?3Zu{P8~+vwPzBBcmWV%6q5Y+ayb?M1 z@nCgQ8NsCoHhg!8%*|aEsAT{vx!B}oVk7f)R7fkdTV89#hN+JK3)+%-U4TNfR@IF_f5>NHH9g2uSoX1`St2Rp!?JyY0=Db^PL`XLD zpx!Z%C&7UK$mlbueREElIDqJ#b2-2cOwO6EHOuw%rs=bJJK#Pqpma6Y9P)UfDRD+u zQsyl6SFXpdyfoXYS7X?<5XKbntZy^e)ti|R)m7AhbjfY@0>a$9DsGo6&Cy*1$kFEK z7{BKt0#joI(A4<6*{KX8=2~;c3ouJrU}Y%Ny=O9iO1aPKIb)|73J5FW@lfVBUlw(e z$OLN(?}Pmx%t1OUM)pd6&2I;+xXun zF(M!yO{7ZjF(GWcrhqQ!>)jl2L+z~vg}|Y<*`tN#X!svw<`2qPLKcy24hE-*ZyJ`?>FYs%t}^c1?I zst!SRm?e6#&Uo?sSBz9ZYhEjA?nYhv7YaTDTP}@SYjg>1tyl3hA~M_bFv_K;IjXip zw@~$IS2fopHPQSR$Hm@JLnp31X-YqOGl0M>Z!MBRjoyKp#-C&JTZ{Zm>WUU0(Tf2Y zzx0$`vJmk23BW6(4X+TCYTl=OFiqZ+n9v#T>r=#1e=#K*LCrSY3b1JuRq*JT;MejSamj!=)iDk6HvyB|}PBWojjWiEr?2IIeXoL0w!3rvf7 zIQM_!P05riwdsDP@~AJ;#2qy^?$PTLIlu6Ah`o=U!o}KVOj1v;Q#wt1I87_F_YYy& z%2raZaXOBye*7r(ND5Usu;};v!l5#?&BfzEqAe9F7~2!?GvzJ(-+3|=Lx@G}xrL3| z#%I;_>>k~`RrBue2h6=sR}9wmDu z0Cm^x(wK(jbvnyg3s0!bc-d>@Oo_{ZX->T}jf{;9p`u#C>q<;#`@?!nM$-gxO14(v zr_y449$okgFX*{%Q}XSqAfoTPZX%vtqX)IiarlNReNmOvc&gfpNyaw8hRt4=`vKLG zE3W&Z*jt!2#CC3Y{amLIZc1Hj%B05jPK7NCs(&klWQh0hR&SfGt~SrquszffQRw2! zT)OoVJ*7eo7j_hOqBLzP_L=%6#jA%>nX5;N11MDMsnt)7?c5oGn~v~zfErKncN14b zC~h)wn_&G=QItNuL(?<T^T=61bhKz1b2V4)L3mb8ny&vb|q;KJS4oWd&Ju$ zPz;-JCU=>MApE>8O+Ndwa_5!&Rgy7&bIHSo0EQDZ_X&REaS{TDSv&ss^%Vz;Lz@RS z46GgK(f{G%z|cV7z{Y{$fl>Z`bYR=SHVbQ(mngh==JgeE#sb^ZYIYwBJTxuQc)EJ(*f(lg(=^c#MpI7zZY{A0YyK&6gm)c*YfaKON4oI)(4edLzbC>aI_B1nN{koW z=~t_DhF{}ocTeESJ)hc zd&zl^nlz(T9Jq+a4{6{UC7v?n8NZVQC+RrIPYuJI(BcIive*>~O{XoCL zen7wbT?t2+X%8hd7arveSPd4h=<$hbZ%AiK9+#Ui_pEdZBT_qV;(@{jel2UdFa6Cxo&sl*wMPQYuB8$=Y19Nr{Oi%L=rSG2Eh7Ot{KA;^msZr5it{ zD zRHpy0B07kXense@A-cjA#18G|*@_Udp8uOHC-FrVwM|e7{Z&9zfQaL*elM$ACzPC2 zBFf@fv)b-<)p8F_w?sVuwEEjmrjNkxfpr6Y9f{9krXRg@;rwcHQ#lum#@)|N^}4-r zpf{q$bfWe&+sed4DMUQQUR-O`*pbT3V0xkHqh=N1VeKi90Ey-XZk{F6EdXSELJKh( z!U~=#zNtAiY2d*;Qdb2gc)9derlurL#rWoDdBen0w6RWp*|!XZI5BA|@nzk}&}& zyx0%a-?J;Ia>jn(INt0gn{vWbU>NN8^!!BTC3dD|90tbWO9pa`2tMKqjo$0Q5h)C0 z^lJLxISc#&h9^%D%*68;x;O-zxs%?RxHgwsmwAwzleLIx}jKE zwJZCSwV0Wx-si!D8}a1)P+@ZMKicatkYTN21}ColibbrfGsBkI%;=?pRDQTH|2YeO zSuvMpZj=pjy>Vrqff+Lgc8r8#UYLUouEZRWXF=C7Y(gi7cw1w|kO>-j-yw7Fz9HvK za=-t0e-G~axx(aR^CMUvA2I9WU&eDW?9Hf;x|=&)=P^aGuyp(sI*+@XPnbQ9A_dlP zJ$F_v`f!0UuNx}Tj+$cewZ1?T;8a|$$1t+e{cTi$^teS>Mw4Xx$wtTJS4>@pb%3p=rDVC6s@*kpo1 zS77jh!bVC*p!`o39xXmbE!j4F;9e?7=x$JWazL)-E&nS73h~9C)0hNGCQ$SuP-p=z z5~Ne%ul-ZOX@28(N%A^5dwik2kQ`;!SlZ`K>td}t4VJL^H>pxwUPbqy9bSPSOe^&! zm2`KViwK!pBMl$)V^=UrzFFH|pbuTK#A~92eF8DSzkJDQ&`}m_6M2V<#>iqvX)bZ@soZqA5z2H$_3dslhQCdtjelxUWwyuI$s1T%YJryo(VYlTJ;Wx!%3CclWguV~l6_ z%bf60>7kZZRDaL#8_QBDtqu8!Owo2)V%O6(1UloeWNa1X#JJo?h{6DP-?+*7)G_0EB76>!tes1W4aTJ=!EjDrv8xp$t@2o`9p)2Hd3poX(=O_TcjB=|3yy3p&648m67b+L# z$ME!dT^W(f&IurB6z%k0p(tB~AWYmN{#PU!ge6uO112_aSaf`{F{fT@T6{=Q_VCqd zvF8P2p9jAO`P|DlIHW}&S8E5mK~F*oIp#vA5=HyXXa--6+6^{96Kd{V`FL;euVEyE z|KfS+y1!D>zX#{#m5Iq(@K(6#1#}>~WYjBDgv@}L0>N5_Yr%;p$#}t->AFhjGBeC% z5_`&)8}B9tefeQOHS=W>Bdg5}GtWL&H?d<$cf4GyE(Hs7Ae-U|#=T!lVqp zWkmSkMH(3zEXFMSBg*|zCEr1^dKhEqsg1JD7lbxus4G4W2er_{M9xV9@>!q5Y02|x z=7lu#VwyP;&a0no5-SoVu4r!ctD)N5ZX*MN`RT>-X9ie-<)|lX=VMWmJ$v>XUeqik z;h&l=tTEv)sYLCqG669O@mRgwxKS;?e3}{Y5tzq#Q#J%j{Sd^=K{rOR!|$9s?|Vvd z(m4qEDy~)dD>U~?+9@+gwIg|{qA?TxzQ}D`&ytvu4TX4`DgtBMD76WOMv4_TlM`?U z^q>-aazFy+D--kBQ0hg|Kg%sMW#zUs{bQAxVd+!KNqn@201|H*qhNJ(d>fLHmIDIO zN7V3ITpS37!^9ryzXZPRg>5~L7RIC|c-P|zG!W4CjoNr#cbC&8fA?L1y zzeXDVLnUG&;lEZgs^m9Fx(H{vhc;XMB5jUnH0rKSgX!yitgy2Ae~oaQ(FYb1F&v1TVac~S8Q7zG1>2_1p`D7VHP(Wx=Se4rMub)QE1V@pK8 z?&lGa{m z#zBK4AZm(u?0^%fWa1obB^CENckseXilIpTTz-F{{hJ9v+=&zD_g}cJYM49_3az-N! zz;ARx_@SX!bm%hB>xtuk;3^xHaLGoc;XxeJFn+EQn)siTvr8qb(icU7b@^2j386Mf z+ZFXeT%?CzA$9zxNtkLTgsuV4@(A{tN03R+TQ}k8)W8=AMOOx?3*(Z{_ls646wF^@ z4ashKe+c!lxzHdPuJQz81XjATe4Gws)_ejtt7o_E;LF)Dj1vZ83i|x*a&v<#ThQ^B%s@6c3*g; z2BEvVR91FN*Y|bp&~x|Aw=LD6;ehIWUW0Xa9qDfUtZ0zjB7F=M?d<6tqghLxj6I<)K>9R&Vp@VA}-wfd$ zx4cjQ^}JUdGQ{$adt!iOPp|2xn+bUx9{Oe4eP%u`5MV8Vy&?83eawQV%*>; zoSZX_;NpJIB|$1{hP^4jhng9wtZ*^o(ayQWO9>*&X)HDDwCQSI4KoZk19icxGU!Xf zQ`8=5LfDs)M?p{|G;}43bZ35to9yb4JiMH+4~3y|b}59s>I31~v(XH4Tl>XD z{J9}S%}K2`^@aLbQ#UO3L3^=~NjN!^poq)p+_qU+s)@G8*Kjk|@Y(>_+F8OeBz6!O z5YFD+@!W|Z1}>%?MK?_8igO5MYB*bP=w5R0RX<}YC9Ke(qFrvzM1F~XhkN#fAFE{( za1?N&)lZb82G&+24lifg_8tq>>Uw#M+0<-<%Id+3Iad`P#$-fk|K;OI&cjr&uzZSx z9%e*F1vh8ZZAFqT?h-L(ttYOrYtX|+y8ql3e$Y)WvimTpGh%h9U<|l0KkgTy`oE}h-Ot4ljTmE2-?H!oTs#>hFa-3Jj#%w#O$2MPQZQU*d8;TeK8X5_0 zi(7fZBc>Kgp9+6lxxcGqj}o9dcNEZSuY$CUl6sde!MA7$#A@Bz5iF}C#A{bH`9fI1 zj4i<5Ci5Vdlb`MH`hsC37czy}(qIh}J7zJkgW!%roi^V<;*Qb{;t-7K8VY0X=w8?c zg~Gc8f3vrkQxCn%N-@biHY7RL>*?t=haN%+CaXqOh)~eg73y9uKntAvxOYBi!t>6D z9S1X|3LA^-pwRI#YFxcBhDNrqSQ@Kc zt$z5(oy89yDIIy?PPyICLC1G)*P3I`AHGv6H>yWo*mtK7)p^|&3);4@ks_wD_FW!+DFP)kf!Kz5YSLr0~%VvInQQ)wXI5VrnsE zN~AtBkw3;zP^LU>mUT2WiV|t&f3SiIp#eKnrvTM$9#FS|;q6xisoF*IRja~Ajk+2G zL{-Tm0EQ?^Dq#ypZp+<^zdgORB$AGq;ugm|d?78Yn(Z7nI)z_J3olsH$a}_5+CP() zf5-v~IQ+;ABPfPgMUn_Mc*s3$C+vd(hdB4acNt-l<0jAqIfen72!?gW2_`a5I=%)B z>xYDiUv`6KrGZQ&=4>6099Wt+G%r z-)A%r;_Qq&GkJ3)0CL3r3ZU5xW;wlEs)=2sIBaGGokbIt={IF5bqgYN(lHL zPGw!8V}_C+W-1mB6~M~&^CsY!kPG}G^S=ALZt3R*r|sV`EHJ(S9(wf%>aRU>XWeZ( zscG?xhHi?*{G7$6n9sx8G+-`5stazZlpwCq(u`J#IOZ>g+CQD5o99t5DEyf}ol0gN zW57f)C@`MB+Kwy<wTbll#|ZZzQ> zjc^(YMi_!iiA^#jw*V3`x8xOOib2BTD3czxefKzia!TJnVLCH1|ElfRPOK?Ol!(rP z6c3RpA~0b0r&g*g^MtdHn!}-x@8LyV2bI~d4IxuxLsQHSrxKp$E`_)E`>L|8nJGgC zOAdu?;#Xqt=xob^$1!_~p_b{TES@{y7aTV|RH^ zAY1`0#iGK*C#GbXfa$^U7$zo04~r@%P7WWefhIr+s{u6uXYmifcdcz${7jOk&>X(r zpX-qbe=hja{Fu(W(Q$pKNPs$T#+?k;)u~Ig@A)L$53c(2T1+{FDda7vN@`%R2ySr= zr-Q7+-(X@#{Ijmp+fQy{$V*&t&sUH1W7KF-4HuMrhJT3uoKx zw8{SO6g5+UofyPQFh#7y{NE`yZ}HeJd+dw;u?N)Cn|8bJ+Un^Xn(UKFz$2pjR*CLU z)5ufS$WOd)BN~LNcYDsspI5lLG$uVImQ0t?7?Hn>tcf0Z-HXketvKe}Hk<-sC*z9V z9B5z~A|Sb&89U7H6MSmxP;8Blx_hHut9fQYjP-l94D4G zcDfpEwpaMG{!5Z@*maXPsYw=)8^+8Y{!=yjM2|(7_|OP%3h;Ad(;;an9ARd=@{{S= zm(tyx$VXM)jy8+QH;|;ECyw$a;DE>MOG%w2+rW9MqQJfbQIjwp-eeYtR}{eLUu#xp z>zfrae{2xd){`@Sv($mh+L}2|fl2vk>Djb7$x#cP=>s3O_)1h(miAEX^K{-$53)va zZZQECDygBJA2WTXhbPU`+KRmZrKV~zpR5X%^JWkW3;!)$cA18b%JLlMzv#vWC9f*^ zNhMDzu|Py)OWFY;Hd{J#;r!*Z=P#EofAZp4zll_o8h{|&Ap9w^Hg!HUv+Z|poO$h3 zcIE42|-0hj*lA0K+zW74a(r*7d_ zn^gIF3(~6oK3d#Rh(&0QA-5oXA1BuD+A}W`Gk1)LxnmXjV75ac*%^LgMUudD@0kQE z3h3FSnd`ma8h=Pi3RYR&ExJ*NwLj@$@p&uaqygj1NUhwOxVF<`wY-`M2ZfheW85pu zzma^>phvHk@RHFTkJ*`l_Z#1OX4v*-)66B{xd<1#uQgtOG>7~`q1M3bG`eAcY3D`j zz%zm}!hfYo0u2v@zeFx)95h(lp(Z}18~pm@p@$F0nbC7^96Y%~r7br0>+z>nt?wCrbYMOIH=&Oei9Xpf@YukvftQAh z=9`$X5A(qQUw^-CwufmhB02(Di_|2=Pm_7jHd|ym-Lmg-iFC#%NDLHB>i40z#+tB) z=0VYiAyA~R1d1CIBbWG!Dh$bdB7$wrek=kklL~?pVFxDTfkNK)E}_*s$PIVC6O%Af zE7B?WB5@FbiD!ICYE6l6NU@WmMGO};JQi}HR_#-v$)?)Ruyh$>eVzVo9g*gp!RFvj z4!v4FQ1Q>$Votj{&;P&{+xK-L`;dCc2uHK-%chh2_YB4xK5r81IP3#KZ935T8UAFW z#3R0suLdmKNIT9~bL94WzvhCZIk-5xzgh@J(}8^qg_A6F2$w_^&Nn|$M~l zL+0``6ji&!G_P^iZ`+THuojfN4Z`Ky{=A}45folkd{!7}&hKZGGmPG;9Plkyt8?WW zvDPh=P#N;;Ihx{wp=#}%byH7#Gd#?%iD-$_y1}gwENvp#+&#%x7;%PQBhA1mm>?cv z;GMW1eoc?2>wC$Y)^bPqvS%G09wVRWD08zEXBxc8lA6Qr?)R*v6akv*sCs%c&pqrL$zZPa_jOAWnei@6M%G8zjP=eFR^|lM;(4rYo#S|eMYM!59!xd zNbB$*7vkbiN;=331ryhP*bawHV{{kobAJ=pz9Wr|MvF#k!&-%!e%zk+5`vXesBmhm zz|iGhL9v>r0%XtR2k4qKZu{{8zS>qz9jKtG*J^>vn9{uQ3(K&O*J|FoMwuAfOg zvChSNF+lBg{P>;8qV+i^WB7>hMxwgk&nx6Iqsi@Z{Z@EDHxDW??72rZA4jb93is>A z=au`i65(p@2(ZkJXw8YDS_Y)_Cs>+(W3v2o^PAy%Fn(Xwg72hvayRZaSUnsPq@e=!o{CT3@w^avp`N<`zyBosc~k}V(2HXeJ0%|4`(x;ru9E; zPn)|;t7LW*>^LktED=tI1TH%c6oxp~^E(|s{!?1U>{nOr>;jRU!gJoo$C|Wh#QHe_%GV1^dzgDK zdKy4!U3{>RiJm$gF+8l~c_l9>kxaJAek+suFxn=-gE)FW@H}e3dRu?2eg(sC5 zpEA68TbJJq5mNl{j5;{T8wl<#aw<#zz=%a_eck*az0dcWMXRdjydcFDGEzY+N$IrIHwMQNjH2%)m>tbg!mb= zYt&|D#lp%nSk=YqaOEaX#2iiLxmksYw_OIySUc1LboLS{n48St>Y~~IU-o`~hrrIb zs6TW>VwlkMjDY4e)AJxM$^=2Gn4o0G*~^7R4i!W>h6wf~+pZ_B{rB{AMfNgbNyVNS zf5d#O7@jdL%f1=8`H#rB3hUr;`B1g@iJeSxkoxw}5HQU`LLrQvW*3VxokL@BA45xd zU_H-q^eCa~n0-;v}%Ks5jz_JteMLMp?Y zjsEM61Kpk6bkGVw(tBR>p@Y6JM!7$Nao6;vOJ?@TvuRN~^FQ+4LcZs2L|kZLaf_|G-wE=F>dIc0J4*Bmy8K=xYRMYO<6rm^!>|+0y8Dfd*5~$oWO9QyLYP(VOKS1Y zkf@WZWN;8={+uBBX|;)XAaBi%LQv@I-2!Fz9?|vqLKXF=xWDm&k6c|r>qXp6*68-l zau01Jc#*mKv^uCoW%EWMIUZz!Wxt5Z^S)Mqfcjq_h5uG+8s%F?;kBPfTE2|l`ZQf$ zy-2iwsa$r8g#;(@?QuFXDOT^N|65;GA<^J9 zP;Ufy@F|a)_3lZJ4>ARu_ke5~>v6%lhGQ108V92I6C%S+D%(JEinF)~vS>BUBy6VG zv7?5E8r8c1_Rz4UZvCYcwp^b;yrNa;O@7btH~tn9<`tDy%8w`Bwh$--^5ehw z078#r|5e8hA&I)?nmmI2k>%3G8aHE&BsW;B!r~aBPJ3iS8+Z?Ounl5w5TR@i=o1{qKtZv6&@=-kZhQU zsK>g!SRJwv+4rAr^gl<-T}tDvi%^%=ZIix)N|jmc4vJ!D*Gmo-=76|{Z{B9nIsIRQ$~13FfFIw3MP0D zK_%HjptJh2Ed+R%xHJElMU$ty;Y7=G!*lLxqv>4!rQf5r?zKf}R|rd2?K_3{@jkj_4RhJ6sT zkb-l5R2eQAzz!l|F7zCm|4yBJ=u35x=pDWbdWV^s+F^kJ8K0^zW}Pg|hlTk!ZL|nn zUJ@8qAP-SD&F2-gNoMgG^?c&m?&PE_D6S5Muz1_{&ZIVGsRBQfMCr6?5Y`(e*5%I5az;~YtitcnHdU=%$hEBm0stNTawypBe&kO3Hq2hn@5Pz z+roVI7d(8d(D6)IGXg5I5dNr=2_?^wm|1%oNz{9o)pi#&EceiaReb3u1s~EHbUgFG z$iSL`HCu}V`)zY$`dQEP^Rx&3*~SMguw{m4_}72Z_g2tRM-Qtk#fQl1L?pTXUw-TA z?E}O|a0t>>jxl;>?D%ogeJ6CE04feA+NZnwp7O5f)Tp-P_o-L(2K}RxUX=U#r$!sPtX(32{jyV zBNrj-0^dW!o#6hE@PuDt#@Q{aS4phOXpG*-+{rBFl|)5x;*)@@F_AWZOeFm4SaM;y zpla9=LB|%~RxS9$#I;MZ4dNF;?_=VxS_|y=NLn|A5+*_Id%ZqB(IQT18U_2F7wicn zwHoQ+L$4r3NQ+ee;~yl+rvFqGXX>)4m$>ewVV%4%9+*w!b`6Qt^A)+rBW;N$1Awjg zu#ev=bbFS)wBA>W*A@G5*8`ffF?e+$zwCN9Mw4!B3t&pjD9b7mY4<4OQ1^Kz^~)+m zZh!KdIMKVYZ^yJm>q*p5T)MGjpM*CXqLr9I&ZObA>)}p4(od4UV5PlIFyKM%OUg;H z##%#tYi#vE(5MabuuRMUh(OXb?YQo&wDbJpZgZ_P*fB4TH_&!uaKY zd3>>+0cQCd2TY(c{kj%%Rvspi-Qtr*Vvx^@?)dyk$4?GS|1w?9z%(S{Ri8ay4ymRq zeO<7cHI#$d;NfAlZQaU&>vlSAg|hpt1lWL^$v~{;PN%Wr6LcV!R4T7K!Qts zBcsnlrznw-$JozBGD{qN3iKI_inbwq7m>%GM-pSZ43gN#B#DVeLKe-wp^pxBA2DLd zBZ|5Po)R|of6{Wc_OIF&6CL7&tdiTE#s+GQQ+j^gMN7VBK+5fr3au*YrLQ4MwTk3P`iP8>$p?54ZjxZ2{vNG+QKy0$Rg%z> zQKc_%;a4zQah47qDh6occyb6o5hfU|SZ;h_C~|+&EwUZTN_I?KyJ$SpK6b601~dSj zF&&NQkjdsYAc)6+pd~>N*rI)qf)Z@Er$m&9wL=92;tCh%PdR=}4b%poF1^LV1?q5@oz@7LLvK0ge?Qo4-JmD4g z52YbYh+7_%3`WEzp+IJgh}oZl8xtr@>;aECS)M3sf17z=k?Tzq1R?=C%7L(HZ^uBo z6A(^WFO2^Q`m!z^Up(Nuu_x^YWD)*}RBj!;2aI>$`(<9ree4QGHVe2_eOOdN1OI4G z4t`H{IMR5|PVwP{4>>{!Z`3I$enyksuWa0a%p|fO7RT-<9Tn`B!LpslVlfKu7{5!k zA%z$ihs#a`^UhdgvuJ!~9EzBb+wOk7vD1P7a2ns8oMp#Da3-r0r1uU%_Of@sVvgI? zR7+(WjOh3N;QIA+JlC&tDj7!IMkLw~TCPBcZU;ODU%zf6=dlEjQADy=Ca9aX?O8&4 zMR1`%RfbPic%NT7zuHjTMZ2UCd(C|Cf$hbyK&x{oijKqV1rAO z*po0urZl&&C*v|{CT$NWAh;FjzM7xTE)*oejk%B1rY&TD%YpyqZE6tLd5CBVQtX(N zy%0#kq-~}4et& zMO4H0NG!quq`Y0<%*ZM+>#;I^M`+Q_J!g?MCQ^zfBTynm+%j3gsI*aE$h6sH z(3G*m%$PuVK@ufBhkiqR5fZRle~2@3rwXoip7GFrJ zBWzT+nA7+drHcApqTK-gq%{khQEPBKp3u2=unqVV;j)M}^vwu825?=b?qq2G;`bF1 zWZFO6L#hpzgpnOwj8zg5%yqUrcNrf?b^4{bqwT&!ZT>8;%4%o} z?q-XC%4+{b+h+<4FplI682NW7I*RMm0CT8^_VwXd(nnnJ?iP2KjiJonR#nl9_#`z; z_v>0fo~E8H3-i1wcTJ0U2{f5Bm`yBsz%Y9#8L@xaqc-UILp?0n;%&7yajoUz_1}IeLXL5dBadLiZVN&pF zW4-y9ppypgZgY!#Yj+#ndLe;UfeX?Wfd9Bb)#H4;HeE&oSauR?CFg&kho8x0xV+e- zAZ-Dq%xbdD_OpzQT$irXtZGFGwr!Ke46iBkcDJ0Xf!lpK6$#lH=t7w8nhH zSgW$mWGo_=k$h|4PAvx$IeTcPE_NA7B1kCWRHqd3c}}UCsqpKtubwX)IO_<*f9ydw3NvzN#C)$LkL>}l1u z9{YO|PdM?IBV*YRoObF#e;1l;8Ma*>OA@HO*jLs;MdkEsLAeDD?O?#5%x)dir&8TJ zKmFZkC)yCWB$cynq#{(VUD*rrE8h(X$Q>MGOJf2Gg6R_HOJL+8m$iFTN3jBf6em7V5iUL9;$wzrL3vi+OWA&1tK9nUPes%wcw_PN(7`A=B9-SxfBvDL0pvEp>3K$+5`- zdR8R$cyuwB!%&<%`pi)ad+l`>Cjz-7_i?2KU+lnn^@7Jcg&}8bWeOVmJMf5jCf|R@Si$9pV`*= zG^n|IEn=1zY^3%X|2a`VCrfNxGvPKjuXb1$HhQfC17JduB{zFv96xEVRJaW1eu*d@ zu;T=>SXm-#*n2l_Ms7i==z%{uKwIH8g7AhU)`}7&J2z(DATvjpxzr4&Z|UwARr!)~ zFDp^^b5_>x*X3VTvPTIuyf|%Aw`PR7i>iJ{-Z9-YfxApSA0fP;gWUbRnTx@wa#kYY z*JDmrq+oFjW&yk5g!-ac9;mrImDlTz-aVMGv zwrSgVuWvldhoWO^WJ%I7Q0O6OAwz7&_jmLG#X+ujaq_0$gg;W)-m{r4`a?WBTHH+Z z=m>YV^Q$-+rNf2Y1TG8}cXPU%p3xgNaxZaCt?;iK?8({a!OPS;Qw0q|1Z`gLyS;3t zY|b9mmLGnMHur0)>+CuZ1=vAR2lfvhf$k*qOxX?T8SP6th-p-*WY`lp)5!j@Ao0WV) z$rdGBNenC4dsFvcCfKHO!>t|4S=7HgklqjTm~xLR5ekP!g#zXNHzm82NYypW0PSCA zzBmfamfu`G|5i1=MajQYvP<*vxRR%JX>jq3a?g_3^l&mg`_6sz#aDIbCzSl6lHXMF zj2>3#e0W@mMfAO{oQRw`)6buJ<80{@XTwY9E}SogXAJ-hl)A~o0+r47u|})9P>){L z%*P6c5Vq(r3;$n-LakQ`SXS-biJ#zP51S2&!{FssFa|)}F#5#k@3~h-pBp_pdUW)^ Xj-DEQdUWULTRL3I ...' % action) + + patterns = [convert_path(word) for word in words[1:]] + + elif action in ('recursive-include', 'recursive-exclude'): + if len(words) < 3: + raise DistlibException( + '%r expects ...' % action) + + thedir = convert_path(words[1]) + patterns = [convert_path(word) for word in words[2:]] + + elif action in ('graft', 'prune'): + if len(words) != 2: + raise DistlibException( + '%r expects a single ' % action) + + dir_pattern = convert_path(words[1]) + + else: + raise DistlibException('unknown action %r' % action) + + return action, patterns, thedir, dir_pattern + + def _include_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Select strings (presumably filenames) from 'self.files' that + match 'pattern', a Unix-style wildcard (glob) pattern. + + Patterns are not quite the same as implemented by the 'fnmatch' + module: '*' and '?' match non-special characters, where "special" + is platform-dependent: slash on Unix; colon, slash, and backslash on + DOS/Windows; and colon on Mac OS. + + If 'anchor' is true (the default), then the pattern match is more + stringent: "*.py" will match "foo.py" but not "foo/bar.py". If + 'anchor' is false, both of these will match. + + If 'prefix' is supplied, then only filenames starting with 'prefix' + (itself a pattern) and ending with 'pattern', with anything in between + them, will match. 'anchor' is ignored in this case. + + If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and + 'pattern' is assumed to be either a string containing a regex or a + regex object -- no translation is done, the regex is just compiled + and used as-is. + + Selected strings will be added to self.files. + + Return True if files are found. + """ + # XXX docstring lying about what the special chars are? + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + + # delayed loading of allfiles list + if self.allfiles is None: + self.findall() + + for name in self.allfiles: + if pattern_re.search(name): + self.files.add(name) + found = True + return found + + def _exclude_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Remove strings (presumably filenames) from 'files' that match + 'pattern'. + + Other parameters are the same as for 'include_pattern()', above. + The list 'self.files' is modified in place. Return True if files are + found. + + This API is public to allow e.g. exclusion of SCM subdirs, e.g. when + packaging source distributions + """ + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + for f in list(self.files): + if pattern_re.search(f): + self.files.remove(f) + found = True + return found + + def _translate_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Translate a shell-like wildcard pattern to a compiled regular + expression. + + Return the compiled regex. If 'is_regex' true, + then 'pattern' is directly compiled to a regex (if it's a string) + or just returned as-is (assumes it's a regex object). + """ + if is_regex: + if isinstance(pattern, str): + return re.compile(pattern) + else: + return pattern + + if _PYTHON_VERSION > (3, 2): + # ditch start and end characters + start, _, end = self._glob_to_re('_').partition('_') + + if pattern: + pattern_re = self._glob_to_re(pattern) + if _PYTHON_VERSION > (3, 2): + assert pattern_re.startswith(start) and pattern_re.endswith(end) + else: + pattern_re = '' + + base = re.escape(os.path.join(self.base, '')) + if prefix is not None: + # ditch end of pattern character + if _PYTHON_VERSION <= (3, 2): + empty_pattern = self._glob_to_re('') + prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)] + else: + prefix_re = self._glob_to_re(prefix) + assert prefix_re.startswith(start) and prefix_re.endswith(end) + prefix_re = prefix_re[len(start): len(prefix_re) - len(end)] + sep = os.sep + if os.sep == '\\': + sep = r'\\' + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + sep.join((prefix_re, + '.*' + pattern_re)) + else: + pattern_re = pattern_re[len(start): len(pattern_re) - len(end)] + pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep, + pattern_re, end) + else: # no prefix -- respect anchor flag + if anchor: + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + pattern_re + else: + pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):]) + + return re.compile(pattern_re) + + def _glob_to_re(self, pattern): + """Translate a shell-like glob pattern to a regular expression. + + Return a string containing the regex. Differs from + 'fnmatch.translate()' in that '*' does not match "special characters" + (which are platform-specific). + """ + pattern_re = fnmatch.translate(pattern) + + # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which + # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, + # and by extension they shouldn't match such "special characters" under + # any OS. So change all non-escaped dots in the RE to match any + # character except the special characters (currently: just os.sep). + sep = os.sep + if os.sep == '\\': + # we're using a regex to manipulate a regex, so we need + # to escape the backslash twice + sep = r'\\\\' + escaped = r'\1[^%s]' % sep + pattern_re = re.sub(r'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 C73%H) literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.py new file mode 100644 index 0000000..ee1f3e2 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Parser for the environment markers micro-language defined in PEP 508. +""" + +# Note: In PEP 345, the micro-language was Python compatible, so the ast +# module could be used to parse it. However, PEP 508 introduced operators such +# as ~= and === which aren't in Python, necessitating a different approach. + +import os +import sys +import platform +import re + +from .compat import python_implementation, urlparse, string_types +from .util import in_venv, parse_marker + +__all__ = ['interpret'] + +def _is_literal(o): + if not isinstance(o, string_types) or not o: + return False + return o[0] in '\'"' + +class Evaluator(object): + """ + This class is used to evaluate marker expessions. + """ + + operations = { + '==': lambda x, y: x == y, + '===': lambda x, y: x == y, + '~=': lambda x, y: x == y or x > y, + '!=': lambda x, y: x != y, + '<': lambda x, y: x < y, + '<=': lambda x, y: x == y or x < y, + '>': lambda x, y: x > y, + '>=': lambda x, y: x == y or x > y, + 'and': lambda x, y: x and y, + 'or': lambda x, y: x or y, + 'in': lambda x, y: x in y, + 'not in': lambda x, y: x not in y, + } + + def evaluate(self, expr, context): + """ + Evaluate a marker expression returned by the :func:`parse_requirement` + function in the specified context. + """ + if isinstance(expr, string_types): + if expr[0] in '\'"': + result = expr[1:-1] + else: + if expr not in context: + raise SyntaxError('unknown variable: %s' % expr) + result = context[expr] + else: + assert isinstance(expr, dict) + op = expr['op'] + if op not in self.operations: + raise NotImplementedError('op not implemented: %s' % op) + elhs = expr['lhs'] + erhs = expr['rhs'] + if _is_literal(expr['lhs']) and _is_literal(expr['rhs']): + raise SyntaxError('invalid comparison: %s %s %s' % (elhs, op, erhs)) + + lhs = self.evaluate(elhs, context) + rhs = self.evaluate(erhs, context) + result = self.operations[op](lhs, rhs) + return result + +def default_context(): + def format_full_version(info): + version = '%s.%s.%s' % (info.major, info.minor, info.micro) + kind = info.releaselevel + if kind != 'final': + version += kind[0] + str(info.serial) + return version + + if hasattr(sys, 'implementation'): + implementation_version = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + implementation_version = '0' + implementation_name = '' + + result = { + 'implementation_name': implementation_name, + 'implementation_version': implementation_version, + 'os_name': os.name, + 'platform_machine': platform.machine(), + 'platform_python_implementation': platform.python_implementation(), + 'platform_release': platform.release(), + 'platform_system': platform.system(), + 'platform_version': platform.version(), + 'platform_in_venv': str(in_venv()), + 'python_full_version': platform.python_version(), + 'python_version': platform.python_version()[:3], + 'sys_platform': sys.platform, + } + return result + +DEFAULT_CONTEXT = default_context() +del default_context + +evaluator = Evaluator() + +def interpret(marker, execution_context=None): + """ + Interpret a marker and return a result depending on environment. + + :param marker: The marker to interpret. + :type marker: str + :param execution_context: The context used for name lookup. + :type execution_context: mapping + """ + try: + expr, rest = parse_marker(marker) + except Exception as e: + raise SyntaxError('Unable to interpret marker syntax: %s: %s' % (marker, e)) + if rest and rest[0] != '#': + raise SyntaxError('unexpected trailing data in marker: %s: %s' % (marker, rest)) + context = dict(DEFAULT_CONTEXT) + if execution_context: + context.update(execution_context) + return evaluator.evaluate(expr, context) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/markers.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3903dd07e54544ea7188f4a27bba52831803586f GIT binary patch literal 6124 zcmcgw-EtgP5$@TMR@${>$$wH5T*(A*vN2dP0R#x!6~`zkQ$cZ!og!?gnv8Zw)=2Z` zIcJ4LNnGIEa7}T?9nZimFTf*k!vk7zIy$)u!B={6;u zlJ1nG)6$(5hi#LRv?Ogyw=L-z>7GGtQyyaa8R<{SmsoRF`qL7fl`X8+V$EZbUv=lC z-`3`NiRM|=Jtv=opHu!kh3ub^FEP1graGJh_mQSII8seUYHC*o0mP-^M}%Z zfY1C1B*L!4DL@+%!(SXa1oT{mW09KxH>q3`oO%;nX|?hqxX&s*1pQ{f%_?^m+?;ar z;La&`9^3`xE`qzH+yb~oo z3HkO&NN(2eo^L$&^yGTygj{buUoJU4x#%Lgsp`=;p7yo>vZbdeB9m_Acihq&&o|vE zy4uxRE;Ze)|Jih>DB^c&5%mDNb!<8&vGHV=x0vsqN_MX*O21pnWtmFCtUof|lY$ke zE7-M>VDvSdhWuB5;|AmDz%%}d)8SPaZ25#-arRufrcO_;m0B*v6IpHn+TG`&+a%mY<=AZKJB_}&2r$diQIj~4Q=l4) zmj9~DXdIRyR9g-)1k*QV%N?H&%S~%rgEAdqs;Z_*!C8Y=6$yiv4$(ZVwXPiUNaFcz z9)l=AA+#Byv&aj_U`$!z7!OEwP!cn59w^FQ+ZtrOwJ$1MTSkutaj6LTi_vuKK)6hl zOt&gj*lpm-xMwY)$!&xC234!t2<7qun3q+?UO;gpw|9>v(r!Li(5piY7IjUX*+j{f zGQf?c-W`S}f*Xlo3kHexX^pBA6{A2AH1l~)@o9;dhr?*B_wX5lM46m(=AHS*jB~-6 zZCrBN&K$Tlem&=MuKOvRWmFRXfR!$Ofy}&7CRUXL)O30Rf3Z zt17g#fLjb(+FCeM6|gG0;Z}n?7H*R$KnmP&wCAig;-bT0RbfuNKJGh|8ENR8tRjPH z%%6vn8$F&TEmO_(g1a~35R7!_-ddN2JBTv2rg1jnaB0`ua~UO3h#-mf zqC`X5*b?eO^axoYscyVnEzY)b^|d|R`Voy9CcAOgKX$bj^fC=^JT;`D4YmeJf(x;( zv_Wa;f#O_tTF#8~hNHRSiKheF{(1$4nI}%RYV26X@)Py7HjJX&RNdym7fEO-3mz7F z+j!Bi^!!ofvmY-`j2jx(&W(>V2gXLJJ<+k2;6!Epz(Gxhi;bHkrjw}=hK=9|8;1RmU9O<_bJ9;W^C%bQpWfTW;$tYdE^YbO=z^ z@EkLGbHOuATrW{Ui#0yTjk+RdjL#75N4)`0?0RFW$%eaBz3lKwkxu6&dA>U+#%F!T z@H8w6$gPX$Bi^SO5ewgkMuOGI$|$xV{@|y{5c?+bEprugknsVjXZg5PhH*k`^g|nB zo{>7$$PTls&)}#Y*!Fu-L8bgf*1yJj`ryyjKfL|v#}9%#pKLr>|LlS0&Ow1GBONwG zBzajK%bJx*hVPZ 1: + raise MetadataConflictError('You used incompatible 1.1/1.2/2.0/2.1 fields') + + # we have the choice, 1.0, or 1.2, or 2.0 + # - 1.0 has a broken Summary field but works with all tools + # - 1.1 is to avoid + # - 1.2 fixes Summary but has little adoption + # - 2.0 adds more features and is very new + if not is_1_1 and not is_1_2 and not is_2_1 and not is_2_0: + # we couldn't find any specific marker + if PKG_INFO_PREFERRED_VERSION in possible_versions: + return PKG_INFO_PREFERRED_VERSION + if is_1_1: + return '1.1' + if is_1_2: + return '1.2' + if is_2_1: + return '2.1' + + return '2.0' + +# This follows the rules about transforming keys as described in +# https://www.python.org/dev/peps/pep-0566/#id17 +_ATTR2FIELD = { + name.lower().replace("-", "_"): name for name in _ALL_FIELDS +} +_FIELD2ATTR = {field: attr for attr, field in _ATTR2FIELD.items()} + +_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist') +_VERSIONS_FIELDS = ('Requires-Python',) +_VERSION_FIELDS = ('Version',) +_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes', + 'Requires', 'Provides', 'Obsoletes-Dist', + 'Provides-Dist', 'Requires-Dist', 'Requires-External', + 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist', + 'Provides-Extra', 'Extension') +_LISTTUPLEFIELDS = ('Project-URL',) + +_ELEMENTSFIELD = ('Keywords',) + +_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description') + +_MISSING = object() + +_FILESAFE = re.compile('[^A-Za-z0-9.]+') + + +def _get_name_and_version(name, version, for_filename=False): + """Return the distribution name with version. + + If for_filename is true, return a filename-escaped form.""" + if for_filename: + # For both name and version any runs of non-alphanumeric or '.' + # characters are replaced with a single '-'. Additionally any + # spaces in the version string become '.' + name = _FILESAFE.sub('-', name) + version = _FILESAFE.sub('-', version.replace(' ', '.')) + return '%s-%s' % (name, version) + + +class LegacyMetadata(object): + """The legacy metadata of a release. + + Supports versions 1.0, 1.1, 1.2, 2.0 and 1.3/2.1 (auto-detected). You can + instantiate the class with one of these arguments (or none): + - *path*, the path to a metadata file + - *fileobj* give a file-like object with metadata as content + - *mapping* is a dict-like object + - *scheme* is a version scheme name + """ + # TODO document the mapping API and UNKNOWN default key + + def __init__(self, path=None, fileobj=None, mapping=None, + scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._fields = {} + self.requires_files = [] + self._dependencies = None + self.scheme = scheme + if path is not None: + self.read(path) + elif fileobj is not None: + self.read_file(fileobj) + elif mapping is not None: + self.update(mapping) + self.set_metadata_version() + + def set_metadata_version(self): + self._fields['Metadata-Version'] = _best_version(self._fields) + + def _write_field(self, fileobj, name, value): + fileobj.write('%s: %s\n' % (name, value)) + + def __getitem__(self, name): + return self.get(name) + + def __setitem__(self, name, value): + return self.set(name, value) + + def __delitem__(self, name): + field_name = self._convert_name(name) + try: + del self._fields[field_name] + except KeyError: + raise KeyError(name) + + def __contains__(self, name): + return (name in self._fields or + self._convert_name(name) in self._fields) + + def _convert_name(self, name): + if name in _ALL_FIELDS: + return name + name = name.replace('-', '_').lower() + return _ATTR2FIELD.get(name, name) + + def _default_value(self, name): + if name in _LISTFIELDS or name in _ELEMENTSFIELD: + return [] + return 'UNKNOWN' + + def _remove_line_prefix(self, value): + if self.metadata_version in ('1.0', '1.1'): + return _LINE_PREFIX_PRE_1_2.sub('\n', value) + else: + return _LINE_PREFIX_1_2.sub('\n', value) + + def __getattr__(self, name): + if name in _ATTR2FIELD: + return self[name] + raise AttributeError(name) + + # + # Public API + # + +# dependencies = property(_get_dependencies, _set_dependencies) + + def get_fullname(self, filesafe=False): + """Return the distribution name with version. + + If filesafe is true, return a filename-escaped form.""" + return _get_name_and_version(self['Name'], self['Version'], filesafe) + + def is_field(self, name): + """return True if name is a valid metadata key""" + name = self._convert_name(name) + return name in _ALL_FIELDS + + def is_multi_field(self, name): + name = self._convert_name(name) + return name in _LISTFIELDS + + def read(self, filepath): + """Read the metadata values from a file path.""" + fp = codecs.open(filepath, 'r', encoding='utf-8') + try: + self.read_file(fp) + finally: + fp.close() + + def read_file(self, fileob): + """Read the metadata values from a file object.""" + msg = message_from_file(fileob) + self._fields['Metadata-Version'] = msg['metadata-version'] + + # When reading, get all the fields we can + for field in _ALL_FIELDS: + if field not in msg: + continue + if field in _LISTFIELDS: + # we can have multiple lines + values = msg.get_all(field) + if field in _LISTTUPLEFIELDS and values is not None: + values = [tuple(value.split(',')) for value in values] + self.set(field, values) + else: + # single line + value = msg[field] + if value is not None and value != 'UNKNOWN': + self.set(field, value) + + # PEP 566 specifies that the body be used for the description, if + # available + body = msg.get_payload() + self["Description"] = body if body else self["Description"] + # logger.debug('Attempting to set metadata for %s', self) + # self.set_metadata_version() + + def write(self, filepath, skip_unknown=False): + """Write the metadata fields to filepath.""" + fp = codecs.open(filepath, 'w', encoding='utf-8') + try: + self.write_file(fp, skip_unknown) + finally: + fp.close() + + def write_file(self, fileobject, skip_unknown=False): + """Write the PKG-INFO format data to a file object.""" + self.set_metadata_version() + + for field in _version2fieldlist(self['Metadata-Version']): + values = self.get(field) + if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']): + continue + if field in _ELEMENTSFIELD: + self._write_field(fileobject, field, ','.join(values)) + continue + if field not in _LISTFIELDS: + if field == 'Description': + if self.metadata_version in ('1.0', '1.1'): + values = values.replace('\n', '\n ') + else: + values = values.replace('\n', '\n |') + values = [values] + + if field in _LISTTUPLEFIELDS: + values = [','.join(value) for value in values] + + for value in values: + self._write_field(fileobject, field, value) + + def update(self, other=None, **kwargs): + """Set metadata values from the given iterable `other` and kwargs. + + Behavior is like `dict.update`: If `other` has a ``keys`` method, + they are looped over and ``self[key]`` is assigned ``other[key]``. + Else, ``other`` is an iterable of ``(key, value)`` iterables. + + Keys that don't match a metadata field or that have an empty value are + dropped. + """ + def _set(key, value): + if key in _ATTR2FIELD and value: + self.set(self._convert_name(key), value) + + if not other: + # other is None or empty container + pass + elif hasattr(other, 'keys'): + for k in other.keys(): + _set(k, other[k]) + else: + for k, v in other: + _set(k, v) + + if kwargs: + for k, v in kwargs.items(): + _set(k, v) + + def set(self, name, value): + """Control then set a metadata field.""" + name = self._convert_name(name) + + if ((name in _ELEMENTSFIELD or name == 'Platform') and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [v.strip() for v in value.split(',')] + else: + value = [] + elif (name in _LISTFIELDS and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [value] + else: + value = [] + + if logger.isEnabledFor(logging.WARNING): + project_name = self['Name'] + + scheme = get_scheme(self.scheme) + if name in _PREDICATE_FIELDS and value is not None: + for v in value: + # check that the values are valid + if not scheme.is_valid_matcher(v.split(';')[0]): + logger.warning( + "'%s': '%s' is not valid (field '%s')", + project_name, v, name) + # FIXME this rejects UNKNOWN, is that right? + elif name in _VERSIONS_FIELDS and value is not None: + if not scheme.is_valid_constraint_list(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", + project_name, value, name) + elif name in _VERSION_FIELDS and value is not None: + if not scheme.is_valid_version(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", + project_name, value, name) + + if name in _UNICODEFIELDS: + if name == 'Description': + value = self._remove_line_prefix(value) + + self._fields[name] = value + + def get(self, name, default=_MISSING): + """Get a metadata field.""" + name = self._convert_name(name) + if name not in self._fields: + if default is _MISSING: + default = self._default_value(name) + return default + if name in _UNICODEFIELDS: + value = self._fields[name] + return value + elif name in _LISTFIELDS: + value = self._fields[name] + if value is None: + return [] + res = [] + for val in value: + if name not in _LISTTUPLEFIELDS: + res.append(val) + else: + # That's for Project-URL + res.append((val[0], val[1])) + return res + + elif name in _ELEMENTSFIELD: + value = self._fields[name] + if isinstance(value, string_types): + return value.split(',') + return self._fields[name] + + def check(self, strict=False): + """Check if the metadata is compliant. If strict is True then raise if + no Name or Version are provided""" + self.set_metadata_version() + + # XXX should check the versions (if the file was loaded) + missing, warnings = [], [] + + for attr in ('Name', 'Version'): # required by PEP 345 + if attr not in self: + missing.append(attr) + + if strict and missing != []: + msg = 'missing required metadata: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + + for attr in ('Home-page', 'Author'): + if attr not in self: + missing.append(attr) + + # checking metadata 1.2 (XXX needs to check 1.1, 1.0) + if self['Metadata-Version'] != '1.2': + return missing, warnings + + scheme = get_scheme(self.scheme) + + def are_valid_constraints(value): + for v in value: + if not scheme.is_valid_matcher(v.split(';')[0]): + return False + return True + + for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints), + (_VERSIONS_FIELDS, + scheme.is_valid_constraint_list), + (_VERSION_FIELDS, + scheme.is_valid_version)): + for field in fields: + value = self.get(field, None) + if value is not None and not controller(value): + warnings.append("Wrong value for '%s': %s" % (field, value)) + + return missing, warnings + + def todict(self, skip_missing=False): + """Return fields as a dict. + + Field names will be converted to use the underscore-lowercase style + instead of hyphen-mixed case (i.e. home_page instead of Home-page). + This is as per https://www.python.org/dev/peps/pep-0566/#id17. + """ + self.set_metadata_version() + + fields = _version2fieldlist(self['Metadata-Version']) + + data = {} + + for field_name in fields: + if not skip_missing or field_name in self._fields: + key = _FIELD2ATTR[field_name] + if key != 'project_url': + data[key] = self[field_name] + else: + data[key] = [','.join(u) for u in self[field_name]] + + return data + + def add_requirements(self, requirements): + if self['Metadata-Version'] == '1.1': + # we can't have 1.1 metadata *and* Setuptools requires + for field in ('Obsoletes', 'Requires', 'Provides'): + if field in self: + del self[field] + self['Requires-Dist'] += requirements + + # Mapping API + # TODO could add iter* variants + + def keys(self): + return list(_version2fieldlist(self['Metadata-Version'])) + + def __iter__(self): + for key in self.keys(): + yield key + + def values(self): + return [self[key] for key in self.keys()] + + def items(self): + return [(key, self[key]) for key in self.keys()] + + def __repr__(self): + return '<%s %s %s>' % (self.__class__.__name__, self.name, + self.version) + + +METADATA_FILENAME = 'pydist.json' +WHEEL_METADATA_FILENAME = 'metadata.json' +LEGACY_METADATA_FILENAME = 'METADATA' + + +class Metadata(object): + """ + The metadata of a release. This implementation uses 2.0 (JSON) + metadata where possible. If not possible, it wraps a LegacyMetadata + instance which handles the key-value metadata format. + """ + + METADATA_VERSION_MATCHER = re.compile(r'^\d+(\.\d+)*$') + + NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I) + + VERSION_MATCHER = PEP440_VERSION_RE + + SUMMARY_MATCHER = re.compile('.{1,2047}') + + METADATA_VERSION = '2.0' + + GENERATOR = 'distlib (%s)' % __version__ + + MANDATORY_KEYS = { + 'name': (), + 'version': (), + 'summary': ('legacy',), + } + + INDEX_KEYS = ('name version license summary description author ' + 'author_email keywords platform home_page classifiers ' + 'download_url') + + DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires ' + 'dev_requires provides meta_requires obsoleted_by ' + 'supports_environments') + + SYNTAX_VALIDATORS = { + 'metadata_version': (METADATA_VERSION_MATCHER, ()), + 'name': (NAME_MATCHER, ('legacy',)), + 'version': (VERSION_MATCHER, ('legacy',)), + 'summary': (SUMMARY_MATCHER, ('legacy',)), + } + + __slots__ = ('_legacy', '_data', 'scheme') + + def __init__(self, path=None, fileobj=None, mapping=None, + scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._legacy = None + self._data = None + self.scheme = scheme + #import pdb; pdb.set_trace() + if mapping is not None: + try: + self._validate_mapping(mapping, scheme) + self._data = mapping + except MetadataUnrecognizedVersionError: + self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme) + self.validate() + else: + data = None + if path: + with open(path, 'rb') as f: + data = f.read() + elif fileobj: + data = fileobj.read() + if data is None: + # Initialised with no args - to be added + self._data = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + else: + if not isinstance(data, text_type): + data = data.decode('utf-8') + try: + self._data = json.loads(data) + self._validate_mapping(self._data, scheme) + except ValueError: + # Note: MetadataUnrecognizedVersionError does not + # inherit from ValueError (it's a DistlibException, + # which should not inherit from ValueError). + # The ValueError comes from the json.load - if that + # succeeds and we get a validation error, we want + # that to propagate + self._legacy = LegacyMetadata(fileobj=StringIO(data), + scheme=scheme) + self.validate() + + common_keys = set(('name', 'version', 'license', 'keywords', 'summary')) + + none_list = (None, list) + none_dict = (None, dict) + + mapped_keys = { + 'run_requires': ('Requires-Dist', list), + 'build_requires': ('Setup-Requires-Dist', list), + 'dev_requires': none_list, + 'test_requires': none_list, + 'meta_requires': none_list, + 'extras': ('Provides-Extra', list), + 'modules': none_list, + 'namespaces': none_list, + 'exports': none_dict, + 'commands': none_dict, + 'classifiers': ('Classifier', list), + 'source_url': ('Download-URL', None), + 'metadata_version': ('Metadata-Version', None), + } + + del none_list, none_dict + + def __getattribute__(self, key): + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, maker = mapped[key] + if self._legacy: + if lk is None: + result = None if maker is None else maker() + else: + result = self._legacy.get(lk) + else: + value = None if maker is None else maker() + if key not in ('commands', 'exports', 'modules', 'namespaces', + 'classifiers'): + result = self._data.get(key, value) + else: + # special cases for PEP 459 + sentinel = object() + result = sentinel + d = self._data.get('extensions') + if d: + if key == 'commands': + result = d.get('python.commands', value) + elif key == 'classifiers': + d = d.get('python.details') + if d: + result = d.get(key, value) + else: + d = d.get('python.exports') + if not d: + d = self._data.get('python.exports') + if d: + result = d.get(key, value) + if result is sentinel: + result = value + elif key not in common: + result = object.__getattribute__(self, key) + elif self._legacy: + result = self._legacy.get(key) + else: + result = self._data.get(key) + return result + + def _validate_value(self, key, value, scheme=None): + if key in self.SYNTAX_VALIDATORS: + pattern, exclusions = self.SYNTAX_VALIDATORS[key] + if (scheme or self.scheme) not in exclusions: + m = pattern.match(value) + if not m: + raise MetadataInvalidError("'%s' is an invalid value for " + "the '%s' property" % (value, + key)) + + def __setattr__(self, key, value): + self._validate_value(key, value) + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, _ = mapped[key] + if self._legacy: + if lk is None: + raise NotImplementedError + self._legacy[lk] = value + elif key not in ('commands', 'exports', 'modules', 'namespaces', + 'classifiers'): + self._data[key] = value + else: + # special cases for PEP 459 + d = self._data.setdefault('extensions', {}) + if key == 'commands': + d['python.commands'] = value + elif key == 'classifiers': + d = d.setdefault('python.details', {}) + d[key] = value + else: + d = d.setdefault('python.exports', {}) + d[key] = value + elif key not in common: + object.__setattr__(self, key, value) + else: + if key == 'keywords': + if isinstance(value, string_types): + value = value.strip() + if value: + value = value.split() + else: + value = [] + if self._legacy: + self._legacy[key] = value + else: + self._data[key] = value + + @property + def name_and_version(self): + return _get_name_and_version(self.name, self.version, True) + + @property + def provides(self): + if self._legacy: + result = self._legacy['Provides-Dist'] + else: + result = self._data.setdefault('provides', []) + s = '%s (%s)' % (self.name, self.version) + if s not in result: + result.append(s) + return result + + @provides.setter + def provides(self, value): + if self._legacy: + self._legacy['Provides-Dist'] = value + else: + self._data['provides'] = value + + def get_requirements(self, reqts, extras=None, env=None): + """ + Base method to get dependencies, given a set of extras + to satisfy and an optional environment context. + :param reqts: A list of sometimes-wanted dependencies, + perhaps dependent on extras and environment. + :param extras: A list of optional components being requested. + :param env: An optional environment for marker evaluation. + """ + if self._legacy: + result = reqts + else: + result = [] + extras = get_extras(extras or [], self.extras) + for d in reqts: + if 'extra' not in d and 'environment' not in d: + # unconditional + include = True + else: + if 'extra' not in d: + # Not extra-dependent - only environment-dependent + include = True + else: + include = d.get('extra') in extras + if include: + # Not excluded because of extras, check environment + marker = d.get('environment') + if marker: + include = interpret(marker, env) + if include: + result.extend(d['requires']) + for key in ('build', 'dev', 'test'): + e = ':%s:' % key + if e in extras: + extras.remove(e) + # A recursive call, but it should terminate since 'test' + # has been removed from the extras + reqts = self._data.get('%s_requires' % key, []) + result.extend(self.get_requirements(reqts, extras=extras, + env=env)) + return result + + @property + def dictionary(self): + if self._legacy: + return self._from_legacy() + return self._data + + @property + def dependencies(self): + if self._legacy: + raise NotImplementedError + else: + return extract_by_key(self._data, self.DEPENDENCY_KEYS) + + @dependencies.setter + def dependencies(self, value): + if self._legacy: + raise NotImplementedError + else: + self._data.update(value) + + def _validate_mapping(self, mapping, scheme): + if mapping.get('metadata_version') != self.METADATA_VERSION: + raise MetadataUnrecognizedVersionError() + missing = [] + for key, exclusions in self.MANDATORY_KEYS.items(): + if key not in mapping: + if scheme not in exclusions: + missing.append(key) + if missing: + msg = 'Missing metadata items: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + for k, v in mapping.items(): + self._validate_value(k, v, scheme) + + def validate(self): + if self._legacy: + missing, warnings = self._legacy.check(True) + if missing or warnings: + logger.warning('Metadata: missing: %s, warnings: %s', + missing, warnings) + else: + self._validate_mapping(self._data, self.scheme) + + def todict(self): + if self._legacy: + return self._legacy.todict(True) + else: + result = extract_by_key(self._data, self.INDEX_KEYS) + return result + + def _from_legacy(self): + assert self._legacy and not self._data + result = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + lmd = self._legacy.todict(True) # skip missing ones + for k in ('name', 'version', 'license', 'summary', 'description', + 'classifier'): + if k in lmd: + if k == 'classifier': + nk = 'classifiers' + else: + nk = k + result[nk] = lmd[k] + kw = lmd.get('Keywords', []) + if kw == ['']: + kw = [] + result['keywords'] = kw + keys = (('requires_dist', 'run_requires'), + ('setup_requires_dist', 'build_requires')) + for ok, nk in keys: + if ok in lmd and lmd[ok]: + result[nk] = [{'requires': lmd[ok]}] + result['provides'] = self.provides + author = {} + maintainer = {} + return result + + LEGACY_MAPPING = { + 'name': 'Name', + 'version': 'Version', + ('extensions', 'python.details', 'license'): 'License', + 'summary': 'Summary', + 'description': 'Description', + ('extensions', 'python.project', 'project_urls', 'Home'): 'Home-page', + ('extensions', 'python.project', 'contacts', 0, 'name'): 'Author', + ('extensions', 'python.project', 'contacts', 0, 'email'): 'Author-email', + 'source_url': 'Download-URL', + ('extensions', 'python.details', 'classifiers'): 'Classifier', + } + + def _to_legacy(self): + def process_entries(entries): + reqts = set() + for e in entries: + extra = e.get('extra') + env = e.get('environment') + rlist = e['requires'] + for r in rlist: + if not env and not extra: + reqts.add(r) + else: + marker = '' + if extra: + marker = 'extra == "%s"' % extra + if env: + if marker: + marker = '(%s) and %s' % (env, marker) + else: + marker = env + reqts.add(';'.join((r, marker))) + return reqts + + assert self._data and not self._legacy + result = LegacyMetadata() + nmd = self._data + # import pdb; pdb.set_trace() + for nk, ok in self.LEGACY_MAPPING.items(): + if not isinstance(nk, tuple): + if nk in nmd: + result[ok] = nmd[nk] + else: + d = nmd + found = True + for k in nk: + try: + d = d[k] + except (KeyError, IndexError): + found = False + break + if found: + result[ok] = d + r1 = process_entries(self.run_requires + self.meta_requires) + r2 = process_entries(self.build_requires + self.dev_requires) + if self.extras: + result['Provides-Extra'] = sorted(self.extras) + result['Requires-Dist'] = sorted(r1) + result['Setup-Requires-Dist'] = sorted(r2) + # TODO: any other fields wanted + return result + + def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True): + if [path, fileobj].count(None) != 1: + raise ValueError('Exactly one of path and fileobj is needed') + self.validate() + if legacy: + if self._legacy: + legacy_md = self._legacy + else: + legacy_md = self._to_legacy() + if path: + legacy_md.write(path, skip_unknown=skip_unknown) + else: + legacy_md.write_file(fileobj, skip_unknown=skip_unknown) + else: + if self._legacy: + d = self._from_legacy() + else: + d = self._data + if fileobj: + json.dump(d, fileobj, ensure_ascii=True, indent=2, + sort_keys=True) + else: + with codecs.open(path, 'w', 'utf-8') as f: + json.dump(d, f, ensure_ascii=True, indent=2, + sort_keys=True) + + def add_requirements(self, requirements): + if self._legacy: + self._legacy.add_requirements(requirements) + else: + run_requires = self._data.setdefault('run_requires', []) + always = None + for entry in run_requires: + if 'environment' not in entry and 'extra' not in entry: + always = entry + break + if always is None: + always = { 'requires': requirements } + run_requires.insert(0, always) + else: + rset = set(always['requires']) | set(requirements) + always['requires'] = sorted(rset) + + def __repr__(self): + name = self.name or '(no name)' + version = self.version or 'no version' + return '<%s %s %s (%s)>' % (self.__class__.__name__, + self.metadata_version, name, version) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/metadata.pyc new file mode 100644 index 0000000000000000000000000000000000000000..63a47c55553248772a3dbe4dd73cc90649cbe6cf GIT binary patch literal 34258 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.py new file mode 100644 index 0000000..1884016 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.py @@ -0,0 +1,355 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import bisect +import io +import logging +import os +import pkgutil +import shutil +import sys +import types +import zipimport + +from . import DistlibException +from .util import cached_property, get_cache_base, path_to_cache_dir, Cache + +logger = logging.getLogger(__name__) + + +cache = None # created when needed + + +class ResourceCache(Cache): + def __init__(self, base=None): + if base is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('resource-cache')) + super(ResourceCache, self).__init__(base) + + def is_stale(self, resource, path): + """ + Is the cache stale for the given resource? + + :param resource: The :class:`Resource` being cached. + :param path: The path of the resource in the cache. + :return: True if the cache is stale. + """ + # Cache invalidation is a hard problem :-) + return True + + def get(self, resource): + """ + Get a resource into the cache, + + :param resource: A :class:`Resource` instance. + :return: The pathname of the resource in the cache. + """ + prefix, path = resource.finder.get_cache_info(resource) + if prefix is None: + result = path + else: + result = os.path.join(self.base, self.prefix_to_dir(prefix), path) + dirname = os.path.dirname(result) + if not os.path.isdir(dirname): + os.makedirs(dirname) + if not os.path.exists(result): + stale = True + else: + stale = self.is_stale(resource, path) + if stale: + # write the bytes of the resource to the cache location + with open(result, 'wb') as f: + f.write(resource.bytes) + return result + + +class ResourceBase(object): + def __init__(self, finder, name): + self.finder = finder + self.name = name + + +class Resource(ResourceBase): + """ + A class representing an in-package resource, such as a data file. This is + not normally instantiated by user code, but rather by a + :class:`ResourceFinder` which manages the resource. + """ + is_container = False # Backwards compatibility + + def as_stream(self): + """ + Get the resource as a stream. + + This is not a property to make it obvious that it returns a new stream + each time. + """ + return self.finder.get_stream(self) + + @cached_property + def file_path(self): + global cache + if cache is None: + cache = ResourceCache() + return cache.get(self) + + @cached_property + def bytes(self): + return self.finder.get_bytes(self) + + @cached_property + def size(self): + return self.finder.get_size(self) + + +class ResourceContainer(ResourceBase): + is_container = True # Backwards compatibility + + @cached_property + def resources(self): + return self.finder.get_resources(self) + + +class ResourceFinder(object): + """ + Resource finder for file system resources. + """ + + if sys.platform.startswith('java'): + skipped_extensions = ('.pyc', '.pyo', '.class') + else: + skipped_extensions = ('.pyc', '.pyo') + + def __init__(self, module): + self.module = module + self.loader = getattr(module, '__loader__', None) + self.base = os.path.dirname(getattr(module, '__file__', '')) + + def _adjust_path(self, path): + return os.path.realpath(path) + + def _make_path(self, resource_name): + # Issue #50: need to preserve type of path on Python 2.x + # like os.path._get_sep + if isinstance(resource_name, bytes): # should only happen on 2.x + sep = b'/' + else: + sep = '/' + parts = resource_name.split(sep) + parts.insert(0, self.base) + result = os.path.join(*parts) + return self._adjust_path(result) + + def _find(self, path): + return os.path.exists(path) + + def get_cache_info(self, resource): + return None, resource.path + + def find(self, resource_name): + path = self._make_path(resource_name) + if not self._find(path): + result = None + else: + if self._is_directory(path): + result = ResourceContainer(self, resource_name) + else: + result = Resource(self, resource_name) + result.path = path + return result + + def get_stream(self, resource): + return open(resource.path, 'rb') + + def get_bytes(self, resource): + with open(resource.path, 'rb') as f: + return f.read() + + def get_size(self, resource): + return os.path.getsize(resource.path) + + def get_resources(self, resource): + def allowed(f): + return (f != '__pycache__' and not + f.endswith(self.skipped_extensions)) + return set([f for f in os.listdir(resource.path) if allowed(f)]) + + def is_container(self, resource): + return self._is_directory(resource.path) + + _is_directory = staticmethod(os.path.isdir) + + def iterator(self, resource_name): + resource = self.find(resource_name) + if resource is not None: + todo = [resource] + while todo: + resource = todo.pop(0) + yield resource + if resource.is_container: + rname = resource.name + for name in resource.resources: + if not rname: + new_name = name + else: + new_name = '/'.join([rname, name]) + child = self.find(new_name) + if child.is_container: + todo.append(child) + else: + yield child + + +class ZipResourceFinder(ResourceFinder): + """ + Resource finder for resources in .zip files. + """ + def __init__(self, module): + super(ZipResourceFinder, self).__init__(module) + archive = self.loader.archive + self.prefix_len = 1 + len(archive) + # PyPy doesn't have a _files attr on zipimporter, and you can't set one + if hasattr(self.loader, '_files'): + self._files = self.loader._files + else: + self._files = zipimport._zip_directory_cache[archive] + self.index = sorted(self._files) + + def _adjust_path(self, path): + return path + + def _find(self, path): + path = path[self.prefix_len:] + if path in self._files: + result = True + else: + if path and path[-1] != os.sep: + path = path + os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + if not result: + logger.debug('_find failed: %r %r', path, self.loader.prefix) + else: + logger.debug('_find worked: %r %r', path, self.loader.prefix) + return result + + def get_cache_info(self, resource): + prefix = self.loader.archive + path = resource.path[1 + len(prefix):] + return prefix, path + + def get_bytes(self, resource): + return self.loader.get_data(resource.path) + + def get_stream(self, resource): + return io.BytesIO(self.get_bytes(resource)) + + def get_size(self, resource): + path = resource.path[self.prefix_len:] + return self._files[path][3] + + def get_resources(self, resource): + path = resource.path[self.prefix_len:] + if path and path[-1] != os.sep: + path += os.sep + plen = len(path) + result = set() + i = bisect.bisect(self.index, path) + while i < len(self.index): + if not self.index[i].startswith(path): + break + s = self.index[i][plen:] + result.add(s.split(os.sep, 1)[0]) # only immediate children + i += 1 + return result + + def _is_directory(self, path): + path = path[self.prefix_len:] + if path and path[-1] != os.sep: + path += os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + return result + +_finder_registry = { + type(None): ResourceFinder, + zipimport.zipimporter: ZipResourceFinder +} + +try: + # In Python 3.6, _frozen_importlib -> _frozen_importlib_external + try: + import _frozen_importlib_external as _fi + except ImportError: + import _frozen_importlib as _fi + _finder_registry[_fi.SourceFileLoader] = ResourceFinder + _finder_registry[_fi.FileFinder] = ResourceFinder + del _fi +except (ImportError, AttributeError): + pass + + +def register_finder(loader, finder_maker): + _finder_registry[type(loader)] = finder_maker + +_finder_cache = {} + + +def finder(package): + """ + Return a resource finder for a package. + :param package: The name of the package. + :return: A :class:`ResourceFinder` instance for the package. + """ + if package in _finder_cache: + result = _finder_cache[package] + else: + if package not in sys.modules: + __import__(package) + module = sys.modules[package] + path = getattr(module, '__path__', None) + if path is None: + raise DistlibException('You cannot get a finder for a module, ' + 'only for a package') + loader = getattr(module, '__loader__', None) + finder_maker = _finder_registry.get(type(loader)) + if finder_maker is None: + raise DistlibException('Unable to locate finder for %r' % package) + result = finder_maker(module) + _finder_cache[package] = result + return result + + +_dummy_module = types.ModuleType(str('__dummy__')) + + +def finder_for_path(path): + """ + Return a resource finder for a path, which should represent a container. + + :param path: The path. + :return: A :class:`ResourceFinder` instance for the path. + """ + result = None + # calls any path hooks, gets importer into cache + pkgutil.get_importer(path) + loader = sys.path_importer_cache.get(path) + finder = _finder_registry.get(type(loader)) + if finder: + module = _dummy_module + module.__file__ = os.path.join(path, '') + module.__loader__ = loader + result = finder(module) + return result diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/resources.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f7bdded99f52d1ba90c21a40756bc50842c8ba5 GIT binary patch literal 13764 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 + + + + + + + + + + + +'''.strip() + +# check if Python is called on the first line with this expression +FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$') +SCRIPT_TEMPLATE = r'''# -*- coding: utf-8 -*- +import re +import sys +from %(module)s import %(import_name)s +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(%(func)s()) +''' + + +def enquote_executable(executable): + if ' ' in executable: + # make sure we quote only the executable in case of env + # for example /usr/bin/env "/dir with spaces/bin/jython" + # instead of "/usr/bin/env /dir with spaces/bin/jython" + # otherwise whole + if executable.startswith('/usr/bin/env '): + env, _executable = executable.split(' ', 1) + if ' ' in _executable and not _executable.startswith('"'): + executable = '%s "%s"' % (env, _executable) + else: + if not executable.startswith('"'): + executable = '"%s"' % executable + return executable + +# Keep the old name around (for now), as there is at least one project using it! +_enquote_executable = enquote_executable + +class ScriptMaker(object): + """ + A class to copy or create scripts from source scripts or callable + specifications. + """ + script_template = SCRIPT_TEMPLATE + + executable = None # for shebangs + + def __init__(self, source_dir, target_dir, add_launchers=True, + dry_run=False, fileop=None): + self.source_dir = source_dir + self.target_dir = target_dir + self.add_launchers = add_launchers + self.force = False + self.clobber = False + # It only makes sense to set mode bits on POSIX. + self.set_mode = (os.name == 'posix') or (os.name == 'java' and + os._name == 'posix') + self.variants = set(('', 'X.Y')) + self._fileop = fileop or FileOperator(dry_run) + + self._is_nt = os.name == 'nt' or ( + os.name == 'java' and os._name == 'nt') + self.version_info = sys.version_info + + def _get_alternate_executable(self, executable, options): + if options.get('gui', False) and self._is_nt: # pragma: no cover + dn, fn = os.path.split(executable) + fn = fn.replace('python', 'pythonw') + executable = os.path.join(dn, fn) + return executable + + if sys.platform.startswith('java'): # pragma: no cover + def _is_shell(self, executable): + """ + Determine if the specified executable is a script + (contains a #! line) + """ + try: + with open(executable) as fp: + return fp.read(2) == '#!' + except (OSError, IOError): + logger.warning('Failed to open %s', executable) + return False + + def _fix_jython_executable(self, executable): + if self._is_shell(executable): + # Workaround for Jython is not needed on Linux systems. + import java + + if java.lang.System.getProperty('os.name') == 'Linux': + return executable + elif executable.lower().endswith('jython.exe'): + # Use wrapper exe for Jython on Windows + return executable + return '/usr/bin/env %s' % executable + + def _build_shebang(self, executable, post_interp): + """ + Build a shebang line. In the simple case (on Windows, or a shebang line + which is not too long or contains spaces) use a simple formulation for + the shebang. Otherwise, use /bin/sh as the executable, with a contrived + shebang which allows the script to run either under Python or sh, using + suitable quoting. Thanks to Harald Nordgren for his input. + + See also: http://www.in-ulm.de/~mascheck/various/shebang/#length + https://hg.mozilla.org/mozilla-central/file/tip/mach + """ + if os.name != 'posix': + simple_shebang = True + else: + # Add 3 for '#!' prefix and newline suffix. + shebang_length = len(executable) + len(post_interp) + 3 + if sys.platform == 'darwin': + max_shebang_length = 512 + else: + max_shebang_length = 127 + simple_shebang = ((b' ' not in executable) and + (shebang_length <= max_shebang_length)) + + if simple_shebang: + result = b'#!' + executable + post_interp + b'\n' + else: + result = b'#!/bin/sh\n' + result += b"'''exec' " + executable + post_interp + b' "$0" "$@"\n' + result += b"' '''" + return result + + def _get_shebang(self, encoding, post_interp=b'', options=None): + enquote = True + if self.executable: + executable = self.executable + enquote = False # assume this will be taken care of + elif not sysconfig.is_python_build(): + executable = get_executable() + elif in_venv(): # pragma: no cover + executable = os.path.join(sysconfig.get_path('scripts'), + 'python%s' % sysconfig.get_config_var('EXE')) + else: # pragma: no cover + executable = os.path.join( + sysconfig.get_config_var('BINDIR'), + 'python%s%s' % (sysconfig.get_config_var('VERSION'), + sysconfig.get_config_var('EXE'))) + if options: + executable = self._get_alternate_executable(executable, options) + + if sys.platform.startswith('java'): # pragma: no cover + executable = self._fix_jython_executable(executable) + + # Normalise case for Windows - COMMENTED OUT + # executable = os.path.normcase(executable) + # N.B. The normalising operation above has been commented out: See + # issue #124. Although paths in Windows are generally case-insensitive, + # they aren't always. For example, a path containing a ẞ (which is a + # LATIN CAPITAL LETTER SHARP S - U+1E9E) is normcased to ß (which is a + # LATIN SMALL LETTER SHARP S' - U+00DF). The two are not considered by + # Windows as equivalent in path names. + + # If the user didn't specify an executable, it may be necessary to + # cater for executable paths with spaces (not uncommon on Windows) + if enquote: + executable = enquote_executable(executable) + # Issue #51: don't use fsencode, since we later try to + # check that the shebang is decodable using utf-8. + executable = executable.encode('utf-8') + # in case of IronPython, play safe and enable frames support + if (sys.platform == 'cli' and '-X:Frames' not in post_interp + and '-X:FullFrames' not in post_interp): # pragma: no cover + post_interp += b' -X:Frames' + shebang = self._build_shebang(executable, post_interp) + # Python parser starts to read a script using UTF-8 until + # it gets a #coding:xxx cookie. The shebang has to be the + # first line of a file, the #coding:xxx cookie cannot be + # written before. So the shebang has to be decodable from + # UTF-8. + try: + shebang.decode('utf-8') + except UnicodeDecodeError: # pragma: no cover + raise ValueError( + 'The shebang (%r) is not decodable from utf-8' % shebang) + # If the script is encoded to a custom encoding (use a + # #coding:xxx cookie), the shebang has to be decodable from + # the script encoding too. + if encoding != 'utf-8': + try: + shebang.decode(encoding) + except UnicodeDecodeError: # pragma: no cover + raise ValueError( + 'The shebang (%r) is not decodable ' + 'from the script encoding (%r)' % (shebang, encoding)) + return shebang + + def _get_script_text(self, entry): + return self.script_template % dict(module=entry.prefix, + import_name=entry.suffix.split('.')[0], + func=entry.suffix) + + manifest = _DEFAULT_MANIFEST + + def get_manifest(self, exename): + base = os.path.basename(exename) + return self.manifest % base + + def _write_script(self, names, shebang, script_bytes, filenames, ext): + use_launcher = self.add_launchers and self._is_nt + linesep = os.linesep.encode('utf-8') + if not shebang.endswith(linesep): + shebang += linesep + if not use_launcher: + script_bytes = shebang + script_bytes + else: # pragma: no cover + if ext == 'py': + launcher = self._get_launcher('t') + else: + launcher = self._get_launcher('w') + stream = BytesIO() + with ZipFile(stream, 'w') as zf: + zf.writestr('__main__.py', script_bytes) + zip_data = stream.getvalue() + script_bytes = launcher + shebang + zip_data + for name in names: + outname = os.path.join(self.target_dir, name) + if use_launcher: # pragma: no cover + n, e = os.path.splitext(outname) + if e.startswith('.py'): + outname = n + outname = '%s.exe' % outname + try: + self._fileop.write_binary_file(outname, script_bytes) + except Exception: + # Failed writing an executable - it might be in use. + logger.warning('Failed to write executable - trying to ' + 'use .deleteme logic') + dfname = '%s.deleteme' % outname + if os.path.exists(dfname): + os.remove(dfname) # Not allowed to fail here + os.rename(outname, dfname) # nor here + self._fileop.write_binary_file(outname, script_bytes) + logger.debug('Able to replace executable using ' + '.deleteme logic') + try: + os.remove(dfname) + except Exception: + pass # still in use - ignore error + else: + if self._is_nt and not outname.endswith('.' + ext): # pragma: no cover + outname = '%s.%s' % (outname, ext) + if os.path.exists(outname) and not self.clobber: + logger.warning('Skipping existing file %s', outname) + continue + self._fileop.write_binary_file(outname, script_bytes) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + + def _make_script(self, entry, filenames, options=None): + post_interp = b'' + if options: + args = options.get('interpreter_args', []) + if args: + args = ' %s' % ' '.join(args) + post_interp = args.encode('utf-8') + shebang = self._get_shebang('utf-8', post_interp, options=options) + script = self._get_script_text(entry).encode('utf-8') + name = entry.name + scriptnames = set() + if '' in self.variants: + scriptnames.add(name) + if 'X' in self.variants: + scriptnames.add('%s%s' % (name, self.version_info[0])) + if 'X.Y' in self.variants: + scriptnames.add('%s-%s.%s' % (name, self.version_info[0], + self.version_info[1])) + if options and options.get('gui', False): + ext = 'pyw' + else: + ext = 'py' + self._write_script(scriptnames, shebang, script, filenames, ext) + + def _copy_script(self, script, filenames): + adjust = False + script = os.path.join(self.source_dir, convert_path(script)) + outname = os.path.join(self.target_dir, os.path.basename(script)) + if not self.force and not self._fileop.newer(script, outname): + logger.debug('not copying %s (up-to-date)', script) + return + + # Always open the file, but ignore failures in dry-run mode -- + # that way, we'll get accurate feedback if we can read the + # script. + try: + f = open(script, 'rb') + except IOError: # pragma: no cover + if not self.dry_run: + raise + f = None + else: + first_line = f.readline() + if not first_line: # pragma: no cover + logger.warning('%s: %s is an empty file (skipping)', + self.get_command_name(), script) + return + + match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n')) + if match: + adjust = True + post_interp = match.group(1) or b'' + + if not adjust: + if f: + f.close() + self._fileop.copy_file(script, outname) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + else: + logger.info('copying and adjusting %s -> %s', script, + self.target_dir) + if not self._fileop.dry_run: + encoding, lines = detect_encoding(f.readline) + f.seek(0) + shebang = self._get_shebang(encoding, post_interp) + if b'pythonw' in first_line: # pragma: no cover + ext = 'pyw' + else: + ext = 'py' + n = os.path.basename(outname) + self._write_script([n], shebang, f.read(), filenames, ext) + if f: + f.close() + + @property + def dry_run(self): + return self._fileop.dry_run + + @dry_run.setter + def dry_run(self, value): + self._fileop.dry_run = value + + if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): # pragma: no cover + # Executable launcher support. + # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/ + + def _get_launcher(self, kind): + if struct.calcsize('P') == 8: # 64-bit + bits = '64' + else: + bits = '32' + name = '%s%s.exe' % (kind, bits) + # Issue 31: don't hardcode an absolute package name, but + # determine it relative to the current package + distlib_package = __name__.rsplit('.', 1)[0] + resource = finder(distlib_package).find(name) + if not resource: + msg = ('Unable to find resource %s in package %s' % (name, + distlib_package)) + raise ValueError(msg) + return resource.bytes + + # Public API follows + + def make(self, specification, options=None): + """ + Make a script. + + :param specification: The specification, which is either a valid export + entry specification (to make a script from a + callable) or a filename (to make a script by + copying from a source location). + :param options: A dictionary of options controlling script generation. + :return: A list of all absolute pathnames written to. + """ + filenames = [] + entry = get_export_entry(specification) + if entry is None: + self._copy_script(specification, filenames) + else: + self._make_script(entry, filenames, options=options) + return filenames + + def make_multiple(self, specifications, options=None): + """ + Take a list of specifications and make scripts from them, + :param specifications: A list of specifications. + :return: A list of all absolute pathnames written to, + """ + filenames = [] + for specification in specifications: + filenames.extend(self.make(specification, options)) + return filenames diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/scripts.pyc new file mode 100644 index 0000000000000000000000000000000000000000..711a678ac85c87d393b993d3686d39a809f6682a GIT binary patch literal 13280 zcmb_jTWlQHc|NndT#>8gMU+MAY7Z&VT&mioZ}EjSCCe6tFqLU#C|e9=Wii~HC1P-oAD^#>R#;C;;I+a z!nz-9O2c)(bK7ruMp7P?8h%jsqS63G6!Bo`dmS%w<1mWHkg@4O#9jw)kQ7JzQVU<% z@sQJTyhG(=S$Dn6}f7El$6G z?{@k1XEbo{~Lk6ka=JyFYb48)K3k94Q<0=iVNJ5gBkv<{=2QEkiT z{Bw1DryFiddmNJe=KTL7cK-0E=X<@!V$G+k zbzMJ;P4Vr^QfDVh`fpL?vR%Gfw#^1zu)A@i z{5o?Aew#ZE)0L*MwF`|XY}+%Xc3AJWyg6+rm1asNQRVu~>4M*|tCFr(?ZriVwpwkw z*o@WLg@TQLkW_J_&7B7?JhT__g^KQOl%m;ES=S=J6MtCg?C(DQu;T4`=;Z7*dltV# zZRUDHygffI&6FD5pf;yVb903nwUNrm-#hr}@8JQ|daTr=yo#PO(G=VQNJO5zLgVpY zRz1n64>Rh(QU|~@G|5PlPnckn9KoX)eL`@0EX9qCnmABu`xCX@6D+m#Q&rDXwiG{A zf#S<*iNLWEvyZkWrp$MBG{4~o^UzXTkVFcnH7m|&n>$_SkY=KkK_V{T0WFPUz3W5s zi5eQaJT?%-QcPP40-Obij!)t*ASBH%;Z?~)FCaA^w>$G4zf<-DNN%;tFD*AedbQ0g z`4L3wVKiU&b=>kd=FKW;tWrFV=3cPf4P)<+{FjldiCoGm4vbo7t&7$~X4D$9q$8`c z$nUz?_BGbwKaTNj{Paakjt5Z2g5a4^9xMv1$TPGV-U;OmGL6M~iu@shGmsiK!#k;( zMb#XZWyHd+bGcYF!qsA8l#75xVS0?VfpP}bQ&_K4vSuLI6ELHIkCAewVTF`hq4xz!FeLIZoTI9L0XD5qf zi^l4(8`b)Gtc7)^oiM7@@oIh}K}ubbyc$gte?3k5OT2L3V=Ez%kpy0|lE|poBywqD zK*f30#5`LZZ|8pc3a!eh(7a+brIa#QvFLpjq}p^s?eE1oq?+!I8{@Ci9PC=0b)#9H4d6%~+5%E@Tdc?gZgzc{24h8Kb`pbH;z&##FLuu3#ks=AC1z6q zxtYW5Agv;=({i!$vg1NO5XR@svc*VR2kQrppk+tY1NqYkj&JI@zE$p1w-tL)0Gv34 z+5{C%1EQ=8!0d7SoM-S>pxh;J;fS(^1E`cz|AR#QiJY}~a$MA@>g3n=UJ}ytKXzKZG z7aCP3wuT)quxGT`Z&^QPNCIG6m(_i5bt#HKn5aF=@0m0wtQBrqY^*0NE*G zt`99fzuV{>-%8ULAqwa%uhrVbi>7O#2C~qsOV(-F;@-0I)3U7JMuK{jE^D+%c&=j% zLW#J(_)qi;>&sO(rtAYzncy7%U`3xm1T;-R8!Jt9GK^_rRe)zjJSm|#p|11*?~WgI z_hkPyg|CwSX*y9yNK�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 F{{j_Hb~FG0 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/t64.exe b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/t64.exe new file mode 100644 index 0000000000000000000000000000000000000000..325b8057c08cf7113d4fd889991fa5638d443793 GIT binary patch literal 105984 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

      ^h^N4aZyJe%k(7BL*-gn=9``8`j0CuR45%cHI z_uuQ8!-|TEvJ}r=zF@%uKc8U@W1eNxUymJ(e45Tb6KDNieQcKe?L-gR8zZj^wFmi= z{5sAxrfP3BOZz~T$3h=Gi%jFg1%D>!6t*l^`zH2G#1PiYtvOBSI#q&y?8qN57P^LA zq9U)rQU+*y!XEgsGMCJM7yWOS+9lW~^axz>9gyv{Pu^qsBg%ZkfzkaN`$zV#>=oFn zwANnf4&g*eu~pAMC~1dl8FZ-^aeQgZ7=osPU=58@oke z55pen;eU@Z`iL!`$;1-VA&$VF4gN7ttU>relx5d-_x=|95B47HeeiYJZ$$38(ddJH zcrW3>{OR2@KF^H}gAbdZDX=AzyZHSizB_(9`v&$-69)D4WBjSaY@YVD`kl8;nl#Cu z5h1U}Tp}-l|Nde9w|3Pc@Aps8-X~fh_EGq!b-~*$a&nv>05-_n;)z{t+vW|PpX{Oj zKE#i|Gsq9Jhpor%Fqiu6y5}jjnz?*$b)h|UO;3NGd-k|9?ZqeVXL!9~vaIO0E8bVb zejzv5ZG0}~1A7{a3!hob11v4ihxvzh!S5>3I?4E~N9+^m8@sHve^M+wb{f3t2VUsD z*C*C&;z_`=&t~mbE@mHC`k7cGl3rKU9U84p?fzGxTg1q z)-Ai@eQSs49?#VDZ(BQ5_sXt#*VAn)X1Lk5l>kvHP6SDZX>#ITM7@`jxR;sQ>OG+Pe$CuXbGOdj zGq+|zTtQMnhk{-O{R=KF7*}vZ!OVhr1xpLo6l^NkTCk^}W?@_*Z|>hH7&o`>+{q8j zm_Kv=-1+n7FPgt}{>u4l=C7T3KtbFEnHc+rVzeuEi5hE<2hHiD6S}>D5l co{tw5U0O7=?|={2,3}|[~!]=)\s*') +MARKER_OP = re.compile(r'^((<=?)|(>=?)|={2,3}|[~!]=|in|not\s+in)\s*') +OR = re.compile(r'^or\b\s*') +AND = re.compile(r'^and\b\s*') +NON_SPACE = re.compile(r'(\S+)\s*') +STRING_CHUNK = re.compile(r'([\s\w\.{}()*+#:;,/?!~`@$%^&=|<>\[\]-]+)') + + +def parse_marker(marker_string): + """ + Parse a marker string and return a dictionary containing a marker expression. + + The dictionary will contain keys "op", "lhs" and "rhs" for non-terminals in + the expression grammar, or strings. A string contained in quotes is to be + interpreted as a literal string, and a string not contained in quotes is a + variable (such as os_name). + """ + def marker_var(remaining): + # either identifier, or literal string + m = IDENTIFIER.match(remaining) + if m: + result = m.groups()[0] + remaining = remaining[m.end():] + elif not remaining: + raise SyntaxError('unexpected end of input') + else: + q = remaining[0] + if q not in '\'"': + raise SyntaxError('invalid expression: %s' % remaining) + oq = '\'"'.replace(q, '') + remaining = remaining[1:] + parts = [q] + while remaining: + # either a string chunk, or oq, or q to terminate + if remaining[0] == q: + break + elif remaining[0] == oq: + parts.append(oq) + remaining = remaining[1:] + else: + m = STRING_CHUNK.match(remaining) + if not m: + raise SyntaxError('error in string literal: %s' % remaining) + parts.append(m.groups()[0]) + remaining = remaining[m.end():] + else: + s = ''.join(parts) + raise SyntaxError('unterminated string: %s' % s) + parts.append(q) + result = ''.join(parts) + remaining = remaining[1:].lstrip() # skip past closing quote + return result, remaining + + def marker_expr(remaining): + if remaining and remaining[0] == '(': + result, remaining = marker(remaining[1:].lstrip()) + if remaining[0] != ')': + raise SyntaxError('unterminated parenthesis: %s' % remaining) + remaining = remaining[1:].lstrip() + else: + lhs, remaining = marker_var(remaining) + while remaining: + m = MARKER_OP.match(remaining) + if not m: + break + op = m.groups()[0] + remaining = remaining[m.end():] + rhs, remaining = marker_var(remaining) + lhs = {'op': op, 'lhs': lhs, 'rhs': rhs} + result = lhs + return result, remaining + + def marker_and(remaining): + lhs, remaining = marker_expr(remaining) + while remaining: + m = AND.match(remaining) + if not m: + break + remaining = remaining[m.end():] + rhs, remaining = marker_expr(remaining) + lhs = {'op': 'and', 'lhs': lhs, 'rhs': rhs} + return lhs, remaining + + def marker(remaining): + lhs, remaining = marker_and(remaining) + while remaining: + m = OR.match(remaining) + if not m: + break + remaining = remaining[m.end():] + rhs, remaining = marker_and(remaining) + lhs = {'op': 'or', 'lhs': lhs, 'rhs': rhs} + return lhs, remaining + + return marker(marker_string) + + +def parse_requirement(req): + """ + Parse a requirement passed in as a string. Return a Container + whose attributes contain the various parts of the requirement. + """ + remaining = req.strip() + if not remaining or remaining.startswith('#'): + return None + m = IDENTIFIER.match(remaining) + if not m: + raise SyntaxError('name expected: %s' % remaining) + distname = m.groups()[0] + remaining = remaining[m.end():] + extras = mark_expr = versions = uri = None + if remaining and remaining[0] == '[': + i = remaining.find(']', 1) + if i < 0: + raise SyntaxError('unterminated extra: %s' % remaining) + s = remaining[1:i] + remaining = remaining[i + 1:].lstrip() + extras = [] + while s: + m = IDENTIFIER.match(s) + if not m: + raise SyntaxError('malformed extra: %s' % s) + extras.append(m.groups()[0]) + s = s[m.end():] + if not s: + break + if s[0] != ',': + raise SyntaxError('comma expected in extras: %s' % s) + s = s[1:].lstrip() + if not extras: + extras = None + if remaining: + if remaining[0] == '@': + # it's a URI + remaining = remaining[1:].lstrip() + m = NON_SPACE.match(remaining) + if not m: + raise SyntaxError('invalid URI: %s' % remaining) + uri = m.groups()[0] + t = urlparse(uri) + # there are issues with Python and URL parsing, so this test + # is a bit crude. See bpo-20271, bpo-23505. Python doesn't + # always parse invalid URLs correctly - it should raise + # exceptions for malformed URLs + if not (t.scheme and t.netloc): + raise SyntaxError('Invalid URL: %s' % uri) + remaining = remaining[m.end():].lstrip() + else: + + def get_versions(ver_remaining): + """ + Return a list of operator, version tuples if any are + specified, else None. + """ + m = COMPARE_OP.match(ver_remaining) + versions = None + if m: + versions = [] + while True: + op = m.groups()[0] + ver_remaining = ver_remaining[m.end():] + m = VERSION_IDENTIFIER.match(ver_remaining) + if not m: + raise SyntaxError('invalid version: %s' % ver_remaining) + v = m.groups()[0] + versions.append((op, v)) + ver_remaining = ver_remaining[m.end():] + if not ver_remaining or ver_remaining[0] != ',': + break + ver_remaining = ver_remaining[1:].lstrip() + m = COMPARE_OP.match(ver_remaining) + if not m: + raise SyntaxError('invalid constraint: %s' % ver_remaining) + if not versions: + versions = None + return versions, ver_remaining + + if remaining[0] != '(': + versions, remaining = get_versions(remaining) + else: + i = remaining.find(')', 1) + if i < 0: + raise SyntaxError('unterminated parenthesis: %s' % remaining) + s = remaining[1:i] + remaining = remaining[i + 1:].lstrip() + # As a special diversion from PEP 508, allow a version number + # a.b.c in parentheses as a synonym for ~= a.b.c (because this + # is allowed in earlier PEPs) + if COMPARE_OP.match(s): + versions, _ = get_versions(s) + else: + m = VERSION_IDENTIFIER.match(s) + if not m: + raise SyntaxError('invalid constraint: %s' % s) + v = m.groups()[0] + s = s[m.end():].lstrip() + if s: + raise SyntaxError('invalid constraint: %s' % s) + versions = [('~=', v)] + + if remaining: + if remaining[0] != ';': + raise SyntaxError('invalid requirement: %s' % remaining) + remaining = remaining[1:].lstrip() + + mark_expr, remaining = parse_marker(remaining) + + if remaining and remaining[0] != '#': + raise SyntaxError('unexpected trailing data: %s' % remaining) + + if not versions: + rs = distname + else: + rs = '%s %s' % (distname, ', '.join(['%s %s' % con for con in versions])) + return Container(name=distname, extras=extras, constraints=versions, + marker=mark_expr, url=uri, requirement=rs) + + +def get_resources_dests(resources_root, rules): + """Find destinations for resources files""" + + def get_rel_path(root, path): + # normalizes and returns a lstripped-/-separated path + root = root.replace(os.path.sep, '/') + path = path.replace(os.path.sep, '/') + assert path.startswith(root) + return path[len(root):].lstrip('/') + + destinations = {} + for base, suffix, dest in rules: + prefix = os.path.join(resources_root, base) + for abs_base in iglob(prefix): + abs_glob = os.path.join(abs_base, suffix) + for abs_path in iglob(abs_glob): + resource_file = get_rel_path(resources_root, abs_path) + if dest is None: # remove the entry if it was here + destinations.pop(resource_file, None) + else: + rel_path = get_rel_path(abs_base, abs_path) + rel_dest = dest.replace(os.path.sep, '/').rstrip('/') + destinations[resource_file] = rel_dest + '/' + rel_path + return destinations + + +def in_venv(): + if hasattr(sys, 'real_prefix'): + # virtualenv venvs + result = True + else: + # PEP 405 venvs + result = sys.prefix != getattr(sys, 'base_prefix', sys.prefix) + return result + + +def get_executable(): +# The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as +# changes to the stub launcher mean that sys.executable always points +# to the stub on OS X +# if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__' +# in os.environ): +# result = os.environ['__PYVENV_LAUNCHER__'] +# else: +# result = sys.executable +# return result + result = os.path.normcase(sys.executable) + if not isinstance(result, text_type): + result = fsdecode(result) + return result + + +def proceed(prompt, allowed_chars, error_prompt=None, default=None): + p = prompt + while True: + s = raw_input(p) + p = prompt + if not s and default: + s = default + if s: + c = s[0].lower() + if c in allowed_chars: + break + if error_prompt: + p = '%c: %s\n%s' % (c, error_prompt, prompt) + return c + + +def extract_by_key(d, keys): + if isinstance(keys, string_types): + keys = keys.split() + result = {} + for key in keys: + if key in d: + result[key] = d[key] + return result + +def read_exports(stream): + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + # Try to load as JSON, falling back on legacy format + data = stream.read() + stream = StringIO(data) + try: + jdata = json.load(stream) + result = jdata['extensions']['python.exports']['exports'] + for group, entries in result.items(): + for k, v in entries.items(): + s = '%s = %s' % (k, v) + entry = get_export_entry(s) + assert entry is not None + entries[k] = entry + return result + except Exception: + stream.seek(0, 0) + + def read_stream(cp, stream): + if hasattr(cp, 'read_file'): + cp.read_file(stream) + else: + cp.readfp(stream) + + cp = configparser.ConfigParser() + try: + read_stream(cp, stream) + except configparser.MissingSectionHeaderError: + stream.close() + data = textwrap.dedent(data) + stream = StringIO(data) + read_stream(cp, stream) + + result = {} + for key in cp.sections(): + result[key] = entries = {} + for name, value in cp.items(key): + s = '%s = %s' % (name, value) + entry = get_export_entry(s) + assert entry is not None + #entry.dist = self + entries[name] = entry + return result + + +def write_exports(exports, stream): + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getwriter('utf-8')(stream) + cp = configparser.ConfigParser() + for k, v in exports.items(): + # TODO check k, v for valid values + cp.add_section(k) + for entry in v.values(): + if entry.suffix is None: + s = entry.prefix + else: + s = '%s:%s' % (entry.prefix, entry.suffix) + if entry.flags: + s = '%s [%s]' % (s, ', '.join(entry.flags)) + cp.set(k, entry.name, s) + cp.write(stream) + + +@contextlib.contextmanager +def tempdir(): + td = tempfile.mkdtemp() + try: + yield td + finally: + shutil.rmtree(td) + +@contextlib.contextmanager +def chdir(d): + cwd = os.getcwd() + try: + os.chdir(d) + yield + finally: + os.chdir(cwd) + + +@contextlib.contextmanager +def socket_timeout(seconds=15): + cto = socket.getdefaulttimeout() + try: + socket.setdefaulttimeout(seconds) + yield + finally: + socket.setdefaulttimeout(cto) + + +class cached_property(object): + def __init__(self, func): + self.func = func + #for attr in ('__name__', '__module__', '__doc__'): + # setattr(self, attr, getattr(func, attr, None)) + + def __get__(self, obj, cls=None): + if obj is None: + return self + value = self.func(obj) + object.__setattr__(obj, self.func.__name__, value) + #obj.__dict__[self.func.__name__] = value = self.func(obj) + return value + +def convert_path(pathname): + """Return 'pathname' as a name that will work on the native filesystem. + + The path is split on '/' and put back together again using the current + directory separator. Needed because filenames in the setup script are + always supplied in Unix style, and have to be converted to the local + convention before we can actually use them in the filesystem. Raises + ValueError on non-Unix-ish systems if 'pathname' either starts or + ends with a slash. + """ + if os.sep == '/': + return pathname + if not pathname: + return pathname + if pathname[0] == '/': + raise ValueError("path '%s' cannot be absolute" % pathname) + if pathname[-1] == '/': + raise ValueError("path '%s' cannot end with '/'" % pathname) + + paths = pathname.split('/') + while os.curdir in paths: + paths.remove(os.curdir) + if not paths: + return os.curdir + return os.path.join(*paths) + + +class FileOperator(object): + def __init__(self, dry_run=False): + self.dry_run = dry_run + self.ensured = set() + self._init_record() + + def _init_record(self): + self.record = False + self.files_written = set() + self.dirs_created = set() + + def record_as_written(self, path): + if self.record: + self.files_written.add(path) + + def newer(self, source, target): + """Tell if the target is newer than the source. + + Returns true if 'source' exists and is more recently modified than + 'target', or if 'source' exists and 'target' doesn't. + + Returns false if both exist and 'target' is the same age or younger + than 'source'. Raise PackagingFileError if 'source' does not exist. + + Note that this test is not very accurate: files created in the same + second will have the same "age". + """ + if not os.path.exists(source): + raise DistlibException("file '%r' does not exist" % + os.path.abspath(source)) + if not os.path.exists(target): + return True + + return os.stat(source).st_mtime > os.stat(target).st_mtime + + def copy_file(self, infile, outfile, check=True): + """Copy a file respecting dry-run and force flags. + """ + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying %s to %s', infile, outfile) + if not self.dry_run: + msg = None + if check: + if os.path.islink(outfile): + msg = '%s is a symlink' % outfile + elif os.path.exists(outfile) and not os.path.isfile(outfile): + msg = '%s is a non-regular file' % outfile + if msg: + raise ValueError(msg + ' which would be overwritten') + shutil.copyfile(infile, outfile) + self.record_as_written(outfile) + + def copy_stream(self, instream, outfile, encoding=None): + assert not os.path.isdir(outfile) + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying stream %s to %s', instream, outfile) + if not self.dry_run: + if encoding is None: + outstream = open(outfile, 'wb') + else: + outstream = codecs.open(outfile, 'w', encoding=encoding) + try: + shutil.copyfileobj(instream, outstream) + finally: + outstream.close() + self.record_as_written(outfile) + + def write_binary_file(self, path, data): + self.ensure_dir(os.path.dirname(path)) + if not self.dry_run: + if os.path.exists(path): + os.remove(path) + with open(path, 'wb') as f: + f.write(data) + self.record_as_written(path) + + def write_text_file(self, path, data, encoding): + self.write_binary_file(path, data.encode(encoding)) + + def set_mode(self, bits, mask, files): + if os.name == 'posix' or (os.name == 'java' and os._name == 'posix'): + # Set the executable bits (owner, group, and world) on + # all the files specified. + for f in files: + if self.dry_run: + logger.info("changing mode of %s", f) + else: + mode = (os.stat(f).st_mode | bits) & mask + logger.info("changing mode of %s to %o", f, mode) + os.chmod(f, mode) + + set_executable_mode = lambda s, f: s.set_mode(0o555, 0o7777, f) + + def ensure_dir(self, path): + path = os.path.abspath(path) + if path not in self.ensured and not os.path.exists(path): + self.ensured.add(path) + d, f = os.path.split(path) + self.ensure_dir(d) + logger.info('Creating %s' % path) + if not self.dry_run: + os.mkdir(path) + if self.record: + self.dirs_created.add(path) + + def byte_compile(self, path, optimize=False, force=False, prefix=None, hashed_invalidation=False): + dpath = cache_from_source(path, not optimize) + logger.info('Byte-compiling %s to %s', path, dpath) + if not self.dry_run: + if force or self.newer(path, dpath): + if not prefix: + diagpath = None + else: + assert path.startswith(prefix) + diagpath = path[len(prefix):] + compile_kwargs = {} + if hashed_invalidation and hasattr(py_compile, 'PycInvalidationMode'): + compile_kwargs['invalidation_mode'] = py_compile.PycInvalidationMode.CHECKED_HASH + py_compile.compile(path, dpath, diagpath, True, **compile_kwargs) # raise error + self.record_as_written(dpath) + return dpath + + def ensure_removed(self, path): + if os.path.exists(path): + if os.path.isdir(path) and not os.path.islink(path): + logger.debug('Removing directory tree at %s', path) + if not self.dry_run: + shutil.rmtree(path) + if self.record: + if path in self.dirs_created: + self.dirs_created.remove(path) + else: + if os.path.islink(path): + s = 'link' + else: + s = 'file' + logger.debug('Removing %s %s', s, path) + if not self.dry_run: + os.remove(path) + if self.record: + if path in self.files_written: + self.files_written.remove(path) + + def is_writable(self, path): + result = False + while not result: + if os.path.exists(path): + result = os.access(path, os.W_OK) + break + parent = os.path.dirname(path) + if parent == path: + break + path = parent + return result + + def commit(self): + """ + Commit recorded changes, turn off recording, return + changes. + """ + assert self.record + result = self.files_written, self.dirs_created + self._init_record() + return result + + def rollback(self): + if not self.dry_run: + for f in list(self.files_written): + if os.path.exists(f): + os.remove(f) + # dirs should all be empty now, except perhaps for + # __pycache__ subdirs + # reverse so that subdirs appear before their parents + dirs = sorted(self.dirs_created, reverse=True) + for d in dirs: + flist = os.listdir(d) + if flist: + assert flist == ['__pycache__'] + sd = os.path.join(d, flist[0]) + os.rmdir(sd) + os.rmdir(d) # should fail if non-empty + self._init_record() + +def resolve(module_name, dotted_path): + if module_name in sys.modules: + mod = sys.modules[module_name] + else: + mod = __import__(module_name) + if dotted_path is None: + result = mod + else: + parts = dotted_path.split('.') + result = getattr(mod, parts.pop(0)) + for p in parts: + result = getattr(result, p) + return result + + +class ExportEntry(object): + def __init__(self, name, prefix, suffix, flags): + self.name = name + self.prefix = prefix + self.suffix = suffix + self.flags = flags + + @cached_property + def value(self): + return resolve(self.prefix, self.suffix) + + def __repr__(self): # pragma: no cover + return '' % (self.name, self.prefix, + self.suffix, self.flags) + + def __eq__(self, other): + if not isinstance(other, ExportEntry): + result = False + else: + result = (self.name == other.name and + self.prefix == other.prefix and + self.suffix == other.suffix and + self.flags == other.flags) + return result + + __hash__ = object.__hash__ + + +ENTRY_RE = re.compile(r'''(?P(\w|[-.+])+) + \s*=\s*(?P(\w+)([:\.]\w+)*) + \s*(\[\s*(?P[\w-]+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? + ''', re.VERBOSE) + +def get_export_entry(specification): + m = ENTRY_RE.search(specification) + if not m: + result = None + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + else: + d = m.groupdict() + name = d['name'] + path = d['callable'] + colons = path.count(':') + if colons == 0: + prefix, suffix = path, None + else: + if colons != 1: + raise DistlibException("Invalid specification " + "'%s'" % specification) + prefix, suffix = path.split(':') + flags = d['flags'] + if flags is None: + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + flags = [] + else: + flags = [f.strip() for f in flags.split(',')] + result = ExportEntry(name, prefix, suffix, flags) + return result + + +def get_cache_base(suffix=None): + """ + Return the default base location for distlib caches. If the directory does + not exist, it is created. Use the suffix provided for the base directory, + and default to '.distlib' if it isn't provided. + + On Windows, if LOCALAPPDATA is defined in the environment, then it is + assumed to be a directory, and will be the parent directory of the result. + On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home + directory - using os.expanduser('~') - will be the parent directory of + the result. + + The result is just the directory '.distlib' in the parent directory as + determined above, or with the name specified with ``suffix``. + """ + if suffix is None: + suffix = '.distlib' + if os.name == 'nt' and 'LOCALAPPDATA' in os.environ: + result = os.path.expandvars('$localappdata') + else: + # Assume posix, or old Windows + result = os.path.expanduser('~') + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if os.path.isdir(result): + usable = os.access(result, os.W_OK) + if not usable: + logger.warning('Directory exists but is not writable: %s', result) + else: + try: + os.makedirs(result) + usable = True + except OSError: + logger.warning('Unable to create %s', result, exc_info=True) + usable = False + if not usable: + result = tempfile.mkdtemp() + logger.warning('Default location unusable, using %s', result) + return os.path.join(result, suffix) + + +def path_to_cache_dir(path): + """ + Convert an absolute path to a directory name for use in a cache. + + The algorithm used is: + + #. On Windows, any ``':'`` in the drive is replaced with ``'---'``. + #. Any occurrence of ``os.sep`` is replaced with ``'--'``. + #. ``'.cache'`` is appended. + """ + d, p = os.path.splitdrive(os.path.abspath(path)) + if d: + d = d.replace(':', '---') + p = p.replace(os.sep, '--') + return d + p + '.cache' + + +def ensure_slash(s): + if not s.endswith('/'): + return s + '/' + return s + + +def parse_credentials(netloc): + username = password = None + if '@' in netloc: + prefix, netloc = netloc.rsplit('@', 1) + if ':' not in prefix: + username = prefix + else: + username, password = prefix.split(':', 1) + if username: + username = unquote(username) + if password: + password = unquote(password) + return username, password, netloc + + +def get_process_umask(): + result = os.umask(0o22) + os.umask(result) + return result + +def is_string_sequence(seq): + result = True + i = None + for i, s in enumerate(seq): + if not isinstance(s, string_types): + result = False + break + assert i is not None + return result + +PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-' + '([a-z0-9_.+-]+)', re.I) +PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)') + + +def split_filename(filename, project_name=None): + """ + Extract name, version, python version from a filename (no extension) + + Return name, version, pyver or None + """ + result = None + pyver = None + filename = unquote(filename).replace(' ', '-') + m = PYTHON_VERSION.search(filename) + if m: + pyver = m.group(1) + filename = filename[:m.start()] + if project_name and len(filename) > len(project_name) + 1: + m = re.match(re.escape(project_name) + r'\b', filename) + if m: + n = m.end() + result = filename[:n], filename[n + 1:], pyver + if result is None: + m = PROJECT_NAME_AND_VERSION.match(filename) + if m: + result = m.group(1), m.group(3), pyver + return result + +# Allow spaces in name because of legacy dists like "Twisted Core" +NAME_VERSION_RE = re.compile(r'(?P[\w .-]+)\s*' + r'\(\s*(?P[^\s)]+)\)$') + +def parse_name_and_version(p): + """ + A utility method used to get name and version from a string. + + From e.g. a Provides-Dist value. + + :param p: A value in a form 'foo (1.0)' + :return: The name and version as a tuple. + """ + m = NAME_VERSION_RE.match(p) + if not m: + raise DistlibException('Ill-formed name/version string: \'%s\'' % p) + d = m.groupdict() + return d['name'].strip().lower(), d['ver'] + +def get_extras(requested, available): + result = set() + requested = set(requested or []) + available = set(available or []) + if '*' in requested: + requested.remove('*') + result |= available + for r in requested: + if r == '-': + result.add(r) + elif r.startswith('-'): + unwanted = r[1:] + if unwanted not in available: + logger.warning('undeclared extra: %s' % unwanted) + if unwanted in result: + result.remove(unwanted) + else: + if r not in available: + logger.warning('undeclared extra: %s' % r) + result.add(r) + return result +# +# Extended metadata functionality +# + +def _get_external_data(url): + result = {} + try: + # urlopen might fail if it runs into redirections, + # because of Python issue #13696. Fixed in locators + # using a custom redirect handler. + resp = urlopen(url) + headers = resp.info() + ct = headers.get('Content-Type') + if not ct.startswith('application/json'): + logger.debug('Unexpected response for JSON request: %s', ct) + else: + reader = codecs.getreader('utf-8')(resp) + #data = reader.read().decode('utf-8') + #result = json.loads(data) + result = json.load(reader) + except Exception as e: + logger.exception('Failed to get external data for %s: %s', url, e) + return result + +_external_data_base_url = 'https://www.red-dove.com/pypi/projects/' + +def get_project_data(name): + url = '%s/%s/project.json' % (name[0].upper(), name) + url = urljoin(_external_data_base_url, url) + result = _get_external_data(url) + return result + +def get_package_data(name, version): + url = '%s/%s/package-%s.json' % (name[0].upper(), name, version) + url = urljoin(_external_data_base_url, url) + return _get_external_data(url) + + +class Cache(object): + """ + A class implementing a cache for resources that need to live in the file system + e.g. shared libraries. This class was moved from resources to here because it + could be used by other modules, e.g. the wheel module. + """ + + def __init__(self, base): + """ + Initialise an instance. + + :param base: The base directory where the cache should be located. + """ + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if not os.path.isdir(base): # pragma: no cover + os.makedirs(base) + if (os.stat(base).st_mode & 0o77) != 0: + logger.warning('Directory \'%s\' is not private', base) + self.base = os.path.abspath(os.path.normpath(base)) + + def prefix_to_dir(self, prefix): + """ + Converts a resource prefix to a directory name in the cache. + """ + return path_to_cache_dir(prefix) + + def clear(self): + """ + Clear the cache. + """ + not_removed = [] + for fn in os.listdir(self.base): + fn = os.path.join(self.base, fn) + try: + if os.path.islink(fn) or os.path.isfile(fn): + os.remove(fn) + elif os.path.isdir(fn): + shutil.rmtree(fn) + except Exception: + not_removed.append(fn) + return not_removed + + +class EventMixin(object): + """ + A very simple publish/subscribe system. + """ + def __init__(self): + self._subscribers = {} + + def add(self, event, subscriber, append=True): + """ + Add a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be added (and called when the + event is published). + :param append: Whether to append or prepend the subscriber to an + existing subscriber list for the event. + """ + subs = self._subscribers + if event not in subs: + subs[event] = deque([subscriber]) + else: + sq = subs[event] + if append: + sq.append(subscriber) + else: + sq.appendleft(subscriber) + + def remove(self, event, subscriber): + """ + Remove a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be removed. + """ + subs = self._subscribers + if event not in subs: + raise ValueError('No subscribers: %r' % event) + subs[event].remove(subscriber) + + def get_subscribers(self, event): + """ + Return an iterator for the subscribers for an event. + :param event: The event to return subscribers for. + """ + return iter(self._subscribers.get(event, ())) + + def publish(self, event, *args, **kwargs): + """ + Publish a event and return a list of values returned by its + subscribers. + + :param event: The event to publish. + :param args: The positional arguments to pass to the event's + subscribers. + :param kwargs: The keyword arguments to pass to the event's + subscribers. + """ + result = [] + for subscriber in self.get_subscribers(event): + try: + value = subscriber(event, *args, **kwargs) + except Exception: + logger.exception('Exception during event publication') + value = None + result.append(value) + logger.debug('publish %s: args = %s, kwargs = %s, result = %s', + event, args, kwargs, result) + return result + +# +# Simple sequencing +# +class Sequencer(object): + def __init__(self): + self._preds = {} + self._succs = {} + self._nodes = set() # nodes with no preds/succs + + def add_node(self, node): + self._nodes.add(node) + + def remove_node(self, node, edges=False): + if node in self._nodes: + self._nodes.remove(node) + if edges: + for p in set(self._preds.get(node, ())): + self.remove(p, node) + for s in set(self._succs.get(node, ())): + self.remove(node, s) + # Remove empties + for k, v in list(self._preds.items()): + if not v: + del self._preds[k] + for k, v in list(self._succs.items()): + if not v: + del self._succs[k] + + def add(self, pred, succ): + assert pred != succ + self._preds.setdefault(succ, set()).add(pred) + self._succs.setdefault(pred, set()).add(succ) + + def remove(self, pred, succ): + assert pred != succ + try: + preds = self._preds[succ] + succs = self._succs[pred] + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of anything' % succ) + try: + preds.remove(pred) + succs.remove(succ) + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of %r' % (succ, pred)) + + def is_step(self, step): + return (step in self._preds or step in self._succs or + step in self._nodes) + + def get_steps(self, final): + if not self.is_step(final): + raise ValueError('Unknown: %r' % final) + result = [] + todo = [] + seen = set() + todo.append(final) + while todo: + step = todo.pop(0) + if step in seen: + # if a step was already seen, + # move it to the end (so it will appear earlier + # when reversed on return) ... but not for the + # final step, as that would be confusing for + # users + if step != final: + result.remove(step) + result.append(step) + else: + seen.add(step) + result.append(step) + preds = self._preds.get(step, ()) + todo.extend(preds) + return reversed(result) + + @property + def strong_connections(self): + #http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm + index_counter = [0] + stack = [] + lowlinks = {} + index = {} + result = [] + + graph = self._succs + + def strongconnect(node): + # set the depth index for this node to the smallest unused index + index[node] = index_counter[0] + lowlinks[node] = index_counter[0] + index_counter[0] += 1 + stack.append(node) + + # Consider successors + try: + successors = graph[node] + except Exception: + successors = [] + for successor in successors: + if successor not in lowlinks: + # Successor has not yet been visited + strongconnect(successor) + lowlinks[node] = min(lowlinks[node],lowlinks[successor]) + elif successor in stack: + # the successor is in the stack and hence in the current + # strongly connected component (SCC) + lowlinks[node] = min(lowlinks[node],index[successor]) + + # If `node` is a root node, pop the stack and generate an SCC + if lowlinks[node] == index[node]: + connected_component = [] + + while True: + successor = stack.pop() + connected_component.append(successor) + if successor == node: break + component = tuple(connected_component) + # storing the result + result.append(component) + + for node in graph: + if node not in lowlinks: + strongconnect(node) + + return result + + @property + def dot(self): + result = ['digraph G {'] + for succ in self._preds: + preds = self._preds[succ] + for pred in preds: + result.append(' %s -> %s;' % (pred, succ)) + for node in self._nodes: + result.append(' %s;' % node) + result.append('}') + return '\n'.join(result) + +# +# Unarchiving functionality for zip, tar, tgz, tbz, whl +# + +ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', + '.tgz', '.tbz', '.whl') + +def unarchive(archive_filename, dest_dir, format=None, check=True): + + def check_path(path): + if not isinstance(path, text_type): + path = path.decode('utf-8') + p = os.path.abspath(os.path.join(dest_dir, path)) + if not p.startswith(dest_dir) or p[plen] != os.sep: + raise ValueError('path outside destination: %r' % p) + + dest_dir = os.path.abspath(dest_dir) + plen = len(dest_dir) + archive = None + if format is None: + if archive_filename.endswith(('.zip', '.whl')): + format = 'zip' + elif archive_filename.endswith(('.tar.gz', '.tgz')): + format = 'tgz' + mode = 'r:gz' + elif archive_filename.endswith(('.tar.bz2', '.tbz')): + format = 'tbz' + mode = 'r:bz2' + elif archive_filename.endswith('.tar'): + format = 'tar' + mode = 'r' + else: # pragma: no cover + raise ValueError('Unknown format for %r' % archive_filename) + try: + if format == 'zip': + archive = ZipFile(archive_filename, 'r') + if check: + names = archive.namelist() + for name in names: + check_path(name) + else: + archive = tarfile.open(archive_filename, mode) + if check: + names = archive.getnames() + for name in names: + check_path(name) + if format != 'zip' and sys.version_info[0] < 3: + # See Python issue 17153. If the dest path contains Unicode, + # tarfile extraction fails on Python 2.x if a member path name + # contains non-ASCII characters - it leads to an implicit + # bytes -> unicode conversion using ASCII to decode. + for tarinfo in archive.getmembers(): + if not isinstance(tarinfo.name, text_type): + tarinfo.name = tarinfo.name.decode('utf-8') + archive.extractall(dest_dir) + + finally: + if archive: + archive.close() + + +def zip_dir(directory): + """zip a directory tree into a BytesIO object""" + result = io.BytesIO() + dlen = len(directory) + with ZipFile(result, "w") as zf: + for root, dirs, files in os.walk(directory): + for name in files: + full = os.path.join(root, name) + rel = root[dlen:] + dest = os.path.join(rel, name) + zf.write(full, dest) + return result + +# +# Simple progress bar +# + +UNITS = ('', 'K', 'M', 'G','T','P') + + +class Progress(object): + unknown = 'UNKNOWN' + + def __init__(self, minval=0, maxval=100): + assert maxval is None or maxval >= minval + self.min = self.cur = minval + self.max = maxval + self.started = None + self.elapsed = 0 + self.done = False + + def update(self, curval): + assert self.min <= curval + assert self.max is None or curval <= self.max + self.cur = curval + now = time.time() + if self.started is None: + self.started = now + else: + self.elapsed = now - self.started + + def increment(self, incr): + assert incr >= 0 + self.update(self.cur + incr) + + def start(self): + self.update(self.min) + return self + + def stop(self): + if self.max is not None: + self.update(self.max) + self.done = True + + @property + def maximum(self): + return self.unknown if self.max is None else self.max + + @property + def percentage(self): + if self.done: + result = '100 %' + elif self.max is None: + result = ' ?? %' + else: + v = 100.0 * (self.cur - self.min) / (self.max - self.min) + result = '%3d %%' % v + return result + + def format_duration(self, duration): + if (duration <= 0) and self.max is None or self.cur == self.min: + result = '??:??:??' + #elif duration < 1: + # result = '--:--:--' + else: + result = time.strftime('%H:%M:%S', time.gmtime(duration)) + return result + + @property + def ETA(self): + if self.done: + prefix = 'Done' + t = self.elapsed + #import pdb; pdb.set_trace() + else: + prefix = 'ETA ' + if self.max is None: + t = -1 + elif self.elapsed == 0 or (self.cur == self.min): + t = 0 + else: + #import pdb; pdb.set_trace() + t = float(self.max - self.min) + t /= self.cur - self.min + t = (t - 1) * self.elapsed + return '%s: %s' % (prefix, self.format_duration(t)) + + @property + def speed(self): + if self.elapsed == 0: + result = 0.0 + else: + result = (self.cur - self.min) / self.elapsed + for unit in UNITS: + if result < 1000: + break + result /= 1000.0 + return '%d %sB/s' % (result, unit) + +# +# Glob functionality +# + +RICH_GLOB = re.compile(r'\{([^}]*)\}') +_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') +_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') + + +def iglob(path_glob): + """Extended globbing function that supports ** and {opt1,opt2,opt3}.""" + if _CHECK_RECURSIVE_GLOB.search(path_glob): + msg = """invalid glob %r: recursive glob "**" must be used alone""" + raise ValueError(msg % path_glob) + if _CHECK_MISMATCH_SET.search(path_glob): + msg = """invalid glob %r: mismatching set marker '{' or '}'""" + raise ValueError(msg % path_glob) + return _iglob(path_glob) + + +def _iglob(path_glob): + rich_path_glob = RICH_GLOB.split(path_glob, 1) + if len(rich_path_glob) > 1: + assert len(rich_path_glob) == 3, rich_path_glob + prefix, set, suffix = rich_path_glob + for item in set.split(','): + for path in _iglob(''.join((prefix, item, suffix))): + yield path + else: + if '**' not in path_glob: + for item in std_iglob(path_glob): + yield item + else: + prefix, radical = path_glob.split('**', 1) + if prefix == '': + prefix = '.' + if radical == '': + radical = '*' + else: + # we support both + radical = radical.lstrip('/') + radical = radical.lstrip('\\') + for path, dir, files in os.walk(prefix): + path = os.path.normpath(path) + for fn in _iglob(os.path.join(path, radical)): + yield fn + +if ssl: + from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname, + CertificateError) + + +# +# HTTPSConnection which verifies certificates/matches domains +# + + class HTTPSConnection(httplib.HTTPSConnection): + ca_certs = None # set this to the path to the certs file (.pem) + check_domain = True # only used if ca_certs is not None + + # noinspection PyPropertyAccess + def connect(self): + sock = socket.create_connection((self.host, self.port), self.timeout) + if getattr(self, '_tunnel_host', False): + self.sock = sock + self._tunnel() + + if not hasattr(ssl, 'SSLContext'): + # For 2.x + if self.ca_certs: + cert_reqs = ssl.CERT_REQUIRED + else: + cert_reqs = ssl.CERT_NONE + self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, + cert_reqs=cert_reqs, + ssl_version=ssl.PROTOCOL_SSLv23, + ca_certs=self.ca_certs) + else: # pragma: no cover + context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + if hasattr(ssl, 'OP_NO_SSLv2'): + context.options |= ssl.OP_NO_SSLv2 + if self.cert_file: + context.load_cert_chain(self.cert_file, self.key_file) + kwargs = {} + if self.ca_certs: + context.verify_mode = ssl.CERT_REQUIRED + context.load_verify_locations(cafile=self.ca_certs) + if getattr(ssl, 'HAS_SNI', False): + kwargs['server_hostname'] = self.host + self.sock = context.wrap_socket(sock, **kwargs) + if self.ca_certs and self.check_domain: + try: + match_hostname(self.sock.getpeercert(), self.host) + logger.debug('Host verified: %s', self.host) + except CertificateError: # pragma: no cover + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + raise + + class HTTPSHandler(BaseHTTPSHandler): + def __init__(self, ca_certs, check_domain=True): + BaseHTTPSHandler.__init__(self) + self.ca_certs = ca_certs + self.check_domain = check_domain + + def _conn_maker(self, *args, **kwargs): + """ + This is called to create a connection instance. Normally you'd + pass a connection class to do_open, but it doesn't actually check for + a class, and just expects a callable. As long as we behave just as a + constructor would have, we should be OK. If it ever changes so that + we *must* pass a class, we'll create an UnsafeHTTPSConnection class + which just sets check_domain to False in the class definition, and + choose which one to pass to do_open. + """ + result = HTTPSConnection(*args, **kwargs) + if self.ca_certs: + result.ca_certs = self.ca_certs + result.check_domain = self.check_domain + return result + + def https_open(self, req): + try: + return self.do_open(self._conn_maker, req) + except URLError as e: + if 'certificate verify failed' in str(e.reason): + raise CertificateError('Unable to verify server certificate ' + 'for %s' % req.host) + else: + raise + + # + # To prevent against mixing HTTP traffic with HTTPS (examples: A Man-In-The- + # Middle proxy using HTTP listens on port 443, or an index mistakenly serves + # HTML containing a http://xyz link when it should be https://xyz), + # you can use the following handler class, which does not allow HTTP traffic. + # + # It works by inheriting from HTTPHandler - so build_opener won't add a + # handler for HTTP itself. + # + class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler): + def http_open(self, req): + raise URLError('Unexpected HTTP request on what should be a secure ' + 'connection: %s' % req) + +# +# XML-RPC with timeouts +# + +_ver_info = sys.version_info[:2] + +if _ver_info == (2, 6): + class HTTP(httplib.HTTP): + def __init__(self, host='', port=None, **kwargs): + if port == 0: # 0 means use port 0, not the default port + port = None + self._setup(self._connection_class(host, port, **kwargs)) + + + if ssl: + class HTTPS(httplib.HTTPS): + def __init__(self, host='', port=None, **kwargs): + if port == 0: # 0 means use port 0, not the default port + port = None + self._setup(self._connection_class(host, port, **kwargs)) + + +class Transport(xmlrpclib.Transport): + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.Transport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, x509 = self.get_host_info(host) + if _ver_info == (2, 6): + result = HTTP(h, timeout=self.timeout) + else: + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPConnection(h) + result = self._connection[1] + return result + +if ssl: + class SafeTransport(xmlrpclib.SafeTransport): + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.SafeTransport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, kwargs = self.get_host_info(host) + if not kwargs: + kwargs = {} + kwargs['timeout'] = self.timeout + if _ver_info == (2, 6): + result = HTTPS(host, None, **kwargs) + else: + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPSConnection(h, None, + **kwargs) + result = self._connection[1] + return result + + +class ServerProxy(xmlrpclib.ServerProxy): + def __init__(self, uri, **kwargs): + self.timeout = timeout = kwargs.pop('timeout', None) + # The above classes only come into play if a timeout + # is specified + if timeout is not None: + scheme, _ = splittype(uri) + use_datetime = kwargs.get('use_datetime', 0) + if scheme == 'https': + tcls = SafeTransport + else: + tcls = Transport + kwargs['transport'] = t = tcls(timeout, use_datetime=use_datetime) + self.transport = t + xmlrpclib.ServerProxy.__init__(self, uri, **kwargs) + +# +# CSV functionality. This is provided because on 2.x, the csv module can't +# handle Unicode. However, we need to deal with Unicode in e.g. RECORD files. +# + +def _csv_open(fn, mode, **kwargs): + if sys.version_info[0] < 3: + mode += 'b' + else: + kwargs['newline'] = '' + # Python 3 determines encoding from locale. Force 'utf-8' + # file encoding to match other forced utf-8 encoding + kwargs['encoding'] = 'utf-8' + return open(fn, mode, **kwargs) + + +class CSVBase(object): + defaults = { + 'delimiter': str(','), # The strs are used because we need native + 'quotechar': str('"'), # str in the csv API (2.x won't take + 'lineterminator': str('\n') # Unicode) + } + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.stream.close() + + +class CSVReader(CSVBase): + def __init__(self, **kwargs): + if 'stream' in kwargs: + stream = kwargs['stream'] + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + self.stream = stream + else: + self.stream = _csv_open(kwargs['path'], 'r') + self.reader = csv.reader(self.stream, **self.defaults) + + def __iter__(self): + return self + + def next(self): + result = next(self.reader) + if sys.version_info[0] < 3: + for i, item in enumerate(result): + if not isinstance(item, text_type): + result[i] = item.decode('utf-8') + return result + + __next__ = next + +class CSVWriter(CSVBase): + def __init__(self, fn, **kwargs): + self.stream = _csv_open(fn, 'w') + self.writer = csv.writer(self.stream, **self.defaults) + + def writerow(self, row): + if sys.version_info[0] < 3: + r = [] + for item in row: + if isinstance(item, text_type): + item = item.encode('utf-8') + r.append(item) + row = r + self.writer.writerow(row) + +# +# Configurator functionality +# + +class Configurator(BaseConfigurator): + + value_converters = dict(BaseConfigurator.value_converters) + value_converters['inc'] = 'inc_convert' + + def __init__(self, config, base=None): + super(Configurator, self).__init__(config) + self.base = base or os.getcwd() + + def configure_custom(self, config): + def convert(o): + if isinstance(o, (list, tuple)): + result = type(o)([convert(i) for i in o]) + elif isinstance(o, dict): + if '()' in o: + result = self.configure_custom(o) + else: + result = {} + for k in o: + result[k] = convert(o[k]) + else: + result = self.convert(o) + return result + + c = config.pop('()') + if not callable(c): + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + args = config.pop('[]', ()) + if args: + args = tuple([convert(o) for o in args]) + items = [(k, convert(config[k])) for k in config if valid_ident(k)] + kwargs = dict(items) + result = c(*args, **kwargs) + if props: + for n, v in props.items(): + setattr(result, n, convert(v)) + return result + + def __getitem__(self, key): + result = self.config[key] + if isinstance(result, dict) and '()' in result: + self.config[key] = result = self.configure_custom(result) + return result + + def inc_convert(self, value): + """Default converter for the inc:// protocol.""" + if not os.path.isabs(value): + value = os.path.join(self.base, value) + with codecs.open(value, 'r', encoding='utf-8') as f: + result = json.load(f) + return result + + +class SubprocessMixin(object): + """ + Mixin for running subprocesses and capturing their output + """ + def __init__(self, verbose=False, progress=None): + self.verbose = verbose + self.progress = progress + + def reader(self, stream, context): + """ + Read lines from a subprocess' output stream and either pass to a progress + callable (if specified) or write progress information to sys.stderr. + """ + progress = self.progress + verbose = self.verbose + while True: + s = stream.readline() + if not s: + break + if progress is not None: + progress(s, context) + else: + if not verbose: + sys.stderr.write('.') + else: + sys.stderr.write(s.decode('utf-8')) + sys.stderr.flush() + stream.close() + + def run_command(self, cmd, **kwargs): + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, **kwargs) + t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout')) + t1.start() + t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr')) + t2.start() + p.wait() + t1.join() + t2.join() + if self.progress is not None: + self.progress('done.', 'main') + elif self.verbose: + sys.stderr.write('done.\n') + return p + + +def normalize_name(name): + """Normalize a python package name a la PEP 503""" + # https://www.python.org/dev/peps/pep-0503/#normalized-names + return re.sub('[-_.]+', '-', name).lower() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/util.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/util.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8e70410834b8f1d4b395bd70d00c7384d780316 GIT binary patch literal 60671 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𝔫1>5xE^NOkRTWNhqZV>?x;O9ZWFpy8GKb~6- z#%ZLu{|$@`+_zO;H@6R%)}*ZHcSt3C3qf!J=wk6nAsV=J`0NKw7Jd*uBM%n03F8i* zy|=KIUqXCx4gs|(UeBzIUku)IWe^M3n8&7bk|k`e=LS%T;a znbM&~47)jLys17_eI?g(6_Y@9_v3^g%!M6#{veVJs>v0u3{&B!1Y={n74G|Z)3g7^ zFi7PvXATWS_#UH2-dh_Q(H1h`yEPUXrUdSQS^V9?|2qF8+*QBKtL�ysZEmSFv0C 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/version.py b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/version.py new file mode 100644 index 0000000..3eebe18 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/version.py @@ -0,0 +1,736 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Implementation of a flexible versioning scheme providing support for PEP-440, +setuptools-compatible and semantic versioning. +""" + +import logging +import re + +from .compat import string_types +from .util import parse_requirement + +__all__ = ['NormalizedVersion', 'NormalizedMatcher', + 'LegacyVersion', 'LegacyMatcher', + 'SemanticVersion', 'SemanticMatcher', + 'UnsupportedVersionError', 'get_scheme'] + +logger = logging.getLogger(__name__) + + +class UnsupportedVersionError(ValueError): + """This is an unsupported version.""" + pass + + +class Version(object): + def __init__(self, s): + self._string = s = s.strip() + self._parts = parts = self.parse(s) + assert isinstance(parts, tuple) + assert len(parts) > 0 + + def parse(self, s): + raise NotImplementedError('please implement in a subclass') + + def _check_compatible(self, other): + if type(self) != type(other): + raise TypeError('cannot compare %r and %r' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + def __lt__(self, other): + self._check_compatible(other) + return self._parts < other._parts + + def __gt__(self, other): + return not (self.__lt__(other) or self.__eq__(other)) + + def __le__(self, other): + return self.__lt__(other) or self.__eq__(other) + + def __ge__(self, other): + return self.__gt__(other) or self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self._parts) + + def __repr__(self): + return "%s('%s')" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + @property + def is_prerelease(self): + raise NotImplementedError('Please implement in subclasses.') + + +class Matcher(object): + version_class = None + + # value is either a callable or the name of a method + _operators = { + '<': lambda v, c, p: v < c, + '>': lambda v, c, p: v > c, + '<=': lambda v, c, p: v == c or v < c, + '>=': lambda v, c, p: v == c or v > c, + '==': lambda v, c, p: v == c, + '===': lambda v, c, p: v == c, + # by default, compatible => >=. + '~=': lambda v, c, p: v == c or v > c, + '!=': lambda v, c, p: v != c, + } + + # this is a method only to support alternative implementations + # via overriding + def parse_requirement(self, s): + return parse_requirement(s) + + def __init__(self, s): + if self.version_class is None: + raise ValueError('Please specify a version class') + self._string = s = s.strip() + r = self.parse_requirement(s) + if not r: + raise ValueError('Not valid: %r' % s) + self.name = r.name + self.key = self.name.lower() # for case-insensitive comparisons + clist = [] + if r.constraints: + # import pdb; pdb.set_trace() + for op, s in r.constraints: + if s.endswith('.*'): + if op not in ('==', '!='): + raise ValueError('\'.*\' not allowed for ' + '%r constraints' % op) + # Could be a partial version (e.g. for '2.*') which + # won't parse as a version, so keep it as a string + vn, prefix = s[:-2], True + # Just to check that vn is a valid version + self.version_class(vn) + else: + # Should parse as a version, so we can create an + # instance for the comparison + vn, prefix = self.version_class(s), False + clist.append((op, vn, prefix)) + self._parts = tuple(clist) + + def match(self, version): + """ + Check if the provided version matches the constraints. + + :param version: The version to match against this instance. + :type version: String or :class:`Version` instance. + """ + if isinstance(version, string_types): + version = self.version_class(version) + for operator, constraint, prefix in self._parts: + f = self._operators.get(operator) + if isinstance(f, string_types): + f = getattr(self, f) + if not f: + msg = ('%r not implemented ' + 'for %s' % (operator, self.__class__.__name__)) + raise NotImplementedError(msg) + if not f(version, constraint, prefix): + return False + return True + + @property + def exact_version(self): + result = None + if len(self._parts) == 1 and self._parts[0][0] in ('==', '==='): + result = self._parts[0][1] + return result + + def _check_compatible(self, other): + if type(self) != type(other) or self.name != other.name: + raise TypeError('cannot compare %s and %s' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self.key == other.key and self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self.key) + hash(self._parts) + + def __repr__(self): + return "%s(%r)" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + +PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|b|c|rc)(\d+))?' + r'(\.(post)(\d+))?(\.(dev)(\d+))?' + r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$') + + +def _pep_440_key(s): + s = s.strip() + m = PEP440_VERSION_RE.match(s) + if not m: + raise UnsupportedVersionError('Not a valid version: %s' % s) + groups = m.groups() + nums = tuple(int(v) for v in groups[1].split('.')) + while len(nums) > 1 and nums[-1] == 0: + nums = nums[:-1] + + if not groups[0]: + epoch = 0 + else: + epoch = int(groups[0]) + pre = groups[4:6] + post = groups[7:9] + dev = groups[10:12] + local = groups[13] + if pre == (None, None): + pre = () + else: + pre = pre[0], int(pre[1]) + if post == (None, None): + post = () + else: + post = post[0], int(post[1]) + if dev == (None, None): + dev = () + else: + dev = dev[0], int(dev[1]) + if local is None: + local = () + else: + parts = [] + for part in local.split('.'): + # to ensure that numeric compares as > lexicographic, avoid + # comparing them directly, but encode a tuple which ensures + # correct sorting + if part.isdigit(): + part = (1, int(part)) + else: + part = (0, part) + parts.append(part) + local = tuple(parts) + if not pre: + # either before pre-release, or final release and after + if not post and dev: + # before pre-release + pre = ('a', -1) # to sort before a0 + else: + pre = ('z',) # to sort after all pre-releases + # now look at the state of post and dev. + if not post: + post = ('_',) # sort before 'a' + if not dev: + dev = ('final',) + + #print('%s -> %s' % (s, m.groups())) + return epoch, nums, pre, post, dev, local + + +_normalized_key = _pep_440_key + + +class NormalizedVersion(Version): + """A rational version. + + Good: + 1.2 # equivalent to "1.2.0" + 1.2.0 + 1.2a1 + 1.2.3a2 + 1.2.3b1 + 1.2.3c1 + 1.2.3.4 + TODO: fill this out + + Bad: + 1 # minimum two numbers + 1.2a # release level must have a release serial + 1.2.3b + """ + def parse(self, s): + result = _normalized_key(s) + # _normalized_key loses trailing zeroes in the release + # clause, since that's needed to ensure that X.Y == X.Y.0 == X.Y.0.0 + # However, PEP 440 prefix matching needs it: for example, + # (~= 1.4.5.0) matches differently to (~= 1.4.5.0.0). + m = PEP440_VERSION_RE.match(s) # must succeed + groups = m.groups() + self._release_clause = tuple(int(v) for v in groups[1].split('.')) + return result + + PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev']) + + @property + def is_prerelease(self): + return any(t[0] in self.PREREL_TAGS for t in self._parts if t) + + +def _match_prefix(x, y): + x = str(x) + y = str(y) + if x == y: + return True + if not x.startswith(y): + return False + n = len(y) + return x[n] == '.' + + +class NormalizedMatcher(Matcher): + version_class = NormalizedVersion + + # value is either a callable or the name of a method + _operators = { + '~=': '_match_compatible', + '<': '_match_lt', + '>': '_match_gt', + '<=': '_match_le', + '>=': '_match_ge', + '==': '_match_eq', + '===': '_match_arbitrary', + '!=': '_match_ne', + } + + def _adjust_local(self, version, constraint, prefix): + if prefix: + strip_local = '+' not in constraint and version._parts[-1] + else: + # both constraint and version are + # NormalizedVersion instances. + # If constraint does not have a local component, + # ensure the version doesn't, either. + strip_local = not constraint._parts[-1] and version._parts[-1] + if strip_local: + s = version._string.split('+', 1)[0] + version = self.version_class(s) + return version, constraint + + def _match_lt(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version >= constraint: + return False + release_clause = constraint._release_clause + pfx = '.'.join([str(i) for i in release_clause]) + return not _match_prefix(version, pfx) + + def _match_gt(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version <= constraint: + return False + release_clause = constraint._release_clause + pfx = '.'.join([str(i) for i in release_clause]) + return not _match_prefix(version, pfx) + + def _match_le(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + return version <= constraint + + def _match_ge(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + return version >= constraint + + def _match_eq(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if not prefix: + result = (version == constraint) + else: + result = _match_prefix(version, constraint) + return result + + def _match_arbitrary(self, version, constraint, prefix): + return str(version) == str(constraint) + + def _match_ne(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if not prefix: + result = (version != constraint) + else: + result = not _match_prefix(version, constraint) + return result + + def _match_compatible(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version == constraint: + return True + if version < constraint: + return False +# if not prefix: +# return True + release_clause = constraint._release_clause + if len(release_clause) > 1: + release_clause = release_clause[:-1] + pfx = '.'.join([str(i) for i in release_clause]) + return _match_prefix(version, pfx) + +_REPLACEMENTS = ( + (re.compile('[.+-]$'), ''), # remove trailing puncts + (re.compile(r'^[.](\d)'), r'0.\1'), # .N -> 0.N at start + (re.compile('^[.-]'), ''), # remove leading puncts + (re.compile(r'^\((.*)\)$'), r'\1'), # remove parentheses + (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\b(alfa|apha)\b'), 'alpha'), # misspelt alpha + (re.compile(r'\b(pre-alpha|prealpha)\b'), + 'pre.alpha'), # standardise + (re.compile(r'\(beta\)$'), 'beta'), # remove parentheses +) + +_SUFFIX_REPLACEMENTS = ( + (re.compile('^[:~._+-]+'), ''), # remove leading puncts + (re.compile('[,*")([\\]]'), ''), # remove unwanted chars + (re.compile('[~:+_ -]'), '.'), # replace illegal chars + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\.$'), ''), # trailing '.' +) + +_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)') + + +def _suggest_semantic_version(s): + """ + Try to suggest a semantic form for a version for which + _suggest_normalized_version couldn't come up with anything. + """ + result = s.strip().lower() + for pat, repl in _REPLACEMENTS: + result = pat.sub(repl, result) + if not result: + result = '0.0.0' + + # Now look for numeric prefix, and separate it out from + # the rest. + #import pdb; pdb.set_trace() + m = _NUMERIC_PREFIX.match(result) + if not m: + prefix = '0.0.0' + suffix = result + else: + prefix = m.groups()[0].split('.') + prefix = [int(i) for i in prefix] + while len(prefix) < 3: + prefix.append(0) + if len(prefix) == 3: + suffix = result[m.end():] + else: + suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():] + prefix = prefix[:3] + prefix = '.'.join([str(i) for i in prefix]) + suffix = suffix.strip() + if suffix: + #import pdb; pdb.set_trace() + # massage the suffix. + for pat, repl in _SUFFIX_REPLACEMENTS: + suffix = pat.sub(repl, suffix) + + if not suffix: + result = prefix + else: + sep = '-' if 'dev' in suffix else '+' + result = prefix + sep + suffix + if not is_semver(result): + result = None + return result + + +def _suggest_normalized_version(s): + """Suggest a normalized version close to the given version string. + + If you have a version string that isn't rational (i.e. NormalizedVersion + doesn't like it) then you might be able to get an equivalent (or close) + rational version from this function. + + This does a number of simple normalizations to the given string, based + on observation of versions currently in use on PyPI. Given a dump of + those version during PyCon 2009, 4287 of them: + - 2312 (53.93%) match NormalizedVersion without change + with the automatic suggestion + - 3474 (81.04%) match when using this suggestion method + + @param s {str} An irrational version string. + @returns A rational version string, or None, if couldn't determine one. + """ + try: + _normalized_key(s) + return s # already rational + except UnsupportedVersionError: + pass + + rs = s.lower() + + # part of this could use maketrans + for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'), + ('beta', 'b'), ('rc', 'c'), ('-final', ''), + ('-pre', 'c'), + ('-release', ''), ('.release', ''), ('-stable', ''), + ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''), + ('final', '')): + rs = rs.replace(orig, repl) + + # if something ends with dev or pre, we add a 0 + rs = re.sub(r"pre$", r"pre0", rs) + rs = re.sub(r"dev$", r"dev0", rs) + + # if we have something like "b-2" or "a.2" at the end of the + # version, that is probably beta, alpha, etc + # let's remove the dash or dot + rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs) + + # 1.0-dev-r371 -> 1.0.dev371 + # 0.1-dev-r79 -> 0.1.dev79 + rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs) + + # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1 + rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs) + + # Clean: v0.3, v1.0 + if rs.startswith('v'): + rs = rs[1:] + + # Clean leading '0's on numbers. + #TODO: unintended side-effect on, e.g., "2003.05.09" + # PyPI stats: 77 (~2%) better + rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs) + + # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers + # zero. + # PyPI stats: 245 (7.56%) better + rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs) + + # the 'dev-rNNN' tag is a dev tag + rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs) + + # clean the - when used as a pre delimiter + rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs) + + # a terminal "dev" or "devel" can be changed into ".dev0" + rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs) + + # a terminal "dev" can be changed into ".dev0" + rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs) + + # a terminal "final" or "stable" can be removed + rs = re.sub(r"(final|stable)$", "", rs) + + # The 'r' and the '-' tags are post release tags + # 0.4a1.r10 -> 0.4a1.post10 + # 0.9.33-17222 -> 0.9.33.post17222 + # 0.9.33-r17222 -> 0.9.33.post17222 + rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) + + # Clean 'r' instead of 'dev' usage: + # 0.9.33+r17222 -> 0.9.33.dev17222 + # 1.0dev123 -> 1.0.dev123 + # 1.0.git123 -> 1.0.dev123 + # 1.0.bzr123 -> 1.0.dev123 + # 0.1a0dev.123 -> 0.1a0.dev123 + # PyPI stats: ~150 (~4%) better + rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs) + + # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage: + # 0.2.pre1 -> 0.2c1 + # 0.2-c1 -> 0.2c1 + # 1.0preview123 -> 1.0c123 + # PyPI stats: ~21 (0.62%) better + rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs) + + # Tcl/Tk uses "px" for their post release markers + rs = re.sub(r"p(\d+)$", r".post\1", rs) + + try: + _normalized_key(rs) + except UnsupportedVersionError: + rs = None + return rs + +# +# Legacy version processing (distribute-compatible) +# + +_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I) +_VERSION_REPLACE = { + 'pre': 'c', + 'preview': 'c', + '-': 'final-', + 'rc': 'c', + 'dev': '@', + '': None, + '.': None, +} + + +def _legacy_key(s): + def get_parts(s): + result = [] + for p in _VERSION_PART.split(s.lower()): + p = _VERSION_REPLACE.get(p, p) + if p: + if '0' <= p[:1] <= '9': + p = p.zfill(8) + else: + p = '*' + p + result.append(p) + result.append('*final') + return result + + result = [] + for p in get_parts(s): + if p.startswith('*'): + if p < '*final': + while result and result[-1] == '*final-': + result.pop() + while result and result[-1] == '00000000': + result.pop() + result.append(p) + return tuple(result) + + +class LegacyVersion(Version): + def parse(self, s): + return _legacy_key(s) + + @property + def is_prerelease(self): + result = False + for x in self._parts: + if (isinstance(x, string_types) and x.startswith('*') and + x < '*final'): + result = True + break + return result + + +class LegacyMatcher(Matcher): + version_class = LegacyVersion + + _operators = dict(Matcher._operators) + _operators['~='] = '_match_compatible' + + numeric_re = re.compile(r'^(\d+(\.\d+)*)') + + def _match_compatible(self, version, constraint, prefix): + if version < constraint: + return False + m = self.numeric_re.match(str(constraint)) + if not m: + logger.warning('Cannot compute compatible match for version %s ' + ' and constraint %s', version, constraint) + return True + s = m.groups()[0] + if '.' in s: + s = s.rsplit('.', 1)[0] + return _match_prefix(version, s) + +# +# Semantic versioning +# + +_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)' + r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?' + r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I) + + +def is_semver(s): + return _SEMVER_RE.match(s) + + +def _semantic_key(s): + def make_tuple(s, absent): + if s is None: + result = (absent,) + else: + parts = s[1:].split('.') + # We can't compare ints and strings on Python 3, so fudge it + # by zero-filling numeric values so simulate a numeric comparison + result = tuple([p.zfill(8) if p.isdigit() else p for p in parts]) + return result + + m = is_semver(s) + if not m: + raise UnsupportedVersionError(s) + groups = m.groups() + major, minor, patch = [int(i) for i in groups[:3]] + # choose the '|' and '*' so that versions sort correctly + pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*') + return (major, minor, patch), pre, build + + +class SemanticVersion(Version): + def parse(self, s): + return _semantic_key(s) + + @property + def is_prerelease(self): + return self._parts[1][0] != '|' + + +class SemanticMatcher(Matcher): + version_class = SemanticVersion + + +class VersionScheme(object): + def __init__(self, key, matcher, suggester=None): + self.key = key + self.matcher = matcher + self.suggester = suggester + + def is_valid_version(self, s): + try: + self.matcher.version_class(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_matcher(self, s): + try: + self.matcher(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_constraint_list(self, s): + """ + Used for processing some metadata fields + """ + return self.is_valid_matcher('dummy_name (%s)' % s) + + def suggest(self, s): + if self.suggester is None: + result = None + else: + result = self.suggester(s) + return result + +_SCHEMES = { + 'normalized': VersionScheme(_normalized_key, NormalizedMatcher, + _suggest_normalized_version), + 'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s), + 'semantic': VersionScheme(_semantic_key, SemanticMatcher, + _suggest_semantic_version), +} + +_SCHEMES['default'] = _SCHEMES['normalized'] + + +def get_scheme(name): + if name not in _SCHEMES: + raise ValueError('unknown scheme name: %r' % name) + return _SCHEMES[name] diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/version.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/version.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84a7bfe3d59e3fdb4162f1d7fa9ccf82a00c260a GIT binary patch literal 25779 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�gPVRVBXt_FM7e4<}XM;HRH{62JZSn^<*L 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 OB+yBqlfeHwf&T)jA)JE% literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/w64.exe b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/w64.exe new file mode 100644 index 0000000000000000000000000000000000000000..46139dbf9400b7bc0b64e6756ce17b4eb5fd7436 GIT binary patch literal 99840 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

      This is a doc

      ') + + + """ + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parse(doc, **kwargs) + + +def parseFragment(doc, container="div", treebuilder="etree", namespaceHTMLElements=True, **kwargs): + """Parse an HTML fragment as a string or file-like object into a tree + + :arg doc: the fragment to parse as a string or file-like object + + :arg container: the container context to parse the fragment in + + :arg treebuilder: the treebuilder to use when parsing + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :returns: parsed tree + + Example: + + >>> from html5lib.html5libparser import parseFragment + >>> parseFragment('this is a fragment') + + + """ + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parseFragment(doc, container=container, **kwargs) + + +def method_decorator_metaclass(function): + class Decorated(type): + def __new__(meta, classname, bases, classDict): + for attributeName, attribute in classDict.items(): + if isinstance(attribute, types.FunctionType): + attribute = function(attribute) + + classDict[attributeName] = attribute + return type.__new__(meta, classname, bases, classDict) + return Decorated + + +class HTMLParser(object): + """HTML parser + + Generates a tree structure from a stream of (possibly malformed) HTML. + + """ + + def __init__(self, tree=None, strict=False, namespaceHTMLElements=True, debug=False): + """ + :arg tree: a treebuilder class controlling the type of tree that will be + returned. Built in treebuilders can be accessed through + html5lib.treebuilders.getTreeBuilder(treeType) + + :arg strict: raise an exception when a parse error is encountered + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :arg debug: whether or not to enable debug mode which logs things + + Example: + + >>> from html5lib.html5parser import HTMLParser + >>> parser = HTMLParser() # generates parser with etree builder + >>> parser = HTMLParser('lxml', strict=True) # generates parser with lxml builder which is strict + + """ + + # Raise an exception on the first error encountered + self.strict = strict + + if tree is None: + tree = treebuilders.getTreeBuilder("etree") + self.tree = tree(namespaceHTMLElements) + self.errors = [] + + self.phases = {name: cls(self, self.tree) for name, cls in + getPhases(debug).items()} + + def _parse(self, stream, innerHTML=False, container="div", scripting=False, **kwargs): + + self.innerHTMLMode = innerHTML + self.container = container + self.scripting = scripting + self.tokenizer = _tokenizer.HTMLTokenizer(stream, parser=self, **kwargs) + self.reset() + + try: + self.mainLoop() + except _ReparseException: + self.reset() + self.mainLoop() + + def reset(self): + self.tree.reset() + self.firstStartTag = False + self.errors = [] + self.log = [] # only used with debug mode + # "quirks" / "limited quirks" / "no quirks" + self.compatMode = "no quirks" + + if self.innerHTMLMode: + self.innerHTML = self.container.lower() + + if self.innerHTML in cdataElements: + self.tokenizer.state = self.tokenizer.rcdataState + elif self.innerHTML in rcdataElements: + self.tokenizer.state = self.tokenizer.rawtextState + elif self.innerHTML == 'plaintext': + self.tokenizer.state = self.tokenizer.plaintextState + else: + # state already is data state + # self.tokenizer.state = self.tokenizer.dataState + pass + self.phase = self.phases["beforeHtml"] + self.phase.insertHtmlElement() + self.resetInsertionMode() + else: + self.innerHTML = False # pylint:disable=redefined-variable-type + self.phase = self.phases["initial"] + + self.lastPhase = None + + self.beforeRCDataPhase = None + + self.framesetOK = True + + @property + def documentEncoding(self): + """Name of the character encoding that was used to decode the input stream, or + :obj:`None` if that is not determined yet + + """ + if not hasattr(self, 'tokenizer'): + return None + return self.tokenizer.stream.charEncoding[0].name + + def isHTMLIntegrationPoint(self, element): + if (element.name == "annotation-xml" and + element.namespace == namespaces["mathml"]): + return ("encoding" in element.attributes and + element.attributes["encoding"].translate( + asciiUpper2Lower) in + ("text/html", "application/xhtml+xml")) + else: + return (element.namespace, element.name) in htmlIntegrationPointElements + + def isMathMLTextIntegrationPoint(self, element): + return (element.namespace, element.name) in mathmlTextIntegrationPointElements + + def mainLoop(self): + CharactersToken = tokenTypes["Characters"] + SpaceCharactersToken = tokenTypes["SpaceCharacters"] + StartTagToken = tokenTypes["StartTag"] + EndTagToken = tokenTypes["EndTag"] + CommentToken = tokenTypes["Comment"] + DoctypeToken = tokenTypes["Doctype"] + ParseErrorToken = tokenTypes["ParseError"] + + for token in self.tokenizer: + prev_token = None + new_token = token + while new_token is not None: + prev_token = new_token + currentNode = self.tree.openElements[-1] if self.tree.openElements else None + currentNodeNamespace = currentNode.namespace if currentNode else None + currentNodeName = currentNode.name if currentNode else None + + type = new_token["type"] + + if type == ParseErrorToken: + self.parseError(new_token["data"], new_token.get("datavars", {})) + new_token = None + else: + if (len(self.tree.openElements) == 0 or + currentNodeNamespace == self.tree.defaultNamespace or + (self.isMathMLTextIntegrationPoint(currentNode) and + ((type == StartTagToken and + token["name"] not in frozenset(["mglyph", "malignmark"])) or + type in (CharactersToken, SpaceCharactersToken))) or + (currentNodeNamespace == namespaces["mathml"] and + currentNodeName == "annotation-xml" and + type == StartTagToken and + token["name"] == "svg") or + (self.isHTMLIntegrationPoint(currentNode) and + type in (StartTagToken, CharactersToken, SpaceCharactersToken))): + phase = self.phase + else: + phase = self.phases["inForeignContent"] + + if type == CharactersToken: + new_token = phase.processCharacters(new_token) + elif type == SpaceCharactersToken: + new_token = phase.processSpaceCharacters(new_token) + elif type == StartTagToken: + new_token = phase.processStartTag(new_token) + elif type == EndTagToken: + new_token = phase.processEndTag(new_token) + elif type == CommentToken: + new_token = phase.processComment(new_token) + elif type == DoctypeToken: + new_token = phase.processDoctype(new_token) + + if (type == StartTagToken and prev_token["selfClosing"] and + not prev_token["selfClosingAcknowledged"]): + self.parseError("non-void-element-with-trailing-solidus", + {"name": prev_token["name"]}) + + # When the loop finishes it's EOF + reprocess = True + phases = [] + while reprocess: + phases.append(self.phase) + reprocess = self.phase.processEOF() + if reprocess: + assert self.phase not in phases + + def parse(self, stream, *args, **kwargs): + """Parse a HTML document into a well-formed tree + + :arg stream: a file-like object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element). + + :arg scripting: treat noscript elements as if JavaScript was turned on + + :returns: parsed tree + + Example: + + >>> from html5lib.html5parser import HTMLParser + >>> parser = HTMLParser() + >>> parser.parse('

      This is a doc

      ') + + + """ + self._parse(stream, False, None, *args, **kwargs) + return self.tree.getDocument() + + def parseFragment(self, stream, *args, **kwargs): + """Parse a HTML fragment into a well-formed tree fragment + + :arg container: name of the element we're setting the innerHTML + property if set to None, default to 'div' + + :arg stream: a file-like object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + :arg scripting: treat noscript elements as if JavaScript was turned on + + :returns: parsed tree + + Example: + + >>> from html5lib.html5libparser import HTMLParser + >>> parser = HTMLParser() + >>> parser.parseFragment('this is a fragment') + + + """ + self._parse(stream, True, *args, **kwargs) + return self.tree.getFragment() + + def parseError(self, errorcode="XXX-undefined-error", datavars=None): + # XXX The idea is to make errorcode mandatory. + if datavars is None: + datavars = {} + self.errors.append((self.tokenizer.stream.position(), errorcode, datavars)) + if self.strict: + raise ParseError(E[errorcode] % datavars) + + def adjustMathMLAttributes(self, token): + adjust_attributes(token, adjustMathMLAttributes) + + def adjustSVGAttributes(self, token): + adjust_attributes(token, adjustSVGAttributes) + + def adjustForeignAttributes(self, token): + adjust_attributes(token, adjustForeignAttributesMap) + + def reparseTokenNormal(self, token): + # pylint:disable=unused-argument + self.parser.phase() + + def resetInsertionMode(self): + # The name of this method is mostly historical. (It's also used in the + # specification.) + last = False + newModes = { + "select": "inSelect", + "td": "inCell", + "th": "inCell", + "tr": "inRow", + "tbody": "inTableBody", + "thead": "inTableBody", + "tfoot": "inTableBody", + "caption": "inCaption", + "colgroup": "inColumnGroup", + "table": "inTable", + "head": "inBody", + "body": "inBody", + "frameset": "inFrameset", + "html": "beforeHead" + } + for node in self.tree.openElements[::-1]: + nodeName = node.name + new_phase = None + if node == self.tree.openElements[0]: + assert self.innerHTML + last = True + nodeName = self.innerHTML + # Check for conditions that should only happen in the innerHTML + # case + if nodeName in ("select", "colgroup", "head", "html"): + assert self.innerHTML + + if not last and node.namespace != self.tree.defaultNamespace: + continue + + if nodeName in newModes: + new_phase = self.phases[newModes[nodeName]] + break + elif last: + new_phase = self.phases["inBody"] + break + + self.phase = new_phase + + def parseRCDataRawtext(self, token, contentType): + # Generic RCDATA/RAWTEXT Parsing algorithm + assert contentType in ("RAWTEXT", "RCDATA") + + self.tree.insertElement(token) + + if contentType == "RAWTEXT": + self.tokenizer.state = self.tokenizer.rawtextState + else: + self.tokenizer.state = self.tokenizer.rcdataState + + self.originalPhase = self.phase + + self.phase = self.phases["text"] + + +@_utils.memoize +def getPhases(debug): + def log(function): + """Logger that records which phase processes each token""" + type_names = {value: key for key, value in tokenTypes.items()} + + def wrapped(self, *args, **kwargs): + if function.__name__.startswith("process") and len(args) > 0: + token = args[0] + info = {"type": type_names[token['type']]} + if token['type'] in tagTokenTypes: + info["name"] = token['name'] + + self.parser.log.append((self.parser.tokenizer.state.__name__, + self.parser.phase.__class__.__name__, + self.__class__.__name__, + function.__name__, + info)) + return function(self, *args, **kwargs) + else: + return function(self, *args, **kwargs) + return wrapped + + def getMetaclass(use_metaclass, metaclass_func): + if use_metaclass: + return method_decorator_metaclass(metaclass_func) + else: + return type + + # pylint:disable=unused-argument + class Phase(with_metaclass(getMetaclass(debug, log))): + """Base class for helper object that implements each phase of processing + """ + __slots__ = ("parser", "tree", "__startTagCache", "__endTagCache") + + def __init__(self, parser, tree): + self.parser = parser + self.tree = tree + self.__startTagCache = {} + self.__endTagCache = {} + + def processEOF(self): + raise NotImplementedError + + def processComment(self, token): + # For most phases the following is correct. Where it's not it will be + # overridden. + self.tree.insertComment(token, self.tree.openElements[-1]) + + def processDoctype(self, token): + self.parser.parseError("unexpected-doctype") + + def processCharacters(self, token): + self.tree.insertText(token["data"]) + + def processSpaceCharacters(self, token): + self.tree.insertText(token["data"]) + + def processStartTag(self, token): + # Note the caching is done here rather than BoundMethodDispatcher as doing it there + # requires a circular reference to the Phase, and this ends up with a significant + # (CPython 2.7, 3.8) GC cost when parsing many short inputs + name = token["name"] + # In Py2, using `in` is quicker in general than try/except KeyError + # In Py3, `in` is quicker when there are few cache hits (typically short inputs) + if name in self.__startTagCache: + func = self.__startTagCache[name] + else: + func = self.__startTagCache[name] = self.startTagHandler[name] + # bound the cache size in case we get loads of unknown tags + while len(self.__startTagCache) > len(self.startTagHandler) * 1.1: + # this makes the eviction policy random on Py < 3.7 and FIFO >= 3.7 + self.__startTagCache.pop(next(iter(self.__startTagCache))) + return func(token) + + def startTagHtml(self, token): + if not self.parser.firstStartTag and token["name"] == "html": + self.parser.parseError("non-html-root") + # XXX Need a check here to see if the first start tag token emitted is + # this token... If it's not, invoke self.parser.parseError(). + for attr, value in token["data"].items(): + if attr not in self.tree.openElements[0].attributes: + self.tree.openElements[0].attributes[attr] = value + self.parser.firstStartTag = False + + def processEndTag(self, token): + # Note the caching is done here rather than BoundMethodDispatcher as doing it there + # requires a circular reference to the Phase, and this ends up with a significant + # (CPython 2.7, 3.8) GC cost when parsing many short inputs + name = token["name"] + # In Py2, using `in` is quicker in general than try/except KeyError + # In Py3, `in` is quicker when there are few cache hits (typically short inputs) + if name in self.__endTagCache: + func = self.__endTagCache[name] + else: + func = self.__endTagCache[name] = self.endTagHandler[name] + # bound the cache size in case we get loads of unknown tags + while len(self.__endTagCache) > len(self.endTagHandler) * 1.1: + # this makes the eviction policy random on Py < 3.7 and FIFO >= 3.7 + self.__endTagCache.pop(next(iter(self.__endTagCache))) + return func(token) + + class InitialPhase(Phase): + __slots__ = tuple() + + def processSpaceCharacters(self, token): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + correct = token["correct"] + + if (name != "html" or publicId is not None or + systemId is not None and systemId != "about:legacy-compat"): + self.parser.parseError("unknown-doctype") + + if publicId is None: + publicId = "" + + self.tree.insertDoctype(token) + + if publicId != "": + publicId = publicId.translate(asciiUpper2Lower) + + if (not correct or token["name"] != "html" or + publicId.startswith( + ("+//silmaril//dtd html pro v0r11 19970101//", + "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", + "-//as//dtd html 3.0 aswedit + extensions//", + "-//ietf//dtd html 2.0 level 1//", + "-//ietf//dtd html 2.0 level 2//", + "-//ietf//dtd html 2.0 strict level 1//", + "-//ietf//dtd html 2.0 strict level 2//", + "-//ietf//dtd html 2.0 strict//", + "-//ietf//dtd html 2.0//", + "-//ietf//dtd html 2.1e//", + "-//ietf//dtd html 3.0//", + "-//ietf//dtd html 3.2 final//", + "-//ietf//dtd html 3.2//", + "-//ietf//dtd html 3//", + "-//ietf//dtd html level 0//", + "-//ietf//dtd html level 1//", + "-//ietf//dtd html level 2//", + "-//ietf//dtd html level 3//", + "-//ietf//dtd html strict level 0//", + "-//ietf//dtd html strict level 1//", + "-//ietf//dtd html strict level 2//", + "-//ietf//dtd html strict level 3//", + "-//ietf//dtd html strict//", + "-//ietf//dtd html//", + "-//metrius//dtd metrius presentational//", + "-//microsoft//dtd internet explorer 2.0 html strict//", + "-//microsoft//dtd internet explorer 2.0 html//", + "-//microsoft//dtd internet explorer 2.0 tables//", + "-//microsoft//dtd internet explorer 3.0 html strict//", + "-//microsoft//dtd internet explorer 3.0 html//", + "-//microsoft//dtd internet explorer 3.0 tables//", + "-//netscape comm. corp.//dtd html//", + "-//netscape comm. corp.//dtd strict html//", + "-//o'reilly and associates//dtd html 2.0//", + "-//o'reilly and associates//dtd html extended 1.0//", + "-//o'reilly and associates//dtd html extended relaxed 1.0//", + "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", + "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", + "-//spyglass//dtd html 2.0 extended//", + "-//sq//dtd html 2.0 hotmetal + extensions//", + "-//sun microsystems corp.//dtd hotjava html//", + "-//sun microsystems corp.//dtd hotjava strict html//", + "-//w3c//dtd html 3 1995-03-24//", + "-//w3c//dtd html 3.2 draft//", + "-//w3c//dtd html 3.2 final//", + "-//w3c//dtd html 3.2//", + "-//w3c//dtd html 3.2s draft//", + "-//w3c//dtd html 4.0 frameset//", + "-//w3c//dtd html 4.0 transitional//", + "-//w3c//dtd html experimental 19960712//", + "-//w3c//dtd html experimental 970421//", + "-//w3c//dtd w3 html//", + "-//w3o//dtd w3 html 3.0//", + "-//webtechs//dtd mozilla html 2.0//", + "-//webtechs//dtd mozilla html//")) or + publicId in ("-//w3o//dtd w3 html strict 3.0//en//", + "-/w3c/dtd html 4.0 transitional/en", + "html") or + publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is None or + systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"): + self.parser.compatMode = "quirks" + elif (publicId.startswith( + ("-//w3c//dtd xhtml 1.0 frameset//", + "-//w3c//dtd xhtml 1.0 transitional//")) or + publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is not None): + self.parser.compatMode = "limited quirks" + + self.parser.phase = self.parser.phases["beforeHtml"] + + def anythingElse(self): + self.parser.compatMode = "quirks" + self.parser.phase = self.parser.phases["beforeHtml"] + + def processCharacters(self, token): + self.parser.parseError("expected-doctype-but-got-chars") + self.anythingElse() + return token + + def processStartTag(self, token): + self.parser.parseError("expected-doctype-but-got-start-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEndTag(self, token): + self.parser.parseError("expected-doctype-but-got-end-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEOF(self): + self.parser.parseError("expected-doctype-but-got-eof") + self.anythingElse() + return True + + class BeforeHtmlPhase(Phase): + __slots__ = tuple() + + # helper methods + def insertHtmlElement(self): + self.tree.insertRoot(impliedTagToken("html", "StartTag")) + self.parser.phase = self.parser.phases["beforeHead"] + + # other + def processEOF(self): + self.insertHtmlElement() + return True + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.insertHtmlElement() + return token + + def processStartTag(self, token): + if token["name"] == "html": + self.parser.firstStartTag = True + self.insertHtmlElement() + return token + + def processEndTag(self, token): + if token["name"] not in ("head", "body", "html", "br"): + self.parser.parseError("unexpected-end-tag-before-html", + {"name": token["name"]}) + else: + self.insertHtmlElement() + return token + + class BeforeHeadPhase(Phase): + __slots__ = tuple() + + def processEOF(self): + self.startTagHead(impliedTagToken("head", "StartTag")) + return True + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.tree.insertElement(token) + self.tree.headPointer = self.tree.openElements[-1] + self.parser.phase = self.parser.phases["inHead"] + + def startTagOther(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagImplyHead(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagOther(self, token): + self.parser.parseError("end-tag-after-implied-root", + {"name": token["name"]}) + + startTagHandler = _utils.MethodDispatcher([ + ("html", startTagHtml), + ("head", startTagHead) + ]) + startTagHandler.default = startTagOther + + endTagHandler = _utils.MethodDispatcher([ + (("head", "body", "html", "br"), endTagImplyHead) + ]) + endTagHandler.default = endTagOther + + class InHeadPhase(Phase): + __slots__ = tuple() + + # the real thing + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.parser.parseError("two-heads-are-not-better-than-one") + + def startTagBaseLinkCommand(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagMeta(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + attributes = token["data"] + if self.parser.tokenizer.stream.charEncoding[1] == "tentative": + if "charset" in attributes: + self.parser.tokenizer.stream.changeEncoding(attributes["charset"]) + elif ("content" in attributes and + "http-equiv" in attributes and + attributes["http-equiv"].lower() == "content-type"): + # Encoding it as UTF-8 here is a hack, as really we should pass + # the abstract Unicode string, and just use the + # ContentAttrParser on that, but using UTF-8 allows all chars + # to be encoded and as a ASCII-superset works. + data = _inputstream.EncodingBytes(attributes["content"].encode("utf-8")) + parser = _inputstream.ContentAttrParser(data) + codec = parser.parse() + self.parser.tokenizer.stream.changeEncoding(codec) + + def startTagTitle(self, token): + self.parser.parseRCDataRawtext(token, "RCDATA") + + def startTagNoFramesStyle(self, token): + # Need to decide whether to implement the scripting-disabled case + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagNoscript(self, token): + if self.parser.scripting: + self.parser.parseRCDataRawtext(token, "RAWTEXT") + else: + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inHeadNoscript"] + + def startTagScript(self, token): + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState + self.parser.originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["text"] + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHead(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "head", "Expected head got %s" % node.name + self.parser.phase = self.parser.phases["afterHead"] + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.endTagHead(impliedTagToken("head")) + + startTagHandler = _utils.MethodDispatcher([ + ("html", startTagHtml), + ("title", startTagTitle), + (("noframes", "style"), startTagNoFramesStyle), + ("noscript", startTagNoscript), + ("script", startTagScript), + (("base", "basefont", "bgsound", "command", "link"), + startTagBaseLinkCommand), + ("meta", startTagMeta), + ("head", startTagHead) + ]) + startTagHandler.default = startTagOther + + endTagHandler = _utils.MethodDispatcher([ + ("head", endTagHead), + (("br", "html", "body"), endTagHtmlBodyBr) + ]) + endTagHandler.default = endTagOther + + class InHeadNoscriptPhase(Phase): + __slots__ = tuple() + + def processEOF(self): + self.parser.parseError("eof-in-head-noscript") + self.anythingElse() + return True + + def processComment(self, token): + return self.parser.phases["inHead"].processComment(token) + + def processCharacters(self, token): + self.parser.parseError("char-in-head-noscript") + self.anythingElse() + return token + + def processSpaceCharacters(self, token): + return self.parser.phases["inHead"].processSpaceCharacters(token) + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBaseLinkCommand(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagHeadNoscript(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagNoscript(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "noscript", "Expected noscript got %s" % node.name + self.parser.phase = self.parser.phases["inHead"] + + def endTagBr(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + # Caller must raise parse error first! + self.endTagNoscript(impliedTagToken("noscript")) + + startTagHandler = _utils.MethodDispatcher([ + ("html", startTagHtml), + (("basefont", "bgsound", "link", "meta", "noframes", "style"), startTagBaseLinkCommand), + (("head", "noscript"), startTagHeadNoscript), + ]) + startTagHandler.default = startTagOther + + endTagHandler = _utils.MethodDispatcher([ + ("noscript", endTagNoscript), + ("br", endTagBr), + ]) + endTagHandler.default = endTagOther + + class AfterHeadPhase(Phase): + __slots__ = tuple() + + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBody(self, token): + self.parser.framesetOK = False + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inBody"] + + def startTagFrameset(self, token): + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inFrameset"] + + def startTagFromHead(self, token): + self.parser.parseError("unexpected-start-tag-out-of-my-head", + {"name": token["name"]}) + self.tree.openElements.append(self.tree.headPointer) + self.parser.phases["inHead"].processStartTag(token) + for node in self.tree.openElements[::-1]: + if node.name == "head": + self.tree.openElements.remove(node) + break + + def startTagHead(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.tree.insertElement(impliedTagToken("body", "StartTag")) + self.parser.phase = self.parser.phases["inBody"] + self.parser.framesetOK = True + + startTagHandler = _utils.MethodDispatcher([ + ("html", startTagHtml), + ("body", startTagBody), + ("frameset", startTagFrameset), + (("base", "basefont", "bgsound", "link", "meta", "noframes", "script", + "style", "title"), + startTagFromHead), + ("head", startTagHead) + ]) + startTagHandler.default = startTagOther + endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"), + endTagHtmlBodyBr)]) + endTagHandler.default = endTagOther + + class InBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody + # the really-really-really-very crazy mode + __slots__ = ("processSpaceCharacters",) + + def __init__(self, *args, **kwargs): + super(InBodyPhase, self).__init__(*args, **kwargs) + # Set this to the default handler + self.processSpaceCharacters = self.processSpaceCharactersNonPre + + def isMatchingFormattingElement(self, node1, node2): + return (node1.name == node2.name and + node1.namespace == node2.namespace and + node1.attributes == node2.attributes) + + # helper + def addFormattingElement(self, token): + self.tree.insertElement(token) + element = self.tree.openElements[-1] + + matchingElements = [] + for node in self.tree.activeFormattingElements[::-1]: + if node is Marker: + break + elif self.isMatchingFormattingElement(node, element): + matchingElements.append(node) + + assert len(matchingElements) <= 3 + if len(matchingElements) == 3: + self.tree.activeFormattingElements.remove(matchingElements[-1]) + self.tree.activeFormattingElements.append(element) + + # the real deal + def processEOF(self): + allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td", + "tfoot", "th", "thead", "tr", "body", + "html")) + for node in self.tree.openElements[::-1]: + if node.name not in allowed_elements: + self.parser.parseError("expected-closing-tag-but-got-eof") + break + # Stop parsing + + def processSpaceCharactersDropNewline(self, token): + # Sometimes (start of
      , , and 

      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[^-]+) +-(?P\d+[^-]*) +(-(?P\d+[^-]*))? +-(?P\w+\d+(\.\w+\d+)*) +-(?P\w+) +-(?P\w+(\.\w+)*) +\.whl$ +''', re.IGNORECASE | re.VERBOSE) + +NAME_VERSION_RE = re.compile(r''' +(?P[^-]+) +-(?P\d+[^-]*) +(-(?P\d+[^-]*))?$ +''', re.IGNORECASE | re.VERBOSE) + +SHEBANG_RE = re.compile(br'\s*#![^\r\n]*') +SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$') +SHEBANG_PYTHON = b'#!python' +SHEBANG_PYTHONW = b'#!pythonw' + +if os.sep == '/': + to_posix = lambda o: o +else: + to_posix = lambda o: o.replace(os.sep, '/') + + +class Mounter(object): + def __init__(self): + self.impure_wheels = {} + self.libs = {} + + def add(self, pathname, extensions): + self.impure_wheels[pathname] = extensions + self.libs.update(extensions) + + def remove(self, pathname): + extensions = self.impure_wheels.pop(pathname) + for k, v in extensions: + if k in self.libs: + del self.libs[k] + + def find_module(self, fullname, path=None): + if fullname in self.libs: + result = self + else: + result = None + return result + + def load_module(self, fullname): + if fullname in sys.modules: + result = sys.modules[fullname] + else: + if fullname not in self.libs: + raise ImportError('unable to find extension for %s' % fullname) + result = imp.load_dynamic(fullname, self.libs[fullname]) + result.__loader__ = self + parts = fullname.rsplit('.', 1) + if len(parts) > 1: + result.__package__ = parts[0] + return result + +_hook = Mounter() + + +class Wheel(object): + """ + Class to build and install from Wheel files (PEP 427). + """ + + wheel_version = (1, 1) + hash_kind = 'sha256' + + def __init__(self, filename=None, sign=False, verify=False): + """ + Initialise an instance using a (valid) filename. + """ + self.sign = sign + self.should_verify = verify + self.buildver = '' + self.pyver = [PYVER] + self.abi = ['none'] + self.arch = ['any'] + self.dirname = os.getcwd() + if filename is None: + self.name = 'dummy' + self.version = '0.1' + self._filename = self.filename + else: + m = NAME_VERSION_RE.match(filename) + if m: + info = m.groupdict('') + self.name = info['nm'] + # Reinstate the local version separator + self.version = info['vn'].replace('_', '-') + self.buildver = info['bn'] + self._filename = self.filename + else: + dirname, filename = os.path.split(filename) + m = FILENAME_RE.match(filename) + if not m: + raise DistlibException('Invalid name or ' + 'filename: %r' % filename) + if dirname: + self.dirname = os.path.abspath(dirname) + self._filename = filename + info = m.groupdict('') + self.name = info['nm'] + self.version = info['vn'] + self.buildver = info['bn'] + self.pyver = info['py'].split('.') + self.abi = info['bi'].split('.') + self.arch = info['ar'].split('.') + + @property + def filename(self): + """ + Build and return a filename from the various components. + """ + if self.buildver: + buildver = '-' + self.buildver + else: + buildver = '' + pyver = '.'.join(self.pyver) + abi = '.'.join(self.abi) + arch = '.'.join(self.arch) + # replace - with _ as a local version separator + version = self.version.replace('-', '_') + return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, + pyver, abi, arch) + + @property + def exists(self): + path = os.path.join(self.dirname, self.filename) + return os.path.isfile(path) + + @property + def tags(self): + for pyver in self.pyver: + for abi in self.abi: + for arch in self.arch: + yield pyver, abi, arch + + @cached_property + def metadata(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + wrapper = codecs.getreader('utf-8') + with ZipFile(pathname, 'r') as zf: + wheel_metadata = self.get_wheel_metadata(zf) + wv = wheel_metadata['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + # if file_version < (1, 1): + # fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME, + # LEGACY_METADATA_FILENAME] + # else: + # fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME] + fns = [WHEEL_METADATA_FILENAME, LEGACY_METADATA_FILENAME] + result = None + for fn in fns: + try: + metadata_filename = posixpath.join(info_dir, fn) + with zf.open(metadata_filename) as bf: + wf = wrapper(bf) + result = Metadata(fileobj=wf) + if result: + break + except KeyError: + pass + if not result: + raise ValueError('Invalid wheel, because metadata is ' + 'missing: looked in %s' % ', '.join(fns)) + return result + + def get_wheel_metadata(self, zf): + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + metadata_filename = posixpath.join(info_dir, 'WHEEL') + with zf.open(metadata_filename) as bf: + wf = codecs.getreader('utf-8')(bf) + message = message_from_file(wf) + return dict(message) + + @cached_property + def info(self): + pathname = os.path.join(self.dirname, self.filename) + with ZipFile(pathname, 'r') as zf: + result = self.get_wheel_metadata(zf) + return result + + def process_shebang(self, data): + m = SHEBANG_RE.match(data) + if m: + end = m.end() + shebang, data_after_shebang = data[:end], data[end:] + # Preserve any arguments after the interpreter + if b'pythonw' in shebang.lower(): + shebang_python = SHEBANG_PYTHONW + else: + shebang_python = SHEBANG_PYTHON + m = SHEBANG_DETAIL_RE.match(shebang) + if m: + args = b' ' + m.groups()[-1] + else: + args = b'' + shebang = shebang_python + args + data = shebang + data_after_shebang + else: + cr = data.find(b'\r') + lf = data.find(b'\n') + if cr < 0 or cr > lf: + term = b'\n' + else: + if data[cr:cr + 2] == b'\r\n': + term = b'\r\n' + else: + term = b'\r' + data = SHEBANG_PYTHON + term + data + return data + + def get_hash(self, data, hash_kind=None): + if hash_kind is None: + hash_kind = self.hash_kind + try: + hasher = getattr(hashlib, hash_kind) + except AttributeError: + raise DistlibException('Unsupported hash algorithm: %r' % hash_kind) + result = hasher(data).digest() + result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii') + return hash_kind, result + + def write_record(self, records, record_path, base): + records = list(records) # make a copy, as mutated + p = to_posix(os.path.relpath(record_path, base)) + records.append((p, '', '')) + with CSVWriter(record_path) as writer: + for row in records: + writer.writerow(row) + + def write_records(self, info, libdir, archive_paths): + records = [] + distinfo, info_dir = info + hasher = getattr(hashlib, self.hash_kind) + for ap, p in archive_paths: + with open(p, 'rb') as f: + data = f.read() + digest = '%s=%s' % self.get_hash(data) + size = os.path.getsize(p) + records.append((ap, digest, size)) + + p = os.path.join(distinfo, 'RECORD') + self.write_record(records, p, libdir) + ap = to_posix(os.path.join(info_dir, 'RECORD')) + archive_paths.append((ap, p)) + + def build_zip(self, pathname, archive_paths): + with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf: + for ap, p in archive_paths: + logger.debug('Wrote %s to %s in wheel', p, ap) + zf.write(p, ap) + + def build(self, paths, tags=None, wheel_version=None): + """ + Build a wheel from files in specified paths, and use any specified tags + when determining the name of the wheel. + """ + if tags is None: + tags = {} + + libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0] + if libkey == 'platlib': + is_pure = 'false' + default_pyver = [IMPVER] + default_abi = [ABI] + default_arch = [ARCH] + else: + is_pure = 'true' + default_pyver = [PYVER] + default_abi = ['none'] + default_arch = ['any'] + + self.pyver = tags.get('pyver', default_pyver) + self.abi = tags.get('abi', default_abi) + self.arch = tags.get('arch', default_arch) + + libdir = paths[libkey] + + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + archive_paths = [] + + # First, stuff which is not in site-packages + for key in ('data', 'headers', 'scripts'): + if key not in paths: + continue + path = paths[key] + if os.path.isdir(path): + for root, dirs, files in os.walk(path): + for fn in files: + p = fsdecode(os.path.join(root, fn)) + rp = os.path.relpath(p, path) + ap = to_posix(os.path.join(data_dir, key, rp)) + archive_paths.append((ap, p)) + if key == 'scripts' and not p.endswith('.exe'): + with open(p, 'rb') as f: + data = f.read() + data = self.process_shebang(data) + with open(p, 'wb') as f: + f.write(data) + + # Now, stuff which is in site-packages, other than the + # distinfo stuff. + path = libdir + distinfo = None + for root, dirs, files in os.walk(path): + if root == path: + # At the top level only, save distinfo for later + # and skip it for now + for i, dn in enumerate(dirs): + dn = fsdecode(dn) + if dn.endswith('.dist-info'): + distinfo = os.path.join(root, dn) + del dirs[i] + break + assert distinfo, '.dist-info directory expected, not found' + + for fn in files: + # comment out next suite to leave .pyc files in + if fsdecode(fn).endswith(('.pyc', '.pyo')): + continue + p = os.path.join(root, fn) + rp = to_posix(os.path.relpath(p, path)) + archive_paths.append((rp, p)) + + # Now distinfo. Assumed to be flat, i.e. os.listdir is enough. + files = os.listdir(distinfo) + for fn in files: + if fn not in ('RECORD', 'INSTALLER', 'SHARED', 'WHEEL'): + p = fsdecode(os.path.join(distinfo, fn)) + ap = to_posix(os.path.join(info_dir, fn)) + archive_paths.append((ap, p)) + + wheel_metadata = [ + 'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version), + 'Generator: distlib %s' % __version__, + 'Root-Is-Purelib: %s' % is_pure, + ] + for pyver, abi, arch in self.tags: + wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch)) + p = os.path.join(distinfo, 'WHEEL') + with open(p, 'w') as f: + f.write('\n'.join(wheel_metadata)) + ap = to_posix(os.path.join(info_dir, 'WHEEL')) + archive_paths.append((ap, p)) + + # sort the entries by archive path. Not needed by any spec, but it + # keeps the archive listing and RECORD tidier than they would otherwise + # be. Use the number of path segments to keep directory entries together, + # and keep the dist-info stuff at the end. + def sorter(t): + ap = t[0] + n = ap.count('/') + if '.dist-info' in ap: + n += 10000 + return (n, ap) + archive_paths = sorted(archive_paths, key=sorter) + + # Now, at last, RECORD. + # Paths in here are archive paths - nothing else makes sense. + self.write_records((distinfo, info_dir), libdir, archive_paths) + # Now, ready to build the zip file + pathname = os.path.join(self.dirname, self.filename) + self.build_zip(pathname, archive_paths) + return pathname + + def skip_entry(self, arcname): + """ + Determine whether an archive entry should be skipped when verifying + or installing. + """ + # The signature file won't be in RECORD, + # and we don't currently don't do anything with it + # We also skip directories, as they won't be in RECORD + # either. See: + # + # https://github.com/pypa/wheel/issues/294 + # https://github.com/pypa/wheel/issues/287 + # https://github.com/pypa/wheel/pull/289 + # + return arcname.endswith(('/', '/RECORD.jws')) + + def install(self, paths, maker, **kwargs): + """ + Install a wheel to the specified paths. If kwarg ``warner`` is + specified, it should be a callable, which will be called with two + tuples indicating the wheel version of this software and the wheel + version in the file, if there is a discrepancy in the versions. + This can be used to issue any warnings to raise any exceptions. + If kwarg ``lib_only`` is True, only the purelib/platlib files are + installed, and the headers, scripts, data and dist-info metadata are + not written. If kwarg ``bytecode_hashed_invalidation`` is True, written + bytecode will try to use file-hash based invalidation (PEP-552) on + supported interpreter versions (CPython 2.7+). + + The return value is a :class:`InstalledDistribution` instance unless + ``options.lib_only`` is True, in which case the return value is ``None``. + """ + + dry_run = maker.dry_run + warner = kwargs.get('warner') + lib_only = kwargs.get('lib_only', False) + bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', False) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + metadata_name = posixpath.join(info_dir, LEGACY_METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + if (file_version != self.wheel_version) and warner: + warner(self.wheel_version, file_version) + + if message['Root-Is-Purelib'] == 'true': + libdir = paths['purelib'] + else: + libdir = paths['platlib'] + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + data_pfx = posixpath.join(data_dir, '') + info_pfx = posixpath.join(info_dir, '') + script_pfx = posixpath.join(data_dir, 'scripts', '') + + # make a new instance rather than a copy of maker's, + # as we mutate it + fileop = FileOperator(dry_run=dry_run) + fileop.record = True # so we can rollback if needed + + bc = not sys.dont_write_bytecode # Double negatives. Lovely! + + outfiles = [] # for RECORD writing + + # for script copying/shebang processing + workdir = tempfile.mkdtemp() + # set target dir later + # we default add_launchers to False, as the + # Python Launcher should be used instead + maker.source_dir = workdir + maker.target_dir = None + try: + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if self.skip_entry(u_arcname): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + if lib_only and u_arcname.startswith((info_pfx, data_pfx)): + logger.debug('lib_only: skipping %s', u_arcname) + continue + is_script = (u_arcname.startswith(script_pfx) + and not u_arcname.endswith('.exe')) + + if u_arcname.startswith(data_pfx): + _, where, rp = u_arcname.split('/', 2) + outfile = os.path.join(paths[where], convert_path(rp)) + else: + # meant for site-packages. + if u_arcname in (wheel_metadata_name, record_name): + continue + outfile = os.path.join(libdir, convert_path(u_arcname)) + if not is_script: + with zf.open(arcname) as bf: + fileop.copy_stream(bf, outfile) + outfiles.append(outfile) + # Double check the digest of the written file + if not dry_run and row[1]: + with open(outfile, 'rb') as bf: + data = bf.read() + _, newdigest = self.get_hash(data, kind) + if newdigest != digest: + raise DistlibException('digest mismatch ' + 'on write for ' + '%s' % outfile) + if bc and outfile.endswith('.py'): + try: + pyc = fileop.byte_compile(outfile, + hashed_invalidation=bc_hashed_invalidation) + outfiles.append(pyc) + except Exception: + # Don't give up if byte-compilation fails, + # but log it and perhaps warn the user + logger.warning('Byte-compilation failed', + exc_info=True) + else: + fn = os.path.basename(convert_path(arcname)) + workname = os.path.join(workdir, fn) + with zf.open(arcname) as bf: + fileop.copy_stream(bf, workname) + + dn, fn = os.path.split(outfile) + maker.target_dir = dn + filenames = maker.make(fn) + fileop.set_executable_mode(filenames) + outfiles.extend(filenames) + + if lib_only: + logger.debug('lib_only: returning None') + dist = None + else: + # Generate scripts + + # Try to get pydist.json so we can see if there are + # any commands to generate. If this fails (e.g. because + # of a legacy wheel), log a warning but don't give up. + commands = None + file_version = self.info['Wheel-Version'] + if file_version == '1.0': + # Use legacy info + ep = posixpath.join(info_dir, 'entry_points.txt') + try: + with zf.open(ep) as bwf: + epdata = read_exports(bwf) + commands = {} + for key in ('console', 'gui'): + k = '%s_scripts' % key + if k in epdata: + commands['wrap_%s' % key] = d = {} + for v in epdata[k].values(): + s = '%s:%s' % (v.prefix, v.suffix) + if v.flags: + s += ' [%s]' % ','.join(v.flags) + d[v.name] = s + except Exception: + logger.warning('Unable to read legacy script ' + 'metadata, so cannot generate ' + 'scripts') + else: + try: + with zf.open(metadata_name) as bwf: + wf = wrapper(bwf) + commands = json.load(wf).get('extensions') + if commands: + commands = commands.get('python.commands') + except Exception: + logger.warning('Unable to read JSON metadata, so ' + 'cannot generate scripts') + if commands: + console_scripts = commands.get('wrap_console', {}) + gui_scripts = commands.get('wrap_gui', {}) + if console_scripts or gui_scripts: + script_dir = paths.get('scripts', '') + if not os.path.isdir(script_dir): + raise ValueError('Valid script path not ' + 'specified') + maker.target_dir = script_dir + for k, v in console_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script) + fileop.set_executable_mode(filenames) + + if gui_scripts: + options = {'gui': True } + for k, v in gui_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script, options) + fileop.set_executable_mode(filenames) + + p = os.path.join(libdir, info_dir) + dist = InstalledDistribution(p) + + # Write SHARED + paths = dict(paths) # don't change passed in dict + del paths['purelib'] + del paths['platlib'] + paths['lib'] = libdir + p = dist.write_shared_locations(paths, dry_run) + if p: + outfiles.append(p) + + # Write RECORD + dist.write_installed_files(outfiles, paths['prefix'], + dry_run) + return dist + except Exception: # pragma: no cover + logger.exception('installation failed.') + fileop.rollback() + raise + finally: + shutil.rmtree(workdir) + + def _get_dylib_cache(self): + global cache + if cache is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('dylib-cache'), + '%s.%s' % sys.version_info[:2]) + cache = Cache(base) + return cache + + def _get_extensions(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + arcname = posixpath.join(info_dir, 'EXTENSIONS') + wrapper = codecs.getreader('utf-8') + result = [] + with ZipFile(pathname, 'r') as zf: + try: + with zf.open(arcname) as bf: + wf = wrapper(bf) + extensions = json.load(wf) + cache = self._get_dylib_cache() + prefix = cache.prefix_to_dir(pathname) + cache_base = os.path.join(cache.base, prefix) + if not os.path.isdir(cache_base): + os.makedirs(cache_base) + for name, relpath in extensions.items(): + dest = os.path.join(cache_base, convert_path(relpath)) + if not os.path.exists(dest): + extract = True + else: + file_time = os.stat(dest).st_mtime + file_time = datetime.datetime.fromtimestamp(file_time) + info = zf.getinfo(relpath) + wheel_time = datetime.datetime(*info.date_time) + extract = wheel_time > file_time + if extract: + zf.extract(relpath, cache_base) + result.append((name, dest)) + except KeyError: + pass + return result + + def is_compatible(self): + """ + Determine if a wheel is compatible with the running system. + """ + return is_compatible(self) + + def is_mountable(self): + """ + Determine if a wheel is asserted as mountable by its metadata. + """ + return True # for now - metadata details TBD + + def mount(self, append=False): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if not self.is_compatible(): + msg = 'Wheel %s not compatible with this Python.' % pathname + raise DistlibException(msg) + if not self.is_mountable(): + msg = 'Wheel %s is marked as not mountable.' % pathname + raise DistlibException(msg) + if pathname in sys.path: + logger.debug('%s already in path', pathname) + else: + if append: + sys.path.append(pathname) + else: + sys.path.insert(0, pathname) + extensions = self._get_extensions() + if extensions: + if _hook not in sys.meta_path: + sys.meta_path.append(_hook) + _hook.add(pathname, extensions) + + def unmount(self): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if pathname not in sys.path: + logger.debug('%s not in path', pathname) + else: + sys.path.remove(pathname) + if pathname in _hook.impure_wheels: + _hook.remove(pathname) + if not _hook.impure_wheels: + if _hook in sys.meta_path: + sys.meta_path.remove(_hook) + + def verify(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + metadata_name = posixpath.join(info_dir, LEGACY_METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + # TODO version verification + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + # See issue #115: some wheels have .. in their entries, but + # in the filename ... e.g. __main__..py ! So the check is + # updated to look for .. in the directory portions + p = u_arcname.split('/') + if '..' in p: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + + if self.skip_entry(u_arcname): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + def update(self, modifier, dest_dir=None, **kwargs): + """ + Update the contents of a wheel in a generic way. The modifier should + be a callable which expects a dictionary argument: its keys are + archive-entry paths, and its values are absolute filesystem paths + where the contents the corresponding archive entries can be found. The + modifier is free to change the contents of the files pointed to, add + new entries and remove entries, before returning. This method will + extract the entire contents of the wheel to a temporary location, call + the modifier, and then use the passed (and possibly updated) + dictionary to write a new wheel. If ``dest_dir`` is specified, the new + wheel is written there -- otherwise, the original wheel is overwritten. + + The modifier should return True if it updated the wheel, else False. + This method returns the same value the modifier returns. + """ + + def get_version(path_map, info_dir): + version = path = None + key = '%s/%s' % (info_dir, LEGACY_METADATA_FILENAME) + if key not in path_map: + key = '%s/PKG-INFO' % info_dir + if key in path_map: + path = path_map[key] + version = Metadata(path=path).version + return version, path + + def update_version(version, path): + updated = None + try: + v = NormalizedVersion(version) + i = version.find('-') + if i < 0: + updated = '%s+1' % version + else: + parts = [int(s) for s in version[i + 1:].split('.')] + parts[-1] += 1 + updated = '%s+%s' % (version[:i], + '.'.join(str(i) for i in parts)) + except UnsupportedVersionError: + logger.debug('Cannot update non-compliant (PEP-440) ' + 'version %r', version) + if updated: + md = Metadata(path=path) + md.version = updated + legacy = path.endswith(LEGACY_METADATA_FILENAME) + md.write(path=path, legacy=legacy) + logger.debug('Version updated from %r to %r', version, + updated) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + record_name = posixpath.join(info_dir, 'RECORD') + with tempdir() as workdir: + with ZipFile(pathname, 'r') as zf: + path_map = {} + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if u_arcname == record_name: + continue + if '..' in u_arcname: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + zf.extract(zinfo, workdir) + path = os.path.join(workdir, convert_path(u_arcname)) + path_map[u_arcname] = path + + # Remember the version. + original_version, _ = get_version(path_map, info_dir) + # Files extracted. Call the modifier. + modified = modifier(path_map, **kwargs) + if modified: + # Something changed - need to build a new wheel. + current_version, path = get_version(path_map, info_dir) + if current_version and (current_version == original_version): + # Add or update local version to signify changes. + update_version(current_version, path) + # Decide where the new wheel goes. + if dest_dir is None: + fd, newpath = tempfile.mkstemp(suffix='.whl', + prefix='wheel-update-', + dir=workdir) + os.close(fd) + else: + if not os.path.isdir(dest_dir): + raise DistlibException('Not a directory: %r' % dest_dir) + newpath = os.path.join(dest_dir, self.filename) + archive_paths = list(path_map.items()) + distinfo = os.path.join(workdir, info_dir) + info = distinfo, info_dir + self.write_records(info, workdir, archive_paths) + self.build_zip(newpath, archive_paths) + if dest_dir is None: + shutil.copyfile(newpath, pathname) + return modified + +def compatible_tags(): + """ + Return (pyver, abi, arch) tuples compatible with this Python. + """ + versions = [VER_SUFFIX] + major = VER_SUFFIX[0] + for minor in range(sys.version_info[1] - 1, - 1, -1): + versions.append(''.join([major, str(minor)])) + + abis = [] + for suffix, _, _ in imp.get_suffixes(): + if suffix.startswith('.abi'): + abis.append(suffix.split('.', 2)[1]) + abis.sort() + if ABI != 'none': + abis.insert(0, ABI) + abis.append('none') + result = [] + + arches = [ARCH] + if sys.platform == 'darwin': + m = re.match(r'(\w+)_(\d+)_(\d+)_(\w+)$', ARCH) + if m: + name, major, minor, arch = m.groups() + minor = int(minor) + matches = [arch] + if arch in ('i386', 'ppc'): + matches.append('fat') + if arch in ('i386', 'ppc', 'x86_64'): + matches.append('fat3') + if arch in ('ppc64', 'x86_64'): + matches.append('fat64') + if arch in ('i386', 'x86_64'): + matches.append('intel') + if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'): + matches.append('universal') + while minor >= 0: + for match in matches: + s = '%s_%s_%s_%s' % (name, major, minor, match) + if s != ARCH: # already there + arches.append(s) + minor -= 1 + + # Most specific - our Python version, ABI and arch + for abi in abis: + for arch in arches: + result.append((''.join((IMP_PREFIX, versions[0])), abi, arch)) + + # where no ABI / arch dependency, but IMP_PREFIX dependency + for i, version in enumerate(versions): + result.append((''.join((IMP_PREFIX, version)), 'none', 'any')) + if i == 0: + result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any')) + + # no IMP_PREFIX, ABI or arch dependency + for i, version in enumerate(versions): + result.append((''.join(('py', version)), 'none', 'any')) + if i == 0: + result.append((''.join(('py', version[0])), 'none', 'any')) + return set(result) + + +COMPATIBLE_TAGS = compatible_tags() + +del compatible_tags + + +def is_compatible(wheel, tags=None): + if not isinstance(wheel, Wheel): + wheel = Wheel(wheel) # assume it's a filename + result = False + if tags is None: + tags = COMPATIBLE_TAGS + for ver, abi, arch in tags: + if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch: + result = True + break + return result diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distlib/wheel.pyc new file mode 100644 index 0000000000000000000000000000000000000000..77dc7b33a0afb91b3b124b1fb6da28a77e7cc431 GIT binary patch literal 32061 zcmb`Q32MN$%}6%UA_mIA2X` z-i!!r0AIW1qr6_)rR+MD*s&eQo3d+dr&8J2**N9RQRT#rk2rShiWA$3E3U+e>{P9* zHgRlke*drEn;BAEtsH@zY4q#v*XP&Y-94$Vtn2@s@A_gk@1lQQ{C&YCUHERwxdNYr zD?3+7xaovT=sD@iNjIIeJmM)gor>dKZn`UuuW{4e7EifykE`^$>E71+eQvrhF4ym- z`{VdpH@!BF54h=pIKIwJuZ!dB-Sql6KIocFTAvZll&q(cdqM>?%9l^bS|q>85wO$}Ts(%a`kM z<;PrQx0~MWpL<<-kE^8JblO$+y6L^Hvd>NLbCvyWdcQBx=gJ3MWyDR7xXM8{eb7}N zchir%O2$oRT;-6PKIAHg-SlBsIpU^|xXMvCebiM(-Snt`zu%R|T;-UXKISUN-Slyn zC=R%}CtUGK_eoafDOWtk6B!mFHaXIX6&0oGfg%*Uq@Y7MC8H ze$G_^i>=DtHhtC=c}=nBU9sEE9dL6WbDwl>?gdvEa)oW`n&R7|`1HBBkzs4(yepn} zwQo-ns=qs|zkk~vd25IIMGe#EU3IG~>~x=UZu){NUQiPxzD0b{&0TbbT^1R)@I`lC z?_7%W9(#Y@OL5+A>&4~xagRN|>pRc;Y<8gMTl^wXkA$xn$6(_CSb@vwW6RvRBeTr3n zO?z)LbA%0A`WpW-31W>61kGwGUn>-|^sGJSgKXCS*z+|DQuKWGvkZ-;(UYT%o>&KBM6tme62cLy4~pEX}UE3 zBDFPoiO+_GqT07&jpAY>+gO?}HoBEnD$^z3ovl1yu7-_Vxm+x$oqB1eX>D|oV>P`} zY~%{LMy{c*zcPOP+{JU(&t+e{d}Vy%+$-aaZKO`UG(LVM`~JM`NlhmlyErB610gdc@u5riue_`_VpqML=rk8k{s%usonuiOy{GDQBkXT-^ zLUz7hqq4?QV?AlNi;b+MXJ>L@(Q2<#Q?|G`Ph+7?TccQ+FO=$j{x!&nTD_7hmp)M} zyzbY*2KibwY|iVgR`PhgUaL3t#{AO!Qftvl)!AB8i#b2v)GW^B-pSeX+)@+#?egW4 zJ(lL}Pkz2BcJx4bf|0b%e8iDG2hB+7F#+y~vb!w%A*xhV)gafQugBb`PVMlKnl%uBu!nu{!;eZo3EU^ za^>m;ORqGwv=n`9;_`*77ss=cm#4=|npVqhHitFeV~xuEvH8;cXvuGs(I+p@ed1(A zN%m#otA$$qSix`8WB2Y9i{&vE!uB#yTY9IM&CQg~s6s8ZOAI6i6C3QimA}nTkk+61 z*tIj&%JXl%J$m!Vq5e@lzEgevM&XE34j<~zSkg>K(xH#}V)IMS-?(>#l9?N0K5~fi zzIaJl(L=7T2VY1fZj9Z#Q$En&JoW$E{DJ;Zt9BziynpXoZ{MijsNOsrK1Ryh8B5FT zd+Y6eH;?RFzA<^^(4iaQk<8fPLkB`F{{FolQbX9M>3H~t#%YN3FmNn5B1 zzdkAelsZ>it@TpB&XjYNnL_UQw^ch|*XoS6u61TJ5p9>&CP|3=O&b1~@FU2mupyUv zalV|(7aQ7#wXmV|usCny2=?%>N_`K~)OCw*u$RDEex=r|f+X`i+duW-yfA@ax(Kyk z=Q<;9pn-%%KmbXL7&`_s5Q&5D=(5Bf7ffbEKw4AMLM}t3mTXqCt%y}0ub4_U1S_S= ze6wE6+8zmQ147wCzX7$%VX-{BN^@e=E1NAPD_mxWk`lVCxcj&9m^BGHqa&iFjaTI1G%jtR&syagFxk&5XMNF-W-;&~(bmCEeX_ zS09ezB%WOuc6_EDH30_B^R;=K2t&d)`atYZaFoFI=UofmS*=wS1lEg{+B-#LAZN(L zB{n5CgHCN-wa6{N+{Xi>_A{W7ZC9KTi=DOzLyQ+zZ}~M<9TT-`F{4O(MQ5AkvaP6+ zjXUw337h4{Y7I|BW42T+WGl5ovs|q67>#i-(UMF3iY3+<_e60L zhgt0EVmt*bZjY;`iMwo8xiS%r(o*oGeca9k| z3^D;XYU6m6x#U?jKPRDIB+b<2ia0W3#H=9b#hAQu4JNO!#A225w*RtOB^B$i)V5~f zJdC-$QZ7~_u6sV0zbn2x+g|qIDH;i$Rv@~znu}~*^aEO=>TnBz6HkyF1ek|GQ=9m| zAu*BZB_l#+f^U!0CMqTkX{MeLLyE~17+K46LHA=X(0CB%A* zY_VdL9CV*TLPezAVChK88!fU;!nYbiUfyhxVM*OeK^ER>5gQl6wc6Sxv0Ay0NyJuU zw>2?rxqC!acQIMb7YO>({JT)jg`sxIOtVxjq;qVQi1kcMWK7#cvxUmVFrB$Jel30C z$y0~M>{Z)5O+k2gC->yjC-YrIB^$N~!oOrW*p_T-NHzOa5q7ZQ$ZS&E?Y57zI>|V` zMhg_BcZ|FXah$tCiog9&UDXTcU<;fUdgT z3OI7>!>xyV6Ae~&txC4B;WAkCV+oCuTDCbJ>8_gfSk1@Rf0%whs;_i>fDr*`rutD4 zW`fl952gC47AfaB~?>r-a}d7J(TLGSz%B-3&|B+v!|7^A351 zLk2j)BOYS(q6twZa8@CDCZy)7OD0+tnw5$dTaS-DVbWW*Vt?ML8oKsk=%^*lRGYi# z&*iE$lvW#Q5W4_X@n_Q`bt^aT<=8R*k{5<^^@)ts1;!GFrQ22G7Q;KWX1O5Ax-`3F zDA2Zqv;*RDuDyx8XR-Mur3uIpw5*O?J%14=5-b8wX_Vu6&~C8{iC6F5s~lX8w#de zS04nZ4?$J`2l?u05Yp7m)4JqvVjWN0iFfmV9pCNBC#L^H{Liba>bXW_e9Cta0oLbW z-$0nQhlp=uTZ$QDiy9*#HkCrgb;EvuccPS(p$sTTE5(!(LL!u3)^Vxw8FvSDHv@L0ETrl1qD2Y>h>{$}k76}(Ec$-bR*Aoke-PFPkzWwi) zq8?nw4!-lD3_9V5{*m^$A&y4wcKB;l=cS6|23X7ue%#Vc4e+&9y#Wk=z^X?3*Ke|J zH=A@r+N}V9VyTEnV6U>|Y*ElClj1k${lC!u6rl8LbE*K+1-o|*gbvPuSdVSu9_fc~ zgEV@W*iCMwS1N>MQ!l=qbPL~Yul6|J!MYMRk%WvyFmy5)Y}skoH^w>0TcT?;f> zm;tMpTEG{Z+_KT%`$yf1(emZ>R^y;+zzibW48r3isBU?!t8YwPL!Ox`IQQxsQwu-u zx*A*D-F{a;lHecDZ}6R>U>GD|GT>9-P1I(;s%$eBz5>ckW<&}mjK&&PXlmw1!ZB$P z(KMn$7S(7rW=BsOBB^@?sd((s*FB-KbT2O%4bgU~&CE5W;E9Q_DO!%EXNvh;6TSdS zXUhC^DNI*Np*VwQ)8$(2Zc#j@WH4>*qv?z^I$w8t20}@Op==+?&X5m{QbK2?UoX}J z^}Zn#A{D&#A{#dzTvwhIXwGA=5GE;A8-ZpZkdnyL=00NcwXn2klD0M_iv4QPPsB*{ z$BRo|@Keg`xpK2;j~RinM;L~gdU+J>78hafX>zl00XAp%>e2<*O+WXES+f~D*jdZD z_m1f>N+w%snqy_Z^?kM)nuuscXRBr?iO1Sz9W=2sv%b1jRdK~l{T2;`#|a#WY$(wW zvfjjZC^6DKU_?4)Xk6sHJFy-z-OJzZ#4fK=&@>6@+2$7&Yf)(J)WjopI7UNulo4c+ zT<9W>fL&qsruP0YQ&Jly zgFJ70g2HxnfmFEx!j20>mJJ7rKlAiAqx3liAQ~6kQLvyuikBcHFffTsb}GFJcsRI4 zHDBc$t|xG|SQ7TP^3AK0F$J>45W)WdOw1e$wVD$8{!pZ{Vb(#!%qXZh!a34&2?o82 zy6!p6{Ukh!0NeJpZg$WlZ6`lhQi!b9T)atL()LI6Xs69XUOg3t)J)hcY-`aYMyr7t zsj2_4#wl*mEAwFVQZ7vi{_IHtli~zOqxPI>mb3w!P30+5f*LVxoK_kVLfJ{canD#X9pRGOZb$dZWrc!&Ygt zNSi?*6i}_Ru)jpqnNcy+B(LlDmRKRt$(P2@pPRTO!6e|(kelpe+K%PgJV&aik{7VODRM3#M-KWaDIQpeUa8gSU!u_1mGL+Pp{YXv=rl+k!cuaZ<*fHgYt68}2I`+C0#t*%q*O7D zHSh_*!+|Vqc8rUa(e?)Gvc0Q&;YPZQ8<}u$BP^Fd9zF~(ly*1a-VpC&+Xlp-tpZ18 zN*oXLbFeFhE#Sz2bwMv+%}zjEk_K0saH6@Ju)_$RzLN{@q;uulHH`6hDw6IE?9Liu z&V~6>$*=B{yl2dTUdY~M)oo$n3v!Kyr^3p?4rHKojzl>jcxvt?WI;}$bh{Wf42Wj1 z<)1uZP}Z!M!`y5!J9F|xv1$$vDqEK$!@QOCZV(;DiEkx8_-^${CDk(A$|@o><1xha zsOk|xgt#EtdDlY}rPOiLkaLF` z(qbCm`1SHN80x804+U0Zvx>E}nzO$7<60LbYF)%FNp)c>B7`Equ$}m)MBodw8xm$J z^YntjvcX`B{2uIai{SngGkw6O3QD8eGg6pDs)le2)TcsDM{Je$KafjQeE#IME!%`RpAu!8R=$Y|m{+b)j4HYX@Se7c&FI!}HS0-G@Sn<~*u zAZf`oVRv{4{<@My)N=E|4=T3lefOH%h)>mPjUvLHYz%}5ekSvHC6maIE!HPW^AdGT=9#{H z4QHJfubjI+e$g*Y?e=Z>0TnJ3XPUPyW>e9jsyae$@OKp$hy8iQv@WYP{hC2j2xsZ* zOPYGYgoC_p=D%&{eLRb`NlBNpj_xv>7;8jWx5{O~Q&lD%xcLr%#n9=uGpK_RvW4Lr z_Iw`uMhw|)DJmq}m_xs(1+W9i{gN+VvCt1kw zK$h+36WOMw0bwu8zTy+v)Tlmu$$s~pj6^*H#dsSF+3frQFQ-AqK^*;H6!a>sH`WHpUg8XW@;_(R{9KiPJZ`Wehab1m4=} z(5FNVQl7!kx2@U+LV`m=d~;jfGLbDYo}vT>IjzV{g48*zIOY>Oz%veeBw?MS?)xBL z9=Exj zY)=mrQHE)w|CHb1&R$!1H_2yedDw+tNjA*n$XnjFzgYI`Qi#??YXO#F!ZKF%&eX!6 zC0Y6h8nC(3Vzt(#W4(BtC5sk?NNZ83XlmhZa!OS_=ID(|0vWTu2XCtfG>=!UU~W0} z0F*GAPAF+L3_t+mt*l2v!@_ck&s1TzNZR~+DXs2qH&nnEVh?}PLXJbX0oGk^@q}%a zG!uWw7U(gzvfHho!`&qy!=ZSYu2az-5nD0QiG_hK8xq@r&S1TG%%-0ndO+J}P(wX2 z)Zl=ulDjm1Rp7y=J(o5lUyEkwkwfy1%PVQuphsA@N8ECn$`axU7~MW~go%M{i`1ja z6sh-nmg*_7-@*gdRjMF`Dy%MGCqZm7a~Rav{4U{0*#Y%0vV(Yv;4L4b0!Agm`C`5_ zTS8Z8Wca9=rlnTIT9|HUO2gc$56V(a*y{GyG>tLU~+WU5nTjg(jz8!0rml5we6 z^-kZ<(hKu&m;QM(IYF(~7`+^hUh`AVOQC7MujkNK$2K(6etVD6eghhDIRctV0nHgA z01XV)u-B5z@n8(D%oHXK%T?-0;|IFjDbEK$YGL$E=GCfB_yrbl9eZdVOB)`Ck7(kN#@jAwSRt*?GIz$@R70Ug*{tsxvc7-z~?*O8U$xC;OOQzxbdf;mPv!(nX zK=M@x-0)#;ue>P%{%XsgIY=d@%MU)MSg+=!o8a;**JQZYg5kJsT=}`+!b`y=6;LX2 z!o&8^S4j3o(fx{b^IwOJ8N7QH4S3}JEc2=HbGZ9GZEu}ETwD>eiKg1q2{DpD70p$fr|EAff~ zSv7;7Cdh~*^>WVNS4^)2Una2kKq{=FvEQXIE0hC92Xc$EIeZM!aLI_Vwj)LE4w7Tz z66W^sqa>I<+sjDOn$c;m+%|Uniz;AKsEMny-E0Oa6dD#aj33Oal*v&VTz%evI{14^ z{Z<7(rl3M#GFPD*+*QI$3N9;nS;0S4AVI+I1MQAL1OI5sH?6#J{u9~@T57ijABE&T zgf86D_&mzC0p!ledX_b|yA=_jPaT8paHRWmR*h zui)CmJuRs8H!Pa5w_d;2ER)=#ninI2Sri?HV%Fu+6Uo47{0_j^-ZuuzUOK#6!iH5) z(Q4W|ia=;vb>V^&xsQ?BCbWh>k2M8M$Gl8GHg_-dyI-sH{w!O&pCii(d9AHB1^p61 z_Y2JPM_gMGEDb4ZLz`$v?e zpnZ5{bYngRAESamv;2CSa9)=o87MF3E;!0&g^V`yqCHX96fj1RI9yts=7Wu*n`uEC*U^ z-+!~I-@hnXMTT*jM<{R!8QpidMVQzfbj?H`WE$kCVK{VR$YpTPXBPfN0!5{U=fh}b znSK-0Rvzn^S)Z~yPN57E4v8@RNCCuQ&ZU1#tfY-^PrEE)->{q8;RaUrnx1c;q_R1< zc18gA%m+_q+%}O%iR^Koc&2Bmr)Tj8QyLu1IN*5mern}_TRtGjSs5{2ozMh=`sb6& zC}Iz~DhoFvemq+4gErl~g^~f$?iZ5_-z@n{V?M|PnB<46=y1J1)qrKEZY!t>B2|k- z#^bI4|9`Nh<>!6!5#8&bNkuWi0xqcr3pW6V$K6UMUY8LyE!mh#m;)q1#(XG-C7|Ju zTjuk))?V)(b}L8RGM|h=$!Dws^mHWdz`|!z8Usw#&!_0t++mZU9*e|v5*tU{+) zQ8(NebIW6TjdCl;T=gl{#dbn(0D~vy?|hf0%bpC+ic3x zZtj=~V8?7M(H7k2=8n5%k`VcTwSjuins`xq)?hp%3yGAf@4x);#A~m;f6A$i&k>vQ zzwFYQr&UR8*^x(zHissDudA=`CU1`E+iTOczI%xg)6*xcVfGrx4f&Br-_a+mqf-mz zHC>G-&46@gjSNUE)Kd--76}vqmsb)Ld1GOHH}e%u)(M*_n-K=P@?^*Kvuij4&7?Eq z9tS*f;-2c5xTsQ4oXwr!?Sv{_MpUzMi)k|YU7}QC({IvC7gE^7F31N{<=sp~PABZs-(61Pl~BV`Y26 zp}*ceweW5?pQ)*ZU+jsO`jwvcQhSIc^Ns3~TY4iNG2T*)_`>^W&+|G!?#YiR?r{~< zte$f9ztcmgM1w67=}m;dIoTe!{jWRP23FWDW~Ai(_j;rEpOSV~P((|<#uIVM3vT&i zE_A)iFIah4DcbY6p7Q5nP^8#7)g3<7+c@V61}t77M!E;9#TQl8+<8Ckrw!3PXOjc#t>{ep7q4frAOUih)z zsf9o4U3jmTsq92mG8!@7U9NE<(li0$jf*10>Lpl^Y1!z`dcu5m8S+QMDbBW?baUf+ z5IM9OAhq@Bz6dLr(#ps^<(MGw2JfB5)t=%qHk@>mQ`IA_#r)B}2#_wh!ZWs*+MX|I zP7~jT?-k}}K|tfOn|oO_Rm&ZbbCM@B&%w<#zbVzh{YEF!)450sg_%NHqqc_0v^-qZwj3P#nre3`t?8hf zX5p#l{D}amc%mBwI_l||Lxj(4ty*5PSxjF?k##h!XX`g}u zGNeJ$krj12(o-ExM@p)rX=xrTyXEKD_DSrlOgbo;lQ=c`z&g(?HSAskv#xX6zvK@a zuqd@^XTPI&Tb+yF^GhxHiTRT1QVTFDQ+-;7Xn8@}=>@CMPS=b+{q&QEn1@zXt!n@% zi#BE+86Ej7UZHg6!ZkaCpMG-e)De#5wBEbUghamOG{HjIVn3VLX`g3rMKJ&1EewFO z&YasRjw%q?hV5IoYIYYyIQFPj18O{A=NXf&#KR5Wx~21tw{CUFgVJ00ZDdyo#P!;l zj(GYWHSHf(gDIKas|8I-V`gM~x5LSG;sd>0?Jj_al!Knj)2m%Ert40w$7a$k~EuJl!=*GF0yvAqw|2`*`|DBy*JAH3P`URPu#O!Fc-E! zer~{!Re?*)kQz4%W|S%p$t`kMc@XN&qI;fgF{)DuCAO!q(QFR5 zE_kiiVxDb+LU%hAv^(b^LcJ3tm|pscvEz0Zg$dqxeE{F#SYxqa3Po<^2y10u@OHCg z`p^+vpCa|MCREO}S;nfB9tod~V(GU=!keaTINCf%&TFkxpmGyPmy5S^AUa=93mJei zYC>j_LZ zC~{z1$ve;lr<5U(EO25fYXF;#v4nx0u2m6owe3~8ThKG?H9M=;tmliSku=vZr8S`9 zxJ*g4s<{@pngf#ZN_eSzBp7IBf_D}CDgn$8wc$e6$6qy-HRlqgdgbnCRmhs8{)Sim zenGiEso>`n462B9VEGz1uuvIj!Yhmg1R7A*Z!3S3PU{XH8&yPQt;?bwc0^1Yy^_0I zw8_D>iMwWs`DR1xhEDAINi^s!1oCtVgfnbrjVgo|^>E@*S92DS@oL#JmNi?AxsX{` zOFBgy=(tWWt7^2YT#Zu+1IC!xi}u$@uJ#90wElBt_Ws$wpjPe>m|8sce9zj%3mA>pY8^E2=~~^$=}hGUQ2}#EG5DFeH*0R*!8=Np z64q4O0nD}wepG>+jm#a~57!@W_#q{lZd~vxt|mJ_yVwF=doai|lx2^idYW7ax3K?A z-b&Y?em3KVKx_58+5=j~PnciRuMji%Ze}Ajt1Y{EQL2=|jH%L>g-EA zMi1~$?NYAl*6EOS)aJ*ea-1kh_HjFbZZGn6D!z%aZpC0SfGMPhaj2&o%rMf+`x@EW zWL|SAz}FI*Aw)E-0Z4d1=Sxz{duLZ5_LF4cHf5qLc3Xf}uJkFF9+Ey6IUAP;%giBR zS~anovbK9+3A8er*M(paGcp!kq~-6F(9W@3Z=KxFW5+27v46quDlj4^LJ)EH#zzJ6 z=WUxnf*;T$-_-y>(cG+2LXE&*UG}p~nm6|*2UyQ7%)HH|khiG1&E+36yUZn;5S=2E(lKwuXZ50V zl!Imq3IC6k#KpxPrKni^Wx2RjB zWVqSrFxu-C9E;Eb)A7il(k(9~`MPb0^yGEFRU3=velcUiJ@Av6zm`XQAQr zXP7_m0HILl_#4;9Cv;MM@?lXclP3E^vyX49upOe(-tnB{dy4(Bg1v%1!J_9|viOXH ztZio)b7C|?>;S1@@F#jjj92iMg5M-Cq6U-asY%$#RvIO!dqi7{_MrN8|AihX3O6Zq z&1MmyG)e}&DQ2y#a^SJ*InLpmhkB8OjCPFYQI04EOnYV`5S8_O!PAP(DX1$56&zKd zYfOSaB4!MwArHG#(DT`{K-(A!bS*fn>1Z*f>X31I_NM1hl(t$pLo;bOqb(BsGog&< zNp}zo*}ZiTP)OV(cAe+fArxINGfW8`QZdv{O!o8598VC^&NGgdFP5PhffU<=UCf^G zzF5syNNXuM+JOIX&nCc?YbXu08G+AmtN zE#E55T%c0`f1s%nS#n*i;cD16TyfY8HyY?Qp1$EgQRcw(qDabd!d6~EcID9wn!E-H z(ec}d#%fz&)rV((ArY$6Ku}rsan^8IJ)p(nJC5lrG=~fLx<~|w_G=nlyDQW`pjnAPT zVs@tFzlI!d5`G&R(-9a0+g{%{);!Qzn)FJpu5;A@g0vW|Wf*IUfuO=%Sqc!-@k)gt zxx{6Z*MXH^*W)e)R}@@TAh5M_QNa_6iAf2*px`GJ2;CW*3?mC92FJ9pTI%c_&UqVJ z5*XS^3cEC_<7||nO5sKmjVj@7!+oo?-K-Nf3x6U&+($Dm@i+)aCzXB3%~$Z6o0FRj z4e1`NJiRxru?46L|`7g&zq@^2p-PA;h=ZKj}c{F$+lzn*7;;lSD z!{>#cS46K4m{E^Mi&G8h0<4A4izzig(ngzTt|yE@2;Hn!+aI9WPrBzkAGOdAt?Uyj z{FIjbpuI+{gALWPt=3A3d^W4LR$VF9Ni`#LJ~g=Vz^s~^i+pPSr|O3FWH-x+$2TauyOR?PreoX}=og;<-U$Zh_5)Fsedkk@6HO| zIq;lA=G$%~Ck11m24x&HZRv~%-ao+nzq9MGD8H@4$v`VJYbl*(~2+J>k6ZP4N?G zXCS=oovFiPhoR#?6s;27gBSN_HN3aVPT57VYU0|W4t&8nKu?F_Q7wES$uRhIo`c*1 z9Cvcm+6G_OAzLW*8<{gc(3%na8Z{Wwk6iJDD#pf|IzARzp(0m5Gv`2sbjJ20S}5$Q zxeogB5NQ!F=e=z6iirpN&`M*;uEBp)@ShZD^1QAV4B{2GUa0;(J^qM-&k|&WKptkw ze?e(?6#QQWf3Dy!6ll6Ud;XV-8GHUH#a&Bh7ko|STH3lmN3=b=->X=kf_??xs&Z=; zyH9MD5NR+)T^ksGDD)mPBfGo9F5Y^yo+z*B70hU{%q#M901~M7 zQ*04CC#VPrG^Ux_&7FAJPJ}A)0qp>1)8L|da5@2zdQ6J~#$#IOoUwNIGf7Y=SQm_{ zYYtEfd`W`6aNmGi{0Wor+0Q~#KVWBBIi3QV0%d{%2~EVW|BT|GOra@G*uc^mz9dD$ zvcCr5x81_`8chXXbBGE|^;P*y>ipbbyr&_#kxBtXZfGRY9yI*~VHw{iVnLh_v|teY z`n@_W*$-xg2~?WV9HAgP)&>nxV#YiXi6>#%J8-queiEogB>=^mg6R$Ua2F5ercaaB9Ka6OyT}P z63^6SKOB*u>1arwPBwNJCMM6IA+hjj`87s!yBW4xoI>;afY_EC^_pFsY&L3C!I=9I zlQ9Bn;8I0dAu5y#?msQV@J_BqXGT)9~_+= zBRB$IFNWM9SC9d=)3Li$Y`JyV85|pMtGd>}5ie#jyU2?ne~0@qyp_Lm2GxvN7Sd+O zH4hOyGYW-PWhnlQz^F-iZ1`K1<0M@g#l5_-&jS5aS0vWpkY1CMOu5{uD$=#sK$$cS z6*0v2YN{`$_)vdyX_*3Rb*)2eiaLs|x1&0hkB8dwCaIdghO*`*WEavIb(*^gLevUN zX@3WI;ZUnjy5uKXZd&yw^;}wmwyv04$*o&b*hpD*ORht07o(##6biSh^ZlocY64DG zfMJe~rfZ7b!^y_K#C;gIOVwOC8ZmEhS9Lvl>mh%Tc#yGoQskx~W2>Bka9fIoW!7nNyOkQetMo+icDj!=pI!f$pV@pBMe zygR~CbP<#Z*kA$)R!^CHuj>oCgrS8Q?WkV;ZAEw-=5=)Y1&9s`0+)dLP^XH5pHjj! zvF={&kA%lCnoEmM?ApgKjb5I3@v6y4{wks;$?=Sdlu^d4m;`IeLP=KH3djGAd6-av z6AHdauu3%DTd1(>MmB*rnXu?*9s1Fy=`@yv*{%NMM;{GqR5qgrVK10b2EX(}no6bz zyw2JPCspG@zq z34z;}fcS&`feh9a2}~>6F;RcQJ`0;gKi&4aZER8?*b3BKyvfkua}BL9rk>)bS9hGpPC|WE{{XZiD1T zMkY>;=mr0~JjR)tFl`phvEyb0UL}aJ-?%s z!E+?6(qzK#z(N?)5br>7!2V|y&|S+6DyDf|@;JM(-!$2MiM8ZlaOFEhUIa5bb2~t7 z58S$_iS@^!Oe(8)m`${3-%viA2>ypUC~(y+uVykZG0>3rsPFlx>DQn-cHDIW?O+bC z&*&tsq`beHm^P$73(I_c@$0ab#B44G2fs~WTfE9$>E7o}HiL|4KT+`G z3VvF_pAs07m8*<6i;ScW6WuI1rY-gmlhxp>D)Wq5e_nyKR2_yF6Y9E^F{cb&pYpJX zCj1TSj?Y3wSL0zx=mOsT#_R6Y#=!6ubhIMi$M4*Nq$TX$^mDU05dpD zT`vg~-ynk5K!4x1*!UvLxy&lD)n785$#sC}&cv3~R>^l*&^IMFB>nx2vij@Z7#V4> ztP>My*_ALHWjN4+iArGB>pTl3#g>=1#?S^P6uUZwn& z@@^=Q7fsMma7%%CD1Db=64rwsR?r5CU)JNVD%h=+lNr$T&0a-q+Ub)@JEcIfuuW2X z!Y%fZPJ#v(s8#(71t;C9ZuH09$xVj_Hx8~D>={h=^$qs)?H*X$*W0(DuY0gT_=kOc zef#=2qB*d&Z=mmVp7%_HDTRe;F~6NfWCnCki$$QzIz-Mbz|d^qNpx2vHR-lPo%ukx z^jj*>Xs8VWF2q*CG=(9-Ca7^ct*5Ywg(uw9ZFm5#_PJt$wMo(!Z$58_nGlZcav8WL zS>KJC*XPA0QLPe9z3Ek&>I0P~7UmtFDV0HciIxGX3t^Yu>v!x;2rpeRS=$tMRv9Jq zvbusQb-j%i4JxDKIukE*pG~swbleKr+0KxOkaKa)*(BkdsUL69VQxTSreG2&hKkKb zs;TI=IwAJ-d7Fvsw-b`jnV**BUU}Os?~`#}%QT}r)OU#bKNRQLeJM5u@^)C>KZ*0` zk7Q)1Jb61U@3-PSJOg~*;w^QM>A1@o$CJs$7o;(`c=NRM6&yZ9*}$raiQ!(2E;w2g z3Fv#*+ho3H7JQb$_kQ8M1fMBYmvpBY@WOxKR+zIAco$#NykETef>a&4!ATbwA2W3` zhJqMAV5SmD$@n}o}IplN;%qt)~SFD-mF$>+nh%(0u6>%s$-v|Aobb++tZ_(LkwUofmI{sL_`gI0zBlFRP z59)1aGwujlyuxfnIL7e>RVZL2)#u(0Fl8wWt zOH<(umT8d$G3cKEGQ*Uw5HKml*5wQ&Z4unc>j;1tdF0LV_ z#sQMh_&cvDep@5H^_T%z_<)?8tt#HIuO&m z1wKW-d{1yK!U)gD-EtwZ=SfI*l#Ehb7b>(;p!{b&RxHJ{>pgv`ngM!58q_*o0PN5?F=Z4o%bx0fq{St z_-WsKu}UjztknO~Qf{FIT`Vh49xc{TVw6~KA|u;^0eCh$+vK+^_=PBen+v{Ifq8C8 z^I(#bJa*-}9gdj;x8|djWaBDUI5}cBW&4XAwI_r32n?LdT>FP6&>N8Q%DSdq_@|1U zQXs)1_z4Aj6$nYSuW(RT7w1LuM9}VYd&CVe8@iTSLYdqn%5J-UW|Aj&x@gHa94CrNF@`dCOPSo9qKKiLM zFB<8o2UMe*S{^5^n_FPl6RBi(?@+S4i#H7ZRc;{Jmm1p7_iIl7AMbm`_ for +more information. +""" + +import os +import re +import sys +import json +import shlex +import logging +import argparse +import subprocess + + +_UNIXCONFDIR = os.environ.get('UNIXCONFDIR', '/etc') +_OS_RELEASE_BASENAME = 'os-release' + +#: Translation table for normalizing the "ID" attribute defined in os-release +#: files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as defined in the os-release file, translated to lower case, +#: with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_OS_ID = { + 'ol': 'oracle', # Oracle Linux +} + +#: Translation table for normalizing the "Distributor ID" attribute returned by +#: the lsb_release command, for use by the :func:`distro.id` method. +#: +#: * Key: Value as returned by the lsb_release command, translated to lower +#: case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_LSB_ID = { + 'enterpriseenterpriseas': 'oracle', # Oracle Enterprise Linux 4 + 'enterpriseenterpriseserver': 'oracle', # Oracle Linux 5 + 'redhatenterpriseworkstation': 'rhel', # RHEL 6, 7 Workstation + 'redhatenterpriseserver': 'rhel', # RHEL 6, 7 Server + 'redhatenterprisecomputenode': 'rhel', # RHEL 6 ComputeNode +} + +#: Translation table for normalizing the distro ID derived from the file name +#: of distro release files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as derived from the file name of a distro release file, +#: translated to lower case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_DISTRO_ID = { + 'redhat': 'rhel', # RHEL 6.x, 7.x +} + +# Pattern for content of distro release file (reversed) +_DISTRO_RELEASE_CONTENT_REVERSED_PATTERN = re.compile( + r'(?:[^)]*\)(.*)\()? *(?:STL )?([\d.+\-a-z]*\d) *(?:esaeler *)?(.+)') + +# Pattern for base file name of distro release file +_DISTRO_RELEASE_BASENAME_PATTERN = re.compile( + r'(\w+)[-_](release|version)$') + +# Base file names to be ignored when searching for distro release file +_DISTRO_RELEASE_IGNORE_BASENAMES = ( + 'debian_version', + 'lsb-release', + 'oem-release', + _OS_RELEASE_BASENAME, + 'system-release', + 'plesk-release', +) + + +def linux_distribution(full_distribution_name=True): + """ + Return information about the current OS distribution as a tuple + ``(id_name, version, codename)`` with items as follows: + + * ``id_name``: If *full_distribution_name* is false, the result of + :func:`distro.id`. Otherwise, the result of :func:`distro.name`. + + * ``version``: The result of :func:`distro.version`. + + * ``codename``: The result of :func:`distro.codename`. + + The interface of this function is compatible with the original + :py:func:`platform.linux_distribution` function, supporting a subset of + its parameters. + + The data it returns may not exactly be the same, because it uses more data + sources than the original function, and that may lead to different data if + the OS distribution is not consistent across multiple data sources it + provides (there are indeed such distributions ...). + + Another reason for differences is the fact that the :func:`distro.id` + method normalizes the distro ID string to a reliable machine-readable value + for a number of popular OS distributions. + """ + return _distro.linux_distribution(full_distribution_name) + + +def id(): + """ + Return the distro ID of the current distribution, as a + machine-readable string. + + For a number of OS distributions, the returned distro ID value is + *reliable*, in the sense that it is documented and that it does not change + across releases of the distribution. + + This package maintains the following reliable distro ID values: + + ============== ========================================= + Distro ID Distribution + ============== ========================================= + "ubuntu" Ubuntu + "debian" Debian + "rhel" RedHat Enterprise Linux + "centos" CentOS + "fedora" Fedora + "sles" SUSE Linux Enterprise Server + "opensuse" openSUSE + "amazon" Amazon Linux + "arch" Arch Linux + "cloudlinux" CloudLinux OS + "exherbo" Exherbo Linux + "gentoo" GenToo Linux + "ibm_powerkvm" IBM PowerKVM + "kvmibm" KVM for IBM z Systems + "linuxmint" Linux Mint + "mageia" Mageia + "mandriva" Mandriva Linux + "parallels" Parallels + "pidora" Pidora + "raspbian" Raspbian + "oracle" Oracle Linux (and Oracle Enterprise Linux) + "scientific" Scientific Linux + "slackware" Slackware + "xenserver" XenServer + "openbsd" OpenBSD + "netbsd" NetBSD + "freebsd" FreeBSD + "midnightbsd" MidnightBSD + ============== ========================================= + + If you have a need to get distros for reliable IDs added into this set, + or if you find that the :func:`distro.id` function returns a different + distro ID for one of the listed distros, please create an issue in the + `distro issue tracker`_. + + **Lookup hierarchy and transformations:** + + First, the ID is obtained from the following sources, in the specified + order. The first available and non-empty value is used: + + * the value of the "ID" attribute of the os-release file, + + * the value of the "Distributor ID" attribute returned by the lsb_release + command, + + * the first part of the file name of the distro release file, + + The so determined ID value then passes the following transformations, + before it is returned by this method: + + * it is translated to lower case, + + * blanks (which should not be there anyway) are translated to underscores, + + * a normalization of the ID is performed, based upon + `normalization tables`_. The purpose of this normalization is to ensure + that the ID is as reliable as possible, even across incompatible changes + in the OS distributions. A common reason for an incompatible change is + the addition of an os-release file, or the addition of the lsb_release + command, with ID values that differ from what was previously determined + from the distro release file name. + """ + return _distro.id() + + +def name(pretty=False): + """ + Return the name of the current OS distribution, as a human-readable + string. + + If *pretty* is false, the name is returned without version or codename. + (e.g. "CentOS Linux") + + If *pretty* is true, the version and codename are appended. + (e.g. "CentOS Linux 7.1.1503 (Core)") + + **Lookup hierarchy:** + + The name is obtained from the following sources, in the specified order. + The first available and non-empty value is used: + + * If *pretty* is false: + + - the value of the "NAME" attribute of the os-release file, + + - the value of the "Distributor ID" attribute returned by the lsb_release + command, + + - the value of the "" field of the distro release file. + + * If *pretty* is true: + + - the value of the "PRETTY_NAME" attribute of the os-release file, + + - the value of the "Description" attribute returned by the lsb_release + command, + + - the value of the "" field of the distro release file, appended + with the value of the pretty version ("" and "" + fields) of the distro release file, if available. + """ + return _distro.name(pretty) + + +def version(pretty=False, best=False): + """ + Return the version of the current OS distribution, as a human-readable + string. + + If *pretty* is false, the version is returned without codename (e.g. + "7.0"). + + If *pretty* is true, the codename in parenthesis is appended, if the + codename is non-empty (e.g. "7.0 (Maipo)"). + + Some distributions provide version numbers with different precisions in + the different sources of distribution information. Examining the different + sources in a fixed priority order does not always yield the most precise + version (e.g. for Debian 8.2, or CentOS 7.1). + + The *best* parameter can be used to control the approach for the returned + version: + + If *best* is false, the first non-empty version number in priority order of + the examined sources is returned. + + If *best* is true, the most precise version number out of all examined + sources is returned. + + **Lookup hierarchy:** + + In all cases, the version number is obtained from the following sources. + If *best* is false, this order represents the priority order: + + * the value of the "VERSION_ID" attribute of the os-release file, + * the value of the "Release" attribute returned by the lsb_release + command, + * the version number parsed from the "" field of the first line + of the distro release file, + * the version number parsed from the "PRETTY_NAME" attribute of the + os-release file, if it follows the format of the distro release files. + * the version number parsed from the "Description" attribute returned by + the lsb_release command, if it follows the format of the distro release + files. + """ + return _distro.version(pretty, best) + + +def version_parts(best=False): + """ + Return the version of the current OS distribution as a tuple + ``(major, minor, build_number)`` with items as follows: + + * ``major``: The result of :func:`distro.major_version`. + + * ``minor``: The result of :func:`distro.minor_version`. + + * ``build_number``: The result of :func:`distro.build_number`. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.version_parts(best) + + +def major_version(best=False): + """ + Return the major version of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The major version is the first + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.major_version(best) + + +def minor_version(best=False): + """ + Return the minor version of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The minor version is the second + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.minor_version(best) + + +def build_number(best=False): + """ + Return the build number of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The build number is the third part + of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.build_number(best) + + +def like(): + """ + Return a space-separated list of distro IDs of distributions that are + closely related to the current OS distribution in regards to packaging + and programming interfaces, for example distributions the current + distribution is a derivative from. + + **Lookup hierarchy:** + + This information item is only provided by the os-release file. + For details, see the description of the "ID_LIKE" attribute in the + `os-release man page + `_. + """ + return _distro.like() + + +def codename(): + """ + Return the codename for the release of the current OS distribution, + as a string. + + If the distribution does not have a codename, an empty string is returned. + + Note that the returned codename is not always really a codename. For + example, openSUSE returns "x86_64". This function does not handle such + cases in any special way and just returns the string it finds, if any. + + **Lookup hierarchy:** + + * the codename within the "VERSION" attribute of the os-release file, if + provided, + + * the value of the "Codename" attribute returned by the lsb_release + command, + + * the value of the "" field of the distro release file. + """ + return _distro.codename() + + +def info(pretty=False, best=False): + """ + Return certain machine-readable information items about the current OS + distribution in a dictionary, as shown in the following example: + + .. sourcecode:: python + + { + 'id': 'rhel', + 'version': '7.0', + 'version_parts': { + 'major': '7', + 'minor': '0', + 'build_number': '' + }, + 'like': 'fedora', + 'codename': 'Maipo' + } + + The dictionary structure and keys are always the same, regardless of which + information items are available in the underlying data sources. The values + for the various keys are as follows: + + * ``id``: The result of :func:`distro.id`. + + * ``version``: The result of :func:`distro.version`. + + * ``version_parts -> major``: The result of :func:`distro.major_version`. + + * ``version_parts -> minor``: The result of :func:`distro.minor_version`. + + * ``version_parts -> build_number``: The result of + :func:`distro.build_number`. + + * ``like``: The result of :func:`distro.like`. + + * ``codename``: The result of :func:`distro.codename`. + + For a description of the *pretty* and *best* parameters, see the + :func:`distro.version` method. + """ + return _distro.info(pretty, best) + + +def os_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the os-release file data source of the current OS distribution. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_info() + + +def lsb_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the lsb_release command data source of the current OS distribution. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_info() + + +def distro_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current OS distribution. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_info() + + +def uname_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current OS distribution. + """ + return _distro.uname_info() + + +def os_release_attr(attribute): + """ + Return a single named information item from the os-release file data source + of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_attr(attribute) + + +def lsb_release_attr(attribute): + """ + Return a single named information item from the lsb_release command output + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_attr(attribute) + + +def distro_release_attr(attribute): + """ + Return a single named information item from the distro release file + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_attr(attribute) + + +def uname_attr(attribute): + """ + Return a single named information item from the distro release file + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + """ + return _distro.uname_attr(attribute) + + +class cached_property(object): + """A version of @property which caches the value. On access, it calls the + underlying function and sets the value in `__dict__` so future accesses + will not re-call the property. + """ + def __init__(self, f): + self._fname = f.__name__ + self._f = f + + def __get__(self, obj, owner): + assert obj is not None, 'call {} on an instance'.format(self._fname) + ret = obj.__dict__[self._fname] = self._f(obj) + return ret + + +class LinuxDistribution(object): + """ + Provides information about a OS distribution. + + This package creates a private module-global instance of this class with + default initialization arguments, that is used by the + `consolidated accessor functions`_ and `single source accessor functions`_. + By using default initialization arguments, that module-global instance + returns data about the current OS distribution (i.e. the distro this + package runs on). + + Normally, it is not necessary to create additional instances of this class. + However, in situations where control is needed over the exact data sources + that are used, instances of this class can be created with a specific + distro release file, or a specific os-release file, or without invoking the + lsb_release command. + """ + + def __init__(self, + include_lsb=True, + os_release_file='', + distro_release_file='', + include_uname=True): + """ + The initialization method of this class gathers information from the + available data sources, and stores that in private instance attributes. + Subsequent access to the information items uses these private instance + attributes, so that the data sources are read only once. + + Parameters: + + * ``include_lsb`` (bool): Controls whether the + `lsb_release command output`_ is included as a data source. + + If the lsb_release command is not available in the program execution + path, the data source for the lsb_release command will be empty. + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is to be used as a data source. + + An empty string (the default) will cause the default path name to + be used (see `os-release file`_ for details). + + If the specified or defaulted os-release file does not exist, the + data source for the os-release file will be empty. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is to be used as a data source. + + An empty string (the default) will cause a default search algorithm + to be used (see `distro release file`_ for details). + + If the specified distro release file does not exist, or if no default + distro release file can be found, the data source for the distro + release file will be empty. + + * ``include_uname`` (bool): Controls whether uname command output is + included as a data source. If the uname command is not available in + the program execution path the data source for the uname command will + be empty. + + Public instance attributes: + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``include_lsb`` (bool): The result of the ``include_lsb`` parameter. + This controls whether the lsb information will be loaded. + + * ``include_uname`` (bool): The result of the ``include_uname`` + parameter. This controls whether the uname information will + be loaded. + + Raises: + + * :py:exc:`IOError`: Some I/O issue with an os-release file or distro + release file. + + * :py:exc:`subprocess.CalledProcessError`: The lsb_release command had + some issue (other than not being available in the program execution + path). + + * :py:exc:`UnicodeError`: A data source has unexpected characters or + uses an unexpected encoding. + """ + self.os_release_file = os_release_file or \ + os.path.join(_UNIXCONFDIR, _OS_RELEASE_BASENAME) + self.distro_release_file = distro_release_file or '' # updated later + self.include_lsb = include_lsb + self.include_uname = include_uname + + def __repr__(self): + """Return repr of all info + """ + return \ + "LinuxDistribution(" \ + "os_release_file={self.os_release_file!r}, " \ + "distro_release_file={self.distro_release_file!r}, " \ + "include_lsb={self.include_lsb!r}, " \ + "include_uname={self.include_uname!r}, " \ + "_os_release_info={self._os_release_info!r}, " \ + "_lsb_release_info={self._lsb_release_info!r}, " \ + "_distro_release_info={self._distro_release_info!r}, " \ + "_uname_info={self._uname_info!r})".format( + self=self) + + def linux_distribution(self, full_distribution_name=True): + """ + Return information about the OS distribution that is compatible + with Python's :func:`platform.linux_distribution`, supporting a subset + of its parameters. + + For details, see :func:`distro.linux_distribution`. + """ + return ( + self.name() if full_distribution_name else self.id(), + self.version(), + self.codename() + ) + + def id(self): + """Return the distro ID of the OS distribution, as a string. + + For details, see :func:`distro.id`. + """ + def normalize(distro_id, table): + distro_id = distro_id.lower().replace(' ', '_') + return table.get(distro_id, distro_id) + + distro_id = self.os_release_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_OS_ID) + + distro_id = self.lsb_release_attr('distributor_id') + if distro_id: + return normalize(distro_id, NORMALIZED_LSB_ID) + + distro_id = self.distro_release_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + distro_id = self.uname_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + return '' + + def name(self, pretty=False): + """ + Return the name of the OS distribution, as a string. + + For details, see :func:`distro.name`. + """ + name = self.os_release_attr('name') \ + or self.lsb_release_attr('distributor_id') \ + or self.distro_release_attr('name') \ + or self.uname_attr('name') + if pretty: + name = self.os_release_attr('pretty_name') \ + or self.lsb_release_attr('description') + if not name: + name = self.distro_release_attr('name') \ + or self.uname_attr('name') + version = self.version(pretty=True) + if version: + name = name + ' ' + version + return name or '' + + def version(self, pretty=False, best=False): + """ + Return the version of the OS distribution, as a string. + + For details, see :func:`distro.version`. + """ + versions = [ + self.os_release_attr('version_id'), + self.lsb_release_attr('release'), + self.distro_release_attr('version_id'), + self._parse_distro_release_content( + self.os_release_attr('pretty_name')).get('version_id', ''), + self._parse_distro_release_content( + self.lsb_release_attr('description')).get('version_id', ''), + self.uname_attr('release') + ] + version = '' + if best: + # This algorithm uses the last version in priority order that has + # the best precision. If the versions are not in conflict, that + # does not matter; otherwise, using the last one instead of the + # first one might be considered a surprise. + for v in versions: + if v.count(".") > version.count(".") or version == '': + version = v + else: + for v in versions: + if v != '': + version = v + break + if pretty and version and self.codename(): + version = '{0} ({1})'.format(version, self.codename()) + return version + + def version_parts(self, best=False): + """ + Return the version of the OS distribution, as a tuple of version + numbers. + + For details, see :func:`distro.version_parts`. + """ + version_str = self.version(best=best) + if version_str: + version_regex = re.compile(r'(\d+)\.?(\d+)?\.?(\d+)?') + matches = version_regex.match(version_str) + if matches: + major, minor, build_number = matches.groups() + return major, minor or '', build_number or '' + return '', '', '' + + def major_version(self, best=False): + """ + Return the major version number of the current distribution. + + For details, see :func:`distro.major_version`. + """ + return self.version_parts(best)[0] + + def minor_version(self, best=False): + """ + Return the minor version number of the current distribution. + + For details, see :func:`distro.minor_version`. + """ + return self.version_parts(best)[1] + + def build_number(self, best=False): + """ + Return the build number of the current distribution. + + For details, see :func:`distro.build_number`. + """ + return self.version_parts(best)[2] + + def like(self): + """ + Return the IDs of distributions that are like the OS distribution. + + For details, see :func:`distro.like`. + """ + return self.os_release_attr('id_like') or '' + + def codename(self): + """ + Return the codename of the OS distribution. + + For details, see :func:`distro.codename`. + """ + try: + # Handle os_release specially since distros might purposefully set + # this to empty string to have no codename + return self._os_release_info['codename'] + except KeyError: + return self.lsb_release_attr('codename') \ + or self.distro_release_attr('codename') \ + or '' + + def info(self, pretty=False, best=False): + """ + Return certain machine-readable information about the OS + distribution. + + For details, see :func:`distro.info`. + """ + return dict( + id=self.id(), + version=self.version(pretty, best), + version_parts=dict( + major=self.major_version(best), + minor=self.minor_version(best), + build_number=self.build_number(best) + ), + like=self.like(), + codename=self.codename(), + ) + + def os_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the os-release file data source of the OS distribution. + + For details, see :func:`distro.os_release_info`. + """ + return self._os_release_info + + def lsb_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the lsb_release command data source of the OS + distribution. + + For details, see :func:`distro.lsb_release_info`. + """ + return self._lsb_release_info + + def distro_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the distro release file data source of the OS + distribution. + + For details, see :func:`distro.distro_release_info`. + """ + return self._distro_release_info + + def uname_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the uname command data source of the OS distribution. + + For details, see :func:`distro.uname_info`. + """ + return self._uname_info + + def os_release_attr(self, attribute): + """ + Return a single named information item from the os-release file data + source of the OS distribution. + + For details, see :func:`distro.os_release_attr`. + """ + return self._os_release_info.get(attribute, '') + + def lsb_release_attr(self, attribute): + """ + Return a single named information item from the lsb_release command + output data source of the OS distribution. + + For details, see :func:`distro.lsb_release_attr`. + """ + return self._lsb_release_info.get(attribute, '') + + def distro_release_attr(self, attribute): + """ + Return a single named information item from the distro release file + data source of the OS distribution. + + For details, see :func:`distro.distro_release_attr`. + """ + return self._distro_release_info.get(attribute, '') + + def uname_attr(self, attribute): + """ + Return a single named information item from the uname command + output data source of the OS distribution. + + For details, see :func:`distro.uname_release_attr`. + """ + return self._uname_info.get(attribute, '') + + @cached_property + def _os_release_info(self): + """ + Get the information items from the specified os-release file. + + Returns: + A dictionary containing all information items. + """ + if os.path.isfile(self.os_release_file): + with open(self.os_release_file) as release_file: + return self._parse_os_release_content(release_file) + return {} + + @staticmethod + def _parse_os_release_content(lines): + """ + Parse the lines of an os-release file. + + Parameters: + + * lines: Iterable through the lines in the os-release file. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + lexer = shlex.shlex(lines, posix=True) + lexer.whitespace_split = True + + # The shlex module defines its `wordchars` variable using literals, + # making it dependent on the encoding of the Python source file. + # In Python 2.6 and 2.7, the shlex source file is encoded in + # 'iso-8859-1', and the `wordchars` variable is defined as a byte + # string. This causes a UnicodeDecodeError to be raised when the + # parsed content is a unicode object. The following fix resolves that + # (... but it should be fixed in shlex...): + if sys.version_info[0] == 2 and isinstance(lexer.wordchars, bytes): + lexer.wordchars = lexer.wordchars.decode('iso-8859-1') + + tokens = list(lexer) + for token in tokens: + # At this point, all shell-like parsing has been done (i.e. + # comments processed, quotes and backslash escape sequences + # processed, multi-line values assembled, trailing newlines + # stripped, etc.), so the tokens are now either: + # * variable assignments: var=value + # * commands or their arguments (not allowed in os-release) + if '=' in token: + k, v = token.split('=', 1) + props[k.lower()] = v + else: + # Ignore any tokens that are not variable assignments + pass + + if 'version_codename' in props: + # os-release added a version_codename field. Use that in + # preference to anything else Note that some distros purposefully + # do not have code names. They should be setting + # version_codename="" + props['codename'] = props['version_codename'] + elif 'ubuntu_codename' in props: + # Same as above but a non-standard field name used on older Ubuntus + props['codename'] = props['ubuntu_codename'] + elif 'version' in props: + # If there is no version_codename, parse it from the version + codename = re.search(r'(\(\D+\))|,(\s+)?\D+', props['version']) + if codename: + codename = codename.group() + codename = codename.strip('()') + codename = codename.strip(',') + codename = codename.strip() + # codename appears within paranthese. + props['codename'] = codename + + return props + + @cached_property + def _lsb_release_info(self): + """ + Get the information items from the lsb_release command output. + + Returns: + A dictionary containing all information items. + """ + if not self.include_lsb: + return {} + with open(os.devnull, 'w') as devnull: + try: + cmd = ('lsb_release', '-a') + stdout = subprocess.check_output(cmd, stderr=devnull) + except OSError: # Command not found + return {} + content = self._to_str(stdout).splitlines() + return self._parse_lsb_release_content(content) + + @staticmethod + def _parse_lsb_release_content(lines): + """ + Parse the output of the lsb_release command. + + Parameters: + + * lines: Iterable through the lines of the lsb_release output. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + for line in lines: + kv = line.strip('\n').split(':', 1) + if len(kv) != 2: + # Ignore lines without colon. + continue + k, v = kv + props.update({k.replace(' ', '_').lower(): v.strip()}) + return props + + @cached_property + def _uname_info(self): + with open(os.devnull, 'w') as devnull: + try: + cmd = ('uname', '-rs') + stdout = subprocess.check_output(cmd, stderr=devnull) + except OSError: + return {} + content = self._to_str(stdout).splitlines() + return self._parse_uname_content(content) + + @staticmethod + def _parse_uname_content(lines): + props = {} + match = re.search(r'^([^\s]+)\s+([\d\.]+)', lines[0].strip()) + if match: + name, version = match.groups() + + # This is to prevent the Linux kernel version from + # appearing as the 'best' version on otherwise + # identifiable distributions. + if name == 'Linux': + return {} + props['id'] = name.lower() + props['name'] = name + props['release'] = version + return props + + @staticmethod + def _to_str(text): + encoding = sys.getfilesystemencoding() + encoding = 'utf-8' if encoding == 'ascii' else encoding + + if sys.version_info[0] >= 3: + if isinstance(text, bytes): + return text.decode(encoding) + else: + if isinstance(text, unicode): # noqa + return text.encode(encoding) + + return text + + @cached_property + def _distro_release_info(self): + """ + Get the information items from the specified distro release file. + + Returns: + A dictionary containing all information items. + """ + if self.distro_release_file: + # If it was specified, we use it and parse what we can, even if + # its file name or content does not match the expected pattern. + distro_info = self._parse_distro_release_file( + self.distro_release_file) + basename = os.path.basename(self.distro_release_file) + # The file name pattern for user-specified distro release files + # is somewhat more tolerant (compared to when searching for the + # file), because we want to use what was specified as best as + # possible. + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + if 'name' in distro_info \ + and 'cloudlinux' in distro_info['name'].lower(): + distro_info['id'] = 'cloudlinux' + elif match: + distro_info['id'] = match.group(1) + return distro_info + else: + try: + basenames = os.listdir(_UNIXCONFDIR) + # We sort for repeatability in cases where there are multiple + # distro specific files; e.g. CentOS, Oracle, Enterprise all + # containing `redhat-release` on top of their own. + basenames.sort() + except OSError: + # This may occur when /etc is not readable but we can't be + # sure about the *-release files. Check common entries of + # /etc for information. If they turn out to not be there the + # error is handled in `_parse_distro_release_file()`. + basenames = ['SuSE-release', + 'arch-release', + 'base-release', + 'centos-release', + 'fedora-release', + 'gentoo-release', + 'mageia-release', + 'mandrake-release', + 'mandriva-release', + 'mandrivalinux-release', + 'manjaro-release', + 'oracle-release', + 'redhat-release', + 'sl-release', + 'slackware-version'] + for basename in basenames: + if basename in _DISTRO_RELEASE_IGNORE_BASENAMES: + continue + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + if match: + filepath = os.path.join(_UNIXCONFDIR, basename) + distro_info = self._parse_distro_release_file(filepath) + if 'name' in distro_info: + # The name is always present if the pattern matches + self.distro_release_file = filepath + distro_info['id'] = match.group(1) + if 'cloudlinux' in distro_info['name'].lower(): + distro_info['id'] = 'cloudlinux' + return distro_info + return {} + + def _parse_distro_release_file(self, filepath): + """ + Parse a distro release file. + + Parameters: + + * filepath: Path name of the distro release file. + + Returns: + A dictionary containing all information items. + """ + try: + with open(filepath) as fp: + # Only parse the first line. For instance, on SLES there + # are multiple lines. We don't want them... + return self._parse_distro_release_content(fp.readline()) + except (OSError, IOError): + # Ignore not being able to read a specific, seemingly version + # related file. + # See https://github.com/nir0s/distro/issues/162 + return {} + + @staticmethod + def _parse_distro_release_content(line): + """ + Parse a line from a distro release file. + + Parameters: + * line: Line from the distro release file. Must be a unicode string + or a UTF-8 encoded byte string. + + Returns: + A dictionary containing all information items. + """ + matches = _DISTRO_RELEASE_CONTENT_REVERSED_PATTERN.match( + line.strip()[::-1]) + distro_info = {} + if matches: + # regexp ensures non-None + distro_info['name'] = matches.group(3)[::-1] + if matches.group(2): + distro_info['version_id'] = matches.group(2)[::-1] + if matches.group(1): + distro_info['codename'] = matches.group(1)[::-1] + elif line: + distro_info['name'] = line.strip() + return distro_info + + +_distro = LinuxDistribution() + + +def main(): + logger = logging.getLogger(__name__) + logger.setLevel(logging.DEBUG) + logger.addHandler(logging.StreamHandler(sys.stdout)) + + parser = argparse.ArgumentParser(description="OS distro info tool") + parser.add_argument( + '--json', + '-j', + help="Output in machine readable format", + action="store_true") + args = parser.parse_args() + + if args.json: + logger.info(json.dumps(info(), indent=4, sort_keys=True)) + else: + logger.info('Name: %s', name(pretty=True)) + distribution_version = version(pretty=True) + logger.info('Version: %s', distribution_version) + distribution_codename = codename() + logger.info('Codename: %s', distribution_codename) + + +if __name__ == '__main__': + main() diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/distro.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/distro.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f67cd797b97ab24bc67977484395a9009fcad39b GIT binary patch literal 40345 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. The parser is designed to be compatible with +existing HTML found in the wild and implements well-defined error recovery that +is largely compatible with modern desktop web browsers. + +Example usage:: + + from pip._vendor import html5lib + with open("my_document.html", "rb") as f: + tree = html5lib.parse(f) + +For convenience, this module re-exports the following names: + +* :func:`~.html5parser.parse` +* :func:`~.html5parser.parseFragment` +* :class:`~.html5parser.HTMLParser` +* :func:`~.treebuilders.getTreeBuilder` +* :func:`~.treewalkers.getTreeWalker` +* :func:`~.serializer.serialize` +""" + +from __future__ import absolute_import, division, unicode_literals + +from .html5parser import HTMLParser, parse, parseFragment +from .treebuilders import getTreeBuilder +from .treewalkers import getTreeWalker +from .serializer import serialize + +__all__ = ["HTMLParser", "parse", "parseFragment", "getTreeBuilder", + "getTreeWalker", "serialize"] + +# this has to be at the top level, see how setup.py parses this +#: Distribution version number. +__version__ = "1.1" diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b46589f34fe5b877390c97c9fa74bf4fba9730f GIT binary patch literal 1441 zcmaJ>&2Aev5FY(lw%77c5546;_@or^3Mr5t1UG04G);lFC{zOm_CoD0xhp2*azSz} zJBQwT>x1;#r|Dz#1vfAbQyp9%hdvl@c`6Bhy? zLpuO51U&#Vglq_A1lb787_u=8#0bO~^Z}R&WD_ulkR5_Kg6yb&b^!VqOafWb`xDS7 zV5X2wd;bvhDVQ_J&d@&saSS2>aROor;uLBGJqLl0FF>5bZ?g*&)%`UDNM7Ik{1a<) z=T%cPtqPaB2Ug@>3T7J?){?DmUw?aZ`vZ%azLlk_RG9~5o8)>OLhBdv`DUGmO`Td- z&)31|mn)vK8{A94(lO3*^I9$zNy6|`Icr#}+LYhPMj#nVu`V#G^#wL9CQ%*Cwz8RBng=dy z*^$)~tG(B(IR8v<R%^SV-Zi%|>X#Ihwri zR(C=2ei-2hV?y02k0&$41Ky|-XU(+=(&gH#!ES$os}Gfg19W4P!s+|f`%cVgQ#eDj zUsWHc^liK^qYocrcqhEuC+l`(-6OK@F;7g|qv-b0sUOeN=fBK8!$mkm!|CvG9*CFo zstcWyoG;OXB~`P;dk^6RO+3H-=~xoZa!iH= item[0] + rv = [] + i = 0 + while i < len(charList): + j = 1 + rv.append(charList[i]) + while i + j < len(charList) and charList[i + j][0] <= rv[-1][1] + 1: + rv[-1][1] = charList[i + j][1] + j += 1 + i += j + return rv + + +# We don't really support characters above the BMP :( +max_unicode = int("FFFF", 16) + + +def missingRanges(charList): + rv = [] + if charList[0] != 0: + rv.append([0, charList[0][0] - 1]) + for i, item in enumerate(charList[:-1]): + rv.append([item[1] + 1, charList[i + 1][0] - 1]) + if charList[-1][1] != max_unicode: + rv.append([charList[-1][1] + 1, max_unicode]) + return rv + + +def listToRegexpStr(charList): + rv = [] + for item in charList: + if item[0] == item[1]: + rv.append(escapeRegexp(chr(item[0]))) + else: + rv.append(escapeRegexp(chr(item[0])) + "-" + + escapeRegexp(chr(item[1]))) + return "[%s]" % "".join(rv) + + +def hexToInt(hex_str): + return int(hex_str, 16) + + +def escapeRegexp(string): + specialCharacters = (".", "^", "$", "*", "+", "?", "{", "}", + "[", "]", "|", "(", ")", "-") + for char in specialCharacters: + string = string.replace(char, "\\" + char) + + return string + +# output from the above +nonXmlNameBMPRegexp = re.compile('[\x00-,/:-@\\[-\\^`\\{-\xb6\xb8-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u02cf\u02d2-\u02ff\u0346-\u035f\u0362-\u0385\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482\u0487-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u0590\u05a2\u05ba\u05be\u05c0\u05c3\u05c5-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u063f\u0653-\u065f\u066a-\u066f\u06b8-\u06b9\u06bf\u06cf\u06d4\u06e9\u06ee-\u06ef\u06fa-\u0900\u0904\u093a-\u093b\u094e-\u0950\u0955-\u0957\u0964-\u0965\u0970-\u0980\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09bd\u09c5-\u09c6\u09c9-\u09ca\u09ce-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09f2-\u0a01\u0a03-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a58\u0a5d\u0a5f-\u0a65\u0a75-\u0a80\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0adf\u0ae1-\u0ae5\u0af0-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3b\u0b44-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b62-\u0b65\u0b70-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bd6\u0bd8-\u0be6\u0bf0-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3d\u0c45\u0c49\u0c4e-\u0c54\u0c57-\u0c5f\u0c62-\u0c65\u0c70-\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbd\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce2-\u0ce5\u0cf0-\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d3d\u0d44-\u0d45\u0d49\u0d4e-\u0d56\u0d58-\u0d5f\u0d62-\u0d65\u0d70-\u0e00\u0e2f\u0e3b-\u0e3f\u0e4f\u0e5a-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0f17\u0f1a-\u0f1f\u0f2a-\u0f34\u0f36\u0f38\u0f3a-\u0f3d\u0f48\u0f6a-\u0f70\u0f85\u0f8c-\u0f8f\u0f96\u0f98\u0fae-\u0fb0\u0fb8\u0fba-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u20cf\u20dd-\u20e0\u20e2-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3004\u3006\u3008-\u3020\u3030\u3036-\u3040\u3095-\u3098\u309b-\u309c\u309f-\u30a0\u30fb\u30ff-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa + +nonXmlNameFirstBMPRegexp = re.compile('[\x00-@\\[-\\^`\\{-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u0385\u0387\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u0640\u064b-\u0670\u06b8-\u06b9\u06bf\u06cf\u06d4\u06d6-\u06e4\u06e7-\u0904\u093a-\u093c\u093e-\u0957\u0962-\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09db\u09de\u09e2-\u09ef\u09f2-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a58\u0a5d\u0a5f-\u0a71\u0a75-\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abc\u0abe-\u0adf\u0ae1-\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3c\u0b3e-\u0b5b\u0b5e\u0b62-\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c5f\u0c62-\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cdd\u0cdf\u0ce2-\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d5f\u0d62-\u0e00\u0e2f\u0e31\u0e34-\u0e3f\u0e46-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eb1\u0eb4-\u0ebc\u0ebe-\u0ebf\u0ec5-\u0f3f\u0f48\u0f6a-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3006\u3008-\u3020\u302a-\u3040\u3095-\u30a0\u30fb-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa + +# Simpler things +nonPubidCharRegexp = re.compile("[^\x20\x0D\x0Aa-zA-Z0-9\\-'()+,./:=?;!*#@$_%]") + + +class InfosetFilter(object): + replacementRegexp = re.compile(r"U[\dA-F]{5,5}") + + def __init__(self, + dropXmlnsLocalName=False, + dropXmlnsAttrNs=False, + preventDoubleDashComments=False, + preventDashAtCommentEnd=False, + replaceFormFeedCharacters=True, + preventSingleQuotePubid=False): + + self.dropXmlnsLocalName = dropXmlnsLocalName + self.dropXmlnsAttrNs = dropXmlnsAttrNs + + self.preventDoubleDashComments = preventDoubleDashComments + self.preventDashAtCommentEnd = preventDashAtCommentEnd + + self.replaceFormFeedCharacters = replaceFormFeedCharacters + + self.preventSingleQuotePubid = preventSingleQuotePubid + + self.replaceCache = {} + + def coerceAttribute(self, name, namespace=None): + if self.dropXmlnsLocalName and name.startswith("xmlns:"): + warnings.warn("Attributes cannot begin with xmlns", DataLossWarning) + return None + elif (self.dropXmlnsAttrNs and + namespace == "http://www.w3.org/2000/xmlns/"): + warnings.warn("Attributes cannot be in the xml namespace", DataLossWarning) + return None + else: + return self.toXmlName(name) + + def coerceElement(self, name): + return self.toXmlName(name) + + def coerceComment(self, data): + if self.preventDoubleDashComments: + while "--" in data: + warnings.warn("Comments cannot contain adjacent dashes", DataLossWarning) + data = data.replace("--", "- -") + if data.endswith("-"): + warnings.warn("Comments cannot end in a dash", DataLossWarning) + data += " " + return data + + def coerceCharacters(self, data): + if self.replaceFormFeedCharacters: + for _ in range(data.count("\x0C")): + warnings.warn("Text cannot contain U+000C", DataLossWarning) + data = data.replace("\x0C", " ") + # Other non-xml characters + return data + + def coercePubid(self, data): + dataOutput = data + for char in nonPubidCharRegexp.findall(data): + warnings.warn("Coercing non-XML pubid", DataLossWarning) + replacement = self.getReplacementCharacter(char) + dataOutput = dataOutput.replace(char, replacement) + if self.preventSingleQuotePubid and dataOutput.find("'") >= 0: + warnings.warn("Pubid cannot contain single quote", DataLossWarning) + dataOutput = dataOutput.replace("'", self.getReplacementCharacter("'")) + return dataOutput + + def toXmlName(self, name): + nameFirst = name[0] + nameRest = name[1:] + m = nonXmlNameFirstBMPRegexp.match(nameFirst) + if m: + warnings.warn("Coercing non-XML name: %s" % name, DataLossWarning) + nameFirstOutput = self.getReplacementCharacter(nameFirst) + else: + nameFirstOutput = nameFirst + + nameRestOutput = nameRest + replaceChars = set(nonXmlNameBMPRegexp.findall(nameRest)) + for char in replaceChars: + warnings.warn("Coercing non-XML name: %s" % name, DataLossWarning) + replacement = self.getReplacementCharacter(char) + nameRestOutput = nameRestOutput.replace(char, replacement) + return nameFirstOutput + nameRestOutput + + def getReplacementCharacter(self, char): + if char in self.replaceCache: + replacement = self.replaceCache[char] + else: + replacement = self.escapeChar(char) + return replacement + + def fromXmlName(self, name): + for item in set(self.replacementRegexp.findall(name)): + name = name.replace(item, self.unescapeChar(item)) + return name + + def escapeChar(self, char): + replacement = "U%05X" % ord(char) + self.replaceCache[char] = replacement + return replacement + + def unescapeChar(self, charcode): + return chr(int(charcode[1:], 16)) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_ihatexml.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bde890f1a54ff582f1feb4e9916693354450069a GIT binary patch literal 15464 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", b"<"]) + + +invalid_unicode_no_surrogate = "[\u0001-\u0008\u000B\u000E-\u001F\u007F-\u009F\uFDD0-\uFDEF\uFFFE\uFFFF\U0001FFFE\U0001FFFF\U0002FFFE\U0002FFFF\U0003FFFE\U0003FFFF\U0004FFFE\U0004FFFF\U0005FFFE\U0005FFFF\U0006FFFE\U0006FFFF\U0007FFFE\U0007FFFF\U0008FFFE\U0008FFFF\U0009FFFE\U0009FFFF\U000AFFFE\U000AFFFF\U000BFFFE\U000BFFFF\U000CFFFE\U000CFFFF\U000DFFFE\U000DFFFF\U000EFFFE\U000EFFFF\U000FFFFE\U000FFFFF\U0010FFFE\U0010FFFF]" # noqa + +if _utils.supports_lone_surrogates: + # Use one extra step of indirection and create surrogates with + # eval. Not using this indirection would introduce an illegal + # unicode literal on platforms not supporting such lone + # surrogates. + assert invalid_unicode_no_surrogate[-1] == "]" and invalid_unicode_no_surrogate.count("]") == 1 + invalid_unicode_re = re.compile(invalid_unicode_no_surrogate[:-1] + + eval('"\\uD800-\\uDFFF"') + # pylint:disable=eval-used + "]") +else: + invalid_unicode_re = re.compile(invalid_unicode_no_surrogate) + +non_bmp_invalid_codepoints = {0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, + 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, + 0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, + 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, + 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, + 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, + 0x10FFFE, 0x10FFFF} + +ascii_punctuation_re = re.compile("[\u0009-\u000D\u0020-\u002F\u003A-\u0040\u005C\u005B-\u0060\u007B-\u007E]") + +# Cache for charsUntil() +charsUntilRegEx = {} + + +class BufferedStream(object): + """Buffering for streams that do not have buffering of their own + + The buffer is implemented as a list of chunks on the assumption that + joining many strings will be slow since it is O(n**2) + """ + + def __init__(self, stream): + self.stream = stream + self.buffer = [] + self.position = [-1, 0] # chunk number, offset + + def tell(self): + pos = 0 + for chunk in self.buffer[:self.position[0]]: + pos += len(chunk) + pos += self.position[1] + return pos + + def seek(self, pos): + assert pos <= self._bufferedBytes() + offset = pos + i = 0 + while len(self.buffer[i]) < offset: + offset -= len(self.buffer[i]) + i += 1 + self.position = [i, offset] + + def read(self, bytes): + if not self.buffer: + return self._readStream(bytes) + elif (self.position[0] == len(self.buffer) and + self.position[1] == len(self.buffer[-1])): + return self._readStream(bytes) + else: + return self._readFromBuffer(bytes) + + def _bufferedBytes(self): + return sum([len(item) for item in self.buffer]) + + def _readStream(self, bytes): + data = self.stream.read(bytes) + self.buffer.append(data) + self.position[0] += 1 + self.position[1] = len(data) + return data + + def _readFromBuffer(self, bytes): + remainingBytes = bytes + rv = [] + bufferIndex = self.position[0] + bufferOffset = self.position[1] + while bufferIndex < len(self.buffer) and remainingBytes != 0: + assert remainingBytes > 0 + bufferedData = self.buffer[bufferIndex] + + if remainingBytes <= len(bufferedData) - bufferOffset: + bytesToRead = remainingBytes + self.position = [bufferIndex, bufferOffset + bytesToRead] + else: + bytesToRead = len(bufferedData) - bufferOffset + self.position = [bufferIndex, len(bufferedData)] + bufferIndex += 1 + rv.append(bufferedData[bufferOffset:bufferOffset + bytesToRead]) + remainingBytes -= bytesToRead + + bufferOffset = 0 + + if remainingBytes: + rv.append(self._readStream(remainingBytes)) + + return b"".join(rv) + + +def HTMLInputStream(source, **kwargs): + # Work around Python bug #20007: read(0) closes the connection. + # http://bugs.python.org/issue20007 + if (isinstance(source, http_client.HTTPResponse) or + # Also check for addinfourl wrapping HTTPResponse + (isinstance(source, urllib.response.addbase) and + isinstance(source.fp, http_client.HTTPResponse))): + isUnicode = False + elif hasattr(source, "read"): + isUnicode = isinstance(source.read(0), text_type) + else: + isUnicode = isinstance(source, text_type) + + if isUnicode: + encodings = [x for x in kwargs if x.endswith("_encoding")] + if encodings: + raise TypeError("Cannot set an encoding with a unicode input, set %r" % encodings) + + return HTMLUnicodeInputStream(source, **kwargs) + else: + return HTMLBinaryInputStream(source, **kwargs) + + +class HTMLUnicodeInputStream(object): + """Provides a unicode stream of characters to the HTMLTokenizer. + + This class takes care of character encoding and removing or replacing + incorrect byte-sequences and also provides column and line tracking. + + """ + + _defaultChunkSize = 10240 + + def __init__(self, source): + """Initialises the HTMLInputStream. + + HTMLInputStream(source, [encoding]) -> Normalized stream from source + for use by html5lib. + + source can be either a file-object, local filename or a string. + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + """ + + if not _utils.supports_lone_surrogates: + # Such platforms will have already checked for such + # surrogate errors, so no need to do this checking. + self.reportCharacterErrors = None + elif len("\U0010FFFF") == 1: + self.reportCharacterErrors = self.characterErrorsUCS4 + else: + self.reportCharacterErrors = self.characterErrorsUCS2 + + # List of where new lines occur + self.newLines = [0] + + self.charEncoding = (lookupEncoding("utf-8"), "certain") + self.dataStream = self.openStream(source) + + self.reset() + + def reset(self): + self.chunk = "" + self.chunkSize = 0 + self.chunkOffset = 0 + self.errors = [] + + # number of (complete) lines in previous chunks + self.prevNumLines = 0 + # number of columns in the last line of the previous chunk + self.prevNumCols = 0 + + # Deal with CR LF and surrogates split over chunk boundaries + self._bufferedCharacter = None + + def openStream(self, source): + """Produces a file object from source. + + source can be either a file object, local filename or a string. + + """ + # Already a file object + if hasattr(source, 'read'): + stream = source + else: + stream = StringIO(source) + + return stream + + def _position(self, offset): + chunk = self.chunk + nLines = chunk.count('\n', 0, offset) + positionLine = self.prevNumLines + nLines + lastLinePos = chunk.rfind('\n', 0, offset) + if lastLinePos == -1: + positionColumn = self.prevNumCols + offset + else: + positionColumn = offset - (lastLinePos + 1) + return (positionLine, positionColumn) + + def position(self): + """Returns (line, col) of the current position in the stream.""" + line, col = self._position(self.chunkOffset) + return (line + 1, col) + + def char(self): + """ Read one character from the stream or queue if available. Return + EOF when EOF is reached. + """ + # Read a new chunk from the input stream if necessary + if self.chunkOffset >= self.chunkSize: + if not self.readChunk(): + return EOF + + chunkOffset = self.chunkOffset + char = self.chunk[chunkOffset] + self.chunkOffset = chunkOffset + 1 + + return char + + def readChunk(self, chunkSize=None): + if chunkSize is None: + chunkSize = self._defaultChunkSize + + self.prevNumLines, self.prevNumCols = self._position(self.chunkSize) + + self.chunk = "" + self.chunkSize = 0 + self.chunkOffset = 0 + + data = self.dataStream.read(chunkSize) + + # Deal with CR LF and surrogates broken across chunks + if self._bufferedCharacter: + data = self._bufferedCharacter + data + self._bufferedCharacter = None + elif not data: + # We have no more data, bye-bye stream + return False + + if len(data) > 1: + lastv = ord(data[-1]) + if lastv == 0x0D or 0xD800 <= lastv <= 0xDBFF: + self._bufferedCharacter = data[-1] + data = data[:-1] + + if self.reportCharacterErrors: + self.reportCharacterErrors(data) + + # Replace invalid characters + data = data.replace("\r\n", "\n") + data = data.replace("\r", "\n") + + self.chunk = data + self.chunkSize = len(data) + + return True + + def characterErrorsUCS4(self, data): + for _ in range(len(invalid_unicode_re.findall(data))): + self.errors.append("invalid-codepoint") + + def characterErrorsUCS2(self, data): + # Someone picked the wrong compile option + # You lose + skip = False + for match in invalid_unicode_re.finditer(data): + if skip: + continue + codepoint = ord(match.group()) + pos = match.start() + # Pretty sure there should be endianness issues here + if _utils.isSurrogatePair(data[pos:pos + 2]): + # We have a surrogate pair! + char_val = _utils.surrogatePairToCodepoint(data[pos:pos + 2]) + if char_val in non_bmp_invalid_codepoints: + self.errors.append("invalid-codepoint") + skip = True + elif (codepoint >= 0xD800 and codepoint <= 0xDFFF and + pos == len(data) - 1): + self.errors.append("invalid-codepoint") + else: + skip = False + self.errors.append("invalid-codepoint") + + def charsUntil(self, characters, opposite=False): + """ Returns a string of characters from the stream up to but not + including any character in 'characters' or EOF. 'characters' must be + a container that supports the 'in' method and iteration over its + characters. + """ + + # Use a cache of regexps to find the required characters + try: + chars = charsUntilRegEx[(characters, opposite)] + except KeyError: + if __debug__: + for c in characters: + assert(ord(c) < 128) + regex = "".join(["\\x%02x" % ord(c) for c in characters]) + if not opposite: + regex = "^%s" % regex + chars = charsUntilRegEx[(characters, opposite)] = re.compile("[%s]+" % regex) + + rv = [] + + while True: + # Find the longest matching prefix + m = chars.match(self.chunk, self.chunkOffset) + if m is None: + # If nothing matched, and it wasn't because we ran out of chunk, + # then stop + if self.chunkOffset != self.chunkSize: + break + else: + end = m.end() + # If not the whole chunk matched, return everything + # up to the part that didn't match + if end != self.chunkSize: + rv.append(self.chunk[self.chunkOffset:end]) + self.chunkOffset = end + break + # If the whole remainder of the chunk matched, + # use it all and read the next chunk + rv.append(self.chunk[self.chunkOffset:]) + if not self.readChunk(): + # Reached EOF + break + + r = "".join(rv) + return r + + def unget(self, char): + # Only one character is allowed to be ungotten at once - it must + # be consumed again before any further call to unget + if char is not EOF: + if self.chunkOffset == 0: + # unget is called quite rarely, so it's a good idea to do + # more work here if it saves a bit of work in the frequently + # called char and charsUntil. + # So, just prepend the ungotten character onto the current + # chunk: + self.chunk = char + self.chunk + self.chunkSize += 1 + else: + self.chunkOffset -= 1 + assert self.chunk[self.chunkOffset] == char + + +class HTMLBinaryInputStream(HTMLUnicodeInputStream): + """Provides a unicode stream of characters to the HTMLTokenizer. + + This class takes care of character encoding and removing or replacing + incorrect byte-sequences and also provides column and line tracking. + + """ + + def __init__(self, source, override_encoding=None, transport_encoding=None, + same_origin_parent_encoding=None, likely_encoding=None, + default_encoding="windows-1252", useChardet=True): + """Initialises the HTMLInputStream. + + HTMLInputStream(source, [encoding]) -> Normalized stream from source + for use by html5lib. + + source can be either a file-object, local filename or a string. + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + """ + # Raw Stream - for unicode objects this will encode to utf-8 and set + # self.charEncoding as appropriate + self.rawStream = self.openStream(source) + + HTMLUnicodeInputStream.__init__(self, self.rawStream) + + # Encoding Information + # Number of bytes to use when looking for a meta element with + # encoding information + self.numBytesMeta = 1024 + # Number of bytes to use when using detecting encoding using chardet + self.numBytesChardet = 100 + # Things from args + self.override_encoding = override_encoding + self.transport_encoding = transport_encoding + self.same_origin_parent_encoding = same_origin_parent_encoding + self.likely_encoding = likely_encoding + self.default_encoding = default_encoding + + # Determine encoding + self.charEncoding = self.determineEncoding(useChardet) + assert self.charEncoding[0] is not None + + # Call superclass + self.reset() + + def reset(self): + self.dataStream = self.charEncoding[0].codec_info.streamreader(self.rawStream, 'replace') + HTMLUnicodeInputStream.reset(self) + + def openStream(self, source): + """Produces a file object from source. + + source can be either a file object, local filename or a string. + + """ + # Already a file object + if hasattr(source, 'read'): + stream = source + else: + stream = BytesIO(source) + + try: + stream.seek(stream.tell()) + except Exception: + stream = BufferedStream(stream) + + return stream + + def determineEncoding(self, chardet=True): + # BOMs take precedence over everything + # This will also read past the BOM if present + charEncoding = self.detectBOM(), "certain" + if charEncoding[0] is not None: + return charEncoding + + # If we've been overridden, we've been overridden + charEncoding = lookupEncoding(self.override_encoding), "certain" + if charEncoding[0] is not None: + return charEncoding + + # Now check the transport layer + charEncoding = lookupEncoding(self.transport_encoding), "certain" + if charEncoding[0] is not None: + return charEncoding + + # Look for meta elements with encoding information + charEncoding = self.detectEncodingMeta(), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Parent document encoding + charEncoding = lookupEncoding(self.same_origin_parent_encoding), "tentative" + if charEncoding[0] is not None and not charEncoding[0].name.startswith("utf-16"): + return charEncoding + + # "likely" encoding + charEncoding = lookupEncoding(self.likely_encoding), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Guess with chardet, if available + if chardet: + try: + from pip._vendor.chardet.universaldetector import UniversalDetector + except ImportError: + pass + else: + buffers = [] + detector = UniversalDetector() + while not detector.done: + buffer = self.rawStream.read(self.numBytesChardet) + assert isinstance(buffer, bytes) + if not buffer: + break + buffers.append(buffer) + detector.feed(buffer) + detector.close() + encoding = lookupEncoding(detector.result['encoding']) + self.rawStream.seek(0) + if encoding is not None: + return encoding, "tentative" + + # Try the default encoding + charEncoding = lookupEncoding(self.default_encoding), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Fallback to html5lib's default if even that hasn't worked + return lookupEncoding("windows-1252"), "tentative" + + def changeEncoding(self, newEncoding): + assert self.charEncoding[1] != "certain" + newEncoding = lookupEncoding(newEncoding) + if newEncoding is None: + return + if newEncoding.name in ("utf-16be", "utf-16le"): + newEncoding = lookupEncoding("utf-8") + assert newEncoding is not None + elif newEncoding == self.charEncoding[0]: + self.charEncoding = (self.charEncoding[0], "certain") + else: + self.rawStream.seek(0) + self.charEncoding = (newEncoding, "certain") + self.reset() + raise _ReparseException("Encoding changed from %s to %s" % (self.charEncoding[0], newEncoding)) + + def detectBOM(self): + """Attempts to detect at BOM at the start of the stream. If + an encoding can be determined from the BOM return the name of the + encoding otherwise return None""" + bomDict = { + codecs.BOM_UTF8: 'utf-8', + codecs.BOM_UTF16_LE: 'utf-16le', codecs.BOM_UTF16_BE: 'utf-16be', + codecs.BOM_UTF32_LE: 'utf-32le', codecs.BOM_UTF32_BE: 'utf-32be' + } + + # Go to beginning of file and read in 4 bytes + string = self.rawStream.read(4) + assert isinstance(string, bytes) + + # Try detecting the BOM using bytes from the string + encoding = bomDict.get(string[:3]) # UTF-8 + seek = 3 + if not encoding: + # Need to detect UTF-32 before UTF-16 + encoding = bomDict.get(string) # UTF-32 + seek = 4 + if not encoding: + encoding = bomDict.get(string[:2]) # UTF-16 + seek = 2 + + # Set the read position past the BOM if one was found, otherwise + # set it to the start of the stream + if encoding: + self.rawStream.seek(seek) + return lookupEncoding(encoding) + else: + self.rawStream.seek(0) + return None + + def detectEncodingMeta(self): + """Report the encoding declared by the meta element + """ + buffer = self.rawStream.read(self.numBytesMeta) + assert isinstance(buffer, bytes) + parser = EncodingParser(buffer) + self.rawStream.seek(0) + encoding = parser.getEncoding() + + if encoding is not None and encoding.name in ("utf-16be", "utf-16le"): + encoding = lookupEncoding("utf-8") + + return encoding + + +class EncodingBytes(bytes): + """String-like object with an associated position and various extra methods + If the position is ever greater than the string length then an exception is + raised""" + def __new__(self, value): + assert isinstance(value, bytes) + return bytes.__new__(self, value.lower()) + + def __init__(self, value): + # pylint:disable=unused-argument + self._position = -1 + + def __iter__(self): + return self + + def __next__(self): + p = self._position = self._position + 1 + if p >= len(self): + raise StopIteration + elif p < 0: + raise TypeError + return self[p:p + 1] + + def next(self): + # Py2 compat + return self.__next__() + + def previous(self): + p = self._position + if p >= len(self): + raise StopIteration + elif p < 0: + raise TypeError + self._position = p = p - 1 + return self[p:p + 1] + + def setPosition(self, position): + if self._position >= len(self): + raise StopIteration + self._position = position + + def getPosition(self): + if self._position >= len(self): + raise StopIteration + if self._position >= 0: + return self._position + else: + return None + + position = property(getPosition, setPosition) + + def getCurrentByte(self): + return self[self.position:self.position + 1] + + currentByte = property(getCurrentByte) + + def skip(self, chars=spaceCharactersBytes): + """Skip past a list of characters""" + p = self.position # use property for the error-checking + while p < len(self): + c = self[p:p + 1] + if c not in chars: + self._position = p + return c + p += 1 + self._position = p + return None + + def skipUntil(self, chars): + p = self.position + while p < len(self): + c = self[p:p + 1] + if c in chars: + self._position = p + return c + p += 1 + self._position = p + return None + + def matchBytes(self, bytes): + """Look for a sequence of bytes at the start of a string. If the bytes + are found return True and advance the position to the byte after the + match. Otherwise return False and leave the position alone""" + rv = self.startswith(bytes, self.position) + if rv: + self.position += len(bytes) + return rv + + def jumpTo(self, bytes): + """Look for the next sequence of bytes matching a given sequence. If + a match is found advance the position to the last byte of the match""" + try: + self._position = self.index(bytes, self.position) + len(bytes) - 1 + except ValueError: + raise StopIteration + return True + + +class EncodingParser(object): + """Mini parser for detecting character encoding from meta elements""" + + def __init__(self, data): + """string - the data to work on for encoding detection""" + self.data = EncodingBytes(data) + self.encoding = None + + def getEncoding(self): + if b"") + + def handleMeta(self): + if self.data.currentByte not in spaceCharactersBytes: + # if we have ") + + def getAttribute(self): + """Return a name,value pair for the next attribute in the stream, + if one is found, or None""" + data = self.data + # Step 1 (skip chars) + c = data.skip(spaceCharactersBytes | frozenset([b"/"])) + assert c is None or len(c) == 1 + # Step 2 + if c in (b">", None): + return None + # Step 3 + attrName = [] + attrValue = [] + # Step 4 attribute name + while True: + if c == b"=" and attrName: + break + elif c in spaceCharactersBytes: + # Step 6! + c = data.skip() + break + elif c in (b"/", b">"): + return b"".join(attrName), b"" + elif c in asciiUppercaseBytes: + attrName.append(c.lower()) + elif c is None: + return None + else: + attrName.append(c) + # Step 5 + c = next(data) + # Step 7 + if c != b"=": + data.previous() + return b"".join(attrName), b"" + # Step 8 + next(data) + # Step 9 + c = data.skip() + # Step 10 + if c in (b"'", b'"'): + # 10.1 + quoteChar = c + while True: + # 10.2 + c = next(data) + # 10.3 + if c == quoteChar: + next(data) + return b"".join(attrName), b"".join(attrValue) + # 10.4 + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + # 10.5 + else: + attrValue.append(c) + elif c == b">": + return b"".join(attrName), b"" + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + elif c is None: + return None + else: + attrValue.append(c) + # Step 11 + while True: + c = next(data) + if c in spacesAngleBrackets: + return b"".join(attrName), b"".join(attrValue) + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + elif c is None: + return None + else: + attrValue.append(c) + + +class ContentAttrParser(object): + def __init__(self, data): + assert isinstance(data, bytes) + self.data = data + + def parse(self): + try: + # Check if the attr name is charset + # otherwise return + self.data.jumpTo(b"charset") + self.data.position += 1 + self.data.skip() + if not self.data.currentByte == b"=": + # If there is no = sign keep looking for attrs + return None + self.data.position += 1 + self.data.skip() + # Look for an encoding between matching quote marks + if self.data.currentByte in (b'"', b"'"): + quoteMark = self.data.currentByte + self.data.position += 1 + oldPosition = self.data.position + if self.data.jumpTo(quoteMark): + return self.data[oldPosition:self.data.position] + else: + return None + else: + # Unquoted value + oldPosition = self.data.position + try: + self.data.skipUntil(spaceCharactersBytes) + return self.data[oldPosition:self.data.position] + except StopIteration: + # Return the whole remaining value + return self.data[oldPosition:] + except StopIteration: + return None + + +def lookupEncoding(encoding): + """Return the python codec name corresponding to an encoding or None if the + string doesn't correspond to a valid encoding.""" + if isinstance(encoding, bytes): + try: + encoding = encoding.decode("ascii") + except UnicodeDecodeError: + return None + + if encoding is not None: + try: + return webencodings.lookup(encoding) + except AttributeError: + return None + else: + return None diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_inputstream.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_inputstream.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f105cdac578750e88a8898dfa8ddd15afb2264f1 GIT binary patch literal 27426 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 (3, 7): + attributeMap = dict +else: + attributeMap = OrderedDict + + +class HTMLTokenizer(object): + """ This class takes care of tokenizing HTML. + + * self.currentToken + Holds the token that is currently being processed. + + * self.state + Holds a reference to the method to be invoked... XXX + + * self.stream + Points to HTMLInputStream object. + """ + + def __init__(self, stream, parser=None, **kwargs): + + self.stream = HTMLInputStream(stream, **kwargs) + self.parser = parser + + # Setup the initial tokenizer state + self.escapeFlag = False + self.lastFourChars = [] + self.state = self.dataState + self.escape = False + + # The current token being created + self.currentToken = None + super(HTMLTokenizer, self).__init__() + + def __iter__(self): + """ This is where the magic happens. + + We do our usually processing through the states and when we have a token + to return we yield the token which pauses processing until the next token + is requested. + """ + self.tokenQueue = deque([]) + # Start processing. When EOF is reached self.state will return False + # instead of True and the loop will terminate. + while self.state(): + while self.stream.errors: + yield {"type": tokenTypes["ParseError"], "data": self.stream.errors.pop(0)} + while self.tokenQueue: + yield self.tokenQueue.popleft() + + def consumeNumberEntity(self, isHex): + """This function returns either U+FFFD or the character based on the + decimal or hexadecimal representation. It also discards ";" if present. + If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked. + """ + + allowed = digits + radix = 10 + if isHex: + allowed = hexDigits + radix = 16 + + charStack = [] + + # Consume all the characters that are in range while making sure we + # don't hit an EOF. + c = self.stream.char() + while c in allowed and c is not EOF: + charStack.append(c) + c = self.stream.char() + + # Convert the set of characters consumed to an int. + charAsInt = int("".join(charStack), radix) + + # Certain characters get replaced with others + if charAsInt in replacementCharacters: + char = replacementCharacters[charAsInt] + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + elif ((0xD800 <= charAsInt <= 0xDFFF) or + (charAsInt > 0x10FFFF)): + char = "\uFFFD" + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + else: + # Should speed up this check somehow (e.g. move the set to a constant) + if ((0x0001 <= charAsInt <= 0x0008) or + (0x000E <= charAsInt <= 0x001F) or + (0x007F <= charAsInt <= 0x009F) or + (0xFDD0 <= charAsInt <= 0xFDEF) or + charAsInt in frozenset([0x000B, 0xFFFE, 0xFFFF, 0x1FFFE, + 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, + 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, + 0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, + 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, + 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, + 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, + 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, + 0xFFFFF, 0x10FFFE, 0x10FFFF])): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + try: + # Try/except needed as UCS-2 Python builds' unichar only works + # within the BMP. + char = chr(charAsInt) + except ValueError: + v = charAsInt - 0x10000 + char = chr(0xD800 | (v >> 10)) + chr(0xDC00 | (v & 0x3FF)) + + # Discard the ; if present. Otherwise, put it back on the queue and + # invoke parseError on parser. + if c != ";": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "numeric-entity-without-semicolon"}) + self.stream.unget(c) + + return char + + def consumeEntity(self, allowedChar=None, fromAttribute=False): + # Initialise to the default output for when no entity is matched + output = "&" + + charStack = [self.stream.char()] + if (charStack[0] in spaceCharacters or charStack[0] in (EOF, "<", "&") or + (allowedChar is not None and allowedChar == charStack[0])): + self.stream.unget(charStack[0]) + + elif charStack[0] == "#": + # Read the next character to see if it's hex or decimal + hex = False + charStack.append(self.stream.char()) + if charStack[-1] in ("x", "X"): + hex = True + charStack.append(self.stream.char()) + + # charStack[-1] should be the first digit + if (hex and charStack[-1] in hexDigits) \ + or (not hex and charStack[-1] in digits): + # At least one digit found, so consume the whole number + self.stream.unget(charStack[-1]) + output = self.consumeNumberEntity(hex) + else: + # No digits found + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "expected-numeric-entity"}) + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + + else: + # At this point in the process might have named entity. Entities + # are stored in the global variable "entities". + # + # Consume characters and compare to these to a substring of the + # entity names in the list until the substring no longer matches. + while (charStack[-1] is not EOF): + if not entitiesTrie.has_keys_with_prefix("".join(charStack)): + break + charStack.append(self.stream.char()) + + # At this point we have a string that starts with some characters + # that may match an entity + # Try to find the longest entity the string will match to take care + # of ¬i for instance. + try: + entityName = entitiesTrie.longest_prefix("".join(charStack[:-1])) + entityLength = len(entityName) + except KeyError: + entityName = None + + if entityName is not None: + if entityName[-1] != ";": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "named-entity-without-semicolon"}) + if (entityName[-1] != ";" and fromAttribute and + (charStack[entityLength] in asciiLetters or + charStack[entityLength] in digits or + charStack[entityLength] == "=")): + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + else: + output = entities[entityName] + self.stream.unget(charStack.pop()) + output += "".join(charStack[entityLength:]) + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-named-entity"}) + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + + if fromAttribute: + self.currentToken["data"][-1][1] += output + else: + if output in spaceCharacters: + tokenType = "SpaceCharacters" + else: + tokenType = "Characters" + self.tokenQueue.append({"type": tokenTypes[tokenType], "data": output}) + + def processEntityInAttribute(self, allowedChar): + """This method replaces the need for "entityInAttributeValueState". + """ + self.consumeEntity(allowedChar=allowedChar, fromAttribute=True) + + def emitCurrentToken(self): + """This method is a generic handler for emitting the tags. It also sets + the state to "data" because that's what's needed after a token has been + emitted. + """ + token = self.currentToken + # Add token to the queue to be yielded + if (token["type"] in tagTokenTypes): + token["name"] = token["name"].translate(asciiUpper2Lower) + if token["type"] == tokenTypes["StartTag"]: + raw = token["data"] + data = attributeMap(raw) + if len(raw) > len(data): + # we had some duplicated attribute, fix so first wins + data.update(raw[::-1]) + token["data"] = data + + if token["type"] == tokenTypes["EndTag"]: + if token["data"]: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "attributes-in-end-tag"}) + if token["selfClosing"]: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "self-closing-flag-on-end-tag"}) + self.tokenQueue.append(token) + self.state = self.dataState + + # Below are the various tokenizer states worked out. + def dataState(self): + data = self.stream.char() + if data == "&": + self.state = self.entityDataState + elif data == "<": + self.state = self.tagOpenState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\u0000"}) + elif data is EOF: + # Tokenization ends. + return False + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def entityDataState(self): + self.consumeEntity() + self.state = self.dataState + return True + + def rcdataState(self): + data = self.stream.char() + if data == "&": + self.state = self.characterReferenceInRcdata + elif data == "<": + self.state = self.rcdataLessThanSignState + elif data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def characterReferenceInRcdata(self): + self.consumeEntity() + self.state = self.rcdataState + return True + + def rawtextState(self): + data = self.stream.char() + if data == "<": + self.state = self.rawtextLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def scriptDataState(self): + data = self.stream.char() + if data == "<": + self.state = self.scriptDataLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def plaintextState(self): + data = self.stream.char() + if data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + self.stream.charsUntil("\u0000")}) + return True + + def tagOpenState(self): + data = self.stream.char() + if data == "!": + self.state = self.markupDeclarationOpenState + elif data == "/": + self.state = self.closeTagOpenState + elif data in asciiLetters: + self.currentToken = {"type": tokenTypes["StartTag"], + "name": data, "data": [], + "selfClosing": False, + "selfClosingAcknowledged": False} + self.state = self.tagNameState + elif data == ">": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-right-bracket"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<>"}) + self.state = self.dataState + elif data == "?": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-question-mark"}) + self.stream.unget(data) + self.state = self.bogusCommentState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.dataState + return True + + def closeTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.currentToken = {"type": tokenTypes["EndTag"], "name": data, + "data": [], "selfClosing": False} + self.state = self.tagNameState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-right-bracket"}) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-eof"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "": + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-tag-name"}) + self.state = self.dataState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + else: + self.currentToken["name"] += data + # (Don't use charsUntil here, because tag names are + # very short and it's faster to not do anything fancy) + return True + + def rcdataLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.rcdataEndTagOpenState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rcdataEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.rcdataEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataEscapedState + elif data == EOF: + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.scriptDataEscapedEndTagOpenState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<" + data}) + self.temporaryBuffer = data + self.state = self.scriptDataDoubleEscapeStartState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer = data + self.state = self.scriptDataEscapedEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": ""))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataDoubleEscapedState + else: + self.state = self.scriptDataEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataDoubleEscapedState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + return True + + def scriptDataDoubleEscapedDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedDashDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "/"}) + self.temporaryBuffer = "" + self.state = self.scriptDataDoubleEscapeEndState + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapeEndState(self): + data = self.stream.char() + if data in (spaceCharacters | frozenset(("/", ">"))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataEscapedState + else: + self.state = self.scriptDataDoubleEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def beforeAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data in ("'", '"', "=", "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-name-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def attributeNameState(self): + data = self.stream.char() + leavingThisState = True + emitToken = False + if data == "=": + self.state = self.beforeAttributeValueState + elif data in asciiLetters: + self.currentToken["data"][-1][0] += data +\ + self.stream.charsUntil(asciiLetters, True) + leavingThisState = False + elif data == ">": + # XXX If we emit here the attributes are converted to a dict + # without being checked and when the code below runs we error + # because data is a dict not a list + emitToken = True + elif data in spaceCharacters: + self.state = self.afterAttributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][0] += "\uFFFD" + leavingThisState = False + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"][-1][0] += data + leavingThisState = False + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-attribute-name"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][0] += data + leavingThisState = False + + if leavingThisState: + # Attributes are not dropped at this stage. That happens when the + # start tag token is emitted so values can still be safely appended + # to attributes, but we do want to report the parse error in time. + self.currentToken["data"][-1][0] = ( + self.currentToken["data"][-1][0].translate(asciiUpper2Lower)) + for name, _ in self.currentToken["data"][:-1]: + if self.currentToken["data"][-1][0] == name: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "duplicate-attribute"}) + break + # XXX Fix for above XXX + if emitToken: + self.emitCurrentToken() + return True + + def afterAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "=": + self.state = self.beforeAttributeValueState + elif data == ">": + self.emitCurrentToken() + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-after-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-end-of-tag-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def beforeAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "\"": + self.state = self.attributeValueDoubleQuotedState + elif data == "&": + self.state = self.attributeValueUnQuotedState + self.stream.unget(data) + elif data == "'": + self.state = self.attributeValueSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-right-bracket"}) + self.emitCurrentToken() + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + self.state = self.attributeValueUnQuotedState + elif data in ("=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "equals-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + return True + + def attributeValueDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute('"') + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-double-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("\"", "&", "\u0000")) + return True + + def attributeValueSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute("'") + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-single-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("'", "&", "\u0000")) + return True + + def attributeValueUnQuotedState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == "&": + self.processEntityInAttribute(">") + elif data == ">": + self.emitCurrentToken() + elif data in ('"', "'", "=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-no-quotes"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.stream.charsUntil( + frozenset(("&", ">", '"', "'", "=", "<", "`", "\u0000")) | spaceCharacters) + return True + + def afterAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-EOF-after-attribute-value"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-attribute-value"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def selfClosingStartTagState(self): + data = self.stream.char() + if data == ">": + self.currentToken["selfClosing"] = True + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "unexpected-EOF-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def bogusCommentState(self): + # Make a new comment token and give it as value all the characters + # until the first > or EOF (charsUntil checks for EOF automatically) + # and emit it. + data = self.stream.charsUntil(">") + data = data.replace("\u0000", "\uFFFD") + self.tokenQueue.append( + {"type": tokenTypes["Comment"], "data": data}) + + # Eat the character directly after the bogus comment which is either a + # ">" or an EOF. + self.stream.char() + self.state = self.dataState + return True + + def markupDeclarationOpenState(self): + charStack = [self.stream.char()] + if charStack[-1] == "-": + charStack.append(self.stream.char()) + if charStack[-1] == "-": + self.currentToken = {"type": tokenTypes["Comment"], "data": ""} + self.state = self.commentStartState + return True + elif charStack[-1] in ('d', 'D'): + matched = True + for expected in (('o', 'O'), ('c', 'C'), ('t', 'T'), + ('y', 'Y'), ('p', 'P'), ('e', 'E')): + charStack.append(self.stream.char()) + if charStack[-1] not in expected: + matched = False + break + if matched: + self.currentToken = {"type": tokenTypes["Doctype"], + "name": "", + "publicId": None, "systemId": None, + "correct": True} + self.state = self.doctypeState + return True + elif (charStack[-1] == "[" and + self.parser is not None and + self.parser.tree.openElements and + self.parser.tree.openElements[-1].namespace != self.parser.tree.defaultNamespace): + matched = True + for expected in ["C", "D", "A", "T", "A", "["]: + charStack.append(self.stream.char()) + if charStack[-1] != expected: + matched = False + break + if matched: + self.state = self.cdataSectionState + return True + + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-dashes-or-doctype"}) + + while charStack: + self.stream.unget(charStack.pop()) + self.state = self.bogusCommentState + return True + + def commentStartState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentStartDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + self.state = self.commentState + return True + + def commentStartDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + \ + self.stream.charsUntil(("-", "\u0000")) + return True + + def commentEndDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentEndState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--\uFFFD" + self.state = self.commentState + elif data == "!": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-bang-after-double-dash-in-comment"}) + self.state = self.commentEndBangState + elif data == "-": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-dash-after-double-dash-in-comment"}) + self.currentToken["data"] += data + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-double-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-comment"}) + self.currentToken["data"] += "--" + data + self.state = self.commentState + return True + + def commentEndBangState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "-": + self.currentToken["data"] += "--!" + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--!\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-bang-state"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "--!" + data + self.state = self.commentState + return True + + def doctypeState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "need-space-after-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeNameState + return True + + def beforeDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-right-bracket"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] = "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] = data + self.state = self.doctypeNameState + return True + + def doctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.state = self.afterDoctypeNameState + elif data == ">": + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype-name"}) + self.currentToken["correct"] = False + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] += data + return True + + def afterDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.currentToken["correct"] = False + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + if data in ("p", "P"): + matched = True + for expected in (("u", "U"), ("b", "B"), ("l", "L"), + ("i", "I"), ("c", "C")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypePublicKeywordState + return True + elif data in ("s", "S"): + matched = True + for expected in (("y", "Y"), ("s", "S"), ("t", "T"), + ("e", "E"), ("m", "M")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypeSystemKeywordState + return True + + # All the characters read before the current 'data' will be + # [a-zA-Z], so they're garbage in the bogus doctype and can be + # discarded; only the latest character might be '>' or EOF + # and needs to be ungetted + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-space-or-right-bracket-in-doctype", "datavars": + {"data": data}}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + + return True + + def afterDoctypePublicKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypePublicIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + return True + + def beforeDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypePublicIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def doctypePublicIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def afterDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.betweenDoctypePublicAndSystemIdentifiersState + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def betweenDoctypePublicAndSystemIdentifiersState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def afterDoctypeSystemKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeSystemIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + return True + + def beforeDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypeSystemIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def doctypeSystemIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def afterDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.state = self.bogusDoctypeState + return True + + def bogusDoctypeState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + # XXX EMIT + self.stream.unget(data) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + pass + return True + + def cdataSectionState(self): + data = [] + while True: + data.append(self.stream.charsUntil("]")) + data.append(self.stream.charsUntil(">")) + char = self.stream.char() + if char == EOF: + break + else: + assert char == ">" + if data[-1][-2:] == "]]": + data[-1] = data[-1][:-2] + break + else: + data.append(char) + + data = "".join(data) # pylint:disable=redefined-variable-type + # Deal with null here rather than in the parser + nullCount = data.count("\u0000") + if nullCount > 0: + for _ in range(nullCount): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + data = data.replace("\u0000", "\uFFFD") + if data: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": data}) + self.state = self.dataState + return True diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_tokenizer.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2dc8542ea3ad7de9efd5fae83768c92fcf544474 GIT binary patch literal 53831 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.py new file mode 100644 index 0000000..c178b21 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.py @@ -0,0 +1,67 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +from bisect import bisect_left + +from ._base import Trie as ABCTrie + + +class Trie(ABCTrie): + def __init__(self, data): + if not all(isinstance(x, text_type) for x in data.keys()): + raise TypeError("All keys must be strings") + + self._data = data + self._keys = sorted(data.keys()) + self._cachestr = "" + self._cachepoints = (0, len(data)) + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + return iter(self._data) + + def __getitem__(self, key): + return self._data[key] + + def keys(self, prefix=None): + if prefix is None or prefix == "" or not self._keys: + return set(self._keys) + + if prefix.startswith(self._cachestr): + lo, hi = self._cachepoints + start = i = bisect_left(self._keys, prefix, lo, hi) + else: + start = i = bisect_left(self._keys, prefix) + + keys = set() + if start == len(self._keys): + return keys + + while self._keys[i].startswith(prefix): + keys.add(self._keys[i]) + i += 1 + + self._cachestr = prefix + self._cachepoints = (start, i) + + return keys + + def has_keys_with_prefix(self, prefix): + if prefix in self._data: + return True + + if prefix.startswith(self._cachestr): + lo, hi = self._cachepoints + i = bisect_left(self._keys, prefix, lo, hi) + else: + i = bisect_left(self._keys, prefix) + + if i == len(self._keys): + return False + + return self._keys[i].startswith(prefix) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_trie/py.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85f92697e5984dd29047b8c218df9a9483bf5522 GIT binary patch literal 2969 zcmcImU2hvj6uq-vJ9cQBl710dXebi0gqk2E3J+BUEg-=|kTw+v3p6<1akI|u+T9tK zq)J|BUwGkfAo0$x;fdeCJK~(Xwv!^Bz$D(;yYqSOJ$KGbc=OWKUzV3A-ZOd-AgQYUA-{tCI4Ml&?kMn78HY+CMDug!b((Fm*vvCfWz z__)sid=A42{f4VR4A&718V!0*11>hyXi6HZ(V~0s`#A#E7Wm9=9Z7b(^kBfr`Owb? zT;u>o&?uwhv5}EsWIld|ml6NA1S}fS{=rD8J&r|eLqdGo8?CGahK3rz5KCBL2Q&>M ztppfBsOjp?fH5G97>_56*I{6eZ!gP()CMDRS6FAzJvmu(m@n*`8#R+d3@IZ@>H5=;@t;Rr=T`u1v?(_I@bx_wsCS z+XhgxJvrK%9C^}u_mL~z;iS4pLOoY%$@CSxKFagW19#*%i>VKrdv4QXWckQX(Kbsf zO$);8=Q$!L!v2~p50NLIR25Q;k+Eq%^g|1lM~zGC%0*{8=nwWCrVpGecV#%oL0UT* zXJznp7&NRdAL>$^a*46fonUQNX2Dt#;fX=a4YL+?%oWoyizH)=G|A4x0HYvy1lL;& zGRafI;R-uhhozpu;bkJ$AlU&nZXe`ZdkO0(fnqch=h?Wx$^-;fP2aPLmvH0PfE79c zFB9kr=Ce?V(%P&47Nc@bP5K{kwiPEAv3BDOP!c|WG??5fHS3^%V;;(Xpgp;Qp34j+ zSGM+%3qV;|djp?y%88JX=7v+0f5HGhsLVlI{4KSO96**}YaX1dwyA`tNrCPo6}wSP zjjP7m)|77|Il&M5*qZfb-eY7#p2ZTM#B$P<^6CrCP`OzHmVo%4U}&wM^Be?}>SsB| z#yR|8K5bJrh(L3+`kjrV_L(+-GRIKlNZ!YakAIP`2m~>KZsXUS%W_kv)pKvB7A&%( zC!%K3&bV~R1yt$A^e(9QLU^m-zt6&c!oxConFUoxcZhcFr)if_u6H#hZBn^mb_gFK zU1NRiXDV?wMcb~NwG+b zpYTzKt=6sT5>KUFRE_Fn0IMMX3yphxhI~X7+=0h41CNJwoZUMsP|M(0S~dVaXng(uE5^ulK$BVQ}zpIt)`o`#W= 0xD800 and ord(data[0]) <= 0xDBFF and + ord(data[1]) >= 0xDC00 and ord(data[1]) <= 0xDFFF) + + +def surrogatePairToCodepoint(data): + char_val = (0x10000 + (ord(data[0]) - 0xD800) * 0x400 + + (ord(data[1]) - 0xDC00)) + return char_val + +# Module Factory Factory (no, this isn't Java, I know) +# Here to stop this being duplicated all over the place. + + +def moduleFactoryFactory(factory): + moduleCache = {} + + def moduleFactory(baseModule, *args, **kwargs): + if isinstance(ModuleType.__name__, type("")): + name = "_%s_factory" % baseModule.__name__ + else: + name = b"_%s_factory" % baseModule.__name__ + + kwargs_tuple = tuple(kwargs.items()) + + try: + return moduleCache[name][args][kwargs_tuple] + except KeyError: + mod = ModuleType(name) + objs = factory(baseModule, *args, **kwargs) + mod.__dict__.update(objs) + if "name" not in moduleCache: + moduleCache[name] = {} + if "args" not in moduleCache[name]: + moduleCache[name][args] = {} + if "kwargs" not in moduleCache[name][args]: + moduleCache[name][args][kwargs_tuple] = {} + moduleCache[name][args][kwargs_tuple] = mod + return mod + + return moduleFactory + + +def memoize(func): + cache = {} + + def wrapped(*args, **kwargs): + key = (tuple(args), tuple(kwargs.items())) + if key not in cache: + cache[key] = func(*args, **kwargs) + return cache[key] + + return wrapped diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/_utils.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e314278faf1c7adf787848409dd61a642a29b61 GIT binary patch literal 6104 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 M&7Vgm)@q&mFQ7ym#Q*>R literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.py new file mode 100644 index 0000000..fe3e237 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.py @@ -0,0 +1,2946 @@ +from __future__ import absolute_import, division, unicode_literals + +import string + +EOF = None + +E = { + "null-character": + "Null character in input stream, replaced with U+FFFD.", + "invalid-codepoint": + "Invalid codepoint in stream.", + "incorrectly-placed-solidus": + "Solidus (/) incorrectly placed in tag.", + "incorrect-cr-newline-entity": + "Incorrect CR newline entity, replaced with LF.", + "illegal-windows-1252-entity": + "Entity used with illegal number (windows-1252 reference).", + "cant-convert-numeric-entity": + "Numeric entity couldn't be converted to character " + "(codepoint U+%(charAsInt)08x).", + "illegal-codepoint-for-numeric-entity": + "Numeric entity represents an illegal codepoint: " + "U+%(charAsInt)08x.", + "numeric-entity-without-semicolon": + "Numeric entity didn't end with ';'.", + "expected-numeric-entity-but-got-eof": + "Numeric entity expected. Got end of file instead.", + "expected-numeric-entity": + "Numeric entity expected but none found.", + "named-entity-without-semicolon": + "Named entity didn't end with ';'.", + "expected-named-entity": + "Named entity expected. Got none.", + "attributes-in-end-tag": + "End tag contains unexpected attributes.", + 'self-closing-flag-on-end-tag': + "End tag contains unexpected self-closing flag.", + "expected-tag-name-but-got-right-bracket": + "Expected tag name. Got '>' instead.", + "expected-tag-name-but-got-question-mark": + "Expected tag name. Got '?' instead. (HTML doesn't " + "support processing instructions.)", + "expected-tag-name": + "Expected tag name. Got something else instead", + "expected-closing-tag-but-got-right-bracket": + "Expected closing tag. Got '>' instead. Ignoring ''.", + "expected-closing-tag-but-got-eof": + "Expected closing tag. Unexpected end of file.", + "expected-closing-tag-but-got-char": + "Expected closing tag. Unexpected character '%(data)s' found.", + "eof-in-tag-name": + "Unexpected end of file in the tag name.", + "expected-attribute-name-but-got-eof": + "Unexpected end of file. Expected attribute name instead.", + "eof-in-attribute-name": + "Unexpected end of file in attribute name.", + "invalid-character-in-attribute-name": + "Invalid character in attribute name", + "duplicate-attribute": + "Dropped duplicate attribute on tag.", + "expected-end-of-tag-name-but-got-eof": + "Unexpected end of file. Expected = or end of tag.", + "expected-attribute-value-but-got-eof": + "Unexpected end of file. Expected attribute value.", + "expected-attribute-value-but-got-right-bracket": + "Expected attribute value. Got '>' instead.", + 'equals-in-unquoted-attribute-value': + "Unexpected = in unquoted attribute", + 'unexpected-character-in-unquoted-attribute-value': + "Unexpected character in unquoted attribute", + "invalid-character-after-attribute-name": + "Unexpected character after attribute name.", + "unexpected-character-after-attribute-value": + "Unexpected character after attribute value.", + "eof-in-attribute-value-double-quote": + "Unexpected end of file in attribute value (\").", + "eof-in-attribute-value-single-quote": + "Unexpected end of file in attribute value (').", + "eof-in-attribute-value-no-quotes": + "Unexpected end of file in attribute value.", + "unexpected-EOF-after-solidus-in-tag": + "Unexpected end of file in tag. Expected >", + "unexpected-character-after-solidus-in-tag": + "Unexpected character after / in tag. Expected >", + "expected-dashes-or-doctype": + "Expected '--' or 'DOCTYPE'. Not found.", + "unexpected-bang-after-double-dash-in-comment": + "Unexpected ! after -- in comment", + "unexpected-space-after-double-dash-in-comment": + "Unexpected space after -- in comment", + "incorrect-comment": + "Incorrect comment.", + "eof-in-comment": + "Unexpected end of file in comment.", + "eof-in-comment-end-dash": + "Unexpected end of file in comment (-)", + "unexpected-dash-after-double-dash-in-comment": + "Unexpected '-' after '--' found in comment.", + "eof-in-comment-double-dash": + "Unexpected end of file in comment (--).", + "eof-in-comment-end-space-state": + "Unexpected end of file in comment.", + "eof-in-comment-end-bang-state": + "Unexpected end of file in comment.", + "unexpected-char-in-comment": + "Unexpected character in comment found.", + "need-space-after-doctype": + "No space after literal string 'DOCTYPE'.", + "expected-doctype-name-but-got-right-bracket": + "Unexpected > character. Expected DOCTYPE name.", + "expected-doctype-name-but-got-eof": + "Unexpected end of file. Expected DOCTYPE name.", + "eof-in-doctype-name": + "Unexpected end of file in DOCTYPE name.", + "eof-in-doctype": + "Unexpected end of file in DOCTYPE.", + "expected-space-or-right-bracket-in-doctype": + "Expected space or '>'. Got '%(data)s'", + "unexpected-end-of-doctype": + "Unexpected end of DOCTYPE.", + "unexpected-char-in-doctype": + "Unexpected character in DOCTYPE.", + "eof-in-innerhtml": + "XXX innerHTML EOF", + "unexpected-doctype": + "Unexpected DOCTYPE. Ignored.", + "non-html-root": + "html needs to be the first start tag.", + "expected-doctype-but-got-eof": + "Unexpected End of file. Expected DOCTYPE.", + "unknown-doctype": + "Erroneous DOCTYPE.", + "expected-doctype-but-got-chars": + "Unexpected non-space characters. Expected DOCTYPE.", + "expected-doctype-but-got-start-tag": + "Unexpected start tag (%(name)s). Expected DOCTYPE.", + "expected-doctype-but-got-end-tag": + "Unexpected end tag (%(name)s). Expected DOCTYPE.", + "end-tag-after-implied-root": + "Unexpected end tag (%(name)s) after the (implied) root element.", + "expected-named-closing-tag-but-got-eof": + "Unexpected end of file. Expected end tag (%(name)s).", + "two-heads-are-not-better-than-one": + "Unexpected start tag head in existing head. Ignored.", + "unexpected-end-tag": + "Unexpected end tag (%(name)s). Ignored.", + "unexpected-start-tag-out-of-my-head": + "Unexpected start tag (%(name)s) that can be in head. Moved.", + "unexpected-start-tag": + "Unexpected start tag (%(name)s).", + "missing-end-tag": + "Missing end tag (%(name)s).", + "missing-end-tags": + "Missing end tags (%(name)s).", + "unexpected-start-tag-implies-end-tag": + "Unexpected start tag (%(startName)s) " + "implies end tag (%(endName)s).", + "unexpected-start-tag-treated-as": + "Unexpected start tag (%(originalName)s). Treated as %(newName)s.", + "deprecated-tag": + "Unexpected start tag %(name)s. Don't use it!", + "unexpected-start-tag-ignored": + "Unexpected start tag %(name)s. Ignored.", + "expected-one-end-tag-but-got-another": + "Unexpected end tag (%(gotName)s). " + "Missing end tag (%(expectedName)s).", + "end-tag-too-early": + "End tag (%(name)s) seen too early. Expected other end tag.", + "end-tag-too-early-named": + "Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s).", + "end-tag-too-early-ignored": + "End tag (%(name)s) seen too early. Ignored.", + "adoption-agency-1.1": + "End tag (%(name)s) violates step 1, " + "paragraph 1 of the adoption agency algorithm.", + "adoption-agency-1.2": + "End tag (%(name)s) violates step 1, " + "paragraph 2 of the adoption agency algorithm.", + "adoption-agency-1.3": + "End tag (%(name)s) violates step 1, " + "paragraph 3 of the adoption agency algorithm.", + "adoption-agency-4.4": + "End tag (%(name)s) violates step 4, " + "paragraph 4 of the adoption agency algorithm.", + "unexpected-end-tag-treated-as": + "Unexpected end tag (%(originalName)s). Treated as %(newName)s.", + "no-end-tag": + "This element (%(name)s) has no end tag.", + "unexpected-implied-end-tag-in-table": + "Unexpected implied end tag (%(name)s) in the table phase.", + "unexpected-implied-end-tag-in-table-body": + "Unexpected implied end tag (%(name)s) in the table body phase.", + "unexpected-char-implies-table-voodoo": + "Unexpected non-space characters in " + "table context caused voodoo mode.", + "unexpected-hidden-input-in-table": + "Unexpected input with type hidden in table context.", + "unexpected-form-in-table": + "Unexpected form in table context.", + "unexpected-start-tag-implies-table-voodoo": + "Unexpected start tag (%(name)s) in " + "table context caused voodoo mode.", + "unexpected-end-tag-implies-table-voodoo": + "Unexpected end tag (%(name)s) in " + "table context caused voodoo mode.", + "unexpected-cell-in-table-body": + "Unexpected table cell start tag (%(name)s) " + "in the table body phase.", + "unexpected-cell-end-tag": + "Got table cell end tag (%(name)s) " + "while required end tags are missing.", + "unexpected-end-tag-in-table-body": + "Unexpected end tag (%(name)s) in the table body phase. Ignored.", + "unexpected-implied-end-tag-in-table-row": + "Unexpected implied end tag (%(name)s) in the table row phase.", + "unexpected-end-tag-in-table-row": + "Unexpected end tag (%(name)s) in the table row phase. Ignored.", + "unexpected-select-in-select": + "Unexpected select start tag in the select phase " + "treated as select end tag.", + "unexpected-input-in-select": + "Unexpected input start tag in the select phase.", + "unexpected-start-tag-in-select": + "Unexpected start tag token (%(name)s in the select phase. " + "Ignored.", + "unexpected-end-tag-in-select": + "Unexpected end tag (%(name)s) in the select phase. Ignored.", + "unexpected-table-element-start-tag-in-select-in-table": + "Unexpected table element start tag (%(name)s) in the select in table phase.", + "unexpected-table-element-end-tag-in-select-in-table": + "Unexpected table element end tag (%(name)s) in the select in table phase.", + "unexpected-char-after-body": + "Unexpected non-space characters in the after body phase.", + "unexpected-start-tag-after-body": + "Unexpected start tag token (%(name)s)" + " in the after body phase.", + "unexpected-end-tag-after-body": + "Unexpected end tag token (%(name)s)" + " in the after body phase.", + "unexpected-char-in-frameset": + "Unexpected characters in the frameset phase. Characters ignored.", + "unexpected-start-tag-in-frameset": + "Unexpected start tag token (%(name)s)" + " in the frameset phase. Ignored.", + "unexpected-frameset-in-frameset-innerhtml": + "Unexpected end tag token (frameset) " + "in the frameset phase (innerHTML).", + "unexpected-end-tag-in-frameset": + "Unexpected end tag token (%(name)s)" + " in the frameset phase. Ignored.", + "unexpected-char-after-frameset": + "Unexpected non-space characters in the " + "after frameset phase. Ignored.", + "unexpected-start-tag-after-frameset": + "Unexpected start tag (%(name)s)" + " in the after frameset phase. Ignored.", + "unexpected-end-tag-after-frameset": + "Unexpected end tag (%(name)s)" + " in the after frameset phase. Ignored.", + "unexpected-end-tag-after-body-innerhtml": + "Unexpected end tag after body(innerHtml)", + "expected-eof-but-got-char": + "Unexpected non-space characters. Expected end of file.", + "expected-eof-but-got-start-tag": + "Unexpected start tag (%(name)s)" + ". Expected end of file.", + "expected-eof-but-got-end-tag": + "Unexpected end tag (%(name)s)" + ". Expected end of file.", + "eof-in-table": + "Unexpected end of file. Expected table content.", + "eof-in-select": + "Unexpected end of file. Expected select content.", + "eof-in-frameset": + "Unexpected end of file. Expected frameset content.", + "eof-in-script-in-script": + "Unexpected end of file. Expected script content.", + "eof-in-foreign-lands": + "Unexpected end of file. Expected foreign content", + "non-void-element-with-trailing-solidus": + "Trailing solidus not allowed on element %(name)s", + "unexpected-html-element-in-foreign-content": + "Element %(name)s not allowed in a non-html context", + "unexpected-end-tag-before-html": + "Unexpected end tag (%(name)s) before html.", + "unexpected-inhead-noscript-tag": + "Element %(name)s not allowed in a inhead-noscript context", + "eof-in-head-noscript": + "Unexpected end of file. Expected inhead-noscript content", + "char-in-head-noscript": + "Unexpected non-space character. Expected inhead-noscript content", + "XXX-undefined-error": + "Undefined error (this sucks and should be fixed)", +} + +namespaces = { + "html": "http://www.w3.org/1999/xhtml", + "mathml": "http://www.w3.org/1998/Math/MathML", + "svg": "http://www.w3.org/2000/svg", + "xlink": "http://www.w3.org/1999/xlink", + "xml": "http://www.w3.org/XML/1998/namespace", + "xmlns": "http://www.w3.org/2000/xmlns/" +} + +scopingElements = frozenset([ + (namespaces["html"], "applet"), + (namespaces["html"], "caption"), + (namespaces["html"], "html"), + (namespaces["html"], "marquee"), + (namespaces["html"], "object"), + (namespaces["html"], "table"), + (namespaces["html"], "td"), + (namespaces["html"], "th"), + (namespaces["mathml"], "mi"), + (namespaces["mathml"], "mo"), + (namespaces["mathml"], "mn"), + (namespaces["mathml"], "ms"), + (namespaces["mathml"], "mtext"), + (namespaces["mathml"], "annotation-xml"), + (namespaces["svg"], "foreignObject"), + (namespaces["svg"], "desc"), + (namespaces["svg"], "title"), +]) + +formattingElements = frozenset([ + (namespaces["html"], "a"), + (namespaces["html"], "b"), + (namespaces["html"], "big"), + (namespaces["html"], "code"), + (namespaces["html"], "em"), + (namespaces["html"], "font"), + (namespaces["html"], "i"), + (namespaces["html"], "nobr"), + (namespaces["html"], "s"), + (namespaces["html"], "small"), + (namespaces["html"], "strike"), + (namespaces["html"], "strong"), + (namespaces["html"], "tt"), + (namespaces["html"], "u") +]) + +specialElements = frozenset([ + (namespaces["html"], "address"), + (namespaces["html"], "applet"), + (namespaces["html"], "area"), + (namespaces["html"], "article"), + (namespaces["html"], "aside"), + (namespaces["html"], "base"), + (namespaces["html"], "basefont"), + (namespaces["html"], "bgsound"), + (namespaces["html"], "blockquote"), + (namespaces["html"], "body"), + (namespaces["html"], "br"), + (namespaces["html"], "button"), + (namespaces["html"], "caption"), + (namespaces["html"], "center"), + (namespaces["html"], "col"), + (namespaces["html"], "colgroup"), + (namespaces["html"], "command"), + (namespaces["html"], "dd"), + (namespaces["html"], "details"), + (namespaces["html"], "dir"), + (namespaces["html"], "div"), + (namespaces["html"], "dl"), + (namespaces["html"], "dt"), + (namespaces["html"], "embed"), + (namespaces["html"], "fieldset"), + (namespaces["html"], "figure"), + (namespaces["html"], "footer"), + (namespaces["html"], "form"), + (namespaces["html"], "frame"), + (namespaces["html"], "frameset"), + (namespaces["html"], "h1"), + (namespaces["html"], "h2"), + (namespaces["html"], "h3"), + (namespaces["html"], "h4"), + (namespaces["html"], "h5"), + (namespaces["html"], "h6"), + (namespaces["html"], "head"), + (namespaces["html"], "header"), + (namespaces["html"], "hr"), + (namespaces["html"], "html"), + (namespaces["html"], "iframe"), + # Note that image is commented out in the spec as "this isn't an + # element that can end up on the stack, so it doesn't matter," + (namespaces["html"], "image"), + (namespaces["html"], "img"), + (namespaces["html"], "input"), + (namespaces["html"], "isindex"), + (namespaces["html"], "li"), + (namespaces["html"], "link"), + (namespaces["html"], "listing"), + (namespaces["html"], "marquee"), + (namespaces["html"], "menu"), + (namespaces["html"], "meta"), + (namespaces["html"], "nav"), + (namespaces["html"], "noembed"), + (namespaces["html"], "noframes"), + (namespaces["html"], "noscript"), + (namespaces["html"], "object"), + (namespaces["html"], "ol"), + (namespaces["html"], "p"), + (namespaces["html"], "param"), + (namespaces["html"], "plaintext"), + (namespaces["html"], "pre"), + (namespaces["html"], "script"), + (namespaces["html"], "section"), + (namespaces["html"], "select"), + (namespaces["html"], "style"), + (namespaces["html"], "table"), + (namespaces["html"], "tbody"), + (namespaces["html"], "td"), + (namespaces["html"], "textarea"), + (namespaces["html"], "tfoot"), + (namespaces["html"], "th"), + (namespaces["html"], "thead"), + (namespaces["html"], "title"), + (namespaces["html"], "tr"), + (namespaces["html"], "ul"), + (namespaces["html"], "wbr"), + (namespaces["html"], "xmp"), + (namespaces["svg"], "foreignObject") +]) + +htmlIntegrationPointElements = frozenset([ + (namespaces["mathml"], "annotation-xml"), + (namespaces["svg"], "foreignObject"), + (namespaces["svg"], "desc"), + (namespaces["svg"], "title") +]) + +mathmlTextIntegrationPointElements = frozenset([ + (namespaces["mathml"], "mi"), + (namespaces["mathml"], "mo"), + (namespaces["mathml"], "mn"), + (namespaces["mathml"], "ms"), + (namespaces["mathml"], "mtext") +]) + +adjustSVGAttributes = { + "attributename": "attributeName", + "attributetype": "attributeType", + "basefrequency": "baseFrequency", + "baseprofile": "baseProfile", + "calcmode": "calcMode", + "clippathunits": "clipPathUnits", + "contentscripttype": "contentScriptType", + "contentstyletype": "contentStyleType", + "diffuseconstant": "diffuseConstant", + "edgemode": "edgeMode", + "externalresourcesrequired": "externalResourcesRequired", + "filterres": "filterRes", + "filterunits": "filterUnits", + "glyphref": "glyphRef", + "gradienttransform": "gradientTransform", + "gradientunits": "gradientUnits", + "kernelmatrix": "kernelMatrix", + "kernelunitlength": "kernelUnitLength", + "keypoints": "keyPoints", + "keysplines": "keySplines", + "keytimes": "keyTimes", + "lengthadjust": "lengthAdjust", + "limitingconeangle": "limitingConeAngle", + "markerheight": "markerHeight", + "markerunits": "markerUnits", + "markerwidth": "markerWidth", + "maskcontentunits": "maskContentUnits", + "maskunits": "maskUnits", + "numoctaves": "numOctaves", + "pathlength": "pathLength", + "patterncontentunits": "patternContentUnits", + "patterntransform": "patternTransform", + "patternunits": "patternUnits", + "pointsatx": "pointsAtX", + "pointsaty": "pointsAtY", + "pointsatz": "pointsAtZ", + "preservealpha": "preserveAlpha", + "preserveaspectratio": "preserveAspectRatio", + "primitiveunits": "primitiveUnits", + "refx": "refX", + "refy": "refY", + "repeatcount": "repeatCount", + "repeatdur": "repeatDur", + "requiredextensions": "requiredExtensions", + "requiredfeatures": "requiredFeatures", + "specularconstant": "specularConstant", + "specularexponent": "specularExponent", + "spreadmethod": "spreadMethod", + "startoffset": "startOffset", + "stddeviation": "stdDeviation", + "stitchtiles": "stitchTiles", + "surfacescale": "surfaceScale", + "systemlanguage": "systemLanguage", + "tablevalues": "tableValues", + "targetx": "targetX", + "targety": "targetY", + "textlength": "textLength", + "viewbox": "viewBox", + "viewtarget": "viewTarget", + "xchannelselector": "xChannelSelector", + "ychannelselector": "yChannelSelector", + "zoomandpan": "zoomAndPan" +} + +adjustMathMLAttributes = {"definitionurl": "definitionURL"} + +adjustForeignAttributes = { + "xlink:actuate": ("xlink", "actuate", namespaces["xlink"]), + "xlink:arcrole": ("xlink", "arcrole", namespaces["xlink"]), + "xlink:href": ("xlink", "href", namespaces["xlink"]), + "xlink:role": ("xlink", "role", namespaces["xlink"]), + "xlink:show": ("xlink", "show", namespaces["xlink"]), + "xlink:title": ("xlink", "title", namespaces["xlink"]), + "xlink:type": ("xlink", "type", namespaces["xlink"]), + "xml:base": ("xml", "base", namespaces["xml"]), + "xml:lang": ("xml", "lang", namespaces["xml"]), + "xml:space": ("xml", "space", namespaces["xml"]), + "xmlns": (None, "xmlns", namespaces["xmlns"]), + "xmlns:xlink": ("xmlns", "xlink", namespaces["xmlns"]) +} + +unadjustForeignAttributes = {(ns, local): qname for qname, (prefix, local, ns) in + adjustForeignAttributes.items()} + +spaceCharacters = frozenset([ + "\t", + "\n", + "\u000C", + " ", + "\r" +]) + +tableInsertModeElements = frozenset([ + "table", + "tbody", + "tfoot", + "thead", + "tr" +]) + +asciiLowercase = frozenset(string.ascii_lowercase) +asciiUppercase = frozenset(string.ascii_uppercase) +asciiLetters = frozenset(string.ascii_letters) +digits = frozenset(string.digits) +hexDigits = frozenset(string.hexdigits) + +asciiUpper2Lower = {ord(c): ord(c.lower()) for c in string.ascii_uppercase} + +# Heading elements need to be ordered +headingElements = ( + "h1", + "h2", + "h3", + "h4", + "h5", + "h6" +) + +voidElements = frozenset([ + "base", + "command", + "event-source", + "link", + "meta", + "hr", + "br", + "img", + "embed", + "param", + "area", + "col", + "input", + "source", + "track" +]) + +cdataElements = frozenset(['title', 'textarea']) + +rcdataElements = frozenset([ + 'style', + 'script', + 'xmp', + 'iframe', + 'noembed', + 'noframes', + 'noscript' +]) + +booleanAttributes = { + "": frozenset(["irrelevant", "itemscope"]), + "style": frozenset(["scoped"]), + "img": frozenset(["ismap"]), + "audio": frozenset(["autoplay", "controls"]), + "video": frozenset(["autoplay", "controls"]), + "script": frozenset(["defer", "async"]), + "details": frozenset(["open"]), + "datagrid": frozenset(["multiple", "disabled"]), + "command": frozenset(["hidden", "disabled", "checked", "default"]), + "hr": frozenset(["noshade"]), + "menu": frozenset(["autosubmit"]), + "fieldset": frozenset(["disabled", "readonly"]), + "option": frozenset(["disabled", "readonly", "selected"]), + "optgroup": frozenset(["disabled", "readonly"]), + "button": frozenset(["disabled", "autofocus"]), + "input": frozenset(["disabled", "readonly", "required", "autofocus", "checked", "ismap"]), + "select": frozenset(["disabled", "readonly", "autofocus", "multiple"]), + "output": frozenset(["disabled", "readonly"]), + "iframe": frozenset(["seamless"]), +} + +# entitiesWindows1252 has to be _ordered_ and needs to have an index. It +# therefore can't be a frozenset. +entitiesWindows1252 = ( + 8364, # 0x80 0x20AC EURO SIGN + 65533, # 0x81 UNDEFINED + 8218, # 0x82 0x201A SINGLE LOW-9 QUOTATION MARK + 402, # 0x83 0x0192 LATIN SMALL LETTER F WITH HOOK + 8222, # 0x84 0x201E DOUBLE LOW-9 QUOTATION MARK + 8230, # 0x85 0x2026 HORIZONTAL ELLIPSIS + 8224, # 0x86 0x2020 DAGGER + 8225, # 0x87 0x2021 DOUBLE DAGGER + 710, # 0x88 0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT + 8240, # 0x89 0x2030 PER MILLE SIGN + 352, # 0x8A 0x0160 LATIN CAPITAL LETTER S WITH CARON + 8249, # 0x8B 0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 338, # 0x8C 0x0152 LATIN CAPITAL LIGATURE OE + 65533, # 0x8D UNDEFINED + 381, # 0x8E 0x017D LATIN CAPITAL LETTER Z WITH CARON + 65533, # 0x8F UNDEFINED + 65533, # 0x90 UNDEFINED + 8216, # 0x91 0x2018 LEFT SINGLE QUOTATION MARK + 8217, # 0x92 0x2019 RIGHT SINGLE QUOTATION MARK + 8220, # 0x93 0x201C LEFT DOUBLE QUOTATION MARK + 8221, # 0x94 0x201D RIGHT DOUBLE QUOTATION MARK + 8226, # 0x95 0x2022 BULLET + 8211, # 0x96 0x2013 EN DASH + 8212, # 0x97 0x2014 EM DASH + 732, # 0x98 0x02DC SMALL TILDE + 8482, # 0x99 0x2122 TRADE MARK SIGN + 353, # 0x9A 0x0161 LATIN SMALL LETTER S WITH CARON + 8250, # 0x9B 0x203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 339, # 0x9C 0x0153 LATIN SMALL LIGATURE OE + 65533, # 0x9D UNDEFINED + 382, # 0x9E 0x017E LATIN SMALL LETTER Z WITH CARON + 376 # 0x9F 0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS +) + +xmlEntities = frozenset(['lt;', 'gt;', 'amp;', 'apos;', 'quot;']) + +entities = { + "AElig": "\xc6", + "AElig;": "\xc6", + "AMP": "&", + "AMP;": "&", + "Aacute": "\xc1", + "Aacute;": "\xc1", + "Abreve;": "\u0102", + "Acirc": "\xc2", + "Acirc;": "\xc2", + "Acy;": "\u0410", + "Afr;": "\U0001d504", + "Agrave": "\xc0", + "Agrave;": "\xc0", + "Alpha;": "\u0391", + "Amacr;": "\u0100", + "And;": "\u2a53", + "Aogon;": "\u0104", + "Aopf;": "\U0001d538", + "ApplyFunction;": "\u2061", + "Aring": "\xc5", + "Aring;": "\xc5", + "Ascr;": "\U0001d49c", + "Assign;": "\u2254", + "Atilde": "\xc3", + "Atilde;": "\xc3", + "Auml": "\xc4", + "Auml;": "\xc4", + "Backslash;": "\u2216", + "Barv;": "\u2ae7", + "Barwed;": "\u2306", + "Bcy;": "\u0411", + "Because;": "\u2235", + "Bernoullis;": "\u212c", + "Beta;": "\u0392", + "Bfr;": "\U0001d505", + "Bopf;": "\U0001d539", + "Breve;": "\u02d8", + "Bscr;": "\u212c", + "Bumpeq;": "\u224e", + "CHcy;": "\u0427", + "COPY": "\xa9", + "COPY;": "\xa9", + "Cacute;": "\u0106", + "Cap;": "\u22d2", + "CapitalDifferentialD;": "\u2145", + "Cayleys;": "\u212d", + "Ccaron;": "\u010c", + "Ccedil": "\xc7", + "Ccedil;": "\xc7", + "Ccirc;": "\u0108", + "Cconint;": "\u2230", + "Cdot;": "\u010a", + "Cedilla;": "\xb8", + "CenterDot;": "\xb7", + "Cfr;": "\u212d", + "Chi;": "\u03a7", + "CircleDot;": "\u2299", + "CircleMinus;": "\u2296", + "CirclePlus;": "\u2295", + "CircleTimes;": "\u2297", + "ClockwiseContourIntegral;": "\u2232", + "CloseCurlyDoubleQuote;": "\u201d", + "CloseCurlyQuote;": "\u2019", + "Colon;": "\u2237", + "Colone;": "\u2a74", + "Congruent;": "\u2261", + "Conint;": "\u222f", + "ContourIntegral;": "\u222e", + "Copf;": "\u2102", + "Coproduct;": "\u2210", + "CounterClockwiseContourIntegral;": "\u2233", + "Cross;": "\u2a2f", + "Cscr;": "\U0001d49e", + "Cup;": "\u22d3", + "CupCap;": "\u224d", + "DD;": "\u2145", + "DDotrahd;": "\u2911", + "DJcy;": "\u0402", + "DScy;": "\u0405", + "DZcy;": "\u040f", + "Dagger;": "\u2021", + "Darr;": "\u21a1", + "Dashv;": "\u2ae4", + "Dcaron;": "\u010e", + "Dcy;": "\u0414", + "Del;": "\u2207", + "Delta;": "\u0394", + "Dfr;": "\U0001d507", + "DiacriticalAcute;": "\xb4", + "DiacriticalDot;": "\u02d9", + "DiacriticalDoubleAcute;": "\u02dd", + "DiacriticalGrave;": "`", + "DiacriticalTilde;": "\u02dc", + "Diamond;": "\u22c4", + "DifferentialD;": "\u2146", + "Dopf;": "\U0001d53b", + "Dot;": "\xa8", + "DotDot;": "\u20dc", + "DotEqual;": "\u2250", + "DoubleContourIntegral;": "\u222f", + "DoubleDot;": "\xa8", + "DoubleDownArrow;": "\u21d3", + "DoubleLeftArrow;": "\u21d0", + "DoubleLeftRightArrow;": "\u21d4", + "DoubleLeftTee;": "\u2ae4", + "DoubleLongLeftArrow;": "\u27f8", + "DoubleLongLeftRightArrow;": "\u27fa", + "DoubleLongRightArrow;": "\u27f9", + "DoubleRightArrow;": "\u21d2", + "DoubleRightTee;": "\u22a8", + "DoubleUpArrow;": "\u21d1", + "DoubleUpDownArrow;": "\u21d5", + "DoubleVerticalBar;": "\u2225", + "DownArrow;": "\u2193", + "DownArrowBar;": "\u2913", + "DownArrowUpArrow;": "\u21f5", + "DownBreve;": "\u0311", + "DownLeftRightVector;": "\u2950", + "DownLeftTeeVector;": "\u295e", + "DownLeftVector;": "\u21bd", + "DownLeftVectorBar;": "\u2956", + "DownRightTeeVector;": "\u295f", + "DownRightVector;": "\u21c1", + "DownRightVectorBar;": "\u2957", + "DownTee;": "\u22a4", + "DownTeeArrow;": "\u21a7", + "Downarrow;": "\u21d3", + "Dscr;": "\U0001d49f", + "Dstrok;": "\u0110", + "ENG;": "\u014a", + "ETH": "\xd0", + "ETH;": "\xd0", + "Eacute": "\xc9", + "Eacute;": "\xc9", + "Ecaron;": "\u011a", + "Ecirc": "\xca", + "Ecirc;": "\xca", + "Ecy;": "\u042d", + "Edot;": "\u0116", + "Efr;": "\U0001d508", + "Egrave": "\xc8", + "Egrave;": "\xc8", + "Element;": "\u2208", + "Emacr;": "\u0112", + "EmptySmallSquare;": "\u25fb", + "EmptyVerySmallSquare;": "\u25ab", + "Eogon;": "\u0118", + "Eopf;": "\U0001d53c", + "Epsilon;": "\u0395", + "Equal;": "\u2a75", + "EqualTilde;": "\u2242", + "Equilibrium;": "\u21cc", + "Escr;": "\u2130", + "Esim;": "\u2a73", + "Eta;": "\u0397", + "Euml": "\xcb", + "Euml;": "\xcb", + "Exists;": "\u2203", + "ExponentialE;": "\u2147", + "Fcy;": "\u0424", + "Ffr;": "\U0001d509", + "FilledSmallSquare;": "\u25fc", + "FilledVerySmallSquare;": "\u25aa", + "Fopf;": "\U0001d53d", + "ForAll;": "\u2200", + "Fouriertrf;": "\u2131", + "Fscr;": "\u2131", + "GJcy;": "\u0403", + "GT": ">", + "GT;": ">", + "Gamma;": "\u0393", + "Gammad;": "\u03dc", + "Gbreve;": "\u011e", + "Gcedil;": "\u0122", + "Gcirc;": "\u011c", + "Gcy;": "\u0413", + "Gdot;": "\u0120", + "Gfr;": "\U0001d50a", + "Gg;": "\u22d9", + "Gopf;": "\U0001d53e", + "GreaterEqual;": "\u2265", + "GreaterEqualLess;": "\u22db", + "GreaterFullEqual;": "\u2267", + "GreaterGreater;": "\u2aa2", + "GreaterLess;": "\u2277", + "GreaterSlantEqual;": "\u2a7e", + "GreaterTilde;": "\u2273", + "Gscr;": "\U0001d4a2", + "Gt;": "\u226b", + "HARDcy;": "\u042a", + "Hacek;": "\u02c7", + "Hat;": "^", + "Hcirc;": "\u0124", + "Hfr;": "\u210c", + "HilbertSpace;": "\u210b", + "Hopf;": "\u210d", + "HorizontalLine;": "\u2500", + "Hscr;": "\u210b", + "Hstrok;": "\u0126", + "HumpDownHump;": "\u224e", + "HumpEqual;": "\u224f", + "IEcy;": "\u0415", + "IJlig;": "\u0132", + "IOcy;": "\u0401", + "Iacute": "\xcd", + "Iacute;": "\xcd", + "Icirc": "\xce", + "Icirc;": "\xce", + "Icy;": "\u0418", + "Idot;": "\u0130", + "Ifr;": "\u2111", + "Igrave": "\xcc", + "Igrave;": "\xcc", + "Im;": "\u2111", + "Imacr;": "\u012a", + "ImaginaryI;": "\u2148", + "Implies;": "\u21d2", + "Int;": "\u222c", + "Integral;": "\u222b", + "Intersection;": "\u22c2", + "InvisibleComma;": "\u2063", + "InvisibleTimes;": "\u2062", + "Iogon;": "\u012e", + "Iopf;": "\U0001d540", + "Iota;": "\u0399", + "Iscr;": "\u2110", + "Itilde;": "\u0128", + "Iukcy;": "\u0406", + "Iuml": "\xcf", + "Iuml;": "\xcf", + "Jcirc;": "\u0134", + "Jcy;": "\u0419", + "Jfr;": "\U0001d50d", + "Jopf;": "\U0001d541", + "Jscr;": "\U0001d4a5", + "Jsercy;": "\u0408", + "Jukcy;": "\u0404", + "KHcy;": "\u0425", + "KJcy;": "\u040c", + "Kappa;": "\u039a", + "Kcedil;": "\u0136", + "Kcy;": "\u041a", + "Kfr;": "\U0001d50e", + "Kopf;": "\U0001d542", + "Kscr;": "\U0001d4a6", + "LJcy;": "\u0409", + "LT": "<", + "LT;": "<", + "Lacute;": "\u0139", + "Lambda;": "\u039b", + "Lang;": "\u27ea", + "Laplacetrf;": "\u2112", + "Larr;": "\u219e", + "Lcaron;": "\u013d", + "Lcedil;": "\u013b", + "Lcy;": "\u041b", + "LeftAngleBracket;": "\u27e8", + "LeftArrow;": "\u2190", + "LeftArrowBar;": "\u21e4", + "LeftArrowRightArrow;": "\u21c6", + "LeftCeiling;": "\u2308", + "LeftDoubleBracket;": "\u27e6", + "LeftDownTeeVector;": "\u2961", + "LeftDownVector;": "\u21c3", + "LeftDownVectorBar;": "\u2959", + "LeftFloor;": "\u230a", + "LeftRightArrow;": "\u2194", + "LeftRightVector;": "\u294e", + "LeftTee;": "\u22a3", + "LeftTeeArrow;": "\u21a4", + "LeftTeeVector;": "\u295a", + "LeftTriangle;": "\u22b2", + "LeftTriangleBar;": "\u29cf", + "LeftTriangleEqual;": "\u22b4", + "LeftUpDownVector;": "\u2951", + "LeftUpTeeVector;": "\u2960", + "LeftUpVector;": "\u21bf", + "LeftUpVectorBar;": "\u2958", + "LeftVector;": "\u21bc", + "LeftVectorBar;": "\u2952", + "Leftarrow;": "\u21d0", + "Leftrightarrow;": "\u21d4", + "LessEqualGreater;": "\u22da", + "LessFullEqual;": "\u2266", + "LessGreater;": "\u2276", + "LessLess;": "\u2aa1", + "LessSlantEqual;": "\u2a7d", + "LessTilde;": "\u2272", + "Lfr;": "\U0001d50f", + "Ll;": "\u22d8", + "Lleftarrow;": "\u21da", + "Lmidot;": "\u013f", + "LongLeftArrow;": "\u27f5", + "LongLeftRightArrow;": "\u27f7", + "LongRightArrow;": "\u27f6", + "Longleftarrow;": "\u27f8", + "Longleftrightarrow;": "\u27fa", + "Longrightarrow;": "\u27f9", + "Lopf;": "\U0001d543", + "LowerLeftArrow;": "\u2199", + "LowerRightArrow;": "\u2198", + "Lscr;": "\u2112", + "Lsh;": "\u21b0", + "Lstrok;": "\u0141", + "Lt;": "\u226a", + "Map;": "\u2905", + "Mcy;": "\u041c", + "MediumSpace;": "\u205f", + "Mellintrf;": "\u2133", + "Mfr;": "\U0001d510", + "MinusPlus;": "\u2213", + "Mopf;": "\U0001d544", + "Mscr;": "\u2133", + "Mu;": "\u039c", + "NJcy;": "\u040a", + "Nacute;": "\u0143", + "Ncaron;": "\u0147", + "Ncedil;": "\u0145", + "Ncy;": "\u041d", + "NegativeMediumSpace;": "\u200b", + "NegativeThickSpace;": "\u200b", + "NegativeThinSpace;": "\u200b", + "NegativeVeryThinSpace;": "\u200b", + "NestedGreaterGreater;": "\u226b", + "NestedLessLess;": "\u226a", + "NewLine;": "\n", + "Nfr;": "\U0001d511", + "NoBreak;": "\u2060", + "NonBreakingSpace;": "\xa0", + "Nopf;": "\u2115", + "Not;": "\u2aec", + "NotCongruent;": "\u2262", + "NotCupCap;": "\u226d", + "NotDoubleVerticalBar;": "\u2226", + "NotElement;": "\u2209", + "NotEqual;": "\u2260", + "NotEqualTilde;": "\u2242\u0338", + "NotExists;": "\u2204", + "NotGreater;": "\u226f", + "NotGreaterEqual;": "\u2271", + "NotGreaterFullEqual;": "\u2267\u0338", + "NotGreaterGreater;": "\u226b\u0338", + "NotGreaterLess;": "\u2279", + "NotGreaterSlantEqual;": "\u2a7e\u0338", + "NotGreaterTilde;": "\u2275", + "NotHumpDownHump;": "\u224e\u0338", + "NotHumpEqual;": "\u224f\u0338", + "NotLeftTriangle;": "\u22ea", + "NotLeftTriangleBar;": "\u29cf\u0338", + "NotLeftTriangleEqual;": "\u22ec", + "NotLess;": "\u226e", + "NotLessEqual;": "\u2270", + "NotLessGreater;": "\u2278", + "NotLessLess;": "\u226a\u0338", + "NotLessSlantEqual;": "\u2a7d\u0338", + "NotLessTilde;": "\u2274", + "NotNestedGreaterGreater;": "\u2aa2\u0338", + "NotNestedLessLess;": "\u2aa1\u0338", + "NotPrecedes;": "\u2280", + "NotPrecedesEqual;": "\u2aaf\u0338", + "NotPrecedesSlantEqual;": "\u22e0", + "NotReverseElement;": "\u220c", + "NotRightTriangle;": "\u22eb", + "NotRightTriangleBar;": "\u29d0\u0338", + "NotRightTriangleEqual;": "\u22ed", + "NotSquareSubset;": "\u228f\u0338", + "NotSquareSubsetEqual;": "\u22e2", + "NotSquareSuperset;": "\u2290\u0338", + "NotSquareSupersetEqual;": "\u22e3", + "NotSubset;": "\u2282\u20d2", + "NotSubsetEqual;": "\u2288", + "NotSucceeds;": "\u2281", + "NotSucceedsEqual;": "\u2ab0\u0338", + "NotSucceedsSlantEqual;": "\u22e1", + "NotSucceedsTilde;": "\u227f\u0338", + "NotSuperset;": "\u2283\u20d2", + "NotSupersetEqual;": "\u2289", + "NotTilde;": "\u2241", + "NotTildeEqual;": "\u2244", + "NotTildeFullEqual;": "\u2247", + "NotTildeTilde;": "\u2249", + "NotVerticalBar;": "\u2224", + "Nscr;": "\U0001d4a9", + "Ntilde": "\xd1", + "Ntilde;": "\xd1", + "Nu;": "\u039d", + "OElig;": "\u0152", + "Oacute": "\xd3", + "Oacute;": "\xd3", + "Ocirc": "\xd4", + "Ocirc;": "\xd4", + "Ocy;": "\u041e", + "Odblac;": "\u0150", + "Ofr;": "\U0001d512", + "Ograve": "\xd2", + "Ograve;": "\xd2", + "Omacr;": "\u014c", + "Omega;": "\u03a9", + "Omicron;": "\u039f", + "Oopf;": "\U0001d546", + "OpenCurlyDoubleQuote;": "\u201c", + "OpenCurlyQuote;": "\u2018", + "Or;": "\u2a54", + "Oscr;": "\U0001d4aa", + "Oslash": "\xd8", + "Oslash;": "\xd8", + "Otilde": "\xd5", + "Otilde;": "\xd5", + "Otimes;": "\u2a37", + "Ouml": "\xd6", + "Ouml;": "\xd6", + "OverBar;": "\u203e", + "OverBrace;": "\u23de", + "OverBracket;": "\u23b4", + "OverParenthesis;": "\u23dc", + "PartialD;": "\u2202", + "Pcy;": "\u041f", + "Pfr;": "\U0001d513", + "Phi;": "\u03a6", + "Pi;": "\u03a0", + "PlusMinus;": "\xb1", + "Poincareplane;": "\u210c", + "Popf;": "\u2119", + "Pr;": "\u2abb", + "Precedes;": "\u227a", + "PrecedesEqual;": "\u2aaf", + "PrecedesSlantEqual;": "\u227c", + "PrecedesTilde;": "\u227e", + "Prime;": "\u2033", + "Product;": "\u220f", + "Proportion;": "\u2237", + "Proportional;": "\u221d", + "Pscr;": "\U0001d4ab", + "Psi;": "\u03a8", + "QUOT": "\"", + "QUOT;": "\"", + "Qfr;": "\U0001d514", + "Qopf;": "\u211a", + "Qscr;": "\U0001d4ac", + "RBarr;": "\u2910", + "REG": "\xae", + "REG;": "\xae", + "Racute;": "\u0154", + "Rang;": "\u27eb", + "Rarr;": "\u21a0", + "Rarrtl;": "\u2916", + "Rcaron;": "\u0158", + "Rcedil;": "\u0156", + "Rcy;": "\u0420", + "Re;": "\u211c", + "ReverseElement;": "\u220b", + "ReverseEquilibrium;": "\u21cb", + "ReverseUpEquilibrium;": "\u296f", + "Rfr;": "\u211c", + "Rho;": "\u03a1", + "RightAngleBracket;": "\u27e9", + "RightArrow;": "\u2192", + "RightArrowBar;": "\u21e5", + "RightArrowLeftArrow;": "\u21c4", + "RightCeiling;": "\u2309", + "RightDoubleBracket;": "\u27e7", + "RightDownTeeVector;": "\u295d", + "RightDownVector;": "\u21c2", + "RightDownVectorBar;": "\u2955", + "RightFloor;": "\u230b", + "RightTee;": "\u22a2", + "RightTeeArrow;": "\u21a6", + "RightTeeVector;": "\u295b", + "RightTriangle;": "\u22b3", + "RightTriangleBar;": "\u29d0", + "RightTriangleEqual;": "\u22b5", + "RightUpDownVector;": "\u294f", + "RightUpTeeVector;": "\u295c", + "RightUpVector;": "\u21be", + "RightUpVectorBar;": "\u2954", + "RightVector;": "\u21c0", + "RightVectorBar;": "\u2953", + "Rightarrow;": "\u21d2", + "Ropf;": "\u211d", + "RoundImplies;": "\u2970", + "Rrightarrow;": "\u21db", + "Rscr;": "\u211b", + "Rsh;": "\u21b1", + "RuleDelayed;": "\u29f4", + "SHCHcy;": "\u0429", + "SHcy;": "\u0428", + "SOFTcy;": "\u042c", + "Sacute;": "\u015a", + "Sc;": "\u2abc", + "Scaron;": "\u0160", + "Scedil;": "\u015e", + "Scirc;": "\u015c", + "Scy;": "\u0421", + "Sfr;": "\U0001d516", + "ShortDownArrow;": "\u2193", + "ShortLeftArrow;": "\u2190", + "ShortRightArrow;": "\u2192", + "ShortUpArrow;": "\u2191", + "Sigma;": "\u03a3", + "SmallCircle;": "\u2218", + "Sopf;": "\U0001d54a", + "Sqrt;": "\u221a", + "Square;": "\u25a1", + "SquareIntersection;": "\u2293", + "SquareSubset;": "\u228f", + "SquareSubsetEqual;": "\u2291", + "SquareSuperset;": "\u2290", + "SquareSupersetEqual;": "\u2292", + "SquareUnion;": "\u2294", + "Sscr;": "\U0001d4ae", + "Star;": "\u22c6", + "Sub;": "\u22d0", + "Subset;": "\u22d0", + "SubsetEqual;": "\u2286", + "Succeeds;": "\u227b", + "SucceedsEqual;": "\u2ab0", + "SucceedsSlantEqual;": "\u227d", + "SucceedsTilde;": "\u227f", + "SuchThat;": "\u220b", + "Sum;": "\u2211", + "Sup;": "\u22d1", + "Superset;": "\u2283", + "SupersetEqual;": "\u2287", + "Supset;": "\u22d1", + "THORN": "\xde", + "THORN;": "\xde", + "TRADE;": "\u2122", + "TSHcy;": "\u040b", + "TScy;": "\u0426", + "Tab;": "\t", + "Tau;": "\u03a4", + "Tcaron;": "\u0164", + "Tcedil;": "\u0162", + "Tcy;": "\u0422", + "Tfr;": "\U0001d517", + "Therefore;": "\u2234", + "Theta;": "\u0398", + "ThickSpace;": "\u205f\u200a", + "ThinSpace;": "\u2009", + "Tilde;": "\u223c", + "TildeEqual;": "\u2243", + "TildeFullEqual;": "\u2245", + "TildeTilde;": "\u2248", + "Topf;": "\U0001d54b", + "TripleDot;": "\u20db", + "Tscr;": "\U0001d4af", + "Tstrok;": "\u0166", + "Uacute": "\xda", + "Uacute;": "\xda", + "Uarr;": "\u219f", + "Uarrocir;": "\u2949", + "Ubrcy;": "\u040e", + "Ubreve;": "\u016c", + "Ucirc": "\xdb", + "Ucirc;": "\xdb", + "Ucy;": "\u0423", + "Udblac;": "\u0170", + "Ufr;": "\U0001d518", + "Ugrave": "\xd9", + "Ugrave;": "\xd9", + "Umacr;": "\u016a", + "UnderBar;": "_", + "UnderBrace;": "\u23df", + "UnderBracket;": "\u23b5", + "UnderParenthesis;": "\u23dd", + "Union;": "\u22c3", + "UnionPlus;": "\u228e", + "Uogon;": "\u0172", + "Uopf;": "\U0001d54c", + "UpArrow;": "\u2191", + "UpArrowBar;": "\u2912", + "UpArrowDownArrow;": "\u21c5", + "UpDownArrow;": "\u2195", + "UpEquilibrium;": "\u296e", + "UpTee;": "\u22a5", + "UpTeeArrow;": "\u21a5", + "Uparrow;": "\u21d1", + "Updownarrow;": "\u21d5", + "UpperLeftArrow;": "\u2196", + "UpperRightArrow;": "\u2197", + "Upsi;": "\u03d2", + "Upsilon;": "\u03a5", + "Uring;": "\u016e", + "Uscr;": "\U0001d4b0", + "Utilde;": "\u0168", + "Uuml": "\xdc", + "Uuml;": "\xdc", + "VDash;": "\u22ab", + "Vbar;": "\u2aeb", + "Vcy;": "\u0412", + "Vdash;": "\u22a9", + "Vdashl;": "\u2ae6", + "Vee;": "\u22c1", + "Verbar;": "\u2016", + "Vert;": "\u2016", + "VerticalBar;": "\u2223", + "VerticalLine;": "|", + "VerticalSeparator;": "\u2758", + "VerticalTilde;": "\u2240", + "VeryThinSpace;": "\u200a", + "Vfr;": "\U0001d519", + "Vopf;": "\U0001d54d", + "Vscr;": "\U0001d4b1", + "Vvdash;": "\u22aa", + "Wcirc;": "\u0174", + "Wedge;": "\u22c0", + "Wfr;": "\U0001d51a", + "Wopf;": "\U0001d54e", + "Wscr;": "\U0001d4b2", + "Xfr;": "\U0001d51b", + "Xi;": "\u039e", + "Xopf;": "\U0001d54f", + "Xscr;": "\U0001d4b3", + "YAcy;": "\u042f", + "YIcy;": "\u0407", + "YUcy;": "\u042e", + "Yacute": "\xdd", + "Yacute;": "\xdd", + "Ycirc;": "\u0176", + "Ycy;": "\u042b", + "Yfr;": "\U0001d51c", + "Yopf;": "\U0001d550", + "Yscr;": "\U0001d4b4", + "Yuml;": "\u0178", + "ZHcy;": "\u0416", + "Zacute;": "\u0179", + "Zcaron;": "\u017d", + "Zcy;": "\u0417", + "Zdot;": "\u017b", + "ZeroWidthSpace;": "\u200b", + "Zeta;": "\u0396", + "Zfr;": "\u2128", + "Zopf;": "\u2124", + "Zscr;": "\U0001d4b5", + "aacute": "\xe1", + "aacute;": "\xe1", + "abreve;": "\u0103", + "ac;": "\u223e", + "acE;": "\u223e\u0333", + "acd;": "\u223f", + "acirc": "\xe2", + "acirc;": "\xe2", + "acute": "\xb4", + "acute;": "\xb4", + "acy;": "\u0430", + "aelig": "\xe6", + "aelig;": "\xe6", + "af;": "\u2061", + "afr;": "\U0001d51e", + "agrave": "\xe0", + "agrave;": "\xe0", + "alefsym;": "\u2135", + "aleph;": "\u2135", + "alpha;": "\u03b1", + "amacr;": "\u0101", + "amalg;": "\u2a3f", + "amp": "&", + "amp;": "&", + "and;": "\u2227", + "andand;": "\u2a55", + "andd;": "\u2a5c", + "andslope;": "\u2a58", + "andv;": "\u2a5a", + "ang;": "\u2220", + "ange;": "\u29a4", + "angle;": "\u2220", + "angmsd;": "\u2221", + "angmsdaa;": "\u29a8", + "angmsdab;": "\u29a9", + "angmsdac;": "\u29aa", + "angmsdad;": "\u29ab", + "angmsdae;": "\u29ac", + "angmsdaf;": "\u29ad", + "angmsdag;": "\u29ae", + "angmsdah;": "\u29af", + "angrt;": "\u221f", + "angrtvb;": "\u22be", + "angrtvbd;": "\u299d", + "angsph;": "\u2222", + "angst;": "\xc5", + "angzarr;": "\u237c", + "aogon;": "\u0105", + "aopf;": "\U0001d552", + "ap;": "\u2248", + "apE;": "\u2a70", + "apacir;": "\u2a6f", + "ape;": "\u224a", + "apid;": "\u224b", + "apos;": "'", + "approx;": "\u2248", + "approxeq;": "\u224a", + "aring": "\xe5", + "aring;": "\xe5", + "ascr;": "\U0001d4b6", + "ast;": "*", + "asymp;": "\u2248", + "asympeq;": "\u224d", + "atilde": "\xe3", + "atilde;": "\xe3", + "auml": "\xe4", + "auml;": "\xe4", + "awconint;": "\u2233", + "awint;": "\u2a11", + "bNot;": "\u2aed", + "backcong;": "\u224c", + "backepsilon;": "\u03f6", + "backprime;": "\u2035", + "backsim;": "\u223d", + "backsimeq;": "\u22cd", + "barvee;": "\u22bd", + "barwed;": "\u2305", + "barwedge;": "\u2305", + "bbrk;": "\u23b5", + "bbrktbrk;": "\u23b6", + "bcong;": "\u224c", + "bcy;": "\u0431", + "bdquo;": "\u201e", + "becaus;": "\u2235", + "because;": "\u2235", + "bemptyv;": "\u29b0", + "bepsi;": "\u03f6", + "bernou;": "\u212c", + "beta;": "\u03b2", + "beth;": "\u2136", + "between;": "\u226c", + "bfr;": "\U0001d51f", + "bigcap;": "\u22c2", + "bigcirc;": "\u25ef", + "bigcup;": "\u22c3", + "bigodot;": "\u2a00", + "bigoplus;": "\u2a01", + "bigotimes;": "\u2a02", + "bigsqcup;": "\u2a06", + "bigstar;": "\u2605", + "bigtriangledown;": "\u25bd", + "bigtriangleup;": "\u25b3", + "biguplus;": "\u2a04", + "bigvee;": "\u22c1", + "bigwedge;": "\u22c0", + "bkarow;": "\u290d", + "blacklozenge;": "\u29eb", + "blacksquare;": "\u25aa", + "blacktriangle;": "\u25b4", + "blacktriangledown;": "\u25be", + "blacktriangleleft;": "\u25c2", + "blacktriangleright;": "\u25b8", + "blank;": "\u2423", + "blk12;": "\u2592", + "blk14;": "\u2591", + "blk34;": "\u2593", + "block;": "\u2588", + "bne;": "=\u20e5", + "bnequiv;": "\u2261\u20e5", + "bnot;": "\u2310", + "bopf;": "\U0001d553", + "bot;": "\u22a5", + "bottom;": "\u22a5", + "bowtie;": "\u22c8", + "boxDL;": "\u2557", + "boxDR;": "\u2554", + "boxDl;": "\u2556", + "boxDr;": "\u2553", + "boxH;": "\u2550", + "boxHD;": "\u2566", + "boxHU;": "\u2569", + "boxHd;": "\u2564", + "boxHu;": "\u2567", + "boxUL;": "\u255d", + "boxUR;": "\u255a", + "boxUl;": "\u255c", + "boxUr;": "\u2559", + "boxV;": "\u2551", + "boxVH;": "\u256c", + "boxVL;": "\u2563", + "boxVR;": "\u2560", + "boxVh;": "\u256b", + "boxVl;": "\u2562", + "boxVr;": "\u255f", + "boxbox;": "\u29c9", + "boxdL;": "\u2555", + "boxdR;": "\u2552", + "boxdl;": "\u2510", + "boxdr;": "\u250c", + "boxh;": "\u2500", + "boxhD;": "\u2565", + "boxhU;": "\u2568", + "boxhd;": "\u252c", + "boxhu;": "\u2534", + "boxminus;": "\u229f", + "boxplus;": "\u229e", + "boxtimes;": "\u22a0", + "boxuL;": "\u255b", + "boxuR;": "\u2558", + "boxul;": "\u2518", + "boxur;": "\u2514", + "boxv;": "\u2502", + "boxvH;": "\u256a", + "boxvL;": "\u2561", + "boxvR;": "\u255e", + "boxvh;": "\u253c", + "boxvl;": "\u2524", + "boxvr;": "\u251c", + "bprime;": "\u2035", + "breve;": "\u02d8", + "brvbar": "\xa6", + "brvbar;": "\xa6", + "bscr;": "\U0001d4b7", + "bsemi;": "\u204f", + "bsim;": "\u223d", + "bsime;": "\u22cd", + "bsol;": "\\", + "bsolb;": "\u29c5", + "bsolhsub;": "\u27c8", + "bull;": "\u2022", + "bullet;": "\u2022", + "bump;": "\u224e", + "bumpE;": "\u2aae", + "bumpe;": "\u224f", + "bumpeq;": "\u224f", + "cacute;": "\u0107", + "cap;": "\u2229", + "capand;": "\u2a44", + "capbrcup;": "\u2a49", + "capcap;": "\u2a4b", + "capcup;": "\u2a47", + "capdot;": "\u2a40", + "caps;": "\u2229\ufe00", + "caret;": "\u2041", + "caron;": "\u02c7", + "ccaps;": "\u2a4d", + "ccaron;": "\u010d", + "ccedil": "\xe7", + "ccedil;": "\xe7", + "ccirc;": "\u0109", + "ccups;": "\u2a4c", + "ccupssm;": "\u2a50", + "cdot;": "\u010b", + "cedil": "\xb8", + "cedil;": "\xb8", + "cemptyv;": "\u29b2", + "cent": "\xa2", + "cent;": "\xa2", + "centerdot;": "\xb7", + "cfr;": "\U0001d520", + "chcy;": "\u0447", + "check;": "\u2713", + "checkmark;": "\u2713", + "chi;": "\u03c7", + "cir;": "\u25cb", + "cirE;": "\u29c3", + "circ;": "\u02c6", + "circeq;": "\u2257", + "circlearrowleft;": "\u21ba", + "circlearrowright;": "\u21bb", + "circledR;": "\xae", + "circledS;": "\u24c8", + "circledast;": "\u229b", + "circledcirc;": "\u229a", + "circleddash;": "\u229d", + "cire;": "\u2257", + "cirfnint;": "\u2a10", + "cirmid;": "\u2aef", + "cirscir;": "\u29c2", + "clubs;": "\u2663", + "clubsuit;": "\u2663", + "colon;": ":", + "colone;": "\u2254", + "coloneq;": "\u2254", + "comma;": ",", + "commat;": "@", + "comp;": "\u2201", + "compfn;": "\u2218", + "complement;": "\u2201", + "complexes;": "\u2102", + "cong;": "\u2245", + "congdot;": "\u2a6d", + "conint;": "\u222e", + "copf;": "\U0001d554", + "coprod;": "\u2210", + "copy": "\xa9", + "copy;": "\xa9", + "copysr;": "\u2117", + "crarr;": "\u21b5", + "cross;": "\u2717", + "cscr;": "\U0001d4b8", + "csub;": "\u2acf", + "csube;": "\u2ad1", + "csup;": "\u2ad0", + "csupe;": "\u2ad2", + "ctdot;": "\u22ef", + "cudarrl;": "\u2938", + "cudarrr;": "\u2935", + "cuepr;": "\u22de", + "cuesc;": "\u22df", + "cularr;": "\u21b6", + "cularrp;": "\u293d", + "cup;": "\u222a", + "cupbrcap;": "\u2a48", + "cupcap;": "\u2a46", + "cupcup;": "\u2a4a", + "cupdot;": "\u228d", + "cupor;": "\u2a45", + "cups;": "\u222a\ufe00", + "curarr;": "\u21b7", + "curarrm;": "\u293c", + "curlyeqprec;": "\u22de", + "curlyeqsucc;": "\u22df", + "curlyvee;": "\u22ce", + "curlywedge;": "\u22cf", + "curren": "\xa4", + "curren;": "\xa4", + "curvearrowleft;": "\u21b6", + "curvearrowright;": "\u21b7", + "cuvee;": "\u22ce", + "cuwed;": "\u22cf", + "cwconint;": "\u2232", + "cwint;": "\u2231", + "cylcty;": "\u232d", + "dArr;": "\u21d3", + "dHar;": "\u2965", + "dagger;": "\u2020", + "daleth;": "\u2138", + "darr;": "\u2193", + "dash;": "\u2010", + "dashv;": "\u22a3", + "dbkarow;": "\u290f", + "dblac;": "\u02dd", + "dcaron;": "\u010f", + "dcy;": "\u0434", + "dd;": "\u2146", + "ddagger;": "\u2021", + "ddarr;": "\u21ca", + "ddotseq;": "\u2a77", + "deg": "\xb0", + "deg;": "\xb0", + "delta;": "\u03b4", + "demptyv;": "\u29b1", + "dfisht;": "\u297f", + "dfr;": "\U0001d521", + "dharl;": "\u21c3", + "dharr;": "\u21c2", + "diam;": "\u22c4", + "diamond;": "\u22c4", + "diamondsuit;": "\u2666", + "diams;": "\u2666", + "die;": "\xa8", + "digamma;": "\u03dd", + "disin;": "\u22f2", + "div;": "\xf7", + "divide": "\xf7", + "divide;": "\xf7", + "divideontimes;": "\u22c7", + "divonx;": "\u22c7", + "djcy;": "\u0452", + "dlcorn;": "\u231e", + "dlcrop;": "\u230d", + "dollar;": "$", + "dopf;": "\U0001d555", + "dot;": "\u02d9", + "doteq;": "\u2250", + "doteqdot;": "\u2251", + "dotminus;": "\u2238", + "dotplus;": "\u2214", + "dotsquare;": "\u22a1", + "doublebarwedge;": "\u2306", + "downarrow;": "\u2193", + "downdownarrows;": "\u21ca", + "downharpoonleft;": "\u21c3", + "downharpoonright;": "\u21c2", + "drbkarow;": "\u2910", + "drcorn;": "\u231f", + "drcrop;": "\u230c", + "dscr;": "\U0001d4b9", + "dscy;": "\u0455", + "dsol;": "\u29f6", + "dstrok;": "\u0111", + "dtdot;": "\u22f1", + "dtri;": "\u25bf", + "dtrif;": "\u25be", + "duarr;": "\u21f5", + "duhar;": "\u296f", + "dwangle;": "\u29a6", + "dzcy;": "\u045f", + "dzigrarr;": "\u27ff", + "eDDot;": "\u2a77", + "eDot;": "\u2251", + "eacute": "\xe9", + "eacute;": "\xe9", + "easter;": "\u2a6e", + "ecaron;": "\u011b", + "ecir;": "\u2256", + "ecirc": "\xea", + "ecirc;": "\xea", + "ecolon;": "\u2255", + "ecy;": "\u044d", + "edot;": "\u0117", + "ee;": "\u2147", + "efDot;": "\u2252", + "efr;": "\U0001d522", + "eg;": "\u2a9a", + "egrave": "\xe8", + "egrave;": "\xe8", + "egs;": "\u2a96", + "egsdot;": "\u2a98", + "el;": "\u2a99", + "elinters;": "\u23e7", + "ell;": "\u2113", + "els;": "\u2a95", + "elsdot;": "\u2a97", + "emacr;": "\u0113", + "empty;": "\u2205", + "emptyset;": "\u2205", + "emptyv;": "\u2205", + "emsp13;": "\u2004", + "emsp14;": "\u2005", + "emsp;": "\u2003", + "eng;": "\u014b", + "ensp;": "\u2002", + "eogon;": "\u0119", + "eopf;": "\U0001d556", + "epar;": "\u22d5", + "eparsl;": "\u29e3", + "eplus;": "\u2a71", + "epsi;": "\u03b5", + "epsilon;": "\u03b5", + "epsiv;": "\u03f5", + "eqcirc;": "\u2256", + "eqcolon;": "\u2255", + "eqsim;": "\u2242", + "eqslantgtr;": "\u2a96", + "eqslantless;": "\u2a95", + "equals;": "=", + "equest;": "\u225f", + "equiv;": "\u2261", + "equivDD;": "\u2a78", + "eqvparsl;": "\u29e5", + "erDot;": "\u2253", + "erarr;": "\u2971", + "escr;": "\u212f", + "esdot;": "\u2250", + "esim;": "\u2242", + "eta;": "\u03b7", + "eth": "\xf0", + "eth;": "\xf0", + "euml": "\xeb", + "euml;": "\xeb", + "euro;": "\u20ac", + "excl;": "!", + "exist;": "\u2203", + "expectation;": "\u2130", + "exponentiale;": "\u2147", + "fallingdotseq;": "\u2252", + "fcy;": "\u0444", + "female;": "\u2640", + "ffilig;": "\ufb03", + "fflig;": "\ufb00", + "ffllig;": "\ufb04", + "ffr;": "\U0001d523", + "filig;": "\ufb01", + "fjlig;": "fj", + "flat;": "\u266d", + "fllig;": "\ufb02", + "fltns;": "\u25b1", + "fnof;": "\u0192", + "fopf;": "\U0001d557", + "forall;": "\u2200", + "fork;": "\u22d4", + "forkv;": "\u2ad9", + "fpartint;": "\u2a0d", + "frac12": "\xbd", + "frac12;": "\xbd", + "frac13;": "\u2153", + "frac14": "\xbc", + "frac14;": "\xbc", + "frac15;": "\u2155", + "frac16;": "\u2159", + "frac18;": "\u215b", + "frac23;": "\u2154", + "frac25;": "\u2156", + "frac34": "\xbe", + "frac34;": "\xbe", + "frac35;": "\u2157", + "frac38;": "\u215c", + "frac45;": "\u2158", + "frac56;": "\u215a", + "frac58;": "\u215d", + "frac78;": "\u215e", + "frasl;": "\u2044", + "frown;": "\u2322", + "fscr;": "\U0001d4bb", + "gE;": "\u2267", + "gEl;": "\u2a8c", + "gacute;": "\u01f5", + "gamma;": "\u03b3", + "gammad;": "\u03dd", + "gap;": "\u2a86", + "gbreve;": "\u011f", + "gcirc;": "\u011d", + "gcy;": "\u0433", + "gdot;": "\u0121", + "ge;": "\u2265", + "gel;": "\u22db", + "geq;": "\u2265", + "geqq;": "\u2267", + "geqslant;": "\u2a7e", + "ges;": "\u2a7e", + "gescc;": "\u2aa9", + "gesdot;": "\u2a80", + "gesdoto;": "\u2a82", + "gesdotol;": "\u2a84", + "gesl;": "\u22db\ufe00", + "gesles;": "\u2a94", + "gfr;": "\U0001d524", + "gg;": "\u226b", + "ggg;": "\u22d9", + "gimel;": "\u2137", + "gjcy;": "\u0453", + "gl;": "\u2277", + "glE;": "\u2a92", + "gla;": "\u2aa5", + "glj;": "\u2aa4", + "gnE;": "\u2269", + "gnap;": "\u2a8a", + "gnapprox;": "\u2a8a", + "gne;": "\u2a88", + "gneq;": "\u2a88", + "gneqq;": "\u2269", + "gnsim;": "\u22e7", + "gopf;": "\U0001d558", + "grave;": "`", + "gscr;": "\u210a", + "gsim;": "\u2273", + "gsime;": "\u2a8e", + "gsiml;": "\u2a90", + "gt": ">", + "gt;": ">", + "gtcc;": "\u2aa7", + "gtcir;": "\u2a7a", + "gtdot;": "\u22d7", + "gtlPar;": "\u2995", + "gtquest;": "\u2a7c", + "gtrapprox;": "\u2a86", + "gtrarr;": "\u2978", + "gtrdot;": "\u22d7", + "gtreqless;": "\u22db", + "gtreqqless;": "\u2a8c", + "gtrless;": "\u2277", + "gtrsim;": "\u2273", + "gvertneqq;": "\u2269\ufe00", + "gvnE;": "\u2269\ufe00", + "hArr;": "\u21d4", + "hairsp;": "\u200a", + "half;": "\xbd", + "hamilt;": "\u210b", + "hardcy;": "\u044a", + "harr;": "\u2194", + "harrcir;": "\u2948", + "harrw;": "\u21ad", + "hbar;": "\u210f", + "hcirc;": "\u0125", + "hearts;": "\u2665", + "heartsuit;": "\u2665", + "hellip;": "\u2026", + "hercon;": "\u22b9", + "hfr;": "\U0001d525", + "hksearow;": "\u2925", + "hkswarow;": "\u2926", + "hoarr;": "\u21ff", + "homtht;": "\u223b", + "hookleftarrow;": "\u21a9", + "hookrightarrow;": "\u21aa", + "hopf;": "\U0001d559", + "horbar;": "\u2015", + "hscr;": "\U0001d4bd", + "hslash;": "\u210f", + "hstrok;": "\u0127", + "hybull;": "\u2043", + "hyphen;": "\u2010", + "iacute": "\xed", + "iacute;": "\xed", + "ic;": "\u2063", + "icirc": "\xee", + "icirc;": "\xee", + "icy;": "\u0438", + "iecy;": "\u0435", + "iexcl": "\xa1", + "iexcl;": "\xa1", + "iff;": "\u21d4", + "ifr;": "\U0001d526", + "igrave": "\xec", + "igrave;": "\xec", + "ii;": "\u2148", + "iiiint;": "\u2a0c", + "iiint;": "\u222d", + "iinfin;": "\u29dc", + "iiota;": "\u2129", + "ijlig;": "\u0133", + "imacr;": "\u012b", + "image;": "\u2111", + "imagline;": "\u2110", + "imagpart;": "\u2111", + "imath;": "\u0131", + "imof;": "\u22b7", + "imped;": "\u01b5", + "in;": "\u2208", + "incare;": "\u2105", + "infin;": "\u221e", + "infintie;": "\u29dd", + "inodot;": "\u0131", + "int;": "\u222b", + "intcal;": "\u22ba", + "integers;": "\u2124", + "intercal;": "\u22ba", + "intlarhk;": "\u2a17", + "intprod;": "\u2a3c", + "iocy;": "\u0451", + "iogon;": "\u012f", + "iopf;": "\U0001d55a", + "iota;": "\u03b9", + "iprod;": "\u2a3c", + "iquest": "\xbf", + "iquest;": "\xbf", + "iscr;": "\U0001d4be", + "isin;": "\u2208", + "isinE;": "\u22f9", + "isindot;": "\u22f5", + "isins;": "\u22f4", + "isinsv;": "\u22f3", + "isinv;": "\u2208", + "it;": "\u2062", + "itilde;": "\u0129", + "iukcy;": "\u0456", + "iuml": "\xef", + "iuml;": "\xef", + "jcirc;": "\u0135", + "jcy;": "\u0439", + "jfr;": "\U0001d527", + "jmath;": "\u0237", + "jopf;": "\U0001d55b", + "jscr;": "\U0001d4bf", + "jsercy;": "\u0458", + "jukcy;": "\u0454", + "kappa;": "\u03ba", + "kappav;": "\u03f0", + "kcedil;": "\u0137", + "kcy;": "\u043a", + "kfr;": "\U0001d528", + "kgreen;": "\u0138", + "khcy;": "\u0445", + "kjcy;": "\u045c", + "kopf;": "\U0001d55c", + "kscr;": "\U0001d4c0", + "lAarr;": "\u21da", + "lArr;": "\u21d0", + "lAtail;": "\u291b", + "lBarr;": "\u290e", + "lE;": "\u2266", + "lEg;": "\u2a8b", + "lHar;": "\u2962", + "lacute;": "\u013a", + "laemptyv;": "\u29b4", + "lagran;": "\u2112", + "lambda;": "\u03bb", + "lang;": "\u27e8", + "langd;": "\u2991", + "langle;": "\u27e8", + "lap;": "\u2a85", + "laquo": "\xab", + "laquo;": "\xab", + "larr;": "\u2190", + "larrb;": "\u21e4", + "larrbfs;": "\u291f", + "larrfs;": "\u291d", + "larrhk;": "\u21a9", + "larrlp;": "\u21ab", + "larrpl;": "\u2939", + "larrsim;": "\u2973", + "larrtl;": "\u21a2", + "lat;": "\u2aab", + "latail;": "\u2919", + "late;": "\u2aad", + "lates;": "\u2aad\ufe00", + "lbarr;": "\u290c", + "lbbrk;": "\u2772", + "lbrace;": "{", + "lbrack;": "[", + "lbrke;": "\u298b", + "lbrksld;": "\u298f", + "lbrkslu;": "\u298d", + "lcaron;": "\u013e", + "lcedil;": "\u013c", + "lceil;": "\u2308", + "lcub;": "{", + "lcy;": "\u043b", + "ldca;": "\u2936", + "ldquo;": "\u201c", + "ldquor;": "\u201e", + "ldrdhar;": "\u2967", + "ldrushar;": "\u294b", + "ldsh;": "\u21b2", + "le;": "\u2264", + "leftarrow;": "\u2190", + "leftarrowtail;": "\u21a2", + "leftharpoondown;": "\u21bd", + "leftharpoonup;": "\u21bc", + "leftleftarrows;": "\u21c7", + "leftrightarrow;": "\u2194", + "leftrightarrows;": "\u21c6", + "leftrightharpoons;": "\u21cb", + "leftrightsquigarrow;": "\u21ad", + "leftthreetimes;": "\u22cb", + "leg;": "\u22da", + "leq;": "\u2264", + "leqq;": "\u2266", + "leqslant;": "\u2a7d", + "les;": "\u2a7d", + "lescc;": "\u2aa8", + "lesdot;": "\u2a7f", + "lesdoto;": "\u2a81", + "lesdotor;": "\u2a83", + "lesg;": "\u22da\ufe00", + "lesges;": "\u2a93", + "lessapprox;": "\u2a85", + "lessdot;": "\u22d6", + "lesseqgtr;": "\u22da", + "lesseqqgtr;": "\u2a8b", + "lessgtr;": "\u2276", + "lesssim;": "\u2272", + "lfisht;": "\u297c", + "lfloor;": "\u230a", + "lfr;": "\U0001d529", + "lg;": "\u2276", + "lgE;": "\u2a91", + "lhard;": "\u21bd", + "lharu;": "\u21bc", + "lharul;": "\u296a", + "lhblk;": "\u2584", + "ljcy;": "\u0459", + "ll;": "\u226a", + "llarr;": "\u21c7", + "llcorner;": "\u231e", + "llhard;": "\u296b", + "lltri;": "\u25fa", + "lmidot;": "\u0140", + "lmoust;": "\u23b0", + "lmoustache;": "\u23b0", + "lnE;": "\u2268", + "lnap;": "\u2a89", + "lnapprox;": "\u2a89", + "lne;": "\u2a87", + "lneq;": "\u2a87", + "lneqq;": "\u2268", + "lnsim;": "\u22e6", + "loang;": "\u27ec", + "loarr;": "\u21fd", + "lobrk;": "\u27e6", + "longleftarrow;": "\u27f5", + "longleftrightarrow;": "\u27f7", + "longmapsto;": "\u27fc", + "longrightarrow;": "\u27f6", + "looparrowleft;": "\u21ab", + "looparrowright;": "\u21ac", + "lopar;": "\u2985", + "lopf;": "\U0001d55d", + "loplus;": "\u2a2d", + "lotimes;": "\u2a34", + "lowast;": "\u2217", + "lowbar;": "_", + "loz;": "\u25ca", + "lozenge;": "\u25ca", + "lozf;": "\u29eb", + "lpar;": "(", + "lparlt;": "\u2993", + "lrarr;": "\u21c6", + "lrcorner;": "\u231f", + "lrhar;": "\u21cb", + "lrhard;": "\u296d", + "lrm;": "\u200e", + "lrtri;": "\u22bf", + "lsaquo;": "\u2039", + "lscr;": "\U0001d4c1", + "lsh;": "\u21b0", + "lsim;": "\u2272", + "lsime;": "\u2a8d", + "lsimg;": "\u2a8f", + "lsqb;": "[", + "lsquo;": "\u2018", + "lsquor;": "\u201a", + "lstrok;": "\u0142", + "lt": "<", + "lt;": "<", + "ltcc;": "\u2aa6", + "ltcir;": "\u2a79", + "ltdot;": "\u22d6", + "lthree;": "\u22cb", + "ltimes;": "\u22c9", + "ltlarr;": "\u2976", + "ltquest;": "\u2a7b", + "ltrPar;": "\u2996", + "ltri;": "\u25c3", + "ltrie;": "\u22b4", + "ltrif;": "\u25c2", + "lurdshar;": "\u294a", + "luruhar;": "\u2966", + "lvertneqq;": "\u2268\ufe00", + "lvnE;": "\u2268\ufe00", + "mDDot;": "\u223a", + "macr": "\xaf", + "macr;": "\xaf", + "male;": "\u2642", + "malt;": "\u2720", + "maltese;": "\u2720", + "map;": "\u21a6", + "mapsto;": "\u21a6", + "mapstodown;": "\u21a7", + "mapstoleft;": "\u21a4", + "mapstoup;": "\u21a5", + "marker;": "\u25ae", + "mcomma;": "\u2a29", + "mcy;": "\u043c", + "mdash;": "\u2014", + "measuredangle;": "\u2221", + "mfr;": "\U0001d52a", + "mho;": "\u2127", + "micro": "\xb5", + "micro;": "\xb5", + "mid;": "\u2223", + "midast;": "*", + "midcir;": "\u2af0", + "middot": "\xb7", + "middot;": "\xb7", + "minus;": "\u2212", + "minusb;": "\u229f", + "minusd;": "\u2238", + "minusdu;": "\u2a2a", + "mlcp;": "\u2adb", + "mldr;": "\u2026", + "mnplus;": "\u2213", + "models;": "\u22a7", + "mopf;": "\U0001d55e", + "mp;": "\u2213", + "mscr;": "\U0001d4c2", + "mstpos;": "\u223e", + "mu;": "\u03bc", + "multimap;": "\u22b8", + "mumap;": "\u22b8", + "nGg;": "\u22d9\u0338", + "nGt;": "\u226b\u20d2", + "nGtv;": "\u226b\u0338", + "nLeftarrow;": "\u21cd", + "nLeftrightarrow;": "\u21ce", + "nLl;": "\u22d8\u0338", + "nLt;": "\u226a\u20d2", + "nLtv;": "\u226a\u0338", + "nRightarrow;": "\u21cf", + "nVDash;": "\u22af", + "nVdash;": "\u22ae", + "nabla;": "\u2207", + "nacute;": "\u0144", + "nang;": "\u2220\u20d2", + "nap;": "\u2249", + "napE;": "\u2a70\u0338", + "napid;": "\u224b\u0338", + "napos;": "\u0149", + "napprox;": "\u2249", + "natur;": "\u266e", + "natural;": "\u266e", + "naturals;": "\u2115", + "nbsp": "\xa0", + "nbsp;": "\xa0", + "nbump;": "\u224e\u0338", + "nbumpe;": "\u224f\u0338", + "ncap;": "\u2a43", + "ncaron;": "\u0148", + "ncedil;": "\u0146", + "ncong;": "\u2247", + "ncongdot;": "\u2a6d\u0338", + "ncup;": "\u2a42", + "ncy;": "\u043d", + "ndash;": "\u2013", + "ne;": "\u2260", + "neArr;": "\u21d7", + "nearhk;": "\u2924", + "nearr;": "\u2197", + "nearrow;": "\u2197", + "nedot;": "\u2250\u0338", + "nequiv;": "\u2262", + "nesear;": "\u2928", + "nesim;": "\u2242\u0338", + "nexist;": "\u2204", + "nexists;": "\u2204", + "nfr;": "\U0001d52b", + "ngE;": "\u2267\u0338", + "nge;": "\u2271", + "ngeq;": "\u2271", + "ngeqq;": "\u2267\u0338", + "ngeqslant;": "\u2a7e\u0338", + "nges;": "\u2a7e\u0338", + "ngsim;": "\u2275", + "ngt;": "\u226f", + "ngtr;": "\u226f", + "nhArr;": "\u21ce", + "nharr;": "\u21ae", + "nhpar;": "\u2af2", + "ni;": "\u220b", + "nis;": "\u22fc", + "nisd;": "\u22fa", + "niv;": "\u220b", + "njcy;": "\u045a", + "nlArr;": "\u21cd", + "nlE;": "\u2266\u0338", + "nlarr;": "\u219a", + "nldr;": "\u2025", + "nle;": "\u2270", + "nleftarrow;": "\u219a", + "nleftrightarrow;": "\u21ae", + "nleq;": "\u2270", + "nleqq;": "\u2266\u0338", + "nleqslant;": "\u2a7d\u0338", + "nles;": "\u2a7d\u0338", + "nless;": "\u226e", + "nlsim;": "\u2274", + "nlt;": "\u226e", + "nltri;": "\u22ea", + "nltrie;": "\u22ec", + "nmid;": "\u2224", + "nopf;": "\U0001d55f", + "not": "\xac", + "not;": "\xac", + "notin;": "\u2209", + "notinE;": "\u22f9\u0338", + "notindot;": "\u22f5\u0338", + "notinva;": "\u2209", + "notinvb;": "\u22f7", + "notinvc;": "\u22f6", + "notni;": "\u220c", + "notniva;": "\u220c", + "notnivb;": "\u22fe", + "notnivc;": "\u22fd", + "npar;": "\u2226", + "nparallel;": "\u2226", + "nparsl;": "\u2afd\u20e5", + "npart;": "\u2202\u0338", + "npolint;": "\u2a14", + "npr;": "\u2280", + "nprcue;": "\u22e0", + "npre;": "\u2aaf\u0338", + "nprec;": "\u2280", + "npreceq;": "\u2aaf\u0338", + "nrArr;": "\u21cf", + "nrarr;": "\u219b", + "nrarrc;": "\u2933\u0338", + "nrarrw;": "\u219d\u0338", + "nrightarrow;": "\u219b", + "nrtri;": "\u22eb", + "nrtrie;": "\u22ed", + "nsc;": "\u2281", + "nsccue;": "\u22e1", + "nsce;": "\u2ab0\u0338", + "nscr;": "\U0001d4c3", + "nshortmid;": "\u2224", + "nshortparallel;": "\u2226", + "nsim;": "\u2241", + "nsime;": "\u2244", + "nsimeq;": "\u2244", + "nsmid;": "\u2224", + "nspar;": "\u2226", + "nsqsube;": "\u22e2", + "nsqsupe;": "\u22e3", + "nsub;": "\u2284", + "nsubE;": "\u2ac5\u0338", + "nsube;": "\u2288", + "nsubset;": "\u2282\u20d2", + "nsubseteq;": "\u2288", + "nsubseteqq;": "\u2ac5\u0338", + "nsucc;": "\u2281", + "nsucceq;": "\u2ab0\u0338", + "nsup;": "\u2285", + "nsupE;": "\u2ac6\u0338", + "nsupe;": "\u2289", + "nsupset;": "\u2283\u20d2", + "nsupseteq;": "\u2289", + "nsupseteqq;": "\u2ac6\u0338", + "ntgl;": "\u2279", + "ntilde": "\xf1", + "ntilde;": "\xf1", + "ntlg;": "\u2278", + "ntriangleleft;": "\u22ea", + "ntrianglelefteq;": "\u22ec", + "ntriangleright;": "\u22eb", + "ntrianglerighteq;": "\u22ed", + "nu;": "\u03bd", + "num;": "#", + "numero;": "\u2116", + "numsp;": "\u2007", + "nvDash;": "\u22ad", + "nvHarr;": "\u2904", + "nvap;": "\u224d\u20d2", + "nvdash;": "\u22ac", + "nvge;": "\u2265\u20d2", + "nvgt;": ">\u20d2", + "nvinfin;": "\u29de", + "nvlArr;": "\u2902", + "nvle;": "\u2264\u20d2", + "nvlt;": "<\u20d2", + "nvltrie;": "\u22b4\u20d2", + "nvrArr;": "\u2903", + "nvrtrie;": "\u22b5\u20d2", + "nvsim;": "\u223c\u20d2", + "nwArr;": "\u21d6", + "nwarhk;": "\u2923", + "nwarr;": "\u2196", + "nwarrow;": "\u2196", + "nwnear;": "\u2927", + "oS;": "\u24c8", + "oacute": "\xf3", + "oacute;": "\xf3", + "oast;": "\u229b", + "ocir;": "\u229a", + "ocirc": "\xf4", + "ocirc;": "\xf4", + "ocy;": "\u043e", + "odash;": "\u229d", + "odblac;": "\u0151", + "odiv;": "\u2a38", + "odot;": "\u2299", + "odsold;": "\u29bc", + "oelig;": "\u0153", + "ofcir;": "\u29bf", + "ofr;": "\U0001d52c", + "ogon;": "\u02db", + "ograve": "\xf2", + "ograve;": "\xf2", + "ogt;": "\u29c1", + "ohbar;": "\u29b5", + "ohm;": "\u03a9", + "oint;": "\u222e", + "olarr;": "\u21ba", + "olcir;": "\u29be", + "olcross;": "\u29bb", + "oline;": "\u203e", + "olt;": "\u29c0", + "omacr;": "\u014d", + "omega;": "\u03c9", + "omicron;": "\u03bf", + "omid;": "\u29b6", + "ominus;": "\u2296", + "oopf;": "\U0001d560", + "opar;": "\u29b7", + "operp;": "\u29b9", + "oplus;": "\u2295", + "or;": "\u2228", + "orarr;": "\u21bb", + "ord;": "\u2a5d", + "order;": "\u2134", + "orderof;": "\u2134", + "ordf": "\xaa", + "ordf;": "\xaa", + "ordm": "\xba", + "ordm;": "\xba", + "origof;": "\u22b6", + "oror;": "\u2a56", + "orslope;": "\u2a57", + "orv;": "\u2a5b", + "oscr;": "\u2134", + "oslash": "\xf8", + "oslash;": "\xf8", + "osol;": "\u2298", + "otilde": "\xf5", + "otilde;": "\xf5", + "otimes;": "\u2297", + "otimesas;": "\u2a36", + "ouml": "\xf6", + "ouml;": "\xf6", + "ovbar;": "\u233d", + "par;": "\u2225", + "para": "\xb6", + "para;": "\xb6", + "parallel;": "\u2225", + "parsim;": "\u2af3", + "parsl;": "\u2afd", + "part;": "\u2202", + "pcy;": "\u043f", + "percnt;": "%", + "period;": ".", + "permil;": "\u2030", + "perp;": "\u22a5", + "pertenk;": "\u2031", + "pfr;": "\U0001d52d", + "phi;": "\u03c6", + "phiv;": "\u03d5", + "phmmat;": "\u2133", + "phone;": "\u260e", + "pi;": "\u03c0", + "pitchfork;": "\u22d4", + "piv;": "\u03d6", + "planck;": "\u210f", + "planckh;": "\u210e", + "plankv;": "\u210f", + "plus;": "+", + "plusacir;": "\u2a23", + "plusb;": "\u229e", + "pluscir;": "\u2a22", + "plusdo;": "\u2214", + "plusdu;": "\u2a25", + "pluse;": "\u2a72", + "plusmn": "\xb1", + "plusmn;": "\xb1", + "plussim;": "\u2a26", + "plustwo;": "\u2a27", + "pm;": "\xb1", + "pointint;": "\u2a15", + "popf;": "\U0001d561", + "pound": "\xa3", + "pound;": "\xa3", + "pr;": "\u227a", + "prE;": "\u2ab3", + "prap;": "\u2ab7", + "prcue;": "\u227c", + "pre;": "\u2aaf", + "prec;": "\u227a", + "precapprox;": "\u2ab7", + "preccurlyeq;": "\u227c", + "preceq;": "\u2aaf", + "precnapprox;": "\u2ab9", + "precneqq;": "\u2ab5", + "precnsim;": "\u22e8", + "precsim;": "\u227e", + "prime;": "\u2032", + "primes;": "\u2119", + "prnE;": "\u2ab5", + "prnap;": "\u2ab9", + "prnsim;": "\u22e8", + "prod;": "\u220f", + "profalar;": "\u232e", + "profline;": "\u2312", + "profsurf;": "\u2313", + "prop;": "\u221d", + "propto;": "\u221d", + "prsim;": "\u227e", + "prurel;": "\u22b0", + "pscr;": "\U0001d4c5", + "psi;": "\u03c8", + "puncsp;": "\u2008", + "qfr;": "\U0001d52e", + "qint;": "\u2a0c", + "qopf;": "\U0001d562", + "qprime;": "\u2057", + "qscr;": "\U0001d4c6", + "quaternions;": "\u210d", + "quatint;": "\u2a16", + "quest;": "?", + "questeq;": "\u225f", + "quot": "\"", + "quot;": "\"", + "rAarr;": "\u21db", + "rArr;": "\u21d2", + "rAtail;": "\u291c", + "rBarr;": "\u290f", + "rHar;": "\u2964", + "race;": "\u223d\u0331", + "racute;": "\u0155", + "radic;": "\u221a", + "raemptyv;": "\u29b3", + "rang;": "\u27e9", + "rangd;": "\u2992", + "range;": "\u29a5", + "rangle;": "\u27e9", + "raquo": "\xbb", + "raquo;": "\xbb", + "rarr;": "\u2192", + "rarrap;": "\u2975", + "rarrb;": "\u21e5", + "rarrbfs;": "\u2920", + "rarrc;": "\u2933", + "rarrfs;": "\u291e", + "rarrhk;": "\u21aa", + "rarrlp;": "\u21ac", + "rarrpl;": "\u2945", + "rarrsim;": "\u2974", + "rarrtl;": "\u21a3", + "rarrw;": "\u219d", + "ratail;": "\u291a", + "ratio;": "\u2236", + "rationals;": "\u211a", + "rbarr;": "\u290d", + "rbbrk;": "\u2773", + "rbrace;": "}", + "rbrack;": "]", + "rbrke;": "\u298c", + "rbrksld;": "\u298e", + "rbrkslu;": "\u2990", + "rcaron;": "\u0159", + "rcedil;": "\u0157", + "rceil;": "\u2309", + "rcub;": "}", + "rcy;": "\u0440", + "rdca;": "\u2937", + "rdldhar;": "\u2969", + "rdquo;": "\u201d", + "rdquor;": "\u201d", + "rdsh;": "\u21b3", + "real;": "\u211c", + "realine;": "\u211b", + "realpart;": "\u211c", + "reals;": "\u211d", + "rect;": "\u25ad", + "reg": "\xae", + "reg;": "\xae", + "rfisht;": "\u297d", + "rfloor;": "\u230b", + "rfr;": "\U0001d52f", + "rhard;": "\u21c1", + "rharu;": "\u21c0", + "rharul;": "\u296c", + "rho;": "\u03c1", + "rhov;": "\u03f1", + "rightarrow;": "\u2192", + "rightarrowtail;": "\u21a3", + "rightharpoondown;": "\u21c1", + "rightharpoonup;": "\u21c0", + "rightleftarrows;": "\u21c4", + "rightleftharpoons;": "\u21cc", + "rightrightarrows;": "\u21c9", + "rightsquigarrow;": "\u219d", + "rightthreetimes;": "\u22cc", + "ring;": "\u02da", + "risingdotseq;": "\u2253", + "rlarr;": "\u21c4", + "rlhar;": "\u21cc", + "rlm;": "\u200f", + "rmoust;": "\u23b1", + "rmoustache;": "\u23b1", + "rnmid;": "\u2aee", + "roang;": "\u27ed", + "roarr;": "\u21fe", + "robrk;": "\u27e7", + "ropar;": "\u2986", + "ropf;": "\U0001d563", + "roplus;": "\u2a2e", + "rotimes;": "\u2a35", + "rpar;": ")", + "rpargt;": "\u2994", + "rppolint;": "\u2a12", + "rrarr;": "\u21c9", + "rsaquo;": "\u203a", + "rscr;": "\U0001d4c7", + "rsh;": "\u21b1", + "rsqb;": "]", + "rsquo;": "\u2019", + "rsquor;": "\u2019", + "rthree;": "\u22cc", + "rtimes;": "\u22ca", + "rtri;": "\u25b9", + "rtrie;": "\u22b5", + "rtrif;": "\u25b8", + "rtriltri;": "\u29ce", + "ruluhar;": "\u2968", + "rx;": "\u211e", + "sacute;": "\u015b", + "sbquo;": "\u201a", + "sc;": "\u227b", + "scE;": "\u2ab4", + "scap;": "\u2ab8", + "scaron;": "\u0161", + "sccue;": "\u227d", + "sce;": "\u2ab0", + "scedil;": "\u015f", + "scirc;": "\u015d", + "scnE;": "\u2ab6", + "scnap;": "\u2aba", + "scnsim;": "\u22e9", + "scpolint;": "\u2a13", + "scsim;": "\u227f", + "scy;": "\u0441", + "sdot;": "\u22c5", + "sdotb;": "\u22a1", + "sdote;": "\u2a66", + "seArr;": "\u21d8", + "searhk;": "\u2925", + "searr;": "\u2198", + "searrow;": "\u2198", + "sect": "\xa7", + "sect;": "\xa7", + "semi;": ";", + "seswar;": "\u2929", + "setminus;": "\u2216", + "setmn;": "\u2216", + "sext;": "\u2736", + "sfr;": "\U0001d530", + "sfrown;": "\u2322", + "sharp;": "\u266f", + "shchcy;": "\u0449", + "shcy;": "\u0448", + "shortmid;": "\u2223", + "shortparallel;": "\u2225", + "shy": "\xad", + "shy;": "\xad", + "sigma;": "\u03c3", + "sigmaf;": "\u03c2", + "sigmav;": "\u03c2", + "sim;": "\u223c", + "simdot;": "\u2a6a", + "sime;": "\u2243", + "simeq;": "\u2243", + "simg;": "\u2a9e", + "simgE;": "\u2aa0", + "siml;": "\u2a9d", + "simlE;": "\u2a9f", + "simne;": "\u2246", + "simplus;": "\u2a24", + "simrarr;": "\u2972", + "slarr;": "\u2190", + "smallsetminus;": "\u2216", + "smashp;": "\u2a33", + "smeparsl;": "\u29e4", + "smid;": "\u2223", + "smile;": "\u2323", + "smt;": "\u2aaa", + "smte;": "\u2aac", + "smtes;": "\u2aac\ufe00", + "softcy;": "\u044c", + "sol;": "/", + "solb;": "\u29c4", + "solbar;": "\u233f", + "sopf;": "\U0001d564", + "spades;": "\u2660", + "spadesuit;": "\u2660", + "spar;": "\u2225", + "sqcap;": "\u2293", + "sqcaps;": "\u2293\ufe00", + "sqcup;": "\u2294", + "sqcups;": "\u2294\ufe00", + "sqsub;": "\u228f", + "sqsube;": "\u2291", + "sqsubset;": "\u228f", + "sqsubseteq;": "\u2291", + "sqsup;": "\u2290", + "sqsupe;": "\u2292", + "sqsupset;": "\u2290", + "sqsupseteq;": "\u2292", + "squ;": "\u25a1", + "square;": "\u25a1", + "squarf;": "\u25aa", + "squf;": "\u25aa", + "srarr;": "\u2192", + "sscr;": "\U0001d4c8", + "ssetmn;": "\u2216", + "ssmile;": "\u2323", + "sstarf;": "\u22c6", + "star;": "\u2606", + "starf;": "\u2605", + "straightepsilon;": "\u03f5", + "straightphi;": "\u03d5", + "strns;": "\xaf", + "sub;": "\u2282", + "subE;": "\u2ac5", + "subdot;": "\u2abd", + "sube;": "\u2286", + "subedot;": "\u2ac3", + "submult;": "\u2ac1", + "subnE;": "\u2acb", + "subne;": "\u228a", + "subplus;": "\u2abf", + "subrarr;": "\u2979", + "subset;": "\u2282", + "subseteq;": "\u2286", + "subseteqq;": "\u2ac5", + "subsetneq;": "\u228a", + "subsetneqq;": "\u2acb", + "subsim;": "\u2ac7", + "subsub;": "\u2ad5", + "subsup;": "\u2ad3", + "succ;": "\u227b", + "succapprox;": "\u2ab8", + "succcurlyeq;": "\u227d", + "succeq;": "\u2ab0", + "succnapprox;": "\u2aba", + "succneqq;": "\u2ab6", + "succnsim;": "\u22e9", + "succsim;": "\u227f", + "sum;": "\u2211", + "sung;": "\u266a", + "sup1": "\xb9", + "sup1;": "\xb9", + "sup2": "\xb2", + "sup2;": "\xb2", + "sup3": "\xb3", + "sup3;": "\xb3", + "sup;": "\u2283", + "supE;": "\u2ac6", + "supdot;": "\u2abe", + "supdsub;": "\u2ad8", + "supe;": "\u2287", + "supedot;": "\u2ac4", + "suphsol;": "\u27c9", + "suphsub;": "\u2ad7", + "suplarr;": "\u297b", + "supmult;": "\u2ac2", + "supnE;": "\u2acc", + "supne;": "\u228b", + "supplus;": "\u2ac0", + "supset;": "\u2283", + "supseteq;": "\u2287", + "supseteqq;": "\u2ac6", + "supsetneq;": "\u228b", + "supsetneqq;": "\u2acc", + "supsim;": "\u2ac8", + "supsub;": "\u2ad4", + "supsup;": "\u2ad6", + "swArr;": "\u21d9", + "swarhk;": "\u2926", + "swarr;": "\u2199", + "swarrow;": "\u2199", + "swnwar;": "\u292a", + "szlig": "\xdf", + "szlig;": "\xdf", + "target;": "\u2316", + "tau;": "\u03c4", + "tbrk;": "\u23b4", + "tcaron;": "\u0165", + "tcedil;": "\u0163", + "tcy;": "\u0442", + "tdot;": "\u20db", + "telrec;": "\u2315", + "tfr;": "\U0001d531", + "there4;": "\u2234", + "therefore;": "\u2234", + "theta;": "\u03b8", + "thetasym;": "\u03d1", + "thetav;": "\u03d1", + "thickapprox;": "\u2248", + "thicksim;": "\u223c", + "thinsp;": "\u2009", + "thkap;": "\u2248", + "thksim;": "\u223c", + "thorn": "\xfe", + "thorn;": "\xfe", + "tilde;": "\u02dc", + "times": "\xd7", + "times;": "\xd7", + "timesb;": "\u22a0", + "timesbar;": "\u2a31", + "timesd;": "\u2a30", + "tint;": "\u222d", + "toea;": "\u2928", + "top;": "\u22a4", + "topbot;": "\u2336", + "topcir;": "\u2af1", + "topf;": "\U0001d565", + "topfork;": "\u2ada", + "tosa;": "\u2929", + "tprime;": "\u2034", + "trade;": "\u2122", + "triangle;": "\u25b5", + "triangledown;": "\u25bf", + "triangleleft;": "\u25c3", + "trianglelefteq;": "\u22b4", + "triangleq;": "\u225c", + "triangleright;": "\u25b9", + "trianglerighteq;": "\u22b5", + "tridot;": "\u25ec", + "trie;": "\u225c", + "triminus;": "\u2a3a", + "triplus;": "\u2a39", + "trisb;": "\u29cd", + "tritime;": "\u2a3b", + "trpezium;": "\u23e2", + "tscr;": "\U0001d4c9", + "tscy;": "\u0446", + "tshcy;": "\u045b", + "tstrok;": "\u0167", + "twixt;": "\u226c", + "twoheadleftarrow;": "\u219e", + "twoheadrightarrow;": "\u21a0", + "uArr;": "\u21d1", + "uHar;": "\u2963", + "uacute": "\xfa", + "uacute;": "\xfa", + "uarr;": "\u2191", + "ubrcy;": "\u045e", + "ubreve;": "\u016d", + "ucirc": "\xfb", + "ucirc;": "\xfb", + "ucy;": "\u0443", + "udarr;": "\u21c5", + "udblac;": "\u0171", + "udhar;": "\u296e", + "ufisht;": "\u297e", + "ufr;": "\U0001d532", + "ugrave": "\xf9", + "ugrave;": "\xf9", + "uharl;": "\u21bf", + "uharr;": "\u21be", + "uhblk;": "\u2580", + "ulcorn;": "\u231c", + "ulcorner;": "\u231c", + "ulcrop;": "\u230f", + "ultri;": "\u25f8", + "umacr;": "\u016b", + "uml": "\xa8", + "uml;": "\xa8", + "uogon;": "\u0173", + "uopf;": "\U0001d566", + "uparrow;": "\u2191", + "updownarrow;": "\u2195", + "upharpoonleft;": "\u21bf", + "upharpoonright;": "\u21be", + "uplus;": "\u228e", + "upsi;": "\u03c5", + "upsih;": "\u03d2", + "upsilon;": "\u03c5", + "upuparrows;": "\u21c8", + "urcorn;": "\u231d", + "urcorner;": "\u231d", + "urcrop;": "\u230e", + "uring;": "\u016f", + "urtri;": "\u25f9", + "uscr;": "\U0001d4ca", + "utdot;": "\u22f0", + "utilde;": "\u0169", + "utri;": "\u25b5", + "utrif;": "\u25b4", + "uuarr;": "\u21c8", + "uuml": "\xfc", + "uuml;": "\xfc", + "uwangle;": "\u29a7", + "vArr;": "\u21d5", + "vBar;": "\u2ae8", + "vBarv;": "\u2ae9", + "vDash;": "\u22a8", + "vangrt;": "\u299c", + "varepsilon;": "\u03f5", + "varkappa;": "\u03f0", + "varnothing;": "\u2205", + "varphi;": "\u03d5", + "varpi;": "\u03d6", + "varpropto;": "\u221d", + "varr;": "\u2195", + "varrho;": "\u03f1", + "varsigma;": "\u03c2", + "varsubsetneq;": "\u228a\ufe00", + "varsubsetneqq;": "\u2acb\ufe00", + "varsupsetneq;": "\u228b\ufe00", + "varsupsetneqq;": "\u2acc\ufe00", + "vartheta;": "\u03d1", + "vartriangleleft;": "\u22b2", + "vartriangleright;": "\u22b3", + "vcy;": "\u0432", + "vdash;": "\u22a2", + "vee;": "\u2228", + "veebar;": "\u22bb", + "veeeq;": "\u225a", + "vellip;": "\u22ee", + "verbar;": "|", + "vert;": "|", + "vfr;": "\U0001d533", + "vltri;": "\u22b2", + "vnsub;": "\u2282\u20d2", + "vnsup;": "\u2283\u20d2", + "vopf;": "\U0001d567", + "vprop;": "\u221d", + "vrtri;": "\u22b3", + "vscr;": "\U0001d4cb", + "vsubnE;": "\u2acb\ufe00", + "vsubne;": "\u228a\ufe00", + "vsupnE;": "\u2acc\ufe00", + "vsupne;": "\u228b\ufe00", + "vzigzag;": "\u299a", + "wcirc;": "\u0175", + "wedbar;": "\u2a5f", + "wedge;": "\u2227", + "wedgeq;": "\u2259", + "weierp;": "\u2118", + "wfr;": "\U0001d534", + "wopf;": "\U0001d568", + "wp;": "\u2118", + "wr;": "\u2240", + "wreath;": "\u2240", + "wscr;": "\U0001d4cc", + "xcap;": "\u22c2", + "xcirc;": "\u25ef", + "xcup;": "\u22c3", + "xdtri;": "\u25bd", + "xfr;": "\U0001d535", + "xhArr;": "\u27fa", + "xharr;": "\u27f7", + "xi;": "\u03be", + "xlArr;": "\u27f8", + "xlarr;": "\u27f5", + "xmap;": "\u27fc", + "xnis;": "\u22fb", + "xodot;": "\u2a00", + "xopf;": "\U0001d569", + "xoplus;": "\u2a01", + "xotime;": "\u2a02", + "xrArr;": "\u27f9", + "xrarr;": "\u27f6", + "xscr;": "\U0001d4cd", + "xsqcup;": "\u2a06", + "xuplus;": "\u2a04", + "xutri;": "\u25b3", + "xvee;": "\u22c1", + "xwedge;": "\u22c0", + "yacute": "\xfd", + "yacute;": "\xfd", + "yacy;": "\u044f", + "ycirc;": "\u0177", + "ycy;": "\u044b", + "yen": "\xa5", + "yen;": "\xa5", + "yfr;": "\U0001d536", + "yicy;": "\u0457", + "yopf;": "\U0001d56a", + "yscr;": "\U0001d4ce", + "yucy;": "\u044e", + "yuml": "\xff", + "yuml;": "\xff", + "zacute;": "\u017a", + "zcaron;": "\u017e", + "zcy;": "\u0437", + "zdot;": "\u017c", + "zeetrf;": "\u2128", + "zeta;": "\u03b6", + "zfr;": "\U0001d537", + "zhcy;": "\u0436", + "zigrarr;": "\u21dd", + "zopf;": "\U0001d56b", + "zscr;": "\U0001d4cf", + "zwj;": "\u200d", + "zwnj;": "\u200c", +} + +replacementCharacters = { + 0x0: "\uFFFD", + 0x0d: "\u000D", + 0x80: "\u20AC", + 0x81: "\u0081", + 0x82: "\u201A", + 0x83: "\u0192", + 0x84: "\u201E", + 0x85: "\u2026", + 0x86: "\u2020", + 0x87: "\u2021", + 0x88: "\u02C6", + 0x89: "\u2030", + 0x8A: "\u0160", + 0x8B: "\u2039", + 0x8C: "\u0152", + 0x8D: "\u008D", + 0x8E: "\u017D", + 0x8F: "\u008F", + 0x90: "\u0090", + 0x91: "\u2018", + 0x92: "\u2019", + 0x93: "\u201C", + 0x94: "\u201D", + 0x95: "\u2022", + 0x96: "\u2013", + 0x97: "\u2014", + 0x98: "\u02DC", + 0x99: "\u2122", + 0x9A: "\u0161", + 0x9B: "\u203A", + 0x9C: "\u0153", + 0x9D: "\u009D", + 0x9E: "\u017E", + 0x9F: "\u0178", +} + +tokenTypes = { + "Doctype": 0, + "Characters": 1, + "SpaceCharacters": 2, + "StartTag": 3, + "EndTag": 4, + "EmptyTag": 5, + "Comment": 6, + "ParseError": 7 +} + +tagTokenTypes = frozenset([tokenTypes["StartTag"], tokenTypes["EndTag"], + tokenTypes["EmptyTag"]]) + + +prefixes = {v: k for k, v in namespaces.items()} +prefixes["http://www.w3.org/1998/Math/MathML"] = "math" + + +class DataLossWarning(UserWarning): + """Raised when the current tree is unable to represent the input data""" + pass + + +class _ReparseException(Exception): + pass diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/constants.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6870c5ba46ed14310363c65a027bc839f36f00ae GIT binary patch literal 83486 zcmcHC1(*~^;{X3~-4WtMHwq+Kh!PhZ5+Df>BRcG7SO#`?Hajy&Tu6YpySux40&#bD zcX#{0t7>MpcOiH8`##VAp1XZbRd-icS65e8S66evA5w`o=H0Sav#OQRjeSGQ*{d`&z*79j>X!5B)4De|kSl6fZV11u9fDL^b2pjpdF>K<~ zrm&e$o5L19Z3$cXv^5O!X)p}&X($ZyX*i7VX(WvDX&czqr_nIRr?Ie|Pus%|K8=I% zK23lfecB0j_GuT`)u)NDn@_vDWqUaGguQ&)8*)BPf@Yrtd7maji%(Oa;L}u?=2I)Q z`P2?YpE_V4pE{xBQyD5gO@|pi&4gJ#?F;+)v_Bl+(}8f1PY1&xJ{<~&`7|32_vr|j znkPY=T*K0OML`SdtE;nS1wluu8?Gd?{F z&-wH`yx`M|@RCn2!z(_$3a|O}I=tc2oA8!TZ^Ju2y$kR8^gevx(}(bpPanf4K79(G z`Sdw_;nSD!l}}&8H$Hs}-}&@C{NU4%@RLtJ!!JJl3cvaEJN)6(pYWGYf5Sgqtp0)W z`xStoUm^d%iBVr6;#1hK2ys!rVi5N$0ZG3aAmvvYGJa)QKjzEFefby{ufMl?`6mbJ zfyKOmh&QmfH?V{^u%tJzlsB++Ef8Zr%XkC5y@6%Df#tk`<-LIwYJmi)t>_J`8s0!3Z=kO?(9auK(;HaJ8(7;LXz~X7 zn?Ot29zoK31OvQlbvtkCc$ci}4Xo!4tnUqM;0l{1_pTpgS~+v-oQ|AV3;>B+#49-4UF^#MtK9%Ny9+8_0PB-CB@I-X+c6fV_dcH!#^7Xz>Q7cmoA*V5&FJt=XF9UDB-$ zYxOQ^^9Jgzn`uwly-REpRBK<0-X$I0z&_qUXDv`~-CD-l7NDWl0+>eh|EUcO+3i!_ z?f=h>a7)-Gmi864^r_@mnY&5Fujw$uubD8*uYF-ZzxIa%{5lX0^6OwY#IHl)Fu!KQ z;eH(fbNreM^ZYszj`HhhIL5DI;W)pJhZFod5l-^!WH`mIQ{gnfPKPu6Iup+F>ufm3 zuXEu%zs`pX{JIb>^6O%_#IH-?GQTc|EBv|=uJY?@xW=z*;X1#rha3F55pMG9X1K+# zTj4gpZihSkx)bj5>u$KmuY2J>zwUM5nl4^Wq8G}SK&3kUWYgQdK2FA>uq?)uXo`+zut!r{Q3|+^6O*x z#IH}`GrvBEFZ}uvzVhp9?)VvB!SB;Ietknk+SNB8SHzp11R{@#;=^g~#ixF5W6 zKf1V|ym3FfxL>?+zq+{Jym7y~xJGZ>A1>}sZ`@zRrTtpp#-&|e{&sQyc;kElyPiK_ z@?2dnKwN+a47*;|ZJTA=tm*Zb^{R2fz`%*Ucw`C8_WAO?d{Y{5H9dsI&DEiB zK#_o=0mTA}2dZ^_3A<=Xzoz-s=I07m(O+G(q`js>zNt&ut77R|a2XryT?;O2gUi)| z%iG}cwcrXixFQctHd~~&jLXwXJOTBZ*l5uzgqn2^lO4&d-=7uUpaqE)UL3quiy$I z9Z)9Vwo*1Q(Bz<3pv7-i(p0|A26f{D_K0j(5hv8@?}VKdQK+jhJQuUrf7?!s)fN-eEno+zyvXbIY* zSNRn7dwPZkG$Npp0gVc1n_3-Q!&kU1rfmZnO-+X}FgBp=9NWVV0gZEvhY11g2s;I| zvtt+7mD&Tl1++Wt5zwBFy7$Rm>f_GObMs}Qv;d?tpT+;+MyUw2kaA2 zCzJvzJ1Q_epc#&tFe{*aVZVU(hXVpS5Dp6HU^pb8L*cN1X2anD9RYI!nhWy+Iuecw z=xAV-W8m0;j)UU^Isr}$=p@IFxk=fZgbo$t5+E)3`* zxHzCo;L?CDgUbWD0Vok$@hB#{zmBo(Skkcq*W$;hBJ*h35i#9$pCO zMc}|*f|mn&1zrv4HF!OsH{i{H-h#ISdI#PO=skEppby}~fIfnc1NsC$4d^rYJfJV& z%YeRuuLJr9z76O*_&%T?;KzV|f}aEW1%3_aH~2lEKj6=R{(`>)`UiYL`GYjbK?Q-s z3<1l+5D6*@v7q9R2r3EWtN~I%r6Chk7J3D>7%U#t60l@YOTp4XEd#xSS{9ZIYI#^8 zs1;$Qpc-N2pjLrZgIWz%4{8nQ6I5U57u1@tR#0n0Q&9b3Kv3(zxj$*~Y#7u) zAiEpE#zAcYn+CNRY#!7Wuw_tNIktvDK@D~cfuTVSgW*AqaEydeL2U!u1~nSS1T_}6 z3u=4E4lpjL@h~B%9bu=Sc7|Po+7%`SwHxdn)E=;BPFx!=fZhGoeviTbs=07)WvW~P?y4GL0t}41a&1`71Y&mO;FdubwOPZHw1Mf+!WN! za7$3P!fip_4tE4~C)^d(-7fMTxHqW#fM(`?cp#_;VSZ2x;Gv)%hDU;W6dnueamN$z zWKd5zo`z?FdKR7w>Unq}s2Aa-pk8*o;v!##*MfQ--U#YVSUjk=;O(H^fp>#?58e;z z1NbngkKp5=K7mhz`V2k~>I?WXsITDbpuT}`gZd7>59$Z_F{qy$Kf^CU{R+PY^*j6# z)SvKIP=CWeLHR-qErk?-U`QbdhZKQmNHK_qlz?PN4Uh^c4VjR#&?}_HVDXTafF(m( z3YHFO8AoqeHl*cX`H)tC6+>DH8bewcRtafUSS_U0VU3XbK;Mx1!I~kh1#5@Y1pPxA z0PBRbF02>Q`mjMr8^XYlHiC^q+5|QYX*1Y7q%B~}khX%YLmC8wLmC1@LmCFdLmB}i zLmCC!gtRS;4rvUG4QV^rKBOIBTu9?#LP$HpP9g0KyM(kW(7H_oTDRR`_mK90Jww_H z_6{irlR|0+g_MWMA+^AikP0w0q-oF^QX8~~RD_O@_JPijN>C1|0x2$7$OJV5dU4&t ztdRDF{X*Iw4hZQ$pmYy{gF`w54h`urm>tsLa70LRU~WkB;K-1Uf}=w^296EsI5<9} z6X3*3p~#qzfGvIWBfw0$i|{0(rR% zA^}|vSA=w>Sr*dOa7{?p!gV2C4>yE#Bit0y&2URdx58~9-41tzbSK;u(%o=RNcX~h zA>9uTg!CZH4`~5B6w<@+NJx*uV<9~bPlWU&JQdQ@@JvY0!gC=#4=;rDBD@sR%kWA_ zufl5~y$)}L^d`I&(%bM(NbkaXA-xYDg!CbN6w=4=Nl2fFI2?`$YYxl} zYaSdK)=_YDSjWJzVI2p@hjjv+7}iN}a#*LpsbQT4r-yY0oEg?xZrRyzPFUx{d10Lo z7ld^oTol&Da7kE~!ewDy4p)SAC0rHO)o@K%*TQvST@N>ebtBvq*3EEBShvD$VciaQ zgmov}71rHwPgwWDePP`X4}|p~%nxe;JQUW$@JLvX!ee1Q4%{N2fG5Lx3Z4$@8F)6V z=ivFUUVslJu4tk>Z6u-~&I{jffO55xKhJ`U>>_%y7~ z;PbG)0J@rA0(YRVfO7d7z6tAF_%5vP;fJt(grCCt8GZ@tSNJWg-{Ft2{)E56`WyZU z%NOCgjVJ)Yh(ZvKC<4)lVi1og0m+CO94Sagl!0tSyS92sVyr6WBDO&0zD0wty`o+6uOgXb=pJXb23AXc!ESXatOmXcTM{ z(Y7!;qA@TwqU{{p!wwORgYgkffE^>+33iTX7uYqTiH_Z1_lWj@JtNu+_KqkAlOk$% z2=Wn4hL(t?Kp~>3FfF21Xp5*FiV=0dJ`r_7DWWn|BAO1I_ZcuVqFJzSMEk-15gh;r zMsyGy9MK_gXhes>(m~CJ-gKAYh=}IE+=%AEkr5pQM@MuF92?PbaC}53z=;u^1Sdyy zisMu`Euz!mjEK&Jvm!bh&WY$;I4`2};ev=Rgo`4&*l`J58qsBNc|=#hl@VP9S4VUW zTpQ7KaD7BKz>N{z1UE-?3)~vfZE$-;cfg$y-350?bPwDc(S2}#L=V7&5zU7M5j_MC zNAw6h8qs6$ctlUYlMy`yPe=3&JR8w-j_2Wph+c%3B6=BKiRe{$Euz=qjfmcaw<3BQ z-ihd4crT*&;e&`igpVTn7(R*UQ=sSZ8GIhm7w~07U%}TAeFNV{^c{R3(GQLv;irgx zhF>E36@H88claZsKjE*4{&xHWJSF?07C!`{3PLEVupZPMvhEVUQmWAb_S{_!2YDHKnszz8js#Rdss8(~K z)nSdO`as{P`oWq}tp#gG)dc;c8UX7=wJxj|)%vhOR2#y;s5XL)quK;EjcPO4JgO~V z%c!;j#)7tnK~W8cAyEy5VNneSF6|L8GOAIqO;p>$=%~iP*r>LH?ODcwvE~kL**F*< z)da_muv1h!!!A+n3amL17y;Q0c8_Wg$DXiPRC_yezyQi5XpTydk7_csL^TBpQB8$u zQME!_RP9iVssr|ksuN04l^qqJNtg~ZqM8Y$G7I*NYCqUNssn%#tOFef!NE}-0_^Be zV9e?;m>t#Oa70vdU~W|N;K-MS@rs&nAnsLlf}`}2WI^a8jrs*B*_s4jt7^tR!$s4j;qqPh~Uit1{(CaP=U zx~Q&)8=|@qZi?z=xFxDv;kKx5hdZLW6Yh%YZn!6^d*QyQ?gyH@2OJN={HPYdLs2~p zk3{t-JQmgC@I+Kk!c$Q_4bMdNEIb$0^YB7cFTzVvy$r8J^(wp;)$8y^RBystQN0cC zMD;Gb7uEalK~x{YM^SwYpG5U3d=}N`@I_Q#!dFp!4c|odEqoW%_wYkhKf+H@{R|8S z`~ts5^&9*i)gSO@RDZ$WQT+qHnEWv=`~- z61IwIYZw&MU>Fk9P#6}|aA3q`1dNPn6l}wwHH?mFjAJZp7t{8zLrmjfd`uHy$C!2k zhFy1d>;k*SG!b@-X?MpSz>w^ouvbibLoTLC&>WK-d6*ni3rvZr08?X{2CXr*L3>O^ z=!j__=!~fZ^r*{FiD^2_h-oIwifLciFQ)y0?GAtgV>$>9j_D9MG^WE~c1(vmj(|Ba z%>~B9=Q)mqqhdN5j*015I4-8+fxhAiE_5O=1bhz}4VtO2& zi0Mfn>8F6CpN3~*dKR9G>3Mh|rWYMA0lR$}*!&e>%~ydnUo*=BdL7<~=}mYmrne!& zP#L@%(|hoKOdr69F?|H|**}I)V)_&q@A(WqkLe3wZ2L?2DyFaDo0z@@2DQHfM$f;8 zA7c6uev0X5_$8)a9lycvG5rC5#`G8b9n(MHi_0IkV^0C#i6{t+mxml-h{P3j#DJmk zI3(gqLPK0BNXM0NWF5U=vA7m@ECEZ#wG=EJ*D}yMu4Q4lxR!?%;#v_H!e0pj42{Fe zajgQY#dEVXX-q^jg69+1kJ{GyzYa{b4{{>%h8ktq1GJwE=7x z*Fe}Pu8m=nxHg5&;@TXxh-*vWX0sKn9Msmp^X4EJ9M=#S8rLuw9@hwH?96Q2JaqSGd#I-9-jB7X8C#cSnKXpO54+T$uhM_l_rXIv#H$5nypam{edbj*T%btTI5MuI;OMxHfn(!3&T%}P5Z8&ov7ZDS?a44H zs8fKq@vPuB#o_z_oE*=eQnji0ekUDXyEL7}PB=nQ?ZY7M_dic{m`b7vROXUV@k7 zdIesM>os^it~VTS!dr2@4e!MDuH!v;Kdukp!?-?zkK_6TK8@=$_&lyJ;LEtaa(oTn z#PuzF7uWajLtH2Qf)Z%asugP3!Ng(N^fEOf7JC=do2`vlDCA2)O zkkE>-QbLWeazd-XstK(It0%MuFf!W*crViz`X#g`td-E(z$=(0=%3I4SSO)%VZDUb zhYb?i5C$f+kz-@nB%w_mn*pnA4qGI&C2W<@*1#LaK`=O>A;4>$p)f3=;V>ehk-(d# zQH~KjIBb*9wuD9}GzP{dv>j}p&<-#zq47WoPJkT~+6h=?XP~fl0ZM*X;7}$4``Zn6 zPiPOvp1=_PUchtl-asYF0WXdwL32U^UMJ*XazZUIC7}XLO=udlCe#M)2^Ae3uunpr zP)eu_m4v3ljD%*wtc3Q3{Sw+A4oK)gI4Gfm;gEz5g~Jk>4TmRm1k6cjF0j9OaAZP9 z!O;mF1KjbBh2s)B-f;r({^&$FDWQ`cr@*NRod%~TbOxN6&{>YNfg(5u&Q0h%I6t8a z92Wxbt1g0z6S@R0P3SVXJfSP#%7m_hs}s5gu1)AV;2qfYz#FO?TKc@I7g z>V5bip%3Asgg%B(68hBf8GN457w~05U%}T2eFNVn^c{Sk&=2rqLO;RJ3H<`UCiENp zp3oogXF`9$-wFK#zNGv~s&G<42qhJUNK#RVB^8H6Qb}k?Dh0evN}FXtWgweWFIX(8 z#er8-OTdyzEd@&_wG8x5YFSt=spWz9M=QXJNv#BHhSUfvC$)+TtqQ9pwK}YkR3ArQ zV5GDk@UCu6SSzWup(&~UK)oIS>m;=0f9c7&ah z+8KE9unX{Pzbi~kYB$(DsXbuNr1pZnlga_dHwnmYGxQ5ez}vt)Oiro=XdtEl?mwv&V_kN9SN**6daw@F~AWW3mnmLaC}lH zz==tn1ScnT3h?IcRN!b&1A3#U!x>4P31=mBHk^~xxo}=m=Q}Qd3zNDCE>7wa$E9#t zQkOff09LsYu1e}^xF)G<;ku-*2j2AF0K6By5qK|p6WpBCEx_y1TY;K&8{D4M9dKt- zcfs9B-2?X~bsyZH)C2HfQuBe4;05qdQV%;G0Y*+9g~yV59G*z(N#JZg1@wiV22ScT z@N81g!ShMI052x>61<$$EAVPkuff5*Fa%D(8}MdQZ^7G1y#v(UcY)Vk@4@>?eE=UO z^${%1>qEzIZhW64^(mpxlKLDt(_a8}=}Y)3sjuOiq`rmklKLKgNa{!UDXE`fbV$Dd z!#=;lZ%O?Qe>R6xawWH)s`L zFkn^3YOs2P)&Rz4`T);4eW722)`Ybhv^H?}Z313s_lE%uS_jr`(0VR%eb}Hu8v;YX z17V{EZ48?FfGr!e74Q;yYZ%m^!7!vjLt$8hhQo*kjRf8akAiI)v@MKo z&=?ropzVM;Slh!64H^gI8#Doy+$6C1RfTedsw(V#sYdjW69_XggT z=NyxOSJ=(KD{Mi&L6f1SK~td6psBEUSks`jL2c09pdxfMXdmcoPziXQUWQ78ro)T| z%>>?C%yR4t`!#5P;HCTlaA1QD0^YwL47`6o#BnGb)}YzI`}f0vxA8|f=D5hYz-#z< zjw6A$@kar#?~isI0~GSHa9o3qhZ7ofBJkGhBsjT2rTfH(YCy3kd?Jb|l$2?Eyu z@6oS?>l$=D+|ZyK9XA1!6>f%G8gwh%)}Y&6Sc(_52z@rU%3?6UL6TobPCxK}OPXUt-o_3MXxX`me#e5E)Z_o?yVuN0S zmmBnoi+mNBm+%@eA>nlh@*)+YVZ8}q-lxLb4SEMS=y!pfy$6}F-Up@`eBk&HSmh&N zm5+gG4W9t>89s&28uU4Q(V#EEAJ$jEB!{nE=o`1}TObqP0ek-*erV8-@Kb|+hE!O; z08<`*b)nzfvfqK}9)G}}4f@ORH!yqSAK?7?Quh4$frAbJ2OWe^N@0kk6optyaY&?; zgocz-kWMKB*_3+0Vks>SOQf_UES1vIuuMw5VcC?HgXL3N0ai?DC1^}(WmqMpRbjQ1 zR);lG>H~dK>IZA4v=;FCaBW8u^iOF3RAO2O)=gtKiFzh-3c1&p}*g2(LfT4G}AE)_DyL&*gvHM;J}m) zf`d~!1W4sjI4q^vj>F-Il;*(Pl;$~(gj)hS3XV?c7&tbi;~dAs2`QZj%LR23oSf1r zj#FLaX>fW0CH3rSsu}lrDseQo0y;>2e8Nn$l%(c}iEnl_^~X zSEqCh9L*#uxGtsZ;f9oM1jb5kf}2yi1*Y-@2Dhbjy9?a`ccyd~+?~=r!26DS;l7ma z2Zj(IfCp2W4+~Oy2$(7Ju;USUG^NMj@syr$kx#-?DLoC(r1UI2m(uf&7a$+ji||rP zFT*P-y$Z~!c@0{^dL3Bh4Y%w~x9lyq>}_}_rFY@Il-`FAQu+{>i}MkDoYE(d3+q#0 zmCt|;J_pwP0*YaM316l3HGGrOxA0v`-vhIDesKHeN?qEJN#L|jGBCRAaUe^FK!%8`}q0h(UmNX$IzGNVq zRxe-}dodH4))KH}T1&ywX)OaxJ?Rb0rnMX}m1lWaA*~f*rL-Dd<2QCV$FZ4@mO;{_fwV^4k{=kUD0HA-p4y>Ejda!<48^DHX4TO!-+88!TYg5=P zt<8Z+O2JLATfr9J+N@5>igHB+B5?sOyCs0ron4Z=Qps;4b zthDxp{nFYW7@$1>*x*25gM;AUv<`to(>lyC8xBwF2$+-BT$q>Ek-+?{qu}VYj)7y- zIu4Fc>jXG4t&`y7v`&Fj(>e`KPwNaIOJ~AaX`Kz{q;)PZrRqH39Gwq*+;D;8LLk={ z!NqA^0+*(B88ENwa=0d{E8xnsu7a!6x(2RI>pHkTts8*Hof{#`oD;Y?ty|#Mv~Gjj z)4Btg;&dl0#?%wIJFR=*-n8z6`_p;=9!zUKEJ*7icsQ*`fH_f*!eePY4o{@@B=Fkf zDR?@qXW-eio&!eVo`(ZMdcpA`yp-0tpyNtxthxna_ZGz~}HqT3o@p4tv}$;wElv>)A|Q|8Tm6b+ZhERlu;NMw1@zik3uY?I3zMk0y%4dR7PpY zWR!(o87&5jXS4(?nbA_PbVkcS?~Im(){YSSh1M$I50IpJV{D-&TdyGFly& z=(Yy*$*3}G$U=mQ-n}Mn?pw8!k%03x-N7MpSGAh8-jHWqSp)I3!M-e(Q+Q-oe z%n>X>Iim_p&u9kB%xD%cad2PQFQfh8fQ$}=gEBf84$0_HI4q;taCk;Xz?_Wc!n}-* z1d=`qNabi?561wj91Co492}p~32OQzXqX!%h0+UAO!-9++f`>DD z1QKdKR9`=y{+edI4U{=p|qR=gaU)Mz6vay!--& zeO?EKecpgKGkObXq2C5t=y%}VjNWt0-iHq|`VcpiOg z1hWb`!Vt+S3e2*MK|HGjFv~It4OyiiomB?1S@m)(2IE3n9Og5-9hS^$DOftIWgNX> z*{qg><+EA=R?KQ8;H7+{V`W$+t5spOtX2oIy9O}Tvk$O`zQ7*(0W(F{gtf9-8;+#u za-se(Aggs?-K^GgtPdMxwIK}5Y9rVLawiQdhitnzRZQ{|yGr52cy zRRN}EHO)k3)dtK=ZFdx*BddLY#5#ddfD-UfUxrFn(}8@>0CqGJW@WW6khA@OeC`kA z>;NF22f{&F9SnzLbtoK`)ofsT<>7EdR&!u(R`cMe^WglfE&wI~ zUI-Uubulmx@DgAi;HALFK9>O_-Iv1^SzQTC4!jDO2Y59wEASd%I^eaybinK2`mAnn z+z2;ibu-+O)va(_R=2|)S>5Tl3+~S99=JEF`{4ep9)Jh4nhy)IdI%oQ>Ji7I@K{!l z!xLFO2~TD9G(3~lv%m!0=ivFQUVs;~dI?_6>J@l3tJmQ5tloe(vw92O&gva_H>>xu z11I+J6;|P2SjzH`kt?#*IF7|*^t<=mDbkA<|(<(Tr<&)g?9eiQ7Jc;%ANUK+uDtt`Ht3H zb6$-z3gsz{JFYc+`0%0qD`~cDXUnGgmX+m+8r42M*IH1c*-uBY&|Ws_xs>`>$g;2C zR%oiPP+5c6@kKVOlp6aE=*I@l#m>%rbGda^V|CA@QO>pWuPkd5s4s4Ei<>xXvvsAv z%|LZ=zP&l$ubR4BxyidyEp_t`1CFh< zRT^6&c^C}%?TJ(8r5Fzx6Z~ht2=GZ zwU;SkyLl7YG<&G+bnwDEW!?|*j}VEO)gg2 zNptCcPqVVJNhjCFiF4JcaghhSB5SpqwW?=k5r^B@Gojj1xPvwM>0eorm1^-#-URLO z45L7}cuZv~=O~fJN_%bP#$37FS>V9(C6`K9xT(-iuGGYq_OkjX_DsIrLG{_PPuH0fx)Xqi%O znncSrEnlvT{|{+y)s<#r-;oo>jBZphUozKOsnTIu%f^n*VspM^kHOTN&PsEccC*yK zpDo3I&%-{Ie95fY)Ryai+{aiP>J1HI|g%GR`jwvu~` zsBu(Fd$H3b+h_9uTXG$(=`FJArncy6HNAVOb<1(LJ?+?4Q9M_byHM*nUepfErL_6K z9)Ks=`n{vE&+2`ZE9d%^`qZv3a}E8+y_k*dx$z|E$tQKFu{{AN|lb*LUXR1_vEKoz3nbe{_D%T60wc( ze=WQ%8jGE^R@qcwd*i5|SkuOEthMt|zp_oSnYRAFCSO0KMmio9T0?VRswZDx+GLk@ zOWs^3i#WwDnT0Mh+Y0{Ibh}?#t8_nrEzH@jwC__Xnp=83YZbFvexC{*GINey9)gzd-e9b&g}9g6)Tfk^G)_l{l6yN z=RYTHZZP$v%|ZUpxvn<6i_UR-(dD-EUm6>G3#r%oEo~uqih0;}!<$?ISNqh}#Z-PLwNOd(P|`@|1J`o&{}-)m5>7 zDQMH>^Az;IX0wS4&DMnO8TF)EF+J?=g4+3s8;i=f`jxHDne89L7HmS69OcJD{KlRzWWt&q>tD)#;=);~ zXQelbJynAon|@DiNz`grEe$ievdb>JPyp@uPWy;MYhE$qKGhPm z3#OFYTJ7VRC$F_VxJL<|q${RH^6aX%3sZO|0R~p`Dw$CUMk!1udvc+(WJZi~JV@D2 zUWzq&I&Cs*H+2?^<(~JYVO`JZ3)d(20J%_Ytv$e)T4ZuKth18`;3DHjwIi^7{7U<@ z_Tr4LGqWD6dXCm)%boaoF_#vV1>1O39|3A7s@{P#o0cj)Qm!9=W8c;LnqE)8Qolu| zY&(4ama zHE-^p)uz{_SG~JcS9GU)gN1id9hUKw$RZBO4hPl`z!aitV+-9LVoe?Bv5&6epTek* zX$bN&3p|_iXlx?-cU5oGP?cvCn@n`6Dc6~AYG(v!Qoc+lx2ZfO*UnHyeo+lo&+@m= z-ix?k%;jxP;bz@Sp(}@76@=?2S8im$&Rk36*=2Q1ak@#?^ie(6VZClNnNcy?kG5I% z7+;pwqasWODE zJXN||K5byEyJ{L;T`JiJ$7-RIv+7d!khjQkscu)#=GOmVhm4xE6xwsGwNx7?FyL(; z%}R|NNPdP}(7&=0i7aw&W`vv#nsO!E%~|A;)rzElI8VtPZh#Z7K;)4KiF zt^B|5ZN2~V-q!m+>}~!3^WN6~-}bhFwfP*6T=D zQ(-Ri2~!F*Zth;{X*L_Dv1=!-LGp|q%&(*?^z1}>s}@m#Tz@fEAy!1DTROARg>AKGL)4)N42O9nz=K& zV=?bB@-xjH)4q_KUMz~HrH%KE3*8o657~BKO775_-0GF}yYJDx@U-tY%?Lu{l!8Q? z)pMV21jch%Zatm?cwcIs1zho&-i7CIcqP`hh@{N(ohK=?R#y@|N~G&f&~=AhD9J^Z zNRKfXn~-f_-5KdoEQ7n}oQlz-$N9hQ)KqZKq1EfxqRvE*9zpdS=XoXluLoVP*4_%& zi)=Q%*Tv+7Y+ z{(IlL+okC_hOYi;n2scqi9xd$Iln)Qpnnq-e_sH+y2i_>UR>KE`L6YnZ4^YrQ2i|4|v zXTHb7#lN4DZu#%pMUO6|=X_KTW!vs2!(BMFn^xC>)ep(c-LQ9^>JClFd;c-BO+3eB zmo-(>Yg)t+)-T}7sQ;9c|9ap(^I=;5f6d22#n6?D9xn_3^*&{KarS+Q=i;_Qm7bm2 zdy^XnwfDdtJ&&%^?NM#&WxVhndR$*!1?t(2c`dtR{jE@~d82pUt#1B@o%CpDYo+Dc z#n#<-(KX0Ys~wX&dB`i}dF5{V3XMZ*uP956)&BEB7p}XLw>Q-`?fG=`-;1lZWo@VR zj(j88^_-WkQlpiqZS-#sA=P55tyV9#T7=sfLnyT&Ifkrz+>vXmnp)=h%@Cd)sq1lj ztX1`YJ72XF7COov%}MRFd3M^fNdJ57{$F?Isp_>&dhV?2{4Ly=xQbrea-k#Z(W&h^ zf38Z_w(B|cP%Fv*=lz-9ou|IkO0vh^O#gQg*O@yObHP{Z1jD0lg2}%oX;!9k)GCCT z7~)BIQD@2Xgl&$pHtbfhkF2#}M>8f|8&5SS$j&(NB)q6I@^1;7%2j*VHuI?J3D-|X z&!M`7OaI@}HaDq7rd=)gp0{xC5qHhtsP_5Hqk|c{Y%qzEPpZFNvZ$ffTCsH{QoXC$ z2N08r8RM>|QoUjJ7!O`_UTQVc&d9Ra@k~sqE&LyI)ZAI<;8Cb{Ty}uN9aqUNGDqls z{cj2K6q2V6uBB*)46BD&UDVW?YgfspHlZ_DV0vXsWA$Az53Xf~D_V;)=r}WgQR^wx zMz8G9uBouoiv{Mqxrbjn>8+_;O{zYX)0E_}>f>>3`)=uTPtOtI-Y~fQ&Mez^Hl8cV zzI~|e$h39t@XX9eQxSSjsaUvHGA3)bX*3D-x33dDsaIMmu7yYmKF0`9b zUIv}rxv6KrM=RZ9HS^r|zfD-`vEialXSWPgwx+l}7ylw!70>ngZ>gJkh_xGa_vGE1 z4CN;?8JA}&UfVEhmbq|r*elJ`%%oE_mYC_;Dl-T^xiFL04R*AP_gPGcsczV0H?$+q zQ_AIzO$Q8^F=Iym8SD2icD4*ycau#v88Fk{GehLV{xI)Z7P;oe1IFaaQ|zBHqbm_s zYa`5yG4qOT;Vsr%XPtEhl%}^-f-E+gMrq;ITo$+@rd7hMFw_1r(*_n^b(b-tO^!Dn z&~CayW-5VAdnQ>h9jt{nuvuVnduf16-2AjT&vkUPGWjveX3aS}a%g`u8~^lX3$Suo70VP$TftFuv^z?6n>I7vV#ljyH(&#}H^1ILDrfi@*`9orq5AEa)Me2P2r zf=k?#XQ7SJXnPQawidf%`&4WXk2A_F~t;w-?PY%8!iFT8HCM^n8gnmm-a zG#GAo(cCMl7fPu-t6Evg_W8_|yh+B^Cv(hYQ{HxGjI&Zm_F{4cRB5&OpFtHdJDu6q zVK0^XEHv|GrF)EN2D-;gFf*CV1y3y3Y2UMKcY) zQVTP~*@n%bH0N5I$CxXy7BB;-Hm&B?LdW*BhC8+w%B6Zt2Qhp;LX4SaP`!VSw|xwo zQ%|fbTbo-m`JlG0DNnnqC(;(OUDI@dRG2)OG2J1|x-Rqmf_;}?jUy2kXR@1DOTM0W z6R>%Ay<4sT-sp|XbNzNQoqJq$9Ix89tPd`0}mXy*djsZ8z3MaQiY5rf6M+Nn>=ry@j*Z6={-bb&=-Mn3kWlz4=7P9Wf#M z!A{AxdW6RF+P|FwFpVI=QZ;Cfm*9i~H!gd;1j;sG^5>Etq^Xrs+2+qh%1u~v!+|67IJ&BZ)hrQ+clSS)2pS$S1io0 zst3)rQ#}`EWfQEP1@l6WpsAMKGU18umJgG;>iS(3$`jdDpG@gh*L0coM7Vt0#?hYs zLFHXsQ)xrF@=Q-?Py*r=JL61`!glv++vaS1r;Rrsnss#AN;5t0j-^|aI~sG>~&a+oa~J>2U}^)by5XfBWE_RMRNWZjvO|#gX@GWd)MSC*+rUDU7{#+8p8)C zMgB>-dW87`g$Q#ckZNanyUCMHPof?!y0G1#tfBeo1>4(mDU^9BR*P_36w1w0CUA>! ztt3-z2$yZxrcmjeOwV>a_ZoLOms~{2MwpXWn#GIow$WVh71M#}isB*DMVbBBKI=|q zcE8(?4cm#@CEGvXKw9$DVRJWkzh`=W@9OzI%Qj}_Htx9|O|W`BniQrN@-qe(T?*#+ zBz~LA*8HAe_f!wMo!OHxa|pABXqm^`9z?OzMe;OcBHidfHFDOX)|}OIO|!>+i^aA< z?b<%qZue+{bRRnin!AO4D551Tw(mG@bdQ)yXRAGGzUZtl-@q=lk0YDbV$6}|I-5I- zoEno_b!j!mTuoEVEzD%YEwVv-m6=Vt;%y2hp69n2o_HHHXU}a;)nGHTp1s|7ZEu6- zp27pgrnWb3Ra z|Mr^BAVRTofO%Zqu(dF0K<#ob_3xNfGNrV+3e9CEVRvkqU=Jm;m$=XNbmR7K!v1Zr ze;e)Jlr00ZV!aI3B2X=Zl}!PZDG$GID*spGd}>?^@}pY;m=wyU|61(i|3nYXz)ojh z6FtsEmrYSO|NnTvtFo)w0h{(DPhs&bsO`JC?z;PFPm=it&{n?!-wwCtr<)F>sVRKw z+*WEX(wQdUt9Jeg@_!0wmhxQLVS6#TO1a3h!YtPz=H^euc8{L9inu+QwWssc=zekW z@i1iKa-~`A&9-8bXuI9It(hJ?6SvYGFYliqVr_aHO+gmz18K{H83P#(sk2^>`MG}kDsO_OahaO z&3q>vBUHN+xlJl%W-!?J65o8&pqC0)H&Q%*{llMS&94(V+l3X)uQkk{M)PN7^XFmC zQehqQYj3m4Cg#^T^NV`sD=cGzz0IHH&7T#_pH+k(5PI5`M ztGdc;w^6aB*k0f5?JkqWj>*-n4!OYIX9qECG;4UJ-9G$Qvvjyy*L;cKQZm14DV=z> zTgu~IHKlncyE37&w6H_dFw8&9ZAd48YHMyXgY3`h(rOu07&|i8&LDnN)0%s#t>lBb zic770W>Ss5>N30H;9TeQYRu6`*kp-el-VWw>+Ta^bhwUXz_YUJ#z zZ8v8yeQgFB8F_FUKYgOx0|PO&BR%U&78qrh!tC=br&-yA3x_+2~PYit<|$?@1dt9q;pj0r<=44`=q#2f zZg)+bc&<3?9cQQ2B(vq*WOh;Vc*2;C(Vy?Q_9>GwW7FrT>1uk$` z=}^zb@a)O<*oM~Ao;$}yuUv_L~m_nfZbAah4? z2|RIz9o6zIv^Co{Dd*VF?z$~9U!hjF<~HctyJyNH%*~^k^4UEX@?fS~^*U;{y&y@v zt!Qo+wjv#VguN5=Xg#Ve-d(N)>n+}cm%E}c7p~p2>wn21TnuX)c zm{D~N^IX}rWJ11HD(Bs9UvO3zaq0C;^}IW66VZJIZ_2hL&b!0AZ<1MPjX5W}lVh8X zg_a(9xvLaiOS`f-=LC0-?6Ms@x*hTFyW;zwTWE+-Q2I#owpRxdgttEa-%@)_+pSCOkt=XvhpvQ4LLi;j2Kl6j#u&0WtA z9ciz(VPi+Q@ciTLWjAcXNEbh0WHo-CZIXuB?t)Fl{d7wgoav%Gjof^9vmRFOw%T8A z^=GefiPu`&1*h7K4pZ%RO;>2HTcy_A&39ddVO{-L_p@5f=FYVxHO##duV(5*mt{{^ z_O!cf!3QJyv4yy_cI`_WmuPEWncUSM`9HM#p5w)|XoY*@FR@7*r%^%m^uQ(RU$ zN(Ilo_!gHJ*Ie03JMU22k+3b8w+)?hwCzX`&#Z?@orOwU^%!Sg@AlMnC%odOYD|H3 zOa`Am&6S$DZJ6-T9jVw=uzbHb_( z_dFM4&W}Bu)9$v{$#C;;HE9uLd!=op-QtA`x0>cX_Hc%KIu!@oOb#!04r;CSlxE*x z%WXKFk^;?5Cl4H^V?4ZG%bz{WMvSm`cXL16(w4=D2{xl6CRB^+Bzs0i~-G&R!c1d}j%Ul;_M7@Ha@3Q2r;O@d3Q7^!w&T#pw zKM9?DuiL1rIObhq&(8?^jYnto-e*hysIzRv_AVLC({=US%)89HbU2SC-fgeE(6)Zn zZL8F_yvadGrl>J zhcR<6FxHCjID5}BG1XGH2YHI!<)~rxDsrQ(M5DH0D4|*ohqzU?tF1Es7`IAS8$8PX zbgR!l)~#M|a7TISh0~(ZeLyP?I`=x9n`35d$Zt5 zx0a`gJ$$acJV)`Wo{t_oXN}s-Hix6!M;X;JnR~U%PuBy;RklahGo`-ZT9;pM1AfZEuH3pB@H46rrWJLC zbG(b`I`fy?Ge62R=s=g z)``=!X`{HCx+IPkr)}b-l`YzeO_2&WS#B~6mJ8sL7x#j90YKL2fD(k|UWk;qQxr`t z0Ek7awb-(@8G=YVlMD%d?%`1SPuZw5U^7 zEO$a=3T*siHGc2rkk7VKHEL#F)mn=H{w04whk5#+! z7A|&GyNhI2By>-mNiE(niG>pqi&;f^UEQ@`70X~|CiWH>E5u$cz`_gC zT|)8hmVS`XysuuC!#^PF>d7>Km{Y7l``t9(n3*4#3(uz&w?5R>=fX>=<^3ZVYFFme zr)fa@N4jzrE@ai5Qw(V8BhxT2(p~9PntE1+$^fwulmW)P@MoQ>YJdrGofpD98VybF zwxfSBwB2ajE-}o$A4ss#=&rN!ve-D~gj`mzdPT^cg2E31?KB!)QotUbn3oTevhPmuQggMp%${i4CO+1W z8y`VNQJL8lqY|={e$U$w{TPjBth4c=+ITFnxZ_u}-j9I`wuZX|r+2h^kKq<1th5xx z!$Dxb#A9joW^4wKA=O6HfP+b~>&JuxPUW$5EZlfeqkF6s24#J6S30BCt-$Qc4uth- zO?Fqt!PlP&pp1iG)+l$S=}mORa(Cge-DY{T)HO{mYs|o9>b}Ea`V7>_;MD-84L5?R z<)BK;V%YL7yy02u4|^tU9g>K1ij70x*{;%<#m<0Ki)gzNQjfnRKDny~TS!mP=dZn_ zJ-w?|6%dY%s4U`p#U63@P_#b!=sY2BPzl-3NePn|n$ zKr^%2swk24bJO8V;ueHkFD3zO&OY^LKhl1U@LV~bnT%uDkt?pVZ^j-HQr*MbVyb8< zz`HuSijMeLNs*l~I*(-)MYPnZh1)v#K>VR-!E8^Jmp?&et$M0_C;NNvwgHC8y7v=k zfT1^NzFV+s`BzX zTK(*8ryf>bE_%3q4~m4^6LD;h;|-M(qRs;rSKdTTMjE1nn3Yet^O7tcS?(R9pP7r3 z+fy2)iqpM6I;*jLG5p(C@j3J#$hRv$TgKPp5V{J4QEL8e(n6py8^iXtdJ(G?j)u-F zkr49Ct_C=autc%U2g(fEVR32RDwZZ@W5GI~jSNpj{QFBYu^Y@hJ1S*{+&-qcignd0kA|$H}Q>9lg8KfxG5lfL+bxRCm(n z?~Thkj(3IQc-_X;-Hd#2fi)Y{b{EzOCqwQT^|m`%CzJ|D`}cJqCp*Ww&D6X5d+|Yl zBvRNny_=^Wg_N~0fWknrI~XV=_Sk%}+lC23ZY)cs-93y`-Ywj?A{MqAZ@$Y<9V8Nm zbnGsU$cY!V2X-Uw=BIgPF9^@6MDCbfJ|n#CPHOxqYpA;myxXe0yTO12Nh?l)-;GEP?nxVO9xs+}OoNN&R1aPG_-O3?`rgtL^uS(Z`DU(YtW6SjW#Y^*9(pjemx% z$9y5=c4O^KF{)?>Dn>PJky91BtDP=zkRh5ZM1`?`QW(SJW$oiV1tVOrbiRjI4!h0q z)0f2R_tbB<5KUfkBLy><#*$jwTiBgn zbD7=W*vB2LgWI0uy*Ue6`AF<$ZwPu^f629S)?h!~-i$S@+bOpYNQ z(0vM=p`eLX;|#4Y>x_w_{SeqQ+Amv1rqz4v8XY~vO20`1+fp&Wm(F9{ek z?@Dmnhi5zWdO_&U5-*^1u}Pmger0o_t)n8hvWbOH%!W3SDNW#+k37FD{A~7Vw?I(W z0zV@X*23MPKG|QXys)yK%h`?ybYHO%pT6XQ;4zF4D(aG_-gL<%lC9e@yf2HhS+hrN zf1w>Y8J2I#p*s7)!2@JrR+K_W4LmHY=?Tqwe{b^ct(%1c0tPpXzup@CPm zWcw4leM<|yzgyL^w|IXPZ`Lll*Fx3WpQ~E-0q?h}MG5qvM~>^*xt4K7YqMX_T+Mh- zd?~>*J>#+tN#)$BXmlI`9(al;SFu?+ayR2dBLcqqbQQXf)PbfI9@zLQUZb$X>-^= z(hor_0NnXGk@$XmWam!T!FdUA%F9nJV&|sg()S};DeTP!=_dpzd`T#@+kAgloW4T{ z_7_BNpZNZ!Hzez=*^#h6YNAYpS+-X-@dJ#M4WLzP3I}@0|5<&*D*u5b-M6j7AK=Fw zVkK`ifnwX8<0A3{38fR(9AE@d+cfYXow)X^!YLssc9CTKJrQOE+Y&EaU%sFNGv@3q z@fm<3*l>12%N?@=Q&CN@I4Z8l$~^;tcRB>%0C!#BKn_beASw;4=54W>1I4M?cC^fa zQ6ojmtqp^kj-r*|31{Wa3q8mqjv97A(|B6U+Mh z&h?~4KC2qflk6dk-1PWlHe*M2Jed#mT@NG;b=`Mco)qz_VTUVzH_5TNQ;<4=x)Px)J))NvWlrw7&mcPQrkBx0BD| zJ%iF5)?OBNdJ5b*Y2016E3GFSB5HN!6SYnQoD8BfpZwW7LSs)K1PmAXGyp=h+?pf1 zdeXt8lqRoXpk^a_R^4yB!iEmx=G&FjA zO9z*O2O38ax1=#tN+ZERdgJW?DXu{IhE`7&)U@=e3n64Qgq7f0SU`d=l;Fl}=x_O~ zj#L0Lm@hQ}kV;+9AqhyMf*XCYu0?%7<2|GqTQ~~q$)Z;q094XkXkQ5RXRH_?bGQ+E zT3iY}5!MsqWEPimD8xYFYH=lpV(ATaaF$!`N$tLtmyIJ>d_9L^&D_EpIW$J*EWVjT zBS)XP5~r0oblYZ244~c|O=GagPcE<>B(LOe7HyGrsvYlsBSpbPKf!k)eIO0ds$v*9E-{H+?YuG&mlF!KEo< zusql}(wEx3@Jwu%Z$SiPpZi!cDcWrYs~jcTm}z@nmYEt`nv7lGLy{a%n1+^I%Ud4A zQgeAVqphISi1CKc)m2G$^e!E))Q;h$8kDA3El5MQia3&YC9o+Y4m4&t0=g?J zo5T61BqVla;|Pj)J!cPmSGLS=q4npyQ;}bd^m)!6uinbx`yYs7@J1x)p$M`Y4xk4U z$ag37!k9_rcQ&715Xb1HyPe_AjgUm6iCib)!DE@ z~LHu0s2Yw|i}TIKPAYeG_VJJmX1iM-!oT&XUeviaoc|6m5M%!B(1L0ZLO$ zWZ8-+JmX+yRE(SBtZg5Jq-C_EO;GAEoD%@04sE<*sfe~Si7ZFc7!q}jVhq|~;c(Pm zC`>-r0^!$3ak{ynlJQ_T^+PX`GgrfQA}0)vALDD+9f_Y!Zf!6n)5|mg0KEifs$MydDvbMI_O^rpsiw+kV}_ zeSJZHP$x6K-d-GX%af`HKqh?Kk_H&eX6YbV?!=N=?byXgR?b(DP)LWOc;(FUPk!WE z0{}3wCrO!UifcSR@8l&SP)!O0@Ts6ulta{Bh-afebwQ@}Swhn)$ zN_90Ev}>y>eNivFWsSaXC<#n2nu+TflF$fWB;n&~9_US9a_&pF^UwPNTOnCrba z4If7YJOD5HIO(gvKVl(X$yOQ5M~&gPOrm}-fO`#Zi0YjHiU3YyGGZ~xi-{Uco&Jwoi*{?|uBEs^xJpEu>avTv} z+JSEAY^YGc1hWA>YAQt{jBGMc10aovny1fb~kS@oexNG#OxQwM!b%~L~|_iGk?t$qwE^4ob^FAR+1@AyFJ zYvH?YVVWJE_y9E`jZOK=j^2EW#pbO~85V~(vtsO}@h%4(u(lTg zuvEJp7+cF6(+lfk1BG}!#7uN0G0}p1O*x#Yuazy$ymfZNz|knF<45Ia>BtCzc)9=$ z`0ye|PUu)t$wDFQoHR+Ye$W%d=6v{~Fanywl$f*+7~s*IYtRQ=zyh-nH*KjWCzHn6 z*R4Iz*y7ZeY0q=7yU(K)e0SGJWdFm3E6BEh{zsGcG+`HbfBqQ7_h=sXuB-%BN})j*pXWIXkH~-WAF8N7hce78yr>*N~>$T515( zIF^4H%GH{Uc(Px6OH8D{H0VZ4!B}v^@?gK8!4MrSzU}Jqh!SwYcRuR0XFI9w*cfDD0aZzN}Z(u`QQ&j-~J7pJmZ#5iRmp!KPpzjiE zOdWfj@GMsuL_`u>`(daCth*_`^JUDInT&L6XE2^;<}+Y;YzGgZn$-bRt3q~XYqxBm z>OT}$U~|qf5d9T=$vZ02bKZ)8A;Qeu{GYqW8Xn964gyp4wE%n(Fc?|Ilr%^@KNIaM zvwlhid8H!-*P8i}wiy7qgg$e|IH@&r3Ehv+plH;wY4z^cn-hgqh9^Yk-ExsJJYN?a zUO)!-AAe&>M{0PTOlmblu`^(Hg!k7YVQXpTt{4UN98rFn7ahGdxS6T@#ITO;rTNsV`&Efl?FjnuI{iy08;;(E54Y|$9Yud zAB0>0F!Mzc)zTXK=;mM%5CbQ-RFnHl+mbYJS{93k1CQy1( z>gs~m|Hx=Q$JwxyesfHOvJj@7$ug66dqPOVAT@py1J5EvQ3rkPhK~vvfQgSaACNfL zO;SAH1-FN@6b<%Fgk^ZjVZ5bQ9j0jt?Z0Y-kN2U3I_CYUfGB;e2c7^%XYoQ&eBu`m zfPm4^V?BVkQgD|Hgqu$7TYhD4AhDi{)|3Z8&CwzClh^E79KcKFyeB}k{Ny$Jq6Y>t zkm(p8!NT5ltja*#+dp~D8g^)l2pBk|xeOdiO>JJZBVqs_z>WPqN90TH@ zuYK(CAPDCE2Sk$i)&P>B;b%@4um?j8TZ>fep(6L8Si@XZ*WieRZXvsc0%O645!N!VA? zNH3?+eczO1^Im%!bkagXr`7OH>29qc| zn7VKP&>){7QsotUEe846qXD76%Ao+5wMB5SnyNUScCg9?655cm*VQffp{c?6ybBV* zFF7PrQTFZFGB=3#*ukSc*RvPAAmR_IkVhSaZbfohH`R2Pj^Y~x1j}rYZR`XEtPD0o zj-T`#Y^KFr{;`MGEQ~!JTQ3GP33Jg*VX#?wJe|$U)}#lU;kcuyjpMQl9}89^38wfc zdT-jy7mAmT_(^e=Y-w&H+-NSE?%3u>9BM`FnNvImf^#4T^Y3TV+~smZiQhxHu7*B_H`d- zhX?D5lF^8s(Wnp0DV%ud_icUUvyx>Oz(8|J}Nc{m+B^A@oy5A%C# zfsW^W-1AY?a6T3CjMebUjwl^1*lSvOG#yCZG_b|$abFSG;=9@ym7Zt|;GU~6=rQor z8$K2)J$@KVV}#WxjA!wA5f*giL2P>0&0+{w{2ELp3bfZ8mR;#VlvAjvcqg~YDG42z zTy*`;`(ibAZM}COlJ>ksdIAY^xAkIQPpu|cC7z-4K0{e&Bw};n9ht!hDKXJxLqThV{Fed}`PZVanO?;`Q6pZs^ zJ{6iAod}v*C249%Wty7QC6lPFlK>RLy?q$~Wt!S?uYh1lQ}azS7fepI&I?gfLq^>2 zE4C;QLV~8;j&!3-?C+e5eYj($8onAH{xL2viw7GTQ6|ei|+? zYO86LCdh73n5$4j7gb_uuq9#=8$p;`@U4dma$9l3pR+NbGKAPS6a6iVw3Vb; z(t4w&$SEvzROBzAiQ5eaHpG_WRy^p%zx5UAKTVHQ{X8XfcTS(`=^B<O-+5U#TZ2S;Te!t* zp?JtrozV26t=|ZVCsQ%4AQDe!O`(`9*Cu|n%@_SJ1|Xm*a#*JD1w$`5wwlGJxaY{no%Tst{N_eBcXNI^G|$I=05|q99E14WAnv%x85y{`14)J>SKpkp8Zpd= zF@z4Q=6Z2Q6rog@ALE%w8epnL1l6j!Dqx9RVF8$PK@3FdPTbwmV(l_R@-z_=a0ba!i|@i+Grd4OhR3-D}cZSbr_WoOaLNd-*!BM5mn zZ3nDX^P8S+lVLSnD+HJCP~G=7M%*b9UWqEBSWPiX zMvl8|c7(@@kgI_>G@h>)(KslOqpPYxztzYc8Rsd!j_L4lsixpKt>UtY3*UwdO>cZ` zN+|ZO9h10@7Nv3u6D9$hjq!opq}9yNi{SBfT&ZRn2GS87Owyca6!Ymfm(VUGZ9^(4 z?hefRN^liCjLg+VbvC)EU65LbQh3ghn8nv0th-goNQ7&OgHB-VT4{JcLW}l@kTc^V zM-;R}87#AUrC~j`5Q$f^t8#647D}c934rmVZ-G{==v9Z(`CpCaa>tCanx4Pv{Me%_ z^ZK0zOb<5K_m<61Rmr02)n)@@auJwR@njm9dch;lj=u@VfmOwpTpHLQ+gAuoSQ=_O z`hEMR1~8(`s)VE#6h*bi^BsQlm=g{!9Ks6^Djo5Oi#>6B>BHCk|sen*k(?A=vd@%dZFP{!fPsg56 zg>SXi5hVr!p}J7j&jNkIs|ZcKB88^h0g{n&8>;UTs2f(Xam4Yr!V7<-INP=#7{)i0 zv7W-k>N9aE0NWAJnpY2x%y`K9!QQpaPz-@MQoK9_g`2upz8-^eTG_UZjOZ0y*}YB` zy~c|U%*Gr;bwBhHdgYI-SN}xoLQ<0sQf{a^=1w(O& z9K@cqBoP=?GKSQpx`MGJd%p3pCR&BqLIvrcnIzJ?H^&si!6xob*;aKeOhi5eTpsPARvx@rjTl7Ys*Kv%EoKS$9liEj%)#X)Re`t0AT} z^j8S-i?$xs7*z>op(ZTE)c7($SpP+<$+ZC~2Ie`qRK`Rt+W-Ibl6H*UK-w`r%WH*C z&&kl{Rlgikd9ced_Hv7^|HbxBbgs~)#~Y3 z5=r=AuE~w91INkGe%nzVwG`pI7D%FCx{xj8h!e_l8^)4vlp`N@jUGr->hFDzBs%75 zMbO@yEp#>B;xn(&5yx8BT#Lu0#?ORRe5Ndb2p_93(D20d&Bh(b*TnFg`(k$`za@d>x=-Wu#n>QUe zH4>kEz3EU={KgUyl_Nvh1)~dgqKypcj*>RTgvK%gNsfmmzEImY_^Na-ZUw*cz@5QgQAk{RCA8S`6)d+1 z<3c?BmMj#qPBJ(wn;8*?qa`*uTn*!CHHIM-YrspkNU>zGs!Mjv5ZD|G{fxw|vUJuX z#uK>^hq01@2RIaBq>#y9^<4QVq=&$iyG@siRvfN2!aH{w&x#qx2ttR#z%8t@6UnOF zVir{?H!&5>+PuBP-@2DWaYCpHqO2SLK&Av1>Q>KJ-t(N8kr}`JzKMzpIpj6`RbXl& zAleU0xI>#7Jx=NwLVq0{#u3?=?gEMM=lqZfEcA$ojR)%H+^I0I8e&?Lc0G4GL18Kb zzY1-o9`M<8ESozn2HOsMs}A!T_LkS}v<1qM#I| zuMjiA6;YDw&1PXyZmK}N@ScNXn4Dls7OhWxF_z9dkBt%bZbLQhe^TSwn zy^;Z}J9r5IInLEaPe0>{)W+gFTAX_Fp%XoDpeO0Vk{BV8=`A`oj38`RQW2As3dNv5 z6o%``O|F#3mz|Rf4lpGo?j5EhADQ+bMP~)39H_+c%~N@h0l32KLj2|%frI5xPQIBVi&pED%|Py+?_tl&9!>f;!^Rt`;qWB0&+P|PDvRHy7b=y4q0z$4pGpQO z6=&+HDw!OUKmq;s2^b1T%uM^k3(D3XP;G4txv8Z)J^FJ+X71AGRR7c_JHL9!dl7ZU zYNbmMLY75;Co!6U|A~`gbM;C*j!(Sp1<9Pl_1m4pt2RB>tCHVEYF8XbSkJwW~-QtXt?Sd!YpTNrslY?2PWE zCeLZQfxY5evW@g&-io!}M&StXgKYqaFL8vyoJO3;nkM$;O9l9yzC*Zf#!PWD9ttbg z{~CQoc!3>~fF!d?$L>CW3dX-=Nu|-3FJZ$1lvtqmd~xluV{ycxA{sQb_jraaI~swR zI2(o2=?kLNh8+!DM0y0G@q%ek0a>7uG+waVYxW-U%by}dCQO*-oPN7R9n6PWl^8K? zy$BYxp#Exr_!Xt;7XzM3<4G<)<5%4pr#*iPk5NO6@ zR9qn)HHEd4Cb-*-otob3LQZ4os5Sup4IK7qBg@Z)v*b-%rW%BRcr`$#!Er?Qr75l0U5U(iWUTnDAwqV1TVQPz9QdLy@Ha+!^g$^KOit@kf!0l2S6DhCcERLk`!okC0w5G44JCM9 zy2P2RgdSFK2^qj$(Z+7kDDCFJx=(Id(SzYRRzkC}5^dG7l8x0o?qzKcl|+n3AUwDV z?lGfEN(T)HoE#~&Z%SY-xC_Gm(Se{kqy}tRr@fv|BSPeAlKjrmJj~J~6J|{jKs>475Ow79N*AfUyq-!%DK>1GkAa-K>2`OP2wLZybA+jo57R66Rk!kgmn`zUl zegX+SVyDKjT9qQKz>FiH1OttTV&x2Rt9<9kVQfM=a=P?=KGQ*76f={a@A3Bq{XYHD zSad$1qJD_flE2}iFP%49@tw(Qj%bI2<^C|Xk^94;@`JF(BM-!!2SSdm9H{eP%y}>{ zSne*bWuUiKdj508F}bLft@wqoLL>dcn6Z<5Qmd0OJEM{-vk^EXQ=_}HDHDxnFKaE> zo(y1ScV6{vJ^*tfv&IBqL1dBcMiP;&`rSvAGLe~{yu-Z$c0XCKLow}kte)wKKQnp? zKjT5OYO@4u74&2&lCXlF>@gB7B752wY8!TaXjqxcgC~8I8oFH`;Se07gTza_W><9M z7~BVDJxql)opaY<9E0S9I&girxykP#aPj;eD09|r$HNttLXouE+{}ctTV^CWH&nl% zjX7_oW~l-N&g6x72R|*^jN%7AsZ}pMWDF|}!zOqF2XMpYYCz+ip__h}LlC`iOibw) zXdRr%ngm#^iqV^?Qz66CbD#Xd4q*Sd0b(`D1$rn0QVb1;l0Q3T- zw~RF{z%swk*#);&9KfqDXuF}9ZN~1R5jFaWcXjUIjuD0(P*cZQ9XdW|OJsDH`qq5> zXJWq21x!s z%aYF!K(mA8svS=N77Jxw0}xjw%>Jam-PEj)l#bzAQ6%Eij%98p8|5uCO8|mod+U;^ z0&;VJtlK@=3<0I0r?E2Sa+(QX*2Y!K{-pj}`w!4U!8fV29!?tPf;HaOqiO$J4{8;z zPA5Z6F%r`GEnjeJW#8AZiyDwp`o6}8BBmBKFU?0O@6KCKi$q(TA19-?yqvXe!fXXE zsB;UG!Gh0`R`(-DKCD{g3)+Wv&$SBorIVpEv<69CEhC9K+7ah`ou%ctcyAmVSX<$( zAo2vKQyl!9-+Tg858|lSd9xk}F$_%Rc-DP65#fnc<5`GaEpF0u+icy&zE;;&yhUSB z+mXk53&O5^)?`;aNz=zIxD#;t7!gEW-wlVWC@xXw zEw7s6qt%oZ+E#Eal0CJAcFh#2AVatOSP-kMIT)=K9g9o^5?HjWs1@H1VsoR#ep&U0 zxkh1Q4;5B@GnEh=BJ4Ad(O5M3jKcg)HzGy8QGSOpAeP9&?{J?l!)L-vf>#$GdwfQ#2Aqg=4$#MOX9&;kTAwjgu@+! zHJ-PqUHr7a9yF#I6G`JqK_B;c4U9VZc)xaT=>0vlG9H&=+`*@u&A6F1r+>p=-xv?< zYrF_a8n@7|9uyTWHq-H$G_FWgwN>1}h6UK4`W@H&I3J{B`E}YyyJ{6-O5y1Z+n6SA12F_7URUHO^&U8(| z5feuvpJgHttu5Whf?1e_*L|!X%k+f}zwV?r+f?KuA@`W1H{$CUE*8?l!OR=BRUVVH zA1El)kMr6HMT&QJr~M*fdIK&@))#q?<&!nOk7=?ZqzOOAc5Ey@s4`(kkke__| zahW``Jb^zNz0aKU4fO%|A2zGs{11{^{_~9R9e8XUoqLa3TRt zmQSYibLHol`8@xe;-Ay}bB2G;^3OT`InO^A_~#=3yud$~_~%9ZaVM9{mkIbj|6C!I z*nXsjH#bL0WqPe8hkqU0u%{0`?nap_pvXvlktfR_t|U$HYlY2yJ%eT9SjWnaYCnH- z3#h~ne(`}2?hp0&b=!3QLu3~_w_&8wx#haNR;t0sx4do z@E5lH!L}`bymiYTZ`<;{ty{jgZOiFxTaMhbW$%3`vc-Q`br1hE+0bGA9WC-3zXRx( zo5Let9x0Ff8q~fftggTI!0#P8_M5{5>Hh~uO9-*9e|e}mT=`0+-1}wRI6%Q_v+?VA zLzhbbSK&u*@)h6T9mnb3AeR2_7HvPi574B5_6WSgJMot86FmqOs1Ei4r2lbPU*o)Z zD3|cfqpe%|@ps#nJ$vud3VaRlJw4?{ssG+FJQ8v*&e?lmJK}ey@5N&?rF+Ybdt1CM zQo6TUyB9)79k&aZhjQiWNUM2oKf1n8IQTng>)^p^&v5DB!6pZO@E~sO;7g_WN#q|q z*k9{Ac(A~aQvdfz+Qa?vJ)(xoc+b{*wl*me9NZ(Lb!o?VUulG|t=)+gj@VcMK9JsW zACbF<$l61+{`C))13Mm9@t&>siAve&(EZvpLl5|$2mQ}O{^u+H=Qr=W7bVND;cxkW z{crsFM@*fW^6DKQgt4Db)pKhm?N)L+1Vx|NJul z{1g89690UGe}0~S{wLe}(y!uA59|IGVS7_6|Bb0}{JHNpwqQee{RdjO(1Z2g1JD-s zy=4z4+vK#Ngo0F?T(eyWGi#EDcI^I!Hqj2%Cn>>B--pKnDF(txgs+D{;uOg@@ccCD z@9<+elfuxLnDvv%(8wlWqkuSrt)Al%OejfH}Ps@ z^Oumqu2a)@mh+T=mV!ez*>02D^!I?Edh;>dmP@l?d3?L5Tt0}Kxrj9E0SZatg6&M8 zq8Ln*w-?jb3{{hxEwqM}0NZX-i*#E7z}4+950+tP;JOW!#=Cz#;yeoTs;9;u&`7kj zv_j--$PPwp<^D7yj-ii?CqX!$dN+t$t+!Ug1N1qPxn?{K@On<;30`g)Yux|9R~~3$ zPi`3>uIva|O|gdf;}_UEKYZU;;!%>}on+pu9WGV(;ZSQdIk0BW;JyOFcEB_T%6NcX zo$SZ@1U4zXY0=)H~#l| zj5PlD`R#viYxr;57yj0kt?|EmvNEx3{_p3v|AVYW=CIW-Z2dX>_XYjOe}5_b{-Pki zg5SuyC-(7I`}dyh{}?_0P2=}&e|Ir(7Xx=Oa2Er2F>n_HcQJ4m19vfS7Xx=Oa2Er2 oF>n_HcQNq)GX}b?dwvH$=8 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/__init__.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/__init__.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2713a78b067ce5ab38163657970ac67885c4ab8e GIT binary patch literal 155 zcmZSn%*%DVb8CDu0~9aQ(bd5Z-s?2ghLSP(UmYSE6U!ZMb5Urkx9XqRqpom45IP?K&ePCm01)L(pLO|k@l_rP?i`BS2(-XHdUprmn zU9XZ;xbTDcHT(=t+<4Va$cf`(&6K;UtLx*{>xut*eDLS*f20}R{bKxovxvwqvB>c# zDv2sZb467|^N6aL<}s-}qCBQ@kE#L92hicWN9B;JeVXq>AJA_^^AY7kvIAO=sZf;f zi}9A|m-(3T5uH!RNaG~;R5J625N7F{vS*vRs%<*v5p22JIPaR8525t6%bMJ#rDNNf z(mMs?R0QuqERDB2?Gdz>U2Z#@pSp}QagkS2eJ4$7EUrV76Er$$KO(esZ-{A9L?}^W z_J2bpmiw;O22a~|P1`xcR$tkzE}AZwnLD>c>A~PpysIw{4m5r*?zg;NnT^#(*QT<* zHJR1CGORO%U0Q7&uWY9mi?gP-i-nfJ+9Pazd8{vNhy~ZDIM7tB>EtxtHw_MFruRYL zK7~DZMS;$1*1T=4|6KbZ~|($7rU zuFTT1%S(3nnMzoZLU zhBGHM2&?F4_4FUXv;>G&se8ITn36eZsfQWJHk#_EYWQXi(Y5rMxUVX_ZT}sf%-%uoK4Xq5d8LcvE zEv+n>CL_O~jiJWUPof>s=hYE43tHw!QW~&dj@|gVOw~H|aboX6JM<&-Q^_^qCZy1J z{6ZE}7wW$8E(Z2v6%!vz@?(gyIjh-hJ>nizI!*_MTxzGi64yGkYlBvOif#m_2g_>w< zXlKOZJ@Nq&uI&-=qQqv81S>+$;ri}j!GM9gR#;r;0alFOW&iU&k@sIcSIjdqsufw? z?yA;5H2X7AaBdcL4$B!|n{~bjC_Bfe`f=MgQy#oO|=RW`d literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py new file mode 100644 index 0000000..aefb5c8 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py @@ -0,0 +1,73 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + + +class Filter(base.Filter): + """Injects ```` tag into head of document""" + def __init__(self, source, encoding): + """Creates a Filter + + :arg source: the source token stream + + :arg encoding: the encoding to set + + """ + base.Filter.__init__(self, source) + self.encoding = encoding + + def __iter__(self): + state = "pre_head" + meta_found = (self.encoding is None) + pending = [] + + for token in base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag": + if token["name"].lower() == "head": + state = "in_head" + + elif type == "EmptyTag": + if token["name"].lower() == "meta": + # replace charset with actual encoding + has_http_equiv_content_type = False + for (namespace, name), value in token["data"].items(): + if namespace is not None: + continue + elif name.lower() == 'charset': + token["data"][(namespace, name)] = self.encoding + meta_found = True + break + elif name == 'http-equiv' and value.lower() == 'content-type': + has_http_equiv_content_type = True + else: + if has_http_equiv_content_type and (None, "content") in token["data"]: + token["data"][(None, "content")] = 'text/html; charset=%s' % self.encoding + meta_found = True + + elif token["name"].lower() == "head" and not meta_found: + # insert meta into empty head + yield {"type": "StartTag", "name": "head", + "data": token["data"]} + yield {"type": "EmptyTag", "name": "meta", + "data": {(None, "charset"): self.encoding}} + yield {"type": "EndTag", "name": "head"} + meta_found = True + continue + + elif type == "EndTag": + if token["name"].lower() == "head" and pending: + # insert meta into head (if necessary) and flush pending queue + yield pending.pop(0) + if not meta_found: + yield {"type": "EmptyTag", "name": "meta", + "data": {(None, "charset"): self.encoding}} + while pending: + yield pending.pop(0) + meta_found = True + state = "post_head" + + if state == "in_head": + pending.append(token) + else: + yield token diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55470b73c7ad9d3470337bb356dc38b155448e4a GIT binary patch literal 2440 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py new file mode 100644 index 0000000..4a86501 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py @@ -0,0 +1,207 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + + +class Filter(base.Filter): + """Removes optional tags from the token stream""" + def slider(self): + previous1 = previous2 = None + for token in self.source: + if previous1 is not None: + yield previous2, previous1, token + previous2 = previous1 + previous1 = token + if previous1 is not None: + yield previous2, previous1, None + + def __iter__(self): + for previous, token, next in self.slider(): + type = token["type"] + if type == "StartTag": + if (token["data"] or + not self.is_optional_start(token["name"], previous, next)): + yield token + elif type == "EndTag": + if not self.is_optional_end(token["name"], next): + yield token + else: + yield token + + def is_optional_start(self, tagname, previous, next): + type = next and next["type"] or None + if tagname in 'html': + # An html element's start tag may be omitted if the first thing + # inside the html element is not a space character or a comment. + return type not in ("Comment", "SpaceCharacters") + elif tagname == 'head': + # A head element's start tag may be omitted if the first thing + # inside the head element is an element. + # XXX: we also omit the start tag if the head element is empty + if type in ("StartTag", "EmptyTag"): + return True + elif type == "EndTag": + return next["name"] == "head" + elif tagname == 'body': + # A body element's start tag may be omitted if the first thing + # inside the body element is not a space character or a comment, + # except if the first thing inside the body element is a script + # or style element and the node immediately preceding the body + # element is a head element whose end tag has been omitted. + if type in ("Comment", "SpaceCharacters"): + return False + elif type == "StartTag": + # XXX: we do not look at the preceding event, so we never omit + # the body element's start tag if it's followed by a script or + # a style element. + return next["name"] not in ('script', 'style') + else: + return True + elif tagname == 'colgroup': + # A colgroup element's start tag may be omitted if the first thing + # inside the colgroup element is a col element, and if the element + # is not immediately preceded by another colgroup element whose + # end tag has been omitted. + if type in ("StartTag", "EmptyTag"): + # XXX: we do not look at the preceding event, so instead we never + # omit the colgroup element's end tag when it is immediately + # followed by another colgroup element. See is_optional_end. + return next["name"] == "col" + else: + return False + elif tagname == 'tbody': + # A tbody element's start tag may be omitted if the first thing + # inside the tbody element is a tr element, and if the element is + # not immediately preceded by a tbody, thead, or tfoot element + # whose end tag has been omitted. + if type == "StartTag": + # omit the thead and tfoot elements' end tag when they are + # immediately followed by a tbody element. See is_optional_end. + if previous and previous['type'] == 'EndTag' and \ + previous['name'] in ('tbody', 'thead', 'tfoot'): + return False + return next["name"] == 'tr' + else: + return False + return False + + def is_optional_end(self, tagname, next): + type = next and next["type"] or None + if tagname in ('html', 'head', 'body'): + # An html element's end tag may be omitted if the html element + # is not immediately followed by a space character or a comment. + return type not in ("Comment", "SpaceCharacters") + elif tagname in ('li', 'optgroup', 'tr'): + # A li element's end tag may be omitted if the li element is + # immediately followed by another li element or if there is + # no more content in the parent element. + # An optgroup element's end tag may be omitted if the optgroup + # element is immediately followed by another optgroup element, + # or if there is no more content in the parent element. + # A tr element's end tag may be omitted if the tr element is + # immediately followed by another tr element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] == tagname + else: + return type == "EndTag" or type is None + elif tagname in ('dt', 'dd'): + # A dt element's end tag may be omitted if the dt element is + # immediately followed by another dt element or a dd element. + # A dd element's end tag may be omitted if the dd element is + # immediately followed by another dd element or a dt element, + # or if there is no more content in the parent element. + if type == "StartTag": + return next["name"] in ('dt', 'dd') + elif tagname == 'dd': + return type == "EndTag" or type is None + else: + return False + elif tagname == 'p': + # A p element's end tag may be omitted if the p element is + # immediately followed by an address, article, aside, + # blockquote, datagrid, dialog, dir, div, dl, fieldset, + # footer, form, h1, h2, h3, h4, h5, h6, header, hr, menu, + # nav, ol, p, pre, section, table, or ul, element, or if + # there is no more content in the parent element. + if type in ("StartTag", "EmptyTag"): + return next["name"] in ('address', 'article', 'aside', + 'blockquote', 'datagrid', 'dialog', + 'dir', 'div', 'dl', 'fieldset', 'footer', + 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', + 'header', 'hr', 'menu', 'nav', 'ol', + 'p', 'pre', 'section', 'table', 'ul') + else: + return type == "EndTag" or type is None + elif tagname == 'option': + # An option element's end tag may be omitted if the option + # element is immediately followed by another option element, + # or if it is immediately followed by an optgroup + # element, or if there is no more content in the parent + # element. + if type == "StartTag": + return next["name"] in ('option', 'optgroup') + else: + return type == "EndTag" or type is None + elif tagname in ('rt', 'rp'): + # An rt element's end tag may be omitted if the rt element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + # An rp element's end tag may be omitted if the rp element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('rt', 'rp') + else: + return type == "EndTag" or type is None + elif tagname == 'colgroup': + # A colgroup element's end tag may be omitted if the colgroup + # element is not immediately followed by a space character or + # a comment. + if type in ("Comment", "SpaceCharacters"): + return False + elif type == "StartTag": + # XXX: we also look for an immediately following colgroup + # element. See is_optional_start. + return next["name"] != 'colgroup' + else: + return True + elif tagname in ('thead', 'tbody'): + # A thead element's end tag may be omitted if the thead element + # is immediately followed by a tbody or tfoot element. + # A tbody element's end tag may be omitted if the tbody element + # is immediately followed by a tbody or tfoot element, or if + # there is no more content in the parent element. + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] in ['tbody', 'tfoot'] + elif tagname == 'tbody': + return type == "EndTag" or type is None + else: + return False + elif tagname == 'tfoot': + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] == 'tbody' + else: + return type == "EndTag" or type is None + elif tagname in ('td', 'th'): + # A td element's end tag may be omitted if the td element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + # A th element's end tag may be omitted if the th element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('td', 'th') + else: + return type == "EndTag" or type is None + return False diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9214e2b55989524bd4e7cc231b82b8695c27ff7 GIT binary patch literal 4442 zcmds4&2QX96o0mNH_2v`CT$4>6*VWcKugrnZ%SL5wrVdqc&ip7igDK7tQ&j1vB#l7 z2~yR9;DUt8tvBvm__%Q61Q)~|F8mLO1A+tZ{btwegoYHUz0lO-@yvT~-skVlTEC4| zfBE-SRqdvsa0y&~C2dF(fxJzjqX3BShs2e9r4fC28tOaQhchm%b zWSyWHd%hC}%1_)d4Gdna%b-d;EV-$#Dm=LygiMfIAOsi0f;pb}B#N^gtT>y(TCwh| zx=c!9fK1Bdl`yH0-KdwDEqjRv+mGTkKb?uYidAyM8RaggGp!_!W>njsQSpl3nMqaR zyHQgPE%lzJ9Ny*+kJmO0+BE6*Y1$yVWzfZ&v$Sc^26S2(q2vT@nDV({QOlz1Mu+5! zS$KhYSNGG60kPL3X2E@8o;KiO3I~=@p*Ms;E2L4Z4SePO986JUn;x)_cbzS;FJ2`5iA#X4@(XkA=a~ zYzr|-XZyYr*S*|bN4(N7@cd+$#ikNwGOEUeQ8Olu3eRc=d?|{^17AMi$?ebJL1fj% zn;+6!a1Z-QyouOOZA}-J=Y6WiKex$?^;w#?hDOzWA#3*j)Aod z)=$8|5$G{kbe99Vl^A?ubOY{}BwWbg<@K(giDeDtChD5Ij8)H7E+!o}@-v~n)bV%| zwP26(x0>W3NS(gB9QHDogp^5fm7R?Aw56O-F#SNc_8Be0$4SkHAXp*Q^u&-6qO{9@}8H%c#%tmb32)kkxO#AyH5&5g2zR{ z!K+Ym2+`O_D?`+fRUH=}tNTH5g_Oa29PVMn?0G|^jnK5FZFIhaxGFY32jf#}Iq|scHAGbB28j27nAKpFwB&;ZCr~meqnO!K zRDa8P&p_m)0eyPP?;VKcaI*CJH2bZPTjEA3vP?2yK8_;4qcTa8M%Qin^KCbAn;exC z>DKmLZ)-M6+%833wJxbSNW?*Miu|S6TgPVFOoFb;Bz&n_4|QfY<8V2Nvu-9p&L7xT z;1NPbMm`j?RvfDgpp*cccGFoCiHdpk6!rZNGQ_g&%I_v!%=vd)bh*MbanrRV^8uKb zxi|TRx@l&Y8E4Dsb-XbtF;PdrEzn} zsFiE|w>8DMTQX#|Db|Zo&+&sY{eS}}`O9Uh^S4)~x_2Ez?sA!O-X71(^aNH{u&OK1 z2KOjXR|-bxYm(#LWl#~V408!hnNsB^!TxQ5{nI|XcS`nv1*p8_D^O`sUlv56e7`qD zoUX_}uz4Dyf6c|cs>S8n{9X{z`3UTXP|zoVE7}+ow8zGHXST5)1y#?Ot6+Z(C%#)? ze;Y_3>}R*Jr$zQE*k^J2*Vs4*QTGiX9;>Xi`63s`v{ny`egqbs2ZLpbw>9z4Iq~cI zZ1&F)9Pt;9(2o4Gpa&fJKE%y|@Ipb{3#KH6m;xb%u$~1~&lBgsegWFtDX_P5_Ia&M z9*4~$JA(;>as48vL@UK5a!w5xA{Y1IIiKXP%eI zb*~Gi98KkL*YgrTO#yV=zk?=Yrr?E}@{K2x7QGb4&6U+GRvJv@X0V(D9^lps+%R4S zu6jYzd#~w}Lmbu${LtfDFUSR6{RGh6ijxR*?IZd%r(dt=*HQgCreDXwEuLd;F~6;a za4X4hXvfuuGPVmW@D&3FrG8WH!5SmoB{of%vk>C+#RV&g_EMt#ledd)&0)|m25rIv zziI<$bqAAH_m4n7S|^jXJD}E$-$J_|EpUpI0v&#o<5z^^ z2;4c25{Pn~DE6{YJ|!TIkMX(^(TfcRgZg|=v3j~h9lLH vv5`{?T5GLnD^pp*irP#`_ for +information about its deprecation; `Bleach `_ +is recommended as a replacement. Please let us know in the aforementioned issue +if Bleach is unsuitable for your needs. + +""" +from __future__ import absolute_import, division, unicode_literals + +import re +import warnings +from xml.sax.saxutils import escape, unescape + +from pip._vendor.six.moves import urllib_parse as urlparse + +from . import base +from ..constants import namespaces, prefixes + +__all__ = ["Filter"] + + +_deprecation_msg = ( + "html5lib's sanitizer is deprecated; see " + + "https://github.com/html5lib/html5lib-python/issues/443 and please let " + + "us know if Bleach is unsuitable for your needs" +) + +warnings.warn(_deprecation_msg, DeprecationWarning) + +allowed_elements = frozenset(( + (namespaces['html'], 'a'), + (namespaces['html'], 'abbr'), + (namespaces['html'], 'acronym'), + (namespaces['html'], 'address'), + (namespaces['html'], 'area'), + (namespaces['html'], 'article'), + (namespaces['html'], 'aside'), + (namespaces['html'], 'audio'), + (namespaces['html'], 'b'), + (namespaces['html'], 'big'), + (namespaces['html'], 'blockquote'), + (namespaces['html'], 'br'), + (namespaces['html'], 'button'), + (namespaces['html'], 'canvas'), + (namespaces['html'], 'caption'), + (namespaces['html'], 'center'), + (namespaces['html'], 'cite'), + (namespaces['html'], 'code'), + (namespaces['html'], 'col'), + (namespaces['html'], 'colgroup'), + (namespaces['html'], 'command'), + (namespaces['html'], 'datagrid'), + (namespaces['html'], 'datalist'), + (namespaces['html'], 'dd'), + (namespaces['html'], 'del'), + (namespaces['html'], 'details'), + (namespaces['html'], 'dfn'), + (namespaces['html'], 'dialog'), + (namespaces['html'], 'dir'), + (namespaces['html'], 'div'), + (namespaces['html'], 'dl'), + (namespaces['html'], 'dt'), + (namespaces['html'], 'em'), + (namespaces['html'], 'event-source'), + (namespaces['html'], 'fieldset'), + (namespaces['html'], 'figcaption'), + (namespaces['html'], 'figure'), + (namespaces['html'], 'footer'), + (namespaces['html'], 'font'), + (namespaces['html'], 'form'), + (namespaces['html'], 'header'), + (namespaces['html'], 'h1'), + (namespaces['html'], 'h2'), + (namespaces['html'], 'h3'), + (namespaces['html'], 'h4'), + (namespaces['html'], 'h5'), + (namespaces['html'], 'h6'), + (namespaces['html'], 'hr'), + (namespaces['html'], 'i'), + (namespaces['html'], 'img'), + (namespaces['html'], 'input'), + (namespaces['html'], 'ins'), + (namespaces['html'], 'keygen'), + (namespaces['html'], 'kbd'), + (namespaces['html'], 'label'), + (namespaces['html'], 'legend'), + (namespaces['html'], 'li'), + (namespaces['html'], 'm'), + (namespaces['html'], 'map'), + (namespaces['html'], 'menu'), + (namespaces['html'], 'meter'), + (namespaces['html'], 'multicol'), + (namespaces['html'], 'nav'), + (namespaces['html'], 'nextid'), + (namespaces['html'], 'ol'), + (namespaces['html'], 'output'), + (namespaces['html'], 'optgroup'), + (namespaces['html'], 'option'), + (namespaces['html'], 'p'), + (namespaces['html'], 'pre'), + (namespaces['html'], 'progress'), + (namespaces['html'], 'q'), + (namespaces['html'], 's'), + (namespaces['html'], 'samp'), + (namespaces['html'], 'section'), + (namespaces['html'], 'select'), + (namespaces['html'], 'small'), + (namespaces['html'], 'sound'), + (namespaces['html'], 'source'), + (namespaces['html'], 'spacer'), + (namespaces['html'], 'span'), + (namespaces['html'], 'strike'), + (namespaces['html'], 'strong'), + (namespaces['html'], 'sub'), + (namespaces['html'], 'sup'), + (namespaces['html'], 'table'), + (namespaces['html'], 'tbody'), + (namespaces['html'], 'td'), + (namespaces['html'], 'textarea'), + (namespaces['html'], 'time'), + (namespaces['html'], 'tfoot'), + (namespaces['html'], 'th'), + (namespaces['html'], 'thead'), + (namespaces['html'], 'tr'), + (namespaces['html'], 'tt'), + (namespaces['html'], 'u'), + (namespaces['html'], 'ul'), + (namespaces['html'], 'var'), + (namespaces['html'], 'video'), + (namespaces['mathml'], 'maction'), + (namespaces['mathml'], 'math'), + (namespaces['mathml'], 'merror'), + (namespaces['mathml'], 'mfrac'), + (namespaces['mathml'], 'mi'), + (namespaces['mathml'], 'mmultiscripts'), + (namespaces['mathml'], 'mn'), + (namespaces['mathml'], 'mo'), + (namespaces['mathml'], 'mover'), + (namespaces['mathml'], 'mpadded'), + (namespaces['mathml'], 'mphantom'), + (namespaces['mathml'], 'mprescripts'), + (namespaces['mathml'], 'mroot'), + (namespaces['mathml'], 'mrow'), + (namespaces['mathml'], 'mspace'), + (namespaces['mathml'], 'msqrt'), + (namespaces['mathml'], 'mstyle'), + (namespaces['mathml'], 'msub'), + (namespaces['mathml'], 'msubsup'), + (namespaces['mathml'], 'msup'), + (namespaces['mathml'], 'mtable'), + (namespaces['mathml'], 'mtd'), + (namespaces['mathml'], 'mtext'), + (namespaces['mathml'], 'mtr'), + (namespaces['mathml'], 'munder'), + (namespaces['mathml'], 'munderover'), + (namespaces['mathml'], 'none'), + (namespaces['svg'], 'a'), + (namespaces['svg'], 'animate'), + (namespaces['svg'], 'animateColor'), + (namespaces['svg'], 'animateMotion'), + (namespaces['svg'], 'animateTransform'), + (namespaces['svg'], 'clipPath'), + (namespaces['svg'], 'circle'), + (namespaces['svg'], 'defs'), + (namespaces['svg'], 'desc'), + (namespaces['svg'], 'ellipse'), + (namespaces['svg'], 'font-face'), + (namespaces['svg'], 'font-face-name'), + (namespaces['svg'], 'font-face-src'), + (namespaces['svg'], 'g'), + (namespaces['svg'], 'glyph'), + (namespaces['svg'], 'hkern'), + (namespaces['svg'], 'linearGradient'), + (namespaces['svg'], 'line'), + (namespaces['svg'], 'marker'), + (namespaces['svg'], 'metadata'), + (namespaces['svg'], 'missing-glyph'), + (namespaces['svg'], 'mpath'), + (namespaces['svg'], 'path'), + (namespaces['svg'], 'polygon'), + (namespaces['svg'], 'polyline'), + (namespaces['svg'], 'radialGradient'), + (namespaces['svg'], 'rect'), + (namespaces['svg'], 'set'), + (namespaces['svg'], 'stop'), + (namespaces['svg'], 'svg'), + (namespaces['svg'], 'switch'), + (namespaces['svg'], 'text'), + (namespaces['svg'], 'title'), + (namespaces['svg'], 'tspan'), + (namespaces['svg'], 'use'), +)) + +allowed_attributes = frozenset(( + # HTML attributes + (None, 'abbr'), + (None, 'accept'), + (None, 'accept-charset'), + (None, 'accesskey'), + (None, 'action'), + (None, 'align'), + (None, 'alt'), + (None, 'autocomplete'), + (None, 'autofocus'), + (None, 'axis'), + (None, 'background'), + (None, 'balance'), + (None, 'bgcolor'), + (None, 'bgproperties'), + (None, 'border'), + (None, 'bordercolor'), + (None, 'bordercolordark'), + (None, 'bordercolorlight'), + (None, 'bottompadding'), + (None, 'cellpadding'), + (None, 'cellspacing'), + (None, 'ch'), + (None, 'challenge'), + (None, 'char'), + (None, 'charoff'), + (None, 'choff'), + (None, 'charset'), + (None, 'checked'), + (None, 'cite'), + (None, 'class'), + (None, 'clear'), + (None, 'color'), + (None, 'cols'), + (None, 'colspan'), + (None, 'compact'), + (None, 'contenteditable'), + (None, 'controls'), + (None, 'coords'), + (None, 'data'), + (None, 'datafld'), + (None, 'datapagesize'), + (None, 'datasrc'), + (None, 'datetime'), + (None, 'default'), + (None, 'delay'), + (None, 'dir'), + (None, 'disabled'), + (None, 'draggable'), + (None, 'dynsrc'), + (None, 'enctype'), + (None, 'end'), + (None, 'face'), + (None, 'for'), + (None, 'form'), + (None, 'frame'), + (None, 'galleryimg'), + (None, 'gutter'), + (None, 'headers'), + (None, 'height'), + (None, 'hidefocus'), + (None, 'hidden'), + (None, 'high'), + (None, 'href'), + (None, 'hreflang'), + (None, 'hspace'), + (None, 'icon'), + (None, 'id'), + (None, 'inputmode'), + (None, 'ismap'), + (None, 'keytype'), + (None, 'label'), + (None, 'leftspacing'), + (None, 'lang'), + (None, 'list'), + (None, 'longdesc'), + (None, 'loop'), + (None, 'loopcount'), + (None, 'loopend'), + (None, 'loopstart'), + (None, 'low'), + (None, 'lowsrc'), + (None, 'max'), + (None, 'maxlength'), + (None, 'media'), + (None, 'method'), + (None, 'min'), + (None, 'multiple'), + (None, 'name'), + (None, 'nohref'), + (None, 'noshade'), + (None, 'nowrap'), + (None, 'open'), + (None, 'optimum'), + (None, 'pattern'), + (None, 'ping'), + (None, 'point-size'), + (None, 'poster'), + (None, 'pqg'), + (None, 'preload'), + (None, 'prompt'), + (None, 'radiogroup'), + (None, 'readonly'), + (None, 'rel'), + (None, 'repeat-max'), + (None, 'repeat-min'), + (None, 'replace'), + (None, 'required'), + (None, 'rev'), + (None, 'rightspacing'), + (None, 'rows'), + (None, 'rowspan'), + (None, 'rules'), + (None, 'scope'), + (None, 'selected'), + (None, 'shape'), + (None, 'size'), + (None, 'span'), + (None, 'src'), + (None, 'start'), + (None, 'step'), + (None, 'style'), + (None, 'summary'), + (None, 'suppress'), + (None, 'tabindex'), + (None, 'target'), + (None, 'template'), + (None, 'title'), + (None, 'toppadding'), + (None, 'type'), + (None, 'unselectable'), + (None, 'usemap'), + (None, 'urn'), + (None, 'valign'), + (None, 'value'), + (None, 'variable'), + (None, 'volume'), + (None, 'vspace'), + (None, 'vrml'), + (None, 'width'), + (None, 'wrap'), + (namespaces['xml'], 'lang'), + # MathML attributes + (None, 'actiontype'), + (None, 'align'), + (None, 'columnalign'), + (None, 'columnalign'), + (None, 'columnalign'), + (None, 'columnlines'), + (None, 'columnspacing'), + (None, 'columnspan'), + (None, 'depth'), + (None, 'display'), + (None, 'displaystyle'), + (None, 'equalcolumns'), + (None, 'equalrows'), + (None, 'fence'), + (None, 'fontstyle'), + (None, 'fontweight'), + (None, 'frame'), + (None, 'height'), + (None, 'linethickness'), + (None, 'lspace'), + (None, 'mathbackground'), + (None, 'mathcolor'), + (None, 'mathvariant'), + (None, 'mathvariant'), + (None, 'maxsize'), + (None, 'minsize'), + (None, 'other'), + (None, 'rowalign'), + (None, 'rowalign'), + (None, 'rowalign'), + (None, 'rowlines'), + (None, 'rowspacing'), + (None, 'rowspan'), + (None, 'rspace'), + (None, 'scriptlevel'), + (None, 'selection'), + (None, 'separator'), + (None, 'stretchy'), + (None, 'width'), + (None, 'width'), + (namespaces['xlink'], 'href'), + (namespaces['xlink'], 'show'), + (namespaces['xlink'], 'type'), + # SVG attributes + (None, 'accent-height'), + (None, 'accumulate'), + (None, 'additive'), + (None, 'alphabetic'), + (None, 'arabic-form'), + (None, 'ascent'), + (None, 'attributeName'), + (None, 'attributeType'), + (None, 'baseProfile'), + (None, 'bbox'), + (None, 'begin'), + (None, 'by'), + (None, 'calcMode'), + (None, 'cap-height'), + (None, 'class'), + (None, 'clip-path'), + (None, 'color'), + (None, 'color-rendering'), + (None, 'content'), + (None, 'cx'), + (None, 'cy'), + (None, 'd'), + (None, 'dx'), + (None, 'dy'), + (None, 'descent'), + (None, 'display'), + (None, 'dur'), + (None, 'end'), + (None, 'fill'), + (None, 'fill-opacity'), + (None, 'fill-rule'), + (None, 'font-family'), + (None, 'font-size'), + (None, 'font-stretch'), + (None, 'font-style'), + (None, 'font-variant'), + (None, 'font-weight'), + (None, 'from'), + (None, 'fx'), + (None, 'fy'), + (None, 'g1'), + (None, 'g2'), + (None, 'glyph-name'), + (None, 'gradientUnits'), + (None, 'hanging'), + (None, 'height'), + (None, 'horiz-adv-x'), + (None, 'horiz-origin-x'), + (None, 'id'), + (None, 'ideographic'), + (None, 'k'), + (None, 'keyPoints'), + (None, 'keySplines'), + (None, 'keyTimes'), + (None, 'lang'), + (None, 'marker-end'), + (None, 'marker-mid'), + (None, 'marker-start'), + (None, 'markerHeight'), + (None, 'markerUnits'), + (None, 'markerWidth'), + (None, 'mathematical'), + (None, 'max'), + (None, 'min'), + (None, 'name'), + (None, 'offset'), + (None, 'opacity'), + (None, 'orient'), + (None, 'origin'), + (None, 'overline-position'), + (None, 'overline-thickness'), + (None, 'panose-1'), + (None, 'path'), + (None, 'pathLength'), + (None, 'points'), + (None, 'preserveAspectRatio'), + (None, 'r'), + (None, 'refX'), + (None, 'refY'), + (None, 'repeatCount'), + (None, 'repeatDur'), + (None, 'requiredExtensions'), + (None, 'requiredFeatures'), + (None, 'restart'), + (None, 'rotate'), + (None, 'rx'), + (None, 'ry'), + (None, 'slope'), + (None, 'stemh'), + (None, 'stemv'), + (None, 'stop-color'), + (None, 'stop-opacity'), + (None, 'strikethrough-position'), + (None, 'strikethrough-thickness'), + (None, 'stroke'), + (None, 'stroke-dasharray'), + (None, 'stroke-dashoffset'), + (None, 'stroke-linecap'), + (None, 'stroke-linejoin'), + (None, 'stroke-miterlimit'), + (None, 'stroke-opacity'), + (None, 'stroke-width'), + (None, 'systemLanguage'), + (None, 'target'), + (None, 'text-anchor'), + (None, 'to'), + (None, 'transform'), + (None, 'type'), + (None, 'u1'), + (None, 'u2'), + (None, 'underline-position'), + (None, 'underline-thickness'), + (None, 'unicode'), + (None, 'unicode-range'), + (None, 'units-per-em'), + (None, 'values'), + (None, 'version'), + (None, 'viewBox'), + (None, 'visibility'), + (None, 'width'), + (None, 'widths'), + (None, 'x'), + (None, 'x-height'), + (None, 'x1'), + (None, 'x2'), + (namespaces['xlink'], 'actuate'), + (namespaces['xlink'], 'arcrole'), + (namespaces['xlink'], 'href'), + (namespaces['xlink'], 'role'), + (namespaces['xlink'], 'show'), + (namespaces['xlink'], 'title'), + (namespaces['xlink'], 'type'), + (namespaces['xml'], 'base'), + (namespaces['xml'], 'lang'), + (namespaces['xml'], 'space'), + (None, 'y'), + (None, 'y1'), + (None, 'y2'), + (None, 'zoomAndPan'), +)) + +attr_val_is_uri = frozenset(( + (None, 'href'), + (None, 'src'), + (None, 'cite'), + (None, 'action'), + (None, 'longdesc'), + (None, 'poster'), + (None, 'background'), + (None, 'datasrc'), + (None, 'dynsrc'), + (None, 'lowsrc'), + (None, 'ping'), + (namespaces['xlink'], 'href'), + (namespaces['xml'], 'base'), +)) + +svg_attr_val_allows_ref = frozenset(( + (None, 'clip-path'), + (None, 'color-profile'), + (None, 'cursor'), + (None, 'fill'), + (None, 'filter'), + (None, 'marker'), + (None, 'marker-start'), + (None, 'marker-mid'), + (None, 'marker-end'), + (None, 'mask'), + (None, 'stroke'), +)) + +svg_allow_local_href = frozenset(( + (None, 'altGlyph'), + (None, 'animate'), + (None, 'animateColor'), + (None, 'animateMotion'), + (None, 'animateTransform'), + (None, 'cursor'), + (None, 'feImage'), + (None, 'filter'), + (None, 'linearGradient'), + (None, 'pattern'), + (None, 'radialGradient'), + (None, 'textpath'), + (None, 'tref'), + (None, 'set'), + (None, 'use') +)) + +allowed_css_properties = frozenset(( + 'azimuth', + 'background-color', + 'border-bottom-color', + 'border-collapse', + 'border-color', + 'border-left-color', + 'border-right-color', + 'border-top-color', + 'clear', + 'color', + 'cursor', + 'direction', + 'display', + 'elevation', + 'float', + 'font', + 'font-family', + 'font-size', + 'font-style', + 'font-variant', + 'font-weight', + 'height', + 'letter-spacing', + 'line-height', + 'overflow', + 'pause', + 'pause-after', + 'pause-before', + 'pitch', + 'pitch-range', + 'richness', + 'speak', + 'speak-header', + 'speak-numeral', + 'speak-punctuation', + 'speech-rate', + 'stress', + 'text-align', + 'text-decoration', + 'text-indent', + 'unicode-bidi', + 'vertical-align', + 'voice-family', + 'volume', + 'white-space', + 'width', +)) + +allowed_css_keywords = frozenset(( + 'auto', + 'aqua', + 'black', + 'block', + 'blue', + 'bold', + 'both', + 'bottom', + 'brown', + 'center', + 'collapse', + 'dashed', + 'dotted', + 'fuchsia', + 'gray', + 'green', + '!important', + 'italic', + 'left', + 'lime', + 'maroon', + 'medium', + 'none', + 'navy', + 'normal', + 'nowrap', + 'olive', + 'pointer', + 'purple', + 'red', + 'right', + 'solid', + 'silver', + 'teal', + 'top', + 'transparent', + 'underline', + 'white', + 'yellow', +)) + +allowed_svg_properties = frozenset(( + 'fill', + 'fill-opacity', + 'fill-rule', + 'stroke', + 'stroke-width', + 'stroke-linecap', + 'stroke-linejoin', + 'stroke-opacity', +)) + +allowed_protocols = frozenset(( + 'ed2k', + 'ftp', + 'http', + 'https', + 'irc', + 'mailto', + 'news', + 'gopher', + 'nntp', + 'telnet', + 'webcal', + 'xmpp', + 'callto', + 'feed', + 'urn', + 'aim', + 'rsync', + 'tag', + 'ssh', + 'sftp', + 'rtsp', + 'afs', + 'data', +)) + +allowed_content_types = frozenset(( + 'image/png', + 'image/jpeg', + 'image/gif', + 'image/webp', + 'image/bmp', + 'text/plain', +)) + + +data_content_type = re.compile(r''' + ^ + # Match a content type / + (?P[-a-zA-Z0-9.]+/[-a-zA-Z0-9.]+) + # Match any character set and encoding + (?:(?:;charset=(?:[-a-zA-Z0-9]+)(?:;(?:base64))?) + |(?:;(?:base64))?(?:;charset=(?:[-a-zA-Z0-9]+))?) + # Assume the rest is data + ,.* + $ + ''', + re.VERBOSE) + + +class Filter(base.Filter): + """Sanitizes token stream of XHTML+MathML+SVG and of inline style attributes""" + def __init__(self, + source, + allowed_elements=allowed_elements, + allowed_attributes=allowed_attributes, + allowed_css_properties=allowed_css_properties, + allowed_css_keywords=allowed_css_keywords, + allowed_svg_properties=allowed_svg_properties, + allowed_protocols=allowed_protocols, + allowed_content_types=allowed_content_types, + attr_val_is_uri=attr_val_is_uri, + svg_attr_val_allows_ref=svg_attr_val_allows_ref, + svg_allow_local_href=svg_allow_local_href): + """Creates a Filter + + :arg allowed_elements: set of elements to allow--everything else will + be escaped + + :arg allowed_attributes: set of attributes to allow in + elements--everything else will be stripped + + :arg allowed_css_properties: set of CSS properties to allow--everything + else will be stripped + + :arg allowed_css_keywords: set of CSS keywords to allow--everything + else will be stripped + + :arg allowed_svg_properties: set of SVG properties to allow--everything + else will be removed + + :arg allowed_protocols: set of allowed protocols for URIs + + :arg allowed_content_types: set of allowed content types for ``data`` URIs. + + :arg attr_val_is_uri: set of attributes that have URI values--values + that have a scheme not listed in ``allowed_protocols`` are removed + + :arg svg_attr_val_allows_ref: set of SVG attributes that can have + references + + :arg svg_allow_local_href: set of SVG elements that can have local + hrefs--these are removed + + """ + super(Filter, self).__init__(source) + + warnings.warn(_deprecation_msg, DeprecationWarning) + + self.allowed_elements = allowed_elements + self.allowed_attributes = allowed_attributes + self.allowed_css_properties = allowed_css_properties + self.allowed_css_keywords = allowed_css_keywords + self.allowed_svg_properties = allowed_svg_properties + self.allowed_protocols = allowed_protocols + self.allowed_content_types = allowed_content_types + self.attr_val_is_uri = attr_val_is_uri + self.svg_attr_val_allows_ref = svg_attr_val_allows_ref + self.svg_allow_local_href = svg_allow_local_href + + def __iter__(self): + for token in base.Filter.__iter__(self): + token = self.sanitize_token(token) + if token: + yield token + + # Sanitize the +html+, escaping all elements not in ALLOWED_ELEMENTS, and + # stripping out all attributes not in ALLOWED_ATTRIBUTES. Style attributes + # are parsed, and a restricted set, specified by ALLOWED_CSS_PROPERTIES and + # ALLOWED_CSS_KEYWORDS, are allowed through. attributes in ATTR_VAL_IS_URI + # are scanned, and only URI schemes specified in ALLOWED_PROTOCOLS are + # allowed. + # + # sanitize_html('') + # => <script> do_nasty_stuff() </script> + # sanitize_html('Click here for $100') + # => Click here for $100 + def sanitize_token(self, token): + + # accommodate filters which use token_type differently + token_type = token["type"] + if token_type in ("StartTag", "EndTag", "EmptyTag"): + name = token["name"] + namespace = token["namespace"] + if ((namespace, name) in self.allowed_elements or + (namespace is None and + (namespaces["html"], name) in self.allowed_elements)): + return self.allowed_token(token) + else: + return self.disallowed_token(token) + elif token_type == "Comment": + pass + else: + return token + + def allowed_token(self, token): + if "data" in token: + attrs = token["data"] + attr_names = set(attrs.keys()) + + # Remove forbidden attributes + for to_remove in (attr_names - self.allowed_attributes): + del token["data"][to_remove] + attr_names.remove(to_remove) + + # Remove attributes with disallowed URL values + for attr in (attr_names & self.attr_val_is_uri): + assert attr in attrs + # I don't have a clue where this regexp comes from or why it matches those + # characters, nor why we call unescape. I just know it's always been here. + # Should you be worried by this comment in a sanitizer? Yes. On the other hand, all + # this will do is remove *more* than it otherwise would. + val_unescaped = re.sub("[`\x00-\x20\x7f-\xa0\\s]+", '', + unescape(attrs[attr])).lower() + # remove replacement characters from unescaped characters + val_unescaped = val_unescaped.replace("\ufffd", "") + try: + uri = urlparse.urlparse(val_unescaped) + except ValueError: + uri = None + del attrs[attr] + if uri and uri.scheme: + if uri.scheme not in self.allowed_protocols: + del attrs[attr] + if uri.scheme == 'data': + m = data_content_type.match(uri.path) + if not m: + del attrs[attr] + elif m.group('content_type') not in self.allowed_content_types: + del attrs[attr] + + for attr in self.svg_attr_val_allows_ref: + if attr in attrs: + attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)', + ' ', + unescape(attrs[attr])) + if (token["name"] in self.svg_allow_local_href and + (namespaces['xlink'], 'href') in attrs and re.search(r'^\s*[^#\s].*', + attrs[(namespaces['xlink'], 'href')])): + del attrs[(namespaces['xlink'], 'href')] + if (None, 'style') in attrs: + attrs[(None, 'style')] = self.sanitize_css(attrs[(None, 'style')]) + token["data"] = attrs + return token + + def disallowed_token(self, token): + token_type = token["type"] + if token_type == "EndTag": + token["data"] = "" % token["name"] + elif token["data"]: + assert token_type in ("StartTag", "EmptyTag") + attrs = [] + for (ns, name), v in token["data"].items(): + attrs.append(' %s="%s"' % (name if ns is None else "%s:%s" % (prefixes[ns], name), escape(v))) + token["data"] = "<%s%s>" % (token["name"], ''.join(attrs)) + else: + token["data"] = "<%s>" % token["name"] + if token.get("selfClosing"): + token["data"] = token["data"][:-1] + "/>" + + token["type"] = "Characters" + + del token["name"] + return token + + def sanitize_css(self, style): + # disallow urls + style = re.compile(r'url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) + + # gauntlet + if not re.match(r"""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): + return '' + if not re.match(r"^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): + return '' + + clean = [] + for prop, value in re.findall(r"([-\w]+)\s*:\s*([^:;]*)", style): + if not value: + continue + if prop.lower() in self.allowed_css_properties: + clean.append(prop + ': ' + value + ';') + elif prop.split('-')[0].lower() in ['background', 'border', 'margin', + 'padding']: + for keyword in value.split(): + if keyword not in self.allowed_css_keywords and \ + not re.match(r"^(#[0-9a-fA-F]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): # noqa + break + else: + clean.append(prop + ': ' + value + ';') + elif prop.lower() in self.allowed_svg_properties: + clean.append(prop + ': ' + value + ';') + + return ' '.join(clean) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c37c7817a8d0e249baf5a84a821399af8d8946ce GIT binary patch literal 27503 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 T#eD7Y#@laPvu?sxHrf9Ns}9vD literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py new file mode 100644 index 0000000..0d12584 --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py @@ -0,0 +1,38 @@ +from __future__ import absolute_import, division, unicode_literals + +import re + +from . import base +from ..constants import rcdataElements, spaceCharacters +spaceCharacters = "".join(spaceCharacters) + +SPACES_REGEX = re.compile("[%s]+" % spaceCharacters) + + +class Filter(base.Filter): + """Collapses whitespace except in pre, textarea, and script elements""" + spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements)) + + def __iter__(self): + preserve = 0 + for token in base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag" \ + and (preserve or token["name"] in self.spacePreserveElements): + preserve += 1 + + elif type == "EndTag" and preserve: + preserve -= 1 + + elif not preserve and type == "SpaceCharacters" and token["data"]: + # Test on token["data"] above to not introduce spaces where there were not + token["data"] = " " + + elif not preserve and type == "Characters": + token["data"] = collapse_spaces(token["data"]) + + yield token + + +def collapse_spaces(text): + return SPACES_REGEX.sub(' ', text) diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.pyc b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/filters/whitespace.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f56033b4861f20183abd3a0c7f948db831c4d5e5 GIT binary patch literal 1733 zcmcIk+m0JW5Up-|$CtH}h!u&9g5;M-79>~#ae0UkVQ~;It7sf?nJ5}&r`y?fdM-@& zESuHtQ+VMA_yT@`7d|3Ckk8-;sMGdh!E;#cl&h<%tLs#q?#^H1;p<=jNORi$b@=y- zA0@fpSW)~h$PyKT5Ev4liJ53xrQT`vk{kO zQ11-Y`s*yRV^`VM>(mr=)p*}$n=+@ynX2?Rc+r+7uar)$@w&;ZJ2HZ;GYH>hahy4A zBuo(g8jB`Zna>th7rOK=9OLRN*M}!rljWSowH!t59*ZY;+|&1c#M(n++4WC9k^4*Z z^CMO?V_;+~C28&%>ynk*dlWBcNYFlDaadWK)lR$V&nFBblrq(4 zxvu@xl+(J=cc)&T`K-~|-Dy^;smmL~PQ69YqFWr+qB&QQIXZwd@Z~7pMTeeCYM#)AAa@jeU7B$GnjO*B!HoEnGnOvw zh{BF@>}Y~y_h)cFhH2FN9-?|7igiA%PZPE>KQ@c|<$IgRS0Qp3BDvb`RWR3j6-m&( z6+cbrJ4MW%ea3eb=+gqTe^GBbvgFSB$Jw)BEwe%ghP0UJqEv8zXv_aF04YF|7JZzy zLzX*!%s`D8ZI6*Aurf`-z%=!5vn34iQKOx1PW8W-mT#w>h7cEM5QyruU4=wE$*|4i z5MMoKl3wANv4w(g4_TZ0qMp~LzGq73Gi&dC_|5wKlLDsjrKh@7RWm>Fh5gu?fiP*0EFNicn8yPCPlBPwaT8kwT zrKzfN)(5Pwn(ADaPWu4B8s}pmiIF3m8lddNn*@cq;5~6rA_jF^hAV+_VsMAJ5eV&ICy69>^~hQ$U{8b*;`L-O%8{($8E)P1B$=_r}dK&-$ literal 0 HcmV?d00001 diff --git a/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser.py b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser.py new file mode 100644 index 0000000..d06784f --- /dev/null +++ b/venv/lib/python2.7/site-packages/pip/_vendor/html5lib/html5parser.py @@ -0,0 +1,2795 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import with_metaclass, viewkeys + +import types + +from . import _inputstream +from . import _tokenizer + +from . import treebuilders +from .treebuilders.base import Marker + +from . import _utils +from .constants import ( + spaceCharacters, asciiUpper2Lower, + specialElements, headingElements, cdataElements, rcdataElements, + tokenTypes, tagTokenTypes, + namespaces, + htmlIntegrationPointElements, mathmlTextIntegrationPointElements, + adjustForeignAttributes as adjustForeignAttributesMap, + adjustMathMLAttributes, adjustSVGAttributes, + E, + _ReparseException +) + + +def parse(doc, treebuilder="etree", namespaceHTMLElements=True, **kwargs): + """Parse an HTML document as a string or file-like object into a tree + + :arg doc: the document to parse as a string or file-like object + + :arg treebuilder: the treebuilder to use when parsing + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :returns: parsed tree + + Example: + + >>> from html5lib.html5parser import parse + >>> parse('

;L^B?|oC@6;MJdn(5zIu2I5)ZgvvymVhsEFKwA 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