From e9dacd2bf392f04b5634f7611def55c074d76817 Mon Sep 17 00:00:00 2001 From: j Date: Fri, 13 Oct 2017 14:49:49 +0200 Subject: [PATCH] add python3.6 modules --- README.md | 2 +- .../SQLAlchemy-1.0.12.dist-info/METADATA | 1 + .../SQLAlchemy-1.0.12.dist-info/RECORD | 364 +- .../SQLAlchemy-1.0.12.dist-info/WHEEL | 2 +- .../SQLAlchemy-1.0.12.dist-info/metadata.json | 2 +- .../DESCRIPTION.rst | 238 -- .../_markerlib-0.0.0.dist-info/METADATA | 263 -- .../_markerlib-0.0.0.dist-info/RECORD | 104 - .../dependency_links.txt | 2 - .../_markerlib-0.0.0.dist-info/metadata.json | 1 - .../_markerlib-0.0.0.dist-info/top_level.txt | 4 - .../site-packages/_markerlib/__init__.py | 16 - .../site-packages/_markerlib/markers.py | 119 - .../ed25519-1.4.dist-info/METADATA | 1 + .../ed25519-1.4.dist-info/RECORD | 10 +- .../site-packages/ed25519-1.4.dist-info/WHEEL | 2 +- .../ed25519-1.4.dist-info/metadata.json | 2 +- .../ed25519/_ed25519.cpython-34m.so | Bin 255624 -> 262968 bytes .../_ed25519.cpython-35m-x86_64-linux-gnu.so | Bin 255872 -> 263120 bytes .../_ed25519.cpython-36m-x86_64-linux-gnu.so | Bin 0 -> 263680 bytes .../netifaces-0.10.4.dist-info/RECORD | 9 - .../netifaces-0.10.4.dist-info/metadata.json | 1 - .../DESCRIPTION.rst | 11 +- .../INSTALLER | 0 .../METADATA | 14 +- .../netifaces-0.10.6.dist-info/RECORD | 9 + .../WHEEL | 2 +- .../netifaces-0.10.6.dist-info/metadata.json | 1 + .../top_level.txt | 0 .../zip-safe | 0 .../site-packages/netifaces.cpython-34m.so | Bin 61520 -> 72976 bytes .../netifaces.cpython-35m-x86_64-linux-gnu.so | Bin 19040 -> 76000 bytes .../netifaces.cpython-36m-x86_64-linux-gnu.so | Bin 0 -> 73688 bytes .../DESCRIPTION.rst | 5 +- .../INSTALLER | 0 .../METADATA | 8 +- .../RECORD | 190 +- .../WHEEL | 0 .../entry_points.txt | 0 .../metadata.json | 2 +- .../top_level.txt | 0 lib/python3.4/site-packages/pip/__init__.py | 24 +- .../site-packages/pip/_vendor/__init__.py | 1 + .../site-packages/pip/basecommand.py | 18 +- lib/python3.4/site-packages/pip/baseparser.py | 3 +- lib/python3.4/site-packages/pip/cmdoptions.py | 27 +- .../site-packages/pip/commands/__init__.py | 3 + .../site-packages/pip/commands/check.py | 39 + .../site-packages/pip/commands/completion.py | 16 +- .../site-packages/pip/commands/download.py | 80 +- .../site-packages/pip/commands/freeze.py | 11 +- .../site-packages/pip/commands/install.py | 119 +- .../site-packages/pip/commands/list.py | 222 +- .../site-packages/pip/commands/search.py | 35 +- .../site-packages/pip/commands/show.py | 76 +- .../site-packages/pip/commands/wheel.py | 8 +- .../site-packages/pip/compat/__init__.py | 4 +- .../site-packages/pip/compat/ordereddict.py | 129 - lib/python3.4/site-packages/pip/download.py | 35 +- lib/python3.4/site-packages/pip/exceptions.py | 5 + lib/python3.4/site-packages/pip/index.py | 94 +- lib/python3.4/site-packages/pip/locations.py | 4 +- .../site-packages/pip/operations/check.py | 49 + .../site-packages/pip/operations/freeze.py | 128 +- lib/python3.4/site-packages/pip/pep425tags.py | 68 +- .../site-packages/pip/req/req_file.py | 2 +- .../site-packages/pip/req/req_install.py | 189 +- .../site-packages/pip/req/req_set.py | 94 +- .../site-packages/pip/utils/__init__.py | 26 +- .../site-packages/pip/utils/appdirs.py | 36 +- .../site-packages/pip/utils/deprecation.py | 8 +- .../site-packages/pip/utils/glibc.py | 81 + .../site-packages/pip/utils/packaging.py | 63 + .../pip/utils/setuptools_build.py | 6 +- .../site-packages/pip/vcs/__init__.py | 9 +- lib/python3.4/site-packages/pip/vcs/git.py | 29 +- .../site-packages/pip/vcs/subversion.py | 20 + lib/python3.4/site-packages/pip/wheel.py | 24 +- .../pkg_resources-0.0.0.dist-info/RECORD | 40 +- .../site-packages/pkg_resources/__init__.py | 735 ++-- .../pkg_resources/_vendor/appdirs.py | 552 +++ .../_vendor/packaging/__about__.py | 24 +- .../_vendor/packaging/__init__.py | 16 +- .../_vendor/packaging/_compat.py | 16 +- .../_vendor/packaging/_structures.py | 16 +- .../_vendor/packaging/markers.py | 40 +- .../_vendor/packaging/specifiers.py | 66 +- .../_vendor/packaging/version.py | 16 +- .../pkg_resources/_vendor/pyparsing.py | 3531 +++++++++++++---- .../pkg_resources/extern/__init__.py | 4 +- .../site-packages/pkg_resources/py31compat.py | 22 + .../DESCRIPTION.rst | 238 -- .../setuptools-20.3.1.dist-info/METADATA | 267 -- .../setuptools-20.3.1.dist-info/RECORD | 137 - .../dependency_links.txt | 2 - .../entry_points.txt | 62 - .../setuptools-20.3.1.dist-info/metadata.json | 1 - .../setuptools-20.3.1.dist-info/zip-safe | 1 - .../DESCRIPTION.rst | 36 + .../INSTALLER | 0 .../setuptools-36.6.0.dist-info/METADATA | 69 + .../setuptools-36.6.0.dist-info/RECORD | 159 + .../WHEEL | 2 +- .../dependency_links.txt | 2 + .../entry_points.txt | 4 + .../setuptools-36.6.0.dist-info/metadata.json | 1 + .../top_level.txt | 0 .../zip-safe | 0 .../site-packages/setuptools/__init__.py | 109 +- .../site-packages/setuptools/archive_util.py | 19 +- .../site-packages/setuptools/build_meta.py | 148 + .../site-packages/setuptools/cli-arm-32.exe | Bin 69120 -> 0 bytes .../setuptools/command/__init__.py | 3 +- .../setuptools/command/bdist_egg.py | 33 +- .../setuptools/command/build_clib.py | 98 + .../setuptools/command/build_ext.py | 90 +- .../setuptools/command/build_py.py | 94 +- .../setuptools/command/develop.py | 34 +- .../setuptools/command/dist_info.py | 37 + .../setuptools/command/easy_install.py | 383 +- .../setuptools/command/egg_info.py | 339 +- .../setuptools/command/install.py | 2 +- .../setuptools/command/install_egg_info.py | 82 +- .../setuptools/command/install_lib.py | 28 +- .../setuptools/command/install_scripts.py | 5 + .../setuptools/command/py36compat.py | 136 + .../setuptools/command/rotate.py | 6 +- .../site-packages/setuptools/command/sdist.py | 109 +- .../setuptools/command/setopt.py | 1 - .../site-packages/setuptools/command/test.py | 94 +- .../setuptools/command/upload.py | 29 +- .../setuptools/command/upload_docs.py | 115 +- .../site-packages/setuptools/config.py | 554 +++ .../site-packages/setuptools/dep_util.py | 23 + .../site-packages/setuptools/depends.py | 75 +- .../site-packages/setuptools/dist.py | 514 ++- .../site-packages/setuptools/extension.py | 24 +- .../setuptools/extern/__init__.py | 1 - .../site-packages/setuptools/glob.py | 176 + .../site-packages/setuptools/gui-arm-32.exe | Bin 69120 -> 0 bytes .../site-packages/setuptools/launch.py | 36 +- .../site-packages/setuptools/lib2to3_ex.py | 10 +- .../site-packages/setuptools/monkey.py | 197 + .../site-packages/setuptools/msvc.py | 1302 ++++++ .../site-packages/setuptools/msvc9_support.py | 63 - .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 262 +- .../site-packages/setuptools/py26compat.py | 31 +- .../site-packages/setuptools/py27compat.py | 29 +- .../site-packages/setuptools/py31compat.py | 10 +- .../site-packages/setuptools/py33compat.py | 45 + .../site-packages/setuptools/py36compat.py | 82 + .../site-packages/setuptools/sandbox.py | 197 +- .../site-packages/setuptools/site-patch.py | 30 +- .../site-packages/setuptools/ssl_support.py | 62 +- .../site-packages/setuptools/unicode_utils.py | 1 + .../site-packages/setuptools/utils.py | 11 - .../site-packages/setuptools/version.py | 7 +- .../site-packages/six-1.10.0.dist-info/RECORD | 9 - .../six-1.10.0.dist-info/metadata.json | 1 - .../DESCRIPTION.rst | 13 +- .../INSTALLER | 0 .../METADATA | 15 +- .../site-packages/six-1.11.0.dist-info/RECORD | 9 + .../WHEEL | 0 .../six-1.11.0.dist-info/metadata.json | 1 + .../top_level.txt | 0 lib/python3.4/site-packages/six.py | 55 +- .../sqlalchemy/cprocessors.cpython-34m.so | Bin 42824 -> 52136 bytes ...processors.cpython-35m-x86_64-linux-gnu.so | Bin 43072 -> 52288 bytes ...processors.cpython-36m-x86_64-linux-gnu.so | Bin 0 -> 53040 bytes .../sqlalchemy/cresultproxy.cpython-34m.so | Bin 54056 -> 61504 bytes ...esultproxy.cpython-35m-x86_64-linux-gnu.so | Bin 54304 -> 61648 bytes ...esultproxy.cpython-36m-x86_64-linux-gnu.so | Bin 0 -> 62208 bytes .../sqlalchemy/cutils.cpython-34m.so | Bin 25280 -> 34312 bytes .../cutils.cpython-35m-x86_64-linux-gnu.so | Bin 25536 -> 34456 bytes .../cutils.cpython-36m-x86_64-linux-gnu.so | Bin 0 -> 35016 bytes .../wheel-0.29.0.dist-info/INSTALLER | 1 - .../wheel-0.29.0.dist-info/RECORD | 81 - .../wheel-0.29.0.dist-info/WHEEL | 6 - .../wheel-0.29.0.dist-info/metadata.json | 1 - .../DESCRIPTION.rst | 17 +- .../INSTALLER | 0 .../wheel-0.30.0.dist-info/LICENSE.txt | 22 + .../METADATA | 41 +- .../wheel-0.30.0.dist-info/RECORD | 46 + .../WHEEL | 2 +- .../entry_points.txt | 3 +- .../wheel-0.30.0.dist-info/metadata.json | 1 + .../top_level.txt | 0 lib/python3.4/site-packages/wheel/__init__.py | 2 +- lib/python3.4/site-packages/wheel/__main__.py | 4 +- lib/python3.4/site-packages/wheel/archive.py | 18 +- .../site-packages/wheel/bdist_wheel.py | 101 +- .../site-packages/wheel/egg2wheel.py | 31 +- .../site-packages/wheel/eggnames.txt | 87 - lib/python3.4/site-packages/wheel/install.py | 92 +- lib/python3.4/site-packages/wheel/metadata.py | 129 +- lib/python3.4/site-packages/wheel/paths.py | 10 +- .../site-packages/wheel/pep425tags.py | 69 +- lib/python3.4/site-packages/wheel/pkginfo.py | 13 +- .../wheel/signatures/__init__.py | 54 +- .../site-packages/wheel/signatures/djbec.py | 231 +- .../wheel/signatures/ed25519py.py | 20 +- .../site-packages/wheel/signatures/keys.py | 38 +- .../site-packages/wheel/test/__init__.py | 1 - .../test/complex-dist/complexdist/__init__.py | 2 - .../wheel/test/complex-dist/setup.py | 30 - .../wheel/test/headers.dist/header.h | 0 .../wheel/test/headers.dist/headersdist.py | 0 .../wheel/test/headers.dist/setup.py | 16 - .../wheel/test/pydist-schema.json | 362 -- .../wheel/test/simple.dist/setup.py | 17 - .../test/simple.dist/simpledist/__init__.py | 0 .../test/test-1.0-py2.py3-none-win32.whl | Bin 5224 -> 0 bytes .../site-packages/wheel/test/test_basic.py | 176 - .../site-packages/wheel/test/test_install.py | 55 - .../site-packages/wheel/test/test_keys.py | 98 - .../site-packages/wheel/test/test_paths.py | 6 - .../site-packages/wheel/test/test_ranking.py | 43 - .../wheel/test/test_signatures.py | 47 - .../site-packages/wheel/test/test_tagopt.py | 176 - .../site-packages/wheel/test/test_tool.py | 25 - .../wheel/test/test_wheelfile.py | 142 - .../site-packages/wheel/tool/__init__.py | 58 +- lib/python3.4/site-packages/wheel/util.py | 101 +- .../site-packages/wheel/wininst2wheel.py | 62 +- update.sh | 15 +- 228 files changed, 10923 insertions(+), 6804 deletions(-) delete mode 100644 lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/DESCRIPTION.rst delete mode 100644 lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/METADATA delete mode 100644 lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/RECORD delete mode 100644 lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/dependency_links.txt delete mode 100644 lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/metadata.json delete mode 100644 lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/top_level.txt delete mode 100644 lib/python3.4/site-packages/_markerlib/__init__.py delete mode 100644 lib/python3.4/site-packages/_markerlib/markers.py create mode 100755 lib/python3.4/site-packages/ed25519/_ed25519.cpython-36m-x86_64-linux-gnu.so delete mode 100644 lib/python3.4/site-packages/netifaces-0.10.4.dist-info/RECORD delete mode 100644 lib/python3.4/site-packages/netifaces-0.10.4.dist-info/metadata.json rename lib/python3.4/site-packages/{netifaces-0.10.4.dist-info => netifaces-0.10.6.dist-info}/DESCRIPTION.rst (96%) rename lib/python3.4/site-packages/{_markerlib-0.0.0.dist-info => netifaces-0.10.6.dist-info}/INSTALLER (100%) rename lib/python3.4/site-packages/{netifaces-0.10.4.dist-info => netifaces-0.10.6.dist-info}/METADATA (96%) create mode 100644 lib/python3.4/site-packages/netifaces-0.10.6.dist-info/RECORD rename lib/python3.4/site-packages/{netifaces-0.10.4.dist-info => netifaces-0.10.6.dist-info}/WHEEL (69%) create mode 100644 lib/python3.4/site-packages/netifaces-0.10.6.dist-info/metadata.json rename lib/python3.4/site-packages/{netifaces-0.10.4.dist-info => netifaces-0.10.6.dist-info}/top_level.txt (100%) rename lib/python3.4/site-packages/{_markerlib-0.0.0.dist-info => netifaces-0.10.6.dist-info}/zip-safe (100%) mode change 100644 => 100755 lib/python3.4/site-packages/netifaces.cpython-35m-x86_64-linux-gnu.so create mode 100755 lib/python3.4/site-packages/netifaces.cpython-36m-x86_64-linux-gnu.so rename lib/python3.4/site-packages/{pip-8.1.1.dist-info => pip-9.0.1.dist-info}/DESCRIPTION.rst (85%) rename lib/python3.4/site-packages/{netifaces-0.10.4.dist-info => pip-9.0.1.dist-info}/INSTALLER (100%) rename lib/python3.4/site-packages/{pip-8.1.1.dist-info => pip-9.0.1.dist-info}/METADATA (90%) rename lib/python3.4/site-packages/{pip-8.1.1.dist-info => pip-9.0.1.dist-info}/RECORD (51%) rename lib/python3.4/site-packages/{_markerlib-0.0.0.dist-info => pip-9.0.1.dist-info}/WHEEL (100%) rename lib/python3.4/site-packages/{pip-8.1.1.dist-info => pip-9.0.1.dist-info}/entry_points.txt (100%) rename lib/python3.4/site-packages/{pip-8.1.1.dist-info => pip-9.0.1.dist-info}/metadata.json (73%) rename lib/python3.4/site-packages/{pip-8.1.1.dist-info => pip-9.0.1.dist-info}/top_level.txt (100%) create mode 100644 lib/python3.4/site-packages/pip/commands/check.py delete mode 100644 lib/python3.4/site-packages/pip/compat/ordereddict.py create mode 100644 lib/python3.4/site-packages/pip/operations/check.py create mode 100644 lib/python3.4/site-packages/pip/utils/glibc.py create mode 100644 lib/python3.4/site-packages/pip/utils/packaging.py create mode 100644 lib/python3.4/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 lib/python3.4/site-packages/pkg_resources/py31compat.py delete mode 100644 lib/python3.4/site-packages/setuptools-20.3.1.dist-info/DESCRIPTION.rst delete mode 100644 lib/python3.4/site-packages/setuptools-20.3.1.dist-info/METADATA delete mode 100644 lib/python3.4/site-packages/setuptools-20.3.1.dist-info/RECORD delete mode 100644 lib/python3.4/site-packages/setuptools-20.3.1.dist-info/dependency_links.txt delete mode 100644 lib/python3.4/site-packages/setuptools-20.3.1.dist-info/entry_points.txt delete mode 100644 lib/python3.4/site-packages/setuptools-20.3.1.dist-info/metadata.json delete mode 100644 lib/python3.4/site-packages/setuptools-20.3.1.dist-info/zip-safe create mode 100644 lib/python3.4/site-packages/setuptools-36.6.0.dist-info/DESCRIPTION.rst rename lib/python3.4/site-packages/{pip-8.1.1.dist-info => setuptools-36.6.0.dist-info}/INSTALLER (100%) create mode 100644 lib/python3.4/site-packages/setuptools-36.6.0.dist-info/METADATA create mode 100644 lib/python3.4/site-packages/setuptools-36.6.0.dist-info/RECORD rename lib/python3.4/site-packages/{setuptools-20.3.1.dist-info => setuptools-36.6.0.dist-info}/WHEEL (70%) create mode 100644 lib/python3.4/site-packages/setuptools-36.6.0.dist-info/dependency_links.txt rename lib/python3.4/site-packages/{_markerlib-0.0.0.dist-info => setuptools-36.6.0.dist-info}/entry_points.txt (92%) create mode 100644 lib/python3.4/site-packages/setuptools-36.6.0.dist-info/metadata.json rename lib/python3.4/site-packages/{setuptools-20.3.1.dist-info => setuptools-36.6.0.dist-info}/top_level.txt (100%) rename lib/python3.4/site-packages/{netifaces-0.10.4.dist-info => setuptools-36.6.0.dist-info}/zip-safe (100%) create mode 100644 lib/python3.4/site-packages/setuptools/build_meta.py delete mode 100644 lib/python3.4/site-packages/setuptools/cli-arm-32.exe create mode 100644 lib/python3.4/site-packages/setuptools/command/build_clib.py create mode 100644 lib/python3.4/site-packages/setuptools/command/dist_info.py create mode 100644 lib/python3.4/site-packages/setuptools/command/py36compat.py create mode 100644 lib/python3.4/site-packages/setuptools/config.py create mode 100644 lib/python3.4/site-packages/setuptools/dep_util.py create mode 100644 lib/python3.4/site-packages/setuptools/glob.py delete mode 100644 lib/python3.4/site-packages/setuptools/gui-arm-32.exe create mode 100644 lib/python3.4/site-packages/setuptools/monkey.py create mode 100644 lib/python3.4/site-packages/setuptools/msvc.py delete mode 100644 lib/python3.4/site-packages/setuptools/msvc9_support.py create mode 100644 lib/python3.4/site-packages/setuptools/namespaces.py create mode 100644 lib/python3.4/site-packages/setuptools/py33compat.py create mode 100644 lib/python3.4/site-packages/setuptools/py36compat.py delete mode 100644 lib/python3.4/site-packages/setuptools/utils.py delete mode 100644 lib/python3.4/site-packages/six-1.10.0.dist-info/RECORD delete mode 100644 lib/python3.4/site-packages/six-1.10.0.dist-info/metadata.json rename lib/python3.4/site-packages/{six-1.10.0.dist-info => six-1.11.0.dist-info}/DESCRIPTION.rst (58%) rename lib/python3.4/site-packages/{setuptools-20.3.1.dist-info => six-1.11.0.dist-info}/INSTALLER (100%) rename lib/python3.4/site-packages/{six-1.10.0.dist-info => six-1.11.0.dist-info}/METADATA (70%) create mode 100644 lib/python3.4/site-packages/six-1.11.0.dist-info/RECORD rename lib/python3.4/site-packages/{pip-8.1.1.dist-info => six-1.11.0.dist-info}/WHEEL (100%) create mode 100644 lib/python3.4/site-packages/six-1.11.0.dist-info/metadata.json rename lib/python3.4/site-packages/{six-1.10.0.dist-info => six-1.11.0.dist-info}/top_level.txt (100%) create mode 100755 lib/python3.4/site-packages/sqlalchemy/cprocessors.cpython-36m-x86_64-linux-gnu.so create mode 100755 lib/python3.4/site-packages/sqlalchemy/cresultproxy.cpython-36m-x86_64-linux-gnu.so create mode 100755 lib/python3.4/site-packages/sqlalchemy/cutils.cpython-36m-x86_64-linux-gnu.so delete mode 100644 lib/python3.4/site-packages/wheel-0.29.0.dist-info/INSTALLER delete mode 100644 lib/python3.4/site-packages/wheel-0.29.0.dist-info/RECORD delete mode 100644 lib/python3.4/site-packages/wheel-0.29.0.dist-info/WHEEL delete mode 100644 lib/python3.4/site-packages/wheel-0.29.0.dist-info/metadata.json rename lib/python3.4/site-packages/{wheel-0.29.0.dist-info => wheel-0.30.0.dist-info}/DESCRIPTION.rst (92%) rename lib/python3.4/site-packages/{six-1.10.0.dist-info => wheel-0.30.0.dist-info}/INSTALLER (100%) create mode 100644 lib/python3.4/site-packages/wheel-0.30.0.dist-info/LICENSE.txt rename lib/python3.4/site-packages/{wheel-0.29.0.dist-info => wheel-0.30.0.dist-info}/METADATA (88%) create mode 100644 lib/python3.4/site-packages/wheel-0.30.0.dist-info/RECORD rename lib/python3.4/site-packages/{six-1.10.0.dist-info => wheel-0.30.0.dist-info}/WHEEL (70%) rename lib/python3.4/site-packages/{wheel-0.29.0.dist-info => wheel-0.30.0.dist-info}/entry_points.txt (58%) create mode 100644 lib/python3.4/site-packages/wheel-0.30.0.dist-info/metadata.json rename lib/python3.4/site-packages/{wheel-0.29.0.dist-info => wheel-0.30.0.dist-info}/top_level.txt (100%) delete mode 100644 lib/python3.4/site-packages/wheel/eggnames.txt delete mode 100644 lib/python3.4/site-packages/wheel/test/__init__.py delete mode 100644 lib/python3.4/site-packages/wheel/test/complex-dist/complexdist/__init__.py delete mode 100644 lib/python3.4/site-packages/wheel/test/complex-dist/setup.py delete mode 100644 lib/python3.4/site-packages/wheel/test/headers.dist/header.h delete mode 100644 lib/python3.4/site-packages/wheel/test/headers.dist/headersdist.py delete mode 100644 lib/python3.4/site-packages/wheel/test/headers.dist/setup.py delete mode 100644 lib/python3.4/site-packages/wheel/test/pydist-schema.json delete mode 100644 lib/python3.4/site-packages/wheel/test/simple.dist/setup.py delete mode 100644 lib/python3.4/site-packages/wheel/test/simple.dist/simpledist/__init__.py delete mode 100644 lib/python3.4/site-packages/wheel/test/test-1.0-py2.py3-none-win32.whl delete mode 100644 lib/python3.4/site-packages/wheel/test/test_basic.py delete mode 100644 lib/python3.4/site-packages/wheel/test/test_install.py delete mode 100644 lib/python3.4/site-packages/wheel/test/test_keys.py delete mode 100644 lib/python3.4/site-packages/wheel/test/test_paths.py delete mode 100644 lib/python3.4/site-packages/wheel/test/test_ranking.py delete mode 100644 lib/python3.4/site-packages/wheel/test/test_signatures.py delete mode 100644 lib/python3.4/site-packages/wheel/test/test_tagopt.py delete mode 100644 lib/python3.4/site-packages/wheel/test/test_tool.py delete mode 100644 lib/python3.4/site-packages/wheel/test/test_wheelfile.py diff --git a/README.md b/README.md index ea3d95d..e3363ff 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ to update you need: -apt install python3-pip python3.4 python3.5 python3.4-dev python3.5-dev +apt install python3-pip python3.4 python3.5 python3.4-dev python3.5-dev python3.6 python3.6-dev diff --git a/lib/python3.4/site-packages/SQLAlchemy-1.0.12.dist-info/METADATA b/lib/python3.4/site-packages/SQLAlchemy-1.0.12.dist-info/METADATA index f993bb0..e5ec428 100644 --- a/lib/python3.4/site-packages/SQLAlchemy-1.0.12.dist-info/METADATA +++ b/lib/python3.4/site-packages/SQLAlchemy-1.0.12.dist-info/METADATA @@ -6,6 +6,7 @@ Home-page: http://www.sqlalchemy.org Author: Mike Bayer Author-email: mike_mp@zzzcomputing.com License: MIT License +Description-Content-Type: UNKNOWN Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers diff --git a/lib/python3.4/site-packages/SQLAlchemy-1.0.12.dist-info/RECORD b/lib/python3.4/site-packages/SQLAlchemy-1.0.12.dist-info/RECORD index 2c799dd..057fad3 100644 --- a/lib/python3.4/site-packages/SQLAlchemy-1.0.12.dist-info/RECORD +++ b/lib/python3.4/site-packages/SQLAlchemy-1.0.12.dist-info/RECORD @@ -1,13 +1,13 @@ SQLAlchemy-1.0.12.dist-info/DESCRIPTION.rst,sha256=ZN8fj2owI_rw0Emr3_RXqoNfTFkThjiZy7xcCzg1W_g,5013 -SQLAlchemy-1.0.12.dist-info/METADATA,sha256=fntYBelbmQAxIrj5_YGLpIGPzwQBxiA_6kJwVdrwMF4,5786 +SQLAlchemy-1.0.12.dist-info/METADATA,sha256=xCBLJSNub29eg_Bm-fHTUT_al-Sr8jh38ztUF4_s1so,5820 SQLAlchemy-1.0.12.dist-info/RECORD,, -SQLAlchemy-1.0.12.dist-info/WHEEL,sha256=HslHw5cSLCuyOLxj8duGAooHNvXnupcmoBU1NzRPr2w,104 -SQLAlchemy-1.0.12.dist-info/metadata.json,sha256=JpEwQiqyWE4fnbo3thN5jZ_9e7jYut521x-nYPY27A4,965 +SQLAlchemy-1.0.12.dist-info/WHEEL,sha256=AEztX7vHDtcgysb-4-5-DyIKMLIPg6NMxY9dXTRdoXQ,104 +SQLAlchemy-1.0.12.dist-info/metadata.json,sha256=QT7EcApgL9QrRqR1YIngngveBNd13H8h-oNK9fsxj0U,1004 SQLAlchemy-1.0.12.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11 sqlalchemy/__init__.py,sha256=fTurvwmGkoRt_zdwxoZNWTHg6VdzvBpeHyPmUnexOK4,2112 -sqlalchemy/cprocessors.cpython-34m.so,sha256=9c-YOtWdmfG-k2sVd7Z2mpBiNFXtvi29UgfOxNPOOPM,42824 -sqlalchemy/cresultproxy.cpython-34m.so,sha256=NW56qP26QzyMYvdFfLv15pXoJRQSlDDoxIBzfcMzmQI,54056 -sqlalchemy/cutils.cpython-34m.so,sha256=Nr_Lwl_q1cujcQksdw2oLYMsxh7lbgn06TUhjfNZNZQ,25280 +sqlalchemy/cprocessors.cpython-34m.so,sha256=hvG3A0r4VO9gevdsLGZYRdqNfG2rahDIFUqJ-fUxAB4,52136 +sqlalchemy/cresultproxy.cpython-34m.so,sha256=piAFu3JE3mOaKpNSg6vcu8jGTl_-X6elUDWS2h_YOfQ,61504 +sqlalchemy/cutils.cpython-34m.so,sha256=-ARQsTXx0XDzghnRNCwdaxm2eeIn2TuEqoU_Wb18h6E,34312 sqlalchemy/events.py,sha256=j8yref-XfuJxkPKbvnZmB4jeUAIujPcbLAzD2cKV4f4,43944 sqlalchemy/exc.py,sha256=NhA5R5nDdducWkp0MXtlQ0-Q6iF_rhqkHWblIfuSYGk,11706 sqlalchemy/inspection.py,sha256=zMa-2nt-OQ0Op1dqq0Z2XCnpdAFSTkqif5Kdi8Wz8AU,3093 @@ -191,186 +191,186 @@ sqlalchemy/util/langhelpers.py,sha256=Nhe3Y9ieK6JaFYejjYosVOjOSSIBT2V385Hu6HGcyZ sqlalchemy/util/queue.py,sha256=rs3W0LDhKt7M_dlQEjYpI9KS-bzQmmwN38LE_-RRVvU,6548 sqlalchemy/util/topological.py,sha256=xKsYjjAat4p8cdqRHKwibLzr6WONbPTC0X8Mqg7jYno,2794 SQLAlchemy-1.0.12.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -sqlalchemy/testing/__pycache__/replay_fixture.cpython-34.pyc,, -sqlalchemy/engine/__pycache__/strategies.cpython-34.pyc,, -sqlalchemy/connectors/__pycache__/mxodbc.cpython-34.pyc,, -sqlalchemy/ext/__pycache__/hybrid.cpython-34.pyc,, -sqlalchemy/dialects/firebird/__pycache__/kinterbasdb.cpython-34.pyc,, -sqlalchemy/engine/__pycache__/__init__.cpython-34.pyc,, -sqlalchemy/sql/__pycache__/expression.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/relationships.cpython-34.pyc,, -sqlalchemy/ext/declarative/__pycache__/__init__.cpython-34.pyc,, -sqlalchemy/testing/__pycache__/fixtures.cpython-34.pyc,, -sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-34.pyc,, -sqlalchemy/testing/__pycache__/assertions.cpython-34.pyc,, -sqlalchemy/util/__pycache__/__init__.cpython-34.pyc,, -sqlalchemy/testing/suite/__pycache__/test_select.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/unitofwork.cpython-34.pyc,, -sqlalchemy/testing/suite/__pycache__/test_insert.cpython-34.pyc,, -sqlalchemy/dialects/mysql/__pycache__/oursql.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/descriptor_props.cpython-34.pyc,, -sqlalchemy/sql/__pycache__/selectable.cpython-34.pyc,, -sqlalchemy/__pycache__/exc.cpython-34.pyc,, -sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/interfaces.cpython-34.pyc,, -sqlalchemy/ext/declarative/__pycache__/clsregistry.cpython-34.pyc,, -sqlalchemy/connectors/__pycache__/__init__.cpython-34.pyc,, -sqlalchemy/engine/__pycache__/url.cpython-34.pyc,, -sqlalchemy/dialects/sqlite/__pycache__/base.cpython-34.pyc,, -sqlalchemy/sql/__pycache__/base.cpython-34.pyc,, -sqlalchemy/testing/__pycache__/util.cpython-34.pyc,, -sqlalchemy/ext/__pycache__/serializer.cpython-34.pyc,, -sqlalchemy/sql/__pycache__/dml.cpython-34.pyc,, -sqlalchemy/sql/__pycache__/functions.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/attributes.cpython-34.pyc,, -sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/strategy_options.cpython-34.pyc,, -sqlalchemy/testing/suite/__pycache__/__init__.cpython-34.pyc,, -sqlalchemy/sql/__pycache__/elements.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/deprecated_interfaces.cpython-34.pyc,, -sqlalchemy/__pycache__/interfaces.cpython-34.pyc,, -sqlalchemy/engine/__pycache__/interfaces.cpython-34.pyc,, -sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-34.pyc,, -sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-34.pyc,, -sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-34.pyc,, -sqlalchemy/__pycache__/pool.cpython-34.pyc,, -sqlalchemy/dialects/sybase/__pycache__/__init__.cpython-34.pyc,, -sqlalchemy/event/__pycache__/attr.cpython-34.pyc,, -sqlalchemy/dialects/firebird/__pycache__/__init__.cpython-34.pyc,, -sqlalchemy/sql/__pycache__/visitors.cpython-34.pyc,, -sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-34.pyc,, -sqlalchemy/sql/__pycache__/util.cpython-34.pyc,, -sqlalchemy/__pycache__/inspection.cpython-34.pyc,, -sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-34.pyc,, -sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/events.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/__init__.cpython-34.pyc,, -sqlalchemy/connectors/__pycache__/pyodbc.cpython-34.pyc,, -sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-34.pyc,, -sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-34.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-34.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-34.pyc,, -sqlalchemy/dialects/mssql/__pycache__/mxodbc.cpython-34.pyc,, -sqlalchemy/sql/__pycache__/schema.cpython-34.pyc,, -sqlalchemy/util/__pycache__/queue.cpython-34.pyc,, -sqlalchemy/sql/__pycache__/sqltypes.cpython-34.pyc,, -sqlalchemy/testing/__pycache__/assertsql.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/session.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/evaluator.cpython-34.pyc,, -sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-34.pyc,, -sqlalchemy/testing/plugin/__pycache__/__init__.cpython-34.pyc,, -sqlalchemy/util/__pycache__/compat.cpython-34.pyc,, -sqlalchemy/testing/__pycache__/entities.cpython-34.pyc,, -sqlalchemy/event/__pycache__/__init__.cpython-34.pyc,, -sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/scoping.cpython-34.pyc,, -sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-34.pyc,, -sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-34.pyc,, -sqlalchemy/testing/__pycache__/mock.cpython-34.pyc,, -sqlalchemy/sql/__pycache__/annotation.cpython-34.pyc,, -sqlalchemy/__pycache__/processors.cpython-34.pyc,, -sqlalchemy/engine/__pycache__/reflection.cpython-34.pyc,, -sqlalchemy/ext/__pycache__/baked.cpython-34.pyc,, -sqlalchemy/ext/declarative/__pycache__/api.cpython-34.pyc,, -sqlalchemy/connectors/__pycache__/zxJDBC.cpython-34.pyc,, -sqlalchemy/__pycache__/events.cpython-34.pyc,, sqlalchemy/orm/__pycache__/path_registry.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/dynamic.cpython-34.pyc,, -sqlalchemy/sql/__pycache__/__init__.cpython-34.pyc,, -sqlalchemy/sql/__pycache__/default_comparator.cpython-34.pyc,, -sqlalchemy/dialects/firebird/__pycache__/base.cpython-34.pyc,, -sqlalchemy/dialects/mysql/__pycache__/gaerdbms.cpython-34.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-34.pyc,, -sqlalchemy/ext/__pycache__/horizontal_shard.cpython-34.pyc,, -sqlalchemy/engine/__pycache__/base.cpython-34.pyc,, -sqlalchemy/ext/__pycache__/orderinglist.cpython-34.pyc,, -sqlalchemy/dialects/mssql/__pycache__/base.cpython-34.pyc,, -sqlalchemy/sql/__pycache__/ddl.cpython-34.pyc,, -sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-34.pyc,, -sqlalchemy/util/__pycache__/_collections.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/strategies.cpython-34.pyc,, -sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-34.pyc,, -sqlalchemy/sql/__pycache__/crud.cpython-34.pyc,, -sqlalchemy/testing/__pycache__/profiling.cpython-34.pyc,, -sqlalchemy/ext/__pycache__/mutable.cpython-34.pyc,, -sqlalchemy/engine/__pycache__/threadlocal.cpython-34.pyc,, -sqlalchemy/ext/__pycache__/compiler.cpython-34.pyc,, -sqlalchemy/ext/__pycache__/instrumentation.cpython-34.pyc,, -sqlalchemy/sql/__pycache__/compiler.cpython-34.pyc,, -sqlalchemy/engine/__pycache__/result.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/query.cpython-34.pyc,, -sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-34.pyc,, -sqlalchemy/event/__pycache__/api.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/identity.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/sync.cpython-34.pyc,, -sqlalchemy/dialects/__pycache__/__init__.cpython-34.pyc,, -sqlalchemy/util/__pycache__/deprecations.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/exc.cpython-34.pyc,, -sqlalchemy/testing/__pycache__/distutils_run.cpython-34.pyc,, -sqlalchemy/sql/__pycache__/naming.cpython-34.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/pypostgresql.cpython-34.pyc,, -sqlalchemy/ext/__pycache__/__init__.cpython-34.pyc,, -sqlalchemy/util/__pycache__/topological.cpython-34.pyc,, -sqlalchemy/dialects/mssql/__pycache__/zxjdbc.cpython-34.pyc,, -sqlalchemy/databases/__pycache__/__init__.cpython-34.pyc,, -sqlalchemy/testing/__pycache__/engines.cpython-34.pyc,, sqlalchemy/ext/__pycache__/associationproxy.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/properties.cpython-34.pyc,, -sqlalchemy/sql/__pycache__/operators.cpython-34.pyc,, -sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-34.pyc,, -sqlalchemy/testing/__pycache__/warnings.cpython-34.pyc,, -sqlalchemy/sql/__pycache__/type_api.cpython-34.pyc,, -sqlalchemy/util/__pycache__/langhelpers.cpython-34.pyc,, -sqlalchemy/testing/suite/__pycache__/test_types.cpython-34.pyc,, -sqlalchemy/event/__pycache__/base.cpython-34.pyc,, -sqlalchemy/ext/__pycache__/automap.cpython-34.pyc,, -sqlalchemy/event/__pycache__/legacy.cpython-34.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-34.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/zxjdbc.cpython-34.pyc,, -sqlalchemy/testing/__pycache__/runner.cpython-34.pyc,, -sqlalchemy/dialects/mssql/__pycache__/adodbapi.cpython-34.pyc,, -sqlalchemy/event/__pycache__/registry.cpython-34.pyc,, -sqlalchemy/testing/suite/__pycache__/test_results.cpython-34.pyc,, sqlalchemy/__pycache__/__init__.cpython-34.pyc,, -sqlalchemy/__pycache__/schema.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/mapper.cpython-34.pyc,, -sqlalchemy/dialects/sybase/__pycache__/pyodbc.cpython-34.pyc,, -sqlalchemy/testing/__pycache__/pickleable.cpython-34.pyc,, -sqlalchemy/dialects/sybase/__pycache__/pysybase.cpython-34.pyc,, -sqlalchemy/dialects/oracle/__pycache__/zxjdbc.cpython-34.pyc,, -sqlalchemy/testing/__pycache__/__init__.cpython-34.pyc,, -sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/dependency.cpython-34.pyc,, -sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-34.pyc,, -sqlalchemy/__pycache__/types.cpython-34.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-34.pyc,, -sqlalchemy/testing/__pycache__/config.cpython-34.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/base.cpython-34.pyc,, -sqlalchemy/testing/plugin/__pycache__/noseplugin.cpython-34.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-34.pyc,, -sqlalchemy/testing/__pycache__/exclusions.cpython-34.pyc,, -sqlalchemy/testing/__pycache__/schema.cpython-34.pyc,, -sqlalchemy/engine/__pycache__/default.cpython-34.pyc,, -sqlalchemy/engine/__pycache__/util.cpython-34.pyc,, -sqlalchemy/dialects/postgresql/__pycache__/constraints.cpython-34.pyc,, -sqlalchemy/dialects/mysql/__pycache__/zxjdbc.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/persistence.cpython-34.pyc,, -sqlalchemy/dialects/firebird/__pycache__/fdb.cpython-34.pyc,, -sqlalchemy/dialects/sybase/__pycache__/mxodbc.cpython-34.pyc,, -sqlalchemy/testing/__pycache__/provision.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/deprecated_interfaces.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/dynamic.cpython-34.pyc,, +sqlalchemy/event/__pycache__/legacy.cpython-34.pyc,, +sqlalchemy/event/__pycache__/api.cpython-34.pyc,, sqlalchemy/dialects/__pycache__/postgres.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/collections.cpython-34.pyc,, -sqlalchemy/testing/__pycache__/requirements.cpython-34.pyc,, -sqlalchemy/ext/declarative/__pycache__/base.cpython-34.pyc,, +sqlalchemy/testing/__pycache__/profiling.cpython-34.pyc,, +sqlalchemy/dialects/firebird/__pycache__/__init__.cpython-34.pyc,, +sqlalchemy/dialects/mysql/__pycache__/gaerdbms.cpython-34.pyc,, +sqlalchemy/dialects/mysql/__pycache__/oursql.cpython-34.pyc,, +sqlalchemy/testing/suite/__pycache__/test_types.cpython-34.pyc,, +sqlalchemy/event/__pycache__/registry.cpython-34.pyc,, +sqlalchemy/testing/__pycache__/distutils_run.cpython-34.pyc,, +sqlalchemy/dialects/mssql/__pycache__/mxodbc.cpython-34.pyc,, +sqlalchemy/engine/__pycache__/base.cpython-34.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/pypostgresql.cpython-34.pyc,, +sqlalchemy/util/__pycache__/__init__.cpython-34.pyc,, +sqlalchemy/util/__pycache__/topological.cpython-34.pyc,, +sqlalchemy/dialects/firebird/__pycache__/kinterbasdb.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/persistence.cpython-34.pyc,, +sqlalchemy/connectors/__pycache__/mxodbc.cpython-34.pyc,, +sqlalchemy/dialects/mssql/__pycache__/base.cpython-34.pyc,, +sqlalchemy/connectors/__pycache__/__init__.cpython-34.pyc,, +sqlalchemy/sql/__pycache__/elements.cpython-34.pyc,, +sqlalchemy/testing/suite/__pycache__/__init__.cpython-34.pyc,, +sqlalchemy/dialects/__pycache__/__init__.cpython-34.pyc,, +sqlalchemy/util/__pycache__/langhelpers.cpython-34.pyc,, +sqlalchemy/testing/__pycache__/entities.cpython-34.pyc,, +sqlalchemy/engine/__pycache__/interfaces.cpython-34.pyc,, +sqlalchemy/sql/__pycache__/schema.cpython-34.pyc,, +sqlalchemy/ext/__pycache__/baked.cpython-34.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/zxjdbc.cpython-34.pyc,, sqlalchemy/orm/__pycache__/base.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/instrumentation.cpython-34.pyc,, -sqlalchemy/__pycache__/log.cpython-34.pyc,, -sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/loading.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/state.cpython-34.pyc,, -sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-34.pyc,, -sqlalchemy/dialects/oracle/__pycache__/base.cpython-34.pyc,, -sqlalchemy/orm/__pycache__/util.cpython-34.pyc,, +sqlalchemy/connectors/__pycache__/pyodbc.cpython-34.pyc,, +sqlalchemy/sql/__pycache__/annotation.cpython-34.pyc,, +sqlalchemy/dialects/oracle/__pycache__/zxjdbc.cpython-34.pyc,, +sqlalchemy/testing/__pycache__/runner.cpython-34.pyc,, +sqlalchemy/testing/__pycache__/schema.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/relationships.cpython-34.pyc,, +sqlalchemy/__pycache__/pool.cpython-34.pyc,, +sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-34.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-34.pyc,, +sqlalchemy/sql/__pycache__/ddl.cpython-34.pyc,, +sqlalchemy/dialects/sybase/__pycache__/pyodbc.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/dependency.cpython-34.pyc,, +sqlalchemy/sql/__pycache__/visitors.cpython-34.pyc,, +sqlalchemy/testing/__pycache__/provision.cpython-34.pyc,, sqlalchemy/dialects/postgresql/__pycache__/json.cpython-34.pyc,, -sqlalchemy/dialects/mysql/__pycache__/base.cpython-34.pyc,, +sqlalchemy/sql/__pycache__/selectable.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/exc.cpython-34.pyc,, +sqlalchemy/ext/declarative/__pycache__/clsregistry.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/interfaces.cpython-34.pyc,, +sqlalchemy/testing/__pycache__/assertions.cpython-34.pyc,, +sqlalchemy/ext/__pycache__/compiler.cpython-34.pyc,, +sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-34.pyc,, +sqlalchemy/testing/suite/__pycache__/test_select.cpython-34.pyc,, +sqlalchemy/dialects/firebird/__pycache__/fdb.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/unitofwork.cpython-34.pyc,, +sqlalchemy/testing/__pycache__/util.cpython-34.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-34.pyc,, +sqlalchemy/__pycache__/interfaces.cpython-34.pyc,, +sqlalchemy/engine/__pycache__/util.cpython-34.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-34.pyc,, +sqlalchemy/__pycache__/schema.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/sync.cpython-34.pyc,, +sqlalchemy/__pycache__/processors.cpython-34.pyc,, +sqlalchemy/dialects/firebird/__pycache__/base.cpython-34.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-34.pyc,, +sqlalchemy/databases/__pycache__/__init__.cpython-34.pyc,, +sqlalchemy/sql/__pycache__/sqltypes.cpython-34.pyc,, +sqlalchemy/dialects/oracle/__pycache__/base.cpython-34.pyc,, +sqlalchemy/sql/__pycache__/functions.cpython-34.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-34.pyc,, +sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-34.pyc,, +sqlalchemy/ext/__pycache__/automap.cpython-34.pyc,, +sqlalchemy/testing/__pycache__/mock.cpython-34.pyc,, +sqlalchemy/testing/__pycache__/requirements.cpython-34.pyc,, +sqlalchemy/testing/suite/__pycache__/test_results.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/__init__.cpython-34.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/base.cpython-34.pyc,, +sqlalchemy/util/__pycache__/deprecations.cpython-34.pyc,, +sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/state.cpython-34.pyc,, +sqlalchemy/event/__pycache__/base.cpython-34.pyc,, +sqlalchemy/__pycache__/log.cpython-34.pyc,, +sqlalchemy/connectors/__pycache__/zxJDBC.cpython-34.pyc,, +sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/identity.cpython-34.pyc,, +sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/attributes.cpython-34.pyc,, +sqlalchemy/ext/declarative/__pycache__/__init__.cpython-34.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/base.cpython-34.pyc,, +sqlalchemy/ext/__pycache__/serializer.cpython-34.pyc,, +sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/properties.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/mapper.cpython-34.pyc,, +sqlalchemy/testing/__pycache__/fixtures.cpython-34.pyc,, +sqlalchemy/sql/__pycache__/base.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/events.cpython-34.pyc,, +sqlalchemy/dialects/mysql/__pycache__/zxjdbc.cpython-34.pyc,, +sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/strategy_options.cpython-34.pyc,, +sqlalchemy/dialects/sybase/__pycache__/mxodbc.cpython-34.pyc,, +sqlalchemy/util/__pycache__/compat.cpython-34.pyc,, +sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-34.pyc,, +sqlalchemy/sql/__pycache__/compiler.cpython-34.pyc,, +sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-34.pyc,, +sqlalchemy/__pycache__/inspection.cpython-34.pyc,, +sqlalchemy/testing/plugin/__pycache__/__init__.cpython-34.pyc,, +sqlalchemy/dialects/mssql/__pycache__/adodbapi.cpython-34.pyc,, +sqlalchemy/engine/__pycache__/url.cpython-34.pyc,, +sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-34.pyc,, +sqlalchemy/engine/__pycache__/result.cpython-34.pyc,, +sqlalchemy/testing/suite/__pycache__/test_insert.cpython-34.pyc,, +sqlalchemy/event/__pycache__/__init__.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/scoping.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/instrumentation.cpython-34.pyc,, sqlalchemy/dialects/sybase/__pycache__/base.cpython-34.pyc,, +sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-34.pyc,, +sqlalchemy/testing/plugin/__pycache__/noseplugin.cpython-34.pyc,, +sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-34.pyc,, +sqlalchemy/testing/__pycache__/exclusions.cpython-34.pyc,, +sqlalchemy/ext/__pycache__/mutable.cpython-34.pyc,, +sqlalchemy/sql/__pycache__/default_comparator.cpython-34.pyc,, +sqlalchemy/engine/__pycache__/default.cpython-34.pyc,, +sqlalchemy/__pycache__/types.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/session.cpython-34.pyc,, +sqlalchemy/util/__pycache__/_collections.cpython-34.pyc,, +sqlalchemy/engine/__pycache__/reflection.cpython-34.pyc,, +sqlalchemy/dialects/sybase/__pycache__/pysybase.cpython-34.pyc,, +sqlalchemy/testing/__pycache__/assertsql.cpython-34.pyc,, +sqlalchemy/testing/__pycache__/replay_fixture.cpython-34.pyc,, +sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-34.pyc,, +sqlalchemy/testing/__pycache__/config.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/strategies.cpython-34.pyc,, +sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/util.cpython-34.pyc,, +sqlalchemy/dialects/mysql/__pycache__/base.cpython-34.pyc,, +sqlalchemy/sql/__pycache__/crud.cpython-34.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-34.pyc,, +sqlalchemy/engine/__pycache__/__init__.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/loading.cpython-34.pyc,, +sqlalchemy/testing/__pycache__/__init__.cpython-34.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-34.pyc,, +sqlalchemy/sql/__pycache__/operators.cpython-34.pyc,, +sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-34.pyc,, +sqlalchemy/testing/__pycache__/pickleable.cpython-34.pyc,, +sqlalchemy/sql/__pycache__/expression.cpython-34.pyc,, +sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-34.pyc,, +sqlalchemy/sql/__pycache__/naming.cpython-34.pyc,, +sqlalchemy/ext/__pycache__/horizontal_shard.cpython-34.pyc,, +sqlalchemy/dialects/sybase/__pycache__/__init__.cpython-34.pyc,, +sqlalchemy/engine/__pycache__/threadlocal.cpython-34.pyc,, +sqlalchemy/ext/declarative/__pycache__/api.cpython-34.pyc,, +sqlalchemy/testing/__pycache__/warnings.cpython-34.pyc,, +sqlalchemy/sql/__pycache__/util.cpython-34.pyc,, +sqlalchemy/sql/__pycache__/dml.cpython-34.pyc,, +sqlalchemy/ext/__pycache__/__init__.cpython-34.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/collections.cpython-34.pyc,, +sqlalchemy/sql/__pycache__/__init__.cpython-34.pyc,, +sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-34.pyc,, +sqlalchemy/ext/__pycache__/orderinglist.cpython-34.pyc,, +sqlalchemy/dialects/postgresql/__pycache__/constraints.cpython-34.pyc,, +sqlalchemy/__pycache__/exc.cpython-34.pyc,, +sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-34.pyc,, +sqlalchemy/engine/__pycache__/strategies.cpython-34.pyc,, +sqlalchemy/ext/declarative/__pycache__/base.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/evaluator.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/query.cpython-34.pyc,, +sqlalchemy/dialects/mssql/__pycache__/zxjdbc.cpython-34.pyc,, +sqlalchemy/orm/__pycache__/descriptor_props.cpython-34.pyc,, +sqlalchemy/__pycache__/events.cpython-34.pyc,, +sqlalchemy/sql/__pycache__/type_api.cpython-34.pyc,, +sqlalchemy/util/__pycache__/queue.cpython-34.pyc,, +sqlalchemy/ext/__pycache__/hybrid.cpython-34.pyc,, +sqlalchemy/event/__pycache__/attr.cpython-34.pyc,, +sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-34.pyc,, +sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-34.pyc,, +sqlalchemy/ext/__pycache__/instrumentation.cpython-34.pyc,, +sqlalchemy/testing/__pycache__/engines.cpython-34.pyc,, diff --git a/lib/python3.4/site-packages/SQLAlchemy-1.0.12.dist-info/WHEEL b/lib/python3.4/site-packages/SQLAlchemy-1.0.12.dist-info/WHEEL index db40973..1fdf70f 100644 --- a/lib/python3.4/site-packages/SQLAlchemy-1.0.12.dist-info/WHEEL +++ b/lib/python3.4/site-packages/SQLAlchemy-1.0.12.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.29.0) +Generator: bdist_wheel (0.30.0) Root-Is-Purelib: false Tag: cp34-cp34m-linux_x86_64 diff --git a/lib/python3.4/site-packages/SQLAlchemy-1.0.12.dist-info/metadata.json b/lib/python3.4/site-packages/SQLAlchemy-1.0.12.dist-info/metadata.json index ef57ea4..a446465 100644 --- a/lib/python3.4/site-packages/SQLAlchemy-1.0.12.dist-info/metadata.json +++ b/lib/python3.4/site-packages/SQLAlchemy-1.0.12.dist-info/metadata.json @@ -1 +1 @@ -{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: Jython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Database :: Front-Ends", "Operating System :: OS Independent"], "extensions": {"python.details": {"contacts": [{"email": "mike_mp@zzzcomputing.com", "name": "Mike Bayer", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "http://www.sqlalchemy.org"}}}, "generator": "bdist_wheel (0.29.0)", "license": "MIT License", "metadata_version": "2.0", "name": "SQLAlchemy", "summary": "Database Abstraction Library", "test_requires": [{"requires": ["mock", "pytest (>=2.5.2)", "pytest-xdist"]}], "version": "1.0.12"} \ No newline at end of file +{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: Jython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Database :: Front-Ends", "Operating System :: OS Independent"], "description_content_type": "UNKNOWN", "extensions": {"python.details": {"contacts": [{"email": "mike_mp@zzzcomputing.com", "name": "Mike Bayer", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "http://www.sqlalchemy.org"}}}, "generator": "bdist_wheel (0.30.0)", "license": "MIT License", "metadata_version": "2.0", "name": "SQLAlchemy", "summary": "Database Abstraction Library", "test_requires": [{"requires": ["mock", "pytest (>=2.5.2)", "pytest-xdist"]}], "version": "1.0.12"} \ No newline at end of file diff --git a/lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/DESCRIPTION.rst b/lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/DESCRIPTION.rst deleted file mode 100644 index c6b6a1c..0000000 --- a/lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/DESCRIPTION.rst +++ /dev/null @@ -1,238 +0,0 @@ -=============================== -Installing and Using Setuptools -=============================== - -.. contents:: **Table of Contents** - - -`Change History `_. - -------------------------- -Installation Instructions -------------------------- - -The recommended way to bootstrap setuptools on any system is to download -`ez_setup.py`_ and run it using the target Python environment. Different -operating systems have different recommended techniques to accomplish this -basic routine, so below are some examples to get you started. - -Setuptools requires Python 2.6 or later. To install setuptools -on Python 2.4 or Python 2.5, use the `bootstrap script for Setuptools 1.x -`_. - -The link provided to ez_setup.py is a bookmark to bootstrap script for the -latest known stable release. - -.. _ez_setup.py: https://bootstrap.pypa.io/ez_setup.py - -Windows (Powershell 3 or later) -=============================== - -For best results, uninstall previous versions FIRST (see `Uninstalling`_). - -Using Windows 8 (which includes PowerShell 3) or earlier versions of Windows -with PowerShell 3 installed, it's possible to install with one simple -Powershell command. Start up Powershell and paste this command:: - - > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python - - -You must start the Powershell with Administrative privileges or you may choose -to install a user-local installation:: - - > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python - --user - -If you have Python 3.3 or later, you can use the ``py`` command to install to -different Python versions. For example, to install to Python 3.3 if you have -Python 2.7 installed:: - - > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | py -3 - - -The recommended way to install setuptools on Windows is to download -`ez_setup.py`_ and run it. The script will download the appropriate -distribution file and install it for you. - -Once installation is complete, you will find an ``easy_install`` program in -your Python ``Scripts`` subdirectory. For simple invocation and best results, -add this directory to your ``PATH`` environment variable, if it is not already -present. If you did a user-local install, the ``Scripts`` subdirectory is -``$env:APPDATA\Python\Scripts``. - - -Windows (simplified) -==================== - -For Windows without PowerShell 3 or for installation without a command-line, -download `ez_setup.py`_ using your preferred web browser or other technique -and "run" that file. - - -Unix (wget) -=========== - -Most Linux distributions come with wget. - -Download `ez_setup.py`_ and run it using the target Python version. The script -will download the appropriate version and install it for you:: - - > wget https://bootstrap.pypa.io/ez_setup.py -O - | python - -Note that you will may need to invoke the command with superuser privileges to -install to the system Python:: - - > wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python - -Alternatively, Setuptools may be installed to a user-local path:: - - > wget https://bootstrap.pypa.io/ez_setup.py -O - | python - --user - -Note that on some older systems (noted on Debian 6 and CentOS 5 installations), -`wget` may refuse to download `ez_setup.py`, complaining that the certificate common name `*.c.ssl.fastly.net` -does not match the host name `bootstrap.pypa.io`. In addition, the `ez_setup.py` script may then encounter similar problems using -`wget` internally to download `setuptools-x.y.zip`, complaining that the certificate common name of `www.python.org` does not match the -host name `pypi.python.org`. Those are known issues, related to a bug in the older versions of `wget` -(see `Issue 59 `_). If you happen to encounter them, -install Setuptools as follows:: - - > wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py - > python ez_setup.py --insecure - - -Unix including Mac OS X (curl) -============================== - -If your system has curl installed, follow the ``wget`` instructions but -replace ``wget`` with ``curl`` and ``-O`` with ``-o``. For example:: - - > curl https://bootstrap.pypa.io/ez_setup.py -o - | python - - -Advanced Installation -===================== - -For more advanced installation options, such as installing to custom -locations or prefixes, download and extract the source -tarball from `Setuptools on PyPI `_ -and run setup.py with any supported distutils and Setuptools options. -For example:: - - setuptools-x.x$ python setup.py install --prefix=/opt/setuptools - -Use ``--help`` to get a full options list, but we recommend consulting -the `EasyInstall manual`_ for detailed instructions, especially `the section -on custom installation locations`_. - -.. _EasyInstall manual: https://pythonhosted.org/setuptools/EasyInstall -.. _the section on custom installation locations: https://pythonhosted.org/setuptools/EasyInstall#custom-installation-locations - - -Downloads -========= - -All setuptools downloads can be found at `the project's home page in the Python -Package Index`_. Scroll to the very bottom of the page to find the links. - -.. _the project's home page in the Python Package Index: https://pypi.python.org/pypi/setuptools - -In addition to the PyPI downloads, the development version of ``setuptools`` -is available from the `Bitbucket repo`_, and in-development versions of the -`0.6 branch`_ are available as well. - -.. _Bitbucket repo: https://bitbucket.org/pypa/setuptools/get/default.tar.gz#egg=setuptools-dev -.. _0.6 branch: http://svn.python.org/projects/sandbox/branches/setuptools-0.6/#egg=setuptools-dev06 - -Uninstalling -============ - -On Windows, if Setuptools was installed using an ``.exe`` or ``.msi`` -installer, simply use the uninstall feature of "Add/Remove Programs" in the -Control Panel. - -Otherwise, to uninstall Setuptools or Distribute, regardless of the Python -version, delete all ``setuptools*`` and ``distribute*`` files and -directories from your system's ``site-packages`` directory -(and any other ``sys.path`` directories) FIRST. - -If you are upgrading or otherwise plan to re-install Setuptools or Distribute, -nothing further needs to be done. If you want to completely remove Setuptools, -you may also want to remove the 'easy_install' and 'easy_install-x.x' scripts -and associated executables installed to the Python scripts directory. - --------------------------------- -Using Setuptools and EasyInstall --------------------------------- - -Here are some of the available manuals, tutorials, and other resources for -learning about Setuptools, Python Eggs, and EasyInstall: - -* `The EasyInstall user's guide and reference manual`_ -* `The setuptools Developer's Guide`_ -* `The pkg_resources API reference`_ -* `The Internal Structure of Python Eggs`_ - -Questions, comments, and bug reports should be directed to the `distutils-sig -mailing list`_. If you have written (or know of) any tutorials, documentation, -plug-ins, or other resources for setuptools users, please let us know about -them there, so this reference list can be updated. If you have working, -*tested* patches to correct problems or add features, you may submit them to -the `setuptools bug tracker`_. - -.. _setuptools bug tracker: https://bitbucket.org/pypa/setuptools/issues -.. _The Internal Structure of Python Eggs: https://pythonhosted.org/setuptools/formats.html -.. _The setuptools Developer's Guide: https://pythonhosted.org/setuptools/setuptools.html -.. _The pkg_resources API reference: https://pythonhosted.org/setuptools/pkg_resources.html -.. _The EasyInstall user's guide and reference manual: https://pythonhosted.org/setuptools/easy_install.html -.. _distutils-sig mailing list: http://mail.python.org/pipermail/distutils-sig/ - - -------- -Credits -------- - -* The original design for the ``.egg`` format and the ``pkg_resources`` API was - co-created by Phillip Eby and Bob Ippolito. Bob also implemented the first - version of ``pkg_resources``, and supplied the OS X operating system version - compatibility algorithm. - -* Ian Bicking implemented many early "creature comfort" features of - easy_install, including support for downloading via Sourceforge and - Subversion repositories. Ian's comments on the Web-SIG about WSGI - application deployment also inspired the concept of "entry points" in eggs, - and he has given talks at PyCon and elsewhere to inform and educate the - community about eggs and setuptools. - -* Jim Fulton contributed time and effort to build automated tests of various - aspects of ``easy_install``, and supplied the doctests for the command-line - ``.exe`` wrappers on Windows. - -* Phillip J. Eby is the seminal author of setuptools, and - first proposed the idea of an importable binary distribution format for - Python application plug-ins. - -* Significant parts of the implementation of setuptools were funded by the Open - Source Applications Foundation, to provide a plug-in infrastructure for the - Chandler PIM application. In addition, many OSAF staffers (such as Mike - "Code Bear" Taylor) contributed their time and stress as guinea pigs for the - use of eggs and setuptools, even before eggs were "cool". (Thanks, guys!) - -* Tarek Ziadé is the principal author of the Distribute fork, which - re-invigorated the community on the project, encouraged renewed innovation, - and addressed many defects. - -* Since the merge with Distribute, Jason R. Coombs is the - maintainer of setuptools. The project is maintained in coordination with - the Python Packaging Authority (PyPA) and the larger Python community. - -.. _files: - - ---------------- -Code of Conduct ---------------- - -Everyone interacting in the setuptools project's codebases, issue trackers, -chat rooms, and mailing lists is expected to follow the -`PyPA Code of Conduct`_. - -.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ - - diff --git a/lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/METADATA b/lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/METADATA deleted file mode 100644 index 2a37585..0000000 --- a/lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/METADATA +++ /dev/null @@ -1,263 +0,0 @@ -Metadata-Version: 2.0 -Name: setuptools -Version: 20.1.1 -Summary: Easily download, build, install, upgrade, and uninstall Python packages -Home-page: https://bitbucket.org/pypa/setuptools -Author: Python Packaging Authority -Author-email: distutils-sig@python.org -License: UNKNOWN -Keywords: CPAN PyPI distutils eggs package management -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: System :: Archiving :: Packaging -Classifier: Topic :: System :: Systems Administration -Classifier: Topic :: Utilities - -=============================== -Installing and Using Setuptools -=============================== - -.. contents:: **Table of Contents** - - -`Change History `_. - -------------------------- -Installation Instructions -------------------------- - -The recommended way to bootstrap setuptools on any system is to download -`ez_setup.py`_ and run it using the target Python environment. Different -operating systems have different recommended techniques to accomplish this -basic routine, so below are some examples to get you started. - -Setuptools requires Python 2.6 or later. To install setuptools -on Python 2.4 or Python 2.5, use the `bootstrap script for Setuptools 1.x -`_. - -The link provided to ez_setup.py is a bookmark to bootstrap script for the -latest known stable release. - -.. _ez_setup.py: https://bootstrap.pypa.io/ez_setup.py - -Windows (Powershell 3 or later) -=============================== - -For best results, uninstall previous versions FIRST (see `Uninstalling`_). - -Using Windows 8 (which includes PowerShell 3) or earlier versions of Windows -with PowerShell 3 installed, it's possible to install with one simple -Powershell command. Start up Powershell and paste this command:: - - > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python - - -You must start the Powershell with Administrative privileges or you may choose -to install a user-local installation:: - - > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python - --user - -If you have Python 3.3 or later, you can use the ``py`` command to install to -different Python versions. For example, to install to Python 3.3 if you have -Python 2.7 installed:: - - > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | py -3 - - -The recommended way to install setuptools on Windows is to download -`ez_setup.py`_ and run it. The script will download the appropriate -distribution file and install it for you. - -Once installation is complete, you will find an ``easy_install`` program in -your Python ``Scripts`` subdirectory. For simple invocation and best results, -add this directory to your ``PATH`` environment variable, if it is not already -present. If you did a user-local install, the ``Scripts`` subdirectory is -``$env:APPDATA\Python\Scripts``. - - -Windows (simplified) -==================== - -For Windows without PowerShell 3 or for installation without a command-line, -download `ez_setup.py`_ using your preferred web browser or other technique -and "run" that file. - - -Unix (wget) -=========== - -Most Linux distributions come with wget. - -Download `ez_setup.py`_ and run it using the target Python version. The script -will download the appropriate version and install it for you:: - - > wget https://bootstrap.pypa.io/ez_setup.py -O - | python - -Note that you will may need to invoke the command with superuser privileges to -install to the system Python:: - - > wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python - -Alternatively, Setuptools may be installed to a user-local path:: - - > wget https://bootstrap.pypa.io/ez_setup.py -O - | python - --user - -Note that on some older systems (noted on Debian 6 and CentOS 5 installations), -`wget` may refuse to download `ez_setup.py`, complaining that the certificate common name `*.c.ssl.fastly.net` -does not match the host name `bootstrap.pypa.io`. In addition, the `ez_setup.py` script may then encounter similar problems using -`wget` internally to download `setuptools-x.y.zip`, complaining that the certificate common name of `www.python.org` does not match the -host name `pypi.python.org`. Those are known issues, related to a bug in the older versions of `wget` -(see `Issue 59 `_). If you happen to encounter them, -install Setuptools as follows:: - - > wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py - > python ez_setup.py --insecure - - -Unix including Mac OS X (curl) -============================== - -If your system has curl installed, follow the ``wget`` instructions but -replace ``wget`` with ``curl`` and ``-O`` with ``-o``. For example:: - - > curl https://bootstrap.pypa.io/ez_setup.py -o - | python - - -Advanced Installation -===================== - -For more advanced installation options, such as installing to custom -locations or prefixes, download and extract the source -tarball from `Setuptools on PyPI `_ -and run setup.py with any supported distutils and Setuptools options. -For example:: - - setuptools-x.x$ python setup.py install --prefix=/opt/setuptools - -Use ``--help`` to get a full options list, but we recommend consulting -the `EasyInstall manual`_ for detailed instructions, especially `the section -on custom installation locations`_. - -.. _EasyInstall manual: https://pythonhosted.org/setuptools/EasyInstall -.. _the section on custom installation locations: https://pythonhosted.org/setuptools/EasyInstall#custom-installation-locations - - -Downloads -========= - -All setuptools downloads can be found at `the project's home page in the Python -Package Index`_. Scroll to the very bottom of the page to find the links. - -.. _the project's home page in the Python Package Index: https://pypi.python.org/pypi/setuptools - -In addition to the PyPI downloads, the development version of ``setuptools`` -is available from the `Bitbucket repo`_, and in-development versions of the -`0.6 branch`_ are available as well. - -.. _Bitbucket repo: https://bitbucket.org/pypa/setuptools/get/default.tar.gz#egg=setuptools-dev -.. _0.6 branch: http://svn.python.org/projects/sandbox/branches/setuptools-0.6/#egg=setuptools-dev06 - -Uninstalling -============ - -On Windows, if Setuptools was installed using an ``.exe`` or ``.msi`` -installer, simply use the uninstall feature of "Add/Remove Programs" in the -Control Panel. - -Otherwise, to uninstall Setuptools or Distribute, regardless of the Python -version, delete all ``setuptools*`` and ``distribute*`` files and -directories from your system's ``site-packages`` directory -(and any other ``sys.path`` directories) FIRST. - -If you are upgrading or otherwise plan to re-install Setuptools or Distribute, -nothing further needs to be done. If you want to completely remove Setuptools, -you may also want to remove the 'easy_install' and 'easy_install-x.x' scripts -and associated executables installed to the Python scripts directory. - --------------------------------- -Using Setuptools and EasyInstall --------------------------------- - -Here are some of the available manuals, tutorials, and other resources for -learning about Setuptools, Python Eggs, and EasyInstall: - -* `The EasyInstall user's guide and reference manual`_ -* `The setuptools Developer's Guide`_ -* `The pkg_resources API reference`_ -* `The Internal Structure of Python Eggs`_ - -Questions, comments, and bug reports should be directed to the `distutils-sig -mailing list`_. If you have written (or know of) any tutorials, documentation, -plug-ins, or other resources for setuptools users, please let us know about -them there, so this reference list can be updated. If you have working, -*tested* patches to correct problems or add features, you may submit them to -the `setuptools bug tracker`_. - -.. _setuptools bug tracker: https://bitbucket.org/pypa/setuptools/issues -.. _The Internal Structure of Python Eggs: https://pythonhosted.org/setuptools/formats.html -.. _The setuptools Developer's Guide: https://pythonhosted.org/setuptools/setuptools.html -.. _The pkg_resources API reference: https://pythonhosted.org/setuptools/pkg_resources.html -.. _The EasyInstall user's guide and reference manual: https://pythonhosted.org/setuptools/easy_install.html -.. _distutils-sig mailing list: http://mail.python.org/pipermail/distutils-sig/ - - -------- -Credits -------- - -* The original design for the ``.egg`` format and the ``pkg_resources`` API was - co-created by Phillip Eby and Bob Ippolito. Bob also implemented the first - version of ``pkg_resources``, and supplied the OS X operating system version - compatibility algorithm. - -* Ian Bicking implemented many early "creature comfort" features of - easy_install, including support for downloading via Sourceforge and - Subversion repositories. Ian's comments on the Web-SIG about WSGI - application deployment also inspired the concept of "entry points" in eggs, - and he has given talks at PyCon and elsewhere to inform and educate the - community about eggs and setuptools. - -* Jim Fulton contributed time and effort to build automated tests of various - aspects of ``easy_install``, and supplied the doctests for the command-line - ``.exe`` wrappers on Windows. - -* Phillip J. Eby is the seminal author of setuptools, and - first proposed the idea of an importable binary distribution format for - Python application plug-ins. - -* Significant parts of the implementation of setuptools were funded by the Open - Source Applications Foundation, to provide a plug-in infrastructure for the - Chandler PIM application. In addition, many OSAF staffers (such as Mike - "Code Bear" Taylor) contributed their time and stress as guinea pigs for the - use of eggs and setuptools, even before eggs were "cool". (Thanks, guys!) - -* Tarek Ziadé is the principal author of the Distribute fork, which - re-invigorated the community on the project, encouraged renewed innovation, - and addressed many defects. - -* Since the merge with Distribute, Jason R. Coombs is the - maintainer of setuptools. The project is maintained in coordination with - the Python Packaging Authority (PyPA) and the larger Python community. - -.. _files: - - ---------------- -Code of Conduct ---------------- - -Everyone interacting in the setuptools project's codebases, issue trackers, -chat rooms, and mailing lists is expected to follow the -`PyPA Code of Conduct`_. - -.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ - - diff --git a/lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/RECORD b/lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/RECORD deleted file mode 100644 index 044e982..0000000 --- a/lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/RECORD +++ /dev/null @@ -1,104 +0,0 @@ -easy_install.py,sha256=MDC9vt5AxDsXX5qcKlBz2TnW6Tpuv_AobnfhCJ9X3PM,126 -_markerlib/__init__.py,sha256=GSmhZqvAitLJHhSgtqqusfq2nJ_ClP3oy3Lm0uZLIsU,552 -_markerlib/markers.py,sha256=YuFp0-osufFIoqnzG3L0Z2fDCx4Vln3VUDeXJ2DA_1I,3979 -_markerlib-0.0.0.dist-info/DESCRIPTION.rst,sha256=MDsJej8DPV2OKpAKpu74g-2xksRd-uGTeZn4W7D1dnI,9940 -_markerlib-0.0.0.dist-info/METADATA,sha256=l8LCWR8HLdKmOz1QMU2JQREbM9o4dCsMPkBdBSi_Jgo,10997 -_markerlib-0.0.0.dist-info/RECORD,, -_markerlib-0.0.0.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 -_markerlib-0.0.0.dist-info/dependency_links.txt,sha256=oUNXJEArClXFiSSvfFwUKY8TYjeIXhuFfCpXn5K0DCE,226 -_markerlib-0.0.0.dist-info/entry_points.txt,sha256=S6yRfyEABPIKq4cNMNO_7LHXzFVZW-exLSrKSI6kgNU,2779 -_markerlib-0.0.0.dist-info/metadata.json,sha256=OwUAZgU-PBMGwfXh2QKg7ec1Kh9aGVfWnOB5mrc48HA,4242 -_markerlib-0.0.0.dist-info/top_level.txt,sha256=7780fzudMJkykiTcIrAQ8m8Lll6kot3EEePye3VJgEE,49 -_markerlib-0.0.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 -setuptools/__init__.py,sha256=WEGb6BRGN2dz3eJTbNRUfInUAhb6_OZJyYAndPGJm6w,5440 -setuptools/archive_util.py,sha256=N30WE5ZQjkytzhAodAXw4FkK-9J5AP1ChrClHnZthOA,6609 -setuptools/depends.py,sha256=WyJIhjIX7D5-JpGSnMAPHEoDcVPQxaO0405keTQT6jM,6418 -setuptools/dist.py,sha256=txOleyyt2xCSTkUjCGW4MYZB8a1xsbC8MulDhSnoivQ,35701 -setuptools/extension.py,sha256=YvsyGHWVWzhNOXMHU239FR14wxw2WwdMLLzWsRP6_IY,1694 -setuptools/launch.py,sha256=hP3qZxDNu5Hf9C-VAkEP4IC_YYfR1XfxMTj6EguxxCg,730 -setuptools/lib2to3_ex.py,sha256=6jPF9sJuHiz0cyg4cwIBLl2VMAxcl3GYSZwWAOuJplU,1998 -setuptools/msvc9_support.py,sha256=fo2vjb-dna1SEuHezQCTuelCo6XFBv5cqaI56ABJ1vw,2187 -setuptools/package_index.py,sha256=T6tZGPHApup6Gl3kz1sCLtY7kmMUXLBKweSAORYS2Qc,39490 -setuptools/py26compat.py,sha256=1Vvuf-hj5bTM3OAXv6vgJQImulne12ann053caOgikU,481 -setuptools/py27compat.py,sha256=CGj-jZcFgHUkrEdLvArkxHj96tAaMbG2-yJtUVU7QVI,306 -setuptools/py31compat.py,sha256=cqYSVBd2pxvKl75185z40htfEr6EKC29KvSBiSoqHOA,1636 -setuptools/sandbox.py,sha256=tuMRu_8R0_w6Qer9VqDiOTqKy1qr_GjHi-2QAg7TMz0,14210 -setuptools/script (dev).tmpl,sha256=f7MR17dTkzaqkCMSVseyOCMVrPVSMdmTQsaB8cZzfuI,201 -setuptools/script.tmpl,sha256=WGTt5piezO27c-Dbx6l5Q4T3Ff20A5z7872hv3aAhYY,138 -setuptools/site-patch.py,sha256=K-0-cAx36mX_PG-qPZwosG9ZLCliRjquKQ4nHiJvvzg,2389 -setuptools/ssl_support.py,sha256=tAFeeyFPVle_GgarPkNrdfnCJgP9PyN_QYGXTgypoyc,8119 -setuptools/unicode_utils.py,sha256=8zVyrL_MFc6P5AmErs21rr7z-3N1pZ_NkOcDC7BPElU,995 -setuptools/utils.py,sha256=08Z7mt-9mvrx-XvmS5EyKoRn2lxNTlgFsUwBU3Eq9JQ,293 -setuptools/version.py,sha256=E3F8rAlTgCNpmTTY2YGy4T_1iQn3gKsePB7TVIcObu0,23 -setuptools/windows_support.py,sha256=5GrfqSP2-dLGJoZTq2g6dCKkyQxxa2n5IQiXlJCoYEE,714 -setuptools/command/__init__.py,sha256=1AM3hv_zCixE7kTXA-onWfK_2KF8GC8fUw3WSxzi5Fg,564 -setuptools/command/alias.py,sha256=KjpE0sz_SDIHv3fpZcIQK-sCkJz-SrC6Gmug6b9Nkc8,2426 -setuptools/command/bdist_egg.py,sha256=Km4CsGbevhvej6kKEfvTYxfkPoQijUyXmImNifrO4Tg,17184 -setuptools/command/bdist_rpm.py,sha256=B7l0TnzCGb-0nLlm6rS00jWLkojASwVmdhW2w5Qz_Ak,1508 -setuptools/command/bdist_wininst.py,sha256=_6dz3lpB1tY200LxKPLM7qgwTCceOMgaWFF-jW2-pm0,637 -setuptools/command/build_ext.py,sha256=pkQ8xp3YPVGGLkGv-SvfxC_GqFpboph1AFEoMFOgQMo,11964 -setuptools/command/build_py.py,sha256=HvJ88JuougDccaowYlfMV12kYtd0GLahg2DR2vQRqL4,7983 -setuptools/command/develop.py,sha256=VxSYbpM2jQqtRBn5klIjPVBo3sWKNZMlSbHHiRLUlZo,7383 -setuptools/command/easy_install.py,sha256=WDidYAhIEWCT-63bVvoazy8HcITEWDn4Xzgrj3YZgz0,88492 -setuptools/command/egg_info.py,sha256=0_8eI8hgLAlGt8Xk5kiodY_d9lxG6_RSescJISKBJgA,16890 -setuptools/command/install.py,sha256=QwaFiZRU3ytIHoPh8uJ9EqV3Fu9C4ca4B7UGAo95tws,4685 -setuptools/command/install_egg_info.py,sha256=fEqU1EplTs_vUjAzwiEB7LrtdZBQ3BefwuUZLZBDEQ0,5027 -setuptools/command/install_lib.py,sha256=5IZM251t4DzOdZAXCezdROr3X0SeeE41eyV059RNgZ4,5011 -setuptools/command/install_scripts.py,sha256=vX2JC6v7l090N7CrTfihWBklNbPvfNKAY2LRtukM9XE,2231 -setuptools/command/register.py,sha256=bHlMm1qmBbSdahTOT8w6UhA-EgeQIz7p6cD-qOauaiI,270 -setuptools/command/rotate.py,sha256=QGZS2t4CmBl7t79KQijNCjRMU50lu3nRhu4FXWB5LIE,2038 -setuptools/command/saveopts.py,sha256=za7QCBcQimKKriWcoCcbhxPjUz30gSB74zuTL47xpP4,658 -setuptools/command/sdist.py,sha256=kQetnPMw6ao3nurWGJZgS4HkOH4AknzMOSvqbVA6jGA,7050 -setuptools/command/setopt.py,sha256=cygJaJWJmiVhR0e_Uh_0_fWyCxMJIqK-Bu6K0LyYUtU,5086 -setuptools/command/test.py,sha256=N2f5RwxkjwU3YQzFYHtzHr636-pdX9XJDuPg5Y92kSo,6888 -setuptools/command/upload.py,sha256=OjAryq4ZoARZiaTN_MpuG1X8Pu9CJNCKmmbMg-gab5I,649 -setuptools/command/upload_docs.py,sha256=htXpASci5gKP0RIrGZRRmbll7RnTRuwvKWZkYsBlDMM,6815 -setuptools/extern/__init__.py,sha256=mTrrj4yLMdFeEwwnqKnSuvZM5RM-HPZ1iXLgaYDlB9o,132 -../../../bin/easy_install,sha256=LopKneUXvnG_dqCSZe6amF-Bf4WEh1ny0uo28w2_nQ0,299 -../../../bin/easy_install-3.4,sha256=LopKneUXvnG_dqCSZe6amF-Bf4WEh1ny0uo28w2_nQ0,299 -_markerlib-0.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -setuptools/extern/__pycache__/__init__.cpython-34.pyc,, -setuptools/command/__pycache__/bdist_wininst.cpython-34.pyc,, -setuptools/command/__pycache__/install_egg_info.cpython-34.pyc,, -setuptools/command/__pycache__/egg_info.cpython-34.pyc,, -setuptools/command/__pycache__/sdist.cpython-34.pyc,, -setuptools/__pycache__/launch.cpython-34.pyc,, -setuptools/__pycache__/version.cpython-34.pyc,, -setuptools/__pycache__/site-patch.cpython-34.pyc,, -setuptools/command/__pycache__/saveopts.cpython-34.pyc,, -setuptools/command/__pycache__/easy_install.cpython-34.pyc,, -setuptools/command/__pycache__/rotate.cpython-34.pyc,, -setuptools/command/__pycache__/build_ext.cpython-34.pyc,, -setuptools/__pycache__/utils.cpython-34.pyc,, -setuptools/__pycache__/windows_support.cpython-34.pyc,, -setuptools/__pycache__/py26compat.cpython-34.pyc,, -setuptools/__pycache__/__init__.cpython-34.pyc,, -setuptools/__pycache__/extension.cpython-34.pyc,, -setuptools/command/__pycache__/__init__.cpython-34.pyc,, -setuptools/__pycache__/msvc9_support.cpython-34.pyc,, -setuptools/__pycache__/py27compat.cpython-34.pyc,, -setuptools/command/__pycache__/upload_docs.cpython-34.pyc,, -setuptools/command/__pycache__/install_scripts.cpython-34.pyc,, -setuptools/command/__pycache__/build_py.cpython-34.pyc,, -setuptools/__pycache__/sandbox.cpython-34.pyc,, -_markerlib/__pycache__/markers.cpython-34.pyc,, -setuptools/__pycache__/py31compat.cpython-34.pyc,, -setuptools/command/__pycache__/alias.cpython-34.pyc,, -setuptools/command/__pycache__/setopt.cpython-34.pyc,, -setuptools/__pycache__/dist.cpython-34.pyc,, -setuptools/__pycache__/depends.cpython-34.pyc,, -setuptools/__pycache__/ssl_support.cpython-34.pyc,, -setuptools/command/__pycache__/register.cpython-34.pyc,, -_markerlib/__pycache__/__init__.cpython-34.pyc,, -setuptools/__pycache__/unicode_utils.cpython-34.pyc,, -setuptools/command/__pycache__/install_lib.cpython-34.pyc,, -setuptools/command/__pycache__/install.cpython-34.pyc,, -setuptools/command/__pycache__/bdist_rpm.cpython-34.pyc,, -__pycache__/easy_install.cpython-34.pyc,, -setuptools/command/__pycache__/upload.cpython-34.pyc,, -setuptools/__pycache__/lib2to3_ex.cpython-34.pyc,, -setuptools/command/__pycache__/bdist_egg.cpython-34.pyc,, -setuptools/command/__pycache__/test.cpython-34.pyc,, -setuptools/__pycache__/archive_util.cpython-34.pyc,, -setuptools/__pycache__/package_index.cpython-34.pyc,, -setuptools/command/__pycache__/develop.cpython-34.pyc,, diff --git a/lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/dependency_links.txt b/lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/dependency_links.txt deleted file mode 100644 index 47d1e81..0000000 --- a/lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/dependency_links.txt +++ /dev/null @@ -1,2 +0,0 @@ -https://pypi.python.org/packages/source/c/certifi/certifi-2015.11.20.tar.gz#md5=25134646672c695c1ff1593c2dd75d08 -https://pypi.python.org/packages/source/w/wincertstore/wincertstore-0.2.zip#md5=ae728f2f007185648d0c7a8679b361e2 diff --git a/lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/metadata.json b/lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/metadata.json deleted file mode 100644 index 885b5f3..0000000 --- a/lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Archiving :: Packaging", "Topic :: System :: Systems Administration", "Topic :: Utilities"], "extensions": {"python.commands": {"wrap_console": {"easy_install": "setuptools.command.easy_install:main"}}, "python.details": {"contacts": [{"email": "distutils-sig@python.org", "name": "Python Packaging Authority", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://bitbucket.org/pypa/setuptools"}}, "python.exports": {"console_scripts": {"easy_install": "setuptools.command.easy_install:main"}, "distutils.commands": {"alias": "setuptools.command.alias:alias", "bdist_egg": "setuptools.command.bdist_egg:bdist_egg", "bdist_rpm": "setuptools.command.bdist_rpm:bdist_rpm", "bdist_wininst": "setuptools.command.bdist_wininst:bdist_wininst", "build_ext": "setuptools.command.build_ext:build_ext", "build_py": "setuptools.command.build_py:build_py", "develop": "setuptools.command.develop:develop", "easy_install": "setuptools.command.easy_install:easy_install", "egg_info": "setuptools.command.egg_info:egg_info", "install": "setuptools.command.install:install", "install_egg_info": "setuptools.command.install_egg_info:install_egg_info", "install_lib": "setuptools.command.install_lib:install_lib", "install_scripts": "setuptools.command.install_scripts:install_scripts", "register": "setuptools.command.register:register", "rotate": "setuptools.command.rotate:rotate", "saveopts": "setuptools.command.saveopts:saveopts", "sdist": "setuptools.command.sdist:sdist", "setopt": "setuptools.command.setopt:setopt", "test": "setuptools.command.test:test", "upload": "setuptools.command.upload:upload", "upload_docs": "setuptools.command.upload_docs:upload_docs"}, "distutils.setup_keywords": {"convert_2to3_doctests": "setuptools.dist:assert_string_list", "dependency_links": "setuptools.dist:assert_string_list", "eager_resources": "setuptools.dist:assert_string_list", "entry_points": "setuptools.dist:check_entry_points", "exclude_package_data": "setuptools.dist:check_package_data", "extras_require": "setuptools.dist:check_extras", "include_package_data": "setuptools.dist:assert_bool", "install_requires": "setuptools.dist:check_requirements", "namespace_packages": "setuptools.dist:check_nsp", "package_data": "setuptools.dist:check_package_data", "packages": "setuptools.dist:check_packages", "setup_requires": "setuptools.dist:check_requirements", "test_loader": "setuptools.dist:check_importable", "test_runner": "setuptools.dist:check_importable", "test_suite": "setuptools.dist:check_test_suite", "tests_require": "setuptools.dist:check_requirements", "use_2to3": "setuptools.dist:assert_bool", "use_2to3_exclude_fixers": "setuptools.dist:assert_string_list", "use_2to3_fixers": "setuptools.dist:assert_string_list", "zip_safe": "setuptools.dist:assert_bool"}, "egg_info.writers": {"PKG-INFO": "setuptools.command.egg_info:write_pkg_info", "dependency_links.txt": "setuptools.command.egg_info:overwrite_arg", "depends.txt": "setuptools.command.egg_info:warn_depends_obsolete", "eager_resources.txt": "setuptools.command.egg_info:overwrite_arg", "entry_points.txt": "setuptools.command.egg_info:write_entries", "namespace_packages.txt": "setuptools.command.egg_info:overwrite_arg", "requires.txt": "setuptools.command.egg_info:write_requirements", "top_level.txt": "setuptools.command.egg_info:write_toplevel_names"}, "setuptools.installation": {"eggsecutable": "setuptools.command.easy_install:bootstrap"}}}, "generator": "bdist_wheel (0.29.0)", "keywords": ["CPAN", "PyPI", "distutils", "eggs", "package", "management"], "metadata_version": "2.0", "name": "setuptools", "summary": "Easily download, build, install, upgrade, and uninstall Python packages", "version": "20.1.1"} \ No newline at end of file diff --git a/lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/top_level.txt b/lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/top_level.txt deleted file mode 100644 index 5fe9a7e..0000000 --- a/lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/top_level.txt +++ /dev/null @@ -1,4 +0,0 @@ -_markerlib -easy_install -pkg_resources -setuptools diff --git a/lib/python3.4/site-packages/_markerlib/__init__.py b/lib/python3.4/site-packages/_markerlib/__init__.py deleted file mode 100644 index e2b237b..0000000 --- a/lib/python3.4/site-packages/_markerlib/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -try: - import ast - from _markerlib.markers import default_environment, compile, interpret -except ImportError: - if 'ast' in globals(): - raise - def default_environment(): - return {} - def compile(marker): - def marker_fn(environment=None, override=None): - # 'empty markers are True' heuristic won't install extra deps. - return not marker.strip() - marker_fn.__doc__ = marker - return marker_fn - def interpret(marker, environment=None, override=None): - return compile(marker)() diff --git a/lib/python3.4/site-packages/_markerlib/markers.py b/lib/python3.4/site-packages/_markerlib/markers.py deleted file mode 100644 index fa83706..0000000 --- a/lib/python3.4/site-packages/_markerlib/markers.py +++ /dev/null @@ -1,119 +0,0 @@ -# -*- coding: utf-8 -*- -"""Interpret PEP 345 environment markers. - -EXPR [in|==|!=|not in] EXPR [or|and] ... - -where EXPR belongs to any of those: - - python_version = '%s.%s' % (sys.version_info[0], sys.version_info[1]) - python_full_version = sys.version.split()[0] - os.name = os.name - sys.platform = sys.platform - platform.version = platform.version() - platform.machine = platform.machine() - platform.python_implementation = platform.python_implementation() - a free string, like '2.6', or 'win32' -""" - -__all__ = ['default_environment', 'compile', 'interpret'] - -import ast -import os -import platform -import sys -import weakref - -_builtin_compile = compile - -try: - from platform import python_implementation -except ImportError: - if os.name == "java": - # Jython 2.5 has ast module, but not platform.python_implementation() function. - def python_implementation(): - return "Jython" - else: - raise - - -# restricted set of variables -_VARS = {'sys.platform': sys.platform, - 'python_version': '%s.%s' % sys.version_info[:2], - # FIXME parsing sys.platform is not reliable, but there is no other - # way to get e.g. 2.7.2+, and the PEP is defined with sys.version - 'python_full_version': sys.version.split(' ', 1)[0], - 'os.name': os.name, - 'platform.version': platform.version(), - 'platform.machine': platform.machine(), - 'platform.python_implementation': python_implementation(), - 'extra': None # wheel extension - } - -for var in list(_VARS.keys()): - if '.' in var: - _VARS[var.replace('.', '_')] = _VARS[var] - -def default_environment(): - """Return copy of default PEP 385 globals dictionary.""" - return dict(_VARS) - -class ASTWhitelist(ast.NodeTransformer): - def __init__(self, statement): - self.statement = statement # for error messages - - ALLOWED = (ast.Compare, ast.BoolOp, ast.Attribute, ast.Name, ast.Load, ast.Str) - # Bool operations - ALLOWED += (ast.And, ast.Or) - # Comparison operations - ALLOWED += (ast.Eq, ast.Gt, ast.GtE, ast.In, ast.Is, ast.IsNot, ast.Lt, ast.LtE, ast.NotEq, ast.NotIn) - - def visit(self, node): - """Ensure statement only contains allowed nodes.""" - if not isinstance(node, self.ALLOWED): - raise SyntaxError('Not allowed in environment markers.\n%s\n%s' % - (self.statement, - (' ' * node.col_offset) + '^')) - return ast.NodeTransformer.visit(self, node) - - def visit_Attribute(self, node): - """Flatten one level of attribute access.""" - new_node = ast.Name("%s.%s" % (node.value.id, node.attr), node.ctx) - return ast.copy_location(new_node, node) - -def parse_marker(marker): - tree = ast.parse(marker, mode='eval') - new_tree = ASTWhitelist(marker).generic_visit(tree) - return new_tree - -def compile_marker(parsed_marker): - return _builtin_compile(parsed_marker, '', 'eval', - dont_inherit=True) - -_cache = weakref.WeakValueDictionary() - -def compile(marker): - """Return compiled marker as a function accepting an environment dict.""" - try: - return _cache[marker] - except KeyError: - pass - if not marker.strip(): - def marker_fn(environment=None, override=None): - """""" - return True - else: - compiled_marker = compile_marker(parse_marker(marker)) - def marker_fn(environment=None, override=None): - """override updates environment""" - if override is None: - override = {} - if environment is None: - environment = default_environment() - environment.update(override) - return eval(compiled_marker, environment) - marker_fn.__doc__ = marker - _cache[marker] = marker_fn - return _cache[marker] - -def interpret(marker, environment=None): - return compile(marker)(environment) diff --git a/lib/python3.4/site-packages/ed25519-1.4.dist-info/METADATA b/lib/python3.4/site-packages/ed25519-1.4.dist-info/METADATA index 10628e3..1aee179 100644 --- a/lib/python3.4/site-packages/ed25519-1.4.dist-info/METADATA +++ b/lib/python3.4/site-packages/ed25519-1.4.dist-info/METADATA @@ -6,6 +6,7 @@ Home-page: https://github.com/warner/python-ed25519 Author: Brian Warner Author-email: warner-python-ed25519@lothar.com License: MIT +Description-Content-Type: UNKNOWN Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers diff --git a/lib/python3.4/site-packages/ed25519-1.4.dist-info/RECORD b/lib/python3.4/site-packages/ed25519-1.4.dist-info/RECORD index a65f958..7b7cbd4 100644 --- a/lib/python3.4/site-packages/ed25519-1.4.dist-info/RECORD +++ b/lib/python3.4/site-packages/ed25519-1.4.dist-info/RECORD @@ -1,17 +1,17 @@ ed25519/__init__.py,sha256=0AicD1xQAforRdrUWwmmURJkZ3Gi1lqaifukwZNYJos,401 -ed25519/_ed25519.cpython-34m.so,sha256=lQsx9-Rms4glBHDzWgcSZ4kgoWp-fVN9O3lGztOiNO8,255624 +ed25519/_ed25519.cpython-34m.so,sha256=-qvpNKMbtiJoFhWHlvH83lGmJEntE9ISrt8hYZE4zig,262968 ed25519/_version.py,sha256=yb119RosJrH_RO02_o3o12GWQvkxx3xD4X7UrJW9vTY,469 ed25519/keys.py,sha256=AbMFsbxn0qbwmQ6HntpNURsOGq_y4puwFxs6U7Of2eo,7123 ed25519/test_ed25519.py,sha256=IG8ot-yARHi6PoyJY6ixS1l2L23hE1lCXbSH-XQPCCM,12389 ../../../bin/edsig,sha256=SA1mUUWCjAAaSEe6MKSpVWg-2qXwuiuK3PodCAUwCN0,2853 ed25519-1.4.dist-info/DESCRIPTION.rst,sha256=8UWGEqjPrB7zPyxLA5Ep6JL58ANbe0Wybqth188exdc,434 -ed25519-1.4.dist-info/METADATA,sha256=5SfqBgerND9vMg8dq81VUTwDclNFkXr30DkD9K95gZU,1114 +ed25519-1.4.dist-info/METADATA,sha256=8xAIfsJS4nw5H1ui1jHsVntmwcMjIzm4j_LHEaW3wNQ,1148 ed25519-1.4.dist-info/RECORD,, -ed25519-1.4.dist-info/WHEEL,sha256=HslHw5cSLCuyOLxj8duGAooHNvXnupcmoBU1NzRPr2w,104 -ed25519-1.4.dist-info/metadata.json,sha256=LyRoPQ8zyOxjJH1CoRteHtukVr0HLA_z_rRyigiJl5c,802 +ed25519-1.4.dist-info/WHEEL,sha256=AEztX7vHDtcgysb-4-5-DyIKMLIPg6NMxY9dXTRdoXQ,104 +ed25519-1.4.dist-info/metadata.json,sha256=6X6ChTS1aIj99pNHtLNerEBCuO-F-P2Z1GgSMt2svQw,841 ed25519-1.4.dist-info/top_level.txt,sha256=U3-N9ZJMBO9MUuZLwoiMbsWSkxsd0TfkNSuzO6O_gYY,8 ed25519-1.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -ed25519/__pycache__/test_ed25519.cpython-34.pyc,, ed25519/__pycache__/keys.cpython-34.pyc,, ed25519/__pycache__/_version.cpython-34.pyc,, ed25519/__pycache__/__init__.cpython-34.pyc,, +ed25519/__pycache__/test_ed25519.cpython-34.pyc,, diff --git a/lib/python3.4/site-packages/ed25519-1.4.dist-info/WHEEL b/lib/python3.4/site-packages/ed25519-1.4.dist-info/WHEEL index db40973..1fdf70f 100644 --- a/lib/python3.4/site-packages/ed25519-1.4.dist-info/WHEEL +++ b/lib/python3.4/site-packages/ed25519-1.4.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.29.0) +Generator: bdist_wheel (0.30.0) Root-Is-Purelib: false Tag: cp34-cp34m-linux_x86_64 diff --git a/lib/python3.4/site-packages/ed25519-1.4.dist-info/metadata.json b/lib/python3.4/site-packages/ed25519-1.4.dist-info/metadata.json index 6a558b5..12a665f 100644 --- a/lib/python3.4/site-packages/ed25519-1.4.dist-info/metadata.json +++ b/lib/python3.4/site-packages/ed25519-1.4.dist-info/metadata.json @@ -1 +1 @@ -{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Topic :: Security :: Cryptography"], "extensions": {"python.details": {"contacts": [{"email": "warner-python-ed25519@lothar.com", "name": "Brian Warner", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/warner/python-ed25519"}}}, "generator": "bdist_wheel (0.29.0)", "license": "MIT", "metadata_version": "2.0", "name": "ed25519", "summary": "Ed25519 public-key signatures", "version": "1.4"} \ No newline at end of file +{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Topic :: Security :: Cryptography"], "description_content_type": "UNKNOWN", "extensions": {"python.details": {"contacts": [{"email": "warner-python-ed25519@lothar.com", "name": "Brian Warner", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/warner/python-ed25519"}}}, "generator": "bdist_wheel (0.30.0)", "license": "MIT", "metadata_version": "2.0", "name": "ed25519", "summary": "Ed25519 public-key signatures", "version": "1.4"} \ No newline at end of file diff --git a/lib/python3.4/site-packages/ed25519/_ed25519.cpython-34m.so b/lib/python3.4/site-packages/ed25519/_ed25519.cpython-34m.so index 1f12c9b7f31f6a8eb0f598654f21dd001b6ed85c..a07ea540afbad59a5b3fa80cbc07464d258afd70 100755 GIT binary patch literal 262968 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

?##^t_U>nifXII6(k+G*;@}xvV>$Z6vBnYA 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 z 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 diff --git a/lib/python3.4/site-packages/ed25519/_ed25519.cpython-35m-x86_64-linux-gnu.so b/lib/python3.4/site-packages/ed25519/_ed25519.cpython-35m-x86_64-linux-gnu.so index 56dafc80b02db213172359449a68abcf44f254b9..ea40ec0e3975e94c9d70d07aff0e171d562398ef 100755 GIT binary patch literal 263120 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 z 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

;uPW{HzHsNjL&)f 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ͰfB*WSfk-tN6IuWJ@?B_| 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 BXR!bP literal 255872 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®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�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 E0z2nnBme*a diff --git a/lib/python3.4/site-packages/ed25519/_ed25519.cpython-36m-x86_64-linux-gnu.so b/lib/python3.4/site-packages/ed25519/_ed25519.cpython-36m-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..15b7049a175b448335b3bf793da4aa88fa35edcf GIT binary patch literal 263680 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 z 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 A00000 literal 61520 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 OzslvDN)$*udjAh;)R{#9 literal 19040 zcmeHveVA0$ndj{fplz_Kqb9bB>kTQSCD_xAG-;w}SAW1QEue>P5I;y!T~$q&bXRq% zZUG%l0;z67rD%uEB*tXMU7pFTYn(hAXLnW%QR#q!$ruMQn<3FC8&PlBqUc0GCqwP; zckVgWw~MaHJoC@)^DKv_?t9*k-+SKkeeUgh`D%xMS$SERrc#A=vqo<4GF#Fj6?@ub z2Bbx6)@I;(m3F1Doi?F5FZap~wn$M;(}jR#OvmrYQo(}iBBSVImA3o|NfoXfV&W`` zvm{Q@BeE)rR@rVey5a9RsV}A;X{RV{nL6Jv!_4n$6zqAl-4<(#D%_s}$2kA3sYV*E zmgSXdmj*TflA^LYqHgT63jCI@T%)ad@+(j2PmPAkv#$=``NQW&zB_Gh4{BtwcLi!G5ZG)s~PySt6cT3ID$; zVgGaq{}5|Be#PlKCEBN_grD&e@-2{0)i2vn;8gOLOZZt|BA)+J!hdB6`-e){|GY#z zttH|aDdFeO;b*G;eW^q|VIaA1AC{gYz z#6ML(ex*dYJB0l#P50P^Y~@0U^eOx<(Js~={H$OLmntl@HQMFcwpP6$W5zAywdcv% z_Loet9$qEwcNY240)dSK@mL^f1`}o=par6_sHp{dL9~Fcdqp4|NkleAlV&8*y`rr@ z9*cAbd-@}`ZfZ>+v^7Wv!T#u%V0i21z-sBCtv{GdMv_|RkRKicDxm+M_#_(( z4n(vhDrCmBL?pC%Ah}VC_M%(Dk*#K2Xrr-+8HkzjK`qcZ6j&DQPe$N26*3V(cWSUd z66i$Tz^v-ICxS}&lHG|E1C@Li!)9}7q5gOhT?8+*kWK=D2-_%t0E1>U9s^LeU!g|i zSH@RF2I7e!2F|dev0l-xgXk}_mn{pRH?a}HB$5#k7rWT*VRp~jV1FtCPojr>78^^p;UoJRGrXyG8_{Z~Anf5MJocB6@sVk#6V^wH6<~vgv zNw%_S8jW78q4Z|SUnclUtyS{2zw&}Vb#7MY-Ih<%tEL^3=VK+; zqA(x>G?OBKXPaO8OExO>iy_GxUxinYQ9k2;E+4-|C$|g=lxHMLoT;gQHtS^tFb~wr$b&XEbYrWhkT|(zQG}%<&gI| zZndJI_no9CGI^%}$5hdEVIVkYDQX|DZ!IZ?T1Tk3%kpxR5{Mkn=2} z(qj(!l}ZTughPInLq6t^^WH|K=N$5@l@RoZL;fEe@?#G9H4gc4hg^5aErn zm64rxb-k_`BV*n|{ijr22B2W@@6X(3ekxr=ahU(~LPj|u(~@|^m)J%X<$&nchVE%@NBN!px{3s f; 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 EKR1V}EdT%j diff --git a/lib/python3.4/site-packages/netifaces.cpython-36m-x86_64-linux-gnu.so b/lib/python3.4/site-packages/netifaces.cpython-36m-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..f87df740c7f62e9ba215fb2b24d0b2d25bd726f3 GIT binary patch literal 73688 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

i1vJuEv8m>hwT# zlu)lA+(Fpx_#N4b!W@OPyTst_nBJnJeq&SY%3=|vD6c|z$Xg&sS(H?*Z>TS-6f99z zg|KT0`ZOv;nM{TDIPCkndQU9IQRO3Zy(h6Kg_?!p={=dSoeWbqfnmVvB+)w~lI;Ul zCyU;Gf@qHJop}%CccbTeXA#upXHecHdQ1i736SMQj*|j`e{~9EYXbj727Axa1mdE5 zr}o0EKD4%2^iGpdX~kO6JAE3YhW!ow(R&&_9_GY3s`pI#Hf$zzX@n!O>Am-akZ zL$EEECf((zir#r_beE&E`l#$7cLntHaY*n!FTe;1-iz~3AK8WO9HgdCq@?m^Gx|6s zH~?z;xFlGDUhLzRU>zBHN-zig)u)#PKFaQmnSeBlf4anJsnLrsLqc0%ymVi|izYUjrF$-}#Mz<@&qt0vpT-H5)^@ z@A*%G9F6M_WU60;^oMC1mD1r8q`aIJ-|CCN`h4wJh&Ie zoc#+!-79@`e~c6jj+4~;QRjn)66_lv>sbriGRoL!Ey}x*{@A`GN2_J%%-G=^dtQtj zj#tYokdBSd=49M#0XRzP{1787R!jaUSc;X&ci)B*icORZFQW2>q)0FgN{5V<;5gLh z5T67uCOA%lJ)mJossx`RI9`Gc$k&iG3EqgMbX=qazeT^rIVH%SAdPcL@L#B#IJX4( z4t$)JuUpZtL$%ECou;7<$?zYzGc1d-xmzOu=1FQfx_8)Y3H}3yhs}}Tn;0}brD4lw zNK?U(g=gbz>9F6&-^{^6rf zf$UNpFgrYv36ECiBd5d1&@rzV&V$`fSqt?HPuc}Ad;pwq4WFC{PSu0z9-hu&Bh=T? z@x!OI0JMwnIOtq8eAWYGdNmFWIj12j)O^CZJnO`(U(#+K;UqN#Ju!SXeMnO;j0Zf2 zKfREl{te|eJfCU;>K!P^;pg${AYXlje$H)#gA3J6(&zD-dKugeM~izrIxAkQlHI7C z_@y$Fw?KXT1rof`i=Qge%D4sHJz}J!@?1SKh90>UI5D!H1p5sEI6%$~^)ND0ma*H9 zNJhz#Vqwe)(Zdjq-JXEGJkj$8UVpih>B03c2+l`gA-=GzM${$rjYcBXG!PQ{6BO!f za3l=i!`OE9X7q2uAohSuy%fGAcnL?VY69TFvV+uVDD{L`!trVYoK6@*I7w|nPb3T_ zoTkpkax`HW;SBY1q$WZ3YCsL5IuhdPTE6-P`9}~gP=6tuKzN~g99|{JVpyhzBaI13 z)U!%`kUppMgSSi$0g<4FF^moxez~WN>N*#Y< zexlXQsPKd(wCPp<$vBoi3OG((O#VW`L)C4xzk)pRYBS*y!U^i-D9nVFA46x7x{>)? zML11Or0-=~+(A$hE+iaKJy8s?gcqv!qh}K;2rpCnlBbIBDwXTTgo_AQ zsSlE;nsA-^CG!^~T(ABa`-HXhXNx*_G~hbYTh#ASstJ4mTHK^wF#_-<wpsWp`?m(nU z7w6I(N5Q5riArT?<(oPF$h@+QwTDT_yV7}zthOX_UIe!BgN+mS{ zQ)-Gf2U^i7DcYIx7fh%r+L`iWd z>Wvco5z}qz%@TYV)>3cPsHmRQ+a!1?!P_PHCi0bfhXe;Dvtdanep$7vw-J_%+~+5Hkch`vwVAwgz4^&tta!F-YWums=0uu6SI zf;NJWO7I>k`>OE`9aq6=Ye4p8QPJ)BI z0QX677P>ICRf1PC_~#{9jap6JFTo)+{GtR8vRe*H@GG3KQV&V+Q(AjTf)6mDmnF!r zHBw)Z;JX-5ssE6mLJhA~jhB z$B<0@LV|VF@TCO#{%mTS1YNA(b_rficaBPMI3qqL!3_v={No$}!#ODfiw|WBb+2;8VQWxTx0yxxDitMNf!%^eZG5RZX1df&?NN7g?93bH{F%(?>N51fa zF#v-9uT(D7E!g`XJBGbQ*q+BhUhDk|K%Ng$s56%*2)frZ0HYzp!@Gm^qkqR4Stz4#1tKh?UxF*bHu?iZBA|6qn@Fn&T6bZcf2^oaR81R{2Ux8_Jkz{+!=Odh4ZbCm#pHq(32w__) z6>uN+7wnw>Mt*H~NFw)PJ4l?4aBNRVBKKj>Vi$fb0(ND79fCIXYQ&KFt!C;d5}bLw z4il6`eVp{~3IW^H!8n^`{@_MD@cSjHjQcPZ3c@deH~lkzE26T8(Dj+8HDy;|yk&Ms zWsYhjAyX)v3T%!SEkG3Izff&=96_owEwUwA$nVQ>TNSFpO0jb;vO<7g;Mwimhh2hQ zcwGp*&l>yzV08z|Cu@ji@ILsL6?e)?@4trkSwp2gwF=qH8a53Hw5uPZ1hR&I4W39f zh=gawPlfwVVY>p_>~`+MI9{AyD7GDwMDD|WBryb&zm2cZ*zMehsn|KcB4=+&PN3mt}AZ;*T!h?PE&6w3NnB!6N7|dIV zWsLp>JtFG0iKPG*<;3E|!%N`G9LSyu{~K6rnS)p|>TB>Mb1)g9e+kBE<~sIloGbI+ zkAgTX$pg|m5`4lA@ZD!gJq=r#@4ZH;9_(ZibwfQU&K8M>i5@h`8kD$IgdenUP`vdM zNb28c@cjmW@Q6(ARt|wr+34o$H<_Oily@6B%ypfXR_K@+#gel42zqh|mV^TAJD1=q zm=6Qd2@tWogPzKEkRkj$@J7svyB=iq2*%*7q1rt1ek|Z&QiuAD7x3`$V6mz5;QFk1 z!WfSWaR^@>3g>5y`V_G0L8Z@1V5?AnMvu%IO?x)=67bAQBpj-aL^!j?NDb<(pv+1l z93jGoBJ!wNtnm z2S$5(Dk0X(a~0qy&u&aOy*)YL?BgjOj5*iy7bGIaGYVDI*Rw1HGl=INRNVj%e>P;G z=ShqyuZO>KJJ`eDIF0o*KsL_v6Z&wd=VqMPhIx7+gm}+A4qSPA0yq7MtY zIn%QX{s%lG;eWQLkeTrO0DoqC;xQuTct&6<$oE7bALn@vV&a|ac>}fzJda~P-xG`V z-~!Jzh-IOt8s0AQY=BpbJr?L+;u#AK7kF}!fn}a>ST7Rc_oAn5Irm?NgsRK2%Xxsk zF4W^NoU=n#fC&E#7YY$Mt*6MuYRY+@l_u0zpfzVdVMYBOWtnq8R-ig00q_fit?Hjq zRyhX=+tf-FNX{X`A?hwFE6j#?4xubUJ>|6O*#f%V^B}q~+~b6H)w2_BIy|qUlOjAv;eHQK zxdTJc!&l4c2e?d<3qS@C%{m~0JhOk8~gm|8O zw9cmTdAYoPq}$co5K&%#c9*I~Bd)vwgdOT(lvmzBo~;$f2hJ6D5*`o=H@P`m++Ux<-M?t9%8J<0eAihCEDbF5!H$b~O7e3F9Wofw7)l?Hl z*=Y4OoM&ebCG1r*Q5mxnX*gajrk=DG@N*4C>pgh4b`ccob8k{PLQ&eovq1{C8jl<& zosXm{R+V>I!>#pxFEn5vKM0dbh{}tXGylnsa@!4)FvuT8$tYoxgA!x$i^q0}r2_MP zjuFD`)B+)n!QeP$ewX%fN`Y0y?;53Ydgo?6A0jF{9$O@kSkx>;EH&5{gj;tYVcfo2>6MtQ$PS_a~F}w{`1~Dl=LC;VkPL^;TLR2y>>`d2hsIy~$)fUE>V58a%>x zgUNb<)=Z!8HCeCL^>@X-$7KCBy;aZrexQc+6ybZpWc}|NXSmhi5xzG}*5A~c6-a$# zvVL6G-(~%Kll8ud-C}>mWPPmgb(pMA&^W`b29NMXpdz`k-}AL*1yX%=GW)$k*WYD5 zQEz4DZ|ZKH5pZL_&k(+eIwz}cw_)Aj5x$uw>#yt9AvND*{j0OAmzk{h8PhHH_e|C& z3tz3t`Z$d<+-mR$-zJmwT&-DwREx>_g}VN(*zYx2zplIWPfgax3ExhW^(PGL29NMP zYqI`|ZXHtpFj;Rq%lbzq>phdY#m*uzGM^!Q$4u6fHO_FW!6SU9Ox6QhvjVA5On2Pa z@1?r_uGstPt?c)f?$&=cS@#RyFrAbA{+MCi;1RyDdNZr;pl%&fev|dj&ayt=WIZyu zTkHyogd3|4dWuZeM{AtnR)a_QDooZhwPs3fFj-%&>+g!a#bo`e?$#Y9>ptP**^e7z zf7q~Y@Ce_7ChPlk>yYAe1KgPTBWGFvhsnAlrCaPhyR2L6vBLL`$^1x-HQZ`2;nx{V z=BMeJD8`F?!~Qaz-W7c)PHo)S^MCGcpVJRF=6<5^_0%~T{ey;igGcxV>CNo+hdseYeTF&DSmVG?VpA;X7cmK1AaT zw;DXcci3coqSmZH>O+(Dg}VN(*iV?OZ|ZJ+n#uZ1;X7@zewSh0;KA1ySX^;qzwgnl zLn=lmv)|u7%lc@&l~pIkb&GwL$$F~rP0%@6b%Qj{aI3*1d^1eeQ?+IVQUxaK1-kyO z*jJgXU)tSzfyw%K;R~9q-)>kpc!ckAll3Qc>yY9j9NZZDn`c?S$7KDt?$$3bS)U+$ zkD09Z!$MLn8x0=ed&XovMQc_d^@_=QzDBlm#r~nm`o(&yzPd4f$B5&7lJFfhS-;t^ zZtw`-Nt5-Rx^+l}aP6+g{`y(gWAs+``>F2M*O+3TB78%2PWHQJydJy3BYY`(GpjC9 zYgQnYVX~g9kxj7|n5?hWTlLu2o2*Y2KHgg3M(fvWoZ(i3NBGv5tUsbPE0DUxWc?Lg ze^=(OFV~nt6ubWwIX7$fnp|FaCN|x>9e|V}G{GIt0Y{44ribSWTCk z|L$T7xAHnh+tQZ8TV+oOZwM^&Xf*k2Pym(N8nW<3|wz35EjSD<$?2#~mF5 zFI8}7uvZV>GF*ipO;jEW<*iRKsX8c>ouRx<=W?ucLhA8QTIerQ?x2mo zghg!4DIvi3 zN_-pfD|-U}yTlXGlyYwj@Mk3c9`Gc4IPhmfZ$b>#Z7u63^T90Tp)mZ{8@Z+bOHZ#$ z!$oR3lq{fYFN8AvLjg|tOlQ)14&P~d5mbIB=WCL)0-Pd!D-(~+(04^A*S{s#z0`NB z&P08ef;r9w> zyiUp>jWYE($nQ@>-><;WZz}QfRqnB2z*nvl$_R;W1DaCKP8cb5Tc9dsbtLdnVLQ-C z%ZcwD+KKaZkFk7*N=cCXe03}3Pi!A8@g%sJ?$)E$i%58I*D$4i2$-_M{tBi1ZQP9C zI^7Lu?xyz9#m>W^OqC-B{x1O{rt`_yq~DMWWmOpOWLmfF+?bS%JAg`A7{6SyZri>w zWj)4}a$(rr5cmidQeHt-D68d*#(Xs@WgXkgrLlFyCk+C=M&geVuSYCOg~Xi>;DLU? zD_HHS#muOuFPk3CS+1>nlX*xGcZi~KxbefUq+Vn0-a)5zaqo%@fN8!3^|#y z!X$Pnr55QvGxywb{E+(A4R7v}QX?UiUZ*ql)_BCH8HVcnBol9qPifYf;E`=x+d5Qk zx^rm6W@yOHM|TTC5XzMi_6H=6OJBZmA2!y;5lbr*;b zR*P~|*jq3)<3i9Mf{hs$060ltE`a%{`RQbvxfa;WP1yNn>e4G=<^hOy1~L9&J!2c@ z>C}4ZfPLGkb=N8Oj=pe04;S}HP&V9Zpyg|+1&$s^Dtrs|mP^qRg>i}y;JTDOvJL^w zwW>nF{U@D`YotWUhFqSaf__ODO^ol*n`jIYlLbJe8a7^s52^e@j~j2=r^??R z*Abs_=6WA3pKI~qWP;$rt;=+$S(-IS1z*_-TczblC&eaoKfB8c$p7Di`&nI&m z0KUU#@@+tb=P9|UBqeE_vaoCAFiu%SBcJO-h}G1l3Cn8wMyIoytT-ifR)a`Y^gfS= zy;S2Y%WCjd=qCs&8>b0LW$Sc0mEi}L&B~1Pzm&hSZ=+wknU2`D6oT(;|Pj6e7xP^)rptp~k_t&$QKH z4=HgM@hjuNIz5C>njHn6^au(@$qeBaW0q|h+KDVnq5&6X(AYlo3|~KL2l1yF#tb@3 z>ii3sri|5@kXg${Fygc$#INL(=gIRV=Ps&i(PwZ&-9w$~=1Zmys=G^PqB^Xgh3`$B zz*%WOB-pS4^dmZbGLm^jr*A}Sfn0chtG5Qws(Gfj;7cOCX&#z-B5P>oH&;QOd;!QK zHL_(L>>SkTWuWKjbXFtnuqHEv&!(p!2$m9^1>-L@OQ*9aQu$j6++^oxKg7(xYvGE@ z_&p){o2p z1vLu~C0Ub5iFN6-agsy75bSDTGo*OXxenP%hDT?e2u zvpiOE3B51$rOzbkvWUWmUW0;Gx%Hl9=*^OPKcU_y zb+PV|Xbd6nXv&Kwy&SkA-JqaEtgyrUs7odIn?{9N$*^P=_i1yV16ts(RAKh&!+ z@HMO{`%QYa%pHOrEpvrZkDfUVK|CjP31iT9(5}qna><`TwY|GKL?5(r&3aImJ%aL8 zifotXVl~1wYYAlJn)Ox!T(k1bJe_Q&HR~I?G}o+)Aj%wHij~w+o!+%#-N+?#=vtw6 z$n`3@FdfF}d|cr8X6gvnG*5RbgIKtgZ=-PInugQ<1t!+dy0dOGv7%diMiEh~6XR2J zQEI)}#EML(4$@P^89en$9ieOEJ9LCfObYJM6<}o)a-I9J>=MOz@G4M;_BK2CmSuS7s z&JZ^Wj+MMzAf-O8ljQf%}XdrbaB$SBWgFnk|aED7-tkM4)0{BlF{TS&>6yC6%#WY+h-!qsiZ`tW^RS>tE zFVjMlcbMztkAuzf$B%^UH46Q~X1DV(!g;qafqyOsL3tDn1x2MgD&`%4-8rMlZRI2~ ze;o3w;bK7wmX4Oy>?JEN)aM_D@0Qg&fX_c4S+uM^Y5}|;57lOw-9ollOotkq#OF^! zwOVG=@cg$ZF^z{O4hMB35t7Dd`jB3#=nx*9FV zb)s`?E8*|_ktr^P?%$mHq^ch*_)#U=&S|D$@$p7~R?Yy*Hqej{n5T$GABl|6K=&%58kCbH>kTDnwFdgrK^eDDEW#0EpZX*gpU?m%rfn z3V@k@088C$R4%xdM4olAVW7%QDN;hH@ou#FdG^Z51C(zO;#H7yX9L*`a_&L^4-!}b z;3EQ607@`9Nws`|jvL0L+>}kq5<~5+U=ngc!k4|d)kD2vb+;L9%uuGAtJ)mhcYVHM|rm7H@$0!#XEsQ@Q1C1hD`*pheN!_9N?B4Qh);eX)Ss zMZ9OU2U>h3AFgp?Q49=M}yT&-lqtDNMz5AU`LTU2nw~{rH@BR4MG~!uKCdKRA{+Y1+fk)I*AEh|L{@iXu5N?|chL;Mu1F7&`RehO*} zM_}0SQ?R~pH9C!-g4+u(#gOMG^}C{87()Ckn-GQD5%`>Uv#szatVj8YoltlaV&f;) zS6Jjg;_#V0tuO_PM1JPC6yA@#@H0DW`Ebk|1MpcO2ra(^Ys-u9Ss(~4=M%1n@L3=T z75X90&-g)w`%%pN44JWP10vw({Ch3=)@)dWN~+rKOLsMox50a%7{o zt#QKPn1XgZ2R}@Zf;WmJ#g51God7YVj+YH~V&n+#g>!_rbwvU^b?axfH*L8G%5L?@$STs}<)gr>%j;MNH+s1bT18=@D>I!f0FUR*}l zlqn9n1#d#AyH7kc^+&mRBmg7P(%le)A;#n%s;h4=r7M(vy_MlHnveZMWY7b^ZP${; zXaiN9-@{3k!Orvnzzu8` zI_^)O9gCi_Sq`|Bkwv$lvzv8xpX_121|}9J>KpilF0T`KGY#=y$cX8_R zE@4>x(JxDxDU303fjK_rurN_@#8*UW<&0Ui8v!CkT?9;tT?mI`1tv1F8U`%*C2^c! zm0u%!V6Py}_##gzV`^)v$COnRm)EW+8B>>*TA1n^jsK}xTQ_=TMeUg7W%zj)$x>dn ze9X$?;1Wx)f354zAzkTC!v9Vzs!JJn77_mj zF?cqys_raWcS2Fkn$hwf_LUWPZ-Bb0qTM=O z7GGr*Ss+eh6*^qCzN)gCunlXw_gl)zwAo&7vgMm zVkEpKh<~rDA;IdR;*#a4Q4OsrFDve5thl7STiVL-FIvsUQTAqZT}jdE>XK4333Xjt z9IPq1NVC9y)>?x>(cKDqvzT=)>j5QOS*>FTzoxdTt0uK+0RN-cU@k8!Eh%1KYy?+a zf`6~7wV~WPOL;l|g=U48O0ALgW2h+RsM3&HIgU60D~nh2KXihuV$ymk#i`6x1a&&olst*_@P-FN)mIkCsz?dd5N$EfRmD1KmNhG})S7l;^Wuq9UbhBYtUVtQ z7Ml_p480Rai*^0128p+X+S40XOxb3?*!rH>WWDh+`%4C2?W6|lmm<-6dVR}H*1E|X z7EMZTyucc<@X;R^S*uRmIVs(jb4~gpd$e`+Ci^yPZ~H83`7CQxqP6;w@9n*;Cqh26 zUT(R=+OctA&{}V?C&K7mH4Cx+Iufx7@OB+uDB;PVe;M&v!=jq>N2UGJ(7WtYewa9= z+#Z#XYju=fwWMJ2wbt+xPg`eivW}&)@2l-^L+b7x3#}JFk`Ka%)hB@8(&O#z3ua%t z%KD?Q2dy_;W*MizXKV10275_^)nQ3j7Jq0}Tde;S_7m2}FWUrQvUS{E>u;BykcRKT z-ttnYHM~Xl;~uN}_JURSSRHpv%CkRgT~sactBtrc2Q7gDArG{-*F8u1c{ z);^C|Rr`tU@7Y(~h$fqT=eD07t!p@c(PB$n)I@9HLhF#p_A*_+JzWR3%OmY8q1HRr zwpfpbzrAg{Jy#MQk^QEG-Vthj@-q9TbnE(;a;)!)y_;XQK4ELI-g-%*^|ed)F49!V zeJ%Hs{;$@)21=5vIY1sTX}15=KRYu*KWkwLL9nwj$i{JCWQQdD2rMu;fZ!0B5JwJ31{*kbPOyk0f=Gxh z!!Z#YV&(hpySJ*kx?2b*b!NI=y?XDy`|iE(zI*ShdgZ@o&msTQH;=z+%>S`Bamd}@ zv-?*6y|H<1YzV|Jw__}MB z@9~RE(e<^jUG{%{&yxRSW66K+n7;*@fAY3T|BuJc`Y(IXKX3dMWB<~B$8CrFAB-*e z&zpF|zdlx+c*!-_pX2*KzNHIp{i^>yNk546UH(KD7eBh?4!N;(@`rvfe(BgTf8nhE zr{4Sg4~(Dn&%fVqLzvH>m@L2hi`QRsz5i?D>l2sy`@Zf!aO;x)<#9s$yDduDx6dU% z$NjCP&yiRD%g*|XOa3n%`lA2Nx4glB#CzQTp}*w6?UqCSzd2{=PCtLvKQQ?SSdH=G zpSQj|@$%(~S1ccU?Z$Vd=fdIc9!Dp=;6NJNqZhyHf9;kx_#gHU;d}_^iAhA*d4J-L zJ-hzzj=k?U{7>9Ae)ZUA5|xk~-}8R{miTief3D%r>+ZpC1bRrLl+E$`_xKk~totWH z@_+i4iO1hDb?jG{Kl0XV?+i}(;ktkE(rd4M-DmvDS^t&yUwuRGiy!^S>5neI^&Y=| zhkwz-%fFEWp+0mA2hcbCiN`^wzqw_6Y7Ce6`V&k3N6)!q;&%VNZvp7%ExpdKKj^<; z;*kHY=iK4nJNCXi1v%;0Q@2hydF9o&{Qu>B-GA@cgZ?8sOa99q_V2v_bU$y>Ki$PI z^u?R6|J3W2$1k~P;@a`c`hNUZjbApVx&8~|bX?3oUvl*%`C70q>oQmBxx+xjz@A0Q zzmOn)apH}5Saocyu#??h4RVdOa68NC(CcuraUWFQv5(hxyuwbAHcC*&42BEV$>SsI zFmAT2n$>A{>y|8*GeNmL7Zi&5Lgq*YADu6j=kW!2_qlhQ`hsfXDsR4YBq)~3UQpPX zZDZ=rVtSp00n+7X+zUHXG|h6b2^7nCshwZgT0%j>p+Ha^o$lMbIwcTIPrIX$SLd@dgx3=RaC12Izu ztUq6AR5rr3sUE+r?fL`gt#)|Y!-E}0J7+`)+i$B9b20i#~} z0=g86+1cC@Y=Wy;GN?71Et*~c-`Yku^wQ2Q%7p_7f}wG(QKc*0l`M!gt{I-9V}o6vGOPh(>5KQE0;A0b_y7)g;?hjwnqP zO7PW5>7p~?voK}XLPZ}e*=obU3|16KL1)BB+^N-q z%?iyV@-oxeX{;Uz8=3NEySe2sUvKtMIif?g0XNJ86Tkon&+)Lm((Ht@wF=pl2^MoR zUOQavwL73Mz8l}_ZnDSX^aLdcAEgQ;=Bd+L5d#Z^tp}aeCU9tnwGh3)_c|ar5kBxJhYI??8c(40ms*l0IZ)te8l&ckDgY|4r<;uiTtq-9hU-0y6vt<$H8S+_V$DH4GhHq& zE=+4>V9_?-3In9OYp}ja7_b$BM?}KlNZ1wC1Qm%cuD6?Y4`io)04NzZ$1Am7s3Rv> z-GuJ35h>cmnel|*#sdj=5QKYcw zo3&mSgM?i^6}B7L(G~^hT!~Jd&6LVi9VStk=`!UjXzf67R^g!q-8zIn=mEJ#4SN*v zWgV#AUajk{gLMo9iU%3F(ClVrsu&Gjc)vPWp&B>A0wK!$;#@gb$dr!)B8kKf1dK#9 z!ZuWa^9H@OUcJ8KL3vPOfvkiG0_|G8-6Xj&aW&h)TJ>~wjoh0D`DALVw*p8c2O0#t z+JgQL!p7-p8&zN>#83;w6OOQ}hwmKr zHiT<%sT>*IgxgrFZeYh{o!Ayi&}+QER&%aKfoq+Tazk zNmTaB(UP1cP3U)lC`qwvcQ&i*U`Z^9&=^zH>9X3{#ZRm?=_X4aNCm~SX^D|QzK;(fkAKD38u5J><`!ds( zvey;Rc(&|88?ZcCCV0!xs37dJ>K$2F+&g{Xfcxy`-hK6MuMu9Wkw#or+N+z_A^^JY zsw?*H+mOHf!M*#|x1jb<;|#v7p4x}mrz=BuA83uJ7;Y3`Tf~#3zztBkU9=&yX~%K8QDXVVv4vv z(8ySYsv*IG)ynE-NIj&{6R-vHSHd=pZx)`-Eg+BD4bs02&eHC3a$PQFGgP;wP&FT|K#%5` z%z0$p%@8ugu6hC9;FC;(%;zz3R-hvxFWW&Ks;An5cyLCUml*}N3)vcQM?L0Yq(;sG z)N~zfirq3`3X#9rg=stpgA$Mghb?oD=Q79>C&p#AcB<>j2u$P!>Jl@bV#}aG>QYli z>d1nqf)`|hdez0_fIoC_qe(kcL>cWl{&{r_0hwgcA(?Wh1(;rKB9Psz$&gXCt>bT@ zSF1VC!mu)dX<$La$$Fo0WI~}r+OLyzWYQO)XvOnmuF;Jq$G)M{!ioT`;?v{-8Uoj~ zGZ>B?^p!+HH|SMxQNaiVrxE%>ga{VI@oH!$IYt0SCUsx6Qp3<*^VVvxpBrX=U^0Nm zD0)$Ou3e$OC2}O@3&!?MjD|XA5W{R1I@Jv$h%DzZ@iasc1)T#jNwT=ulVJJUHhBu2 zKw>n3DQD;mCY?kisNRAHDH_Uryh>vSJjevondzh1 z+`?==65W}_QWpMq8OpQL-jN=Wxn}cJujOEY;#>?dij<+}%GsiGfU{GJM?5%F)b@aV z!mTU7-CP${14U7DrV)rvq0>Q2jYKpA<7B%!BbBkF)1l8~y*V-+9HklSTyO{@h-N@I zZ#x*k6mlr;eo}*`brojX4M+kgcv?rhGbNp1cI%bSDIFtZ5>;j++!E5ac62sGUlU$+ zxkL{~QA&FMu>VTcuDNVvNijUljyrr4GgjoA5(zh|Ds+w^?1*W=3FfGS?FkxE6$g+9 z^cGe*M*_@1r-^|=PORnCFzNRt+Ck-*bai#MIAp~%E>GtdX5&WiEe`XbjGg9a(Iw_| zz^G7WZq5TaD_a%Jgq+EcA-;xO%)`flxUdaXxi01eD~Hnr9YN7YGQ+giw=wggRn>CS z@E^P3L2tFz?9e#mw4^LxL#4UQaS2B`zb}ev0RS}v+&u;p=D_8elO(YrGDT-hYG4T( zO1e^7UJ#mso=T9p+`=&h6+6iekW*(O9Ih=)yph)hdN;xi%p<2m14V3?_O>q0LJ-w(#liI@fsd?9SttB9tVxd-M~z;wh7s4QtEL8?SXIfW~U zTGaov=w>Umj+u0k|GMaWWSTDY(k*O2!a;^tnw9n%W|*+u?!l3Ry@dG=bE6k|`F$(n zLFssICLsNQ7PP!{P56)K0&-JT!4?XmmBzX zkQyR__M!H~jS!P$zaxS$nG9<-V0XER8BBsd-VWgdciR*$n0p8)!EcjsTWLozf)bu5 zpaL=@he|ZyG=WAD3Zqvr-E23FB~)3lzLIDzfC&odX{}amb)b8s5$aRSd(@otXArjeVz>@s3pr!8_Q3NN#;JPqxnOmkSmAD*SsaKeHo2{>Bo0Y82SX$e=owPufA z7Vt$pr&5DlX95Q2Ph^&5?*Oc%Xlwj=eW=f!9k#d5C!nW< zxIlj_iYzqU+~Yx0%7`G-6iFu)I*BKTN5Tbjy>g2O+Ghw0Bp*t)gXey1HW9yZA-^y+ zhb0IQkZM(<`;Px^(8)?y+?1Lq(osxP=#E9&X)-`G+gv7-=W_sa-c4wx+aV{65;zP& zpCGoLQ8-#%a=2t*2~}4RZgtoMb!R5Z8iN7s-b`nf0VD0el;GoP;AS1q!(pjxE5x2P zoLD$=AhnoAK@#l>{SL9NGYHyC_>h!<#$63NouuJR`)DS=P^OK9L6Oa712{i4fyq=E zkPLCq;)9nhEW;EbE=Vz3$QR4WxlLzZM62Bp44`M-L`6;O%w1T%&P<1ZxOo;dd z@;EBO*n%ozAWXy9)A@PCgdvzKAtHjhQW^6P5Fr2YN=5^up@1RZto>X-;y^$cI>z;uM&d#~Q&b(Hb`co^vt((Rh#GcoOrmW; zlcBXPwDqd!n1y_~m_c}_SkeZ|kRZf4OztrNCF&B*<`DDp^M z$rYDvC>F8!ZAJkOn5H`|gg^yjgfDba4=V}q?J?6jD#2iMWM?dMqf&P>aZ3WT!mxmd zNffUH?cAqM$rf~d26H}wmQ=dYFqqFstjt&gL;WU;3qnX>)QUTXY6HHbOajh>6r+Vk z5UWUNxR0|l!Vrf&it4IC!aj0BODyMSrvn!vBt^@`<)fM64A&IJyOn;bikF$7qcIW= zJjg6S%EF<82g+X8t77?$hBdXWEX6YnDxyv}P#EUdLmomd2XSejp~DDKB1k(T=0OW# zP=?m77<3ja7yQAF7B)i8xMqeC z%g`vNk{s-4jKuhffx43=5$vn3fN0B86ZMv`&$&|4Yqi8V>b(kv0K%CthTLNWfGx8p zrsuUL){zCgNCXXcIPT)@D26hvNVE@DlbVV`I%)`i@sHFA$Gz(%jG>eBbLd+66uz3%h~=Jxg~pQ5mk;|i2H zXh8(}7wjAgeELOe+R*RQd#+|2!^o^aGulGG4BE^LoE(Wa1R^v_6Blsn(q@MaAh8)? z0-w<$eqG!PgO;3+*OSCd#<;M@I~*=+iD(~}T11jn;&oLJq~SOa%7Fh|PTYZFhqvKY z6+%3DB9BTiDqn|+i(M)i3kcua1^@*zB z@~eW(R4#!3kj^@&5+Dq44vm8fQUla#wHj<~0!Oj-^!WhM*L-eC+#@t^v68+e{8&>5 zH2mT6icuL&jx*WW3?3dp`|_Yh4s>vYCBvNZ80;(~k={z%4RQ_H3zsB}kkEk24Y>zZ z%s0d_4l6sg>c%F_a70(+F($U4OKxHzp&D)JYGb_#+GEPhmW#RR5}zu8iy_(QuRgky zhcQM>Fluc?(?Ug$XubAz$fB)YFqfMOj>G7~Ga07vENW*C1t>pU#W^no!J*BHIJ`k_ zqtR@KiAm2X-a`JyqSZ^ z3yz6~FF^}?d;#wQK&bUuJLpcgzF91n@US6Q6j$2K%9^xBMME~y{Km2^pIwoK*vk*1 z8oN*hKWI|XO_CbUAmSrP2#iB%H~Sy8G6#jl=zUqhk=mY5@2TUEWUh{@0;mS63|Y_) zg7tb=-XjncAVkz6SQXHk6ag#)b-Fqwxacq^6j)Q3=sh?{B&|w%Q$!t+8Q~2AIb4x; znvjtCLr^m3E){acY)N!aWO;Ga^T8&pWkIud`FJHG2=aQ2%_e3rYNVpi4CfmLK?C-` zHa*pDo(da3(cS>&068MsA9pAC-BA*k1_8}mi#PU zgyP|Q_ng_bi?3)V%31QyqO3)}GsT0O>+z7P*XYGLikoB}(u<0o0nb&5f8VZHzAMJo zlAnsQN|yXglvS{#5d#gL-Hze9l=bp^QO9q%8?USJ;3u(pjCnU$^6gO{Pd=bYqsW+d z@`U#AX+0y$lGbU!azNwXM-}78W6UiX!@j|i4@DRhEcwGI>jopdb$Lj0|5KZJI&RLA zKNrzp(UR6IX!qGIgPvgPXSa;4#z`q@7t;}23zj?;vmX#sM^2G4u8e#8cP)J?!tPC$ ze7k1(-fg$<+C|LCH(AnpfzfEmuPV{lLb_ilX1y~0A zO$BT3+(=Fe)?OygO2P3Kls0dU8J8}ys<*C=NOjzj)^D)qp)I>GB2Y_d!#}HMDQ8&S znasRTFRb%Y(k_e=gqS)EIb#ZmW$EYO{X`yPUg_sFd0!;erNN}1f|$M?p?c#Ak~;R2 z73>SO$Ulh&>wpe6m6#A>OPXpN^Ohb_5$AW$c??nJcI!svGO1|kzm9~UysmwX^=d*J0{wxl*xR?enRUL})FF(A% z!$>sd6)kC`@x5Cwj)c>Og=E@vWGzXigBSl=3o)|AL1eK_QvYGK{w(U^b%V9A=~Vw= zwX6#xsI_Fc+^j5vhIwLZ5dM-eE$%hSnR@z2th1gNm}ef-o2C~)nhOTZr0;9zUK~kI z!IJ+h#_XxBA!s}`42`D-(0GZ0nTlIT0~=!Z8ChkWsxrDI41OY$or zJVZ>=^kZEc2-dU|v9#EOMh!+Au)s(xBlcJW-^#rI7IEgQd#txNWB&;X(SV- zq!GMY%RghG`Bb4Hy%^Ubd!qIiEqQ@vN&6-#r?l5YkxB#GehojTHGhPW(NLj@Uj#iAwc+XcfNUE7-Wa)p3_WXUf?SttKWlm92q(o}T9hH`S` z^vqEjYWjEd43qa`n*3~>Wx&tHjvYK$)1~6yOEh^{&n#o<7*y%mfU+{r&=>22;Sap6 z3x*l!WJ&AN5QBaQAnibOdH{Q+@c5*j!8uFbrQwg^oU@9bk1Cce`DB!}Xvrk3vSIF8 z#_t|%(Zb_JdPeUo`51Ov;el~}=GKd_c?yp=DrS;-qh8dKnK$W$wJRlE<@on670)?s zmRz;;Vw87a*V3H`z2lZN^v1mdyN2DDu|*>f=2`l$G!IPLo5Gi^rqN|p2PFReu44Pj z2($gWmj0wt34V%U@$IO^lC@}*VvCkGs-b2Y31r2syOcrdV}M;4$RYK(OC*nb61ZF1 zNC>rJxc^Fo`wf=7HzMl(T}%J-s93?0MsENc?9M=7$I$w80xe6&Xq_~){3HiENg$qz+Y0|6VW^?O?6T+e+wW7jf17}YIX(!fP!(_J#4 zR&Xf3_o`5TOwX`Fy|G;z>rK^YE;p@LU2a;ny4*A}>2`q3Q@5m>k<4@}l9_HqGDo%X zfc6FEi?wiGG&?M&;iFUa~moM`QrFW&vU=9m_a>sTjlQay# zX?VzrLAcbl3gG;Rx=Yr&*;_(Rnu<{@<><8a}7%-!_2!>rW zqYj?5>VwfVF*Fz#KwYw71J@Nw@oyD!%COZDt~H{G^t7q5u0 zxX!TnS4v&NOOLA|E_6X5#562yYSz6G@B!rCrnhYTgJ6RKFhFK&BUT{S|F!}$F&p!) z9|Uy0<4XK{o%WF*K*{OTQtiRWLw1an>14-W6wA z^7o^xla}N+!+F3>u;hQzta0z2qlVRw;$oJJi7+5?$F%etqgn$l=x^yQ!()ix+O5Y% zLornUGAc4KivL7!Jwp*&#D6GSms_;tkD{!SB|GZCJK?vhyW?PqCEpWel`Q#Q&GPZo z?yg{ySP3ocifV1ip$+TfV=U*nodwW#(iKMe@%P*=V{7X#uL$vwj;SC zNBnE;8Q!p%?%3yU58!BJjTS!zS>gs=>e&idx}J%&MRnhy1uTA?E^kkh9M?(jje5RO z&*^1?bbSlk-=L40yhYEp9FQ*m@Adv!U2aJ)kHP%l~Wp4{7_hYS1CoDlzz6tlrC>ik36dF z+fyX=I7_tU^C!%0wR)rI|CrL(_-A3!BT8qBq&}?I>Gto^c-7nW zY_X_ay|%cP#ir8rOu6$8b!zITDQJv9FX-Z!t^n<(j$zIUPb#L)Z~dQT3` z|5@*$*AIj9BF{TKEdL_!#>}w%7kg)>hUE{eA9y@`4`1&Za`>KoBC-Fb@8KJ1Lk{1& zct|ec|NMyjmyO8(#{>Bk<8!>feL8)Eqi%c%->Ds#e_u)-Uat91rt)8d{4so?+vsM) zW>)eC`B+yt`@x#zv4abI8f!ov-h=#M_`e_d#M8cY@jPw#_cgz85fV7;)0$sETKfB9 z$@U65ULV2b802}c%BN~0?=dZ({vaa?OZjgebZ`#4lXo8S3I9oD!PoT>s0*e1Mc$dr zUMab$IKFO0{)JX3aeg=QFGyTla(6`jCq}^eqY>rlh7W7^$0PDz06o6fkVu^O zA%7U2hb4cI4o8rGA^85~UvNOSRj!ssz}b-UgL<_t`3Xcc$(JXF;q%)g@;@{p|8pbY z|LKVQZ;ifulJh&sn+PxI{!{~pdyQPXN$ldqlps+Q#l@cyk$FnZtYbvXdKLvc|jScvBCrwDOJUX0U;ed|@9` zdLd*W68$=B@P&n>5h6yo-g)j&SihBxB4Kb-7?8n}(#@oFn~MRiy5 zGIw9m=!IF}g?IL`$DnMxgLmoTk5){!D)<)NelL1oF|pnK*Mq)u`je95J{ZZ^_Cp+HY^~c2S!u_>6ZcC*8%pix? z9Aim97bpk#Hi7K$J@Ecy5Xv68+?}ECHD~v#Wwb?@$O0$=v=UqN#VudK_aggV33YFD z%GM3IftRyor@hq9mG0XlF&I)$-Z1UYO1!b(ewCI)f2%O|gpmvEDtVFtlQ9b1Wj9C%xqyHP3sY~Rs-MD#6L+Zx(^U&L+B5;w!X zqoXRuasK6=er&+Kr;E-1xX(J8Ol^SGzkzUEpK$rQFKfAXa>2(Herq)_U63NL8 zyg5H9FY`}QZ=+CCM)qX5shXPK0Ew<#Rj0B&sbOiffSvnS(R{N@$Uu%?WtoJ?cu>7{ z?z@CMeo+He_<1ViyGwbs+-|L`@Y70q#cv2%8icVVKZ2ko6w=_#_tWLjGp6Yb^HL6r z%h>r6&9@V#`MzTkS3h|A>891U_>G6Zl))$j&V-Y+$S%J1^q?-zVx@e96vM zpZK#*y8mm)vwKKJaVU#NU7!tF`&Qo~BMq%T#mYD=US;P$*NQyBYmC~r`rF7OP3*k@ zi)-0g-FB342XRdv9b6>qTl~w;_ZgwIlG$)}zAaVX;$(KV{#u)MZRfY8>RUX`&QDlJ zQ|%kPUrW`uxSO3dns3F0SJ4F$@6!6#O^eUj`AaIlR%fpz^vpL1NI$D@aXdTQ__1nf z`hPH0-{O6Co-n`)!02Z1{s0Nao=mOMXbKXBOiJ_GI1Q1-}uMs+xe@wm8>7dEw$o}+P*=s zdUpOss{W0cy;AhXjGVl^srv4&yT{-EhJV5`{4L&dW{P*?@#?M|u9oKc3H-B({k%vV zRzDr#G<59zx2R+3M0M|9X!~in17(phkOx3t()xe0l!Q81mhr=3^?yfSt)X9;Jkn)f zI->sB`&_MNDz2Zdf2r0__w(rwyZVo&;_X)7&Ih!95=W*V`3slx&P)66SUt-z>% literal 0 HcmV?d00001 diff --git a/lib/python3.4/site-packages/pip-8.1.1.dist-info/DESCRIPTION.rst b/lib/python3.4/site-packages/pip-9.0.1.dist-info/DESCRIPTION.rst similarity index 85% rename from lib/python3.4/site-packages/pip-8.1.1.dist-info/DESCRIPTION.rst rename to lib/python3.4/site-packages/pip-9.0.1.dist-info/DESCRIPTION.rst index 39586d2..8ef94c4 100644 --- a/lib/python3.4/site-packages/pip-8.1.1.dist-info/DESCRIPTION.rst +++ b/lib/python3.4/site-packages/pip-9.0.1.dist-info/DESCRIPTION.rst @@ -19,9 +19,12 @@ tool for installing Python packages. .. image:: https://img.shields.io/pypi/v/pip.svg :target: https://pypi.python.org/pypi/pip -.. image:: https://img.shields.io/travis/pypa/pip/develop.svg +.. image:: https://img.shields.io/travis/pypa/pip/master.svg :target: http://travis-ci.org/pypa/pip +.. image:: https://img.shields.io/appveyor/ci/pypa/pip.svg + :target: https://ci.appveyor.com/project/pypa/pip/history + .. image:: https://readthedocs.org/projects/pip/badge/?version=stable :target: https://pip.pypa.io/en/stable diff --git a/lib/python3.4/site-packages/netifaces-0.10.4.dist-info/INSTALLER b/lib/python3.4/site-packages/pip-9.0.1.dist-info/INSTALLER similarity index 100% rename from lib/python3.4/site-packages/netifaces-0.10.4.dist-info/INSTALLER rename to lib/python3.4/site-packages/pip-9.0.1.dist-info/INSTALLER diff --git a/lib/python3.4/site-packages/pip-8.1.1.dist-info/METADATA b/lib/python3.4/site-packages/pip-9.0.1.dist-info/METADATA similarity index 90% rename from lib/python3.4/site-packages/pip-8.1.1.dist-info/METADATA rename to lib/python3.4/site-packages/pip-9.0.1.dist-info/METADATA index 79657d0..600a905 100644 --- a/lib/python3.4/site-packages/pip-8.1.1.dist-info/METADATA +++ b/lib/python3.4/site-packages/pip-9.0.1.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.0 Name: pip -Version: 8.1.1 +Version: 9.0.1 Summary: The PyPA recommended tool for installing Python packages. Home-page: https://pip.pypa.io/ Author: The pip developers @@ -20,6 +20,7 @@ Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Python: >=2.6,!=3.0.*,!=3.1.*,!=3.2.* Provides-Extra: testing Requires-Dist: mock; extra == 'testing' Requires-Dist: pretend; extra == 'testing' @@ -48,9 +49,12 @@ tool for installing Python packages. .. image:: https://img.shields.io/pypi/v/pip.svg :target: https://pypi.python.org/pypi/pip -.. image:: https://img.shields.io/travis/pypa/pip/develop.svg +.. image:: https://img.shields.io/travis/pypa/pip/master.svg :target: http://travis-ci.org/pypa/pip +.. image:: https://img.shields.io/appveyor/ci/pypa/pip.svg + :target: https://ci.appveyor.com/project/pypa/pip/history + .. image:: https://readthedocs.org/projects/pip/badge/?version=stable :target: https://pip.pypa.io/en/stable diff --git a/lib/python3.4/site-packages/pip-8.1.1.dist-info/RECORD b/lib/python3.4/site-packages/pip-9.0.1.dist-info/RECORD similarity index 51% rename from lib/python3.4/site-packages/pip-8.1.1.dist-info/RECORD rename to lib/python3.4/site-packages/pip-9.0.1.dist-info/RECORD index 7e70ad9..86fe98d 100644 --- a/lib/python3.4/site-packages/pip-8.1.1.dist-info/RECORD +++ b/lib/python3.4/site-packages/pip-9.0.1.dist-info/RECORD @@ -1,117 +1,123 @@ -pip/__init__.py,sha256=fFs-ytm2H4V2evGESaozmF7U0BaGIMM0drFJZ5Ifj4s,10427 +pip/__init__.py,sha256=00QWSreEBjb8Y8sPs8HeqgLXSB-3UrONJxo4J5APxEc,11348 pip/__main__.py,sha256=V6Kh-IEDEFpt1cahRE6MajUF_14qJR_Qsvn4MjWZXzE,584 -pip/basecommand.py,sha256=Zlg6SE42TIjRyt1mct0LCkgNxcKKnss3xvASJyDqucE,11429 -pip/baseparser.py,sha256=Nlc7Un9gat27xtB24SnKL_3pZZOoh62gNNRdS6tDRZY,10465 -pip/cmdoptions.py,sha256=pf24iszA39rhcJ5DjFA4oD_z5vTI0NG98qUahHs3qPM,15878 -pip/download.py,sha256=oJ3sZ8I6ct9X3eoXQ9xm_Ne0e6N85G_rWaERmMCVF2k,31722 -pip/exceptions.py,sha256=GdDhHOROBj-kW2rgerLJYXsxN8ENy1BX5RUb_Vs9TXM,7980 -pip/index.py,sha256=kpyj_O5c0VVlvhg5VuVm4oAGGh6RvD7Xr0syPN-eGa0,37191 -pip/locations.py,sha256=MqUzS8YI2wDa7oFzTQw4zM4s0Hci05yubxfU_kTXXlU,5632 -pip/pep425tags.py,sha256=4PNr9hd8OsXnKYR2q2oLzfDDhF5bFBwUZA-ZQxAClSI,11318 +pip/basecommand.py,sha256=TTlmZesQ4Vuxcto2KqwZGmgmN5ioHEl_DeFev9ie_SA,11910 +pip/baseparser.py,sha256=AKMOeF3fTrRroiv0DmTQbdiLW0DQux2KqGC_dJJB9d0,10465 +pip/cmdoptions.py,sha256=pRptFz05iFEfSW4Flg3x1_P92sYlFvq7elhnwujikNY,16473 +pip/download.py,sha256=rA0wbmqC2n9ejX481YJSidmKgQqQDjdaxkHkHlAN68k,32171 +pip/exceptions.py,sha256=BvqH-Jw3tP2b-2IJ2kjrQemOAPMqKrQMLRIZHZQpJXk,8121 +pip/index.py,sha256=L6UhtAEZc2qw7BqfQrkPQcw2gCgEw3GukLRSA95BNyI,39950 +pip/locations.py,sha256=9rJRlgonC6QC2zGDIn_7mXaoZ9_tF_IHM2BQhWVRgbo,5626 +pip/pep425tags.py,sha256=q3kec4f6NHszuGYIhGIbVvs896D06uJAnKFgJ_wce44,10980 pip/status_codes.py,sha256=F6uDG6Gj7RNKQJUDnd87QKqI16Us-t-B0wPF_4QMpWc,156 -pip/wheel.py,sha256=qg1DgjXtiQCnY-IJY5HC5VgpeQm9WCjDKYmefSfOjq0,32088 -pip/_vendor/__init__.py,sha256=9EPZ-JLxtXMt71Fp5_pKTTe1QbJZZVlN81rsRYEvlpA,4781 -pip/commands/__init__.py,sha256=naZ1iIWRutNznOVpLj8qyn1GPE0B5rhCWCrSUOZSt4M,2145 -pip/commands/completion.py,sha256=2BEUY3jowgemiIGgUP3rpk6A9My4Eu8rTPosFxlESOE,1967 -pip/commands/download.py,sha256=dMRtH0JMBhNGlJWr1qC29vOeiBzG2K0OjOAfzdxSVgA,4804 -pip/commands/freeze.py,sha256=KmQoLf-HruqBDzc-F2-ganGVn2lboNQqppfyrMsx3SU,2774 +pip/wheel.py,sha256=QSWmGs2ui-n4UMWm0JUY6aMCcwNKungVzbWsxI9KlJQ,32010 +pip/_vendor/__init__.py,sha256=L-0x9jj0HSZen1Fm2U0GUbxfjfwQPIXc4XJ4IAxy8D8,4804 +pip/commands/__init__.py,sha256=2Uq3HCdjchJD9FL1LB7rd5v6UySVAVizX0W3EX3hIoE,2244 +pip/commands/check.py,sha256=-A7GI1-WZBh9a4P6UoH_aR-J7I8Lz8ly7m3wnCjmevs,1382 +pip/commands/completion.py,sha256=kkPgVX7SUcJ_8Juw5GkgWaxHN9_45wmAr9mGs1zXEEs,2453 +pip/commands/download.py,sha256=8RuuPmSYgAq3iEDTqZY_1PDXRqREdUULHNjWJeAv7Mo,7810 +pip/commands/freeze.py,sha256=h6-yFMpjCjbNj8-gOm5UuoF6cg14N5rPV4TCi3_CeuI,2835 pip/commands/hash.py,sha256=MCt4jEFyfoce0lVeNEz1x49uaTY-VDkKiBvvxrVcHkw,1597 pip/commands/help.py,sha256=84HWkEdnGP_AEBHnn8gJP2Te0XTXRKFoXqXopbOZTNo,982 -pip/commands/install.py,sha256=DvRVVwfUy6LV-AtNcxl9kLl7XOc7G7087ZhdD4QbP60,15628 -pip/commands/list.py,sha256=u76U5TLODQ2g53sSUA4q6WhYus7usbuWuITQJsCnP3E,7412 -pip/commands/search.py,sha256=9ClAcFzkJ_7AksTkNrUed5qzsplpBtMlJByJLqiZFqw,4777 -pip/commands/show.py,sha256=dytBbI9XV-ChpV51tsuBygZJJO-QaO2Gtz5kbLkBCZE,5815 +pip/commands/install.py,sha256=o-CR1TKf-b1qaFv47nNlawqsIfDjXyIzv_iJUw1Trag,18069 +pip/commands/list.py,sha256=93bCiFyt2Qut_YHkYHJMZHpXladmxsjS-yOtZeb3uqI,11369 +pip/commands/search.py,sha256=oTs9QNdefnrmCV_JeftG0PGiMuYVmiEDF1OUaYsmDao,4502 +pip/commands/show.py,sha256=ZYM57_7U8KP9MQIIyHKQdZxmiEZByy-DRzB697VFoTY,5891 pip/commands/uninstall.py,sha256=tz8cXz4WdpUdnt3RvpdQwH6_SNMB50egBIZWa1dwfcc,2884 -pip/commands/wheel.py,sha256=iT92Uo8qpVILl_Yk8L7AtkFVYGmY0ep5oDeyQSpwkLs,7528 -pip/compat/__init__.py,sha256=7WN0B0XMYIldfminnT679VoEJLxNQPi9MFwCIt1_llU,4669 +pip/commands/wheel.py,sha256=z5SEhws2YRMb0Ml1IEkg6jFZMLRpLl86bHCrQbYt5zo,7729 +pip/compat/__init__.py,sha256=2Xs_IpsmdRgHbQgQO0c8_lPvHJnQXHyGWxPbLbYJL4c,4672 pip/compat/dictconfig.py,sha256=dRrelPDWrceDSzFT51RTEVY2GuM7UDyc5Igh_tn4Fvk,23096 -pip/compat/ordereddict.py,sha256=6RQCd4PyTE4tvLUoAnsygvrreOSTV4BRDbc_4gCSkTs,4110 pip/models/__init__.py,sha256=0Rs7_RA4DxeOkWT5Cq4CQzDrSEhvYcN3TH2cazr72PE,71 pip/models/index.py,sha256=pUfbO__v3mD9j-2n_ClwPS8pVyx4l2wIwyvWt8GMCRA,487 pip/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/operations/freeze.py,sha256=H6xpxe1XgoNm5f3UXK47kNy0OQfM5jzo4UUwQu7G-Lo,4048 +pip/operations/check.py,sha256=uwUN9cs1sPo7c0Sj6pRrSv7b22Pk29SXUImTelVchMQ,1590 +pip/operations/freeze.py,sha256=k-7w7LsM-RpPv7ERBzHiPpYkH-GuYfHLyR-Cp_1VPL0,5194 pip/req/__init__.py,sha256=vFwZY8_Vc1WU1zFAespg1My_r_AT3n7cN0W9eX0EFqk,276 -pip/req/req_file.py,sha256=3eaVnPMUAjikLdC5i8hZUAf8aAOby2UxmAVFf94FOXY,11928 -pip/req/req_install.py,sha256=aG0_hj8WqLLUH5tO40OFIncIxU50Vm4rFqYcx5hmoYk,45589 -pip/req/req_set.py,sha256=Xwia1h7o2Z3Qogae3RHIDCGlXS3w2AeQPG8LBz7GmFM,32312 +pip/req/req_file.py,sha256=fG9MDsXUNPhmGwxUiwrIXEynyD8Q7s3L47-hLZPDXq0,11926 +pip/req/req_install.py,sha256=gYrH-lwQMmt55VVbav_EtRIPu94cQbHFHm_Kq6AeHbg,46487 +pip/req/req_set.py,sha256=jHspXqcA2FxcF05dgUIAZ5huYPv6bn0wRUX0Z7PKmaA,34462 pip/req/req_uninstall.py,sha256=fdH2VgCjEC8NRYDS7fRu3ZJaBBUEy-N5muwxDX5MBNM,6897 -pip/utils/__init__.py,sha256=SSixMJeh2SdjNgra_50jaC0jdmXFewLkFh_-a3tw9ks,28256 -pip/utils/appdirs.py,sha256=KTpZANfjYw5K2tZ0_jNNdP_kMxQAns79qZWelwaJo0c,7896 +pip/utils/__init__.py,sha256=zk1vF2EzHZX1ZKPwgeC9I6yKvs8IJ6NZEfXgp2IP8hI,27912 +pip/utils/appdirs.py,sha256=kj2LK-I2fC5QnEh_A_v-ev_IQMcXaWWF5DE39sNvCLQ,8811 pip/utils/build.py,sha256=4smLRrfSCmXmjEnVnMFh2tBEpNcSLRe6J0ejZJ-wWJE,1312 -pip/utils/deprecation.py,sha256=DR3cKqzovYu9Pif7c9bT2KmwekfW95N3BsI45_5u38I,2239 +pip/utils/deprecation.py,sha256=X_FMjtDbMJqfqEkdRrki-mYyIdPB6I6DHUTCA_ChY6M,2232 pip/utils/encoding.py,sha256=NQxGiFS5GbeAveLZTnx92t5r0PYqvt0iRnP2u9SGG1w,971 pip/utils/filesystem.py,sha256=ZEVBuYM3fqr2_lgOESh4Y7fPFszGD474zVm_M3Mb5Tk,899 +pip/utils/glibc.py,sha256=jcQYjt_oJLPKVZB28Kauy4Sw70zS-wawxoU1HHX36_0,2939 pip/utils/hashes.py,sha256=oMk7cd3PbJgzpSQyXq1MytMud5f6H5Oa2YY5hYuCq6I,2866 pip/utils/logging.py,sha256=7yWu4gZw-Qclj7X80QVdpGWkdTWGKT4LiUVKcE04pro,3327 pip/utils/outdated.py,sha256=fNwOCL5r2EftPGhgCYGMKu032HC8cV-JAr9lp0HmToM,5455 -pip/utils/setuptools_build.py,sha256=8IGop-SZ6lxUl5HMOjLRaDlORPugIH_b_b2Y67x4jQc,240 +pip/utils/packaging.py,sha256=qhmli14odw6DIhWJgQYS2Q0RrSbr8nXNcG48f5yTRms,2080 +pip/utils/setuptools_build.py,sha256=0blfscmNJW_iZ5DcswJeDB_PbtTEjfK9RL1R1WEDW2E,278 pip/utils/ui.py,sha256=pbDkSAeumZ6jdZcOJ2yAbx8iBgeP2zfpqNnLJK1gskQ,11597 -pip/vcs/__init__.py,sha256=lnea41zMq9HqB1Qo7hxy2IjUzk5WtBvnoloCCMR6Vk4,12349 +pip/vcs/__init__.py,sha256=WafFliUTHMmsSISV8PHp1M5EXDNSWyJr78zKaQmPLdY,12374 pip/vcs/bazaar.py,sha256=tYTwc4b4off8mr0O2o8SiGejqBDJxcbDBMSMd9-ISYc,3803 -pip/vcs/git.py,sha256=u16VCiNW_a9AaYqLri2b8-f4lOZlOYwsGpHHV3uv_dQ,10218 +pip/vcs/git.py,sha256=5LfWryi78A-2ULjEZJvCTarJ_3l8venwXASlwm8hiug,11197 pip/vcs/mercurial.py,sha256=xG6rDiwHCRytJEs23SIHBXl_SwQo2jkkdD_6rVVP5h4,3472 -pip/vcs/subversion.py,sha256=mGT7sAzuVc1u-9MPoXJNyShnRzhdJpDdGNuhhzUPv6w,8687 -pip-8.1.1.dist-info/DESCRIPTION.rst,sha256=jSvW1qOjwzndvm_p_DexGCVJfwgg3rWPMJWzf6Rmsfc,1167 -pip-8.1.1.dist-info/METADATA,sha256=p_9D2tGGDX-wd8S14XVVx0K-qOjDrrwu-CmYn9Dndlc,2362 -pip-8.1.1.dist-info/RECORD,, -pip-8.1.1.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 -pip-8.1.1.dist-info/entry_points.txt,sha256=GWc-Wb9WUKZ1EuVWNz-G0l3BeIpbNJLx0OJbZ61AAV0,68 -pip-8.1.1.dist-info/metadata.json,sha256=wAnzudgBGV69N0kQOAgeAXIjQSbkBZhZEs98ULrfRUE,1513 -pip-8.1.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -../../../bin/pip,sha256=MEQVvFZcu35ZQaa5ungLLm_kHRGvmD4u-AbMJaTm8vU,271 -../../../bin/pip3,sha256=MEQVvFZcu35ZQaa5ungLLm_kHRGvmD4u-AbMJaTm8vU,271 -../../../bin/pip3.4,sha256=MEQVvFZcu35ZQaa5ungLLm_kHRGvmD4u-AbMJaTm8vU,271 -pip-8.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pip/utils/__pycache__/deprecation.cpython-34.pyc,, -pip/commands/__pycache__/completion.cpython-34.pyc,, -pip/vcs/__pycache__/mercurial.cpython-34.pyc,, -pip/req/__pycache__/req_file.cpython-34.pyc,, -pip/__pycache__/pep425tags.cpython-34.pyc,, -pip/vcs/__pycache__/bazaar.cpython-34.pyc,, -pip/utils/__pycache__/setuptools_build.cpython-34.pyc,, -pip/commands/__pycache__/list.cpython-34.pyc,, -pip/__pycache__/__init__.cpython-34.pyc,, -pip/models/__pycache__/__init__.cpython-34.pyc,, -pip/commands/__pycache__/wheel.cpython-34.pyc,, -pip/utils/__pycache__/ui.cpython-34.pyc,, -pip/commands/__pycache__/help.cpython-34.pyc,, -pip/compat/__pycache__/ordereddict.cpython-34.pyc,, -pip/compat/__pycache__/__init__.cpython-34.pyc,, -pip/utils/__pycache__/logging.cpython-34.pyc,, -pip/commands/__pycache__/show.cpython-34.pyc,, -pip/req/__pycache__/__init__.cpython-34.pyc,, -pip/utils/__pycache__/filesystem.cpython-34.pyc,, -pip/vcs/__pycache__/git.cpython-34.pyc,, -pip/req/__pycache__/req_set.cpython-34.pyc,, -pip/utils/__pycache__/__init__.cpython-34.pyc,, -pip/operations/__pycache__/freeze.cpython-34.pyc,, -pip/compat/__pycache__/dictconfig.cpython-34.pyc,, -pip/commands/__pycache__/hash.cpython-34.pyc,, -pip/req/__pycache__/req_uninstall.cpython-34.pyc,, -pip/operations/__pycache__/__init__.cpython-34.pyc,, -pip/commands/__pycache__/__init__.cpython-34.pyc,, -pip/req/__pycache__/req_install.cpython-34.pyc,, -pip/utils/__pycache__/build.cpython-34.pyc,, -pip/utils/__pycache__/encoding.cpython-34.pyc,, -pip/__pycache__/basecommand.cpython-34.pyc,, -pip/__pycache__/download.cpython-34.pyc,, -pip/__pycache__/cmdoptions.cpython-34.pyc,, -pip/utils/__pycache__/outdated.cpython-34.pyc,, -pip/commands/__pycache__/download.cpython-34.pyc,, -pip/utils/__pycache__/appdirs.cpython-34.pyc,, +pip/vcs/subversion.py,sha256=GAuX2Sk7IZvJyEzENKcVld_wGBrQ3fpXDlXjapZEYdI,9350 +pip-9.0.1.dist-info/DESCRIPTION.rst,sha256=Va8Wj1XBpTbVQ2Z41mZRJdALEeziiS_ZewWn1H2ecY4,1287 +pip-9.0.1.dist-info/METADATA,sha256=mvs_tLoKAbECXY_6QHiVWQsagSL-1UjolQTpScT8JSk,2529 +pip-9.0.1.dist-info/RECORD,, +pip-9.0.1.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 +pip-9.0.1.dist-info/entry_points.txt,sha256=GWc-Wb9WUKZ1EuVWNz-G0l3BeIpbNJLx0OJbZ61AAV0,68 +pip-9.0.1.dist-info/metadata.json,sha256=aqvkETDy4mHUBob-2Fn5WWlXORi_M2OSfQ2HQCUU_Fk,1565 +pip-9.0.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +../../../bin/pip,sha256=kUtfTrIe4CRluRco6nKs-hUx0Eir2ABPF8Rr_1zK534,272 +../../../bin/pip3,sha256=kUtfTrIe4CRluRco6nKs-hUx0Eir2ABPF8Rr_1zK534,272 +../../../bin/pip3.4,sha256=kUtfTrIe4CRluRco6nKs-hUx0Eir2ABPF8Rr_1zK534,272 +pip-9.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 pip/__pycache__/exceptions.cpython-34.pyc,, -pip/__pycache__/__main__.cpython-34.pyc,, +pip/utils/__pycache__/ui.cpython-34.pyc,, +pip/__pycache__/basecommand.cpython-34.pyc,, +pip/commands/__pycache__/check.cpython-34.pyc,, +pip/utils/__pycache__/packaging.cpython-34.pyc,, +pip/utils/__pycache__/build.cpython-34.pyc,, pip/vcs/__pycache__/__init__.cpython-34.pyc,, -pip/vcs/__pycache__/subversion.cpython-34.pyc,, -pip/utils/__pycache__/hashes.cpython-34.pyc,, -pip/commands/__pycache__/uninstall.cpython-34.pyc,, -pip/__pycache__/baseparser.cpython-34.pyc,, -pip/commands/__pycache__/freeze.cpython-34.pyc,, +pip/__pycache__/download.cpython-34.pyc,, +pip/utils/__pycache__/setuptools_build.cpython-34.pyc,, +pip/req/__pycache__/req_uninstall.cpython-34.pyc,, +pip/utils/__pycache__/deprecation.cpython-34.pyc,, +pip/operations/__pycache__/check.cpython-34.pyc,, pip/_vendor/__pycache__/__init__.cpython-34.pyc,, -pip/commands/__pycache__/search.cpython-34.pyc,, -pip/__pycache__/locations.cpython-34.pyc,, +pip/utils/__pycache__/outdated.cpython-34.pyc,, pip/commands/__pycache__/install.cpython-34.pyc,, -pip/models/__pycache__/index.cpython-34.pyc,, -pip/__pycache__/index.cpython-34.pyc,, -pip/__pycache__/wheel.cpython-34.pyc,, +pip/operations/__pycache__/__init__.cpython-34.pyc,, +pip/commands/__pycache__/freeze.cpython-34.pyc,, +pip/req/__pycache__/req_set.cpython-34.pyc,, +pip/operations/__pycache__/freeze.cpython-34.pyc,, +pip/__pycache__/baseparser.cpython-34.pyc,, +pip/commands/__pycache__/hash.cpython-34.pyc,, +pip/commands/__pycache__/download.cpython-34.pyc,, +pip/commands/__pycache__/wheel.cpython-34.pyc,, +pip/commands/__pycache__/help.cpython-34.pyc,, +pip/utils/__pycache__/glibc.cpython-34.pyc,, +pip/__pycache__/locations.cpython-34.pyc,, +pip/commands/__pycache__/list.cpython-34.pyc,, +pip/compat/__pycache__/dictconfig.cpython-34.pyc,, +pip/__pycache__/__init__.cpython-34.pyc,, +pip/utils/__pycache__/hashes.cpython-34.pyc,, +pip/compat/__pycache__/__init__.cpython-34.pyc,, +pip/vcs/__pycache__/git.cpython-34.pyc,, +pip/req/__pycache__/__init__.cpython-34.pyc,, +pip/__pycache__/__main__.cpython-34.pyc,, pip/__pycache__/status_codes.cpython-34.pyc,, +pip/models/__pycache__/index.cpython-34.pyc,, +pip/__pycache__/pep425tags.cpython-34.pyc,, +pip/commands/__pycache__/uninstall.cpython-34.pyc,, +pip/vcs/__pycache__/bazaar.cpython-34.pyc,, +pip/req/__pycache__/req_install.cpython-34.pyc,, +pip/vcs/__pycache__/mercurial.cpython-34.pyc,, +pip/commands/__pycache__/__init__.cpython-34.pyc,, +pip/commands/__pycache__/show.cpython-34.pyc,, +pip/__pycache__/index.cpython-34.pyc,, +pip/commands/__pycache__/completion.cpython-34.pyc,, +pip/req/__pycache__/req_file.cpython-34.pyc,, +pip/__pycache__/cmdoptions.cpython-34.pyc,, +pip/utils/__pycache__/filesystem.cpython-34.pyc,, +pip/__pycache__/wheel.cpython-34.pyc,, +pip/utils/__pycache__/appdirs.cpython-34.pyc,, +pip/utils/__pycache__/__init__.cpython-34.pyc,, +pip/vcs/__pycache__/subversion.cpython-34.pyc,, +pip/utils/__pycache__/logging.cpython-34.pyc,, +pip/commands/__pycache__/search.cpython-34.pyc,, +pip/utils/__pycache__/encoding.cpython-34.pyc,, +pip/models/__pycache__/__init__.cpython-34.pyc,, diff --git a/lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/WHEEL b/lib/python3.4/site-packages/pip-9.0.1.dist-info/WHEEL similarity index 100% rename from lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/WHEEL rename to lib/python3.4/site-packages/pip-9.0.1.dist-info/WHEEL diff --git a/lib/python3.4/site-packages/pip-8.1.1.dist-info/entry_points.txt b/lib/python3.4/site-packages/pip-9.0.1.dist-info/entry_points.txt similarity index 100% rename from lib/python3.4/site-packages/pip-8.1.1.dist-info/entry_points.txt rename to lib/python3.4/site-packages/pip-9.0.1.dist-info/entry_points.txt diff --git a/lib/python3.4/site-packages/pip-8.1.1.dist-info/metadata.json b/lib/python3.4/site-packages/pip-9.0.1.dist-info/metadata.json similarity index 73% rename from lib/python3.4/site-packages/pip-8.1.1.dist-info/metadata.json rename to lib/python3.4/site-packages/pip-9.0.1.dist-info/metadata.json index 91434c5..9eae02c 100644 --- a/lib/python3.4/site-packages/pip-8.1.1.dist-info/metadata.json +++ b/lib/python3.4/site-packages/pip-9.0.1.dist-info/metadata.json @@ -1 +1 @@ -{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Topic :: Software Development :: Build Tools", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: Implementation :: PyPy"], "extensions": {"python.commands": {"wrap_console": {"pip": "pip:main", "pip3": "pip:main", "pip3.5": "pip:main"}}, "python.details": {"contacts": [{"email": "python-virtualenv@groups.google.com", "name": "The pip developers", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://pip.pypa.io/"}}, "python.exports": {"console_scripts": {"pip": "pip:main", "pip3": "pip:main", "pip3.5": "pip:main"}}}, "extras": ["testing"], "generator": "bdist_wheel (0.29.0)", "keywords": ["easy_install", "distutils", "setuptools", "egg", "virtualenv"], "license": "MIT", "metadata_version": "2.0", "name": "pip", "run_requires": [{"extra": "testing", "requires": ["mock", "pretend", "pytest", "scripttest (>=1.3)", "virtualenv (>=1.10)"]}], "summary": "The PyPA recommended tool for installing Python packages.", "test_requires": [{"requires": ["mock", "pretend", "pytest", "scripttest (>=1.3)", "virtualenv (>=1.10)"]}], "version": "8.1.1"} \ No newline at end of file +{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Topic :: Software Development :: Build Tools", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: Implementation :: PyPy"], "extensions": {"python.commands": {"wrap_console": {"pip": "pip:main", "pip3": "pip:main", "pip3.5": "pip:main"}}, "python.details": {"contacts": [{"email": "python-virtualenv@groups.google.com", "name": "The pip developers", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://pip.pypa.io/"}}, "python.exports": {"console_scripts": {"pip": "pip:main", "pip3": "pip:main", "pip3.5": "pip:main"}}}, "extras": ["testing"], "generator": "bdist_wheel (0.29.0)", "keywords": ["easy_install", "distutils", "setuptools", "egg", "virtualenv"], "license": "MIT", "metadata_version": "2.0", "name": "pip", "requires_python": ">=2.6,!=3.0.*,!=3.1.*,!=3.2.*", "run_requires": [{"extra": "testing", "requires": ["mock", "pretend", "pytest", "scripttest (>=1.3)", "virtualenv (>=1.10)"]}], "summary": "The PyPA recommended tool for installing Python packages.", "test_requires": [{"requires": ["mock", "pretend", "pytest", "scripttest (>=1.3)", "virtualenv (>=1.10)"]}], "version": "9.0.1"} \ No newline at end of file diff --git a/lib/python3.4/site-packages/pip-8.1.1.dist-info/top_level.txt b/lib/python3.4/site-packages/pip-9.0.1.dist-info/top_level.txt similarity index 100% rename from lib/python3.4/site-packages/pip-8.1.1.dist-info/top_level.txt rename to lib/python3.4/site-packages/pip-9.0.1.dist-info/top_level.txt diff --git a/lib/python3.4/site-packages/pip/__init__.py b/lib/python3.4/site-packages/pip/__init__.py index 51e7eaf..9c1d8f9 100644 --- a/lib/python3.4/site-packages/pip/__init__.py +++ b/lib/python3.4/site-packages/pip/__init__.py @@ -10,6 +10,18 @@ import warnings import sys import re +# 2016-06-17 barry@debian.org: urllib3 1.14 added optional support for socks, +# but if invoked (i.e. imported), it will issue a warning to stderr if socks +# isn't available. requests unconditionally imports urllib3's socks contrib +# module, triggering this warning. The warning breaks DEP-8 tests (because of +# the stderr output) and is just plain annoying in normal usage. I don't want +# to add socks as yet another dependency for pip, nor do I want to allow-stder +# in the DEP-8 tests, so just suppress the warning. pdb tells me this has to +# be done before the import of pip.vcs. +from pip._vendor.requests.packages.urllib3.exceptions import DependencyWarning +warnings.filterwarnings("ignore", category=DependencyWarning) # noqa + + from pip.exceptions import InstallationError, CommandError, PipError from pip.utils import get_installed_distributions, get_prog from pip.utils import deprecation, dist_is_editable @@ -31,12 +43,12 @@ import pip.cmdoptions cmdoptions = pip.cmdoptions # The version as used in the setup.py and the docs conf.py -__version__ = "8.1.1" +__version__ = "9.0.1" logger = logging.getLogger(__name__) -# Hide the InsecureRequestWArning from urllib3 +# Hide the InsecureRequestWarning from urllib3 warnings.filterwarnings("ignore", category=InsecureRequestWarning) @@ -44,7 +56,7 @@ def autocomplete(): """Command and option completion for the main option parser (and options) and its subcommands (and options). - Enable by sourcing one of the completion shell scripts (bash or zsh). + Enable by sourcing one of the completion shell scripts (bash, zsh or fish). """ # Don't complete if user hasn't sourced bash_completion file. if 'PIP_AUTO_COMPLETE' not in os.environ: @@ -212,7 +224,11 @@ def main(args=None): # Needed for locale.getpreferredencoding(False) to work # in pip.utils.encoding.auto_decode - locale.setlocale(locale.LC_ALL, '') + try: + locale.setlocale(locale.LC_ALL, '') + except locale.Error as e: + # setlocale can apparently crash if locale are uninitialized + logger.debug("Ignoring error %s when setting locale", e) command = commands_dict[cmd_name](isolated=check_isolated(cmd_args)) return command.main(cmd_args) diff --git a/lib/python3.4/site-packages/pip/_vendor/__init__.py b/lib/python3.4/site-packages/pip/_vendor/__init__.py index a822a5b..8e76ab8 100644 --- a/lib/python3.4/site-packages/pip/_vendor/__init__.py +++ b/lib/python3.4/site-packages/pip/_vendor/__init__.py @@ -64,6 +64,7 @@ if DEBUNDLED: vendored("cachecontrol") vendored("colorama") vendored("distlib") + vendored("distro") vendored("html5lib") vendored("lockfile") vendored("six") diff --git a/lib/python3.4/site-packages/pip/basecommand.py b/lib/python3.4/site-packages/pip/basecommand.py index a07043a..54c6706 100644 --- a/lib/python3.4/site-packages/pip/basecommand.py +++ b/lib/python3.4/site-packages/pip/basecommand.py @@ -117,6 +117,12 @@ class Command(object): else: level = "INFO" + # The root logger should match the "console" level *unless* we + # specified "--log" to send debug logs to a file. + root_level = level + if options.log: + root_level = "DEBUG" + logging_dictConfig({ "version": 1, "disable_existing_loggers": False, @@ -155,7 +161,7 @@ class Command(object): }, }, "root": { - "level": level, + "level": root_level, "handlers": list(filter(None, [ "console", "console_errors", @@ -305,13 +311,15 @@ class RequirementCommand(Command): 'to %(name)s (see "pip help %(name)s")' % opts) logger.warning(msg) - def _build_package_finder(self, options, session): + def _build_package_finder(self, options, session, + platform=None, python_versions=None, + abi=None, implementation=None): """ Create a package finder appropriate to this requirement command. """ index_urls = [options.index_url] + options.extra_index_urls if options.no_index: - logger.info('Ignoring indexes: %s', ','.join(index_urls)) + logger.debug('Ignoring indexes: %s', ','.join(index_urls)) index_urls = [] return PackageFinder( @@ -322,4 +330,8 @@ class RequirementCommand(Command): allow_all_prereleases=options.pre, process_dependency_links=options.process_dependency_links, session=session, + platform=platform, + versions=python_versions, + abi=abi, + implementation=implementation, ) diff --git a/lib/python3.4/site-packages/pip/baseparser.py b/lib/python3.4/site-packages/pip/baseparser.py index ccbf36b..2dd4533 100644 --- a/lib/python3.4/site-packages/pip/baseparser.py +++ b/lib/python3.4/site-packages/pip/baseparser.py @@ -113,6 +113,7 @@ class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter): 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) @@ -273,7 +274,7 @@ class ConfigOptionParser(CustomOptionParser): yield (_environ_prefix_re.sub("", key).lower(), val) def get_default_values(self): - """Overridding to make updating the defaults after instantiation of + """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. diff --git a/lib/python3.4/site-packages/pip/cmdoptions.py b/lib/python3.4/site-packages/pip/cmdoptions.py index 1fade87..f75c093 100644 --- a/lib/python3.4/site-packages/pip/cmdoptions.py +++ b/lib/python3.4/site-packages/pip/cmdoptions.py @@ -114,7 +114,10 @@ quiet = partial( dest='quiet', action='count', default=0, - help='Give less output.') + help=('Give less output. Option is additive, and can be used up to 3' + ' times (corresponding to WARNING, ERROR, and CRITICAL logging' + ' levels).') +) log = partial( Option, @@ -184,12 +187,12 @@ def exists_action(): '--exists-action', dest='exists_action', type='choice', - choices=['s', 'i', 'w', 'b'], + 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.") + "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.") cert = partial( @@ -216,7 +219,10 @@ index_url = partial( dest='index_url', metavar='URL', default=PyPI.simple_url, - help='Base URL of Python Package Index (default %default).') + help="Base URL of 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.") def extra_index_url(): @@ -226,7 +232,9 @@ def extra_index_url(): metavar='URL', action='append', default=[], - help='Extra URLs of package indexes to use in addition to --index-url.' + help="Extra URLs of package indexes to use in addition to " + "--index-url. Should follow the same rules as " + "--index-url." ) @@ -469,6 +477,13 @@ build_dir = partial( help='Directory to unpack packages into and build in.' ) +ignore_requires_python = partial( + Option, + '--ignore-requires-python', + dest='ignore_requires_python', + action='store_true', + help='Ignore the Requires-Python information.') + install_options = partial( Option, '--install-option', @@ -510,7 +525,7 @@ disable_pip_version_check = partial( "--disable-pip-version-check", dest="disable_pip_version_check", action="store_true", - default=False, + default=True, help="Don't periodically check PyPI to determine whether a new version " "of pip is available for download. Implied with --no-index.") diff --git a/lib/python3.4/site-packages/pip/commands/__init__.py b/lib/python3.4/site-packages/pip/commands/__init__.py index 92b7ff5..62c64eb 100644 --- a/lib/python3.4/site-packages/pip/commands/__init__.py +++ b/lib/python3.4/site-packages/pip/commands/__init__.py @@ -9,6 +9,7 @@ from pip.commands.freeze import FreezeCommand from pip.commands.hash import HashCommand from pip.commands.help import HelpCommand from pip.commands.list import ListCommand +from pip.commands.check import CheckCommand from pip.commands.search import SearchCommand from pip.commands.show import ShowCommand from pip.commands.install import InstallCommand @@ -27,6 +28,7 @@ commands_dict = { UninstallCommand.name: UninstallCommand, DownloadCommand.name: DownloadCommand, ListCommand.name: ListCommand, + CheckCommand.name: CheckCommand, WheelCommand.name: WheelCommand, } @@ -38,6 +40,7 @@ commands_order = [ FreezeCommand, ListCommand, ShowCommand, + CheckCommand, SearchCommand, WheelCommand, HashCommand, diff --git a/lib/python3.4/site-packages/pip/commands/check.py b/lib/python3.4/site-packages/pip/commands/check.py new file mode 100644 index 0000000..70458ad --- /dev/null +++ b/lib/python3.4/site-packages/pip/commands/check.py @@ -0,0 +1,39 @@ +import logging + +from pip.basecommand import Command +from pip.operations.check import check_requirements +from pip.utils import get_installed_distributions + + +logger = logging.getLogger(__name__) + + +class CheckCommand(Command): + """Verify installed packages have compatible dependencies.""" + name = 'check' + usage = """ + %prog [options]""" + summary = 'Verify installed packages have compatible dependencies.' + + def run(self, options, args): + dists = get_installed_distributions(local_only=False, skip=()) + missing_reqs_dict, incompatible_reqs_dict = check_requirements(dists) + + for dist in dists: + key = '%s==%s' % (dist.project_name, dist.version) + + for requirement in missing_reqs_dict.get(key, []): + logger.info( + "%s %s requires %s, which is not installed.", + dist.project_name, dist.version, requirement.project_name) + + for requirement, actual in incompatible_reqs_dict.get(key, []): + logger.info( + "%s %s has requirement %s, but you have %s %s.", + dist.project_name, dist.version, requirement, + actual.project_name, actual.version) + + if missing_reqs_dict or incompatible_reqs_dict: + return 1 + else: + logger.info("No broken requirements found.") diff --git a/lib/python3.4/site-packages/pip/commands/completion.py b/lib/python3.4/site-packages/pip/commands/completion.py index dc80af3..66e41a6 100644 --- a/lib/python3.4/site-packages/pip/commands/completion.py +++ b/lib/python3.4/site-packages/pip/commands/completion.py @@ -26,13 +26,21 @@ function _pip_completion { PIP_AUTO_COMPLETE=1 $words[1] ) ) } compctl -K _pip_completion pip +""", '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 pip """} class CompletionCommand(Command): """A helper command to be used for command completion.""" name = 'completion' - summary = 'A helper command used for command completion' + summary = 'A helper command used for command completion.' def __init__(self, *args, **kw): super(CompletionCommand, self).__init__(*args, **kw) @@ -51,6 +59,12 @@ class CompletionCommand(Command): const='zsh', dest='shell', help='Emit completion code for zsh') + 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, cmd_opts) diff --git a/lib/python3.4/site-packages/pip/commands/download.py b/lib/python3.4/site-packages/pip/commands/download.py index 4155e05..4bc0640 100644 --- a/lib/python3.4/site-packages/pip/commands/download.py +++ b/lib/python3.4/site-packages/pip/commands/download.py @@ -3,6 +3,8 @@ from __future__ import absolute_import import logging import os +from pip.exceptions import CommandError +from pip.index import FormatControl from pip.req import RequirementSet from pip.basecommand import RequirementCommand from pip import cmdoptions @@ -63,6 +65,53 @@ class DownloadCommand(RequirementCommand): help=("Download packages into ."), ) + cmd_opts.add_option( + '--platform', + dest='platform', + metavar='platform', + default=None, + help=("Only download wheels compatible with . " + "Defaults to the platform of the running system."), + ) + + cmd_opts.add_option( + '--python-version', + dest='python_version', + metavar='python_version', + default=None, + help=("Only download wheels compatible with Python " + "interpreter version . If not specified, then the " + "current system interpreter minor version is used. A major " + "version (e.g. '2') can be specified to match all " + "minor revs of that major version. A minor version " + "(e.g. '34') can also be specified."), + ) + + cmd_opts.add_option( + '--implementation', + dest='implementation', + metavar='implementation', + default=None, + help=("Only download 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."), + ) + + cmd_opts.add_option( + '--abi', + dest='abi', + metavar='abi', + default=None, + help=("Only download 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."), + ) + index_opts = cmdoptions.make_option_group( cmdoptions.non_deprecated_index_group, self.parser, @@ -73,14 +122,41 @@ class DownloadCommand(RequirementCommand): def run(self, options, args): options.ignore_installed = True + + if options.python_version: + python_versions = [options.python_version] + else: + python_versions = None + + dist_restriction_set = any([ + options.python_version, + options.platform, + options.abi, + options.implementation, + ]) + binary_only = FormatControl(set(), set([':all:'])) + if dist_restriction_set and options.format_control != binary_only: + raise CommandError( + "--only-binary=:all: must be set and --no-binary must not " + "be set (or must be set to :none:) when restricting platform " + "and interpreter constraints using --python-version, " + "--platform, --abi, or --implementation." + ) + options.src_dir = os.path.abspath(options.src_dir) options.download_dir = normalize_path(options.download_dir) ensure_dir(options.download_dir) with self._build_session(options) as session: - - finder = self._build_package_finder(options, session) + finder = self._build_package_finder( + options=options, + session=session, + platform=options.platform, + python_versions=python_versions, + abi=options.abi, + implementation=options.implementation, + ) build_delete = (not (options.no_clean or options.build_dir)) if options.cache_dir and not check_path_owner(options.cache_dir): logger.warning( diff --git a/lib/python3.4/site-packages/pip/commands/freeze.py b/lib/python3.4/site-packages/pip/commands/freeze.py index 0485d5f..c198796 100644 --- a/lib/python3.4/site-packages/pip/commands/freeze.py +++ b/lib/python3.4/site-packages/pip/commands/freeze.py @@ -29,12 +29,13 @@ class FreezeCommand(Command): self.cmd_opts.add_option( '-r', '--requirement', - dest='requirement', - action='store', - default=None, + dest='requirements', + action='append', + default=[], metavar='file', help="Use the order in the given requirements file and its " - "comments when generating output.") + "comments when generating output. This option can be " + "used multiple times.") self.cmd_opts.add_option( '-f', '--find-links', dest='find_links', @@ -73,7 +74,7 @@ class FreezeCommand(Command): skip.update(DEV_PKGS) freeze_kwargs = dict( - requirement=options.requirement, + requirement=options.requirements, find_links=options.find_links, local_only=options.local, user_only=options.user, diff --git a/lib/python3.4/site-packages/pip/commands/install.py b/lib/python3.4/site-packages/pip/commands/install.py index 13b328f..39292b1 100644 --- a/lib/python3.4/site-packages/pip/commands/install.py +++ b/lib/python3.4/site-packages/pip/commands/install.py @@ -18,7 +18,7 @@ from pip.exceptions import ( InstallationError, CommandError, PreviousBuildDirError, ) from pip import cmdoptions -from pip.utils import ensure_dir +from pip.utils import ensure_dir, get_installed_version from pip.utils.build import BuildDirectory from pip.utils.deprecation import RemovedInPip10Warning from pip.utils.filesystem import check_path_owner @@ -95,8 +95,21 @@ class InstallCommand(RequirementCommand): dest='upgrade', action='store_true', help='Upgrade all specified packages to the newest available ' - 'version. This process is recursive regardless of whether ' - 'a dependency is already satisfied.' + 'version. The handling of dependencies depends on the ' + 'upgrade-strategy used.' + ) + + cmd_opts.add_option( + '--upgrade-strategy', + dest='upgrade_strategy', + default='eager', + choices=['only-if-needed', 'eager'], + help='Determines how dependency upgrading should be handled. ' + '"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).' ) cmd_opts.add_option( @@ -113,6 +126,7 @@ class InstallCommand(RequirementCommand): default=default_user, help='Ignore the installed packages (reinstalling instead).') + cmd_opts.add_option(cmdoptions.ignore_requires_python()) cmd_opts.add_option(cmdoptions.no_deps()) cmd_opts.add_option(cmdoptions.install_options()) @@ -197,6 +211,15 @@ class InstallCommand(RequirementCommand): cmdoptions.resolve_wheel_no_use_binary(options) cmdoptions.check_install_build_global(options) + if options.as_egg: + warnings.warn( + "--egg has been deprecated and will be removed in the future. " + "This flag is mutually exclusive with large parts of pip, and " + "actually using it invalidates pip's ability to manage the " + "installation process.", + RemovedInPip10Warning, + ) + if options.allow_external: warnings.warn( "--allow-external has been deprecated and will be removed in " @@ -287,9 +310,11 @@ class InstallCommand(RequirementCommand): src_dir=options.src_dir, download_dir=options.download_dir, upgrade=options.upgrade, + upgrade_strategy=options.upgrade_strategy, as_egg=options.as_egg, ignore_installed=options.ignore_installed, ignore_dependencies=options.ignore_dependencies, + ignore_requires_python=options.ignore_requires_python, force_reinstall=options.force_reinstall, use_user_site=options.use_user_site, target_dir=temp_target_dir, @@ -334,6 +359,14 @@ class InstallCommand(RequirementCommand): root=options.root_path, prefix=options.prefix_path, ) + + possible_lib_locations = get_lib_location_guesses( + user=options.use_user_site, + home=temp_target_dir, + root=options.root_path, + prefix=options.prefix_path, + isolated=options.isolated_mode, + ) reqs = sorted( requirement_set.successfully_installed, key=operator.attrgetter('name')) @@ -341,9 +374,11 @@ class InstallCommand(RequirementCommand): for req in reqs: item = req.name try: - if hasattr(req, 'installed_version'): - if req.installed_version: - item += '-' + req.installed_version + installed_version = get_installed_version( + req.name, possible_lib_locations + ) + if installed_version: + item += '-' + installed_version except Exception: pass items.append(item) @@ -370,35 +405,51 @@ class InstallCommand(RequirementCommand): if options.target_dir: ensure_dir(options.target_dir) - lib_dir = distutils_scheme('', home=temp_target_dir)['purelib'] + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + lib_dir_list = [] - for item in os.listdir(lib_dir): - target_item_dir = os.path.join(options.target_dir, item) - if os.path.exists(target_item_dir): - if not options.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) + purelib_dir = distutils_scheme('', home=temp_target_dir)['purelib'] + platlib_dir = distutils_scheme('', home=temp_target_dir)['platlib'] - shutil.move( - os.path.join(lib_dir, item), - target_item_dir - ) + 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) + + for lib_dir in lib_dir_list: + for item in os.listdir(lib_dir): + target_item_dir = os.path.join(options.target_dir, item) + if os.path.exists(target_item_dir): + if not options.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 + ) shutil.rmtree(temp_target_dir) return requirement_set + + +def get_lib_location_guesses(*args, **kwargs): + scheme = distutils_scheme('', *args, **kwargs) + return [scheme['purelib'], scheme['platlib']] diff --git a/lib/python3.4/site-packages/pip/commands/list.py b/lib/python3.4/site-packages/pip/commands/list.py index 5346488..6f6995d 100644 --- a/lib/python3.4/site-packages/pip/commands/list.py +++ b/lib/python3.4/site-packages/pip/commands/list.py @@ -1,7 +1,14 @@ from __future__ import absolute_import +import json import logging import warnings +try: + from itertools import zip_longest +except ImportError: + from itertools import izip_longest as zip_longest + +from pip._vendor import six from pip.basecommand import Command from pip.exceptions import CommandError @@ -11,7 +18,6 @@ from pip.utils import ( from pip.utils.deprecation import RemovedInPip10Warning from pip.cmdoptions import make_option_group, index_group - logger = logging.getLogger(__name__) @@ -68,6 +74,23 @@ class ListCommand(Command): "pip only finds stable versions."), ) + cmd_opts.add_option( + '--format', + action='store', + dest='list_format', + choices=('legacy', 'columns', 'freeze', 'json'), + help="Select the output format among: legacy (default), columns, " + "freeze or json.", + ) + + cmd_opts.add_option( + '--not-required', + action='store_true', + dest='not_required', + help="List packages that are not dependencies of " + "installed packages.", + ) + index_opts = make_option_group(index_group, self.parser) self.parser.insert_option_group(0, index_opts) @@ -110,38 +133,62 @@ class ListCommand(Command): "no longer has any effect.", RemovedInPip10Warning, ) + + if options.list_format is None: + warnings.warn( + "The default format will switch to columns in the future. " + "You can use --format=(legacy|columns) (or define a " + "format=(legacy|columns) in your pip.conf under the [list] " + "section) to disable this warning.", + RemovedInPip10Warning, + ) + if options.outdated and options.uptodate: raise CommandError( "Options --outdated and --uptodate cannot be combined.") + packages = get_installed_distributions( + local_only=options.local, + user_only=options.user, + editables_only=options.editable, + ) + if options.outdated: - self.run_outdated(options) + packages = self.get_outdated(packages, options) elif options.uptodate: - self.run_uptodate(options) - else: - self.run_listing(options) + packages = self.get_uptodate(packages, options) - def run_outdated(self, options): - for dist, latest_version, typ in sorted( - self.find_packages_latest_versions(options), - key=lambda p: p[0].project_name.lower()): - if latest_version > dist.parsed_version: - logger.info( - '%s - Latest: %s [%s]', - self.output_package(dist), latest_version, typ, - ) + if options.not_required: + packages = self.get_not_required(packages, options) - def find_packages_latest_versions(self, options): + self.output_package_listing(packages, options) + + def get_outdated(self, packages, options): + 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): + 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): + dep_keys = set() + for dist in packages: + dep_keys.update(requirement.key for requirement in dist.requires()) + return set(pkg for pkg in packages if pkg.key not in dep_keys) + + def iter_packages_latest_infos(self, packages, options): index_urls = [options.index_url] + options.extra_index_urls if options.no_index: - logger.info('Ignoring indexes: %s', ','.join(index_urls)) + logger.debug('Ignoring indexes: %s', ','.join(index_urls)) index_urls = [] dependency_links = [] - for dist in get_installed_distributions( - local_only=options.local, - user_only=options.user, - editables_only=options.editable): + for dist in packages: if dist.has_metadata('dependency_links.txt'): dependency_links.extend( dist.get_metadata_lines('dependency_links.txt'), @@ -151,12 +198,7 @@ class ListCommand(Command): finder = self._build_package_finder(options, index_urls, session) finder.add_dependency_links(dependency_links) - installed_packages = get_installed_distributions( - local_only=options.local, - user_only=options.user, - editables_only=options.editable, - ) - for dist in installed_packages: + for dist in packages: typ = 'unknown' all_candidates = finder.find_all_candidates(dist.key) if not options.pre: @@ -173,17 +215,12 @@ class ListCommand(Command): typ = 'wheel' else: typ = 'sdist' - yield dist, remote_version, typ + # This is dirty but makes the rest of the code much cleaner + dist.latest_version = remote_version + dist.latest_filetype = typ + yield dist - def run_listing(self, options): - installed_packages = get_installed_distributions( - local_only=options.local, - user_only=options.user, - editables_only=options.editable, - ) - self.output_package_listing(installed_packages) - - def output_package(self, dist): + def output_legacy(self, dist): if dist_is_editable(dist): return '%s (%s, %s)' % ( dist.project_name, @@ -193,17 +230,108 @@ class ListCommand(Command): else: return '%s (%s)' % (dist.project_name, dist.version) - def output_package_listing(self, installed_packages): - installed_packages = sorted( - installed_packages, + def output_legacy_latest(self, dist): + return '%s - Latest: %s [%s]' % ( + self.output_legacy(dist), + dist.latest_version, + dist.latest_filetype, + ) + + def output_package_listing(self, packages, options): + packages = sorted( + packages, key=lambda dist: dist.project_name.lower(), ) - for dist in installed_packages: - logger.info(self.output_package(dist)) + 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: + logger.info("%s==%s", dist.project_name, dist.version) + elif options.list_format == 'json': + logger.info(format_for_json(packages, options)) + else: # legacy + for dist in packages: + if options.outdated: + logger.info(self.output_legacy_latest(dist)) + else: + logger.info(self.output_legacy(dist)) - def run_uptodate(self, options): - uptodate = [] - for dist, version, typ in self.find_packages_latest_versions(options): - if dist.parsed_version == version: - uptodate.append(dist) - self.output_package_listing(uptodate) + def output_package_listing_columns(self, data, header): + # 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: + logger.info(val) + + +def tabulate(vals): + # From pfmoore on GitHub: + # https://github.com/pypa/pip/issues/3651#issuecomment-216932564 + assert len(vals) > 0 + + sizes = [0] * max(len(x) for x in vals) + for row in vals: + sizes = [max(s, len(str(c))) for s, c in zip_longest(sizes, row)] + + result = [] + for row in vals: + display = " ".join([str(c).ljust(s) if c is not None else '' + for s, c in zip_longest(sizes, row)]) + result.append(display) + + return result, sizes + + +def format_for_columns(pkgs, options): + """ + 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 any(dist_is_editable(x) for x in pkgs): + header.append("Location") + + 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 dist_is_editable(proj): + row.append(proj.location) + + data.append(row) + + return data, header + + +def format_for_json(packages, options): + data = [] + for dist in packages: + info = { + 'name': dist.project_name, + 'version': six.text_type(dist.version), + } + 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/lib/python3.4/site-packages/pip/commands/search.py b/lib/python3.4/site-packages/pip/commands/search.py index 3155e18..bd2ea8a 100644 --- a/lib/python3.4/site-packages/pip/commands/search.py +++ b/lib/python3.4/site-packages/pip/commands/search.py @@ -5,12 +5,14 @@ import sys import textwrap from pip.basecommand import Command, SUCCESS +from pip.compat import OrderedDict from pip.download import PipXmlrpcTransport from pip.models import PyPI from pip.utils import get_terminal_size from pip.utils.logging import indent_log from pip.exceptions import CommandError from pip.status_codes import NO_MATCHES_FOUND +from pip._vendor.packaging.version import parse as parse_version from pip._vendor import pkg_resources from pip._vendor.six.moves import xmlrpc_client @@ -28,7 +30,7 @@ class SearchCommand(Command): def __init__(self, *args, **kw): super(SearchCommand, self).__init__(*args, **kw) self.cmd_opts.add_option( - '--index', + '-i', '--index', dest='index', metavar='URL', default=PyPI.pypi_url, @@ -67,21 +69,17 @@ def transform_hits(hits): packages with the list of versions stored inline. This converts the list from pypi into one we can use. """ - packages = {} + packages = OrderedDict() for hit in hits: name = hit['name'] summary = hit['summary'] version = hit['version'] - score = hit['_pypi_ordering'] - if score is None: - score = 0 if name not in packages.keys(): packages[name] = { 'name': name, 'summary': summary, 'versions': [version], - 'score': score, } else: packages[name]['versions'].append(version) @@ -89,16 +87,8 @@ def transform_hits(hits): # if this is the highest version, replace summary and score if version == highest_version(packages[name]['versions']): packages[name]['summary'] = summary - packages[name]['score'] = score - # each record has a unique name now, so we will convert the dict into a - # list sorted by score - package_list = sorted( - packages.values(), - key=lambda x: x['score'], - reverse=True, - ) - return package_list + return list(packages.values()) def print_results(hits, name_column_width=None, terminal_width=None): @@ -116,12 +106,11 @@ def print_results(hits, name_column_width=None, terminal_width=None): summary = hit['summary'] or '' version = hit.get('versions', ['-'])[-1] if terminal_width is not None: - # wrap and indent summary to fit terminal - summary = textwrap.wrap( - summary, - terminal_width - name_column_width - 5, - ) - summary = ('\n' + ' ' * (name_column_width + 3)).join(summary) + target_width = terminal_width - name_column_width - 5 + if target_width > 10: + # wrap and indent summary to fit terminal + summary = textwrap.wrap(summary, target_width) + summary = ('\n' + ' ' * (name_column_width + 3)).join(summary) line = '%-*s - %s' % (name_column_width, '%s (%s)' % (name, version), summary) @@ -141,6 +130,4 @@ def print_results(hits, name_column_width=None, terminal_width=None): def highest_version(versions): - return next(iter( - sorted(versions, key=pkg_resources.parse_version, reverse=True) - )) + return max(versions, key=parse_version) diff --git a/lib/python3.4/site-packages/pip/commands/show.py b/lib/python3.4/site-packages/pip/commands/show.py index 52a673a..111c16d 100644 --- a/lib/python3.4/site-packages/pip/commands/show.py +++ b/lib/python3.4/site-packages/pip/commands/show.py @@ -7,6 +7,7 @@ import os from pip.basecommand import Command from pip.status_codes import SUCCESS, ERROR from pip._vendor import pkg_resources +from pip._vendor.packaging.utils import canonicalize_name logger = logging.getLogger(__name__) @@ -37,7 +38,8 @@ class ShowCommand(Command): query = args results = search_packages_info(query) - if not print_results(results, options.files): + if not print_results( + results, list_files=options.files, verbose=options.verbose): return ERROR return SUCCESS @@ -49,9 +51,12 @@ def search_packages_info(query): pip generated 'installed-files.txt' in the distributions '.egg-info' directory. """ - installed = dict( - [(p.project_name.lower(), p) for p in pkg_resources.working_set]) - query_names = [name.lower() for name in query] + installed = {} + for p in pkg_resources.working_set: + installed[canonicalize_name(p.project_name)] = p + + query_names = [canonicalize_name(name) for name in query] + for dist in [installed[pkg] for pkg in query_names if pkg in installed]: package = { 'name': dist.project_name, @@ -85,13 +90,11 @@ def search_packages_info(query): entry_points = dist.get_metadata_lines('entry_points.txt') package['entry_points'] = entry_points - installer = None if dist.has_metadata('INSTALLER'): for line in dist.get_metadata_lines('INSTALLER'): if line.strip(): - installer = line.strip() + package['installer'] = line.strip() break - package['installer'] = installer # @todo: Should pkg_resources.Distribution have a # `get_pkg_info` method? @@ -102,12 +105,9 @@ def search_packages_info(query): 'home-page', 'author', 'author-email', 'license'): package[key] = pkg_info_dict.get(key) - # It looks like FeedParser can not deal with repeated headers + # It looks like FeedParser cannot deal with repeated headers classifiers = [] for line in metadata.splitlines(): - if not line: - break - # Classifier: License :: OSI Approved :: MIT License if line.startswith('Classifier: '): classifiers.append(line[len('Classifier: '):]) package['classifiers'] = classifiers @@ -117,38 +117,38 @@ def search_packages_info(query): yield package -def print_results(distributions, list_all_files): +def print_results(distributions, list_files=False, verbose=False): """ Print the informations from installed distributions found. """ results_printed = False - for dist in distributions: + for i, dist in enumerate(distributions): results_printed = True - logger.info("---") - logger.info("Metadata-Version: %s", dist.get('metadata-version')) - logger.info("Name: %s", dist['name']) - logger.info("Version: %s", dist['version']) - logger.info("Summary: %s", dist.get('summary')) - logger.info("Home-page: %s", dist.get('home-page')) - logger.info("Author: %s", dist.get('author')) - logger.info("Author-email: %s", dist.get('author-email')) - if dist['installer'] is not None: - logger.info("Installer: %s", dist['installer']) - logger.info("License: %s", dist.get('license')) - logger.info("Location: %s", dist['location']) - logger.info("Requires: %s", ', '.join(dist['requires'])) - logger.info("Classifiers:") - for classifier in dist['classifiers']: - logger.info(" %s", classifier) - if list_all_files: - logger.info("Files:") - if 'files' in dist: - for line in dist['files']: - logger.info(" %s", line.strip()) - else: - logger.info("Cannot locate installed-files.txt") - if 'entry_points' in dist: + if i > 0: + logger.info("---") + logger.info("Name: %s", dist.get('name', '')) + logger.info("Version: %s", dist.get('version', '')) + logger.info("Summary: %s", dist.get('summary', '')) + logger.info("Home-page: %s", dist.get('home-page', '')) + logger.info("Author: %s", dist.get('author', '')) + logger.info("Author-email: %s", dist.get('author-email', '')) + logger.info("License: %s", dist.get('license', '')) + logger.info("Location: %s", dist.get('location', '')) + logger.info("Requires: %s", ', '.join(dist.get('requires', []))) + if verbose: + logger.info("Metadata-Version: %s", + dist.get('metadata-version', '')) + logger.info("Installer: %s", dist.get('installer', '')) + logger.info("Classifiers:") + for classifier in dist.get('classifiers', []): + logger.info(" %s", classifier) logger.info("Entry-points:") - for line in dist['entry_points']: + for entry in dist.get('entry_points', []): + logger.info(" %s", entry.strip()) + if list_files: + logger.info("Files:") + for line in dist.get('files', []): logger.info(" %s", line.strip()) + if "files" not in dist: + logger.info("Cannot locate installed-files.txt") return results_printed diff --git a/lib/python3.4/site-packages/pip/commands/wheel.py b/lib/python3.4/site-packages/pip/commands/wheel.py index 1d77fe6..70e95eb 100644 --- a/lib/python3.4/site-packages/pip/commands/wheel.py +++ b/lib/python3.4/site-packages/pip/commands/wheel.py @@ -24,7 +24,7 @@ class WheelCommand(RequirementCommand): 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: http://wheel.readthedocs.org/en/latest. + wheel docs: https://wheel.readthedocs.io/en/latest/ Requirements: setuptools>=0.8, and wheel. @@ -70,6 +70,7 @@ class WheelCommand(RequirementCommand): cmd_opts.add_option(cmdoptions.editable()) cmd_opts.add_option(cmdoptions.requirements()) cmd_opts.add_option(cmdoptions.src()) + cmd_opts.add_option(cmdoptions.ignore_requires_python()) cmd_opts.add_option(cmdoptions.no_deps()) cmd_opts.add_option(cmdoptions.build_dir()) @@ -151,12 +152,14 @@ class WheelCommand(RequirementCommand): index_urls = [options.index_url] + options.extra_index_urls if options.no_index: - logger.info('Ignoring indexes: %s', ','.join(index_urls)) + logger.debug('Ignoring indexes: %s', ','.join(index_urls)) index_urls = [] if options.build_dir: options.build_dir = os.path.abspath(options.build_dir) + options.src_dir = os.path.abspath(options.src_dir) + with self._build_session(options) as session: finder = self._build_package_finder(options, session) build_delete = (not (options.no_clean or options.build_dir)) @@ -169,6 +172,7 @@ class WheelCommand(RequirementCommand): download_dir=None, ignore_dependencies=options.ignore_dependencies, ignore_installed=True, + ignore_requires_python=options.ignore_requires_python, isolated=options.isolated_mode, session=session, wheel_cache=wheel_cache, diff --git a/lib/python3.4/site-packages/pip/compat/__init__.py b/lib/python3.4/site-packages/pip/compat/__init__.py index 703852b..099672c 100644 --- a/lib/python3.4/site-packages/pip/compat/__init__.py +++ b/lib/python3.4/site-packages/pip/compat/__init__.py @@ -15,7 +15,7 @@ except ImportError: try: from collections import OrderedDict except ImportError: - from pip.compat.ordereddict import OrderedDict + from pip._vendor.ordereddict import OrderedDict try: import ipaddress @@ -115,7 +115,7 @@ def get_path_uid(path): file_uid = os.fstat(fd).st_uid os.close(fd) else: # AIX and Jython - # WARNING: time of check vulnerabity, but best we can do w/o NOFOLLOW + # 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 diff --git a/lib/python3.4/site-packages/pip/compat/ordereddict.py b/lib/python3.4/site-packages/pip/compat/ordereddict.py deleted file mode 100644 index 6eb3ba4..0000000 --- a/lib/python3.4/site-packages/pip/compat/ordereddict.py +++ /dev/null @@ -1,129 +0,0 @@ -# Copyright (c) 2009 Raymond Hettinger -# -# 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. - -# flake8: noqa - -from UserDict import DictMixin - -class OrderedDict(dict, DictMixin): - - def __init__(self, *args, **kwds): - if len(args) > 1: - raise TypeError('expected at most 1 arguments, got %d' % len(args)) - try: - self.__end - except AttributeError: - self.clear() - self.update(*args, **kwds) - - def clear(self): - self.__end = end = [] - end += [None, end, end] # sentinel node for doubly linked list - self.__map = {} # key --> [key, prev, next] - dict.clear(self) - - def __setitem__(self, key, value): - if key not in self: - end = self.__end - curr = end[1] - curr[2] = end[1] = self.__map[key] = [key, curr, end] - dict.__setitem__(self, key, value) - - def __delitem__(self, key): - dict.__delitem__(self, key) - key, prev, next = self.__map.pop(key) - prev[2] = next - next[1] = prev - - def __iter__(self): - end = self.__end - curr = end[2] - while curr is not end: - yield curr[0] - curr = curr[2] - - def __reversed__(self): - end = self.__end - curr = end[1] - while curr is not end: - yield curr[0] - curr = curr[1] - - def popitem(self, last=True): - if not self: - raise KeyError('dictionary is empty') - if last: - key = reversed(self).next() - else: - key = iter(self).next() - value = self.pop(key) - return key, value - - def __reduce__(self): - items = [[k, self[k]] for k in self] - tmp = self.__map, self.__end - del self.__map, self.__end - inst_dict = vars(self).copy() - self.__map, self.__end = tmp - if inst_dict: - return (self.__class__, (items,), inst_dict) - return self.__class__, (items,) - - def keys(self): - return list(self) - - setdefault = DictMixin.setdefault - update = DictMixin.update - pop = DictMixin.pop - values = DictMixin.values - items = DictMixin.items - iterkeys = DictMixin.iterkeys - itervalues = DictMixin.itervalues - iteritems = DictMixin.iteritems - - def __repr__(self): - if not self: - return '%s()' % (self.__class__.__name__,) - return '%s(%r)' % (self.__class__.__name__, self.items()) - - def copy(self): - return self.__class__(self) - - @classmethod - def fromkeys(cls, iterable, value=None): - d = cls() - for key in iterable: - d[key] = value - return d - - def __eq__(self, other): - if isinstance(other, OrderedDict): - if len(self) != len(other): - return False - for p, q in zip(self.items(), other.items()): - if p != q: - return False - return True - return dict.__eq__(self, other) - - def __ne__(self, other): - return not self == other diff --git a/lib/python3.4/site-packages/pip/download.py b/lib/python3.4/site-packages/pip/download.py index bbef9ea..54d3131 100644 --- a/lib/python3.4/site-packages/pip/download.py +++ b/lib/python3.4/site-packages/pip/download.py @@ -33,6 +33,7 @@ from pip.utils.encoding import auto_decode from pip.utils.filesystem import check_path_owner from pip.utils.logging import indent_log from pip.utils.setuptools_build import SETUPTOOLS_SHIM +from pip.utils.glibc import libc_ver from pip.utils.ui import DownloadProgressBar, DownloadProgressSpinner from pip.locations import write_delete_marker_file from pip.vcs import vcs @@ -40,6 +41,7 @@ from pip._vendor import requests, six from pip._vendor.requests.adapters import BaseAdapter, HTTPAdapter from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response +from pip._vendor.requests.utils import get_netrc_auth from pip._vendor.requests.structures import CaseInsensitiveDict from pip._vendor.requests.packages import urllib3 from pip._vendor.cachecontrol import CacheControlAdapter @@ -88,21 +90,22 @@ def user_agent(): data["implementation"]["version"] = platform.python_version() if sys.platform.startswith("linux"): - distro = dict(filter( + from pip._vendor import distro + distro_infos = dict(filter( lambda x: x[1], - zip(["name", "version", "id"], platform.linux_distribution()), + zip(["name", "version", "id"], distro.linux_distribution()), )) libc = dict(filter( lambda x: x[1], - zip(["lib", "version"], platform.libc_ver()), + zip(["lib", "version"], libc_ver()), )) if libc: - distro["libc"] = libc - if distro: - data["distro"] = distro + distro_infos["libc"] = libc + if distro_infos: + data["distro"] = distro_infos if sys.platform.startswith("darwin") and platform.mac_ver()[0]: - data["distro"] = {"name": "OS X", "version": platform.mac_ver()[0]} + data["distro"] = {"name": "macOS", "version": platform.mac_ver()[0]} if platform.system(): data.setdefault("system", {})["name"] = platform.system() @@ -145,6 +148,11 @@ class MultiDomainBasicAuth(AuthBase): if username is None: username, password = self.parse_credentials(parsed.netloc) + # Get creds from netrc if we still don't have them + if username is None and password is None: + netrc_auth = get_netrc_auth(req.url) + username, password = netrc_auth if netrc_auth else (None, None) + if username or password: # Store the username and password self.passwords[netloc] = (username, password) @@ -163,7 +171,7 @@ class MultiDomainBasicAuth(AuthBase): if resp.status_code != 401: return resp - # We are not able to prompt the user so simple return the response + # We are not able to prompt the user so simply return the response if not self.prompting: return resp @@ -331,7 +339,7 @@ class PipSession(requests.Session): total=retries, # A 503 error from PyPI typically means that the Fastly -> Origin - # connection got interupted in some way. A 503 error in general + # 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. status_forcelist=[503], @@ -602,8 +610,8 @@ def _copy_file(filename, location, link): download_location = os.path.join(location, link.filename) if os.path.exists(download_location): response = ask_path_exists( - 'The file %s exists. (i)gnore, (w)ipe, (b)ackup ' % - display_path(download_location), ('i', 'w', 'b')) + 'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)abort' % + display_path(download_location), ('i', 'w', 'b', 'a')) if response == 'i': copy = False elif response == 'w': @@ -617,6 +625,8 @@ def _copy_file(filename, location, link): display_path(dest_file), ) shutil.move(download_location, dest_file) + elif response == 'a': + sys.exit(-1) if copy: shutil.copy(filename, download_location) logger.info('Saved %s', display_path(download_location)) @@ -679,7 +689,7 @@ def unpack_file_url(link, location, download_dir=None, hashes=None): return # If --require-hashes is off, `hashes` is either empty, the - # link's embeddded hash, or MissingHashes; it is required to + # 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`. @@ -749,6 +759,7 @@ class PipXmlrpcTransport(xmlrpc_client.Transport): """Provide a `xmlrpclib.Transport` implementation via a `PipSession` object. """ + def __init__(self, index_url, session, use_datetime=False): xmlrpc_client.Transport.__init__(self, use_datetime) index_parts = urllib_parse.urlparse(index_url) diff --git a/lib/python3.4/site-packages/pip/exceptions.py b/lib/python3.4/site-packages/pip/exceptions.py index a529e40..50b527f 100644 --- a/lib/python3.4/site-packages/pip/exceptions.py +++ b/lib/python3.4/site-packages/pip/exceptions.py @@ -237,3 +237,8 @@ class HashMismatch(HashError): self.gots[hash_name].hexdigest()) prefix = ' or' return '\n'.join(lines) + + +class UnsupportedPythonVersion(InstallationError): + """Unsupported python version according to Requires-Python package + metadata.""" diff --git a/lib/python3.4/site-packages/pip/index.py b/lib/python3.4/site-packages/pip/index.py index ba0bd6c..f653f6e 100644 --- a/lib/python3.4/site-packages/pip/index.py +++ b/lib/python3.4/site-packages/pip/index.py @@ -20,19 +20,22 @@ from pip.utils import ( cached_property, splitext, normalize_path, ARCHIVE_EXTENSIONS, SUPPORTED_EXTENSIONS, ) -from pip.utils.deprecation import RemovedInPip9Warning, RemovedInPip10Warning +from pip.utils.deprecation import RemovedInPip10Warning from pip.utils.logging import indent_log +from pip.utils.packaging import check_requires_python from pip.exceptions import ( DistributionNotFound, BestVersionAlreadyInstalled, InvalidWheelFilename, UnsupportedWheel, ) from pip.download import HAS_TLS, is_url, path_to_url, url_to_path from pip.wheel import Wheel, wheel_ext -from pip.pep425tags import supported_tags +from pip.pep425tags import get_supported from pip._vendor import html5lib, requests, six from pip._vendor.packaging.version import parse as parse_version from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging import specifiers from pip._vendor.requests.exceptions import SSLError +from pip._vendor.distlib.compat import unescape __all__ = ['FormatControl', 'fmt_ctl_handle_mutual_exclude', 'PackageFinder'] @@ -104,12 +107,24 @@ class PackageFinder(object): def __init__(self, find_links, index_urls, allow_all_prereleases=False, trusted_hosts=None, process_dependency_links=False, - session=None, format_control=None): + session=None, format_control=None, platform=None, + versions=None, abi=None, implementation=None): """Create a PackageFinder. :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 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 versions: A list of strings or None. This is passed directly + to pep425tags.py in the get_supported() method. + :param abi: A string or None. This is passed directly + to pep425tags.py in the get_supported() method. + :param implementation: A string or None. This is passed directly + to pep425tags.py in the get_supported() method. """ if session is None: raise TypeError( @@ -153,6 +168,14 @@ class PackageFinder(object): # The Session we'll use to make requests self.session = session + # The valid tags to check potential found wheel candidates against + self.valid_tags = get_supported( + versions=versions, + platform=platform, + abi=abi, + impl=implementation, + ) + # If we don't have TLS enabled, then WARN if anyplace we're looking # relies on TLS. if not HAS_TLS: @@ -175,7 +198,7 @@ class PackageFinder(object): warnings.warn( "Dependency Links processing has been deprecated and will be " "removed in a future release.", - RemovedInPip9Warning, + RemovedInPip10Warning, ) self.dependency_links.extend(links) @@ -236,22 +259,22 @@ class PackageFinder(object): If not finding wheels, then 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() + 2. wheels ordered via Wheel.support_index_min(self.valid_tags) 3. source archives 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 """ - support_num = len(supported_tags) + support_num = len(self.valid_tags) if candidate.location.is_wheel: # can raise InvalidWheelFilename wheel = Wheel(candidate.location.filename) - if not wheel.supported(): + if not wheel.supported(self.valid_tags): raise UnsupportedWheel( "%s is not a supported wheel for this platform. It " "can't be sorted." % wheel.filename ) - pri = -(wheel.support_index_min()) + pri = -(wheel.support_index_min(self.valid_tags)) else: # sdist pri = -(support_num) return (candidate.version, pri) @@ -335,7 +358,9 @@ class PackageFinder(object): """ def mkurl_pypi_url(url): - loc = posixpath.join(url, urllib_parse.quote(project_name.lower())) + 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 @@ -579,7 +604,6 @@ class PackageFinder(object): def _link_package_versions(self, link, search): """Return an InstallationCandidate or None""" - version = None if link.egg_fragment: egg_info = link.egg_fragment @@ -610,7 +634,8 @@ class PackageFinder(object): self._log_skipped_link( link, 'wrong project name (not %s)' % search.supplied) return - if not wheel.supported(): + + if not wheel.supported(self.valid_tags): self._log_skipped_link( link, 'it is not compatible with this Python') return @@ -638,6 +663,18 @@ class PackageFinder(object): self._log_skipped_link( link, 'Python version is incorrect') return + try: + support_this_python = check_requires_python(link.requires_python) + except specifiers.InvalidSpecifier: + logger.debug("Package %s has an invalid Requires-Python entry: %s", + link.filename, link.requires_python) + support_this_python = True + + if not support_this_python: + logger.debug("The package %s is incompatible with the python" + "version in use. Acceptable python versions are:%s", + link, link.requires_python) + return logger.debug('Found link %s, version: %s', link, version) return InstallationCandidate(search.supplied, version, link) @@ -690,7 +727,7 @@ class HTMLPage(object): self.content = content self.parsed = html5lib.parse( self.content, - encoding=encoding, + transport_encoding=encoding, namespaceHTMLElements=False, ) self.url = url @@ -758,10 +795,10 @@ class HTMLPage(object): resp.raise_for_status() # 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. + # 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. content_type = resp.headers.get('Content-Type', 'unknown') if not content_type.lower().startswith("text/html"): logger.debug( @@ -826,7 +863,9 @@ class HTMLPage(object): url = self.clean_link( urllib_parse.urljoin(self.base_url, href) ) - yield Link(url, self) + pyrequire = anchor.get('data-requires-python') + pyrequire = unescape(pyrequire) if pyrequire else None + yield Link(url, self, requires_python=pyrequire) _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) @@ -840,7 +879,19 @@ class HTMLPage(object): class Link(object): - def __init__(self, url, comes_from=None): + def __init__(self, url, comes_from=None, requires_python=None): + """ + Object representing a parsed link from https://pypi.python.org/simple/* + + url: + url of the resource pointed to (href of the link) + comes_from: + instance of HTMLPage where the link was found, or string. + 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. + """ # url can be a UNC windows share if url.startswith('\\\\'): @@ -848,10 +899,15 @@ class Link(object): self.url = url self.comes_from = comes_from + self.requires_python = requires_python if requires_python else None def __str__(self): + if self.requires_python: + rp = ' (requires-python:%s)' % self.requires_python + else: + rp = '' if self.comes_from: - return '%s (from %s)' % (self.url, self.comes_from) + return '%s (from %s)%s' % (self.url, self.comes_from, rp) else: return str(self.url) diff --git a/lib/python3.4/site-packages/pip/locations.py b/lib/python3.4/site-packages/pip/locations.py index 1bd0fae..e598ef1 100644 --- a/lib/python3.4/site-packages/pip/locations.py +++ b/lib/python3.4/site-packages/pip/locations.py @@ -73,7 +73,7 @@ else: "The folder you are executing pip from can no longer be found." ) -# under Mac OS X + virtualenv sys.prefix is not properly resolved +# under macOS + virtualenv sys.prefix is not properly resolved # it is something like /path/to/python/bin/.. # Note: using realpath due to tmp dirs on OSX being symlinks src_prefix = os.path.abspath(src_prefix) @@ -110,7 +110,7 @@ else: config_basename, ) - # Forcing to use /usr/local/bin for standard Mac OS X framework installs + # 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' diff --git a/lib/python3.4/site-packages/pip/operations/check.py b/lib/python3.4/site-packages/pip/operations/check.py new file mode 100644 index 0000000..2cf67aa --- /dev/null +++ b/lib/python3.4/site-packages/pip/operations/check.py @@ -0,0 +1,49 @@ + + +def check_requirements(installed_dists): + missing_reqs_dict = {} + incompatible_reqs_dict = {} + + for dist in installed_dists: + key = '%s==%s' % (dist.project_name, dist.version) + + missing_reqs = list(get_missing_reqs(dist, installed_dists)) + if missing_reqs: + missing_reqs_dict[key] = missing_reqs + + incompatible_reqs = list(get_incompatible_reqs( + dist, installed_dists)) + if incompatible_reqs: + incompatible_reqs_dict[key] = incompatible_reqs + + return (missing_reqs_dict, incompatible_reqs_dict) + + +def get_missing_reqs(dist, installed_dists): + """Return all of the requirements of `dist` that aren't present in + `installed_dists`. + + """ + installed_names = set(d.project_name.lower() for d in installed_dists) + missing_requirements = set() + + for requirement in dist.requires(): + if requirement.project_name.lower() not in installed_names: + missing_requirements.add(requirement) + yield requirement + + +def get_incompatible_reqs(dist, installed_dists): + """Return all of the requirements of `dist` that are present in + `installed_dists`, but have incompatible versions. + + """ + installed_dists_by_name = {} + for installed_dist in installed_dists: + installed_dists_by_name[installed_dist.project_name] = installed_dist + + for requirement in dist.requires(): + present_dist = installed_dists_by_name.get(requirement.project_name) + + if present_dist and present_dist not in requirement: + yield (requirement, present_dist) diff --git a/lib/python3.4/site-packages/pip/operations/freeze.py b/lib/python3.4/site-packages/pip/operations/freeze.py index 086922e..920c2c1 100644 --- a/lib/python3.4/site-packages/pip/operations/freeze.py +++ b/lib/python3.4/site-packages/pip/operations/freeze.py @@ -5,9 +5,11 @@ import re import pip from pip.req import InstallRequirement +from pip.req.req_file import COMMENT_RE from pip.utils import get_installed_distributions from pip._vendor import pkg_resources from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.pkg_resources import RequirementParseError logger = logging.getLogger(__name__) @@ -42,67 +44,83 @@ def freeze( for dist in get_installed_distributions(local_only=local_only, skip=(), user_only=user_only): - req = pip.FrozenRequirement.from_dist( - dist, - dependency_links - ) + try: + req = pip.FrozenRequirement.from_dist( + dist, + dependency_links + ) + except RequirementParseError: + logger.warning( + "Could not parse requirement: %s", + dist.project_name + ) + continue installations[req.name] = req if requirement: - with open(requirement) as req_file: - for line in req_file: - if (not line.strip() or - line.strip().startswith('#') or - (skip_match and skip_match(line)) or - line.startswith(( - '-r', '--requirement', - '-Z', '--always-unzip', - '-f', '--find-links', - '-i', '--index-url', - '--pre', - '--trusted-host', - '--process-dependency-links', - '--extra-index-url'))): - yield line.rstrip() - continue + # 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() + 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 + (skip_match and skip_match(line)) or + line.startswith(( + '-r', '--requirement', + '-Z', '--always-unzip', + '-f', '--find-links', + '-i', '--index-url', + '--pre', + '--trusted-host', + '--process-dependency-links', + '--extra-index-url'))): + 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() + 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 = InstallRequirement.from_editable( + line, + default_vcs=default_vcs, + isolated=isolated, + wheel_cache=wheel_cache, + ) else: - line = line[len('--editable'):].strip().lstrip('=') - line_req = InstallRequirement.from_editable( - line, - default_vcs=default_vcs, - isolated=isolated, - wheel_cache=wheel_cache, - ) - else: - line_req = InstallRequirement.from_line( - line, - isolated=isolated, - wheel_cache=wheel_cache, - ) + line_req = InstallRequirement.from_line( + COMMENT_RE.sub('', line).strip(), + isolated=isolated, + wheel_cache=wheel_cache, + ) - if not line_req.name: - logger.info( - "Skipping line because it's not clear what it " - "would install: %s", - line.strip(), - ) - logger.info( - " (add #egg=PackageName to the URL to avoid" - " this warning)" - ) - elif line_req.name not in installations: - logger.warning( - "Requirement file contains %s, but that package is" - " not installed", - line.strip(), - ) - else: - yield str(installations[line_req.name]).rstrip() - del installations[line_req.name] + 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)" + ) + elif line_req.name not in installations: + logger.warning( + "Requirement file [%s] contains %s, but that " + "package is not installed", + req_file_path, COMMENT_RE.sub('', line).strip(), + ) + else: + yield str(installations[line_req.name]).rstrip() + del installations[line_req.name] yield( '## The following requirements were added by ' diff --git a/lib/python3.4/site-packages/pip/pep425tags.py b/lib/python3.4/site-packages/pip/pep425tags.py index e118457..ad202ef 100644 --- a/lib/python3.4/site-packages/pip/pep425tags.py +++ b/lib/python3.4/site-packages/pip/pep425tags.py @@ -6,7 +6,6 @@ import sys import warnings import platform import logging -import ctypes try: import sysconfig @@ -16,7 +15,7 @@ except ImportError: # pragma nocover import distutils.util from pip.compat import OrderedDict - +import pip.utils.glibc logger = logging.getLogger(__name__) @@ -125,7 +124,7 @@ def get_platform(): if sys.platform == 'darwin': # distutils.util.get_platform() returns the release based on the value # of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may - # be signficantly older than the user's current machine. + # be significantly older than the user's current machine. release, _, machine = platform.mac_ver() split_ver = release.split('.') @@ -160,46 +159,17 @@ def is_manylinux1_compatible(): pass # Check glibc version. CentOS 5 uses glibc 2.5. - return have_compatible_glibc(2, 5) - - -def have_compatible_glibc(major, minimum_minor): - # 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 False - - # 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") - - # Parse string and check against requested version. - version = [int(piece) for piece in version_str.split(".")] - if len(version) < 2: - warnings.warn("Expected glibc version with 2 components major.minor," - " got: %s" % version_str, RuntimeWarning) - return False - return version[0] == major and version[1] >= minimum_minor + return pip.utils.glibc.have_compatible_glibc(2, 5) def get_darwin_arches(major, minor, machine): """Return a list of supported arches (including group arches) for - the given major, minor and machine architecture of an OS X machine. + the given major, minor and machine architecture of an macOS machine. """ arches = [] def _supports_arch(major, minor, arch): - # Looking at the application support for OS X versions in the chart + # Looking at the application support for macOS versions in the chart # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears # our timeline looks roughly like: # @@ -253,12 +223,19 @@ def get_darwin_arches(major, minor, machine): return arches -def get_supported(versions=None, noarch=False): +def get_supported(versions=None, noarch=False, platform=None, + impl=None, abi=None): """Return a list of supported tags for each version specified in `versions`. :param versions: a list of string versions, of the form ["33", "32"], or None. The first 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 = [] @@ -271,11 +248,11 @@ def get_supported(versions=None, noarch=False): for minor in range(version_info[-1], -1, -1): versions.append(''.join(map(str, major + (minor,)))) - impl = get_abbr_impl() + impl = impl or get_abbr_impl() abis = [] - abi = get_abi_tag() + abi = abi or get_abi_tag() if abi: abis[0:0] = [abi] @@ -290,8 +267,8 @@ def get_supported(versions=None, noarch=False): abis.append('none') if not noarch: - arch = get_platform() - if sys.platform == 'darwin': + arch = platform or get_platform() + if arch.startswith('macosx'): # support macosx-10.6-intel on macosx-10.9-x86_64 match = _osx_arch_pat.match(arch) if match: @@ -304,7 +281,7 @@ def get_supported(versions=None, noarch=False): else: # arch pattern didn't match (?!) arches = [arch] - elif is_manylinux1_compatible(): + elif platform is None and is_manylinux1_compatible(): arches = [arch.replace('linux', 'manylinux1'), arch] else: arches = [arch] @@ -314,6 +291,15 @@ def get_supported(versions=None, noarch=False): for arch in arches: supported.append(('%s%s' % (impl, versions[0]), abi, arch)) + # abi3 modules compatible with older version of Python + for version in versions[1:]: + # abi3 was introduced in Python 3.2 + if version in ('31', '30'): + break + for abi in abi3s: # empty set if not Python 3 + for arch in arches: + supported.append(("%s%s" % (impl, version), abi, arch)) + # Has binaries, does not use the Python API: for arch in arches: supported.append(('py%s' % (versions[0][0]), 'none', arch)) diff --git a/lib/python3.4/site-packages/pip/req/req_file.py b/lib/python3.4/site-packages/pip/req/req_file.py index 2cfb479..821df22 100644 --- a/lib/python3.4/site-packages/pip/req/req_file.py +++ b/lib/python3.4/site-packages/pip/req/req_file.py @@ -135,7 +135,7 @@ def process_line(line, filename, line_number, finder=None, comes_from=None, defaults.format_control = finder.format_control args_str, options_str = break_args_options(line) if sys.version_info < (2, 7, 3): - # Priori to 2.7.3, shlex can not deal with unicode entries + # Prior to 2.7.3, shlex cannot deal with unicode entries options_str = options_str.encode('utf8') opts, _ = parser.parse_args(shlex.split(options_str), defaults) diff --git a/lib/python3.4/site-packages/pip/req/req_install.py b/lib/python3.4/site-packages/pip/req/req_install.py index caeda76..1a98f37 100644 --- a/lib/python3.4/site-packages/pip/req/req_install.py +++ b/lib/python3.4/site-packages/pip/req/req_install.py @@ -15,9 +15,11 @@ from distutils.util import change_root from email.parser import FeedParser from pip._vendor import pkg_resources, six -from pip._vendor.distlib.markers import interpret as markers_interpret from pip._vendor.packaging import specifiers +from pip._vendor.packaging.markers import Marker +from pip._vendor.packaging.requirements import InvalidRequirement, Requirement from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import Version, parse as parse_version from pip._vendor.six.moves import configparser import pip.wheel @@ -25,7 +27,7 @@ import pip.wheel from pip.compat import native_str, get_stdlib, WINDOWS from pip.download import is_url, url_to_path, path_to_url, is_archive_file from pip.exceptions import ( - InstallationError, UninstallationError, UnsupportedWheel, + InstallationError, UninstallationError, ) from pip.locations import ( bin_py, running_under_virtualenv, PIP_DELETE_MARKER_FILENAME, bin_user, @@ -38,14 +40,13 @@ from pip.utils import ( ) from pip.utils.hashes import Hashes -from pip.utils.deprecation import RemovedInPip9Warning, RemovedInPip10Warning +from pip.utils.deprecation import RemovedInPip10Warning from pip.utils.logging import indent_log from pip.utils.setuptools_build import SETUPTOOLS_SHIM from pip.utils.ui import open_spinner from pip.req.req_uninstall import UninstallPathSet from pip.vcs import vcs from pip.wheel import move_wheel_files, Wheel -from pip._vendor.packaging.version import Version logger = logging.getLogger(__name__) @@ -65,6 +66,10 @@ def _strip_extras(path): return path_no_extras, extras +def _safe_extras(extras): + return set(pkg_resources.safe_extra(extra) for extra in extras) + + class InstallRequirement(object): def __init__(self, req, comes_from, source_dir=None, editable=False, @@ -74,8 +79,8 @@ class InstallRequirement(object): self.extras = () if isinstance(req, six.string_types): try: - req = pkg_resources.Requirement.parse(req) - except pkg_resources.RequirementParseError: + req = Requirement(req) + except InvalidRequirement: if os.path.sep in req: add_msg = "It looks like a path. Does it exist ?" elif '=' in req and not any(op in req for op in operators): @@ -84,7 +89,7 @@ class InstallRequirement(object): add_msg = traceback.format_exc() raise InstallationError( "Invalid requirement: '%s'\n%s" % (req, add_msg)) - self.extras = req.extras + self.extras = _safe_extras(req.extras) self.req = req self.comes_from = comes_from @@ -95,7 +100,10 @@ class InstallRequirement(object): self._wheel_cache = wheel_cache self.link = self.original_link = link self.as_egg = as_egg - self.markers = markers + if markers is not None: + self.markers = markers + else: + self.markers = req and req.marker self._egg_info_path = None # This holds the pkg_resources.Distribution object if this requirement # is already available: @@ -148,7 +156,7 @@ class InstallRequirement(object): wheel_cache=wheel_cache) if extras_override is not None: - res.extras = extras_override + res.extras = _safe_extras(extras_override) return res @@ -170,6 +178,8 @@ class InstallRequirement(object): markers = markers.strip() if not markers: markers = None + else: + markers = Marker(markers) else: markers = None name = name.strip() @@ -209,11 +219,6 @@ class InstallRequirement(object): # wheel file if link.is_wheel: wheel = Wheel(link.filename) # can raise InvalidWheelFilename - if not wheel.supported(): - raise UnsupportedWheel( - "%s is not a supported wheel on this platform." % - wheel.filename - ) req = "%s==%s" % (wheel.name, wheel.version) else: # set the req to the egg fragment. when it's not there, this @@ -230,8 +235,8 @@ class InstallRequirement(object): wheel_cache=wheel_cache, constraint=constraint) if extras: - res.extras = pkg_resources.Requirement.parse('__placeholder__' + - extras).extras + res.extras = _safe_extras( + Requirement('placeholder' + extras).extras) return res @@ -312,7 +317,12 @@ class InstallRequirement(object): # package is not available yet so we create a temp directory # Once run_egg_info will have run, we'll be able # to fix it via _correct_build_location - self._temp_build_dir = tempfile.mkdtemp('-build', 'pip-') + # 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 = os.path.realpath( + tempfile.mkdtemp('-build', 'pip-') + ) self._ideal_build_dir = build_dir return self._temp_build_dir if self.editable: @@ -362,7 +372,7 @@ class InstallRequirement(object): def name(self): if self.req is None: return None - return native_str(self.req.project_name) + return native_str(pkg_resources.safe_name(self.req.name)) @property def setup_py_dir(self): @@ -426,33 +436,31 @@ class InstallRequirement(object): egg_info_cmd + egg_base_option, cwd=self.setup_py_dir, show_stdout=False, - command_level=logging.DEBUG, command_desc='python setup.py egg_info') if not self.req: - if isinstance( - pkg_resources.parse_version(self.pkg_info()["Version"]), - Version): + if isinstance(parse_version(self.pkg_info()["Version"]), Version): op = "==" else: op = "===" - self.req = pkg_resources.Requirement.parse( + self.req = Requirement( "".join([ self.pkg_info()["Name"], op, self.pkg_info()["Version"], - ])) + ]) + ) self._correct_build_location() else: metadata_name = canonicalize_name(self.pkg_info()["Name"]) - if canonicalize_name(self.req.project_name) != metadata_name: + if canonicalize_name(self.req.name) != metadata_name: logger.warning( 'Running setup.py (path:%s) egg_info for package %s ' 'produced metadata for project name %s. Fix your ' '#egg=%s fragments.', self.setup_py, self.name, metadata_name, self.name ) - self.req = pkg_resources.Requirement.parse(metadata_name) + self.req = Requirement(metadata_name) def egg_info_data(self, filename): if self.satisfied_by is not None: @@ -486,7 +494,7 @@ class InstallRequirement(object): # Don't search in anything that looks like a virtualenv # environment if ( - os.path.exists( + os.path.lexists( os.path.join(root, dir, 'bin', 'python') ) or os.path.exists( @@ -540,7 +548,7 @@ class InstallRequirement(object): def assert_source_matches_version(self): assert self.source_dir version = self.pkg_info()['version'] - if version not in self.req: + if self.req.specifier and version not in self.req.specifier: logger.warning( 'Requested %s, but installing version %s', self, @@ -682,6 +690,10 @@ class InstallRequirement(object): '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 pip.wheel.uninstallation_paths(dist): + paths_to_remove.add(path) + elif develop_egg_link: # develop egg with open(develop_egg_link, 'r') as fh: @@ -695,10 +707,6 @@ class InstallRequirement(object): 'easy-install.pth') paths_to_remove.add_pth(easy_install_pth, dist.location) - elif egg_info_exists and dist.egg_info.endswith('.dist-info'): - for path in pip.wheel.uninstallation_paths(dist): - paths_to_remove.add(path) - else: logger.debug( 'Not sure how to uninstall: %s - Check: %s', @@ -769,8 +777,8 @@ class InstallRequirement(object): archive_path = os.path.join(build_dir, archive_name) if os.path.exists(archive_path): response = ask_path_exists( - 'The file %s exists. (i)gnore, (w)ipe, (b)ackup ' % - display_path(archive_path), ('i', 'w', 'b')) + 'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)bort ' % + display_path(archive_path), ('i', 'w', 'b', 'a')) if response == 'i': create_archive = False elif response == 'w': @@ -784,6 +792,8 @@ class InstallRequirement(object): display_path(dest_file), ) shutil.move(archive_path, dest_file) + elif response == 'a': + sys.exit(-1) if create_archive: zip = zipfile.ZipFile( archive_path, 'w', zipfile.ZIP_DEFLATED, @@ -816,9 +826,15 @@ class InstallRequirement(object): name = name.replace(os.path.sep, '/') return name - def match_markers(self): + def match_markers(self, extras_requested=None): + 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 markers_interpret(self.markers) + return any( + self.markers.evaluate({'extra': extra}) + for extra in extras_requested) else: return True @@ -850,30 +866,8 @@ class InstallRequirement(object): temp_location = tempfile.mkdtemp('-record', 'pip-') record_filename = os.path.join(temp_location, 'install-record.txt') try: - install_args = [sys.executable, "-u"] - install_args.append('-c') - install_args.append(SETUPTOOLS_SHIM % self.setup_py) - install_args += list(global_options) + \ - ['install', '--record', record_filename] - - if not self.as_egg: - install_args += ['--single-version-externally-managed'] - - if root is not None: - install_args += ['--root', root] - if prefix is not None: - install_args += ['--prefix', prefix] - - if self.pycompile: - install_args += ["--compile"] - else: - install_args += ["--no-compile"] - - if running_under_virtualenv(): - py_ver_str = 'python' + sysconfig.get_python_version() - install_args += ['--install-headers', - os.path.join(sys.prefix, 'include', 'site', - py_ver_str, self.name)] + install_args = self.get_install_args( + global_options, record_filename, root, prefix) msg = 'Running setup.py install for %s' % (self.name,) with open_spinner(msg) as spinner: with indent_log(): @@ -946,6 +940,34 @@ class InstallRequirement(object): self.source_dir = self.build_location(parent_dir) return self.source_dir + def get_install_args(self, global_options, record_filename, root, prefix): + install_args = [sys.executable, "-u"] + install_args.append('-c') + install_args.append(SETUPTOOLS_SHIM % self.setup_py) + install_args += list(global_options) + \ + ['install', '--record', record_filename] + + if not self.as_egg: + install_args += ['--single-version-externally-managed'] + + if root is not None: + install_args += ['--root', root] + if prefix is not None: + install_args += ['--prefix', prefix] + + if self.pycompile: + install_args += ["--compile"] + else: + install_args += ["--no-compile"] + + if running_under_virtualenv(): + py_ver_str = 'python' + sysconfig.get_python_version() + install_args += ['--install-headers', + os.path.join(sys.prefix, 'include', 'site', + py_ver_str, self.name)] + + return install_args + def remove_temporary_source(self): """Remove the source files from this requirement, if they are marked for deletion""" @@ -994,12 +1016,24 @@ class InstallRequirement(object): if self.req is None: return False try: - self.satisfied_by = pkg_resources.get_distribution(self.req) + # get_distribution() will resolve the entire list of requirements + # anyway, and we've already determined that we need the requirement + # in question, so strip the marker so that we don't try to + # evaluate it. + no_marker = Requirement(str(self.req)) + no_marker.marker = None + self.satisfied_by = pkg_resources.get_distribution(str(no_marker)) + if self.editable and self.satisfied_by: + self.conflicts_with = self.satisfied_by + # when installing editables, nothing pre-existing should ever + # satisfy + self.satisfied_by = None + return True except pkg_resources.DistributionNotFound: return False except pkg_resources.VersionConflict: existing_dist = pkg_resources.get_distribution( - self.req.project_name + self.req.name ) if self.use_user_site: if dist_in_usersite(existing_dist): @@ -1085,24 +1119,6 @@ def _strip_postfix(req): return req -def _build_req_from_url(url): - - parts = [p for p in url.split('#', 1)[0].split('/') if p] - - req = None - if len(parts) > 2 and parts[-2] in ('tags', 'branches', 'tag', 'branch'): - req = parts[-3] - elif len(parts) > 1 and parts[-1] == 'trunk': - req = parts[-2] - if req: - warnings.warn( - 'Sniffing the requirement name from the url is deprecated and ' - 'will be removed in the future. Please specify an #egg segment ' - 'instead.', RemovedInPip9Warning, - stacklevel=2) - return req - - def parse_editable(editable_req, default_vcs=None): """Parses an editable requirement into: - a requirement name @@ -1142,9 +1158,7 @@ def parse_editable(editable_req, default_vcs=None): return ( package_name, url_no_extras, - pkg_resources.Requirement.parse( - '__placeholder__' + extras - ).extras, + Requirement("placeholder" + extras.lower()).extras, ) else: return package_name, url_no_extras, None @@ -1156,6 +1170,11 @@ def parse_editable(editable_req, default_vcs=None): if '+' not in url: if default_vcs: + warnings.warn( + "--default-vcs has been deprecated and will be removed in " + "the future.", + RemovedInPip10Warning, + ) url = default_vcs + '+' + url else: raise InstallationError( @@ -1174,7 +1193,9 @@ def parse_editable(editable_req, default_vcs=None): package_name = Link(url).egg_fragment if not package_name: - package_name = _build_req_from_url(editable_req) + raise InstallationError( + "Could not detect requirement name, please specify one with #egg=" + ) if not package_name: raise InstallationError( '--editable=%s is not the right format; it must have ' diff --git a/lib/python3.4/site-packages/pip/req/req_set.py b/lib/python3.4/site-packages/pip/req/req_set.py index e7a8d87..76aec06 100644 --- a/lib/python3.4/site-packages/pip/req/req_set.py +++ b/lib/python3.4/site-packages/pip/req/req_set.py @@ -14,14 +14,16 @@ from pip.download import (is_file_url, is_dir_url, is_vcs_url, url_to_path, from pip.exceptions import (InstallationError, BestVersionAlreadyInstalled, DistributionNotFound, PreviousBuildDirError, HashError, HashErrors, HashUnpinned, - DirectoryUrlHashUnsupported, VcsHashUnsupported) + DirectoryUrlHashUnsupported, VcsHashUnsupported, + UnsupportedPythonVersion) from pip.req.req_install import InstallRequirement from pip.utils import ( display_path, dist_in_usersite, ensure_dir, normalize_path) from pip.utils.hashes import MissingHashes from pip.utils.logging import indent_log +from pip.utils.packaging import check_dist_requires_python from pip.vcs import vcs - +from pip.wheel import Wheel logger = logging.getLogger(__name__) @@ -140,11 +142,12 @@ class Installed(DistAbstraction): class RequirementSet(object): def __init__(self, build_dir, src_dir, download_dir, upgrade=False, - ignore_installed=False, as_egg=False, target_dir=None, - ignore_dependencies=False, force_reinstall=False, - use_user_site=False, session=None, pycompile=True, - isolated=False, wheel_download_dir=None, - wheel_cache=None, require_hashes=False): + upgrade_strategy=None, ignore_installed=False, as_egg=False, + target_dir=None, ignore_dependencies=False, + force_reinstall=False, use_user_site=False, session=None, + pycompile=True, isolated=False, wheel_download_dir=None, + wheel_cache=None, require_hashes=False, + ignore_requires_python=False): """Create a RequirementSet. :param wheel_download_dir: Where still-packed .whl files should be @@ -170,6 +173,7 @@ class RequirementSet(object): # the wheelhouse output by 'pip wheel'. self.download_dir = download_dir self.upgrade = upgrade + self.upgrade_strategy = upgrade_strategy self.ignore_installed = ignore_installed self.force_reinstall = force_reinstall self.requirements = Requirements() @@ -177,6 +181,7 @@ class RequirementSet(object): self.requirement_aliases = {} self.unnamed_requirements = [] self.ignore_dependencies = ignore_dependencies + self.ignore_requires_python = ignore_requires_python self.successfully_downloaded = [] self.successfully_installed = [] self.reqs_to_cleanup = [] @@ -207,7 +212,8 @@ class RequirementSet(object): return ('<%s object; %d requirement(s): %s>' % (self.__class__.__name__, len(reqs), reqs_str)) - def add_requirement(self, install_req, parent_req_name=None): + def add_requirement(self, install_req, parent_req_name=None, + extras_requested=None): """Add install_req as a requirement to install. :param parent_req_name: The name of the requirement that needed this @@ -216,21 +222,35 @@ class RequirementSet(object): 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 + environement 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. """ name = install_req.name - if not install_req.match_markers(): - logger.warning("Ignoring %s: markers %r don't match your " + if not install_req.match_markers(extras_requested): + logger.warning("Ignoring %s: markers '%s' don't match your " "environment", install_req.name, install_req.markers) return [] + # This check has to come after we filter requirements with the + # environment markers. + if install_req.link and install_req.link.is_wheel: + wheel = Wheel(install_req.link.filename) + if not wheel.supported(): + raise InstallationError( + "%s is not a supported wheel on this platform." % + wheel.filename + ) + install_req.as_egg = self.as_egg install_req.use_user_site = self.use_user_site install_req.target_dir = self.target_dir install_req.pycompile = self.pycompile + install_req.is_direct = (parent_req_name is None) + if not name: # url or path requirement w/o an egg fragment self.unnamed_requirements.append(install_req) @@ -243,7 +263,7 @@ class RequirementSet(object): if (parent_req_name is None and existing_req and not existing_req.constraint and existing_req.extras == install_req.extras and not - existing_req.req.specs == install_req.req.specs): + existing_req.req.specifier == install_req.req.specifier): raise InstallationError( 'Double requirement given: %s (already in %s, name=%r)' % (install_req, existing_req, name)) @@ -365,6 +385,13 @@ class RequirementSet(object): if hash_errors: raise hash_errors + def _is_upgrade_allowed(self, req): + return self.upgrade and ( + self.upgrade_strategy == "eager" or ( + self.upgrade_strategy == "only-if-needed" and req.is_direct + ) + ) + def _check_skip_installed(self, req_to_install, finder): """Check if req_to_install should be skipped. @@ -386,17 +413,20 @@ class RequirementSet(object): # Check whether to upgrade/reinstall this req or not. req_to_install.check_if_exists() if req_to_install.satisfied_by: - skip_reason = 'satisfied (use --upgrade to upgrade)' - if self.upgrade: - best_installed = False + upgrade_allowed = self._is_upgrade_allowed(req_to_install) + + # Is the best version is installed. + best_installed = False + + if upgrade_allowed: # For link based requirements we have to pull the # tree down and inspect to assess the version #, so # its handled way down. if not (self.force_reinstall or req_to_install.link): try: - finder.find_requirement(req_to_install, self.upgrade) + finder.find_requirement( + req_to_install, upgrade_allowed) except BestVersionAlreadyInstalled: - skip_reason = 'up-to-date' best_installed = True except DistributionNotFound: # No distribution found, so we squash the @@ -413,6 +443,15 @@ class RequirementSet(object): req_to_install.conflicts_with = \ req_to_install.satisfied_by req_to_install.satisfied_by = None + + # Figure out a nice message to say why we're skipping this. + if best_installed: + skip_reason = 'already up-to-date' + elif self.upgrade_strategy == "only-if-needed": + skip_reason = 'not upgraded as not directly required' + else: + skip_reason = 'already satisfied' + return skip_reason else: return None @@ -453,7 +492,7 @@ class RequirementSet(object): 'req_to_install.satisfied_by is set to %r' % (req_to_install.satisfied_by,)) logger.info( - 'Requirement already %s: %s', skip_reason, + 'Requirement %s: %s', skip_reason, req_to_install) else: if (req_to_install.link and @@ -479,6 +518,7 @@ class RequirementSet(object): abstract_dist.prep_for_dist() if self.is_download: req_to_install.archive(self.download_dir) + req_to_install.check_if_exists() elif req_to_install.satisfied_by: if require_hashes: logger.debug( @@ -509,7 +549,10 @@ class RequirementSet(object): % (req_to_install, req_to_install.source_dir) ) req_to_install.populate_link( - finder, self.upgrade, require_hashes) + finder, + self._is_upgrade_allowed(req_to_install), + require_hashes + ) # We can't hit this spot and have populate_link return None. # req_to_install.satisfied_by is None here (because we're # guarded) and upgrade has no impact except when satisfied_by @@ -619,9 +662,17 @@ class RequirementSet(object): # # parse dependencies # # # ###################### # dist = abstract_dist.dist(finder) + try: + check_dist_requires_python(dist) + except UnsupportedPythonVersion as e: + if self.ignore_requires_python: + logger.warning(e.args[0]) + else: + req_to_install.remove_temporary_source() + raise more_reqs = [] - def add_req(subreq): + def add_req(subreq, extras_requested): sub_install_req = InstallRequirement( str(subreq), req_to_install, @@ -629,7 +680,8 @@ class RequirementSet(object): wheel_cache=self._wheel_cache, ) more_reqs.extend(self.add_requirement( - sub_install_req, req_to_install.name)) + sub_install_req, req_to_install.name, + extras_requested=extras_requested)) # We add req_to_install before its dependencies, so that we # can refer to it when adding dependencies. @@ -656,7 +708,7 @@ class RequirementSet(object): set(dist.extras) & set(req_to_install.extras) ) for subreq in dist.requires(available_requested): - add_req(subreq) + add_req(subreq, extras_requested=available_requested) # cleanup tmp src self.reqs_to_cleanup.append(req_to_install) diff --git a/lib/python3.4/site-packages/pip/utils/__init__.py b/lib/python3.4/site-packages/pip/utils/__init__.py index 8ea2e38..0d25d91 100644 --- a/lib/python3.4/site-packages/pip/utils/__init__.py +++ b/lib/python3.4/site-packages/pip/utils/__init__.py @@ -42,7 +42,7 @@ __all__ = ['rmtree', 'display_path', 'backup_dir', 'normalize_path', 'renames', 'get_terminal_size', 'get_prog', 'unzip_file', 'untar_file', 'unpack_file', 'call_subprocess', - 'captured_stdout', 'remove_tracebacks', 'ensure_dir', + 'captured_stdout', 'ensure_dir', 'ARCHIVE_EXTENSIONS', 'SUPPORTED_EXTENSIONS', 'get_installed_version'] @@ -639,20 +639,9 @@ def unpack_file(filename, location, content_type, link): ) -def remove_tracebacks(output): - pattern = (r'(?:\W+File "(?:.*)", line (?:.*)\W+(?:.*)\W+\^\W+)?' - r'Syntax(?:Error|Warning): (?:.*)') - output = re.sub(pattern, '', output) - if PY2: - return output - # compileall.compile_dir() prints different messages to stdout - # in Python 3 - return re.sub(r"\*\*\* Error compiling (?:.*)", '', output) - - def call_subprocess(cmd, show_stdout=True, cwd=None, on_returncode='raise', - command_level=std_logging.DEBUG, command_desc=None, + command_desc=None, extra_environ=None, spinner=None): # This function's handling of subprocess output is confusing and I # previously broke it terribly, so as penance I will write a long comment @@ -686,7 +675,7 @@ def call_subprocess(cmd, show_stdout=True, cwd=None, part = '"%s"' % part.replace('"', '\\"') cmd_parts.append(part) command_desc = ' '.join(cmd_parts) - logger.log(command_level, "Running command %s", command_desc) + logger.debug("Running command %s", command_desc) env = os.environ.copy() if extra_environ: env.update(extra_environ) @@ -745,7 +734,7 @@ def call_subprocess(cmd, show_stdout=True, cwd=None, raise ValueError('Invalid value: on_returncode=%s' % repr(on_returncode)) if not show_stdout: - return remove_tracebacks(''.join(all_output)) + return ''.join(all_output) def read_text_file(filename): @@ -856,14 +845,17 @@ class cached_property(object): return value -def get_installed_version(dist_name): +def get_installed_version(dist_name, lookup_dirs=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) # We want to avoid having this cached, so we need to construct a new # working set each time. - working_set = pkg_resources.WorkingSet() + if lookup_dirs is None: + working_set = pkg_resources.WorkingSet() + else: + working_set = pkg_resources.WorkingSet(lookup_dirs) # Get the installed distribution from our working set dist = working_set.find(req) diff --git a/lib/python3.4/site-packages/pip/utils/appdirs.py b/lib/python3.4/site-packages/pip/utils/appdirs.py index 60ae76e..9b82801 100644 --- a/lib/python3.4/site-packages/pip/utils/appdirs.py +++ b/lib/python3.4/site-packages/pip/utils/appdirs.py @@ -8,6 +8,7 @@ import os import sys from pip.compat import WINDOWS, expanduser +from pip._vendor.six import PY2, text_type def user_cache_dir(appname): @@ -17,9 +18,9 @@ def user_cache_dir(appname): "appname" is the name of application. Typical user cache directories are: - Mac OS X: ~/Library/Caches/ + macOS: ~/Library/Caches/ Unix: ~/.cache/ (XDG default) - Windows: C:\Users\\AppData\Local\\Cache + Windows: 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 @@ -35,6 +36,11 @@ def user_cache_dir(appname): # Get the base path 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 PY2 and isinstance(path, text_type): + path = _win_path_to_bytes(path) + # Add our app name and Cache directory to it path = os.path.join(path, appname, "Cache") elif sys.platform == "darwin": @@ -67,7 +73,7 @@ def user_data_dir(appname, roaming=False): for a discussion of issues. Typical user data directories are: - Mac OS X: ~/Library/Application Support/ + macOS: ~/Library/Application Support/ Unix: ~/.local/share/ # or in $XDG_DATA_HOME, if defined Win XP (not roaming): C:\Documents and Settings\\ ... @@ -110,12 +116,12 @@ def user_config_dir(appname, roaming=True): for a discussion of issues. Typical user data directories are: - Mac OS X: same as user_data_dir + macOS: same as user_data_dir Unix: ~/.config/ Win *: same as user_data_dir For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. - That means, by deafult "~/.config/". + That means, by default "~/.config/". """ if WINDOWS: path = user_data_dir(appname, roaming=roaming) @@ -136,7 +142,7 @@ def site_config_dirs(appname): "appname" is the name of application. Typical user config directories are: - Mac OS X: /Library/Application Support// + macOS: /Library/Application Support// Unix: /etc or $XDG_CONFIG_DIRS[i]// for each value in $XDG_CONFIG_DIRS Win XP: C:\Documents and Settings\All Users\Application ... @@ -222,3 +228,21 @@ if WINDOWS: _get_win_folder = _get_win_folder_with_ctypes 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 diff --git a/lib/python3.4/site-packages/pip/utils/deprecation.py b/lib/python3.4/site-packages/pip/utils/deprecation.py index 2fb1d1e..c3f799e 100644 --- a/lib/python3.4/site-packages/pip/utils/deprecation.py +++ b/lib/python3.4/site-packages/pip/utils/deprecation.py @@ -1,5 +1,5 @@ """ -A module that implments tooling to enable easy warnings about deprecations. +A module that implements tooling to enable easy warnings about deprecations. """ from __future__ import absolute_import @@ -15,15 +15,15 @@ class Pending(object): pass -class RemovedInPip9Warning(PipDeprecationWarning): +class RemovedInPip10Warning(PipDeprecationWarning): pass -class RemovedInPip10Warning(PipDeprecationWarning, Pending): +class RemovedInPip11Warning(PipDeprecationWarning, Pending): pass -class Python26DeprecationWarning(PipDeprecationWarning, Pending): +class Python26DeprecationWarning(PipDeprecationWarning): pass diff --git a/lib/python3.4/site-packages/pip/utils/glibc.py b/lib/python3.4/site-packages/pip/utils/glibc.py new file mode 100644 index 0000000..7847885 --- /dev/null +++ b/lib/python3.4/site-packages/pip/utils/glibc.py @@ -0,0 +1,81 @@ +from __future__ import absolute_import + +import re +import ctypes +import platform +import warnings + + +def glibc_version_string(): + "Returns glibc version string, or None if not using glibc." + + # 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 + + +# Separated out from have_compatible_glibc for easier unit testing +def check_glibc_version(version_str, required_major, minimum_minor): + # Parse string and check against requested version. + # + # We use a regexp instead of str.split because we want to discard any + # random junk that might come after the minor version -- this might happen + # in patched/forked versions of glibc (e.g. Linaro's version of glibc + # uses version strings like "2.20-2014.11"). See gh-3588. + m = re.match(r"(?P[0-9]+)\.(?P[0-9]+)", version_str) + if not m: + warnings.warn("Expected glibc version with 2 components major.minor," + " got: %s" % version_str, RuntimeWarning) + return False + return (int(m.group("major")) == required_major and + int(m.group("minor")) >= minimum_minor) + + +def have_compatible_glibc(required_major, minimum_minor): + version_str = glibc_version_string() + if version_str is None: + return False + return check_glibc_version(version_str, required_major, minimum_minor) + + +# 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(): + glibc_version = glibc_version_string() + if glibc_version is None: + # For non-glibc platforms, fall back on platform.libc_ver + return platform.libc_ver() + else: + return ("glibc", glibc_version) diff --git a/lib/python3.4/site-packages/pip/utils/packaging.py b/lib/python3.4/site-packages/pip/utils/packaging.py new file mode 100644 index 0000000..e93b20d --- /dev/null +++ b/lib/python3.4/site-packages/pip/utils/packaging.py @@ -0,0 +1,63 @@ +from __future__ import absolute_import + +from email.parser import FeedParser + +import logging +import sys + +from pip._vendor.packaging import specifiers +from pip._vendor.packaging import version +from pip._vendor import pkg_resources + +from pip import exceptions + +logger = logging.getLogger(__name__) + + +def check_requires_python(requires_python): + """ + Check if the python version in use match the `requires_python` specifier. + + Returns `True` if the version of python in use matches the requirement. + Returns `False` if the version of python in use does not matches the + requirement. + + Raises an InvalidSpecifier if `requires_python` have an invalid format. + """ + if requires_python is None: + # The package provides no information + return True + requires_python_specifier = specifiers.SpecifierSet(requires_python) + + # We only use major.minor.micro + python_version = version.parse('.'.join(map(str, sys.version_info[:3]))) + return python_version in requires_python_specifier + + +def get_metadata(dist): + if (isinstance(dist, pkg_resources.DistInfoDistribution) and + dist.has_metadata('METADATA')): + return dist.get_metadata('METADATA') + elif dist.has_metadata('PKG-INFO'): + return dist.get_metadata('PKG-INFO') + + +def check_dist_requires_python(dist): + metadata = get_metadata(dist) + feed_parser = FeedParser() + feed_parser.feed(metadata) + pkg_info_dict = feed_parser.close() + requires_python = pkg_info_dict.get('Requires-Python') + try: + if not check_requires_python(requires_python): + raise exceptions.UnsupportedPythonVersion( + "%s requires Python '%s' but the running Python is %s" % ( + dist.project_name, + requires_python, + '.'.join(map(str, sys.version_info[:3])),) + ) + except specifiers.InvalidSpecifier as e: + logger.warning( + "Package %s has an invalid Requires-Python entry %s - %s" % ( + dist.project_name, requires_python, e)) + return diff --git a/lib/python3.4/site-packages/pip/utils/setuptools_build.py b/lib/python3.4/site-packages/pip/utils/setuptools_build.py index 4c9095e..03973e9 100644 --- a/lib/python3.4/site-packages/pip/utils/setuptools_build.py +++ b/lib/python3.4/site-packages/pip/utils/setuptools_build.py @@ -1,6 +1,8 @@ # Shim to wrap setup.py invocation with setuptools SETUPTOOLS_SHIM = ( "import setuptools, tokenize;__file__=%r;" - "exec(compile(getattr(tokenize, 'open', open)(__file__).read()" - ".replace('\\r\\n', '\\n'), __file__, 'exec'))" + "f=getattr(tokenize, 'open', open)(__file__);" + "code=f.read().replace('\\r\\n', '\\n');" + "f.close();" + "exec(compile(code, __file__, 'exec'))" ) diff --git a/lib/python3.4/site-packages/pip/vcs/__init__.py b/lib/python3.4/site-packages/pip/vcs/__init__.py index 9dc1c60..8d3dbb2 100644 --- a/lib/python3.4/site-packages/pip/vcs/__init__.py +++ b/lib/python3.4/site-packages/pip/vcs/__init__.py @@ -5,6 +5,7 @@ import errno import logging import os import shutil +import sys from pip._vendor.six.moves.urllib import parse as urllib_parse @@ -106,7 +107,7 @@ class VersionControl(object): def _is_local_repository(self, repo): """ posix absolute paths start with os.path.sep, - win32 ones ones start with drive (like c:\\folder) + win32 ones start with drive (like c:\\folder) """ drive, tail = os.path.splitdrive(repo) return repo.startswith(os.path.sep) or drive @@ -271,6 +272,8 @@ class VersionControl(object): ) shutil.move(dest, dest_dir) checkout = True + elif response == 'a': + sys.exit(-1) return checkout def unpack(self, location): @@ -307,7 +310,7 @@ class VersionControl(object): def run_command(self, cmd, show_stdout=True, cwd=None, on_returncode='raise', - command_level=logging.DEBUG, command_desc=None, + command_desc=None, extra_environ=None, spinner=None): """ Run a VCS subcommand @@ -317,7 +320,7 @@ class VersionControl(object): cmd = [self.name] + cmd try: return call_subprocess(cmd, show_stdout, cwd, - on_returncode, command_level, + on_returncode, command_desc, extra_environ, spinner) except OSError as e: diff --git a/lib/python3.4/site-packages/pip/vcs/git.py b/lib/python3.4/site-packages/pip/vcs/git.py index 24528de..2187dd8 100644 --- a/lib/python3.4/site-packages/pip/vcs/git.py +++ b/lib/python3.4/site-packages/pip/vcs/git.py @@ -8,6 +8,7 @@ from pip.compat import samefile from pip.exceptions import BadCommand from pip._vendor.six.moves.urllib import parse as urllib_parse from pip._vendor.six.moves.urllib import request as urllib_request +from pip._vendor.packaging.version import parse as parse_version from pip.utils import display_path, rmtree from pip.vcs import vcs, VersionControl @@ -49,6 +50,19 @@ class Git(VersionControl): super(Git, self).__init__(url, *args, **kwargs) + def get_git_version(self): + VERSION_PFX = 'git version ' + version = self.run_command(['version'], show_stdout=False) + if version.startswith(VERSION_PFX): + version = version[len(VERSION_PFX):] + else: + version = '' + # get first 3 positions of the git version becasue + # 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) + def export(self, location): """Export the Git repository at the url to the destination location""" temp_dir = tempfile.mkdtemp('-export', 'pip-') @@ -99,7 +113,11 @@ class Git(VersionControl): def update(self, dest, rev_options): # First fetch changes from the default remote - self.run_command(['fetch', '-q'], cwd=dest) + 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) if rev_options: rev_options = self.check_rev_options( @@ -139,8 +157,13 @@ class Git(VersionControl): remotes = self.run_command( ['config', '--get-regexp', 'remote\..*\.url'], show_stdout=False, cwd=location) - first_remote = remotes.splitlines()[0] - url = first_remote.split(' ')[1] + remotes = remotes.splitlines() + found_remote = remotes[0] + for remote in remotes: + if remote.startswith('remote.origin.url '): + found_remote = remote + break + url = found_remote.split(' ')[1] return url.strip() def get_revision(self, location): diff --git a/lib/python3.4/site-packages/pip/vcs/subversion.py b/lib/python3.4/site-packages/pip/vcs/subversion.py index aa78fa6..4b23156 100644 --- a/lib/python3.4/site-packages/pip/vcs/subversion.py +++ b/lib/python3.4/site-packages/pip/vcs/subversion.py @@ -60,6 +60,7 @@ class Subversion(VersionControl): """Export the svn repository at the url to the destination location""" url, rev = self.get_url_rev() rev_options = get_rev_options(url, rev) + url = self.remove_auth_from_url(url) logger.info('Exporting svn repository %s to %s', url, location) with indent_log(): if os.path.exists(location): @@ -79,6 +80,7 @@ class Subversion(VersionControl): def obtain(self, dest): url, rev = self.get_url_rev() rev_options = get_rev_options(url, rev) + url = self.remove_auth_from_url(url) if rev: rev_display = ' (to revision %s)' % rev else: @@ -217,6 +219,24 @@ class Subversion(VersionControl): """Always assume the versions don't match""" return False + @staticmethod + def remove_auth_from_url(url): + # 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. + + # parsed url + purl = urllib_parse.urlsplit(url) + stripped_netloc = \ + purl.netloc.split('@')[-1] + + # stripped url + url_pieces = ( + purl.scheme, stripped_netloc, purl.path, purl.query, purl.fragment + ) + surl = urllib_parse.urlunsplit(url_pieces) + return surl + def get_rev_options(url, rev): if rev: diff --git a/lib/python3.4/site-packages/pip/wheel.py b/lib/python3.4/site-packages/pip/wheel.py index 3e12402..9ac9dff 100644 --- a/lib/python3.4/site-packages/pip/wheel.py +++ b/lib/python3.4/site-packages/pip/wheel.py @@ -298,10 +298,11 @@ def move_wheel_files(name, req, wheeldir, user=False, home=None, root=None, continue elif (is_base and s.endswith('.dist-info') and - # is self.req.project_name case preserving? - s.lower().startswith( - req.project_name.replace('-', '_').lower())): - assert not info_dir, 'Multiple .dist-info directories' + canonicalize_name(s).startswith( + canonicalize_name(req.name))): + assert not info_dir, ('Multiple .dist-info directories: ' + + destsubdir + ', ' + + ', '.join(info_dir)) info_dir.append(destsubdir) for f in files: # Skip unwanted files @@ -417,7 +418,7 @@ 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.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) sys.exit(%(func)s()) """ @@ -438,7 +439,7 @@ if __name__ == '__main__': # 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 Metadat 2.0 + # 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 @@ -757,11 +758,8 @@ class WheelBuilder(object): if not autobuilding: logger.info( 'Skipping %s, due to already being wheel.', req.name) - elif req.editable: - if not autobuilding: - logger.info( - 'Skipping bdist_wheel for %s, due to being editable', - req.name) + elif autobuilding and req.editable: + pass elif autobuilding and req.link and not req.link.is_artifact: pass elif autobuilding and not req.source_dir: @@ -801,8 +799,8 @@ class WheelBuilder(object): try: ensure_dir(output_dir) except OSError as e: - logger.warn("Building wheel for %s failed: %s", - req.name, e) + logger.warning("Building wheel for %s failed: %s", + req.name, e) build_failure.append(req) continue else: diff --git a/lib/python3.4/site-packages/pkg_resources-0.0.0.dist-info/RECORD b/lib/python3.4/site-packages/pkg_resources-0.0.0.dist-info/RECORD index d43543b..6e71c0c 100644 --- a/lib/python3.4/site-packages/pkg_resources-0.0.0.dist-info/RECORD +++ b/lib/python3.4/site-packages/pkg_resources-0.0.0.dist-info/RECORD @@ -1,26 +1,36 @@ -pkg_resources/__init__.py,sha256=bucu_98c11mzrGldEJeqxArn14F7ZmURsb-8CaNSbVo,108616 +pkg_resources/__init__.py,sha256=qasrGUKwGQ8dGJP5SOEhLJoWRizj5HinbD2bXfrOH28,103308 pkg_resources/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pkg_resources/_vendor/appdirs.py,sha256=tgGaL0m4Jo2VeuGfoOOifLv7a7oUEJu2n1vRkqoPw-0,22374 +pkg_resources/_vendor/pyparsing.py,sha256=PifeLY3-WhIcBVzLtv0U4T_pwDtPruBhBCkg5vLqa28,229867 pkg_resources/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 -pkg_resources/_vendor/packaging/__about__.py,sha256=YzdrW-1lWmyCBDyrcNkZbJo4tiDWXpoiqPjfyCYMzIE,1073 -pkg_resources/_vendor/packaging/__init__.py,sha256=2V8n-eEpSgBuXlV8hlMmhU7ZklpsrrusWMZNp2gC4Hs,906 -pkg_resources/_vendor/packaging/_compat.py,sha256=wofog8iYo_zudt_10i6JiXKHDs5GhCuXC09hCuSJiv4,1253 -pkg_resources/_vendor/packaging/_structures.py,sha256=93YvgrEE2HgFp8AdXy0pwCRVnZeutRHO_-puJ7T0cPw,1809 -pkg_resources/_vendor/packaging/specifiers.py,sha256=UV9T01_kKloA8PSeMI3HTYBSJ_4KLs00yLvrlciZ3yU,28079 -pkg_resources/_vendor/packaging/version.py,sha256=dEGrWZJZ6sef1xMxSfDCego2hS3Q86by0hUIFVk-AGc,11949 -pkg_resources/extern/__init__.py,sha256=azKvXDutMVFe3c641wdiwndjtku92Bl3_iGVAIMKnsM,2461 +pkg_resources/_vendor/packaging/__about__.py,sha256=zkcCPTN_6TcLW0Nrlg0176-R1QQ_WVPTm8sz1R4-HjM,720 +pkg_resources/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 +pkg_resources/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 +pkg_resources/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416 +pkg_resources/_vendor/packaging/markers.py,sha256=uEcBBtGvzqltgnArqb9c4RrcInXezDLos14zbBHhWJo,8248 +pkg_resources/_vendor/packaging/requirements.py,sha256=SikL2UynbsT0qtY9ltqngndha_sfo0w6XGFhAhoSoaQ,4355 +pkg_resources/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025 +pkg_resources/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421 +pkg_resources/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556 +pkg_resources/extern/__init__.py,sha256=JUtlHHvlxHSNuB4pWqNjcx7n6kG-fwXg7qmJ2zNJlIY,2487 pkg_resources-0.0.0.dist-info/DESCRIPTION.rst,sha256=OCTuuN6LcWulhHS3d5rfjdsQtW22n7HENFRh6jC6ego,10 pkg_resources-0.0.0.dist-info/METADATA,sha256=FOYDX6cmnDUkWo-yhqWQYtjKIMZR2IW2G1GFZhA6gUQ,177 pkg_resources-0.0.0.dist-info/RECORD,, pkg_resources-0.0.0.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 pkg_resources-0.0.0.dist-info/metadata.json,sha256=8ZVRFU96pY_wnWouockCkvXw981Y0iDB5nQFFGq8ZiY,221 pkg_resources-0.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pkg_resources/extern/__pycache__/__init__.cpython-34.pyc,, -pkg_resources/_vendor/__pycache__/__init__.cpython-34.pyc,, +pkg_resources/_vendor/packaging/__pycache__/version.cpython-34.pyc,, +pkg_resources/__pycache__/__init__.cpython-34.pyc,, +pkg_resources/_vendor/__pycache__/appdirs.cpython-34.pyc,, +pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-34.pyc,, pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-34.pyc,, +pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-34.pyc,, +pkg_resources/_vendor/__pycache__/__init__.cpython-34.pyc,, +pkg_resources/_vendor/packaging/__pycache__/utils.cpython-34.pyc,, +pkg_resources/_vendor/__pycache__/six.cpython-34.pyc,, +pkg_resources/_vendor/__pycache__/pyparsing.cpython-34.pyc,, +pkg_resources/_vendor/packaging/__pycache__/markers.cpython-34.pyc,, pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-34.pyc,, pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-34.pyc,, -pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-34.pyc,, -pkg_resources/__pycache__/__init__.cpython-34.pyc,, -pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-34.pyc,, -pkg_resources/_vendor/packaging/__pycache__/version.cpython-34.pyc,, -pkg_resources/_vendor/__pycache__/six.cpython-34.pyc,, +pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-34.pyc,, +pkg_resources/extern/__pycache__/__init__.cpython-34.pyc,, diff --git a/lib/python3.4/site-packages/pkg_resources/__init__.py b/lib/python3.4/site-packages/pkg_resources/__init__.py index d04cd34..4c9868c 100644 --- a/lib/python3.4/site-packages/pkg_resources/__init__.py +++ b/lib/python3.4/site-packages/pkg_resources/__init__.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ Package resource API -------------------- @@ -28,8 +29,6 @@ import warnings import stat import functools import pkgutil -import token -import symbol import operator import platform import collections @@ -37,6 +36,7 @@ import plistlib import email.parser import tempfile import textwrap +import itertools from pkgutil import get_importer try: @@ -67,22 +67,15 @@ try: except ImportError: importlib_machinery = None -try: - import parser -except ImportError: - pass - +from pkg_resources.extern import appdirs from pkg_resources.extern import packaging __import__('pkg_resources.extern.packaging.version') __import__('pkg_resources.extern.packaging.specifiers') - +__import__('pkg_resources.extern.packaging.requirements') +__import__('pkg_resources.extern.packaging.markers') if (3, 0) < sys.version_info < (3, 3): - msg = ( - "Support for Python 3.0-3.2 has been dropped. Future versions " - "will fail here." - ) - warnings.warn(msg) + raise RuntimeError("Python 3.3 or later is required") # declare some globals that will be defined later to # satisfy the linters. @@ -98,7 +91,6 @@ class PEP440Warning(RuntimeWarning): class _SetuptoolsVersionMixin(object): - def __hash__(self): return super(_SetuptoolsVersionMixin, self).__hash__() @@ -160,7 +152,7 @@ class _SetuptoolsVersionMixin(object): # pad for numeric comparison yield part.zfill(8) else: - yield '*'+part + yield '*' + part # ensure that alpha/beta/candidate are before final yield '*final' @@ -214,36 +206,44 @@ def parse_version(v): _state_vars = {} + def _declare_state(vartype, **kw): globals().update(kw) _state_vars.update(dict.fromkeys(kw, vartype)) + def __getstate__(): state = {} g = globals() for k, v in _state_vars.items(): - state[k] = g['_sget_'+v](g[k]) + state[k] = g['_sget_' + v](g[k]) return state + def __setstate__(state): g = globals() for k, v in state.items(): - g['_sset_'+_state_vars[k]](k, g[k], v) + g['_sset_' + _state_vars[k]](k, g[k], v) return state + def _sget_dict(val): return val.copy() + def _sset_dict(key, ob, state): ob.clear() ob.update(state) + def _sget_object(val): return val.__getstate__() + def _sset_object(key, ob, state): ob.__setstate__(state) + _sget_none = _sset_none = lambda *args: None @@ -270,9 +270,10 @@ def get_supported_platform(): pass return plat + __all__ = [ # Basic resource access and distribution/entry point discovery - 'require', 'run_script', 'get_provider', 'get_distribution', + 'require', 'run_script', 'get_provider', 'get_distribution', 'load_entry_point', 'get_entry_map', 'get_entry_info', 'iter_entry_points', 'resource_string', 'resource_stream', 'resource_filename', @@ -316,10 +317,12 @@ __all__ = [ 'run_main', 'AvailableDistributions', ] + class ResolutionError(Exception): """Abstract base for dependency resolution errors""" + def __repr__(self): - return self.__class__.__name__+repr(self.args) + return self.__class__.__name__ + repr(self.args) class VersionConflict(ResolutionError): @@ -396,6 +399,8 @@ class DistributionNotFound(ResolutionError): class UnknownExtra(ResolutionError): """Distribution doesn't have an "extra feature" of the given name""" + + _provider_factories = {} PY_MAJOR = sys.version[:3] @@ -405,6 +410,7 @@ SOURCE_DIST = 1 CHECKOUT_DIST = 0 DEVELOP_DIST = -1 + def register_loader_type(loader_type, provider_factory): """Register `provider_factory` to make providers for `loader_type` @@ -414,6 +420,7 @@ def register_loader_type(loader_type, provider_factory): """ _provider_factories[loader_type] = provider_factory + def get_provider(moduleOrReq): """Return an IResourceProvider for the named module or requirement""" if isinstance(moduleOrReq, Requirement): @@ -426,6 +433,7 @@ def get_provider(moduleOrReq): loader = getattr(module, '__loader__', None) return _find_adapter(_provider_factories, loader)(module) + def _macosx_vers(_cache=[]): if not _cache: version = platform.mac_ver()[0] @@ -441,9 +449,11 @@ def _macosx_vers(_cache=[]): _cache.append(version.split('.')) return _cache[0] + def _macosx_arch(machine): return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine) + def get_build_platform(): """Return this platform's string for platform-specific distributions @@ -469,6 +479,7 @@ def get_build_platform(): pass return plat + macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)") darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)") # XXX backward compat @@ -482,7 +493,7 @@ def compatible_platforms(provided, required): XXX Needs compatibility checks for Linux and other unixy OSes. """ - if provided is None or required is None or provided==required: + if provided is None or required is None or provided == required: # easy case return True @@ -529,9 +540,11 @@ def run_script(dist_spec, script_name): ns['__name__'] = name require(dist_spec)[0].run_script(script_name, ns) + # backward compatibility run_main = run_script + def get_distribution(dist): """Return a current distribution object for a Requirement or string""" if isinstance(dist, six.string_types): @@ -542,21 +555,23 @@ def get_distribution(dist): raise TypeError("Expected string, Requirement, or Distribution", dist) return dist + def load_entry_point(dist, group, name): """Return `name` entry point of `group` for `dist` or raise ImportError""" return get_distribution(dist).load_entry_point(group, name) + def get_entry_map(dist, group=None): """Return the entry point map for `group`, or the full entry map""" return get_distribution(dist).get_entry_map(group) + def get_entry_info(dist, group, name): """Return the EntryPoint object for `group`+`name`, or ``None``""" return get_distribution(dist).get_entry_info(group, name) class IMetadataProvider: - def has_metadata(name): """Does the package's distribution contain the named metadata?""" @@ -737,7 +752,7 @@ class WorkingSet(object): for key in self.entry_keys[item]: if key not in seen: - seen[key]=1 + seen[key] = 1 yield self.by_key[key] def add(self, dist, entry=None, insert=True, replace=False): @@ -757,8 +772,8 @@ class WorkingSet(object): if entry is None: entry = dist.location - keys = self.entry_keys.setdefault(entry,[]) - keys2 = self.entry_keys.setdefault(dist.location,[]) + keys = self.entry_keys.setdefault(entry, []) + keys2 = self.entry_keys.setdefault(dist.location, []) if not replace and dist.key in self.by_key: # ignore hidden distros return @@ -797,6 +812,8 @@ class WorkingSet(object): best = {} to_activate = [] + req_extras = _ReqExtras() + # Mapping of requirement to set of distributions that required it; # useful for reporting info about conflicts. required_by = collections.defaultdict(set) @@ -807,6 +824,10 @@ class WorkingSet(object): if req in processed: # Ignore cyclic or redundant dependencies continue + + if not req_extras.markers_pass(req): + continue + dist = best.get(req.key) if dist is None: # Find the best distribution and add it to the map @@ -839,6 +860,7 @@ class WorkingSet(object): # Register the new requirements needed by req for new_requirement in new_requirements: required_by[new_requirement].add(req.project_name) + req_extras[new_requirement] = req.extras processed[req] = True @@ -945,11 +967,17 @@ class WorkingSet(object): return needed - def subscribe(self, callback): - """Invoke `callback` for all distributions (including existing ones)""" + def subscribe(self, callback, existing=True): + """Invoke `callback` for all distributions + + If `existing=True` (default), + call on all existing ones, as well. + """ if callback in self.callbacks: return self.callbacks.append(callback) + if not existing: + return for dist in self: callback(dist) @@ -971,6 +999,26 @@ class WorkingSet(object): self.callbacks = callbacks[:] +class _ReqExtras(dict): + """ + Map each requirement to the extras that demanded it. + """ + + def markers_pass(self, req): + """ + Evaluate markers for req against each extra that + demanded it. + + Return False if the req has a marker and fails + evaluation. Otherwise, return True. + """ + extra_evals = ( + req.marker.evaluate({'extra': extra}) + for extra in self.get(req, ()) + (None,) + ) + return not req.marker or any(extra_evals) + + class Environment(object): """Searchable snapshot of distributions on a search path""" @@ -1005,7 +1053,7 @@ class Environment(object): is returned. """ return (self.python is None or dist.py_version is None - or dist.py_version==self.python) \ + or dist.py_version == self.python) \ and compatible_platforms(dist.platform, self.platform) def remove(self, dist): @@ -1210,7 +1258,7 @@ class ResourceManager: extract, as it tracks the generated names for possible cleanup later. """ extract_path = self.extraction_path or get_default_cache() - target_path = os.path.join(extract_path, archive_name+'-tmp', *names) + target_path = os.path.join(extract_path, archive_name + '-tmp', *names) try: _bypass_ensure_directory(target_path) except: @@ -1304,49 +1352,18 @@ class ResourceManager: """ # XXX + def get_default_cache(): - """Determine the default cache location - - This returns the ``PYTHON_EGG_CACHE`` environment variable, if set. - Otherwise, on Windows, it returns a "Python-Eggs" subdirectory of the - "Application Data" directory. On all other systems, it's "~/.python-eggs". """ - try: - return os.environ['PYTHON_EGG_CACHE'] - except KeyError: - pass + Return the ``PYTHON_EGG_CACHE`` environment variable + or a platform-relevant user cache dir for an app + named "Python-Eggs". + """ + return ( + os.environ.get('PYTHON_EGG_CACHE') + or appdirs.user_cache_dir(appname='Python-Eggs') + ) - if os.name!='nt': - return os.path.expanduser('~/.python-eggs') - - # XXX this may be locale-specific! - app_data = 'Application Data' - app_homes = [ - # best option, should be locale-safe - (('APPDATA',), None), - (('USERPROFILE',), app_data), - (('HOMEDRIVE','HOMEPATH'), app_data), - (('HOMEPATH',), app_data), - (('HOME',), None), - # 95/98/ME - (('WINDIR',), app_data), - ] - - for keys, subdir in app_homes: - dirname = '' - for key in keys: - if key in os.environ: - dirname = os.path.join(dirname, os.environ[key]) - else: - break - else: - if subdir: - dirname = os.path.join(dirname, subdir) - return os.path.join(dirname, 'Python-Eggs') - else: - raise RuntimeError( - "Please set the PYTHON_EGG_CACHE enviroment variable" - ) def safe_name(name): """Convert an arbitrary string to a standard distribution name @@ -1364,7 +1381,7 @@ def safe_version(version): # normalize the version return str(packaging.version.Version(version)) except packaging.version.InvalidVersion: - version = version.replace(' ','.') + version = version.replace(' ', '.') return re.sub('[^A-Za-z0-9.]+', '-', version) @@ -1374,7 +1391,7 @@ def safe_extra(extra): Any runs of non-alphanumeric characters are replaced with a single '_', and the result is always lowercased. """ - return re.sub('[^A-Za-z0-9.]+', '_', extra).lower() + return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower() def to_filename(name): @@ -1382,205 +1399,37 @@ def to_filename(name): Any '-' characters are currently replaced with '_'. """ - return name.replace('-','_') + return name.replace('-', '_') -class MarkerEvaluation(object): - values = { - 'os_name': lambda: os.name, - 'sys_platform': lambda: sys.platform, - 'python_full_version': platform.python_version, - 'python_version': lambda: platform.python_version()[:3], - 'platform_version': platform.version, - 'platform_machine': platform.machine, - 'platform_python_implementation': platform.python_implementation, - 'python_implementation': platform.python_implementation, - } +def invalid_marker(text): + """ + Validate text as a PEP 508 environment marker; return an exception + if invalid or False otherwise. + """ + try: + evaluate_marker(text) + except SyntaxError as e: + e.filename = None + e.lineno = None + return e + return False - @classmethod - def is_invalid_marker(cls, text): - """ - Validate text as a PEP 426 environment marker; return an exception - if invalid or False otherwise. - """ - try: - cls.evaluate_marker(text) - except SyntaxError as e: - return cls.normalize_exception(e) - return False - @staticmethod - def normalize_exception(exc): - """ - Given a SyntaxError from a marker evaluation, normalize the error - message: - - Remove indications of filename and line number. - - Replace platform-specific error messages with standard error - messages. - """ - subs = { - 'unexpected EOF while parsing': 'invalid syntax', - 'parenthesis is never closed': 'invalid syntax', - } - exc.filename = None - exc.lineno = None - exc.msg = subs.get(exc.msg, exc.msg) - return exc +def evaluate_marker(text, extra=None): + """ + Evaluate a PEP 508 environment marker. + Return a boolean indicating the marker result in this environment. + Raise SyntaxError if marker is invalid. - @classmethod - def and_test(cls, nodelist): - # MUST NOT short-circuit evaluation, or invalid syntax can be skipped! - items = [ - cls.interpret(nodelist[i]) - for i in range(1, len(nodelist), 2) - ] - return functools.reduce(operator.and_, items) + This implementation uses the 'pyparsing' module. + """ + try: + marker = packaging.markers.Marker(text) + return marker.evaluate() + except packaging.markers.InvalidMarker as e: + raise SyntaxError(e) - @classmethod - def test(cls, nodelist): - # MUST NOT short-circuit evaluation, or invalid syntax can be skipped! - items = [ - cls.interpret(nodelist[i]) - for i in range(1, len(nodelist), 2) - ] - return functools.reduce(operator.or_, items) - - @classmethod - def atom(cls, nodelist): - t = nodelist[1][0] - if t == token.LPAR: - if nodelist[2][0] == token.RPAR: - raise SyntaxError("Empty parentheses") - return cls.interpret(nodelist[2]) - msg = "Language feature not supported in environment markers" - raise SyntaxError(msg) - - @classmethod - def comparison(cls, nodelist): - if len(nodelist) > 4: - msg = "Chained comparison not allowed in environment markers" - raise SyntaxError(msg) - comp = nodelist[2][1] - cop = comp[1] - if comp[0] == token.NAME: - if len(nodelist[2]) == 3: - if cop == 'not': - cop = 'not in' - else: - cop = 'is not' - try: - cop = cls.get_op(cop) - except KeyError: - msg = repr(cop) + " operator not allowed in environment markers" - raise SyntaxError(msg) - return cop(cls.evaluate(nodelist[1]), cls.evaluate(nodelist[3])) - - @classmethod - def get_op(cls, op): - ops = { - symbol.test: cls.test, - symbol.and_test: cls.and_test, - symbol.atom: cls.atom, - symbol.comparison: cls.comparison, - 'not in': lambda x, y: x not in y, - 'in': lambda x, y: x in y, - '==': operator.eq, - '!=': operator.ne, - '<': operator.lt, - '>': operator.gt, - '<=': operator.le, - '>=': operator.ge, - } - if hasattr(symbol, 'or_test'): - ops[symbol.or_test] = cls.test - return ops[op] - - @classmethod - def evaluate_marker(cls, text, extra=None): - """ - Evaluate a PEP 426 environment marker on CPython 2.4+. - Return a boolean indicating the marker result in this environment. - Raise SyntaxError if marker is invalid. - - This implementation uses the 'parser' module, which is not implemented - on - Jython and has been superseded by the 'ast' module in Python 2.6 and - later. - """ - return cls.interpret(parser.expr(text).totuple(1)[1]) - - @staticmethod - def _translate_metadata2(env): - """ - Markerlib implements Metadata 1.2 (PEP 345) environment markers. - Translate the variables to Metadata 2.0 (PEP 426). - """ - return dict( - (key.replace('.', '_'), value) - for key, value in env.items() - ) - - @classmethod - def _markerlib_evaluate(cls, text): - """ - Evaluate a PEP 426 environment marker using markerlib. - Return a boolean indicating the marker result in this environment. - Raise SyntaxError if marker is invalid. - """ - import _markerlib - - env = cls._translate_metadata2(_markerlib.default_environment()) - try: - result = _markerlib.interpret(text, env) - except NameError as e: - raise SyntaxError(e.args[0]) - return result - - if 'parser' not in globals(): - # Fall back to less-complete _markerlib implementation if 'parser' module - # is not available. - evaluate_marker = _markerlib_evaluate - - @classmethod - def interpret(cls, nodelist): - while len(nodelist)==2: nodelist = nodelist[1] - try: - op = cls.get_op(nodelist[0]) - except KeyError: - raise SyntaxError("Comparison or logical expression expected") - return op(nodelist) - - @classmethod - def evaluate(cls, nodelist): - while len(nodelist)==2: nodelist = nodelist[1] - kind = nodelist[0] - name = nodelist[1] - if kind==token.NAME: - try: - op = cls.values[name] - except KeyError: - raise SyntaxError("Unknown name %r" % name) - return op() - if kind==token.STRING: - s = nodelist[1] - if not cls._safe_string(s): - raise SyntaxError( - "Only plain strings allowed in environment markers") - return s[1:-1] - msg = "Language feature not supported in environment markers" - raise SyntaxError(msg) - - @staticmethod - def _safe_string(cand): - return ( - cand[:1] in "'\"" and - not cand.startswith('"""') and - not cand.startswith("'''") and - '\\' not in cand - ) - -invalid_marker = MarkerEvaluation.is_invalid_marker -evaluate_marker = MarkerEvaluation.evaluate_marker class NullProvider: """Try to implement resources and metadata for arbitrary PEP 302 loaders""" @@ -1608,16 +1457,11 @@ class NullProvider: def has_metadata(self, name): return self.egg_info and self._has(self._fn(self.egg_info, name)) - if sys.version_info <= (3,): - def get_metadata(self, name): - if not self.egg_info: - return "" - return self._get(self._fn(self.egg_info, name)) - else: - def get_metadata(self, name): - if not self.egg_info: - return "" - return self._get(self._fn(self.egg_info, name)).decode("utf-8") + def get_metadata(self, name): + if not self.egg_info: + return "" + value = self._get(self._fn(self.egg_info, name)) + return value.decode('utf-8') if six.PY3 else value def get_metadata_lines(self, name): return yield_lines(self.get_metadata(name)) @@ -1637,7 +1481,7 @@ class NullProvider: return [] def run_script(self, script_name, namespace): - script = 'scripts/'+script_name + script = 'scripts/' + script_name if not self.has_metadata(script): raise ResolutionError("No script named %r" % script_name) script_text = self.get_metadata(script).replace('\r\n', '\n') @@ -1653,7 +1497,7 @@ class NullProvider: cache[script_filename] = ( len(script_text), 0, script_text.split('\n'), script_filename ) - script_code = compile(script_text, script_filename,'exec') + script_code = compile(script_text, script_filename, 'exec') exec(script_code, namespace, namespace) def _has(self, path): @@ -1683,6 +1527,7 @@ class NullProvider: "Can't perform this operation for loaders without 'get_data()'" ) + register_loader_type(object, NullProvider) @@ -1698,7 +1543,7 @@ class EggProvider(NullProvider): # of multiple eggs; that's why we use module_path instead of .archive path = self.module_path old = None - while path!=old: + while path != old: if _is_unpacked_egg(path): self.egg_name = os.path.basename(path) self.egg_info = os.path.join(path, 'EGG-INFO') @@ -1707,6 +1552,7 @@ class EggProvider(NullProvider): old = path path, base = os.path.split(path) + class DefaultProvider(EggProvider): """Provides access to package resources in the filesystem""" @@ -1732,6 +1578,7 @@ class DefaultProvider(EggProvider): type(None)) register_loader_type(loader_cls, cls) + DefaultProvider._register() @@ -1746,6 +1593,7 @@ class EmptyProvider(NullProvider): def __init__(self): pass + empty_provider = EmptyProvider() @@ -1824,7 +1672,7 @@ class ZipProvider(EggProvider): def __init__(self, module): EggProvider.__init__(self, module) - self.zip_pre = self.loader.archive+os.sep + self.zip_pre = self.loader.archive + os.sep def _zipinfo_name(self, fspath): # Convert a virtual filename (full path to file) into a zipfile subpath @@ -1838,9 +1686,9 @@ class ZipProvider(EggProvider): def _parts(self, zip_path): # Convert a zipfile subpath into an egg-relative path part list. # pseudo-fs path - fspath = self.zip_pre+zip_path - if fspath.startswith(self.egg_root+os.sep): - return fspath[len(self.egg_root)+1:].split(os.sep) + fspath = self.zip_pre + zip_path + if fspath.startswith(self.egg_root + os.sep): + return fspath[len(self.egg_root) + 1:].split(os.sep) raise AssertionError( "%s is not a subpath of %s" % (fspath, self.egg_root) ) @@ -1911,7 +1759,7 @@ class ZipProvider(EggProvider): # so proceed. return real_path # Windows, del old file and retry - elif os.name=='nt': + elif os.name == 'nt': unlink(real_path) rename(tmpnam, real_path) return real_path @@ -1931,7 +1779,7 @@ class ZipProvider(EggProvider): if not os.path.isfile(file_path): return False stat = os.stat(file_path) - if stat.st_size!=size or stat.st_mtime!=timestamp: + if stat.st_size != size or stat.st_mtime != timestamp: return False # check that the contents match zip_contents = self.loader.get_data(zip_path) @@ -1981,6 +1829,7 @@ class ZipProvider(EggProvider): def _resource_to_zip(self, resource_name): return self._zipinfo_name(self._fn(self.module_path, resource_name)) + register_loader_type(zipimport.zipimporter, ZipProvider) @@ -2000,14 +1849,24 @@ class FileMetadata(EmptyProvider): self.path = path def has_metadata(self, name): - return name=='PKG-INFO' and os.path.isfile(self.path) + return name == 'PKG-INFO' and os.path.isfile(self.path) def get_metadata(self, name): - if name=='PKG-INFO': - with io.open(self.path, encoding='utf-8') as f: - metadata = f.read() - return metadata - raise KeyError("No metadata except PKG-INFO is available") + if name != 'PKG-INFO': + raise KeyError("No metadata except PKG-INFO is available") + + with io.open(self.path, encoding='utf-8', errors="replace") as f: + metadata = f.read() + self._warn_on_replacement(metadata) + return metadata + + def _warn_on_replacement(self, metadata): + # Python 2.6 and 3.2 compat for: replacement_char = '�' + replacement_char = b'\xef\xbf\xbd'.decode('utf-8') + if replacement_char in metadata: + tmpl = "{self.path} could not be properly decoded in UTF-8" + msg = tmpl.format(**locals()) + warnings.warn(msg) def get_metadata_lines(self, name): return yield_lines(self.get_metadata(name)) @@ -2044,7 +1903,7 @@ class EggMetadata(ZipProvider): def __init__(self, importer): """Create a metadata provider from a zipimporter""" - self.zip_pre = importer.archive+os.sep + self.zip_pre = importer.archive + os.sep self.loader = importer if importer.prefix: self.module_path = os.path.join(importer.archive, importer.prefix) @@ -2052,7 +1911,9 @@ class EggMetadata(ZipProvider): self.module_path = importer.archive self._setup_prefix() -_declare_state('dict', _distribution_finders = {}) + +_declare_state('dict', _distribution_finders={}) + def register_finder(importer_type, distribution_finder): """Register `distribution_finder` to find distributions in sys.path items @@ -2070,6 +1931,7 @@ def find_distributions(path_item, only=False): finder = _find_adapter(_distribution_finders, importer) return finder(importer, path_item, only) + def find_eggs_in_zip(importer, path_item, only=False): """ Find eggs in zip files; possibly multiple nested eggs. @@ -2090,12 +1952,43 @@ def find_eggs_in_zip(importer, path_item, only=False): for dist in find_eggs_in_zip(zipimport.zipimporter(subpath), subpath): yield dist + register_finder(zipimport.zipimporter, find_eggs_in_zip) + def find_nothing(importer, path_item, only=False): return () + + register_finder(object, find_nothing) + +def _by_version_descending(names): + """ + Given a list of filenames, return them in descending order + by version number. + + >>> names = 'bar', 'foo', 'Python-2.7.10.egg', 'Python-2.7.2.egg' + >>> _by_version_descending(names) + ['Python-2.7.10.egg', 'Python-2.7.2.egg', 'foo', 'bar'] + >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.egg' + >>> _by_version_descending(names) + ['Setuptools-1.2.3.egg', 'Setuptools-1.2.3b1.egg'] + >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.post1.egg' + >>> _by_version_descending(names) + ['Setuptools-1.2.3.post1.egg', 'Setuptools-1.2.3b1.egg'] + """ + def _by_version(name): + """ + Parse each component of the filename + """ + name, ext = os.path.splitext(name) + parts = itertools.chain(name.split('-'), [ext]) + return [packaging.version.parse(part) for part in parts] + + return sorted(names, key=_by_version, reverse=True) + + def find_on_path(importer, path_item, only=False): """Yield distributions accessible on a sys.path directory""" path_item = _normalize_cached(path_item) @@ -2104,17 +1997,21 @@ def find_on_path(importer, path_item, only=False): if _is_unpacked_egg(path_item): yield Distribution.from_filename( path_item, metadata=PathMetadata( - path_item, os.path.join(path_item,'EGG-INFO') + path_item, os.path.join(path_item, 'EGG-INFO') ) ) else: # scan for .egg and .egg-info in directory - for entry in os.listdir(path_item): + path_item_entries = _by_version_descending(os.listdir(path_item)) + for entry in path_item_entries: lower = entry.lower() if lower.endswith('.egg-info') or lower.endswith('.dist-info'): fullpath = os.path.join(path_item, entry) if os.path.isdir(fullpath): # egg-info directory, allow getting metadata + if len(os.listdir(fullpath)) == 0: + # Empty egg directory, skip. + continue metadata = PathMetadata(path_item, fullpath) else: metadata = FileMetadata(fullpath) @@ -2136,6 +2033,8 @@ def find_on_path(importer, path_item, only=False): for item in dists: yield item break + + register_finder(pkgutil.ImpImporter, find_on_path) if hasattr(importlib_machinery, 'FileFinder'): @@ -2162,6 +2061,7 @@ def register_namespace_handler(importer_type, namespace_handler): """ _namespace_handlers[importer_type] = namespace_handler + def _handle_ns(packageName, path_item): """Ensure that named package includes a subpath of path_item (if needed)""" @@ -2176,7 +2076,7 @@ def _handle_ns(packageName, path_item): module = sys.modules[packageName] = types.ModuleType(packageName) module.__path__ = [] _set_parent_ns(packageName) - elif not hasattr(module,'__path__'): + elif not hasattr(module, '__path__'): raise TypeError("Not a package:", packageName) handler = _find_adapter(_namespace_handlers, importer) subpath = handler(importer, path_item, packageName, module) @@ -2194,13 +2094,28 @@ def _rebuild_mod_path(orig_path, package_name, module): corresponding to their sys.path order """ sys_path = [_normalize_cached(p) for p in sys.path] - def position_in_sys_path(p): + + def safe_sys_path_index(entry): + """ + Workaround for #520 and #513. + """ + try: + return sys_path.index(entry) + except ValueError: + return float('inf') + + def position_in_sys_path(path): """ Return the ordinal of the path based on its position in sys.path """ - parts = p.split(os.sep) - parts = parts[:-(package_name.count('.') + 1)] - return sys_path.index(_normalize_cached(os.sep.join(parts))) + path_parts = path.split(os.sep) + module_parts = package_name.count('.') + 1 + parts = path_parts[:-module_parts] + return safe_sys_path_index(_normalize_cached(os.sep.join(parts))) + + if not isinstance(orig_path, list): + # Is this behavior useful when module.__path__ is not a list? + return orig_path.sort(key=position_in_sys_path) module.__path__[:] = [_normalize_cached(p) for p in orig_path] @@ -2227,8 +2142,8 @@ def declare_namespace(packageName): # Track what packages are namespaces, so when new path items are added, # they can be updated - _namespace_packages.setdefault(parent,[]).append(packageName) - _namespace_packages.setdefault(packageName,[]) + _namespace_packages.setdefault(parent, []).append(packageName) + _namespace_packages.setdefault(packageName, []) for path_item in path: # Ensure all the parent's path items are reflected in the child, @@ -2238,29 +2153,32 @@ def declare_namespace(packageName): finally: _imp.release_lock() + def fixup_namespace_packages(path_item, parent=None): """Ensure that previously-declared namespace packages include path_item""" _imp.acquire_lock() try: - for package in _namespace_packages.get(parent,()): + for package in _namespace_packages.get(parent, ()): subpath = _handle_ns(package, path_item) if subpath: fixup_namespace_packages(subpath, package) finally: _imp.release_lock() + def file_ns_handler(importer, path_item, packageName, module): """Compute an ns-package subpath for a filesystem or zipfile importer""" subpath = os.path.join(path_item, packageName.split('.')[-1]) normalized = _normalize_cached(subpath) for item in module.__path__: - if _normalize_cached(item)==normalized: + if _normalize_cached(item) == normalized: break else: # Only return the path if it's not already there return subpath + register_namespace_handler(pkgutil.ImpImporter, file_ns_handler) register_namespace_handler(zipimport.zipimporter, file_ns_handler) @@ -2271,6 +2189,7 @@ if hasattr(importlib_machinery, 'FileFinder'): def null_ns_handler(importer, path_item, packageName, module): return None + register_namespace_handler(object, null_ns_handler) @@ -2278,6 +2197,7 @@ def normalize_path(filename): """Normalize a file/dir name for comparison purposes""" return os.path.normcase(os.path.realpath(filename)) + def _normalize_cached(filename, _cache={}): try: return _cache[filename] @@ -2285,6 +2205,7 @@ def _normalize_cached(filename, _cache={}): _cache[filename] = result = normalize_path(filename) return result + def _is_unpacked_egg(path): """ Determine if given path appears to be an unpacked egg. @@ -2293,6 +2214,7 @@ def _is_unpacked_egg(path): path.lower().endswith('.egg') ) + def _set_parent_ns(packageName): parts = packageName.split('.') name = parts.pop() @@ -2314,18 +2236,7 @@ def yield_lines(strs): for s in yield_lines(ss): yield s -# whitespace and comment -LINE_END = re.compile(r"\s*(#.*)?$").match -# line continuation -CONTINUE = re.compile(r"\s*\\\s*(#.*)?$").match -# Distribution or extra -DISTRO = re.compile(r"\s*((\w|[-.])+)").match -# ver. info -VERSION = re.compile(r"\s*(<=?|>=?|===?|!=|~=)\s*((\w|[-.*_!+])+)").match -# comma between items -COMMA = re.compile(r"\s*,").match -OBRACKET = re.compile(r"\s*\[").match -CBRACKET = re.compile(r"\s*\]").match + MODULE = re.compile(r"\w+(\.\w+)*$").match EGG_NAME = re.compile( r""" @@ -2444,7 +2355,7 @@ class EntryPoint(object): ep = cls.parse(line, dist) if ep.name in this: raise ValueError("Duplicate entry point", group, ep.name) - this[ep.name]=ep + this[ep.name] = ep return this @classmethod @@ -2506,7 +2417,7 @@ class Distribution(object): @classmethod def from_location(cls, location, basename, metadata=None, **kw): - project_name, version, py_version, platform = [None]*4 + project_name, version, py_version, platform = [None] * 4 basename, ext = os.path.splitext(basename) if ext.lower() in _distributionImpl: cls = _distributionImpl[ext.lower()] @@ -2628,11 +2539,11 @@ class Distribution(object): extra, marker = extra.split(':', 1) if invalid_marker(marker): # XXX warn - reqs=[] + reqs = [] elif not evaluate_marker(marker): - reqs=[] + reqs = [] extra = safe_extra(extra) or None - dm.setdefault(extra,[]).extend(parse_requirements(reqs)) + dm.setdefault(extra, []).extend(parse_requirements(reqs)) return dm def requires(self, extras=()): @@ -2654,11 +2565,11 @@ class Distribution(object): for line in self.get_metadata_lines(name): yield line - def activate(self, path=None): + def activate(self, path=None, replace=False): """Ensure distribution is importable on `path` (default=sys.path)""" if path is None: path = sys.path - self.insert_on(path, replace=True) + self.insert_on(path, replace=replace) if path is sys.path: fixup_namespace_packages(self.location) for pkg in self._get_metadata('namespace_packages.txt'): @@ -2728,7 +2639,7 @@ class Distribution(object): self._get_metadata('entry_points.txt'), self ) if group is not None: - return ep_map.get(group,{}) + return ep_map.get(group, {}) return ep_map def get_entry_info(self, group, name): @@ -2736,7 +2647,24 @@ class Distribution(object): return self.get_entry_map(group).get(name) def insert_on(self, path, loc=None, replace=False): - """Insert self.location in path before its nearest parent directory""" + """Ensure self.location is on path + + If replace=False (default): + - If location is already in path anywhere, do nothing. + - Else: + - If it's an egg and its parent directory is on path, + insert just ahead of the parent. + - Else: add to the end of path. + If replace=True: + - If location is already on path anywhere (not eggs) + or higher priority than its parent (eggs) + do nothing. + - Else: + - If it's an egg and its parent directory is on path, + insert just ahead of the parent, + removing any lower-priority entries. + - Else: add it to the front of path. + """ loc = loc or self.location if not loc: @@ -2744,13 +2672,20 @@ class Distribution(object): nloc = _normalize_cached(loc) bdir = os.path.dirname(nloc) - npath= [(p and _normalize_cached(p) or p) for p in path] + npath = [(p and _normalize_cached(p) or p) for p in path] for p, item in enumerate(npath): if item == nloc: - break + if replace: + break + else: + # don't modify path (even removing duplicates) if found and not replace + return elif item == bdir and self.precedence == EGG_DIST: # if it's an .egg, give it precedence over its directory + # UNLESS it's already been added to sys.path and replace=False + if (not replace) and nloc in npath[p:]: + return if path is sys.path: self.check_version_conflict() path.insert(p, loc) @@ -2768,7 +2703,7 @@ class Distribution(object): # p is the spot where we found or inserted loc; now remove duplicates while True: try: - np = npath.index(nloc, p+1) + np = npath.index(nloc, p + 1) except ValueError: break else: @@ -2808,7 +2743,7 @@ class Distribution(object): return False return True - def clone(self,**kw): + def clone(self, **kw): """Copy this distribution, substituting in any changed keyword args""" names = 'project_name version py_version platform location precedence' for attr in names.split(): @@ -2822,7 +2757,6 @@ class Distribution(object): class EggInfoDistribution(Distribution): - def _reload_version(self): """ Packages installed by distutils (e.g. numpy or scipy), @@ -2864,42 +2798,26 @@ class DistInfoDistribution(Distribution): self.__dep_map = self._compute_dependencies() return self.__dep_map - def _preparse_requirement(self, requires_dist): - """Convert 'Foobar (1); baz' to ('Foobar ==1', 'baz') - Split environment marker, add == prefix to version specifiers as - necessary, and remove parenthesis. - """ - parts = requires_dist.split(';', 1) + [''] - distvers = parts[0].strip() - mark = parts[1].strip() - distvers = re.sub(self.EQEQ, r"\1==\2\3", distvers) - distvers = distvers.replace('(', '').replace(')', '') - return (distvers, mark) - def _compute_dependencies(self): """Recompute this distribution's dependencies.""" - from _markerlib import compile as compile_marker dm = self.__dep_map = {None: []} reqs = [] # Including any condition expressions for req in self._parsed_pkg_info.get_all('Requires-Dist') or []: - distvers, mark = self._preparse_requirement(req) - parsed = next(parse_requirements(distvers)) - parsed.marker_fn = compile_marker(mark) - reqs.append(parsed) + reqs.extend(parse_requirements(req)) def reqs_for_extra(extra): for req in reqs: - if req.marker_fn(override={'extra':extra}): + if not req.marker or req.marker.evaluate({'extra': extra}): yield req common = frozenset(reqs_for_extra(None)) dm[None].extend(common) for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []: - extra = safe_extra(extra.strip()) - dm[extra] = list(frozenset(reqs_for_extra(extra)) - common) + s_extra = safe_extra(extra.strip()) + dm[s_extra] = list(frozenset(reqs_for_extra(extra)) - common) return dm @@ -2911,7 +2829,7 @@ _distributionImpl = { } -def issue_warning(*args,**kw): +def issue_warning(*args, **kw): level = 1 g = globals() try: @@ -2937,85 +2855,38 @@ def parse_requirements(strs): # create a steppable iterator, so we can handle \-continuations lines = iter(yield_lines(strs)) - def scan_list(ITEM, TERMINATOR, line, p, groups, item_name): - - items = [] - - while not TERMINATOR(line, p): - if CONTINUE(line, p): - try: - line = next(lines) - p = 0 - except StopIteration: - msg = "\\ must not appear on the last nonblank line" - raise RequirementParseError(msg) - - match = ITEM(line, p) - if not match: - msg = "Expected " + item_name + " in" - raise RequirementParseError(msg, line, "at", line[p:]) - - items.append(match.group(*groups)) - p = match.end() - - match = COMMA(line, p) - if match: - # skip the comma - p = match.end() - elif not TERMINATOR(line, p): - msg = "Expected ',' or end-of-list in" - raise RequirementParseError(msg, line, "at", line[p:]) - - match = TERMINATOR(line, p) - # skip the terminator, if any - if match: - p = match.end() - return line, p, items - for line in lines: - match = DISTRO(line) - if not match: - raise RequirementParseError("Missing distribution spec", line) - project_name = match.group(1) - p = match.end() - extras = [] - - match = OBRACKET(line, p) - if match: - p = match.end() - line, p, extras = scan_list( - DISTRO, CBRACKET, line, p, (1,), "'extra' name" - ) - - line, p, specs = scan_list(VERSION, LINE_END, line, p, (1, 2), - "version spec") - specs = [(op, val) for op, val in specs] - yield Requirement(project_name, specs, extras) + # Drop comments -- a hash without a space may be in a URL. + if ' #' in line: + line = line[:line.find(' #')] + # If there is a line continuation, drop it, and append the next line. + if line.endswith('\\'): + line = line[:-2].strip() + line += next(lines) + yield Requirement(line) -class Requirement: - def __init__(self, project_name, specs, extras): +class Requirement(packaging.requirements.Requirement): + def __init__(self, requirement_string): """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" - self.unsafe_name, project_name = project_name, safe_name(project_name) + try: + super(Requirement, self).__init__(requirement_string) + except packaging.requirements.InvalidRequirement as e: + raise RequirementParseError(str(e)) + self.unsafe_name = self.name + project_name = safe_name(self.name) self.project_name, self.key = project_name, project_name.lower() - self.specifier = packaging.specifiers.SpecifierSet( - ",".join(["".join([x, y]) for x, y in specs]) - ) - self.specs = specs - self.extras = tuple(map(safe_extra, extras)) + self.specs = [ + (spec.operator, spec.version) for spec in self.specifier] + self.extras = tuple(map(safe_extra, self.extras)) self.hashCmp = ( self.key, self.specifier, frozenset(self.extras), + str(self.marker) if self.marker else None, ) self.__hash = hash(self.hashCmp) - def __str__(self): - extras = ','.join(self.extras) - if extras: - extras = '[%s]' % extras - return '%s%s%s' % (self.project_name, extras, self.specifier) - def __eq__(self, other): return ( isinstance(other, Requirement) and @@ -3051,10 +2922,14 @@ class Requirement: def _get_mro(cls): """Get an mro for a type or classic class""" if not isinstance(cls, type): - class cls(cls, object): pass + + class cls(cls, object): + pass + return cls.__mro__[1:] return cls.__mro__ + def _find_adapter(registry, ob): """Return an adapter factory for `ob` from `registry`""" for t in _get_mro(getattr(ob, '__class__', type(ob))): @@ -3104,12 +2979,13 @@ def split_sections(s): # wrap up last segment yield section, content -def _mkstemp(*args,**kw): + +def _mkstemp(*args, **kw): old_open = os.open try: # temporarily bypass sandboxing os.open = os_open - return tempfile.mkstemp(*args,**kw) + return tempfile.mkstemp(*args, **kw) finally: # and then put it back os.open = old_open @@ -3133,9 +3009,11 @@ def _initialize(g=globals()): "Set up global resource manager (deliberately not state-saved)" manager = ResourceManager() g['_manager'] = manager - for name in dir(manager): - if not name.startswith('_'): - g[name] = getattr(manager, name) + g.update( + (name, getattr(manager, name)) + for name in dir(manager) + if not name.startswith('_') + ) @_call_aside @@ -3160,11 +3038,16 @@ def _initialize_master_working_set(): run_script = working_set.run_script # backward compatibility run_main = run_script - # Activate all distributions already on sys.path, and ensure that - # all distributions added to the working set in the future (e.g. by - # calling ``require()``) will get activated as well. - add_activation_listener(lambda dist: dist.activate()) - working_set.entries=[] + # Activate all distributions already on sys.path with replace=False and + # ensure that all distributions added to the working set in the future + # (e.g. by calling ``require()``) will get activated as well, + # with higher priority (replace=True). + tuple( + dist.activate(replace=False) + for dist in working_set + ) + add_activation_listener(lambda dist: dist.activate(replace=True), existing=False) + working_set.entries = [] # match order list(map(working_set.add_entry, sys.path)) globals().update(locals()) diff --git a/lib/python3.4/site-packages/pkg_resources/_vendor/appdirs.py b/lib/python3.4/site-packages/pkg_resources/_vendor/appdirs.py new file mode 100644 index 0000000..f4dba09 --- /dev/null +++ b/lib/python3.4/site-packages/pkg_resources/_vendor/appdirs.py @@ -0,0 +1,552 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2005-2010 ActiveState Software Inc. +# Copyright (c) 2013 Eddy Petrișor + +"""Utilities for determining application-specific dirs. + +See 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_info__ = (1, 4, 0) +__version__ = '.'.join(map(str, __version_info__)) + + +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' +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/ + 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): + """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 user 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.sep.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 data 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 deafult "~/.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 + + +def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): + """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 user data 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 + # only first, if multipath is False + path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') + 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.sep.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")) + 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_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 cache 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, 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_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. + """ + 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 kernal.GetShortPathName(dir, buf, buf_size): + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + return dir + +if system == "win32": + try: + import win32com.shell + _get_win_folder = _get_win_folder_with_pywin32 + except ImportError: + 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 + + +#---- self test code + +if __name__ == "__main__": + appname = "MyApp" + appauthor = "MyCompany" + + props = ("user_data_dir", "site_data_dir", + "user_config_dir", "site_config_dir", + "user_cache_dir", "user_log_dir") + + 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/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/__about__.py b/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/__about__.py index eadb794..95d330e 100644 --- a/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/__about__.py +++ b/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/__about__.py @@ -1,16 +1,6 @@ -# Copyright 2014 Donald Stufft -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. from __future__ import absolute_import, division, print_function __all__ = [ @@ -22,10 +12,10 @@ __title__ = "packaging" __summary__ = "Core utilities for Python packages" __uri__ = "https://github.com/pypa/packaging" -__version__ = "15.3" +__version__ = "16.8" -__author__ = "Donald Stufft" +__author__ = "Donald Stufft and individual contributors" __email__ = "donald@stufft.io" -__license__ = "Apache License, Version 2.0" -__copyright__ = "Copyright 2014 %s" % __author__ +__license__ = "BSD or Apache License, Version 2.0" +__copyright__ = "Copyright 2014-2016 %s" % __author__ diff --git a/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/__init__.py b/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/__init__.py index c39a8ea..5ee6220 100644 --- a/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/__init__.py +++ b/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/__init__.py @@ -1,16 +1,6 @@ -# Copyright 2014 Donald Stufft -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. from __future__ import absolute_import, division, print_function from .__about__ import ( diff --git a/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/_compat.py b/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/_compat.py index 5c396ce..210bb80 100644 --- a/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/_compat.py +++ b/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/_compat.py @@ -1,16 +1,6 @@ -# Copyright 2014 Donald Stufft -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. from __future__ import absolute_import, division, print_function import sys diff --git a/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/_structures.py b/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/_structures.py index 0ae9bb5..ccc2786 100644 --- a/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/_structures.py +++ b/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/_structures.py @@ -1,16 +1,6 @@ -# Copyright 2014 Donald Stufft -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. from __future__ import absolute_import, division, print_function diff --git a/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/markers.py b/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/markers.py index 9e90601..892e578 100644 --- a/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/markers.py +++ b/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/markers.py @@ -52,13 +52,26 @@ class Node(object): def __repr__(self): return "<{0}({1!r})>".format(self.__class__.__name__, str(self)) + def serialize(self): + raise NotImplementedError + class Variable(Node): - pass + + def serialize(self): + return str(self) class Value(Node): - pass + + def serialize(self): + return '"{0}"'.format(self) + + +class Op(Node): + + def serialize(self): + return str(self) VARIABLE = ( @@ -73,9 +86,23 @@ VARIABLE = ( L("python_version") | L("sys_platform") | L("os_name") | + L("os.name") | # PEP-345 + L("sys.platform") | # PEP-345 + L("platform.version") | # PEP-345 + L("platform.machine") | # PEP-345 + L("platform.python_implementation") | # PEP-345 + L("python_implementation") | # undocumented setuptools legacy L("extra") ) -VARIABLE.setParseAction(lambda s, l, t: Variable(t[0])) +ALIASES = { + 'os.name': 'os_name', + 'sys.platform': 'sys_platform', + 'platform.version': 'platform_version', + 'platform.machine': 'platform_machine', + 'platform.python_implementation': 'platform_python_implementation', + 'python_implementation': 'platform_python_implementation' +} +VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) VERSION_CMP = ( L("===") | @@ -89,6 +116,7 @@ VERSION_CMP = ( ) MARKER_OP = VERSION_CMP | L("not in") | L("in") +MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) MARKER_VALUE = QuotedString("'") | QuotedString('"') MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) @@ -135,7 +163,7 @@ def _format_marker(marker, first=True): else: return "(" + " ".join(inner) + ")" elif isinstance(marker, tuple): - return '{0} {1} "{2}"'.format(*marker) + return " ".join([m.serialize() for m in marker]) else: return marker @@ -154,13 +182,13 @@ _operators = { def _eval_op(lhs, op, rhs): try: - spec = Specifier("".join([op, rhs])) + spec = Specifier("".join([op.serialize(), rhs])) except InvalidSpecifier: pass else: return spec.contains(lhs) - oper = _operators.get(op) + oper = _operators.get(op.serialize()) if oper is None: raise UndefinedComparison( "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs) diff --git a/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/specifiers.py b/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/specifiers.py index 891664f..7f5a76c 100644 --- a/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/specifiers.py +++ b/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/specifiers.py @@ -1,16 +1,6 @@ -# Copyright 2014 Donald Stufft -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. from __future__ import absolute_import, division, print_function import abc @@ -204,8 +194,8 @@ class _IndividualSpecifier(BaseSpecifier): # If our version is a prerelease, and we were not set to allow # prereleases, then we'll store it for later incase nothing # else matches this specifier. - if (parsed_version.is_prerelease - and not (prereleases or self.prereleases)): + if (parsed_version.is_prerelease and not + (prereleases or self.prereleases)): found_prereleases.append(version) # Either this is not a prerelease, or we should have been # accepting prereleases from the begining. @@ -223,23 +213,23 @@ class _IndividualSpecifier(BaseSpecifier): class LegacySpecifier(_IndividualSpecifier): - _regex = re.compile( + _regex_str = ( r""" - ^ - \s* (?P(==|!=|<=|>=|<|>)) \s* (?P - [^\s]* # We just match everything, except for whitespace since this - # is a "legacy" specifier and the version string can be just - # about anything. + [^,;\s)]* # Since this is a "legacy" specifier, and the version + # string can be just about anything, we match everything + # except for whitespace, a semi-colon for marker support, + # a closing paren since versions can be enclosed in + # them, and a comma since it's a version separator. ) - \s* - $ - """, - re.VERBOSE | re.IGNORECASE, + """ ) + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + _operators = { "==": "equal", "!=": "not_equal", @@ -284,10 +274,8 @@ def _require_version_compare(fn): class Specifier(_IndividualSpecifier): - _regex = re.compile( + _regex_str = ( r""" - ^ - \s* (?P(~=|==|!=|<=|>=|<|>|===)) (?P (?: @@ -378,12 +366,12 @@ class Specifier(_IndividualSpecifier): (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release ) ) - \s* - $ - """, - re.VERBOSE | re.IGNORECASE, + """ ) + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + _operators = { "~=": "compatible", "==": "equal", @@ -409,8 +397,8 @@ class Specifier(_IndividualSpecifier): prefix = ".".join( list( itertools.takewhile( - lambda x: (not x.startswith("post") - and not x.startswith("dev")), + lambda x: (not x.startswith("post") and not + x.startswith("dev")), _version_split(spec), ) )[:-1] @@ -419,13 +407,15 @@ class Specifier(_IndividualSpecifier): # Add the prefix notation to the end of our string prefix += ".*" - return (self._get_operator(">=")(prospective, spec) - and self._get_operator("==")(prospective, prefix)) + return (self._get_operator(">=")(prospective, spec) and + self._get_operator("==")(prospective, prefix)) @_require_version_compare def _compare_equal(self, prospective, spec): # We need special logic to handle prefix matching if spec.endswith(".*"): + # In the case of prefix matching we want to ignore local segment. + prospective = Version(prospective.public) # Split the spec out by dots, and pretend that there is an implicit # dot in between a release segment and a pre-release segment. spec = _version_split(spec[:-2]) # Remove the trailing .* @@ -577,8 +567,8 @@ def _pad_version(left, right): right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) # Get the rest of our versions - left_split.append(left[len(left_split):]) - right_split.append(left[len(right_split):]) + left_split.append(left[len(left_split[0]):]) + right_split.append(right[len(right_split[0]):]) # Insert our padding left_split.insert( diff --git a/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/version.py b/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/version.py index 4ba574b..83b5ee8 100644 --- a/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/version.py +++ b/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/version.py @@ -1,16 +1,6 @@ -# Copyright 2014 Donald Stufft -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. from __future__ import absolute_import, division, print_function import collections diff --git a/lib/python3.4/site-packages/pkg_resources/_vendor/pyparsing.py b/lib/python3.4/site-packages/pkg_resources/_vendor/pyparsing.py index 3e02dbe..a212243 100644 --- a/lib/python3.4/site-packages/pkg_resources/_vendor/pyparsing.py +++ b/lib/python3.4/site-packages/pkg_resources/_vendor/pyparsing.py @@ -1,6 +1,6 @@ # module pyparsing.py # -# Copyright (c) 2003-2015 Paul T. McGuire +# Copyright (c) 2003-2016 Paul T. McGuire # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -31,15 +31,18 @@ vs. the traditional lex/yacc approach, or the use of regular expressions. With don't need to learn a new syntax for defining grammars or matching expressions - the parsing module provides a library of classes that you use to construct the grammar directly in Python. -Here is a program to parse "Hello, World!" (or any greeting of the form C{", !"}):: +Here is a program to parse "Hello, World!" (or any greeting of the form +C{", !"}), built up using L{Word}, L{Literal}, and L{And} elements +(L{'+'} operator gives L{And} expressions, strings are auto-converted to +L{Literal} expressions):: from pyparsing import Word, alphas # define grammar of a greeting - greet = Word( alphas ) + "," + Word( alphas ) + "!" + greet = Word(alphas) + "," + Word(alphas) + "!" hello = "Hello, World!" - print (hello, "->", greet.parseString( hello )) + print (hello, "->", greet.parseString(hello)) The program outputs the following:: @@ -48,7 +51,7 @@ The program outputs the following:: The Python representation of the grammar is quite readable, owing to the self-explanatory class names, and the use of '+', '|' and '^' operators. -The parsed results returned from C{parseString()} can be accessed as a nested list, a dictionary, or an +The L{ParseResults} object returned from L{ParserElement.parseString} can be accessed as a nested list, a dictionary, or an object with named attributes. The pyparsing module handles some of the problems that are typically vexing when writing text parsers: @@ -57,8 +60,8 @@ The pyparsing module handles some of the problems that are typically vexing when - embedded comments """ -__version__ = "2.0.6" -__versionTime__ = "9 Nov 2015 19:03" +__version__ = "2.1.10" +__versionTime__ = "07 Oct 2016 01:31 UTC" __author__ = "Paul McGuire " import string @@ -70,8 +73,22 @@ import re import sre_constants import collections import pprint -import functools -import itertools +import traceback +import types +from datetime import datetime + +try: + from _thread import RLock +except ImportError: + from threading import RLock + +try: + from collections import OrderedDict as _OrderedDict +except ImportError: + try: + from ordereddict import OrderedDict as _OrderedDict + except ImportError: + _OrderedDict = None #~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) @@ -81,21 +98,23 @@ __all__ = [ 'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', 'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', 'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', -'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', 'Upcase', +'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', 'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', 'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', 'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', 'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', -'htmlComment', 'javaStyleComment', 'keepOriginalText', 'line', 'lineEnd', 'lineStart', 'lineno', +'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', 'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', 'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', 'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', 'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', 'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', 'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass', +'CloseMatch', 'tokenMap', 'pyparsing_common', ] -PY_3 = sys.version.startswith('3') +system_version = tuple(sys.version_info)[:3] +PY_3 = system_version[0] == 3 if PY_3: _MAX_INT = sys.maxsize basestring = str @@ -123,18 +142,11 @@ else: return str(obj) except UnicodeEncodeError: - # The Python docs (http://docs.python.org/ref/customization.html#l2h-182) - # state that "The return value must be a string object". However, does a - # unicode object (being a subclass of basestring) count as a "string - # object"? - # If so, then return a unicode object: - return unicode(obj) - # Else encode it... but how? There are many choices... :) - # Replace unprintables with escape codes? - #return unicode(obj).encode(sys.getdefaultencoding(), 'backslashreplace_errors') - # Replace unprintables with question marks? - #return unicode(obj).encode(sys.getdefaultencoding(), 'replace') - # ... + # Else encode it + ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') + xmlcharref = Regex('&#\d+;') + xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) + return xmlcharref.transformString(ret) # build list of single arg builtins, tolerant of Python version, that can be used as parse actions singleArgBuiltins = [] @@ -160,7 +172,7 @@ def _xml_escape(data): class _Constants(object): pass -alphas = string.ascii_lowercase + string.ascii_uppercase +alphas = string.ascii_uppercase + string.ascii_lowercase nums = "0123456789" hexnums = nums + "ABCDEFabcdef" alphanums = alphas + nums @@ -180,6 +192,15 @@ class ParseBaseException(Exception): self.msg = msg self.pstr = pstr self.parserElement = elem + self.args = (pstr, loc, msg) + + @classmethod + def _from_exception(cls, pe): + """ + internal factory method to simplify creating one type of ParseException + from another - avoids having __init__ signature conflicts among subclasses + """ + return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement) def __getattr__( self, aname ): """supported attributes by name are: @@ -212,15 +233,26 @@ class ParseBaseException(Exception): markerString, line_str[line_column:])) return line_str.strip() def __dir__(self): - return "loc msg pstr parserElement lineno col line " \ - "markInputline __str__ __repr__".split() + return "lineno col line".split() + dir(type(self)) class ParseException(ParseBaseException): - """exception thrown when parse expressions don't match class; - supported attributes by name are: - - lineno - returns the line number of the exception text - - col - returns the column number of the exception text - - line - returns the line containing the exception text + """ + Exception thrown when parse expressions don't match class; + supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + + Example:: + try: + Word(nums).setName("integer").parseString("ABC") + except ParseException as pe: + print(pe) + print("column: {}".format(pe.col)) + + prints:: + Expected integer (at char 0), (line:1, col:1) + column: 1 """ pass @@ -230,12 +262,10 @@ class ParseFatalException(ParseBaseException): pass class ParseSyntaxException(ParseFatalException): - """just like C{L{ParseFatalException}}, but thrown internally when an - C{L{ErrorStop}} ('-' operator) indicates that parsing is to stop immediately because - an unbacktrackable syntax error has been found""" - def __init__(self, pe): - super(ParseSyntaxException, self).__init__( - pe.pstr, pe.loc, pe.msg, pe.parserElement) + """just like L{ParseFatalException}, but thrown internally when an + L{ErrorStop} ('-' operator) indicates that parsing is to stop + immediately because an unbacktrackable syntax error has been found""" + pass #~ class ReparseException(ParseBaseException): #~ """Experimental class - parse actions can raise this exception to cause @@ -251,7 +281,7 @@ class ParseSyntaxException(ParseFatalException): #~ self.reparseLoc = restartLoc class RecursiveGrammarException(Exception): - """exception thrown by C{validate()} if the grammar could be improperly recursive""" + """exception thrown by L{ParserElement.validate} if the grammar could be improperly recursive""" def __init__( self, parseElementList ): self.parseElementTrace = parseElementList @@ -264,17 +294,50 @@ class _ParseResultsWithOffset(object): def __getitem__(self,i): return self.tup[i] def __repr__(self): - return repr(self.tup) + return repr(self.tup[0]) def setOffset(self,i): self.tup = (self.tup[0],i) class ParseResults(object): - """Structured parse results, to provide multiple means of access to the parsed data: + """ + Structured parse results, to provide multiple means of access to the parsed data: - as a list (C{len(results)}) - by list index (C{results[0], results[1]}, etc.) - - by attribute (C{results.}) - """ - def __new__(cls, toklist, name=None, asList=True, modal=True ): + - by attribute (C{results.} - see L{ParserElement.setResultsName}) + + Example:: + integer = Word(nums) + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + # equivalent form: + # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + # parseString returns a ParseResults object + result = date_str.parseString("1999/12/31") + + def test(s, fn=repr): + print("%s -> %s" % (s, fn(eval(s)))) + test("list(result)") + test("result[0]") + test("result['month']") + test("result.day") + test("'month' in result") + test("'minutes' in result") + test("result.dump()", str) + prints:: + list(result) -> ['1999', '/', '12', '/', '31'] + result[0] -> '1999' + result['month'] -> '12' + result.day -> '31' + 'month' in result -> True + 'minutes' in result -> False + result.dump() -> ['1999', '/', '12', '/', '31'] + - day: 31 + - month: 12 + - year: 1999 + """ + def __new__(cls, toklist=None, name=None, asList=True, modal=True ): if isinstance(toklist, cls): return toklist retobj = object.__new__(cls) @@ -283,12 +346,16 @@ class ParseResults(object): # Performance tuning: we construct a *lot* of these, so keep this # constructor as small and fast as possible - def __init__( self, toklist, name=None, asList=True, modal=True, isinstance=isinstance ): + def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ): if self.__doinit: self.__doinit = False self.__name = None self.__parent = None self.__accumNames = {} + self.__asList = asList + self.__modal = modal + if toklist is None: + toklist = [] if isinstance(toklist, list): self.__toklist = toklist[:] elif isinstance(toklist, _generatorType): @@ -331,7 +398,7 @@ class ParseResults(object): if isinstance(v,_ParseResultsWithOffset): self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] sub = v[0] - elif isinstance(k,int): + elif isinstance(k,(int,slice)): self.__toklist[k] = v sub = v else: @@ -354,11 +421,6 @@ class ParseResults(object): removed = list(range(*i.indices(mylen))) removed.reverse() # fixup indices in token dictionary - #~ for name in self.__tokdict: - #~ occurrences = self.__tokdict[name] - #~ for j in removed: - #~ for k, (value, position) in enumerate(occurrences): - #~ occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) for name,occurrences in self.__tokdict.items(): for j in removed: for k, (value, position) in enumerate(occurrences): @@ -370,39 +432,52 @@ class ParseResults(object): return k in self.__tokdict def __len__( self ): return len( self.__toklist ) - def __bool__(self): return len( self.__toklist ) > 0 + def __bool__(self): return ( not not self.__toklist ) __nonzero__ = __bool__ def __iter__( self ): return iter( self.__toklist ) def __reversed__( self ): return iter( self.__toklist[::-1] ) - def iterkeys( self ): - """Returns all named result keys.""" + def _iterkeys( self ): if hasattr(self.__tokdict, "iterkeys"): return self.__tokdict.iterkeys() else: return iter(self.__tokdict) - def itervalues( self ): - """Returns all named result values.""" - return (self[k] for k in self.iterkeys()) + def _itervalues( self ): + return (self[k] for k in self._iterkeys()) - def iteritems( self ): - return ((k, self[k]) for k in self.iterkeys()) + def _iteritems( self ): + return ((k, self[k]) for k in self._iterkeys()) if PY_3: - keys = iterkeys - values = itervalues - items = iteritems + keys = _iterkeys + """Returns an iterator of all named result keys (Python 3.x only).""" + + values = _itervalues + """Returns an iterator of all named result values (Python 3.x only).""" + + items = _iteritems + """Returns an iterator of all named result key-value tuples (Python 3.x only).""" + else: + iterkeys = _iterkeys + """Returns an iterator of all named result keys (Python 2.x only).""" + + itervalues = _itervalues + """Returns an iterator of all named result values (Python 2.x only).""" + + iteritems = _iteritems + """Returns an iterator of all named result key-value tuples (Python 2.x only).""" + def keys( self ): - """Returns all named result keys.""" + """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" return list(self.iterkeys()) def values( self ): - """Returns all named result values.""" + """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" return list(self.itervalues()) def items( self ): - """Returns all named result keys and values as a list of tuples.""" + """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" return list(self.iteritems()) def haskeys( self ): @@ -411,14 +486,39 @@ class ParseResults(object): return bool(self.__tokdict) def pop( self, *args, **kwargs): - """Removes and returns item at specified index (default=last). - Supports both list and dict semantics for pop(). If passed no - argument or an integer argument, it will use list semantics - and pop tokens from the list of parsed tokens. If passed a - non-integer argument (most likely a string), it will use dict - semantics and pop the corresponding value from any defined - results names. A second default return value argument is - supported, just as in dict.pop().""" + """ + Removes and returns item at specified index (default=C{last}). + Supports both C{list} and C{dict} semantics for C{pop()}. If passed no + argument or an integer argument, it will use C{list} semantics + and pop tokens from the list of parsed tokens. If passed a + non-integer argument (most likely a string), it will use C{dict} + semantics and pop the corresponding value from any defined + results names. A second default return value argument is + supported, just as in C{dict.pop()}. + + Example:: + def remove_first(tokens): + tokens.pop(0) + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] + + label = Word(alphas) + patt = label("LABEL") + OneOrMore(Word(nums)) + print(patt.parseString("AAB 123 321").dump()) + + # Use pop() in a parse action to remove named result (note that corresponding value is not + # removed from list form of results) + def remove_LABEL(tokens): + tokens.pop("LABEL") + return tokens + patt.addParseAction(remove_LABEL) + print(patt.parseString("AAB 123 321").dump()) + prints:: + ['AAB', '123', '321'] + - LABEL: AAB + + ['AAB', '123', '321'] + """ if not args: args = [-1] for k,v in kwargs.items(): @@ -438,39 +538,83 @@ class ParseResults(object): return defaultvalue def get(self, key, defaultValue=None): - """Returns named result matching the given key, or if there is no - such name, then returns the given C{defaultValue} or C{None} if no - C{defaultValue} is specified.""" + """ + Returns named result matching the given key, or if there is no + such name, then returns the given C{defaultValue} or C{None} if no + C{defaultValue} is specified. + + Similar to C{dict.get()}. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString("1999/12/31") + print(result.get("year")) # -> '1999' + print(result.get("hour", "not specified")) # -> 'not specified' + print(result.get("hour")) # -> None + """ if key in self: return self[key] else: return defaultValue def insert( self, index, insStr ): - """Inserts new element at location index in the list of parsed tokens.""" + """ + Inserts new element at location index in the list of parsed tokens. + + Similar to C{list.insert()}. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to insert the parse location in the front of the parsed results + def insert_locn(locn, tokens): + tokens.insert(0, locn) + print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] + """ self.__toklist.insert(index, insStr) # fixup indices in token dictionary - #~ for name in self.__tokdict: - #~ occurrences = self.__tokdict[name] - #~ for k, (value, position) in enumerate(occurrences): - #~ occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) for name,occurrences in self.__tokdict.items(): for k, (value, position) in enumerate(occurrences): occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) def append( self, item ): - """Add single element to end of ParseResults list of elements.""" + """ + Add single element to end of ParseResults list of elements. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to compute the sum of the parsed integers, and add it to the end + def append_sum(tokens): + tokens.append(sum(map(int, tokens))) + print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] + """ self.__toklist.append(item) def extend( self, itemseq ): - """Add sequence of elements to end of ParseResults list of elements.""" + """ + Add sequence of elements to end of ParseResults list of elements. + + Example:: + patt = OneOrMore(Word(alphas)) + + # use a parse action to append the reverse of the matched strings, to make a palindrome + def make_palindrome(tokens): + tokens.extend(reversed([t[::-1] for t in tokens])) + return ''.join(tokens) + print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' + """ if isinstance(itemseq, ParseResults): self += itemseq else: self.__toklist.extend(itemseq) def clear( self ): - """Clear all elements and results names.""" + """ + Clear all elements and results names. + """ del self.__toklist[:] self.__tokdict.clear() @@ -511,7 +655,11 @@ class ParseResults(object): def __radd__(self, other): if isinstance(other,int) and other == 0: + # useful for merging many ParseResults using sum() builtin return self.copy() + else: + # this may raise a TypeError - so be it + return other + self def __repr__( self ): return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) @@ -531,18 +679,60 @@ class ParseResults(object): return out def asList( self ): - """Returns the parse results as a nested list of matching tokens, all converted to strings.""" + """ + Returns the parse results as a nested list of matching tokens, all converted to strings. + + Example:: + patt = OneOrMore(Word(alphas)) + result = patt.parseString("sldkj lsdkj sldkj") + # even though the result prints in string-like form, it is actually a pyparsing ParseResults + print(type(result), result) # -> ['sldkj', 'lsdkj', 'sldkj'] + + # Use asList() to create an actual list + result_list = result.asList() + print(type(result_list), result_list) # -> ['sldkj', 'lsdkj', 'sldkj'] + """ return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist] def asDict( self ): - """Returns the named parse results as dictionary.""" + """ + Returns the named parse results as a nested dictionary. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(type(result), repr(result)) # -> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) + + result_dict = result.asDict() + print(type(result_dict), repr(result_dict)) # -> {'day': '1999', 'year': '12', 'month': '31'} + + # even though a ParseResults supports dict-like access, sometime you just need to have a dict + import json + print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable + print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} + """ if PY_3: - return dict( self.items() ) + item_fn = self.items else: - return dict( self.iteritems() ) + item_fn = self.iteritems + + def toItem(obj): + if isinstance(obj, ParseResults): + if obj.haskeys(): + return obj.asDict() + else: + return [toItem(v) for v in obj] + else: + return obj + + return dict((k,toItem(v)) for k,v in item_fn()) def copy( self ): - """Returns a new copy of a C{ParseResults} object.""" + """ + Returns a new copy of a C{ParseResults} object. + """ ret = ParseResults( self.__toklist ) ret.__tokdict = self.__tokdict.copy() ret.__parent = self.__parent @@ -551,7 +741,9 @@ class ParseResults(object): return ret def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): - """Returns the parse results as XML. Tags are created for tokens and lists that have defined results names.""" + """ + (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. + """ nl = "\n" out = [] namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() @@ -617,7 +809,27 @@ class ParseResults(object): return None def getName(self): - """Returns the results name for this token expression.""" + """ + Returns the results name for this token expression. Useful when several + different expressions might match at a particular location. + + Example:: + integer = Word(nums) + ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") + house_number_expr = Suppress('#') + Word(nums, alphanums) + user_data = (Group(house_number_expr)("house_number") + | Group(ssn_expr)("ssn") + | Group(integer)("age")) + user_info = OneOrMore(user_data) + + result = user_info.parseString("22 111-22-3333 #221B") + for item in result: + print(item.getName(), ':', item[0]) + prints:: + age : 22 + ssn : 111-22-3333 + house_number : 221B + """ if self.__name: return self.__name elif self.__parent: @@ -628,45 +840,77 @@ class ParseResults(object): return None elif (len(self) == 1 and len(self.__tokdict) == 1 and - self.__tokdict.values()[0][0][1] in (0,-1)): - return self.__tokdict.keys()[0] + next(iter(self.__tokdict.values()))[0][1] in (0,-1)): + return next(iter(self.__tokdict.keys())) else: return None - def dump(self,indent='',depth=0): - """Diagnostic method for listing out the contents of a C{ParseResults}. - Accepts an optional C{indent} argument so that this string can be embedded - in a nested display of other data.""" + def dump(self, indent='', depth=0, full=True): + """ + Diagnostic method for listing out the contents of a C{ParseResults}. + Accepts an optional C{indent} argument so that this string can be embedded + in a nested display of other data. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(result.dump()) + prints:: + ['12', '/', '31', '/', '1999'] + - day: 1999 + - month: 31 + - year: 12 + """ out = [] NL = '\n' out.append( indent+_ustr(self.asList()) ) - if self.haskeys(): - items = sorted(self.items()) - for k,v in items: - if out: - out.append(NL) - out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) - if isinstance(v,ParseResults): - if v: - out.append( v.dump(indent,depth+1) ) + if full: + if self.haskeys(): + items = sorted((str(k), v) for k,v in self.items()) + for k,v in items: + if out: + out.append(NL) + out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) + if isinstance(v,ParseResults): + if v: + out.append( v.dump(indent,depth+1) ) + else: + out.append(_ustr(v)) else: - out.append(_ustr(v)) - else: - out.append(_ustr(v)) - elif any(isinstance(vv,ParseResults) for vv in self): - v = self - for i,vv in enumerate(v): - if isinstance(vv,ParseResults): - out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) - else: - out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(vv))) + out.append(repr(v)) + elif any(isinstance(vv,ParseResults) for vv in self): + v = self + for i,vv in enumerate(v): + if isinstance(vv,ParseResults): + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) + else: + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(vv))) return "".join(out) def pprint(self, *args, **kwargs): - """Pretty-printer for parsed results as a list, using the C{pprint} module. - Accepts additional positional or keyword args as defined for the - C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint})""" + """ + Pretty-printer for parsed results as a list, using the C{pprint} module. + Accepts additional positional or keyword args as defined for the + C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint}) + + Example:: + ident = Word(alphas, alphanums) + num = Word(nums) + func = Forward() + term = ident | num | Group('(' + func + ')') + func <<= ident + Group(Optional(delimitedList(term))) + result = func.parseString("fna a,b,(fnb c,d,200),100") + result.pprint(width=40) + prints:: + ['fna', + ['a', + 'b', + ['(', 'fnb', ['c', 'd', '200'], ')'], + '100']] + """ pprint.pprint(self.asList(), *args, **kwargs) # add support for pickle protocol @@ -690,8 +934,11 @@ class ParseResults(object): else: self.__parent = None + def __getnewargs__(self): + return self.__toklist, self.__name, self.__asList, self.__modal + def __dir__(self): - return dir(super(ParseResults,self)) + list(self.keys()) + return (dir(type(self)) + list(self.keys())) collections.MutableMapping.register(ParseResults) @@ -706,7 +953,7 @@ def col (loc,strg): positions within the parsed string. """ s = strg - return 1 if loc= (3,5): + def extract_stack(limit=0): + # special handling for Python 3.5.0 - extra deep call stack by 1 + offset = -3 if system_version == (3,5,0) else -2 + frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset] + return [(frame_summary.filename, frame_summary.lineno)] + def extract_tb(tb, limit=0): + frames = traceback.extract_tb(tb, limit=limit) + frame_summary = frames[-1] + return [(frame_summary.filename, frame_summary.lineno)] + else: + extract_stack = traceback.extract_stack + extract_tb = traceback.extract_tb + + # synthesize what would be returned by traceback.extract_stack at the call to + # user's parse action 'func', so that we don't incur call penalty at parse time + + LINE_DIFF = 6 + # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND + # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! + this_line = extract_stack(limit=2)[-1] + pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF) + def wrapper(*args): while 1: try: @@ -778,12 +1050,33 @@ def _trim_arity(func, maxargs=2): foundArity[0] = True return ret except TypeError: - if limit[0] <= maxargs and not foundArity[0]: + # re-raise TypeErrors if they did not come from our arity testing + if foundArity[0]: + raise + else: + try: + tb = sys.exc_info()[-1] + if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth: + raise + finally: + del tb + + if limit[0] <= maxargs: limit[0] += 1 continue raise + + # copy func name to wrapper for sensible debug output + func_name = "" + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + wrapper.__name__ = func_name + return wrapper - + class ParserElement(object): """Abstract base level parser element class.""" DEFAULT_WHITE_CHARS = " \n\t\r" @@ -791,7 +1084,16 @@ class ParserElement(object): @staticmethod def setDefaultWhitespaceChars( chars ): - """Overrides the default whitespace chars + r""" + Overrides the default whitespace chars + + Example:: + # default whitespace chars are space, and newline + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] + + # change to just treat newline as significant + ParserElement.setDefaultWhitespaceChars(" \t") + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] """ ParserElement.DEFAULT_WHITE_CHARS = chars @@ -799,8 +1101,22 @@ class ParserElement(object): def inlineLiteralsUsing(cls): """ Set class to be used for inclusion of string literals into a parser. + + Example:: + # default literal class used is Literal + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + + # change to Suppress + ParserElement.inlineLiteralsUsing(Suppress) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] """ - ParserElement.literalStringClass = cls + ParserElement._literalStringClass = cls def __init__( self, savelist=False ): self.parseAction = list() @@ -826,8 +1142,21 @@ class ParserElement(object): self.callDuringTry = False def copy( self ): - """Make a copy of this C{ParserElement}. Useful for defining different parse actions - for the same parsing pattern, using copies of the original parse element.""" + """ + Make a copy of this C{ParserElement}. Useful for defining different parse actions + for the same parsing pattern, using copies of the original parse element. + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") + integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + + print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) + prints:: + [5120, 100, 655360, 268435456] + Equivalent form of C{expr.copy()} is just C{expr()}:: + integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + """ cpy = copy.copy( self ) cpy.parseAction = self.parseAction[:] cpy.ignoreExprs = self.ignoreExprs[:] @@ -836,7 +1165,13 @@ class ParserElement(object): return cpy def setName( self, name ): - """Define name for this expression, for use in debugging.""" + """ + Define name for this expression, makes debugging and exception messages clearer. + + Example:: + Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) + Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) + """ self.name = name self.errmsg = "Expected " + self.name if hasattr(self,"exception"): @@ -844,15 +1179,24 @@ class ParserElement(object): return self def setResultsName( self, name, listAllMatches=False ): - """Define name for referencing matching tokens as a nested attribute - of the returned parse results. - NOTE: this returns a *copy* of the original C{ParserElement} object; - this is so that the client can define a basic element, such as an - integer, and reference it in multiple places with different names. - - You can also set results names using the abbreviated syntax, - C{expr("name")} in place of C{expr.setResultsName("name")} - - see L{I{__call__}<__call__>}. + """ + Define name for referencing matching tokens as a nested attribute + of the returned parse results. + NOTE: this returns a *copy* of the original C{ParserElement} object; + this is so that the client can define a basic element, such as an + integer, and reference it in multiple places with different names. + + You can also set results names using the abbreviated syntax, + C{expr("name")} in place of C{expr.setResultsName("name")} - + see L{I{__call__}<__call__>}. + + Example:: + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + + # equivalent form: + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") """ newself = self.copy() if name.endswith("*"): @@ -881,42 +1225,76 @@ class ParserElement(object): return self def setParseAction( self, *fns, **kwargs ): - """Define action to perform when successfully matching parse element definition. - Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, - C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: - - s = the original string being parsed (see note below) - - loc = the location of the matching substring - - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object - If the functions in fns modify the tokens, they can return them as the return - value from fn, and the modified list of tokens will replace the original. - Otherwise, fn does not need to return any value. + """ + Define action to perform when successfully matching parse element definition. + Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, + C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: + - s = the original string being parsed (see note below) + - loc = the location of the matching substring + - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object + If the functions in fns modify the tokens, they can return them as the return + value from fn, and the modified list of tokens will replace the original. + Otherwise, fn does not need to return any value. - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See L{I{parseString}} for more information - on parsing strings containing C{}s, and suggested methods to maintain a - consistent view of the parsed string, the parse location, and line and column - positions within the parsed string. - """ + Optional keyword arguments: + - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{parseString}} for more information + on parsing strings containing C{}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + + Example:: + integer = Word(nums) + date_str = integer + '/' + integer + '/' + integer + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + # use parse action to convert to ints at parse time + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + date_str = integer + '/' + integer + '/' + integer + + # note that integer fields are now ints, not strings + date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] + """ self.parseAction = list(map(_trim_arity, list(fns))) self.callDuringTry = kwargs.get("callDuringTry", False) return self def addParseAction( self, *fns, **kwargs ): - """Add parse action to expression's list of parse actions. See L{I{setParseAction}}.""" + """ + Add parse action to expression's list of parse actions. See L{I{setParseAction}}. + + See examples in L{I{copy}}. + """ self.parseAction += list(map(_trim_arity, list(fns))) self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) return self def addCondition(self, *fns, **kwargs): """Add a boolean predicate function to expression's list of parse actions. See - L{I{setParseAction}}. Optional keyword argument C{message} can - be used to define a custom message to be used in the raised exception.""" - msg = kwargs.get("message") or "failed user-defined condition" + L{I{setParseAction}} for function call signatures. Unlike C{setParseAction}, + functions passed to C{addCondition} need to return boolean success/fail of the condition. + + Optional keyword arguments: + - message = define a custom message to be used in the raised exception + - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + year_int = integer.copy() + year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") + date_str = year_int + '/' + integer + '/' + integer + + result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) + """ + msg = kwargs.get("message", "failed user-defined condition") + exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException for fn in fns: def pa(s,l,t): if not bool(_trim_arity(fn)(s,l,t)): - raise ParseException(s,l,msg) - return t + raise exc_type(s,l,msg) self.parseAction.append(pa) self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) return self @@ -1043,43 +1421,132 @@ class ParserElement(object): return self._parse( instring, loc, doActions=False )[0] except ParseFatalException: raise ParseException( instring, loc, self.errmsg, self) + + def canParseNext(self, instring, loc): + try: + self.tryParse(instring, loc) + except (ParseException, IndexError): + return False + else: + return True + + class _UnboundedCache(object): + def __init__(self): + cache = {} + self.not_in_cache = not_in_cache = object() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + + def clear(self): + cache.clear() + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + + if _OrderedDict is not None: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = _OrderedDict() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + if len(cache) > size: + cache.popitem(False) + + def clear(self): + cache.clear() + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + + else: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = {} + key_fifo = collections.deque([], size) + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + if len(cache) > size: + cache.pop(key_fifo.popleft(), None) + key_fifo.append(key) + + def clear(self): + cache.clear() + key_fifo.clear() + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + + # argument cache for optimizing repeated calls when backtracking through recursive expressions + packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail + packrat_cache_lock = RLock() + packrat_cache_stats = [0, 0] # this method gets repeatedly called during backtracking with the same arguments - # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): - lookup = (self,instring,loc,callPreParse,doActions) - if lookup in ParserElement._exprArgCache: - value = ParserElement._exprArgCache[ lookup ] - if isinstance(value, Exception): - raise value - return (value[0],value[1].copy()) - else: - try: - value = self._parseNoCache( instring, loc, doActions, callPreParse ) - ParserElement._exprArgCache[ lookup ] = (value[0],value[1].copy()) - return value - except ParseBaseException as pe: - pe.__traceback__ = None - ParserElement._exprArgCache[ lookup ] = pe - raise + HIT, MISS = 0, 1 + lookup = (self, instring, loc, callPreParse, doActions) + with ParserElement.packrat_cache_lock: + cache = ParserElement.packrat_cache + value = cache.get(lookup) + if value is cache.not_in_cache: + ParserElement.packrat_cache_stats[MISS] += 1 + try: + value = self._parseNoCache(instring, loc, doActions, callPreParse) + except ParseBaseException as pe: + # cache a copy of the exception, without the traceback + cache.set(lookup, pe.__class__(*pe.args)) + raise + else: + cache.set(lookup, (value[0], value[1].copy())) + return value + else: + ParserElement.packrat_cache_stats[HIT] += 1 + if isinstance(value, Exception): + raise value + return (value[0], value[1].copy()) _parse = _parseNoCache - # argument cache for optimizing repeated calls when backtracking through recursive expressions - _exprArgCache = {} @staticmethod def resetCache(): - ParserElement._exprArgCache.clear() + ParserElement.packrat_cache.clear() + ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) _packratEnabled = False @staticmethod - def enablePackrat(): + def enablePackrat(cache_size_limit=128): """Enables "packrat" parsing, which adds memoizing to the parsing logic. Repeated parse attempts at the same string location (which happens often in many complex grammars) can immediately return a cached value, instead of re-executing parsing/validating code. Memoizing is done of both valid results and parsing exceptions. - + + Parameters: + - cache_size_limit - (default=C{128}) - if an integer value is provided + will limit the size of the packrat cache; if None is passed, then + the cache size will be unbounded; if 0 is passed, the cache will + be effectively disabled. + This speedup may break existing programs that use parse actions that have side-effects. For this reason, packrat parsing is disabled when you first import pyparsing. To activate the packrat feature, your @@ -1088,32 +1555,45 @@ class ParserElement(object): C{enablePackrat} before calling C{psyco.full()}. If you do not do this, Python will crash. For best results, call C{enablePackrat()} immediately after importing pyparsing. + + Example:: + import pyparsing + pyparsing.ParserElement.enablePackrat() """ if not ParserElement._packratEnabled: ParserElement._packratEnabled = True + if cache_size_limit is None: + ParserElement.packrat_cache = ParserElement._UnboundedCache() + else: + ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) ParserElement._parse = ParserElement._parseCache def parseString( self, instring, parseAll=False ): - """Execute the parse expression with the given string. - This is the main interface to the client code, once the complete - expression has been built. + """ + Execute the parse expression with the given string. + This is the main interface to the client code, once the complete + expression has been built. - If you want the grammar to require that the entire input string be - successfully parsed, then set C{parseAll} to True (equivalent to ending - the grammar with C{L{StringEnd()}}). + If you want the grammar to require that the entire input string be + successfully parsed, then set C{parseAll} to True (equivalent to ending + the grammar with C{L{StringEnd()}}). - Note: C{parseString} implicitly calls C{expandtabs()} on the input string, - in order to report proper column numbers in parse actions. - If the input string contains tabs and - the grammar uses parse actions that use the C{loc} argument to index into the - string being parsed, you can ensure you have a consistent view of the input - string by: - - calling C{parseWithTabs} on your grammar before calling C{parseString} - (see L{I{parseWithTabs}}) - - define your parse action using the full C{(s,loc,toks)} signature, and - reference the input string using the parse action's C{s} argument - - explictly expand the tabs in your input string before calling - C{parseString} + Note: C{parseString} implicitly calls C{expandtabs()} on the input string, + in order to report proper column numbers in parse actions. + If the input string contains tabs and + the grammar uses parse actions that use the C{loc} argument to index into the + string being parsed, you can ensure you have a consistent view of the input + string by: + - calling C{parseWithTabs} on your grammar before calling C{parseString} + (see L{I{parseWithTabs}}) + - define your parse action using the full C{(s,loc,toks)} signature, and + reference the input string using the parse action's C{s} argument + - explictly expand the tabs in your input string before calling + C{parseString} + + Example:: + Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] + Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text """ ParserElement.resetCache() if not self.streamlined: @@ -1139,14 +1619,35 @@ class ParserElement(object): return tokens def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): - """Scan the input string for expression matches. Each match will return the - matching tokens, start location, and end location. May be called with optional - C{maxMatches} argument, to clip scanning after 'n' matches are found. If - C{overlap} is specified, then overlapping matches will be reported. + """ + Scan the input string for expression matches. Each match will return the + matching tokens, start location, and end location. May be called with optional + C{maxMatches} argument, to clip scanning after 'n' matches are found. If + C{overlap} is specified, then overlapping matches will be reported. - Note that the start and end locations are reported relative to the string - being parsed. See L{I{parseString}} for more information on parsing - strings with embedded tabs.""" + Note that the start and end locations are reported relative to the string + being parsed. See L{I{parseString}} for more information on parsing + strings with embedded tabs. + + Example:: + source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" + print(source) + for tokens,start,end in Word(alphas).scanString(source): + print(' '*start + '^'*(end-start)) + print(' '*start + tokens[0]) + + prints:: + + sldjf123lsdjjkf345sldkjf879lkjsfd987 + ^^^^^ + sldjf + ^^^^^^^ + lsdjjkf + ^^^^^^ + sldkjf + ^^^^^^ + lkjsfd + """ if not self.streamlined: self.streamline() for e in self.ignoreExprs: @@ -1189,12 +1690,22 @@ class ParserElement(object): raise exc def transformString( self, instring ): - """Extension to C{L{scanString}}, to modify matching text with modified tokens that may - be returned from a parse action. To use C{transformString}, define a grammar and - attach a parse action to it that modifies the returned token list. - Invoking C{transformString()} on a target string will then scan for matches, - and replace the matched text patterns according to the logic in the parse - action. C{transformString()} returns the resulting transformed string.""" + """ + Extension to C{L{scanString}}, to modify matching text with modified tokens that may + be returned from a parse action. To use C{transformString}, define a grammar and + attach a parse action to it that modifies the returned token list. + Invoking C{transformString()} on a target string will then scan for matches, + and replace the matched text patterns according to the logic in the parse + action. C{transformString()} returns the resulting transformed string. + + Example:: + wd = Word(alphas) + wd.setParseAction(lambda toks: toks[0].title()) + + print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) + Prints:: + Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. + """ out = [] lastE = 0 # force preservation of s, to minimize unwanted transformation of string, and to @@ -1222,9 +1733,18 @@ class ParserElement(object): raise exc def searchString( self, instring, maxMatches=_MAX_INT ): - """Another extension to C{L{scanString}}, simplifying the access to the tokens found - to match the given parse expression. May be called with optional - C{maxMatches} argument, to clip searching after 'n' matches are found. + """ + Another extension to C{L{scanString}}, simplifying the access to the tokens found + to match the given parse expression. May be called with optional + C{maxMatches} argument, to clip searching after 'n' matches are found. + + Example:: + # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters + cap_word = Word(alphas.upper(), alphas.lower()) + + print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) + prints:: + ['More', 'Iron', 'Lead', 'Gold', 'I'] """ try: return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) @@ -1235,10 +1755,42 @@ class ParserElement(object): # catch and re-raise exception from here, clears out pyparsing internal stack trace raise exc + def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): + """ + Generator method to split a string using the given expression as a separator. + May be called with optional C{maxsplit} argument, to limit the number of splits; + and the optional C{includeSeparators} argument (default=C{False}), if the separating + matching text should be included in the split results. + + Example:: + punc = oneOf(list(".,;:/-!?")) + print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) + prints:: + ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] + """ + splits = 0 + last = 0 + for t,s,e in self.scanString(instring, maxMatches=maxsplit): + yield instring[last:s] + if includeSeparators: + yield t[0] + last = e + yield instring[last:] + def __add__(self, other ): - """Implementation of + operator - returns C{L{And}}""" + """ + Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement + converts them to L{Literal}s by default. + + Example:: + greet = Word(alphas) + "," + Word(alphas) + "!" + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + Prints:: + Hello, World! -> ['Hello', ',', 'World', '!'] + """ if isinstance( other, basestring ): - other = ParserElement.literalStringClass( other ) + other = ParserElement._literalStringClass( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) @@ -1246,9 +1798,11 @@ class ParserElement(object): return And( [ self, other ] ) def __radd__(self, other ): - """Implementation of + operator when left operand is not a C{L{ParserElement}}""" + """ + Implementation of + operator when left operand is not a C{L{ParserElement}} + """ if isinstance( other, basestring ): - other = ParserElement.literalStringClass( other ) + other = ParserElement._literalStringClass( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) @@ -1256,9 +1810,11 @@ class ParserElement(object): return other + self def __sub__(self, other): - """Implementation of - operator, returns C{L{And}} with error stop""" + """ + Implementation of - operator, returns C{L{And}} with error stop + """ if isinstance( other, basestring ): - other = ParserElement.literalStringClass( other ) + other = ParserElement._literalStringClass( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) @@ -1266,9 +1822,11 @@ class ParserElement(object): return And( [ self, And._ErrorStop(), other ] ) def __rsub__(self, other ): - """Implementation of - operator when left operand is not a C{L{ParserElement}}""" + """ + Implementation of - operator when left operand is not a C{L{ParserElement}} + """ if isinstance( other, basestring ): - other = ParserElement.literalStringClass( other ) + other = ParserElement._literalStringClass( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) @@ -1276,24 +1834,24 @@ class ParserElement(object): return other - self def __mul__(self,other): - """Implementation of * operator, allows use of C{expr * 3} in place of - C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer - tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples - may also include C{None} as in: - - C{expr*(n,None)} or C{expr*(n,)} is equivalent + """ + Implementation of * operator, allows use of C{expr * 3} in place of + C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer + tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples + may also include C{None} as in: + - C{expr*(n,None)} or C{expr*(n,)} is equivalent to C{expr*n + L{ZeroOrMore}(expr)} (read as "at least n instances of C{expr}") - - C{expr*(None,n)} is equivalent to C{expr*(0,n)} + - C{expr*(None,n)} is equivalent to C{expr*(0,n)} (read as "0 to n instances of C{expr}") - - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)} - - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)} - - Note that C{expr*(None,n)} does not raise an exception if - more than n exprs exist in the input stream; that is, - C{expr*(None,n)} does not enforce a maximum number of expr - occurrences. If this behavior is desired, then write - C{expr*(None,n) + ~expr} + - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)} + - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)} + Note that C{expr*(None,n)} does not raise an exception if + more than n exprs exist in the input stream; that is, + C{expr*(None,n)} does not enforce a maximum number of expr + occurrences. If this behavior is desired, then write + C{expr*(None,n) + ~expr} """ if isinstance(other,int): minElements, optElements = other,0 @@ -1347,9 +1905,11 @@ class ParserElement(object): return self.__mul__(other) def __or__(self, other ): - """Implementation of | operator - returns C{L{MatchFirst}}""" + """ + Implementation of | operator - returns C{L{MatchFirst}} + """ if isinstance( other, basestring ): - other = ParserElement.literalStringClass( other ) + other = ParserElement._literalStringClass( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) @@ -1357,9 +1917,11 @@ class ParserElement(object): return MatchFirst( [ self, other ] ) def __ror__(self, other ): - """Implementation of | operator when left operand is not a C{L{ParserElement}}""" + """ + Implementation of | operator when left operand is not a C{L{ParserElement}} + """ if isinstance( other, basestring ): - other = ParserElement.literalStringClass( other ) + other = ParserElement._literalStringClass( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) @@ -1367,9 +1929,11 @@ class ParserElement(object): return other | self def __xor__(self, other ): - """Implementation of ^ operator - returns C{L{Or}}""" + """ + Implementation of ^ operator - returns C{L{Or}} + """ if isinstance( other, basestring ): - other = ParserElement.literalStringClass( other ) + other = ParserElement._literalStringClass( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) @@ -1377,9 +1941,11 @@ class ParserElement(object): return Or( [ self, other ] ) def __rxor__(self, other ): - """Implementation of ^ operator when left operand is not a C{L{ParserElement}}""" + """ + Implementation of ^ operator when left operand is not a C{L{ParserElement}} + """ if isinstance( other, basestring ): - other = ParserElement.literalStringClass( other ) + other = ParserElement._literalStringClass( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) @@ -1387,9 +1953,11 @@ class ParserElement(object): return other ^ self def __and__(self, other ): - """Implementation of & operator - returns C{L{Each}}""" + """ + Implementation of & operator - returns C{L{Each}} + """ if isinstance( other, basestring ): - other = ParserElement.literalStringClass( other ) + other = ParserElement._literalStringClass( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) @@ -1397,9 +1965,11 @@ class ParserElement(object): return Each( [ self, other ] ) def __rand__(self, other ): - """Implementation of & operator when left operand is not a C{L{ParserElement}}""" + """ + Implementation of & operator when left operand is not a C{L{ParserElement}} + """ if isinstance( other, basestring ): - other = ParserElement.literalStringClass( other ) + other = ParserElement._literalStringClass( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) @@ -1407,41 +1977,49 @@ class ParserElement(object): return other & self def __invert__( self ): - """Implementation of ~ operator - returns C{L{NotAny}}""" + """ + Implementation of ~ operator - returns C{L{NotAny}} + """ return NotAny( self ) def __call__(self, name=None): - """Shortcut for C{L{setResultsName}}, with C{listAllMatches=default}:: - userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") - could be written as:: - userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") - - If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be - passed as C{True}. + """ + Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}. + + If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be + passed as C{True}. - If C{name} is omitted, same as calling C{L{copy}}. - """ + If C{name} is omitted, same as calling C{L{copy}}. + + Example:: + # these are equivalent + userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") + userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") + """ if name is not None: return self.setResultsName(name) else: return self.copy() def suppress( self ): - """Suppresses the output of this C{ParserElement}; useful to keep punctuation from - cluttering up returned output. + """ + Suppresses the output of this C{ParserElement}; useful to keep punctuation from + cluttering up returned output. """ return Suppress( self ) def leaveWhitespace( self ): - """Disables the skipping of whitespace before matching the characters in the - C{ParserElement}'s defined pattern. This is normally only used internally by - the pyparsing module, but may be needed in some whitespace-sensitive grammars. + """ + Disables the skipping of whitespace before matching the characters in the + C{ParserElement}'s defined pattern. This is normally only used internally by + the pyparsing module, but may be needed in some whitespace-sensitive grammars. """ self.skipWhitespace = False return self def setWhitespaceChars( self, chars ): - """Overrides the default whitespace chars + """ + Overrides the default whitespace chars """ self.skipWhitespace = True self.whiteChars = chars @@ -1449,26 +2027,41 @@ class ParserElement(object): return self def parseWithTabs( self ): - """Overrides default behavior to expand C{}s to spaces before parsing the input string. - Must be called before C{parseString} when the input grammar contains elements that - match C{} characters.""" + """ + Overrides default behavior to expand C{}s to spaces before parsing the input string. + Must be called before C{parseString} when the input grammar contains elements that + match C{} characters. + """ self.keepTabs = True return self def ignore( self, other ): - """Define expression to be ignored (e.g., comments) while doing pattern - matching; may be called repeatedly, to define multiple comment or other - ignorable patterns. """ + Define expression to be ignored (e.g., comments) while doing pattern + matching; may be called repeatedly, to define multiple comment or other + ignorable patterns. + + Example:: + patt = OneOrMore(Word(alphas)) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] + + patt.ignore(cStyleComment) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] + """ + if isinstance(other, basestring): + other = Suppress(other) + if isinstance( other, Suppress ): if other not in self.ignoreExprs: - self.ignoreExprs.append( other.copy() ) + self.ignoreExprs.append(other) else: self.ignoreExprs.append( Suppress( other.copy() ) ) return self def setDebugActions( self, startAction, successAction, exceptionAction ): - """Enable display of debugging messages while doing pattern matching.""" + """ + Enable display of debugging messages while doing pattern matching. + """ self.debugActions = (startAction or _defaultStartDebugAction, successAction or _defaultSuccessDebugAction, exceptionAction or _defaultExceptionDebugAction) @@ -1476,8 +2069,40 @@ class ParserElement(object): return self def setDebug( self, flag=True ): - """Enable display of debugging messages while doing pattern matching. - Set C{flag} to True to enable, False to disable.""" + """ + Enable display of debugging messages while doing pattern matching. + Set C{flag} to True to enable, False to disable. + + Example:: + wd = Word(alphas).setName("alphaword") + integer = Word(nums).setName("numword") + term = wd | integer + + # turn on debugging for wd + wd.setDebug() + + OneOrMore(term).parseString("abc 123 xyz 890") + + prints:: + Match alphaword at loc 0(1,1) + Matched alphaword -> ['abc'] + Match alphaword at loc 3(1,4) + Exception raised:Expected alphaword (at char 4), (line:1, col:5) + Match alphaword at loc 7(1,8) + Matched alphaword -> ['xyz'] + Match alphaword at loc 11(1,12) + Exception raised:Expected alphaword (at char 12), (line:1, col:13) + Match alphaword at loc 15(1,16) + Exception raised:Expected alphaword (at char 15), (line:1, col:16) + + The output shown is that produced by the default debug actions - custom debug actions can be + specified using L{setDebugActions}. Prior to attempting + to match the C{wd} expression, the debugging message C{"Match at loc (,)"} + is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"} + message is shown. Also note the use of L{setName} to assign a human-readable name to the expression, + which makes debugging and exception messages easier to understand - for instance, the default + name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}. + """ if flag: self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) else: @@ -1499,20 +2124,22 @@ class ParserElement(object): pass def validate( self, validateTrace=[] ): - """Check defined expressions for valid structure, check for infinite recursive definitions.""" + """ + Check defined expressions for valid structure, check for infinite recursive definitions. + """ self.checkRecursion( [] ) def parseFile( self, file_or_filename, parseAll=False ): - """Execute the parse expression on the given file or filename. - If a filename is specified (instead of a file object), - the entire file is opened, read, and closed before parsing. + """ + Execute the parse expression on the given file or filename. + If a filename is specified (instead of a file object), + the entire file is opened, read, and closed before parsing. """ try: file_contents = file_or_filename.read() except AttributeError: - f = open(file_or_filename, "r") - file_contents = f.read() - f.close() + with open(file_or_filename, "r") as f: + file_contents = f.read() try: return self.parseString(file_contents, parseAll) except ParseBaseException as exc: @@ -1524,13 +2151,9 @@ class ParserElement(object): def __eq__(self,other): if isinstance(other, ParserElement): - return self is other or self.__dict__ == other.__dict__ + return self is other or vars(self) == vars(other) elif isinstance(other, basestring): - try: - self.parseString(_ustr(other), parseAll=True) - return True - except ParseBaseException: - return False + return self.matches(other) else: return super(ParserElement,self)==other @@ -1546,40 +2169,169 @@ class ParserElement(object): def __rne__(self,other): return not (self == other) - def runTests(self, tests, parseAll=False): - """Execute the parse expression on a series of test strings, showing each - test, the parsed results or where the parse failed. Quick and easy way to - run a parse expression against a list of sample strings. + def matches(self, testString, parseAll=True): + """ + Method for quick testing of a parser against a test string. Good for simple + inline microtests of sub expressions while building up larger parser. - Parameters: - - tests - a list of separate test strings, or a multiline string of test strings - - parseAll - (default=False) - flag to pass to C{L{parseString}} when running tests + Parameters: + - testString - to test against this expression for a match + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + + Example:: + expr = Word(nums) + assert expr.matches("100") + """ + try: + self.parseString(_ustr(testString), parseAll=parseAll) + return True + except ParseBaseException: + return False + + def runTests(self, tests, parseAll=True, comment='#', fullDump=True, printResults=True, failureTests=False): + """ + Execute the parse expression on a series of test strings, showing each + test, the parsed results or where the parse failed. Quick and easy way to + run a parse expression against a list of sample strings. + + Parameters: + - tests - a list of separate test strings, or a multiline string of test strings + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + - comment - (default=C{'#'}) - expression for indicating embedded comments in the test + string; pass None to disable comment filtering + - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline; + if False, only dump nested list + - printResults - (default=C{True}) prints test output to stdout + - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing + + Returns: a (success, results) tuple, where success indicates that all tests succeeded + (or failed if C{failureTests} is True), and the results contain a list of lines of each + test's output + + Example:: + number_expr = pyparsing_common.number.copy() + + result = number_expr.runTests(''' + # unsigned integer + 100 + # negative integer + -100 + # float with scientific notation + 6.02e23 + # integer with scientific notation + 1e-12 + ''') + print("Success" if result[0] else "Failed!") + + result = number_expr.runTests(''' + # stray character + 100Z + # missing leading digit before '.' + -.100 + # too many '.' + 3.14.159 + ''', failureTests=True) + print("Success" if result[0] else "Failed!") + prints:: + # unsigned integer + 100 + [100] + + # negative integer + -100 + [-100] + + # float with scientific notation + 6.02e23 + [6.02e+23] + + # integer with scientific notation + 1e-12 + [1e-12] + + Success + + # stray character + 100Z + ^ + FAIL: Expected end of text (at char 3), (line:1, col:4) + + # missing leading digit before '.' + -.100 + ^ + FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) + + # too many '.' + 3.14.159 + ^ + FAIL: Expected end of text (at char 4), (line:1, col:5) + + Success + + Each test string must be on a single line. If you want to test a string that spans multiple + lines, create a test like this:: + + expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines") + + (Note that this is a raw string literal, you must include the leading 'r'.) """ if isinstance(tests, basestring): - tests = map(str.strip, tests.splitlines()) + tests = list(map(str.strip, tests.rstrip().splitlines())) + if isinstance(comment, basestring): + comment = Literal(comment) + allResults = [] + comments = [] + success = True for t in tests: - out = [t] + if comment is not None and comment.matches(t, False) or comments and not t: + comments.append(t) + continue + if not t: + continue + out = ['\n'.join(comments), t] + comments = [] try: - out.append(self.parseString(t, parseAll=parseAll).dump()) - except ParseException as pe: + t = t.replace(r'\n','\n') + result = self.parseString(t, parseAll=parseAll) + out.append(result.dump(full=fullDump)) + success = success and not failureTests + except ParseBaseException as pe: + fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" if '\n' in t: out.append(line(pe.loc, t)) - out.append(' '*(col(pe.loc,t)-1) + '^') + out.append(' '*(col(pe.loc,t)-1) + '^' + fatal) else: - out.append(' '*pe.loc + '^') - out.append(str(pe)) - out.append('') - print('\n'.join(out)) + out.append(' '*pe.loc + '^' + fatal) + out.append("FAIL: " + str(pe)) + success = success and failureTests + result = pe + except Exception as exc: + out.append("FAIL-EXCEPTION: " + str(exc)) + success = success and failureTests + result = exc + + if printResults: + if fullDump: + out.append('') + print('\n'.join(out)) + + allResults.append((t, result)) + + return success, allResults class Token(ParserElement): - """Abstract C{ParserElement} subclass, for defining atomic matching patterns.""" + """ + Abstract C{ParserElement} subclass, for defining atomic matching patterns. + """ def __init__( self ): super(Token,self).__init__( savelist=False ) class Empty(Token): - """An empty token, will always match.""" + """ + An empty token, will always match. + """ def __init__( self ): super(Empty,self).__init__() self.name = "Empty" @@ -1588,7 +2340,9 @@ class Empty(Token): class NoMatch(Token): - """A token that will never match.""" + """ + A token that will never match. + """ def __init__( self ): super(NoMatch,self).__init__() self.name = "NoMatch" @@ -1601,7 +2355,19 @@ class NoMatch(Token): class Literal(Token): - """Token to exactly match a specified string.""" + """ + Token to exactly match a specified string. + + Example:: + Literal('blah').parseString('blah') # -> ['blah'] + Literal('blah').parseString('blahfooblah') # -> ['blah'] + Literal('blah').parseString('bla') # -> Exception: Expected "blah" + + For case-insensitive matching, use L{CaselessLiteral}. + + For keyword matching (force word break before and after the matched string), + use L{Keyword} or L{CaselessKeyword}. + """ def __init__( self, matchString ): super(Literal,self).__init__() self.match = matchString @@ -1627,22 +2393,31 @@ class Literal(Token): return loc+self.matchLen, self.match raise ParseException(instring, loc, self.errmsg, self) _L = Literal -ParserElement.literalStringClass = Literal +ParserElement._literalStringClass = Literal class Keyword(Token): - """Token to exactly match a specified string as a keyword, that is, it must be - immediately followed by a non-keyword character. Compare with C{L{Literal}}:: - Literal("if") will match the leading C{'if'} in C{'ifAndOnlyIf'}. - Keyword("if") will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} - Accepts two optional constructor arguments in addition to the keyword string: - C{identChars} is a string of characters that would be valid identifier characters, - defaulting to all alphanumerics + "_" and "$"; C{caseless} allows case-insensitive - matching, default is C{False}. + """ + Token to exactly match a specified string as a keyword, that is, it must be + immediately followed by a non-keyword character. Compare with C{L{Literal}}: + - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}. + - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} + Accepts two optional constructor arguments in addition to the keyword string: + - C{identChars} is a string of characters that would be valid identifier characters, + defaulting to all alphanumerics + "_" and "$" + - C{caseless} allows case-insensitive matching, default is C{False}. + + Example:: + Keyword("start").parseString("start") # -> ['start'] + Keyword("start").parseString("starting") # -> Exception + + For case-insensitive matching, use L{CaselessKeyword}. """ DEFAULT_KEYWORD_CHARS = alphanums+"_$" - def __init__( self, matchString, identChars=DEFAULT_KEYWORD_CHARS, caseless=False ): + def __init__( self, matchString, identChars=None, caseless=False ): super(Keyword,self).__init__() + if identChars is None: + identChars = Keyword.DEFAULT_KEYWORD_CHARS self.match = matchString self.matchLen = len(matchString) try: @@ -1686,9 +2461,15 @@ class Keyword(Token): Keyword.DEFAULT_KEYWORD_CHARS = chars class CaselessLiteral(Literal): - """Token to match a specified string, ignoring case of letters. - Note: the matched results will always be in the case of the given - match string, NOT the case of the input text. + """ + Token to match a specified string, ignoring case of letters. + Note: the matched results will always be in the case of the given + match string, NOT the case of the input text. + + Example:: + OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] + + (Contrast with example for L{CaselessKeyword}.) """ def __init__( self, matchString ): super(CaselessLiteral,self).__init__( matchString.upper() ) @@ -1703,7 +2484,15 @@ class CaselessLiteral(Literal): raise ParseException(instring, loc, self.errmsg, self) class CaselessKeyword(Keyword): - def __init__( self, matchString, identChars=Keyword.DEFAULT_KEYWORD_CHARS ): + """ + Caseless version of L{Keyword}. + + Example:: + OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] + + (Contrast with example for L{CaselessLiteral}.) + """ + def __init__( self, matchString, identChars=None ): super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) def parseImpl( self, instring, loc, doActions=True ): @@ -1712,17 +2501,113 @@ class CaselessKeyword(Keyword): return loc+self.matchLen, self.match raise ParseException(instring, loc, self.errmsg, self) +class CloseMatch(Token): + """ + A variation on L{Literal} which matches "close" matches, that is, + strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters: + - C{match_string} - string to be matched + - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match + + The results from a successful parse will contain the matched text from the input string and the following named results: + - C{mismatches} - a list of the positions within the match_string where mismatches were found + - C{original} - the original match_string used to compare against the input string + + If C{mismatches} is an empty list, then the match was an exact match. + + Example:: + patt = CloseMatch("ATCATCGAATGGA") + patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) + patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) + + # exact match + patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) + + # close match allowing up to 2 mismatches + patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) + patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) + """ + def __init__(self, match_string, maxMismatches=1): + super(CloseMatch,self).__init__() + self.name = match_string + self.match_string = match_string + self.maxMismatches = maxMismatches + self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) + self.mayIndexError = False + self.mayReturnEmpty = False + + def parseImpl( self, instring, loc, doActions=True ): + start = loc + instrlen = len(instring) + maxloc = start + len(self.match_string) + + if maxloc <= instrlen: + match_string = self.match_string + match_stringloc = 0 + mismatches = [] + maxMismatches = self.maxMismatches + + for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)): + src,mat = s_m + if src != mat: + mismatches.append(match_stringloc) + if len(mismatches) > maxMismatches: + break + else: + loc = match_stringloc + 1 + results = ParseResults([instring[start:loc]]) + results['original'] = self.match_string + results['mismatches'] = mismatches + return loc, results + + raise ParseException(instring, loc, self.errmsg, self) + + class Word(Token): - """Token for matching words composed of allowed character sets. - Defined with string containing all allowed initial characters, - an optional string containing allowed body characters (if omitted, - defaults to the initial character set), and an optional minimum, - maximum, and/or exact length. The default value for C{min} is 1 (a - minimum value < 1 is not valid); the default values for C{max} and C{exact} - are 0, meaning no maximum or exact length restriction. An optional - C{exclude} parameter can list characters that might be found in - the input C{bodyChars} string; useful to define a word of all printables - except for one or two characters, for instance. + """ + Token for matching words composed of allowed character sets. + Defined with string containing all allowed initial characters, + an optional string containing allowed body characters (if omitted, + defaults to the initial character set), and an optional minimum, + maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. An optional + C{excludeChars} parameter can list characters that might be found in + the input C{bodyChars} string; useful to define a word of all printables + except for one or two characters, for instance. + + L{srange} is useful for defining custom character set strings for defining + C{Word} expressions, using range notation from regular expression character sets. + + A common mistake is to use C{Word} to match a specific literal string, as in + C{Word("Address")}. Remember that C{Word} uses the string argument to define + I{sets} of matchable characters. This expression would match "Add", "AAA", + "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'. + To match an exact literal string, use L{Literal} or L{Keyword}. + + pyparsing includes helper strings for building Words: + - L{alphas} + - L{nums} + - L{alphanums} + - L{hexnums} + - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.) + - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.) + - L{printables} (any non-whitespace character) + + Example:: + # a word composed of digits + integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) + + # a word with a leading capital, and zero or more lowercase + capital_word = Word(alphas.upper(), alphas.lower()) + + # hostnames are alphanumeric, with leading alpha, and '-' + hostname = Word(alphas, alphanums+'-') + + # roman numeral (not a strict parser, accepts invalid mix of characters) + roman = Word("IVXLCDM") + + # any string of non-whitespace characters, except for ',' + csv_value = Word(printables, excludeChars=",") """ def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): super(Word,self).__init__() @@ -1775,7 +2660,7 @@ class Word(Token): self.reString = r"\b"+self.reString+r"\b" try: self.re = re.compile( self.reString ) - except: + except Exception: self.re = None def parseImpl( self, instring, loc, doActions=True ): @@ -1816,7 +2701,7 @@ class Word(Token): def __str__( self ): try: return super(Word,self).__str__() - except: + except Exception: pass @@ -1837,8 +2722,17 @@ class Word(Token): class Regex(Token): - """Token for matching strings that match a given regular expression. - Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. + """ + Token for matching strings that match a given regular expression. + Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. + If the given regex contains named groups (defined using C{(?P...)}), these will be preserved as + named parse results. + + Example:: + realnum = Regex(r"[+-]?\d+\.\d*") + date = Regex(r'(?P\d{4})-(?P\d\d?)-(?P\d\d?)') + # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression + roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") """ compiledREtype = type(re.compile("[A-Z]")) def __init__( self, pattern, flags=0): @@ -1846,7 +2740,7 @@ class Regex(Token): super(Regex,self).__init__() if isinstance(pattern, basestring): - if len(pattern) == 0: + if not pattern: warnings.warn("null string passed to Regex; use Empty() instead", SyntaxWarning, stacklevel=2) @@ -1891,7 +2785,7 @@ class Regex(Token): def __str__( self ): try: return super(Regex,self).__str__() - except: + except Exception: pass if self.strRepr is None: @@ -1901,23 +2795,36 @@ class Regex(Token): class QuotedString(Token): - """Token for matching strings that are delimited by quoting characters. + r""" + Token for matching strings that are delimited by quoting characters. + + Defined with the following parameters: + - quoteChar - string of one or more characters defining the quote delimiting string + - escChar - character to escape quotes, typically backslash (default=C{None}) + - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None}) + - multiline - boolean indicating whether quotes can span multiple lines (default=C{False}) + - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True}) + - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar) + - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True}) + + Example:: + qs = QuotedString('"') + print(qs.searchString('lsjdf "This is the quote" sldjf')) + complex_qs = QuotedString('{{', endQuoteChar='}}') + print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) + sql_qs = QuotedString('"', escQuote='""') + print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) + prints:: + [['This is the quote']] + [['This is the "quote"']] + [['This is the quote with "embedded" quotes']] """ - def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None): - """ - Defined with the following parameters: - - quoteChar - string of one or more characters defining the quote delimiting string - - escChar - character to escape quotes, typically backslash (default=None) - - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=None) - - multiline - boolean indicating whether quotes can span multiple lines (default=C{False}) - - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True}) - - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar) - """ + def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): super(QuotedString,self).__init__() # remove white space from quote chars - wont work anyway quoteChar = quoteChar.strip() - if len(quoteChar) == 0: + if not quoteChar: warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) raise SyntaxError() @@ -1925,7 +2832,7 @@ class QuotedString(Token): endQuoteChar = quoteChar else: endQuoteChar = endQuoteChar.strip() - if len(endQuoteChar) == 0: + if not endQuoteChar: warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) raise SyntaxError() @@ -1937,6 +2844,7 @@ class QuotedString(Token): self.escChar = escChar self.escQuote = escQuote self.unquoteResults = unquoteResults + self.convertWhitespaceEscapes = convertWhitespaceEscapes if multiline: self.flags = re.MULTILINE | re.DOTALL @@ -1990,6 +2898,17 @@ class QuotedString(Token): ret = ret[self.quoteCharLen:-self.endQuoteCharLen] if isinstance(ret,basestring): + # replace escaped whitespace + if '\\' in ret and self.convertWhitespaceEscapes: + ws_map = { + r'\t' : '\t', + r'\n' : '\n', + r'\f' : '\f', + r'\r' : '\r', + } + for wslit,wschar in ws_map.items(): + ret = ret.replace(wslit, wschar) + # replace escaped characters if self.escChar: ret = re.sub(self.escCharReplacePattern,"\g<1>",ret) @@ -2003,7 +2922,7 @@ class QuotedString(Token): def __str__( self ): try: return super(QuotedString,self).__str__() - except: + except Exception: pass if self.strRepr is None: @@ -2013,11 +2932,20 @@ class QuotedString(Token): class CharsNotIn(Token): - """Token for matching words composed of characters *not* in a given set. - Defined with string containing all disallowed characters, and an optional - minimum, maximum, and/or exact length. The default value for C{min} is 1 (a - minimum value < 1 is not valid); the default values for C{max} and C{exact} - are 0, meaning no maximum or exact length restriction. + """ + Token for matching words composed of characters I{not} in a given set (will + include whitespace in matched characters if not listed in the provided exclusion set - see example). + Defined with string containing all disallowed characters, and an optional + minimum, maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. + + Example:: + # define a comma-separated-value as anything that is not a ',' + csv_value = CharsNotIn(',') + print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) + prints:: + ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] """ def __init__( self, notChars, min=1, max=0, exact=0 ): super(CharsNotIn,self).__init__() @@ -2063,7 +2991,7 @@ class CharsNotIn(Token): def __str__( self ): try: return super(CharsNotIn, self).__str__() - except: + except Exception: pass if self.strRepr is None: @@ -2075,11 +3003,13 @@ class CharsNotIn(Token): return self.strRepr class White(Token): - """Special matching class for matching whitespace. Normally, whitespace is ignored - by pyparsing grammars. This class is included when some whitespace structures - are significant. Define with a string containing the whitespace characters to be - matched; default is C{" \\t\\r\\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, - as defined for the C{L{Word}} class.""" + """ + Special matching class for matching whitespace. Normally, whitespace is ignored + by pyparsing grammars. This class is included when some whitespace structures + are significant. Define with a string containing the whitespace characters to be + matched; default is C{" \\t\\r\\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, + as defined for the C{L{Word}} class. + """ whiteStrs = { " " : "", "\t": "", @@ -2131,7 +3061,9 @@ class _PositionToken(Token): self.mayIndexError = False class GoToColumn(_PositionToken): - """Token to advance to a specific column of input text; useful for tabular report scraping.""" + """ + Token to advance to a specific column of input text; useful for tabular report scraping. + """ def __init__( self, colno ): super(GoToColumn,self).__init__() self.col = colno @@ -2153,28 +3085,41 @@ class GoToColumn(_PositionToken): ret = instring[ loc: newloc ] return newloc, ret + class LineStart(_PositionToken): - """Matches if current position is at the beginning of a line within the parse string""" + """ + Matches if current position is at the beginning of a line within the parse string + + Example:: + + test = '''\ + AAA this line + AAA and this line + AAA but not this one + B AAA and definitely not this one + ''' + + for t in (LineStart() + 'AAA' + restOfLine).searchString(test): + print(t) + + Prints:: + ['AAA', ' this line'] + ['AAA', ' and this line'] + + """ def __init__( self ): super(LineStart,self).__init__() - self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) self.errmsg = "Expected start of line" - def preParse( self, instring, loc ): - preloc = super(LineStart,self).preParse(instring,loc) - if instring[preloc] == "\n": - loc += 1 - return loc - def parseImpl( self, instring, loc, doActions=True ): - if not( loc==0 or - (loc == self.preParse( instring, 0 )) or - (instring[loc-1] == "\n") ): #col(loc, instring) != 1: - raise ParseException(instring, loc, self.errmsg, self) - return loc, [] + if col(loc, instring) == 1: + return loc, [] + raise ParseException(instring, loc, self.errmsg, self) class LineEnd(_PositionToken): - """Matches if current position is at the end of a line within the parse string""" + """ + Matches if current position is at the end of a line within the parse string + """ def __init__( self ): super(LineEnd,self).__init__() self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) @@ -2192,7 +3137,9 @@ class LineEnd(_PositionToken): raise ParseException(instring, loc, self.errmsg, self) class StringStart(_PositionToken): - """Matches if current position is at the beginning of the parse string""" + """ + Matches if current position is at the beginning of the parse string + """ def __init__( self ): super(StringStart,self).__init__() self.errmsg = "Expected start of text" @@ -2205,7 +3152,9 @@ class StringStart(_PositionToken): return loc, [] class StringEnd(_PositionToken): - """Matches if current position is at the end of the parse string""" + """ + Matches if current position is at the end of the parse string + """ def __init__( self ): super(StringEnd,self).__init__() self.errmsg = "Expected end of text" @@ -2221,11 +3170,12 @@ class StringEnd(_PositionToken): raise ParseException(instring, loc, self.errmsg, self) class WordStart(_PositionToken): - """Matches if the current position is at the beginning of a Word, and - is not preceded by any character in a given set of C{wordChars} - (default=C{printables}). To emulate the C{\b} behavior of regular expressions, - use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of - the string being parsed, or at the beginning of a line. + """ + Matches if the current position is at the beginning of a Word, and + is not preceded by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of + the string being parsed, or at the beginning of a line. """ def __init__(self, wordChars = printables): super(WordStart,self).__init__() @@ -2240,11 +3190,12 @@ class WordStart(_PositionToken): return loc, [] class WordEnd(_PositionToken): - """Matches if the current position is at the end of a Word, and - is not followed by any character in a given set of C{wordChars} - (default=C{printables}). To emulate the C{\b} behavior of regular expressions, - use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of - the string being parsed, or at the end of a line. + """ + Matches if the current position is at the end of a Word, and + is not followed by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of + the string being parsed, or at the end of a line. """ def __init__(self, wordChars = printables): super(WordEnd,self).__init__() @@ -2262,18 +3213,21 @@ class WordEnd(_PositionToken): class ParseExpression(ParserElement): - """Abstract subclass of ParserElement, for combining and post-processing parsed tokens.""" + """ + Abstract subclass of ParserElement, for combining and post-processing parsed tokens. + """ def __init__( self, exprs, savelist = False ): super(ParseExpression,self).__init__(savelist) if isinstance( exprs, _generatorType ): exprs = list(exprs) if isinstance( exprs, basestring ): - self.exprs = [ Literal( exprs ) ] - elif isinstance( exprs, collections.Sequence ): + self.exprs = [ ParserElement._literalStringClass( exprs ) ] + elif isinstance( exprs, collections.Iterable ): + exprs = list(exprs) # if sequence of strings provided, wrap with Literal if all(isinstance(expr, basestring) for expr in exprs): - exprs = map(Literal, exprs) + exprs = map(ParserElement._literalStringClass, exprs) self.exprs = list(exprs) else: try: @@ -2314,7 +3268,7 @@ class ParseExpression(ParserElement): def __str__( self ): try: return super(ParseExpression,self).__str__() - except: + except Exception: pass if self.strRepr is None: @@ -2351,7 +3305,7 @@ class ParseExpression(ParserElement): self.mayReturnEmpty |= other.mayReturnEmpty self.mayIndexError |= other.mayIndexError - self.errmsg = "Expected " + str(self) + self.errmsg = "Expected " + _ustr(self) return self @@ -2371,9 +3325,19 @@ class ParseExpression(ParserElement): return ret class And(ParseExpression): - """Requires all given C{ParseExpression}s to be found in the given order. - Expressions may be separated by whitespace. - May be constructed using the C{'+'} operator. + """ + Requires all given C{ParseExpression}s to be found in the given order. + Expressions may be separated by whitespace. + May be constructed using the C{'+'} operator. + May also be constructed using the C{'-'} operator, which will suppress backtracking. + + Example:: + integer = Word(nums) + name_expr = OneOrMore(Word(alphas)) + + expr = And([integer("id"),name_expr("name"),integer("age")]) + # more easily written as: + expr = integer("id") + name_expr("name") + integer("age") """ class _ErrorStop(Empty): @@ -2405,9 +3369,9 @@ class And(ParseExpression): raise except ParseBaseException as pe: pe.__traceback__ = None - raise ParseSyntaxException(pe) + raise ParseSyntaxException._from_exception(pe) except IndexError: - raise ParseSyntaxException( ParseException(instring, len(instring), self.errmsg, self) ) + raise ParseSyntaxException(instring, len(instring), self.errmsg, self) else: loc, exprtokens = e._parse( instring, loc, doActions ) if exprtokens or exprtokens.haskeys(): @@ -2416,7 +3380,7 @@ class And(ParseExpression): def __iadd__(self, other ): if isinstance( other, basestring ): - other = Literal( other ) + other = ParserElement._literalStringClass( other ) return self.append( other ) #And( [ self, other ] ) def checkRecursion( self, parseElementList ): @@ -2437,9 +3401,18 @@ class And(ParseExpression): class Or(ParseExpression): - """Requires that at least one C{ParseExpression} is found. - If two expressions match, the expression that matches the longest string will be used. - May be constructed using the C{'^'} operator. + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the expression that matches the longest string will be used. + May be constructed using the C{'^'} operator. + + Example:: + # construct Or using '^' operator + + number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) + prints:: + [['123'], ['3.1416'], ['789']] """ def __init__( self, exprs, savelist = False ): super(Or,self).__init__(exprs, savelist) @@ -2488,7 +3461,7 @@ class Or(ParseExpression): def __ixor__(self, other ): if isinstance( other, basestring ): - other = ParserElement.literalStringClass( other ) + other = ParserElement._literalStringClass( other ) return self.append( other ) #Or( [ self, other ] ) def __str__( self ): @@ -2507,9 +3480,21 @@ class Or(ParseExpression): class MatchFirst(ParseExpression): - """Requires that at least one C{ParseExpression} is found. - If two expressions match, the first one listed is the one that will match. - May be constructed using the C{'|'} operator. + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the first one listed is the one that will match. + May be constructed using the C{'|'} operator. + + Example:: + # construct MatchFirst using '|' operator + + # watch the order of expressions to match + number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] + + # put more selective expression first + number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) + print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] """ def __init__( self, exprs, savelist = False ): super(MatchFirst,self).__init__(exprs, savelist) @@ -2544,7 +3529,7 @@ class MatchFirst(ParseExpression): def __ior__(self, other ): if isinstance( other, basestring ): - other = ParserElement.literalStringClass( other ) + other = ParserElement._literalStringClass( other ) return self.append( other ) #MatchFirst( [ self, other ] ) def __str__( self ): @@ -2563,9 +3548,58 @@ class MatchFirst(ParseExpression): class Each(ParseExpression): - """Requires all given C{ParseExpression}s to be found, but in any order. - Expressions may be separated by whitespace. - May be constructed using the C{'&'} operator. + """ + Requires all given C{ParseExpression}s to be found, but in any order. + Expressions may be separated by whitespace. + May be constructed using the C{'&'} operator. + + Example:: + color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") + shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") + integer = Word(nums) + shape_attr = "shape:" + shape_type("shape") + posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") + color_attr = "color:" + color("color") + size_attr = "size:" + integer("size") + + # use Each (using operator '&') to accept attributes in any order + # (shape and posn are required, color and size are optional) + shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) + + shape_spec.runTests(''' + shape: SQUARE color: BLACK posn: 100, 120 + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + color:GREEN size:20 shape:TRIANGLE posn:20,40 + ''' + ) + prints:: + shape: SQUARE color: BLACK posn: 100, 120 + ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] + - color: BLACK + - posn: ['100', ',', '120'] + - x: 100 + - y: 120 + - shape: SQUARE + + + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] + - color: BLUE + - posn: ['50', ',', '80'] + - x: 50 + - y: 80 + - shape: CIRCLE + - size: 50 + + + color: GREEN size: 20 shape: TRIANGLE posn: 20,40 + ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] + - color: GREEN + - posn: ['20', ',', '40'] + - x: 20 + - y: 40 + - shape: TRIANGLE + - size: 20 """ def __init__( self, exprs, savelist = True ): super(Each,self).__init__(exprs, savelist) @@ -2619,17 +3653,7 @@ class Each(ParseExpression): loc,results = e._parse(instring,loc,doActions) resultlist.append(results) - finalResults = ParseResults([]) - for r in resultlist: - dups = {} - for k in r.keys(): - if k in finalResults: - tmp = ParseResults(finalResults[k]) - tmp += ParseResults(r[k]) - dups[k] = tmp - finalResults += ParseResults(r) - for k,v in dups.items(): - finalResults[k] = v + finalResults = sum(resultlist, ParseResults([])) return loc, finalResults def __str__( self ): @@ -2648,11 +3672,16 @@ class Each(ParseExpression): class ParseElementEnhance(ParserElement): - """Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens.""" + """ + Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens. + """ def __init__( self, expr, savelist=False ): super(ParseElementEnhance,self).__init__(savelist) if isinstance( expr, basestring ): - expr = Literal(expr) + if issubclass(ParserElement._literalStringClass, Token): + expr = ParserElement._literalStringClass(expr) + else: + expr = ParserElement._literalStringClass(Literal(expr)) self.expr = expr self.strRepr = None if expr is not None: @@ -2711,7 +3740,7 @@ class ParseElementEnhance(ParserElement): def __str__( self ): try: return super(ParseElementEnhance,self).__str__() - except: + except Exception: pass if self.strRepr is None and self.expr is not None: @@ -2720,10 +3749,22 @@ class ParseElementEnhance(ParserElement): class FollowedBy(ParseElementEnhance): - """Lookahead matching of the given parse expression. C{FollowedBy} - does *not* advance the parsing position within the input string, it only + """ + Lookahead matching of the given parse expression. C{FollowedBy} + does I{not} advance the parsing position within the input string, it only verifies that the specified parse expression matches at the current - position. C{FollowedBy} always returns a null token list.""" + position. C{FollowedBy} always returns a null token list. + + Example:: + # use FollowedBy to match a label only if it is followed by a ':' + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() + prints:: + [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] + """ def __init__( self, expr ): super(FollowedBy,self).__init__(expr) self.mayReturnEmpty = True @@ -2734,11 +3775,16 @@ class FollowedBy(ParseElementEnhance): class NotAny(ParseElementEnhance): - """Lookahead to disallow matching with the given parse expression. C{NotAny} - does *not* advance the parsing position within the input string, it only - verifies that the specified parse expression does *not* match at the current - position. Also, C{NotAny} does *not* skip over leading whitespace. C{NotAny} - always returns a null token list. May be constructed using the '~' operator.""" + """ + Lookahead to disallow matching with the given parse expression. C{NotAny} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression does I{not} match at the current + position. Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny} + always returns a null token list. May be constructed using the '~' operator. + + Example:: + + """ def __init__( self, expr ): super(NotAny,self).__init__(expr) #~ self.leaveWhitespace() @@ -2747,11 +3793,7 @@ class NotAny(ParseElementEnhance): self.errmsg = "Found unwanted token, "+_ustr(self.expr) def parseImpl( self, instring, loc, doActions=True ): - try: - self.expr.tryParse( instring, loc ) - except (ParseException,IndexError): - pass - else: + if self.expr.canParseNext(instring, loc): raise ParseException(instring, loc, self.errmsg, self) return loc, [] @@ -2764,65 +3806,69 @@ class NotAny(ParseElementEnhance): return self.strRepr - -class ZeroOrMore(ParseElementEnhance): - """Optional repetition of zero or more of the given expression.""" - def __init__( self, expr ): - super(ZeroOrMore,self).__init__(expr) - self.mayReturnEmpty = True +class _MultipleMatch(ParseElementEnhance): + def __init__( self, expr, stopOn=None): + super(_MultipleMatch, self).__init__(expr) + self.saveAsList = True + ender = stopOn + if isinstance(ender, basestring): + ender = ParserElement._literalStringClass(ender) + self.not_ender = ~ender if ender is not None else None def parseImpl( self, instring, loc, doActions=True ): - tokens = [] + self_expr_parse = self.expr._parse + self_skip_ignorables = self._skipIgnorables + check_ender = self.not_ender is not None + if check_ender: + try_not_ender = self.not_ender.tryParse + + # must be at least one (but first see if we are the stopOn sentinel; + # if so, fail) + if check_ender: + try_not_ender(instring, loc) + loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False ) try: - loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) - hasIgnoreExprs = ( len(self.ignoreExprs) > 0 ) + hasIgnoreExprs = (not not self.ignoreExprs) while 1: + if check_ender: + try_not_ender(instring, loc) if hasIgnoreExprs: - preloc = self._skipIgnorables( instring, loc ) + preloc = self_skip_ignorables( instring, loc ) else: preloc = loc - loc, tmptokens = self.expr._parse( instring, preloc, doActions ) + loc, tmptokens = self_expr_parse( instring, preloc, doActions ) if tmptokens or tmptokens.haskeys(): tokens += tmptokens except (ParseException,IndexError): pass return loc, tokens + +class OneOrMore(_MultipleMatch): + """ + Repetition of one or more of the given expression. + + Parameters: + - expr - expression that must match one or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) - def __str__( self ): - if hasattr(self,"name"): - return self.name + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) - if self.strRepr is None: - self.strRepr = "[" + _ustr(self.expr) + "]..." + text = "shape: SQUARE posn: upper left color: BLACK" + OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] - return self.strRepr - - def setResultsName( self, name, listAllMatches=False ): - ret = super(ZeroOrMore,self).setResultsName(name,listAllMatches) - ret.saveAsList = True - return ret - - -class OneOrMore(ParseElementEnhance): - """Repetition of one or more of the given expression.""" - def parseImpl( self, instring, loc, doActions=True ): - # must be at least one - loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) - try: - hasIgnoreExprs = ( len(self.ignoreExprs) > 0 ) - while 1: - if hasIgnoreExprs: - preloc = self._skipIgnorables( instring, loc ) - else: - preloc = loc - loc, tmptokens = self.expr._parse( instring, preloc, doActions ) - if tmptokens or tmptokens.haskeys(): - tokens += tmptokens - except (ParseException,IndexError): - pass - - return loc, tokens + # use stopOn attribute for OneOrMore to avoid reading label string as part of the data + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] + + # could also be written as + (attr_expr * (1,)).parseString(text).pprint() + """ def __str__( self ): if hasattr(self,"name"): @@ -2833,10 +3879,36 @@ class OneOrMore(ParseElementEnhance): return self.strRepr - def setResultsName( self, name, listAllMatches=False ): - ret = super(OneOrMore,self).setResultsName(name,listAllMatches) - ret.saveAsList = True - return ret +class ZeroOrMore(_MultipleMatch): + """ + Optional repetition of zero or more of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example: similar to L{OneOrMore} + """ + def __init__( self, expr, stopOn=None): + super(ZeroOrMore,self).__init__(expr, stopOn=stopOn) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) + except (ParseException,IndexError): + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]..." + + return self.strRepr class _NullToken(object): def __bool__(self): @@ -2847,12 +3919,43 @@ class _NullToken(object): _optionalNotMatched = _NullToken() class Optional(ParseElementEnhance): - """Optional matching of the given expression. - A default return string can also be specified, if the optional expression - is not found. + """ + Optional matching of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - default (optional) - value to be returned if the optional expression is not found. + + Example:: + # US postal code can be a 5-digit zip, plus optional 4-digit qualifier + zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) + zip.runTests(''' + # traditional ZIP code + 12345 + + # ZIP+4 form + 12101-0001 + + # invalid ZIP + 98765- + ''') + prints:: + # traditional ZIP code + 12345 + ['12345'] + + # ZIP+4 form + 12101-0001 + ['12101-0001'] + + # invalid ZIP + 98765- + ^ + FAIL: Expected end of text (at char 5), (line:1, col:6) """ def __init__( self, expr, default=_optionalNotMatched ): super(Optional,self).__init__( expr, savelist=False ) + self.saveAsList = self.expr.saveAsList self.defaultValue = default self.mayReturnEmpty = True @@ -2879,13 +3982,60 @@ class Optional(ParseElementEnhance): return self.strRepr - class SkipTo(ParseElementEnhance): - """Token for skipping over all undefined text until the matched expression is found. - If C{include} is set to true, the matched expression is also parsed (the skipped text - and matched expression are returned as a 2-element list). The C{ignore} - argument is used to define grammars (typically quoted strings and comments) that - might contain false matches. + """ + Token for skipping over all undefined text until the matched expression is found. + + Parameters: + - expr - target expression marking the end of the data to be skipped + - include - (default=C{False}) if True, the target expression is also parsed + (the skipped text and target expression are returned as a 2-element list). + - ignore - (default=C{None}) used to define grammars (typically quoted strings and + comments) that might contain false matches to the target expression + - failOn - (default=C{None}) define expressions that are not allowed to be + included in the skipped test; if found before the target expression is found, + the SkipTo is not a match + + Example:: + report = ''' + Outstanding Issues Report - 1 Jan 2000 + + # | Severity | Description | Days Open + -----+----------+-------------------------------------------+----------- + 101 | Critical | Intermittent system crash | 6 + 94 | Cosmetic | Spelling error on Login ('log|n') | 14 + 79 | Minor | System slow when running too many reports | 47 + ''' + integer = Word(nums) + SEP = Suppress('|') + # use SkipTo to simply match everything up until the next SEP + # - ignore quoted strings, so that a '|' character inside a quoted string does not match + # - parse action will call token.strip() for each matched token, i.e., the description body + string_data = SkipTo(SEP, ignore=quotedString) + string_data.setParseAction(tokenMap(str.strip)) + ticket_expr = (integer("issue_num") + SEP + + string_data("sev") + SEP + + string_data("desc") + SEP + + integer("days_open")) + + for tkt in ticket_expr.searchString(report): + print tkt.dump() + prints:: + ['101', 'Critical', 'Intermittent system crash', '6'] + - days_open: 6 + - desc: Intermittent system crash + - issue_num: 101 + - sev: Critical + ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] + - days_open: 14 + - desc: Spelling error on Login ('log|n') + - issue_num: 94 + - sev: Cosmetic + ['79', 'Minor', 'System slow when running too many reports', '47'] + - days_open: 47 + - desc: System slow when running too many reports + - issue_num: 79 + - sev: Minor """ def __init__( self, other, include=False, ignore=None, failOn=None ): super( SkipTo, self ).__init__( other ) @@ -2894,77 +4044,85 @@ class SkipTo(ParseElementEnhance): self.mayIndexError = False self.includeMatch = include self.asList = False - if failOn is not None and isinstance(failOn, basestring): - self.failOn = Literal(failOn) + if isinstance(failOn, basestring): + self.failOn = ParserElement._literalStringClass(failOn) else: self.failOn = failOn self.errmsg = "No match found for "+_ustr(self.expr) def parseImpl( self, instring, loc, doActions=True ): - startLoc = loc + startloc = loc instrlen = len(instring) expr = self.expr - failParse = False - while loc <= instrlen: - try: - if self.failOn: + expr_parse = self.expr._parse + self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None + self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None + + tmploc = loc + while tmploc <= instrlen: + if self_failOn_canParseNext is not None: + # break if failOn expression matches + if self_failOn_canParseNext(instring, tmploc): + break + + if self_ignoreExpr_tryParse is not None: + # advance past ignore expressions + while 1: try: - self.failOn.tryParse(instring, loc) + tmploc = self_ignoreExpr_tryParse(instring, tmploc) except ParseBaseException: - pass - else: - failParse = True - raise ParseException(instring, loc, "Found expression " + str(self.failOn)) - failParse = False - if self.ignoreExpr is not None: - while 1: - try: - loc = self.ignoreExpr.tryParse(instring,loc) - # print("found ignoreExpr, advance to", loc) - except ParseBaseException: - break - expr._parse( instring, loc, doActions=False, callPreParse=False ) - skipText = instring[startLoc:loc] - if self.includeMatch: - loc,mat = expr._parse(instring,loc,doActions,callPreParse=False) - if mat: - skipRes = ParseResults( skipText ) - skipRes += mat - return loc, [ skipRes ] - else: - return loc, [ skipText ] - else: - return loc, [ skipText ] - except (ParseException,IndexError): - if failParse: - raise - else: - loc += 1 - raise ParseException(instring, loc, self.errmsg, self) + break + + try: + expr_parse(instring, tmploc, doActions=False, callPreParse=False) + except (ParseException, IndexError): + # no match, advance loc in string + tmploc += 1 + else: + # matched skipto expr, done + break + + else: + # ran off the end of the input string without matching skipto expr, fail + raise ParseException(instring, loc, self.errmsg, self) + + # build up return values + loc = tmploc + skiptext = instring[startloc:loc] + skipresult = ParseResults(skiptext) + + if self.includeMatch: + loc, mat = expr_parse(instring,loc,doActions,callPreParse=False) + skipresult += mat + + return loc, skipresult class Forward(ParseElementEnhance): - """Forward declaration of an expression to be defined later - - used for recursive grammars, such as algebraic infix notation. - When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. + """ + Forward declaration of an expression to be defined later - + used for recursive grammars, such as algebraic infix notation. + When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. - Note: take care when assigning to C{Forward} not to overlook precedence of operators. - Specifically, '|' has a lower precedence than '<<', so that:: - fwdExpr << a | b | c - will actually be evaluated as:: - (fwdExpr << a) | b | c - thereby leaving b and c out as parseable alternatives. It is recommended that you - explicitly group the values inserted into the C{Forward}:: - fwdExpr << (a | b | c) - Converting to use the '<<=' operator instead will avoid this problem. + Note: take care when assigning to C{Forward} not to overlook precedence of operators. + Specifically, '|' has a lower precedence than '<<', so that:: + fwdExpr << a | b | c + will actually be evaluated as:: + (fwdExpr << a) | b | c + thereby leaving b and c out as parseable alternatives. It is recommended that you + explicitly group the values inserted into the C{Forward}:: + fwdExpr << (a | b | c) + Converting to use the '<<=' operator instead will avoid this problem. + + See L{ParseResults.pprint} for an example of a recursive parser created using + C{Forward}. """ def __init__( self, other=None ): super(Forward,self).__init__( other, savelist=False ) def __lshift__( self, other ): if isinstance( other, basestring ): - other = ParserElement.literalStringClass(other) + other = ParserElement._literalStringClass(other) self.expr = other - self.mayReturnEmpty = other.mayReturnEmpty self.strRepr = None self.mayIndexError = self.expr.mayIndexError self.mayReturnEmpty = self.expr.mayReturnEmpty @@ -2998,7 +4156,9 @@ class Forward(ParseElementEnhance): def __str__( self ): if hasattr(self,"name"): return self.name + return self.__class__.__name__ + ": ..." + # stubbed out for now - creates awful memory and perf issues self._revertClass = self.__class__ self.__class__ = _ForwardNoRecurse try: @@ -3023,26 +4183,29 @@ class _ForwardNoRecurse(Forward): return "..." class TokenConverter(ParseElementEnhance): - """Abstract subclass of C{ParseExpression}, for converting parsed results.""" + """ + Abstract subclass of C{ParseExpression}, for converting parsed results. + """ def __init__( self, expr, savelist=False ): super(TokenConverter,self).__init__( expr )#, savelist ) self.saveAsList = False -class Upcase(TokenConverter): - """Converter to upper case all matching tokens.""" - def __init__(self, *args): - super(Upcase,self).__init__(*args) - warnings.warn("Upcase class is deprecated, use upcaseTokens parse action instead", - DeprecationWarning,stacklevel=2) - - def postParse( self, instring, loc, tokenlist ): - return list(map( str.upper, tokenlist )) - - class Combine(TokenConverter): - """Converter to concatenate all matching tokens to a single string. - By default, the matching patterns must also be contiguous in the input string; - this can be disabled by specifying C{'adjacent=False'} in the constructor. + """ + Converter to concatenate all matching tokens to a single string. + By default, the matching patterns must also be contiguous in the input string; + this can be disabled by specifying C{'adjacent=False'} in the constructor. + + Example:: + real = Word(nums) + '.' + Word(nums) + print(real.parseString('3.1416')) # -> ['3', '.', '1416'] + # will also erroneously match the following + print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] + + real = Combine(Word(nums) + '.' + Word(nums)) + print(real.parseString('3.1416')) # -> ['3.1416'] + # no match when there are internal spaces + print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) """ def __init__( self, expr, joinString="", adjacent=True ): super(Combine,self).__init__( expr ) @@ -3072,7 +4235,19 @@ class Combine(TokenConverter): return retToks class Group(TokenConverter): - """Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions.""" + """ + Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions. + + Example:: + ident = Word(alphas) + num = Word(nums) + term = ident | num + func = ident + Optional(delimitedList(term)) + print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] + + func = ident + Group(Optional(delimitedList(term))) + print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] + """ def __init__( self, expr ): super(Group,self).__init__( expr ) self.saveAsList = True @@ -3081,9 +4256,40 @@ class Group(TokenConverter): return [ tokenlist ] class Dict(TokenConverter): - """Converter to return a repetitive expression as a list, but also as a dictionary. - Each element can also be referenced using the first token in the expression as its key. - Useful for tabular report scraping when the first column can be used as a item key. + """ + Converter to return a repetitive expression as a list, but also as a dictionary. + Each element can also be referenced using the first token in the expression as its key. + Useful for tabular report scraping when the first column can be used as a item key. + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + # print attributes as plain groups + print(OneOrMore(attr_expr).parseString(text).dump()) + + # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names + result = Dict(OneOrMore(Group(attr_expr))).parseString(text) + print(result.dump()) + + # access named fields as dict entries, or output as dict + print(result['shape']) + print(result.asDict()) + prints:: + ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] + + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} + See more examples at L{ParseResults} of accessing fields by results name. """ def __init__( self, expr ): super(Dict,self).__init__( expr ) @@ -3115,7 +4321,24 @@ class Dict(TokenConverter): class Suppress(TokenConverter): - """Converter for ignoring the results of a parsed expression.""" + """ + Converter for ignoring the results of a parsed expression. + + Example:: + source = "a, b, c,d" + wd = Word(alphas) + wd_list1 = wd + ZeroOrMore(',' + wd) + print(wd_list1.parseString(source)) + + # often, delimiters that are useful during parsing are just in the + # way afterward - use Suppress to keep them out of the parsed output + wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) + print(wd_list2.parseString(source)) + prints:: + ['a', ',', 'b', ',', 'c', ',', 'd'] + ['a', 'b', 'c', 'd'] + (See also L{delimitedList}.) + """ def postParse( self, instring, loc, tokenlist ): return [] @@ -3124,7 +4347,9 @@ class Suppress(TokenConverter): class OnlyOnce(object): - """Wrapper for parse actions, to ensure they are only called once.""" + """ + Wrapper for parse actions, to ensure they are only called once. + """ def __init__(self, methodCall): self.callable = _trim_arity(methodCall) self.called = False @@ -3138,20 +4363,39 @@ class OnlyOnce(object): self.called = False def traceParseAction(f): - """Decorator for debugging parse actions.""" + """ + Decorator for debugging parse actions. + + When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".} + When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised. + + Example:: + wd = Word(alphas) + + @traceParseAction + def remove_duplicate_chars(tokens): + return ''.join(sorted(set(''.join(tokens))) + + wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) + print(wds.parseString("slkdjs sld sldd sdlf sdljf")) + prints:: + >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) + <3: thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc - sys.stderr.write( ">>entering %s(line: '%s', %d, %s)\n" % (thisFunc,line(l,s),l,t) ) + sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) ) try: ret = f(*paArgs) except Exception as exc: sys.stderr.write( "< ['aa', 'bb', 'cc'] + delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] """ dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." if combine: @@ -3177,11 +4426,22 @@ def delimitedList( expr, delim=",", combine=False ): return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName) def countedArray( expr, intExpr=None ): - """Helper to define a counted list of expressions. - This helper defines a pattern of the form:: - integer expr expr expr... - where the leading integer tells how many expr expressions follow. - The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed. + """ + Helper to define a counted list of expressions. + This helper defines a pattern of the form:: + integer expr expr expr... + where the leading integer tells how many expr expressions follow. + The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed. + + If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value. + + Example:: + countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] + + # in this parser, the leading integer value is given in binary, + # '10' indicating that 2 values are in the array + binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) + countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] """ arrayExpr = Forward() def countFieldParseAction(s,l,t): @@ -3194,7 +4454,7 @@ def countedArray( expr, intExpr=None ): intExpr = intExpr.copy() intExpr.setName("arrayLen") intExpr.addParseAction(countFieldParseAction, callDuringTry=True) - return ( intExpr + arrayExpr ) + return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...') def _flatten(L): ret = [] @@ -3206,16 +4466,17 @@ def _flatten(L): return ret def matchPreviousLiteral(expr): - """Helper to define an expression that is indirectly defined from - the tokens matched in a previous expression, that is, it looks - for a 'repeat' of a previous expression. For example:: - first = Word(nums) - second = matchPreviousLiteral(first) - matchExpr = first + ":" + second - will match C{"1:1"}, but not C{"1:2"}. Because this matches a - previous literal, will also match the leading C{"1:1"} in C{"1:10"}. - If this is not desired, use C{matchPreviousExpr}. - Do *not* use with packrat parsing enabled. + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousLiteral(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches a + previous literal, will also match the leading C{"1:1"} in C{"1:10"}. + If this is not desired, use C{matchPreviousExpr}. + Do I{not} use with packrat parsing enabled. """ rep = Forward() def copyTokenToRepeater(s,l,t): @@ -3225,24 +4486,26 @@ def matchPreviousLiteral(expr): else: # flatten t tokens tflat = _flatten(t.asList()) - rep << And( [ Literal(tt) for tt in tflat ] ) + rep << And(Literal(tt) for tt in tflat) else: rep << Empty() expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) return rep def matchPreviousExpr(expr): - """Helper to define an expression that is indirectly defined from - the tokens matched in a previous expression, that is, it looks - for a 'repeat' of a previous expression. For example:: - first = Word(nums) - second = matchPreviousExpr(first) - matchExpr = first + ":" + second - will match C{"1:1"}, but not C{"1:2"}. Because this matches by - expressions, will *not* match the leading C{"1:1"} in C{"1:10"}; - the expressions are evaluated first, and then compared, so - C{"1"} is compared with C{"10"}. - Do *not* use with packrat parsing enabled. + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousExpr(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches by + expressions, will I{not} match the leading C{"1:1"} in C{"1:10"}; + the expressions are evaluated first, and then compared, so + C{"1"} is compared with C{"10"}. + Do I{not} use with packrat parsing enabled. """ rep = Forward() e2 = expr.copy() @@ -3255,6 +4518,7 @@ def matchPreviousExpr(expr): raise ParseException("",0,"") rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) return rep def _escapeRegexRangeChars(s): @@ -3266,16 +4530,27 @@ def _escapeRegexRangeChars(s): return _ustr(s) def oneOf( strs, caseless=False, useRegex=True ): - """Helper to quickly define a set of alternative Literals, and makes sure to do - longest-first testing when there is a conflict, regardless of the input order, - but returns a C{L{MatchFirst}} for best performance. + """ + Helper to quickly define a set of alternative Literals, and makes sure to do + longest-first testing when there is a conflict, regardless of the input order, + but returns a C{L{MatchFirst}} for best performance. - Parameters: - - strs - a string of space-delimited literals, or a list of string literals - - caseless - (default=False) - treat all literals as caseless - - useRegex - (default=True) - as an optimization, will generate a Regex + Parameters: + - strs - a string of space-delimited literals, or a collection of string literals + - caseless - (default=C{False}) - treat all literals as caseless + - useRegex - (default=C{True}) - as an optimization, will generate a Regex object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or if creating a C{Regex} raises an exception) + + Example:: + comp_oper = oneOf("< = > <= >= !=") + var = Word(alphas) + number = Word(nums) + term = var | number + comparison_expr = term + comp_oper + term + print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) + prints:: + [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] """ if caseless: isequal = ( lambda a,b: a.upper() == b.upper() ) @@ -3289,12 +4564,10 @@ def oneOf( strs, caseless=False, useRegex=True ): symbols = [] if isinstance(strs,basestring): symbols = strs.split() - elif isinstance(strs, collections.Sequence): - symbols = list(strs[:]) - elif isinstance(strs, _generatorType): + elif isinstance(strs, collections.Iterable): symbols = list(strs) else: - warnings.warn("Invalid argument to oneOf, expected string or list", + warnings.warn("Invalid argument to oneOf, expected string or iterable", SyntaxWarning, stacklevel=2) if not symbols: return NoMatch() @@ -3318,41 +4591,76 @@ def oneOf( strs, caseless=False, useRegex=True ): #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) try: if len(symbols)==len("".join(symbols)): - return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ) + return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols)) else: - return Regex( "|".join(re.escape(sym) for sym in symbols) ) - except: + return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols)) + except Exception: warnings.warn("Exception creating Regex for oneOf, building MatchFirst", SyntaxWarning, stacklevel=2) # last resort, just use MatchFirst - return MatchFirst( [ parseElementClass(sym) for sym in symbols ] ) + return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) def dictOf( key, value ): - """Helper to easily and clearly define a dictionary by specifying the respective patterns - for the key and value. Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens - in the proper order. The key pattern can include delimiting markers or punctuation, - as long as they are suppressed, thereby leaving the significant key text. The value - pattern can include named results, so that the C{Dict} results can include named token - fields. + """ + Helper to easily and clearly define a dictionary by specifying the respective patterns + for the key and value. Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens + in the proper order. The key pattern can include delimiting markers or punctuation, + as long as they are suppressed, thereby leaving the significant key text. The value + pattern can include named results, so that the C{Dict} results can include named token + fields. + + Example:: + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + print(OneOrMore(attr_expr).parseString(text).dump()) + + attr_label = label + attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) + + # similar to Dict, but simpler call format + result = dictOf(attr_label, attr_value).parseString(text) + print(result.dump()) + print(result['shape']) + print(result.shape) # object attribute access works too + print(result.asDict()) + prints:: + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + SQUARE + {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} """ return Dict( ZeroOrMore( Group ( key + value ) ) ) def originalTextFor(expr, asString=True): - """Helper to return the original, untokenized text for a given expression. Useful to - restore the parsed fields of an HTML start tag into the raw tag text itself, or to - revert separate tokens with intervening whitespace back to the original matching - input text. Simpler to use than the parse action C{L{keepOriginalText}}, and does not - require the inspect module to chase up the call stack. By default, returns a - string containing the original parsed text. + """ + Helper to return the original, untokenized text for a given expression. Useful to + restore the parsed fields of an HTML start tag into the raw tag text itself, or to + revert separate tokens with intervening whitespace back to the original matching + input text. By default, returns astring containing the original parsed text. - If the optional C{asString} argument is passed as C{False}, then the return value is a - C{L{ParseResults}} containing any results names that were originally matched, and a - single token containing the original matched text from the input string. So if - the expression passed to C{L{originalTextFor}} contains expressions with defined - results names, you must set C{asString} to C{False} if you want to preserve those - results name values.""" + If the optional C{asString} argument is passed as C{False}, then the return value is a + C{L{ParseResults}} containing any results names that were originally matched, and a + single token containing the original matched text from the input string. So if + the expression passed to C{L{originalTextFor}} contains expressions with defined + results names, you must set C{asString} to C{False} if you want to preserve those + results name values. + + Example:: + src = "this is test bold text normal text " + for tag in ("b","i"): + opener,closer = makeHTMLTags(tag) + patt = originalTextFor(opener + SkipTo(closer) + closer) + print(patt.searchString(src)[0]) + prints:: + [' bold text '] + ['text'] + """ locMarker = Empty().setParseAction(lambda s,loc,t: loc) endlocMarker = locMarker.copy() endlocMarker.callPreparse = False @@ -3361,27 +4669,37 @@ def originalTextFor(expr, asString=True): extractText = lambda s,l,t: s[t._original_start:t._original_end] else: def extractText(s,l,t): - del t[:] - t.insert(0, s[t._original_start:t._original_end]) - del t["_original_start"] - del t["_original_end"] + t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]] matchExpr.setParseAction(extractText) + matchExpr.ignoreExprs = expr.ignoreExprs return matchExpr def ungroup(expr): - """Helper to undo pyparsing's default grouping of And expressions, even - if all but one are non-empty.""" + """ + Helper to undo pyparsing's default grouping of And expressions, even + if all but one are non-empty. + """ return TokenConverter(expr).setParseAction(lambda t:t[0]) def locatedExpr(expr): - """Helper to decorate a returned token with its starting and ending locations in the input string. - This helper adds the following results names: - - locn_start = location where matched expression begins - - locn_end = location where matched expression ends - - value = the actual parsed results + """ + Helper to decorate a returned token with its starting and ending locations in the input string. + This helper adds the following results names: + - locn_start = location where matched expression begins + - locn_end = location where matched expression ends + - value = the actual parsed results - Be careful if the input text contains C{} characters, you may want to call - C{L{ParserElement.parseWithTabs}} + Be careful if the input text contains C{} characters, you may want to call + C{L{ParserElement.parseWithTabs}} + + Example:: + wd = Word(alphas) + for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): + print(match) + prints:: + [[0, 'ljsdf', 5]] + [[8, 'lksdjjf', 15]] + [[18, 'lkkjj', 23]] """ locator = Empty().setParseAction(lambda s,l,t: l) return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) @@ -3402,31 +4720,33 @@ _charRange = Group(_singleChar + Suppress("-") + _singleChar) _reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" def srange(s): - r"""Helper to easily define string ranges for use in Word construction. Borrows - syntax from regexp '[]' string range definitions:: - srange("[0-9]") -> "0123456789" - srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" - srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" - The input string must be enclosed in []'s, and the returned string is the expanded - character set joined into a single string. - The values enclosed in the []'s may be:: - a single character - an escaped character with a leading backslash (such as \- or \]) - an escaped hex character with a leading '\x' (\x21, which is a '!' character) - (\0x## is also supported for backwards compatibility) - an escaped octal character with a leading '\0' (\041, which is a '!' character) - a range of any of the above, separated by a dash ('a-z', etc.) - any combination of the above ('aeiouy', 'a-zA-Z0-9_$', etc.) + r""" + Helper to easily define string ranges for use in Word construction. Borrows + syntax from regexp '[]' string range definitions:: + srange("[0-9]") -> "0123456789" + srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" + srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" + The input string must be enclosed in []'s, and the returned string is the expanded + character set joined into a single string. + The values enclosed in the []'s may be: + - a single character + - an escaped character with a leading backslash (such as C{\-} or C{\]}) + - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) + (C{\0x##} is also supported for backwards compatibility) + - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character) + - a range of any of the above, separated by a dash (C{'a-z'}, etc.) + - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.) """ _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) try: return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) - except: + except Exception: return "" def matchOnlyAtCol(n): - """Helper method for defining parse actions that require matching at a specific - column in the input text. + """ + Helper method for defining parse actions that require matching at a specific + column in the input text. """ def verifyCol(strg,locn,toks): if col(locn,strg) != n: @@ -3434,57 +4754,83 @@ def matchOnlyAtCol(n): return verifyCol def replaceWith(replStr): - """Helper method for common parse actions that simply return a literal value. Especially - useful when used with C{L{transformString}()}. """ - #def _replFunc(*args): - # return [replStr] - #return _replFunc - return functools.partial(next, itertools.repeat([replStr])) + Helper method for common parse actions that simply return a literal value. Especially + useful when used with C{L{transformString}()}. + + Example:: + num = Word(nums).setParseAction(lambda toks: int(toks[0])) + na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) + term = na | num + + OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] + """ + return lambda s,l,t: [replStr] def removeQuotes(s,l,t): - """Helper parse action for removing quotation marks from parsed quoted strings. - To use, add this parse action to quoted string using:: - quotedString.setParseAction( removeQuotes ) + """ + Helper parse action for removing quotation marks from parsed quoted strings. + + Example:: + # by default, quotation marks are included in parsed results + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] + + # use removeQuotes to strip quotation marks from parsed results + quotedString.setParseAction(removeQuotes) + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] """ return t[0][1:-1] -def upcaseTokens(s,l,t): - """Helper parse action to convert tokens to upper case.""" - return [ tt.upper() for tt in map(_ustr,t) ] +def tokenMap(func, *args): + """ + Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional + args are passed, they are forwarded to the given function as additional arguments after + the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the + parsed data to an integer using base 16. -def downcaseTokens(s,l,t): - """Helper parse action to convert tokens to lower case.""" - return [ tt.lower() for tt in map(_ustr,t) ] + Example (compare the last to example in L{ParserElement.transformString}:: + hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) + hex_ints.runTests(''' + 00 11 22 aa FF 0a 0d 1a + ''') + + upperword = Word(alphas).setParseAction(tokenMap(str.upper)) + OneOrMore(upperword).runTests(''' + my kingdom for a horse + ''') + + wd = Word(alphas).setParseAction(tokenMap(str.title)) + OneOrMore(wd).setParseAction(' '.join).runTests(''' + now is the winter of our discontent made glorious summer by this sun of york + ''') + prints:: + 00 11 22 aa FF 0a 0d 1a + [0, 17, 34, 170, 255, 10, 13, 26] + + my kingdom for a horse + ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] + + now is the winter of our discontent made glorious summer by this sun of york + ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] + """ + def pa(s,l,t): + return [func(tokn, *args) for tokn in t] -def keepOriginalText(s,startLoc,t): - """DEPRECATED - use new helper method C{L{originalTextFor}}. - Helper parse action to preserve original parsed text, - overriding any nested parse actions.""" try: - endloc = getTokensEndLoc() - except ParseException: - raise ParseFatalException("incorrect usage of keepOriginalText - may only be called as a parse action") - del t[:] - t += ParseResults(s[startLoc:endloc]) - return t + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + pa.__name__ = func_name -def getTokensEndLoc(): - """Method to be called from within a parse action to determine the end - location of the parsed tokens.""" - import inspect - fstack = inspect.stack() - try: - # search up the stack (through intervening argument normalizers) for correct calling routine - for f in fstack[2:]: - if f[3] == "_parseNoCache": - endloc = f[0].f_locals["loc"] - return endloc - else: - raise ParseFatalException("incorrect usage of getTokensEndLoc - may only be called from within a parse action") - finally: - del fstack + return pa +upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) +"""(Deprecated) Helper parse action to convert tokens to upper case. Deprecated in favor of L{pyparsing_common.upcaseTokens}""" + +downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) +"""(Deprecated) Helper parse action to convert tokens to lower case. Deprecated in favor of L{pyparsing_common.downcaseTokens}""" + def _makeTags(tagStr, xml): """Internal helper to construct opening and closing tag expressions, given a tag name""" if isinstance(tagStr,basestring): @@ -3508,40 +4854,90 @@ def _makeTags(tagStr, xml): Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") closeTag = Combine(_L("") - openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % tagStr) - closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("" % tagStr) + openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname) + closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("" % resname) openTag.tag = resname closeTag.tag = resname return openTag, closeTag def makeHTMLTags(tagStr): - """Helper to construct opening and closing tag expressions for HTML, given a tag name""" + """ + Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches + tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values. + + Example:: + text = 'More info at the pyparsing wiki page' + # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple + a,a_end = makeHTMLTags("A") + link_expr = a + SkipTo(a_end)("link_text") + a_end + + for link in link_expr.searchString(text): + # attributes in the tag (like "href" shown here) are also accessible as named results + print(link.link_text, '->', link.href) + prints:: + pyparsing -> http://pyparsing.wikispaces.com + """ return _makeTags( tagStr, False ) def makeXMLTags(tagStr): - """Helper to construct opening and closing tag expressions for XML, given a tag name""" + """ + Helper to construct opening and closing tag expressions for XML, given a tag name. Matches + tags only in the given upper/lower case. + + Example: similar to L{makeHTMLTags} + """ return _makeTags( tagStr, True ) def withAttribute(*args,**attrDict): - """Helper to create a validating parse action to be used with start tags created - with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag - with a required attribute value, to avoid false matches on common tags such as - C{} or C{
}. + """ + Helper to create a validating parse action to be used with start tags created + with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag + with a required attribute value, to avoid false matches on common tags such as + C{} or C{
}. - Call C{withAttribute} with a series of attribute names and values. Specify the list - of filter attributes names and values as: - - keyword arguments, as in C{(align="right")}, or - - as an explicit dict with C{**} operator, when an attribute name is also a Python + Call C{withAttribute} with a series of attribute names and values. Specify the list + of filter attributes names and values as: + - keyword arguments, as in C{(align="right")}, or + - as an explicit dict with C{**} operator, when an attribute name is also a Python reserved word, as in C{**{"class":"Customer", "align":"right"}} - - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) - For attribute names with a namespace prefix, you must use the second form. Attribute - names are matched insensitive to upper/lower case. + - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) + For attribute names with a namespace prefix, you must use the second form. Attribute + names are matched insensitive to upper/lower case. - If just testing for C{class} (with or without a namespace), use C{L{withClass}}. + If just testing for C{class} (with or without a namespace), use C{L{withClass}}. - To verify that the attribute exists, but without specifying a value, pass - C{withAttribute.ANY_VALUE} as the value. - """ + To verify that the attribute exists, but without specifying a value, pass + C{withAttribute.ANY_VALUE} as the value. + + Example:: + html = ''' +
+ Some text +
1 4 0 1 0
+
1,3 2,3 1,1
+
this has no type
+
+ + ''' + div,div_end = makeHTMLTags("div") + + # only match div tag having a type attribute with value "grid" + div_grid = div().setParseAction(withAttribute(type="grid")) + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + # construct a match with any div tag having a type attribute, regardless of the value + div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ if args: attrs = args[:] else: @@ -3558,9 +4954,37 @@ def withAttribute(*args,**attrDict): withAttribute.ANY_VALUE = object() def withClass(classname, namespace=''): - """Simplified version of C{L{withAttribute}} when matching on a div class - made - difficult because C{class} is a reserved word in Python. - """ + """ + Simplified version of C{L{withAttribute}} when matching on a div class - made + difficult because C{class} is a reserved word in Python. + + Example:: + html = ''' +
+ Some text +
1 4 0 1 0
+
1,3 2,3 1,1
+
this <div> has no class
+
+ + ''' + div,div_end = makeHTMLTags("div") + div_grid = div().setParseAction(withClass("grid")) + + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ classattr = "%s:class" % namespace if namespace else "class" return withAttribute(**{classattr : classname}) @@ -3569,40 +4993,74 @@ opAssoc.LEFT = object() opAssoc.RIGHT = object() def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): - """Helper method for constructing grammars of expressions made up of - operators working in a precedence hierarchy. Operators may be unary or - binary, left- or right-associative. Parse actions can also be attached - to operator expressions. + """ + Helper method for constructing grammars of expressions made up of + operators working in a precedence hierarchy. Operators may be unary or + binary, left- or right-associative. Parse actions can also be attached + to operator expressions. The generated parser will also recognize the use + of parentheses to override operator precedences (see example below). + + Note: if you define a deep operator list, you may see performance issues + when using infixNotation. See L{ParserElement.enablePackrat} for a + mechanism to potentially improve your parser performance. - Parameters: - - baseExpr - expression representing the most basic element for the nested - - opList - list of tuples, one for each operator precedence level in the - expression grammar; each tuple is of the form - (opExpr, numTerms, rightLeftAssoc, parseAction), where: - - opExpr is the pyparsing expression for the operator; - may also be a string, which will be converted to a Literal; - if numTerms is 3, opExpr is a tuple of two expressions, for the - two operators separating the 3 terms - - numTerms is the number of terms for this operator (must - be 1, 2, or 3) - - rightLeftAssoc is the indicator whether the operator is - right or left associative, using the pyparsing-defined - constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. - - parseAction is the parse action to be associated with - expressions matching this operator expression (the - parse action tuple member may be omitted) - - lpar - expression for matching left-parentheses (default=Suppress('(')) - - rpar - expression for matching right-parentheses (default=Suppress(')')) + Parameters: + - baseExpr - expression representing the most basic element for the nested + - opList - list of tuples, one for each operator precedence level in the + expression grammar; each tuple is of the form + (opExpr, numTerms, rightLeftAssoc, parseAction), where: + - opExpr is the pyparsing expression for the operator; + may also be a string, which will be converted to a Literal; + if numTerms is 3, opExpr is a tuple of two expressions, for the + two operators separating the 3 terms + - numTerms is the number of terms for this operator (must + be 1, 2, or 3) + - rightLeftAssoc is the indicator whether the operator is + right or left associative, using the pyparsing-defined + constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. + - parseAction is the parse action to be associated with + expressions matching this operator expression (the + parse action tuple member may be omitted) + - lpar - expression for matching left-parentheses (default=C{Suppress('(')}) + - rpar - expression for matching right-parentheses (default=C{Suppress(')')}) + + Example:: + # simple example of four-function arithmetic with ints and variable names + integer = pyparsing_common.signed_integer + varname = pyparsing_common.identifier + + arith_expr = infixNotation(integer | varname, + [ + ('-', 1, opAssoc.RIGHT), + (oneOf('* /'), 2, opAssoc.LEFT), + (oneOf('+ -'), 2, opAssoc.LEFT), + ]) + + arith_expr.runTests(''' + 5+3*6 + (5+3)*6 + -2--11 + ''', fullDump=False) + prints:: + 5+3*6 + [[5, '+', [3, '*', 6]]] + + (5+3)*6 + [[[5, '+', 3], '*', 6]] + + -2--11 + [[['-', 2], '-', ['-', 11]]] """ ret = Forward() lastExpr = baseExpr | ( lpar + ret + rpar ) for i,operDef in enumerate(opList): opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] + termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr if arity == 3: if opExpr is None or len(opExpr) != 2: raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions") opExpr1, opExpr2 = opExpr - thisExpr = Forward()#.setName("expr%d" % i) + thisExpr = Forward().setName(termName) if rightLeftAssoc == opAssoc.LEFT: if arity == 1: matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) @@ -3636,37 +5094,77 @@ def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): raise ValueError("operator must indicate right or left associativity") if pa: matchExpr.setParseAction( pa ) - thisExpr <<= ( matchExpr | lastExpr ) + thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) lastExpr = thisExpr ret <<= lastExpr return ret -operatorPrecedence = infixNotation -dblQuotedString = Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\x[0-9a-fA-F]+)|(?:\\.))*"').setName("string enclosed in double quotes") -sglQuotedString = Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\x[0-9a-fA-F]+)|(?:\\.))*'").setName("string enclosed in single quotes") -quotedString = Regex(r'''(?:"(?:[^"\n\r\\]|(?:"")|(?:\\x[0-9a-fA-F]+)|(?:\\.))*")|(?:'(?:[^'\n\r\\]|(?:'')|(?:\\x[0-9a-fA-F]+)|(?:\\.))*')''').setName("quotedString using single or double quotes") -unicodeString = Combine(_L('u') + quotedString.copy()) +operatorPrecedence = infixNotation +"""(Deprecated) Former name of C{L{infixNotation}}, will be dropped in a future release.""" + +dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") +sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") +quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| + Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") +unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): - """Helper method for defining nested lists enclosed in opening and closing - delimiters ("(" and ")" are the default). + """ + Helper method for defining nested lists enclosed in opening and closing + delimiters ("(" and ")" are the default). - Parameters: - - opener - opening character for a nested list (default="("); can also be a pyparsing expression - - closer - closing character for a nested list (default=")"); can also be a pyparsing expression - - content - expression for items within the nested lists (default=None) - - ignoreExpr - expression for ignoring opening and closing delimiters (default=quotedString) + Parameters: + - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression + - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression + - content - expression for items within the nested lists (default=C{None}) + - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString}) - If an expression is not provided for the content argument, the nested - expression will capture all whitespace-delimited content between delimiters - as a list of separate values. + If an expression is not provided for the content argument, the nested + expression will capture all whitespace-delimited content between delimiters + as a list of separate values. - Use the C{ignoreExpr} argument to define expressions that may contain - opening or closing characters that should not be treated as opening - or closing characters for nesting, such as quotedString or a comment - expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. - The default is L{quotedString}, but if no expressions are to be ignored, - then pass C{None} for this argument. + Use the C{ignoreExpr} argument to define expressions that may contain + opening or closing characters that should not be treated as opening + or closing characters for nesting, such as quotedString or a comment + expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. + The default is L{quotedString}, but if no expressions are to be ignored, + then pass C{None} for this argument. + + Example:: + data_type = oneOf("void int short long char float double") + decl_data_type = Combine(data_type + Optional(Word('*'))) + ident = Word(alphas+'_', alphanums+'_') + number = pyparsing_common.number + arg = Group(decl_data_type + ident) + LPAR,RPAR = map(Suppress, "()") + + code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) + + c_function = (decl_data_type("type") + + ident("name") + + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + + code_body("body")) + c_function.ignore(cStyleComment) + + source_code = ''' + int is_odd(int x) { + return (x%2); + } + + int dec_to_hex(char hchar) { + if (hchar >= '0' && hchar <= '9') { + return (ord(hchar)-ord('0')); + } else { + return (10+ord(hchar)-ord('A')); + } + } + ''' + for func in c_function.searchString(source_code): + print("%(name)s (%(type)s) args: %(args)s" % func) + + prints:: + is_odd (int) args: [['int', 'x']] + dec_to_hex (int) args: [['char', 'hchar']] """ if opener == closer: raise ValueError("opening and closing strings cannot be the same") @@ -3697,23 +5195,86 @@ def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.cop ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) else: ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) + ret.setName('nested %s%s expression' % (opener,closer)) return ret def indentedBlock(blockStatementExpr, indentStack, indent=True): - """Helper method for defining space-delimited indentation blocks, such as - those used to define block statements in Python source code. + """ + Helper method for defining space-delimited indentation blocks, such as + those used to define block statements in Python source code. - Parameters: - - blockStatementExpr - expression defining syntax of statement that + Parameters: + - blockStatementExpr - expression defining syntax of statement that is repeated within the indented block - - indentStack - list created by caller to manage indentation stack + - indentStack - list created by caller to manage indentation stack (multiple statementWithIndentedBlock expressions within a single grammar should share a common indentStack) - - indent - boolean indicating whether block must be indented beyond the + - indent - boolean indicating whether block must be indented beyond the the current level; set to False for block of left-most statements - (default=True) + (default=C{True}) - A valid block must contain at least one C{blockStatement}. + A valid block must contain at least one C{blockStatement}. + + Example:: + data = ''' + def A(z): + A1 + B = 100 + G = A2 + A2 + A3 + B + def BB(a,b,c): + BB1 + def BBA(): + bba1 + bba2 + bba3 + C + D + def spam(x,y): + def eggs(z): + pass + ''' + + + indentStack = [1] + stmt = Forward() + + identifier = Word(alphas, alphanums) + funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") + func_body = indentedBlock(stmt, indentStack) + funcDef = Group( funcDecl + func_body ) + + rvalue = Forward() + funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") + rvalue << (funcCall | identifier | Word(nums)) + assignment = Group(identifier + "=" + rvalue) + stmt << ( funcDef | assignment | identifier ) + + module_body = OneOrMore(stmt) + + parseTree = module_body.parseString(data) + parseTree.pprint() + prints:: + [['def', + 'A', + ['(', 'z', ')'], + ':', + [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], + 'B', + ['def', + 'BB', + ['(', 'a', 'b', 'c', ')'], + ':', + [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], + 'C', + 'D', + ['def', + 'spam', + ['(', 'x', 'y', ')'], + ':', + [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] """ def checkPeerIndent(s,l,t): if l >= len(s): return @@ -3738,9 +5299,9 @@ def indentedBlock(blockStatementExpr, indentStack, indent=True): indentStack.pop() NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) - INDENT = Empty() + Empty().setParseAction(checkSubIndent) - PEER = Empty().setParseAction(checkPeerIndent) - UNDENT = Empty().setParseAction(checkUnindent) + INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') + PEER = Empty().setParseAction(checkPeerIndent).setName('') + UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') if indent: smExpr = Group( Optional(NL) + #~ FollowedBy(blockStatementExpr) + @@ -3749,57 +5310,387 @@ def indentedBlock(blockStatementExpr, indentStack, indent=True): smExpr = Group( Optional(NL) + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) blockStatementExpr.ignore(_bslash + LineEnd()) - return smExpr + return smExpr.setName('indented block') alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") -anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:")) -commonHTMLEntity = Combine(_L("&") + oneOf("gt lt amp nbsp quot").setResultsName("entity") +";").streamline() -_htmlEntityMap = dict(zip("gt lt amp nbsp quot".split(),'><& "')) -replaceHTMLEntity = lambda t : t.entity in _htmlEntityMap and _htmlEntityMap[t.entity] or None +anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) +_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) +commonHTMLEntity = Regex('&(?P' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") +def replaceHTMLEntity(t): + """Helper parser action to replace common HTML entities with their special characters""" + return _htmlEntityMap.get(t.entity) # it's easy to get these comment structures wrong - they're very common, so may as well make them available -cStyleComment = Regex(r"/\*(?:[^*]*\*+)+?/").setName("C style comment") +cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") +"Comment of the form C{/* ... */}" -htmlComment = Regex(r"") -restOfLine = Regex(r".*").leaveWhitespace() -dblSlashComment = Regex(r"\/\/(\\\n|.)*").setName("// comment") -cppStyleComment = Regex(r"/(?:\*(?:[^*]*\*+)+?/|/[^\n]*(?:\n[^\n]*)*?(?:(?").setName("HTML comment") +"Comment of the form C{}" + +restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") +dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") +"Comment of the form C{// ... (to end of line)}" + +cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") +"Comment of either form C{L{cStyleComment}} or C{L{dblSlashComment}}" javaStyleComment = cppStyleComment +"Same as C{L{cppStyleComment}}" + pythonStyleComment = Regex(r"#.*").setName("Python style comment") +"Comment of the form C{# ... (to end of line)}" + _commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + Optional( Word(" \t") + ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") +"""(Deprecated) Predefined expression of 1 or more printable words or quoted strings, separated by commas. + This expression is deprecated in favor of L{pyparsing_common.comma_separated_list}.""" + +# some other useful expressions - using lower-case class name since we are really using this as a namespace +class pyparsing_common: + """ + Here are some common low-level expressions that may be useful in jump-starting parser development: + - numeric forms (L{integers}, L{reals}, L{scientific notation}) + - common L{programming identifiers} + - network addresses (L{MAC}, L{IPv4}, L{IPv6}) + - ISO8601 L{dates} and L{datetime} + - L{UUID} + - L{comma-separated list} + Parse actions: + - C{L{convertToInteger}} + - C{L{convertToFloat}} + - C{L{convertToDate}} + - C{L{convertToDatetime}} + - C{L{stripHTMLTags}} + - C{L{upcaseTokens}} + - C{L{downcaseTokens}} + + Example:: + pyparsing_common.number.runTests(''' + # any int or real number, returned as the appropriate type + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.fnumber.runTests(''' + # any int or real number, returned as float + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.hex_integer.runTests(''' + # hex numbers + 100 + FF + ''') + + pyparsing_common.fraction.runTests(''' + # fractions + 1/2 + -3/4 + ''') + + pyparsing_common.mixed_integer.runTests(''' + # mixed fractions + 1 + 1/2 + -3/4 + 1-3/4 + ''') + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(''' + # uuid + 12345678-1234-5678-1234-567812345678 + ''') + prints:: + # any int or real number, returned as the appropriate type + 100 + [100] + + -100 + [-100] + + +100 + [100] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # any int or real number, returned as float + 100 + [100.0] + + -100 + [-100.0] + + +100 + [100.0] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # hex numbers + 100 + [256] + + FF + [255] + + # fractions + 1/2 + [0.5] + + -3/4 + [-0.75] + + # mixed fractions + 1 + [1] + + 1/2 + [0.5] + + -3/4 + [-0.75] + + 1-3/4 + [1.75] + + # uuid + 12345678-1234-5678-1234-567812345678 + [UUID('12345678-1234-5678-1234-567812345678')] + """ + + convertToInteger = tokenMap(int) + """ + Parse action for converting parsed integers to Python int + """ + + convertToFloat = tokenMap(float) + """ + Parse action for converting parsed numbers to Python float + """ + + integer = Word(nums).setName("integer").setParseAction(convertToInteger) + """expression that parses an unsigned integer, returns an int""" + + hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) + """expression that parses a hexadecimal integer, returns an int""" + + signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) + """expression that parses an integer with optional leading sign, returns an int""" + + fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") + """fractional expression of an integer divided by an integer, returns a float""" + fraction.addParseAction(lambda t: t[0]/t[-1]) + + mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") + """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" + mixed_integer.addParseAction(sum) + + real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) + """expression that parses a floating point number and returns a float""" + + sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) + """expression that parses a floating point number with optional scientific notation and returns a float""" + + # streamlining this expression makes the docs nicer-looking + number = (sci_real | real | signed_integer).streamline() + """any numeric expression, returns the corresponding Python type""" + + fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) + """any int or real number, returned as float""" + + identifier = Word(alphas+'_', alphanums+'_').setName("identifier") + """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" + + ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") + "IPv4 address (C{0.0.0.0 - 255.255.255.255})" + + _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") + _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") + _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") + _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) + _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") + ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") + "IPv6 address (long, short, or mixed form)" + + mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") + "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" + + @staticmethod + def convertToDate(fmt="%Y-%m-%d"): + """ + Helper to create a parse action for converting parsed date string to Python datetime.date + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"}) + + Example:: + date_expr = pyparsing_common.iso8601_date.copy() + date_expr.setParseAction(pyparsing_common.convertToDate()) + print(date_expr.parseString("1999-12-31")) + prints:: + [datetime.date(1999, 12, 31)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt).date() + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + @staticmethod + def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): + """ + Helper to create a parse action for converting parsed datetime string to Python datetime.datetime + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"}) + + Example:: + dt_expr = pyparsing_common.iso8601_datetime.copy() + dt_expr.setParseAction(pyparsing_common.convertToDatetime()) + print(dt_expr.parseString("1999-12-31T23:59:59.999")) + prints:: + [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt) + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + iso8601_date = Regex(r'(?P\d{4})(?:-(?P\d\d)(?:-(?P\d\d))?)?').setName("ISO8601 date") + "ISO8601 date (C{yyyy-mm-dd})" + + iso8601_datetime = Regex(r'(?P\d{4})-(?P\d\d)-(?P\d\d)[T ](?P\d\d):(?P\d\d)(:(?P\d\d(\.\d*)?)?)?(?PZ|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") + "ISO8601 datetime (C{yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)}) - trailing seconds, milliseconds, and timezone optional; accepts separating C{'T'} or C{' '}" + + uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") + "UUID (C{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx})" + + _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() + @staticmethod + def stripHTMLTags(s, l, tokens): + """ + Parse action to remove HTML tags from web page HTML source + + Example:: + # strip HTML links from normal text + text = 'More info at the
pyparsing wiki page' + td,td_end = makeHTMLTags("TD") + table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end + + print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page' + """ + return pyparsing_common._html_stripper.transformString(tokens[0]) + + _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') + + Optional( White(" \t") ) ) ).streamline().setName("commaItem") + comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") + """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" + + upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) + """Parse action to convert tokens to upper case.""" + + downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) + """Parse action to convert tokens to lower case.""" if __name__ == "__main__": - selectToken = CaselessLiteral( "select" ) - fromToken = CaselessLiteral( "from" ) + selectToken = CaselessLiteral("select") + fromToken = CaselessLiteral("from") - ident = Word( alphas, alphanums + "_$" ) - columnName = delimitedList( ident, ".", combine=True ).setParseAction( upcaseTokens ) - columnNameList = Group( delimitedList( columnName ) ).setName("columns") - tableName = delimitedList( ident, ".", combine=True ).setParseAction( upcaseTokens ) - tableNameList = Group( delimitedList( tableName ) ).setName("tables") - simpleSQL = ( selectToken + \ - ( '*' | columnNameList ).setResultsName( "columns" ) + \ - fromToken + \ - tableNameList.setResultsName( "tables" ) ) + ident = Word(alphas, alphanums + "_$") - simpleSQL.runTests("""\ - SELECT * from XYZZY, ABC - select * from SYS.XYZZY - Select A from Sys.dual - Select AA,BB,CC from Sys.dual - Select A, B, C from Sys.dual - Select A, B, C from Sys.dual - Xelect A, B, C from Sys.dual - Select A, B, C frox Sys.dual - Select - Select ^^^ frox Sys.dual - Select A, B, C from Sys.dual, Table2""") + columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + columnNameList = Group(delimitedList(columnName)).setName("columns") + columnSpec = ('*' | columnNameList) + + tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + tableNameList = Group(delimitedList(tableName)).setName("tables") + simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") + + # demo runTests method, including embedded comments in test string + simpleSQL.runTests(""" + # '*' as column list and dotted table name + select * from SYS.XYZZY + + # caseless match on "SELECT", and casts back to "select" + SELECT * from XYZZY, ABC + + # list of column names, and mixed case SELECT keyword + Select AA,BB,CC from Sys.dual + + # multiple tables + Select A, B, C from Sys.dual, Table2 + + # invalid SELECT keyword - should fail + Xelect A, B, C from Sys.dual + + # incomplete command - should fail + Select + + # invalid column name - should fail + Select ^^^ frox Sys.dual + + """) + + pyparsing_common.number.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + # any int or real number, returned as float + pyparsing_common.fnumber.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + pyparsing_common.hex_integer.runTests(""" + 100 + FF + """) + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(""" + 12345678-1234-5678-1234-567812345678 + """) diff --git a/lib/python3.4/site-packages/pkg_resources/extern/__init__.py b/lib/python3.4/site-packages/pkg_resources/extern/__init__.py index 317f4b8..b4156fe 100644 --- a/lib/python3.4/site-packages/pkg_resources/extern/__init__.py +++ b/lib/python3.4/site-packages/pkg_resources/extern/__init__.py @@ -6,6 +6,7 @@ class VendorImporter: A PEP 302 meta path importer for finding optionally-vendored or otherwise naturally-installed packages from root_name. """ + def __init__(self, root_name, vendored_names=(), vendor_pkg=None): self.root_name = root_name self.vendored_names = set(vendored_names) @@ -67,5 +68,6 @@ class VendorImporter: if self not in sys.meta_path: sys.meta_path.append(self) -names = 'packaging', 'six' + +names = 'packaging', 'pyparsing', 'six', 'appdirs' VendorImporter(__name__, names).install() diff --git a/lib/python3.4/site-packages/pkg_resources/py31compat.py b/lib/python3.4/site-packages/pkg_resources/py31compat.py new file mode 100644 index 0000000..331a51b --- /dev/null +++ b/lib/python3.4/site-packages/pkg_resources/py31compat.py @@ -0,0 +1,22 @@ +import os +import errno +import sys + + +def _makedirs_31(path, exist_ok=False): + try: + os.makedirs(path) + except OSError as exc: + if not exist_ok or exc.errno != errno.EEXIST: + raise + + +# rely on compatibility behavior until mode considerations +# and exists_ok considerations are disentangled. +# See https://github.com/pypa/setuptools/pull/1083#issuecomment-315168663 +needs_makedirs = ( + sys.version_info < (3, 2, 5) or + (3, 3) <= sys.version_info < (3, 3, 6) or + (3, 4) <= sys.version_info < (3, 4, 1) +) +makedirs = _makedirs_31 if needs_makedirs else os.makedirs diff --git a/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/DESCRIPTION.rst b/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/DESCRIPTION.rst deleted file mode 100644 index c6b6a1c..0000000 --- a/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/DESCRIPTION.rst +++ /dev/null @@ -1,238 +0,0 @@ -=============================== -Installing and Using Setuptools -=============================== - -.. contents:: **Table of Contents** - - -`Change History `_. - -------------------------- -Installation Instructions -------------------------- - -The recommended way to bootstrap setuptools on any system is to download -`ez_setup.py`_ and run it using the target Python environment. Different -operating systems have different recommended techniques to accomplish this -basic routine, so below are some examples to get you started. - -Setuptools requires Python 2.6 or later. To install setuptools -on Python 2.4 or Python 2.5, use the `bootstrap script for Setuptools 1.x -`_. - -The link provided to ez_setup.py is a bookmark to bootstrap script for the -latest known stable release. - -.. _ez_setup.py: https://bootstrap.pypa.io/ez_setup.py - -Windows (Powershell 3 or later) -=============================== - -For best results, uninstall previous versions FIRST (see `Uninstalling`_). - -Using Windows 8 (which includes PowerShell 3) or earlier versions of Windows -with PowerShell 3 installed, it's possible to install with one simple -Powershell command. Start up Powershell and paste this command:: - - > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python - - -You must start the Powershell with Administrative privileges or you may choose -to install a user-local installation:: - - > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python - --user - -If you have Python 3.3 or later, you can use the ``py`` command to install to -different Python versions. For example, to install to Python 3.3 if you have -Python 2.7 installed:: - - > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | py -3 - - -The recommended way to install setuptools on Windows is to download -`ez_setup.py`_ and run it. The script will download the appropriate -distribution file and install it for you. - -Once installation is complete, you will find an ``easy_install`` program in -your Python ``Scripts`` subdirectory. For simple invocation and best results, -add this directory to your ``PATH`` environment variable, if it is not already -present. If you did a user-local install, the ``Scripts`` subdirectory is -``$env:APPDATA\Python\Scripts``. - - -Windows (simplified) -==================== - -For Windows without PowerShell 3 or for installation without a command-line, -download `ez_setup.py`_ using your preferred web browser or other technique -and "run" that file. - - -Unix (wget) -=========== - -Most Linux distributions come with wget. - -Download `ez_setup.py`_ and run it using the target Python version. The script -will download the appropriate version and install it for you:: - - > wget https://bootstrap.pypa.io/ez_setup.py -O - | python - -Note that you will may need to invoke the command with superuser privileges to -install to the system Python:: - - > wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python - -Alternatively, Setuptools may be installed to a user-local path:: - - > wget https://bootstrap.pypa.io/ez_setup.py -O - | python - --user - -Note that on some older systems (noted on Debian 6 and CentOS 5 installations), -`wget` may refuse to download `ez_setup.py`, complaining that the certificate common name `*.c.ssl.fastly.net` -does not match the host name `bootstrap.pypa.io`. In addition, the `ez_setup.py` script may then encounter similar problems using -`wget` internally to download `setuptools-x.y.zip`, complaining that the certificate common name of `www.python.org` does not match the -host name `pypi.python.org`. Those are known issues, related to a bug in the older versions of `wget` -(see `Issue 59 `_). If you happen to encounter them, -install Setuptools as follows:: - - > wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py - > python ez_setup.py --insecure - - -Unix including Mac OS X (curl) -============================== - -If your system has curl installed, follow the ``wget`` instructions but -replace ``wget`` with ``curl`` and ``-O`` with ``-o``. For example:: - - > curl https://bootstrap.pypa.io/ez_setup.py -o - | python - - -Advanced Installation -===================== - -For more advanced installation options, such as installing to custom -locations or prefixes, download and extract the source -tarball from `Setuptools on PyPI `_ -and run setup.py with any supported distutils and Setuptools options. -For example:: - - setuptools-x.x$ python setup.py install --prefix=/opt/setuptools - -Use ``--help`` to get a full options list, but we recommend consulting -the `EasyInstall manual`_ for detailed instructions, especially `the section -on custom installation locations`_. - -.. _EasyInstall manual: https://pythonhosted.org/setuptools/EasyInstall -.. _the section on custom installation locations: https://pythonhosted.org/setuptools/EasyInstall#custom-installation-locations - - -Downloads -========= - -All setuptools downloads can be found at `the project's home page in the Python -Package Index`_. Scroll to the very bottom of the page to find the links. - -.. _the project's home page in the Python Package Index: https://pypi.python.org/pypi/setuptools - -In addition to the PyPI downloads, the development version of ``setuptools`` -is available from the `Bitbucket repo`_, and in-development versions of the -`0.6 branch`_ are available as well. - -.. _Bitbucket repo: https://bitbucket.org/pypa/setuptools/get/default.tar.gz#egg=setuptools-dev -.. _0.6 branch: http://svn.python.org/projects/sandbox/branches/setuptools-0.6/#egg=setuptools-dev06 - -Uninstalling -============ - -On Windows, if Setuptools was installed using an ``.exe`` or ``.msi`` -installer, simply use the uninstall feature of "Add/Remove Programs" in the -Control Panel. - -Otherwise, to uninstall Setuptools or Distribute, regardless of the Python -version, delete all ``setuptools*`` and ``distribute*`` files and -directories from your system's ``site-packages`` directory -(and any other ``sys.path`` directories) FIRST. - -If you are upgrading or otherwise plan to re-install Setuptools or Distribute, -nothing further needs to be done. If you want to completely remove Setuptools, -you may also want to remove the 'easy_install' and 'easy_install-x.x' scripts -and associated executables installed to the Python scripts directory. - --------------------------------- -Using Setuptools and EasyInstall --------------------------------- - -Here are some of the available manuals, tutorials, and other resources for -learning about Setuptools, Python Eggs, and EasyInstall: - -* `The EasyInstall user's guide and reference manual`_ -* `The setuptools Developer's Guide`_ -* `The pkg_resources API reference`_ -* `The Internal Structure of Python Eggs`_ - -Questions, comments, and bug reports should be directed to the `distutils-sig -mailing list`_. If you have written (or know of) any tutorials, documentation, -plug-ins, or other resources for setuptools users, please let us know about -them there, so this reference list can be updated. If you have working, -*tested* patches to correct problems or add features, you may submit them to -the `setuptools bug tracker`_. - -.. _setuptools bug tracker: https://bitbucket.org/pypa/setuptools/issues -.. _The Internal Structure of Python Eggs: https://pythonhosted.org/setuptools/formats.html -.. _The setuptools Developer's Guide: https://pythonhosted.org/setuptools/setuptools.html -.. _The pkg_resources API reference: https://pythonhosted.org/setuptools/pkg_resources.html -.. _The EasyInstall user's guide and reference manual: https://pythonhosted.org/setuptools/easy_install.html -.. _distutils-sig mailing list: http://mail.python.org/pipermail/distutils-sig/ - - -------- -Credits -------- - -* The original design for the ``.egg`` format and the ``pkg_resources`` API was - co-created by Phillip Eby and Bob Ippolito. Bob also implemented the first - version of ``pkg_resources``, and supplied the OS X operating system version - compatibility algorithm. - -* Ian Bicking implemented many early "creature comfort" features of - easy_install, including support for downloading via Sourceforge and - Subversion repositories. Ian's comments on the Web-SIG about WSGI - application deployment also inspired the concept of "entry points" in eggs, - and he has given talks at PyCon and elsewhere to inform and educate the - community about eggs and setuptools. - -* Jim Fulton contributed time and effort to build automated tests of various - aspects of ``easy_install``, and supplied the doctests for the command-line - ``.exe`` wrappers on Windows. - -* Phillip J. Eby is the seminal author of setuptools, and - first proposed the idea of an importable binary distribution format for - Python application plug-ins. - -* Significant parts of the implementation of setuptools were funded by the Open - Source Applications Foundation, to provide a plug-in infrastructure for the - Chandler PIM application. In addition, many OSAF staffers (such as Mike - "Code Bear" Taylor) contributed their time and stress as guinea pigs for the - use of eggs and setuptools, even before eggs were "cool". (Thanks, guys!) - -* Tarek Ziadé is the principal author of the Distribute fork, which - re-invigorated the community on the project, encouraged renewed innovation, - and addressed many defects. - -* Since the merge with Distribute, Jason R. Coombs is the - maintainer of setuptools. The project is maintained in coordination with - the Python Packaging Authority (PyPA) and the larger Python community. - -.. _files: - - ---------------- -Code of Conduct ---------------- - -Everyone interacting in the setuptools project's codebases, issue trackers, -chat rooms, and mailing lists is expected to follow the -`PyPA Code of Conduct`_. - -.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ - - diff --git a/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/METADATA b/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/METADATA deleted file mode 100644 index 16d3c14..0000000 --- a/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/METADATA +++ /dev/null @@ -1,267 +0,0 @@ -Metadata-Version: 2.0 -Name: setuptools -Version: 20.3.1 -Summary: Easily download, build, install, upgrade, and uninstall Python packages -Home-page: https://bitbucket.org/pypa/setuptools -Author: Python Packaging Authority -Author-email: distutils-sig@python.org -License: UNKNOWN -Keywords: CPAN PyPI distutils eggs package management -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: System :: Archiving :: Packaging -Classifier: Topic :: System :: Systems Administration -Classifier: Topic :: Utilities -Provides-Extra: certs -Requires-Dist: certifi (==2015.11.20); extra == 'certs' -Provides-Extra: ssl -Requires-Dist: wincertstore (==0.2); sys_platform=='win32' and extra == 'ssl' - -=============================== -Installing and Using Setuptools -=============================== - -.. contents:: **Table of Contents** - - -`Change History `_. - -------------------------- -Installation Instructions -------------------------- - -The recommended way to bootstrap setuptools on any system is to download -`ez_setup.py`_ and run it using the target Python environment. Different -operating systems have different recommended techniques to accomplish this -basic routine, so below are some examples to get you started. - -Setuptools requires Python 2.6 or later. To install setuptools -on Python 2.4 or Python 2.5, use the `bootstrap script for Setuptools 1.x -`_. - -The link provided to ez_setup.py is a bookmark to bootstrap script for the -latest known stable release. - -.. _ez_setup.py: https://bootstrap.pypa.io/ez_setup.py - -Windows (Powershell 3 or later) -=============================== - -For best results, uninstall previous versions FIRST (see `Uninstalling`_). - -Using Windows 8 (which includes PowerShell 3) or earlier versions of Windows -with PowerShell 3 installed, it's possible to install with one simple -Powershell command. Start up Powershell and paste this command:: - - > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python - - -You must start the Powershell with Administrative privileges or you may choose -to install a user-local installation:: - - > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python - --user - -If you have Python 3.3 or later, you can use the ``py`` command to install to -different Python versions. For example, to install to Python 3.3 if you have -Python 2.7 installed:: - - > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | py -3 - - -The recommended way to install setuptools on Windows is to download -`ez_setup.py`_ and run it. The script will download the appropriate -distribution file and install it for you. - -Once installation is complete, you will find an ``easy_install`` program in -your Python ``Scripts`` subdirectory. For simple invocation and best results, -add this directory to your ``PATH`` environment variable, if it is not already -present. If you did a user-local install, the ``Scripts`` subdirectory is -``$env:APPDATA\Python\Scripts``. - - -Windows (simplified) -==================== - -For Windows without PowerShell 3 or for installation without a command-line, -download `ez_setup.py`_ using your preferred web browser or other technique -and "run" that file. - - -Unix (wget) -=========== - -Most Linux distributions come with wget. - -Download `ez_setup.py`_ and run it using the target Python version. The script -will download the appropriate version and install it for you:: - - > wget https://bootstrap.pypa.io/ez_setup.py -O - | python - -Note that you will may need to invoke the command with superuser privileges to -install to the system Python:: - - > wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python - -Alternatively, Setuptools may be installed to a user-local path:: - - > wget https://bootstrap.pypa.io/ez_setup.py -O - | python - --user - -Note that on some older systems (noted on Debian 6 and CentOS 5 installations), -`wget` may refuse to download `ez_setup.py`, complaining that the certificate common name `*.c.ssl.fastly.net` -does not match the host name `bootstrap.pypa.io`. In addition, the `ez_setup.py` script may then encounter similar problems using -`wget` internally to download `setuptools-x.y.zip`, complaining that the certificate common name of `www.python.org` does not match the -host name `pypi.python.org`. Those are known issues, related to a bug in the older versions of `wget` -(see `Issue 59 `_). If you happen to encounter them, -install Setuptools as follows:: - - > wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py - > python ez_setup.py --insecure - - -Unix including Mac OS X (curl) -============================== - -If your system has curl installed, follow the ``wget`` instructions but -replace ``wget`` with ``curl`` and ``-O`` with ``-o``. For example:: - - > curl https://bootstrap.pypa.io/ez_setup.py -o - | python - - -Advanced Installation -===================== - -For more advanced installation options, such as installing to custom -locations or prefixes, download and extract the source -tarball from `Setuptools on PyPI `_ -and run setup.py with any supported distutils and Setuptools options. -For example:: - - setuptools-x.x$ python setup.py install --prefix=/opt/setuptools - -Use ``--help`` to get a full options list, but we recommend consulting -the `EasyInstall manual`_ for detailed instructions, especially `the section -on custom installation locations`_. - -.. _EasyInstall manual: https://pythonhosted.org/setuptools/EasyInstall -.. _the section on custom installation locations: https://pythonhosted.org/setuptools/EasyInstall#custom-installation-locations - - -Downloads -========= - -All setuptools downloads can be found at `the project's home page in the Python -Package Index`_. Scroll to the very bottom of the page to find the links. - -.. _the project's home page in the Python Package Index: https://pypi.python.org/pypi/setuptools - -In addition to the PyPI downloads, the development version of ``setuptools`` -is available from the `Bitbucket repo`_, and in-development versions of the -`0.6 branch`_ are available as well. - -.. _Bitbucket repo: https://bitbucket.org/pypa/setuptools/get/default.tar.gz#egg=setuptools-dev -.. _0.6 branch: http://svn.python.org/projects/sandbox/branches/setuptools-0.6/#egg=setuptools-dev06 - -Uninstalling -============ - -On Windows, if Setuptools was installed using an ``.exe`` or ``.msi`` -installer, simply use the uninstall feature of "Add/Remove Programs" in the -Control Panel. - -Otherwise, to uninstall Setuptools or Distribute, regardless of the Python -version, delete all ``setuptools*`` and ``distribute*`` files and -directories from your system's ``site-packages`` directory -(and any other ``sys.path`` directories) FIRST. - -If you are upgrading or otherwise plan to re-install Setuptools or Distribute, -nothing further needs to be done. If you want to completely remove Setuptools, -you may also want to remove the 'easy_install' and 'easy_install-x.x' scripts -and associated executables installed to the Python scripts directory. - --------------------------------- -Using Setuptools and EasyInstall --------------------------------- - -Here are some of the available manuals, tutorials, and other resources for -learning about Setuptools, Python Eggs, and EasyInstall: - -* `The EasyInstall user's guide and reference manual`_ -* `The setuptools Developer's Guide`_ -* `The pkg_resources API reference`_ -* `The Internal Structure of Python Eggs`_ - -Questions, comments, and bug reports should be directed to the `distutils-sig -mailing list`_. If you have written (or know of) any tutorials, documentation, -plug-ins, or other resources for setuptools users, please let us know about -them there, so this reference list can be updated. If you have working, -*tested* patches to correct problems or add features, you may submit them to -the `setuptools bug tracker`_. - -.. _setuptools bug tracker: https://bitbucket.org/pypa/setuptools/issues -.. _The Internal Structure of Python Eggs: https://pythonhosted.org/setuptools/formats.html -.. _The setuptools Developer's Guide: https://pythonhosted.org/setuptools/setuptools.html -.. _The pkg_resources API reference: https://pythonhosted.org/setuptools/pkg_resources.html -.. _The EasyInstall user's guide and reference manual: https://pythonhosted.org/setuptools/easy_install.html -.. _distutils-sig mailing list: http://mail.python.org/pipermail/distutils-sig/ - - -------- -Credits -------- - -* The original design for the ``.egg`` format and the ``pkg_resources`` API was - co-created by Phillip Eby and Bob Ippolito. Bob also implemented the first - version of ``pkg_resources``, and supplied the OS X operating system version - compatibility algorithm. - -* Ian Bicking implemented many early "creature comfort" features of - easy_install, including support for downloading via Sourceforge and - Subversion repositories. Ian's comments on the Web-SIG about WSGI - application deployment also inspired the concept of "entry points" in eggs, - and he has given talks at PyCon and elsewhere to inform and educate the - community about eggs and setuptools. - -* Jim Fulton contributed time and effort to build automated tests of various - aspects of ``easy_install``, and supplied the doctests for the command-line - ``.exe`` wrappers on Windows. - -* Phillip J. Eby is the seminal author of setuptools, and - first proposed the idea of an importable binary distribution format for - Python application plug-ins. - -* Significant parts of the implementation of setuptools were funded by the Open - Source Applications Foundation, to provide a plug-in infrastructure for the - Chandler PIM application. In addition, many OSAF staffers (such as Mike - "Code Bear" Taylor) contributed their time and stress as guinea pigs for the - use of eggs and setuptools, even before eggs were "cool". (Thanks, guys!) - -* Tarek Ziadé is the principal author of the Distribute fork, which - re-invigorated the community on the project, encouraged renewed innovation, - and addressed many defects. - -* Since the merge with Distribute, Jason R. Coombs is the - maintainer of setuptools. The project is maintained in coordination with - the Python Packaging Authority (PyPA) and the larger Python community. - -.. _files: - - ---------------- -Code of Conduct ---------------- - -Everyone interacting in the setuptools project's codebases, issue trackers, -chat rooms, and mailing lists is expected to follow the -`PyPA Code of Conduct`_. - -.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ - - diff --git a/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/RECORD b/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/RECORD deleted file mode 100644 index c9d3645..0000000 --- a/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/RECORD +++ /dev/null @@ -1,137 +0,0 @@ -easy_install.py,sha256=MDC9vt5AxDsXX5qcKlBz2TnW6Tpuv_AobnfhCJ9X3PM,126 -pkg_resources/__init__.py,sha256=QyiRSbbmXDCq2O3AIG9V-AjGJinvd3ImWCKsaucVneA,100439 -pkg_resources/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pkg_resources/_vendor/pyparsing.py,sha256=ic8qmDPiq8Li-Y0PeZcI56rEyMqevKNBK6hr6FbyVBc,160425 -pkg_resources/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 -pkg_resources/_vendor/packaging/__about__.py,sha256=AEwkfVSNgMMAAugtYao7b7wah9XryokeoXBuIw4h6d8,720 -pkg_resources/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 -pkg_resources/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 -pkg_resources/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416 -pkg_resources/_vendor/packaging/markers.py,sha256=0Z2in1kNfYn93n9uJj0hNEmu-sJpEQpa_qAbxpYXdS4,7359 -pkg_resources/_vendor/packaging/requirements.py,sha256=SikL2UynbsT0qtY9ltqngndha_sfo0w6XGFhAhoSoaQ,4355 -pkg_resources/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025 -pkg_resources/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421 -pkg_resources/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556 -pkg_resources/extern/__init__.py,sha256=rMBTxKimjNg8plSH94cB-y52pKO0zmM-AkFL30lZGfY,2474 -setuptools/__init__.py,sha256=WEGb6BRGN2dz3eJTbNRUfInUAhb6_OZJyYAndPGJm6w,5440 -setuptools/archive_util.py,sha256=N30WE5ZQjkytzhAodAXw4FkK-9J5AP1ChrClHnZthOA,6609 -setuptools/cli-32.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536 -setuptools/cli-64.exe,sha256=KLABu5pyrnokJCv6skjXZ6GsXeyYHGcqOUT3oHI3Xpo,74752 -setuptools/cli-arm-32.exe,sha256=0pFNIi2SmY2gdY91Y4LRhj1wuBsnv5cG1fus3iBJv40,69120 -setuptools/cli.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536 -setuptools/depends.py,sha256=WyJIhjIX7D5-JpGSnMAPHEoDcVPQxaO0405keTQT6jM,6418 -setuptools/dist.py,sha256=txOleyyt2xCSTkUjCGW4MYZB8a1xsbC8MulDhSnoivQ,35701 -setuptools/extension.py,sha256=YvsyGHWVWzhNOXMHU239FR14wxw2WwdMLLzWsRP6_IY,1694 -setuptools/gui-32.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536 -setuptools/gui-64.exe,sha256=aYKMhX1IJLn4ULHgWX0sE0yREUt6B3TEHf_jOw6yNyE,75264 -setuptools/gui-arm-32.exe,sha256=R5gRWLkY7wvO_CVGxoi7LZVTv0h-DKsKScy6fkbp4XI,69120 -setuptools/gui.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536 -setuptools/launch.py,sha256=hP3qZxDNu5Hf9C-VAkEP4IC_YYfR1XfxMTj6EguxxCg,730 -setuptools/lib2to3_ex.py,sha256=6jPF9sJuHiz0cyg4cwIBLl2VMAxcl3GYSZwWAOuJplU,1998 -setuptools/msvc9_support.py,sha256=fo2vjb-dna1SEuHezQCTuelCo6XFBv5cqaI56ABJ1vw,2187 -setuptools/package_index.py,sha256=T6tZGPHApup6Gl3kz1sCLtY7kmMUXLBKweSAORYS2Qc,39490 -setuptools/py26compat.py,sha256=1Vvuf-hj5bTM3OAXv6vgJQImulne12ann053caOgikU,481 -setuptools/py27compat.py,sha256=CGj-jZcFgHUkrEdLvArkxHj96tAaMbG2-yJtUVU7QVI,306 -setuptools/py31compat.py,sha256=cqYSVBd2pxvKl75185z40htfEr6EKC29KvSBiSoqHOA,1636 -setuptools/sandbox.py,sha256=tuMRu_8R0_w6Qer9VqDiOTqKy1qr_GjHi-2QAg7TMz0,14210 -setuptools/script (dev).tmpl,sha256=f7MR17dTkzaqkCMSVseyOCMVrPVSMdmTQsaB8cZzfuI,201 -setuptools/script.tmpl,sha256=WGTt5piezO27c-Dbx6l5Q4T3Ff20A5z7872hv3aAhYY,138 -setuptools/site-patch.py,sha256=K-0-cAx36mX_PG-qPZwosG9ZLCliRjquKQ4nHiJvvzg,2389 -setuptools/ssl_support.py,sha256=tAFeeyFPVle_GgarPkNrdfnCJgP9PyN_QYGXTgypoyc,8119 -setuptools/unicode_utils.py,sha256=8zVyrL_MFc6P5AmErs21rr7z-3N1pZ_NkOcDC7BPElU,995 -setuptools/utils.py,sha256=08Z7mt-9mvrx-XvmS5EyKoRn2lxNTlgFsUwBU3Eq9JQ,293 -setuptools/version.py,sha256=xArPY4wg3eOL9kWjMciQnbhiJsQ73H8SieeRtCDrSsU,23 -setuptools/windows_support.py,sha256=5GrfqSP2-dLGJoZTq2g6dCKkyQxxa2n5IQiXlJCoYEE,714 -setuptools/command/__init__.py,sha256=1AM3hv_zCixE7kTXA-onWfK_2KF8GC8fUw3WSxzi5Fg,564 -setuptools/command/alias.py,sha256=KjpE0sz_SDIHv3fpZcIQK-sCkJz-SrC6Gmug6b9Nkc8,2426 -setuptools/command/bdist_egg.py,sha256=Km4CsGbevhvej6kKEfvTYxfkPoQijUyXmImNifrO4Tg,17184 -setuptools/command/bdist_rpm.py,sha256=B7l0TnzCGb-0nLlm6rS00jWLkojASwVmdhW2w5Qz_Ak,1508 -setuptools/command/bdist_wininst.py,sha256=_6dz3lpB1tY200LxKPLM7qgwTCceOMgaWFF-jW2-pm0,637 -setuptools/command/build_ext.py,sha256=pkQ8xp3YPVGGLkGv-SvfxC_GqFpboph1AFEoMFOgQMo,11964 -setuptools/command/build_py.py,sha256=HvJ88JuougDccaowYlfMV12kYtd0GLahg2DR2vQRqL4,7983 -setuptools/command/develop.py,sha256=VxSYbpM2jQqtRBn5klIjPVBo3sWKNZMlSbHHiRLUlZo,7383 -setuptools/command/easy_install.py,sha256=_rqkt0iWctAjMn7Z2wEYTICMntcUaV28iN6cfKrpQ28,85913 -setuptools/command/egg_info.py,sha256=0_8eI8hgLAlGt8Xk5kiodY_d9lxG6_RSescJISKBJgA,16890 -setuptools/command/install.py,sha256=QwaFiZRU3ytIHoPh8uJ9EqV3Fu9C4ca4B7UGAo95tws,4685 -setuptools/command/install_egg_info.py,sha256=8J_cH4VbOJv-9Wey8Ijw5SnNI7YS_CA2IKYX569mP5Q,4035 -setuptools/command/install_lib.py,sha256=rWcysInRJHVzgneY41EKW3kW3-dR2q2CvyPzul5ASAk,3839 -setuptools/command/install_scripts.py,sha256=vX2JC6v7l090N7CrTfihWBklNbPvfNKAY2LRtukM9XE,2231 -setuptools/command/launcher manifest.xml,sha256=xlLbjWrB01tKC0-hlVkOKkiSPbzMml2eOPtJ_ucCnbE,628 -setuptools/command/register.py,sha256=bHlMm1qmBbSdahTOT8w6UhA-EgeQIz7p6cD-qOauaiI,270 -setuptools/command/rotate.py,sha256=QGZS2t4CmBl7t79KQijNCjRMU50lu3nRhu4FXWB5LIE,2038 -setuptools/command/saveopts.py,sha256=za7QCBcQimKKriWcoCcbhxPjUz30gSB74zuTL47xpP4,658 -setuptools/command/sdist.py,sha256=kQetnPMw6ao3nurWGJZgS4HkOH4AknzMOSvqbVA6jGA,7050 -setuptools/command/setopt.py,sha256=cygJaJWJmiVhR0e_Uh_0_fWyCxMJIqK-Bu6K0LyYUtU,5086 -setuptools/command/test.py,sha256=N2f5RwxkjwU3YQzFYHtzHr636-pdX9XJDuPg5Y92kSo,6888 -setuptools/command/upload.py,sha256=OjAryq4ZoARZiaTN_MpuG1X8Pu9CJNCKmmbMg-gab5I,649 -setuptools/command/upload_docs.py,sha256=htXpASci5gKP0RIrGZRRmbll7RnTRuwvKWZkYsBlDMM,6815 -setuptools/extern/__init__.py,sha256=mTrrj4yLMdFeEwwnqKnSuvZM5RM-HPZ1iXLgaYDlB9o,132 -setuptools-20.3.1.dist-info/DESCRIPTION.rst,sha256=MDsJej8DPV2OKpAKpu74g-2xksRd-uGTeZn4W7D1dnI,9940 -setuptools-20.3.1.dist-info/METADATA,sha256=c4yrbKrKA0BxICkR7iP79IHXigHPhWNy70y-Fq-ybKs,11173 -setuptools-20.3.1.dist-info/RECORD,, -setuptools-20.3.1.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 -setuptools-20.3.1.dist-info/dependency_links.txt,sha256=oUNXJEArClXFiSSvfFwUKY8TYjeIXhuFfCpXn5K0DCE,226 -setuptools-20.3.1.dist-info/entry_points.txt,sha256=revbaRBbkZ2b1B-hZlAXo_18J9GjdYHgA4DoW8wdTOU,2835 -setuptools-20.3.1.dist-info/metadata.json,sha256=Kj9x1vkm8jQKLu3ywdXgeNTtyBmWFbp6KvF528_C5N4,4636 -setuptools-20.3.1.dist-info/top_level.txt,sha256=2HUXVVwA4Pff1xgTFr3GsTXXKaPaO6vlG6oNJ_4u4Tg,38 -setuptools-20.3.1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 -../../../bin/easy_install,sha256=LopKneUXvnG_dqCSZe6amF-Bf4WEh1ny0uo28w2_nQ0,299 -../../../bin/easy_install-3.4,sha256=LopKneUXvnG_dqCSZe6amF-Bf4WEh1ny0uo28w2_nQ0,299 -setuptools-20.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -setuptools/command/__pycache__/bdist_wininst.cpython-34.pyc,, -setuptools/__pycache__/dist.cpython-34.pyc,, -pkg_resources/_vendor/__pycache__/__init__.cpython-34.pyc,, -setuptools/command/__pycache__/sdist.cpython-34.pyc,, -setuptools/__pycache__/launch.cpython-34.pyc,, -setuptools/__pycache__/version.cpython-34.pyc,, -setuptools/extern/__pycache__/__init__.cpython-34.pyc,, -setuptools/command/__pycache__/saveopts.cpython-34.pyc,, -setuptools/command/__pycache__/easy_install.cpython-34.pyc,, -setuptools/command/__pycache__/rotate.cpython-34.pyc,, -setuptools/command/__pycache__/develop.cpython-34.pyc,, -pkg_resources/_vendor/packaging/__pycache__/markers.cpython-34.pyc,, -setuptools/command/__pycache__/build_ext.cpython-34.pyc,, -__pycache__/easy_install.cpython-34.pyc,, -setuptools/command/__pycache__/egg_info.cpython-34.pyc,, -setuptools/__pycache__/utils.cpython-34.pyc,, -pkg_resources/extern/__pycache__/__init__.cpython-34.pyc,, -setuptools/__pycache__/windows_support.cpython-34.pyc,, -setuptools/__pycache__/py26compat.cpython-34.pyc,, -setuptools/command/__pycache__/bdist_rpm.cpython-34.pyc,, -setuptools/__pycache__/__init__.cpython-34.pyc,, -pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-34.pyc,, -setuptools/__pycache__/extension.cpython-34.pyc,, -setuptools/command/__pycache__/__init__.cpython-34.pyc,, -setuptools/__pycache__/msvc9_support.cpython-34.pyc,, -setuptools/__pycache__/py27compat.cpython-34.pyc,, -pkg_resources/_vendor/__pycache__/six.cpython-34.pyc,, -setuptools/__pycache__/ssl_support.cpython-34.pyc,, -setuptools/command/__pycache__/upload_docs.cpython-34.pyc,, -setuptools/command/__pycache__/install_scripts.cpython-34.pyc,, -pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-34.pyc,, -setuptools/command/__pycache__/build_py.cpython-34.pyc,, -setuptools/__pycache__/sandbox.cpython-34.pyc,, -pkg_resources/__pycache__/__init__.cpython-34.pyc,, -setuptools/command/__pycache__/install.cpython-34.pyc,, -pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-34.pyc,, -setuptools/command/__pycache__/alias.cpython-34.pyc,, -setuptools/command/__pycache__/install_egg_info.cpython-34.pyc,, -pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-34.pyc,, -setuptools/__pycache__/unicode_utils.cpython-34.pyc,, -pkg_resources/_vendor/__pycache__/pyparsing.cpython-34.pyc,, -setuptools/__pycache__/depends.cpython-34.pyc,, -setuptools/__pycache__/site-patch.cpython-34.pyc,, -setuptools/command/__pycache__/setopt.cpython-34.pyc,, -setuptools/command/__pycache__/register.cpython-34.pyc,, -pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-34.pyc,, -pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-34.pyc,, -setuptools/command/__pycache__/upload.cpython-34.pyc,, -setuptools/__pycache__/lib2to3_ex.cpython-34.pyc,, -setuptools/command/__pycache__/install_lib.cpython-34.pyc,, -pkg_resources/_vendor/packaging/__pycache__/version.cpython-34.pyc,, -setuptools/__pycache__/py31compat.cpython-34.pyc,, -setuptools/command/__pycache__/test.cpython-34.pyc,, -setuptools/__pycache__/archive_util.cpython-34.pyc,, -setuptools/__pycache__/package_index.cpython-34.pyc,, -setuptools/command/__pycache__/bdist_egg.cpython-34.pyc,, -pkg_resources/_vendor/packaging/__pycache__/utils.cpython-34.pyc,, diff --git a/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/dependency_links.txt b/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/dependency_links.txt deleted file mode 100644 index 47d1e81..0000000 --- a/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/dependency_links.txt +++ /dev/null @@ -1,2 +0,0 @@ -https://pypi.python.org/packages/source/c/certifi/certifi-2015.11.20.tar.gz#md5=25134646672c695c1ff1593c2dd75d08 -https://pypi.python.org/packages/source/w/wincertstore/wincertstore-0.2.zip#md5=ae728f2f007185648d0c7a8679b361e2 diff --git a/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/entry_points.txt b/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/entry_points.txt deleted file mode 100644 index 924fed8..0000000 --- a/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/entry_points.txt +++ /dev/null @@ -1,62 +0,0 @@ -[console_scripts] -easy_install = setuptools.command.easy_install:main -easy_install-3.5 = setuptools.command.easy_install:main - -[distutils.commands] -alias = setuptools.command.alias:alias -bdist_egg = setuptools.command.bdist_egg:bdist_egg -bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm -bdist_wininst = setuptools.command.bdist_wininst:bdist_wininst -build_ext = setuptools.command.build_ext:build_ext -build_py = setuptools.command.build_py:build_py -develop = setuptools.command.develop:develop -easy_install = setuptools.command.easy_install:easy_install -egg_info = setuptools.command.egg_info:egg_info -install = setuptools.command.install:install -install_egg_info = setuptools.command.install_egg_info:install_egg_info -install_lib = setuptools.command.install_lib:install_lib -install_scripts = setuptools.command.install_scripts:install_scripts -register = setuptools.command.register:register -rotate = setuptools.command.rotate:rotate -saveopts = setuptools.command.saveopts:saveopts -sdist = setuptools.command.sdist:sdist -setopt = setuptools.command.setopt:setopt -test = setuptools.command.test:test -upload = setuptools.command.upload:upload -upload_docs = setuptools.command.upload_docs:upload_docs - -[distutils.setup_keywords] -convert_2to3_doctests = setuptools.dist:assert_string_list -dependency_links = setuptools.dist:assert_string_list -eager_resources = setuptools.dist:assert_string_list -entry_points = setuptools.dist:check_entry_points -exclude_package_data = setuptools.dist:check_package_data -extras_require = setuptools.dist:check_extras -include_package_data = setuptools.dist:assert_bool -install_requires = setuptools.dist:check_requirements -namespace_packages = setuptools.dist:check_nsp -package_data = setuptools.dist:check_package_data -packages = setuptools.dist:check_packages -setup_requires = setuptools.dist:check_requirements -test_loader = setuptools.dist:check_importable -test_runner = setuptools.dist:check_importable -test_suite = setuptools.dist:check_test_suite -tests_require = setuptools.dist:check_requirements -use_2to3 = setuptools.dist:assert_bool -use_2to3_exclude_fixers = setuptools.dist:assert_string_list -use_2to3_fixers = setuptools.dist:assert_string_list -zip_safe = setuptools.dist:assert_bool - -[egg_info.writers] -PKG-INFO = setuptools.command.egg_info:write_pkg_info -dependency_links.txt = setuptools.command.egg_info:overwrite_arg -depends.txt = setuptools.command.egg_info:warn_depends_obsolete -eager_resources.txt = setuptools.command.egg_info:overwrite_arg -entry_points.txt = setuptools.command.egg_info:write_entries -namespace_packages.txt = setuptools.command.egg_info:overwrite_arg -requires.txt = setuptools.command.egg_info:write_requirements -top_level.txt = setuptools.command.egg_info:write_toplevel_names - -[setuptools.installation] -eggsecutable = setuptools.command.easy_install:bootstrap - diff --git a/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/metadata.json b/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/metadata.json deleted file mode 100644 index 1fbf63f..0000000 --- a/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Archiving :: Packaging", "Topic :: System :: Systems Administration", "Topic :: Utilities"], "extensions": {"python.commands": {"wrap_console": {"easy_install": "setuptools.command.easy_install:main", "easy_install-3.5": "setuptools.command.easy_install:main"}}, "python.details": {"contacts": [{"email": "distutils-sig@python.org", "name": "Python Packaging Authority", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://bitbucket.org/pypa/setuptools"}}, "python.exports": {"console_scripts": {"easy_install": "setuptools.command.easy_install:main", "easy_install-3.5": "setuptools.command.easy_install:main"}, "distutils.commands": {"alias": "setuptools.command.alias:alias", "bdist_egg": "setuptools.command.bdist_egg:bdist_egg", "bdist_rpm": "setuptools.command.bdist_rpm:bdist_rpm", "bdist_wininst": "setuptools.command.bdist_wininst:bdist_wininst", "build_ext": "setuptools.command.build_ext:build_ext", "build_py": "setuptools.command.build_py:build_py", "develop": "setuptools.command.develop:develop", "easy_install": "setuptools.command.easy_install:easy_install", "egg_info": "setuptools.command.egg_info:egg_info", "install": "setuptools.command.install:install", "install_egg_info": "setuptools.command.install_egg_info:install_egg_info", "install_lib": "setuptools.command.install_lib:install_lib", "install_scripts": "setuptools.command.install_scripts:install_scripts", "register": "setuptools.command.register:register", "rotate": "setuptools.command.rotate:rotate", "saveopts": "setuptools.command.saveopts:saveopts", "sdist": "setuptools.command.sdist:sdist", "setopt": "setuptools.command.setopt:setopt", "test": "setuptools.command.test:test", "upload": "setuptools.command.upload:upload", "upload_docs": "setuptools.command.upload_docs:upload_docs"}, "distutils.setup_keywords": {"convert_2to3_doctests": "setuptools.dist:assert_string_list", "dependency_links": "setuptools.dist:assert_string_list", "eager_resources": "setuptools.dist:assert_string_list", "entry_points": "setuptools.dist:check_entry_points", "exclude_package_data": "setuptools.dist:check_package_data", "extras_require": "setuptools.dist:check_extras", "include_package_data": "setuptools.dist:assert_bool", "install_requires": "setuptools.dist:check_requirements", "namespace_packages": "setuptools.dist:check_nsp", "package_data": "setuptools.dist:check_package_data", "packages": "setuptools.dist:check_packages", "setup_requires": "setuptools.dist:check_requirements", "test_loader": "setuptools.dist:check_importable", "test_runner": "setuptools.dist:check_importable", "test_suite": "setuptools.dist:check_test_suite", "tests_require": "setuptools.dist:check_requirements", "use_2to3": "setuptools.dist:assert_bool", "use_2to3_exclude_fixers": "setuptools.dist:assert_string_list", "use_2to3_fixers": "setuptools.dist:assert_string_list", "zip_safe": "setuptools.dist:assert_bool"}, "egg_info.writers": {"PKG-INFO": "setuptools.command.egg_info:write_pkg_info", "dependency_links.txt": "setuptools.command.egg_info:overwrite_arg", "depends.txt": "setuptools.command.egg_info:warn_depends_obsolete", "eager_resources.txt": "setuptools.command.egg_info:overwrite_arg", "entry_points.txt": "setuptools.command.egg_info:write_entries", "namespace_packages.txt": "setuptools.command.egg_info:overwrite_arg", "requires.txt": "setuptools.command.egg_info:write_requirements", "top_level.txt": "setuptools.command.egg_info:write_toplevel_names"}, "setuptools.installation": {"eggsecutable": "setuptools.command.easy_install:bootstrap"}}}, "extras": ["certs", "ssl"], "generator": "bdist_wheel (0.29.0)", "keywords": ["CPAN", "PyPI", "distutils", "eggs", "package", "management"], "metadata_version": "2.0", "name": "setuptools", "run_requires": [{"extra": "certs", "requires": ["certifi (==2015.11.20)"]}, {"environment": "sys_platform=='win32'", "extra": "ssl", "requires": ["wincertstore (==0.2)"]}], "summary": "Easily download, build, install, upgrade, and uninstall Python packages", "test_requires": [{"requires": ["pytest (>=2.8)", "setuptools[ssl]"]}], "version": "20.3.1"} \ No newline at end of file diff --git a/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/zip-safe b/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/zip-safe deleted file mode 100644 index 8b13789..0000000 --- a/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/lib/python3.4/site-packages/setuptools-36.6.0.dist-info/DESCRIPTION.rst b/lib/python3.4/site-packages/setuptools-36.6.0.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..027d10d --- /dev/null +++ b/lib/python3.4/site-packages/setuptools-36.6.0.dist-info/DESCRIPTION.rst @@ -0,0 +1,36 @@ +.. image:: https://img.shields.io/pypi/v/setuptools.svg + :target: https://pypi.org/project/setuptools + +.. image:: https://readthedocs.org/projects/setuptools/badge/?version=latest + :target: https://setuptools.readthedocs.io + +.. image:: https://img.shields.io/travis/pypa/setuptools/master.svg?label=Linux%20build%20%40%20Travis%20CI + :target: http://travis-ci.org/pypa/setuptools + +.. image:: https://img.shields.io/appveyor/ci/jaraco/setuptools/master.svg?label=Windows%20build%20%40%20Appveyor + :target: https://ci.appveyor.com/project/jaraco/setuptools/branch/master + +.. image:: https://img.shields.io/pypi/pyversions/setuptools.svg + +See the `Installation Instructions +`_ in the Python Packaging +User's Guide for instructions on installing, upgrading, and uninstalling +Setuptools. + +The project is `maintained at GitHub `_. + +Questions and comments should be directed to the `distutils-sig +mailing list `_. +Bug reports and especially tested patches may be +submitted directly to the `bug tracker +`_. + + +Code of Conduct +--------------- + +Everyone interacting in the setuptools project's codebases, issue trackers, +chat rooms, and mailing lists is expected to follow the +`PyPA Code of Conduct `_. + + diff --git a/lib/python3.4/site-packages/pip-8.1.1.dist-info/INSTALLER b/lib/python3.4/site-packages/setuptools-36.6.0.dist-info/INSTALLER similarity index 100% rename from lib/python3.4/site-packages/pip-8.1.1.dist-info/INSTALLER rename to lib/python3.4/site-packages/setuptools-36.6.0.dist-info/INSTALLER diff --git a/lib/python3.4/site-packages/setuptools-36.6.0.dist-info/METADATA b/lib/python3.4/site-packages/setuptools-36.6.0.dist-info/METADATA new file mode 100644 index 0000000..725401a --- /dev/null +++ b/lib/python3.4/site-packages/setuptools-36.6.0.dist-info/METADATA @@ -0,0 +1,69 @@ +Metadata-Version: 2.0 +Name: setuptools +Version: 36.6.0 +Summary: Easily download, build, install, upgrade, and uninstall Python packages +Home-page: https://github.com/pypa/setuptools +Author: Python Packaging Authority +Author-email: distutils-sig@python.org +License: UNKNOWN +Description-Content-Type: text/x-rst; charset=UTF-8 +Keywords: CPAN PyPI distutils eggs package management +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: System :: Archiving :: Packaging +Classifier: Topic :: System :: Systems Administration +Classifier: Topic :: Utilities +Requires-Python: >=2.6,!=3.0.*,!=3.1.*,!=3.2.* +Provides-Extra: certs +Requires-Dist: certifi (==2016.9.26); extra == 'certs' +Provides-Extra: ssl +Requires-Dist: wincertstore (==0.2); sys_platform=='win32' and extra == 'ssl' + +.. image:: https://img.shields.io/pypi/v/setuptools.svg + :target: https://pypi.org/project/setuptools + +.. image:: https://readthedocs.org/projects/setuptools/badge/?version=latest + :target: https://setuptools.readthedocs.io + +.. image:: https://img.shields.io/travis/pypa/setuptools/master.svg?label=Linux%20build%20%40%20Travis%20CI + :target: http://travis-ci.org/pypa/setuptools + +.. image:: https://img.shields.io/appveyor/ci/jaraco/setuptools/master.svg?label=Windows%20build%20%40%20Appveyor + :target: https://ci.appveyor.com/project/jaraco/setuptools/branch/master + +.. image:: https://img.shields.io/pypi/pyversions/setuptools.svg + +See the `Installation Instructions +`_ in the Python Packaging +User's Guide for instructions on installing, upgrading, and uninstalling +Setuptools. + +The project is `maintained at GitHub `_. + +Questions and comments should be directed to the `distutils-sig +mailing list `_. +Bug reports and especially tested patches may be +submitted directly to the `bug tracker +`_. + + +Code of Conduct +--------------- + +Everyone interacting in the setuptools project's codebases, issue trackers, +chat rooms, and mailing lists is expected to follow the +`PyPA Code of Conduct `_. + + diff --git a/lib/python3.4/site-packages/setuptools-36.6.0.dist-info/RECORD b/lib/python3.4/site-packages/setuptools-36.6.0.dist-info/RECORD new file mode 100644 index 0000000..2b060aa --- /dev/null +++ b/lib/python3.4/site-packages/setuptools-36.6.0.dist-info/RECORD @@ -0,0 +1,159 @@ +easy_install.py,sha256=MDC9vt5AxDsXX5qcKlBz2TnW6Tpuv_AobnfhCJ9X3PM,126 +pkg_resources/__init__.py,sha256=0q4Rx1CSzw9caT4ewfrQmAAC60NZCjSQU-9vQjP34yo,106202 +pkg_resources/py31compat.py,sha256=-ysVqoxLetAnL94uM0kHkomKQTC1JZLN2ZUjqUhMeKE,600 +pkg_resources/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pkg_resources/_vendor/appdirs.py,sha256=tgGaL0m4Jo2VeuGfoOOifLv7a7oUEJu2n1vRkqoPw-0,22374 +pkg_resources/_vendor/pyparsing.py,sha256=PifeLY3-WhIcBVzLtv0U4T_pwDtPruBhBCkg5vLqa28,229867 +pkg_resources/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +pkg_resources/_vendor/packaging/__about__.py,sha256=zkcCPTN_6TcLW0Nrlg0176-R1QQ_WVPTm8sz1R4-HjM,720 +pkg_resources/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 +pkg_resources/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 +pkg_resources/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416 +pkg_resources/_vendor/packaging/markers.py,sha256=uEcBBtGvzqltgnArqb9c4RrcInXezDLos14zbBHhWJo,8248 +pkg_resources/_vendor/packaging/requirements.py,sha256=SikL2UynbsT0qtY9ltqngndha_sfo0w6XGFhAhoSoaQ,4355 +pkg_resources/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025 +pkg_resources/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421 +pkg_resources/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556 +pkg_resources/extern/__init__.py,sha256=JUtlHHvlxHSNuB4pWqNjcx7n6kG-fwXg7qmJ2zNJlIY,2487 +setuptools/__init__.py,sha256=MsRcLyrl8E49pBeFZ-PSwST-I2adqjvkfCC1h9gl0TQ,5037 +setuptools/archive_util.py,sha256=Z58-gbZQ0j92UJy7X7uZevwI28JTVEXd__AjKy4aw78,6613 +setuptools/build_meta.py,sha256=Z8fCFFJooVDcBuSUlVBWgwV41B9raH1sINpOP5-4o2Y,4756 +setuptools/cli-32.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536 +setuptools/cli-64.exe,sha256=KLABu5pyrnokJCv6skjXZ6GsXeyYHGcqOUT3oHI3Xpo,74752 +setuptools/cli.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536 +setuptools/config.py,sha256=ms8JAS3aHsOun-OO-jyvrQq3txyRE2AwKOiZP1aTan8,16317 +setuptools/dep_util.py,sha256=fgixvC1R7sH3r13ktyf7N0FALoqEXL1cBarmNpSEoWg,935 +setuptools/depends.py,sha256=hC8QIDcM3VDpRXvRVA6OfL9AaQfxvhxHcN_w6sAyNq8,5837 +setuptools/dist.py,sha256=PZjofGBK1ZzA-VpbwuTlxf9XMkvwmGYPSIqUl8FpE2k,40364 +setuptools/extension.py,sha256=uc6nHI-MxwmNCNPbUiBnybSyqhpJqjbhvOQ-emdvt_E,1729 +setuptools/glob.py,sha256=Y-fpv8wdHZzv9DPCaGACpMSBWJ6amq_1e0R_i8_el4w,5207 +setuptools/gui-32.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536 +setuptools/gui-64.exe,sha256=aYKMhX1IJLn4ULHgWX0sE0yREUt6B3TEHf_jOw6yNyE,75264 +setuptools/gui.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536 +setuptools/launch.py,sha256=sd7ejwhBocCDx_wG9rIs0OaZ8HtmmFU8ZC6IR_S0Lvg,787 +setuptools/lib2to3_ex.py,sha256=t5e12hbR2pi9V4ezWDTB4JM-AISUnGOkmcnYHek3xjg,2013 +setuptools/monkey.py,sha256=s-yH6vfMFxXMrfVInT9_3gnEyAn-TYMHtXVNUOVI4T8,5791 +setuptools/msvc.py,sha256=AEbWNLJ0pTuHJSkQuBZET6wr_d2-yGGPkdHCMdIKWB4,40884 +setuptools/namespaces.py,sha256=F0Nrbv8KCT2OrO7rwa03om4N4GZKAlnce-rr-cgDQa8,3199 +setuptools/package_index.py,sha256=ELInXIlJZqNbeAKAHYZVDLbwOkYZt-o-vyaFK_eS_N0,39970 +setuptools/py26compat.py,sha256=VRGHC7z2gliR4_uICJsQNodUcNUzybpus3BrJkWbnK4,679 +setuptools/py27compat.py,sha256=3mwxRMDk5Q5O1rSXOERbQDXhFqwDJhhUitfMW_qpUCo,536 +setuptools/py31compat.py,sha256=qGRk3tefux8HbhNzhM0laR3mD8vhAZtffZgzLkBMXJs,1645 +setuptools/py33compat.py,sha256=W8_JFZr8WQbJT_7-JFWjc_6lHGtoMK-4pCrHIwk5JN0,998 +setuptools/py36compat.py,sha256=VUDWxmu5rt4QHlGTRtAFu6W5jvfL6WBjeDAzeoBy0OM,2891 +setuptools/sandbox.py,sha256=hkGRod5_yt3EBHkGnRBf7uK1YceoqFpTT4b__9ZZ5UU,14549 +setuptools/script (dev).tmpl,sha256=f7MR17dTkzaqkCMSVseyOCMVrPVSMdmTQsaB8cZzfuI,201 +setuptools/script.tmpl,sha256=WGTt5piezO27c-Dbx6l5Q4T3Ff20A5z7872hv3aAhYY,138 +setuptools/site-patch.py,sha256=BVt6yIrDMXJoflA5J6DJIcsJUfW_XEeVhOzelTTFDP4,2307 +setuptools/ssl_support.py,sha256=Axo1QtiAtsvuENZq_BvhW5PeWw2nrX39-4qoSiVpB6w,8220 +setuptools/unicode_utils.py,sha256=NOiZ_5hD72A6w-4wVj8awHFM3n51Kmw1Ic_vx15XFqw,996 +setuptools/version.py,sha256=og_cuZQb0QI6ukKZFfZWPlr1HgJBPPn2vO2m_bI9ZTE,144 +setuptools/windows_support.py,sha256=5GrfqSP2-dLGJoZTq2g6dCKkyQxxa2n5IQiXlJCoYEE,714 +setuptools/command/__init__.py,sha256=-X7tSQahlz8sbGu_Xq9bqumFE117jU56E96tDDufNqw,590 +setuptools/command/alias.py,sha256=KjpE0sz_SDIHv3fpZcIQK-sCkJz-SrC6Gmug6b9Nkc8,2426 +setuptools/command/bdist_egg.py,sha256=TGN1XVQb9V8Rf-msDKaIZWmeGQf81HT83oqXJ_3M0gg,17441 +setuptools/command/bdist_rpm.py,sha256=B7l0TnzCGb-0nLlm6rS00jWLkojASwVmdhW2w5Qz_Ak,1508 +setuptools/command/bdist_wininst.py,sha256=_6dz3lpB1tY200LxKPLM7qgwTCceOMgaWFF-jW2-pm0,637 +setuptools/command/build_clib.py,sha256=bQ9aBr-5ZSO-9fGsGsDLz0mnnFteHUZnftVLkhvHDq0,4484 +setuptools/command/build_ext.py,sha256=dO89j-IC0dAjSty1sSZxvi0LSdkPGR_ZPXFuAAFDZj4,13049 +setuptools/command/build_py.py,sha256=yWyYaaS9F3o9JbIczn064A5g1C5_UiKRDxGaTqYbtLE,9596 +setuptools/command/develop.py,sha256=PuVOjmGWGfvHZmOBMj_bdeU087kl0jhnMHqKcDODBDE,8024 +setuptools/command/dist_info.py,sha256=7Ewmog46orGjzME5UA_GQvqewRd1s25aCLxsfHCKqq8,924 +setuptools/command/easy_install.py,sha256=eruE4R4JfOTx0_0hDYMMElpup33Qkn0P44lclgP8dA0,85973 +setuptools/command/egg_info.py,sha256=HNUt2tQAAp8dULFS_6Qk9vflESI7jdqlCqq-VVQi7AA,25016 +setuptools/command/install.py,sha256=a0EZpL_A866KEdhicTGbuyD_TYl1sykfzdrri-zazT4,4683 +setuptools/command/install_egg_info.py,sha256=bMgeIeRiXzQ4DAGPV1328kcjwQjHjOWU4FngAWLV78Q,2203 +setuptools/command/install_lib.py,sha256=11mxf0Ch12NsuYwS8PHwXBRvyh671QAM4cTRh7epzG0,3840 +setuptools/command/install_scripts.py,sha256=UD0rEZ6861mTYhIdzcsqKnUl8PozocXWl9VBQ1VTWnc,2439 +setuptools/command/launcher manifest.xml,sha256=xlLbjWrB01tKC0-hlVkOKkiSPbzMml2eOPtJ_ucCnbE,628 +setuptools/command/py36compat.py,sha256=SzjZcOxF7zdFUT47Zv2n7AM3H8koDys_0OpS-n9gIfc,4986 +setuptools/command/register.py,sha256=bHlMm1qmBbSdahTOT8w6UhA-EgeQIz7p6cD-qOauaiI,270 +setuptools/command/rotate.py,sha256=co5C1EkI7P0GGT6Tqz-T2SIj2LBJTZXYELpmao6d4KQ,2164 +setuptools/command/saveopts.py,sha256=za7QCBcQimKKriWcoCcbhxPjUz30gSB74zuTL47xpP4,658 +setuptools/command/sdist.py,sha256=VldpcHRSlDrvvK2uV9O6HjQA2OtHCUa4QaMkYCYwTrA,6919 +setuptools/command/setopt.py,sha256=NTWDyx-gjDF-txf4dO577s7LOzHVoKR0Mq33rFxaRr8,5085 +setuptools/command/test.py,sha256=koi5lqjhXHlt0B3egYb98qRVETzKXKhWDD5OQY-AKuA,9044 +setuptools/command/upload.py,sha256=i1gfItZ3nQOn5FKXb8tLC2Kd7eKC8lWO4bdE6NqGpE4,1172 +setuptools/command/upload_docs.py,sha256=oXiGplM_cUKLwE4CWWw98RzCufAu8tBhMC97GegFcms,7311 +setuptools/extern/__init__.py,sha256=ZtCLYQ8JTtOtm7SYoxekZw-UzY3TR50SRIUaeqr2ROk,131 +setuptools-36.6.0.dist-info/DESCRIPTION.rst,sha256=1sSNG6a5L3fSMo1x9uE3jvumlEODgeqBUtSaYp_VVLw,1421 +setuptools-36.6.0.dist-info/METADATA,sha256=GLuJ3zbtJdt_nwgq9UIpUoXOis1Ub4tWeOTKQIZHT1s,2847 +setuptools-36.6.0.dist-info/RECORD,, +setuptools-36.6.0.dist-info/WHEEL,sha256=kdsN-5OJAZIiHN-iO4Rhl82KyS0bDWf4uBwMbkNafr8,110 +setuptools-36.6.0.dist-info/dependency_links.txt,sha256=HlkCFkoK5TbZ5EMLbLKYhLcY_E31kBWD8TqW2EgmatQ,239 +setuptools-36.6.0.dist-info/entry_points.txt,sha256=jBqCYDlVjl__sjYFGXo1JQGIMAYFJE-prYWUtnMZEew,2990 +setuptools-36.6.0.dist-info/metadata.json,sha256=4yqt7_oaFRn8AA20H0H5W2AByP8z-0HuDpwGyiQH6UU,4916 +setuptools-36.6.0.dist-info/top_level.txt,sha256=2HUXVVwA4Pff1xgTFr3GsTXXKaPaO6vlG6oNJ_4u4Tg,38 +setuptools-36.6.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +../../../bin/easy_install,sha256=tsci1id0sS7h2uWc2NQJYflZoKSI8AR-W02mXYmf7Es,300 +../../../bin/easy_install-3.4,sha256=tsci1id0sS7h2uWc2NQJYflZoKSI8AR-W02mXYmf7Es,300 +setuptools-36.6.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +setuptools/__pycache__/py31compat.cpython-34.pyc,, +setuptools/command/__pycache__/bdist_egg.cpython-34.pyc,, +setuptools/__pycache__/sandbox.cpython-34.pyc,, +setuptools/__pycache__/__init__.cpython-34.pyc,, +setuptools/extern/__pycache__/__init__.cpython-34.pyc,, +setuptools/__pycache__/site-patch.cpython-34.pyc,, +setuptools/__pycache__/config.cpython-34.pyc,, +setuptools/__pycache__/py26compat.cpython-34.pyc,, +setuptools/command/__pycache__/bdist_rpm.cpython-34.pyc,, +setuptools/command/__pycache__/test.cpython-34.pyc,, +pkg_resources/extern/__pycache__/__init__.cpython-34.pyc,, +setuptools/command/__pycache__/upload_docs.cpython-34.pyc,, +setuptools/__pycache__/ssl_support.cpython-34.pyc,, +setuptools/command/__pycache__/alias.cpython-34.pyc,, +pkg_resources/_vendor/__pycache__/pyparsing.cpython-34.pyc,, +pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-34.pyc,, +setuptools/__pycache__/py33compat.cpython-34.pyc,, +setuptools/command/__pycache__/build_py.cpython-34.pyc,, +pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-34.pyc,, +setuptools/command/__pycache__/install_lib.cpython-34.pyc,, +setuptools/command/__pycache__/dist_info.cpython-34.pyc,, +setuptools/__pycache__/build_meta.cpython-34.pyc,, +setuptools/command/__pycache__/bdist_wininst.cpython-34.pyc,, +setuptools/__pycache__/extension.cpython-34.pyc,, +pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-34.pyc,, +pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-34.pyc,, +setuptools/command/__pycache__/install_scripts.cpython-34.pyc,, +setuptools/command/__pycache__/install.cpython-34.pyc,, +setuptools/__pycache__/py27compat.cpython-34.pyc,, +setuptools/__pycache__/py36compat.cpython-34.pyc,, +setuptools/command/__pycache__/sdist.cpython-34.pyc,, +setuptools/__pycache__/package_index.cpython-34.pyc,, +setuptools/__pycache__/msvc.cpython-34.pyc,, +setuptools/__pycache__/archive_util.cpython-34.pyc,, +setuptools/command/__pycache__/egg_info.cpython-34.pyc,, +pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-34.pyc,, +setuptools/__pycache__/lib2to3_ex.cpython-34.pyc,, +setuptools/command/__pycache__/install_egg_info.cpython-34.pyc,, +setuptools/command/__pycache__/upload.cpython-34.pyc,, +setuptools/command/__pycache__/build_ext.cpython-34.pyc,, +pkg_resources/__pycache__/__init__.cpython-34.pyc,, +pkg_resources/_vendor/__pycache__/appdirs.cpython-34.pyc,, +setuptools/__pycache__/namespaces.cpython-34.pyc,, +setuptools/__pycache__/monkey.cpython-34.pyc,, +setuptools/command/__pycache__/build_clib.cpython-34.pyc,, +pkg_resources/_vendor/__pycache__/six.cpython-34.pyc,, +pkg_resources/__pycache__/py31compat.cpython-34.pyc,, +pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-34.pyc,, +setuptools/__pycache__/dist.cpython-34.pyc,, +setuptools/__pycache__/depends.cpython-34.pyc,, +__pycache__/easy_install.cpython-34.pyc,, +setuptools/__pycache__/dep_util.cpython-34.pyc,, +setuptools/command/__pycache__/setopt.cpython-34.pyc,, +setuptools/__pycache__/version.cpython-34.pyc,, +setuptools/__pycache__/windows_support.cpython-34.pyc,, +pkg_resources/_vendor/packaging/__pycache__/utils.cpython-34.pyc,, +setuptools/__pycache__/glob.cpython-34.pyc,, +setuptools/command/__pycache__/develop.cpython-34.pyc,, +pkg_resources/_vendor/packaging/__pycache__/markers.cpython-34.pyc,, +setuptools/__pycache__/launch.cpython-34.pyc,, +setuptools/command/__pycache__/rotate.cpython-34.pyc,, +pkg_resources/_vendor/packaging/__pycache__/version.cpython-34.pyc,, +setuptools/command/__pycache__/py36compat.cpython-34.pyc,, +setuptools/command/__pycache__/__init__.cpython-34.pyc,, +setuptools/command/__pycache__/register.cpython-34.pyc,, +setuptools/__pycache__/unicode_utils.cpython-34.pyc,, +pkg_resources/_vendor/__pycache__/__init__.cpython-34.pyc,, +setuptools/command/__pycache__/easy_install.cpython-34.pyc,, +setuptools/command/__pycache__/saveopts.cpython-34.pyc,, diff --git a/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/WHEEL b/lib/python3.4/site-packages/setuptools-36.6.0.dist-info/WHEEL similarity index 70% rename from lib/python3.4/site-packages/setuptools-20.3.1.dist-info/WHEEL rename to lib/python3.4/site-packages/setuptools-36.6.0.dist-info/WHEEL index 8b6dd1b..7332a41 100644 --- a/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/WHEEL +++ b/lib/python3.4/site-packages/setuptools-36.6.0.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.29.0) +Generator: bdist_wheel (0.30.0) Root-Is-Purelib: true Tag: py2-none-any Tag: py3-none-any diff --git a/lib/python3.4/site-packages/setuptools-36.6.0.dist-info/dependency_links.txt b/lib/python3.4/site-packages/setuptools-36.6.0.dist-info/dependency_links.txt new file mode 100644 index 0000000..e87d021 --- /dev/null +++ b/lib/python3.4/site-packages/setuptools-36.6.0.dist-info/dependency_links.txt @@ -0,0 +1,2 @@ +https://files.pythonhosted.org/packages/source/c/certifi/certifi-2016.9.26.tar.gz#md5=baa81e951a29958563689d868ef1064d +https://files.pythonhosted.org/packages/source/w/wincertstore/wincertstore-0.2.zip#md5=ae728f2f007185648d0c7a8679b361e2 diff --git a/lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/entry_points.txt b/lib/python3.4/site-packages/setuptools-36.6.0.dist-info/entry_points.txt similarity index 92% rename from lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/entry_points.txt rename to lib/python3.4/site-packages/setuptools-36.6.0.dist-info/entry_points.txt index 5270e4a..4159fd0 100644 --- a/lib/python3.4/site-packages/_markerlib-0.0.0.dist-info/entry_points.txt +++ b/lib/python3.4/site-packages/setuptools-36.6.0.dist-info/entry_points.txt @@ -1,14 +1,17 @@ [console_scripts] easy_install = setuptools.command.easy_install:main +easy_install-3.6 = setuptools.command.easy_install:main [distutils.commands] alias = setuptools.command.alias:alias bdist_egg = setuptools.command.bdist_egg:bdist_egg bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm bdist_wininst = setuptools.command.bdist_wininst:bdist_wininst +build_clib = setuptools.command.build_clib:build_clib build_ext = setuptools.command.build_ext:build_ext build_py = setuptools.command.build_py:build_py develop = setuptools.command.develop:develop +dist_info = setuptools.command.dist_info:dist_info easy_install = setuptools.command.easy_install:easy_install egg_info = setuptools.command.egg_info:egg_info install = setuptools.command.install:install @@ -36,6 +39,7 @@ install_requires = setuptools.dist:check_requirements namespace_packages = setuptools.dist:check_nsp package_data = setuptools.dist:check_package_data packages = setuptools.dist:check_packages +python_requires = setuptools.dist:check_specifier setup_requires = setuptools.dist:check_requirements test_loader = setuptools.dist:check_importable test_runner = setuptools.dist:check_importable diff --git a/lib/python3.4/site-packages/setuptools-36.6.0.dist-info/metadata.json b/lib/python3.4/site-packages/setuptools-36.6.0.dist-info/metadata.json new file mode 100644 index 0000000..cb17d38 --- /dev/null +++ b/lib/python3.4/site-packages/setuptools-36.6.0.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Archiving :: Packaging", "Topic :: System :: Systems Administration", "Topic :: Utilities"], "description_content_type": "text/x-rst; charset=UTF-8", "extensions": {"python.commands": {"wrap_console": {"easy_install": "setuptools.command.easy_install:main", "easy_install-3.6": "setuptools.command.easy_install:main"}}, "python.details": {"contacts": [{"email": "distutils-sig@python.org", "name": "Python Packaging Authority", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/pypa/setuptools"}}, "python.exports": {"console_scripts": {"easy_install": "setuptools.command.easy_install:main", "easy_install-3.6": "setuptools.command.easy_install:main"}, "distutils.commands": {"alias": "setuptools.command.alias:alias", "bdist_egg": "setuptools.command.bdist_egg:bdist_egg", "bdist_rpm": "setuptools.command.bdist_rpm:bdist_rpm", "bdist_wininst": "setuptools.command.bdist_wininst:bdist_wininst", "build_clib": "setuptools.command.build_clib:build_clib", "build_ext": "setuptools.command.build_ext:build_ext", "build_py": "setuptools.command.build_py:build_py", "develop": "setuptools.command.develop:develop", "dist_info": "setuptools.command.dist_info:dist_info", "easy_install": "setuptools.command.easy_install:easy_install", "egg_info": "setuptools.command.egg_info:egg_info", "install": "setuptools.command.install:install", "install_egg_info": "setuptools.command.install_egg_info:install_egg_info", "install_lib": "setuptools.command.install_lib:install_lib", "install_scripts": "setuptools.command.install_scripts:install_scripts", "register": "setuptools.command.register:register", "rotate": "setuptools.command.rotate:rotate", "saveopts": "setuptools.command.saveopts:saveopts", "sdist": "setuptools.command.sdist:sdist", "setopt": "setuptools.command.setopt:setopt", "test": "setuptools.command.test:test", "upload": "setuptools.command.upload:upload", "upload_docs": "setuptools.command.upload_docs:upload_docs"}, "distutils.setup_keywords": {"convert_2to3_doctests": "setuptools.dist:assert_string_list", "dependency_links": "setuptools.dist:assert_string_list", "eager_resources": "setuptools.dist:assert_string_list", "entry_points": "setuptools.dist:check_entry_points", "exclude_package_data": "setuptools.dist:check_package_data", "extras_require": "setuptools.dist:check_extras", "include_package_data": "setuptools.dist:assert_bool", "install_requires": "setuptools.dist:check_requirements", "namespace_packages": "setuptools.dist:check_nsp", "package_data": "setuptools.dist:check_package_data", "packages": "setuptools.dist:check_packages", "python_requires": "setuptools.dist:check_specifier", "setup_requires": "setuptools.dist:check_requirements", "test_loader": "setuptools.dist:check_importable", "test_runner": "setuptools.dist:check_importable", "test_suite": "setuptools.dist:check_test_suite", "tests_require": "setuptools.dist:check_requirements", "use_2to3": "setuptools.dist:assert_bool", "use_2to3_exclude_fixers": "setuptools.dist:assert_string_list", "use_2to3_fixers": "setuptools.dist:assert_string_list", "zip_safe": "setuptools.dist:assert_bool"}, "egg_info.writers": {"PKG-INFO": "setuptools.command.egg_info:write_pkg_info", "dependency_links.txt": "setuptools.command.egg_info:overwrite_arg", "depends.txt": "setuptools.command.egg_info:warn_depends_obsolete", "eager_resources.txt": "setuptools.command.egg_info:overwrite_arg", "entry_points.txt": "setuptools.command.egg_info:write_entries", "namespace_packages.txt": "setuptools.command.egg_info:overwrite_arg", "requires.txt": "setuptools.command.egg_info:write_requirements", "top_level.txt": "setuptools.command.egg_info:write_toplevel_names"}, "setuptools.installation": {"eggsecutable": "setuptools.command.easy_install:bootstrap"}}}, "extras": ["certs", "ssl"], "generator": "bdist_wheel (0.30.0)", "keywords": ["CPAN", "PyPI", "distutils", "eggs", "package", "management"], "metadata_version": "2.0", "name": "setuptools", "requires_python": ">=2.6,!=3.0.*,!=3.1.*,!=3.2.*", "run_requires": [{"extra": "certs", "requires": ["certifi (==2016.9.26)"]}, {"environment": "sys_platform=='win32'", "extra": "ssl", "requires": ["wincertstore (==0.2)"]}], "summary": "Easily download, build, install, upgrade, and uninstall Python packages", "version": "36.6.0"} \ No newline at end of file diff --git a/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/top_level.txt b/lib/python3.4/site-packages/setuptools-36.6.0.dist-info/top_level.txt similarity index 100% rename from lib/python3.4/site-packages/setuptools-20.3.1.dist-info/top_level.txt rename to lib/python3.4/site-packages/setuptools-36.6.0.dist-info/top_level.txt diff --git a/lib/python3.4/site-packages/netifaces-0.10.4.dist-info/zip-safe b/lib/python3.4/site-packages/setuptools-36.6.0.dist-info/zip-safe similarity index 100% rename from lib/python3.4/site-packages/netifaces-0.10.4.dist-info/zip-safe rename to lib/python3.4/site-packages/setuptools-36.6.0.dist-info/zip-safe diff --git a/lib/python3.4/site-packages/setuptools/__init__.py b/lib/python3.4/site-packages/setuptools/__init__.py index 67b57e4..04f7674 100644 --- a/lib/python3.4/site-packages/setuptools/__init__.py +++ b/lib/python3.4/site-packages/setuptools/__init__.py @@ -4,20 +4,20 @@ import os import functools import distutils.core import distutils.filelist -from distutils.core import Command as _Command from distutils.util import convert_path from fnmatch import fnmatchcase -from setuptools.extern.six.moves import filterfalse, map +from setuptools.extern.six.moves import filter, map import setuptools.version from setuptools.extension import Extension -from setuptools.dist import Distribution, Feature, _get_unpatched +from setuptools.dist import Distribution, Feature from setuptools.depends import Require +from . import monkey __all__ = [ 'setup', 'Distribution', 'Feature', 'Command', 'Extension', 'Require', - 'find_packages' + 'find_packages', ] __version__ = setuptools.version.__version__ @@ -32,12 +32,18 @@ lib2to3_fixer_packages = ['lib2to3.fixes'] class PackageFinder(object): + """ + Generate a list of all Python packages found within a directory + """ + @classmethod def find(cls, where='.', exclude=(), include=('*',)): """Return a list all Python packages found within directory 'where' - 'where' should be supplied as a "cross-platform" (i.e. URL-style) - path; it will be converted to the appropriate local path syntax. + 'where' is the root directory which will be searched for packages. It + should be supplied as a "cross-platform" (i.e. URL-style) path; it will + be converted to the appropriate local path syntax. + 'exclude' is a sequence of package names to exclude; '*' can be used as a wildcard in the names, such that 'foo.*' will exclude all subpackages of 'foo' (but not 'foo' itself). @@ -46,78 +52,67 @@ class PackageFinder(object): specified, only the named packages will be included. If it's not specified, all found packages will be included. 'include' can contain shell style wildcard patterns just like 'exclude'. + """ - The list of included packages is built up first and then any - explicitly excluded packages are removed from it. - """ - out = cls._find_packages_iter(convert_path(where)) - out = cls.require_parents(out) - includes = cls._build_filter(*include) - excludes = cls._build_filter('ez_setup', '*__pycache__', *exclude) - out = filter(includes, out) - out = filterfalse(excludes, out) - return list(out) - - @staticmethod - def require_parents(packages): - """ - Exclude any apparent package that apparently doesn't include its - parent. - - For example, exclude 'foo.bar' if 'foo' is not present. - """ - found = [] - for pkg in packages: - base, sep, child = pkg.rpartition('.') - if base and base not in found: - continue - found.append(pkg) - yield pkg - - @staticmethod - def _candidate_dirs(base_path): - """ - Return all dirs in base_path that might be packages. - """ - has_dot = lambda name: '.' in name - for root, dirs, files in os.walk(base_path, followlinks=True): - # Exclude directories that contain a period, as they cannot be - # packages. Mutate the list to avoid traversal. - dirs[:] = filterfalse(has_dot, dirs) - for dir in dirs: - yield os.path.relpath(os.path.join(root, dir), base_path) + return list(cls._find_packages_iter( + convert_path(where), + cls._build_filter('ez_setup', '*__pycache__', *exclude), + cls._build_filter(*include))) @classmethod - def _find_packages_iter(cls, base_path): - candidates = cls._candidate_dirs(base_path) - return ( - path.replace(os.path.sep, '.') - for path in candidates - if cls._looks_like_package(os.path.join(base_path, path)) - ) + def _find_packages_iter(cls, where, exclude, include): + """ + All the packages found in 'where' that pass the 'include' filter, but + not the 'exclude' filter. + """ + for root, dirs, files in os.walk(where, followlinks=True): + # Copy dirs to iterate over it, then empty dirs. + all_dirs = dirs[:] + dirs[:] = [] + + for dir in all_dirs: + full_path = os.path.join(root, dir) + rel_path = os.path.relpath(full_path, where) + package = rel_path.replace(os.path.sep, '.') + + # Skip directory trees that are not valid packages + if ('.' in dir or not cls._looks_like_package(full_path)): + continue + + # Should this package be included? + if include(package) and not exclude(package): + yield package + + # Keep searching subdirectories, as there may be more packages + # down there, even if the parent was excluded. + dirs.append(dir) @staticmethod def _looks_like_package(path): + """Does a directory look like a package?""" return os.path.isfile(os.path.join(path, '__init__.py')) @staticmethod def _build_filter(*patterns): """ Given a list of patterns, return a callable that will be true only if - the input matches one of the patterns. + the input matches at least one of the patterns. """ return lambda name: any(fnmatchcase(name, pat=pat) for pat in patterns) + class PEP420PackageFinder(PackageFinder): @staticmethod def _looks_like_package(path): return True + find_packages = PackageFinder.find setup = distutils.core.setup -_Command = _get_unpatched(_Command) +_Command = monkey.get_unpatched(distutils.core.Command) + class Command(_Command): __doc__ = _Command.__doc__ @@ -137,9 +132,6 @@ class Command(_Command): vars(cmd).update(kw) return cmd -# we can't patch distutils.cmd, alas -distutils.core.Command = Command - def _find_all_simple(path): """ @@ -165,5 +157,4 @@ def findall(dir=os.curdir): return list(files) -# fix findall bug in distutils (http://bugs.python.org/issue12885) -distutils.filelist.findall = findall +monkey.patch_all() diff --git a/lib/python3.4/site-packages/setuptools/archive_util.py b/lib/python3.4/site-packages/setuptools/archive_util.py index b3c9fa5..cc82b3d 100644 --- a/lib/python3.4/site-packages/setuptools/archive_util.py +++ b/lib/python3.4/site-packages/setuptools/archive_util.py @@ -1,24 +1,26 @@ """Utilities for extracting common archive formats""" - -__all__ = [ - "unpack_archive", "unpack_zipfile", "unpack_tarfile", "default_filter", - "UnrecognizedFormat", "extraction_drivers", "unpack_directory", -] - import zipfile import tarfile import os import shutil import posixpath import contextlib -from pkg_resources import ensure_directory, ContextualZipFile from distutils.errors import DistutilsError +from pkg_resources import ensure_directory, ContextualZipFile + +__all__ = [ + "unpack_archive", "unpack_zipfile", "unpack_tarfile", "default_filter", + "UnrecognizedFormat", "extraction_drivers", "unpack_directory", +] + + class UnrecognizedFormat(DistutilsError): """Couldn't recognize the archive type""" -def default_filter(src,dst): + +def default_filter(src, dst): """The default progress/filter callback; returns True for all files""" return dst @@ -167,4 +169,5 @@ def unpack_tarfile(filename, extract_dir, progress_filter=default_filter): pass return True + extraction_drivers = unpack_directory, unpack_zipfile, unpack_tarfile diff --git a/lib/python3.4/site-packages/setuptools/build_meta.py b/lib/python3.4/site-packages/setuptools/build_meta.py new file mode 100644 index 0000000..54f2987 --- /dev/null +++ b/lib/python3.4/site-packages/setuptools/build_meta.py @@ -0,0 +1,148 @@ +"""A PEP 517 interface to setuptools + +Previously, when a user or a command line tool (let's call it a "frontend") +needed to make a request of setuptools to take a certain action, for +example, generating a list of installation requirements, the frontend would +would call "setup.py egg_info" or "setup.py bdist_wheel" on the command line. + +PEP 517 defines a different method of interfacing with setuptools. Rather +than calling "setup.py" directly, the frontend should: + + 1. Set the current directory to the directory with a setup.py file + 2. Import this module into a safe python interpreter (one in which + setuptools can potentially set global variables or crash hard). + 3. Call one of the functions defined in PEP 517. + +What each function does is defined in PEP 517. However, here is a "casual" +definition of the functions (this definition should not be relied on for +bug reports or API stability): + + - `build_wheel`: build a wheel in the folder and return the basename + - `get_requires_for_build_wheel`: get the `setup_requires` to build + - `prepare_metadata_for_build_wheel`: get the `install_requires` + - `build_sdist`: build an sdist in the folder and return the basename + - `get_requires_for_build_sdist`: get the `setup_requires` to build + +Again, this is not a formal definition! Just a "taste" of the module. +""" + +import os +import sys +import tokenize +import shutil +import contextlib + +import setuptools +import distutils + + +class SetupRequirementsError(BaseException): + def __init__(self, specifiers): + self.specifiers = specifiers + + +class Distribution(setuptools.dist.Distribution): + def fetch_build_eggs(self, specifiers): + raise SetupRequirementsError(specifiers) + + @classmethod + @contextlib.contextmanager + def patch(cls): + """ + Replace + distutils.dist.Distribution with this class + for the duration of this context. + """ + orig = distutils.core.Distribution + distutils.core.Distribution = cls + try: + yield + finally: + distutils.core.Distribution = orig + + +def _run_setup(setup_script='setup.py'): + # Note that we can reuse our build directory between calls + # Correctness comes first, then optimization later + __file__ = setup_script + f = getattr(tokenize, 'open', open)(__file__) + code = f.read().replace('\\r\\n', '\\n') + f.close() + exec(compile(code, __file__, 'exec')) + + +def _fix_config(config_settings): + config_settings = config_settings or {} + config_settings.setdefault('--global-option', []) + return config_settings + + +def _get_build_requires(config_settings): + config_settings = _fix_config(config_settings) + requirements = ['setuptools', 'wheel'] + + sys.argv = sys.argv[:1] + ['egg_info'] + \ + config_settings["--global-option"] + try: + with Distribution.patch(): + _run_setup() + except SetupRequirementsError as e: + requirements += e.specifiers + + return requirements + + +def get_requires_for_build_wheel(config_settings=None): + config_settings = _fix_config(config_settings) + return _get_build_requires(config_settings) + + +def get_requires_for_build_sdist(config_settings=None): + config_settings = _fix_config(config_settings) + return _get_build_requires(config_settings) + + +def prepare_metadata_for_build_wheel(metadata_directory, config_settings=None): + sys.argv = sys.argv[:1] + ['dist_info', '--egg-base', metadata_directory] + _run_setup() + + dist_infos = [f for f in os.listdir(metadata_directory) + if f.endswith('.dist-info')] + + assert len(dist_infos) == 1 + return dist_infos[0] + + +def build_wheel(wheel_directory, config_settings=None, + metadata_directory=None): + config_settings = _fix_config(config_settings) + wheel_directory = os.path.abspath(wheel_directory) + sys.argv = sys.argv[:1] + ['bdist_wheel'] + \ + config_settings["--global-option"] + _run_setup() + if wheel_directory != 'dist': + shutil.rmtree(wheel_directory) + shutil.copytree('dist', wheel_directory) + + wheels = [f for f in os.listdir(wheel_directory) + if f.endswith('.whl')] + + assert len(wheels) == 1 + return wheels[0] + + +def build_sdist(sdist_directory, config_settings=None): + config_settings = _fix_config(config_settings) + sdist_directory = os.path.abspath(sdist_directory) + sys.argv = sys.argv[:1] + ['sdist'] + \ + config_settings["--global-option"] + _run_setup() + if sdist_directory != 'dist': + shutil.rmtree(sdist_directory) + shutil.copytree('dist', sdist_directory) + + sdists = [f for f in os.listdir(sdist_directory) + if f.endswith('.tar.gz')] + + assert len(sdists) == 1 + return sdists[0] diff --git a/lib/python3.4/site-packages/setuptools/cli-arm-32.exe b/lib/python3.4/site-packages/setuptools/cli-arm-32.exe deleted file mode 100644 index 2f40402d4370fd0b032331896762593dd75b5ae0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69120 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.2 - from sysconfig import _CONFIG_VARS -except ImportError: - from distutils.sysconfig import get_config_var +# make sure _config_vars is initialized +get_config_var("LDSHARED") +from distutils.sysconfig import _config_vars as _CONFIG_VARS + + +def _customize_compiler_for_shlib(compiler): + if sys.platform == "darwin": + # building .dylib requires additional compiler flags on OSX; here we + # temporarily substitute the pyconfig.h variables so that distutils' + # 'customize_compiler' uses them before we build the shared libraries. + tmp = _CONFIG_VARS.copy() + try: + # XXX Help! I don't have any idea whether these are right... + _CONFIG_VARS['LDSHARED'] = ( + "gcc -Wl,-x -dynamiclib -undefined dynamic_lookup") + _CONFIG_VARS['CCSHARED'] = " -dynamiclib" + _CONFIG_VARS['SO'] = ".dylib" + customize_compiler(compiler) + finally: + _CONFIG_VARS.clear() + _CONFIG_VARS.update(tmp) + else: + customize_compiler(compiler) - get_config_var("LDSHARED") # make sure _config_vars is initialized - del get_config_var - from distutils.sysconfig import _config_vars as _CONFIG_VARS have_rtld = False use_stubs = False @@ -39,9 +56,18 @@ elif os.name != 'nt': except ImportError: pass - if_dl = lambda s: s if have_rtld else '' + +def get_abi3_suffix(): + """Return the file extension for an abi3-compliant Extension()""" + for suffix, _, _ in (s for s in imp.get_suffixes() if s[2] == imp.C_EXTENSION): + if '.abi3' in suffix: # Unix + return suffix + elif suffix == '.pyd': # Windows + return suffix + + class build_ext(_build_ext): def run(self): """Build extensions in build directory, then copy if --inplace""" @@ -77,6 +103,15 @@ class build_ext(_build_ext): filename = _build_ext.get_ext_filename(self, fullname) if fullname in self.ext_map: ext = self.ext_map[fullname] + use_abi3 = ( + six.PY3 + and getattr(ext, 'py_limited_api') + and get_abi3_suffix() + ) + if use_abi3: + so_ext = _get_config_var_837('EXT_SUFFIX') + filename = filename[:-len(so_ext)] + filename = filename + get_abi3_suffix() if isinstance(ext, Library): fn, ext = os.path.splitext(filename) return self.shlib_compiler.library_filename(fn, libtype) @@ -124,20 +159,7 @@ class build_ext(_build_ext): compiler = self.shlib_compiler = new_compiler( compiler=self.compiler, dry_run=self.dry_run, force=self.force ) - if sys.platform == "darwin": - tmp = _CONFIG_VARS.copy() - try: - # XXX Help! I don't have any idea whether these are right... - _CONFIG_VARS['LDSHARED'] = ( - "gcc -Wl,-x -dynamiclib -undefined dynamic_lookup") - _CONFIG_VARS['CCSHARED'] = " -dynamiclib" - _CONFIG_VARS['SO'] = ".dylib" - customize_compiler(compiler) - finally: - _CONFIG_VARS.clear() - _CONFIG_VARS.update(tmp) - else: - customize_compiler(compiler) + _customize_compiler_for_shlib(compiler) if self.include_dirs is not None: compiler.set_include_dirs(self.include_dirs) @@ -294,3 +316,13 @@ else: self.create_static_lib( objects, basename, output_dir, debug, target_lang ) + + +def _get_config_var_837(name): + """ + In https://github.com/pypa/setuptools/pull/837, we discovered + Python 3.3.0 exposes the extension suffix under the name 'SO'. + """ + if sys.version_info < (3, 3, 1): + name = 'SO' + return get_config_var(name) diff --git a/lib/python3.4/site-packages/setuptools/command/build_py.py b/lib/python3.4/site-packages/setuptools/command/build_py.py index 8623c77..b0314fd 100644 --- a/lib/python3.4/site-packages/setuptools/command/build_py.py +++ b/lib/python3.4/site-packages/setuptools/command/build_py.py @@ -6,14 +6,15 @@ import fnmatch import textwrap import io import distutils.errors -import collections import itertools -from setuptools.extern.six.moves import map +from setuptools.extern import six +from setuptools.extern.six.moves import map, filter, filterfalse try: from setuptools.lib2to3_ex import Mixin2to3 except ImportError: + class Mixin2to3: def run_2to3(self, files, doctests=True): "do nothing" @@ -67,6 +68,9 @@ class build_py(orig.build_py, Mixin2to3): return orig.build_py.__getattr__(self, attr) def build_module(self, module, module_file, package): + if six.PY2 and isinstance(package, six.string_types): + # avoid errors on Python 2 when unicode is passed (#190) + package = package.split('.') outfile, copied = orig.build_py.build_module(self, module, module_file, package) if copied: @@ -94,12 +98,19 @@ class build_py(orig.build_py, Mixin2to3): def find_data_files(self, package, src_dir): """Return filenames for package's data files in 'src_dir'""" - globs = (self.package_data.get('', []) - + self.package_data.get(package, [])) - files = self.manifest_files.get(package, [])[:] - for pattern in globs: - # Each pattern has to be converted to a platform-specific path - files.extend(glob(os.path.join(src_dir, convert_path(pattern)))) + patterns = self._get_platform_patterns( + self.package_data, + package, + src_dir, + ) + globs_expanded = map(glob, patterns) + # flatten the expanded globs into an iterable of matches + globs_matches = itertools.chain.from_iterable(globs_expanded) + glob_files = filter(os.path.isfile, globs_matches) + files = itertools.chain( + self.manifest_files.get(package, []), + glob_files, + ) return self.exclude_data_files(package, src_dir, files) def build_package_data(self): @@ -184,26 +195,63 @@ class build_py(orig.build_py, Mixin2to3): def exclude_data_files(self, package, src_dir, files): """Filter filenames for package's data files in 'src_dir'""" - globs = ( - self.exclude_package_data.get('', []) - + self.exclude_package_data.get(package, []) + files = list(files) + patterns = self._get_platform_patterns( + self.exclude_package_data, + package, + src_dir, ) - bad = set( - item - for pattern in globs - for item in fnmatch.filter( - files, - os.path.join(src_dir, convert_path(pattern)), - ) + match_groups = ( + fnmatch.filter(files, pattern) + for pattern in patterns ) - seen = collections.defaultdict(itertools.count) - return [ + # flatten the groups of matches into an iterable of matches + matches = itertools.chain.from_iterable(match_groups) + bad = set(matches) + keepers = ( fn for fn in files if fn not in bad - # ditch dupes - and not next(seen[fn]) - ] + ) + # ditch dupes + return list(_unique_everseen(keepers)) + + @staticmethod + def _get_platform_patterns(spec, package, src_dir): + """ + yield platform-specific path patterns (suitable for glob + or fn_match) from a glob-based spec (such as + self.package_data or self.exclude_package_data) + matching package in src_dir. + """ + raw_patterns = itertools.chain( + spec.get('', []), + spec.get(package, []), + ) + return ( + # Each pattern has to be converted to a platform-specific path + os.path.join(src_dir, convert_path(pattern)) + for pattern in raw_patterns + ) + + +# from Python docs +def _unique_everseen(iterable, key=None): + "List unique elements, preserving order. Remember all elements ever seen." + # unique_everseen('AAAABBBCCDAABBB') --> A B C D + # unique_everseen('ABBCcAD', str.lower) --> A B C D + seen = set() + seen_add = seen.add + if key is None: + for element in filterfalse(seen.__contains__, iterable): + seen_add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen_add(k) + yield element def assert_relative(path): diff --git a/lib/python3.4/site-packages/setuptools/command/develop.py b/lib/python3.4/site-packages/setuptools/command/develop.py index 11b5df1..85b23c6 100644 --- a/lib/python3.4/site-packages/setuptools/command/develop.py +++ b/lib/python3.4/site-packages/setuptools/command/develop.py @@ -9,10 +9,11 @@ from setuptools.extern import six from pkg_resources import Distribution, PathMetadata, normalize_path from setuptools.command.easy_install import easy_install +from setuptools import namespaces import setuptools -class develop(easy_install): +class develop(namespaces.DevelopInstaller, easy_install): """Set up package for development""" description = "install package in 'development mode'" @@ -30,6 +31,7 @@ class develop(easy_install): if self.uninstall: self.multi_version = True self.uninstall_link() + self.uninstall_namespaces() else: self.install_for_development() self.warn_deprecated_options() @@ -77,15 +79,28 @@ class develop(easy_install): project_name=ei.egg_name ) - p = self.egg_base.replace(os.sep, '/') - if p != os.curdir: - p = '../' * (p.count('/') + 1) - self.setup_path = p - p = normalize_path(os.path.join(self.install_dir, self.egg_path, p)) - if p != normalize_path(os.curdir): + self.setup_path = self._resolve_setup_path( + self.egg_base, + self.install_dir, + self.egg_path, + ) + + @staticmethod + def _resolve_setup_path(egg_base, install_dir, egg_path): + """ + Generate a path from egg_base back to '.' where the + setup script resides and ensure that path points to the + setup path from $install_dir/$egg_path. + """ + path_to_setup = egg_base.replace(os.sep, '/').rstrip('/') + if path_to_setup != os.curdir: + path_to_setup = '../' * (path_to_setup.count('/') + 1) + resolved = normalize_path(os.path.join(install_dir, egg_path, path_to_setup)) + if resolved != normalize_path(os.curdir): raise DistutilsOptionError( "Can't get a consistent path to setup script from" - " installation directory", p, normalize_path(os.curdir)) + " installation directory", resolved, normalize_path(os.curdir)) + return path_to_setup def install_for_development(self): if six.PY3 and getattr(self.distribution, 'use_2to3', False): @@ -123,6 +138,8 @@ class develop(easy_install): self.easy_install(setuptools.bootstrap_install_from) setuptools.bootstrap_install_from = None + self.install_namespaces() + # create an .egg-link in the installation dir, pointing to our egg log.info("Creating %s (link to %s)", self.egg_link, self.egg_base) if not self.dry_run: @@ -186,6 +203,7 @@ class VersionlessRequirement(object): >>> str(adapted_dist.as_requirement()) 'foo' """ + def __init__(self, dist): self.__dist = dist diff --git a/lib/python3.4/site-packages/setuptools/command/dist_info.py b/lib/python3.4/site-packages/setuptools/command/dist_info.py new file mode 100644 index 0000000..c8dc659 --- /dev/null +++ b/lib/python3.4/site-packages/setuptools/command/dist_info.py @@ -0,0 +1,37 @@ +""" +Create a dist_info directory +As defined in the wheel specification +""" + +import os +import shutil + +from distutils.core import Command + + +class dist_info(Command): + + description = 'create a .dist-info directory' + + user_options = [ + ('egg-base=', 'e', "directory containing .egg-info directories" + " (default: top of the source tree)"), + ] + + def initialize_options(self): + self.egg_base = None + + def finalize_options(self): + pass + + def run(self): + egg_info = self.get_finalized_command('egg_info') + egg_info.run() + dist_info_dir = egg_info.egg_info[:-len('.egg-info')] + '.dist-info' + + bdist_wheel = self.get_finalized_command('bdist_wheel') + bdist_wheel.egg2dist(egg_info.egg_info, dist_info_dir) + + if self.egg_base: + shutil.move(dist_info_dir, os.path.join( + self.egg_base, dist_info_dir)) diff --git a/lib/python3.4/site-packages/setuptools/command/easy_install.py b/lib/python3.4/site-packages/setuptools/command/easy_install.py index 9fc287e..8fba7b4 100644 --- a/lib/python3.4/site-packages/setuptools/command/easy_install.py +++ b/lib/python3.4/site-packages/setuptools/command/easy_install.py @@ -1,5 +1,4 @@ #!/usr/bin/env python - """ Easy Install ------------ @@ -8,15 +7,17 @@ A tool for doing automatic download/extract/build of distutils-based Python packages. For detailed documentation, see the accompanying EasyInstall.txt file, or visit the `EasyInstall home page`__. -__ https://pythonhosted.org/setuptools/easy_install.html +__ https://setuptools.readthedocs.io/en/latest/easy_install.html """ from glob import glob from distutils.util import get_platform from distutils.util import convert_path, subst_vars -from distutils.errors import DistutilsArgError, DistutilsOptionError, \ - DistutilsError, DistutilsPlatformError +from distutils.errors import ( + DistutilsArgError, DistutilsOptionError, + DistutilsError, DistutilsPlatformError, +) from distutils.command.install import INSTALL_SCHEMES, SCHEME_KEYS from distutils import log, dir_util from distutils.command.build_scripts import first_line_re @@ -30,7 +31,6 @@ import zipfile import re import stat import random -import platform import textwrap import warnings import site @@ -46,10 +46,12 @@ from setuptools.extern.six.moves import configparser, map from setuptools import Command from setuptools.sandbox import run_setup from setuptools.py31compat import get_path, get_config_vars +from setuptools.py27compat import rmtree_safe from setuptools.command import setopt from setuptools.archive_util import unpack_archive -from setuptools.package_index import PackageIndex -from setuptools.package_index import URL_SCHEME +from setuptools.package_index import ( + PackageIndex, parse_requirement_arg, URL_SCHEME, +) from setuptools.command import bdist_egg, egg_info from pkg_resources import ( yield_lines, normalize_path, resource_string, ensure_directory, @@ -57,12 +59,11 @@ from pkg_resources import ( Distribution, PathMetadata, EggMetadata, WorkingSet, DistributionNotFound, VersionConflict, DEVELOP_DIST, ) -import pkg_resources +import pkg_resources.py31compat # Turn on PEP440Warnings warnings.filterwarnings("default", category=pkg_resources.PEP440Warning) - __all__ = [ 'samefile', 'easy_install', 'PthDistributions', 'extract_wininst_cfg', 'main', 'get_exe_prefixes', @@ -74,6 +75,12 @@ def is_64bit(): def samefile(p1, p2): + """ + Determine if two paths reference the same file. + + Augments os.path.samefile to work on Windows and + suppresses errors if the path doesn't exist. + """ both_exist = os.path.exists(p1) and os.path.exists(p2) use_samefile = hasattr(os.path, 'samefile') and both_exist if use_samefile: @@ -84,6 +91,7 @@ def samefile(p1, p2): if six.PY2: + def _to_ascii(s): return s @@ -94,6 +102,7 @@ if six.PY2: except UnicodeError: return False else: + def _to_ascii(s): return s.encode('ascii') @@ -105,6 +114,9 @@ else: return False +_one_liner = lambda text: textwrap.dedent(text).strip().replace('\n', '; ') + + class easy_install(Command): """Manage a download/build/install process""" description = "Find/get/install Python packages" @@ -136,15 +148,13 @@ class easy_install(Command): ('local-snapshots-ok', 'l', "allow building eggs from local checkouts"), ('version', None, "print version information and exit"), - ('install-layout=', None, "installation layout to choose (known values: deb)"), - ('force-installation-into-system-dir', '0', "force installation into /usr"), ('no-find-links', None, "Don't load find-links defined in packages being installed") ] boolean_options = [ 'zip-ok', 'multi-version', 'exclude-scripts', 'upgrade', 'always-copy', 'editable', - 'no-deps', 'local-snapshots-ok', 'version', 'force-installation-into-system-dir' + 'no-deps', 'local-snapshots-ok', 'version' ] if site.ENABLE_USER_SITE: @@ -192,11 +202,6 @@ class easy_install(Command): self.site_dirs = None self.installed_projects = {} self.sitepy_installed = False - # enable custom installation, known values: deb - self.install_layout = None - self.force_installation_into_system_dir = None - self.multiarch = None - # Always read easy_install options, even if we are subclassed, or have # an independent instance created. This ensures that defaults will # always come from the standard configuration file(s)' "easy_install" @@ -265,15 +270,10 @@ class easy_install(Command): self.expand_basedirs() self.expand_dirs() - if self.install_layout: - if not self.install_layout.lower() in ['deb']: - raise DistutilsOptionError("unknown value for --install-layout") - self.install_layout = self.install_layout.lower() - import sysconfig - if sys.version_info[:2] >= (3, 3): - self.multiarch = sysconfig.get_config_var('MULTIARCH') - self._expand('install_dir', 'script_dir', 'build_directory', - 'site_dirs') + self._expand( + 'install_dir', 'script_dir', 'build_directory', + 'site_dirs', + ) # If a non-default installation directory was specified, default the # script directory to match it. if self.script_dir is None: @@ -296,15 +296,6 @@ class easy_install(Command): if self.user and self.install_purelib: self.install_dir = self.install_purelib self.script_dir = self.install_scripts - - if self.prefix == '/usr' and not self.force_installation_into_system_dir: - raise DistutilsOptionError("""installation into /usr - -Trying to install into the system managed parts of the file system. Please -consider to install to another location, or use the option ---force-installation-into-system-dir to overwrite this warning. -""") - # default --record from the install command self.set_undefined_options('install', ('record', 'record')) # Should this be moved to the if statement below? It's not used @@ -402,9 +393,15 @@ consider to install to another location, or use the option def expand_dirs(self): """Calls `os.path.expanduser` on install dirs.""" - self._expand_attrs(['install_purelib', 'install_platlib', - 'install_lib', 'install_headers', - 'install_scripts', 'install_data', ]) + dirs = [ + 'install_purelib', + 'install_platlib', + 'install_lib', + 'install_headers', + 'install_scripts', + 'install_data', + ] + self._expand_attrs(dirs) def run(self): if self.verbose != self.distribution.verbose: @@ -436,7 +433,7 @@ consider to install to another location, or use the option """ try: pid = os.getpid() - except: + except Exception: pid = random.randint(0, sys.maxsize) return os.path.join(self.install_dir, "test-easy-install-%s" % pid) @@ -477,8 +474,7 @@ consider to install to another location, or use the option else: self.pth_file = None - PYTHONPATH = os.environ.get('PYTHONPATH', '').split(os.pathsep) - if instdir not in map(normalize_path, filter(None, PYTHONPATH)): + if instdir not in map(normalize_path, _pythonpath()): # only PYTHONPATH dirs need a site.py, so pretend it's there self.sitepy_installed = True elif self.multi_version and not os.path.exists(pth_file): @@ -517,7 +513,7 @@ consider to install to another location, or use the option For information on other options, you may wish to consult the documentation at: - https://pythonhosted.org/setuptools/easy_install.html + https://setuptools.readthedocs.io/en/latest/easy_install.html Please make the appropriate changes for your system and try again. """).lstrip() @@ -538,27 +534,34 @@ consider to install to another location, or use the option pth_file = self.pseudo_tempname() + ".pth" ok_file = pth_file + '.ok' ok_exists = os.path.exists(ok_file) + tmpl = _one_liner(""" + import os + f = open({ok_file!r}, 'w') + f.write('OK') + f.close() + """) + '\n' try: if ok_exists: os.unlink(ok_file) dirname = os.path.dirname(ok_file) - if not os.path.exists(dirname): - os.makedirs(dirname) + pkg_resources.py31compat.makedirs(dirname, exist_ok=True) f = open(pth_file, 'w') except (OSError, IOError): self.cant_write_to_target() else: try: - f.write("import os; f = open(%r, 'w'); f.write('OK'); " - "f.close()\n" % (ok_file,)) + f.write(tmpl.format(**locals())) f.close() f = None executable = sys.executable if os.name == 'nt': dirname, basename = os.path.split(executable) alt = os.path.join(dirname, 'pythonw.exe') - if (basename.lower() == 'python.exe' and - os.path.exists(alt)): + use_alt = ( + basename.lower() == 'python.exe' and + os.path.exists(alt) + ) + if use_alt: # use pythonw.exe to avoid opening a console window executable = alt @@ -623,20 +626,26 @@ consider to install to another location, or use the option (spec.key, self.build_directory) ) + @contextlib.contextmanager + def _tmpdir(self): + tmpdir = tempfile.mkdtemp(prefix=six.u("easy_install-")) + try: + # cast to str as workaround for #709 and #710 and #712 + yield str(tmpdir) + finally: + os.path.exists(tmpdir) and rmtree(rmtree_safe(tmpdir)) + def easy_install(self, spec, deps=False): - tmpdir = tempfile.mkdtemp(prefix="easy_install-") - download = None if not self.editable: self.install_site_py() - try: + with self._tmpdir() as tmpdir: if not isinstance(spec, Requirement): if URL_SCHEME(spec): # It's a url, download it to tmpdir and process self.not_editable(spec) - download = self.package_index.download(spec, tmpdir) - return self.install_item(None, download, tmpdir, deps, - True) + dl = self.package_index.download(spec, tmpdir) + return self.install_item(None, dl, tmpdir, deps, True) elif os.path.exists(spec): # Existing file or directory, just process it directly @@ -662,10 +671,6 @@ consider to install to another location, or use the option else: return self.install_item(spec, dist.location, tmpdir, deps) - finally: - if os.path.exists(tmpdir): - rmtree(tmpdir) - def install_item(self, spec, download, tmpdir, deps, install_needed=False): # Installation is also needed if file in tmpdir or is not an egg @@ -733,10 +738,7 @@ consider to install to another location, or use the option elif requirement is None or dist not in requirement: # if we wound up with a different version, resolve what we've got distreq = dist.as_requirement() - requirement = requirement or distreq - requirement = Requirement( - distreq.project_name, distreq.specs, requirement.extras - ) + requirement = Requirement(str(distreq)) log.info("Processing dependencies for %s", requirement) try: distros = WorkingSet([]).resolve( @@ -765,8 +767,9 @@ consider to install to another location, or use the option def maybe_move(self, spec, dist_filename, setup_base): dst = os.path.join(self.build_directory, spec.key) if os.path.exists(dst): - msg = ("%r already exists in %s; build directory %s will not be " - "kept") + msg = ( + "%r already exists in %s; build directory %s will not be kept" + ) log.warn(msg, spec.key, self.build_directory, setup_base) return setup_base if os.path.isdir(dist_filename): @@ -806,7 +809,7 @@ consider to install to another location, or use the option There are a couple of template scripts in the package. This function loads one of them and prepares it for use. """ - # See https://bitbucket.org/pypa/setuptools/issue/134 for info + # See https://github.com/pypa/setuptools/issues/134 for info # on script file naming and downstream issues with SVR4 name = 'script.tmpl' if dev_path: @@ -884,8 +887,10 @@ consider to install to another location, or use the option return Distribution.from_filename(egg_path, metadata=metadata) def install_egg(self, egg_path, tmpdir): - destination = os.path.join(self.install_dir, - os.path.basename(egg_path)) + destination = os.path.join( + self.install_dir, + os.path.basename(egg_path), + ) destination = os.path.abspath(destination) if not self.dry_run: ensure_directory(destination) @@ -895,8 +900,11 @@ consider to install to another location, or use the option if os.path.isdir(destination) and not os.path.islink(destination): dir_util.remove_tree(destination, dry_run=self.dry_run) elif os.path.exists(destination): - self.execute(os.unlink, (destination,), "Removing " + - destination) + self.execute( + os.unlink, + (destination,), + "Removing " + destination, + ) try: new_dist_is_zipped = False if os.path.isdir(egg_path): @@ -913,13 +921,19 @@ consider to install to another location, or use the option f, m = shutil.move, "Moving" else: f, m = shutil.copy2, "Copying" - self.execute(f, (egg_path, destination), - (m + " %s to %s") % - (os.path.basename(egg_path), - os.path.dirname(destination))) - update_dist_caches(destination, - fix_zipimporter_caches=new_dist_is_zipped) - except: + self.execute( + f, + (egg_path, destination), + (m + " %s to %s") % ( + os.path.basename(egg_path), + os.path.dirname(destination) + ), + ) + update_dist_caches( + destination, + fix_zipimporter_caches=new_dist_is_zipped, + ) + except Exception: update_dist_caches(destination, fix_zipimporter_caches=False) raise @@ -941,8 +955,8 @@ consider to install to another location, or use the option ) # Convert the .exe to an unpacked egg - egg_path = dist.location = os.path.join(tmpdir, dist.egg_name() + - '.egg') + egg_path = os.path.join(tmpdir, dist.egg_name() + '.egg') + dist.location = egg_path egg_tmp = egg_path + '.tmp' _egg_info = os.path.join(egg_tmp, 'EGG-INFO') pkg_inf = os.path.join(_egg_info, 'PKG-INFO') @@ -960,13 +974,13 @@ consider to install to another location, or use the option f.close() script_dir = os.path.join(_egg_info, 'scripts') # delete entry-point scripts to avoid duping - self.delete_blockers( - [os.path.join(script_dir, args[0]) for args in - ScriptWriter.get_args(dist)] - ) + self.delete_blockers([ + os.path.join(script_dir, args[0]) + for args in ScriptWriter.get_args(dist) + ]) # Build .egg file from tmpdir bdist_egg.make_zipfile( - egg_path, egg_tmp, verbose=self.verbose, dry_run=self.dry_run + egg_path, egg_tmp, verbose=self.verbose, dry_run=self.dry_run, ) # install the .egg return self.install_egg(egg_path, tmpdir) @@ -1154,7 +1168,7 @@ consider to install to another location, or use the option if dist.location in self.pth_file.paths: log.info( "%s is already the active version in easy-install.pth", - dist + dist, ) else: log.info("Adding %s to easy-install.pth file", dist) @@ -1215,7 +1229,7 @@ consider to install to another location, or use the option if self.optimize: byte_compile( to_compile, optimize=self.optimize, force=1, - dry_run=self.dry_run + dry_run=self.dry_run, ) finally: log.set_verbosity(self.verbose) # restore original verbosity @@ -1246,7 +1260,8 @@ consider to install to another location, or use the option * You can set up the installation directory to support ".pth" files by using one of the approaches described here: - https://pythonhosted.org/setuptools/easy_install.html#custom-installation-locations + https://setuptools.readthedocs.io/en/latest/easy_install.html#custom-installation-locations + Please make the appropriate changes for your system and try again.""").lstrip() @@ -1262,17 +1277,14 @@ consider to install to another location, or use the option sitepy = os.path.join(self.install_dir, "site.py") source = resource_string("setuptools", "site-patch.py") + source = source.decode('utf-8') current = "" if os.path.exists(sitepy): log.debug("Checking existing site.py in %s", self.install_dir) - f = open(sitepy, 'rb') - current = f.read() - # we want str, not bytes - if six.PY3: - current = current.decode() + with io.open(sitepy) as strm: + current = strm.read() - f.close() if not current.startswith('def __boot():'): raise DistutilsError( "%s is not a setuptools-generated site.py; please" @@ -1283,9 +1295,8 @@ consider to install to another location, or use the option log.info("Creating %s", sitepy) if not self.dry_run: ensure_directory(sitepy) - f = open(sitepy, 'wb') - f.write(source) - f.close() + with io.open(sitepy, 'w', encoding='utf-8') as strm: + strm.write(source) self.byte_compile([sitepy]) self.sitepy_installed = True @@ -1300,28 +1311,11 @@ consider to install to another location, or use the option self.debug_print("os.makedirs('%s', 0o700)" % path) os.makedirs(path, 0o700) - if sys.version[:3] in ('2.3', '2.4', '2.5') or 'real_prefix' in sys.__dict__: - sitedir_name = 'site-packages' - else: - sitedir_name = 'dist-packages' - INSTALL_SCHEMES = dict( posix=dict( install_dir='$base/lib/python$py_version_short/site-packages', script_dir='$base/bin', ), - unix_local = dict( - install_dir = '$base/local/lib/python$py_version_short/%s' % sitedir_name, - script_dir = '$base/local/bin', - ), - posix_local = dict( - install_dir = '$base/local/lib/python$py_version_short/%s' % sitedir_name, - script_dir = '$base/local/bin', - ), - deb_system = dict( - install_dir = '$base/lib/python3/%s' % sitedir_name, - script_dir = '$base/bin', - ), ) DEFAULT_SCHEME = dict( @@ -1332,18 +1326,11 @@ consider to install to another location, or use the option def _expand(self, *attrs): config_vars = self.get_finalized_command('install').config_vars - if self.prefix or self.install_layout: - if self.install_layout and self.install_layout in ['deb']: - scheme_name = "deb_system" - self.prefix = '/usr' - elif self.prefix or 'real_prefix' in sys.__dict__: - scheme_name = os.name - else: - scheme_name = "posix_local" + if self.prefix: # Set default install_dir/scripts from --prefix config_vars = config_vars.copy() config_vars['base'] = self.prefix - scheme = self.INSTALL_SCHEMES.get(scheme_name,self.DEFAULT_SCHEME) + scheme = self.INSTALL_SCHEMES.get(os.name, self.DEFAULT_SCHEME) for attr, val in scheme.items(): if getattr(self, attr, None) is None: setattr(self, attr, val) @@ -1359,10 +1346,21 @@ consider to install to another location, or use the option setattr(self, attr, val) +def _pythonpath(): + items = os.environ.get('PYTHONPATH', '').split(os.pathsep) + return filter(None, items) + + def get_site_dirs(): - # return a list of 'site' dirs - sitedirs = [_f for _f in os.environ.get('PYTHONPATH', - '').split(os.pathsep) if _f] + """ + Return a list of 'site' dirs + """ + + sitedirs = [] + + # start with PYTHONPATH + sitedirs.extend(_pythonpath()) + prefixes = [sys.prefix] if sys.exec_prefix != sys.prefix: prefixes.append(sys.exec_prefix) @@ -1371,20 +1369,20 @@ def get_site_dirs(): if sys.platform in ('os2emx', 'riscos'): sitedirs.append(os.path.join(prefix, "Lib", "site-packages")) elif os.sep == '/': - sitedirs.extend([os.path.join(prefix, - "lib", - "python" + sys.version[:3], - "site-packages"), - os.path.join(prefix, "lib", "site-python")]) + sitedirs.extend([ + os.path.join( + prefix, + "lib", + "python" + sys.version[:3], + "site-packages", + ), + os.path.join(prefix, "lib", "site-python"), + ]) else: - if sys.version[:3] in ('2.3', '2.4', '2.5'): - sdir = "site-packages" - else: - sdir = "dist-packages" - sitedirs.extend( - [os.path.join(prefix, "local/lib", "python" + sys.version[:3], sdir), - os.path.join(prefix, "lib", "python" + sys.version[:3], sdir)] - ) + sitedirs.extend([ + prefix, + os.path.join(prefix, "lib", "site-packages"), + ]) if sys.platform == 'darwin': # for framework builds *only* we add the standard Apple # locations. Currently only per-user, but /Library and @@ -1392,12 +1390,14 @@ def get_site_dirs(): if 'Python.framework' in prefix: home = os.environ.get('HOME') if home: - sitedirs.append( - os.path.join(home, - 'Library', - 'Python', - sys.version[:3], - 'site-packages')) + home_sp = os.path.join( + home, + 'Library', + 'Python', + sys.version[:3], + 'site-packages', + ) + sitedirs.append(home_sp) lib_paths = get_path('purelib'), get_path('platlib') for site_lib in lib_paths: if site_lib not in sitedirs: @@ -1406,6 +1406,11 @@ def get_site_dirs(): if site.ENABLE_USER_SITE: sitedirs.append(site.USER_SITE) + try: + sitedirs.extend(site.getsitepackages()) + except AttributeError: + pass + sitedirs = list(map(normalize_path, sitedirs)) return sitedirs @@ -1473,8 +1478,8 @@ def extract_wininst_cfg(dist_filename): return None # not a valid tag f.seek(prepended - (12 + cfglen)) - cfg = configparser.RawConfigParser( - {'version': '', 'target_version': ''}) + init = {'version': '', 'target_version': ''} + cfg = configparser.RawConfigParser(init) try: part = f.read(cfglen) # Read up to the first null byte. @@ -1497,7 +1502,8 @@ def get_exe_prefixes(exe_filename): """Get exe->egg path translations for a given .exe file""" prefixes = [ - ('PURELIB/', ''), ('PLATLIB/pywin32_system32', ''), + ('PURELIB/', ''), + ('PLATLIB/pywin32_system32', ''), ('PLATLIB/', ''), ('SCRIPTS/', 'EGG-INFO/scripts/'), ('DATA/lib/site-packages', ''), @@ -1531,15 +1537,6 @@ def get_exe_prefixes(exe_filename): return prefixes -def parse_requirement_arg(spec): - try: - return Requirement.parse(spec) - except ValueError: - raise DistutilsError( - "Not a URL, existing file, or requirement spec: %r" % (spec,) - ) - - class PthDistributions(Environment): """A .pth file with Distribution paths in it""" @@ -1649,7 +1646,6 @@ class PthDistributions(Environment): class RewritePthDistributions(PthDistributions): - @classmethod def _wrap_lines(cls, lines): yield cls.prelude @@ -1657,12 +1653,11 @@ class RewritePthDistributions(PthDistributions): yield line yield cls.postlude - _inline = lambda text: textwrap.dedent(text).strip().replace('\n', '; ') - prelude = _inline(""" + prelude = _one_liner(""" import sys sys.__plen = len(sys.path) """) - postlude = _inline(""" + postlude = _one_liner(""" import sys new = sys.path[sys.__plen:] del sys.path[sys.__plen:] @@ -1672,7 +1667,7 @@ class RewritePthDistributions(PthDistributions): """) -if os.environ.get('SETUPTOOLS_SYS_PATH_TECHNIQUE', 'rewrite') == 'rewrite': +if os.environ.get('SETUPTOOLS_SYS_PATH_TECHNIQUE', 'raw') == 'rewrite': PthDistributions = RewritePthDistributions @@ -1689,7 +1684,7 @@ def _first_line_re(): def auto_chmod(func, arg, exc): - if func is os.remove and os.name == 'nt': + if func in [os.unlink, os.remove] and os.name == 'nt': chmod(arg, stat.S_IWRITE) return func(arg) et, ev, _ = sys.exc_info() @@ -1821,7 +1816,7 @@ def _update_zipimporter_cache(normalized_path, cache, updater=None): # * Does not support the dict.pop() method, forcing us to use the # get/del patterns instead. For more detailed information see the # following links: - # https://bitbucket.org/pypa/setuptools/issue/202/more-robust-zipimporter-cache-invalidation#comment-10495960 + # https://github.com/pypa/setuptools/issues/202#issuecomment-202913420 # https://bitbucket.org/pypy/pypy/src/dd07756a34a41f674c0cacfbc8ae1d4cc9ea2ae4/pypy/module/zipimport/interp_zipimport.py#cl-99 old_entry = cache[p] del cache[p] @@ -1842,6 +1837,7 @@ def _remove_and_clear_zip_directory_cache_data(normalized_path): normalized_path, zipimport._zip_directory_cache, updater=clear_and_remove_cached_zip_archive_directory_data) + # PyPy Python implementation does not allow directly writing to the # zipimport._zip_directory_cache and so prevents us from attempting to correct # its content. The best we can do there is clear the problematic cache content @@ -1854,6 +1850,7 @@ if '__pypy__' in sys.builtin_module_names: _replace_zip_directory_cache_data = \ _remove_and_clear_zip_directory_cache_data else: + def _replace_zip_directory_cache_data(normalized_path): def replace_cached_zip_archive_directory_data(path, old_entry): # N.B. In theory, we could load the zip directory information just @@ -1996,11 +1993,21 @@ class CommandSpec(list): def as_header(self): return self._render(self + list(self.options)) + @staticmethod + def _strip_quotes(item): + _QUOTES = '"\'' + for q in _QUOTES: + if item.startswith(q) and item.endswith(q): + return item[1:-1] + return item + @staticmethod def _render(items): - cmdline = subprocess.list2cmdline(items) + cmdline = subprocess.list2cmdline( + CommandSpec._strip_quotes(item.strip()) for item in items) return '#!' + cmdline + '\n' + # For pbr compat; will be removed in a future version. sys_executable = CommandSpec._sys_executable() @@ -2015,13 +2022,15 @@ class ScriptWriter(object): gui apps. """ - template = textwrap.dedent(""" + template = textwrap.dedent(r""" # EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r __requires__ = %(spec)r + import re import sys from pkg_resources import load_entry_point if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) sys.exit( load_entry_point(%(spec)r, %(group)r, %(name)r)() ) @@ -2130,8 +2139,11 @@ class WindowsScriptWriter(ScriptWriter): "For Windows, add a .py extension" ext = dict(console='.pya', gui='.pyw')[type_] if ext not in os.environ['PATHEXT'].lower().split(';'): - warnings.warn("%s not listed in PATHEXT; scripts will not be " - "recognized as executables." % ext, UserWarning) + msg = ( + "{ext} not listed in PATHEXT; scripts will not be " + "recognized as executables." + ).format(**locals()) + warnings.warn(msg, UserWarning) old = ['.pya', '.py', '-script.py', '.pyc', '.pyo', '.pyw', '.exe'] old.remove(ext) header = cls._adjust_header(type_, header) @@ -2210,8 +2222,6 @@ def get_win_launcher(type): Returns the executable as a byte string. """ launcher_fn = '%s.exe' % type - if platform.machine().lower() == 'arm': - launcher_fn = launcher_fn.replace(".", "-arm.") if is_64bit(): launcher_fn = launcher_fn.replace(".", "-64.") else: @@ -2228,39 +2238,7 @@ def load_launcher_manifest(name): def rmtree(path, ignore_errors=False, onerror=auto_chmod): - """Recursively delete a directory tree. - - This code is taken from the Python 2.4 version of 'shutil', because - the 2.3 version doesn't really work right. - """ - if ignore_errors: - def onerror(*args): - pass - elif onerror is None: - def onerror(*args): - raise - 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()) + return shutil.rmtree(path, ignore_errors, onerror) def current_umask(): @@ -2297,7 +2275,8 @@ def main(argv=None, **kw): setup( script_args=['-q', 'easy_install', '-v'] + argv, script_name=sys.argv[0] or 'easy_install', - distclass=DistributionWithoutHelpCommands, **kw + distclass=DistributionWithoutHelpCommands, + **kw ) diff --git a/lib/python3.4/site-packages/setuptools/command/egg_info.py b/lib/python3.4/site-packages/setuptools/command/egg_info.py index d1bd9b0..a183d15 100644 --- a/lib/python3.4/site-packages/setuptools/command/egg_info.py +++ b/lib/python3.4/site-packages/setuptools/command/egg_info.py @@ -3,6 +3,7 @@ Create a distribution's .egg-info directory and contents""" from distutils.filelist import FileList as _FileList +from distutils.errors import DistutilsInternalError from distutils.util import convert_path from distutils import log import distutils.errors @@ -13,6 +14,7 @@ import sys import io import warnings import time +import collections from setuptools.extern import six from setuptools.extern.six.moves import map @@ -26,13 +28,92 @@ from pkg_resources import ( parse_requirements, safe_name, parse_version, safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename) import setuptools.unicode_utils as unicode_utils +from setuptools.glob import glob from pkg_resources.extern import packaging -try: - from setuptools_svn import svn_utils -except ImportError: - pass + +def translate_pattern(glob): + """ + Translate a file path glob like '*.txt' in to a regular expression. + This differs from fnmatch.translate which allows wildcards to match + directory separators. It also knows about '**/' which matches any number of + directories. + """ + pat = '' + + # This will split on '/' within [character classes]. This is deliberate. + chunks = glob.split(os.path.sep) + + sep = re.escape(os.sep) + valid_char = '[^%s]' % (sep,) + + for c, chunk in enumerate(chunks): + last_chunk = c == len(chunks) - 1 + + # Chunks that are a literal ** are globstars. They match anything. + if chunk == '**': + if last_chunk: + # Match anything if this is the last component + pat += '.*' + else: + # Match '(name/)*' + pat += '(?:%s+%s)*' % (valid_char, sep) + continue # Break here as the whole path component has been handled + + # Find any special characters in the remainder + i = 0 + chunk_len = len(chunk) + while i < chunk_len: + char = chunk[i] + if char == '*': + # Match any number of name characters + pat += valid_char + '*' + elif char == '?': + # Match a name character + pat += valid_char + elif char == '[': + # Character class + inner_i = i + 1 + # Skip initial !/] chars + if inner_i < chunk_len and chunk[inner_i] == '!': + inner_i = inner_i + 1 + if inner_i < chunk_len and chunk[inner_i] == ']': + inner_i = inner_i + 1 + + # Loop till the closing ] is found + while inner_i < chunk_len and chunk[inner_i] != ']': + inner_i = inner_i + 1 + + if inner_i >= chunk_len: + # Got to the end of the string without finding a closing ] + # Do not treat this as a matching group, but as a literal [ + pat += re.escape(char) + else: + # Grab the insides of the [brackets] + inner = chunk[i + 1:inner_i] + char_class = '' + + # Class negation + if inner[0] == '!': + char_class = '^' + inner = inner[1:] + + char_class += re.escape(inner) + pat += '[%s]' % (char_class,) + + # Skip to the end ] + i = inner_i + else: + pat += re.escape(char) + i += 1 + + # Join each chunk with the dir separator + if not last_chunk: + pat += sep + + pat += r'\Z' + return re.compile(pat, flags=re.MULTILINE|re.DOTALL) class egg_info(Command): @@ -41,18 +122,15 @@ class egg_info(Command): user_options = [ ('egg-base=', 'e', "directory containing .egg-info directories" " (default: top of the source tree)"), - ('tag-svn-revision', 'r', - "Add subversion revision ID to version number"), ('tag-date', 'd', "Add date stamp (e.g. 20050528) to version number"), ('tag-build=', 'b', "Specify explicit tag to add to version number"), - ('no-svn-revision', 'R', - "Don't add subversion revision ID [default]"), ('no-date', 'D', "Don't include date stamp [default]"), ] - boolean_options = ['tag-date', 'tag-svn-revision'] - negative_opt = {'no-svn-revision': 'tag-svn-revision', - 'no-date': 'tag-date'} + boolean_options = ['tag-date'] + negative_opt = { + 'no-date': 'tag-date', + } def initialize_options(self): self.egg_name = None @@ -60,20 +138,36 @@ class egg_info(Command): self.egg_base = None self.egg_info = None self.tag_build = None - self.tag_svn_revision = 0 self.tag_date = 0 self.broken_egg_info = False self.vtags = None + #################################### + # allow the 'tag_svn_revision' to be detected and + # set, supporting sdists built on older Setuptools. + @property + def tag_svn_revision(self): + pass + + @tag_svn_revision.setter + def tag_svn_revision(self, value): + pass + #################################### + def save_version_info(self, filename): - values = dict( - egg_info=dict( - tag_svn_revision=0, - tag_date=0, - tag_build=self.tags(), - ) - ) - edit_config(filename, values) + """ + Materialize the value of date into the + build tag. Install build keys in a deterministic order + to avoid arbitrary reordering on subsequent builds. + """ + # python 2.6 compatibility + odict = getattr(collections, 'OrderedDict', dict) + egg_info = odict() + # follow the order these keys would have been added + # when PYTHONHASHSEED=0 + egg_info['tag_build'] = self.tags() + egg_info['tag_date'] = 0 + edit_config(filename, dict(egg_info=egg_info)) def finalize_options(self): self.egg_name = safe_name(self.distribution.get_name()) @@ -189,18 +283,10 @@ class egg_info(Command): version = '' if self.tag_build: version += self.tag_build - if self.tag_svn_revision: - version += '-r%s' % self.get_svn_revision() if self.tag_date: version += time.strftime("-%Y%m%d") return version - @staticmethod - def get_svn_revision(): - if 'svn_utils' not in globals(): - return "0" - return str(svn_utils.SvnInfo.load(os.curdir).get_revision()) - def find_sources(self): """Generate SOURCES.txt manifest file""" manifest_filename = os.path.join(self.egg_info, "SOURCES.txt") @@ -226,7 +312,155 @@ class egg_info(Command): class FileList(_FileList): - """File list that accepts only existing, platform-independent paths""" + # Implementations of the various MANIFEST.in commands + + def process_template_line(self, line): + # Parse the line: split it up, make sure the right number of words + # is there, and return the relevant words. 'action' is always + # defined: it's the first word of the line. Which of the other + # three are defined depends on the action; it'll be either + # patterns, (dir and patterns), or (dir_pattern). + (action, patterns, dir, dir_pattern) = self._parse_template_line(line) + + # OK, now we know that the action is valid and we have the + # right number of words on the line for that action -- so we + # can proceed with minimal error-checking. + if action == 'include': + self.debug_print("include " + ' '.join(patterns)) + for pattern in patterns: + if not self.include(pattern): + log.warn("warning: no files found matching '%s'", pattern) + + elif action == 'exclude': + self.debug_print("exclude " + ' '.join(patterns)) + for pattern in patterns: + if not self.exclude(pattern): + log.warn(("warning: no previously-included files " + "found matching '%s'"), pattern) + + elif action == 'global-include': + self.debug_print("global-include " + ' '.join(patterns)) + for pattern in patterns: + if not self.global_include(pattern): + log.warn(("warning: no files found matching '%s' " + "anywhere in distribution"), pattern) + + elif action == 'global-exclude': + self.debug_print("global-exclude " + ' '.join(patterns)) + for pattern in patterns: + if not self.global_exclude(pattern): + log.warn(("warning: no previously-included files matching " + "'%s' found anywhere in distribution"), + pattern) + + elif action == 'recursive-include': + self.debug_print("recursive-include %s %s" % + (dir, ' '.join(patterns))) + for pattern in patterns: + if not self.recursive_include(dir, pattern): + log.warn(("warning: no files found matching '%s' " + "under directory '%s'"), + pattern, dir) + + elif action == 'recursive-exclude': + self.debug_print("recursive-exclude %s %s" % + (dir, ' '.join(patterns))) + for pattern in patterns: + if not self.recursive_exclude(dir, pattern): + log.warn(("warning: no previously-included files matching " + "'%s' found under directory '%s'"), + pattern, dir) + + elif action == 'graft': + self.debug_print("graft " + dir_pattern) + if not self.graft(dir_pattern): + log.warn("warning: no directories found matching '%s'", + dir_pattern) + + elif action == 'prune': + self.debug_print("prune " + dir_pattern) + if not self.prune(dir_pattern): + log.warn(("no previously-included directories found " + "matching '%s'"), dir_pattern) + + else: + raise DistutilsInternalError( + "this cannot happen: invalid action '%s'" % action) + + def _remove_files(self, predicate): + """ + Remove all files from the file list that match the predicate. + Return True if any matching files were removed + """ + found = False + for i in range(len(self.files) - 1, -1, -1): + if predicate(self.files[i]): + self.debug_print(" removing " + self.files[i]) + del self.files[i] + found = True + return found + + def include(self, pattern): + """Include files that match 'pattern'.""" + found = [f for f in glob(pattern) if not os.path.isdir(f)] + self.extend(found) + return bool(found) + + def exclude(self, pattern): + """Exclude files that match 'pattern'.""" + match = translate_pattern(pattern) + return self._remove_files(match.match) + + def recursive_include(self, dir, pattern): + """ + Include all files anywhere in 'dir/' that match the pattern. + """ + full_pattern = os.path.join(dir, '**', pattern) + found = [f for f in glob(full_pattern, recursive=True) + if not os.path.isdir(f)] + self.extend(found) + return bool(found) + + def recursive_exclude(self, dir, pattern): + """ + Exclude any file anywhere in 'dir/' that match the pattern. + """ + match = translate_pattern(os.path.join(dir, '**', pattern)) + return self._remove_files(match.match) + + def graft(self, dir): + """Include all files from 'dir/'.""" + found = [ + item + for match_dir in glob(dir) + for item in distutils.filelist.findall(match_dir) + ] + self.extend(found) + return bool(found) + + def prune(self, dir): + """Filter out files from 'dir/'.""" + match = translate_pattern(os.path.join(dir, '**')) + return self._remove_files(match.match) + + def global_include(self, pattern): + """ + Include all files anywhere in the current directory that match the + pattern. This is very inefficient on large file trees. + """ + if self.allfiles is None: + self.findall() + match = translate_pattern(os.path.join('**', pattern)) + found = [f for f in self.allfiles if match.match(f)] + self.extend(found) + return bool(found) + + def global_exclude(self, pattern): + """ + Exclude all files anywhere that match the pattern. + """ + match = translate_pattern(os.path.join('**', pattern)) + return self._remove_files(match.match) def append(self, item): if item.endswith('\r'): # Fix older sdists built on Windows @@ -289,7 +523,6 @@ class manifest_maker(sdist): self.filelist = FileList() if not os.path.exists(self.manifest): self.write_manifest() # it must exist so it'll get in the list - self.filelist.findall() self.add_defaults() if os.path.exists(self.template): self.read_template() @@ -314,10 +547,17 @@ class manifest_maker(sdist): msg = "writing manifest file '%s'" % self.manifest self.execute(write_file, (self.manifest, files), msg) - def warn(self, msg): # suppress missing-file warnings from sdist - if not msg.startswith("standard file not found:"): + def warn(self, msg): + if not self._should_suppress_warning(msg): sdist.warn(self, msg) + @staticmethod + def _should_suppress_warning(msg): + """ + suppress missing-file warnings from sdist + """ + return re.match(r"standard file .*not found", msg) + def add_defaults(self): sdist.add_defaults(self) self.filelist.append(self.template) @@ -328,38 +568,13 @@ class manifest_maker(sdist): elif os.path.exists(self.manifest): self.read_manifest() ei_cmd = self.get_finalized_command('egg_info') - self._add_egg_info(cmd=ei_cmd) - self.filelist.include_pattern("*", prefix=ei_cmd.egg_info) - - def _add_egg_info(self, cmd): - """ - Add paths for egg-info files for an external egg-base. - - The egg-info files are written to egg-base. If egg-base is - outside the current working directory, this method - searchs the egg-base directory for files to include - in the manifest. Uses distutils.filelist.findall (which is - really the version monkeypatched in by setuptools/__init__.py) - to perform the search. - - Since findall records relative paths, prefix the returned - paths with cmd.egg_base, so add_default's include_pattern call - (which is looking for the absolute cmd.egg_info) will match - them. - """ - if cmd.egg_base == os.curdir: - # egg-info files were already added by something else - return - - discovered = distutils.filelist.findall(cmd.egg_base) - resolved = (os.path.join(cmd.egg_base, path) for path in discovered) - self.filelist.allfiles.extend(resolved) + self.filelist.graft(ei_cmd.egg_info) def prune_file_list(self): build = self.get_finalized_command('build') base_dir = self.distribution.get_fullname() - self.filelist.exclude_pattern(None, prefix=build.build_base) - self.filelist.exclude_pattern(None, prefix=base_dir) + self.filelist.prune(build.build_base) + self.filelist.prune(base_dir) sep = re.escape(os.sep) self.filelist.exclude_pattern(r'(^|' + sep + r')(RCS|CVS|\.svn)' + sep, is_regex=1) @@ -384,6 +599,10 @@ def write_pkg_info(cmd, basename, filename): metadata = cmd.distribution.metadata metadata.version, oldver = cmd.egg_version, metadata.version metadata.name, oldname = cmd.egg_name, metadata.name + metadata.long_description_content_type = getattr( + cmd.distribution, + 'long_description_content_type' + ) try: # write unescaped data to PKG-INFO, so older pkg_resources # can still parse it diff --git a/lib/python3.4/site-packages/setuptools/command/install.py b/lib/python3.4/site-packages/setuptools/command/install.py index d2bca2e..31a5ddb 100644 --- a/lib/python3.4/site-packages/setuptools/command/install.py +++ b/lib/python3.4/site-packages/setuptools/command/install.py @@ -8,7 +8,7 @@ import distutils.command.install as orig import setuptools # Prior to numpy 1.9, NumPy relies on the '_install' name, so provide it for -# now. See https://bitbucket.org/pypa/setuptools/issue/199/ +# now. See https://github.com/pypa/setuptools/issues/199/ _install = orig.install diff --git a/lib/python3.4/site-packages/setuptools/command/install_egg_info.py b/lib/python3.4/site-packages/setuptools/command/install_egg_info.py index ae0325d..edc4718 100644 --- a/lib/python3.4/site-packages/setuptools/command/install_egg_info.py +++ b/lib/python3.4/site-packages/setuptools/command/install_egg_info.py @@ -1,14 +1,13 @@ from distutils import log, dir_util -import os, sys - -from setuptools.extern.six.moves import map +import os from setuptools import Command +from setuptools import namespaces from setuptools.archive_util import unpack_archive import pkg_resources -class install_egg_info(Command): +class install_egg_info(namespaces.Installer, Command): """Install an .egg-info directory for the package""" description = "Install an .egg-info directory for the package" @@ -19,31 +18,14 @@ class install_egg_info(Command): def initialize_options(self): self.install_dir = None - self.install_layout = None - self.prefix_option = None def finalize_options(self): self.set_undefined_options('install_lib', ('install_dir', 'install_dir')) - self.set_undefined_options('install',('install_layout','install_layout')) - if sys.hexversion > 0x2060000: - self.set_undefined_options('install',('prefix_option','prefix_option')) ei_cmd = self.get_finalized_command("egg_info") basename = pkg_resources.Distribution( None, None, ei_cmd.egg_name, ei_cmd.egg_version ).egg_name() + '.egg-info' - - if self.install_layout: - if not self.install_layout.lower() in ['deb']: - raise DistutilsOptionError("unknown value for --install-layout") - self.install_layout = self.install_layout.lower() - basename = basename.replace('-py%s' % pkg_resources.PY_MAJOR, '') - elif self.prefix_option or 'real_prefix' in sys.__dict__: - # don't modify for virtualenv - pass - else: - basename = basename.replace('-py%s' % pkg_resources.PY_MAJOR, '') - self.source = ei_cmd.egg_info self.target = os.path.join(self.install_dir, basename) self.outputs = [] @@ -73,66 +55,8 @@ class install_egg_info(Command): for skip in '.svn/', 'CVS/': if src.startswith(skip) or '/' + skip in src: return None - if self.install_layout and self.install_layout in ['deb'] and src.startswith('SOURCES.txt'): - log.info("Skipping SOURCES.txt") - return None self.outputs.append(dst) log.debug("Copying %s to %s", src, dst) return dst unpack_archive(self.source, self.target, skimmer) - - def install_namespaces(self): - nsp = self._get_all_ns_packages() - if not nsp: - return - filename, ext = os.path.splitext(self.target) - filename += '-nspkg.pth' - self.outputs.append(filename) - log.info("Installing %s", filename) - lines = map(self._gen_nspkg_line, nsp) - - if self.dry_run: - # always generate the lines, even in dry run - list(lines) - return - - with open(filename, 'wt') as f: - f.writelines(lines) - - _nspkg_tmpl = ( - "import sys, types, os", - "p = os.path.join(sys._getframe(1).f_locals['sitedir'], *%(pth)r)", - "ie = os.path.exists(os.path.join(p,'__init__.py'))", - "m = not ie and " - "sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))", - "mp = (m or []) and m.__dict__.setdefault('__path__',[])", - "(p not in mp) and mp.append(p)", - ) - "lines for the namespace installer" - - _nspkg_tmpl_multi = ( - 'm and setattr(sys.modules[%(parent)r], %(child)r, m)', - ) - "additional line(s) when a parent package is indicated" - - @classmethod - def _gen_nspkg_line(cls, pkg): - # ensure pkg is not a unicode string under Python 2.7 - pkg = str(pkg) - pth = tuple(pkg.split('.')) - tmpl_lines = cls._nspkg_tmpl - parent, sep, child = pkg.rpartition('.') - if parent: - tmpl_lines += cls._nspkg_tmpl_multi - return ';'.join(tmpl_lines) % locals() + '\n' - - def _get_all_ns_packages(self): - """Return sorted list of all package namespaces""" - nsp = set() - for pkg in self.distribution.namespace_packages or []: - pkg = pkg.split('.') - while pkg: - nsp.add('.'.join(pkg)) - pkg.pop() - return sorted(nsp) diff --git a/lib/python3.4/site-packages/setuptools/command/install_lib.py b/lib/python3.4/site-packages/setuptools/command/install_lib.py index 696b776..2b31c3e 100644 --- a/lib/python3.4/site-packages/setuptools/command/install_lib.py +++ b/lib/python3.4/site-packages/setuptools/command/install_lib.py @@ -1,24 +1,12 @@ import os -import sys import imp from itertools import product, starmap import distutils.command.install_lib as orig + class install_lib(orig.install_lib): """Don't add compiled flags to filenames of non-Python files""" - def initialize_options(self): - orig.install_lib.initialize_options(self) - self.multiarch = None - self.install_layout = None - - def finalize_options(self): - orig.install_lib.finalize_options(self) - self.set_undefined_options('install',('install_layout','install_layout')) - if self.install_layout == 'deb' and sys.version_info[:2] >= (3, 3): - import sysconfig - self.multiarch = sysconfig.get_config_var('MULTIARCH') - def run(self): self.build() outfiles = self.install() @@ -103,8 +91,6 @@ class install_lib(orig.install_lib): exclude = self.get_exclusions() if not exclude: - import distutils.dir_util - distutils.dir_util._multiarch = self.multiarch return orig.install_lib.copy_tree(self, infile, outfile) # Exclude namespace package __init__.py* files from the output @@ -114,24 +100,12 @@ class install_lib(orig.install_lib): outfiles = [] - if self.multiarch: - import sysconfig - ext_suffix = sysconfig.get_config_var ('EXT_SUFFIX') - if ext_suffix.endswith(self.multiarch + ext_suffix[-3:]): - new_suffix = None - else: - new_suffix = "%s-%s%s" % (ext_suffix[:-3], self.multiarch, ext_suffix[-3:]) - def pf(src, dst): if dst in exclude: log.warn("Skipping installation of %s (namespace package)", dst) return False - if self.multiarch and new_suffix and dst.endswith(ext_suffix) and not dst.endswith(new_suffix): - dst = dst.replace(ext_suffix, new_suffix) - log.info("renaming extension to %s", os.path.basename(dst)) - log.info("copying %s -> %s", src, os.path.dirname(dst)) outfiles.append(dst) return dst diff --git a/lib/python3.4/site-packages/setuptools/command/install_scripts.py b/lib/python3.4/site-packages/setuptools/command/install_scripts.py index be66cb2..1623427 100644 --- a/lib/python3.4/site-packages/setuptools/command/install_scripts.py +++ b/lib/python3.4/site-packages/setuptools/command/install_scripts.py @@ -1,6 +1,7 @@ from distutils import log import distutils.command.install_scripts as orig import os +import sys from pkg_resources import Distribution, PathMetadata, ensure_directory @@ -37,6 +38,10 @@ class install_scripts(orig.install_scripts): if is_wininst: exec_param = "python.exe" writer = ei.WindowsScriptWriter + if exec_param == sys.executable: + # In case the path to the Python executable contains a space, wrap + # it so it's not split up. + exec_param = [exec_param] # resolve the writer to the environment writer = writer.best() cmd = writer.command_spec_class.best().from_param(exec_param) diff --git a/lib/python3.4/site-packages/setuptools/command/py36compat.py b/lib/python3.4/site-packages/setuptools/command/py36compat.py new file mode 100644 index 0000000..61063e7 --- /dev/null +++ b/lib/python3.4/site-packages/setuptools/command/py36compat.py @@ -0,0 +1,136 @@ +import os +from glob import glob +from distutils.util import convert_path +from distutils.command import sdist + +from setuptools.extern.six.moves import filter + + +class sdist_add_defaults: + """ + Mix-in providing forward-compatibility for functionality as found in + distutils on Python 3.7. + + Do not edit the code in this class except to update functionality + as implemented in distutils. Instead, override in the subclass. + """ + + def add_defaults(self): + """Add all the default files to self.filelist: + - README or README.txt + - setup.py + - test/test*.py + - all pure Python modules mentioned in setup script + - all files pointed by package_data (build_py) + - all files defined in data_files. + - all files defined as scripts. + - all C sources listed as part of extensions or C libraries + in the setup script (doesn't catch C headers!) + Warns if (README or README.txt) or setup.py are missing; everything + else is optional. + """ + self._add_defaults_standards() + self._add_defaults_optional() + self._add_defaults_python() + self._add_defaults_data_files() + self._add_defaults_ext() + self._add_defaults_c_libs() + self._add_defaults_scripts() + + @staticmethod + def _cs_path_exists(fspath): + """ + Case-sensitive path existence check + + >>> sdist_add_defaults._cs_path_exists(__file__) + True + >>> sdist_add_defaults._cs_path_exists(__file__.upper()) + False + """ + if not os.path.exists(fspath): + return False + # make absolute so we always have a directory + abspath = os.path.abspath(fspath) + directory, filename = os.path.split(abspath) + return filename in os.listdir(directory) + + def _add_defaults_standards(self): + standards = [self.READMES, self.distribution.script_name] + for fn in standards: + if isinstance(fn, tuple): + alts = fn + got_it = False + for fn in alts: + if self._cs_path_exists(fn): + got_it = True + self.filelist.append(fn) + break + + if not got_it: + self.warn("standard file not found: should have one of " + + ', '.join(alts)) + else: + if self._cs_path_exists(fn): + self.filelist.append(fn) + else: + self.warn("standard file '%s' not found" % fn) + + def _add_defaults_optional(self): + optional = ['test/test*.py', 'setup.cfg'] + for pattern in optional: + files = filter(os.path.isfile, glob(pattern)) + self.filelist.extend(files) + + def _add_defaults_python(self): + # build_py is used to get: + # - python modules + # - files defined in package_data + build_py = self.get_finalized_command('build_py') + + # getting python files + if self.distribution.has_pure_modules(): + self.filelist.extend(build_py.get_source_files()) + + # getting package_data files + # (computed in build_py.data_files by build_py.finalize_options) + for pkg, src_dir, build_dir, filenames in build_py.data_files: + for filename in filenames: + self.filelist.append(os.path.join(src_dir, filename)) + + def _add_defaults_data_files(self): + # getting distribution.data_files + if self.distribution.has_data_files(): + for item in self.distribution.data_files: + if isinstance(item, str): + # plain file + item = convert_path(item) + if os.path.isfile(item): + self.filelist.append(item) + else: + # a (dirname, filenames) tuple + dirname, filenames = item + for f in filenames: + f = convert_path(f) + if os.path.isfile(f): + self.filelist.append(f) + + def _add_defaults_ext(self): + if self.distribution.has_ext_modules(): + build_ext = self.get_finalized_command('build_ext') + self.filelist.extend(build_ext.get_source_files()) + + def _add_defaults_c_libs(self): + if self.distribution.has_c_libraries(): + build_clib = self.get_finalized_command('build_clib') + self.filelist.extend(build_clib.get_source_files()) + + def _add_defaults_scripts(self): + if self.distribution.has_scripts(): + build_scripts = self.get_finalized_command('build_scripts') + self.filelist.extend(build_scripts.get_source_files()) + + +if hasattr(sdist.sdist, '_add_defaults_standards'): + # disable the functionality already available upstream + class sdist_add_defaults: + pass diff --git a/lib/python3.4/site-packages/setuptools/command/rotate.py b/lib/python3.4/site-packages/setuptools/command/rotate.py index 804f962..b89353f 100644 --- a/lib/python3.4/site-packages/setuptools/command/rotate.py +++ b/lib/python3.4/site-packages/setuptools/command/rotate.py @@ -2,6 +2,7 @@ from distutils.util import convert_path from distutils import log from distutils.errors import DistutilsOptionError import os +import shutil from setuptools.extern import six @@ -59,4 +60,7 @@ class rotate(Command): for (t, f) in files: log.info("Deleting %s", f) if not self.dry_run: - os.unlink(f) + if os.path.isdir(f): + shutil.rmtree(f) + else: + os.unlink(f) diff --git a/lib/python3.4/site-packages/setuptools/command/sdist.py b/lib/python3.4/site-packages/setuptools/command/sdist.py index 6640d4e..508148e 100644 --- a/lib/python3.4/site-packages/setuptools/command/sdist.py +++ b/lib/python3.4/site-packages/setuptools/command/sdist.py @@ -1,20 +1,19 @@ -from glob import glob from distutils import log import distutils.command.sdist as orig import os import sys import io +import contextlib from setuptools.extern import six -from setuptools.utils import cs_path_exists +from .py36compat import sdist_add_defaults import pkg_resources -READMES = 'README', 'README.rst', 'README.txt' - _default_revctrl = list + def walk_revctrl(dirname=''): """Find all files under revision control""" for ep in pkg_resources.iter_entry_points('setuptools.file_finders'): @@ -22,7 +21,7 @@ def walk_revctrl(dirname=''): yield item -class sdist(orig.sdist): +class sdist(sdist_add_defaults, orig.sdist): """Smart sdist that finds anything supported by revision control""" user_options = [ @@ -38,6 +37,9 @@ class sdist(orig.sdist): negative_opt = {} + README_EXTENSIONS = ['', '.rst', '.txt', '.md'] + READMES = tuple('README{0}'.format(ext) for ext in README_EXTENSIONS) + def run(self): self.run_command('egg_info') ei_cmd = self.get_finalized_command('egg_info') @@ -64,6 +66,45 @@ class sdist(orig.sdist): if data not in dist_files: dist_files.append(data) + def initialize_options(self): + orig.sdist.initialize_options(self) + + self._default_to_gztar() + + def _default_to_gztar(self): + # only needed on Python prior to 3.6. + if sys.version_info >= (3, 6, 0, 'beta', 1): + return + self.formats = ['gztar'] + + def make_distribution(self): + """ + Workaround for #516 + """ + with self._remove_os_link(): + orig.sdist.make_distribution(self) + + @staticmethod + @contextlib.contextmanager + def _remove_os_link(): + """ + In a context, remove and restore os.link if it exists + """ + + class NoValue: + pass + + orig_val = getattr(os, 'link', NoValue) + try: + del os.link + except Exception: + pass + try: + yield + finally: + if orig_val is not NoValue: + setattr(os, 'link', orig_val) + def __read_template_hack(self): # This grody hack closes the template file (MANIFEST.in) if an # exception occurs during read_template. @@ -71,7 +112,7 @@ class sdist(orig.sdist): # file. try: orig.sdist.read_template(self) - except: + except Exception: _, _, tb = sys.exc_info() tb.tb_next.tb_frame.f_locals['template'].close() raise @@ -87,35 +128,8 @@ class sdist(orig.sdist): if has_leaky_handle: read_template = __read_template_hack - def add_defaults(self): - standards = [READMES, - self.distribution.script_name] - for fn in standards: - if isinstance(fn, tuple): - alts = fn - got_it = 0 - for fn in alts: - if cs_path_exists(fn): - got_it = 1 - self.filelist.append(fn) - break - - if not got_it: - self.warn("standard file not found: should have one of " + - ', '.join(alts)) - else: - if cs_path_exists(fn): - self.filelist.append(fn) - else: - self.warn("standard file '%s' not found" % fn) - - optional = ['test/test*.py', 'setup.cfg'] - for pattern in optional: - files = list(filter(cs_path_exists, glob(pattern))) - if files: - self.filelist.extend(files) - - # getting python files + def _add_defaults_python(self): + """getting python files""" if self.distribution.has_pure_modules(): build_py = self.get_finalized_command('build_py') self.filelist.extend(build_py.get_source_files()) @@ -128,26 +142,23 @@ class sdist(orig.sdist): self.filelist.extend([os.path.join(src_dir, filename) for filename in filenames]) - if self.distribution.has_ext_modules(): - build_ext = self.get_finalized_command('build_ext') - self.filelist.extend(build_ext.get_source_files()) - - if self.distribution.has_c_libraries(): - build_clib = self.get_finalized_command('build_clib') - self.filelist.extend(build_clib.get_source_files()) - - if self.distribution.has_scripts(): - build_scripts = self.get_finalized_command('build_scripts') - self.filelist.extend(build_scripts.get_source_files()) + def _add_defaults_data_files(self): + try: + if six.PY2: + sdist_add_defaults._add_defaults_data_files(self) + else: + super()._add_defaults_data_files() + except TypeError: + log.warn("data_files contains unexpected objects") def check_readme(self): - for f in READMES: + for f in self.READMES: if os.path.exists(f): return else: self.warn( "standard file not found: should have one of " + - ', '.join(READMES) + ', '.join(self.READMES) ) def make_release_tree(self, base_dir, files): @@ -179,7 +190,7 @@ class sdist(orig.sdist): distribution. """ log.info("reading manifest file '%s'", self.manifest) - manifest = open(self.manifest, 'rbU') + manifest = open(self.manifest, 'rb') for line in manifest: # The manifest must contain UTF-8. See #303. if six.PY3: diff --git a/lib/python3.4/site-packages/setuptools/command/setopt.py b/lib/python3.4/site-packages/setuptools/command/setopt.py index 7f332be..7e57cc0 100644 --- a/lib/python3.4/site-packages/setuptools/command/setopt.py +++ b/lib/python3.4/site-packages/setuptools/command/setopt.py @@ -8,7 +8,6 @@ from setuptools.extern.six.moves import configparser from setuptools import Command - __all__ = ['config_file', 'edit_config', 'option_base', 'setopt'] diff --git a/lib/python3.4/site-packages/setuptools/command/test.py b/lib/python3.4/site-packages/setuptools/command/test.py index 371e913..638d0c5 100644 --- a/lib/python3.4/site-packages/setuptools/command/test.py +++ b/lib/python3.4/site-packages/setuptools/command/test.py @@ -1,12 +1,17 @@ -from distutils.errors import DistutilsOptionError -from unittest import TestLoader +import os +import operator import sys +import contextlib +import itertools +from distutils.errors import DistutilsError, DistutilsOptionError +from distutils import log +from unittest import TestLoader from setuptools.extern import six -from setuptools.extern.six.moves import map +from setuptools.extern.six.moves import map, filter from pkg_resources import (resource_listdir, resource_exists, normalize_path, - working_set, _namespace_packages, + working_set, _namespace_packages, evaluate_marker, add_activation_listener, require, EntryPoint) from setuptools import Command from setuptools.py31compat import unittest_main @@ -62,7 +67,7 @@ class test(Command): user_options = [ ('test-module=', 'm', "Run 'test_suite' in specified module"), ('test-suite=', 's', - "Test suite to run (e.g. 'some_module.test_suite')"), + "Run single test, case or suite (e.g. 'module.test_suite')"), ('test-runner=', 'r', "Test runner to use"), ] @@ -102,6 +107,14 @@ class test(Command): yield self.test_suite def with_project_on_sys_path(self, func): + """ + Backward compatibility for project_on_sys_path context. + """ + with self.project_on_sys_path(): + func() + + @contextlib.contextmanager + def project_on_sys_path(self, include_dists=[]): with_2to3 = six.PY3 and getattr(self.distribution, 'use_2to3', False) if with_2to3: @@ -133,30 +146,73 @@ class test(Command): old_modules = sys.modules.copy() try: - sys.path.insert(0, normalize_path(ei_cmd.egg_base)) + project_path = normalize_path(ei_cmd.egg_base) + sys.path.insert(0, project_path) working_set.__init__() add_activation_listener(lambda dist: dist.activate()) require('%s==%s' % (ei_cmd.egg_name, ei_cmd.egg_version)) - func() + with self.paths_on_pythonpath([project_path]): + yield finally: sys.path[:] = old_path sys.modules.clear() sys.modules.update(old_modules) working_set.__init__() + @staticmethod + @contextlib.contextmanager + def paths_on_pythonpath(paths): + """ + Add the indicated paths to the head of the PYTHONPATH environment + variable so that subprocesses will also see the packages at + these paths. + + Do this in a context that restores the value on exit. + """ + nothing = object() + orig_pythonpath = os.environ.get('PYTHONPATH', nothing) + current_pythonpath = os.environ.get('PYTHONPATH', '') + try: + prefix = os.pathsep.join(paths) + to_join = filter(None, [prefix, current_pythonpath]) + new_path = os.pathsep.join(to_join) + if new_path: + os.environ['PYTHONPATH'] = new_path + yield + finally: + if orig_pythonpath is nothing: + os.environ.pop('PYTHONPATH', None) + else: + os.environ['PYTHONPATH'] = orig_pythonpath + + @staticmethod + def install_dists(dist): + """ + Install the requirements indicated by self.distribution and + return an iterable of the dists that were built. + """ + ir_d = dist.fetch_build_eggs(dist.install_requires) + tr_d = dist.fetch_build_eggs(dist.tests_require or []) + er_d = dist.fetch_build_eggs( + v for k, v in dist.extras_require.items() + if k.startswith(':') and evaluate_marker(k[1:]) + ) + return itertools.chain(ir_d, tr_d, er_d) + def run(self): - if self.distribution.install_requires: - self.distribution.fetch_build_eggs( - self.distribution.install_requires) - if self.distribution.tests_require: - self.distribution.fetch_build_eggs(self.distribution.tests_require) + installed_dists = self.install_dists(self.distribution) cmd = ' '.join(self._argv) if self.dry_run: self.announce('skipping "%s" (dry run)' % cmd) - else: - self.announce('running "%s"' % cmd) - self.with_project_on_sys_path(self.run_tests) + return + + self.announce('running "%s"' % cmd) + + paths = map(operator.attrgetter('location'), installed_dists) + with self.paths_on_pythonpath(paths): + with self.project_on_sys_path(): + self.run_tests() def run_tests(self): # Purge modules under test from sys.modules. The test loader will @@ -174,11 +230,17 @@ class test(Command): del_modules.append(name) list(map(sys.modules.__delitem__, del_modules)) - unittest_main( + exit_kwarg = {} if sys.version_info < (2, 7) else {"exit": False} + test = unittest_main( None, None, self._argv, testLoader=self._resolve_as_ep(self.test_loader), testRunner=self._resolve_as_ep(self.test_runner), + **exit_kwarg ) + if not test.result.wasSuccessful(): + msg = 'Test failed: %s' % test.result + self.announce(msg, log.ERROR) + raise DistutilsError(msg) @property def _argv(self): diff --git a/lib/python3.4/site-packages/setuptools/command/upload.py b/lib/python3.4/site-packages/setuptools/command/upload.py index 08c20ba..a44173a 100644 --- a/lib/python3.4/site-packages/setuptools/command/upload.py +++ b/lib/python3.4/site-packages/setuptools/command/upload.py @@ -1,15 +1,26 @@ +import getpass from distutils.command import upload as orig class upload(orig.upload): """ - Override default upload behavior to look up password - in the keyring if available. + Override default upload behavior to obtain password + in a variety of different ways. """ def finalize_options(self): orig.upload.finalize_options(self) - self.password or self._load_password_from_keyring() + self.username = ( + self.username or + getpass.getuser() + ) + # Attempt to obtain password. Short circuit evaluation at the first + # sign of success. + self.password = ( + self.password or + self._load_password_from_keyring() or + self._prompt_for_password() + ) def _load_password_from_keyring(self): """ @@ -17,7 +28,15 @@ class upload(orig.upload): """ try: keyring = __import__('keyring') - self.password = keyring.get_password(self.repository, - self.username) + return keyring.get_password(self.repository, self.username) except Exception: pass + + def _prompt_for_password(self): + """ + Prompt for a password on the tty. Suppress Exceptions. + """ + try: + return getpass.getpass() + except (Exception, KeyboardInterrupt): + pass diff --git a/lib/python3.4/site-packages/setuptools/command/upload_docs.py b/lib/python3.4/site-packages/setuptools/command/upload_docs.py index f887b47..07aa564 100644 --- a/lib/python3.4/site-packages/setuptools/command/upload_docs.py +++ b/lib/python3.4/site-packages/setuptools/command/upload_docs.py @@ -13,6 +13,8 @@ import socket import zipfile import tempfile import shutil +import itertools +import functools from setuptools.extern import six from setuptools.extern.six.moves import http_client, urllib @@ -21,18 +23,16 @@ from pkg_resources import iter_entry_points from .upload import upload -errors = 'surrogateescape' if six.PY3 else 'strict' - - -# This is not just a replacement for byte literals -# but works as a general purpose encoder -def b(s, encoding='utf-8'): - if isinstance(s, six.text_type): - return s.encode(encoding, errors) - return s +def _encode(s): + errors = 'surrogateescape' if six.PY3 else 'strict' + return s.encode('utf-8', errors) class upload_docs(upload): + # override the default repository as upload_docs isn't + # supported by Warehouse (and won't be). + DEFAULT_REPOSITORY = 'https://pypi.python.org/pypi/' + description = 'Upload documentation to PyPI' user_options = [ @@ -68,6 +68,8 @@ class upload_docs(upload): else: self.ensure_dirname('upload_dir') self.target_dir = self.upload_dir + if 'pypi.python.org' in self.repository: + log.warn("Upload_docs command is deprecated. Use RTD instead.") self.announce('Using upload directory %s' % self.target_dir) def create_zipfile(self, filename): @@ -76,9 +78,8 @@ class upload_docs(upload): self.mkpath(self.target_dir) # just in case for root, dirs, files in os.walk(self.target_dir): if root == self.target_dir and not files: - raise DistutilsOptionError( - "no files found in upload directory '%s'" - % self.target_dir) + tmpl = "no files found in upload directory '%s'" + raise DistutilsOptionError(tmpl % self.target_dir) for name in files: full = os.path.join(root, name) relative = root[len(self.target_dir):].lstrip(os.path.sep) @@ -101,10 +102,48 @@ class upload_docs(upload): finally: shutil.rmtree(tmp_dir) + @staticmethod + def _build_part(item, sep_boundary): + key, values = item + title = '\nContent-Disposition: form-data; name="%s"' % key + # handle multiple entries for the same name + if not isinstance(values, list): + values = [values] + for value in values: + if isinstance(value, tuple): + title += '; filename="%s"' % value[0] + value = value[1] + else: + value = _encode(value) + yield sep_boundary + yield _encode(title) + yield b"\n\n" + yield value + if value and value[-1:] == b'\r': + yield b'\n' # write an extra newline (lurve Macs) + + @classmethod + def _build_multipart(cls, data): + """ + Build up the MIME payload for the POST data + """ + boundary = b'--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' + sep_boundary = b'\n--' + boundary + end_boundary = sep_boundary + b'--' + end_items = end_boundary, b"\n", + builder = functools.partial( + cls._build_part, + sep_boundary=sep_boundary, + ) + part_groups = map(builder, data.items()) + parts = itertools.chain.from_iterable(part_groups) + body_items = itertools.chain(parts, end_items) + content_type = 'multipart/form-data; boundary=%s' % boundary.decode('ascii') + return b''.join(body_items), content_type + def upload_file(self, filename): - f = open(filename, 'rb') - content = f.read() - f.close() + with open(filename, 'rb') as f: + content = f.read() meta = self.distribution.metadata data = { ':action': 'doc_upload', @@ -112,40 +151,16 @@ class upload_docs(upload): 'content': (os.path.basename(filename), content), } # set up the authentication - credentials = b(self.username + ':' + self.password) + credentials = _encode(self.username + ':' + self.password) credentials = standard_b64encode(credentials) if six.PY3: credentials = credentials.decode('ascii') auth = "Basic " + credentials - # Build up the MIME payload for the POST data - boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' - sep_boundary = b('\n--') + b(boundary) - end_boundary = sep_boundary + b('--') - body = [] - for key, values in six.iteritems(data): - title = '\nContent-Disposition: form-data; name="%s"' % key - # handle multiple entries for the same name - if not isinstance(values, list): - values = [values] - for value in values: - if type(value) is tuple: - title += '; filename="%s"' % value[0] - value = value[1] - else: - value = b(value) - body.append(sep_boundary) - body.append(b(title)) - body.append(b("\n\n")) - body.append(value) - if value and value[-1:] == b('\r'): - body.append(b('\n')) # write an extra newline (lurve Macs) - body.append(end_boundary) - body.append(b("\n")) - body = b('').join(body) + body, ct = self._build_multipart(data) - self.announce("Submitting documentation to %s" % (self.repository), - log.INFO) + msg = "Submitting documentation to %s" % (self.repository) + self.announce(msg, log.INFO) # build the Request # We can't use urllib2 since we need to send the Basic @@ -164,7 +179,7 @@ class upload_docs(upload): try: conn.connect() conn.putrequest("POST", url) - content_type = 'multipart/form-data; boundary=%s' % boundary + content_type = ct conn.putheader('Content-type', content_type) conn.putheader('Content-length', str(len(body))) conn.putheader('Authorization', auth) @@ -176,16 +191,16 @@ class upload_docs(upload): r = conn.getresponse() if r.status == 200: - self.announce('Server response (%s): %s' % (r.status, r.reason), - log.INFO) + msg = 'Server response (%s): %s' % (r.status, r.reason) + self.announce(msg, log.INFO) elif r.status == 301: location = r.getheader('Location') if location is None: location = 'https://pythonhosted.org/%s/' % meta.get_name() - self.announce('Upload successful. Visit %s' % location, - log.INFO) + msg = 'Upload successful. Visit %s' % location + self.announce(msg, log.INFO) else: - self.announce('Upload failed (%s): %s' % (r.status, r.reason), - log.ERROR) + msg = 'Upload failed (%s): %s' % (r.status, r.reason) + self.announce(msg, log.ERROR) if self.show_response: print('-' * 75, r.read(), '-' * 75) diff --git a/lib/python3.4/site-packages/setuptools/config.py b/lib/python3.4/site-packages/setuptools/config.py new file mode 100644 index 0000000..9a62e2e --- /dev/null +++ b/lib/python3.4/site-packages/setuptools/config.py @@ -0,0 +1,554 @@ +from __future__ import absolute_import, unicode_literals +import io +import os +import sys +from collections import defaultdict +from functools import partial + +from distutils.errors import DistutilsOptionError, DistutilsFileError +from setuptools.py26compat import import_module +from setuptools.extern.six import string_types + + +def read_configuration( + filepath, find_others=False, ignore_option_errors=False): + """Read given configuration file and returns options from it as a dict. + + :param str|unicode filepath: Path to configuration file + to get options from. + + :param bool find_others: Whether to search for other configuration files + which could be on in various places. + + :param bool ignore_option_errors: Whether to silently ignore + options, values of which could not be resolved (e.g. due to exceptions + in directives such as file:, attr:, etc.). + If False exceptions are propagated as expected. + + :rtype: dict + """ + from setuptools.dist import Distribution, _Distribution + + filepath = os.path.abspath(filepath) + + if not os.path.isfile(filepath): + raise DistutilsFileError( + 'Configuration file %s does not exist.' % filepath) + + current_directory = os.getcwd() + os.chdir(os.path.dirname(filepath)) + + try: + dist = Distribution() + + filenames = dist.find_config_files() if find_others else [] + if filepath not in filenames: + filenames.append(filepath) + + _Distribution.parse_config_files(dist, filenames=filenames) + + handlers = parse_configuration( + dist, dist.command_options, + ignore_option_errors=ignore_option_errors) + + finally: + os.chdir(current_directory) + + return configuration_to_dict(handlers) + + +def configuration_to_dict(handlers): + """Returns configuration data gathered by given handlers as a dict. + + :param list[ConfigHandler] handlers: Handlers list, + usually from parse_configuration() + + :rtype: dict + """ + config_dict = defaultdict(dict) + + for handler in handlers: + + obj_alias = handler.section_prefix + target_obj = handler.target_obj + + for option in handler.set_options: + getter = getattr(target_obj, 'get_%s' % option, None) + + if getter is None: + value = getattr(target_obj, option) + + else: + value = getter() + + config_dict[obj_alias][option] = value + + return config_dict + + +def parse_configuration( + distribution, command_options, ignore_option_errors=False): + """Performs additional parsing of configuration options + for a distribution. + + Returns a list of used option handlers. + + :param Distribution distribution: + :param dict command_options: + :param bool ignore_option_errors: Whether to silently ignore + options, values of which could not be resolved (e.g. due to exceptions + in directives such as file:, attr:, etc.). + If False exceptions are propagated as expected. + :rtype: list + """ + meta = ConfigMetadataHandler( + distribution.metadata, command_options, ignore_option_errors) + meta.parse() + + options = ConfigOptionsHandler( + distribution, command_options, ignore_option_errors) + options.parse() + + return [meta, options] + + +class ConfigHandler(object): + """Handles metadata supplied in configuration files.""" + + section_prefix = None + """Prefix for config sections handled by this handler. + Must be provided by class heirs. + + """ + + aliases = {} + """Options aliases. + For compatibility with various packages. E.g.: d2to1 and pbr. + Note: `-` in keys is replaced with `_` by config parser. + + """ + + def __init__(self, target_obj, options, ignore_option_errors=False): + sections = {} + + section_prefix = self.section_prefix + for section_name, section_options in options.items(): + if not section_name.startswith(section_prefix): + continue + + section_name = section_name.replace(section_prefix, '').strip('.') + sections[section_name] = section_options + + self.ignore_option_errors = ignore_option_errors + self.target_obj = target_obj + self.sections = sections + self.set_options = [] + + @property + def parsers(self): + """Metadata item name to parser function mapping.""" + raise NotImplementedError( + '%s must provide .parsers property' % self.__class__.__name__) + + def __setitem__(self, option_name, value): + unknown = tuple() + target_obj = self.target_obj + + # Translate alias into real name. + option_name = self.aliases.get(option_name, option_name) + + current_value = getattr(target_obj, option_name, unknown) + + if current_value is unknown: + raise KeyError(option_name) + + if current_value: + # Already inhabited. Skipping. + return + + skip_option = False + parser = self.parsers.get(option_name) + if parser: + try: + value = parser(value) + + except Exception: + skip_option = True + if not self.ignore_option_errors: + raise + + if skip_option: + return + + setter = getattr(target_obj, 'set_%s' % option_name, None) + if setter is None: + setattr(target_obj, option_name, value) + else: + setter(value) + + self.set_options.append(option_name) + + @classmethod + def _parse_list(cls, value, separator=','): + """Represents value as a list. + + Value is split either by separator (defaults to comma) or by lines. + + :param value: + :param separator: List items separator character. + :rtype: list + """ + if isinstance(value, list): # _get_parser_compound case + return value + + if '\n' in value: + value = value.splitlines() + else: + value = value.split(separator) + + return [chunk.strip() for chunk in value if chunk.strip()] + + @classmethod + def _parse_dict(cls, value): + """Represents value as a dict. + + :param value: + :rtype: dict + """ + separator = '=' + result = {} + for line in cls._parse_list(value): + key, sep, val = line.partition(separator) + if sep != separator: + raise DistutilsOptionError( + 'Unable to parse option value to dict: %s' % value) + result[key.strip()] = val.strip() + + return result + + @classmethod + def _parse_bool(cls, value): + """Represents value as boolean. + + :param value: + :rtype: bool + """ + value = value.lower() + return value in ('1', 'true', 'yes') + + @classmethod + def _parse_file(cls, value): + """Represents value as a string, allowing including text + from nearest files using `file:` directive. + + Directive is sandboxed and won't reach anything outside + directory with setup.py. + + Examples: + file: LICENSE + file: README.rst, CHANGELOG.md, src/file.txt + + :param str value: + :rtype: str + """ + include_directive = 'file:' + + if not isinstance(value, string_types): + return value + + if not value.startswith(include_directive): + return value + + spec = value[len(include_directive):] + filepaths = (os.path.abspath(path.strip()) for path in spec.split(',')) + return '\n'.join( + cls._read_file(path) + for path in filepaths + if (cls._assert_local(path) or True) + and os.path.isfile(path) + ) + + @staticmethod + def _assert_local(filepath): + if not filepath.startswith(os.getcwd()): + raise DistutilsOptionError( + '`file:` directive can not access %s' % filepath) + + @staticmethod + def _read_file(filepath): + with io.open(filepath, encoding='utf-8') as f: + return f.read() + + @classmethod + def _parse_attr(cls, value): + """Represents value as a module attribute. + + Examples: + attr: package.attr + attr: package.module.attr + + :param str value: + :rtype: str + """ + attr_directive = 'attr:' + if not value.startswith(attr_directive): + return value + + attrs_path = value.replace(attr_directive, '').strip().split('.') + attr_name = attrs_path.pop() + + module_name = '.'.join(attrs_path) + module_name = module_name or '__init__' + + sys.path.insert(0, os.getcwd()) + try: + module = import_module(module_name) + value = getattr(module, attr_name) + + finally: + sys.path = sys.path[1:] + + return value + + @classmethod + def _get_parser_compound(cls, *parse_methods): + """Returns parser function to represents value as a list. + + Parses a value applying given methods one after another. + + :param parse_methods: + :rtype: callable + """ + def parse(value): + parsed = value + + for method in parse_methods: + parsed = method(parsed) + + return parsed + + return parse + + @classmethod + def _parse_section_to_dict(cls, section_options, values_parser=None): + """Parses section options into a dictionary. + + Optionally applies a given parser to values. + + :param dict section_options: + :param callable values_parser: + :rtype: dict + """ + value = {} + values_parser = values_parser or (lambda val: val) + for key, (_, val) in section_options.items(): + value[key] = values_parser(val) + return value + + def parse_section(self, section_options): + """Parses configuration file section. + + :param dict section_options: + """ + for (name, (_, value)) in section_options.items(): + try: + self[name] = value + + except KeyError: + pass # Keep silent for a new option may appear anytime. + + def parse(self): + """Parses configuration file items from one + or more related sections. + + """ + for section_name, section_options in self.sections.items(): + + method_postfix = '' + if section_name: # [section.option] variant + method_postfix = '_%s' % section_name + + section_parser_method = getattr( + self, + # Dots in section names are tranlsated into dunderscores. + ('parse_section%s' % method_postfix).replace('.', '__'), + None) + + if section_parser_method is None: + raise DistutilsOptionError( + 'Unsupported distribution option section: [%s.%s]' % ( + self.section_prefix, section_name)) + + section_parser_method(section_options) + + +class ConfigMetadataHandler(ConfigHandler): + + section_prefix = 'metadata' + + aliases = { + 'home_page': 'url', + 'summary': 'description', + 'classifier': 'classifiers', + 'platform': 'platforms', + } + + strict_mode = False + """We need to keep it loose, to be partially compatible with + `pbr` and `d2to1` packages which also uses `metadata` section. + + """ + + @property + def parsers(self): + """Metadata item name to parser function mapping.""" + parse_list = self._parse_list + parse_file = self._parse_file + + return { + 'platforms': parse_list, + 'keywords': parse_list, + 'provides': parse_list, + 'requires': parse_list, + 'obsoletes': parse_list, + 'classifiers': self._get_parser_compound(parse_file, parse_list), + 'license': parse_file, + 'description': parse_file, + 'long_description': parse_file, + 'version': self._parse_version, + } + + def _parse_version(self, value): + """Parses `version` option value. + + :param value: + :rtype: str + + """ + version = self._parse_attr(value) + + if callable(version): + version = version() + + if not isinstance(version, string_types): + if hasattr(version, '__iter__'): + version = '.'.join(map(str, version)) + else: + version = '%s' % version + + return version + + +class ConfigOptionsHandler(ConfigHandler): + + section_prefix = 'options' + + @property + def parsers(self): + """Metadata item name to parser function mapping.""" + parse_list = self._parse_list + parse_list_semicolon = partial(self._parse_list, separator=';') + parse_bool = self._parse_bool + parse_dict = self._parse_dict + + return { + 'zip_safe': parse_bool, + 'use_2to3': parse_bool, + 'include_package_data': parse_bool, + 'package_dir': parse_dict, + 'use_2to3_fixers': parse_list, + 'use_2to3_exclude_fixers': parse_list, + 'convert_2to3_doctests': parse_list, + 'scripts': parse_list, + 'eager_resources': parse_list, + 'dependency_links': parse_list, + 'namespace_packages': parse_list, + 'install_requires': parse_list_semicolon, + 'setup_requires': parse_list_semicolon, + 'tests_require': parse_list_semicolon, + 'packages': self._parse_packages, + 'entry_points': self._parse_file, + 'py_modules': parse_list, + } + + def _parse_packages(self, value): + """Parses `packages` option value. + + :param value: + :rtype: list + """ + find_directive = 'find:' + + if not value.startswith(find_directive): + return self._parse_list(value) + + # Read function arguments from a dedicated section. + find_kwargs = self.parse_section_packages__find( + self.sections.get('packages.find', {})) + + from setuptools import find_packages + + return find_packages(**find_kwargs) + + def parse_section_packages__find(self, section_options): + """Parses `packages.find` configuration file section. + + To be used in conjunction with _parse_packages(). + + :param dict section_options: + """ + section_data = self._parse_section_to_dict( + section_options, self._parse_list) + + valid_keys = ['where', 'include', 'exclude'] + + find_kwargs = dict( + [(k, v) for k, v in section_data.items() if k in valid_keys and v]) + + where = find_kwargs.get('where') + if where is not None: + find_kwargs['where'] = where[0] # cast list to single val + + return find_kwargs + + def parse_section_entry_points(self, section_options): + """Parses `entry_points` configuration file section. + + :param dict section_options: + """ + parsed = self._parse_section_to_dict(section_options, self._parse_list) + self['entry_points'] = parsed + + def _parse_package_data(self, section_options): + parsed = self._parse_section_to_dict(section_options, self._parse_list) + + root = parsed.get('*') + if root: + parsed[''] = root + del parsed['*'] + + return parsed + + def parse_section_package_data(self, section_options): + """Parses `package_data` configuration file section. + + :param dict section_options: + """ + self['package_data'] = self._parse_package_data(section_options) + + def parse_section_exclude_package_data(self, section_options): + """Parses `exclude_package_data` configuration file section. + + :param dict section_options: + """ + self['exclude_package_data'] = self._parse_package_data( + section_options) + + def parse_section_extras_require(self, section_options): + """Parses `extras_require` configuration file section. + + :param dict section_options: + """ + parse_list = partial(self._parse_list, separator=';') + self['extras_require'] = self._parse_section_to_dict( + section_options, parse_list) diff --git a/lib/python3.4/site-packages/setuptools/dep_util.py b/lib/python3.4/site-packages/setuptools/dep_util.py new file mode 100644 index 0000000..2931c13 --- /dev/null +++ b/lib/python3.4/site-packages/setuptools/dep_util.py @@ -0,0 +1,23 @@ +from distutils.dep_util import newer_group + +# yes, this is was almost entirely copy-pasted from +# 'newer_pairwise()', this is just another convenience +# function. +def newer_pairwise_group(sources_groups, targets): + """Walk both arguments in parallel, testing if each source group is newer + than its corresponding target. Returns a pair of lists (sources_groups, + targets) where sources is newer than target, according to the semantics + of 'newer_group()'. + """ + if len(sources_groups) != len(targets): + raise ValueError("'sources_group' and 'targets' must be the same length") + + # build a pair of lists (sources_groups, targets) where source is newer + n_sources = [] + n_targets = [] + for i in range(len(sources_groups)): + if newer_group(sources_groups[i], targets[i]): + n_sources.append(sources_groups[i]) + n_targets.append(targets[i]) + + return n_sources, n_targets diff --git a/lib/python3.4/site-packages/setuptools/depends.py b/lib/python3.4/site-packages/setuptools/depends.py index 9f7c9a3..45e7052 100644 --- a/lib/python3.4/site-packages/setuptools/depends.py +++ b/lib/python3.4/site-packages/setuptools/depends.py @@ -1,15 +1,17 @@ import sys import imp import marshal -from imp import PKG_DIRECTORY, PY_COMPILED, PY_SOURCE, PY_FROZEN from distutils.version import StrictVersion +from imp import PKG_DIRECTORY, PY_COMPILED, PY_SOURCE, PY_FROZEN + +from .py33compat import Bytecode -from setuptools.extern import six __all__ = [ 'Require', 'find_module', 'get_module_constant', 'extract_constant' ] + class Require: """A prerequisite to building or installing a distribution""" @@ -30,7 +32,7 @@ class Require: def full_name(self): """Return full package/distribution name, w/version""" if self.requested_version is not None: - return '%s-%s' % (self.name,self.requested_version) + return '%s-%s' % (self.name, self.requested_version) return self.name def version_ok(self, version): @@ -39,7 +41,6 @@ class Require: str(version) != "unknown" and version >= self.requested_version def get_version(self, paths=None, default="unknown"): - """Get version number of installed module, 'None', or 'default' Search 'paths' for module. If not found, return 'None'. If found, @@ -52,8 +53,9 @@ class Require: if self.attribute is None: try: - f,p,i = find_module(self.module,paths) - if f: f.close() + f, p, i = find_module(self.module, paths) + if f: + f.close() return default except ImportError: return None @@ -77,40 +79,6 @@ class Require: return self.version_ok(version) -def _iter_code(code): - - """Yield '(op,arg)' pair for each operation in code object 'code'""" - - from array import array - from dis import HAVE_ARGUMENT, EXTENDED_ARG - - bytes = array('b',code.co_code) - eof = len(code.co_code) - - ptr = 0 - extended_arg = 0 - - while ptr=HAVE_ARGUMENT: - - arg = bytes[ptr+1] + bytes[ptr+2]*256 + extended_arg - ptr += 3 - - if op==EXTENDED_ARG: - long_type = six.integer_types[-1] - extended_arg = arg * long_type(65536) - continue - - else: - arg = None - ptr += 1 - - yield op,arg - - def find_module(module, paths=None): """Just like 'imp.find_module()', but with package support""" @@ -118,20 +86,19 @@ def find_module(module, paths=None): while parts: part = parts.pop(0) - f, path, (suffix,mode,kind) = info = imp.find_module(part, paths) + f, path, (suffix, mode, kind) = info = imp.find_module(part, paths) - if kind==PKG_DIRECTORY: + if kind == PKG_DIRECTORY: parts = parts or ['__init__'] paths = [path] elif parts: - raise ImportError("Can't find %r in %s" % (parts,module)) + raise ImportError("Can't find %r in %s" % (parts, module)) return info def get_module_constant(module, symbol, default=-1, paths=None): - """Find 'module' by searching 'paths', and extract 'symbol' Return 'None' if 'module' does not exist on 'paths', or it does not define @@ -145,12 +112,12 @@ def get_module_constant(module, symbol, default=-1, paths=None): return None try: - if kind==PY_COMPILED: - f.read(8) # skip magic & date + if kind == PY_COMPILED: + f.read(8) # skip magic & date code = marshal.load(f) - elif kind==PY_FROZEN: + elif kind == PY_FROZEN: code = imp.get_frozen_object(module) - elif kind==PY_SOURCE: + elif kind == PY_SOURCE: code = compile(f.read(), path, 'exec') else: # Not something we can parse; we'll have to import it. :( @@ -177,9 +144,8 @@ def extract_constant(code, symbol, default=-1): only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol' must be present in 'code.co_names'. """ - if symbol not in code.co_names: - # name's not there, can't possibly be an assigment + # name's not there, can't possibly be an assignment return None name_idx = list(code.co_names).index(symbol) @@ -190,11 +156,13 @@ def extract_constant(code, symbol, default=-1): const = default - for op, arg in _iter_code(code): + for byte_code in Bytecode(code): + op = byte_code.opcode + arg = byte_code.arg - if op==LOAD_CONST: + if op == LOAD_CONST: const = code.co_consts[arg] - elif arg==name_idx and (op==STORE_NAME or op==STORE_GLOBAL): + elif arg == name_idx and (op == STORE_NAME or op == STORE_GLOBAL): return const else: const = default @@ -214,4 +182,5 @@ def _update_globals(): del globals()[name] __all__.remove(name) + _update_globals() diff --git a/lib/python3.4/site-packages/setuptools/dist.py b/lib/python3.4/site-packages/setuptools/dist.py index 7785541..a2ca879 100644 --- a/lib/python3.4/site-packages/setuptools/dist.py +++ b/lib/python3.4/site-packages/setuptools/dist.py @@ -2,117 +2,159 @@ __all__ = ['Distribution'] import re import os -import sys import warnings import numbers import distutils.log import distutils.core import distutils.cmd import distutils.dist -from distutils.core import Distribution as _Distribution -from distutils.errors import (DistutilsOptionError, DistutilsPlatformError, - DistutilsSetupError) +import itertools +from collections import defaultdict +from distutils.errors import ( + DistutilsOptionError, DistutilsPlatformError, DistutilsSetupError, +) +from distutils.util import rfc822_escape from setuptools.extern import six -from setuptools.extern.six.moves import map +from setuptools.extern.six.moves import map, filter, filterfalse from pkg_resources.extern import packaging from setuptools.depends import Require from setuptools import windows_support +from setuptools.monkey import get_unpatched +from setuptools.config import parse_configuration import pkg_resources +from .py36compat import Distribution_parse_config_files + +__import__('pkg_resources.extern.packaging.specifiers') +__import__('pkg_resources.extern.packaging.version') def _get_unpatched(cls): - """Protect against re-patching the distutils if reloaded + warnings.warn("Do not call this function", DeprecationWarning) + return get_unpatched(cls) - Also ensures that no other distutils extension monkeypatched the distutils - first. + +# Based on Python 3.5 version +def write_pkg_file(self, file): + """Write the PKG-INFO format data to a file object. """ - while cls.__module__.startswith('setuptools'): - cls, = cls.__bases__ - if not cls.__module__.startswith('distutils'): - raise AssertionError( - "distutils has already been patched by %r" % cls - ) - return cls + version = '1.0' + if (self.provides or self.requires or self.obsoletes or + self.classifiers or self.download_url): + version = '1.1' + # Setuptools specific for PEP 345 + if hasattr(self, 'python_requires'): + version = '1.2' -_Distribution = _get_unpatched(_Distribution) + file.write('Metadata-Version: %s\n' % version) + file.write('Name: %s\n' % self.get_name()) + file.write('Version: %s\n' % self.get_version()) + file.write('Summary: %s\n' % self.get_description()) + file.write('Home-page: %s\n' % self.get_url()) + file.write('Author: %s\n' % self.get_contact()) + file.write('Author-email: %s\n' % self.get_contact_email()) + file.write('License: %s\n' % self.get_license()) + if self.download_url: + file.write('Download-URL: %s\n' % self.download_url) -def _patch_distribution_metadata_write_pkg_info(): + long_desc_content_type = getattr( + self, + 'long_description_content_type', + None + ) or 'UNKNOWN' + file.write('Description-Content-Type: %s\n' % long_desc_content_type) + + long_desc = rfc822_escape(self.get_long_description()) + file.write('Description: %s\n' % long_desc) + + keywords = ','.join(self.get_keywords()) + if keywords: + file.write('Keywords: %s\n' % keywords) + + self._write_list(file, 'Platform', self.get_platforms()) + self._write_list(file, 'Classifier', self.get_classifiers()) + + # PEP 314 + self._write_list(file, 'Requires', self.get_requires()) + self._write_list(file, 'Provides', self.get_provides()) + self._write_list(file, 'Obsoletes', self.get_obsoletes()) + + # Setuptools specific for PEP 345 + if hasattr(self, 'python_requires'): + file.write('Requires-Python: %s\n' % self.python_requires) + + +# from Python 3.4 +def write_pkg_info(self, base_dir): + """Write the PKG-INFO file into the release tree. """ - Workaround issue #197 - Python 3 prior to 3.2.2 uses an environment-local - encoding to save the pkg_info. Monkey-patch its write_pkg_info method to - correct this undesirable behavior. - """ - environment_local = (3,) <= sys.version_info[:3] < (3, 2, 2) - if not environment_local: - return + with open(os.path.join(base_dir, 'PKG-INFO'), 'w', + encoding='UTF-8') as pkg_info: + self.write_pkg_file(pkg_info) - # from Python 3.4 - def write_pkg_info(self, base_dir): - """Write the PKG-INFO file into the release tree. - """ - with open(os.path.join(base_dir, 'PKG-INFO'), 'w', - encoding='UTF-8') as pkg_info: - self.write_pkg_file(pkg_info) - - distutils.dist.DistributionMetadata.write_pkg_info = write_pkg_info -_patch_distribution_metadata_write_pkg_info() sequence = tuple, list + def check_importable(dist, attr, value): try: - ep = pkg_resources.EntryPoint.parse('x='+value) + ep = pkg_resources.EntryPoint.parse('x=' + value) assert not ep.extras - except (TypeError,ValueError,AttributeError,AssertionError): + except (TypeError, ValueError, AttributeError, AssertionError): raise DistutilsSetupError( "%r must be importable 'module:attrs' string (got %r)" - % (attr,value) + % (attr, value) ) def assert_string_list(dist, attr, value): """Verify that value is a string list or None""" try: - assert ''.join(value)!=value - except (TypeError,ValueError,AttributeError,AssertionError): + assert ''.join(value) != value + except (TypeError, ValueError, AttributeError, AssertionError): raise DistutilsSetupError( - "%r must be a list of strings (got %r)" % (attr,value) + "%r must be a list of strings (got %r)" % (attr, value) ) + + def check_nsp(dist, attr, value): """Verify that namespace packages are valid""" - assert_string_list(dist,attr,value) - for nsp in value: + ns_packages = value + assert_string_list(dist, attr, ns_packages) + for nsp in ns_packages: if not dist.has_contents_for(nsp): raise DistutilsSetupError( "Distribution contains no modules or packages for " + "namespace package %r" % nsp ) - if '.' in nsp: - parent = '.'.join(nsp.split('.')[:-1]) - if parent not in value: - distutils.log.warn( - "WARNING: %r is declared as a package namespace, but %r" - " is not: please correct this in setup.py", nsp, parent - ) + parent, sep, child = nsp.rpartition('.') + if parent and parent not in ns_packages: + distutils.log.warn( + "WARNING: %r is declared as a package namespace, but %r" + " is not: please correct this in setup.py", nsp, parent + ) + def check_extras(dist, attr, value): """Verify that extras_require mapping is valid""" try: - for k,v in value.items(): - if ':' in k: - k,m = k.split(':',1) - if pkg_resources.invalid_marker(m): - raise DistutilsSetupError("Invalid environment marker: "+m) - list(pkg_resources.parse_requirements(v)) - except (TypeError,ValueError,AttributeError): + list(itertools.starmap(_check_extra, value.items())) + except (TypeError, ValueError, AttributeError): raise DistutilsSetupError( "'extras_require' must be a dictionary whose values are " "strings or lists of strings containing valid project/version " "requirement specifiers." ) + +def _check_extra(extra, reqs): + name, sep, marker = extra.partition(':') + if marker and pkg_resources.invalid_marker(marker): + raise DistutilsSetupError("Invalid environment marker: " + marker) + list(pkg_resources.parse_requirements(reqs)) + + def assert_bool(dist, attr, value): """Verify that value is True, False, 0, or 1""" if bool(value) != value: @@ -131,6 +173,19 @@ def check_requirements(dist, attr, value): ) raise DistutilsSetupError(tmpl.format(attr=attr, error=error)) + +def check_specifier(dist, attr, value): + """Verify that value is a valid version specifier""" + try: + packaging.specifiers.SpecifierSet(value) + except packaging.specifiers.InvalidSpecifier as error: + tmpl = ( + "{attr!r} must be a string " + "containing valid version specifiers; {error}" + ) + raise DistutilsSetupError(tmpl.format(attr=attr, error=error)) + + def check_entry_points(dist, attr, value): """Verify that entry_points map is parseable""" try: @@ -138,25 +193,30 @@ def check_entry_points(dist, attr, value): except ValueError as e: raise DistutilsSetupError(e) + def check_test_suite(dist, attr, value): if not isinstance(value, six.string_types): raise DistutilsSetupError("test_suite must be a string") + def check_package_data(dist, attr, value): """Verify that value is a dictionary of package names to glob lists""" - if isinstance(value,dict): - for k,v in value.items(): - if not isinstance(k,str): break - try: iter(v) + if isinstance(value, dict): + for k, v in value.items(): + if not isinstance(k, str): + break + try: + iter(v) except TypeError: break else: return raise DistutilsSetupError( - attr+" must be a dictionary mapping package names to lists of " + attr + " must be a dictionary mapping package names to lists of " "wildcard patterns" ) + def check_packages(dist, attr, value): for pkgname in value: if not re.match(r'\w+(\.\w+)*', pkgname): @@ -166,7 +226,10 @@ def check_packages(dist, attr, value): ) -class Distribution(_Distribution): +_Distribution = get_unpatched(distutils.core.Distribution) + + +class Distribution(Distribution_parse_config_files, _Distribution): """Distribution with support for features, tests, and package data This is an enhanced version of 'distutils.dist.Distribution' that @@ -261,15 +324,18 @@ class Distribution(_Distribution): self.dist_files = [] self.src_root = attrs and attrs.pop("src_root", None) self.patch_missing_pkg_info(attrs) + self.long_description_content_type = _attrs_dict.get( + 'long_description_content_type' + ) # Make sure we have any eggs needed to interpret 'attrs' if attrs is not None: self.dependency_links = attrs.pop('dependency_links', []) - assert_string_list(self,'dependency_links',self.dependency_links) + assert_string_list(self, 'dependency_links', self.dependency_links) if attrs and 'setup_requires' in attrs: self.fetch_build_eggs(attrs['setup_requires']) for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): vars(self).setdefault(ep.name, None) - _Distribution.__init__(self,attrs) + _Distribution.__init__(self, attrs) if isinstance(self.metadata.version, numbers.Number): # Some people apparently take "version number" too literally :) self.metadata.version = str(self.metadata.version) @@ -293,6 +359,83 @@ class Distribution(_Distribution): "setuptools, pip, and PyPI. Please see PEP 440 for more " "details." % self.metadata.version ) + self._finalize_requires() + + def _finalize_requires(self): + """ + Set `metadata.python_requires` and fix environment markers + in `install_requires` and `extras_require`. + """ + if getattr(self, 'python_requires', None): + self.metadata.python_requires = self.python_requires + self._convert_extras_requirements() + self._move_install_requirements_markers() + + def _convert_extras_requirements(self): + """ + Convert requirements in `extras_require` of the form + `"extra": ["barbazquux; {marker}"]` to + `"extra:{marker}": ["barbazquux"]`. + """ + spec_ext_reqs = getattr(self, 'extras_require', None) or {} + self._tmp_extras_require = defaultdict(list) + for section, v in spec_ext_reqs.items(): + # Do not strip empty sections. + self._tmp_extras_require[section] + for r in pkg_resources.parse_requirements(v): + suffix = self._suffix_for(r) + self._tmp_extras_require[section + suffix].append(r) + + @staticmethod + def _suffix_for(req): + """ + For a requirement, return the 'extras_require' suffix for + that requirement. + """ + return ':' + str(req.marker) if req.marker else '' + + def _move_install_requirements_markers(self): + """ + Move requirements in `install_requires` that are using environment + markers `extras_require`. + """ + + # divide the install_requires into two sets, simple ones still + # handled by install_requires and more complex ones handled + # by extras_require. + + def is_simple_req(req): + return not req.marker + + spec_inst_reqs = getattr(self, 'install_requires', None) or () + inst_reqs = list(pkg_resources.parse_requirements(spec_inst_reqs)) + simple_reqs = filter(is_simple_req, inst_reqs) + complex_reqs = filterfalse(is_simple_req, inst_reqs) + self.install_requires = list(map(str, simple_reqs)) + + for r in complex_reqs: + self._tmp_extras_require[':' + str(r.marker)].append(r) + self.extras_require = dict( + (k, [str(r) for r in map(self._clean_req, v)]) + for k, v in self._tmp_extras_require.items() + ) + + def _clean_req(self, req): + """ + Given a Requirement, remove environment markers and return it. + """ + req.marker = None + return req + + def parse_config_files(self, filenames=None): + """Parses configuration files from various levels + and loads configuration. + + """ + _Distribution.parse_config_files(self, filenames=filenames) + + parse_configuration(self, self.command_options) + self._finalize_requires() def parse_command_line(self): """Process features after parsing command line options""" @@ -301,9 +444,9 @@ class Distribution(_Distribution): self._finalize_features() return result - def _feature_attrname(self,name): + def _feature_attrname(self, name): """Convert feature name to corresponding option attribute name""" - return 'with_'+name.replace('-','_') + return 'with_' + name.replace('-', '_') def fetch_build_eggs(self, requires): """Resolve pre-setup requirements""" @@ -314,6 +457,7 @@ class Distribution(_Distribution): ) for dist in resolved_dists: pkg_resources.working_set.add(dist, replace=True) + return resolved_dists def finalize_options(self): _Distribution.finalize_options(self) @@ -321,13 +465,16 @@ class Distribution(_Distribution): self._set_global_opts_from_features() for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): - value = getattr(self,ep.name,None) + value = getattr(self, ep.name, None) if value is not None: ep.require(installer=self.fetch_build_egg) ep.load()(self, ep.name, value) if getattr(self, 'convert_2to3_doctests', None): # XXX may convert to set here when we can rely on set being builtin - self.convert_2to3_doctests = [os.path.abspath(p) for p in self.convert_2to3_doctests] + self.convert_2to3_doctests = [ + os.path.abspath(p) + for p in self.convert_2to3_doctests + ] else: self.convert_2to3_doctests = [] @@ -348,35 +495,30 @@ class Distribution(_Distribution): def fetch_build_egg(self, req): """Fetch an egg needed for building""" - - try: - cmd = self._egg_fetcher - cmd.package_index.to_scan = [] - except AttributeError: - from setuptools.command.easy_install import easy_install - dist = self.__class__({'script_args':['easy_install']}) - dist.parse_config_files() - opts = dist.get_option_dict('easy_install') - keep = ( - 'find_links', 'site_dirs', 'index_url', 'optimize', - 'site_dirs', 'allow_hosts' - ) - for key in list(opts): - if key not in keep: - del opts[key] # don't use any other settings - if self.dependency_links: - links = self.dependency_links[:] - if 'find_links' in opts: - links = opts['find_links'][1].split() + links - opts['find_links'] = ('setup', links) - install_dir = self.get_egg_cache_dir() - cmd = easy_install( - dist, args=["x"], install_dir=install_dir, exclude_scripts=True, - always_copy=False, build_directory=None, editable=False, - upgrade=False, multi_version=True, no_report=True, user=False - ) - cmd.ensure_finalized() - self._egg_fetcher = cmd + from setuptools.command.easy_install import easy_install + dist = self.__class__({'script_args': ['easy_install']}) + dist.parse_config_files() + opts = dist.get_option_dict('easy_install') + keep = ( + 'find_links', 'site_dirs', 'index_url', 'optimize', + 'site_dirs', 'allow_hosts' + ) + for key in list(opts): + if key not in keep: + del opts[key] # don't use any other settings + if self.dependency_links: + links = self.dependency_links[:] + if 'find_links' in opts: + links = opts['find_links'][1].split() + links + opts['find_links'] = ('setup', links) + install_dir = self.get_egg_cache_dir() + cmd = easy_install( + dist, args=["x"], install_dir=install_dir, + exclude_scripts=True, + always_copy=False, build_directory=None, editable=False, + upgrade=False, multi_version=True, no_report=True, user=False + ) + cmd.ensure_finalized() return cmd.easy_install(req) def _set_global_opts_from_features(self): @@ -385,20 +527,23 @@ class Distribution(_Distribution): go = [] no = self.negative_opt.copy() - for name,feature in self.features.items(): - self._set_feature(name,None) + for name, feature in self.features.items(): + self._set_feature(name, None) feature.validate(self) if feature.optional: descr = feature.description incdef = ' (default)' - excdef='' + excdef = '' if not feature.include_by_default(): excdef, incdef = incdef, excdef - go.append(('with-'+name, None, 'include '+descr+incdef)) - go.append(('without-'+name, None, 'exclude '+descr+excdef)) - no['without-'+name] = 'with-'+name + new = ( + ('with-' + name, None, 'include ' + descr + incdef), + ('without-' + name, None, 'exclude ' + descr + excdef), + ) + go.extend(new) + no['without-' + name] = 'with-' + name self.global_options = self.feature_options = go + self.global_options self.negative_opt = self.feature_negopt = no @@ -407,25 +552,26 @@ class Distribution(_Distribution): """Add/remove features and resolve dependencies between them""" # First, flag all the enabled items (and thus their dependencies) - for name,feature in self.features.items(): + for name, feature in self.features.items(): enabled = self.feature_is_included(name) if enabled or (enabled is None and feature.include_by_default()): feature.include_in(self) - self._set_feature(name,1) + self._set_feature(name, 1) # Then disable the rest, so that off-by-default features don't # get flagged as errors when they're required by an enabled feature - for name,feature in self.features.items(): + for name, feature in self.features.items(): if not self.feature_is_included(name): feature.exclude_from(self) - self._set_feature(name,0) + self._set_feature(name, 0) def get_command_class(self, command): """Pluggable version of get_command_class()""" if command in self.cmdclass: return self.cmdclass[command] - for ep in pkg_resources.iter_entry_points('distutils.commands',command): + eps = pkg_resources.iter_entry_points('distutils.commands', command) + for ep in eps: ep.require(installer=self.fetch_build_egg) self.cmdclass[command] = cmdclass = ep.load() return cmdclass @@ -448,26 +594,26 @@ class Distribution(_Distribution): self.cmdclass[ep.name] = cmdclass return _Distribution.get_command_list(self) - def _set_feature(self,name,status): + def _set_feature(self, name, status): """Set feature's inclusion status""" - setattr(self,self._feature_attrname(name),status) + setattr(self, self._feature_attrname(name), status) - def feature_is_included(self,name): + def feature_is_included(self, name): """Return 1 if feature is included, 0 if excluded, 'None' if unknown""" - return getattr(self,self._feature_attrname(name)) + return getattr(self, self._feature_attrname(name)) - def include_feature(self,name): + def include_feature(self, name): """Request inclusion of feature named 'name'""" - if self.feature_is_included(name)==0: + if self.feature_is_included(name) == 0: descr = self.features[name].description raise DistutilsOptionError( descr + " is required, but was excluded or is not available" ) self.features[name].include_in(self) - self._set_feature(name,1) + self._set_feature(name, 1) - def include(self,**attrs): + def include(self, **attrs): """Add items to distribution that are named in keyword arguments For example, 'dist.exclude(py_modules=["x"])' would add 'x' to @@ -482,86 +628,87 @@ class Distribution(_Distribution): will try to call 'dist._include_foo({"bar":"baz"})', which can then handle whatever special inclusion logic is needed. """ - for k,v in attrs.items(): - include = getattr(self, '_include_'+k, None) + for k, v in attrs.items(): + include = getattr(self, '_include_' + k, None) if include: include(v) else: - self._include_misc(k,v) + self._include_misc(k, v) - def exclude_package(self,package): + def exclude_package(self, package): """Remove packages, modules, and extensions in named package""" - pfx = package+'.' + pfx = package + '.' if self.packages: self.packages = [ p for p in self.packages - if p != package and not p.startswith(pfx) + if p != package and not p.startswith(pfx) ] if self.py_modules: self.py_modules = [ p for p in self.py_modules - if p != package and not p.startswith(pfx) + if p != package and not p.startswith(pfx) ] if self.ext_modules: self.ext_modules = [ p for p in self.ext_modules - if p.name != package and not p.name.startswith(pfx) + if p.name != package and not p.name.startswith(pfx) ] - def has_contents_for(self,package): + def has_contents_for(self, package): """Return true if 'exclude_package(package)' would do something""" - pfx = package+'.' + pfx = package + '.' for p in self.iter_distribution_names(): - if p==package or p.startswith(pfx): + if p == package or p.startswith(pfx): return True - def _exclude_misc(self,name,value): + def _exclude_misc(self, name, value): """Handle 'exclude()' for list/tuple attrs without a special handler""" - if not isinstance(value,sequence): + if not isinstance(value, sequence): raise DistutilsSetupError( "%s: setting must be a list or tuple (%r)" % (name, value) ) try: - old = getattr(self,name) + old = getattr(self, name) except AttributeError: raise DistutilsSetupError( "%s: No such distribution setting" % name ) - if old is not None and not isinstance(old,sequence): + if old is not None and not isinstance(old, sequence): raise DistutilsSetupError( - name+": this setting cannot be changed via include/exclude" + name + ": this setting cannot be changed via include/exclude" ) elif old: - setattr(self,name,[item for item in old if item not in value]) + setattr(self, name, [item for item in old if item not in value]) - def _include_misc(self,name,value): + def _include_misc(self, name, value): """Handle 'include()' for list/tuple attrs without a special handler""" - if not isinstance(value,sequence): + if not isinstance(value, sequence): raise DistutilsSetupError( "%s: setting must be a list (%r)" % (name, value) ) try: - old = getattr(self,name) + old = getattr(self, name) except AttributeError: raise DistutilsSetupError( "%s: No such distribution setting" % name ) if old is None: - setattr(self,name,value) - elif not isinstance(old,sequence): + setattr(self, name, value) + elif not isinstance(old, sequence): raise DistutilsSetupError( - name+": this setting cannot be changed via include/exclude" + name + ": this setting cannot be changed via include/exclude" ) else: - setattr(self,name,old+[item for item in value if item not in old]) + new = [item for item in value if item not in old] + setattr(self, name, old + new) - def exclude(self,**attrs): + def exclude(self, **attrs): """Remove items from distribution that are named in keyword arguments For example, 'dist.exclude(py_modules=["x"])' would remove 'x' from @@ -577,15 +724,15 @@ class Distribution(_Distribution): will try to call 'dist._exclude_foo({"bar":"baz"})', which can then handle whatever special exclusion logic is needed. """ - for k,v in attrs.items(): - exclude = getattr(self, '_exclude_'+k, None) + for k, v in attrs.items(): + exclude = getattr(self, '_exclude_' + k, None) if exclude: exclude(v) else: - self._exclude_misc(k,v) + self._exclude_misc(k, v) - def _exclude_packages(self,packages): - if not isinstance(packages,sequence): + def _exclude_packages(self, packages): + if not isinstance(packages, sequence): raise DistutilsSetupError( "packages: setting must be a list or tuple (%r)" % (packages,) ) @@ -600,17 +747,17 @@ class Distribution(_Distribution): command = args[0] aliases = self.get_option_dict('aliases') while command in aliases: - src,alias = aliases[command] - del aliases[command] # ensure each alias can expand only once! + src, alias = aliases[command] + del aliases[command] # ensure each alias can expand only once! import shlex - args[:1] = shlex.split(alias,True) + args[:1] = shlex.split(alias, True) command = args[0] nargs = _Distribution._parse_command_opts(self, parser, args) # Handle commands that want to consume all remaining arguments cmd_class = self.get_command_class(command) - if getattr(cmd_class,'command_consumes_arguments',None): + if getattr(cmd_class, 'command_consumes_arguments', None): self.get_option_dict(command)['args'] = ("command line", nargs) if nargs is not None: return [] @@ -629,31 +776,31 @@ class Distribution(_Distribution): d = {} - for cmd,opts in self.command_options.items(): + for cmd, opts in self.command_options.items(): - for opt,(src,val) in opts.items(): + for opt, (src, val) in opts.items(): if src != "command line": continue - opt = opt.replace('_','-') + opt = opt.replace('_', '-') - if val==0: + if val == 0: cmdobj = self.get_command_obj(cmd) neg_opt = self.negative_opt.copy() - neg_opt.update(getattr(cmdobj,'negative_opt',{})) - for neg,pos in neg_opt.items(): - if pos==opt: - opt=neg - val=None + neg_opt.update(getattr(cmdobj, 'negative_opt', {})) + for neg, pos in neg_opt.items(): + if pos == opt: + opt = neg + val = None break else: raise AssertionError("Shouldn't be able to get here") - elif val==1: + elif val == 1: val = None - d.setdefault(cmd,{})[opt] = val + d.setdefault(cmd, {})[opt] = val return d @@ -667,7 +814,7 @@ class Distribution(_Distribution): yield module for ext in self.ext_modules or (): - if isinstance(ext,tuple): + if isinstance(ext, tuple): name, buildinfo = ext else: name = ext.name @@ -711,16 +858,11 @@ class Distribution(_Distribution): sys.stdout.detach(), encoding, errors, newline, line_buffering) -# Install it throughout the distutils -for module in distutils.dist, distutils.core, distutils.cmd: - module.Distribution = Distribution - - class Feature: """ **deprecated** -- The `Feature` facility was never completely implemented or supported, `has reported issues - `_ and will be removed in + `_ and will be removed in a future version. A subset of the distribution that can be excluded if unneeded/wanted @@ -775,14 +917,14 @@ class Feature: @staticmethod def warn_deprecated(): - warnings.warn( + msg = ( "Features are deprecated and will be removed in a future " - "version. See http://bitbucket.org/pypa/setuptools/65.", - DeprecationWarning, - stacklevel=3, + "version. See https://github.com/pypa/setuptools/issues/65." ) + warnings.warn(msg, DeprecationWarning, stacklevel=3) - def __init__(self, description, standard=False, available=True, + def __init__( + self, description, standard=False, available=True, optional=True, require_features=(), remove=(), **extras): self.warn_deprecated() @@ -790,32 +932,32 @@ class Feature: self.standard = standard self.available = available self.optional = optional - if isinstance(require_features,(str,Require)): + if isinstance(require_features, (str, Require)): require_features = require_features, self.require_features = [ - r for r in require_features if isinstance(r,str) + r for r in require_features if isinstance(r, str) ] - er = [r for r in require_features if not isinstance(r,str)] - if er: extras['require_features'] = er + er = [r for r in require_features if not isinstance(r, str)] + if er: + extras['require_features'] = er - if isinstance(remove,str): + if isinstance(remove, str): remove = remove, self.remove = remove self.extras = extras if not remove and not require_features and not extras: raise DistutilsSetupError( - "Feature %s: must define 'require_features', 'remove', or at least one" - " of 'packages', 'py_modules', etc." + "Feature %s: must define 'require_features', 'remove', or " + "at least one of 'packages', 'py_modules', etc." ) def include_by_default(self): """Should this feature be included by default?""" return self.available and self.standard - def include_in(self,dist): - + def include_in(self, dist): """Ensure feature and its requirements are included in distribution You may override this in a subclass to perform additional operations on @@ -826,7 +968,7 @@ class Feature: if not self.available: raise DistutilsPlatformError( - self.description+" is required, " + self.description + " is required, " "but is not available on this platform" ) @@ -835,8 +977,7 @@ class Feature: for f in self.require_features: dist.include_feature(f) - def exclude_from(self,dist): - + def exclude_from(self, dist): """Ensure feature is excluded from distribution You may override this in a subclass to perform additional operations on @@ -851,8 +992,7 @@ class Feature: for item in self.remove: dist.exclude_package(item) - def validate(self,dist): - + def validate(self, dist): """Verify that feature makes sense in context of distribution This method is called by the distribution just before it parses its diff --git a/lib/python3.4/site-packages/setuptools/extension.py b/lib/python3.4/site-packages/setuptools/extension.py index d10609b..2946889 100644 --- a/lib/python3.4/site-packages/setuptools/extension.py +++ b/lib/python3.4/site-packages/setuptools/extension.py @@ -1,4 +1,3 @@ -import sys import re import functools import distutils.core @@ -7,18 +6,14 @@ import distutils.extension from setuptools.extern.six.moves import map -from .dist import _get_unpatched -from . import msvc9_support +from .monkey import get_unpatched -_Extension = _get_unpatched(distutils.core.Extension) - -msvc9_support.patch_for_specialized_compiler() def _have_cython(): """ Return True if Cython can be imported. """ - cython_impl = 'Cython.Distutils.build_ext', + cython_impl = 'Cython.Distutils.build_ext' try: # from (cython_impl) import build_ext __import__(cython_impl, fromlist=['build_ext']).build_ext @@ -27,13 +22,22 @@ def _have_cython(): pass return False + # for compatibility have_pyrex = _have_cython +_Extension = get_unpatched(distutils.core.Extension) + class Extension(_Extension): """Extension that uses '.c' files in place of '.pyx' files""" + def __init__(self, name, sources, *args, **kw): + # The *args is needed for compatibility as calls may use positional + # arguments. py_limited_api may be set only via keyword. + self.py_limited_api = kw.pop("py_limited_api", False) + _Extension.__init__(self, name, sources, *args, **kw) + def _convert_pyx_sources_to_lang(self): """ Replace sources with .pyx extensions to sources with the target @@ -48,10 +52,6 @@ class Extension(_Extension): sub = functools.partial(re.sub, '.pyx$', target_ext) self.sources = list(map(sub, self.sources)) + class Library(Extension): """Just like a regular Extension, but built as a library instead""" - -distutils.core.Extension = Extension -distutils.extension.Extension = Extension -if 'distutils.command.build_ext' in sys.modules: - sys.modules['distutils.command.build_ext'].Extension = Extension diff --git a/lib/python3.4/site-packages/setuptools/extern/__init__.py b/lib/python3.4/site-packages/setuptools/extern/__init__.py index 6859aa5..2cd08b7 100644 --- a/lib/python3.4/site-packages/setuptools/extern/__init__.py +++ b/lib/python3.4/site-packages/setuptools/extern/__init__.py @@ -1,5 +1,4 @@ from pkg_resources.extern import VendorImporter - names = 'six', VendorImporter(__name__, names, 'pkg_resources._vendor').install() diff --git a/lib/python3.4/site-packages/setuptools/glob.py b/lib/python3.4/site-packages/setuptools/glob.py new file mode 100644 index 0000000..6c781de --- /dev/null +++ b/lib/python3.4/site-packages/setuptools/glob.py @@ -0,0 +1,176 @@ +""" +Filename globbing utility. Mostly a copy of `glob` from Python 3.5. + +Changes include: + * `yield from` and PEP3102 `*` removed. + * `bytes` changed to `six.binary_type`. + * Hidden files are not ignored. +""" + +import os +import re +import fnmatch +from setuptools.extern.six import binary_type + +__all__ = ["glob", "iglob", "escape"] + + +def glob(pathname, recursive=False): + """Return a list of paths matching a pathname pattern. + + The pattern may contain simple shell-style wildcards a la + fnmatch. However, unlike fnmatch, filenames starting with a + dot are special cases that are not matched by '*' and '?' + patterns. + + If recursive is true, the pattern '**' will match any files and + zero or more directories and subdirectories. + """ + return list(iglob(pathname, recursive=recursive)) + + +def iglob(pathname, recursive=False): + """Return an iterator which yields the paths matching a pathname pattern. + + The pattern may contain simple shell-style wildcards a la + fnmatch. However, unlike fnmatch, filenames starting with a + dot are special cases that are not matched by '*' and '?' + patterns. + + If recursive is true, the pattern '**' will match any files and + zero or more directories and subdirectories. + """ + it = _iglob(pathname, recursive) + if recursive and _isrecursive(pathname): + s = next(it) # skip empty string + assert not s + return it + + +def _iglob(pathname, recursive): + dirname, basename = os.path.split(pathname) + if not has_magic(pathname): + if basename: + if os.path.lexists(pathname): + yield pathname + else: + # Patterns ending with a slash should match only directories + if os.path.isdir(dirname): + yield pathname + return + if not dirname: + if recursive and _isrecursive(basename): + for x in glob2(dirname, basename): + yield x + else: + for x in glob1(dirname, basename): + yield x + return + # `os.path.split()` returns the argument itself as a dirname if it is a + # drive or UNC path. Prevent an infinite recursion if a drive or UNC path + # contains magic characters (i.e. r'\\?\C:'). + if dirname != pathname and has_magic(dirname): + dirs = _iglob(dirname, recursive) + else: + dirs = [dirname] + if has_magic(basename): + if recursive and _isrecursive(basename): + glob_in_dir = glob2 + else: + glob_in_dir = glob1 + else: + glob_in_dir = glob0 + for dirname in dirs: + for name in glob_in_dir(dirname, basename): + yield os.path.join(dirname, name) + + +# These 2 helper functions non-recursively glob inside a literal directory. +# They return a list of basenames. `glob1` accepts a pattern while `glob0` +# takes a literal basename (so it only has to check for its existence). + + +def glob1(dirname, pattern): + if not dirname: + if isinstance(pattern, binary_type): + dirname = os.curdir.encode('ASCII') + else: + dirname = os.curdir + try: + names = os.listdir(dirname) + except OSError: + return [] + return fnmatch.filter(names, pattern) + + +def glob0(dirname, basename): + if not basename: + # `os.path.split()` returns an empty basename for paths ending with a + # directory separator. 'q*x/' should match only directories. + if os.path.isdir(dirname): + return [basename] + else: + if os.path.lexists(os.path.join(dirname, basename)): + return [basename] + return [] + + +# This helper function recursively yields relative pathnames inside a literal +# directory. + + +def glob2(dirname, pattern): + assert _isrecursive(pattern) + yield pattern[:0] + for x in _rlistdir(dirname): + yield x + + +# Recursively yields relative pathnames inside a literal directory. +def _rlistdir(dirname): + if not dirname: + if isinstance(dirname, binary_type): + dirname = binary_type(os.curdir, 'ASCII') + else: + dirname = os.curdir + try: + names = os.listdir(dirname) + except os.error: + return + for x in names: + yield x + path = os.path.join(dirname, x) if dirname else x + for y in _rlistdir(path): + yield os.path.join(x, y) + + +magic_check = re.compile('([*?[])') +magic_check_bytes = re.compile(b'([*?[])') + + +def has_magic(s): + if isinstance(s, binary_type): + match = magic_check_bytes.search(s) + else: + match = magic_check.search(s) + return match is not None + + +def _isrecursive(pattern): + if isinstance(pattern, binary_type): + return pattern == b'**' + else: + return pattern == '**' + + +def escape(pathname): + """Escape all special characters. + """ + # Escaping is done by wrapping any of "*?[" between square brackets. + # Metacharacters do not work in the drive part and shouldn't be escaped. + drive, pathname = os.path.splitdrive(pathname) + if isinstance(pathname, binary_type): + pathname = magic_check_bytes.sub(br'[\1]', pathname) + else: + pathname = magic_check.sub(r'[\1]', pathname) + return drive + pathname diff --git a/lib/python3.4/site-packages/setuptools/gui-arm-32.exe b/lib/python3.4/site-packages/setuptools/gui-arm-32.exe deleted file mode 100644 index 537aff3774ecd62f4c26c55d0cc12f85c8a20a1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69120 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 diff --git a/lib/python3.4/site-packages/setuptools/launch.py b/lib/python3.4/site-packages/setuptools/launch.py index 06e15e1..308283e 100644 --- a/lib/python3.4/site-packages/setuptools/launch.py +++ b/lib/python3.4/site-packages/setuptools/launch.py @@ -11,25 +11,25 @@ import sys def run(): - """ - Run the script in sys.argv[1] as if it had - been invoked naturally. - """ - __builtins__ - script_name = sys.argv[1] - namespace = dict( - __file__ = script_name, - __name__ = '__main__', - __doc__ = None, - ) - sys.argv[:] = sys.argv[1:] + """ + Run the script in sys.argv[1] as if it had + been invoked naturally. + """ + __builtins__ + script_name = sys.argv[1] + namespace = dict( + __file__=script_name, + __name__='__main__', + __doc__=None, + ) + sys.argv[:] = sys.argv[1:] - open_ = getattr(tokenize, 'open', open) - script = open_(script_name).read() - norm_script = script.replace('\\r\\n', '\\n') - code = compile(norm_script, script_name, 'exec') - exec(code, namespace) + open_ = getattr(tokenize, 'open', open) + script = open_(script_name).read() + norm_script = script.replace('\\r\\n', '\\n') + code = compile(norm_script, script_name, 'exec') + exec(code, namespace) if __name__ == '__main__': - run() + run() diff --git a/lib/python3.4/site-packages/setuptools/lib2to3_ex.py b/lib/python3.4/site-packages/setuptools/lib2to3_ex.py index feef591..4b1a73f 100644 --- a/lib/python3.4/site-packages/setuptools/lib2to3_ex.py +++ b/lib/python3.4/site-packages/setuptools/lib2to3_ex.py @@ -10,8 +10,10 @@ This module raises an ImportError on Python 2. from distutils.util import Mixin2to3 as _Mixin2to3 from distutils import log from lib2to3.refactor import RefactoringTool, get_fixers_from_package + import setuptools + class DistutilsRefactoringTool(RefactoringTool): def log_error(self, msg, *args, **kw): log.error(msg, *args) @@ -22,15 +24,16 @@ class DistutilsRefactoringTool(RefactoringTool): def log_debug(self, msg, *args): log.debug(msg, *args) + class Mixin2to3(_Mixin2to3): - def run_2to3(self, files, doctests = False): + def run_2to3(self, files, doctests=False): # See of the distribution option has been set, otherwise check the # setuptools default. if self.distribution.use_2to3 is not True: return if not files: return - log.info("Fixing "+" ".join(files)) + log.info("Fixing " + " ".join(files)) self.__build_fixer_names() self.__exclude_fixers() if doctests: @@ -41,7 +44,8 @@ class Mixin2to3(_Mixin2to3): _Mixin2to3.run_2to3(self, files) def __build_fixer_names(self): - if self.fixer_names: return + if self.fixer_names: + return self.fixer_names = [] for p in setuptools.lib2to3_fixer_packages: self.fixer_names.extend(get_fixers_from_package(p)) diff --git a/lib/python3.4/site-packages/setuptools/monkey.py b/lib/python3.4/site-packages/setuptools/monkey.py new file mode 100644 index 0000000..6d3711e --- /dev/null +++ b/lib/python3.4/site-packages/setuptools/monkey.py @@ -0,0 +1,197 @@ +""" +Monkey patching of distutils. +""" + +import sys +import distutils.filelist +import platform +import types +import functools +import inspect + +from .py26compat import import_module +from setuptools.extern import six + +import setuptools + +__all__ = [] +""" +Everything is private. Contact the project team +if you think you need this functionality. +""" + + +def _get_mro(cls): + """ + Returns the bases classes for cls sorted by the MRO. + + Works around an issue on Jython where inspect.getmro will not return all + base classes if multiple classes share the same name. Instead, this + function will return a tuple containing the class itself, and the contents + of cls.__bases__. See https://github.com/pypa/setuptools/issues/1024. + """ + if platform.python_implementation() == "Jython": + return (cls,) + cls.__bases__ + return inspect.getmro(cls) + + +def get_unpatched(item): + lookup = ( + get_unpatched_class if isinstance(item, six.class_types) else + get_unpatched_function if isinstance(item, types.FunctionType) else + lambda item: None + ) + return lookup(item) + + +def get_unpatched_class(cls): + """Protect against re-patching the distutils if reloaded + + Also ensures that no other distutils extension monkeypatched the distutils + first. + """ + external_bases = ( + cls + for cls in _get_mro(cls) + if not cls.__module__.startswith('setuptools') + ) + base = next(external_bases) + if not base.__module__.startswith('distutils'): + msg = "distutils has already been patched by %r" % cls + raise AssertionError(msg) + return base + + +def patch_all(): + # we can't patch distutils.cmd, alas + distutils.core.Command = setuptools.Command + + has_issue_12885 = sys.version_info <= (3, 5, 3) + + if has_issue_12885: + # fix findall bug in distutils (http://bugs.python.org/issue12885) + distutils.filelist.findall = setuptools.findall + + needs_warehouse = ( + sys.version_info < (2, 7, 13) + or + (3, 0) < sys.version_info < (3, 3, 7) + or + (3, 4) < sys.version_info < (3, 4, 6) + or + (3, 5) < sys.version_info <= (3, 5, 3) + ) + + if needs_warehouse: + warehouse = 'https://upload.pypi.org/legacy/' + distutils.config.PyPIRCCommand.DEFAULT_REPOSITORY = warehouse + + _patch_distribution_metadata_write_pkg_file() + _patch_distribution_metadata_write_pkg_info() + + # Install Distribution throughout the distutils + for module in distutils.dist, distutils.core, distutils.cmd: + module.Distribution = setuptools.dist.Distribution + + # Install the patched Extension + distutils.core.Extension = setuptools.extension.Extension + distutils.extension.Extension = setuptools.extension.Extension + if 'distutils.command.build_ext' in sys.modules: + sys.modules['distutils.command.build_ext'].Extension = ( + setuptools.extension.Extension + ) + + patch_for_msvc_specialized_compiler() + + +def _patch_distribution_metadata_write_pkg_file(): + """Patch write_pkg_file to also write Requires-Python/Requires-External""" + distutils.dist.DistributionMetadata.write_pkg_file = ( + setuptools.dist.write_pkg_file + ) + + +def _patch_distribution_metadata_write_pkg_info(): + """ + Workaround issue #197 - Python 3 prior to 3.2.2 uses an environment-local + encoding to save the pkg_info. Monkey-patch its write_pkg_info method to + correct this undesirable behavior. + """ + environment_local = (3,) <= sys.version_info[:3] < (3, 2, 2) + if not environment_local: + return + + distutils.dist.DistributionMetadata.write_pkg_info = ( + setuptools.dist.write_pkg_info + ) + + +def patch_func(replacement, target_mod, func_name): + """ + Patch func_name in target_mod with replacement + + Important - original must be resolved by name to avoid + patching an already patched function. + """ + original = getattr(target_mod, func_name) + + # set the 'unpatched' attribute on the replacement to + # point to the original. + vars(replacement).setdefault('unpatched', original) + + # replace the function in the original module + setattr(target_mod, func_name, replacement) + + +def get_unpatched_function(candidate): + return getattr(candidate, 'unpatched') + + +def patch_for_msvc_specialized_compiler(): + """ + Patch functions in distutils to use standalone Microsoft Visual C++ + compilers. + """ + # import late to avoid circular imports on Python < 3.5 + msvc = import_module('setuptools.msvc') + + if platform.system() != 'Windows': + # Compilers only availables on Microsoft Windows + return + + def patch_params(mod_name, func_name): + """ + Prepare the parameters for patch_func to patch indicated function. + """ + repl_prefix = 'msvc9_' if 'msvc9' in mod_name else 'msvc14_' + repl_name = repl_prefix + func_name.lstrip('_') + repl = getattr(msvc, repl_name) + mod = import_module(mod_name) + if not hasattr(mod, func_name): + raise ImportError(func_name) + return repl, mod, func_name + + # Python 2.7 to 3.4 + msvc9 = functools.partial(patch_params, 'distutils.msvc9compiler') + + # Python 3.5+ + msvc14 = functools.partial(patch_params, 'distutils._msvccompiler') + + try: + # Patch distutils.msvc9compiler + patch_func(*msvc9('find_vcvarsall')) + patch_func(*msvc9('query_vcvarsall')) + except ImportError: + pass + + try: + # Patch distutils._msvccompiler._get_vc_env + patch_func(*msvc14('_get_vc_env')) + except ImportError: + pass + + try: + # Patch distutils._msvccompiler.gen_lib_options for Numpy + patch_func(*msvc14('gen_lib_options')) + except ImportError: + pass diff --git a/lib/python3.4/site-packages/setuptools/msvc.py b/lib/python3.4/site-packages/setuptools/msvc.py new file mode 100644 index 0000000..8e3b638 --- /dev/null +++ b/lib/python3.4/site-packages/setuptools/msvc.py @@ -0,0 +1,1302 @@ +""" +Improved support for Microsoft Visual C++ compilers. + +Known supported compilers: +-------------------------- +Microsoft Visual C++ 9.0: + Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) + Microsoft Windows SDK 6.1 (x86, x64, ia64) + Microsoft Windows SDK 7.0 (x86, x64, ia64) + +Microsoft Visual C++ 10.0: + Microsoft Windows SDK 7.1 (x86, x64, ia64) + +Microsoft Visual C++ 14.0: + Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) + Microsoft Visual Studio 2017 (x86, x64, arm, arm64) + Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) +""" + +import os +import sys +import platform +import itertools +import distutils.errors +from pkg_resources.extern.packaging.version import LegacyVersion + +from setuptools.extern.six.moves import filterfalse + +from .monkey import get_unpatched + +if platform.system() == 'Windows': + from setuptools.extern.six.moves import winreg + safe_env = os.environ +else: + """ + Mock winreg and environ so the module can be imported + on this platform. + """ + + class winreg: + HKEY_USERS = None + HKEY_CURRENT_USER = None + HKEY_LOCAL_MACHINE = None + HKEY_CLASSES_ROOT = None + + safe_env = dict() + +_msvc9_suppress_errors = ( + # msvc9compiler isn't available on some platforms + ImportError, + + # msvc9compiler raises DistutilsPlatformError in some + # environments. See #1118. + distutils.errors.DistutilsPlatformError, +) + +try: + from distutils.msvc9compiler import Reg +except _msvc9_suppress_errors: + pass + + +def msvc9_find_vcvarsall(version): + """ + Patched "distutils.msvc9compiler.find_vcvarsall" to use the standalone + compiler build for Python (VCForPython). Fall back to original behavior + when the standalone compiler is not available. + + Redirect the path of "vcvarsall.bat". + + Known supported compilers + ------------------------- + Microsoft Visual C++ 9.0: + Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) + + Parameters + ---------- + version: float + Required Microsoft Visual C++ version. + + Return + ------ + vcvarsall.bat path: str + """ + VC_BASE = r'Software\%sMicrosoft\DevDiv\VCForPython\%0.1f' + key = VC_BASE % ('', version) + try: + # Per-user installs register the compiler path here + productdir = Reg.get_value(key, "installdir") + except KeyError: + try: + # All-user installs on a 64-bit system register here + key = VC_BASE % ('Wow6432Node\\', version) + productdir = Reg.get_value(key, "installdir") + except KeyError: + productdir = None + + if productdir: + vcvarsall = os.path.os.path.join(productdir, "vcvarsall.bat") + if os.path.isfile(vcvarsall): + return vcvarsall + + return get_unpatched(msvc9_find_vcvarsall)(version) + + +def msvc9_query_vcvarsall(ver, arch='x86', *args, **kwargs): + """ + Patched "distutils.msvc9compiler.query_vcvarsall" for support extra + compilers. + + Set environment without use of "vcvarsall.bat". + + Known supported compilers + ------------------------- + Microsoft Visual C++ 9.0: + Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) + Microsoft Windows SDK 6.1 (x86, x64, ia64) + Microsoft Windows SDK 7.0 (x86, x64, ia64) + + Microsoft Visual C++ 10.0: + Microsoft Windows SDK 7.1 (x86, x64, ia64) + + Parameters + ---------- + ver: float + Required Microsoft Visual C++ version. + arch: str + Target architecture. + + Return + ------ + environment: dict + """ + # Try to get environement from vcvarsall.bat (Classical way) + try: + orig = get_unpatched(msvc9_query_vcvarsall) + return orig(ver, arch, *args, **kwargs) + except distutils.errors.DistutilsPlatformError: + # Pass error if Vcvarsall.bat is missing + pass + except ValueError: + # Pass error if environment not set after executing vcvarsall.bat + pass + + # If error, try to set environment directly + try: + return EnvironmentInfo(arch, ver).return_env() + except distutils.errors.DistutilsPlatformError as exc: + _augment_exception(exc, ver, arch) + raise + + +def msvc14_get_vc_env(plat_spec): + """ + Patched "distutils._msvccompiler._get_vc_env" for support extra + compilers. + + Set environment without use of "vcvarsall.bat". + + Known supported compilers + ------------------------- + Microsoft Visual C++ 14.0: + Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) + Microsoft Visual Studio 2017 (x86, x64, arm, arm64) + Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) + + Parameters + ---------- + plat_spec: str + Target architecture. + + Return + ------ + environment: dict + """ + # Try to get environment from vcvarsall.bat (Classical way) + try: + return get_unpatched(msvc14_get_vc_env)(plat_spec) + except distutils.errors.DistutilsPlatformError: + # Pass error Vcvarsall.bat is missing + pass + + # If error, try to set environment directly + try: + return EnvironmentInfo(plat_spec, vc_min_ver=14.0).return_env() + except distutils.errors.DistutilsPlatformError as exc: + _augment_exception(exc, 14.0) + raise + + +def msvc14_gen_lib_options(*args, **kwargs): + """ + Patched "distutils._msvccompiler.gen_lib_options" for fix + compatibility between "numpy.distutils" and "distutils._msvccompiler" + (for Numpy < 1.11.2) + """ + if "numpy.distutils" in sys.modules: + import numpy as np + if LegacyVersion(np.__version__) < LegacyVersion('1.11.2'): + return np.distutils.ccompiler.gen_lib_options(*args, **kwargs) + return get_unpatched(msvc14_gen_lib_options)(*args, **kwargs) + + +def _augment_exception(exc, version, arch=''): + """ + Add details to the exception message to help guide the user + as to what action will resolve it. + """ + # Error if MSVC++ directory not found or environment not set + message = exc.args[0] + + if "vcvarsall" in message.lower() or "visual c" in message.lower(): + # Special error message if MSVC++ not installed + tmpl = 'Microsoft Visual C++ {version:0.1f} is required.' + message = tmpl.format(**locals()) + msdownload = 'www.microsoft.com/download/details.aspx?id=%d' + if version == 9.0: + if arch.lower().find('ia64') > -1: + # For VC++ 9.0, if IA64 support is needed, redirect user + # to Windows SDK 7.0 + message += ' Get it with "Microsoft Windows SDK 7.0": ' + message += msdownload % 3138 + else: + # For VC++ 9.0 redirect user to Vc++ for Python 2.7 : + # This redirection link is maintained by Microsoft. + # Contact vspython@microsoft.com if it needs updating. + message += ' Get it from http://aka.ms/vcpython27' + elif version == 10.0: + # For VC++ 10.0 Redirect user to Windows SDK 7.1 + message += ' Get it with "Microsoft Windows SDK 7.1": ' + message += msdownload % 8279 + elif version >= 14.0: + # For VC++ 14.0 Redirect user to Visual C++ Build Tools + message += (' Get it with "Microsoft Visual C++ Build Tools": ' + r'http://landinghub.visualstudio.com/' + 'visual-cpp-build-tools') + + exc.args = (message, ) + + +class PlatformInfo: + """ + Current and Target Architectures informations. + + Parameters + ---------- + arch: str + Target architecture. + """ + current_cpu = safe_env.get('processor_architecture', '').lower() + + def __init__(self, arch): + self.arch = arch.lower().replace('x64', 'amd64') + + @property + def target_cpu(self): + return self.arch[self.arch.find('_') + 1:] + + def target_is_x86(self): + return self.target_cpu == 'x86' + + def current_is_x86(self): + return self.current_cpu == 'x86' + + def current_dir(self, hidex86=False, x64=False): + """ + Current platform specific subfolder. + + Parameters + ---------- + hidex86: bool + return '' and not '\x86' if architecture is x86. + x64: bool + return '\x64' and not '\amd64' if architecture is amd64. + + Return + ------ + subfolder: str + '\target', or '' (see hidex86 parameter) + """ + return ( + '' if (self.current_cpu == 'x86' and hidex86) else + r'\x64' if (self.current_cpu == 'amd64' and x64) else + r'\%s' % self.current_cpu + ) + + def target_dir(self, hidex86=False, x64=False): + r""" + Target platform specific subfolder. + + Parameters + ---------- + hidex86: bool + return '' and not '\x86' if architecture is x86. + x64: bool + return '\x64' and not '\amd64' if architecture is amd64. + + Return + ------ + subfolder: str + '\current', or '' (see hidex86 parameter) + """ + return ( + '' if (self.target_cpu == 'x86' and hidex86) else + r'\x64' if (self.target_cpu == 'amd64' and x64) else + r'\%s' % self.target_cpu + ) + + def cross_dir(self, forcex86=False): + r""" + Cross platform specific subfolder. + + Parameters + ---------- + forcex86: bool + Use 'x86' as current architecture even if current acritecture is + not x86. + + Return + ------ + subfolder: str + '' if target architecture is current architecture, + '\current_target' if not. + """ + current = 'x86' if forcex86 else self.current_cpu + return ( + '' if self.target_cpu == current else + self.target_dir().replace('\\', '\\%s_' % current) + ) + + +class RegistryInfo: + """ + Microsoft Visual Studio related registry informations. + + Parameters + ---------- + platform_info: PlatformInfo + "PlatformInfo" instance. + """ + HKEYS = (winreg.HKEY_USERS, + winreg.HKEY_CURRENT_USER, + winreg.HKEY_LOCAL_MACHINE, + winreg.HKEY_CLASSES_ROOT) + + def __init__(self, platform_info): + self.pi = platform_info + + @property + def visualstudio(self): + """ + Microsoft Visual Studio root registry key. + """ + return 'VisualStudio' + + @property + def sxs(self): + """ + Microsoft Visual Studio SxS registry key. + """ + return os.path.join(self.visualstudio, 'SxS') + + @property + def vc(self): + """ + Microsoft Visual C++ VC7 registry key. + """ + return os.path.join(self.sxs, 'VC7') + + @property + def vs(self): + """ + Microsoft Visual Studio VS7 registry key. + """ + return os.path.join(self.sxs, 'VS7') + + @property + def vc_for_python(self): + """ + Microsoft Visual C++ for Python registry key. + """ + return r'DevDiv\VCForPython' + + @property + def microsoft_sdk(self): + """ + Microsoft SDK registry key. + """ + return 'Microsoft SDKs' + + @property + def windows_sdk(self): + """ + Microsoft Windows/Platform SDK registry key. + """ + return os.path.join(self.microsoft_sdk, 'Windows') + + @property + def netfx_sdk(self): + """ + Microsoft .NET Framework SDK registry key. + """ + return os.path.join(self.microsoft_sdk, 'NETFXSDK') + + @property + def windows_kits_roots(self): + """ + Microsoft Windows Kits Roots registry key. + """ + return r'Windows Kits\Installed Roots' + + def microsoft(self, key, x86=False): + """ + Return key in Microsoft software registry. + + Parameters + ---------- + key: str + Registry key path where look. + x86: str + Force x86 software registry. + + Return + ------ + str: value + """ + node64 = '' if self.pi.current_is_x86() or x86 else 'Wow6432Node' + return os.path.join('Software', node64, 'Microsoft', key) + + def lookup(self, key, name): + """ + Look for values in registry in Microsoft software registry. + + Parameters + ---------- + key: str + Registry key path where look. + name: str + Value name to find. + + Return + ------ + str: value + """ + KEY_READ = winreg.KEY_READ + openkey = winreg.OpenKey + ms = self.microsoft + for hkey in self.HKEYS: + try: + bkey = openkey(hkey, ms(key), 0, KEY_READ) + except (OSError, IOError): + if not self.pi.current_is_x86(): + try: + bkey = openkey(hkey, ms(key, True), 0, KEY_READ) + except (OSError, IOError): + continue + else: + continue + try: + return winreg.QueryValueEx(bkey, name)[0] + except (OSError, IOError): + pass + + +class SystemInfo: + """ + Microsoft Windows and Visual Studio related system inormations. + + Parameters + ---------- + registry_info: RegistryInfo + "RegistryInfo" instance. + vc_ver: float + Required Microsoft Visual C++ version. + """ + + # Variables and properties in this class use originals CamelCase variables + # names from Microsoft source files for more easy comparaison. + WinDir = safe_env.get('WinDir', '') + ProgramFiles = safe_env.get('ProgramFiles', '') + ProgramFilesx86 = safe_env.get('ProgramFiles(x86)', ProgramFiles) + + def __init__(self, registry_info, vc_ver=None): + self.ri = registry_info + self.pi = self.ri.pi + self.vc_ver = vc_ver or self._find_latest_available_vc_ver() + + def _find_latest_available_vc_ver(self): + try: + return self.find_available_vc_vers()[-1] + except IndexError: + err = 'No Microsoft Visual C++ version found' + raise distutils.errors.DistutilsPlatformError(err) + + def find_available_vc_vers(self): + """ + Find all available Microsoft Visual C++ versions. + """ + ms = self.ri.microsoft + vckeys = (self.ri.vc, self.ri.vc_for_python, self.ri.vs) + vc_vers = [] + for hkey in self.ri.HKEYS: + for key in vckeys: + try: + bkey = winreg.OpenKey(hkey, ms(key), 0, winreg.KEY_READ) + except (OSError, IOError): + continue + subkeys, values, _ = winreg.QueryInfoKey(bkey) + for i in range(values): + try: + ver = float(winreg.EnumValue(bkey, i)[0]) + if ver not in vc_vers: + vc_vers.append(ver) + except ValueError: + pass + for i in range(subkeys): + try: + ver = float(winreg.EnumKey(bkey, i)) + if ver not in vc_vers: + vc_vers.append(ver) + except ValueError: + pass + return sorted(vc_vers) + + @property + def VSInstallDir(self): + """ + Microsoft Visual Studio directory. + """ + # Default path + name = 'Microsoft Visual Studio %0.1f' % self.vc_ver + default = os.path.join(self.ProgramFilesx86, name) + + # Try to get path from registry, if fail use default path + return self.ri.lookup(self.ri.vs, '%0.1f' % self.vc_ver) or default + + @property + def VCInstallDir(self): + """ + Microsoft Visual C++ directory. + """ + self.VSInstallDir + + guess_vc = self._guess_vc() or self._guess_vc_legacy() + + # Try to get "VC++ for Python" path from registry as default path + reg_path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver) + python_vc = self.ri.lookup(reg_path, 'installdir') + default_vc = os.path.join(python_vc, 'VC') if python_vc else guess_vc + + # Try to get path from registry, if fail use default path + path = self.ri.lookup(self.ri.vc, '%0.1f' % self.vc_ver) or default_vc + + if not os.path.isdir(path): + msg = 'Microsoft Visual C++ directory not found' + raise distutils.errors.DistutilsPlatformError(msg) + + return path + + def _guess_vc(self): + """ + Locate Visual C for 2017 + """ + if self.vc_ver <= 14.0: + return + + default = r'VC\Tools\MSVC' + guess_vc = os.path.join(self.VSInstallDir, default) + # Subdir with VC exact version as name + try: + vc_exact_ver = os.listdir(guess_vc)[-1] + return os.path.join(guess_vc, vc_exact_ver) + except (OSError, IOError, IndexError): + pass + + def _guess_vc_legacy(self): + """ + Locate Visual C for versions prior to 2017 + """ + default = r'Microsoft Visual Studio %0.1f\VC' % self.vc_ver + return os.path.join(self.ProgramFilesx86, default) + + @property + def WindowsSdkVersion(self): + """ + Microsoft Windows SDK versions for specified MSVC++ version. + """ + if self.vc_ver <= 9.0: + return ('7.0', '6.1', '6.0a') + elif self.vc_ver == 10.0: + return ('7.1', '7.0a') + elif self.vc_ver == 11.0: + return ('8.0', '8.0a') + elif self.vc_ver == 12.0: + return ('8.1', '8.1a') + elif self.vc_ver >= 14.0: + return ('10.0', '8.1') + + @property + def WindowsSdkLastVersion(self): + """ + Microsoft Windows SDK last version + """ + return self._use_last_dir_name(os.path.join( + self.WindowsSdkDir, 'lib')) + + @property + def WindowsSdkDir(self): + """ + Microsoft Windows SDK directory. + """ + sdkdir = '' + for ver in self.WindowsSdkVersion: + # Try to get it from registry + loc = os.path.join(self.ri.windows_sdk, 'v%s' % ver) + sdkdir = self.ri.lookup(loc, 'installationfolder') + if sdkdir: + break + if not sdkdir or not os.path.isdir(sdkdir): + # Try to get "VC++ for Python" version from registry + path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver) + install_base = self.ri.lookup(path, 'installdir') + if install_base: + sdkdir = os.path.join(install_base, 'WinSDK') + if not sdkdir or not os.path.isdir(sdkdir): + # If fail, use default new path + for ver in self.WindowsSdkVersion: + intver = ver[:ver.rfind('.')] + path = r'Microsoft SDKs\Windows Kits\%s' % (intver) + d = os.path.join(self.ProgramFiles, path) + if os.path.isdir(d): + sdkdir = d + if not sdkdir or not os.path.isdir(sdkdir): + # If fail, use default old path + for ver in self.WindowsSdkVersion: + path = r'Microsoft SDKs\Windows\v%s' % ver + d = os.path.join(self.ProgramFiles, path) + if os.path.isdir(d): + sdkdir = d + if not sdkdir: + # If fail, use Platform SDK + sdkdir = os.path.join(self.VCInstallDir, 'PlatformSDK') + return sdkdir + + @property + def WindowsSDKExecutablePath(self): + """ + Microsoft Windows SDK executable directory. + """ + # Find WinSDK NetFx Tools registry dir name + if self.vc_ver <= 11.0: + netfxver = 35 + arch = '' + else: + netfxver = 40 + hidex86 = True if self.vc_ver <= 12.0 else False + arch = self.pi.current_dir(x64=True, hidex86=hidex86) + fx = 'WinSDK-NetFx%dTools%s' % (netfxver, arch.replace('\\', '-')) + + # liste all possibles registry paths + regpaths = [] + if self.vc_ver >= 14.0: + for ver in self.NetFxSdkVersion: + regpaths += [os.path.join(self.ri.netfx_sdk, ver, fx)] + + for ver in self.WindowsSdkVersion: + regpaths += [os.path.join(self.ri.windows_sdk, 'v%sA' % ver, fx)] + + # Return installation folder from the more recent path + for path in regpaths: + execpath = self.ri.lookup(path, 'installationfolder') + if execpath: + break + return execpath + + @property + def FSharpInstallDir(self): + """ + Microsoft Visual F# directory. + """ + path = r'%0.1f\Setup\F#' % self.vc_ver + path = os.path.join(self.ri.visualstudio, path) + return self.ri.lookup(path, 'productdir') or '' + + @property + def UniversalCRTSdkDir(self): + """ + Microsoft Universal CRT SDK directory. + """ + # Set Kit Roots versions for specified MSVC++ version + if self.vc_ver >= 14.0: + vers = ('10', '81') + else: + vers = () + + # Find path of the more recent Kit + for ver in vers: + sdkdir = self.ri.lookup(self.ri.windows_kits_roots, + 'kitsroot%s' % ver) + if sdkdir: + break + return sdkdir or '' + + @property + def UniversalCRTSdkLastVersion(self): + """ + Microsoft Universal C Runtime SDK last version + """ + return self._use_last_dir_name(os.path.join( + self.UniversalCRTSdkDir, 'lib')) + + @property + def NetFxSdkVersion(self): + """ + Microsoft .NET Framework SDK versions. + """ + # Set FxSdk versions for specified MSVC++ version + if self.vc_ver >= 14.0: + return ('4.6.1', '4.6') + else: + return () + + @property + def NetFxSdkDir(self): + """ + Microsoft .NET Framework SDK directory. + """ + for ver in self.NetFxSdkVersion: + loc = os.path.join(self.ri.netfx_sdk, ver) + sdkdir = self.ri.lookup(loc, 'kitsinstallationfolder') + if sdkdir: + break + return sdkdir or '' + + @property + def FrameworkDir32(self): + """ + Microsoft .NET Framework 32bit directory. + """ + # Default path + guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework') + + # Try to get path from registry, if fail use default path + return self.ri.lookup(self.ri.vc, 'frameworkdir32') or guess_fw + + @property + def FrameworkDir64(self): + """ + Microsoft .NET Framework 64bit directory. + """ + # Default path + guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework64') + + # Try to get path from registry, if fail use default path + return self.ri.lookup(self.ri.vc, 'frameworkdir64') or guess_fw + + @property + def FrameworkVersion32(self): + """ + Microsoft .NET Framework 32bit versions. + """ + return self._find_dot_net_versions(32) + + @property + def FrameworkVersion64(self): + """ + Microsoft .NET Framework 64bit versions. + """ + return self._find_dot_net_versions(64) + + def _find_dot_net_versions(self, bits): + """ + Find Microsoft .NET Framework versions. + + Parameters + ---------- + bits: int + Platform number of bits: 32 or 64. + """ + # Find actual .NET version in registry + reg_ver = self.ri.lookup(self.ri.vc, 'frameworkver%d' % bits) + dot_net_dir = getattr(self, 'FrameworkDir%d' % bits) + ver = reg_ver or self._use_last_dir_name(dot_net_dir, 'v') or '' + + # Set .NET versions for specified MSVC++ version + if self.vc_ver >= 12.0: + frameworkver = (ver, 'v4.0') + elif self.vc_ver >= 10.0: + frameworkver = ('v4.0.30319' if ver.lower()[:2] != 'v4' else ver, + 'v3.5') + elif self.vc_ver == 9.0: + frameworkver = ('v3.5', 'v2.0.50727') + if self.vc_ver == 8.0: + frameworkver = ('v3.0', 'v2.0.50727') + return frameworkver + + def _use_last_dir_name(self, path, prefix=''): + """ + Return name of the last dir in path or '' if no dir found. + + Parameters + ---------- + path: str + Use dirs in this path + prefix: str + Use only dirs startings by this prefix + """ + matching_dirs = ( + dir_name + for dir_name in reversed(os.listdir(path)) + if os.path.isdir(os.path.join(path, dir_name)) and + dir_name.startswith(prefix) + ) + return next(matching_dirs, None) or '' + + +class EnvironmentInfo: + """ + Return environment variables for specified Microsoft Visual C++ version + and platform : Lib, Include, Path and libpath. + + This function is compatible with Microsoft Visual C++ 9.0 to 14.0. + + Script created by analysing Microsoft environment configuration files like + "vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ... + + Parameters + ---------- + arch: str + Target architecture. + vc_ver: float + Required Microsoft Visual C++ version. If not set, autodetect the last + version. + vc_min_ver: float + Minimum Microsoft Visual C++ version. + """ + + # Variables and properties in this class use originals CamelCase variables + # names from Microsoft source files for more easy comparaison. + + def __init__(self, arch, vc_ver=None, vc_min_ver=0): + self.pi = PlatformInfo(arch) + self.ri = RegistryInfo(self.pi) + self.si = SystemInfo(self.ri, vc_ver) + + if self.vc_ver < vc_min_ver: + err = 'No suitable Microsoft Visual C++ version found' + raise distutils.errors.DistutilsPlatformError(err) + + @property + def vc_ver(self): + """ + Microsoft Visual C++ version. + """ + return self.si.vc_ver + + @property + def VSTools(self): + """ + Microsoft Visual Studio Tools + """ + paths = [r'Common7\IDE', r'Common7\Tools'] + + if self.vc_ver >= 14.0: + arch_subdir = self.pi.current_dir(hidex86=True, x64=True) + paths += [r'Common7\IDE\CommonExtensions\Microsoft\TestWindow'] + paths += [r'Team Tools\Performance Tools'] + paths += [r'Team Tools\Performance Tools%s' % arch_subdir] + + return [os.path.join(self.si.VSInstallDir, path) for path in paths] + + @property + def VCIncludes(self): + """ + Microsoft Visual C++ & Microsoft Foundation Class Includes + """ + return [os.path.join(self.si.VCInstallDir, 'Include'), + os.path.join(self.si.VCInstallDir, r'ATLMFC\Include')] + + @property + def VCLibraries(self): + """ + Microsoft Visual C++ & Microsoft Foundation Class Libraries + """ + if self.vc_ver >= 15.0: + arch_subdir = self.pi.target_dir(x64=True) + else: + arch_subdir = self.pi.target_dir(hidex86=True) + paths = ['Lib%s' % arch_subdir, r'ATLMFC\Lib%s' % arch_subdir] + + if self.vc_ver >= 14.0: + paths += [r'Lib\store%s' % arch_subdir] + + return [os.path.join(self.si.VCInstallDir, path) for path in paths] + + @property + def VCStoreRefs(self): + """ + Microsoft Visual C++ store references Libraries + """ + if self.vc_ver < 14.0: + return [] + return [os.path.join(self.si.VCInstallDir, r'Lib\store\references')] + + @property + def VCTools(self): + """ + Microsoft Visual C++ Tools + """ + si = self.si + tools = [os.path.join(si.VCInstallDir, 'VCPackages')] + + forcex86 = True if self.vc_ver <= 10.0 else False + arch_subdir = self.pi.cross_dir(forcex86) + if arch_subdir: + tools += [os.path.join(si.VCInstallDir, 'Bin%s' % arch_subdir)] + + if self.vc_ver == 14.0: + path = 'Bin%s' % self.pi.current_dir(hidex86=True) + tools += [os.path.join(si.VCInstallDir, path)] + + elif self.vc_ver >= 15.0: + host_dir = (r'bin\HostX86%s' if self.pi.current_is_x86() else + r'bin\HostX64%s') + tools += [os.path.join( + si.VCInstallDir, host_dir % self.pi.target_dir(x64=True))] + + if self.pi.current_cpu != self.pi.target_cpu: + tools += [os.path.join( + si.VCInstallDir, host_dir % self.pi.current_dir(x64=True))] + + else: + tools += [os.path.join(si.VCInstallDir, 'Bin')] + + return tools + + @property + def OSLibraries(self): + """ + Microsoft Windows SDK Libraries + """ + if self.vc_ver <= 10.0: + arch_subdir = self.pi.target_dir(hidex86=True, x64=True) + return [os.path.join(self.si.WindowsSdkDir, 'Lib%s' % arch_subdir)] + + else: + arch_subdir = self.pi.target_dir(x64=True) + lib = os.path.join(self.si.WindowsSdkDir, 'lib') + libver = self._sdk_subdir + return [os.path.join(lib, '%sum%s' % (libver , arch_subdir))] + + @property + def OSIncludes(self): + """ + Microsoft Windows SDK Include + """ + include = os.path.join(self.si.WindowsSdkDir, 'include') + + if self.vc_ver <= 10.0: + return [include, os.path.join(include, 'gl')] + + else: + if self.vc_ver >= 14.0: + sdkver = self._sdk_subdir + else: + sdkver = '' + return [os.path.join(include, '%sshared' % sdkver), + os.path.join(include, '%sum' % sdkver), + os.path.join(include, '%swinrt' % sdkver)] + + @property + def OSLibpath(self): + """ + Microsoft Windows SDK Libraries Paths + """ + ref = os.path.join(self.si.WindowsSdkDir, 'References') + libpath = [] + + if self.vc_ver <= 9.0: + libpath += self.OSLibraries + + if self.vc_ver >= 11.0: + libpath += [os.path.join(ref, r'CommonConfiguration\Neutral')] + + if self.vc_ver >= 14.0: + libpath += [ + ref, + os.path.join(self.si.WindowsSdkDir, 'UnionMetadata'), + os.path.join( + ref, + 'Windows.Foundation.UniversalApiContract', + '1.0.0.0', + ), + os.path.join( + ref, + 'Windows.Foundation.FoundationContract', + '1.0.0.0', + ), + os.path.join( + ref, + 'Windows.Networking.Connectivity.WwanContract', + '1.0.0.0', + ), + os.path.join( + self.si.WindowsSdkDir, + 'ExtensionSDKs', + 'Microsoft.VCLibs', + '%0.1f' % self.vc_ver, + 'References', + 'CommonConfiguration', + 'neutral', + ), + ] + return libpath + + @property + def SdkTools(self): + """ + Microsoft Windows SDK Tools + """ + return list(self._sdk_tools()) + + def _sdk_tools(self): + """ + Microsoft Windows SDK Tools paths generator + """ + if self.vc_ver < 15.0: + bin_dir = 'Bin' if self.vc_ver <= 11.0 else r'Bin\x86' + yield os.path.join(self.si.WindowsSdkDir, bin_dir) + + if not self.pi.current_is_x86(): + arch_subdir = self.pi.current_dir(x64=True) + path = 'Bin%s' % arch_subdir + yield os.path.join(self.si.WindowsSdkDir, path) + + if self.vc_ver == 10.0 or self.vc_ver == 11.0: + if self.pi.target_is_x86(): + arch_subdir = '' + else: + arch_subdir = self.pi.current_dir(hidex86=True, x64=True) + path = r'Bin\NETFX 4.0 Tools%s' % arch_subdir + yield os.path.join(self.si.WindowsSdkDir, path) + + elif self.vc_ver >= 15.0: + path = os.path.join(self.si.WindowsSdkDir, 'Bin') + arch_subdir = self.pi.current_dir(x64=True) + sdkver = self.si.WindowsSdkLastVersion + yield os.path.join(path, '%s%s' % (sdkver, arch_subdir)) + + if self.si.WindowsSDKExecutablePath: + yield self.si.WindowsSDKExecutablePath + + @property + def _sdk_subdir(self): + """ + Microsoft Windows SDK version subdir + """ + ucrtver = self.si.WindowsSdkLastVersion + return ('%s\\' % ucrtver) if ucrtver else '' + + @property + def SdkSetup(self): + """ + Microsoft Windows SDK Setup + """ + if self.vc_ver > 9.0: + return [] + + return [os.path.join(self.si.WindowsSdkDir, 'Setup')] + + @property + def FxTools(self): + """ + Microsoft .NET Framework Tools + """ + pi = self.pi + si = self.si + + if self.vc_ver <= 10.0: + include32 = True + include64 = not pi.target_is_x86() and not pi.current_is_x86() + else: + include32 = pi.target_is_x86() or pi.current_is_x86() + include64 = pi.current_cpu == 'amd64' or pi.target_cpu == 'amd64' + + tools = [] + if include32: + tools += [os.path.join(si.FrameworkDir32, ver) + for ver in si.FrameworkVersion32] + if include64: + tools += [os.path.join(si.FrameworkDir64, ver) + for ver in si.FrameworkVersion64] + return tools + + @property + def NetFxSDKLibraries(self): + """ + Microsoft .Net Framework SDK Libraries + """ + if self.vc_ver < 14.0 or not self.si.NetFxSdkDir: + return [] + + arch_subdir = self.pi.target_dir(x64=True) + return [os.path.join(self.si.NetFxSdkDir, r'lib\um%s' % arch_subdir)] + + @property + def NetFxSDKIncludes(self): + """ + Microsoft .Net Framework SDK Includes + """ + if self.vc_ver < 14.0 or not self.si.NetFxSdkDir: + return [] + + return [os.path.join(self.si.NetFxSdkDir, r'include\um')] + + @property + def VsTDb(self): + """ + Microsoft Visual Studio Team System Database + """ + return [os.path.join(self.si.VSInstallDir, r'VSTSDB\Deploy')] + + @property + def MSBuild(self): + """ + Microsoft Build Engine + """ + if self.vc_ver < 12.0: + return [] + elif self.vc_ver < 15.0: + base_path = self.si.ProgramFilesx86 + arch_subdir = self.pi.current_dir(hidex86=True) + else: + base_path = self.si.VSInstallDir + arch_subdir = '' + + path = r'MSBuild\%0.1f\bin%s' % (self.vc_ver, arch_subdir) + build = [os.path.join(base_path, path)] + + if self.vc_ver >= 15.0: + # Add Roslyn C# & Visual Basic Compiler + build += [os.path.join(base_path, path, 'Roslyn')] + + return build + + @property + def HTMLHelpWorkshop(self): + """ + Microsoft HTML Help Workshop + """ + if self.vc_ver < 11.0: + return [] + + return [os.path.join(self.si.ProgramFilesx86, 'HTML Help Workshop')] + + @property + def UCRTLibraries(self): + """ + Microsoft Universal C Runtime SDK Libraries + """ + if self.vc_ver < 14.0: + return [] + + arch_subdir = self.pi.target_dir(x64=True) + lib = os.path.join(self.si.UniversalCRTSdkDir, 'lib') + ucrtver = self._ucrt_subdir + return [os.path.join(lib, '%sucrt%s' % (ucrtver, arch_subdir))] + + @property + def UCRTIncludes(self): + """ + Microsoft Universal C Runtime SDK Include + """ + if self.vc_ver < 14.0: + return [] + + include = os.path.join(self.si.UniversalCRTSdkDir, 'include') + return [os.path.join(include, '%sucrt' % self._ucrt_subdir)] + + @property + def _ucrt_subdir(self): + """ + Microsoft Universal C Runtime SDK version subdir + """ + ucrtver = self.si.UniversalCRTSdkLastVersion + return ('%s\\' % ucrtver) if ucrtver else '' + + @property + def FSharp(self): + """ + Microsoft Visual F# + """ + if self.vc_ver < 11.0 and self.vc_ver > 12.0: + return [] + + return self.si.FSharpInstallDir + + @property + def VCRuntimeRedist(self): + """ + Microsoft Visual C++ runtime redistribuable dll + """ + arch_subdir = self.pi.target_dir(x64=True) + if self.vc_ver < 15: + redist_path = self.si.VCInstallDir + vcruntime = 'redist%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll' + else: + redist_path = self.si.VCInstallDir.replace('\\Tools', '\\Redist') + vcruntime = 'onecore%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll' + + # Visual Studio 2017 is still Visual C++ 14.0 + dll_ver = 14.0 if self.vc_ver == 15 else self.vc_ver + + vcruntime = vcruntime % (arch_subdir, self.vc_ver, dll_ver) + return os.path.join(redist_path, vcruntime) + + def return_env(self, exists=True): + """ + Return environment dict. + + Parameters + ---------- + exists: bool + It True, only return existing paths. + """ + env = dict( + include=self._build_paths('include', + [self.VCIncludes, + self.OSIncludes, + self.UCRTIncludes, + self.NetFxSDKIncludes], + exists), + lib=self._build_paths('lib', + [self.VCLibraries, + self.OSLibraries, + self.FxTools, + self.UCRTLibraries, + self.NetFxSDKLibraries], + exists), + libpath=self._build_paths('libpath', + [self.VCLibraries, + self.FxTools, + self.VCStoreRefs, + self.OSLibpath], + exists), + path=self._build_paths('path', + [self.VCTools, + self.VSTools, + self.VsTDb, + self.SdkTools, + self.SdkSetup, + self.FxTools, + self.MSBuild, + self.HTMLHelpWorkshop, + self.FSharp], + exists), + ) + if self.vc_ver >= 14 and os.path.isfile(self.VCRuntimeRedist): + env['py_vcruntime_redist'] = self.VCRuntimeRedist + return env + + def _build_paths(self, name, spec_path_lists, exists): + """ + Given an environment variable name and specified paths, + return a pathsep-separated string of paths containing + unique, extant, directories from those paths and from + the environment variable. Raise an error if no paths + are resolved. + """ + # flatten spec_path_lists + spec_paths = itertools.chain.from_iterable(spec_path_lists) + env_paths = safe_env.get(name, '').split(os.pathsep) + paths = itertools.chain(spec_paths, env_paths) + extant_paths = list(filter(os.path.isdir, paths)) if exists else paths + if not extant_paths: + msg = "%s environment variable is empty" % name.upper() + raise distutils.errors.DistutilsPlatformError(msg) + unique_paths = self._unique_everseen(extant_paths) + return os.pathsep.join(unique_paths) + + # from Python docs + def _unique_everseen(self, iterable, key=None): + """ + List unique elements, preserving order. + Remember all elements ever seen. + + _unique_everseen('AAAABBBCCDAABBB') --> A B C D + + _unique_everseen('ABBCcAD', str.lower) --> A B C D + """ + seen = set() + seen_add = seen.add + if key is None: + for element in filterfalse(seen.__contains__, iterable): + seen_add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen_add(k) + yield element diff --git a/lib/python3.4/site-packages/setuptools/msvc9_support.py b/lib/python3.4/site-packages/setuptools/msvc9_support.py deleted file mode 100644 index a69c747..0000000 --- a/lib/python3.4/site-packages/setuptools/msvc9_support.py +++ /dev/null @@ -1,63 +0,0 @@ -try: - import distutils.msvc9compiler -except ImportError: - pass - -unpatched = dict() - -def patch_for_specialized_compiler(): - """ - Patch functions in distutils.msvc9compiler to use the standalone compiler - build for Python (Windows only). Fall back to original behavior when the - standalone compiler is not available. - """ - if 'distutils' not in globals(): - # The module isn't available to be patched - return - - if unpatched: - # Already patched - return - - unpatched.update(vars(distutils.msvc9compiler)) - - distutils.msvc9compiler.find_vcvarsall = find_vcvarsall - distutils.msvc9compiler.query_vcvarsall = query_vcvarsall - -def find_vcvarsall(version): - Reg = distutils.msvc9compiler.Reg - VC_BASE = r'Software\%sMicrosoft\DevDiv\VCForPython\%0.1f' - key = VC_BASE % ('', version) - try: - # Per-user installs register the compiler path here - productdir = Reg.get_value(key, "installdir") - except KeyError: - try: - # All-user installs on a 64-bit system register here - key = VC_BASE % ('Wow6432Node\\', version) - productdir = Reg.get_value(key, "installdir") - except KeyError: - productdir = None - - if productdir: - import os - vcvarsall = os.path.join(productdir, "vcvarsall.bat") - if os.path.isfile(vcvarsall): - return vcvarsall - - return unpatched['find_vcvarsall'](version) - -def query_vcvarsall(version, *args, **kwargs): - try: - return unpatched['query_vcvarsall'](version, *args, **kwargs) - except distutils.errors.DistutilsPlatformError as exc: - if exc and "vcvarsall.bat" in exc.args[0]: - message = 'Microsoft Visual C++ %0.1f is required (%s).' % (version, exc.args[0]) - if int(version) == 9: - # This redirection link is maintained by Microsoft. - # Contact vspython@microsoft.com if it needs updating. - raise distutils.errors.DistutilsPlatformError( - message + ' Get it from http://aka.ms/vcpython27' - ) - raise distutils.errors.DistutilsPlatformError(message) - raise diff --git a/lib/python3.4/site-packages/setuptools/namespaces.py b/lib/python3.4/site-packages/setuptools/namespaces.py new file mode 100644 index 0000000..dc16106 --- /dev/null +++ b/lib/python3.4/site-packages/setuptools/namespaces.py @@ -0,0 +1,107 @@ +import os +from distutils import log +import itertools + +from setuptools.extern.six.moves import map + + +flatten = itertools.chain.from_iterable + + +class Installer: + + nspkg_ext = '-nspkg.pth' + + def install_namespaces(self): + nsp = self._get_all_ns_packages() + if not nsp: + return + filename, ext = os.path.splitext(self._get_target()) + filename += self.nspkg_ext + self.outputs.append(filename) + log.info("Installing %s", filename) + lines = map(self._gen_nspkg_line, nsp) + + if self.dry_run: + # always generate the lines, even in dry run + list(lines) + return + + with open(filename, 'wt') as f: + f.writelines(lines) + + def uninstall_namespaces(self): + filename, ext = os.path.splitext(self._get_target()) + filename += self.nspkg_ext + if not os.path.exists(filename): + return + log.info("Removing %s", filename) + os.remove(filename) + + def _get_target(self): + return self.target + + _nspkg_tmpl = ( + "import sys, types, os", + "has_mfs = sys.version_info > (3, 5)", + "p = os.path.join(%(root)s, *%(pth)r)", + "importlib = has_mfs and __import__('importlib.util')", + "has_mfs and __import__('importlib.machinery')", + "m = has_mfs and " + "sys.modules.setdefault(%(pkg)r, " + "importlib.util.module_from_spec(" + "importlib.machinery.PathFinder.find_spec(%(pkg)r, " + "[os.path.dirname(p)])))", + "m = m or " + "sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))", + "mp = (m or []) and m.__dict__.setdefault('__path__',[])", + "(p not in mp) and mp.append(p)", + ) + "lines for the namespace installer" + + _nspkg_tmpl_multi = ( + 'm and setattr(sys.modules[%(parent)r], %(child)r, m)', + ) + "additional line(s) when a parent package is indicated" + + def _get_root(self): + return "sys._getframe(1).f_locals['sitedir']" + + def _gen_nspkg_line(self, pkg): + # ensure pkg is not a unicode string under Python 2.7 + pkg = str(pkg) + pth = tuple(pkg.split('.')) + root = self._get_root() + tmpl_lines = self._nspkg_tmpl + parent, sep, child = pkg.rpartition('.') + if parent: + tmpl_lines += self._nspkg_tmpl_multi + return ';'.join(tmpl_lines) % locals() + '\n' + + def _get_all_ns_packages(self): + """Return sorted list of all package namespaces""" + pkgs = self.distribution.namespace_packages or [] + return sorted(flatten(map(self._pkg_names, pkgs))) + + @staticmethod + def _pkg_names(pkg): + """ + Given a namespace package, yield the components of that + package. + + >>> names = Installer._pkg_names('a.b.c') + >>> set(names) == set(['a', 'a.b', 'a.b.c']) + True + """ + parts = pkg.split('.') + while parts: + yield '.'.join(parts) + parts.pop() + + +class DevelopInstaller(Installer): + def _get_root(self): + return repr(str(self.egg_path)) + + def _get_target(self): + return self.egg_link diff --git a/lib/python3.4/site-packages/setuptools/package_index.py b/lib/python3.4/site-packages/setuptools/package_index.py index c53343e..a6363b1 100644 --- a/lib/python3.4/site-packages/setuptools/package_index.py +++ b/lib/python3.4/site-packages/setuptools/package_index.py @@ -17,9 +17,10 @@ except ImportError: from setuptools.extern import six from setuptools.extern.six.moves import urllib, http_client, configparser, map +import setuptools from pkg_resources import ( CHECKOUT_DIST, Distribution, BINARY_DIST, normalize_path, SOURCE_DIST, - require, Environment, find_distributions, safe_name, safe_version, + Environment, find_distributions, safe_name, safe_version, to_filename, Requirement, DEVELOP_DIST, ) from setuptools import ssl_support @@ -29,14 +30,14 @@ from fnmatch import translate from setuptools.py26compat import strip_fragment from setuptools.py27compat import get_all_headers -EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.]+)$') +EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.+!]+)$') HREF = re.compile("""href\\s*=\\s*['"]?([^'"> ]+)""", re.I) # this is here to fix emacs' cruddy broken syntax highlighting PYPI_MD5 = re.compile( - '([^<]+)\n\s+\\(md5\\)' + '([^<]+)\n\\s+\\(md5\\)' ) -URL_SCHEME = re.compile('([-+.a-z0-9]{2,}):',re.I).match +URL_SCHEME = re.compile('([-+.a-z0-9]{2,}):', re.I).match EXTENSIONS = ".tar.gz .tar.bz2 .tar .zip .tgz".split() __all__ = [ @@ -46,6 +47,19 @@ __all__ = [ _SOCKET_TIMEOUT = 15 +_tmpl = "setuptools/{setuptools.__version__} Python-urllib/{py_major}" +user_agent = _tmpl.format(py_major=sys.version[:3], setuptools=setuptools) + + +def parse_requirement_arg(spec): + try: + return Requirement.parse(spec) + except ValueError: + raise DistutilsError( + "Not a URL, existing file, or requirement spec: %r" % (spec,) + ) + + def parse_bdist_wininst(name): """Return (base,pyversion) or (None,None) for possible .exe name""" @@ -56,45 +70,49 @@ def parse_bdist_wininst(name): if lower.endswith('.win32.exe'): base = name[:-10] plat = 'win32' - elif lower.startswith('.win32-py',-16): + elif lower.startswith('.win32-py', -16): py_ver = name[-7:-4] base = name[:-16] plat = 'win32' elif lower.endswith('.win-amd64.exe'): base = name[:-14] plat = 'win-amd64' - elif lower.startswith('.win-amd64-py',-20): + elif lower.startswith('.win-amd64-py', -20): py_ver = name[-7:-4] base = name[:-20] plat = 'win-amd64' - return base,py_ver,plat + return base, py_ver, plat def egg_info_for_url(url): parts = urllib.parse.urlparse(url) scheme, server, path, parameters, query, fragment = parts base = urllib.parse.unquote(path.split('/')[-1]) - if server=='sourceforge.net' and base=='download': # XXX Yuck + if server == 'sourceforge.net' and base == 'download': # XXX Yuck base = urllib.parse.unquote(path.split('/')[-2]) - if '#' in base: base, fragment = base.split('#',1) - return base,fragment + if '#' in base: + base, fragment = base.split('#', 1) + return base, fragment + def distros_for_url(url, metadata=None): """Yield egg or source distribution objects that might be found at a URL""" base, fragment = egg_info_for_url(url) - for dist in distros_for_location(url, base, metadata): yield dist + for dist in distros_for_location(url, base, metadata): + yield dist if fragment: match = EGG_FRAGMENT.match(fragment) if match: for dist in interpret_distro_name( - url, match.group(1), metadata, precedence = CHECKOUT_DIST + url, match.group(1), metadata, precedence=CHECKOUT_DIST ): yield dist + def distros_for_location(location, basename, metadata=None): """Yield egg or source distribution objects based on basename""" if basename.endswith('.egg.zip'): - basename = basename[:-4] # strip the .zip + basename = basename[:-4] # strip the .zip if basename.endswith('.egg') and '-' in basename: # only one, unambiguous interpretation return [Distribution.from_location(location, basename, metadata)] @@ -112,6 +130,7 @@ def distros_for_location(location, basename, metadata=None): return interpret_distro_name(location, basename, metadata) return [] # no extension matched + def distros_for_filename(filename, metadata=None): """Yield possible egg or source distribution objects based on a filename""" return distros_for_location( @@ -142,17 +161,18 @@ def interpret_distro_name( # versions in distribution archive names (sdist and bdist). parts = basename.split('-') - if not py_version and any(re.match('py\d\.\d$', p) for p in parts[2:]): + if not py_version and any(re.match(r'py\d\.\d$', p) for p in parts[2:]): # it is a bdist_dumb, not an sdist -- bail out return - for p in range(1,len(parts)+1): + for p in range(1, len(parts) + 1): yield Distribution( location, metadata, '-'.join(parts[:p]), '-'.join(parts[p:]), - py_version=py_version, precedence = precedence, - platform = platform + py_version=py_version, precedence=precedence, + platform=platform ) + # From Python 2.7 docs def unique_everseen(iterable, key=None): "List unique elements, preserving order. Remember all elements ever seen." @@ -171,19 +191,24 @@ def unique_everseen(iterable, key=None): seen_add(k) yield element + def unique_values(func): """ Wrap a function returning an iterable such that the resulting iterable only ever yields unique items. """ + @wraps(func) def wrapper(*args, **kwargs): return unique_everseen(func(*args, **kwargs)) + return wrapper -REL = re.compile("""<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>""", re.I) + +REL = re.compile(r"""<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>""", re.I) # this line is here to fix emacs' cruddy broken syntax highlighting + @unique_values def find_external_links(url, page): """Find rel="homepage" and rel="download" links in `page`, yielding URLs""" @@ -197,19 +222,17 @@ def find_external_links(url, page): for tag in ("Home Page", "Download URL"): pos = page.find(tag) - if pos!=-1: - match = HREF.search(page,pos) + if pos != -1: + match = HREF.search(page, pos) if match: yield urllib.parse.urljoin(url, htmldecode(match.group(1))) -user_agent = "Python-urllib/%s setuptools/%s" % ( - sys.version[:3], require('setuptools')[0].version -) class ContentChecker(object): """ A null content checker that defines the interface for checking content """ + def feed(self, block): """ Feed a block of data to the hash. @@ -229,6 +252,7 @@ class ContentChecker(object): """ return + class HashChecker(ContentChecker): pattern = re.compile( r'(?Psha1|sha224|sha384|sha256|sha512|md5)=' @@ -269,16 +293,22 @@ class PackageIndex(Environment): self, index_url="https://pypi.python.org/simple", hosts=('*',), ca_bundle=None, verify_ssl=True, *args, **kw ): - Environment.__init__(self,*args,**kw) - self.index_url = index_url + "/"[:not index_url.endswith('/')] + Environment.__init__(self, *args, **kw) + self.index_url = index_url + "/" [:not index_url.endswith('/')] self.scanned_urls = {} self.fetched_urls = {} self.package_pages = {} - self.allows = re.compile('|'.join(map(translate,hosts))).match + self.allows = re.compile('|'.join(map(translate, hosts))).match self.to_scan = [] - if verify_ssl and ssl_support.is_available and (ca_bundle or ssl_support.find_ca_bundle()): + use_ssl = ( + verify_ssl + and ssl_support.is_available + and (ca_bundle or ssl_support.find_ca_bundle()) + ) + if use_ssl: self.opener = ssl_support.opener_for(ca_bundle) - else: self.opener = urllib.request.urlopen + else: + self.opener = urllib.request.urlopen def process_url(self, url, retrieve=False): """Evaluate a URL as a possible download, and maybe retrieve it""" @@ -304,17 +334,19 @@ class PackageIndex(Environment): return self.info("Reading %s", url) - self.fetched_urls[url] = True # prevent multiple fetch attempts - f = self.open_url(url, "Download error on %s: %%s -- Some packages may not be found!" % url) - if f is None: return + self.fetched_urls[url] = True # prevent multiple fetch attempts + tmpl = "Download error on %s: %%s -- Some packages may not be found!" + f = self.open_url(url, tmpl % url) + if f is None: + return self.fetched_urls[f.url] = True if 'html' not in f.headers.get('content-type', '').lower(): - f.close() # not html, we can't process it + f.close() # not html, we can't process it return - base = f.url # handle redirects + base = f.url # handle redirects page = f.read() - if not isinstance(page, str): # We are in Python 3 and got bytes. We want str. + if not isinstance(page, str): # We are in Python 3 and got bytes. We want str. if isinstance(f, urllib.error.HTTPError): # Errors have no charset, assume latin1: charset = 'latin-1' @@ -325,7 +357,7 @@ class PackageIndex(Environment): for match in HREF.finditer(page): link = urllib.parse.urljoin(base, htmldecode(match.group(1))) self.process_url(link) - if url.startswith(self.index_url) and getattr(f,'code',None)!=404: + if url.startswith(self.index_url) and getattr(f, 'code', None) != 404: page = self.process_index(url, page) def process_filename(self, fn, nested=False): @@ -337,7 +369,7 @@ class PackageIndex(Environment): if os.path.isdir(fn) and not nested: path = os.path.realpath(fn) for item in os.listdir(path): - self.process_filename(os.path.join(path,item), True) + self.process_filename(os.path.join(path, item), True) dists = distros_for_filename(fn) if dists: @@ -346,7 +378,8 @@ class PackageIndex(Environment): def url_ok(self, url, fatal=False): s = URL_SCHEME(url) - if (s and s.group(1).lower()=='file') or self.allows(urllib.parse.urlparse(url)[1]): + is_file = s and s.group(1).lower() == 'file' + if is_file or self.allows(urllib.parse.urlparse(url)[1]): return True msg = ("\nNote: Bypassing %s (disallowed host; see " "http://bit.ly/1dg9ijs for details).\n") @@ -381,19 +414,20 @@ class PackageIndex(Environment): dist.precedence = SOURCE_DIST self.add(dist) - def process_index(self,url,page): + def process_index(self, url, page): """Process the contents of a PyPI page""" + def scan(link): # Process a URL to see if it's for a package page if link.startswith(self.index_url): parts = list(map( urllib.parse.unquote, link[len(self.index_url):].split('/') )) - if len(parts)==2 and '#' not in parts[1]: + if len(parts) == 2 and '#' not in parts[1]: # it's a package page, sanitize and index it pkg = safe_name(parts[0]) ver = safe_version(parts[1]) - self.package_pages.setdefault(pkg.lower(),{})[link] = True + self.package_pages.setdefault(pkg.lower(), {})[link] = True return to_filename(pkg), to_filename(ver) return None, None @@ -404,7 +438,7 @@ class PackageIndex(Environment): except ValueError: pass - pkg, ver = scan(url) # ensure this page is in the page index + pkg, ver = scan(url) # ensure this page is in the page index if pkg: # process individual package page for new_url in find_external_links(url, page): @@ -412,16 +446,16 @@ class PackageIndex(Environment): base, frag = egg_info_for_url(new_url) if base.endswith('.py') and not frag: if ver: - new_url+='#egg=%s-%s' % (pkg,ver) + new_url += '#egg=%s-%s' % (pkg, ver) else: self.need_version_info(url) self.scan_url(new_url) return PYPI_MD5.sub( - lambda m: '%s' % m.group(1,3,2), page + lambda m: '%s' % m.group(1, 3, 2), page ) else: - return "" # no sense double-scanning non-package pages + return "" # no sense double-scanning non-package pages def need_version_info(self, url): self.scan_all( @@ -431,24 +465,25 @@ class PackageIndex(Environment): def scan_all(self, msg=None, *args): if self.index_url not in self.fetched_urls: - if msg: self.warn(msg,*args) + if msg: + self.warn(msg, *args) self.info( "Scanning index of all packages (this may take a while)" ) self.scan_url(self.index_url) def find_packages(self, requirement): - self.scan_url(self.index_url + requirement.unsafe_name+'/') + self.scan_url(self.index_url + requirement.unsafe_name + '/') if not self.package_pages.get(requirement.key): # Fall back to safe version of the name - self.scan_url(self.index_url + requirement.project_name+'/') + self.scan_url(self.index_url + requirement.project_name + '/') if not self.package_pages.get(requirement.key): # We couldn't find the target package, so search the index page too self.not_found_in_index(requirement) - for url in list(self.package_pages.get(requirement.key,())): + for url in list(self.package_pages.get(requirement.key, ())): # scan each page that might be related to the desired package self.scan_url(url) @@ -459,7 +494,7 @@ class PackageIndex(Environment): if dist in requirement: return dist self.debug("%s does not match %s", requirement, dist) - return super(PackageIndex, self).obtain(requirement,installer) + return super(PackageIndex, self).obtain(requirement, installer) def check_hash(self, checker, filename, tfp): """ @@ -480,10 +515,10 @@ class PackageIndex(Environment): """Add `urls` to the list that will be prescanned for searches""" for url in urls: if ( - self.to_scan is None # if we have already "gone online" - or not URL_SCHEME(url) # or it's a local file/directory + self.to_scan is None # if we have already "gone online" + or not URL_SCHEME(url) # or it's a local file/directory or url.startswith('file:') - or list(distros_for_url(url)) # or a direct package link + or list(distros_for_url(url)) # or a direct package link ): # then go ahead and process it now self.scan_url(url) @@ -495,12 +530,12 @@ class PackageIndex(Environment): """Scan urls scheduled for prescanning (e.g. --find-links)""" if self.to_scan: list(map(self.scan_url, self.to_scan)) - self.to_scan = None # from now on, go ahead and process immediately + self.to_scan = None # from now on, go ahead and process immediately def not_found_in_index(self, requirement): - if self[requirement.key]: # we've seen at least one distro + if self[requirement.key]: # we've seen at least one distro meth, msg = self.info, "Couldn't retrieve index page for %r" - else: # no distros seen for this name, might be misspelled + else: # no distros seen for this name, might be misspelled meth, msg = (self.warn, "Couldn't find index page for %r (maybe misspelled?)") meth(msg, requirement.unsafe_name) @@ -524,27 +559,21 @@ class PackageIndex(Environment): of `tmpdir`, and the local filename is returned. Various errors may be raised if a problem occurs during downloading. """ - if not isinstance(spec,Requirement): + if not isinstance(spec, Requirement): scheme = URL_SCHEME(spec) if scheme: # It's a url, download it to tmpdir found = self._download_url(scheme.group(1), spec, tmpdir) base, fragment = egg_info_for_url(spec) if base.endswith('.py'): - found = self.gen_setup(found,fragment,tmpdir) + found = self.gen_setup(found, fragment, tmpdir) return found elif os.path.exists(spec): # Existing file or directory, just return it return spec else: - try: - spec = Requirement.parse(spec) - except ValueError: - raise DistutilsError( - "Not a URL, existing file, or requirement spec: %r" % - (spec,) - ) - return getattr(self.fetch_distribution(spec, tmpdir),'location',None) + spec = parse_requirement_arg(spec) + return getattr(self.fetch_distribution(spec, tmpdir), 'location', None) def fetch_distribution( self, requirement, tmpdir, force_scan=False, source=False, @@ -578,22 +607,24 @@ class PackageIndex(Environment): for dist in env[req.key]: - if dist.precedence==DEVELOP_DIST and not develop_ok: + if dist.precedence == DEVELOP_DIST and not develop_ok: if dist not in skipped: - self.warn("Skipping development or system egg: %s",dist) + self.warn("Skipping development or system egg: %s", dist) skipped[dist] = 1 continue - if dist in req and (dist.precedence<=SOURCE_DIST or not source): - return dist + if dist in req and (dist.precedence <= SOURCE_DIST or not source): + dist.download_location = self.download(dist.location, tmpdir) + if os.path.exists(dist.download_location): + return dist if force_scan: self.prescan() self.find_packages(requirement) dist = find(requirement) - if local_index is not None: - dist = dist or find(requirement, local_index) + if not dist and local_index is not None: + dist = find(requirement, local_index) if dist is None: if self.to_scan is not None: @@ -606,13 +637,13 @@ class PackageIndex(Environment): if dist is None: self.warn( - "No local packages or download links found for %s%s", + "No local packages or working download links found for %s%s", (source and "a source distribution of " or ""), requirement, ) else: self.info("Best match: %s", dist) - return dist.clone(location=self.download(dist.location, tmpdir)) + return dist.clone(location=dist.download_location) def fetch(self, requirement, tmpdir, force_scan=False, source=False): """Obtain a file suitable for fulfilling `requirement` @@ -622,7 +653,7 @@ class PackageIndex(Environment): ``location`` of the downloaded distribution instead of a distribution object. """ - dist = self.fetch_distribution(requirement,tmpdir,force_scan,source) + dist = self.fetch_distribution(requirement, tmpdir, force_scan, source) if dist is not None: return dist.location return None @@ -634,7 +665,7 @@ class PackageIndex(Environment): interpret_distro_name(filename, match.group(1), None) if d.version ] or [] - if len(dists)==1: # unambiguous ``#egg`` fragment + if len(dists) == 1: # unambiguous ``#egg`` fragment basename = os.path.basename(filename) # Make sure the file has been downloaded to the temp dir. @@ -643,7 +674,7 @@ class PackageIndex(Environment): from setuptools.command.easy_install import samefile if not samefile(filename, dst): shutil.copy2(filename, dst) - filename=dst + filename = dst with open(os.path.join(tmpdir, 'setup.py'), 'w') as file: file.write( @@ -660,7 +691,7 @@ class PackageIndex(Environment): raise DistutilsError( "Can't unambiguously interpret project/version identifier %r; " "any dashes in the name or version should be escaped using " - "underscores. %r" % (fragment,dists) + "underscores. %r" % (fragment, dists) ) else: raise DistutilsError( @@ -669,6 +700,7 @@ class PackageIndex(Environment): ) dl_blocksize = 8192 + def _download_to(self, url, filename): self.info("Downloading %s", url) # Download the file @@ -678,7 +710,7 @@ class PackageIndex(Environment): fp = self.open_url(strip_fragment(url)) if isinstance(fp, urllib.error.HTTPError): raise DistutilsError( - "Can't download %s: %s %s" % (url, fp.code,fp.msg) + "Can't download %s: %s %s" % (url, fp.code, fp.msg) ) headers = fp.info() blocknum = 0 @@ -689,7 +721,7 @@ class PackageIndex(Environment): sizes = get_all_headers(headers, 'Content-Length') size = max(map(int, sizes)) self.reporthook(url, filename, blocknum, bs, size) - with open(filename,'wb') as tfp: + with open(filename, 'wb') as tfp: while True: block = fp.read(bs) if block: @@ -702,10 +734,11 @@ class PackageIndex(Environment): self.check_hash(checker, filename, tfp) return headers finally: - if fp: fp.close() + if fp: + fp.close() def reporthook(self, url, filename, blocknum, blksize, size): - pass # no-op + pass # no-op def open_url(self, url, warning=None): if url.startswith('file:'): @@ -735,7 +768,7 @@ class PackageIndex(Environment): 'down, %s' % (url, v.line) ) - except http_client.HTTPException as v: + except (http_client.HTTPException, socket.error) as v: if warning: self.warn(warning, v) else: @@ -748,27 +781,27 @@ class PackageIndex(Environment): name, fragment = egg_info_for_url(url) if name: while '..' in name: - name = name.replace('..','.').replace('\\','_') + name = name.replace('..', '.').replace('\\', '_') else: - name = "__downloaded__" # default if URL has no path contents + name = "__downloaded__" # default if URL has no path contents if name.endswith('.egg.zip'): - name = name[:-4] # strip the extra .zip before download + name = name[:-4] # strip the extra .zip before download - filename = os.path.join(tmpdir,name) + filename = os.path.join(tmpdir, name) # Download the file # - if scheme=='svn' or scheme.startswith('svn+'): + if scheme == 'svn' or scheme.startswith('svn+'): return self._download_svn(url, filename) - elif scheme=='git' or scheme.startswith('git+'): + elif scheme == 'git' or scheme.startswith('git+'): return self._download_git(url, filename) elif scheme.startswith('hg+'): return self._download_hg(url, filename) - elif scheme=='file': + elif scheme == 'file': return urllib.request.url2pathname(urllib.parse.urlparse(url)[2]) else: - self.url_ok(url, True) # raises error if not allowed + self.url_ok(url, True) # raises error if not allowed return self._attempt_download(url, filename) def scan_url(self, url): @@ -776,7 +809,7 @@ class PackageIndex(Environment): def _attempt_download(self, url, filename): headers = self._download_to(url, filename) - if 'html' in headers.get('content-type','').lower(): + if 'html' in headers.get('content-type', '').lower(): return self._download_html(url, headers, filename) else: return filename @@ -791,25 +824,25 @@ class PackageIndex(Environment): file.close() os.unlink(filename) return self._download_svn(url, filename) - break # not an index page + break # not an index page file.close() os.unlink(filename) - raise DistutilsError("Unexpected HTML page found at "+url) + raise DistutilsError("Unexpected HTML page found at " + url) def _download_svn(self, url, filename): - url = url.split('#',1)[0] # remove any fragment for svn's sake + url = url.split('#', 1)[0] # remove any fragment for svn's sake creds = '' if url.lower().startswith('svn:') and '@' in url: scheme, netloc, path, p, q, f = urllib.parse.urlparse(url) if not netloc and path.startswith('//') and '/' in path[2:]: - netloc, path = path[2:].split('/',1) + netloc, path = path[2:].split('/', 1) auth, host = splituser(netloc) if auth: if ':' in auth: - user, pw = auth.split(':',1) + user, pw = auth.split(':', 1) creds = " --username=%s --password=%s" % (user, pw) else: - creds = " --username="+auth + creds = " --username=" + auth netloc = host parts = scheme, netloc, url, p, q, f url = urllib.parse.urlunparse(parts) @@ -824,7 +857,7 @@ class PackageIndex(Environment): scheme = scheme.split('+', 1)[-1] # Some fragment identification fails - path = path.split('#',1)[0] + path = path.split('#', 1)[0] rev = None if '@' in path: @@ -836,7 +869,7 @@ class PackageIndex(Environment): return url, rev def _download_git(self, url, filename): - filename = filename.split('#',1)[0] + filename = filename.split('#', 1)[0] url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True) self.info("Doing git clone from %s to %s", url, filename) @@ -852,7 +885,7 @@ class PackageIndex(Environment): return filename def _download_hg(self, url, filename): - filename = filename.split('#',1)[0] + filename = filename.split('#', 1)[0] url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True) self.info("Doing hg clone from %s to %s", url, filename) @@ -860,7 +893,7 @@ class PackageIndex(Environment): if rev is not None: self.info("Updating to %s", rev) - os.system("(cd %s && hg up -C -r %s >&-)" % ( + os.system("(cd %s && hg up -C -r %s -q)" % ( filename, rev, )) @@ -876,16 +909,20 @@ class PackageIndex(Environment): def warn(self, msg, *args): log.warn(msg, *args) + # This pattern matches a character entity reference (a decimal numeric # references, a hexadecimal numeric reference, or a named reference). entity_sub = re.compile(r'&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?').sub + def uchr(c): if not isinstance(c, int): return c - if c>255: return six.unichr(c) + if c > 255: + return six.unichr(c) return chr(c) + def decode_entity(match): what = match.group(1) if what.startswith('#x'): @@ -896,10 +933,12 @@ def decode_entity(match): what = six.moves.html_entities.name2codepoint.get(what, match.group(0)) return uchr(what) + def htmldecode(text): """Decode HTML entities in the given text.""" return entity_sub(decode_entity, text) + def socket_timeout(timeout=15): def _socket_timeout(func): def _socket_timeout(*args, **kwargs): @@ -909,9 +948,12 @@ def socket_timeout(timeout=15): return func(*args, **kwargs) finally: socket.setdefaulttimeout(old_timeout) + return _socket_timeout + return _socket_timeout + def _encode_auth(auth): """ A function compatible with Python 2.3-3.3 that will encode @@ -932,12 +974,14 @@ def _encode_auth(auth): # convert back to a string encoded = encoded_bytes.decode() # strip the trailing carriage return - return encoded.replace('\n','') + return encoded.replace('\n', '') + class Credential(object): """ A username/password pair. Use like a namedtuple. """ + def __init__(self, username, password): self.username = username self.password = password @@ -949,8 +993,8 @@ class Credential(object): def __str__(self): return '%(username)s:%(password)s' % vars(self) -class PyPIConfig(configparser.RawConfigParser): +class PyPIConfig(configparser.RawConfigParser): def __init__(self): """ Load from ~/.pypirc @@ -1008,7 +1052,7 @@ def open_with_auth(url, opener=urllib.request.urlopen): if cred: auth = str(cred) info = cred.username, url - log.info('Authenticating as %s for %s (from .pypirc)' % info) + log.info('Authenticating as %s for %s (from .pypirc)', *info) if auth: auth = "Basic " + _encode_auth(auth) @@ -1026,18 +1070,20 @@ def open_with_auth(url, opener=urllib.request.urlopen): # Put authentication info back into request URL if same host, # so that links found on the page will work s2, h2, path2, param2, query2, frag2 = urllib.parse.urlparse(fp.url) - if s2==scheme and h2==host: + if s2 == scheme and h2 == host: parts = s2, netloc, path2, param2, query2, frag2 fp.url = urllib.parse.urlunparse(parts) return fp + # adding a timeout to avoid freezing package_index open_with_auth = socket_timeout(_SOCKET_TIMEOUT)(open_with_auth) def fix_sf_url(url): - return url # backward compatibility + return url # backward compatibility + def local_open(url): """Read a local path, with special support for directories""" diff --git a/lib/python3.4/site-packages/setuptools/py26compat.py b/lib/python3.4/site-packages/setuptools/py26compat.py index e52bd85..4d3add8 100644 --- a/lib/python3.4/site-packages/setuptools/py26compat.py +++ b/lib/python3.4/site-packages/setuptools/py26compat.py @@ -5,18 +5,27 @@ Compatibility Support for Python 2.6 and earlier import sys try: - from urllib.parse import splittag + from urllib.parse import splittag except ImportError: - from urllib import splittag + from urllib import splittag + def strip_fragment(url): - """ - In `Python 8280 `_, Python 2.7 and - later was patched to disregard the fragment when making URL requests. - Do the same for Python 2.6 and earlier. - """ - url, fragment = splittag(url) - return url + """ + In `Python 8280 `_, Python 2.7 and + later was patched to disregard the fragment when making URL requests. + Do the same for Python 2.6 and earlier. + """ + url, fragment = splittag(url) + return url -if sys.version_info >= (2,7): - strip_fragment = lambda x: x + +if sys.version_info >= (2, 7): + strip_fragment = lambda x: x + +try: + from importlib import import_module +except ImportError: + + def import_module(module_name): + return __import__(module_name, fromlist=['__name__']) diff --git a/lib/python3.4/site-packages/setuptools/py27compat.py b/lib/python3.4/site-packages/setuptools/py27compat.py index 9d2886d..2985011 100644 --- a/lib/python3.4/site-packages/setuptools/py27compat.py +++ b/lib/python3.4/site-packages/setuptools/py27compat.py @@ -2,14 +2,27 @@ Compatibility Support for Python 2.7 and earlier """ -import sys +import platform + +from setuptools.extern import six + def get_all_headers(message, key): - """ - Given an HTTPMessage, return all headers matching a given key. - """ - return message.get_all(key) + """ + Given an HTTPMessage, return all headers matching a given key. + """ + return message.get_all(key) -if sys.version_info < (3,): - def get_all_headers(message, key): - return message.getheaders(key) + +if six.PY2: + def get_all_headers(message, key): + return message.getheaders(key) + + +linux_py2_ascii = ( + platform.system() == 'Linux' and + six.PY2 +) + +rmtree_safe = str if linux_py2_ascii else lambda x: x +"""Workaround for http://bugs.python.org/issue24672""" diff --git a/lib/python3.4/site-packages/setuptools/py31compat.py b/lib/python3.4/site-packages/setuptools/py31compat.py index 8fe6dd9..44b025d 100644 --- a/lib/python3.4/site-packages/setuptools/py31compat.py +++ b/lib/python3.4/site-packages/setuptools/py31compat.py @@ -8,10 +8,12 @@ try: from sysconfig import get_config_vars, get_path except ImportError: from distutils.sysconfig import get_config_vars, get_python_lib + def get_path(name): if name not in ('platlib', 'purelib'): raise ValueError("Name must be purelib or platlib") - return get_python_lib(name=='platlib') + return get_python_lib(name == 'platlib') + try: # Python >=3.2 @@ -19,14 +21,16 @@ try: except ImportError: import shutil import tempfile + class TemporaryDirectory(object): """ Very simple temporary directory context manager. Will try to delete afterward, but will also ignore OS and similar errors on deletion. """ + def __init__(self): - self.name = None # Handle mkdtemp raising an exception + self.name = None # Handle mkdtemp raising an exception self.name = tempfile.mkdtemp() def __enter__(self): @@ -35,7 +39,7 @@ except ImportError: def __exit__(self, exctype, excvalue, exctrace): try: shutil.rmtree(self.name, True) - except OSError: #removal errors are not the only possible + except OSError: # removal errors are not the only possible pass self.name = None diff --git a/lib/python3.4/site-packages/setuptools/py33compat.py b/lib/python3.4/site-packages/setuptools/py33compat.py new file mode 100644 index 0000000..af64d5d --- /dev/null +++ b/lib/python3.4/site-packages/setuptools/py33compat.py @@ -0,0 +1,45 @@ +import dis +import array +import collections + +from setuptools.extern import six + + +OpArg = collections.namedtuple('OpArg', 'opcode arg') + + +class Bytecode_compat(object): + def __init__(self, code): + self.code = code + + def __iter__(self): + """Yield '(op,arg)' pair for each operation in code object 'code'""" + + bytes = array.array('b', self.code.co_code) + eof = len(self.code.co_code) + + ptr = 0 + extended_arg = 0 + + while ptr < eof: + + op = bytes[ptr] + + if op >= dis.HAVE_ARGUMENT: + + arg = bytes[ptr + 1] + bytes[ptr + 2] * 256 + extended_arg + ptr += 3 + + if op == dis.EXTENDED_ARG: + long_type = six.integer_types[-1] + extended_arg = arg * long_type(65536) + continue + + else: + arg = None + ptr += 1 + + yield OpArg(op, arg) + + +Bytecode = getattr(dis, 'Bytecode', Bytecode_compat) diff --git a/lib/python3.4/site-packages/setuptools/py36compat.py b/lib/python3.4/site-packages/setuptools/py36compat.py new file mode 100644 index 0000000..f527969 --- /dev/null +++ b/lib/python3.4/site-packages/setuptools/py36compat.py @@ -0,0 +1,82 @@ +import sys +from distutils.errors import DistutilsOptionError +from distutils.util import strtobool +from distutils.debug import DEBUG + + +class Distribution_parse_config_files: + """ + Mix-in providing forward-compatibility for functionality to be + included by default on Python 3.7. + + Do not edit the code in this class except to update functionality + as implemented in distutils. + """ + def parse_config_files(self, filenames=None): + from configparser import ConfigParser + + # Ignore install directory options if we have a venv + if sys.prefix != sys.base_prefix: + ignore_options = [ + 'install-base', 'install-platbase', 'install-lib', + 'install-platlib', 'install-purelib', 'install-headers', + 'install-scripts', 'install-data', 'prefix', 'exec-prefix', + 'home', 'user', 'root'] + else: + ignore_options = [] + + ignore_options = frozenset(ignore_options) + + if filenames is None: + filenames = self.find_config_files() + + if DEBUG: + self.announce("Distribution.parse_config_files():") + + parser = ConfigParser(interpolation=None) + for filename in filenames: + if DEBUG: + self.announce(" reading %s" % filename) + parser.read(filename) + for section in parser.sections(): + options = parser.options(section) + opt_dict = self.get_option_dict(section) + + for opt in options: + if opt != '__name__' and opt not in ignore_options: + val = parser.get(section,opt) + opt = opt.replace('-', '_') + opt_dict[opt] = (filename, val) + + # Make the ConfigParser forget everything (so we retain + # the original filenames that options come from) + parser.__init__() + + # If there was a "global" section in the config file, use it + # to set Distribution options. + + if 'global' in self.command_options: + for (opt, (src, val)) in self.command_options['global'].items(): + alias = self.negative_opt.get(opt) + try: + if alias: + setattr(self, alias, not strtobool(val)) + elif opt in ('verbose', 'dry_run'): # ugh! + setattr(self, opt, strtobool(val)) + else: + setattr(self, opt, val) + except ValueError as msg: + raise DistutilsOptionError(msg) + + +if sys.version_info < (3,): + # Python 2 behavior is sufficient + class Distribution_parse_config_files: + pass + + +if False: + # When updated behavior is available upstream, + # disable override here. + class Distribution_parse_config_files: + pass diff --git a/lib/python3.4/site-packages/setuptools/sandbox.py b/lib/python3.4/site-packages/setuptools/sandbox.py index 23e296b..1d981f4 100644 --- a/lib/python3.4/site-packages/setuptools/sandbox.py +++ b/lib/python3.4/site-packages/setuptools/sandbox.py @@ -7,11 +7,12 @@ import itertools import re import contextlib import pickle +import textwrap from setuptools.extern import six from setuptools.extern.six.moves import builtins, map -import pkg_resources +import pkg_resources.py31compat if sys.platform.startswith('java'): import org.python.modules.posix.PosixModule as _os @@ -25,10 +26,12 @@ _open = open from distutils.errors import DistutilsError from pkg_resources import working_set + __all__ = [ "AbstractSandbox", "DirectorySandbox", "SandboxViolation", "run_setup", ] + def _execfile(filename, globals, locals=None): """ Python 3 implementation of execfile. @@ -71,8 +74,7 @@ def override_temp(replacement): """ Monkey-patch tempfile.tempdir with replacement, ensuring it exists """ - if not os.path.isdir(replacement): - os.makedirs(replacement) + pkg_resources.py31compat.makedirs(replacement, exist_ok=True) saved = tempfile.tempdir @@ -98,6 +100,7 @@ class UnpickleableException(Exception): """ An exception representing another Exception that could not be pickled. """ + @staticmethod def dump(type, exc): """ @@ -117,6 +120,7 @@ class ExceptionSaver: A Context Manager that will save an exception, serialized, and restore it later. """ + def __enter__(self): return self @@ -212,7 +216,7 @@ def _needs_hiding(mod_name): >>> _needs_hiding('Cython') True """ - pattern = re.compile('(setuptools|pkg_resources|distutils|Cython)(\.|$)') + pattern = re.compile(r'(setuptools|pkg_resources|distutils|Cython)(\.|$)') return bool(pattern.match(mod_name)) @@ -232,15 +236,22 @@ def run_setup(setup_script, args): setup_dir = os.path.abspath(os.path.dirname(setup_script)) with setup_context(setup_dir): try: - sys.argv[:] = [setup_script]+list(args) + sys.argv[:] = [setup_script] + list(args) sys.path.insert(0, setup_dir) # reset to include setup dir, w/clean callback list working_set.__init__() - working_set.callbacks.append(lambda dist:dist.activate()) - def runner(): - ns = dict(__file__=setup_script, __name__='__main__') + working_set.callbacks.append(lambda dist: dist.activate()) + + # __file__ should be a byte string on Python 2 (#712) + dunder_file = ( + setup_script + if isinstance(setup_script, str) else + setup_script.encode(sys.getfilesystemencoding()) + ) + + with DirectorySandbox(setup_dir): + ns = dict(__file__=dunder_file, __name__='__main__') _execfile(setup_script, ns) - DirectorySandbox(setup_dir).run(runner) except SystemExit as v: if v.args and v.args[0]: raise @@ -255,46 +266,54 @@ class AbstractSandbox: def __init__(self): self._attrs = [ name for name in dir(_os) - if not name.startswith('_') and hasattr(self,name) + if not name.startswith('_') and hasattr(self, name) ] def _copy(self, source): for name in self._attrs: - setattr(os, name, getattr(source,name)) + setattr(os, name, getattr(source, name)) + + def __enter__(self): + self._copy(self) + if _file: + builtins.file = self._file + builtins.open = self._open + self._active = True + + def __exit__(self, exc_type, exc_value, traceback): + self._active = False + if _file: + builtins.file = _file + builtins.open = _open + self._copy(_os) def run(self, func): """Run 'func' under os sandboxing""" - try: - self._copy(self) - if _file: - builtins.file = self._file - builtins.open = self._open - self._active = True + with self: return func() - finally: - self._active = False - if _file: - builtins.file = _file - builtins.open = _open - self._copy(_os) def _mk_dual_path_wrapper(name): - original = getattr(_os,name) - def wrap(self,src,dst,*args,**kw): + original = getattr(_os, name) + + def wrap(self, src, dst, *args, **kw): if self._active: - src,dst = self._remap_pair(name,src,dst,*args,**kw) - return original(src,dst,*args,**kw) + src, dst = self._remap_pair(name, src, dst, *args, **kw) + return original(src, dst, *args, **kw) + return wrap for name in ["rename", "link", "symlink"]: - if hasattr(_os,name): locals()[name] = _mk_dual_path_wrapper(name) + if hasattr(_os, name): + locals()[name] = _mk_dual_path_wrapper(name) def _mk_single_path_wrapper(name, original=None): - original = original or getattr(_os,name) - def wrap(self,path,*args,**kw): + original = original or getattr(_os, name) + + def wrap(self, path, *args, **kw): if self._active: - path = self._remap_input(name,path,*args,**kw) - return original(path,*args,**kw) + path = self._remap_input(name, path, *args, **kw) + return original(path, *args, **kw) + return wrap if _file: @@ -305,49 +324,56 @@ class AbstractSandbox: "remove", "unlink", "rmdir", "utime", "lchown", "chroot", "lstat", "startfile", "mkfifo", "mknod", "pathconf", "access" ]: - if hasattr(_os,name): locals()[name] = _mk_single_path_wrapper(name) + if hasattr(_os, name): + locals()[name] = _mk_single_path_wrapper(name) def _mk_single_with_return(name): - original = getattr(_os,name) - def wrap(self,path,*args,**kw): + original = getattr(_os, name) + + def wrap(self, path, *args, **kw): if self._active: - path = self._remap_input(name,path,*args,**kw) - return self._remap_output(name, original(path,*args,**kw)) - return original(path,*args,**kw) + path = self._remap_input(name, path, *args, **kw) + return self._remap_output(name, original(path, *args, **kw)) + return original(path, *args, **kw) + return wrap for name in ['readlink', 'tempnam']: - if hasattr(_os,name): locals()[name] = _mk_single_with_return(name) + if hasattr(_os, name): + locals()[name] = _mk_single_with_return(name) def _mk_query(name): - original = getattr(_os,name) - def wrap(self,*args,**kw): - retval = original(*args,**kw) + original = getattr(_os, name) + + def wrap(self, *args, **kw): + retval = original(*args, **kw) if self._active: return self._remap_output(name, retval) return retval + return wrap for name in ['getcwd', 'tmpnam']: - if hasattr(_os,name): locals()[name] = _mk_query(name) + if hasattr(_os, name): + locals()[name] = _mk_query(name) - def _validate_path(self,path): + def _validate_path(self, path): """Called to remap or validate any path, whether input or output""" return path - def _remap_input(self,operation,path,*args,**kw): + def _remap_input(self, operation, path, *args, **kw): """Called for path inputs""" return self._validate_path(path) - def _remap_output(self,operation,path): + def _remap_output(self, operation, path): """Called for path outputs""" return self._validate_path(path) - def _remap_pair(self,operation,src,dst,*args,**kw): + def _remap_pair(self, operation, src, dst, *args, **kw): """Called for path pairs like rename, link, and symlink operations""" return ( - self._remap_input(operation+'-from',src,*args,**kw), - self._remap_input(operation+'-to',dst,*args,**kw) + self._remap_input(operation + '-from', src, *args, **kw), + self._remap_input(operation + '-to', dst, *args, **kw) ) @@ -356,13 +382,6 @@ if hasattr(os, 'devnull'): else: _EXCEPTIONS = [] -try: - from win32com.client.gencache import GetGeneratePath - _EXCEPTIONS.append(GetGeneratePath()) - del GetGeneratePath -except ImportError: - # it appears pywin32 is not installed, so no need to exclude. - pass class DirectorySandbox(AbstractSandbox): """Restrict operations to a single subdirectory - pseudo-chroot""" @@ -374,13 +393,13 @@ class DirectorySandbox(AbstractSandbox): _exception_patterns = [ # Allow lib2to3 to attempt to save a pickled grammar object (#121) - '.*lib2to3.*\.pickle$', + r'.*lib2to3.*\.pickle$', ] "exempt writing to paths that match the pattern" def __init__(self, sandbox, exceptions=_EXCEPTIONS): self._sandbox = os.path.normcase(os.path.realpath(sandbox)) - self._prefix = os.path.join(self._sandbox,'') + self._prefix = os.path.join(self._sandbox, '') self._exceptions = [ os.path.normcase(os.path.realpath(path)) for path in exceptions @@ -392,15 +411,16 @@ class DirectorySandbox(AbstractSandbox): raise SandboxViolation(operation, args, kw) if _file: + def _file(self, path, mode='r', *args, **kw): if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path): self._violation("file", path, mode, *args, **kw) - return _file(path,mode,*args,**kw) + return _file(path, mode, *args, **kw) def _open(self, path, mode='r', *args, **kw): if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path): self._violation("open", path, mode, *args, **kw) - return _open(path,mode,*args,**kw) + return _open(path, mode, *args, **kw) def tmpnam(self): self._violation("tmpnam") @@ -440,57 +460,36 @@ class DirectorySandbox(AbstractSandbox): """Called for path pairs like rename, link, and symlink operations""" if not self._ok(src) or not self._ok(dst): self._violation(operation, src, dst, *args, **kw) - return (src,dst) + return (src, dst) def open(self, file, flags, mode=0o777, *args, **kw): """Called for low-level os.open()""" if flags & WRITE_FLAGS and not self._ok(file): self._violation("os.open", file, flags, mode, *args, **kw) - return _os.open(file,flags,mode, *args, **kw) + return _os.open(file, flags, mode, *args, **kw) + WRITE_FLAGS = functools.reduce( operator.or_, [getattr(_os, a, 0) for a in "O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC O_TEMPORARY".split()] ) + class SandboxViolation(DistutilsError): """A setup script attempted to modify the filesystem outside the sandbox""" + tmpl = textwrap.dedent(""" + SandboxViolation: {cmd}{args!r} {kwargs} + + The package setup script has attempted to modify files on your system + that are not within the EasyInstall build area, and has been aborted. + + This package cannot be safely installed by EasyInstall, and may not + support alternate installation locations even if you run its setup + script by hand. Please inform the package's author and the EasyInstall + maintainers to find out if a fix or workaround is available. + """).lstrip() + def __str__(self): - return """SandboxViolation: %s%r %s - -The package setup script has attempted to modify files on your system -that are not within the EasyInstall build area, and has been aborted. - -This package cannot be safely installed by EasyInstall, and may not -support alternate installation locations even if you run its setup -script by hand. Please inform the package's author and the EasyInstall -maintainers to find out if a fix or workaround is available.""" % self.args - - - - - - - - - - - - - - - - - - - - - - - - - - - -# + cmd, args, kwargs = self.args + return self.tmpl.format(**locals()) diff --git a/lib/python3.4/site-packages/setuptools/site-patch.py b/lib/python3.4/site-packages/setuptools/site-patch.py index c216801..0d2d2ff 100644 --- a/lib/python3.4/site-packages/setuptools/site-patch.py +++ b/lib/python3.4/site-packages/setuptools/site-patch.py @@ -2,19 +2,18 @@ def __boot(): import sys import os PYTHONPATH = os.environ.get('PYTHONPATH') - if PYTHONPATH is None or (sys.platform=='win32' and not PYTHONPATH): + if PYTHONPATH is None or (sys.platform == 'win32' and not PYTHONPATH): PYTHONPATH = [] else: PYTHONPATH = PYTHONPATH.split(os.pathsep) - pic = getattr(sys,'path_importer_cache',{}) + pic = getattr(sys, 'path_importer_cache', {}) stdpath = sys.path[len(PYTHONPATH):] mydir = os.path.dirname(__file__) - #print "searching",stdpath,sys.path for item in stdpath: - if item==mydir or not item: - continue # skip if current dir. on Windows, or my own directory + if item == mydir or not item: + continue # skip if current dir. on Windows, or my own directory importer = pic.get(item) if importer is not None: loader = importer.find_module('site') @@ -24,32 +23,30 @@ def __boot(): break else: try: - import imp # Avoid import loop in Python >= 3.3 - stream, path, descr = imp.find_module('site',[item]) + import imp # Avoid import loop in Python >= 3.3 + stream, path, descr = imp.find_module('site', [item]) except ImportError: continue if stream is None: continue try: # This should actually reload the current module - imp.load_module('site',stream,path,descr) + imp.load_module('site', stream, path, descr) finally: stream.close() break else: raise ImportError("Couldn't find the real 'site' module") - #print "loaded", __file__ + known_paths = dict([(makepath(item)[1], 1) for item in sys.path]) # 2.2 comp - known_paths = dict([(makepath(item)[1],1) for item in sys.path]) # 2.2 comp - - oldpos = getattr(sys,'__egginsert',0) # save old insertion position - sys.__egginsert = 0 # and reset the current one + oldpos = getattr(sys, '__egginsert', 0) # save old insertion position + sys.__egginsert = 0 # and reset the current one for item in PYTHONPATH: addsitedir(item) - sys.__egginsert += oldpos # restore effective old position + sys.__egginsert += oldpos # restore effective old position d, nd = makepath(stdpath[0]) insert_at = None @@ -58,7 +55,7 @@ def __boot(): for item in sys.path: p, np = makepath(item) - if np==nd and insert_at is None: + if np == nd and insert_at is None: # We've hit the first 'system' path entry, so added entries go here insert_at = len(new_path) @@ -71,6 +68,7 @@ def __boot(): sys.path[:] = new_path -if __name__=='site': + +if __name__ == 'site': __boot() del __boot diff --git a/lib/python3.4/site-packages/setuptools/ssl_support.py b/lib/python3.4/site-packages/setuptools/ssl_support.py index 657197c..72b18ef 100644 --- a/lib/python3.4/site-packages/setuptools/ssl_support.py +++ b/lib/python3.4/site-packages/setuptools/ssl_support.py @@ -2,10 +2,10 @@ import os import socket import atexit import re +import functools -from setuptools.extern.six.moves import urllib, http_client, map +from setuptools.extern.six.moves import urllib, http_client, map, filter -import pkg_resources from pkg_resources import ResolutionError, ExtractionError try: @@ -26,9 +26,9 @@ cert_paths = """ /etc/ssl/cert.pem /System/Library/OpenSSL/certs/cert.pem /usr/local/share/certs/ca-root-nss.crt +/etc/ssl/ca-bundle.pem """.strip().split() - try: HTTPSHandler = urllib.request.HTTPSHandler HTTPSConnection = http_client.HTTPSConnection @@ -49,10 +49,13 @@ except ImportError: match_hostname = None if not CertificateError: + class CertificateError(ValueError): pass + if not match_hostname: + def _dnsname_match(dn, hostname, max_wildcards=1): """Matching according to RFC 6125, section 6.4.3 @@ -161,6 +164,7 @@ class VerifyingHTTPSHandler(HTTPSHandler): class VerifyingHTTPSConn(HTTPSConnection): """Simple verifying connection: no auth, subclasses, timeouts, etc.""" + def __init__(self, host, ca_bundle, **kw): HTTPSConnection.__init__(self, host, **kw) self.ca_bundle = ca_bundle @@ -192,6 +196,7 @@ class VerifyingHTTPSConn(HTTPSConnection): self.sock.close() raise + def opener_for(ca_bundle=None): """Get a urlopen() replacement that uses ca_bundle for verification""" return urllib.request.build_opener( @@ -199,45 +204,52 @@ def opener_for(ca_bundle=None): ).open -_wincerts = None +# from jaraco.functools +def once(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + if not hasattr(func, 'always_returns'): + func.always_returns = func(*args, **kwargs) + return func.always_returns + return wrapper + +@once def get_win_certfile(): - global _wincerts - if _wincerts is not None: - return _wincerts.name - try: - from wincertstore import CertFile + import wincertstore except ImportError: return None - class MyCertFile(CertFile): - def __init__(self, stores=(), certs=()): - CertFile.__init__(self) - for store in stores: - self.addstore(store) - self.addcerts(certs) + class CertFile(wincertstore.CertFile): + def __init__(self): + super(CertFile, self).__init__() atexit.register(self.close) def close(self): try: - super(MyCertFile, self).close() + super(CertFile, self).close() except OSError: pass - _wincerts = MyCertFile(stores=['CA', 'ROOT']) + _wincerts = CertFile() + _wincerts.addstore('CA') + _wincerts.addstore('ROOT') return _wincerts.name def find_ca_bundle(): """Return an existing CA bundle path, or None""" - if os.name=='nt': - return get_win_certfile() - else: - for cert_path in cert_paths: - if os.path.isfile(cert_path): - return cert_path + extant_cert_paths = filter(os.path.isfile, cert_paths) + return ( + get_win_certfile() + or next(extant_cert_paths, None) + or _certifi_where() + ) + + +def _certifi_where(): try: - return pkg_resources.resource_filename('certifi', 'cacert.pem') + return __import__('certifi').where() except (ImportError, ResolutionError, ExtractionError): - return None + pass diff --git a/lib/python3.4/site-packages/setuptools/unicode_utils.py b/lib/python3.4/site-packages/setuptools/unicode_utils.py index ffab3e2..7c63efd 100644 --- a/lib/python3.4/site-packages/setuptools/unicode_utils.py +++ b/lib/python3.4/site-packages/setuptools/unicode_utils.py @@ -3,6 +3,7 @@ import sys from setuptools.extern import six + # HFS Plus uses decomposed UTF-8 def decompose(path): if isinstance(path, six.text_type): diff --git a/lib/python3.4/site-packages/setuptools/utils.py b/lib/python3.4/site-packages/setuptools/utils.py deleted file mode 100644 index 91e4b87..0000000 --- a/lib/python3.4/site-packages/setuptools/utils.py +++ /dev/null @@ -1,11 +0,0 @@ -import os -import os.path - - -def cs_path_exists(fspath): - if not os.path.exists(fspath): - return False - # make absolute so we always have a directory - abspath = os.path.abspath(fspath) - directory, filename = os.path.split(abspath) - return filename in os.listdir(directory) \ No newline at end of file diff --git a/lib/python3.4/site-packages/setuptools/version.py b/lib/python3.4/site-packages/setuptools/version.py index 4494728..95e1869 100644 --- a/lib/python3.4/site-packages/setuptools/version.py +++ b/lib/python3.4/site-packages/setuptools/version.py @@ -1 +1,6 @@ -__version__ = '20.1.1' +import pkg_resources + +try: + __version__ = pkg_resources.get_distribution('setuptools').version +except Exception: + __version__ = 'unknown' diff --git a/lib/python3.4/site-packages/six-1.10.0.dist-info/RECORD b/lib/python3.4/site-packages/six-1.10.0.dist-info/RECORD deleted file mode 100644 index f4ec904..0000000 --- a/lib/python3.4/site-packages/six-1.10.0.dist-info/RECORD +++ /dev/null @@ -1,9 +0,0 @@ -six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 -six-1.10.0.dist-info/DESCRIPTION.rst,sha256=QWBtSTT2zzabwJv1NQbTfClSX13m-Qc6tqU4TRL1RLs,774 -six-1.10.0.dist-info/METADATA,sha256=5HceJsUnHof2IRamlCKO2MwNjve1eSP4rLzVQDfwpCQ,1283 -six-1.10.0.dist-info/RECORD,, -six-1.10.0.dist-info/WHEEL,sha256=GrqQvamwgBV4nLoJe0vhYRSWzWsx7xjlt74FT0SWYfE,110 -six-1.10.0.dist-info/metadata.json,sha256=jtOeeTBubYDChl_5Ql5ZPlKoHgg6rdqRIjOz1e5Ek2U,658 -six-1.10.0.dist-info/top_level.txt,sha256=_iVH_iYEtEXnD8nYGQYpYFUvkUW9sEO1GYbkeKSAais,4 -six-1.10.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -__pycache__/six.cpython-34.pyc,, diff --git a/lib/python3.4/site-packages/six-1.10.0.dist-info/metadata.json b/lib/python3.4/site-packages/six-1.10.0.dist-info/metadata.json deleted file mode 100644 index 21f9f6c..0000000 --- a/lib/python3.4/site-packages/six-1.10.0.dist-info/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"generator": "bdist_wheel (0.26.0)", "summary": "Python 2 and 3 compatibility utilities", "classifiers": ["Programming Language :: Python :: 2", "Programming Language :: Python :: 3", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Topic :: Software Development :: Libraries", "Topic :: Utilities"], "extensions": {"python.details": {"project_urls": {"Home": "http://pypi.python.org/pypi/six/"}, "contacts": [{"email": "benjamin@python.org", "name": "Benjamin Peterson", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}}}, "license": "MIT", "metadata_version": "2.0", "name": "six", "version": "1.10.0"} \ No newline at end of file diff --git a/lib/python3.4/site-packages/six-1.10.0.dist-info/DESCRIPTION.rst b/lib/python3.4/site-packages/six-1.11.0.dist-info/DESCRIPTION.rst similarity index 58% rename from lib/python3.4/site-packages/six-1.10.0.dist-info/DESCRIPTION.rst rename to lib/python3.4/site-packages/six-1.11.0.dist-info/DESCRIPTION.rst index 2e2607d..09c2c99 100644 --- a/lib/python3.4/site-packages/six-1.10.0.dist-info/DESCRIPTION.rst +++ b/lib/python3.4/site-packages/six-1.11.0.dist-info/DESCRIPTION.rst @@ -1,3 +1,12 @@ +.. image:: http://img.shields.io/pypi/v/six.svg + :target: https://pypi.python.org/pypi/six + +.. image:: https://travis-ci.org/benjaminp/six.svg?branch=master + :target: https://travis-ci.org/benjaminp/six + +.. image:: http://img.shields.io/badge/license-MIT-green.svg + :target: https://github.com/benjaminp/six/blob/master/LICENSE + Six is a Python 2 and 3 compatibility library. It provides utility functions for smoothing over the differences between the Python versions with the goal of writing Python code that is compatible on both Python versions. See the @@ -7,9 +16,9 @@ Six supports every Python version since 2.6. It is contained in only one Python file, so it can be easily copied into your project. (The copyright and license notice must be retained.) -Online documentation is at https://pythonhosted.org/six/. +Online documentation is at http://six.rtfd.org. -Bugs can be reported to https://bitbucket.org/gutworth/six. The code can also +Bugs can be reported to https://github.com/benjaminp/six. The code can also be found there. For questions about six or porting in general, email the python-porting mailing diff --git a/lib/python3.4/site-packages/setuptools-20.3.1.dist-info/INSTALLER b/lib/python3.4/site-packages/six-1.11.0.dist-info/INSTALLER similarity index 100% rename from lib/python3.4/site-packages/setuptools-20.3.1.dist-info/INSTALLER rename to lib/python3.4/site-packages/six-1.11.0.dist-info/INSTALLER diff --git a/lib/python3.4/site-packages/six-1.10.0.dist-info/METADATA b/lib/python3.4/site-packages/six-1.11.0.dist-info/METADATA similarity index 70% rename from lib/python3.4/site-packages/six-1.10.0.dist-info/METADATA rename to lib/python3.4/site-packages/six-1.11.0.dist-info/METADATA index 4fc3d07..04e93dc 100644 --- a/lib/python3.4/site-packages/six-1.10.0.dist-info/METADATA +++ b/lib/python3.4/site-packages/six-1.11.0.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.0 Name: six -Version: 1.10.0 +Version: 1.11.0 Summary: Python 2 and 3 compatibility utilities Home-page: http://pypi.python.org/pypi/six/ Author: Benjamin Peterson @@ -14,6 +14,15 @@ Classifier: License :: OSI Approved :: MIT License Classifier: Topic :: Software Development :: Libraries Classifier: Topic :: Utilities +.. image:: http://img.shields.io/pypi/v/six.svg + :target: https://pypi.python.org/pypi/six + +.. image:: https://travis-ci.org/benjaminp/six.svg?branch=master + :target: https://travis-ci.org/benjaminp/six + +.. image:: http://img.shields.io/badge/license-MIT-green.svg + :target: https://github.com/benjaminp/six/blob/master/LICENSE + Six is a Python 2 and 3 compatibility library. It provides utility functions for smoothing over the differences between the Python versions with the goal of writing Python code that is compatible on both Python versions. See the @@ -23,9 +32,9 @@ Six supports every Python version since 2.6. It is contained in only one Python file, so it can be easily copied into your project. (The copyright and license notice must be retained.) -Online documentation is at https://pythonhosted.org/six/. +Online documentation is at http://six.rtfd.org. -Bugs can be reported to https://bitbucket.org/gutworth/six. The code can also +Bugs can be reported to https://github.com/benjaminp/six. The code can also be found there. For questions about six or porting in general, email the python-porting mailing diff --git a/lib/python3.4/site-packages/six-1.11.0.dist-info/RECORD b/lib/python3.4/site-packages/six-1.11.0.dist-info/RECORD new file mode 100644 index 0000000..99350b6 --- /dev/null +++ b/lib/python3.4/site-packages/six-1.11.0.dist-info/RECORD @@ -0,0 +1,9 @@ +six.py,sha256=A08MPb-Gi9FfInI3IW7HimXFmEH2T2IPzHgDvdhZPRA,30888 +six-1.11.0.dist-info/DESCRIPTION.rst,sha256=gPBoq1Ruc1QDWyLeXPlieL3F-XZz1_WXB-5gctCfg-A,1098 +six-1.11.0.dist-info/METADATA,sha256=06nZXaDYN3vnC-pmUjhkECYFH_a--ywvcPIpUdNeH1o,1607 +six-1.11.0.dist-info/RECORD,, +six-1.11.0.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 +six-1.11.0.dist-info/metadata.json,sha256=ac3f4f7MpSHSnZ1SqhHCwsL7FGWMG0gBEb0hhS2eSSM,703 +six-1.11.0.dist-info/top_level.txt,sha256=_iVH_iYEtEXnD8nYGQYpYFUvkUW9sEO1GYbkeKSAais,4 +six-1.11.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +__pycache__/six.cpython-34.pyc,, diff --git a/lib/python3.4/site-packages/pip-8.1.1.dist-info/WHEEL b/lib/python3.4/site-packages/six-1.11.0.dist-info/WHEEL similarity index 100% rename from lib/python3.4/site-packages/pip-8.1.1.dist-info/WHEEL rename to lib/python3.4/site-packages/six-1.11.0.dist-info/WHEEL diff --git a/lib/python3.4/site-packages/six-1.11.0.dist-info/metadata.json b/lib/python3.4/site-packages/six-1.11.0.dist-info/metadata.json new file mode 100644 index 0000000..2c7fcea --- /dev/null +++ b/lib/python3.4/site-packages/six-1.11.0.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Programming Language :: Python :: 2", "Programming Language :: Python :: 3", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Topic :: Software Development :: Libraries", "Topic :: Utilities"], "extensions": {"python.details": {"contacts": [{"email": "benjamin@python.org", "name": "Benjamin Peterson", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "http://pypi.python.org/pypi/six/"}}}, "generator": "bdist_wheel (0.29.0)", "license": "MIT", "metadata_version": "2.0", "name": "six", "summary": "Python 2 and 3 compatibility utilities", "test_requires": [{"requires": ["pytest"]}], "version": "1.11.0"} \ No newline at end of file diff --git a/lib/python3.4/site-packages/six-1.10.0.dist-info/top_level.txt b/lib/python3.4/site-packages/six-1.11.0.dist-info/top_level.txt similarity index 100% rename from lib/python3.4/site-packages/six-1.10.0.dist-info/top_level.txt rename to lib/python3.4/site-packages/six-1.11.0.dist-info/top_level.txt diff --git a/lib/python3.4/site-packages/six.py b/lib/python3.4/site-packages/six.py index 190c023..6bf4fd3 100644 --- a/lib/python3.4/site-packages/six.py +++ b/lib/python3.4/site-packages/six.py @@ -1,6 +1,4 @@ -"""Utilities for writing code that runs on Python 2 and 3""" - -# Copyright (c) 2010-2015 Benjamin Peterson +# Copyright (c) 2010-2017 Benjamin Peterson # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -20,6 +18,8 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +"""Utilities for writing code that runs on Python 2 and 3""" + from __future__ import absolute_import import functools @@ -29,7 +29,7 @@ import sys import types __author__ = "Benjamin Peterson " -__version__ = "1.10.0" +__version__ = "1.11.0" # Useful for very coarse version differentiation. @@ -241,6 +241,7 @@ _moved_attributes = [ MovedAttribute("map", "itertools", "builtins", "imap", "map"), MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("getoutput", "commands", "subprocess"), MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), MovedAttribute("reduce", "__builtin__", "functools"), @@ -262,10 +263,11 @@ _moved_attributes = [ MovedModule("html_entities", "htmlentitydefs", "html.entities"), MovedModule("html_parser", "HTMLParser", "html.parser"), MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), - MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), @@ -337,10 +339,12 @@ _urllib_parse_moved_attributes = [ MovedAttribute("quote_plus", "urllib", "urllib.parse"), MovedAttribute("unquote", "urllib", "urllib.parse"), MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"), MovedAttribute("urlencode", "urllib", "urllib.parse"), MovedAttribute("splitquery", "urllib", "urllib.parse"), MovedAttribute("splittag", "urllib", "urllib.parse"), MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("splitvalue", "urllib", "urllib.parse"), MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), MovedAttribute("uses_params", "urlparse", "urllib.parse"), @@ -416,6 +420,8 @@ _urllib_request_moved_attributes = [ MovedAttribute("URLopener", "urllib", "urllib.request"), MovedAttribute("FancyURLopener", "urllib", "urllib.request"), MovedAttribute("proxy_bypass", "urllib", "urllib.request"), + MovedAttribute("parse_http_list", "urllib2", "urllib.request"), + MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), ] for attr in _urllib_request_moved_attributes: setattr(Module_six_moves_urllib_request, attr.name, attr) @@ -679,11 +685,15 @@ if PY3: exec_ = getattr(moves.builtins, "exec") def reraise(tp, value, tb=None): - if value is None: - value = tp() - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value + try: + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + finally: + value = None + tb = None else: def exec_(_code_, _globs_=None, _locs_=None): @@ -699,19 +709,28 @@ else: exec("""exec _code_ in _globs_, _locs_""") exec_("""def reraise(tp, value, tb=None): - raise tp, value, tb + try: + raise tp, value, tb + finally: + tb = None """) if sys.version_info[:2] == (3, 2): exec_("""def raise_from(value, from_value): - if from_value is None: - raise value - raise value from from_value + try: + if from_value is None: + raise value + raise value from from_value + finally: + value = None """) elif sys.version_info[:2] > (3, 2): exec_("""def raise_from(value, from_value): - raise value from from_value + try: + raise value from from_value + finally: + value = None """) else: def raise_from(value, from_value): @@ -802,10 +821,14 @@ def with_metaclass(meta, *bases): # This requires a bit of explanation: the basic idea is to make a dummy # metaclass for one level of class instantiation that replaces itself with # the actual metaclass. - class metaclass(meta): + class metaclass(type): def __new__(cls, name, this_bases, d): return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) return type.__new__(metaclass, 'temporary_class', (), {}) diff --git a/lib/python3.4/site-packages/sqlalchemy/cprocessors.cpython-34m.so b/lib/python3.4/site-packages/sqlalchemy/cprocessors.cpython-34m.so index 414727a10e4ca351209a5680a708552cab5e06b0..7b1c78e6875bd59ab5022d33ea05d0372abe2455 100755 GIT binary patch literal 52136 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 literal 42824 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%0AIUdAH zH{yk2G1!BbpK~vA@>>n9C#!6aS>VPyzHOZzZ%{Sj(K8#Dz*8s{_eQ6vQ$DA1SBT1o zDGEzU&MGhChj|>gJEmxDvKs=erzcX#e6~m8ZrkK-5mmOkOBKlXz9$#5o)1ak4NC_C z3zkxJ>ox^D39%X^KDq4{Zc$d`iq$y&RGT3l`MX)CcM-=hxN*(9@OCwE;i9+Pt0~si0J zUM`MAk>xVv@8ZQO$&-obsd_D6>Tfwg!Bh&+hK5kvJjn7Ca! zVG=G_&(ZN6rvZLoa_}vjR{N4Y+m_@ecE`gH^2XFe1g003Y5W-Cpk8o31QrN1&~pgX z3^YRJjpI2{%XQmBKa1DlsU|sBRauWAsV-VhH@_#8Ay?^PnnCvriv&o~{qkme=QAh? zed@O3K%lWJXx-sExaouL4b}={-R*e70%bfZ%NB+@@bpk2p1v=XH)*#vX#x}XE*Ca+ zcR*4TC2r6bHR_RyK}Y~~c(^S{j0%e2@xDSa-xLBYT#Lt43*+=KULnoNU+*FrAXu@+|$ zg^I_yxT>Kc8d}FS*oYv+FrvdCJ#nk}m8K*oz%NLmpA&S|2Fp@$@O2d~rz$!ZIIRyl z==UOCaUEuPz9h$Gt>VVAOC0>WOQBjh0PN^s*{@KFxZJM<$u3o~JpW#*0F7AKzI8oE zUDx6FID$nSSRM>Ie8BLUJj;K+?!%>DakKwyhfDff6uqO7alSspWwDYc|H(G{ugF>x z0B#%6_&O4o`B=Bm!S-36+uwmYlAljZIQV)KmmcL9$>Z0EWuN7{KqJ5SGT17$NaE6Y zMTBhGj~EcUe2# z?DqM(8JEt>dd~LWpya138+?6@OTN^~F0lU`mTxP0&L94L$>k;%RHf7Y4;=D*y^hQ8 zvtlLB_F3)y05b96{Nn3+2MZ*Jli!K|8f@5t$&%;me~11}`6nSuv0(dro$&C#DSrsE zl)Eg?*AtH@`9mtu95?o#^I(I+K3{j-SA+^2epy)GEYIa%P-FMsx;|MfMGjh$5@0zl z|KX75>k&tkJYULZHC_f(*@u#Jar^oA-j21qWsb?Xt{}lYiy{FP zP9Z~-WB4#la>(z^O5Um0$(sg(lSUeTqU2vc#jbTI@8}fr-#cH*eU}5H)HrQTN+DnM zRVi>ACr%3aGnBluoi8>>fe&eL*bcVO<;)cJ|0^nm&gY3*>0milS(!q*&F@J0r49iHD*Dc0LI~!5L&~?PzhY81(zRR8du|rZugUE9?3D6hb^eps H(Ek5FBrlVI diff --git a/lib/python3.4/site-packages/sqlalchemy/cprocessors.cpython-36m-x86_64-linux-gnu.so b/lib/python3.4/site-packages/sqlalchemy/cprocessors.cpython-36m-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..19f3794a89efdb277261d8e8e5ce57daeeac5bf9 GIT binary patch literal 53040 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 literal 0 HcmV?d00001 diff --git a/lib/python3.4/site-packages/sqlalchemy/cresultproxy.cpython-34m.so b/lib/python3.4/site-packages/sqlalchemy/cresultproxy.cpython-34m.so index dabde30fc53b9bdca6ddc6aac14a7a0c5090215c..27c0c4fae46fe87c5b7d4cdbfbecc81e3e3c5c72 100755 GIT binary patch literal 61504 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 bcKcWth8V2p=br}`;g^1Qz=aA>HJg6`rg)#l literal 54056 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 T%0KofGH|>v6O%?$>iYiyi59sk diff --git a/lib/python3.4/site-packages/sqlalchemy/cresultproxy.cpython-35m-x86_64-linux-gnu.so b/lib/python3.4/site-packages/sqlalchemy/cresultproxy.cpython-35m-x86_64-linux-gnu.so index 5b322958d537abbc243e5ad595d30bfa99a18408..526596f63102993bb66efcfc557d3ba5c5c138d5 100755 GIT binary patch literal 61648 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 Lz$*=)X?Fhtn{J}O literal 54304 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 diff --git a/lib/python3.4/site-packages/sqlalchemy/cresultproxy.cpython-36m-x86_64-linux-gnu.so b/lib/python3.4/site-packages/sqlalchemy/cresultproxy.cpython-36m-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..20aacaa5661ca73e55e531ce7ab46e25ab4dc662 GIT binary patch literal 62208 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 MCdyNpL)NVR0VY5-m;e9( literal 0 HcmV?d00001 diff --git a/lib/python3.4/site-packages/sqlalchemy/cutils.cpython-34m.so b/lib/python3.4/site-packages/sqlalchemy/cutils.cpython-34m.so index 429e17cf140642ec53d0455906029e0cdfe6d25f..b5b447d5fd50b0bfb13253d6df8fbccd08a5c852 100755 GIT binary patch literal 34312 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 NaqHZ?0(nX6e*-b+ufG5Q literal 25280 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 diff --git a/lib/python3.4/site-packages/sqlalchemy/cutils.cpython-35m-x86_64-linux-gnu.so b/lib/python3.4/site-packages/sqlalchemy/cutils.cpython-35m-x86_64-linux-gnu.so index 362e2b47711761451451e078b26c4b913c0f6cfa..15aaff6541874e56554477c9d6a52e0222b4cc89 100755 GIT binary patch literal 34456 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 Js6bKD`riw;dYk|N literal 25536 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 ZUBJAsejfWVQu#+1*l}H0P@o`b{cpZV8|nZ6 literal 0 HcmV?d00001 diff --git a/lib/python3.4/site-packages/wheel-0.29.0.dist-info/INSTALLER b/lib/python3.4/site-packages/wheel-0.29.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/lib/python3.4/site-packages/wheel-0.29.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/lib/python3.4/site-packages/wheel-0.29.0.dist-info/RECORD b/lib/python3.4/site-packages/wheel-0.29.0.dist-info/RECORD deleted file mode 100644 index 40615fe..0000000 --- a/lib/python3.4/site-packages/wheel-0.29.0.dist-info/RECORD +++ /dev/null @@ -1,81 +0,0 @@ -wheel/__init__.py,sha256=YumT_ajakW9VAgnV3umrUYypy6VzpbLKE-OPbVnWm8M,96 -wheel/__main__.py,sha256=LbDDGId08qTxuhLYqX5mXO1MUs9D-Hhxb5NVc53ej0k,416 -wheel/archive.py,sha256=eGyE04hV52JjU3KulISGPqQB340uDwIVwBcJkghkxx4,2286 -wheel/bdist_wheel.py,sha256=4QOgk1c66zu045XjET9Enz4ODW89LlHzJXukbIft_yY,17441 -wheel/decorator.py,sha256=U2K77ZZ8x3x5vSIGCcEeh8GAxB6rABB7AlDwRukaoCk,541 -wheel/egg2wheel.py,sha256=_JNueL6ZcWOxiPdL1r71fB9Mwuzmln4cZOIf_gA0Nc4,2633 -wheel/eggnames.txt,sha256=X6LYsOjMd8llrzLo3SB3FwJ-uN9IskJqYKJDq2zIcbs,2490 -wheel/install.py,sha256=yzPyjCAUmIgPTk_be-tbXFOJ3m08kYt3T3Tf1R8Lmh0,18070 -wheel/metadata.py,sha256=ttwI-jwjN5YnmDFbfLR4mFKod4HSnd1tje8lK4rQNqc,11050 -wheel/paths.py,sha256=6AmG-MKx-NeJOC9zUJoSSZjYhZYGmX1UHG_N0IbkplI,1130 -wheel/pep425tags.py,sha256=vbazM-mj7u-8s-YauwSykBhXM_YreCb8mG-eZyz2vl4,5341 -wheel/pkginfo.py,sha256=-gLOTuQrkRf4geOD04qm0IUkdYAbjg81j-5zNtvWA9A,1225 -wheel/util.py,sha256=Pe2JZ9grNjmAcRRJay20FlDVJUbePWaR5ltySo3c6zQ,4890 -wheel/wininst2wheel.py,sha256=_cTbf8bcAt481G6tYRQsOUT9ZGeg3artyrS0tBU9Tzs,6961 -wheel/signatures/__init__.py,sha256=kZpKNsmxBDZhuXf85_uyy5qBH40AxVT_0utbAiTp_yg,3779 -wheel/signatures/djbec.py,sha256=53HTnlNlfqOHFDf8OY_6KL8sxR4swiLsWhUjtw3W3nI,6755 -wheel/signatures/ed25519py.py,sha256=SeTxiMZ7kmoMdIurBSaKb8Ku-amGnf6ZTRGElLzV8iI,1695 -wheel/signatures/keys.py,sha256=x3g4sAcs7KbIHM-5V8KWdMc24_VK7VeD-pjCyktNnYo,3320 -wheel/test/__init__.py,sha256=M0NZuQ7-112l8K2h1eayVvSmvQrufrOcD5AYKgIf_Is,1 -wheel/test/pydist-schema.json,sha256=ynEvNvThC1zRa7FioMsW3k-9nl98ytEoo1_3xbOP2eo,11483 -wheel/test/test-1.0-py2.py3-none-win32.whl,sha256=tCbefJJ7RpQJReRQaSRiwnTDM-YDlBpbcX9Rjcv9bf4,5224 -wheel/test/test_basic.py,sha256=2DIvjApcshiLpXVsEhXvN3l62ZrwS0jJcWK8SyASoNU,6405 -wheel/test/test_install.py,sha256=c0EECXPkVIGhCD9V5ad2qsBPRPYb1ehhaS0k6Gv5JQc,1866 -wheel/test/test_keys.py,sha256=5mBc9tf2TwC3TCpx1ySTYsCe5yvd6kMK64AlUUCcKEY,2575 -wheel/test/test_paths.py,sha256=-QOVUDFJIpF9OPNRzCJ-Xf4nBibKlUe_g4aaZ6sm3wE,172 -wheel/test/test_ranking.py,sha256=FSAQX4oHZ476jLddqVMlGmQFtbEel9a8SzOngJ03TJw,1496 -wheel/test/test_signatures.py,sha256=Z4REXj62p28gbSDB2D_OxopA-TTXICTZ5e2yZ3ejEVc,1120 -wheel/test/test_tagopt.py,sha256=t7A-iRbe3bH2Iz6NKdSEOpFFIFSF9I4ATmlrRBXoCcQ,5927 -wheel/test/test_tool.py,sha256=yt5dAr8mp51WoDzt0MmlwPk0xf7FvXAedy-YlNZXv1I,656 -wheel/test/test_wheelfile.py,sha256=x4exzQYuQB48YHqhU2NZyN76k-BSK6784-7rye0q6Ss,4585 -wheel/test/complex-dist/setup.py,sha256=4i1_AJoJxo4i6ik-mvydo23AF8BHzjmAEQYa5J4YPK4,855 -wheel/test/complex-dist/complexdist/__init__.py,sha256=PGDJWQTxjLXqnNrbqmTKK_yk6DVQBNeRp-YpP7w1rVk,23 -wheel/test/headers.dist/header.h,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -wheel/test/headers.dist/headersdist.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -wheel/test/headers.dist/setup.py,sha256=p3d9TGy7NLX6TnkBHnNHzedqYoOkdGQvwheyDQjf-JQ,324 -wheel/test/simple.dist/setup.py,sha256=8zWen71Um-iN_A5thot6VFogrkWs_RGVO-jr_MxkFog,383 -wheel/test/simple.dist/simpledist/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -wheel/tool/__init__.py,sha256=anweXjmIg4EIHPkH0kOgcTx-gyOmzE4ieRe2yk-aHDA,13229 -wheel-0.29.0.dist-info/DESCRIPTION.rst,sha256=JH6mogUIatQVQewIh4GB1ywCxuWbm7G4TjI_63dURp8,9813 -wheel-0.29.0.dist-info/METADATA,sha256=SA310hLnZJJFgp1TRwFLCIiXurVwKpIq2w3KWhMdgdo,11019 -wheel-0.29.0.dist-info/RECORD,, -wheel-0.29.0.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 -wheel-0.29.0.dist-info/entry_points.txt,sha256=2LFQDKAUKNMG-2zNtbLscfirPr9BEqBuwc-JALCv-D0,107 -wheel-0.29.0.dist-info/metadata.json,sha256=dxlCIm4231kQk4VlVdiN5ABz3l0nWY3gQ9HPoDammlU,1510 -wheel-0.29.0.dist-info/top_level.txt,sha256=HxSBIbgEstMPe4eFawhA66Mq-QYHMopXVoAncfjb_1c,6 -../../../bin/wheel,sha256=9AId6sAKuD-WAQ9mDTPhEG_pesWmjL2UuvKmOR8tOTo,278 -wheel-0.29.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -wheel/test/simple.dist/simpledist/__pycache__/__init__.cpython-34.pyc,, -wheel/__pycache__/wininst2wheel.cpython-34.pyc,, -wheel/test/headers.dist/__pycache__/headersdist.cpython-34.pyc,, -wheel/__pycache__/__main__.cpython-34.pyc,, -wheel/test/__pycache__/test_tool.cpython-34.pyc,, -wheel/__pycache__/metadata.cpython-34.pyc,, -wheel/test/complex-dist/__pycache__/setup.cpython-34.pyc,, -wheel/signatures/__pycache__/djbec.cpython-34.pyc,, -wheel/test/__pycache__/__init__.cpython-34.pyc,, -wheel/signatures/__pycache__/keys.cpython-34.pyc,, -wheel/test/__pycache__/test_signatures.cpython-34.pyc,, -wheel/tool/__pycache__/__init__.cpython-34.pyc,, -wheel/test/simple.dist/__pycache__/setup.cpython-34.pyc,, -wheel/test/__pycache__/test_keys.cpython-34.pyc,, -wheel/__pycache__/archive.cpython-34.pyc,, -wheel/test/headers.dist/__pycache__/setup.cpython-34.pyc,, -wheel/test/complex-dist/complexdist/__pycache__/__init__.cpython-34.pyc,, -wheel/__pycache__/pkginfo.cpython-34.pyc,, -wheel/__pycache__/__init__.cpython-34.pyc,, -wheel/__pycache__/bdist_wheel.cpython-34.pyc,, -wheel/signatures/__pycache__/__init__.cpython-34.pyc,, -wheel/__pycache__/util.cpython-34.pyc,, -wheel/test/__pycache__/test_ranking.cpython-34.pyc,, -wheel/test/__pycache__/test_basic.cpython-34.pyc,, -wheel/__pycache__/install.cpython-34.pyc,, -wheel/__pycache__/decorator.cpython-34.pyc,, -wheel/test/__pycache__/test_install.cpython-34.pyc,, -wheel/signatures/__pycache__/ed25519py.cpython-34.pyc,, -wheel/test/__pycache__/test_tagopt.cpython-34.pyc,, -wheel/test/__pycache__/test_wheelfile.cpython-34.pyc,, -wheel/__pycache__/pep425tags.cpython-34.pyc,, -wheel/test/__pycache__/test_paths.cpython-34.pyc,, -wheel/__pycache__/paths.cpython-34.pyc,, -wheel/__pycache__/egg2wheel.cpython-34.pyc,, diff --git a/lib/python3.4/site-packages/wheel-0.29.0.dist-info/WHEEL b/lib/python3.4/site-packages/wheel-0.29.0.dist-info/WHEEL deleted file mode 100644 index 8b6dd1b..0000000 --- a/lib/python3.4/site-packages/wheel-0.29.0.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.29.0) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/lib/python3.4/site-packages/wheel-0.29.0.dist-info/metadata.json b/lib/python3.4/site-packages/wheel-0.29.0.dist-info/metadata.json deleted file mode 100644 index 1a42ef9..0000000 --- a/lib/python3.4/site-packages/wheel-0.29.0.dist-info/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"classifiers": ["Development Status :: 4 - Beta", "Intended Audience :: Developers", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4"], "extensions": {"python.commands": {"wrap_console": {"wheel": "wheel.tool:main"}}, "python.details": {"contacts": [{"email": "dholth@fastmail.fm", "name": "Daniel Holth", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://bitbucket.org/pypa/wheel/"}}, "python.exports": {"console_scripts": {"wheel": "wheel.tool:main"}, "distutils.commands": {"bdist_wheel": "wheel.bdist_wheel:bdist_wheel"}}}, "extras": ["faster-signatures", "signatures", "tool"], "generator": "bdist_wheel (0.29.0)", "keywords": ["wheel", "packaging"], "license": "MIT", "metadata_version": "2.0", "name": "wheel", "run_requires": [{"extra": "faster-signatures", "requires": ["ed25519ll"]}, {"extra": "signatures", "requires": ["keyring", "keyrings.alt"]}, {"environment": "python_version==\"2.6\"", "requires": ["argparse"]}, {"environment": "python_version==\"2.6\"", "extra": "signatures", "requires": ["importlib"]}, {"environment": "sys_platform!=\"win32\"", "extra": "signatures", "requires": ["pyxdg"]}], "summary": "A built-package format for Python.", "version": "0.29.0"} \ No newline at end of file diff --git a/lib/python3.4/site-packages/wheel-0.29.0.dist-info/DESCRIPTION.rst b/lib/python3.4/site-packages/wheel-0.30.0.dist-info/DESCRIPTION.rst similarity index 92% rename from lib/python3.4/site-packages/wheel-0.29.0.dist-info/DESCRIPTION.rst rename to lib/python3.4/site-packages/wheel-0.30.0.dist-info/DESCRIPTION.rst index 07a9baf..9f37cad 100644 --- a/lib/python3.4/site-packages/wheel-0.29.0.dist-info/DESCRIPTION.rst +++ b/lib/python3.4/site-packages/wheel-0.30.0.dist-info/DESCRIPTION.rst @@ -19,7 +19,7 @@ line utility. The wheel documentation is at http://wheel.rtfd.org/. The file format is documented in PEP 427 (http://www.python.org/dev/peps/pep-0427/). -The reference implementation is at https://bitbucket.org/pypa/wheel +The reference implementation is at https://github.com/pypa/wheel Why not egg? ------------ @@ -49,6 +49,21 @@ rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_. .. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ +0.30.0 +====== +- Added py-limited-api {cp32|cp33|cp34|...} flag to produce cpNN.abi3.{arch} + tags on CPython 3. +- Documented the ``license_file`` metadata key +- Improved Python, abi tagging for `wheel convert`. Thanks Ales Erjavec. +- Fixed `>` being prepended to lines starting with "From" in the long description +- Added support for specifying a build number (as per PEP 427). + Thanks Ian Cordasco. +- Made the order of files in generated ZIP files deterministic. + Thanks Matthias Bach. +- Made the order of requirements in metadata deterministic. Thanks Chris Lamb. +- Fixed `wheel install` clobbering existing files +- Improved the error message when trying to verify an unsigned wheel file +- Removed support for Python 2.6, 3.2 and 3.3. 0.29.0 ====== diff --git a/lib/python3.4/site-packages/six-1.10.0.dist-info/INSTALLER b/lib/python3.4/site-packages/wheel-0.30.0.dist-info/INSTALLER similarity index 100% rename from lib/python3.4/site-packages/six-1.10.0.dist-info/INSTALLER rename to lib/python3.4/site-packages/wheel-0.30.0.dist-info/INSTALLER diff --git a/lib/python3.4/site-packages/wheel-0.30.0.dist-info/LICENSE.txt b/lib/python3.4/site-packages/wheel-0.30.0.dist-info/LICENSE.txt new file mode 100644 index 0000000..c3441e6 --- /dev/null +++ b/lib/python3.4/site-packages/wheel-0.30.0.dist-info/LICENSE.txt @@ -0,0 +1,22 @@ +"wheel" copyright (c) 2012-2014 Daniel Holth and +contributors. + +The MIT License + +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. diff --git a/lib/python3.4/site-packages/wheel-0.29.0.dist-info/METADATA b/lib/python3.4/site-packages/wheel-0.30.0.dist-info/METADATA similarity index 88% rename from lib/python3.4/site-packages/wheel-0.29.0.dist-info/METADATA rename to lib/python3.4/site-packages/wheel-0.30.0.dist-info/METADATA index 8962475..52b6411 100644 --- a/lib/python3.4/site-packages/wheel-0.29.0.dist-info/METADATA +++ b/lib/python3.4/site-packages/wheel-0.30.0.dist-info/METADATA @@ -1,33 +1,35 @@ Metadata-Version: 2.0 Name: wheel -Version: 0.29.0 +Version: 0.30.0 Summary: A built-package format for Python. -Home-page: https://bitbucket.org/pypa/wheel/ -Author: Daniel Holth -Author-email: dholth@fastmail.fm +Home-page: https://github.com/pypa/wheel +Author: Alex Grönholm +Author-email: alex.gronholm@nextday.fi License: MIT +Description-Content-Type: UNKNOWN Keywords: wheel,packaging Platform: UNKNOWN -Classifier: Development Status :: 4 - Beta +Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.2 -Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 -Requires-Dist: argparse; python_version=="2.6" +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 Provides-Extra: faster-signatures Requires-Dist: ed25519ll; extra == 'faster-signatures' Provides-Extra: signatures Requires-Dist: keyring; extra == 'signatures' Requires-Dist: keyrings.alt; extra == 'signatures' Provides-Extra: signatures -Requires-Dist: importlib; python_version=="2.6" and extra == 'signatures' -Provides-Extra: signatures Requires-Dist: pyxdg; sys_platform!="win32" and extra == 'signatures' +Provides-Extra: test +Requires-Dist: jsonschema; extra == 'test' +Requires-Dist: pytest (>=3.0.0); extra == 'test' +Requires-Dist: pytest-cov; extra == 'test' Provides-Extra: tool Wheel @@ -51,7 +53,7 @@ line utility. The wheel documentation is at http://wheel.rtfd.org/. The file format is documented in PEP 427 (http://www.python.org/dev/peps/pep-0427/). -The reference implementation is at https://bitbucket.org/pypa/wheel +The reference implementation is at https://github.com/pypa/wheel Why not egg? ------------ @@ -81,6 +83,21 @@ rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_. .. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ +0.30.0 +====== +- Added py-limited-api {cp32|cp33|cp34|...} flag to produce cpNN.abi3.{arch} + tags on CPython 3. +- Documented the ``license_file`` metadata key +- Improved Python, abi tagging for `wheel convert`. Thanks Ales Erjavec. +- Fixed `>` being prepended to lines starting with "From" in the long description +- Added support for specifying a build number (as per PEP 427). + Thanks Ian Cordasco. +- Made the order of files in generated ZIP files deterministic. + Thanks Matthias Bach. +- Made the order of requirements in metadata deterministic. Thanks Chris Lamb. +- Fixed `wheel install` clobbering existing files +- Improved the error message when trying to verify an unsigned wheel file +- Removed support for Python 2.6, 3.2 and 3.3. 0.29.0 ====== diff --git a/lib/python3.4/site-packages/wheel-0.30.0.dist-info/RECORD b/lib/python3.4/site-packages/wheel-0.30.0.dist-info/RECORD new file mode 100644 index 0000000..291a54b --- /dev/null +++ b/lib/python3.4/site-packages/wheel-0.30.0.dist-info/RECORD @@ -0,0 +1,46 @@ +wheel/__init__.py,sha256=ja92NKda3sstt4uKroYgFATu736whcI33p3GJNdslLQ,96 +wheel/__main__.py,sha256=K--m7mq-27NO0fm-a8KlthkucCe0w_-0hVxL3uDujkU,419 +wheel/archive.py,sha256=oEv42UnpxkoFMKcLXQ9RD8a8oic4X3oe2_H5FAgJ7_M,2376 +wheel/bdist_wheel.py,sha256=qKWdyvpkdmuLB4_GGIZsjmlcMLZuZDd8tRvaQI0w_eo,18852 +wheel/decorator.py,sha256=U2K77ZZ8x3x5vSIGCcEeh8GAxB6rABB7AlDwRukaoCk,541 +wheel/egg2wheel.py,sha256=me4Iaz4idCvS-xjfAzfb2dXXlXx_w6AgLjH6hi1Bt1A,3043 +wheel/install.py,sha256=zYQ-A8uQi-R2PwMvOh64YMlQDplqYpcBVM0EmbxZu8Y,18417 +wheel/metadata.py,sha256=SzI1MtzITZJuAJuvUVzEWi60VhgDbXSV_hapyiX0rlw,11561 +wheel/paths.py,sha256=OAtaJgCivlKvJKw1qC3YbJypvp2d38Eka8GQWdBWNZw,1129 +wheel/pep425tags.py,sha256=Lk9zYm1rrHG1X3RKlf9plcwpsoSZT8UR7fG3jhaoZrQ,5760 +wheel/pkginfo.py,sha256=GR76kupQzn1x9sKDaXuE6B6FsZ4OkfRtG7pndlXPvQ4,1257 +wheel/util.py,sha256=eJB-mrhMAaCGcoKhTLDYdpCf5N8BMLtX4usW_7qeZBg,4732 +wheel/wininst2wheel.py,sha256=afPAHWwa7FY0IkpG-BuuuY-dlB93VmFPrXff511NkBk,7772 +wheel/signatures/__init__.py,sha256=O7kZICZvXxN5YRkCYrPmAEr1LpGaZKJh5sLPWIRIoYE,3766 +wheel/signatures/djbec.py,sha256=jnfWxdS7dwLjiO6n0hy-4jLa_71SPrKWL0-7ocDrSHc,7035 +wheel/signatures/ed25519py.py,sha256=nFKDMq4LW2iJKk4IZKMxY46GyZNYPKxuWha9xYHk9lE,1669 +wheel/signatures/keys.py,sha256=k4j4yGZL31Dt2pa5TneIEeq6qkVIXEPExmFxiZxpE1Y,3299 +wheel/tool/__init__.py,sha256=rOy5VFvj-gTKgMwi_u2_iNu_Pq6aqw4rEfaciDTbmwg,13421 +wheel-0.30.0.dist-info/DESCRIPTION.rst,sha256=Alb3Ol--LhPgmWuBBPfzu54xzQ8J2skWNV34XCjhe0k,10549 +wheel-0.30.0.dist-info/LICENSE.txt,sha256=zKniDGrx_Pv2lAjzd3aShsvuvN7TNhAMm0o_NfvmNeQ,1125 +wheel-0.30.0.dist-info/METADATA,sha256=fYLxr6baQD-wDn4Yu8t-8fF7PJuiBTcThsl2UKBE7kg,11815 +wheel-0.30.0.dist-info/RECORD,, +wheel-0.30.0.dist-info/WHEEL,sha256=kdsN-5OJAZIiHN-iO4Rhl82KyS0bDWf4uBwMbkNafr8,110 +wheel-0.30.0.dist-info/entry_points.txt,sha256=pTyeGVsucyfr_BXe5OQKuA1Bp5YKaIAWy5pejkq4Qx0,109 +wheel-0.30.0.dist-info/metadata.json,sha256=neXQocJnVqPTjr4zpuOVdxBGCmjrTsOs76AvP8ngyJY,1522 +wheel-0.30.0.dist-info/top_level.txt,sha256=HxSBIbgEstMPe4eFawhA66Mq-QYHMopXVoAncfjb_1c,6 +../../../bin/wheel,sha256=sjtPVJ0ZS5WdGK7UXcnQrN6MG_czYyrsndkMrC0qluw,279 +wheel-0.30.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +wheel/signatures/__pycache__/__init__.cpython-34.pyc,, +wheel/__pycache__/decorator.cpython-34.pyc,, +wheel/__pycache__/__main__.cpython-34.pyc,, +wheel/signatures/__pycache__/ed25519py.cpython-34.pyc,, +wheel/__pycache__/util.cpython-34.pyc,, +wheel/__pycache__/wininst2wheel.cpython-34.pyc,, +wheel/__pycache__/pkginfo.cpython-34.pyc,, +wheel/__pycache__/__init__.cpython-34.pyc,, +wheel/signatures/__pycache__/djbec.cpython-34.pyc,, +wheel/__pycache__/metadata.cpython-34.pyc,, +wheel/__pycache__/egg2wheel.cpython-34.pyc,, +wheel/signatures/__pycache__/keys.cpython-34.pyc,, +wheel/__pycache__/archive.cpython-34.pyc,, +wheel/__pycache__/bdist_wheel.cpython-34.pyc,, +wheel/tool/__pycache__/__init__.cpython-34.pyc,, +wheel/__pycache__/install.cpython-34.pyc,, +wheel/__pycache__/pep425tags.cpython-34.pyc,, +wheel/__pycache__/paths.cpython-34.pyc,, diff --git a/lib/python3.4/site-packages/six-1.10.0.dist-info/WHEEL b/lib/python3.4/site-packages/wheel-0.30.0.dist-info/WHEEL similarity index 70% rename from lib/python3.4/site-packages/six-1.10.0.dist-info/WHEEL rename to lib/python3.4/site-packages/wheel-0.30.0.dist-info/WHEEL index 0de529b..7332a41 100644 --- a/lib/python3.4/site-packages/six-1.10.0.dist-info/WHEEL +++ b/lib/python3.4/site-packages/wheel-0.30.0.dist-info/WHEEL @@ -1,5 +1,5 @@ Wheel-Version: 1.0 -Generator: bdist_wheel (0.26.0) +Generator: bdist_wheel (0.30.0) Root-Is-Purelib: true Tag: py2-none-any Tag: py3-none-any diff --git a/lib/python3.4/site-packages/wheel-0.29.0.dist-info/entry_points.txt b/lib/python3.4/site-packages/wheel-0.30.0.dist-info/entry_points.txt similarity index 58% rename from lib/python3.4/site-packages/wheel-0.29.0.dist-info/entry_points.txt rename to lib/python3.4/site-packages/wheel-0.30.0.dist-info/entry_points.txt index f57b8c0..4ad253e 100644 --- a/lib/python3.4/site-packages/wheel-0.29.0.dist-info/entry_points.txt +++ b/lib/python3.4/site-packages/wheel-0.30.0.dist-info/entry_points.txt @@ -2,4 +2,5 @@ wheel = wheel.tool:main [distutils.commands] -bdist_wheel = wheel.bdist_wheel:bdist_wheel \ No newline at end of file +bdist_wheel = wheel.bdist_wheel:bdist_wheel + diff --git a/lib/python3.4/site-packages/wheel-0.30.0.dist-info/metadata.json b/lib/python3.4/site-packages/wheel-0.30.0.dist-info/metadata.json new file mode 100644 index 0000000..709ccac --- /dev/null +++ b/lib/python3.4/site-packages/wheel-0.30.0.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6"], "description_content_type": "UNKNOWN", "extensions": {"python.commands": {"wrap_console": {"wheel": "wheel.tool:main"}}, "python.details": {"contacts": [{"email": "alex.gronholm@nextday.fi", "name": "Alex Gr\u00f6nholm", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "https://github.com/pypa/wheel"}}, "python.exports": {"console_scripts": {"wheel": "wheel.tool:main"}, "distutils.commands": {"bdist_wheel": "wheel.bdist_wheel:bdist_wheel"}}}, "extras": ["faster-signatures", "signatures", "test", "tool"], "generator": "bdist_wheel (0.30.0)", "keywords": ["wheel", "packaging"], "license": "MIT", "metadata_version": "2.0", "name": "wheel", "run_requires": [{"extra": "faster-signatures", "requires": ["ed25519ll"]}, {"extra": "test", "requires": ["jsonschema", "pytest (>=3.0.0)", "pytest-cov"]}, {"extra": "signatures", "requires": ["keyring", "keyrings.alt"]}, {"environment": "sys_platform!=\"win32\"", "extra": "signatures", "requires": ["pyxdg"]}], "summary": "A built-package format for Python.", "version": "0.30.0"} \ No newline at end of file diff --git a/lib/python3.4/site-packages/wheel-0.29.0.dist-info/top_level.txt b/lib/python3.4/site-packages/wheel-0.30.0.dist-info/top_level.txt similarity index 100% rename from lib/python3.4/site-packages/wheel-0.29.0.dist-info/top_level.txt rename to lib/python3.4/site-packages/wheel-0.30.0.dist-info/top_level.txt diff --git a/lib/python3.4/site-packages/wheel/__init__.py b/lib/python3.4/site-packages/wheel/__init__.py index be2453a..64cd668 100644 --- a/lib/python3.4/site-packages/wheel/__init__.py +++ b/lib/python3.4/site-packages/wheel/__init__.py @@ -1,2 +1,2 @@ # __variables__ with double-quoted values will be available in setup.py: -__version__ = "0.29.0" +__version__ = "0.30.0" diff --git a/lib/python3.4/site-packages/wheel/__main__.py b/lib/python3.4/site-packages/wheel/__main__.py index 889359c..8f0c4fe 100644 --- a/lib/python3.4/site-packages/wheel/__main__.py +++ b/lib/python3.4/site-packages/wheel/__main__.py @@ -4,7 +4,8 @@ Wheel command line tool (enable python -m wheel syntax) import sys -def main(): # needed for console script + +def main(): # needed for console script if __package__ == '': # To be able to run 'python wheel-0.9.whl/wheel': import os.path @@ -13,5 +14,6 @@ def main(): # needed for console script import wheel.tool sys.exit(wheel.tool.main()) + if __name__ == "__main__": sys.exit(main()) diff --git a/lib/python3.4/site-packages/wheel/archive.py b/lib/python3.4/site-packages/wheel/archive.py index f928e6a..5b1647a 100644 --- a/lib/python3.4/site-packages/wheel/archive.py +++ b/lib/python3.4/site-packages/wheel/archive.py @@ -3,18 +3,16 @@ Archive tools for wheel. """ import os -import time -import logging import os.path +import time import zipfile - -log = logging.getLogger("wheel") +from distutils import log def archive_wheelfile(base_name, base_dir): - '''Archive all files under `base_dir` in a whl file and name it like + """Archive all files under `base_dir` in a whl file and name it like `base_name`. - ''' + """ olddir = os.path.abspath(os.curdir) base_name = os.path.abspath(base_name) try: @@ -43,8 +41,7 @@ def make_wheelfile_inner(base_name, base_dir='.'): date_time = time.gmtime(int(timestamp))[0:6] # XXX support bz2, xz when available - zip = zipfile.ZipFile(open(zip_filename, "wb+"), "w", - compression=zipfile.ZIP_DEFLATED) + zip = zipfile.ZipFile(zip_filename, "w", compression=zipfile.ZIP_DEFLATED) score = {'WHEEL': 1, 'METADATA': 2, 'RECORD': 3} deferred = [] @@ -62,7 +59,10 @@ def make_wheelfile_inner(base_name, base_dir='.'): log.info("adding '%s'" % path) for dirpath, dirnames, filenames in os.walk(base_dir): - for name in filenames: + # Sort the directory names so that `os.walk` will walk them in a + # defined order on the next iteration. + dirnames.sort() + for name in sorted(filenames): path = os.path.normpath(os.path.join(dirpath, name)) if os.path.isfile(path): diff --git a/lib/python3.4/site-packages/wheel/bdist_wheel.py b/lib/python3.4/site-packages/wheel/bdist_wheel.py index 90db748..7fbeb4b 100644 --- a/lib/python3.4/site-packages/wheel/bdist_wheel.py +++ b/lib/python3.4/site-packages/wheel/bdist_wheel.py @@ -11,41 +11,39 @@ import subprocess import warnings import shutil import json -import wheel - -try: - import sysconfig -except ImportError: # pragma nocover - # Python < 2.7 - import distutils.sysconfig as sysconfig +import sys +import re +from email.generator import Generator +from distutils.core import Command +from distutils.sysconfig import get_python_version +from distutils import log as logger +from shutil import rmtree import pkg_resources -safe_name = pkg_resources.safe_name -safe_version = pkg_resources.safe_version - -from shutil import rmtree -from email.generator import Generator - -from distutils.util import get_platform -from distutils.core import Command -from distutils.sysconfig import get_python_version - -from distutils import log as logger - -from .pep425tags import get_abbr_impl, get_impl_ver, get_abi_tag +from .pep425tags import get_abbr_impl, get_impl_ver, get_abi_tag, get_platform from .util import native, open_for_csv from .archive import archive_wheelfile from .pkginfo import read_pkg_info, write_pkg_info from .metadata import pkginfo_to_dict from . import pep425tags, metadata +from . import __version__ as wheel_version + + +safe_name = pkg_resources.safe_name +safe_version = pkg_resources.safe_version + +PY_LIMITED_API_PATTERN = r'cp3\d' + def safer_name(name): return safe_name(name).replace('-', '_') + def safer_version(version): return safe_version(version).replace('-', '_') + class bdist_wheel(Command): description = 'create a wheel distribution' @@ -77,6 +75,13 @@ class bdist_wheel(Command): ('python-tag=', None, "Python implementation compatibility tag" " (default: py%s)" % get_impl_ver()[0]), + ('build-number=', None, + "Build number for this particular version. " + "As specified in PEP-0427, this must start with a digit. " + "[default: None]"), + ('py-limited-api=', None, + "Python tag (cp32|cp33|cpNN) for abi3 wheel tag" + " (default: false)"), ] boolean_options = ['keep-temp', 'skip-build', 'relative', 'universal'] @@ -98,6 +103,8 @@ class bdist_wheel(Command): self.group = None self.universal = False self.python_tag = 'py' + get_impl_ver()[0] + self.build_number = None + self.py_limited_api = False self.plat_name_supplied = False def finalize_options(self): @@ -116,6 +123,9 @@ class bdist_wheel(Command): self.root_is_pure = not (self.distribution.has_ext_modules() or self.distribution.has_c_libraries()) + if self.py_limited_api and not re.match(PY_LIMITED_API_PATTERN, self.py_limited_api): + raise ValueError("py-limited-api must match '%s'" % PY_LIMITED_API_PATTERN) + # Support legacy [wheel] section for setting universal wheel = self.distribution.get_option_dict('wheel') if 'universal' in wheel: @@ -124,11 +134,17 @@ class bdist_wheel(Command): if val.lower() in ('1', 'true', 'yes'): self.universal = True + if self.build_number is not None and not self.build_number[:1].isdigit(): + raise ValueError("Build tag (build-number) must start with a digit.") + @property def wheel_dist_name(self): """Return distribution full name with - replaced with _""" - return '-'.join((safer_name(self.distribution.get_name()), - safer_version(self.distribution.get_version()))) + components = (safer_name(self.distribution.get_name()), + safer_version(self.distribution.get_version())) + if self.build_number: + components += (self.build_number,) + return '-'.join(components) def get_tag(self): # bdist sets self.plat_name if unset, we should only use it for purepy @@ -139,6 +155,8 @@ class bdist_wheel(Command): plat_name = 'any' else: plat_name = self.plat_name or get_platform() + if plat_name in ('linux-x86_64', 'linux_x86_64') and sys.maxsize == 2147483647: + plat_name = 'linux_i686' plat_name = plat_name.replace('-', '_').replace('.', '_') if self.root_is_pure: @@ -150,13 +168,20 @@ class bdist_wheel(Command): else: impl_name = get_abbr_impl() impl_ver = get_impl_ver() - # PEP 3149 - abi_tag = str(get_abi_tag()).lower() - tag = (impl_name + impl_ver, abi_tag, plat_name) + impl = impl_name + impl_ver + # We don't work on CPython 3.1, 3.0. + if self.py_limited_api and (impl_name + impl_ver).startswith('cp3'): + impl = self.py_limited_api + abi_tag = 'abi3' + else: + abi_tag = str(get_abi_tag()).lower() + tag = (impl, abi_tag, plat_name) supported_tags = pep425tags.get_supported( supplied_platform=plat_name if self.plat_name_supplied else None) # XXX switch to this alternate implementation for non-pure: - assert tag == supported_tags[0] + if not self.py_limited_api: + assert tag == supported_tags[0], "%s != %s" % (tag, supported_tags[0]) + assert tag in supported_tags, "would build wheel with unsupported tag {}".format(tag) return tag def get_archive_basename(self): @@ -254,12 +279,14 @@ class bdist_wheel(Command): else: rmtree(self.bdist_dir) - def write_wheelfile(self, wheelfile_base, generator='bdist_wheel (' + wheel.__version__ + ')'): + def write_wheelfile(self, wheelfile_base, generator='bdist_wheel (' + wheel_version + ')'): from email.message import Message msg = Message() msg['Wheel-Version'] = '1.0' # of the spec msg['Generator'] = generator msg['Root-Is-Purelib'] = str(self.root_is_pure).lower() + if self.build_number is not None: + msg['Build'] = self.build_number # Doesn't work for bdist_wininst impl_tag, abi_tag, plat_tag = self.get_tag() @@ -286,7 +313,7 @@ class bdist_wheel(Command): def license_file(self): """Return license filename from a license-file key in setup.cfg, or None.""" metadata = self.distribution.get_option_dict('metadata') - if not 'license_file' in metadata: + if 'license_file' not in metadata: return None return metadata['license_file'][1] @@ -315,7 +342,7 @@ class bdist_wheel(Command): # our .ini parser folds - to _ in key names: for key, title in (('provides_extra', 'Provides-Extra'), ('requires_dist', 'Requires-Dist')): - if not key in metadata: + if key not in metadata: continue field = metadata[key] for line in field[1].splitlines(): @@ -327,7 +354,9 @@ class bdist_wheel(Command): def add_requirements(self, metadata_path): """Add additional requirements from setup.cfg to file metadata_path""" additional = list(self.setupcfg_requirements()) - if not additional: return + if not additional: + return + pkg_info = read_pkg_info(metadata_path) if 'Provides-Extra' in pkg_info or 'Requires-Dist' in pkg_info: warnings.warn('setup.cfg requirements overwrite values from setup.py') @@ -375,10 +404,9 @@ class bdist_wheel(Command): # ignore common egg metadata that is useless to wheel shutil.copytree(egginfo_path, distinfo_path, - ignore=lambda x, y: set(('PKG-INFO', - 'requires.txt', - 'SOURCES.txt', - 'not-zip-safe',))) + ignore=lambda x, y: {'PKG-INFO', 'requires.txt', 'SOURCES.txt', + 'not-zip-safe'} + ) # delete dependency_links if it is only whitespace dependency_links_path = os.path.join(distinfo_path, 'dependency_links.txt') @@ -405,7 +433,8 @@ class bdist_wheel(Command): description_filename) with open(description_path, "wb") as description_file: description_file.write(description_text.encode('utf-8')) - pymeta['extensions']['python.details']['document_names']['description'] = description_filename + pymeta['extensions']['python.details']['document_names']['description'] = \ + description_filename # XXX heuristically copy any LICENSE/LICENSE.txt? license = self.license_file() @@ -420,7 +449,7 @@ class bdist_wheel(Command): adios(egginfo_path) def write_record(self, bdist_dir, distinfo_dir): - from wheel.util import urlsafe_b64encode + from .util import urlsafe_b64encode record_path = os.path.join(distinfo_dir, 'RECORD') record_relpath = os.path.relpath(record_path, bdist_dir) diff --git a/lib/python3.4/site-packages/wheel/egg2wheel.py b/lib/python3.4/site-packages/wheel/egg2wheel.py index bf919c4..3799909 100644 --- a/lib/python3.4/site-packages/wheel/egg2wheel.py +++ b/lib/python3.4/site-packages/wheel/egg2wheel.py @@ -1,19 +1,22 @@ #!/usr/bin/env python +import distutils.dist import os.path import re +import shutil import sys import tempfile import zipfile -import wheel.bdist_wheel -import shutil -import distutils.dist -from distutils.archive_util import make_archive from argparse import ArgumentParser +from distutils.archive_util import make_archive from glob import iglob +import wheel.bdist_wheel +from wheel.wininst2wheel import _bdist_wheel_tag + egg_info_re = re.compile(r'''(?P.+?)-(?P.+?) (-(?P.+?))?(-(?P.+?))?.egg''', re.VERBOSE) + def egg2wheel(egg_path, dest_dir): egg_info = egg_info_re.match(os.path.basename(egg_path)).groupdict() dir = tempfile.mkdtemp(suffix="_e2w") @@ -43,8 +46,20 @@ def egg2wheel(egg_path, dest_dir): abi, arch )) - bw = wheel.bdist_wheel.bdist_wheel(distutils.dist.Distribution()) - bw.root_is_purelib = egg_info['arch'] is None + root_is_purelib = egg_info['arch'] is None + if root_is_purelib: + bw = wheel.bdist_wheel.bdist_wheel(distutils.dist.Distribution()) + else: + bw = _bdist_wheel_tag(distutils.dist.Distribution()) + + bw.root_is_pure = root_is_purelib + bw.python_tag = pyver + bw.plat_name_supplied = True + bw.plat_name = egg_info['arch'] or 'any' + if not root_is_purelib: + bw.full_tag_supplied = True + bw.full_tag = (pyver, abi, arch) + dist_info_dir = os.path.join(dir, '%s.dist-info' % dist_info) bw.egg2dist(os.path.join(dir, 'EGG-INFO'), dist_info_dir) @@ -54,11 +69,12 @@ def egg2wheel(egg_path, dest_dir): os.rename(filename, filename[:-3] + 'whl') shutil.rmtree(dir) + def main(): parser = ArgumentParser() parser.add_argument('eggs', nargs='*', help="Eggs to convert") parser.add_argument('--dest-dir', '-d', default=os.path.curdir, - help="Directory to store wheels (default %(default)s)") + help="Directory to store wheels (default %(default)s)") parser.add_argument('--verbose', '-v', action='store_true') args = parser.parse_args() for pat in args.eggs: @@ -69,5 +85,6 @@ def main(): if args.verbose: sys.stdout.write("OK\n") + if __name__ == "__main__": main() diff --git a/lib/python3.4/site-packages/wheel/eggnames.txt b/lib/python3.4/site-packages/wheel/eggnames.txt deleted file mode 100644 index d422120..0000000 --- a/lib/python3.4/site-packages/wheel/eggnames.txt +++ /dev/null @@ -1,87 +0,0 @@ -vcard-0.7.8-py2.7.egg -qtalchemy-0.7.1-py2.7.egg -AMQPDeliver-0.1-py2.7.egg -infi.registry-0.1.1-py2.7.egg -infi.instruct-0.5.5-py2.7.egg -infi.devicemanager-0.1.2-py2.7.egg -TracTixSummary-1.0-py2.7.egg -ToscaWidgets-0.9.12-py2.7.egg -archipel_agent_iphone_notification-0.5.0beta-py2.7.egg -archipel_agent_action_scheduler-0.5.0beta-py2.7.egg -ao.social-1.0.2-py2.7.egg -apgl-0.7-py2.7.egg -satchmo_payment_payworld-0.1.1-py2.7.egg -snmpsim-0.1.3-py2.7.egg -sshim-0.2-py2.7.egg -shove-0.3.4-py2.7.egg -simpleavro-0.3.0-py2.7.egg -wkhtmltopdf-0.2-py2.7.egg -wokkel-0.7.0-py2.7.egg -jmbo_social-0.0.6-py2.7.egg -jmbo_post-0.0.6-py2.7.egg -jcrack-0.0.2-py2.7.egg -riak-1.4.0-py2.7.egg -restclient-0.10.2-py2.7.egg -Sutekh-0.8.1-py2.7.egg -trayify-0.0.1-py2.7.egg -tweepy-1.9-py2.7.egg -topzootools-0.2.1-py2.7.egg -haystack-0.16-py2.7.egg -zope.interface-4.0.1-py2.7-win32.egg -neuroshare-0.8.5-py2.7-macosx-10.7-intel.egg -ndg_httpsclient-0.2.0-py2.7.egg -libtele-0.3-py2.7.egg -litex.cxpool-1.0.2-py2.7.egg -obspy.iris-0.5.1-py2.7.egg -obspy.mseed-0.6.1-py2.7-win32.egg -obspy.core-0.6.2-py2.7.egg -CorePost-0.0.3-py2.7.egg -fnordstalk-0.0.3-py2.7.egg -Persistence-2.13.2-py2.7-win32.egg -Pydap-3.1.RC1-py2.7.egg -PyExecJS-1.0.4-py2.7.egg -Wally-0.7.2-py2.7.egg -ExtensionClass-4.0a1-py2.7-win32.egg -Feedjack-0.9.16-py2.7.egg -Mars24-0.3.9-py2.7.egg -HalWeb-0.6.0-py2.7.egg -DARE-0.7.140-py2.7.egg -macholib-1.3-py2.7.egg -marrow.wsgi.egress.compression-1.1-py2.7.egg -mcs-0.3.7-py2.7.egg -Kook-0.6.0-py2.7.egg -er-0.1-py2.7.egg -evasion_director-1.1.4-py2.7.egg -djquery-0.1a-py2.7.egg -django_factory-0.7-py2.7.egg -django_gizmo-0.0.3-py2.7.egg -django_category-0.1-py2.7.egg -dbwrap-0.3.2-py2.7.egg -django_supergeneric-1.0-py2.7.egg -django_dynamo-0.25-py2.7.egg -django_acollabauth-0.1-py2.7.egg -django_qrlink-0.1.0-py2.7.egg -django_addons-0.6.6-py2.7.egg -cover_grabber-1.1.2-py2.7.egg -chem-1.1-py2.7.egg -crud-0.1-py2.7.egg -bongo-0.1-py2.7.egg -bytecodehacks-April2000-py2.7.egg -greenlet-0.3.4-py2.7-win32.egg -ginvoke-0.3.1-py2.7.egg -pyobjc_framework_ScriptingBridge-2.3-py2.7.egg -pecan-0.2.0a-py2.7.egg -pyress-0.2.0-py2.7.egg -pyobjc_framework_PubSub-2.3-py2.7.egg -pyobjc_framework_ExceptionHandling-2.3-py2.7.egg -pywps-trunk-py2.7.egg -pyobjc_framework_CFNetwork-2.3-py2.7-macosx-10.6-fat.egg -py.saunter-0.40-py2.7.egg -pyfnordmetric-0.0.1-py2.7.egg -pyws-1.1.1-py2.7.egg -prestapyt-0.4.0-py2.7.egg -passlib-1.5.3-py2.7.egg -pyga-2.1-py2.7.egg -pygithub3-0.3-py2.7.egg -pyobjc_framework_OpenDirectory-2.3-py2.7.egg -yaposib-0.2.75-py2.7-linux-x86_64.egg diff --git a/lib/python3.4/site-packages/wheel/install.py b/lib/python3.4/site-packages/wheel/install.py index 3af6d0c..5a88a75 100644 --- a/lib/python3.4/site-packages/wheel/install.py +++ b/lib/python3.4/site-packages/wheel/install.py @@ -1,33 +1,31 @@ """ -Operations on existing wheel files, including basic installation. +Operations on existing wheel files, including basic installation. """ # XXX see patched pip to install -import sys -import warnings +import csv +import hashlib import os.path import re -import zipfile -import hashlib -import csv - import shutil +import sys +import warnings +import zipfile + +from . import signatures +from .decorator import reify +from .paths import get_install_paths +from .pep425tags import get_supported +from .pkginfo import read_pkg_info_bytes +from .util import ( + urlsafe_b64encode, from_json, urlsafe_b64decode, native, binary, HashingFile, + open_for_csv) try: _big_number = sys.maxsize except NameError: _big_number = sys.maxint -from wheel.decorator import reify -from wheel.util import (urlsafe_b64encode, from_json, urlsafe_b64decode, - native, binary, HashingFile) -from wheel import signatures -from wheel.pkginfo import read_pkg_info_bytes -from wheel.util import open_for_csv - -from .pep425tags import get_supported -from .paths import get_install_paths - # The next major version after this version of the 'wheel' tool: VERSION_TOO_HIGH = (1, 0) @@ -39,6 +37,7 @@ WHEEL_INFO_RE = re.compile( \.whl|\.dist-info)$""", re.VERBOSE).match + def parse_version(version): """Use parse_version from pkg_resources or distutils as available.""" global parse_version @@ -48,6 +47,7 @@ def parse_version(version): from distutils.version import LooseVersion as parse_version return parse_version(version) + class BadWheelFile(ValueError): pass @@ -55,7 +55,7 @@ class BadWheelFile(ValueError): class WheelFile(object): """Parse wheel-specific attributes from a wheel (.whl) file and offer basic installation and verification support. - + WheelFile can be used to simply parse a wheel filename by avoiding the methods that require the actual file contents.""" @@ -201,11 +201,11 @@ class WheelFile(object): raise TypeError("{0}.context != {1}.context".format(self, other)) sc = self.rank oc = other.rank - if sc != None and oc != None and sc != oc: + if sc is not None and oc is not None and sc != oc: # Smaller compatibility ranks are "better" than larger ones, # so we have to reverse the sense of the comparison here! return sc > oc - elif sc == None and oc != None: + elif sc is None and oc is not None: return False return self.filename < other.filename @@ -247,10 +247,10 @@ class WheelFile(object): """ Consult distutils to get the install paths for our dist. A dict with ('purelib', 'platlib', 'headers', 'scripts', 'data'). - + We use the name from our filename as the dist name, which means headers could be installed in the wrong place if the filesystem-escaped name - is different than the Name. Who cares? + is different than the Name. Who cares? """ name = self.parsed_filename.group('name') return get_install_paths(name) @@ -323,7 +323,9 @@ class WheelFile(object): k = info.filename key, target, filename, dest = v if os.path.exists(dest): - raise ValueError("Wheel file {0} would overwrite {1}. Use force if this is intended".format(k, dest)) + raise ValueError( + "Wheel file {0} would overwrite {1}. Use force if this is intended".format( + k, dest)) # Get the name of our executable, for use when replacing script # wrapper hashbang lines. @@ -342,13 +344,24 @@ class WheelFile(object): ddir = os.path.dirname(dest) if not os.path.isdir(ddir): os.makedirs(ddir) - destination = HashingFile(open(dest, 'wb')) - if key == 'scripts': - hashbang = source.readline() - if hashbang.startswith(b'#!python'): - hashbang = b'#!' + exename + binary(os.linesep) - destination.write(hashbang) - shutil.copyfileobj(source, destination) + + temp_filename = dest + '.part' + try: + with HashingFile(temp_filename, 'wb') as destination: + if key == 'scripts': + hashbang = source.readline() + if hashbang.startswith(b'#!python'): + hashbang = b'#!' + exename + binary(os.linesep) + destination.write(hashbang) + + shutil.copyfileobj(source, destination) + except: + if os.path.exists(temp_filename): + os.unlink(temp_filename) + + raise + + os.rename(temp_filename, dest) reldest = os.path.relpath(dest, root) reldest.replace(os.sep, '/') record_data.append((reldest, destination.digest(), destination.length)) @@ -360,15 +373,16 @@ class WheelFile(object): os.chmod(dest, info.external_attr >> 16) record_name = os.path.join(root, self.record_name) - writer = csv.writer(open_for_csv(record_name, 'w+')) - for reldest, digest, length in sorted(record_data): - writer.writerow((reldest, digest, length)) - writer.writerow((self.record_name, '', '')) + with open_for_csv(record_name, 'w+') as record_file: + writer = csv.writer(record_file) + for reldest, digest, length in sorted(record_data): + writer.writerow((reldest, digest, length)) + writer.writerow((self.record_name, '', '')) def verify(self, zipfile=None): - """Configure the VerifyingZipFile `zipfile` by verifying its signature + """Configure the VerifyingZipFile `zipfile` by verifying its signature and setting expected hashes for every hash in RECORD. - Caller must complete the verification process by completely reading + Caller must complete the verification process by completely reading every file in the archive (e.g. with extractall).""" sig = None if zipfile is None: @@ -412,7 +426,7 @@ class WheelFile(object): class VerifyingZipFile(zipfile.ZipFile): """ZipFile that can assert that each of its extracted contents matches - an expected sha256 hash. Note that each file must be completly read in + an expected sha256 hash. Note that each file must be completly read in order for its hash to be checked.""" def __init__(self, file, mode="r", @@ -439,8 +453,8 @@ class VerifyingZipFile(zipfile.ZipFile): name = name_or_info.filename else: name = name_or_info - if (name in self._expected_hashes - and self._expected_hashes[name] != None): + + if name in self._expected_hashes and self._expected_hashes[name] is not None: expected_hash = self._expected_hashes[name] try: _update_crc_orig = ef._update_crc diff --git a/lib/python3.4/site-packages/wheel/metadata.py b/lib/python3.4/site-packages/wheel/metadata.py index b3cc65c..29638e7 100644 --- a/lib/python3.4/site-packages/wheel/metadata.py +++ b/lib/python3.4/site-packages/wheel/metadata.py @@ -2,37 +2,33 @@ Tools for converting old- to new-style metadata. """ -from collections import namedtuple +import email.parser +import os.path +import re +import textwrap +from collections import namedtuple, OrderedDict + +import pkg_resources + +from . import __version__ as wheel_version from .pkginfo import read_pkg_info from .util import OrderedDefaultDict -try: - from collections import OrderedDict -except ImportError: - OrderedDict = dict - -import re -import os.path -import textwrap -import pkg_resources -import email.parser -import wheel METADATA_VERSION = "2.0" -PLURAL_FIELDS = { "classifier" : "classifiers", - "provides_dist" : "provides", - "provides_extra" : "extras" } +PLURAL_FIELDS = {"classifier": "classifiers", + "provides_dist": "provides", + "provides_extra": "extras"} SKIP_FIELDS = set() -CONTACT_FIELDS = (({"email":"author_email", "name": "author"}, - "author"), - ({"email":"maintainer_email", "name": "maintainer"}, - "maintainer")) +CONTACT_FIELDS = (({"email": "author_email", "name": "author"}, + "author"), + ({"email": "maintainer_email", "name": "maintainer"}, + "maintainer")) # commonly filled out as "UNKNOWN" by distutils: -UNKNOWN_FIELDS = set(("author", "author_email", "platform", "home_page", - "license")) +UNKNOWN_FIELDS = {"author", "author_email", "platform", "home_page", "license"} # Wheel itself is probably the only program that uses non-extras markers # in METADATA/PKG-INFO. Support its syntax with the extra at the end only. @@ -41,13 +37,14 @@ KEYWORDS_RE = re.compile("[\0-,]+") MayRequiresKey = namedtuple('MayRequiresKey', ('condition', 'extra')) + def unique(iterable): """ Yield unique values in iterable, preserving order. """ seen = set() for value in iterable: - if not value in seen: + if value not in seen: seen.add(value) yield value @@ -74,6 +71,7 @@ def handle_requires(metadata, pkg_info, key): if may_requires: metadata['run_requires'] = [] + def sort_key(item): # Both condition and extra could be None, which can't be compared # against strings in Python 3. @@ -81,6 +79,7 @@ def handle_requires(metadata, pkg_info, key): if key.condition is None: return '' return key.condition + for key, value in sorted(may_requires.items(), key=sort_key): may_requirement = OrderedDict((('requires', value),)) if key.extra: @@ -89,7 +88,7 @@ def handle_requires(metadata, pkg_info, key): may_requirement['environment'] = key.condition metadata['run_requires'].append(may_requirement) - if not 'extras' in metadata: + if 'extras' not in metadata: metadata['extras'] = [] metadata['extras'].extend([key.extra for key in may_requires.keys() if key.extra]) @@ -105,13 +104,15 @@ def pkginfo_to_dict(path, distribution=None): distribution: optional distutils Distribution() """ - metadata = OrderedDefaultDict(lambda: OrderedDefaultDict(lambda: OrderedDefaultDict(OrderedDict))) - metadata["generator"] = "bdist_wheel (" + wheel.__version__ + ")" + metadata = OrderedDefaultDict( + lambda: OrderedDefaultDict(lambda: OrderedDefaultDict(OrderedDict))) + metadata["generator"] = "bdist_wheel (" + wheel_version + ")" try: unicode pkg_info = read_pkg_info(path) except NameError: - pkg_info = email.parser.Parser().parsestr(open(path, 'rb').read().decode('utf-8')) + with open(path, 'rb') as pkg_info_file: + pkg_info = email.parser.Parser().parsestr(pkg_info_file.read().decode('utf-8')) description = None if pkg_info['Summary']: @@ -149,12 +150,12 @@ def pkginfo_to_dict(path, distribution=None): handle_requires(metadata, pkg_info, key) elif low_key == 'provides_extra': - if not 'extras' in metadata: + if 'extras' not in metadata: metadata['extras'] = [] metadata['extras'].extend(pkg_info.get_all(key)) elif low_key == 'home_page': - metadata['extensions']['python.details']['project_urls'] = {'Home':pkg_info[key]} + metadata['extensions']['python.details']['project_urls'] = {'Home': pkg_info[key]} elif low_key == 'keywords': metadata['keywords'] = KEYWORDS_RE.split(pkg_info[key]) @@ -174,7 +175,7 @@ def pkginfo_to_dict(path, distribution=None): requirements = getattr(distribution, attr) if isinstance(requirements, list): new_requirements = sorted(convert_requirements(requirements)) - metadata[requires] = [{'requires':new_requirements}] + metadata[requires] = [{'requires': new_requirements}] except AttributeError: pass @@ -216,6 +217,7 @@ def pkginfo_to_dict(path, distribution=None): return metadata + def requires_to_requires_dist(requirement): """Compose the version predicates for requirement in PEP 345 fashion.""" requires_dist = [] @@ -223,7 +225,8 @@ def requires_to_requires_dist(requirement): requires_dist.append(op + ver) if not requires_dist: return '' - return " (%s)" % ','.join(requires_dist) + return " (%s)" % ','.join(sorted(requires_dist)) + def convert_requirements(requirements): """Yield Requires-Dist: strings for parsed requirements strings.""" @@ -235,6 +238,31 @@ def convert_requirements(requirements): extras = "[%s]" % extras yield (parsed_requirement.project_name + extras + spec) + +def generate_requirements(extras_require): + """ + Convert requirements from a setup()-style dictionary to ('Requires-Dist', 'requirement') + and ('Provides-Extra', 'extra') tuples. + + extras_require is a dictionary of {extra: [requirements]} as passed to setup(), + using the empty extra {'': [requirements]} to hold install_requires. + """ + for extra, depends in extras_require.items(): + condition = '' + if extra and ':' in extra: # setuptools extra:condition syntax + extra, condition = extra.split(':', 1) + extra = pkg_resources.safe_extra(extra) + if extra: + yield ('Provides-Extra', extra) + if condition: + condition += " and " + condition += "extra == '%s'" % extra + if condition: + condition = '; ' + condition + for new_req in convert_requirements(depends): + yield ('Requires-Dist', new_req + condition) + + def pkginfo_to_metadata(egg_info_path, pkginfo_path): """ Convert .egg-info directory with PKG-INFO to the Metadata 1.3 aka @@ -244,21 +272,12 @@ def pkginfo_to_metadata(egg_info_path, pkginfo_path): pkg_info.replace_header('Metadata-Version', '2.0') requires_path = os.path.join(egg_info_path, 'requires.txt') if os.path.exists(requires_path): - requires = open(requires_path).read() + with open(requires_path) as requires_file: + requires = requires_file.read() for extra, reqs in sorted(pkg_resources.split_sections(requires), key=lambda x: x[0] or ''): - condition = '' - if extra and ':' in extra: # setuptools extra:condition syntax - extra, condition = extra.split(':', 1) - if extra: - pkg_info['Provides-Extra'] = extra - if condition: - condition += " and " - condition += 'extra == %s' % repr(extra) - if condition: - condition = '; ' + condition - for new_req in sorted(convert_requirements(reqs)): - pkg_info['Requires-Dist'] = new_req + condition + for item in generate_requirements({extra: reqs}): + pkg_info[item[0]] = item[1] description = pkg_info['Description'] if description: @@ -277,8 +296,8 @@ def pkginfo_unicode(pkg_info, field): return str(text) for item in pkg_info.raw_items(): if item[0].lower() == field: - text = item[1].encode('ascii', 'surrogateescape')\ - .decode('utf-8') + text = item[1].encode('ascii', 'surrogateescape') \ + .decode('utf-8') break return text @@ -298,20 +317,22 @@ def dedent_description(pkg_info): description_lines = description.splitlines() description_dedent = '\n'.join( - # if the first line of long_description is blank, - # the first line here will be indented. - (description_lines[0].lstrip(), - textwrap.dedent('\n'.join(description_lines[1:])), - '\n')) + # if the first line of long_description is blank, + # the first line here will be indented. + (description_lines[0].lstrip(), + textwrap.dedent('\n'.join(description_lines[1:])), + '\n')) if surrogates: - description_dedent = description_dedent\ - .encode("utf8")\ - .decode("ascii", "surrogateescape") + description_dedent = description_dedent \ + .encode("utf8") \ + .decode("ascii", "surrogateescape") return description_dedent if __name__ == "__main__": - import sys, pprint + import sys + import pprint + pprint.pprint(pkginfo_to_dict(sys.argv[1])) diff --git a/lib/python3.4/site-packages/wheel/paths.py b/lib/python3.4/site-packages/wheel/paths.py index fe3dfd6..afb3cae 100644 --- a/lib/python3.4/site-packages/wheel/paths.py +++ b/lib/python3.4/site-packages/wheel/paths.py @@ -4,22 +4,24 @@ Installation paths. Map the .data/ subdirectory names to install paths. """ +import distutils.command.install as install +import distutils.dist as dist import os.path import sys -import distutils.dist as dist -import distutils.command.install as install + def get_install_command(name): # late binding due to potential monkeypatching - d = dist.Distribution({'name':name}) + d = dist.Distribution({'name': name}) i = install.install(d) i.finalize_options() return i + def get_install_paths(name): """ Return the (distutils) install paths for the named dist. - + A dict with ('purelib', 'platlib', 'headers', 'scripts', 'data') keys. """ paths = {} diff --git a/lib/python3.4/site-packages/wheel/pep425tags.py b/lib/python3.4/site-packages/wheel/pep425tags.py index 106c879..29afdc3 100644 --- a/lib/python3.4/site-packages/wheel/pep425tags.py +++ b/lib/python3.4/site-packages/wheel/pep425tags.py @@ -1,14 +1,10 @@ """Generate and work with PEP 425 Compatibility Tags.""" -import sys -import warnings - -try: - import sysconfig -except ImportError: # pragma nocover - # Python < 2.7 - import distutils.sysconfig as sysconfig import distutils.util +import platform +import sys +import sysconfig +import warnings def get_config_var(var): @@ -21,15 +17,17 @@ def get_config_var(var): def get_abbr_impl(): """Return abbreviated implementation name.""" - if hasattr(sys, 'pypy_version_info'): - pyimpl = 'pp' - elif sys.platform.startswith('java'): - pyimpl = 'jy' - elif sys.platform == 'cli': - pyimpl = 'ip' - else: - pyimpl = 'cp' - return pyimpl + impl = platform.python_implementation() + if impl == 'PyPy': + return 'pp' + elif impl == 'Jython': + return 'jy' + elif impl == 'IronPython': + return 'ip' + elif impl == 'CPython': + return 'cp' + + raise LookupError('Unknown Python implementation: ' + impl) def get_impl_ver(): @@ -100,18 +98,22 @@ def get_abi_tag(): def get_platform(): """Return our platform name 'win32', 'linux_x86_64'""" # XXX remove distutils dependency - return distutils.util.get_platform().replace('.', '_').replace('-', '_') + result = distutils.util.get_platform().replace('.', '_').replace('-', '_') + if result == "linux_x86_64" and sys.maxsize == 2147483647: + # pip pull request #3497 + result = "linux_i686" + return result def get_supported(versions=None, supplied_platform=None): """Return a list of supported tags for each version specified in `versions`. - :param versions: a list of string versions, of the form ["33", "32"], + :param versions: a list of string versions, of the form ["33", "32"], or None. The first version will be assumed to support our ABI. """ supported = [] - + # Versions must be given with respect to the preference if versions is None: versions = [] @@ -120,15 +122,15 @@ def get_supported(versions=None, supplied_platform=None): # Support all previous minor Python versions. for minor in range(version_info[-1], -1, -1): versions.append(''.join(map(str, major + (minor,)))) - + impl = get_abbr_impl() - + abis = [] abi = get_abi_tag() if abi: abis[0:0] = [abi] - + abi3s = set() import imp for suffix in imp.get_suffixes(): @@ -143,20 +145,29 @@ def get_supported(versions=None, supplied_platform=None): if supplied_platform: platforms.append(supplied_platform) platforms.append(get_platform()) - + # Current version, current API (built specifically for our Python): for abi in abis: for arch in platforms: supported.append(('%s%s' % (impl, versions[0]), abi, arch)) - + + # abi3 modules compatible with older version of Python + for version in versions[1:]: + # abi3 was introduced in Python 3.2 + if version in ('31', '30'): + break + for abi in abi3s: # empty set if not Python 3 + for arch in platforms: + supported.append(("%s%s" % (impl, version), abi, arch)) + # No abi / arch, but requires our implementation: for i, version in enumerate(versions): supported.append(('%s%s' % (impl, version), 'none', 'any')) if i == 0: - # Tagged specifically as being cross-version compatible + # Tagged specifically as being cross-version compatible # (with just the major version specified) - supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) - + supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) + # Major Python version + platform; e.g. binaries not using the Python API supported.append(('py%s' % (versions[0][0]), 'none', arch)) @@ -165,5 +176,5 @@ def get_supported(versions=None, supplied_platform=None): supported.append(('py%s' % (version,), 'none', 'any')) if i == 0: supported.append(('py%s' % (version[0]), 'none', 'any')) - + return supported diff --git a/lib/python3.4/site-packages/wheel/pkginfo.py b/lib/python3.4/site-packages/wheel/pkginfo.py index 8a4aca3..115be45 100644 --- a/lib/python3.4/site-packages/wheel/pkginfo.py +++ b/lib/python3.4/site-packages/wheel/pkginfo.py @@ -11,7 +11,7 @@ except NameError: if not _PY3: from email.generator import Generator - + def read_pkg_info_bytes(bytestr): return Parser().parsestr(bytestr) @@ -22,23 +22,22 @@ if not _PY3: def write_pkg_info(path, message): with open(path, 'w') as metadata: - Generator(metadata, maxheaderlen=0).flatten(message) - + Generator(metadata, mangle_from_=False, maxheaderlen=0).flatten(message) else: from email.generator import BytesGenerator + def read_pkg_info_bytes(bytestr): headers = bytestr.decode(encoding="ascii", errors="surrogateescape") message = Parser().parsestr(headers) return message def read_pkg_info(path): - with open(path, "r", - encoding="ascii", + with open(path, "r", + encoding="ascii", errors="surrogateescape") as headers: message = Parser().parse(headers) return message def write_pkg_info(path, message): with open(path, "wb") as out: - BytesGenerator(out, maxheaderlen=0).flatten(message) - + BytesGenerator(out, mangle_from_=False, maxheaderlen=0).flatten(message) diff --git a/lib/python3.4/site-packages/wheel/signatures/__init__.py b/lib/python3.4/site-packages/wheel/signatures/__init__.py index 3f21b50..e7a5331 100644 --- a/lib/python3.4/site-packages/wheel/signatures/__init__.py +++ b/lib/python3.4/site-packages/wheel/signatures/__init__.py @@ -2,63 +2,67 @@ Create and verify jws-js format Ed25519 signatures. """ -__all__ = [ 'sign', 'verify' ] - import json from ..util import urlsafe_b64decode, urlsafe_b64encode, native, binary +__all__ = ['sign', 'verify'] + ed25519ll = None ALG = "Ed25519" + def get_ed25519ll(): """Lazy import-and-test of ed25519 module""" global ed25519ll - + if not ed25519ll: try: - import ed25519ll # fast (thousands / s) - except (ImportError, OSError): # pragma nocover - from . import ed25519py as ed25519ll # pure Python (hundreds / s) + import ed25519ll # fast (thousands / s) + except (ImportError, OSError): # pragma nocover + from . import ed25519py as ed25519ll # pure Python (hundreds / s) test() - + return ed25519ll + def sign(payload, keypair): - """Return a JWS-JS format signature given a JSON-serializable payload and + """Return a JWS-JS format signature given a JSON-serializable payload and an Ed25519 keypair.""" get_ed25519ll() # header = { "alg": ALG, "jwk": { - "kty": ALG, # alg -> kty in jwk-08. + "kty": ALG, # alg -> kty in jwk-08. "vk": native(urlsafe_b64encode(keypair.vk)) } } - + encoded_header = urlsafe_b64encode(binary(json.dumps(header, sort_keys=True))) encoded_payload = urlsafe_b64encode(binary(json.dumps(payload, sort_keys=True))) secured_input = b".".join((encoded_header, encoded_payload)) sig_msg = ed25519ll.crypto_sign(secured_input, keypair.sk) signature = sig_msg[:ed25519ll.SIGNATUREBYTES] encoded_signature = urlsafe_b64encode(signature) - - return {"recipients": - [{"header":native(encoded_header), - "signature":native(encoded_signature)}], + + return {"recipients": + [{"header": native(encoded_header), + "signature": native(encoded_signature)}], "payload": native(encoded_payload)} + def assertTrue(condition, message=""): if not condition: raise ValueError(message) - + + def verify(jwsjs): """Return (decoded headers, payload) if all signatures in jwsjs are consistent, else raise ValueError. - + Caller must decide whether the keys are actually trusted.""" - get_ed25519ll() + get_ed25519ll() # XXX forbid duplicate keys in JSON input using object_pairs_hook (2.7+) recipients = jwsjs["recipients"] encoded_payload = binary(jwsjs["payload"]) @@ -68,12 +72,12 @@ def verify(jwsjs): h = binary(recipient["header"]) s = binary(recipient["signature"]) header = json.loads(native(urlsafe_b64decode(h))) - assertTrue(header["alg"] == ALG, - "Unexpected algorithm {0}".format(header["alg"])) - if "alg" in header["jwk"] and not "kty" in header["jwk"]: - header["jwk"]["kty"] = header["jwk"]["alg"] # b/w for JWK < -08 - assertTrue(header["jwk"]["kty"] == ALG, # true for Ed25519 - "Unexpected key type {0}".format(header["jwk"]["kty"])) + assertTrue(header["alg"] == ALG, + "Unexpected algorithm {0}".format(header["alg"])) + if "alg" in header["jwk"] and "kty" not in header["jwk"]: + header["jwk"]["kty"] = header["jwk"]["alg"] # b/w for JWK < -08 + assertTrue(header["jwk"]["kty"] == ALG, # true for Ed25519 + "Unexpected key type {0}".format(header["jwk"]["kty"])) vk = urlsafe_b64decode(binary(header["jwk"]["vk"])) secured_input = b".".join((h, encoded_payload)) sig = urlsafe_b64decode(s) @@ -91,6 +95,7 @@ def verify(jwsjs): return headers, payload + def test(): kp = ed25519ll.crypto_sign_keypair() payload = {'test': 'onstartup'} @@ -101,6 +106,5 @@ def test(): verify(jwsjs) except ValueError: pass - else: # pragma no cover + else: # pragma no cover raise RuntimeError("No error from bad wheel.signatures payload.") - diff --git a/lib/python3.4/site-packages/wheel/signatures/djbec.py b/lib/python3.4/site-packages/wheel/signatures/djbec.py index 56efe44..87f72d4 100644 --- a/lib/python3.4/site-packages/wheel/signatures/djbec.py +++ b/lib/python3.4/site-packages/wheel/signatures/djbec.py @@ -6,61 +6,80 @@ # http://www.hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html # Specifically add-2008-hwcd-4 and dbl-2008-hwcd -try: # pragma nocover +import hashlib +import random + +try: # pragma nocover unicode PY3 = False + def asbytes(b): """Convert array of integers to byte string""" return ''.join(chr(x) for x in b) + def joinbytes(b): """Convert array of bytes to byte string""" return ''.join(b) + def bit(h, i): """Return i'th bit of bytestring h""" - return (ord(h[i//8]) >> (i%8)) & 1 - -except NameError: # pragma nocover + return (ord(h[i // 8]) >> (i % 8)) & 1 +except NameError: # pragma nocover PY3 = True asbytes = bytes joinbytes = bytes - def bit(h, i): - return (h[i//8] >> (i%8)) & 1 -import hashlib + def bit(h, i): + return (h[i // 8] >> (i % 8)) & 1 b = 256 -q = 2**255 - 19 -l = 2**252 + 27742317777372353535851937790883648493 +q = 2 ** 255 - 19 +l = 2 ** 252 + 27742317777372353535851937790883648493 + def H(m): return hashlib.sha512(m).digest() + def expmod(b, e, m): - if e == 0: return 1 + if e == 0: + return 1 + t = expmod(b, e // 2, m) ** 2 % m - if e & 1: t = (t * b) % m + if e & 1: + t = (t * b) % m + return t + # Can probably get some extra speedup here by replacing this with # an extended-euclidean, but performance seems OK without that def inv(x): - return expmod(x, q-2, q) + return expmod(x, q - 2, q) + d = -121665 * inv(121666) -I = expmod(2,(q-1)//4,q) +I = expmod(2, (q - 1) // 4, q) + def xrecover(y): - xx = (y*y-1) * inv(d*y*y+1) - x = expmod(xx,(q+3)//8,q) - if (x*x - xx) % q != 0: x = (x*I) % q - if x % 2 != 0: x = q-x + xx = (y * y - 1) * inv(d * y * y + 1) + x = expmod(xx, (q + 3) // 8, q) + if (x * x - xx) % q != 0: + x = (x * I) % q + + if x % 2 != 0: + x = q - x + return x + By = 4 * inv(5) Bx = xrecover(By) -B = [Bx % q,By % q] +B = [Bx % q, By % q] -#def edwards(P,Q): + +# def edwards(P,Q): # x1 = P[0] # y1 = P[1] # x2 = Q[0] @@ -69,7 +88,7 @@ B = [Bx % q,By % q] # y3 = (y1*y2+x1*x2) * inv(1-d*x1*x2*y1*y2) # return (x3 % q,y3 % q) -#def scalarmult(P,e): +# def scalarmult(P,e): # if e == 0: return [0,1] # Q = scalarmult(P,e/2) # Q = edwards(Q,Q) @@ -82,113 +101,137 @@ B = [Bx % q,By % q] def xpt_add(pt1, pt2): (X1, Y1, Z1, T1) = pt1 (X2, Y2, Z2, T2) = pt2 - A = ((Y1-X1)*(Y2+X2)) % q - B = ((Y1+X1)*(Y2-X2)) % q - C = (Z1*2*T2) % q - D = (T1*2*Z2) % q - E = (D+C) % q - F = (B-A) % q - G = (B+A) % q - H = (D-C) % q - X3 = (E*F) % q - Y3 = (G*H) % q - Z3 = (F*G) % q - T3 = (E*H) % q + A = ((Y1 - X1) * (Y2 + X2)) % q + B = ((Y1 + X1) * (Y2 - X2)) % q + C = (Z1 * 2 * T2) % q + D = (T1 * 2 * Z2) % q + E = (D + C) % q + F = (B - A) % q + G = (B + A) % q + H = (D - C) % q + X3 = (E * F) % q + Y3 = (G * H) % q + Z3 = (F * G) % q + T3 = (E * H) % q return (X3, Y3, Z3, T3) -def xpt_double (pt): + +def xpt_double(pt): (X1, Y1, Z1, _) = pt - A = (X1*X1) - B = (Y1*Y1) - C = (2*Z1*Z1) + A = (X1 * X1) + B = (Y1 * Y1) + C = (2 * Z1 * Z1) D = (-A) % q - J = (X1+Y1) % q - E = (J*J-A-B) % q - G = (D+B) % q - F = (G-C) % q - H = (D-B) % q - X3 = (E*F) % q - Y3 = (G*H) % q - Z3 = (F*G) % q - T3 = (E*H) % q - return (X3, Y3, Z3, T3) + J = (X1 + Y1) % q + E = (J * J - A - B) % q + G = (D + B) % q + F = (G - C) % q + H = (D - B) % q + X3 = (E * F) % q + Y3 = (G * H) % q + Z3 = (F * G) % q + T3 = (E * H) % q + return X3, Y3, Z3, T3 -def pt_xform (pt): + +def pt_xform(pt): (x, y) = pt - return (x, y, 1, (x*y)%q) + return x, y, 1, (x * y) % q -def pt_unxform (pt): + +def pt_unxform(pt): (x, y, z, _) = pt - return ((x*inv(z))%q, (y*inv(z))%q) + return (x * inv(z)) % q, (y * inv(z)) % q + + +def xpt_mult(pt, n): + if n == 0: + return pt_xform((0, 1)) + + _ = xpt_double(xpt_mult(pt, n >> 1)) + return xpt_add(_, pt) if n & 1 else _ -def xpt_mult (pt, n): - if n==0: return pt_xform((0,1)) - _ = xpt_double(xpt_mult(pt, n>>1)) - return xpt_add(_, pt) if n&1 else _ def scalarmult(pt, e): return pt_unxform(xpt_mult(pt_xform(pt), e)) + def encodeint(y): bits = [(y >> i) & 1 for i in range(b)] e = [(sum([bits[i * 8 + j] << j for j in range(8)])) - for i in range(b//8)] + for i in range(b // 8)] return asbytes(e) + def encodepoint(P): x = P[0] y = P[1] bits = [(y >> i) & 1 for i in range(b - 1)] + [x & 1] e = [(sum([bits[i * 8 + j] << j for j in range(8)])) - for i in range(b//8)] + for i in range(b // 8)] return asbytes(e) - + + def publickey(sk): h = H(sk) - a = 2**(b-2) + sum(2**i * bit(h,i) for i in range(3,b-2)) - A = scalarmult(B,a) + a = 2 ** (b - 2) + sum(2 ** i * bit(h, i) for i in range(3, b - 2)) + A = scalarmult(B, a) return encodepoint(A) + def Hint(m): h = H(m) - return sum(2**i * bit(h,i) for i in range(2*b)) + return sum(2 ** i * bit(h, i) for i in range(2 * b)) -def signature(m,sk,pk): + +def signature(m, sk, pk): h = H(sk) - a = 2**(b-2) + sum(2**i * bit(h,i) for i in range(3,b-2)) - inter = joinbytes([h[i] for i in range(b//8,b//4)]) + a = 2 ** (b - 2) + sum(2 ** i * bit(h, i) for i in range(3, b - 2)) + inter = joinbytes([h[i] for i in range(b // 8, b // 4)]) r = Hint(inter + m) - R = scalarmult(B,r) + R = scalarmult(B, r) S = (r + Hint(encodepoint(R) + pk + m) * a) % l return encodepoint(R) + encodeint(S) + def isoncurve(P): x = P[0] y = P[1] - return (-x*x + y*y - 1 - d*x*x*y*y) % q == 0 + return (-x * x + y * y - 1 - d * x * x * y * y) % q == 0 + def decodeint(s): - return sum(2**i * bit(s,i) for i in range(0,b)) + return sum(2 ** i * bit(s, i) for i in range(0, b)) + def decodepoint(s): - y = sum(2**i * bit(s,i) for i in range(0,b-1)) + y = sum(2 ** i * bit(s, i) for i in range(0, b - 1)) x = xrecover(y) - if x & 1 != bit(s,b-1): x = q-x - P = [x,y] - if not isoncurve(P): raise Exception("decoding point that is not on curve") + if x & 1 != bit(s, b - 1): + x = q - x + + P = [x, y] + if not isoncurve(P): + raise Exception("decoding point that is not on curve") + return P + def checkvalid(s, m, pk): - if len(s) != b//4: raise Exception("signature length is wrong") - if len(pk) != b//8: raise Exception("public-key length is wrong") - R = decodepoint(s[0:b//8]) + if len(s) != b // 4: + raise Exception("signature length is wrong") + if len(pk) != b // 8: + raise Exception("public-key length is wrong") + + R = decodepoint(s[0:b // 8]) A = decodepoint(pk) - S = decodeint(s[b//8:b//4]) + S = decodeint(s[b // 8:b // 4]) h = Hint(encodepoint(R) + pk + m) - v1 = scalarmult(B,S) -# v2 = edwards(R,scalarmult(A,h)) + v1 = scalarmult(B, S) + # v2 = edwards(R,scalarmult(A,h)) v2 = pt_unxform(xpt_add(pt_xform(R), pt_xform(scalarmult(A, h)))) - return v1==v2 + return v1 == v2 + ########################################################## # @@ -199,7 +242,8 @@ def checkvalid(s, m, pk): P = q A = 486662 -#def expmod(b, e, m): + +# def expmod(b, e, m): # if e == 0: return 1 # t = expmod(b, e / 2, m) ** 2 % m # if e & 1: t = (t * b) % m @@ -207,64 +251,73 @@ A = 486662 # def inv(x): return expmod(x, P - 2, P) + def add(n, m, d): (xn, zn) = n - (xm, zm) = m + (xm, zm) = m (xd, zd) = d x = 4 * (xm * xn - zm * zn) ** 2 * zd z = 4 * (xm * zn - zm * xn) ** 2 * xd return (x % P, z % P) + def double(n): (xn, zn) = n x = (xn ** 2 - zn ** 2) ** 2 z = 4 * xn * zn * (xn ** 2 + A * xn * zn + zn ** 2) return (x % P, z % P) + def curve25519(n, base=9): - one = (base,1) + one = (base, 1) two = double(one) + # f(m) evaluates to a tuple # containing the mth multiple and the # (m+1)th multiple of base. def f(m): - if m == 1: return (one, two) + if m == 1: + return (one, two) + (pm, pm1) = f(m // 2) - if (m & 1): + if m & 1: return (add(pm, pm1, one), double(pm1)) + return (double(pm), add(pm, pm1, one)) - ((x,z), _) = f(n) + + ((x, z), _) = f(n) return (x * inv(z)) % P -import random def genkey(n=0): - n = n or random.randint(0,P) + n = n or random.randint(0, P) n &= ~7 n &= ~(128 << 8 * 31) n |= 64 << 8 * 31 return n -#def str2int(s): + +# def str2int(s): # return int(hexlify(s), 16) # # return sum(ord(s[i]) << (8 * i) for i in range(32)) # -#def int2str(n): +# def int2str(n): # return unhexlify("%x" % n) # # return ''.join([chr((n >> (8 * i)) & 255) for i in range(32)]) ################################################# + def dsa_test(): import os - msg = str(random.randint(q,q+q)).encode('utf-8') + msg = str(random.randint(q, q + q)).encode('utf-8') sk = os.urandom(32) pk = publickey(sk) sig = signature(msg, sk, pk) return checkvalid(sig, msg, pk) + def dh_test(): sk1 = genkey() sk2 = genkey() return curve25519(sk1, curve25519(sk2)) == curve25519(sk2, curve25519(sk1)) - diff --git a/lib/python3.4/site-packages/wheel/signatures/ed25519py.py b/lib/python3.4/site-packages/wheel/signatures/ed25519py.py index 55eba2e..0c4ab8f 100644 --- a/lib/python3.4/site-packages/wheel/signatures/ed25519py.py +++ b/lib/python3.4/site-packages/wheel/signatures/ed25519py.py @@ -1,22 +1,21 @@ -# -*- coding: utf-8 -*- - -import warnings import os - +import warnings from collections import namedtuple + from . import djbec __all__ = ['crypto_sign', 'crypto_sign_open', 'crypto_sign_keypair', 'Keypair', 'PUBLICKEYBYTES', 'SECRETKEYBYTES', 'SIGNATUREBYTES'] -PUBLICKEYBYTES=32 -SECRETKEYBYTES=64 -SIGNATUREBYTES=64 +PUBLICKEYBYTES = 32 +SECRETKEYBYTES = 64 +SIGNATUREBYTES = 64 + +Keypair = namedtuple('Keypair', ('vk', 'sk')) # verifying key, secret key -Keypair = namedtuple('Keypair', ('vk', 'sk')) # verifying key, secret key def crypto_sign_keypair(seed=None): - """Return (verifying, secret) key from a given seed, or os.urandom(32)""" + """Return (verifying, secret) key from a given seed, or os.urandom(32)""" if seed is None: seed = os.urandom(PUBLICKEYBYTES) else: @@ -47,6 +46,5 @@ def crypto_sign_open(signed, vk): raise ValueError("Bad verifying key length %d" % len(vk)) rc = djbec.checkvalid(signed[:SIGNATUREBYTES], signed[SIGNATUREBYTES:], vk) if not rc: - raise ValueError("rc != True", rc) + raise ValueError("rc != True", rc) return signed[SIGNATUREBYTES:] - diff --git a/lib/python3.4/site-packages/wheel/signatures/keys.py b/lib/python3.4/site-packages/wheel/signatures/keys.py index 1dde4bf..eb5d4ac 100644 --- a/lib/python3.4/site-packages/wheel/signatures/keys.py +++ b/lib/python3.4/site-packages/wheel/signatures/keys.py @@ -1,7 +1,7 @@ """Store and retrieve wheel signing / verifying keys. -Given a scope (a package name, + meaning "all packages", or - meaning -"no packages"), return a list of verifying keys that are trusted for that +Given a scope (a package name, + meaning "all packages", or - meaning +"no packages"), return a list of verifying keys that are trusted for that scope. Given a package name, return a list of (scope, key) suggested keys to sign @@ -33,15 +33,17 @@ wheel export key import json import os.path -from wheel.util import native, load_config_paths, save_config_path + +from ..util import native, load_config_paths, save_config_path + class WheelKeys(object): SCHEMA = 1 CONFIG_NAME = 'wheel.json' - + def __init__(self): - self.data = {'signers':[], 'verifiers':[]} - + self.data = {'signers': [], 'verifiers': []} + def load(self): # XXX JSON is not a great database for path in load_config_paths('wheel'): @@ -50,7 +52,7 @@ class WheelKeys(object): with open(conf, 'r') as infile: self.data = json.load(infile) for x in ('signers', 'verifiers'): - if not x in self.data: + if x not in self.data: self.data[x] = [] if 'schema' not in self.data: self.data['schema'] = self.SCHEMA @@ -62,38 +64,38 @@ class WheelKeys(object): return self def save(self): - # Try not to call this a very long time after load() + # Try not to call this a very long time after load() path = save_config_path('wheel') conf = os.path.join(native(path), self.CONFIG_NAME) with open(conf, 'w+') as out: json.dump(self.data, out, indent=2) return self - + def trust(self, scope, vk): """Start trusting a particular key for given scope.""" - self.data['verifiers'].append({'scope':scope, 'vk':vk}) + self.data['verifiers'].append({'scope': scope, 'vk': vk}) return self - + def untrust(self, scope, vk): """Stop trusting a particular key for given scope.""" - self.data['verifiers'].remove({'scope':scope, 'vk':vk}) + self.data['verifiers'].remove({'scope': scope, 'vk': vk}) return self - + def trusted(self, scope=None): """Return list of [(scope, trusted key), ...] for given scope.""" - trust = [(x['scope'], x['vk']) for x in self.data['verifiers'] if x['scope'] in (scope, '+')] + trust = [(x['scope'], x['vk']) for x in self.data['verifiers'] + if x['scope'] in (scope, '+')] trust.sort(key=lambda x: x[0]) trust.reverse() return trust - + def signers(self, scope): """Return list of signing key(s).""" sign = [(x['scope'], x['vk']) for x in self.data['signers'] if x['scope'] in (scope, '+')] sign.sort(key=lambda x: x[0]) sign.reverse() return sign - + def add_signer(self, scope, vk): """Remember verifying key vk as being valid for signing in scope.""" - self.data['signers'].append({'scope':scope, 'vk':vk}) - + self.data['signers'].append({'scope': scope, 'vk': vk}) diff --git a/lib/python3.4/site-packages/wheel/test/__init__.py b/lib/python3.4/site-packages/wheel/test/__init__.py deleted file mode 100644 index 4287ca8..0000000 --- a/lib/python3.4/site-packages/wheel/test/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# \ No newline at end of file diff --git a/lib/python3.4/site-packages/wheel/test/complex-dist/complexdist/__init__.py b/lib/python3.4/site-packages/wheel/test/complex-dist/complexdist/__init__.py deleted file mode 100644 index 559fbb7..0000000 --- a/lib/python3.4/site-packages/wheel/test/complex-dist/complexdist/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -def main(): - return diff --git a/lib/python3.4/site-packages/wheel/test/complex-dist/setup.py b/lib/python3.4/site-packages/wheel/test/complex-dist/setup.py deleted file mode 100644 index 615d5dc..0000000 --- a/lib/python3.4/site-packages/wheel/test/complex-dist/setup.py +++ /dev/null @@ -1,30 +0,0 @@ -from setuptools import setup - -try: - unicode - def u8(s): - return s.decode('unicode-escape') -except NameError: - def u8(s): - return s - -setup(name='complex-dist', - version='0.1', - description=u8('Another testing distribution \N{SNOWMAN}'), - long_description=u8('Another testing distribution \N{SNOWMAN}'), - author="Illustrious Author", - author_email="illustrious@example.org", - url="http://example.org/exemplary", - packages=['complexdist'], - setup_requires=["wheel", "setuptools"], - install_requires=["quux", "splort"], - extras_require={'simple':['simple.dist']}, - tests_require=["foo", "bar>=10.0.0"], - entry_points={ - 'console_scripts': [ - 'complex-dist=complexdist:main', - 'complex-dist2=complexdist:main', - ], - }, - ) - diff --git a/lib/python3.4/site-packages/wheel/test/headers.dist/header.h b/lib/python3.4/site-packages/wheel/test/headers.dist/header.h deleted file mode 100644 index e69de29..0000000 diff --git a/lib/python3.4/site-packages/wheel/test/headers.dist/headersdist.py b/lib/python3.4/site-packages/wheel/test/headers.dist/headersdist.py deleted file mode 100644 index e69de29..0000000 diff --git a/lib/python3.4/site-packages/wheel/test/headers.dist/setup.py b/lib/python3.4/site-packages/wheel/test/headers.dist/setup.py deleted file mode 100644 index 2704f01..0000000 --- a/lib/python3.4/site-packages/wheel/test/headers.dist/setup.py +++ /dev/null @@ -1,16 +0,0 @@ -from setuptools import setup - -try: - unicode - def u8(s): - return s.decode('unicode-escape').encode('utf-8') -except NameError: - def u8(s): - return s.encode('utf-8') - -setup(name='headers.dist', - version='0.1', - description=u8('A distribution with headers'), - headers=['header.h'] - ) - diff --git a/lib/python3.4/site-packages/wheel/test/pydist-schema.json b/lib/python3.4/site-packages/wheel/test/pydist-schema.json deleted file mode 100644 index 566f3a4..0000000 --- a/lib/python3.4/site-packages/wheel/test/pydist-schema.json +++ /dev/null @@ -1,362 +0,0 @@ -{ - "id": "http://www.python.org/dev/peps/pep-0426/", - "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Metadata for Python Software Packages 2.0", - "type": "object", - "properties": { - "metadata_version": { - "description": "Version of the file format", - "type": "string", - "pattern": "^(\\d+(\\.\\d+)*)$" - }, - "generator": { - "description": "Name and version of the program that produced this file.", - "type": "string", - "pattern": "^[0-9A-Za-z]([0-9A-Za-z_.-]*[0-9A-Za-z])( \\(.*\\))?$" - }, - "name": { - "description": "The name of the distribution.", - "type": "string", - "$ref": "#/definitions/distribution_name" - }, - "version": { - "description": "The distribution's public version identifier", - "type": "string", - "pattern": "^(\\d+(\\.\\d+)*)((a|b|c|rc)(\\d+))?(\\.(post)(\\d+))?(\\.(dev)(\\d+))?$" - }, - "source_label": { - "description": "A constrained identifying text string", - "type": "string", - "pattern": "^[0-9a-z_.-+]+$" - }, - "source_url": { - "description": "A string containing a full URL where the source for this specific version of the distribution can be downloaded.", - "type": "string", - "format": "uri" - }, - "summary": { - "description": "A one-line summary of what the distribution does.", - "type": "string" - }, - "extras": { - "description": "A list of optional sets of dependencies that may be used to define conditional dependencies in \"may_require\" and similar fields.", - "type": "array", - "items": { - "type": "string", - "$ref": "#/definitions/extra_name" - } - }, - "meta_requires": { - "description": "A list of subdistributions made available through this metadistribution.", - "type": "array", - "$ref": "#/definitions/dependencies" - }, - "run_requires": { - "description": "A list of other distributions needed to run this distribution.", - "type": "array", - "$ref": "#/definitions/dependencies" - }, - "test_requires": { - "description": "A list of other distributions needed when this distribution is tested.", - "type": "array", - "$ref": "#/definitions/dependencies" - }, - "build_requires": { - "description": "A list of other distributions needed when this distribution is built.", - "type": "array", - "$ref": "#/definitions/dependencies" - }, - "dev_requires": { - "description": "A list of other distributions needed when this distribution is developed.", - "type": "array", - "$ref": "#/definitions/dependencies" - }, - "provides": { - "description": "A list of strings naming additional dependency requirements that are satisfied by installing this distribution. These strings must be of the form Name or Name (Version)", - "type": "array", - "items": { - "type": "string", - "$ref": "#/definitions/provides_declaration" - } - }, - "modules": { - "description": "A list of modules and/or packages available for import after installing this distribution.", - "type": "array", - "items": { - "type": "string", - "$ref": "#/definitions/qualified_name" - } - }, - "namespaces": { - "description": "A list of namespace packages this distribution contributes to", - "type": "array", - "items": { - "type": "string", - "$ref": "#/definitions/qualified_name" - } - }, - "obsoleted_by": { - "description": "A string that indicates that this project is no longer being developed. The named project provides a substitute or replacement.", - "type": "string", - "$ref": "#/definitions/requirement" - }, - "supports_environments": { - "description": "A list of strings specifying the environments that the distribution explicitly supports.", - "type": "array", - "items": { - "type": "string", - "$ref": "#/definitions/environment_marker" - } - }, - "install_hooks": { - "description": "The install_hooks field is used to define various operations that may be invoked on a distribution in a platform independent manner.", - "type": "object", - "properties": { - "postinstall": { - "type": "string", - "$ref": "#/definitions/export_specifier" - }, - "preuninstall": { - "type": "string", - "$ref": "#/definitions/export_specifier" - } - } - }, - "extensions": { - "description": "Extensions to the metadata may be present in a mapping under the 'extensions' key.", - "type": "object", - "$ref": "#/definitions/extensions" - } - }, - - "required": ["metadata_version", "name", "version", "summary"], - "additionalProperties": false, - - "definitions": { - "contact": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "email": { - "type": "string" - }, - "url": { - "type": "string" - }, - "role": { - "type": "string" - } - }, - "required": ["name"], - "additionalProperties": false - }, - "dependencies": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/dependency" - } - }, - "dependency": { - "type": "object", - "properties": { - "extra": { - "type": "string", - "$ref": "#/definitions/extra_name" - }, - "environment": { - "type": "string", - "$ref": "#/definitions/environment_marker" - }, - "requires": { - "type": "array", - "items": { - "type": "string", - "$ref": "#/definitions/requirement" - } - } - }, - "required": ["requires"], - "additionalProperties": false - }, - "extensions": { - "type": "object", - "patternProperties": { - "^[A-Za-z][0-9A-Za-z_]*([.][0-9A-Za-z_]*)*$": {} - }, - "properties": { - "python.details" : { - "description": "More information regarding the distribution.", - "type": "object", - "properties": { - "document_names": { - "description": "Names of supporting metadata documents", - "type": "object", - "properties": { - "description": { - "type": "string", - "$ref": "#/definitions/document_name" - }, - "changelog": { - "type": "string", - "$ref": "#/definitions/document_name" - }, - "license": { - "type": "string", - "$ref": "#/definitions/document_name" - } - }, - "additionalProperties": false - }, - "keywords": { - "description": "A list of additional keywords to be used to assist searching for the distribution in a larger catalog.", - "type": "array", - "items": { - "type": "string" - } - }, - "license": { - "description": "A string indicating the license covering the distribution.", - "type": "string" - }, - "classifiers": { - "description": "A list of strings, with each giving a single classification value for the distribution.", - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "python.project" : { - "description": "More information regarding the creation and maintenance of the distribution.", - "$ref": "#/definitions/project_or_integrator" - }, - "python.integrator" : { - "description": "More information regarding the downstream redistributor of the distribution.", - "$ref": "#/definitions/project_or_integrator" - }, - "python.commands" : { - "description": "Command line interfaces provided by this distribution", - "type": "object", - "$ref": "#/definitions/commands" - }, - "python.exports" : { - "description": "Other exported interfaces provided by this distribution", - "type": "object", - "$ref": "#/definitions/exports" - } - }, - "additionalProperties": false - }, - "commands": { - "type": "object", - "properties": { - "wrap_console": { - "type": "object", - "$ref": "#/definitions/command_map" - }, - "wrap_gui": { - "type": "object", - "$ref": "#/definitions/command_map" - }, - "prebuilt": { - "type": "array", - "items": { - "type": "string", - "$ref": "#/definitions/relative_path" - } - } - }, - "additionalProperties": false - }, - "exports": { - "type": "object", - "patternProperties": { - "^[A-Za-z][0-9A-Za-z_]*([.][0-9A-Za-z_]*)*$": { - "type": "object", - "patternProperties": { - ".": { - "type": "string", - "$ref": "#/definitions/export_specifier" - } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "command_map": { - "type": "object", - "patternProperties": { - "^[0-9A-Za-z]([0-9A-Za-z_.-]*[0-9A-Za-z])?$": { - "type": "string", - "$ref": "#/definitions/export_specifier" - } - }, - "additionalProperties": false - }, - "project_or_integrator" : { - "type": "object", - "properties" : { - "contacts": { - "description": "A list of contributor entries giving the recommended contact points for getting more information about the project.", - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/contact" - } - }, - "contributors": { - "description": "A list of contributor entries for other contributors not already listed as current project points of contact.", - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/contact" - } - }, - "project_urls": { - "description": "A mapping of arbitrary text labels to additional URLs relevant to the project.", - "type": "object" - } - } - }, - "distribution_name": { - "type": "string", - "pattern": "^[0-9A-Za-z]([0-9A-Za-z_.-]*[0-9A-Za-z])?$" - }, - "requirement": { - "type": "string" - }, - "provides_declaration": { - "type": "string" - }, - "environment_marker": { - "type": "string" - }, - "document_name": { - "type": "string" - }, - "extra_name" : { - "type": "string", - "pattern": "^[0-9A-Za-z]([0-9A-Za-z_.-]*[0-9A-Za-z])?$" - }, - "relative_path" : { - "type": "string" - }, - "export_specifier": { - "type": "string", - "pattern": "^([A-Za-z_][A-Za-z_0-9]*([.][A-Za-z_][A-Za-z_0-9]*)*)(:[A-Za-z_][A-Za-z_0-9]*([.][A-Za-z_][A-Za-z_0-9]*)*)?(\\[[0-9A-Za-z]([0-9A-Za-z_.-]*[0-9A-Za-z])?\\])?$" - }, - "qualified_name" : { - "type": "string", - "pattern": "^[A-Za-z_][A-Za-z_0-9]*([.][A-Za-z_][A-Za-z_0-9]*)*$" - }, - "prefixed_name" : { - "type": "string", - "pattern": "^[A-Za-z_][A-Za-z_0-9]*([.][A-Za-z_0-9]*)*$" - } - } -} diff --git a/lib/python3.4/site-packages/wheel/test/simple.dist/setup.py b/lib/python3.4/site-packages/wheel/test/simple.dist/setup.py deleted file mode 100644 index 50c909f..0000000 --- a/lib/python3.4/site-packages/wheel/test/simple.dist/setup.py +++ /dev/null @@ -1,17 +0,0 @@ -from setuptools import setup - -try: - unicode - def u8(s): - return s.decode('unicode-escape').encode('utf-8') -except NameError: - def u8(s): - return s.encode('utf-8') - -setup(name='simple.dist', - version='0.1', - description=u8('A testing distribution \N{SNOWMAN}'), - packages=['simpledist'], - extras_require={'voting': ['beaglevote']}, - ) - diff --git a/lib/python3.4/site-packages/wheel/test/simple.dist/simpledist/__init__.py b/lib/python3.4/site-packages/wheel/test/simple.dist/simpledist/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/lib/python3.4/site-packages/wheel/test/test-1.0-py2.py3-none-win32.whl b/lib/python3.4/site-packages/wheel/test/test-1.0-py2.py3-none-win32.whl deleted file mode 100644 index 095583e337128a39ae7dfbf093199cb0909d3f0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5224 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 0, "No metadata.json found" - -def test_util(): - """Test functions in util.py.""" - for i in range(10): - before = b'*' * i - encoded = wheel.util.urlsafe_b64encode(before) - assert not encoded.endswith(b'=') - after = wheel.util.urlsafe_b64decode(encoded) - assert before == after - - -def test_pick_best(): - """Test the wheel ranking algorithm.""" - def get_tags(res): - info = res[-1].parsed_filename.groupdict() - return info['pyver'], info['abi'], info['plat'] - - cand_tags = [('py27', 'noabi', 'noarch'), ('py26', 'noabi', 'noarch'), - ('cp27', 'noabi', 'linux_i686'), - ('cp26', 'noabi', 'linux_i686'), - ('cp27', 'noabi', 'linux_x86_64'), - ('cp26', 'noabi', 'linux_x86_64')] - cand_wheels = [WheelFile('testpkg-1.0-%s-%s-%s.whl' % t) - for t in cand_tags] - - supported = [('cp27', 'noabi', 'linux_i686'), ('py27', 'noabi', 'noarch')] - supported2 = [('cp27', 'noabi', 'linux_i686'), ('py27', 'noabi', 'noarch'), - ('cp26', 'noabi', 'linux_i686'), ('py26', 'noabi', 'noarch')] - supported3 = [('cp26', 'noabi', 'linux_i686'), ('py26', 'noabi', 'noarch'), - ('cp27', 'noabi', 'linux_i686'), ('py27', 'noabi', 'noarch')] - - for supp in (supported, supported2, supported3): - context = lambda: list(supp) - for wheel in cand_wheels: - wheel.context = context - best = max(cand_wheels) - assert list(best.tags)[0] == supp[0] - - # assert_equal( - # list(map(get_tags, pick_best(cand_wheels, supp, top=False))), supp) diff --git a/lib/python3.4/site-packages/wheel/test/test_install.py b/lib/python3.4/site-packages/wheel/test/test_install.py deleted file mode 100644 index ddcddf5..0000000 --- a/lib/python3.4/site-packages/wheel/test/test_install.py +++ /dev/null @@ -1,55 +0,0 @@ -# Test wheel. -# The file has the following contents: -# hello.pyd -# hello/hello.py -# hello/__init__.py -# test-1.0.data/data/hello.dat -# test-1.0.data/headers/hello.dat -# test-1.0.data/scripts/hello.sh -# test-1.0.dist-info/WHEEL -# test-1.0.dist-info/METADATA -# test-1.0.dist-info/RECORD -# The root is PLATLIB -# So, some in PLATLIB, and one in each of DATA, HEADERS and SCRIPTS. - -import wheel.tool -import wheel.pep425tags -from wheel.install import WheelFile -from tempfile import mkdtemp -import shutil -import os - -THISDIR = os.path.dirname(__file__) -TESTWHEEL = os.path.join(THISDIR, 'test-1.0-py2.py3-none-win32.whl') - -def check(*path): - return os.path.exists(os.path.join(*path)) - -def test_install(): - tempdir = mkdtemp() - def get_supported(): - return list(wheel.pep425tags.get_supported()) + [('py3', 'none', 'win32')] - whl = WheelFile(TESTWHEEL, context=get_supported) - assert whl.supports_current_python(get_supported) - try: - locs = {} - for key in ('purelib', 'platlib', 'scripts', 'headers', 'data'): - locs[key] = os.path.join(tempdir, key) - os.mkdir(locs[key]) - whl.install(overrides=locs) - assert len(os.listdir(locs['purelib'])) == 0 - assert check(locs['platlib'], 'hello.pyd') - assert check(locs['platlib'], 'hello', 'hello.py') - assert check(locs['platlib'], 'hello', '__init__.py') - assert check(locs['data'], 'hello.dat') - assert check(locs['headers'], 'hello.dat') - assert check(locs['scripts'], 'hello.sh') - assert check(locs['platlib'], 'test-1.0.dist-info', 'RECORD') - finally: - shutil.rmtree(tempdir) - -def test_install_tool(): - """Slightly improve coverage of wheel.install""" - wheel.tool.install([TESTWHEEL], force=True, dry_run=True) - - \ No newline at end of file diff --git a/lib/python3.4/site-packages/wheel/test/test_keys.py b/lib/python3.4/site-packages/wheel/test/test_keys.py deleted file mode 100644 index f96166b..0000000 --- a/lib/python3.4/site-packages/wheel/test/test_keys.py +++ /dev/null @@ -1,98 +0,0 @@ -import tempfile -import os.path -import unittest -import json - -from wheel.signatures import keys - -wheel_json = """ -{ - "verifiers": [ - { - "scope": "+", - "vk": "bp-bjK2fFgtA-8DhKKAAPm9-eAZcX_u03oBv2RlKOBc" - }, - { - "scope": "+", - "vk": "KAHZBfyqFW3OcFDbLSG4nPCjXxUPy72phP9I4Rn9MAo" - }, - { - "scope": "+", - "vk": "tmAYCrSfj8gtJ10v3VkvW7jOndKmQIYE12hgnFu3cvk" - } - ], - "signers": [ - { - "scope": "+", - "vk": "tmAYCrSfj8gtJ10v3VkvW7jOndKmQIYE12hgnFu3cvk" - }, - { - "scope": "+", - "vk": "KAHZBfyqFW3OcFDbLSG4nPCjXxUPy72phP9I4Rn9MAo" - } - ], - "schema": 1 -} -""" - -class TestWheelKeys(unittest.TestCase): - def setUp(self): - self.config = tempfile.NamedTemporaryFile(suffix='.json') - self.config.close() - - self.config_path, self.config_filename = os.path.split(self.config.name) - def load(*args): - return [self.config_path] - def save(*args): - return self.config_path - keys.load_config_paths = load - keys.save_config_path = save - self.wk = keys.WheelKeys() - self.wk.CONFIG_NAME = self.config_filename - - def tearDown(self): - os.unlink(self.config.name) - - def test_load_save(self): - self.wk.data = json.loads(wheel_json) - - self.wk.add_signer('+', '67890') - self.wk.add_signer('scope', 'abcdefg') - - self.wk.trust('epocs', 'gfedcba') - self.wk.trust('+', '12345') - - self.wk.save() - - del self.wk.data - self.wk.load() - - signers = self.wk.signers('scope') - self.assertTrue(signers[0] == ('scope', 'abcdefg'), self.wk.data['signers']) - self.assertTrue(signers[1][0] == '+', self.wk.data['signers']) - - trusted = self.wk.trusted('epocs') - self.assertTrue(trusted[0] == ('epocs', 'gfedcba')) - self.assertTrue(trusted[1][0] == '+') - - self.wk.untrust('epocs', 'gfedcba') - trusted = self.wk.trusted('epocs') - self.assertTrue(('epocs', 'gfedcba') not in trusted) - - def test_load_save_incomplete(self): - self.wk.data = json.loads(wheel_json) - del self.wk.data['signers'] - self.wk.data['schema'] = self.wk.SCHEMA+1 - self.wk.save() - try: - self.wk.load() - except ValueError: - pass - else: - raise Exception("Expected ValueError") - - del self.wk.data['schema'] - self.wk.save() - self.wk.load() - - diff --git a/lib/python3.4/site-packages/wheel/test/test_paths.py b/lib/python3.4/site-packages/wheel/test/test_paths.py deleted file mode 100644 index a23d506..0000000 --- a/lib/python3.4/site-packages/wheel/test/test_paths.py +++ /dev/null @@ -1,6 +0,0 @@ -import wheel.paths -from distutils.command.install import SCHEME_KEYS - -def test_path(): - d = wheel.paths.get_install_paths('wheel') - assert len(d) == len(SCHEME_KEYS) diff --git a/lib/python3.4/site-packages/wheel/test/test_ranking.py b/lib/python3.4/site-packages/wheel/test/test_ranking.py deleted file mode 100644 index 1632a13..0000000 --- a/lib/python3.4/site-packages/wheel/test/test_ranking.py +++ /dev/null @@ -1,43 +0,0 @@ -import unittest - -from wheel.pep425tags import get_supported -from wheel.install import WheelFile - -WHEELPAT = "%(name)s-%(ver)s-%(pyver)s-%(abi)s-%(arch)s.whl" -def make_wheel(name, ver, pyver, abi, arch): - name = WHEELPAT % dict(name=name, ver=ver, pyver=pyver, abi=abi, - arch=arch) - return WheelFile(name) - -# This relies on the fact that generate_supported will always return the -# exact pyver, abi, and architecture for its first (best) match. -sup = get_supported() -pyver, abi, arch = sup[0] -genver = 'py' + pyver[2:] -majver = genver[:3] - -COMBINATIONS = ( - ('bar', '0.9', 'py2.py3', 'none', 'any'), - ('bar', '0.9', majver, 'none', 'any'), - ('bar', '0.9', genver, 'none', 'any'), - ('bar', '0.9', pyver, abi, arch), - ('bar', '1.3.2', majver, 'none', 'any'), - ('bar', '3.1', genver, 'none', 'any'), - ('bar', '3.1', pyver, abi, arch), - ('foo', '1.0', majver, 'none', 'any'), - ('foo', '1.1', pyver, abi, arch), - ('foo', '2.1', majver + '0', 'none', 'any'), - # This will not be compatible for Python x.0. Beware when we hit Python - # 4.0, and don't test with 3.0!!! - ('foo', '2.1', majver + '1', 'none', 'any'), - ('foo', '2.1', pyver , 'none', 'any'), - ('foo', '2.1', pyver , abi, arch), -) - -WHEELS = [ make_wheel(*args) for args in COMBINATIONS ] - -class TestRanking(unittest.TestCase): - def test_comparison(self): - for i in range(len(WHEELS)-1): - for j in range(i): - self.assertTrue(WHEELS[j]') - setup_py = SETUP_PY.format(ext_modules=EXT_MODULES) - else: - setup_py = SETUP_PY.format(ext_modules='') - temppath.join('setup.py').write(setup_py) - return temppath - -@pytest.fixture -def temp_ext_pkg(request): - return temp_pkg(request, ext=True) - -def test_default_tag(temp_pkg): - subprocess.check_call([sys.executable, 'setup.py', 'bdist_wheel'], - cwd=str(temp_pkg)) - dist_dir = temp_pkg.join('dist') - assert dist_dir.check(dir=1) - wheels = dist_dir.listdir() - assert len(wheels) == 1 - assert wheels[0].basename == 'Test-1.0-py%s-none-any.whl' % (sys.version[0],) - assert wheels[0].ext == '.whl' - -def test_explicit_tag(temp_pkg): - subprocess.check_call( - [sys.executable, 'setup.py', 'bdist_wheel', '--python-tag=py32'], - cwd=str(temp_pkg)) - dist_dir = temp_pkg.join('dist') - assert dist_dir.check(dir=1) - wheels = dist_dir.listdir() - assert len(wheels) == 1 - assert wheels[0].basename.startswith('Test-1.0-py32-') - assert wheels[0].ext == '.whl' - -def test_universal_tag(temp_pkg): - subprocess.check_call( - [sys.executable, 'setup.py', 'bdist_wheel', '--universal'], - cwd=str(temp_pkg)) - dist_dir = temp_pkg.join('dist') - assert dist_dir.check(dir=1) - wheels = dist_dir.listdir() - assert len(wheels) == 1 - assert wheels[0].basename.startswith('Test-1.0-py2.py3-') - assert wheels[0].ext == '.whl' - -def test_universal_beats_explicit_tag(temp_pkg): - subprocess.check_call( - [sys.executable, 'setup.py', 'bdist_wheel', '--universal', '--python-tag=py32'], - cwd=str(temp_pkg)) - dist_dir = temp_pkg.join('dist') - assert dist_dir.check(dir=1) - wheels = dist_dir.listdir() - assert len(wheels) == 1 - assert wheels[0].basename.startswith('Test-1.0-py2.py3-') - assert wheels[0].ext == '.whl' - -def test_universal_in_setup_cfg(temp_pkg): - temp_pkg.join('setup.cfg').write('[bdist_wheel]\nuniversal=1') - subprocess.check_call( - [sys.executable, 'setup.py', 'bdist_wheel'], - cwd=str(temp_pkg)) - dist_dir = temp_pkg.join('dist') - assert dist_dir.check(dir=1) - wheels = dist_dir.listdir() - assert len(wheels) == 1 - assert wheels[0].basename.startswith('Test-1.0-py2.py3-') - assert wheels[0].ext == '.whl' - -def test_pythontag_in_setup_cfg(temp_pkg): - temp_pkg.join('setup.cfg').write('[bdist_wheel]\npython_tag=py32') - subprocess.check_call( - [sys.executable, 'setup.py', 'bdist_wheel'], - cwd=str(temp_pkg)) - dist_dir = temp_pkg.join('dist') - assert dist_dir.check(dir=1) - wheels = dist_dir.listdir() - assert len(wheels) == 1 - assert wheels[0].basename.startswith('Test-1.0-py32-') - assert wheels[0].ext == '.whl' - -def test_legacy_wheel_section_in_setup_cfg(temp_pkg): - temp_pkg.join('setup.cfg').write('[wheel]\nuniversal=1') - subprocess.check_call( - [sys.executable, 'setup.py', 'bdist_wheel'], - cwd=str(temp_pkg)) - dist_dir = temp_pkg.join('dist') - assert dist_dir.check(dir=1) - wheels = dist_dir.listdir() - assert len(wheels) == 1 - assert wheels[0].basename.startswith('Test-1.0-py2.py3-') - assert wheels[0].ext == '.whl' - -def test_plat_name_purepy(temp_pkg): - subprocess.check_call( - [sys.executable, 'setup.py', 'bdist_wheel', '--plat-name=testplat.pure'], - cwd=str(temp_pkg)) - dist_dir = temp_pkg.join('dist') - assert dist_dir.check(dir=1) - wheels = dist_dir.listdir() - assert len(wheels) == 1 - assert wheels[0].basename.endswith('-testplat_pure.whl') - assert wheels[0].ext == '.whl' - -def test_plat_name_ext(temp_ext_pkg): - try: - subprocess.check_call( - [sys.executable, 'setup.py', 'bdist_wheel', '--plat-name=testplat.arch'], - cwd=str(temp_ext_pkg)) - except subprocess.CalledProcessError: - pytest.skip("Cannot compile C Extensions") - dist_dir = temp_ext_pkg.join('dist') - assert dist_dir.check(dir=1) - wheels = dist_dir.listdir() - assert len(wheels) == 1 - assert wheels[0].basename.endswith('-testplat_arch.whl') - assert wheels[0].ext == '.whl' - -def test_plat_name_purepy_in_setupcfg(temp_pkg): - temp_pkg.join('setup.cfg').write('[bdist_wheel]\nplat_name=testplat.pure') - subprocess.check_call( - [sys.executable, 'setup.py', 'bdist_wheel'], - cwd=str(temp_pkg)) - dist_dir = temp_pkg.join('dist') - assert dist_dir.check(dir=1) - wheels = dist_dir.listdir() - assert len(wheels) == 1 - assert wheels[0].basename.endswith('-testplat_pure.whl') - assert wheels[0].ext == '.whl' - -def test_plat_name_ext_in_setupcfg(temp_ext_pkg): - temp_ext_pkg.join('setup.cfg').write('[bdist_wheel]\nplat_name=testplat.arch') - try: - subprocess.check_call( - [sys.executable, 'setup.py', 'bdist_wheel'], - cwd=str(temp_ext_pkg)) - except subprocess.CalledProcessError: - pytest.skip("Cannot compile C Extensions") - dist_dir = temp_ext_pkg.join('dist') - assert dist_dir.check(dir=1) - wheels = dist_dir.listdir() - assert len(wheels) == 1 - assert wheels[0].basename.endswith('-testplat_arch.whl') - assert wheels[0].ext == '.whl' diff --git a/lib/python3.4/site-packages/wheel/test/test_tool.py b/lib/python3.4/site-packages/wheel/test/test_tool.py deleted file mode 100644 index 078f1ed..0000000 --- a/lib/python3.4/site-packages/wheel/test/test_tool.py +++ /dev/null @@ -1,25 +0,0 @@ -from .. import tool - -def test_keygen(): - def get_keyring(): - WheelKeys, keyring = tool.get_keyring() - - class WheelKeysTest(WheelKeys): - def save(self): - pass - - class keyringTest: - @classmethod - def get_keyring(cls): - class keyringTest2: - pw = None - def set_password(self, a, b, c): - self.pw = c - def get_password(self, a, b): - return self.pw - - return keyringTest2() - - return WheelKeysTest, keyringTest - - tool.keygen(get_keyring=get_keyring) diff --git a/lib/python3.4/site-packages/wheel/test/test_wheelfile.py b/lib/python3.4/site-packages/wheel/test/test_wheelfile.py deleted file mode 100644 index 181668f..0000000 --- a/lib/python3.4/site-packages/wheel/test/test_wheelfile.py +++ /dev/null @@ -1,142 +0,0 @@ -import os -import wheel.install -import wheel.archive -import hashlib -try: - from StringIO import StringIO -except ImportError: - from io import BytesIO as StringIO -import codecs -import zipfile -import pytest -import shutil -import tempfile -from contextlib import contextmanager - -@contextmanager -def environ(key, value): - old_value = os.environ.get(key) - try: - os.environ[key] = value - yield - finally: - if old_value is None: - del os.environ[key] - else: - os.environ[key] = old_value - -@contextmanager -def temporary_directory(): - # tempfile.TemporaryDirectory doesn't exist in Python 2. - tempdir = tempfile.mkdtemp() - try: - yield tempdir - finally: - shutil.rmtree(tempdir) - -@contextmanager -def readable_zipfile(path): - # zipfile.ZipFile() isn't a context manager under Python 2. - zf = zipfile.ZipFile(path, 'r') - try: - yield zf - finally: - zf.close() - - -def test_verifying_zipfile(): - if not hasattr(zipfile.ZipExtFile, '_update_crc'): - pytest.skip('No ZIP verification. Missing ZipExtFile._update_crc.') - - sio = StringIO() - zf = zipfile.ZipFile(sio, 'w') - zf.writestr("one", b"first file") - zf.writestr("two", b"second file") - zf.writestr("three", b"third file") - zf.close() - - # In default mode, VerifyingZipFile checks the hash of any read file - # mentioned with set_expected_hash(). Files not mentioned with - # set_expected_hash() are not checked. - vzf = wheel.install.VerifyingZipFile(sio, 'r') - vzf.set_expected_hash("one", hashlib.sha256(b"first file").digest()) - vzf.set_expected_hash("three", "blurble") - vzf.open("one").read() - vzf.open("two").read() - try: - vzf.open("three").read() - except wheel.install.BadWheelFile: - pass - else: - raise Exception("expected exception 'BadWheelFile()'") - - # In strict mode, VerifyingZipFile requires every read file to be - # mentioned with set_expected_hash(). - vzf.strict = True - try: - vzf.open("two").read() - except wheel.install.BadWheelFile: - pass - else: - raise Exception("expected exception 'BadWheelFile()'") - - vzf.set_expected_hash("two", None) - vzf.open("two").read() - -def test_pop_zipfile(): - sio = StringIO() - zf = wheel.install.VerifyingZipFile(sio, 'w') - zf.writestr("one", b"first file") - zf.writestr("two", b"second file") - zf.close() - - try: - zf.pop() - except RuntimeError: - pass # already closed - else: - raise Exception("expected RuntimeError") - - zf = wheel.install.VerifyingZipFile(sio, 'a') - zf.pop() - zf.close() - - zf = wheel.install.VerifyingZipFile(sio, 'r') - assert len(zf.infolist()) == 1 - -def test_zipfile_timestamp(): - # An environment variable can be used to influence the timestamp on - # TarInfo objects inside the zip. See issue #143. TemporaryDirectory is - # not a context manager under Python 3. - with temporary_directory() as tempdir: - for filename in ('one', 'two', 'three'): - path = os.path.join(tempdir, filename) - with codecs.open(path, 'w', encoding='utf-8') as fp: - fp.write(filename + '\n') - zip_base_name = os.path.join(tempdir, 'dummy') - # The earliest date representable in TarInfos, 1980-01-01 - with environ('SOURCE_DATE_EPOCH', '315576060'): - zip_filename = wheel.archive.make_wheelfile_inner( - zip_base_name, tempdir) - with readable_zipfile(zip_filename) as zf: - for info in zf.infolist(): - assert info.date_time[:3] == (1980, 1, 1) - -def test_zipfile_attributes(): - # With the change from ZipFile.write() to .writestr(), we need to manually - # set member attributes. - with temporary_directory() as tempdir: - files = (('foo', 0o644), ('bar', 0o755)) - for filename, mode in files: - path = os.path.join(tempdir, filename) - with codecs.open(path, 'w', encoding='utf-8') as fp: - fp.write(filename + '\n') - os.chmod(path, mode) - zip_base_name = os.path.join(tempdir, 'dummy') - zip_filename = wheel.archive.make_wheelfile_inner( - zip_base_name, tempdir) - with readable_zipfile(zip_filename) as zf: - for filename, mode in files: - info = zf.getinfo(os.path.join(tempdir, filename)) - assert info.external_attr == (mode | 0o100000) << 16 - assert info.compress_type == zipfile.ZIP_DEFLATED diff --git a/lib/python3.4/site-packages/wheel/tool/__init__.py b/lib/python3.4/site-packages/wheel/tool/__init__.py index 95f0a9b..d6b9893 100644 --- a/lib/python3.4/site-packages/wheel/tool/__init__.py +++ b/lib/python3.4/site-packages/wheel/tool/__init__.py @@ -2,27 +2,29 @@ Wheel command-line utility. """ -import os +import argparse import hashlib -import sys import json -import wheel.paths - +import os +import sys from glob import iglob + from .. import signatures -from ..util import (urlsafe_b64decode, urlsafe_b64encode, native, binary, - matches_requirement) -from ..install import WheelFile +from ..install import WheelFile, VerifyingZipFile +from ..paths import get_install_command +from ..util import urlsafe_b64decode, urlsafe_b64encode, native, binary, matches_requirement + def require_pkgresources(name): try: - import pkg_resources + import pkg_resources # noqa: F401 except ImportError: raise RuntimeError("'{0}' needs pkg_resources (part of setuptools).".format(name)) -import argparse -class WheelError(Exception): pass +class WheelError(Exception): + pass + # For testability def get_keyring(): @@ -31,9 +33,12 @@ def get_keyring(): import keyring assert keyring.get_keyring().priority except (ImportError, AssertionError): - raise WheelError("Install wheel[signatures] (requires keyring, keyrings.alt, pyxdg) for signatures.") + raise WheelError( + "Install wheel[signatures] (requires keyring, keyrings.alt, pyxdg) for signatures.") + return keys.WheelKeys, keyring + def keygen(get_keyring=get_keyring): """Generate a public/private key pair.""" WheelKeys, keyring = get_keyring() @@ -59,6 +64,7 @@ def keygen(get_keyring=get_keyring): wk.trust('+', vk) wk.save() + def sign(wheelfile, replace=False, get_keyring=get_keyring): """Sign a wheel""" WheelKeys, keyring = get_keyring() @@ -78,17 +84,17 @@ def sign(wheelfile, replace=False, get_keyring=get_keyring): keypair = ed25519ll.Keypair(urlsafe_b64decode(binary(vk)), urlsafe_b64decode(binary(sk))) - record_name = wf.distinfo_name + '/RECORD' sig_name = wf.distinfo_name + '/RECORD.jws' if sig_name in wf.zipfile.namelist(): raise WheelError("Wheel is already signed.") record_data = wf.zipfile.read(record_name) - payload = {"hash":"sha256=" + native(urlsafe_b64encode(hashlib.sha256(record_data).digest()))} + payload = {"hash": "sha256=" + native(urlsafe_b64encode(hashlib.sha256(record_data).digest()))} sig = signatures.sign(payload, keypair) wf.zipfile.writestr(sig_name, json.dumps(sig, sort_keys=True)) wf.zipfile.close() + def unsign(wheelfile): """ Remove RECORD.jws from a wheel by truncating the zip file. @@ -97,14 +103,14 @@ def unsign(wheelfile): ordinary archive, with the compressed files and the directory in the same order, and without any non-zip content after the truncation point. """ - import wheel.install - vzf = wheel.install.VerifyingZipFile(wheelfile, "a") + vzf = VerifyingZipFile(wheelfile, "a") info = vzf.infolist() if not (len(info) and info[-1].filename.endswith('/RECORD.jws')): - raise WheelError("RECORD.jws not found at end of archive.") + raise WheelError('The wheel is not signed (RECORD.jws not found at end of the archive).') vzf.pop() vzf.close() + def verify(wheelfile): """Verify a wheel. @@ -114,12 +120,17 @@ def verify(wheelfile): """ wf = WheelFile(wheelfile) sig_name = wf.distinfo_name + '/RECORD.jws' - sig = json.loads(native(wf.zipfile.open(sig_name).read())) + try: + sig = json.loads(native(wf.zipfile.open(sig_name).read())) + except KeyError: + raise WheelError('The wheel is not signed (RECORD.jws not found at end of the archive).') + verified = signatures.verify(sig) sys.stderr.write("Signatures are internally consistent.\n") sys.stdout.write(json.dumps(verified, indent=2)) sys.stdout.write('\n') + def unpack(wheelfile, dest='.'): """Unpack a wheel. @@ -136,6 +147,7 @@ def unpack(wheelfile, dest='.'): wf.zipfile.extractall(destination) wf.zipfile.close() + def install(requirements, requirements_file=None, wheel_dirs=None, force=False, list_files=False, dry_run=False): @@ -156,7 +168,7 @@ def install(requirements, requirements_file=None, if wheelpath: wheel_dirs = wheelpath.split(os.pathsep) else: - wheel_dirs = [ os.path.curdir ] + wheel_dirs = [os.path.curdir] # Get a list of all valid wheels in wheel_dirs all_wheels = [] @@ -221,6 +233,7 @@ def install(requirements, requirements_file=None, wf.install(force=force) wf.zipfile.close() + def install_scripts(distributions): """ Regenerate the entry_points console_scripts for the named distribution. @@ -233,12 +246,13 @@ def install_scripts(distributions): for dist in distributions: pkg_resources_dist = pkg_resources.get_distribution(dist) - install = wheel.paths.get_install_command(dist) + install = get_install_command(dist) command = easy_install.easy_install(install.distribution) - command.args = ['wheel'] # dummy argument + command.args = ['wheel'] # dummy argument command.finalize_options() command.install_egg_scripts(pkg_resources_dist) + def convert(installers, dest_dir, verbose): require_pkgresources('wheel convert') @@ -259,6 +273,7 @@ def convert(installers, dest_dir, verbose): if verbose: sys.stdout.write("OK\n") + def parser(): p = argparse.ArgumentParser() s = p.add_subparsers(help="commands") @@ -328,7 +343,7 @@ def parser(): convert_parser = s.add_parser('convert', help='Convert egg or wininst to wheel') convert_parser.add_argument('installers', nargs='*', help='Installers to convert') convert_parser.add_argument('--dest-dir', '-d', default=os.path.curdir, - help="Directory to store wheels (default %(default)s)") + help="Directory to store wheels (default %(default)s)") convert_parser.add_argument('--verbose', '-v', action='store_true') convert_parser.set_defaults(func=convert_f) @@ -345,6 +360,7 @@ def parser(): return p + def main(): p = parser() args = p.parse_args() diff --git a/lib/python3.4/site-packages/wheel/util.py b/lib/python3.4/site-packages/wheel/util.py index 5268813..c58d108 100644 --- a/lib/python3.4/site-packages/wheel/util.py +++ b/lib/python3.4/site-packages/wheel/util.py @@ -1,18 +1,32 @@ """Utility functions.""" -import sys -import os import base64 -import json import hashlib -try: - from collections import OrderedDict -except ImportError: - OrderedDict = dict +import json +import os +import sys +from collections import OrderedDict __all__ = ['urlsafe_b64encode', 'urlsafe_b64decode', 'utf8', 'to_json', 'from_json', 'matches_requirement'] + +# For encoding ascii back and forth between bytestrings, as is repeatedly +# necessary in JSON-based crypto under Python 3 +if sys.version_info[0] < 3: + text_type = unicode # noqa: F821 + + def native(s): + return s +else: + text_type = str + + def native(s): + if isinstance(s, bytes): + return s.decode('ascii') + return s + + def urlsafe_b64encode(data): """urlsafe_b64encode without padding""" return base64.urlsafe_b64encode(data).rstrip(binary('=')) @@ -25,76 +39,67 @@ def urlsafe_b64decode(data): def to_json(o): - '''Convert given data to JSON.''' + """Convert given data to JSON.""" return json.dumps(o, sort_keys=True) def from_json(j): - '''Decode a JSON payload.''' + """Decode a JSON payload.""" return json.loads(j) + def open_for_csv(name, mode): if sys.version_info[0] < 3: nl = {} bin = 'b' else: - nl = { 'newline': '' } + nl = {'newline': ''} bin = '' + return open(name, mode + bin, **nl) -try: - unicode - def utf8(data): - '''Utf-8 encode data.''' - if isinstance(data, unicode): - return data.encode('utf-8') - return data -except NameError: - def utf8(data): - '''Utf-8 encode data.''' - if isinstance(data, str): - return data.encode('utf-8') - return data +def utf8(data): + """Utf-8 encode data.""" + if isinstance(data, text_type): + return data.encode('utf-8') + return data -try: - # For encoding ascii back and forth between bytestrings, as is repeatedly - # necessary in JSON-based crypto under Python 3 - unicode - def native(s): - return s - def binary(s): - if isinstance(s, unicode): - return s.encode('ascii') - return s -except NameError: - def native(s): - if isinstance(s, bytes): - return s.decode('ascii') - return s - def binary(s): - if isinstance(s, str): - return s.encode('ascii') +def binary(s): + if isinstance(s, text_type): + return s.encode('ascii') + return s + class HashingFile(object): - def __init__(self, fd, hashtype='sha256'): - self.fd = fd + def __init__(self, path, mode, hashtype='sha256'): + self.fd = open(path, mode) self.hashtype = hashtype self.hash = hashlib.new(hashtype) self.length = 0 + def write(self, data): self.hash.update(data) self.length += len(data) self.fd.write(data) + def close(self): self.fd.close() + def digest(self): if self.hashtype == 'md5': return self.hash.hexdigest() digest = self.hash.digest() return self.hashtype + '=' + native(urlsafe_b64encode(digest)) + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.fd.close() + + class OrderedDefaultDict(OrderedDict): def __init__(self, *args, **kwargs): if not args: @@ -106,18 +111,19 @@ class OrderedDefaultDict(OrderedDict): args = args[1:] super(OrderedDefaultDict, self).__init__(*args, **kwargs) - def __missing__ (self, key): + def __missing__(self, key): if self.default_factory is None: raise KeyError(key) self[key] = default = self.default_factory() return default + if sys.platform == 'win32': import ctypes.wintypes # CSIDL_APPDATA for reference - not used here for compatibility with # dirspec, which uses LOCAL_APPDATA and COMMON_APPDATA in that order - csidl = dict(CSIDL_APPDATA=26, CSIDL_LOCAL_APPDATA=28, - CSIDL_COMMON_APPDATA=35) + csidl = dict(CSIDL_APPDATA=26, CSIDL_LOCAL_APPDATA=28, CSIDL_COMMON_APPDATA=35) + def get_path(name): SHGFP_TYPE_CURRENT = 0 buf = ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH) @@ -130,6 +136,7 @@ if sys.platform == 'win32': if not os.path.isdir(path): os.makedirs(path) return path + def load_config_paths(*resource): ids = ["CSIDL_LOCAL_APPDATA", "CSIDL_COMMON_APPDATA"] for id in ids: @@ -141,10 +148,12 @@ else: def save_config_path(*resource): import xdg.BaseDirectory return xdg.BaseDirectory.save_config_path(*resource) + def load_config_paths(*resource): import xdg.BaseDirectory return xdg.BaseDirectory.load_config_paths(*resource) + def matches_requirement(req, wheels): """List of wheels matching a requirement. diff --git a/lib/python3.4/site-packages/wheel/wininst2wheel.py b/lib/python3.4/site-packages/wheel/wininst2wheel.py index 297f8d1..b8a3469 100644 --- a/lib/python3.4/site-packages/wheel/wininst2wheel.py +++ b/lib/python3.4/site-packages/wheel/wininst2wheel.py @@ -1,23 +1,24 @@ #!/usr/bin/env python +import distutils.dist import os.path import re import sys import tempfile import zipfile -import wheel.bdist_wheel -import distutils.dist -from distutils.archive_util import make_archive -from shutil import rmtree -from wheel.archive import archive_wheelfile from argparse import ArgumentParser from glob import iglob +from shutil import rmtree + +import wheel.bdist_wheel +from wheel.archive import archive_wheelfile egg_info_re = re.compile(r'''(^|/)(?P[^/]+?)-(?P.+?) (-(?P.+?))?(-(?P.+?))?.egg-info(/|$)''', re.VERBOSE) + def parse_info(wininfo_name, egginfo_name): """Extract metadata from filenames. - + Extracts the 4 metadataitems needed (name, version, pyversion, arch) from the installer filename and the name of the egg-info directory embedded in the zipfile (if any). @@ -52,15 +53,14 @@ def parse_info(wininfo_name, egginfo_name): if egginfo_name: egginfo = egg_info_re.search(egginfo_name) if not egginfo: - raise ValueError("Egg info filename %s is not valid" % - (egginfo_name,)) + raise ValueError("Egg info filename %s is not valid" % (egginfo_name,)) # Parse the wininst filename # 1. Distribution name (up to the first '-') w_name, sep, rest = wininfo_name.partition('-') if not sep: - raise ValueError("Installer filename %s is not valid" % - (wininfo_name,)) + raise ValueError("Installer filename %s is not valid" % (wininfo_name,)) + # Strip '.exe' rest = rest[:-4] # 2. Python version (from the last '-', must start with 'py') @@ -78,8 +78,7 @@ def parse_info(wininfo_name, egginfo_name): # 3. Version and architecture w_ver, sep, w_arch = rest.rpartition('.') if not sep: - raise ValueError("Installer filename %s is not valid" % - (wininfo_name,)) + raise ValueError("Installer filename %s is not valid" % (wininfo_name,)) if egginfo: w_name = egginfo.group('name') @@ -87,6 +86,7 @@ def parse_info(wininfo_name, egginfo_name): return dict(name=w_name, ver=w_ver, arch=w_arch, pyver=w_pyver) + def bdist_wininst2wheel(path, dest_dir=os.path.curdir): bdw = zipfile.ZipFile(path) @@ -158,21 +158,50 @@ def bdist_wininst2wheel(path, dest_dir=os.path.curdir): abi, arch )) - bw = wheel.bdist_wheel.bdist_wheel(distutils.dist.Distribution()) - bw.root_is_purelib = root_is_purelib + if root_is_purelib: + bw = wheel.bdist_wheel.bdist_wheel(distutils.dist.Distribution()) + else: + bw = _bdist_wheel_tag(distutils.dist.Distribution()) + + bw.root_is_pure = root_is_purelib + bw.python_tag = pyver + bw.plat_name_supplied = True + bw.plat_name = info['arch'] or 'any' + + if not root_is_purelib: + bw.full_tag_supplied = True + bw.full_tag = (pyver, abi, arch) + dist_info_dir = os.path.join(dir, '%s.dist-info' % dist_info) bw.egg2dist(os.path.join(dir, egginfo_name), dist_info_dir) bw.write_wheelfile(dist_info_dir, generator='wininst2wheel') bw.write_record(dir, dist_info_dir) - + archive_wheelfile(os.path.join(dest_dir, wheel_name), dir) rmtree(dir) + +class _bdist_wheel_tag(wheel.bdist_wheel.bdist_wheel): + # allow the client to override the default generated wheel tag + # The default bdist_wheel implementation uses python and abi tags + # of the running python process. This is not suitable for + # generating/repackaging prebuild binaries. + + full_tag_supplied = False + full_tag = None # None or a (pytag, soabitag, plattag) triple + + def get_tag(self): + if self.full_tag_supplied and self.full_tag is not None: + return self.full_tag + else: + return super(_bdist_wheel_tag, self).get_tag() + + def main(): parser = ArgumentParser() parser.add_argument('installers', nargs='*', help="Installers to convert") parser.add_argument('--dest-dir', '-d', default=os.path.curdir, - help="Directory to store wheels (default %(default)s)") + help="Directory to store wheels (default %(default)s)") parser.add_argument('--verbose', '-v', action='store_true') args = parser.parse_args() for pat in args.installers: @@ -183,5 +212,6 @@ def main(): if args.verbose: sys.stdout.write("OK\n") + if __name__ == "__main__": main() diff --git a/update.sh b/update.sh index f9bd843..7602de6 100755 --- a/update.sh +++ b/update.sh @@ -15,7 +15,7 @@ mkdir old test -e lib && mv lib old/ test -e bin && mv bin old/ -rm -rf p34 p35 +rm -rf p34 p35 p36 virtualenv -p /usr/bin/python3.4 p34 p34/bin/pip3 install -r requirements.txt @@ -34,4 +34,15 @@ do cp p35/lib/python3.5/$f lib/python3.4/$f done -rm -r p34 p35 old requirements.txt +virtualenv -p /usr/bin/python3.6 p36 +p36/bin/pip3 install -r requirements.txt +for f in site-packages/ed25519/_ed25519.cpython-36m-x86_64-linux-gnu.so \ + site-packages/sqlalchemy/cprocessors.cpython-36m-x86_64-linux-gnu.so \ + site-packages/sqlalchemy/cresultproxy.cpython-36m-x86_64-linux-gnu.so \ + site-packages/sqlalchemy/cutils.cpython-36m-x86_64-linux-gnu.so \ + site-packages/netifaces.cpython-36m-x86_64-linux-gnu.so +do + cp p36/lib/python3.6/$f lib/python3.4/$f +done + +rm -r p34 p35 p36 old requirements.txt