From 2106592146836f5eef83d1010beb9cfbbb3baf3a Mon Sep 17 00:00:00 2001 From: benjamyn Date: Sun, 30 Jun 2019 22:56:49 +1000 Subject: [PATCH] updated codebase to support count --- .gitignore | 3 + PyGeoIP.py | 48 +- bip.sh | 13 + .../wheel/cli/install.py => blacklist.txt | 0 .../__pycache__/ipwhois_cli.cpython-37.pyc | Bin 29564 -> 29555 bytes .../ipwhois_utils_cli.cpython-37.pyc | Bin 4445 -> 4445 bytes env/bin/activate.csh | 20 +- env/bin/activate.fish | 2 +- env/bin/activate_this.py | 24 +- env/bin/ipwhois_cli.py | 8 +- env/bin/ipwhois_utils_cli.py | 2 +- env/bin/python | Bin 14096 -> 14088 bytes .../__pycache__/__future__.cpython-37.pyc | Bin 4157 -> 4157 bytes .../__pycache__/_bootlocale.cpython-37.pyc | Bin 1274 -> 1274 bytes .../_collections_abc.cpython-37.pyc | Bin 28967 -> 28967 bytes .../__pycache__/_weakrefset.cpython-37.pyc | Bin 7487 -> 7487 bytes .../python3.7/__pycache__/abc.cpython-37.pyc | Bin 6476 -> 6476 bytes .../__pycache__/base64.cpython-37.pyc | Bin 17013 -> 17013 bytes .../__pycache__/bisect.cpython-37.pyc | Bin 2723 -> 2723 bytes .../__pycache__/codecs.cpython-37.pyc | Bin 33923 -> 33923 bytes .../python3.7/__pycache__/copy.cpython-37.pyc | Bin 7126 -> 7126 bytes .../__pycache__/copyreg.cpython-37.pyc | Bin 4269 -> 4269 bytes .../python3.7/__pycache__/enum.cpython-37.pyc | Bin 23963 -> 24296 bytes .../__pycache__/fnmatch.cpython-37.pyc | Bin 3362 -> 3362 bytes .../__pycache__/functools.cpython-37.pyc | Bin 23974 -> 23980 bytes .../__pycache__/genericpath.cpython-37.pyc | Bin 3773 -> 3773 bytes .../__pycache__/hashlib.cpython-37.pyc | Bin 6616 -> 6616 bytes .../__pycache__/heapq.cpython-37.pyc | Bin 14387 -> 14387 bytes .../python3.7/__pycache__/hmac.cpython-37.pyc | Bin 6138 -> 6138 bytes .../python3.7/__pycache__/imp.cpython-37.pyc | Bin 9778 -> 9778 bytes .../python3.7/__pycache__/io.cpython-37.pyc | Bin 3434 -> 3434 bytes .../__pycache__/keyword.cpython-37.pyc | Bin 1834 -> 1834 bytes .../__pycache__/linecache.cpython-37.pyc | Bin 3814 -> 3814 bytes .../__pycache__/locale.cpython-37.pyc | Bin 34580 -> 34580 bytes .../__pycache__/operator.cpython-37.pyc | Bin 13925 -> 13925 bytes .../python3.7/__pycache__/os.cpython-37.pyc | Bin 29718 -> 29718 bytes .../__pycache__/posixpath.cpython-37.pyc | Bin 10421 -> 10455 bytes .../__pycache__/random.cpython-37.pyc | Bin 19419 -> 19433 bytes .../python3.7/__pycache__/re.cpython-37.pyc | Bin 13829 -> 13829 bytes .../__pycache__/reprlib.cpython-37.pyc | Bin 5375 -> 5375 bytes .../__pycache__/shutil.cpython-37.pyc | Bin 30570 -> 30889 bytes .../python3.7/__pycache__/site.cpython-37.pyc | Bin 20653 -> 22114 bytes .../__pycache__/sre_compile.cpython-37.pyc | Bin 15228 -> 15228 bytes .../__pycache__/sre_constants.cpython-37.pyc | Bin 6316 -> 6316 bytes .../__pycache__/sre_parse.cpython-37.pyc | Bin 21382 -> 21382 bytes .../python3.7/__pycache__/stat.cpython-37.pyc | Bin 3898 -> 3898 bytes .../__pycache__/struct.cpython-37.pyc | Bin 359 -> 359 bytes .../__pycache__/tarfile.cpython-37.pyc | Bin 61866 -> 61866 bytes .../__pycache__/tempfile.cpython-37.pyc | Bin 22170 -> 22170 bytes .../__pycache__/token.cpython-37.pyc | Bin 3624 -> 3624 bytes .../__pycache__/tokenize.cpython-37.pyc | Bin 17856 -> 17856 bytes .../__pycache__/types.cpython-37.pyc | Bin 8999 -> 9001 bytes .../__pycache__/warnings.cpython-37.pyc | Bin 13791 -> 13965 bytes .../__pycache__/weakref.cpython-37.pyc | Bin 19135 -> 19243 bytes env/lib/python3.7/distutils/__init__.py | 77 +- .../__pycache__/__init__.cpython-37.pyc | Bin 2856 -> 2800 bytes .../__pycache__/easy_install.cpython-37.pyc | Bin 281 -> 281 bytes .../dns/__pycache__/__init__.cpython-37.pyc | Bin 610 -> 610 bytes .../dns/__pycache__/_compat.cpython-37.pyc | Bin 1733 -> 1733 bytes .../dns/__pycache__/dnssec.cpython-37.pyc | Bin 12003 -> 12003 bytes .../dns/__pycache__/e164.cpython-37.pyc | Bin 3208 -> 3208 bytes .../dns/__pycache__/edns.cpython-37.pyc | Bin 7212 -> 7212 bytes .../dns/__pycache__/entropy.cpython-37.pyc | Bin 3306 -> 3306 bytes .../dns/__pycache__/exception.cpython-37.pyc | Bin 4119 -> 4119 bytes .../dns/__pycache__/flags.cpython-37.pyc | Bin 2226 -> 2226 bytes .../dns/__pycache__/grange.cpython-37.pyc | Bin 999 -> 999 bytes .../dns/__pycache__/hash.cpython-37.pyc | Bin 645 -> 645 bytes .../dns/__pycache__/inet.cpython-37.pyc | Bin 2410 -> 2410 bytes .../dns/__pycache__/ipv4.cpython-37.pyc | Bin 1382 -> 1382 bytes .../dns/__pycache__/ipv6.cpython-37.pyc | Bin 3057 -> 3057 bytes .../dns/__pycache__/message.cpython-37.pyc | Bin 30487 -> 30487 bytes .../dns/__pycache__/name.cpython-37.pyc | Bin 28440 -> 28440 bytes .../dns/__pycache__/namedict.cpython-37.pyc | Bin 3002 -> 3002 bytes .../dns/__pycache__/node.cpython-37.pyc | Bin 5757 -> 5757 bytes .../dns/__pycache__/opcode.cpython-37.pyc | Bin 2174 -> 2174 bytes .../dns/__pycache__/query.cpython-37.pyc | Bin 17205 -> 17205 bytes .../dns/__pycache__/rcode.cpython-37.pyc | Bin 2675 -> 2675 bytes .../dns/__pycache__/rdata.cpython-37.pyc | Bin 13710 -> 13710 bytes .../dns/__pycache__/rdataclass.cpython-37.pyc | Bin 2427 -> 2427 bytes .../dns/__pycache__/rdataset.cpython-37.pyc | Bin 9418 -> 9418 bytes .../dns/__pycache__/rdatatype.cpython-37.pyc | Bin 5027 -> 5027 bytes .../dns/__pycache__/renderer.cpython-37.pyc | Bin 7968 -> 7968 bytes .../dns/__pycache__/resolver.cpython-37.pyc | Bin 33613 -> 33613 bytes .../__pycache__/reversename.cpython-37.pyc | Bin 2526 -> 2526 bytes .../dns/__pycache__/rrset.cpython-37.pyc | Bin 5376 -> 5376 bytes .../dns/__pycache__/set.cpython-37.pyc | Bin 7444 -> 7444 bytes .../dns/__pycache__/tokenizer.cpython-37.pyc | Bin 14095 -> 14095 bytes .../dns/__pycache__/tsig.cpython-37.pyc | Bin 6223 -> 6223 bytes .../__pycache__/tsigkeyring.cpython-37.pyc | Bin 1080 -> 1080 bytes .../dns/__pycache__/ttl.cpython-37.pyc | Bin 1346 -> 1346 bytes .../dns/__pycache__/update.cpython-37.pyc | Bin 7374 -> 7374 bytes .../dns/__pycache__/version.cpython-37.pyc | Bin 475 -> 475 bytes .../dns/__pycache__/wiredata.cpython-37.pyc | Bin 2267 -> 2267 bytes .../dns/__pycache__/zone.cpython-37.pyc | Bin 31027 -> 31027 bytes .../ANY/__pycache__/AFSDB.cpython-37.pyc | Bin 1124 -> 1124 bytes .../ANY/__pycache__/AVC.cpython-37.pyc | Bin 475 -> 475 bytes .../ANY/__pycache__/CAA.cpython-37.pyc | Bin 2125 -> 2125 bytes .../ANY/__pycache__/CDNSKEY.cpython-37.pyc | Bin 507 -> 507 bytes .../ANY/__pycache__/CDS.cpython-37.pyc | Bin 384 -> 384 bytes .../ANY/__pycache__/CERT.cpython-37.pyc | Bin 3075 -> 3075 bytes .../ANY/__pycache__/CNAME.cpython-37.pyc | Bin 595 -> 595 bytes .../ANY/__pycache__/CSYNC.cpython-37.pyc | Bin 3239 -> 3239 bytes .../ANY/__pycache__/DLV.cpython-37.pyc | Bin 384 -> 384 bytes .../ANY/__pycache__/DNAME.cpython-37.pyc | Bin 552 -> 552 bytes .../ANY/__pycache__/DNSKEY.cpython-37.pyc | Bin 504 -> 504 bytes .../rdtypes/ANY/__pycache__/DS.cpython-37.pyc | Bin 381 -> 381 bytes .../ANY/__pycache__/EUI48.cpython-37.pyc | Bin 567 -> 567 bytes .../ANY/__pycache__/EUI64.cpython-37.pyc | Bin 567 -> 567 bytes .../ANY/__pycache__/GPOS.cpython-37.pyc | Bin 4181 -> 4181 bytes .../ANY/__pycache__/HINFO.cpython-37.pyc | Bin 2087 -> 2087 bytes .../ANY/__pycache__/HIP.cpython-37.pyc | Bin 3265 -> 3265 bytes .../ANY/__pycache__/ISDN.cpython-37.pyc | Bin 2315 -> 2315 bytes .../ANY/__pycache__/LOC.cpython-37.pyc | Bin 8286 -> 8286 bytes .../rdtypes/ANY/__pycache__/MX.cpython-37.pyc | Bin 381 -> 381 bytes .../rdtypes/ANY/__pycache__/NS.cpython-37.pyc | Bin 381 -> 381 bytes .../ANY/__pycache__/NSEC.cpython-37.pyc | Bin 3304 -> 3304 bytes .../ANY/__pycache__/NSEC3.cpython-37.pyc | Bin 4581 -> 4581 bytes .../ANY/__pycache__/NSEC3PARAM.cpython-37.pyc | Bin 2382 -> 2382 bytes .../ANY/__pycache__/OPENPGPKEY.cpython-37.pyc | Bin 1711 -> 1711 bytes .../ANY/__pycache__/PTR.cpython-37.pyc | Bin 384 -> 384 bytes .../rdtypes/ANY/__pycache__/RP.cpython-37.pyc | Bin 2348 -> 2348 bytes .../ANY/__pycache__/RRSIG.cpython-37.pyc | Bin 4484 -> 4484 bytes .../rdtypes/ANY/__pycache__/RT.cpython-37.pyc | Bin 399 -> 399 bytes .../ANY/__pycache__/SOA.cpython-37.pyc | Bin 3333 -> 3333 bytes .../ANY/__pycache__/SPF.cpython-37.pyc | Bin 407 -> 407 bytes .../ANY/__pycache__/SSHFP.cpython-37.pyc | Bin 2176 -> 2176 bytes .../ANY/__pycache__/TLSA.cpython-37.pyc | Bin 2307 -> 2307 bytes .../ANY/__pycache__/TXT.cpython-37.pyc | Bin 387 -> 387 bytes .../ANY/__pycache__/URI.cpython-37.pyc | Bin 2296 -> 2296 bytes .../ANY/__pycache__/X25.cpython-37.pyc | Bin 1775 -> 1775 bytes .../ANY/__pycache__/__init__.cpython-37.pyc | Bin 579 -> 579 bytes .../rdtypes/CH/__pycache__/A.cpython-37.pyc | Bin 2211 -> 2211 bytes .../CH/__pycache__/__init__.cpython-37.pyc | Bin 209 -> 209 bytes .../rdtypes/IN/__pycache__/A.cpython-37.pyc | Bin 1548 -> 1548 bytes .../IN/__pycache__/AAAA.cpython-37.pyc | Bin 1603 -> 1603 bytes .../rdtypes/IN/__pycache__/APL.cpython-37.pyc | Bin 3880 -> 3880 bytes .../IN/__pycache__/DHCID.cpython-37.pyc | Bin 1717 -> 1717 bytes .../IN/__pycache__/IPSECKEY.cpython-37.pyc | Bin 3646 -> 3646 bytes .../rdtypes/IN/__pycache__/KX.cpython-37.pyc | Bin 388 -> 388 bytes .../IN/__pycache__/NAPTR.cpython-37.pyc | Bin 3344 -> 3344 bytes .../IN/__pycache__/NSAP.cpython-37.pyc | Bin 1750 -> 1750 bytes .../IN/__pycache__/NSAP_PTR.cpython-37.pyc | Bin 406 -> 406 bytes .../rdtypes/IN/__pycache__/PX.cpython-37.pyc | Bin 2373 -> 2373 bytes .../rdtypes/IN/__pycache__/SRV.cpython-37.pyc | Bin 2327 -> 2327 bytes .../rdtypes/IN/__pycache__/WKS.cpython-37.pyc | Bin 2786 -> 2786 bytes .../IN/__pycache__/__init__.cpython-37.pyc | Bin 322 -> 322 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 255 -> 255 bytes .../__pycache__/dnskeybase.cpython-37.pyc | Bin 3659 -> 3659 bytes .../rdtypes/__pycache__/dsbase.cpython-37.pyc | Bin 2369 -> 2369 bytes .../__pycache__/euibase.cpython-37.pyc | Bin 2180 -> 2180 bytes .../rdtypes/__pycache__/mxbase.cpython-37.pyc | Bin 3512 -> 3512 bytes .../rdtypes/__pycache__/nsbase.cpython-37.pyc | Bin 2710 -> 2710 bytes .../__pycache__/txtbase.cpython-37.pyc | Bin 2470 -> 2470 bytes .../ipwhois-1.0.0.dist-info/DESCRIPTION.rst | 495 ---- .../ipwhois-1.0.0.dist-info/INSTALLER | 1 - .../ipwhois-1.0.0.dist-info/METADATA | 526 ---- .../ipwhois-1.0.0.dist-info/RECORD | 35 - .../ipwhois-1.0.0.dist-info/WHEEL | 6 - .../ipwhois-1.0.0.dist-info/metadata.json | 1 - .../ipwhois-1.0.0.dist-info/top_level.txt | 1 - .../site-packages/ipwhois/__init__.py | 4 +- .../__pycache__/__init__.cpython-37.pyc | Bin 263 -> 263 bytes .../ipwhois/__pycache__/asn.cpython-37.pyc | Bin 22422 -> 22485 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 3781 -> 3993 bytes .../__pycache__/experimental.cpython-37.pyc | Bin 8730 -> 8730 bytes .../ipwhois/__pycache__/hr.cpython-37.pyc | Bin 7387 -> 7387 bytes .../__pycache__/ipwhois.cpython-37.pyc | Bin 12476 -> 12476 bytes .../ipwhois/__pycache__/net.cpython-37.pyc | Bin 19747 -> 19747 bytes .../ipwhois/__pycache__/nir.cpython-37.pyc | Bin 14963 -> 14963 bytes .../ipwhois/__pycache__/rdap.cpython-37.pyc | Bin 17420 -> 17420 bytes .../ipwhois/__pycache__/utils.cpython-37.pyc | Bin 12535 -> 12535 bytes .../ipwhois/__pycache__/whois.cpython-37.pyc | Bin 16922 -> 16922 bytes .../python3.7/site-packages/ipwhois/asn.py | 29 +- .../site-packages/ipwhois/exceptions.py | 38 +- .../site-packages/ipwhois/experimental.py | 2 +- env/lib/python3.7/site-packages/ipwhois/hr.py | 2 +- .../site-packages/ipwhois/ipwhois.py | 4 +- .../python3.7/site-packages/ipwhois/net.py | 6 +- .../python3.7/site-packages/ipwhois/nir.py | 12 +- .../python3.7/site-packages/ipwhois/rdap.py | 2 +- .../python3.7/site-packages/ipwhois/utils.py | 2 +- .../python3.7/site-packages/ipwhois/whois.py | 12 +- .../pip-18.1.dist-info/INSTALLER | 1 - .../pip-18.1.dist-info/LICENSE.txt | 20 - .../site-packages/pip-18.1.dist-info/METADATA | 70 - .../site-packages/pip-18.1.dist-info/RECORD | 614 ----- .../site-packages/pip-18.1.dist-info/WHEEL | 6 - .../pip-18.1.dist-info/entry_points.txt | 5 - .../pip-18.1.dist-info/top_level.txt | 1 - .../python3.7/site-packages/pip/__init__.py | 2 +- .../pip/__pycache__/__init__.cpython-37.pyc | Bin 152 -> 154 bytes .../pip/__pycache__/__main__.cpython-37.pyc | Bin 406 -> 406 bytes .../site-packages/pip/_internal/__init__.py | 2 +- .../__pycache__/__init__.cpython-37.pyc | Bin 1798 -> 1798 bytes .../__pycache__/build_env.cpython-37.pyc | Bin 5007 -> 7395 bytes .../__pycache__/cache.cpython-37.pyc | Bin 6792 -> 7006 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 9791 -> 9700 bytes .../__pycache__/download.cpython-37.pyc | Bin 20859 -> 20868 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 11512 -> 11698 bytes .../__pycache__/index.cpython-37.pyc | Bin 23121 -> 28728 bytes .../__pycache__/locations.cpython-37.pyc | Bin 4188 -> 4387 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 7247 -> 8117 bytes .../__pycache__/pyproject.cpython-37.pyc | Bin 2671 -> 3134 bytes .../__pycache__/resolve.cpython-37.pyc | Bin 8438 -> 9052 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 20800 -> 26028 bytes .../site-packages/pip/_internal/build_env.py | 185 +- .../site-packages/pip/_internal/cache.py | 22 + .../cli/__pycache__/__init__.cpython-37.pyc | Bin 229 -> 229 bytes .../__pycache__/autocompletion.cpython-37.pyc | Bin 5042 -> 5042 bytes .../__pycache__/base_command.cpython-37.pyc | Bin 6267 -> 7749 bytes .../cli/__pycache__/cmdoptions.cpython-37.pyc | Bin 14988 -> 16813 bytes .../__pycache__/main_parser.cpython-37.pyc | Bin 2189 -> 2315 bytes .../cli/__pycache__/parser.cpython-37.pyc | Bin 8893 -> 8893 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 358 -> 358 bytes .../pip/_internal/cli/base_command.py | 92 +- .../pip/_internal/cli/cmdoptions.py | 203 +- .../pip/_internal/cli/main_parser.py | 12 +- .../pip/_internal/commands/__init__.py | 4 +- .../__pycache__/__init__.cpython-37.pyc | Bin 2457 -> 2457 bytes .../commands/__pycache__/check.cpython-37.pyc | Bin 1259 -> 1282 bytes .../__pycache__/completion.cpython-37.pyc | Bin 3031 -> 3031 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 6383 -> 6859 bytes .../__pycache__/download.cpython-37.pyc | Bin 4611 -> 4670 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 2827 -> 2827 bytes .../commands/__pycache__/hash.cpython-37.pyc | Bin 2021 -> 2021 bytes .../commands/__pycache__/help.cpython-37.pyc | Bin 1197 -> 1197 bytes .../__pycache__/install.cpython-37.pyc | Bin 11793 -> 12844 bytes .../commands/__pycache__/list.cpython-37.pyc | Bin 8870 -> 8688 bytes .../__pycache__/search.cpython-37.pyc | Bin 4263 -> 4263 bytes .../commands/__pycache__/show.cpython-37.pyc | Bin 5844 -> 5844 bytes .../__pycache__/uninstall.cpython-37.pyc | Bin 2653 -> 2653 bytes .../commands/__pycache__/wheel.cpython-37.pyc | Bin 4874 -> 4956 bytes .../pip/_internal/commands/check.py | 4 +- .../pip/_internal/commands/configuration.py | 58 +- .../pip/_internal/commands/download.py | 2 + .../pip/_internal/commands/install.py | 94 +- .../pip/_internal/commands/list.py | 26 +- .../pip/_internal/commands/show.py | 2 +- .../pip/_internal/commands/wheel.py | 7 +- .../pip/_internal/configuration.py | 23 +- .../site-packages/pip/_internal/download.py | 190 +- .../site-packages/pip/_internal/exceptions.py | 8 +- .../site-packages/pip/_internal/index.py | 751 +++-- .../site-packages/pip/_internal/locations.py | 29 +- .../__pycache__/__init__.cpython-37.pyc | Bin 217 -> 217 bytes .../__pycache__/candidate.cpython-37.pyc | Bin 1052 -> 1250 bytes .../__pycache__/format_control.cpython-37.pyc | Bin 2387 -> 2220 bytes .../models/__pycache__/index.cpython-37.pyc | Bin 1121 -> 1121 bytes .../models/__pycache__/link.cpython-37.pyc | Bin 4719 -> 4940 bytes .../pip/_internal/models/candidate.py | 10 +- .../pip/_internal/models/format_control.py | 25 +- .../pip/_internal/models/index.py | 2 + .../pip/_internal/models/link.py | 32 +- .../__pycache__/__init__.cpython-37.pyc | Bin 153 -> 153 bytes .../__pycache__/check.cpython-37.pyc | Bin 3330 -> 3583 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 6285 -> 5568 bytes .../__pycache__/prepare.cpython-37.pyc | Bin 9151 -> 10497 bytes .../pip/_internal/operations/check.py | 29 +- .../pip/_internal/operations/freeze.py | 221 +- .../pip/_internal/operations/prepare.py | 131 +- .../site-packages/pip/_internal/pep425tags.py | 90 +- .../site-packages/pip/_internal/pyproject.py | 67 +- .../pip/_internal/req/__init__.py | 13 +- .../req/__pycache__/__init__.cpython-37.pyc | Bin 1521 -> 1664 bytes .../__pycache__/constructors.cpython-37.pyc | Bin 6919 -> 7567 bytes .../req/__pycache__/req_file.cpython-37.pyc | Bin 8620 -> 9180 bytes .../__pycache__/req_install.cpython-37.pyc | Bin 22770 -> 24942 bytes .../req/__pycache__/req_set.cpython-37.pyc | Bin 5734 -> 5625 bytes .../__pycache__/req_tracker.cpython-37.pyc | Bin 2845 -> 3176 bytes .../__pycache__/req_uninstall.cpython-37.pyc | Bin 12817 -> 17239 bytes .../pip/_internal/req/constructors.py | 112 +- .../pip/_internal/req/req_file.py | 89 +- .../pip/_internal/req/req_install.py | 354 ++- .../pip/_internal/req/req_set.py | 36 +- .../pip/_internal/req/req_tracker.py | 24 +- .../pip/_internal/req/req_uninstall.py | 241 +- .../site-packages/pip/_internal/resolve.py | 64 +- .../utils/__pycache__/__init__.cpython-37.pyc | Bin 148 -> 148 bytes .../utils/__pycache__/appdirs.cpython-37.pyc | Bin 7869 -> 7979 bytes .../utils/__pycache__/compat.cpython-37.pyc | Bin 5939 -> 6096 bytes .../__pycache__/deprecation.cpython-37.pyc | Bin 2522 -> 2557 bytes .../utils/__pycache__/encoding.cpython-37.pyc | Bin 1084 -> 1232 bytes .../__pycache__/filesystem.cpython-37.pyc | Bin 615 -> 617 bytes .../utils/__pycache__/glibc.cpython-37.pyc | Bin 1506 -> 1636 bytes .../utils/__pycache__/hashes.cpython-37.pyc | Bin 3283 -> 3555 bytes .../utils/__pycache__/logging.cpython-37.pyc | Bin 5316 -> 8979 bytes .../utils/__pycache__/misc.cpython-37.pyc | Bin 23862 -> 24975 bytes .../utils/__pycache__/models.cpython-37.pyc | Bin 1897 -> 1897 bytes .../utils/__pycache__/outdated.cpython-37.pyc | Bin 3869 -> 3898 bytes .../__pycache__/packaging.cpython-37.pyc | Bin 2348 -> 2569 bytes .../setuptools_build.cpython-37.pyc | Bin 343 -> 343 bytes .../utils/__pycache__/temp_dir.cpython-37.pyc | Bin 2760 -> 4870 bytes .../utils/__pycache__/typing.cpython-37.pyc | Bin 1292 -> 1278 bytes .../utils/__pycache__/ui.cpython-37.pyc | Bin 11817 -> 11708 bytes .../pip/_internal/utils/appdirs.py | 10 + .../pip/_internal/utils/compat.py | 32 +- .../pip/_internal/utils/deprecation.py | 8 +- .../pip/_internal/utils/encoding.py | 22 +- .../pip/_internal/utils/filesystem.py | 2 + .../pip/_internal/utils/glibc.py | 11 +- .../pip/_internal/utils/hashes.py | 21 + .../pip/_internal/utils/logging.py | 164 +- .../site-packages/pip/_internal/utils/misc.py | 335 ++- .../pip/_internal/utils/outdated.py | 22 +- .../pip/_internal/utils/packaging.py | 12 +- .../pip/_internal/utils/temp_dir.py | 75 +- .../pip/_internal/utils/typing.py | 2 +- .../site-packages/pip/_internal/utils/ui.py | 57 +- .../pip/_internal/vcs/__init__.py | 257 +- .../vcs/__pycache__/__init__.cpython-37.pyc | Bin 15514 -> 16988 bytes .../vcs/__pycache__/bazaar.cpython-37.pyc | Bin 3777 -> 3389 bytes .../vcs/__pycache__/git.cpython-37.pyc | Bin 9082 -> 9033 bytes .../vcs/__pycache__/mercurial.cpython-37.pyc | Bin 3750 -> 3651 bytes .../vcs/__pycache__/subversion.cpython-37.pyc | Bin 6352 -> 6680 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 55 +- .../site-packages/pip/_internal/vcs/git.py | 140 +- .../pip/_internal/vcs/mercurial.py | 48 +- .../pip/_internal/vcs/subversion.py | 113 +- .../site-packages/pip/_internal/wheel.py | 455 ++- .../site-packages/pip/_vendor/__init__.py | 33 +- .../__pycache__/__init__.cpython-37.pyc | Bin 2818 -> 2815 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 20565 -> 20565 bytes .../_vendor/__pycache__/distro.cpython-37.pyc | Bin 36098 -> 36278 bytes .../__pycache__/ipaddress.cpython-37.pyc | Bin 66408 -> 66408 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 203012 -> 221766 bytes .../__pycache__/retrying.cpython-37.pyc | Bin 8046 -> 8046 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 24951 -> 26370 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 506 -> 506 bytes .../__pycache__/_cmd.cpython-37.pyc | Bin 1509 -> 1509 bytes .../__pycache__/adapter.cpython-37.pyc | Bin 2992 -> 2992 bytes .../__pycache__/cache.cpython-37.pyc | Bin 1722 -> 1722 bytes .../__pycache__/compat.cpython-37.pyc | Bin 713 -> 713 bytes .../__pycache__/controller.cpython-37.pyc | Bin 7592 -> 7592 bytes .../__pycache__/filewrapper.cpython-37.pyc | Bin 2110 -> 2110 bytes .../__pycache__/heuristics.cpython-37.pyc | Bin 4630 -> 4630 bytes .../__pycache__/serialize.cpython-37.pyc | Bin 4194 -> 4194 bytes .../__pycache__/wrapper.cpython-37.pyc | Bin 614 -> 614 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 250 -> 250 bytes .../__pycache__/file_cache.cpython-37.pyc | Bin 3184 -> 3184 bytes .../__pycache__/redis_cache.cpython-37.pyc | Bin 1506 -> 1506 bytes .../pip/_vendor/certifi/__init__.py | 4 +- .../__pycache__/__init__.cpython-37.pyc | Bin 233 -> 213 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 216 -> 216 bytes .../certifi/__pycache__/core.cpython-37.pyc | Bin 1168 -> 425 bytes .../pip/_vendor/certifi/cacert.pem | 418 ++- .../site-packages/pip/_vendor/certifi/core.py | 22 - .../__pycache__/__init__.cpython-37.pyc | Bin 800 -> 800 bytes .../__pycache__/big5freq.cpython-37.pyc | Bin 27135 -> 27135 bytes .../__pycache__/big5prober.cpython-37.pyc | Bin 1076 -> 1076 bytes .../chardistribution.cpython-37.pyc | Bin 6262 -> 6262 bytes .../charsetgroupprober.cpython-37.pyc | Bin 2183 -> 2183 bytes .../__pycache__/charsetprober.cpython-37.pyc | Bin 3393 -> 3393 bytes .../codingstatemachine.cpython-37.pyc | Bin 2840 -> 2840 bytes .../chardet/__pycache__/compat.cpython-37.pyc | Bin 311 -> 311 bytes .../__pycache__/cp949prober.cpython-37.pyc | Bin 1083 -> 1083 bytes .../chardet/__pycache__/enums.cpython-37.pyc | Bin 2574 -> 2574 bytes .../__pycache__/escprober.cpython-37.pyc | Bin 2561 -> 2561 bytes .../chardet/__pycache__/escsm.cpython-37.pyc | Bin 7022 -> 7022 bytes .../__pycache__/eucjpprober.cpython-37.pyc | Bin 2369 -> 2369 bytes .../__pycache__/euckrfreq.cpython-37.pyc | Bin 12019 -> 12019 bytes .../__pycache__/euckrprober.cpython-37.pyc | Bin 1084 -> 1084 bytes .../__pycache__/euctwfreq.cpython-37.pyc | Bin 27139 -> 27139 bytes .../__pycache__/euctwprober.cpython-37.pyc | Bin 1084 -> 1084 bytes .../__pycache__/gb2312freq.cpython-37.pyc | Bin 19063 -> 19063 bytes .../__pycache__/gb2312prober.cpython-37.pyc | Bin 1092 -> 1092 bytes .../__pycache__/hebrewprober.cpython-37.pyc | Bin 2926 -> 2926 bytes .../__pycache__/jisfreq.cpython-37.pyc | Bin 22091 -> 22091 bytes .../chardet/__pycache__/jpcntx.cpython-37.pyc | Bin 37970 -> 37970 bytes .../langbulgarianmodel.cpython-37.pyc | Bin 23584 -> 23584 bytes .../langcyrillicmodel.cpython-37.pyc | Bin 29040 -> 29040 bytes .../__pycache__/langgreekmodel.cpython-37.pyc | Bin 23542 -> 23542 bytes .../langhebrewmodel.cpython-37.pyc | Bin 22171 -> 22171 bytes .../langhungarianmodel.cpython-37.pyc | Bin 23573 -> 23573 bytes .../__pycache__/langthaimodel.cpython-37.pyc | Bin 22150 -> 22150 bytes .../langturkishmodel.cpython-37.pyc | Bin 22173 -> 22173 bytes .../__pycache__/latin1prober.cpython-37.pyc | Bin 2883 -> 2883 bytes .../mbcharsetprober.cpython-37.pyc | Bin 2188 -> 2188 bytes .../mbcsgroupprober.cpython-37.pyc | Bin 1079 -> 1079 bytes .../chardet/__pycache__/mbcssm.cpython-37.pyc | Bin 15634 -> 15634 bytes .../sbcharsetprober.cpython-37.pyc | Bin 2941 -> 2941 bytes .../sbcsgroupprober.cpython-37.pyc | Bin 1569 -> 1569 bytes .../__pycache__/sjisprober.cpython-37.pyc | Bin 2395 -> 2395 bytes .../universaldetector.cpython-37.pyc | Bin 5785 -> 5785 bytes .../__pycache__/utf8prober.cpython-37.pyc | Bin 1926 -> 1926 bytes .../__pycache__/version.cpython-37.pyc | Bin 395 -> 395 bytes .../cli/__pycache__/__init__.cpython-37.pyc | Bin 152 -> 152 bytes .../cli/__pycache__/chardetect.cpython-37.pyc | Bin 2641 -> 2641 bytes .../pip/_vendor/colorama/__init__.py | 3 +- .../__pycache__/__init__.cpython-37.pyc | Bin 400 -> 400 bytes .../colorama/__pycache__/ansi.cpython-37.pyc | Bin 3298 -> 3298 bytes .../__pycache__/ansitowin32.cpython-37.pyc | Bin 7011 -> 7554 bytes .../__pycache__/initialise.cpython-37.pyc | Bin 1619 -> 1619 bytes .../colorama/__pycache__/win32.cpython-37.pyc | Bin 3834 -> 3813 bytes .../__pycache__/winterm.cpython-37.pyc | Bin 4523 -> 4561 bytes .../pip/_vendor/colorama/ansitowin32.py | 43 +- .../pip/_vendor/colorama/initialise.py | 2 - .../pip/_vendor/colorama/win32.py | 18 +- .../pip/_vendor/colorama/winterm.py | 11 +- .../pip/_vendor/distlib/__init__.py | 2 +- .../__pycache__/__init__.cpython-37.pyc | Bin 998 -> 998 bytes .../distlib/__pycache__/compat.cpython-37.pyc | Bin 32008 -> 32008 bytes .../__pycache__/database.cpython-37.pyc | Bin 42481 -> 42529 bytes .../distlib/__pycache__/index.cpython-37.pyc | Bin 17294 -> 17294 bytes .../__pycache__/locators.cpython-37.pyc | Bin 38601 -> 38680 bytes .../__pycache__/manifest.cpython-37.pyc | Bin 10246 -> 10246 bytes .../__pycache__/markers.cpython-37.pyc | Bin 4432 -> 4432 bytes .../__pycache__/metadata.cpython-37.pyc | Bin 27641 -> 27642 bytes .../__pycache__/resources.cpython-37.pyc | Bin 10842 -> 10842 bytes .../__pycache__/scripts.cpython-37.pyc | Bin 11018 -> 11032 bytes .../distlib/__pycache__/util.cpython-37.pyc | Bin 47839 -> 47910 bytes .../__pycache__/version.cpython-37.pyc | Bin 20382 -> 20382 bytes .../distlib/__pycache__/wheel.cpython-37.pyc | Bin 25032 -> 25318 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 440 -> 440 bytes .../_backport/__pycache__/misc.cpython-37.pyc | Bin 1037 -> 1037 bytes .../__pycache__/shutil.cpython-37.pyc | Bin 21353 -> 21353 bytes .../__pycache__/sysconfig.cpython-37.pyc | Bin 15818 -> 15818 bytes .../__pycache__/tarfile.cpython-37.pyc | Bin 62683 -> 62683 bytes .../pip/_vendor/distlib/database.py | 7 +- .../pip/_vendor/distlib/locators.py | 11 +- .../pip/_vendor/distlib/metadata.py | 9 +- .../pip/_vendor/distlib/scripts.py | 6 +- .../site-packages/pip/_vendor/distlib/util.py | 15 +- .../pip/_vendor/distlib/wheel.py | 8 +- .../site-packages/pip/_vendor/distro.py | 67 +- .../__pycache__/__init__.cpython-37.pyc | Bin 1269 -> 1269 bytes .../__pycache__/_ihatexml.cpython-37.pyc | Bin 13716 -> 13716 bytes .../__pycache__/_inputstream.cpython-37.pyc | Bin 22607 -> 22607 bytes .../__pycache__/_tokenizer.cpython-37.pyc | Bin 41508 -> 41508 bytes .../__pycache__/_utils.cpython-37.pyc | Bin 3261 -> 3261 bytes .../__pycache__/constants.cpython-37.pyc | Bin 66173 -> 66173 bytes .../__pycache__/html5parser.cpython-37.pyc | Bin 97770 -> 97770 bytes .../__pycache__/serializer.cpython-37.pyc | Bin 10786 -> 10786 bytes .../_trie/__pycache__/__init__.cpython-37.pyc | Bin 382 -> 382 bytes .../_trie/__pycache__/_base.cpython-37.pyc | Bin 1465 -> 1465 bytes .../_trie/__pycache__/datrie.cpython-37.pyc | Bin 1984 -> 1984 bytes .../_trie/__pycache__/py.cpython-37.pyc | Bin 2187 -> 2187 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 157 -> 157 bytes .../alphabeticalattributes.cpython-37.pyc | Bin 1273 -> 1273 bytes .../filters/__pycache__/base.cpython-37.pyc | Bin 807 -> 807 bytes .../inject_meta_charset.cpython-37.pyc | Bin 1827 -> 1827 bytes .../filters/__pycache__/lint.cpython-37.pyc | Bin 2591 -> 2591 bytes .../__pycache__/optionaltags.cpython-37.pyc | Bin 2718 -> 2718 bytes .../__pycache__/sanitizer.cpython-37.pyc | Bin 16393 -> 16393 bytes .../__pycache__/whitespace.cpython-37.pyc | Bin 1311 -> 1311 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 896 -> 896 bytes .../__pycache__/genshi.cpython-37.pyc | Bin 1493 -> 1493 bytes .../__pycache__/sax.cpython-37.pyc | Bin 1443 -> 1443 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 3277 -> 3277 bytes .../__pycache__/base.cpython-37.pyc | Bin 11200 -> 11200 bytes .../__pycache__/dom.cpython-37.pyc | Bin 9230 -> 9230 bytes .../__pycache__/etree.cpython-37.pyc | Bin 11809 -> 11809 bytes .../__pycache__/etree_lxml.cpython-37.pyc | Bin 11749 -> 11749 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 3954 -> 3954 bytes .../__pycache__/base.cpython-37.pyc | Bin 6950 -> 6950 bytes .../__pycache__/dom.cpython-37.pyc | Bin 1679 -> 1679 bytes .../__pycache__/etree.cpython-37.pyc | Bin 3486 -> 3486 bytes .../__pycache__/etree_lxml.cpython-37.pyc | Bin 6595 -> 6595 bytes .../__pycache__/genshi.cpython-37.pyc | Bin 1853 -> 1853 bytes .../idna/__pycache__/__init__.cpython-37.pyc | Bin 214 -> 214 bytes .../idna/__pycache__/codec.cpython-37.pyc | Bin 3021 -> 3021 bytes .../idna/__pycache__/compat.cpython-37.pyc | Bin 574 -> 574 bytes .../idna/__pycache__/core.cpython-37.pyc | Bin 9106 -> 9017 bytes .../idna/__pycache__/idnadata.cpython-37.pyc | Bin 20538 -> 21388 bytes .../idna/__pycache__/intranges.cpython-37.pyc | Bin 1754 -> 1754 bytes .../__pycache__/package_data.cpython-37.pyc | Bin 168 -> 168 bytes .../idna/__pycache__/uts46data.cpython-37.pyc | Bin 175610 -> 176048 bytes .../site-packages/pip/_vendor/idna/core.py | 5 +- .../pip/_vendor/idna/idnadata.py | 122 +- .../pip/_vendor/idna/package_data.py | 2 +- .../pip/_vendor/idna/uts46data.py | 660 ++--- .../__pycache__/__init__.cpython-37.pyc | Bin 9864 -> 9864 bytes .../__pycache__/linklockfile.cpython-37.pyc | Bin 2245 -> 2245 bytes .../__pycache__/mkdirlockfile.cpython-37.pyc | Bin 2607 -> 2607 bytes .../__pycache__/pidlockfile.cpython-37.pyc | Bin 4807 -> 4807 bytes .../__pycache__/sqlitelockfile.cpython-37.pyc | Bin 3706 -> 3706 bytes .../symlinklockfile.cpython-37.pyc | Bin 2130 -> 2130 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 2026 -> 2026 bytes .../__pycache__/_version.cpython-37.pyc | Bin 175 -> 175 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 2131 -> 2131 bytes .../__pycache__/fallback.cpython-37.pyc | Bin 24503 -> 24503 bytes .../pip/_vendor/packaging/__about__.py | 14 +- .../pip/_vendor/packaging/__init__.py | 20 +- .../__pycache__/__about__.cpython-37.pyc | Bin 676 -> 688 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 514 -> 526 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 966 -> 966 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 2818 -> 2818 bytes .../__pycache__/markers.cpython-37.pyc | Bin 8817 -> 8821 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 3833 -> 3939 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 19744 -> 19716 bytes .../__pycache__/utils.cpython-37.pyc | Bin 1412 -> 1404 bytes .../__pycache__/version.cpython-37.pyc | Bin 11930 -> 11908 bytes .../pip/_vendor/packaging/_compat.py | 7 +- .../pip/_vendor/packaging/_structures.py | 2 - .../pip/_vendor/packaging/markers.py | 89 +- .../pip/_vendor/packaging/requirements.py | 34 +- .../pip/_vendor/packaging/specifiers.py | 67 +- .../pip/_vendor/packaging/utils.py | 8 +- .../pip/_vendor/packaging/version.py | 49 +- .../pip/_vendor/pep517/__init__.py | 2 +- .../__pycache__/__init__.cpython-37.pyc | Bin 237 -> 239 bytes .../__pycache__/_in_process.cpython-37.pyc | Bin 5302 -> 5582 bytes .../pep517/__pycache__/check.cpython-37.pyc | Bin 4701 -> 4765 bytes .../__pycache__/colorlog.cpython-37.pyc | Bin 2866 -> 2871 bytes .../pep517/__pycache__/compat.cpython-37.pyc | Bin 975 -> 975 bytes .../__pycache__/envbuild.cpython-37.pyc | Bin 4132 -> 4159 bytes .../__pycache__/wrappers.cpython-37.pyc | Bin 4699 -> 5440 bytes .../pip/_vendor/pep517/_in_process.py | 47 +- .../site-packages/pip/_vendor/pep517/check.py | 32 +- .../pip/_vendor/pep517/colorlog.py | 21 +- .../pip/_vendor/pep517/envbuild.py | 14 +- .../pip/_vendor/pep517/wrappers.py | 47 +- .../pip/_vendor/pkg_resources/__init__.py | 153 +- .../__pycache__/__init__.cpython-37.pyc | Bin 95982 -> 99535 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 599 -> 599 bytes .../pip/_vendor/progress/__init__.py | 80 +- .../__pycache__/__init__.cpython-37.pyc | Bin 3867 -> 5515 bytes .../progress/__pycache__/bar.cpython-37.pyc | Bin 2689 -> 2607 bytes .../__pycache__/counter.cpython-37.pyc | Bin 1531 -> 1419 bytes .../__pycache__/helpers.cpython-37.pyc | Bin 2973 -> 0 bytes .../__pycache__/spinner.cpython-37.pyc | Bin 1448 -> 1384 bytes .../site-packages/pip/_vendor/progress/bar.py | 5 +- .../pip/_vendor/progress/counter.py | 13 +- .../pip/_vendor/progress/helpers.py | 91 - .../pip/_vendor/progress/spinner.py | 7 +- .../site-packages/pip/_vendor/pyparsing.py | 2449 +++++++++++------ .../pip/_vendor/pytoml/__init__.py | 3 +- .../__pycache__/__init__.cpython-37.pyc | Bin 287 -> 333 bytes .../pytoml/__pycache__/core.cpython-37.pyc | Bin 896 -> 896 bytes .../pytoml/__pycache__/parser.cpython-37.pyc | Bin 11099 -> 10013 bytes .../pytoml/__pycache__/writer.cpython-37.pyc | Bin 3798 -> 3530 bytes .../pip/_vendor/pytoml/parser.py | 55 +- .../pip/_vendor/pytoml/writer.py | 39 +- .../pip/_vendor/requests/__init__.py | 17 +- .../__pycache__/__init__.cpython-37.pyc | Bin 3744 -> 3444 bytes .../__pycache__/__version__.cpython-37.pyc | Bin 507 -> 507 bytes .../_internal_utils.cpython-37.pyc | Bin 1265 -> 1265 bytes .../__pycache__/adapters.cpython-37.pyc | Bin 16730 -> 16842 bytes .../requests/__pycache__/api.cpython-37.pyc | Bin 6456 -> 6448 bytes .../requests/__pycache__/auth.cpython-37.pyc | Bin 8301 -> 8299 bytes .../requests/__pycache__/certs.cpython-37.pyc | Bin 590 -> 590 bytes .../__pycache__/compat.cpython-37.pyc | Bin 1600 -> 1569 bytes .../__pycache__/cookies.cpython-37.pyc | Bin 18709 -> 18744 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 5462 -> 5462 bytes .../requests/__pycache__/help.cpython-37.pyc | Bin 2654 -> 2643 bytes .../requests/__pycache__/hooks.cpython-37.pyc | Bin 954 -> 937 bytes .../__pycache__/models.cpython-37.pyc | Bin 23921 -> 24065 bytes .../__pycache__/packages.cpython-37.pyc | Bin 467 -> 467 bytes .../__pycache__/sessions.cpython-37.pyc | Bin 18526 -> 19385 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 4123 -> 4123 bytes .../__pycache__/structures.cpython-37.pyc | Bin 4336 -> 4336 bytes .../requests/__pycache__/utils.cpython-37.pyc | Bin 21906 -> 21996 bytes .../pip/_vendor/requests/__version__.py | 4 +- .../pip/_vendor/requests/adapters.py | 27 +- .../site-packages/pip/_vendor/requests/api.py | 20 +- .../pip/_vendor/requests/auth.py | 4 +- .../pip/_vendor/requests/compat.py | 3 +- .../pip/_vendor/requests/cookies.py | 31 +- .../pip/_vendor/requests/help.py | 3 +- .../pip/_vendor/requests/hooks.py | 4 +- .../pip/_vendor/requests/models.py | 19 +- .../pip/_vendor/requests/sessions.py | 63 +- .../pip/_vendor/requests/status_codes.py | 2 +- .../pip/_vendor/requests/utils.py | 23 +- .../site-packages/pip/_vendor/six.py | 65 +- .../pip/_vendor/urllib3/__init__.py | 9 +- .../__pycache__/__init__.cpython-37.pyc | Bin 2379 -> 2072 bytes .../__pycache__/_collections.cpython-37.pyc | Bin 10703 -> 10636 bytes .../__pycache__/connection.cpython-37.pyc | Bin 10224 -> 10105 bytes .../__pycache__/connectionpool.cpython-37.pyc | Bin 23758 -> 23610 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 10357 -> 10357 bytes .../urllib3/__pycache__/fields.cpython-37.pyc | Bin 5825 -> 5825 bytes .../__pycache__/filepost.cpython-37.pyc | Bin 2717 -> 2717 bytes .../__pycache__/poolmanager.cpython-37.pyc | Bin 12656 -> 12677 bytes .../__pycache__/request.cpython-37.pyc | Bin 5548 -> 5539 bytes .../__pycache__/response.cpython-37.pyc | Bin 17374 -> 18704 bytes .../pip/_vendor/urllib3/_collections.py | 5 +- .../pip/_vendor/urllib3/connection.py | 40 +- .../pip/_vendor/urllib3/connectionpool.py | 18 +- .../__pycache__/__init__.cpython-37.pyc | Bin 156 -> 156 bytes .../__pycache__/appengine.cpython-37.pyc | Bin 8904 -> 8271 bytes .../__pycache__/ntlmpool.cpython-37.pyc | Bin 3204 -> 3198 bytes .../__pycache__/pyopenssl.cpython-37.pyc | Bin 14231 -> 14434 bytes .../securetransport.cpython-37.pyc | Bin 17853 -> 17853 bytes .../contrib/__pycache__/socks.cpython-37.pyc | Bin 4862 -> 4862 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 173 -> 173 bytes .../__pycache__/bindings.cpython-37.pyc | Bin 10268 -> 10268 bytes .../__pycache__/low_level.cpython-37.pyc | Bin 7449 -> 7449 bytes .../pip/_vendor/urllib3/contrib/appengine.py | 36 +- .../pip/_vendor/urllib3/contrib/ntlmpool.py | 3 +- .../pip/_vendor/urllib3/contrib/pyopenssl.py | 25 +- .../__pycache__/__init__.cpython-37.pyc | Bin 270 -> 270 bytes .../__pycache__/ordered_dict.cpython-37.pyc | Bin 8364 -> 0 bytes .../packages/__pycache__/six.cpython-37.pyc | Bin 24358 -> 24358 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 167 -> 167 bytes .../__pycache__/makefile.cpython-37.pyc | Bin 1265 -> 1261 bytes .../urllib3/packages/backports/makefile.py | 2 +- .../_vendor/urllib3/packages/ordered_dict.py | 259 -- .../__pycache__/__init__.cpython-37.pyc | Bin 511 -> 511 bytes .../_implementation.cpython-37.pyc | Bin 3270 -> 3270 bytes .../ssl_match_hostname/_implementation.py | 3 +- .../pip/_vendor/urllib3/poolmanager.py | 1 + .../pip/_vendor/urllib3/request.py | 2 +- .../pip/_vendor/urllib3/response.py | 47 +- .../util/__pycache__/__init__.cpython-37.pyc | Bin 948 -> 948 bytes .../__pycache__/connection.cpython-37.pyc | Bin 3025 -> 3123 bytes .../util/__pycache__/queue.cpython-37.pyc | Bin 997 -> 997 bytes .../util/__pycache__/request.cpython-37.pyc | Bin 3178 -> 3178 bytes .../util/__pycache__/response.cpython-37.pyc | Bin 1859 -> 1926 bytes .../util/__pycache__/retry.cpython-37.pyc | Bin 12611 -> 12612 bytes .../util/__pycache__/ssl_.cpython-37.pyc | Bin 9949 -> 9504 bytes .../util/__pycache__/timeout.cpython-37.pyc | Bin 8727 -> 8727 bytes .../util/__pycache__/url.cpython-37.pyc | Bin 5137 -> 5137 bytes .../util/__pycache__/wait.cpython-37.pyc | Bin 3110 -> 3089 bytes .../pip/_vendor/urllib3/util/connection.py | 8 + .../pip/_vendor/urllib3/util/response.py | 10 +- .../pip/_vendor/urllib3/util/retry.py | 2 +- .../pip/_vendor/urllib3/util/ssl_.py | 35 +- .../pip/_vendor/urllib3/util/wait.py | 5 +- .../__pycache__/__init__.cpython-37.pyc | Bin 9632 -> 9632 bytes .../__pycache__/labels.cpython-37.pyc | Bin 4046 -> 4046 bytes .../__pycache__/mklabels.cpython-37.pyc | Bin 1868 -> 1868 bytes .../__pycache__/tests.cpython-37.pyc | Bin 5009 -> 5009 bytes .../__pycache__/x_user_defined.cpython-37.pyc | Bin 2621 -> 2621 bytes .../site-packages/pkg_resources/__init__.py | 127 +- .../__pycache__/__init__.cpython-37.pyc | Bin 96825 -> 99584 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 594 -> 594 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 157 -> 157 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 20645 -> 20645 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 203000 -> 203000 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 24358 -> 24358 bytes .../__pycache__/__about__.cpython-37.pyc | Bin 693 -> 693 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 531 -> 531 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 983 -> 983 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 2835 -> 2835 bytes .../__pycache__/markers.cpython-37.pyc | Bin 8843 -> 8843 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 3848 -> 3848 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 19761 -> 19761 bytes .../__pycache__/utils.cpython-37.pyc | Bin 462 -> 462 bytes .../__pycache__/version.cpython-37.pyc | Bin 10528 -> 10528 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 2376 -> 2376 bytes .../setuptools-40.6.3.dist-info/INSTALLER | 1 - .../setuptools-40.6.3.dist-info/LICENSE | 19 - .../setuptools-40.6.3.dist-info/METADATA | 73 - .../setuptools-40.6.3.dist-info/RECORD | 188 -- .../setuptools-40.6.3.dist-info/WHEEL | 6 - .../dependency_links.txt | 2 - .../entry_points.txt | 65 - .../setuptools-40.6.3.dist-info/top_level.txt | 3 - .../setuptools-40.6.3.dist-info/zip-safe | 1 - .../site-packages/setuptools/__init__.py | 35 +- .../__pycache__/__init__.cpython-37.pyc | Bin 6481 -> 7658 bytes .../_deprecation_warning.cpython-37.pyc | Bin 512 -> 512 bytes .../__pycache__/archive_util.cpython-37.pyc | Bin 5093 -> 5093 bytes .../__pycache__/build_meta.cpython-37.pyc | Bin 6215 -> 8251 bytes .../__pycache__/config.cpython-37.pyc | Bin 16961 -> 17655 bytes .../__pycache__/dep_util.cpython-37.pyc | Bin 819 -> 819 bytes .../__pycache__/depends.cpython-37.pyc | Bin 5228 -> 5228 bytes .../__pycache__/dist.cpython-37.pyc | Bin 38403 -> 42051 bytes .../__pycache__/extension.cpython-37.pyc | Bin 1939 -> 1939 bytes .../__pycache__/glibc.cpython-37.pyc | Bin 1504 -> 1504 bytes .../__pycache__/glob.cpython-37.pyc | Bin 3714 -> 3714 bytes .../__pycache__/launch.cpython-37.pyc | Bin 818 -> 818 bytes .../__pycache__/lib2to3_ex.cpython-37.pyc | Bin 2397 -> 2397 bytes .../__pycache__/monkey.cpython-37.pyc | Bin 4598 -> 4598 bytes .../__pycache__/msvc.cpython-37.pyc | Bin 34395 -> 34395 bytes .../__pycache__/namespaces.cpython-37.pyc | Bin 3576 -> 3576 bytes .../__pycache__/package_index.cpython-37.pyc | Bin 32430 -> 32662 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 7167 -> 7166 bytes .../__pycache__/py27compat.cpython-37.pyc | Bin 775 -> 775 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 1161 -> 1173 bytes .../__pycache__/py33compat.cpython-37.pyc | Bin 1384 -> 1384 bytes .../__pycache__/py36compat.cpython-37.pyc | Bin 2156 -> 0 bytes .../__pycache__/sandbox.cpython-37.pyc | Bin 15500 -> 15500 bytes .../__pycache__/site-patch.cpython-37.pyc | Bin 1466 -> 1466 bytes .../__pycache__/ssl_support.cpython-37.pyc | Bin 6755 -> 6756 bytes .../__pycache__/unicode_utils.cpython-37.pyc | Bin 1133 -> 1133 bytes .../__pycache__/version.cpython-37.pyc | Bin 292 -> 292 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 6980 -> 6945 bytes .../windows_support.cpython-37.pyc | Bin 975 -> 975 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 154 -> 154 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 202997 -> 202997 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 24355 -> 24355 bytes .../__pycache__/__about__.cpython-37.pyc | Bin 690 -> 690 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 528 -> 528 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 980 -> 980 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 2832 -> 2832 bytes .../__pycache__/markers.cpython-37.pyc | Bin 8837 -> 8837 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 3839 -> 3839 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 19758 -> 19758 bytes .../__pycache__/utils.cpython-37.pyc | Bin 459 -> 459 bytes .../__pycache__/version.cpython-37.pyc | Bin 10525 -> 10525 bytes .../site-packages/setuptools/build_meta.py | 246 +- .../__pycache__/__init__.cpython-37.pyc | Bin 700 -> 700 bytes .../command/__pycache__/alias.cpython-37.pyc | Bin 2368 -> 2368 bytes .../__pycache__/bdist_egg.cpython-37.pyc | Bin 14156 -> 14156 bytes .../__pycache__/bdist_rpm.cpython-37.pyc | Bin 1747 -> 1747 bytes .../__pycache__/bdist_wininst.cpython-37.pyc | Bin 938 -> 938 bytes .../__pycache__/build_clib.cpython-37.pyc | Bin 2417 -> 2417 bytes .../__pycache__/build_ext.cpython-37.pyc | Bin 9671 -> 9671 bytes .../__pycache__/build_py.cpython-37.pyc | Bin 8547 -> 8547 bytes .../__pycache__/develop.cpython-37.pyc | Bin 6388 -> 6428 bytes .../__pycache__/dist_info.cpython-37.pyc | Bin 1343 -> 1343 bytes .../__pycache__/easy_install.cpython-37.pyc | Bin 64799 -> 64799 bytes .../__pycache__/egg_info.cpython-37.pyc | Bin 21620 -> 21645 bytes .../__pycache__/install.cpython-37.pyc | Bin 3975 -> 3975 bytes .../install_egg_info.cpython-37.pyc | Bin 2376 -> 2376 bytes .../__pycache__/install_lib.cpython-37.pyc | Bin 4052 -> 4052 bytes .../install_scripts.cpython-37.pyc | Bin 2255 -> 2255 bytes .../__pycache__/py36compat.cpython-37.pyc | Bin 4588 -> 4588 bytes .../__pycache__/register.cpython-37.pyc | Bin 745 -> 745 bytes .../command/__pycache__/rotate.cpython-37.pyc | Bin 2494 -> 2494 bytes .../__pycache__/saveopts.cpython-37.pyc | Bin 889 -> 889 bytes .../command/__pycache__/sdist.cpython-37.pyc | Bin 6185 -> 6747 bytes .../command/__pycache__/setopt.cpython-37.pyc | Bin 4487 -> 4487 bytes .../command/__pycache__/test.cpython-37.pyc | Bin 8082 -> 8140 bytes .../command/__pycache__/upload.cpython-37.pyc | Bin 5168 -> 5153 bytes .../__pycache__/upload_docs.cpython-37.pyc | Bin 6098 -> 6098 bytes .../setuptools/command/develop.py | 25 +- .../setuptools/command/egg_info.py | 1 + .../site-packages/setuptools/command/sdist.py | 21 + .../site-packages/setuptools/command/test.py | 3 +- .../setuptools/command/upload.py | 4 +- .../site-packages/setuptools/config.py | 37 +- .../site-packages/setuptools/dist.py | 147 +- .../__pycache__/__init__.cpython-37.pyc | Bin 2377 -> 2377 bytes .../site-packages/setuptools/package_index.py | 22 +- .../site-packages/setuptools/pep425tags.py | 2 +- .../site-packages/setuptools/py31compat.py | 4 +- .../site-packages/setuptools/py36compat.py | 82 - .../site-packages/setuptools/ssl_support.py | 2 +- .../site-packages/setuptools/wheel.py | 13 +- .../wheel-0.32.3.dist-info/INSTALLER | 1 - .../wheel-0.32.3.dist-info/LICENSE.txt | 22 - .../wheel-0.32.3.dist-info/METADATA | 60 - .../wheel-0.32.3.dist-info/RECORD | 34 - .../wheel-0.32.3.dist-info/WHEEL | 6 - .../wheel-0.32.3.dist-info/entry_points.txt | 6 - .../wheel-0.32.3.dist-info/top_level.txt | 1 - .../python3.7/site-packages/wheel/__init__.py | 2 +- .../wheel/__pycache__/__init__.cpython-37.pyc | Bin 158 -> 158 bytes .../wheel/__pycache__/__main__.cpython-37.pyc | Bin 551 -> 551 bytes .../__pycache__/bdist_wheel.cpython-37.pyc | Bin 9982 -> 10043 bytes .../wheel/__pycache__/metadata.cpython-37.pyc | Bin 3725 -> 3734 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 4669 -> 4669 bytes .../wheel/__pycache__/pkginfo.cpython-37.pyc | Bin 1529 -> 1529 bytes .../wheel/__pycache__/util.cpython-37.pyc | Bin 1225 -> 1274 bytes .../__pycache__/wheelfile.cpython-37.pyc | Bin 5223 -> 5429 bytes .../site-packages/wheel/bdist_wheel.py | 6 +- .../site-packages/wheel/cli/__init__.py | 3 +- .../cli/__pycache__/__init__.cpython-37.pyc | Bin 2914 -> 3000 bytes .../cli/__pycache__/convert.cpython-37.pyc | Bin 6169 -> 6169 bytes .../cli/__pycache__/install.cpython-37.pyc | Bin 139 -> 0 bytes .../wheel/cli/__pycache__/pack.cpython-37.pyc | Bin 2424 -> 2458 bytes .../cli/__pycache__/unpack.cpython-37.pyc | Bin 903 -> 903 bytes .../python3.7/site-packages/wheel/cli/pack.py | 6 +- .../python3.7/site-packages/wheel/metadata.py | 2 +- env/lib/python3.7/site-packages/wheel/util.py | 5 + .../site-packages/wheel/wheelfile.py | 23 +- env/lib/python3.7/site.py | 345 ++- env/pip-selfcheck.json | 1 - requirements.txt | 1 + 761 files changed, 7962 insertions(+), 6491 deletions(-) create mode 100644 .gitignore create mode 100644 bip.sh rename env/lib/python3.7/site-packages/wheel/cli/install.py => blacklist.txt (100%) delete mode 100644 env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/DESCRIPTION.rst delete mode 100644 env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/INSTALLER delete mode 100644 env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/METADATA delete mode 100644 env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/RECORD delete mode 100644 env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/WHEEL delete mode 100644 env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/metadata.json delete mode 100644 env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/top_level.txt delete mode 100644 env/lib/python3.7/site-packages/pip-18.1.dist-info/INSTALLER delete mode 100644 env/lib/python3.7/site-packages/pip-18.1.dist-info/LICENSE.txt delete mode 100644 env/lib/python3.7/site-packages/pip-18.1.dist-info/METADATA delete mode 100644 env/lib/python3.7/site-packages/pip-18.1.dist-info/RECORD delete mode 100644 env/lib/python3.7/site-packages/pip-18.1.dist-info/WHEEL delete mode 100644 env/lib/python3.7/site-packages/pip-18.1.dist-info/entry_points.txt delete mode 100644 env/lib/python3.7/site-packages/pip-18.1.dist-info/top_level.txt delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/helpers.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/progress/helpers.py delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/ordered_dict.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ordered_dict.py delete mode 100644 env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/INSTALLER delete mode 100644 env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/LICENSE delete mode 100644 env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/METADATA delete mode 100644 env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/RECORD delete mode 100644 env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/WHEEL delete mode 100644 env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/dependency_links.txt delete mode 100644 env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/entry_points.txt delete mode 100644 env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/top_level.txt delete mode 100644 env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/zip-safe delete mode 100644 env/lib/python3.7/site-packages/setuptools/__pycache__/py36compat.cpython-37.pyc delete mode 100644 env/lib/python3.7/site-packages/setuptools/py36compat.py delete mode 100644 env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/INSTALLER delete mode 100644 env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/LICENSE.txt delete mode 100644 env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/METADATA delete mode 100644 env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/RECORD delete mode 100644 env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/WHEEL delete mode 100644 env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/entry_points.txt delete mode 100644 env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/top_level.txt delete mode 100644 env/lib/python3.7/site-packages/wheel/cli/__pycache__/install.cpython-37.pyc delete mode 100644 env/pip-selfcheck.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d9233d4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +env/ +.vscode/ +testData.txt \ No newline at end of file diff --git a/PyGeoIP.py b/PyGeoIP.py index 00fc13d..172478d 100644 --- a/PyGeoIP.py +++ b/PyGeoIP.py @@ -1,4 +1,7 @@ #!/usr/bin/python3 +# Benjamyn Love +# 2018/2019 +# bip (Bulk IP lookup) import dns.resolver import ipwhois @@ -9,6 +12,13 @@ import warnings ipList = [] +def loadBlacklist(): + with open('blacklist.txt') as handle: + blacklist = handle.readlines() + for i in range(len(blacklist)): + blacklist[i] = blacklist[i].strip() + return blacklist + def lookupIP(inData): try: with warnings.catch_warnings(): @@ -26,30 +36,45 @@ def lookupIP(inData): def parseIPS(): + global countIncluded with open("ips.txt", 'r') as f: - testdata = f.read() + ipData = f.read() - data = testdata.split('\n') + data = ipData.split('\n') for ip in data: ip = ip.strip() ipAddr = ip.split() if len(ipAddr) == 2: + countIncluded = True ipList.append(ipAddr) else: - pass + if len(ipAddr) == 0: + pass + else: + countIncluded = False + ipList.append(ipAddr) + +blacklist = loadBlacklist() parseIPS() for ips in ipList: # ccode = ipCheck(lookupIP(ips[1])) - ret = lookupIP(ips[1]) + if countIncluded == True: + ret = lookupIP(ips[1]) + reverseName = reversename.from_address(ips[1]) + else: + ret = lookupIP(ips[0]) + reverseName = reversename.from_address(ips[0]) + if ret == None: continue + cc = ret["asn_country_code"] desc = ret["asn_description"] - if cc == "AU" or cc == "NZ" or cc == "US": + if cc in blacklist: continue - reverseName = reversename.from_address(ips[1]) + try: ptr = str(dns.resolver.query(reverseName, "PTR")[0]) except dns.resolver.NoAnswer as E: @@ -58,12 +83,9 @@ for ips in ipList: ptr = reverseName except dns.resolver.NXDOMAIN as E: ptr = reverseName - print("IP: {}\t\tCountry: {}\tDesc: {}\tPTR: {}\tCount: {}".format(ips[1], cc, desc, ptr, ips[0])) + if countIncluded == True: + print("IP: {}\t\tCountry: {}\tDesc: {}\tPTR: {}\tCount: {}".format(ips[1], cc, desc, ptr, ips[0])) + else: + print("IP: {}\t\tCountry: {}\tDesc: {}\tPTR: {}".format(ips[0], cc, desc, ptr)) - - -# print(ipList[0]) -# lookupIP("123.23.23.12") - -##{'asn_registry': 'apnic', 'asn': '4134', 'asn_cidr': '220.174.0.0/16', 'asn_country_code': 'CN', 'asn_date': '2002-10-30', 'asn_description': 'CHINANET-BACKBONE No.31,Jin-rong Street, CN'} diff --git a/bip.sh b/bip.sh new file mode 100644 index 0000000..faa15b2 --- /dev/null +++ b/bip.sh @@ -0,0 +1,13 @@ +#!/bin/bash +FILENAME=$PWD/ips.txt +INSTDIR=$PWD +source ./env/bin/activate +if [ -z "${EDITOR}" ] + then + nano $FILENAME +else + $EDITOR $FILENAME +fi +clear +python $INSTDIR/PyGeoIP.py #set to python3 that is in use on the system, usually python3 will suffice +rm -f $FILENAME diff --git a/env/lib/python3.7/site-packages/wheel/cli/install.py b/blacklist.txt similarity index 100% rename from env/lib/python3.7/site-packages/wheel/cli/install.py rename to blacklist.txt diff --git a/env/bin/__pycache__/ipwhois_cli.cpython-37.pyc b/env/bin/__pycache__/ipwhois_cli.cpython-37.pyc index 5edd15f753338d33879894bed0695bab175ea6cb..791b2c65c7bda92e518bf4680e1912b6af9ece61 100644 GIT binary patch delta 1832 zcma)+&2Jk;6u@`v-Hl_%Nka*VlOS=S%_gZ)60FcfB_gE`sEr%IDZz<}9q&5X*x7a7 zuH6LIbs>}k(1bF4v_*mfHzbf?FCftq;y*wfR^q~;TzaWEAtAxMaheYVO?~+J&71e; zeaxHv>lXRr7734s!$E=lYF~7ux4sD{ySs+b)tf#`r+?QRX$ zK4<1_o)*$ZwZV~XqBc4{h}%A= zAtI>3h+r^@Y33Y1%x!B!s8xwWxD6>Z!lv!7uQrI8o#s3x2lXGIMEmM78Cz zG%Qr*)&3U+M}9$24rPbwYI?{ukACPQA`SJvA^HNO*`>W-`9qVe2uL8#($mpXBsR@43hyB@iN*6>S^t{BHY^P{dV(M+&($z7X)jD-dSvOOA~*~lNcPHXGlq47Bvg< zsCba!o>`y~p0D^|5#=R>PJc*b$O3)%Y`V6Lo8dhjE}+E(Vt?|y^q{Sv`y~T^v_~&0S&NaaeC+25lU0z zab7JBl_y!HqHZgp`$*sO8=AeFGg!21HY!hwEZcKD+x+Y`F~plE3?iPJ3Ge|yhZ)O~cT%aTQYv~mjYIIdr1_|3h& zcv$TIkNOl+ANdOHDn_1NLx*+5D~LE^_hMhiM6V#JdQL3LhZeV@QRxwOp~RYV(E;@ILKZ?QG-4eS{WQ5!Vpc O-PGz$LQc{SOZ^8B8kolb delta 1835 zcma)+?@wD*7{`0s+goTUNB{|=Blu&J!d8LVOk8vk1DGXULBVAO)?0cn-KCedoO^){ zTkB*Y)41t4)A=jeeB&!Mnb#%8#Q4hi2e?=F?acfGe5b~EzUQ(6iy7;SPoL+U=RD8% zob%lC=RNYzJrW)chl3vetK2v^^Y5+jWF#`EA6Xd6=gepI((2iwUi&{h5bL)qk>=pj zU-9@dQAxgzHt3!Tu{^3*^{JBTS7kMjlh?^j!oEG&u6xz`vX`E)eC0rgM-6s(3f^*n zk0@myRklV$7*$D`h!~Qur<<1Kdh0}O$V+r{Yc8Dk-M9IQ#9&3{?c|9JpoBbSbw-LZQ)Kd@Q{;Wo1>|? zf{YrFMtq&CZ^u1hYWuw0Bjp16NQ0di>j)%JlfKT8^3$TBnKXxiR*r`jM-b9Rz4R<> z9av!YNrhxtYjU0Nm*{PTl0PF-P9|iVjJid$8VMl-HL`DL9XK~Xx6q!YKgWzFx^R#_RG_^r4UMp z8>dx9l+hPzRp#C=Cn^{nN75u)>jgr+?th)#b8>1uaDO}G~OI@i^)4D(10&%r8l z{BGaPwMfQ;FaKV)39(_j>f`Q=htyruL!lB@x50;9n8-LAvE2%rvcW^sh> z4P#Vny#nhkPlQvvCl4sx;L`@XYW(rM$Sc|f-x*Z^(ZX)`z(vQ<-BsxZn^1mVP2+gf*G!f87g_ A8vp* delta 48 zcmcbsbXSSTiI. -alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc' +set newline='\ +' + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH:q" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT:q" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc' # Unset irrelevant variables. deactivate nondestructive setenv VIRTUAL_ENV "/home/ben/Documents/Projects/Python/PyGeoIP/env" -set _OLD_VIRTUAL_PATH="$PATH" -setenv PATH "$VIRTUAL_ENV/bin:$PATH" +set _OLD_VIRTUAL_PATH="$PATH:q" +setenv PATH "$VIRTUAL_ENV:q/bin:$PATH:q" if ("" != "") then set env_name = "" else - set env_name = `basename "$VIRTUAL_ENV"` + set env_name = "$VIRTUAL_ENV:t:q" endif # Could be in a non-interactive environment, # in which case, $prompt is undefined and we wouldn't # care about the prompt anyway. if ( $?prompt ) then - set _OLD_VIRTUAL_PROMPT="$prompt" - set prompt = "[$env_name] $prompt" + set _OLD_VIRTUAL_PROMPT="$prompt:q" +if ( "$prompt:q" =~ *"$newline:q"* ) then + : +else + set prompt = "[$env_name:q] $prompt:q" +endif endif unset env_name @@ -33,4 +40,3 @@ unset env_name alias pydoc python -m pydoc rehash - diff --git a/env/bin/activate.fish b/env/bin/activate.fish index b75c9ee..1a9b2b7 100644 --- a/env/bin/activate.fish +++ b/env/bin/activate.fish @@ -1,4 +1,4 @@ -# This file must be used using `. bin/activate.fish` *within a running fish ( http://fishshell.com ) session*. +# This file must be used using `source bin/activate.fish` *within a running fish ( http://fishshell.com ) session*. # Do not run it directly. function deactivate -d 'Exit virtualenv mode and return to the normal environment.' diff --git a/env/bin/activate_this.py b/env/bin/activate_this.py index f18193b..444d3fd 100644 --- a/env/bin/activate_this.py +++ b/env/bin/activate_this.py @@ -9,19 +9,21 @@ try: __file__ except NameError: raise AssertionError( - "You must run this like execfile('path/to/activate_this.py', dict(__file__='path/to/activate_this.py'))") -import sys + "You must run this like execfile('path/to/activate_this.py', dict(__file__='path/to/activate_this.py'))" + ) import os - -old_os_path = os.environ.get('PATH', '') -os.environ['PATH'] = os.path.dirname(os.path.abspath(__file__)) + os.pathsep + old_os_path -base = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -if sys.platform == 'win32': - site_packages = os.path.join(base, 'Lib', 'site-packages') -else: - site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages') -prev_sys_path = list(sys.path) import site +import sys + +old_os_path = os.environ.get("PATH", "") +os.environ["PATH"] = os.path.dirname(os.path.abspath(__file__)) + os.pathsep + old_os_path +base = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +if sys.platform == "win32": + site_packages = os.path.join(base, "Lib", "site-packages") +else: + site_packages = os.path.join(base, "lib", "python%s" % sys.version[:3], "site-packages") +prev_sys_path = list(sys.path) + site.addsitedir(site_packages) sys.real_prefix = sys.prefix sys.prefix = base diff --git a/env/bin/ipwhois_cli.py b/env/bin/ipwhois_cli.py index cca0a09..7acd95e 100644 --- a/env/bin/ipwhois_cli.py +++ b/env/bin/ipwhois_cli.py @@ -1,4 +1,4 @@ -# Copyright (c) 2013-2017 Philip Hane +# Copyright (c) 2013-2019 Philip Hane # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -482,10 +482,8 @@ class IPWhoisCLI: if json_data is None: json_data = {} - # Python 2.6 doesn't support set literal expressions, use explicit - # set() instead. - keys = set(['asn', 'asn_cidr', 'asn_country_code', 'asn_date', - 'asn_registry', 'asn_description']).intersection(json_data) + keys = {'asn', 'asn_cidr', 'asn_country_code', 'asn_date', + 'asn_registry', 'asn_description'}.intersection(json_data) output = '' diff --git a/env/bin/ipwhois_utils_cli.py b/env/bin/ipwhois_utils_cli.py index 3f77adb..c8dec77 100644 --- a/env/bin/ipwhois_utils_cli.py +++ b/env/bin/ipwhois_utils_cli.py @@ -1,4 +1,4 @@ -# Copyright (c) 2013-2017 Philip Hane +# Copyright (c) 2013-2019 Philip Hane # All rights reserved. # # Redistribution and use in source and binary forms, with or without diff --git a/env/bin/python b/env/bin/python index fc81572291faf777989df155f60c047287ab99b1..14b75f36a34e1ca8f801bd3c6d7aaeb7e2bc08b3 100755 GIT binary patch delta 865 zcmZ8gUr1A76#u^aM|TVL&OdDyu^B#W(C#*M4I{~0igz%l((ECSF>!1c)?IGb$Drt; z7Fp_nD2V>pgJM27_aHr`5I*%_Fa5!X>d6HqBMJ79t?zE1K^^!w_ji83bI$i2&YjV2 zX)_LNnsqJ+y|t)fy|W*0!UJp-985Lff$P}PR&rHQspnt6j;nYbUgB461*$4g)q%It zT2^?-xb4j(g(YVoG>R?-TE2I^DK0I(Us#>@sKsRHcp6?ab}+GvScV*H;oU^q2r|=z z#|#X^T^z3BWQDgA{zQde0hzP3t`TfTbqE;*F|O*+bC@LT5bBt-XMrt_ zYY|Zkvi`?z!dsFHMB9iCqo?L-5>IoN0rM7o23mO!+~b|jKzJ}R5lhG7YDSNx!-MCO zDJ>R`jwfR%5{X|uHG3QvBQ%gV++tJ}QW4Yq4WhhX+cFuU8A-I2@9pYm7D<_0lPZ@tU**W0JL{(8q9 zzAyjSe!9+R3?Ez$5G4;TfGpW?5u(x%vxi_+l5hgPNJCfwuiJ*(VZK3 zsk>Y9N*;uyOd_MF_2@W~RE>=43X-&x9+TqQlr%o2CMR6#1P#gO0xmrohcV9{40)rZ zWX@}Y6_#r?7MJc9D$tLLC)?39*Rg{4V3J6;Iz*wp#&{t@?eMk3FDMi#;Oz7Z35pVV twQ~&%2U9PA)8`k8bfJr&`uygP!K3cx_)=NCOvfE$2p(#{hi<8cQ`j9 z4)FpuB-x6Y;4x!^8U z4(rsRqXtq|L=H_(V{<#2H_V=X;jnJKJ%6Nmq2~4S=JMokFw(R5I6R>(Oq^UR0GTSp zBN?9j%XJyY*xnH~qdbIo5)jkcX_kO1M14sjPHSJQ<@W45%nO zvexb?TJ!io{iqfV<-RsI+6uc diff --git a/env/lib/python3.7/__pycache__/_bootlocale.cpython-37.pyc b/env/lib/python3.7/__pycache__/_bootlocale.cpython-37.pyc index 60ea54440ef5db67c1954c93a2cee4c3d822cd0c..7ca336670af2bea3f0715ad10dfe6c423077266b 100644 GIT binary patch delta 21 bcmeyx`HPdsiIio{iqf^Ns}oLLLTD diff --git a/env/lib/python3.7/__pycache__/_collections_abc.cpython-37.pyc b/env/lib/python3.7/__pycache__/_collections_abc.cpython-37.pyc index c9c2b2564988a8a5f2ff22534cbb7d1cee0d90c6..19a2f9187089b598d7324d16253dd82679d3350f 100644 GIT binary patch delta 54 zcmZ4fh;jKNMjj_#UM>b8$O;#T-N^Hojj2d>GB>*~dyyb8h*)_xdLz$YHl|{R$=vL|?8P9#BIU^f>>`tk*)4#=o7b{e GWdZ=9)()ru diff --git a/env/lib/python3.7/__pycache__/_weakrefset.cpython-37.pyc b/env/lib/python3.7/__pycache__/_weakrefset.cpython-37.pyc index b80c3881a7c04ae01e97525e5a89838c761e996f..57741ac91e2529618dc5952a4873bb391060c9b6 100644 GIT binary patch delta 21 bcmdmQwcm=ziIio{iqfV=M~*KFio{iqf;~)tDKfML6 diff --git a/env/lib/python3.7/__pycache__/base64.cpython-37.pyc b/env/lib/python3.7/__pycache__/base64.cpython-37.pyc index 4b5fef6124edc83a62a41ecfa63951bba11d69bc..ef274489ac9a277c68de0e9388311a47d7ce3326 100644 GIT binary patch delta 868 zcmX|{CM7gi#MMJc3+;&VWnbQ-gxNYpGkj$YQz_3KFz%d6YhHac{{k3I# zk^jz1{?>{y88>u_<3Q0QnU0kjAv^obA9M-gFZF@r2^sn&B;1CZCge)JNOljHZ7o*J zq;wOFu`f^~MmZcfREL|002@dH4scAu&}b4i@l+sEs8Z9}_klHCWH@ZfV$4^~!=N{8XiHz9vB(r)o=@NA)aG{v92 z2eV&;A2hMRn~gq?s$I*UuvPGTqod72gyGE<4P0+)862|cD(<-lKoZphdlKjlw&(~| z169B@Fb^nE?)(#{;phWW61jrZc!uu6a#^u)J4q&Nk&rD?T7EWHY2}O3C&%+dF7y;w zlHgC?^6aTrM~FFIZnMM+yFwoul{Wi((Ihsqe>&&p3_3z3UG(FmzpHN*-4)d?NeI)EZ*1K0+(BzULm(LYLn)}#Oc delta 868 zcmX|6vr8x_dGMBeL6uB zVOY=+`j8f(X(JWX2(5%5+9grTw+UB4M4Pf*(EZ;b-{N=AJ?Gqe|L2^yH6ylWL`k>T z>)9c{f$YZl*CpN6!r{K^Y`s&MPS}PSceI!_me6-no6Mn6AS&S$*v2r8VH@L`K+W#$ z$baYAKudX2#&wNiI8Zc2hHYBoWakzGA-72Jm%8AgxD5Rg5+2<{m*h&lNcIdFt<7fC zpkyN@*&nPH7Kej-YjG2$02@dH1RRvmU33|CimwDCg(@|j`w)DliAjzhc~FJ7D1yXN z3dqGN9!U%*r^ZrI%CJAQzx)~!#(|3nYp9>5xj$4M^taOU*z;c_>bRtd$Y!Q%IQiIdsFO&pt delta 21 bcmZ21x>%IQiIio{iqfGo1?nHKqk> diff --git a/env/lib/python3.7/__pycache__/codecs.cpython-37.pyc b/env/lib/python3.7/__pycache__/codecs.cpython-37.pyc index da85fa38d81c2a523c0ac0b114aec14fc5305f80..fa3906ecf6470601478245a90e2313c4add6e779 100644 GIT binary patch delta 23 ccmZqfWNPkY;&I~Tio{iqfb4nTjLm>uO diff --git a/env/lib/python3.7/__pycache__/copyreg.cpython-37.pyc b/env/lib/python3.7/__pycache__/copyreg.cpython-37.pyc index a9b6efb4740c8fab2daa9c31e21f1ed8c306026b..23a79976b9db6df4b928f9b2aec740a04e5a78d6 100644 GIT binary patch delta 21 bcmZ3hxK@$JiIio{iqfvrqs4IT!_| diff --git a/env/lib/python3.7/__pycache__/enum.cpython-37.pyc b/env/lib/python3.7/__pycache__/enum.cpython-37.pyc index 744b2c65e59cb951234f76454f61ec09dae04c77..7153ddb1d92febdbdc5a3487cb924fbf903bf590 100644 GIT binary patch delta 5384 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 delta 5313 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 diff --git a/env/lib/python3.7/__pycache__/fnmatch.cpython-37.pyc b/env/lib/python3.7/__pycache__/fnmatch.cpython-37.pyc index 1bc01adb551d7777d500f64324eeeaec9c580b17..f7a003e941c240eb6caf2f6a752f3e5a7b860ac5 100644 GIT binary patch delta 21 bcmZ1^wMdG`iIio{iqfBgP8=H9Z9M diff --git a/env/lib/python3.7/__pycache__/functools.cpython-37.pyc b/env/lib/python3.7/__pycache__/functools.cpython-37.pyc index 37f9aee29ed92c8ffb0c6cf0f599ebea2fd8b222..1c2d6087575118ed48a9583ca345dd8135597b94 100644 GIT binary patch delta 1578 zcmb7EZ){Ul6u;-a*Y?qMv(7ojMqt3A>&7|;x{a{`TbyNf>(~a4bz)O`-(Ys@mfP-c zh9qN3!GwPY5hPATB!EhSMJAF6!7M_I`1gZ0LDYoAFD@}A#xF+id0m!$@q>MNzkBYv z=lss^ocq#q*WtbEkY1ObZfElMLc4SOwIk_^;LPR6i&v`TnAe|m!X-6Kx!;GQ0(*X?%$YiE&cjTu_lepnF#7(E>!xtLOT9bo0S+ZO{yEKq{bMF zvl#4EL{6M>2s2U0VLyvFZ)yq{4GEr2ofGj*w-JNz^o{AxY6X>W}0Ulgc^JUs=^St); z1<;74>pQI{$$JV9uV3m(nY7QB;K~$7$wq=>1g{djL~wxM6#}!=JZ9;`Wz~;j+J+o> zkSN%2A0Uic?Rf~{`?V#Ov+~@R__5Ywfm8UHXCUvqbhtoVAg+9ZWdxHF&frzg^ObZU z&o9!VhzdIV@07O{c^&d)R)+UH74H9)d=@Wnswp@pvy*BtG9pfsWfewm-=HB#x63Xn zk#e1f@w+(3uV2XA1fFV{j8w{g_Bq{-}2PpVNPCWtPX z5eP&Fc7%F@(Wns(1O#=IYDSCpiJ0)x-khf`)z1`VslB34>UiK=ntO!;%uY?+rjl#q zo5Cf{+3+qt*}MjBCc2w*mF%08tI01iY8FowdlOH#EQL?-T1z2(hrhI}fa!#_^@Qqt zouYNGF;XvNH8G8swr+r1IJ0%3!qkNA+26sEuQK*W;_r49;2ngH9V9$ z)l1tiuP7q!l4T2uosnR#;nKusaxZQZd`@snf*hsUiaAB{F2u=>@0Z+>R#NX8h=eG0 z-k|g3K{+1tx4{(t>Mz=35>d3@*%a*W?~d%;Ec%8=wv6-}CchwMen%kGV+2JY6b$V$ zhhxn@+sA(=Cj%<=u^}JHD9&&=vf`Bp9W7M zYhw+}D5N5GkU6I%k0YGK;@P1AdC=i;fb^^sNL3_N@te=dd>kY?ol-#VkXR#oO87s{ z+F28878#0}i@AlSgtf54;x1*a%p&f+3~HmB@|$*@yW51f>r$d&$F{D-E@(z12L3p1 z4GAd(Q*zK6l9@aOlWu`x5}#$?|>u)4dkaYg9+{X{kx6#9CZ`Ah%_NrN)bg1Q1IG* zp8gjFBx?cjAVS1Z=*Ef)JM>_0#WB2Dk+$nS5TOypZ{QaKFGh^~SG-#>X^O;and0%p zfs!0g+(3W8?;Ymq=shu@j)gpm*RO{8h^XMftpjJlg5Js;NW|&NTtP7z7c2WMD6ITA z!Rwe=l?zW|ZPk|LwfnTz>O5$~n(8jY1=7yqTy>T+Cek}wfGwGyCHWk|d4g97W(Zy; zI76V7x-YZPVR7Yym{F4szeM-e{0z{CDRqnR0ai`&*&iwxuHjf*Js`4(0+}k=|Ak5z- z$-vdYp;46+VVjwkQ{@HBZ5&I{xDtsNSE6911qoySxiH5G>bFKpT3?r`bj3}vqe?s2b1UsYnT=eCJw{XC1)l-V=c*gyZ zOB;=8TNhMAoYHM4dcDDsW8DM3U{DQuy_`CVHKPQFc!)RATbraY*3Sw>=?3|b;PHn$ z%eqVsTBjOsjmf8^TR}%lDlFo`mQq-Yj<;Cl)HRA##HSe4ipPq*gI8O#U==r8AA_5C zr!^NgqG@fjx}-PA+tj3n8@Q;(H*oz(4XoooN7CfK1d)zn?A;>LC7Alq5$6{$>`&~0pFl%Q}`F+&94)DMX)YFj8bbwn<8mbaH;cq zxPcK*CY0i3PdlvOT~GcgE#ii7@Fcl>!^8c7-ot!oEc|qMSk)47qTq@5b`PjN?(Oz< z_o*DHfWnCorz!F+f((Le0X9R75oL|h`j(^}Zn4!`gzh&PFLo8fKK!oh$F>j2X`CP; zKx{U|x8r*F(6}0)B_Ab=i$L4tBuPesX#)CCwe50R4c{QJ;JiHzA2>Rbo(M^q=0{8+ R8Ir^?7)=@GLX*v8{TH(8ja&c# diff --git a/env/lib/python3.7/__pycache__/genericpath.cpython-37.pyc b/env/lib/python3.7/__pycache__/genericpath.cpython-37.pyc index a7d5639fd37adc796d1f53717b3a8f28e1c5d4eb..47913b6360056f8f37141ae5376cab5f8ee6c460 100644 GIT binary patch delta 21 bcmdlhyH}RSiIio{iqfvyl$~J01nh diff --git a/env/lib/python3.7/__pycache__/hashlib.cpython-37.pyc b/env/lib/python3.7/__pycache__/hashlib.cpython-37.pyc index ba280a9e734770e82bc018fb3cd9f9ca2005a57a..d4bd514bb4daabd18d16084e3307aa0704265355 100644 GIT binary patch delta 60 zcmca%e8ZT>iIiIio{iqfbD2k$2goVn1Q8(dB0dno3nI9I#N@TSa+{@i_wfJ# Dilhtq diff --git a/env/lib/python3.7/__pycache__/heapq.cpython-37.pyc b/env/lib/python3.7/__pycache__/heapq.cpython-37.pyc index d1936c0cec59f51a16d9467fad6b911a61dd3509..16946ad23a69916aed41f9ad86317880dfc4a064 100644 GIT binary patch delta 21 bcmdm7u(^Q8iIio{iqfqiz8JMD_*# diff --git a/env/lib/python3.7/__pycache__/hmac.cpython-37.pyc b/env/lib/python3.7/__pycache__/hmac.cpython-37.pyc index 62a9bceb17ea27bbcc8f404ad9878e0a1aa25887..ef2a3d40d94ed77ef852de9eccdc85b8e4326a43 100644 GIT binary patch delta 51 zcmeyR|4X08iIio{iqfW5~f&%rM!WqZmkS-oo*b2gF@2ngimBialin0DiI# A@Bjb+ diff --git a/env/lib/python3.7/__pycache__/imp.cpython-37.pyc b/env/lib/python3.7/__pycache__/imp.cpython-37.pyc index 44da2155c6c05c6497318ff791e93f7b9fb332a7..b13be6677ad52b5fc965731347e485c59674ccb9 100644 GIT binary patch delta 173 zcmdnwv&o0YiI#s?A#zOc@0`fWk(M3=G9gKn4RxQOD+A uijNr?+b7>szAe=b6eio{iqfb3mH$*5tF&O^j8W17x&WEX#p1QGx}D$=QkNsqtx< zIjQk^iMgq_IKj+<#FC7nV4#ws3LpU$1j!dwZ{DI{$|%?c6gFaHU?^q+G8j0Dx;Fn( ue9Xw$Ir*OQZK+P6P>~>r5CRd-AVL*HG*7;)a)`SM#Pk3WU6U86P67Z5{xWa? diff --git a/env/lib/python3.7/__pycache__/io.cpython-37.pyc b/env/lib/python3.7/__pycache__/io.cpython-37.pyc index e8ade339aa3ded0fedb306fd4f5aa459eb8a13b7..13b74e838733a2d8fa6e961ec318a77f379af298 100644 GIT binary patch delta 21 bcmaDQ^-7AziIio{iqf6UPexK@A1W diff --git a/env/lib/python3.7/__pycache__/keyword.cpython-37.pyc b/env/lib/python3.7/__pycache__/keyword.cpython-37.pyc index d127392706aec21c11df661ec8c2403258d7b224..73eac2c469facc0c7c7adf3187d0aada705688c6 100644 GIT binary patch delta 21 bcmZ3*w~CL)iIio{iqfBgYN^G`|Gy diff --git a/env/lib/python3.7/__pycache__/linecache.cpython-37.pyc b/env/lib/python3.7/__pycache__/linecache.cpython-37.pyc index 9d5aa6ef034cef0cdceca6aa28943ddb1564e5fe..7a7c3d924b35ee81a8dc047dde61238e6786f65f 100644 GIT binary patch delta 21 bcmaDR`%IR{iIio{iqfbBhlELD&XI diff --git a/env/lib/python3.7/__pycache__/locale.cpython-37.pyc b/env/lib/python3.7/__pycache__/locale.cpython-37.pyc index 79b246522de9613c945dd85fd8b6f9834e1f28c1..ddddeaf56e19bada0d03982e03b27a130e0e8a5b 100644 GIT binary patch delta 23 dcmbQz$26sniN}eTmx}=ivcd&oH}Y__0{}ut1vLNw delta 23 dcmbQz$26sniN}eTmx}=iB37P_-pIqz4gg451~32s diff --git a/env/lib/python3.7/__pycache__/operator.cpython-37.pyc b/env/lib/python3.7/__pycache__/operator.cpython-37.pyc index 51c51313e70fd5272c5ece978af4ccb1ca57bd98..5293c4508b197b7779d58d8db3a13ec71f232fc5 100644 GIT binary patch delta 21 bcmaEw^E8LYiIio{iqf6KMtjOppeO diff --git a/env/lib/python3.7/__pycache__/os.cpython-37.pyc b/env/lib/python3.7/__pycache__/os.cpython-37.pyc index a93e2554b074dab0953c98c277d9b3e3906c82e5..3bfb993d707bf055be69f5c0396238a2001a4ace 100644 GIT binary patch delta 917 zcmXZbUr19?7yxj;>%3^XvNEj)Dbv)8Lext=RMZTNEtja_m@`?scRF=<<4lw2kMt@* z!B;+1U=gB-1a*3l4D(O^$;!;AXsBgMSqd3a8R+PITYLEJJKvwfdH8PgJT%Wkg2`xH z7bSkxrHSSD6WsZ*jDdWo#Jc#qd?v+rixPWC^kA_$4SKNN?8ts15()%mRde}NO##*# zPOx5TOeRu@KKyHTZ+#@fU|dDL9?$@cx<|Yy*6pd)bf;GnH}vuc zgRBzW)c$^EE&Z~+aCV* zWGcv$l)HfU%F`t_&QnXz15Dx#n+c})l+8~EtNkEM^UHRm!wyFte8kR*Tz=J&3NS7P z_rWLhI}h=UQ~3Z>*kap_H!BihhIdvp0ZfaI3@mdd!DsGwwu6{%u_oJ=?@xO&&}SFVX@P_X`w5P;#rRQG`LcroqW718jjGuI`rPaN{b1 z_bjaObKV?)RczBO!et$kR%s&MRqG4{yjoqAPh}FIk0mFwkf`JsqM`z_2x29Jv_6J~ zaLAXPGA9!3l0eZ|G>F(h^z#`10F=>ovKHbgF-Xt~vg^bMahoV4A{$517_os!BwiB} m#2X^KB;%OPb}F-U-b^eKn}{{SPSBSXj6Pz@Vy~Xhv%2ZdE_XDEKBQL( z3QqY@fklWW5!CIW6jSpn4Kss^R<|;#Od*2`3qRLN$WL5J7R80Za z6fsyQ6($o>2wnI$-@E>?kfFG;8r{&UHT{$#v-ah%*0xdZAlZpGZ2O^?PuSK$Y`<_6 ziS^^s!2q{Jn(p>%VnQc> zQ1}SUU6F(h(IHH6u;+Nb$SQY}e2V==+vWf6Qc(sB^DV`#5dVV048kaeN`_zz!;WqI z_2E>I$H+a0_l{a5Ho{YnoCT3yb68=VhaEw>*qyr}%r82TE}LAr@E-4$FoS=zBKVFr@2&V*vTF%H_?*`On8nJ9x@fZTlAeMwK5No1 zihmR42(75I6p77X(6>R%s`sHKvP#nw?i5g>Ly}izbwY;Z%33!oH`p}ad$L`UBZcz_ z{?o9)&-k+e=CN6~3I5d4JWn0*o+`It__gYafXV<^MqDZo%O(sJYB36o)R>rVJ z>gQ_C98P`H4Fp@cV^t7sA<0|?eI1T#c16n>ffL`YNl zR0&@VTMBzKQ!QI1A5brU4ckJ-TJ~^;JQ1j_HnW@b?VW=7e~A`(eVj6s{rrGyw6D>ipYOENOHZ(btvgOPE<=DBk6OpLcD z?^UR0yffKW@eJe9&0I=ZOp|}8@=R_}>0x4En#`yAiiw43@-NkB5EZU=lJVVUMfFBT YVIvks7A6i;4mA#b4o(hZE+#Hb0CYfBG5`Po delta 302 zcmcZ}xHXW^iIio{cuM*~k|r#3aEuc_X*z6qXdW z9L`#n8kPlIB@7F=7cwkl%;KqKExa}PpOB{Vh7#TywiNberdqa2KA;-D8n%Uuwd~;x zc_J(fCH&c3MVBUf2}>~*eVLpgtj{Pmd4}*+$s#?V%~2fbsU-#Fd5O8VIJ{FUU5kqH zizc^;Br)1dekmd^F2uyc#KFkJ$OVKB zxOt7VBqL+P=3_EH7#TY^@0XKjV!Sf>zCu0Y)yeUSXBhWw)=|o0V*ECFy2^B>pNx|Y uR9`XuWt=Rd77d~*)lM=#-|Vd3$SADM!pOqJValP#!Oy|TVa&zEr3nCJF;rCm diff --git a/env/lib/python3.7/__pycache__/random.cpython-37.pyc b/env/lib/python3.7/__pycache__/random.cpython-37.pyc index 722bac1a4ddc01baf698ca54e6fad6adac10163d..8d40dd816f62bf79287de080d89b85fd960f5fad 100644 GIT binary patch delta 196 zcmcaTo$=*#MqVdgUM>b8$O;#TUAmE%*_D%dAww-kg+mF;WJyMhoSqRhOKqS-(TZ}AkQ7Nx}}=a=S{q!vw9ay!7e1t|RT0y_i4Z`MqVdgUM>b8h*)_xdg?}AW>-#zg$%VE6%HlLlOzGb2L{OAUiGLoH7U`{YK~ zK4FeqEG3z_skc}QiZb&`ie>{XoNVBBfN}HYk8ZCR88=V9<59r4ZL+VY2IH2^Wu8`y QY@2~fineXu=4H$X0JwiL!TXQMar{4@msKF!!L9PY0 delta 21 bcmeyb`CpUAiIio{iqf^H~G{N5BTK diff --git a/env/lib/python3.7/__pycache__/shutil.cpython-37.pyc b/env/lib/python3.7/__pycache__/shutil.cpython-37.pyc index f602a892bd5e75d3e77b3564ecba5e62c2922b0d..47dd91e636db8af8ad0ca2f77f58cd923ffc3e88 100644 GIT binary patch delta 806 zcmYL{Pe@cj7{LABu131MndI8CC0`L@v2J8_u{@+jZM6MCv+_^v?0fTepX|Q3zL|AR zD^Es9&|wlf6cI$yscfKv$Vh|?>QX_cj6x_q7Ee9~3qG4=z zvJ2Cwmg!u{^IAER+97mcFkxHS3=*5>u{@YHiLO(XQ!Olp{nfz?;Yl<}+Uc4w`l*S8 zA#-|}2_~xjkxj*6tW?U%Q4I|}UsKrrkht&fhL>W+KLl^YK+QNzOWf=OsF1q@0R?`E zNH7y5d)92{B^PkkjEkRvy7SRh{b;b_=o;n>hv&bRFrH3P!YDFI3tHBWP|uob-uo(` zjcLoVVwk#Rr^QO(o_M(BOvSSE`mFE=JkPcc0#u5j+PK3wTidW6YNV(Bkpg{E?z--R z+p;OV%?)2fcVhy+is{BBm=VwS{(yDz&c2Q^@QOc8%Wy=@ANUO?#ixUF&?#RukGWw? zMq6$H=<-|ZXBUjiiK7h)%!}_426M9Q_(m5j3L2$~%OyWVX(^P+#S5WFEq>G z*$IGS@?*!c0-fUBg%QYzXy<$2vZl+Uz@XgGGYW85KDp=xcqLz7nsmXGyrLdf;IDj3 zZBX29xj%78fekWe%()>fyUhj{B*kdoB#elNeGP7i8G8Y`q-1rj(k5S(uS(4J-~0!b Cix-Cg delta 510 zcmZ9HPe_w-9L9a#cXK$m;iOvr+4{92CT(`e{v28(O)v&VphH@Je7AR7Tif2X_jkxe zML`iU68u6JF9lKTXy59PA>mD;Kss~_LJuZkDtHhons)0sJkRZUo=9D{TSx^(;a{ZlTE^@W z>9SD}W;rROA#_uc-E)R&EiD$i5P~wEAWe8K;uWoWZeW`7yI zou&Pi@7vS5CN-fI_5VNklO++N5AD9ztyZC@Oqng#-x$SiKMneKk)z`dEqKp0Z`6s* zZ7w@Ud=Z}%i%Wv>V|!OhXG=L)X!`oa4u9`V?ry%v0;$-^1UliIU}S=#9N2Jn|7 zu}0Xa`@|+96bLV2fZQh+F;w>sc1J1}jB~Yb92n)!{?96&^6Efni^Uf;@s%f{ZWT-P zY%rz#R=D|W%8CZQHgppR)6d}?j`8`}6wu3#kxixE+8Dow9983UD01wALxJSvrH8;{ zUb*Z9Uh}Wf85Qq%T0gDe$IDC^${&^Gl~W3u_)Tunf&fn%Ar%RlE6?CIJuq+KF4^QV ThIw5cP_0K@t*#dGUa$TIdQ`1i diff --git a/env/lib/python3.7/__pycache__/site.cpython-37.pyc b/env/lib/python3.7/__pycache__/site.cpython-37.pyc index a0b7d927cde579a436c59da5e6d36ec4a09a8bed..f394b66f0a3ef50c5e3533fd4f172e4bb99916f5 100644 GIT binary patch delta 5021 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 diff --git a/env/lib/python3.7/__pycache__/sre_constants.cpython-37.pyc b/env/lib/python3.7/__pycache__/sre_constants.cpython-37.pyc index d8d8db3e5080fd3ebc1055935e363f2c37dbb9cb..ecd0a454c5b9064a74d1287705e9b64347c9fe2a 100644 GIT binary patch delta 21 bcmZ2uxWio{iqfvp@m>J5~kD diff --git a/env/lib/python3.7/__pycache__/sre_parse.cpython-37.pyc b/env/lib/python3.7/__pycache__/sre_parse.cpython-37.pyc index 628b39158b246ca897a192b7e9c2a7e5aa4e06bf..2898023a46c5d668bf5cece23e3d95274e524074 100644 GIT binary patch delta 23 dcmZo$&e*n`k;jRbmx}=ivcd&oH}X^k0{}#K1&06t delta 23 dcmZo$&e*n`k;jRbmx}=iB37P_-pErG3;;@r27&+p diff --git a/env/lib/python3.7/__pycache__/stat.cpython-37.pyc b/env/lib/python3.7/__pycache__/stat.cpython-37.pyc index c8f66c2ac4d4f5df57a0386819138775bfc2582c..30c5b5612387c13cfcc50682f4a43d9825e22c8c 100644 GIT binary patch delta 21 bcmdlbw@Z%4iIio{iqfqsI>bImZP? diff --git a/env/lib/python3.7/__pycache__/struct.cpython-37.pyc b/env/lib/python3.7/__pycache__/struct.cpython-37.pyc index 8048182eb3bf74e218b9b270aee987a74a47c7fe..dc56b90bf253fa646d3cac6ac5de7872efdf621e 100644 GIT binary patch delta 21 bcmaFP^qh&uiIaHsJ(} delta 21 bcmaFP^qh&uiIio{iqf6U_(!Jo5#I diff --git a/env/lib/python3.7/__pycache__/tarfile.cpython-37.pyc b/env/lib/python3.7/__pycache__/tarfile.cpython-37.pyc index 7285919dd331136b5f4139409049b86248125b8a..bb97e4522c64adec4dd6de88ddc68514bf2ccc71 100644 GIT binary patch delta 6452 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 delta 6477 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 diff --git a/env/lib/python3.7/__pycache__/tempfile.cpython-37.pyc b/env/lib/python3.7/__pycache__/tempfile.cpython-37.pyc index f9d0e2966d8cf3fed91368047eef00805dbb35bc..73c9e13eab84b4a6f46eac03330a583621ede6ce 100644 GIT binary patch delta 23 dcmbQWmT}fvMjj_#UM>b8$O;#T-N@4y1^`I(1=0Wj delta 23 dcmbQWmT}fvMjj_#UM>b8h*)_xdLvI?7ywTO2F(Bf diff --git a/env/lib/python3.7/__pycache__/token.cpython-37.pyc b/env/lib/python3.7/__pycache__/token.cpython-37.pyc index 5b29a883518007f8f222a403dcd4177e9c0d99ef..b43545cee037e71cf12e046f4331774eff54c000 100644 GIT binary patch delta 21 bcmZ1>vqFZ)iIvqFZ)iIio{iqfBf|#(HiiWY diff --git a/env/lib/python3.7/__pycache__/tokenize.cpython-37.pyc b/env/lib/python3.7/__pycache__/tokenize.cpython-37.pyc index 9212d2b6109fb389e16323d6915d9a56d966f327..560174d6f4e56b22fabd7087fb9c5fa1b42cfba0 100644 GIT binary patch delta 1043 zcmYk5&uMX`_>fjO?6EBGqcXu=E zP!$P+u4>Lmz{$Z}(yc;@nC}g#EVpJxCM6!XN4B=2pnr z?>B#hz&Ja=7@)tu?nvf^bQ%;jF*cn2LCHE&N=+zg4o|T!B@`YwUehpfV=cDpRVANJ zsfy!K)0pG6igY}@Kb#b@;IA3;#oDi?=4=v5({aka621;gr+MBhPH2Nb1Dc2%l{{mrbcjoZLVYuf=Qm1^gbrCdjq@DpWrb{tyb)INq+zzL)cV}8+85Dkn- zh{7ubsuf);S~aZbGmiIXYX+Bjex4reT!RaAv3m#P?VH^OzyS(Hl439!x#oj@`t)r( zoS~N9-NG8`_0_`wDbeo00B5_6HBP@o_qFn+uS3H+1kZarUAIPZ}gu|%s;15VT4 z*tSmh#xHW-?~G|ihT)!Mfz>%$i0w|eMRIG#MQ}nXy{zfAQmta>?l*0eCC#xw#?ltc zMvj}n@mXd`$3##w>LR{V{1p49l!Ca#~;P%T-tB3}(6-HrFa0tt|s6fx*6^PN}!|#N?{rxS8^KgMugWDiO zGlOd25F2junzTCj4IsT6{HJA@-4x?7!|kbK_J^TQAVt}T(_bSuq*0b>T0Ua;CRrY2 XBpCM?&lv9Y@o$O$b7Z%WsQDVgTd8 zgPxeg7>)4}J*bI^SuS3Xf4~Qc(YP0*#Ng3HPh9jji%~b(PiDTqnfd+pH?xb^VDTDw zJ4LZDk3aFpuZ}(Uj(EX9-FqV6AdT(E^WNQaV(lL{Xx57l9ngXw)^|V{OMC`&nb&P_#>mT0%q)Npg%GBV7ndL{AK_-gozt?(+(lin)^STw*>Uq`@g0~+Qe2!P#!hht#I;P?hh+%o2m&EZun*>v z5A{fvAP@F*(%A-L(TE&oXJ~ztaF!!b$g0TJ2wB27N5aE*Hm! zY1TJPF((Ps5;lS_Jtg?I$hF}kcMUg(+u;`6qPvRqn{#C;XIcN>VEa^pqK;^3CE#RP zQ`~w7VA_1TZP?}bk!QLp=K-SlqUr`Du&=tJb(&He2u=>m)2(UQNnK)0V*!Cpa4q2( z%cx4y$gzw%YB|S^QFfK$hwxeT5?sRBnr$#--mB37n$Z^sb0;3S?SdKnxo111a8unb zE_Kwo@}U)_#u`s6WzP_zc%gA$30?Xs6s&@G%2^>6u0q9>Lo8&caIsN?B<>BCSK2o| zODR_frwKG{YbVjkn#76Vu8`d%yJyq{%NJ48ikeI1GMZ|C(^^})XwB1SD3fU|Mnhn^ z3_Yc?92Lsor(nF8CZ7ce3P)fIyG-^F%1uZ7)IY0WEM?@9bTw=OA2rp2j!R8Dw;$(g z30_Sz5-x?)Zo8GAQ8T$rYK$?nwAsIocc8Xy4jOTxZJFB-4&E0ikLeg`FNa0TN4Q0UKB%B-p?PanGF;kWno8pY!<6xij~5 zd-?9Nf6?!kpJKna&Ic~t{m369_Z}R3jkqq158fta;{6?SRD}D&Bz)s~&P(0sdq5Vp zi3F;!bPyR~#1@f36tBCe8{QFTi64FpMaPdYKEwW|i-|<&k--n*WkTYE1y6|(FLb@L zBmtjzlOzley%jR?u~Z@xgBj^%*Q;q(LQ_oau^m2abQ0|_ zN(3c}5<|fu9TCt9!6P|OLWAFAH+cnn+j849dkwXtm?q7!0Bgppv02@--_~`F(rI)? z8j5)^^ibCVRD4-d7^uE^A@YpV#K#`AgffG20zMo2Dv3FJv|?Gb-RN1`5~T*^P+p)u zfWX5bho5H{MzHV&P{;2CPoT-et|#GS@OE|%!?P%So}7`Gn-?9b1V0CFPV*dp72byP zSovfKUUnKjo%rBCC=dP*CFSy7OpCtVRi*_ zk?k?gx~(hJ*yl6-ekAE$W%b`dI+}vVk=-FvbN{rm4O7}2y13a;F$2lr9l=gJJt+x(&gBsk3Z9UClAA|dCt<&74M)weW z6aI=_mJmk(nsL*=%pCep}k~M({+q(pwv({p_3?j z&Z2n^ZY8G3B7B`Fkj25TiEqiw1s2bb&@=2|`>O^udRAN4w)(8q5|&^yTT+dk-Hy^S zX$pQx##sj`^GbgLpF)MJWR$~~_wS1ZHY+Eq{?MQgYsg$AgLd- z@`h$zF`7I&1=Z{+QidDZZIXxYvjvg^cg{%1k)A*ap%hSxD2pi90CMjJe4;E%lX6BH LADtgPD$V~5vqU^Q delta 1430 zcmZXUO>7%Q6vsPWf2=olocJUDl4Cni!sdgdDM}!1D6Si~O&XVqfPz~!THEW?lCx{g zuCXk7KvfS&y-=Qd;zCbtB`%Q#7o-*;^#TIKb-BO=jtGepTzGHnrYJZ=)3=mO zq2ze%PP?T${_S2{U+3K9j?~f()yHG-wXeX!;F1?uxW6P{aCs-OfoI@DB{r6&a2la{ zcoZM-nG%C9(jgXsZxxkA`hO`Nwm}V!(zL8jwbs%si{}R&aeVL?qT=l~4MXSrI3@n7 zX6d{8x~*|~?Exf;W}q0zvzfjgSe4@QSixyWNO*;?Kv;w?L*Habb4Clc&70MZJy?-2 zsS+Q7dt;Bo!n}eus!-!=ppQQcFH$JVu4mC6uOq#$ zwT^mA@M3%?B)lH`1~xx~Mc#R&X5?epvY}wYhfW0L0#x$VDsT8wf{kbF-~;yT>=Fc8Rb> zD1(un_r68p6}X>%ffe9sdX^RXf2Mz6ixsS^eqO|f6D*qC?AT31r#r~cQ40;`$Tf4f z(bD!TymNnKQaFM#`O!RGp+RGy)G=yy(=_ygvf3gMqR;=Yt6+a+V5~gw)ZR9SiE8<7#NLJ6{ zZfX=4LC2_~T+;Tdb?y1PG~laT;i8XRVu>fY)3s%plo!9Y;pxGuD&GaSX z0aBGM-M(SgMRf|+^QYM|+{*8;m*MC9EX#v$%FHIo9VSEwGlV%pfzX9}Q@6(yx1z`~ OB`1%Mu8tm;SN{b?`91^y diff --git a/env/lib/python3.7/__pycache__/warnings.cpython-37.pyc b/env/lib/python3.7/__pycache__/warnings.cpython-37.pyc index 71cabf0b4d467be068b7d5491acbf7e32a5d7da4..d454b26196dd43c643de501dc0f4bcd4814cd7fb 100644 GIT binary patch delta 2734 zcmY*beP~FMdivTDn={H<7u6)lm!}9De+(AJSO@^7Ra~1M(j=`dxvFHP7cVN3 ztu6U@iAnTVkg6zKbqOli>9{KX+ySMD&oEJ6AHIHqYgat%P1nubvZ3odh+E!_0IQzEGrppwli8wqem;x_^|~=ZGsr^H z%Uei8SYa0Lr_EyoafEqKLm3`;;x8OWio`TFAp4k%?=TCx6c&(Grr<6h2ap@&Dn z(`>2ADA!mhhE3X2FB6t1jwNEYyyWGR6>$l$ixlcre5hwV*WD+uu`AMbh81Cu^Nng= z?na}02Wc!DnD2e4ow0c-!H&&xj*t4ORwgh!x_`)i&DNn49+?58iE$u_5?P``*9+ zZj-Vj4~_8c5bEe-U&3(5QymA8?6|F!Qqgu?CBx+85W~FDF*qd-JWT>k$1WOtp;W$f zi1RY%D%sNbF%qpCSjlnQs%IrYRFRrAeAN+gAI1IepeeG49fd=Y{7%ZV?}2Ue4M13yxx3 z%$4{KBG15st^-{YxJ-KL5s6@3`JC;rB2U9)cdz?2vcHCN-MiUoc)j~4ECI7UJDbDU z%Od3xwmmoDde2SGBtwiRptE;Jq>BVJq)2#+S}^;31=n1!&Gjm>s?)j;^8K?l5Pgy@z|m+* zjS(*a>(MrrhF7CIS*-R^v?}+D1d6^MCkYXT$gD`}7@Udi^^2-jiCuxMSa14afcyy} z+61B@&(ezGa+(UpLTCP<5GO@hCIZ|!=E0kBl>=nse`#>s26YA1M=KopYv zI?7_XXeM1;n99Jh)ByVec-PoZyFvK^NT#=+=eurAv(t@e}=# z+azxBMr^?Sp#kQ=uZKPvd1Utul6`2rZt@P%$Sx;KLiHEJgY0kcr{R(K|0jwcAu*Ag zAJOVA!JA?<(f=<$tsNivCSy@}Wi$~HpPWY}@)(!tqhtRYJ|A5?HAITN2oGcg%!L>U z-zF;6H|ZC3;afx?Lynh}#ivaqcivyW2YRV!*^WZUUx$~+V(cD#I2P`>Pl}?mC;~jw zJz)vHM2UahPDj~6*p^OtD5WR)7@SI{G`bGhB`?uw&J$w*L$fG6NfwE6LinY%%Qg-W zVk*E`rawd~xnWQTt?p!9RWbl_9;zz(cKKMKpjMFEQ zrwAehG!n!h<@DL$lLRzR_%;F>di*&88lOB%K$D8o5aKIvb$sLrY99U`!TSWFd2Z0^ edkFI_dZT+Ry>WXjULfvE@R#vTwhwOXe&IjmRaYJW delta 2515 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 MVNbGGKPt`n4R{Xb_y7O^ diff --git a/env/lib/python3.7/distutils/__init__.py b/env/lib/python3.7/distutils/__init__.py index 29fc1da..59f55f1 100644 --- a/env/lib/python3.7/distutils/__init__.py +++ b/env/lib/python3.7/distutils/__init__.py @@ -1,20 +1,21 @@ +import imp import os import sys -import warnings -import imp -import opcode # opcode is not a virtualenv module, so we can use it to find the stdlib - # Important! To work on pypy, this must be a module that resides in the - # lib-python/modified-x.y.z directory +import warnings + +# opcode is not a virtualenv module, so we can use it to find the stdlib +# Important! To work on pypy, this must be a module that resides in the +# lib-python/modified-x.y.z directory +import opcode dirname = os.path.dirname -distutils_path = os.path.join(os.path.dirname(opcode.__file__), 'distutils') +distutils_path = os.path.join(os.path.dirname(opcode.__file__), "distutils") if os.path.normpath(distutils_path) == os.path.dirname(os.path.normpath(__file__)): - warnings.warn( - "The virtualenv distutils package at %s appears to be in the same location as the system distutils?") + warnings.warn("The virtualenv distutils package at %s appears to be in the same location as the system distutils?") else: - __path__.insert(0, distutils_path) - real_distutils = imp.load_module("_virtualenv_distutils", None, distutils_path, ('', '', imp.PKG_DIRECTORY)) + __path__.insert(0, distutils_path) # noqa: F821 + real_distutils = imp.load_module("_virtualenv_distutils", None, distutils_path, ("", "", imp.PKG_DIRECTORY)) # Copy the relevant attributes try: __revision__ = real_distutils.__revision__ @@ -22,80 +23,94 @@ else: pass __version__ = real_distutils.__version__ -from distutils import dist, sysconfig +from distutils import dist, sysconfig # isort:skip try: basestring except NameError: basestring = str -## patch build_ext (distutils doesn't know how to get the libs directory -## path on windows - it hardcodes the paths around the patched sys.prefix) +# patch build_ext (distutils doesn't know how to get the libs directory +# path on windows - it hardcodes the paths around the patched sys.prefix) -if sys.platform == 'win32': +if sys.platform == "win32": from distutils.command.build_ext import build_ext as old_build_ext + class build_ext(old_build_ext): - def finalize_options (self): + def finalize_options(self): if self.library_dirs is None: self.library_dirs = [] elif isinstance(self.library_dirs, basestring): self.library_dirs = self.library_dirs.split(os.pathsep) - + self.library_dirs.insert(0, os.path.join(sys.real_prefix, "Libs")) old_build_ext.finalize_options(self) - - from distutils.command import build_ext as build_ext_module + + from distutils.command import build_ext as build_ext_module + build_ext_module.build_ext = build_ext -## distutils.dist patches: +# distutils.dist patches: old_find_config_files = dist.Distribution.find_config_files + + def find_config_files(self): found = old_find_config_files(self) - system_distutils = os.path.join(distutils_path, 'distutils.cfg') - #if os.path.exists(system_distutils): - # found.insert(0, system_distutils) - # What to call the per-user config file - if os.name == 'posix': + if os.name == "posix": user_filename = ".pydistutils.cfg" else: user_filename = "pydistutils.cfg" user_filename = os.path.join(sys.prefix, user_filename) if os.path.isfile(user_filename): for item in list(found): - if item.endswith('pydistutils.cfg'): + if item.endswith("pydistutils.cfg"): found.remove(item) found.append(user_filename) return found + + dist.Distribution.find_config_files = find_config_files -## distutils.sysconfig patches: +# distutils.sysconfig patches: old_get_python_inc = sysconfig.get_python_inc + + def sysconfig_get_python_inc(plat_specific=0, prefix=None): if prefix is None: prefix = sys.real_prefix return old_get_python_inc(plat_specific, prefix) + + sysconfig_get_python_inc.__doc__ = old_get_python_inc.__doc__ sysconfig.get_python_inc = sysconfig_get_python_inc old_get_python_lib = sysconfig.get_python_lib + + def sysconfig_get_python_lib(plat_specific=0, standard_lib=0, prefix=None): if standard_lib and prefix is None: prefix = sys.real_prefix return old_get_python_lib(plat_specific, standard_lib, prefix) + + sysconfig_get_python_lib.__doc__ = old_get_python_lib.__doc__ sysconfig.get_python_lib = sysconfig_get_python_lib old_get_config_vars = sysconfig.get_config_vars + + def sysconfig_get_config_vars(*args): real_vars = old_get_config_vars(*args) - if sys.platform == 'win32': + if sys.platform == "win32": lib_dir = os.path.join(sys.real_prefix, "libs") - if isinstance(real_vars, dict) and 'LIBDIR' not in real_vars: - real_vars['LIBDIR'] = lib_dir # asked for all - elif isinstance(real_vars, list) and 'LIBDIR' in args: - real_vars = real_vars + [lib_dir] # asked for list + if isinstance(real_vars, dict) and "LIBDIR" not in real_vars: + real_vars["LIBDIR"] = lib_dir # asked for all + elif isinstance(real_vars, list) and "LIBDIR" in args: + real_vars = real_vars + [lib_dir] # asked for list return real_vars + + sysconfig_get_config_vars.__doc__ = old_get_config_vars.__doc__ sysconfig.get_config_vars = sysconfig_get_config_vars diff --git a/env/lib/python3.7/distutils/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/distutils/__pycache__/__init__.cpython-37.pyc index 4adc2256bd21a2693a35ce6ff3601c2f31425ad5..46b436f4975b36f3c84c88bf165b705e1fe77f9e 100644 GIT binary patch delta 674 zcmYLF!EVz)5cRC>^?KvDsYs#(wQ3QhG$~bYAaM+EpofA45>iBoOxI}~T&JuZiGw2! z{eozZTpV%Xz=d*y4?&8AICJYKFdGGRSNrD8&dlzc`BJ~C`Q37v8@S@njpIvy=07=w zkv*b48lo+nCDPCuu{j7bCp~w0!$WrttC-H?A;#zMj>s%Di;^(s07h~cdPP|nm`lJ2 zjlvg}fY24TutQ_^BLMP!1BeN`YRj5@yo)MQg1|sJXifk@FKcxkp-p3i%*c%km_i04 zBJ`&XL8c_JggGU6XBJk5E#xS7N zA`TU2RP7NYoEulftxwQ5K*}3%;}IB#sI@i!nc4qutg-#~!jFsg!)(^l@Y?%cdG#fC zY(Hsh9o8`#hKD&$&DHQ|hfhI}DQTGV6U#HFu<#Pj^3b2cJ0c^G#A%^V0kq(mmx;4N zLzaN%>9H-S0M8UmFi$@|aRGjnfap+BD|GN_4Yvph3J00O)C82|Vi*+T5k@#diL|kH z1QUp$Lt;I`hfc|aV8;Z(6)HlX=m8aUqAv)elN#&D{O>u|Acr5XN9Gug;Ia0)IHBWB z8e4**u|0-3J;n;O_uDTt>@vv!V704N+14m4{4g3s{y})V*=nmgt3g)nu~J#uxSY(P z%ATVXj0SGkQ=i$r6($P_z*@aQAR77bFpRvebB3!^wz+y2iLi*G0SB8}U=Rv< z$bb#jJY+?cjSeiU2dQeo51P-D0b?;>fUK%h!!6vzgGMHd+(5WeI0yb)nM|xN?VjTq zK)j|#sozjmJNzlURNwgJI~zz;iA;XMR#l(pMN^k)Jd}Bq8UNtQzz^EtO!vEe^@p!9 zSwcfCn_r=>PRuvuN&;U&Y1nNqa{7nSelKuvWqBiUs_MRV_1dkZtf9QiIQiIbv5 diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/dnssec.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/dnssec.cpython-37.pyc index bd9381e55bf64f49604758bddc100e555ef010fd..e9f02fc4c9e491d64675e9c2c03fcc6d876b6bfc 100644 GIT binary patch delta 104 zcmaDH`#6@ziIxN`Dwt$4;&o7J_aFmf*f8dS6xL@b|tOvi?C#b##R G2aEvXVj^7t delta 104 zcmaDH`#6@ziI?2zPf;^pOH0D}6(60sY3e3&_mD+`MY3QDs#CopSp0sxPt2=@R0 delta 35 pcmeB>?2zPf;^pOH0D{{2YB3vme3&_mGL5q=v(t+=CopSp0sx8-2xI^N diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/edns.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/edns.cpython-37.pyc index bb4b31178ca819112e72ef895bff70bdc7c4bae0..9f1edd225348883d914e25cab769826dca5f94e4 100644 GIT binary patch delta 35 pcmZ2uvBrYOiI_}o3K;+Z delta 35 pcmaDQ`AU+_&&35Eaw diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/exception.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/exception.cpython-37.pyc index 2e0e72ad2d183510872faacb811200cb1595645c..f8ddaa45393f49d8f32b351fc2ca050db0b85f65 100644 GIT binary patch delta 35 pcmbQPFkOMiiIyTv=FLP*9q^c{5uICjgw83JU-L delta 35 pcmbQPFkOMiiIylxdu0nVnv|c{5uICjgfO33vbi diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/flags.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/flags.cpython-37.pyc index 3bda983bde3392a83183635d2476800dce4cf6cd..49096846d0d25986403d76ac041109e561734bac 100644 GIT binary patch delta 35 pcmdlaxJi)5iI1515@U2_OIf delta 35 pcmaFH^^A+hiIyk2#o*$ diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/ipv6.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/ipv6.cpython-37.pyc index db46879886ff9343deff745c02b309727006624c..44495dda71b49b0e729fa03fd4c6e7e43bd0c24c 100644 GIT binary patch delta 35 pcmew;{!yIAiI;J^^ zD(!Y_mion$MYXBCx0+=^$L?q(($*}$YA+YDw0yMWSvK1vPAvQAh^abW33LD}fxY6D zxkwHzAIo+eKpY1S13f^m-04m+)-5J`7TTzw3$NqC@0rCCGU54RVn;-5jk~h@&locl zl@&wP0ewJbfq4k4faAakV4wKDCY66s$#k}R!&bf@FB9Va+G@usC4Cmo15qQ$jqw@J z2yoS1b!&c_*@6L?`RGfWcvk{+0c2<;lm{TsXQAkeuRxUoWxy1mS4>?$o1GNZ z>(AM!l8Tb(T1lrWSgU1aMe~%fOf+d(%xbk1T0*>2mTsudwWEM16VgjE4P@$oOF$6V4qTR}f>X743OeKat_potwN6NHX$h-#!*n{QEfNWHeh0O*3iak5 z!hg;axKKY@AXnHz{Y*4(a zFJ^=Cef@4$I7r0`>e!4x4**wXwBZ|LKGEE`TJVMf`M7b^Y^E(eC}R4wMKO%9@zW@# z22d*ugh=sez;s|HFasEn&vlP!2F?#Z2GGY(f})%EP${3b$<6o5`9>}?)9pMjRN|ZpSAPxs24?NOU;xOJoYRYy*ceoHqv&*Qb5m20^E=3;Q^=cp z2>*)>WoI}N^fd;JkY4}WH|)roxfQ7vVj*OosHoRRQ$2JLZBL!Z2E?oS zA~qmD)bC=p0ZLX-ZF3E}UqRdojgb8s9!7*yOHM%Gly|yVR1o0Y4+v^%of=I)z}Ob delta 37 rcmbPnk8#F5Mjj_#UM>b8sGYACvytZvGlx;8ah7FvdhzB5%of=I&_fG? diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/namedict.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/namedict.cpython-37.pyc index 478cfb641ef6866944aa3cf2a1d2aa1a7f117fb9..7bc7211bb7a51161b48c451bc15bb5a55f412875 100644 GIT binary patch delta 35 pcmdlbzDu0PiIK9AIZshsP#9>@nSX@w0n!Q<&S;YYW#hnVl delta 37 rcmdnm#<;bOk;jRbmx}=iYUiuPY~=aN#9@?aoMoAvUc6b5S;YYWzz7O1 diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/rcode.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/rcode.cpython-37.pyc index 5d02380f3e5effb91f808b08ffa8499b749d8edf..10030665e0b62144e9e33b8ce105b7b203c5e582 100644 GIT binary patch delta 35 pcmew?@>zt(iI3RVCB delta 35 pcmew?@>zt(iIL=I2mrI73vvJe delta 35 pcmeCn?#t$J;^pOH0D{{2YB3vmUNLbPWg2H$W~Uc#{>L=I2mr1N3f}+# diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/rdataclass.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/rdataclass.cpython-37.pyc index 9b99d2ea008865db4f80c217dda36b1def214e35..918ebcd74e5a1854e7192f0331dc81a43c6c411e 100644 GIT binary patch delta 35 pcmew@^jnC>iIl)3iAK} delta 35 pcmew@^jnC>iIU~3Sa;L diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/rdataset.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/rdataset.cpython-37.pyc index 3af0b22427fe3dba424344d9534d096dedd70d2b..31db4a4a73996eea449088c8940dc236644c355d 100644 GIT binary patch delta 35 pcmX@*dCHT=iI delta 35 pcmX@*dCHT=iI^ delta 35 pcmZ3izF3{diIK9AIZsZAIBl2LRRU3I6~9 diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/tokenizer.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/tokenizer.cpython-37.pyc index 62ccb20e7f0e6ca2d78666cfaadddcfecdde8f0c..3e852fa01f79464a43f39e7955f9b7cadc3242cf 100644 GIT binary patch delta 35 pcmeCr>(AqH;^pOH0D}6(60sY3Oqe)~D+`MY3QDs#doUe00RX1r3P%6{ delta 35 pcmeCr>(AqH;^pOH0D{{2YB3vmOqe)~GL5q=v(t+=doUe00RW**3A6wJ diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/tsig.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/tsig.cpython-37.pyc index 37573f638767e2e44f0320edf3bc9afb0828e9ea..babbfb85187406e963174a8056a2646eaa41038d 100644 GIT binary patch delta 35 pcmX?aaNdB&iIpt}HArC@9U|tjZ+J1OSsH2%!J~ delta 35 pcmdnNv4exhiIp$~4Zh%uX-ftjZ+J1OSbX2o3-M diff --git a/env/lib/python3.7/site-packages/dns/__pycache__/ttl.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/__pycache__/ttl.cpython-37.pyc index cbc5e3e282ada314f650aa2960fc7dbf69e8bbbb..9b92f09ebf4c3d2bba9384f573a96dd7a2d2b082 100644 GIT binary patch delta 35 pcmX@ab%=|{iIb8s9!7*yOAe>iNmb8sGYACvymr(iNh$}a6T8wP_fSQW-PZnerpM0$%76A1+8h!u( diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/AFSDB.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/AFSDB.cpython-37.pyc index 55d7004f71464fd7a0f52eaa38a79d131d3558c5..18b504bf09d24db045135ea4d4715f7ac3577b04 100644 GIT binary patch delta 35 pcmaFD@q~lNiIN3L5|b diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/AVC.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/AVC.cpython-37.pyc index 9a9fe9af2fd00b4c95b99bb5f244394819bc9717..772e419131a7457a3005d88288afeed72aaa9b25 100644 GIT binary patch delta 34 ocmcc3e4ClaiIra8`iFiIra8`iFiIH2?qr diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/DS.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/DS.cpython-37.pyc index 7982cb2438eb4dac91f57564cb412539c5999dec..4ed56833fd4ca355f4df39ac122657d0c5a753cc 100644 GIT binary patch delta 32 mcmey%^p}apiInJwUJBg+ delta 32 mcmey%^p}apiInJr=n6^z diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/EUI48.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/EUI48.cpython-37.pyc index 1ed3a2d823fb11d404829f3bed86e0ca60ebe2bf..4bb546ffa84ef8ee293be281bf654b543d9d83f9 100644 GIT binary patch delta 34 ocmdnavYmy;iIoc~FwaiIoc~FwaiIK5X0;^pOH0D}6(60sY3)-iDyR~8l*6qIIfKE&k71^||L3C{ok delta 35 pcmeAc>K5X0;^pOH0D{{2YB3vm)-iDyWg2H$W~Uc#KE&k71^|%b2|NG* diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/LOC.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/LOC.cpython-37.pyc index 7b07e57d5be7c9bdb37ed44d6d8e890f39cedc2e..809d704cf1d612d98f038b60bc50096dc918b07d 100644 GIT binary patch delta 35 pcmccTaL<9qiI4gj*;3gQ3& delta 35 pcmccTaL<9qiI4gjr33Qqt4 diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/MX.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/MX.cpython-37.pyc index 42e0e8d8996f9293ee51ab5ea699fb39e07eb25c..57e8bb322fd45a4474ce5b91ef890d6b861ad1c3 100644 GIT binary patch delta 32 mcmey%^p}apiInJwUJBg+ delta 32 mcmey%^p}apiInJr=n6^z diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/NS.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/NS.cpython-37.pyc index 06c52c7c8393b56c8d7d305f69b0697d094d4e55..9b0eb285697cf23d1d5777b7d5b349f3d9936a1d 100644 GIT binary patch delta 32 mcmey%^p}apiInJwUJBg+ delta 32 mcmey%^p}apiInJr=n6^z diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/NSEC.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/NSEC.cpython-37.pyc index 091f3e1eafb30b2acc5ff6237d073bb5b8fae2da..b50ecf18ba68b76d7c780780fa6bebc356db1c01 100644 GIT binary patch delta 35 pcmaDM`9hM%iInbWVuJiInbWVuJiI2z3Ae diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/OPENPGPKEY.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/OPENPGPKEY.cpython-37.pyc index dd1196da798deaac8aeb3453bb1a53ed2a9fa5fc..c60a0839727907a1eaffdcccaaa0bdff53b7fd1f 100644 GIT binary patch delta 35 pcmZ3_yPlWFiI47674s3c~;Z delta 35 pcmZ3_yPlWFiI4766;+3NQcw diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/PTR.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/PTR.cpython-37.pyc index d26ab8388f0bd247f9b4931c8b3dc6f942509fd8..3b7bc9783237b963de5145f63f4762a0b07f4d98 100644 GIT binary patch delta 32 mcmZo*ZeZqd;^pOH0D}6(60s9`u5cJv78Vy2lx9zSF#`a2a|!AI delta 32 mcmZo*ZeZqd;^pOH0D{{2YB3Xeu5cJ-8fRH%rx#CrF#`Z|{Rvk9 diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/RP.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/RP.cpython-37.pyc index d49f954ef3df71d44c1f2d9fda22c58c31f6faf7..f72e488730bfb928647cfe756f6c315ab688677d 100644 GIT binary patch delta 35 pcmZ1@v_^=>iITv=FLP*9q^`5;p^8vvhd3NZix delta 35 pcmZ1@v_^=>iIlxdu0nVnv|`5;p^8vvQt37!A| diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/RRSIG.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/RRSIG.cpython-37.pyc index a59dfd3068bc02c2004fa9ed9d29b0ea879543be..8dc0fcd72471f8d4fadb379e68719b3d72f1c485 100644 GIT binary patch delta 35 pcmZosZc*lO;^pOH0D}6(60sY3QW-gnD+`MY3QDs#S2A)7005H42^#2|oY; diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/SPF.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/SPF.cpython-37.pyc index 60fee90ae4670589ed1f37dba25cade23da24840..e066dd3e1e15c8c4019ee18f8a6dd97b865211b4 100644 GIT binary patch delta 32 mcmbQvJe`@xiIPx# delta 34 ocmZn`Y8K*g;^pOH0D{{2YB3vm-ZOC+Wg2H$W~Ub~W@css0EVatRsaA1 diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/TXT.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/TXT.cpython-37.pyc index b57601bc05f41f2d9ab49f31196b49b5f188df12..a7bd6284ace1a3a0a722891cd952729cd4a2c03b 100644 GIT binary patch delta 32 mcmZo>Zf53j;^pOH0D}6(60s9`u5cJv78Vy2lx9zSF&hARFbVSj delta 32 mcmZo>Zf53j;^pOH0D{{2YB3Xeu5cJ-8fRH%rx#CrF&hAMx(Q$a diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/URI.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/ANY/__pycache__/URI.cpython-37.pyc index f501e6df29a728da8ab1d8df65a5902ec929fabc..8b8fff3ecdd9e77df61a51e0246bb2fc1854fe29 100644 GIT binary patch delta 35 pcmew%_(PD#iITv=FLP*9pZ`4D3x0GB}uGXMYp delta 34 ocmX@ia+rn3iIlxdu0nVnud`4D3x0Fplmpa1{> diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/CH/__pycache__/A.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/CH/__pycache__/A.cpython-37.pyc index 62fd244505f94e40be992bc2cecd010c48cdd2db..507dc7ea1a4174100548111363f2cb02cffb9b9a 100644 GIT binary patch delta 35 pcmZ21xLAG|sZjPA{G~-3kDL1_<>4 diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/A.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/A.cpython-37.pyc index b743fb2c56a1a57e876e0122f1e4e7949dd50a20..376844f33a1808aa476fb4e0f8d50c2cbf62c68b 100644 GIT binary patch delta 35 pcmeC->EYpV;^pOH0D}6(60sY3SeQ7BD+`MY3QDs#OE7(51^|gW2^jzY delta 35 pcmeC->EYpV;^pOH0D{{2YB3vmSeQ7BGL5q=v(t+=OE7(51^|Pm2!;Rv diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/AAAA.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/AAAA.cpython-37.pyc index 8d7f8242211c82c04ac0808f6bc7470820231c06..93ad30e78ed5cdd3c33392993104790b925904e9 100644 GIT binary patch delta 35 pcmX@ibC`$6iIpt}HArC@9U|tjZ+E0sxmV2+RNg delta 35 pcmX@ibC`$6iIp$~4Zh%uX-ftjZ+E0sxVl2sr=% diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/APL.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/APL.cpython-37.pyc index 4d27e60cd7f212f1367c6e9a0d38627cb74c238f..7cf41bbd9bc65c708500e6781cdd7a8e55ddf27d 100644 GIT binary patch delta 35 pcmZ1>w?dA`iIw?dA`iI_ diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/NSAP.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/NSAP.cpython-37.pyc index b4cf169ae72ed1213a1975eab0c41a35c3422f3f..8a8be1e00c84055a85db11738f6c33d19c336370 100644 GIT binary patch delta 35 pcmcb{dySXJiI diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/PX.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/IN/__pycache__/PX.cpython-37.pyc index c01ad1a386843f64f5a74c61d3abddc2f78ef95a..262f06dc005fcce2a694dffec3ad025d6563309b 100644 GIT binary patch delta 35 pcmX>qbX17PiIqbX17PiItb6SSSiItb6SSSiIobWn)LiIobWn)LiIY!T#f;^pOH0D}6(60sY3s+c&8D+`MY3QDs#_c48A1ptww3IhND delta 35 pcmZn>Y!T#f;^pOH0D{{2YB3vms+c&8GL5q=v(t+=_c48A1ptf=32*=a diff --git a/env/lib/python3.7/site-packages/dns/rdtypes/__pycache__/mxbase.cpython-37.pyc b/env/lib/python3.7/site-packages/dns/rdtypes/__pycache__/mxbase.cpython-37.pyc index 4d68bb16c4c482e1fb21c503ed165a6d1f748a75..bb631651bf2e638cd9d7ceef5d1759c8447da59c 100644 GIT binary patch delta 35 pcmdlXy+fMEiI`_ -OR -`Legacy Whois - IPWhois.lookup_whois() <#legacy-whois>`_ - -Input -^^^^^ - -+--------------------+--------+-----------------------------------------------+ -| **Key** |**Type**| **Description** | -+--------------------+--------+-----------------------------------------------+ -| address | str | An IPv4 or IPv6 address as a string, integer, | -| | | IPv4Address, or IPv6Address. | -+--------------------+--------+-----------------------------------------------+ -| timeout | int | The default timeout for socket connections | -| | | in seconds. Defaults to 5. | -+--------------------+--------+-----------------------------------------------+ -| proxy_opener | object | The urllib.request.OpenerDirector request for | -| | | proxy support or None. | -+--------------------+--------+-----------------------------------------------+ -| allow_permutations | bool | Allow net.Net() to use additional methods if | -| | | DNS lookups to Cymru fail. *WARNING* | -| | | deprecated in favor of new argument | -| | | asn_methods. Defaults to True. | -+--------------------+--------+-----------------------------------------------+ - -RDAP (HTTP) ------------ - -IPWhois.lookup_rdap() is the recommended lookup method. RDAP provides a -far better data structure than legacy whois and REST lookups (previous -implementation). RDAP queries allow for parsing of contact information and -details for users, organizations, and groups. RDAP also provides more detailed -network information. - -RDAP documentation: - -https://ipwhois.readthedocs.io/en/latest/RDAP.html - -Legacy Whois ------------- - -Legacy Whois documentation: - -https://ipwhois.readthedocs.io/en/latest/WHOIS.html - -National Internet Registries ----------------------------- - -This library now supports NIR lookups for JPNIC and KRNIC. Previously, Whois -and RDAP data for Japan and South Korea was restricted. NIR lookups scrape -these national registries directly for the data restricted from regional -internet registries. NIR queries are enabled by default via the inc_nir -argument in the IPWhois.lookup_*() functions. - -https://ipwhois.readthedocs.io/en/latest/NIR.html - -Autonomous System Numbers -------------------------- - -This library now supports ASN origin lookups via Whois and HTTP. - -IP ASN functionality was moved to its own parser API (IPASN). - -There is no CLI for these yet. - -https://ipwhois.readthedocs.io/en/latest/ASN.html - -Utilities ---------- - -Utilities documentation: - -https://ipwhois.readthedocs.io/en/latest/UTILS.html - -Scripts -------- - -CLI documentation: - -https://ipwhois.readthedocs.io/en/latest/CLI.html - -Experimental Functions ----------------------- - -.. caution:: - - Functions in experimental.py contain new functionality that has not yet - been widely tested. Bulk lookup support contained here can result in - significant system/network resource utilization. Additionally, abuse of - this functionality may get you banned by the various services queried by - this library. Use at your own discretion. - -Experimental functions documentation: - -https://ipwhois.readthedocs.io/en/latest/EXPERIMENTAL.html - -Contributing -============ - -https://ipwhois.readthedocs.io/en/latest/CONTRIBUTING.html - -IP Reputation Support -===================== - -This feature is under consideration. Take a look at TekDefense's Automater: - -`TekDefense-Automater `_ - -Domain Support -============== - -There are no plans for domain whois support in this project. - -Look at Sven Slootweg's -`python-whois `_ for a library with -domain support. - -Special Thanks -============== - -Thank you JetBrains for the `PyCharm `_ -open source support! - -Thank you Chris Wells (`@cdubz `_) for your -extensive testing on the experimental functions! - -Last but not least, thank you to all the issue submitters and contributors. - - -Changelog -========= - -1.0.0 (2017-07-30) ------------------- - -- Deprecated asn_alts, allow_permutations in favor of new asn_methods (#158) -- Added new exception ASNOriginLookupError (#158) -- KRNIC lookups changed to HTTPS (#166) -- Added experimental functions - get_bulk_asn_whois, bulk_lookup_rdap (#134) -- Fixed bug in NIR lookups that caused addresses with multi-line contacts to - error (#172 - kwheeles) -- Added IANA Reserved CIDR 198.97.38.0/24 to ipv4_is_defined (#174) -- Fixed bug in RDAP notices/remarks parsing that would omit partial entries - missing one or more of title, description, links (#176) -- Added new return key asn_description via verbose ASN DNS lookup support and - modified ASN whois lookups. New argument get_asn_description to disable - additional DNS lookup (#176) -- Fixed some test function naming errors -- Added new generators to utils.py: ipv4_generate_random and - ipv6_generate_random (#183) -- Moved upgrade notes to new UPGRADING.rst -- Deprecated unnecessary protected class functions, changed to public in - asn.py, nir.py, and whois.py (#184) -- net.Net.get_host(), utils.ipv4_is_defined(), and utils.ipv6_is_defined now - return namedtuple instead of tuple. -- Changed docstrings to Google standard for better napoleon parsing (#185) -- Removed deprecated IPWhois.lookup() - This was moved to - IPWhois.lookup_whois() -- Fixed 'nets'->'range' bug for legacy whois CIDR net_range values (#188) -- Fixed a bug in IPASN/Net that caused the ASN result to vary if Cymru has - more than one ASN listed for an IP (#190) -- Updated ElasticSearch example for ES v5.5.1 (#138) - -0.15.1 (2017-02-16) -------------------- - -- Fixed IPv6 parsing for ASN origin lookups and added tests (#162 - ti-mo) -- Fixed recursive role parsing at depths greater than 0 (#161 - cdubz) - -0.15.0 (2017-02-02) -------------------- - -- Python 3.3+ dnspython3 requirement changed to dnspython (#155) -- Added ASN origin lookup support (#149) -- Moved ASN parsing from net.Net.get_asn_*() to new class asn.IPASN. - The original functions now return the raw query (#157) -- net.Net.lookup_asn() is deprecated in favor of asn.IPASN.lookup() (#157) -- Added new exception ASNParseError (#157) -- Fixed rate-limiting exception handling for when HTTP errors are returned - rather than JSON errors (rikonor - #144) -- Fixed rate-limit infinite recursion bug for legacy whois (rikonor - #144) -- Fixed bug in net.Net.get_http_raw() that would pass the encoded form_data on - retry rather than the original argument. -- Removed nose requirements and fixed travis.yml for updated pip -- Documentation updates -- Code style tweaks -- Updated tests and version info for Python 3.6 -- Added basic stress tests (#144) -- Minor tweaks to existing tests - -0.14.0 (2016-08-29) -------------------- - -- Changed legacy whois emails output type to list (#133) -- Fixed retry count non-decrementing infinite loop in - ipwhois.net.Net.get_whois() (issue #125 - krader1961) -- Added new function ipwhois.net.Net.get_http_raw() and tests (#67) -- Added National Internet Registry (JPNIC, KRNIC) support (#67). Enabled by - default in IPWhois.lookup_*(). Disable by passing inc_nir=False. Optionally, - lower level code can call nir.NIRWhois(). This enhancement results in extra - network queries, but more detailed information for NIRs. -- Added utils CLI (ipwhois_utils_cli.py) - #121. Installed to your environments - Scripts dir. This is a wrapper for utils.py. -- Documentation improvements (#123) -- kw arg readability (#115) -- Replaced usage of args with script_args in ipwhois_cli.py -- Minor optimization in whois.py and online/test_whois.py -- Added coveralls integration and re-enabled online tests with Travis CI -- Added Read the Docs support (#132) -- Added documentation (Sphinx) requirements.txt (#132) -- Fixed test imports -- Added --json argument (output in JSON format) to ipwhois_cli.py (#135) - -0.13.0 (2016-04-18) -------------------- - -- Added events_actor parsing for RDAP results. -- Added example for caching data via Redis (#81) -- Added normalization (human-readable field information) in hr.py (#47) -- README word wrap fix (#102) -- Fixed bug in exception handling for ASN HTTP lookups. -- Fixed bug in IPWhois.lookup_rdap() that caused ASN HTTP lookup responses to - be used in place of RDAP responses. -- Added new function Net.get_asn_http() and migrated code from - Net.lookup_asn() + new tests. -- Fixed bug in ASN HTTP fallback lookups for DNIC (#108). -- Added new parameter extra_org_map in Net.get_asn_http(), Net.lookup_asn(), - and IPWhois.lookup*() (#108). -- Fixed _RDAPCommon.summarize_notices() None check - changed len() to all(). -- Added CLI (ipwhois_cli.py) - #46. Installed to your environments Scripts dir. - This is a wrapper for ipwhois.py (IPWhois). Utils CLI will be in a future - release (#121). -- Documentation split up and added more detail (#81). - -0.12.0 (2016-03-28) -------------------- - -- Added headers parameter to ipwhois.Net.get_http_json() (issue #98). -- Fixed ASN HTTP lookup (fallback) Accept headers (issue #98). -- Fixed HTTP decoding, set to utf-8 (italomaia - issue #97) -- IPWhois.lookup() deprecated (issue #96), and will be removed in a future - release (TBD). Use IPWhois.lookup_whois() instead. -- Added rate_limit_timeout parameter (issue #99) to Net.get_http_json(), - IPWhois.lookup_rdap(), and RDAP.lookup(). New exception HTTPRateLimitError. -- Added new parameter asn_alts to Net.lookup_asn(), IPWhois.lookup_rdap() and - IPWhois.lookup(). Takes a list of lookup types to attempt if the - ASN dns lookup fails. Allow permutations must be enabled. Defaults to all - ['whois', 'http'] (issue #93). -- Fixed socket exception handling in Net.get_http_json() for Python 2.6. -- Fixed assertIsInstance for Python 2.6 tests (issue #100). Implemented - unittest._formatMessage and unittest.util.safe_repr for Python 2.6. -- Moved TestCommon to tests\\__init__.py to avoid duplicate code. -- Replaced remaining % with str.format (issue #95). - -0.11.2 (2016-02-25) -------------------- - -- Added allow_permutations parameter (bool) to net.Net() and ipwhois.IPWhois() - to allow alternate ASN lookups if DNS lookups fail. (FirefighterBlu3) -- Fixed ASN DNS resolver timeout/retry_count support. Retry count is used as a - multiplier of timeout, to determine a limetime interval. (FirefighterBlu3) -- Fixed bug where remarks would return None if missing a title. -- Added CONTRIBUTING.rst -- Added tests - -0.11.1 (2015-12-17) -------------------- - -- Re-added CIDR calculation for RDAP lookups. -- Improved tests - core code coverage now 100%. See '# pragma: no cover' for - exclusions. A few bugs were identified in the process, detailed below. -- Moved IP zero stripping from rdap._RDAPNetwork.parse() to new helper function - utils.ipv4_lstrip_zeros(). -- Moved CIDR calculation from rdap._RDAPNetwork.parse() to new helper function - utils.calculate_cidr(). -- Fixed utils.ipv4_is_defined() if statement ordering for RFC 1918 conflict. -- Fixed utils.ipv6_is_defined() if statement ordering for Unspecified and - Loopback (conflict with Reserved). -- Added is_offline parameter to whois.Whois.lookup() primarily for testing. -- Fixed bug in whois.Whois._parse_fields() that attempted to parse 'val2' of - regex, which is no longer used. Also fixed the expected Exception to be - IndexError. -- Fixed bug in ipwhois.IPWhois.lookup() where the argument order was mixed up, - causing referral lookups to be skipped when get_referral=True. -- Fixed bug in rdap._RDAPCommon.summarize_notices() output for links. -- Fixed bug in root entity iteration exception handling in rdap.RDAP.lookup(). - -0.11.0 (2015-11-02) -------------------- - -- Support for REST lookups replaced with RDAP. -- Split code for a more structured system (net, whois, rdap, exceptions). -- Tests match the data new structure. -- Split tests for online and offline testing. -- Performance enhancements for parsing. -- Added an optional bootstrap parameter for RDAP lookups, in order to replace - ASN lookups or use both. Will default to False. Afrinic is currently not - supported, so I would not use this for now. ARIN acknowledged my issue - for this, and will be adding support back in for Afrinic bootstrap. -- Added field_list parameter (inclusion list) for WHOIS lookups. -- Added logging. -- Added examples directory. - -0.10.3 (2015-08-14) -------------------- - -- Fixed LACNIC lookup_rws() queries, since they switched to RDAP. This is - temporary to get it working until the major library transition to RDAP and - new parsed formatting is complete. - -0.10.2 (2015-05-19) -------------------- - -- Fixed APNIC parsing for updated field. -- Fixed datetime parsing and validation when Zulu (Z) is appended. -- Added RIPE parsing for created and updated fields (whois and RWS). -- Removed unnecessary parentheses in IPWhois class declaration. -- Some documentation and comment tweaking to work with Sphinx. -- Minor PEP 8 tweaks. - -0.10.1 (2015-02-09) -------------------- - -- Fixed setup.py bug. - -0.10.0 (2015-02-09) -------------------- - -- Added .csv support for country code source. You can no longer download - country code information from iso.org. -- Added support for IPv4Address or IPv6Address as the address arg in IPWhois. -- Fixed file open encoding bug. Moved from open to io.open. -- Fixed parameter in IPWhois ip defined checks. -- Fixed TestIPWhois.test_ip_invalid() assertions. - diff --git a/env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/INSTALLER b/env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/METADATA b/env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/METADATA deleted file mode 100644 index bdca066..0000000 --- a/env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/METADATA +++ /dev/null @@ -1,526 +0,0 @@ -Metadata-Version: 2.0 -Name: ipwhois -Version: 1.0.0 -Summary: Retrieve and parse whois data for IPv4 and IPv6 addresses. -Home-page: https://github.com/secynic/ipwhois -Author: Philip Hane -Author-email: secynic@gmail.com -License: BSD -Download-URL: https://github.com/secynic/ipwhois/tarball/master -Keywords: Python WHOIS RWhois Referral Whois ASN IP Address IP IPv4 IPv6 IETF REST Arin Ripe Apnic Lacnic Afrinic NIC National Information Center RDAP RIR Regional Internet RegistryNIR National Internet Registry ASN origin Origin -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: Information Technology -Classifier: Intended Audience :: Science/Research -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -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.3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Topic :: Internet -Classifier: Topic :: Software Development -Requires-Dist: dnspython -Requires-Dist: ipaddr; python_version < "3.3" - -======= -ipwhois -======= - -.. image:: https://travis-ci.org/secynic/ipwhois.svg?branch=master - :target: https://travis-ci.org/secynic/ipwhois -.. image:: https://coveralls.io/repos/github/secynic/ipwhois/badge.svg?branch= - master - :target: https://coveralls.io/github/secynic/ipwhois?branch=master -.. image:: https://codeclimate.com/github/secynic/ipwhois/badges/issue_count.svg - :target: https://codeclimate.com/github/secynic/ipwhois -.. image:: https://img.shields.io/badge/license-BSD%202--Clause-blue.svg - :target: https://github.com/secynic/ipwhois/tree/master/LICENSE.txt -.. image:: https://img.shields.io/badge/python-2.6%2C%202.7%2C%203.3+-blue.svg - :target: https://docs.python.org -.. image:: https://img.shields.io/badge/docs-latest-green.svg?style=flat - :target: https://ipwhois.readthedocs.io/en/latest -.. image:: https://img.shields.io/badge/docs-dev-yellow.svg?style=flat - :target: https://ipwhois.readthedocs.io/en/dev - -Summary -======= - -ipwhois is a Python package focused on retrieving and parsing whois data -for IPv4 and IPv6 addresses. - -.. note:: - - If you are experiencing latency issues, it is likely related to rate - limiting. Rate limiting is based on your source IP, which may be a problem - with multiple users behind the same proxy. Additionally, LACNIC implements - aggressive rate limiting. Experimental bulk query support is new as of - v1.0.0. - -Features -======== - -* Parses a majority of whois fields in to a standard dictionary -* IPv4 and IPv6 support -* Supports RDAP queries (recommended method, see: - https://tools.ietf.org/html/rfc7483) -* Proxy support for RDAP queries -* Supports legacy whois protocol queries -* Referral whois support for legacy whois protocol -* Recursive network parsing for IPs with parent/children networks listed -* National Internet Registry support for JPNIC and KRNIC -* Supports IP to ASN and ASN origin queries -* Python 2.6+ and 3.3+ supported -* Useful set of utilities -* Experimental bulk query support -* BSD license -* 100% core code coverage (See '# pragma: no cover' for exclusions) -* Human readable field translations -* Full CLI for IPWhois with optional ANSI colored console output. - -Links -===== - -Documentation -------------- - -GitHub latest -^^^^^^^^^^^^^ - -https://ipwhois.readthedocs.io/en/latest - -GitHub dev -^^^^^^^^^^ - -https://ipwhois.readthedocs.io/en/dev - -Examples --------- - -https://github.com/secynic/ipwhois/tree/master/ipwhois/examples - -Github ------- - -https://github.com/secynic/ipwhois - -Pypi ----- - -https://pypi.org/project/ipwhois - -Changes -------- - -https://ipwhois.readthedocs.io/en/latest/CHANGES.html - -Upgrade Notes -------------- - -https://ipwhois.readthedocs.io/en/latest/UPGRADING.html - -Dependencies -============ - -Python 2.6:: - - dnspython - ipaddr - argparse (required only for CLI) - -Python 2.7:: - - dnspython - ipaddr - -Python 3.3+:: - - dnspython - -Installing -========== - -Latest release from PyPi:: - - pip install --upgrade ipwhois - -GitHub - Stable:: - - pip install -e git+https://github.com/secynic/ipwhois@master#egg=ipwhois - -GitHub - Dev:: - - pip install -e git+https://github.com/secynic/ipwhois@dev#egg=ipwhois - -Firewall Ports -============== - -ipwhois needs some outbound firewall ports opened from your host/server. - -:ASN (DNS): 53/tcp -:ASN (Whois): 43/tcp -:ASN (HTTP): - 80/tcp - - 443/tcp (Pending) -:RDAP (HTTP): - 80/tcp - - 443/tcp (Pending) -:NIR (HTTP): - 80/tcp - - 443/tcp (KRNIC) -:Legacy Whois: 43/tcp -:Get Host: 43/tcp - -API -=== - -IPWhois (main class) --------------------- - -ipwhois.IPWhois is the base class for wrapping RDAP and Legacy Whois lookups. -Instantiate this object, then call one of the lookup functions: - -`RDAP (HTTP) - IPWhois.lookup_rdap() <#rdap-http>`_ -OR -`Legacy Whois - IPWhois.lookup_whois() <#legacy-whois>`_ - -Input -^^^^^ - -+--------------------+--------+-----------------------------------------------+ -| **Key** |**Type**| **Description** | -+--------------------+--------+-----------------------------------------------+ -| address | str | An IPv4 or IPv6 address as a string, integer, | -| | | IPv4Address, or IPv6Address. | -+--------------------+--------+-----------------------------------------------+ -| timeout | int | The default timeout for socket connections | -| | | in seconds. Defaults to 5. | -+--------------------+--------+-----------------------------------------------+ -| proxy_opener | object | The urllib.request.OpenerDirector request for | -| | | proxy support or None. | -+--------------------+--------+-----------------------------------------------+ -| allow_permutations | bool | Allow net.Net() to use additional methods if | -| | | DNS lookups to Cymru fail. *WARNING* | -| | | deprecated in favor of new argument | -| | | asn_methods. Defaults to True. | -+--------------------+--------+-----------------------------------------------+ - -RDAP (HTTP) ------------ - -IPWhois.lookup_rdap() is the recommended lookup method. RDAP provides a -far better data structure than legacy whois and REST lookups (previous -implementation). RDAP queries allow for parsing of contact information and -details for users, organizations, and groups. RDAP also provides more detailed -network information. - -RDAP documentation: - -https://ipwhois.readthedocs.io/en/latest/RDAP.html - -Legacy Whois ------------- - -Legacy Whois documentation: - -https://ipwhois.readthedocs.io/en/latest/WHOIS.html - -National Internet Registries ----------------------------- - -This library now supports NIR lookups for JPNIC and KRNIC. Previously, Whois -and RDAP data for Japan and South Korea was restricted. NIR lookups scrape -these national registries directly for the data restricted from regional -internet registries. NIR queries are enabled by default via the inc_nir -argument in the IPWhois.lookup_*() functions. - -https://ipwhois.readthedocs.io/en/latest/NIR.html - -Autonomous System Numbers -------------------------- - -This library now supports ASN origin lookups via Whois and HTTP. - -IP ASN functionality was moved to its own parser API (IPASN). - -There is no CLI for these yet. - -https://ipwhois.readthedocs.io/en/latest/ASN.html - -Utilities ---------- - -Utilities documentation: - -https://ipwhois.readthedocs.io/en/latest/UTILS.html - -Scripts -------- - -CLI documentation: - -https://ipwhois.readthedocs.io/en/latest/CLI.html - -Experimental Functions ----------------------- - -.. caution:: - - Functions in experimental.py contain new functionality that has not yet - been widely tested. Bulk lookup support contained here can result in - significant system/network resource utilization. Additionally, abuse of - this functionality may get you banned by the various services queried by - this library. Use at your own discretion. - -Experimental functions documentation: - -https://ipwhois.readthedocs.io/en/latest/EXPERIMENTAL.html - -Contributing -============ - -https://ipwhois.readthedocs.io/en/latest/CONTRIBUTING.html - -IP Reputation Support -===================== - -This feature is under consideration. Take a look at TekDefense's Automater: - -`TekDefense-Automater `_ - -Domain Support -============== - -There are no plans for domain whois support in this project. - -Look at Sven Slootweg's -`python-whois `_ for a library with -domain support. - -Special Thanks -============== - -Thank you JetBrains for the `PyCharm `_ -open source support! - -Thank you Chris Wells (`@cdubz `_) for your -extensive testing on the experimental functions! - -Last but not least, thank you to all the issue submitters and contributors. - - -Changelog -========= - -1.0.0 (2017-07-30) ------------------- - -- Deprecated asn_alts, allow_permutations in favor of new asn_methods (#158) -- Added new exception ASNOriginLookupError (#158) -- KRNIC lookups changed to HTTPS (#166) -- Added experimental functions - get_bulk_asn_whois, bulk_lookup_rdap (#134) -- Fixed bug in NIR lookups that caused addresses with multi-line contacts to - error (#172 - kwheeles) -- Added IANA Reserved CIDR 198.97.38.0/24 to ipv4_is_defined (#174) -- Fixed bug in RDAP notices/remarks parsing that would omit partial entries - missing one or more of title, description, links (#176) -- Added new return key asn_description via verbose ASN DNS lookup support and - modified ASN whois lookups. New argument get_asn_description to disable - additional DNS lookup (#176) -- Fixed some test function naming errors -- Added new generators to utils.py: ipv4_generate_random and - ipv6_generate_random (#183) -- Moved upgrade notes to new UPGRADING.rst -- Deprecated unnecessary protected class functions, changed to public in - asn.py, nir.py, and whois.py (#184) -- net.Net.get_host(), utils.ipv4_is_defined(), and utils.ipv6_is_defined now - return namedtuple instead of tuple. -- Changed docstrings to Google standard for better napoleon parsing (#185) -- Removed deprecated IPWhois.lookup() - This was moved to - IPWhois.lookup_whois() -- Fixed 'nets'->'range' bug for legacy whois CIDR net_range values (#188) -- Fixed a bug in IPASN/Net that caused the ASN result to vary if Cymru has - more than one ASN listed for an IP (#190) -- Updated ElasticSearch example for ES v5.5.1 (#138) - -0.15.1 (2017-02-16) -------------------- - -- Fixed IPv6 parsing for ASN origin lookups and added tests (#162 - ti-mo) -- Fixed recursive role parsing at depths greater than 0 (#161 - cdubz) - -0.15.0 (2017-02-02) -------------------- - -- Python 3.3+ dnspython3 requirement changed to dnspython (#155) -- Added ASN origin lookup support (#149) -- Moved ASN parsing from net.Net.get_asn_*() to new class asn.IPASN. - The original functions now return the raw query (#157) -- net.Net.lookup_asn() is deprecated in favor of asn.IPASN.lookup() (#157) -- Added new exception ASNParseError (#157) -- Fixed rate-limiting exception handling for when HTTP errors are returned - rather than JSON errors (rikonor - #144) -- Fixed rate-limit infinite recursion bug for legacy whois (rikonor - #144) -- Fixed bug in net.Net.get_http_raw() that would pass the encoded form_data on - retry rather than the original argument. -- Removed nose requirements and fixed travis.yml for updated pip -- Documentation updates -- Code style tweaks -- Updated tests and version info for Python 3.6 -- Added basic stress tests (#144) -- Minor tweaks to existing tests - -0.14.0 (2016-08-29) -------------------- - -- Changed legacy whois emails output type to list (#133) -- Fixed retry count non-decrementing infinite loop in - ipwhois.net.Net.get_whois() (issue #125 - krader1961) -- Added new function ipwhois.net.Net.get_http_raw() and tests (#67) -- Added National Internet Registry (JPNIC, KRNIC) support (#67). Enabled by - default in IPWhois.lookup_*(). Disable by passing inc_nir=False. Optionally, - lower level code can call nir.NIRWhois(). This enhancement results in extra - network queries, but more detailed information for NIRs. -- Added utils CLI (ipwhois_utils_cli.py) - #121. Installed to your environments - Scripts dir. This is a wrapper for utils.py. -- Documentation improvements (#123) -- kw arg readability (#115) -- Replaced usage of args with script_args in ipwhois_cli.py -- Minor optimization in whois.py and online/test_whois.py -- Added coveralls integration and re-enabled online tests with Travis CI -- Added Read the Docs support (#132) -- Added documentation (Sphinx) requirements.txt (#132) -- Fixed test imports -- Added --json argument (output in JSON format) to ipwhois_cli.py (#135) - -0.13.0 (2016-04-18) -------------------- - -- Added events_actor parsing for RDAP results. -- Added example for caching data via Redis (#81) -- Added normalization (human-readable field information) in hr.py (#47) -- README word wrap fix (#102) -- Fixed bug in exception handling for ASN HTTP lookups. -- Fixed bug in IPWhois.lookup_rdap() that caused ASN HTTP lookup responses to - be used in place of RDAP responses. -- Added new function Net.get_asn_http() and migrated code from - Net.lookup_asn() + new tests. -- Fixed bug in ASN HTTP fallback lookups for DNIC (#108). -- Added new parameter extra_org_map in Net.get_asn_http(), Net.lookup_asn(), - and IPWhois.lookup*() (#108). -- Fixed _RDAPCommon.summarize_notices() None check - changed len() to all(). -- Added CLI (ipwhois_cli.py) - #46. Installed to your environments Scripts dir. - This is a wrapper for ipwhois.py (IPWhois). Utils CLI will be in a future - release (#121). -- Documentation split up and added more detail (#81). - -0.12.0 (2016-03-28) -------------------- - -- Added headers parameter to ipwhois.Net.get_http_json() (issue #98). -- Fixed ASN HTTP lookup (fallback) Accept headers (issue #98). -- Fixed HTTP decoding, set to utf-8 (italomaia - issue #97) -- IPWhois.lookup() deprecated (issue #96), and will be removed in a future - release (TBD). Use IPWhois.lookup_whois() instead. -- Added rate_limit_timeout parameter (issue #99) to Net.get_http_json(), - IPWhois.lookup_rdap(), and RDAP.lookup(). New exception HTTPRateLimitError. -- Added new parameter asn_alts to Net.lookup_asn(), IPWhois.lookup_rdap() and - IPWhois.lookup(). Takes a list of lookup types to attempt if the - ASN dns lookup fails. Allow permutations must be enabled. Defaults to all - ['whois', 'http'] (issue #93). -- Fixed socket exception handling in Net.get_http_json() for Python 2.6. -- Fixed assertIsInstance for Python 2.6 tests (issue #100). Implemented - unittest._formatMessage and unittest.util.safe_repr for Python 2.6. -- Moved TestCommon to tests\\__init__.py to avoid duplicate code. -- Replaced remaining % with str.format (issue #95). - -0.11.2 (2016-02-25) -------------------- - -- Added allow_permutations parameter (bool) to net.Net() and ipwhois.IPWhois() - to allow alternate ASN lookups if DNS lookups fail. (FirefighterBlu3) -- Fixed ASN DNS resolver timeout/retry_count support. Retry count is used as a - multiplier of timeout, to determine a limetime interval. (FirefighterBlu3) -- Fixed bug where remarks would return None if missing a title. -- Added CONTRIBUTING.rst -- Added tests - -0.11.1 (2015-12-17) -------------------- - -- Re-added CIDR calculation for RDAP lookups. -- Improved tests - core code coverage now 100%. See '# pragma: no cover' for - exclusions. A few bugs were identified in the process, detailed below. -- Moved IP zero stripping from rdap._RDAPNetwork.parse() to new helper function - utils.ipv4_lstrip_zeros(). -- Moved CIDR calculation from rdap._RDAPNetwork.parse() to new helper function - utils.calculate_cidr(). -- Fixed utils.ipv4_is_defined() if statement ordering for RFC 1918 conflict. -- Fixed utils.ipv6_is_defined() if statement ordering for Unspecified and - Loopback (conflict with Reserved). -- Added is_offline parameter to whois.Whois.lookup() primarily for testing. -- Fixed bug in whois.Whois._parse_fields() that attempted to parse 'val2' of - regex, which is no longer used. Also fixed the expected Exception to be - IndexError. -- Fixed bug in ipwhois.IPWhois.lookup() where the argument order was mixed up, - causing referral lookups to be skipped when get_referral=True. -- Fixed bug in rdap._RDAPCommon.summarize_notices() output for links. -- Fixed bug in root entity iteration exception handling in rdap.RDAP.lookup(). - -0.11.0 (2015-11-02) -------------------- - -- Support for REST lookups replaced with RDAP. -- Split code for a more structured system (net, whois, rdap, exceptions). -- Tests match the data new structure. -- Split tests for online and offline testing. -- Performance enhancements for parsing. -- Added an optional bootstrap parameter for RDAP lookups, in order to replace - ASN lookups or use both. Will default to False. Afrinic is currently not - supported, so I would not use this for now. ARIN acknowledged my issue - for this, and will be adding support back in for Afrinic bootstrap. -- Added field_list parameter (inclusion list) for WHOIS lookups. -- Added logging. -- Added examples directory. - -0.10.3 (2015-08-14) -------------------- - -- Fixed LACNIC lookup_rws() queries, since they switched to RDAP. This is - temporary to get it working until the major library transition to RDAP and - new parsed formatting is complete. - -0.10.2 (2015-05-19) -------------------- - -- Fixed APNIC parsing for updated field. -- Fixed datetime parsing and validation when Zulu (Z) is appended. -- Added RIPE parsing for created and updated fields (whois and RWS). -- Removed unnecessary parentheses in IPWhois class declaration. -- Some documentation and comment tweaking to work with Sphinx. -- Minor PEP 8 tweaks. - -0.10.1 (2015-02-09) -------------------- - -- Fixed setup.py bug. - -0.10.0 (2015-02-09) -------------------- - -- Added .csv support for country code source. You can no longer download - country code information from iso.org. -- Added support for IPv4Address or IPv6Address as the address arg in IPWhois. -- Fixed file open encoding bug. Moved from open to io.open. -- Fixed parameter in IPWhois ip defined checks. -- Fixed TestIPWhois.test_ip_invalid() assertions. - diff --git a/env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/RECORD b/env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/RECORD deleted file mode 100644 index 5ef41e1..0000000 --- a/env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/RECORD +++ /dev/null @@ -1,35 +0,0 @@ -../../../bin/__pycache__/ipwhois_cli.cpython-37.pyc,, -../../../bin/__pycache__/ipwhois_utils_cli.cpython-37.pyc,, -../../../bin/ipwhois_cli.py,sha256=a0lwRXpqOfLGfwh-nJz4DN6whYTuTsfMFCfEBHiHE-A,55038 -../../../bin/ipwhois_utils_cli.py,sha256=jslJNW3P7UTCICoXuYuQwT-54GUYmDVXQOWLthHmORI,8656 -ipwhois-1.0.0.dist-info/DESCRIPTION.rst,sha256=7o6HwNJv0917--N8hj5BvocWFjzJxUn4KO8g8fMQIjA,17221 -ipwhois-1.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -ipwhois-1.0.0.dist-info/METADATA,sha256=Pb9qUi-QPn0Gc-VxuLIjT07r9MAIXs_Z1aT0mw92G7I,18650 -ipwhois-1.0.0.dist-info/RECORD,, -ipwhois-1.0.0.dist-info/WHEEL,sha256=9Z5Xm-eel1bTS7e6ogYiKz0zmPEqDwIypurdHN1hR40,116 -ipwhois-1.0.0.dist-info/metadata.json,sha256=_KPnHen51YlAxxSUQBGdVU7qYwgIWonI0ghxm4R_GxU,1646 -ipwhois-1.0.0.dist-info/top_level.txt,sha256=Rk_3xKIClsg-roGROLi8TYR4zo_8K6grqAKvL_O9ad8,8 -ipwhois/__init__.py,sha256=jPf4qFf_oefS_IXNaBi-Sv4heAscRtzj2rspLTuMAKI,1473 -ipwhois/__pycache__/__init__.cpython-37.pyc,, -ipwhois/__pycache__/asn.cpython-37.pyc,, -ipwhois/__pycache__/exceptions.cpython-37.pyc,, -ipwhois/__pycache__/experimental.cpython-37.pyc,, -ipwhois/__pycache__/hr.cpython-37.pyc,, -ipwhois/__pycache__/ipwhois.cpython-37.pyc,, -ipwhois/__pycache__/net.cpython-37.pyc,, -ipwhois/__pycache__/nir.cpython-37.pyc,, -ipwhois/__pycache__/rdap.cpython-37.pyc,, -ipwhois/__pycache__/utils.cpython-37.pyc,, -ipwhois/__pycache__/whois.cpython-37.pyc,, -ipwhois/asn.py,sha256=-3O72RFaBEaqZEdS4raoKM9n08I2sfogP5_oVcnSLhw,32339 -ipwhois/data/iso_3166-1.csv,sha256=O_whGbkO5HNp_ziuV91LhRLG6tSr8QYppzjagx-i1kE,4264 -ipwhois/data/iso_3166-1_list_en.xml,sha256=eLlDUEmUp8rRSIfL-7lxy2PmNsMyH53ot972MtIH0Ss,48718 -ipwhois/exceptions.py,sha256=VyF7DIBWov81iapkkQMRVWuSq86u_Fvo_1SPR0wh5MA,3528 -ipwhois/experimental.py,sha256=iEvv8DeTwM8Nrk12ud1ZSUsHoz_5LZ0kMKTTdyWot0g,18218 -ipwhois/hr.py,sha256=lGV1CTcjB0SLALJQxC6cvZh1fRzIChUx3S8wDbZ5LRs,18692 -ipwhois/ipwhois.py,sha256=sAARLxVJ1eS2DdH295Y17v0tbh2XM25rofpkQbYUvy0,16403 -ipwhois/net.py,sha256=PMNDaLeEemO8SV573rg_OYqvpCK1SKkfFEHG1KqZPLM,33339 -ipwhois/nir.py,sha256=UTLmksBP0ofiwYBKdDvYVKOK10DBug4YwfIrggH23sc,23819 -ipwhois/rdap.py,sha256=MD8-6gFqiiKjpvUnsK4lOBcwRAowu7fMf_jL2nxGE3U,25179 -ipwhois/utils.py,sha256=qY9NzqSClrg9Pc12TlyR63Le6OIV_rLlGMD8hwKGkzI,19201 -ipwhois/whois.py,sha256=kQibhvHbforGDOk83GUpLHI5nz3_INXoYZHutXuJ-7k,27642 diff --git a/env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/WHEEL b/env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/WHEEL deleted file mode 100644 index ab4a09e..0000000 --- a/env/lib/python3.7/site-packages/ipwhois-1.0.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/env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/metadata.json b/env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/metadata.json deleted file mode 100644 index 9f77592..0000000 --- a/env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Intended Audience :: Information Technology", "Intended Audience :: Science/Research", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "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.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Internet", "Topic :: Software Development"], "download_url": "https://github.com/secynic/ipwhois/tarball/master", "extensions": {"python.details": {"contacts": [{"email": "secynic@gmail.com", "name": "Philip Hane", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/secynic/ipwhois"}}}, "extras": [], "generator": "bdist_wheel (0.29.0)", "keywords": ["Python", "WHOIS", "RWhois", "Referral", "Whois", "ASN", "IP", "Address", "IP", "IPv4", "IPv6", "IETF", "REST", "Arin", "Ripe", "Apnic", "Lacnic", "Afrinic", "NIC", "National", "Information", "Center", "RDAP", "RIR", "Regional", "Internet", "RegistryNIR", "National", "Internet", "Registry", "ASN", "origin", "Origin"], "license": "BSD", "metadata_version": "2.0", "name": "ipwhois", "run_requires": [{"requires": ["dnspython"]}, {"environment": "python_version < \"3.3\"", "requires": ["ipaddr"]}], "summary": "Retrieve and parse whois data for IPv4 and IPv6 addresses.", "version": "1.0.0"} \ No newline at end of file diff --git a/env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/top_level.txt b/env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/top_level.txt deleted file mode 100644 index f2590b2..0000000 --- a/env/lib/python3.7/site-packages/ipwhois-1.0.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -ipwhois diff --git a/env/lib/python3.7/site-packages/ipwhois/__init__.py b/env/lib/python3.7/site-packages/ipwhois/__init__.py index e9103f8..bc3e6de 100644 --- a/env/lib/python3.7/site-packages/ipwhois/__init__.py +++ b/env/lib/python3.7/site-packages/ipwhois/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2013-2017 Philip Hane +# Copyright (c) 2013-2019 Philip Hane # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -26,4 +26,4 @@ from .exceptions import * from .net import Net from .ipwhois import IPWhois -__version__ = '1.0.0' +__version__ = '1.1.0' diff --git a/env/lib/python3.7/site-packages/ipwhois/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/ipwhois/__pycache__/__init__.cpython-37.pyc index a547e950d077ad0d0e54327371a2c91583e0e6f0..57ee300388adac866bc2aa015e42578454a593a7 100644 GIT binary patch delta 37 rcmZo?YG>kc;^pOH0D}6(60s9`G8hdfmWFZ|R~8l*6qII9ykrUhp4tkY delta 37 rcmZo?YG>kc;^pOH0D{{2YB3XeG8hdemWFZ|Wg2H$W~UcVykrUhns*8c diff --git a/env/lib/python3.7/site-packages/ipwhois/__pycache__/asn.cpython-37.pyc b/env/lib/python3.7/site-packages/ipwhois/__pycache__/asn.cpython-37.pyc index 2bade14067cd7c86f895781d7ebedad6ce6ade7e..7e189cc7387169abb8d7dd1bf25bbe4c3852e712 100644 GIT binary patch delta 1745 zcmY*ZUu;uV7(d_X?QMJ8dwctL>)J80Sp`XmFg5{)I6xRY7`N4R!sfDgK(dnB-d<%T z=h6t#kjTv9nFS3GchN@$w8lq_8lQ+E(HJ8SKJg&RlQD*eCHS4&0@=OEy*b}G=lA{l zeZS^4`1Km-`*d9+_%uH4o~2*vSJmKPy;`eO-YT_zP$!aLiF9^1+!5p1W8)|7F!!H_ z17vo_QR_MG<0?}#gatChjjWOk;R*|mkRmDXREVvXH0xg=P5{W69y{b}Ead98!2{=E z6<;8yuZRcPRO3p~yO$x$Q0w;2X>!+&vhaC02Z%O-Xwj0k4Ayoa@;yghCFK#cnx6Gk z$4kzRv52d4;DJ@jfa&kj3~6KF3Y@^%z_h$cr_tji*=)=={6xf4L#@wqKlvdqUh2=& zGg)zUdsckZKLl}cv%jd_4qC_GK5o^HGtocr4vdM<2DYRON_{z>NrMo9Bvq+KHHftS z7#IRLD&|Kwi#_=SG{t!SMY=}C<$Nzpi*NFMi5#QM$CQ&kmva9qSOwcB?&Y%$MV93N zmSFbY40R%o&LhlUQmiKT*P5Ix_!rb#(+)6Aro(kcOBBoTN&SYm7hDK&YJJ6NMBie3814#8}?1SM(8HVL(^?kOKnZ(WjJN#QX8v>hq$sz+i2AahA%^tXw;fnhZghD(v50m znp7)TH;q9lh{tSfQQT{himShPSbpozctK}b!cF7JWQIuod*SE2@RK~rQaC*tOFf#N z$FBce=Q@oTiT3;y#pz9HxZnC<)3$K9*V>0uY>nba+#0N^FUZxDIJjdJ4vPyrM$K6? z+z!sy%5(Fl?3z^+zwg+Eq)ZH5>UM#US`+ulV2}oBM2SGq7g0>{{m?(^Q3-TRJU7)V zejDBZto7gUvlL!$ZQZrk5ATce^B=;LfW3F2+WLF%7XUxDJ|4ZKz^&G{gG&I4`1a6# zs0iQKFqFmavA$RjQ(537b$vLbU@h2+D31*^t}nx4-1hTeX9|?g6zEL#Iv=b*VXJO{ z=`P_N`M{z|-UIhBV~ILSM|Lzj+@YL;g)=-h$(vEUX>)PM()PA z>Bf0X3Mi5ftUGqZiI){S;l#bPvT|p!f|WKsA!lBl6T&zW?n_Eri6CX4<|gV-t_vld z^dCJ31u--j{Cs^Me)U4`S>(r4#0A|E@<2T_ou{3d5m2^8ZAg)bh z#D+mlJeZh+Sur$Y%x)0B|)_gK@CxRP?`jM5p>JC`*X(!3Ruy5Hy;o59*6=k`PIJ@QDY{%&tHaXOcUabMO7m zIp6ut`T06rz7CO*NW>ucI3M-ROne@>rs*%dwY@x8nX5Oy*2YsXB{Q8b!ng8B=k%*( zq3$QMuRB_!AOb>TTAr|Ap19#Pk|#o8`Vc9R>K=t~tzy{!0C9pq&h_w+Yp{@O@`wm7 z!WzCnc$68kR>+JTCbgB4cWoT6MJvWK*f}8Hd!8I4)giRTeCv1{uD~r8c1-~yxJDT; zQ=TbwE0I$Rs*I-xn%@+@Q{|UWAAz_udrR_6?>jIeAM|dC8I%SJ0gLKjLI*XP+cx$C z9FyN4d{$oCl!W)>$D0mN5|H;cb-|1b_H}1_IAxRtm@*ew1UDemHL$0+A_x0Ar&TYN z{bU(t@6S-jbRxoJYDKYEg<4+~q^y;L^;NDjV-e1Sh%j2AnAwMoul&7G*$~veCFt2N zSU5#mwi99R>zeXl7iOtkD)?jXx0~wNI`?jQfb$1wKV;9O*L{RCJ7S z9t)H33!~xRUn1>bom*iM2e+R=LSprI)9QIYTsYyIfEF< zmeNZ^4sJFLk5>Wc=wb7>&CiFe4fY6jojr`puYvj-TxNIFv;&@LQeN6I42R?oJBF

sJ zaQVvUK);PGrk{p0)CmC*Ar@N1?q%8>2rWw-y}E%1n8t#06k9~WmIS-XRe58yH+XXy z<`Z0#zmMkknT?G+=;|!uA_*;CkZrFGKm=HHi8@MKZDDS<)utn(QD1G|&6vD9mXn9a z)P)t)Mi8~J(kS|v)?-W_VR4*Ei9B&)h#ce5wk7E`%8=J+p>nKk!wRGCw1~0HlHw>V z>x4@h@MS*>j$64N2l-K6Bg@P*S7$S4T zv9JRY_#Z~a#)ai3MckWzs5!9z)$uzp zD}Njx!!g%6aRJv)ChBO(76%eJd(czPBWc>N$>YTd)XKGD0WQfq#a_4|9~3+Ak}>&i iAsj#rUi37$#i9nPP^U&)hY5LO@*WhMSC8%jQ2qr38>cq_ diff --git a/env/lib/python3.7/site-packages/ipwhois/__pycache__/exceptions.cpython-37.pyc b/env/lib/python3.7/site-packages/ipwhois/__pycache__/exceptions.cpython-37.pyc index 1a16e9161f5622ff89dea0b1a2cc4d760db280f8..d710d2bee1eecfd5135209bae1617bb2a0b5090e 100644 GIT binary patch delta 672 zcmYk&O=}ZT6b9hT_eU}}x%sYbnsFlySg;fqE?i7eM4@h^Dg}|!JEg%iGtMMb>mrJ- z3+1fDovz%qt_5}BpKu|93x9+NzByvZg_+@b-+RttzII-B#YPbL1)Ryd_JbedM6`8N zJ6Y*Ww3o)VexsmFWxXmWE1uebZRNlY+k{=^!5-U!eN}{uY#T1A01ns=EL0gTvt78N zBrMq;Tvau=HsHWVP*)8E4R#T3sutX0m*BQqfEU;Sd`>OGi);ZesSey>m*HjAg}dyE z3hxwp=PA-xZ`C(;^7v+YxS#a%>rZy$bkt9VM_2q1XIh2v|1jK3vT$cG2uJ&I*#9>X z?vC?Oau6oNIHxmh%Uyr^I8W2@BNF^T#b2s?ZY9f6$*Gzr8C+VWNr!{FJF4)URDmJ|rOMd}GN1#*y delta 537 zcmYk&yGjE=6b9hU?re5<_Leoqs7VwRycB{)8xfJ%*ocjYcqxx}R7ePd5K?F@gi~4h z3L@5uh2W*h6KH${K?@u4&lDjGv%~kFnZKB;{-<29;QLa;SGgYEdiHBUxBjiwMsro| z+}O|;H40TZNPD|U`tuRHaW1PY{HUU*j0|h9{I4ZY{3DAaHwp<35wuI*?~JK z2`9HyAQ5y@3PDQQg}W#Xr0wwi_;gd6Qg?S9va8;CZXef7pMlGrqG5d}E*TiCy45=axsDW>Z2nZOU>Kp=G_T zDZ-?|bs5A2f5<%R-g}tDe5ZBB4*Vmf+uD OjaS1#k%hSuX8!@vdVWv< diff --git a/env/lib/python3.7/site-packages/ipwhois/__pycache__/experimental.cpython-37.pyc b/env/lib/python3.7/site-packages/ipwhois/__pycache__/experimental.cpython-37.pyc index 273904449db281652d40da3e65b08f63d61e20b4..ce2615b71f59d085dc7ae7d5ee66ac8c707b913b 100644 GIT binary patch delta 36 qcmbQ`GRuY6iI{tE+{C?-dw{zPYM94TncCa delta 36 qcmbQ`GRuY6iIK}vdm5|-dw{zPYM8}Zwb%< diff --git a/env/lib/python3.7/site-packages/ipwhois/__pycache__/hr.cpython-37.pyc b/env/lib/python3.7/site-packages/ipwhois/__pycache__/hr.cpython-37.pyc index 43ea5afea3c01eeccc6f952f85efe0950935c429..08fab051268bb847052396267a31c22c69f06eab 100644 GIT binary patch delta 35 pcmca@dE1i5iI`Q>3Wopy delta 35 pcmca@dE1i5iI`A63G@H} diff --git a/env/lib/python3.7/site-packages/ipwhois/__pycache__/ipwhois.cpython-37.pyc b/env/lib/python3.7/site-packages/ipwhois/__pycache__/ipwhois.cpython-37.pyc index 386d5a84063167b8c4efc5226619b4478f34bbfa..e6b67e2350dff4d2e89feb02573dc010f96bb753 100644 GIT binary patch delta 62 zcmdm!xF?az7b8s9!7*YqOE}AUmVm=JV{2SU8L;3yTX1O0zfb=sZ68-=H delta 59 zcmZ2Hi*fNRMqVdgUM>b8sGYACW4)30AUk8o=JV{2SU8L_jk7GX(~CFn=K15`_Q& diff --git a/env/lib/python3.7/site-packages/ipwhois/__pycache__/nir.cpython-37.pyc b/env/lib/python3.7/site-packages/ipwhois/__pycache__/nir.cpython-37.pyc index 590dfbbb2c3be15b93630108a6e2564613f5c8b1..5611da8e49fa7866e4fea1357697481a4016c463 100644 GIT binary patch delta 87 zcmexd^0|c9iI{tE+{C?-mJm%K$bCMGpAN5k3ua_Nl^=k jXaW+qI8*aVb5n~FOHzwMK!O>Q=b6bf_H5o~wv`zGQ2-hW delta 87 zcmexd^0|c9iIK}vdm5|-mJm%K$bCgGpAN5k3t<#Nl`0^ jXaW+qI8*aVb5n~FOHzwMK!UlG=b6bf_HN#1wv`zGF%%hz diff --git a/env/lib/python3.7/site-packages/ipwhois/__pycache__/rdap.cpython-37.pyc b/env/lib/python3.7/site-packages/ipwhois/__pycache__/rdap.cpython-37.pyc index 189bc4fc0ce3d51042454b17fff382ba2fd050e8..4af57b462ee77b92ad979256f86d655240e5f845 100644 GIT binary patch delta 37 rcmeC_VC?B&K9AIe%;7x#>-(`Sy)_9P@28jo43#u>b&#vJ*4_ delta 68 zcmbQ$!Z@pik=Kcrmx}=iYUiuP{MyKC#>-)pX`E%5onE}zo43#u>b&gkrJ)| diff --git a/env/lib/python3.7/site-packages/ipwhois/asn.py b/env/lib/python3.7/site-packages/ipwhois/asn.py index 1b33c1e..d73b477 100644 --- a/env/lib/python3.7/site-packages/ipwhois/asn.py +++ b/env/lib/python3.7/site-packages/ipwhois/asn.py @@ -1,4 +1,4 @@ -# Copyright (c) 2013-2017 Philip Hane +# Copyright (c) 2013-2019 Philip Hane # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -371,7 +371,7 @@ class IPASN: log.debug('No networks found') net_list = [] - for n in net_list: + for n in reversed(net_list): try: @@ -383,10 +383,15 @@ class IPASN: log.debug('Could not parse ASN registry via HTTP: ' '{0}'.format(str(e))) - raise ASNRegistryError('ASN registry lookup failed.') + continue break + if not asn_data['asn_registry']: + + log.debug('Could not parse ASN registry via HTTP') + raise ASNRegistryError('ASN registry lookup failed.') + except ASNRegistryError: raise @@ -475,9 +480,7 @@ class IPASN: else: - # Python 2.6 doesn't support set literal expressions, use explicit - # set() instead. - if set(['dns', 'whois', 'http']).isdisjoint(asn_methods): + if {'dns', 'whois', 'http'}.isdisjoint(asn_methods): raise ValueError('methods argument requires at least one of ' 'dns, whois, http.') @@ -508,7 +511,7 @@ class IPASN: asn_data_list = [] for asn_entry in response: - asn_data_list.append(self._parse_fields_dns( + asn_data_list.append(self.parse_fields_dns( str(asn_entry))) # Iterate through the parsed ASN results to find the @@ -541,7 +544,7 @@ class IPASN: try: response = self._net.get_asn_whois(retry_count) - asn_data = self._parse_fields_whois( + asn_data = self.parse_fields_whois( response) # pragma: no cover break @@ -557,7 +560,7 @@ class IPASN: response = self._net.get_asn_http( retry_count=retry_count ) - asn_data = self._parse_fields_http(response, + asn_data = self.parse_fields_http(response, extra_org_map) break @@ -839,9 +842,7 @@ class ASNOrigin: else: - # Python 2.6 doesn't support set literal expressions, use explicit - # set() instead. - if set(['whois', 'http']).isdisjoint(asn_methods): + if {'whois', 'http'}.isdisjoint(asn_methods): raise ValueError('methods argument requires at least one of ' 'whois, http.') @@ -915,7 +916,7 @@ class ASNOrigin: results['raw'] = response nets = [] - nets_response = self._get_nets_radb(response, is_http) + nets_response = self.get_nets_radb(response, is_http) nets.extend(nets_response) @@ -935,7 +936,7 @@ class ASNOrigin: section_end = nets[index + 1]['start'] - temp_net = self._parse_fields( + temp_net = self.parse_fields( response, fields['radb']['fields'], section_end, diff --git a/env/lib/python3.7/site-packages/ipwhois/exceptions.py b/env/lib/python3.7/site-packages/ipwhois/exceptions.py index 5e2f78a..7a0c77f 100644 --- a/env/lib/python3.7/site-packages/ipwhois/exceptions.py +++ b/env/lib/python3.7/site-packages/ipwhois/exceptions.py @@ -1,4 +1,4 @@ -# Copyright (c) 2013-2017 Philip Hane +# Copyright (c) 2013-2019 Philip Hane # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -23,83 +23,89 @@ # POSSIBILITY OF SUCH DAMAGE. -class NetError(Exception): +class BaseIpwhoisException(Exception): + """ + Base exception for all the ipwhois custom ones. + """ + + +class NetError(BaseIpwhoisException): """ An Exception for when a parameter provided is not an instance of ipwhois.net.Net. """ -class IPDefinedError(Exception): +class IPDefinedError(BaseIpwhoisException): """ An Exception for when the IP is defined (does not need to be resolved). """ -class ASNLookupError(Exception): +class ASNLookupError(BaseIpwhoisException): """ An Exception for when the ASN lookup failed. """ -class ASNRegistryError(Exception): +class ASNRegistryError(BaseIpwhoisException): """ An Exception for when the ASN registry does not match one of the five expected values (arin, ripencc, apnic, lacnic, afrinic). """ -class ASNParseError(Exception): +class ASNParseError(BaseIpwhoisException): """ An Exception for when the ASN parsing failed. """ -class ASNOriginLookupError(Exception): +class ASNOriginLookupError(BaseIpwhoisException): """ An Exception for when the ASN origin lookup failed. """ -class HostLookupError(Exception): +class HostLookupError(BaseIpwhoisException): """ An Exception for when the host lookup failed. """ -class BlacklistError(Exception): +class BlacklistError(BaseIpwhoisException): """ An Exception for when the server is in a blacklist. """ -class WhoisLookupError(Exception): +class WhoisLookupError(BaseIpwhoisException): """ An Exception for when the whois lookup failed. """ -class WhoisRateLimitError(Exception): +class WhoisRateLimitError(BaseIpwhoisException): """ An Exception for when Whois queries exceed the NIC's request limit and have exhausted all retries. """ -class HTTPLookupError(Exception): +class HTTPLookupError(BaseIpwhoisException): """ An Exception for when the RDAP lookup failed. """ -class HTTPRateLimitError(Exception): +class HTTPRateLimitError(BaseIpwhoisException): """ An Exception for when HTTP queries exceed the NIC's request limit and have exhausted all retries. """ -class InvalidEntityContactObject(Exception): +class InvalidEntityContactObject(BaseIpwhoisException): """ An Exception for when JSON output is not an RDAP entity contact information object: @@ -107,14 +113,14 @@ class InvalidEntityContactObject(Exception): """ -class InvalidNetworkObject(Exception): +class InvalidNetworkObject(BaseIpwhoisException): """ An Exception for when JSON output is not an RDAP network object: https://tools.ietf.org/html/rfc7483#section-5.4 """ -class InvalidEntityObject(Exception): +class InvalidEntityObject(BaseIpwhoisException): """ An Exception for when JSON output is not an RDAP entity object: https://tools.ietf.org/html/rfc7483#section-5.1 diff --git a/env/lib/python3.7/site-packages/ipwhois/experimental.py b/env/lib/python3.7/site-packages/ipwhois/experimental.py index 23261a3..c9fc4ac 100644 --- a/env/lib/python3.7/site-packages/ipwhois/experimental.py +++ b/env/lib/python3.7/site-packages/ipwhois/experimental.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017 Philip Hane +# Copyright (c) 2017-2019 Philip Hane # All rights reserved. # # Redistribution and use in source and binary forms, with or without diff --git a/env/lib/python3.7/site-packages/ipwhois/hr.py b/env/lib/python3.7/site-packages/ipwhois/hr.py index 43ba82f..6220d71 100644 --- a/env/lib/python3.7/site-packages/ipwhois/hr.py +++ b/env/lib/python3.7/site-packages/ipwhois/hr.py @@ -1,4 +1,4 @@ -# Copyright (c) 2013-2017 Philip Hane +# Copyright (c) 2013-2019 Philip Hane # All rights reserved. # # Redistribution and use in source and binary forms, with or without diff --git a/env/lib/python3.7/site-packages/ipwhois/ipwhois.py b/env/lib/python3.7/site-packages/ipwhois/ipwhois.py index 0839143..778a582 100644 --- a/env/lib/python3.7/site-packages/ipwhois/ipwhois.py +++ b/env/lib/python3.7/site-packages/ipwhois/ipwhois.py @@ -1,4 +1,4 @@ -# Copyright (c) 2013-2017 Philip Hane +# Copyright (c) 2013-2019 Philip Hane # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -48,7 +48,7 @@ class IPWhois: """ def __init__(self, address, timeout=5, proxy_opener=None, - allow_permutations=True): + allow_permutations=False): self.net = Net( address=address, timeout=timeout, proxy_opener=proxy_opener, diff --git a/env/lib/python3.7/site-packages/ipwhois/net.py b/env/lib/python3.7/site-packages/ipwhois/net.py index 01cbe3d..b2b1095 100644 --- a/env/lib/python3.7/site-packages/ipwhois/net.py +++ b/env/lib/python3.7/site-packages/ipwhois/net.py @@ -1,4 +1,4 @@ -# Copyright (c) 2013-2017 Philip Hane +# Copyright (c) 2013-2019 Philip Hane # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -113,7 +113,7 @@ class Net: """ def __init__(self, address, timeout=5, proxy_opener=None, - allow_permutations=True): + allow_permutations=False): # IPv4Address or IPv6Address if isinstance(address, IPv4Address) or isinstance( @@ -223,7 +223,7 @@ class Net: """ Temporary wrapper for IP ASN lookups (moved to asn.IPASN.lookup()). This will be removed in a future - release (1.0.0). + release (1.1.0). """ from warnings import warn diff --git a/env/lib/python3.7/site-packages/ipwhois/nir.py b/env/lib/python3.7/site-packages/ipwhois/nir.py index e04fcde..fc7a49a 100644 --- a/env/lib/python3.7/site-packages/ipwhois/nir.py +++ b/env/lib/python3.7/site-packages/ipwhois/nir.py @@ -1,4 +1,4 @@ -# Copyright (c) 2013-2017 Philip Hane +# Copyright (c) 2013-2019 Philip Hane # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -483,7 +483,7 @@ class NIRWhois: request_type=NIR_WHOIS[nir]['request_type'] ) - return self._parse_fields( + return self.parse_fields( response=contact_response, fields_dict=NIR_WHOIS[nir]['contact_fields'], dt_format=dt_format, @@ -582,11 +582,11 @@ class NIRWhois: nets_response = None if nir == 'jpnic': - nets_response = self._get_nets_jpnic(response) + nets_response = self.get_nets_jpnic(response) elif nir == 'krnic': - nets_response = self._get_nets_krnic(response) + nets_response = self.get_nets_krnic(response) nets.extend(nets_response) @@ -609,7 +609,7 @@ class NIRWhois: dt_format = None - temp_net = self._parse_fields( + temp_net = self.parse_fields( response=response, fields_dict=NIR_WHOIS[nir]['fields'], net_start=section_end, @@ -659,7 +659,7 @@ class NIRWhois: tmp_response = None tmp_handle = contact - temp_net['contacts'][key] = self._get_contact( + temp_net['contacts'][key] = self.get_contact( response=tmp_response, handle=tmp_handle, nir=nir, diff --git a/env/lib/python3.7/site-packages/ipwhois/rdap.py b/env/lib/python3.7/site-packages/ipwhois/rdap.py index 4b16dca..4a44b3a 100644 --- a/env/lib/python3.7/site-packages/ipwhois/rdap.py +++ b/env/lib/python3.7/site-packages/ipwhois/rdap.py @@ -1,4 +1,4 @@ -# Copyright (c) 2013-2017 Philip Hane +# Copyright (c) 2013-2019 Philip Hane # All rights reserved. # # Redistribution and use in source and binary forms, with or without diff --git a/env/lib/python3.7/site-packages/ipwhois/utils.py b/env/lib/python3.7/site-packages/ipwhois/utils.py index 98da43d..8fd94d9 100644 --- a/env/lib/python3.7/site-packages/ipwhois/utils.py +++ b/env/lib/python3.7/site-packages/ipwhois/utils.py @@ -1,4 +1,4 @@ -# Copyright (c) 2013-2017 Philip Hane +# Copyright (c) 2013-2019 Philip Hane # All rights reserved. # # Redistribution and use in source and binary forms, with or without diff --git a/env/lib/python3.7/site-packages/ipwhois/whois.py b/env/lib/python3.7/site-packages/ipwhois/whois.py index 3cd830d..f3f6333 100644 --- a/env/lib/python3.7/site-packages/ipwhois/whois.py +++ b/env/lib/python3.7/site-packages/ipwhois/whois.py @@ -1,4 +1,4 @@ -# Copyright (c) 2013-2017 Philip Hane +# Copyright (c) 2013-2019 Philip Hane # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -740,7 +740,7 @@ class Whois: results['raw_referral'] = response_ref - temp_rnet = self._parse_fields( + temp_rnet = self.parse_fields( response_ref, RWHOIS['fields'], field_list=field_list @@ -758,15 +758,15 @@ class Whois: if asn_data['asn_registry'] == 'arin': - nets_response = self._get_nets_arin(response) + nets_response = self.get_nets_arin(response) elif asn_data['asn_registry'] == 'lacnic': - nets_response = self._get_nets_lacnic(response) + nets_response = self.get_nets_lacnic(response) else: - nets_response = self._get_nets_other(response) + nets_response = self.get_nets_other(response) nets.extend(nets_response) @@ -788,7 +788,7 @@ class Whois: dt_format = None - temp_net = self._parse_fields( + temp_net = self.parse_fields( response, RIR_WHOIS[asn_data['asn_registry']]['fields'], section_end, diff --git a/env/lib/python3.7/site-packages/pip-18.1.dist-info/INSTALLER b/env/lib/python3.7/site-packages/pip-18.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/env/lib/python3.7/site-packages/pip-18.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/env/lib/python3.7/site-packages/pip-18.1.dist-info/LICENSE.txt b/env/lib/python3.7/site-packages/pip-18.1.dist-info/LICENSE.txt deleted file mode 100644 index d3379fa..0000000 --- a/env/lib/python3.7/site-packages/pip-18.1.dist-info/LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2008-2018 The pip developers (see AUTHORS.txt file) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/env/lib/python3.7/site-packages/pip-18.1.dist-info/METADATA b/env/lib/python3.7/site-packages/pip-18.1.dist-info/METADATA deleted file mode 100644 index 2e314aa..0000000 --- a/env/lib/python3.7/site-packages/pip-18.1.dist-info/METADATA +++ /dev/null @@ -1,70 +0,0 @@ -Metadata-Version: 2.1 -Name: pip -Version: 18.1 -Summary: The PyPA recommended tool for installing Python packages. -Home-page: https://pip.pypa.io/ -Author: The pip developers -Author-email: pypa-dev@groups.google.com -License: MIT -Keywords: distutils easy_install egg setuptools wheel virtualenv -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Topic :: Software Development :: Build Tools -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* - -pip -=== - -The `PyPA recommended`_ tool for installing Python packages. - -.. image:: https://img.shields.io/pypi/v/pip.svg - :target: https://pypi.org/project/pip/ - -.. image:: https://img.shields.io/travis/pypa/pip/master.svg?label=travis-ci - :target: https://travis-ci.org/pypa/pip - -.. image:: https://img.shields.io/appveyor/ci/pypa/pip.svg?label=appveyor-ci - :target: https://ci.appveyor.com/project/pypa/pip/history - -.. image:: https://readthedocs.org/projects/pip/badge/?version=latest - :target: https://pip.pypa.io/en/latest - -* `Installation`_ -* `Documentation`_ -* `Changelog`_ -* `GitHub Page`_ -* `Issue Tracking`_ -* `User mailing list`_ -* `Dev mailing list`_ -* User IRC: #pypa on Freenode. -* Dev IRC: #pypa-dev on Freenode. - -Code of Conduct ---------------- - -Everyone interacting in the pip project's codebases, issue trackers, chat -rooms and mailing lists is expected to follow the `PyPA Code of Conduct`_. - -.. _PyPA recommended: https://packaging.python.org/en/latest/current/ -.. _Installation: https://pip.pypa.io/en/stable/installing.html -.. _Documentation: https://pip.pypa.io/en/stable/ -.. _Changelog: https://pip.pypa.io/en/stable/news.html -.. _GitHub Page: https://github.com/pypa/pip -.. _Issue Tracking: https://github.com/pypa/pip/issues -.. _User mailing list: https://groups.google.com/forum/#!forum/python-virtualenv -.. _Dev mailing list: https://groups.google.com/forum/#!forum/pypa-dev -.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ - - diff --git a/env/lib/python3.7/site-packages/pip-18.1.dist-info/RECORD b/env/lib/python3.7/site-packages/pip-18.1.dist-info/RECORD deleted file mode 100644 index 739feb3..0000000 --- a/env/lib/python3.7/site-packages/pip-18.1.dist-info/RECORD +++ /dev/null @@ -1,614 +0,0 @@ -pip/__init__.py,sha256=nO-iphoXiDoci_ZAMl-PG2zdd4Y7m88jBDILTYzwGy4,21 -pip/__main__.py,sha256=L3IHqBeasELUHvwy5CT_izVEMhM12tve289qut49DvU,623 -pip/_internal/__init__.py,sha256=b0jSFCCViGhB1RWni35_NMkH3Y-mbZrV648DGMagDjs,2869 -pip/_internal/build_env.py,sha256=zKhqmDMnrX5OTSNQ4xBw-mN5mTGVu6wjiNFW-ajWYEI,4797 -pip/_internal/cache.py,sha256=96_aKtDbwgLEVNgNabOT8GrFCYZEACedoiucqU5ccg8,6829 -pip/_internal/configuration.py,sha256=KMgG3ufFrUKX_QESi2cMVvFi47tl845Bg1ZkNthlWik,13243 -pip/_internal/download.py,sha256=c5Hkimq39eJdZ6DN0_0etjK43-0a5CK_W_3sVLqH87g,33300 -pip/_internal/exceptions.py,sha256=EIGotnq6qM2nbGtnlgZ8Xp5VfP2W4-9UOCzQGMwy5MY,8899 -pip/_internal/index.py,sha256=6CAtZ8QTLcpw0fJqQ9OPu-Os1ettLZtVY1pPSKia8r8,34789 -pip/_internal/locations.py,sha256=ujNrLnA04Y_EmSriO0nS6qkkw_BkPfobB_hdwIDPvpM,6307 -pip/_internal/pep425tags.py,sha256=TQhxOPss4RjxgyVgxpSRe31HaTcWmn-LVjWBbkvkjzk,10845 -pip/_internal/pyproject.py,sha256=fpO52MCa3w5xSlXIBXw39BDTGzP8G4570EW34hVvIKQ,5481 -pip/_internal/resolve.py,sha256=tdepxCewsXXNFKSIYGSxiLvzi1xCv7UVFT9jRCDO90A,13578 -pip/_internal/wheel.py,sha256=fg9E936DaI1LyrBPHqtzHG_WEVyuUwipHISkD6N3jNw,32007 -pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 -pip/_internal/cli/autocompletion.py,sha256=ptvsMdGjq42pzoY4skABVF43u2xAtLJlXAulPi-A10Y,6083 -pip/_internal/cli/base_command.py,sha256=ke6af4iWzrZoc3HtiPKnCZJvD6GlX8dRwBwpFCg1axc,9963 -pip/_internal/cli/cmdoptions.py,sha256=WoPPY1uHsDjA_NvZek8Mko38rxraD3pX8eZUkNKvk10,19468 -pip/_internal/cli/main_parser.py,sha256=Ga_kT7if-Gg0rmmRqlGEHW6JWVm9zwzO7igJm6RE9EI,2763 -pip/_internal/cli/parser.py,sha256=VZKUKJPbU6I2cHPLDOikin-aCx7OvLcZ3fzYp3xytd8,9378 -pip/_internal/cli/status_codes.py,sha256=F6uDG6Gj7RNKQJUDnd87QKqI16Us-t-B0wPF_4QMpWc,156 -pip/_internal/commands/__init__.py,sha256=CQAzhVx9ViPtqLNUvAeqnKj5iWfFEcqMx5RlZWjJ30c,2251 -pip/_internal/commands/check.py,sha256=CyeYH2kfDKSGSURoBfWtx-sTcZZQP-bK170NmKYlmsg,1398 -pip/_internal/commands/completion.py,sha256=hqvCvoxsIHjysiD7olHKTqK2lzE1_lS6LWn69kN5qyI,2929 -pip/_internal/commands/configuration.py,sha256=265HWuUxPggCNcIeWHA3p-LDDiRVnexwFgwmHGgWOHY,7125 -pip/_internal/commands/download.py,sha256=D_iGMp3xX2iD7KZYZAjXlYT3rf3xjwxyYe05KE-DVzE,6514 -pip/_internal/commands/freeze.py,sha256=VvS3G0wrm_9BH3B7Ex5msLL_1UQTtCq5G8dDI63Iemo,3259 -pip/_internal/commands/hash.py,sha256=K1JycsD-rpjqrRcL_ijacY9UKmI82pQcLYq4kCM4Pv0,1681 -pip/_internal/commands/help.py,sha256=MwBhPJpW1Dt3GfJV3V8V6kgAy_pXT0jGrZJB1wCTW-E,1090 -pip/_internal/commands/install.py,sha256=tKyzfo5bhDGLVTTQCQJ9PFnDjimQvEWnwIAI2XHpaac,21039 -pip/_internal/commands/list.py,sha256=n740MsR0cG34EuvGWMzdVl0uIA3UIYx1_95FUsTktN0,10272 -pip/_internal/commands/search.py,sha256=sLZ9icKMEEGekHvzRRZMiTd1zCFIZeDptyyU1mQCYzk,4728 -pip/_internal/commands/show.py,sha256=9EVh86vY0NZdlhT-wsuV-zq_MAV6qqV4S1Akn3wkUuw,6289 -pip/_internal/commands/uninstall.py,sha256=h0gfPF5jylDESx_IHgF6bZME7QAEOHzQHdn65GP-jrE,2963 -pip/_internal/commands/wheel.py,sha256=ZuVf_DMpKCUzBVstolvQPAeajQRC51Oky5_hDHzhhFs,7020 -pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 -pip/_internal/models/candidate.py,sha256=zq2Vb5l5JflrVX7smHTJHQciZWHyoJZuYTLeQa1G16c,741 -pip/_internal/models/format_control.py,sha256=aDbH4D2XuyaGjtRjTLQhNzClAcLZdJCKSHO8xbZSmFA,2202 -pip/_internal/models/index.py,sha256=YI1WlhWfS9mVPY0bIboA5la2pjJ2J0qgPJIbvdEjZBk,996 -pip/_internal/models/link.py,sha256=E61PvS2Wrmb9-zT-eAc_8_xI3C-89wJlpL8SL-mlQmg,3998 -pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/operations/check.py,sha256=ahcOg5p68nNow6_wy5prYYK0KZq22lm0CsJn8AyDMCI,4937 -pip/_internal/operations/freeze.py,sha256=lskaBcqf3bPZupG032fuLf76QYv5wpAQ6jsiXac56Bg,10450 -pip/_internal/operations/prepare.py,sha256=atoLFj3OD5KfXsa5dYBMC_mI06l068F5yZhF4jle1JA,14280 -pip/_internal/req/__init__.py,sha256=JnNZWvKUQuqAwHh64LCD3zprzWIVQEXChTo2UGHzVqo,2093 -pip/_internal/req/constructors.py,sha256=97WQp9Svh-Jw3oLZL9_57gJ3zihm5LnWlSRjOwOorDU,9573 -pip/_internal/req/req_file.py,sha256=ORA0GKUjGd6vy7pmBwXR55FFj4h_OxYykFQ6gHuWvt0,11940 -pip/_internal/req/req_install.py,sha256=ry1RtNNCefDHAnf3EeGMpea-9pC6Yk1uHzP0Q5p2Un0,34046 -pip/_internal/req/req_set.py,sha256=nE6oagXJSiQREuuebX3oJO5OHSOVUIlvLLilodetBzc,7264 -pip/_internal/req/req_tracker.py,sha256=zH28YHV5TXAVh1ZOEZi6Z1Edkiu26dN2tXfR6VbQ3B4,2370 -pip/_internal/req/req_uninstall.py,sha256=ORSPah64KOVrKo-InMM3zgS5HQqbl5TLHFnE_Lxstq8,16737 -pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/utils/appdirs.py,sha256=SPfibHtvOKzD_sHrpEZ60HfLae3GharU4Tg7SB3c-XM,9120 -pip/_internal/utils/compat.py,sha256=LSAvzXcsGY2O2drKIPszR5Ja2G0kup__51l3bx1jR_Q,8015 -pip/_internal/utils/deprecation.py,sha256=yQTe6dyWlBfxSBrOv_MdRXF1RPLER_EWOp-pa2zLoZc,3021 -pip/_internal/utils/encoding.py,sha256=D8tmfStCah6xh9OLhH9mWLr77q4akhg580YHJMKpq3Y,1025 -pip/_internal/utils/filesystem.py,sha256=ZOIHbacJ-SJtuZru4GoA5DuSIYyeaE4G5kfZPf5cn1A,915 -pip/_internal/utils/glibc.py,sha256=prOrsBjmgkDE-hY4Pl120yF5MIlkkmGrFLs8XfIyT-w,3004 -pip/_internal/utils/hashes.py,sha256=rJk-gj6F-sHggXAG97dhynqUHFFgApyZLWgaG2xCHME,2900 -pip/_internal/utils/logging.py,sha256=BQeUDEER3zlK0O4yv6DBfz6TK3f9XoLXyDlnB0mZVf0,6295 -pip/_internal/utils/misc.py,sha256=YscDfBiFx1spYOtSgdI_5hnc5BZUysWAyz1aVL5y-48,29904 -pip/_internal/utils/models.py,sha256=DQYZSRhjvSdDTAaJLLCpDtxAn1S_-v_8nlNjv4T2jwY,1042 -pip/_internal/utils/outdated.py,sha256=BXtCMKR6gjTrvMfP3MWzZ1Y4ZU4qqoCfbRNqQCusVt8,5642 -pip/_internal/utils/packaging.py,sha256=Ru8ls_S8PPKR8RKEn7jMetENY_A9jPet1HlhTZwpFxU,2443 -pip/_internal/utils/setuptools_build.py,sha256=0blfscmNJW_iZ5DcswJeDB_PbtTEjfK9RL1R1WEDW2E,278 -pip/_internal/utils/temp_dir.py,sha256=n2FkVlwRX_hS61fYt3nSAh2e2V6CcZn_dfbPId1pAQE,2615 -pip/_internal/utils/typing.py,sha256=ztYtZAcqjCYDwP-WlF6EiAAskAsZBMMXtuqvfgZIlgQ,1139 -pip/_internal/utils/ui.py,sha256=FW8wdtc7DvNwJClGr_TvGZlqcoO482GYe0UY9nKmpso,13657 -pip/_internal/vcs/__init__.py,sha256=2Ct9ogOwzS6ZKKaEXKN2XDiBOiFHMcejnN1KM21mLrQ,16319 -pip/_internal/vcs/bazaar.py,sha256=rjskVmSSn68O7lC5JrGmDTWXneXFMMJJvj_bbdSM8QA,3669 -pip/_internal/vcs/git.py,sha256=n1cFBqTnLIcxAOClZMgOBqELjEjygDBPZ9z-Q7g0qVQ,12580 -pip/_internal/vcs/mercurial.py,sha256=jVTa0XQpFR6EiBcaqW4E4JjTce_t1tFnKRaIhaIPlS8,3471 -pip/_internal/vcs/subversion.py,sha256=vDLTfcjj0kgqcEsbPBfveC4CRxyhWiOjke-qN0Zr8CE,7676 -pip/_vendor/__init__.py,sha256=XnhkujjE1qUGRlYGYbIRrEGYYYBcNLBraE27HH48wYw,4756 -pip/_vendor/appdirs.py,sha256=BENKsvcA08IpccD9345-rMrg3aXWFA1q6BFEglnHg6I,24547 -pip/_vendor/distro.py,sha256=dOMrjIXv-3GmEbtP-NJc057Sv19P7ZAdke-v0TBeNio,42455 -pip/_vendor/ipaddress.py,sha256=2OgbkeAD2rLkcXqbcvof3J5R7lRwjNLoBySyTkBtKnc,79852 -pip/_vendor/pyparsing.py,sha256=My2ZwDJCEaZkZgZyG9gL--48RLGmf9vnVCTW93rhdYI,226342 -pip/_vendor/retrying.py,sha256=k3fflf5_Mm0XcIJYhB7Tj34bqCCPhUDkYbx1NvW2FPE,9972 -pip/_vendor/six.py,sha256=A08MPb-Gi9FfInI3IW7HimXFmEH2T2IPzHgDvdhZPRA,30888 -pip/_vendor/cachecontrol/__init__.py,sha256=6cRPchVqkAkeUtYTSW8qCetjSqJo-GxP-n4VMVDbvmc,302 -pip/_vendor/cachecontrol/_cmd.py,sha256=URGE0KrA87QekCG3SGPatlSPT571dZTDjNa-ZXX3pDc,1295 -pip/_vendor/cachecontrol/adapter.py,sha256=eBGAtVNRZgtl_Kj5JV54miqL9YND-D0JZPahwY8kFtY,4863 -pip/_vendor/cachecontrol/cache.py,sha256=1fc4wJP8HYt1ycnJXeEw5pCpeBL2Cqxx6g9Fb0AYDWQ,805 -pip/_vendor/cachecontrol/compat.py,sha256=kHNvMRdt6s_Xwqq_9qJmr9ou3wYMOMUMxPPcwNxT8Mc,695 -pip/_vendor/cachecontrol/controller.py,sha256=U7g-YwizQ2O5NRgK_MZreF1ntM4E49C3PuF3od-Vwz4,13698 -pip/_vendor/cachecontrol/filewrapper.py,sha256=vACKO8Llzu_ZWyjV1Fxn1MA4TGU60N5N3GSrAFdAY2Q,2533 -pip/_vendor/cachecontrol/heuristics.py,sha256=BFGHJ3yQcxvZizfo90LLZ04T_Z5XSCXvFotrp7Us0sc,4070 -pip/_vendor/cachecontrol/serialize.py,sha256=GebE34fgToyWwAsRPguh8hEPN6CqoG-5hRMXRsjVABQ,6954 -pip/_vendor/cachecontrol/wrapper.py,sha256=sfr9YHWx-5TwNz1H5rT6QOo8ggII6v3vbEDjQFwR6wc,671 -pip/_vendor/cachecontrol/caches/__init__.py,sha256=-gHNKYvaeD0kOk5M74eOrsSgIKUtC6i6GfbmugGweEo,86 -pip/_vendor/cachecontrol/caches/file_cache.py,sha256=8vrSzzGcdfEfICago1uSFbkumNJMGLbCdEkXsmUIExw,4177 -pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=HxelMpNCo-dYr2fiJDwM3hhhRmxUYtB5tXm1GpAAT4Y,856 -pip/_vendor/certifi/__init__.py,sha256=5lCYV1iWxoirX1OAaSHkBYUuZGdcwEjEBS6DS_trL0s,63 -pip/_vendor/certifi/__main__.py,sha256=NaCn6WtWME-zzVWQ2j4zFyl8cY4knDa9CwtHNIeFPhM,53 -pip/_vendor/certifi/cacert.pem,sha256=XA-4HVBsOrBD5lfg-b3PiUzAvwUd2qlIzwXypIMIRGM,263074 -pip/_vendor/certifi/core.py,sha256=xPQDdG_siy5A7BfqGWa7RJhcA61xXEqPiSrw9GNyhHE,836 -pip/_vendor/chardet/__init__.py,sha256=YsP5wQlsHJ2auF1RZJfypiSrCA7_bQiRm3ES_NI76-Y,1559 -pip/_vendor/chardet/big5freq.py,sha256=D_zK5GyzoVsRes0HkLJziltFQX0bKCLOrFe9_xDvO_8,31254 -pip/_vendor/chardet/big5prober.py,sha256=kBxHbdetBpPe7xrlb-e990iot64g_eGSLd32lB7_h3M,1757 -pip/_vendor/chardet/chardistribution.py,sha256=3woWS62KrGooKyqz4zQSnjFbJpa6V7g02daAibTwcl8,9411 -pip/_vendor/chardet/charsetgroupprober.py,sha256=6bDu8YIiRuScX4ca9Igb0U69TA2PGXXDej6Cc4_9kO4,3787 -pip/_vendor/chardet/charsetprober.py,sha256=KSmwJErjypyj0bRZmC5F5eM7c8YQgLYIjZXintZNstg,5110 -pip/_vendor/chardet/codingstatemachine.py,sha256=VYp_6cyyki5sHgXDSZnXW4q1oelHc3cu9AyQTX7uug8,3590 -pip/_vendor/chardet/compat.py,sha256=PKTzHkSbtbHDqS9PyujMbX74q1a8mMpeQTDVsQhZMRw,1134 -pip/_vendor/chardet/cp949prober.py,sha256=TZ434QX8zzBsnUvL_8wm4AQVTZ2ZkqEEQL_lNw9f9ow,1855 -pip/_vendor/chardet/enums.py,sha256=Aimwdb9as1dJKZaFNUH2OhWIVBVd6ZkJJ_WK5sNY8cU,1661 -pip/_vendor/chardet/escprober.py,sha256=kkyqVg1Yw3DIOAMJ2bdlyQgUFQhuHAW8dUGskToNWSc,3950 -pip/_vendor/chardet/escsm.py,sha256=RuXlgNvTIDarndvllNCk5WZBIpdCxQ0kcd9EAuxUh84,10510 -pip/_vendor/chardet/eucjpprober.py,sha256=iD8Jdp0ISRjgjiVN7f0e8xGeQJ5GM2oeZ1dA8nbSeUw,3749 -pip/_vendor/chardet/euckrfreq.py,sha256=-7GdmvgWez4-eO4SuXpa7tBiDi5vRXQ8WvdFAzVaSfo,13546 -pip/_vendor/chardet/euckrprober.py,sha256=MqFMTQXxW4HbzIpZ9lKDHB3GN8SP4yiHenTmf8g_PxY,1748 -pip/_vendor/chardet/euctwfreq.py,sha256=No1WyduFOgB5VITUA7PLyC5oJRNzRyMbBxaKI1l16MA,31621 -pip/_vendor/chardet/euctwprober.py,sha256=13p6EP4yRaxqnP4iHtxHOJ6R2zxHq1_m8hTRjzVZ95c,1747 -pip/_vendor/chardet/gb2312freq.py,sha256=JX8lsweKLmnCwmk8UHEQsLgkr_rP_kEbvivC4qPOrlc,20715 -pip/_vendor/chardet/gb2312prober.py,sha256=gGvIWi9WhDjE-xQXHvNIyrnLvEbMAYgyUSZ65HUfylw,1754 -pip/_vendor/chardet/hebrewprober.py,sha256=c3SZ-K7hvyzGY6JRAZxJgwJ_sUS9k0WYkvMY00YBYFo,13838 -pip/_vendor/chardet/jisfreq.py,sha256=vpmJv2Bu0J8gnMVRPHMFefTRvo_ha1mryLig8CBwgOg,25777 -pip/_vendor/chardet/jpcntx.py,sha256=PYlNqRUQT8LM3cT5FmHGP0iiscFlTWED92MALvBungo,19643 -pip/_vendor/chardet/langbulgarianmodel.py,sha256=1HqQS9Pbtnj1xQgxitJMvw8X6kKr5OockNCZWfEQrPE,12839 -pip/_vendor/chardet/langcyrillicmodel.py,sha256=LODajvsetH87yYDDQKA2CULXUH87tI223dhfjh9Zx9c,17948 -pip/_vendor/chardet/langgreekmodel.py,sha256=8YAW7bU8YwSJap0kIJSbPMw1BEqzGjWzqcqf0WgUKAA,12688 -pip/_vendor/chardet/langhebrewmodel.py,sha256=JSnqmE5E62tDLTPTvLpQsg5gOMO4PbdWRvV7Avkc0HA,11345 -pip/_vendor/chardet/langhungarianmodel.py,sha256=RhapYSG5l0ZaO-VV4Fan5sW0WRGQqhwBM61yx3yxyOA,12592 -pip/_vendor/chardet/langthaimodel.py,sha256=8l0173Gu_W6G8mxmQOTEF4ls2YdE7FxWf3QkSxEGXJQ,11290 -pip/_vendor/chardet/langturkishmodel.py,sha256=W22eRNJsqI6uWAfwXSKVWWnCerYqrI8dZQTm_M0lRFk,11102 -pip/_vendor/chardet/latin1prober.py,sha256=S2IoORhFk39FEFOlSFWtgVybRiP6h7BlLldHVclNkU8,5370 -pip/_vendor/chardet/mbcharsetprober.py,sha256=AR95eFH9vuqSfvLQZN-L5ijea25NOBCoXqw8s5O9xLQ,3413 -pip/_vendor/chardet/mbcsgroupprober.py,sha256=h6TRnnYq2OxG1WdD5JOyxcdVpn7dG0q-vB8nWr5mbh4,2012 -pip/_vendor/chardet/mbcssm.py,sha256=SY32wVIF3HzcjY3BaEspy9metbNSKxIIB0RKPn7tjpI,25481 -pip/_vendor/chardet/sbcharsetprober.py,sha256=LDSpCldDCFlYwUkGkwD2oFxLlPWIWXT09akH_2PiY74,5657 -pip/_vendor/chardet/sbcsgroupprober.py,sha256=1IprcCB_k1qfmnxGC6MBbxELlKqD3scW6S8YIwdeyXA,3546 -pip/_vendor/chardet/sjisprober.py,sha256=IIt-lZj0WJqK4rmUZzKZP4GJlE8KUEtFYVuY96ek5MQ,3774 -pip/_vendor/chardet/universaldetector.py,sha256=qL0174lSZE442eB21nnktT9_VcAye07laFWUeUrjttY,12485 -pip/_vendor/chardet/utf8prober.py,sha256=IdD8v3zWOsB8OLiyPi-y_fqwipRFxV9Nc1eKBLSuIEw,2766 -pip/_vendor/chardet/version.py,sha256=sp3B08mrDXB-pf3K9fqJ_zeDHOCLC8RrngQyDFap_7g,242 -pip/_vendor/chardet/cli/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 -pip/_vendor/chardet/cli/chardetect.py,sha256=DI8dlV3FBD0c0XA_y3sQ78z754DUv1J8n34RtDjOXNw,2774 -pip/_vendor/colorama/__init__.py,sha256=V3-Hv_vOa-2lE5Q_0mGkdhZo-9e4XrGTW_44cU81qQY,240 -pip/_vendor/colorama/ansi.py,sha256=Fi0un-QLqRm-v7o_nKiOqyC8PapBJK7DLV_q9LKtTO0,2524 -pip/_vendor/colorama/ansitowin32.py,sha256=QrieYX2tsaWIO19P6biMa1zUCt-_abudoEp2_IdqZZU,9668 -pip/_vendor/colorama/initialise.py,sha256=cHqVJtb82OG7HUCxvQ2joG7N_CoxbIKbI_fgryZkj20,1917 -pip/_vendor/colorama/win32.py,sha256=5Hc7L1LabubrYDhdWAfRyzlt14ErP3YKDvf_zYaarLk,5426 -pip/_vendor/colorama/winterm.py,sha256=V7U7ojwG1q4n6PKripjEvW_htYQi5ueXSM3LUUoqqDY,6290 -pip/_vendor/distlib/__init__.py,sha256=GxRrh1augb66Eo9NB9jrdwQS02KcBypj9o_-C3oyKZI,581 -pip/_vendor/distlib/compat.py,sha256=xdNZmqFN5HwF30HjRn5M415pcC2kgXRBXn767xS8v-M,41404 -pip/_vendor/distlib/database.py,sha256=LqTcNkDyV4bWcc_qDxiYJHnXaNxFs1O1bFSAg_reaI0,50868 -pip/_vendor/distlib/index.py,sha256=Dd1kIV06XIdynNpKxHMMRRIKsXuoUsG7QIzntfVtZCI,21073 -pip/_vendor/distlib/locators.py,sha256=e4UaQSzNg5iG3PfQRH6lnVMfLOwhm2sVmGGRdjdB3ik,51657 -pip/_vendor/distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811 -pip/_vendor/distlib/markers.py,sha256=6Ac3cCfFBERexiESWIOXmg-apIP8l2esafNSX3KMy-8,4387 -pip/_vendor/distlib/metadata.py,sha256=Ns92dqeMxopDPQsiEWnhMtd4RagJaA58lz8O_vjCxyk,39986 -pip/_vendor/distlib/resources.py,sha256=2FGv0ZHF14KXjLIlL0R991lyQQGcewOS4mJ-5n-JVnc,10766 -pip/_vendor/distlib/scripts.py,sha256=WEqXkpRvqR6oe-QlMRYg8gEJxXRWJeWn1GPc0ihZ4N0,16585 -pip/_vendor/distlib/t32.exe,sha256=ftub1bsSPUCOnBn-eCtcarKTk0N0CBEP53BumkIxWJE,92672 -pip/_vendor/distlib/t64.exe,sha256=iChOG627LWTHY8-jzSwlo9SYU5a-0JHwQu4AqDz8I68,102400 -pip/_vendor/distlib/util.py,sha256=FnzjaibVcIg1xOtET6QPNeqTnn3LcWLCjNOficMyGKA,59494 -pip/_vendor/distlib/version.py,sha256=_n7F6juvQGAcn769E_SHa7fOcf5ERlEVymJ_EjPRwGw,23391 -pip/_vendor/distlib/w32.exe,sha256=NPYPpt7PIjVqABEu1CzabbDyHHkJpuw-_qZq_48H0j0,89088 -pip/_vendor/distlib/w64.exe,sha256=Yb-qr1OQEzL8KRGTk-XHUZDwMSljfQeZnVoTk-K4e7E,99328 -pip/_vendor/distlib/wheel.py,sha256=W9aKwi4CQL_bQFYb8IcwH-c6WK-yku5P8SY3RGPv-Mk,39506 -pip/_vendor/distlib/_backport/__init__.py,sha256=bqS_dTOH6uW9iGgd0uzfpPjo6vZ4xpPZ7kyfZJ2vNaw,274 -pip/_vendor/distlib/_backport/misc.py,sha256=KWecINdbFNOxSOP1fGF680CJnaC6S4fBRgEtaYTw0ig,971 -pip/_vendor/distlib/_backport/shutil.py,sha256=VW1t3uYqUjWZH7jV-6QiimLhnldoV5uIpH4EuiT1jfw,25647 -pip/_vendor/distlib/_backport/sysconfig.cfg,sha256=swZKxq9RY5e9r3PXCrlvQPMsvOdiWZBTHLEbqS8LJLU,2617 -pip/_vendor/distlib/_backport/sysconfig.py,sha256=JdJ9ztRy4Hc-b5-VS74x3nUtdEIVr_OBvMsIb8O2sjc,26964 -pip/_vendor/distlib/_backport/tarfile.py,sha256=Ihp7rXRcjbIKw8COm9wSePV9ARGXbSF9gGXAMn2Q-KU,92628 -pip/_vendor/html5lib/__init__.py,sha256=Ztrn7UvF-wIFAgRBBa0ML-Gu5AffH3BPX_INJx4SaBI,1162 -pip/_vendor/html5lib/_ihatexml.py,sha256=3LBtJMlzgwM8vpQiU1TvGmEEmNH72sV0yD8yS53y07A,16705 -pip/_vendor/html5lib/_inputstream.py,sha256=bPUWcAfJScK4xkjQQaG_HsI2BvEVbFvI0AsodDYPQj0,32552 -pip/_vendor/html5lib/_tokenizer.py,sha256=YAaOEBD6qc5ISq9Xt9Nif1OFgcybTTfMdwqBkZhpAq4,76580 -pip/_vendor/html5lib/_utils.py,sha256=ismpASeqa2jqEPQjHUj8vReAf7yIoKnvLN5fuOw6nv0,4015 -pip/_vendor/html5lib/constants.py,sha256=4lmZWLtEPRLnl8NzftOoYTJdo6jpeMtP6dqQC0g_bWQ,83518 -pip/_vendor/html5lib/html5parser.py,sha256=g5g2ezkusHxhi7b23vK_-d6K6BfIJRbqIQmvQ9z4EgI,118963 -pip/_vendor/html5lib/serializer.py,sha256=yfcfBHse2wDs6ojxn-kieJjLT5s1ipilQJ0gL3-rJis,15758 -pip/_vendor/html5lib/_trie/__init__.py,sha256=8VR1bcgD2OpeS2XExpu5yBhP_Q1K-lwKbBKICBPf1kU,289 -pip/_vendor/html5lib/_trie/_base.py,sha256=uJHVhzif9S0MJXgy9F98iEev5evi_rgUk5BmEbUSp8c,930 -pip/_vendor/html5lib/_trie/datrie.py,sha256=EQpqSfkZRuTbE-DuhW7xMdVDxdZNZ0CfmnYfHA_3zxM,1178 -pip/_vendor/html5lib/_trie/py.py,sha256=wXmQLrZRf4MyWNyg0m3h81m9InhLR7GJ002mIIZh-8o,1775 -pip/_vendor/html5lib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/html5lib/filters/alphabeticalattributes.py,sha256=lViZc2JMCclXi_5gduvmdzrRxtO5Xo9ONnbHBVCsykU,919 -pip/_vendor/html5lib/filters/base.py,sha256=z-IU9ZAYjpsVsqmVt7kuWC63jR11hDMr6CVrvuao8W0,286 -pip/_vendor/html5lib/filters/inject_meta_charset.py,sha256=egDXUEHXmAG9504xz0K6ALDgYkvUrC2q15YUVeNlVQg,2945 -pip/_vendor/html5lib/filters/lint.py,sha256=jk6q56xY0ojiYfvpdP-OZSm9eTqcAdRqhCoPItemPYA,3643 -pip/_vendor/html5lib/filters/optionaltags.py,sha256=8lWT75J0aBOHmPgfmqTHSfPpPMp01T84NKu0CRedxcE,10588 -pip/_vendor/html5lib/filters/sanitizer.py,sha256=4ON02KNjuqda1lCw5_JCUZxb0BzWR5M7ON84dtJ7dm0,26248 -pip/_vendor/html5lib/filters/whitespace.py,sha256=8eWqZxd4UC4zlFGW6iyY6f-2uuT8pOCSALc3IZt7_t4,1214 -pip/_vendor/html5lib/treeadapters/__init__.py,sha256=A0rY5gXIe4bJOiSGRO_j_tFhngRBO8QZPzPtPw5dFzo,679 -pip/_vendor/html5lib/treeadapters/genshi.py,sha256=CH27pAsDKmu4ZGkAUrwty7u0KauGLCZRLPMzaO3M5vo,1715 -pip/_vendor/html5lib/treeadapters/sax.py,sha256=BKS8woQTnKiqeffHsxChUqL4q2ZR_wb5fc9MJ3zQC8s,1776 -pip/_vendor/html5lib/treebuilders/__init__.py,sha256=AysSJyvPfikCMMsTVvaxwkgDieELD5dfR8FJIAuq7hY,3592 -pip/_vendor/html5lib/treebuilders/base.py,sha256=wQGp5yy22TNG8tJ6aREe4UUeTR7A99dEz0BXVaedWb4,14579 -pip/_vendor/html5lib/treebuilders/dom.py,sha256=SY3MsijXyzdNPc8aK5IQsupBoM8J67y56DgNtGvsb9g,8835 -pip/_vendor/html5lib/treebuilders/etree.py,sha256=aqIBOGj_dFYqBURIcTegGNBhAIJOw5iFDHb4jrkYH-8,12764 -pip/_vendor/html5lib/treebuilders/etree_lxml.py,sha256=9V0dXxbJYYq-Skgb5-_OL2NkVYpjioEb4CHajo0e9yI,14122 -pip/_vendor/html5lib/treewalkers/__init__.py,sha256=yhXxHpjlSqfQyUag3v8-vWjMPriFBU8YRAPNpDgBTn8,5714 -pip/_vendor/html5lib/treewalkers/base.py,sha256=ouiOsuSzvI0KgzdWP8PlxIaSNs9falhbiinAEc_UIJY,7476 -pip/_vendor/html5lib/treewalkers/dom.py,sha256=EHyFR8D8lYNnyDU9lx_IKigVJRyecUGua0mOi7HBukc,1413 -pip/_vendor/html5lib/treewalkers/etree.py,sha256=sz1o6mmE93NQ53qJFDO7HKyDtuwgK-Ay3qSFZPC6u00,4550 -pip/_vendor/html5lib/treewalkers/etree_lxml.py,sha256=sY6wfRshWTllu6n48TPWpKsQRPp-0CQrT0hj_AdzHSU,6309 -pip/_vendor/html5lib/treewalkers/genshi.py,sha256=4D2PECZ5n3ZN3qu3jMl9yY7B81jnQApBQSVlfaIuYbA,2309 -pip/_vendor/idna/__init__.py,sha256=9Nt7xpyet3DmOrPUGooDdAwmHZZu1qUAy2EaJ93kGiQ,58 -pip/_vendor/idna/codec.py,sha256=lvYb7yu7PhAqFaAIAdWcwgaWI2UmgseUua-1c0AsG0A,3299 -pip/_vendor/idna/compat.py,sha256=R-h29D-6mrnJzbXxymrWUW7iZUvy-26TQwZ0ij57i4U,232 -pip/_vendor/idna/core.py,sha256=OwI5R_uuXU4PlOSoG8cjaMPA1hhdGGjjZ8I2MZhSPxo,11858 -pip/_vendor/idna/idnadata.py,sha256=zwxvoSsYqPHNa6xzXWHizXpDC28JJMGXRinhJ4Gkcz0,39285 -pip/_vendor/idna/intranges.py,sha256=TY1lpxZIQWEP6tNqjZkFA5hgoMWOj1OBmnUG8ihT87E,1749 -pip/_vendor/idna/package_data.py,sha256=Vt9rtr32BzO7O25rypo8nzAs3syTJhG1ojU3J-s2RFo,21 -pip/_vendor/idna/uts46data.py,sha256=czULzYN5Lr9K5MmOH-1g3CJY7QPjGeHjYmC3saJ_BHk,197803 -pip/_vendor/lockfile/__init__.py,sha256=Tqpz90DwKYfhPsfzVOJl84TL87pdFE5ePNHdXAxs4Tk,9371 -pip/_vendor/lockfile/linklockfile.py,sha256=C7OH3H4GdK68u4FQgp8fkP2kO4fyUTSyj3X6blgfobc,2652 -pip/_vendor/lockfile/mkdirlockfile.py,sha256=e3qgIL-etZMLsS-3ft19iW_8IQ360HNkGOqE3yBKsUw,3096 -pip/_vendor/lockfile/pidlockfile.py,sha256=ukH9uk6NFuxyVmG5QiWw4iKq3fT7MjqUguX95avYPIY,6090 -pip/_vendor/lockfile/sqlitelockfile.py,sha256=o2TMkMRY0iwn-iL1XMRRIFStMUkS4i3ajceeYNntKFg,5506 -pip/_vendor/lockfile/symlinklockfile.py,sha256=ABwXXmvTHvCl5viPblShL3PG-gGsLiT1roAMfDRwhi8,2616 -pip/_vendor/msgpack/__init__.py,sha256=y0bk2YbzK6J2e0J_dyreN6nD7yM2IezT6m_tU2h-Mdg,1677 -pip/_vendor/msgpack/_version.py,sha256=dN7wVIjbyuQIJ35B2o6gymQNDLPlj_7-uTfgCv7KErM,20 -pip/_vendor/msgpack/exceptions.py,sha256=lPkAi_u12NlFajDz4FELSHEdfU8hrR3zeTvKX8aQuz4,1056 -pip/_vendor/msgpack/fallback.py,sha256=h0ll8xnq12mI9PuQ9Qd_Ihtt08Sp8L0JqhG9KY8Vyjk,36411 -pip/_vendor/packaging/__about__.py,sha256=mH-sMIEu48PzdYakZ6Y6OBzL3TlSetzz1fQSkCXiy30,720 -pip/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 -pip/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 -pip/_vendor/packaging/_structures.py,sha256=DCpKtb7u94_oqgVsIJQTrTyZcb3Gz7sSGbk9vYDMME0,1418 -pip/_vendor/packaging/markers.py,sha256=ftZegBU5oEmulEKApDGEPgti2lYIchFQHAfH9tZy3_U,8221 -pip/_vendor/packaging/requirements.py,sha256=xIWdoZXVKhUHxqFP5xmnKylM7NHXQS48hUfIIX1PvY0,4439 -pip/_vendor/packaging/specifiers.py,sha256=pFp716eLYBRt0eLNsy6cnWD9dyMKq-Zag7bsLbLv4Fs,28026 -pip/_vendor/packaging/utils.py,sha256=c9obOpok2CpKDApkc2M5ma0YFnT-jtt4I6XI4F0jYiI,1580 -pip/_vendor/packaging/version.py,sha256=MKL8nbKLPLGPouIwFvwSVnYRzNpkMo5AIcsa6LGqDF8,12219 -pip/_vendor/pep517/__init__.py,sha256=GH4HshnLERtjAjkY0zHoz3f7-35UcIvr27iFWSOUazU,82 -pip/_vendor/pep517/_in_process.py,sha256=iWpagFk2GhNBbvl-Ca2RagfD0ALuits4WWSM6nQMTdg,5831 -pip/_vendor/pep517/check.py,sha256=Yp2NHW71DIOCgkFb7HKJOzKmsum_s_OokRP6HnR3bTg,5761 -pip/_vendor/pep517/colorlog.py,sha256=2AJuPI_DHM5T9IDgcTwf0E8suyHAFnfsesogr0AB7RQ,4048 -pip/_vendor/pep517/compat.py,sha256=4SFG4QN-cNj8ebSa0wV0HUtEEQWwmbok2a0uk1gYEOM,631 -pip/_vendor/pep517/envbuild.py,sha256=osRsJVd7hir1w_uFXiVeeWxfJ3iYhwxsKRgNBWpqtCI,5672 -pip/_vendor/pep517/wrappers.py,sha256=RhgWm-MLxpYPgc9cZ3-A3ToN99ZzgM8-ia4FDB58koM,5018 -pip/_vendor/pkg_resources/__init__.py,sha256=ykZI7-YBIAQ7ztWf0RskP8Oy1VQU88o-16PJbIMCtLg,103915 -pip/_vendor/pkg_resources/py31compat.py,sha256=CRk8fkiPRDLsbi5pZcKsHI__Pbmh_94L8mr9Qy9Ab2U,562 -pip/_vendor/progress/__init__.py,sha256=Hv3Y8Hr6RyM34NdZkrZQWMURjS2h5sONRHJSvZXWZgQ,3188 -pip/_vendor/progress/bar.py,sha256=hlkDAEv9pRRiWqR5XL6vIAgMG4u_dBGEW_8klQhBRq0,2942 -pip/_vendor/progress/counter.py,sha256=XtBuZY4yYmr50E2A_fAzjWhm0IkwaVwxNsNVYDE7nsw,1528 -pip/_vendor/progress/helpers.py,sha256=6FsBLh_xUlKiVua-zZIutCjxth-IO8FtyUj6I2tx9fg,2952 -pip/_vendor/progress/spinner.py,sha256=m7bASI2GUbLFG-PbAefdHtrrWWlJLFhhSBbw70gp2TY,1439 -pip/_vendor/pytoml/__init__.py,sha256=q12Xv23Tta44gtK4HGK68Gr4tKfciILidFPmPuoIqIo,92 -pip/_vendor/pytoml/core.py,sha256=9CrLLTs1PdWjEwRnYzt_i4dhHcZvGxs_GsMlYAX3iY4,509 -pip/_vendor/pytoml/parser.py,sha256=mcTzHB2GQGyK8KVwuQ0EraSz_78O36U60NqHBtgVmV0,11247 -pip/_vendor/pytoml/writer.py,sha256=-mSOVGaiGLrpj5BRR7czmquZXJGflcElHrwAd33J48A,3815 -pip/_vendor/requests/__init__.py,sha256=OrwNk1JwZGqIQ4JVGgMbfpstqey-oHS_Re_Dw6D4ciI,4209 -pip/_vendor/requests/__version__.py,sha256=rJ2xgNOLhjspGkNPfgXTBctqqvsf2uJMFTaE0rlVtbI,436 -pip/_vendor/requests/_internal_utils.py,sha256=Zx3PnEUccyfsB-ie11nZVAW8qClJy0gx1qNME7rgT18,1096 -pip/_vendor/requests/adapters.py,sha256=y5DISepvSsGlu3II_VUsdgKBej1dGY4b5beRrTE2tsI,21428 -pip/_vendor/requests/api.py,sha256=zub9ENcEUT2m9gwgBgqH5RIRDfrx2kwRpZ7L6hX3mcw,6261 -pip/_vendor/requests/auth.py,sha256=oRSQkBYcLkTEssudkzoR1UW1Glb1ts3p1RWusgHf1YU,10208 -pip/_vendor/requests/certs.py,sha256=nXRVq9DtGmv_1AYbwjTu9UrgAcdJv05ZvkNeaoLOZxY,465 -pip/_vendor/requests/compat.py,sha256=7EC6fZY4dJDxuBQnqUGwe13OTZ3VLGO3QfOApE5lE3I,1998 -pip/_vendor/requests/cookies.py,sha256=olUaLeNci_z1K-Bn5PeEKllSspmQqN9-s8Ug7CasaPE,18346 -pip/_vendor/requests/exceptions.py,sha256=-mLam3TAx80V09EaH3H-ZxR61eAVuLRZ8zgBBSLjK44,3197 -pip/_vendor/requests/help.py,sha256=T4K-Oo_FS9fxF8NHVR8hxMwFo71gIkRM7UddCc9vH7Y,3669 -pip/_vendor/requests/hooks.py,sha256=HXAHoC1FNTFRZX6-lNdvPM7Tst4kvGwYTN-AOKRxoRU,767 -pip/_vendor/requests/models.py,sha256=3fmmYdDW7U18SrVeZaseHuk8KPI-7vLp_435DY3ejes,34160 -pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695 -pip/_vendor/requests/sessions.py,sha256=71MK2HCadovka1vAx9dyDFWAuw69KgRPRBpd0HWSEAo,27829 -pip/_vendor/requests/status_codes.py,sha256=pgw-xlnxO5zHQWn3fKps2cxwQehKzPxEbdhIrMQe6Ec,4128 -pip/_vendor/requests/structures.py,sha256=zoP8qly2Jak5e89HwpqjN1z2diztI-_gaqts1raJJBc,2981 -pip/_vendor/requests/utils.py,sha256=3OxbbLUQFVdm84fdBD9nduXvhw6hIzj59mhvBomKuJI,30156 -pip/_vendor/urllib3/__init__.py,sha256=DZucS8tlzGYKmK5FIsyUViMghpCq_0_0Ouvm_Jp9GNc,2853 -pip/_vendor/urllib3/_collections.py,sha256=iNeAU_we9L3lMGRUKKdq24Mf7o050TXP5U4Jm9AzAY4,10841 -pip/_vendor/urllib3/connection.py,sha256=My76qeWMDkV-KP1l3iChXHOE7J-ZCaUdP3sPIiLA2uE,14485 -pip/_vendor/urllib3/connectionpool.py,sha256=w20OwKdIqk6f8FIl6QGgn6jf9gZ0-tmgH7VPxnpEgkQ,35464 -pip/_vendor/urllib3/exceptions.py,sha256=rFeIfBNKC8KJ61ux-MtJyJlEC9G9ggkmCeF751JwVR4,6604 -pip/_vendor/urllib3/fields.py,sha256=D_TE_SK15YatdbhWDMN0OE3X6UCJn1RTkANINCYOobE,5943 -pip/_vendor/urllib3/filepost.py,sha256=40CROlpRKVBpFUkD0R6wJf_PpvbcRQRFUu0OOQlFkKM,2436 -pip/_vendor/urllib3/poolmanager.py,sha256=FHBjb7odbP2LyQRzeitgpuh1AQAPyegzmrm2b3gSZlY,16821 -pip/_vendor/urllib3/request.py,sha256=fwjlq5nQfcUa7aoncR25z6-fJAX_oNTcPksKKGjBm38,5996 -pip/_vendor/urllib3/response.py,sha256=uAuOTZSuTodzvQWIDCZghDoKmZ2bKbgIRCfaVIIZfn8,24667 -pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/contrib/appengine.py,sha256=Q3BDy5C_TrI-3cSyo0ELNGlNiK2eSVptQAQMdz4PH9Q,11197 -pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=Q9-rO5Rh2-IqyEd4ZicpTDfMnOlf0IPPCkjhChBCjV4,4478 -pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=cM7fVZJRrdLZsprcdWe3meM_hvq8LR73UNDveIMa-20,15480 -pip/_vendor/urllib3/contrib/securetransport.py,sha256=BqXSlChN9_hjCWgyN6JdcgvBUdc37QCCX4u3_8zE_9o,30309 -pip/_vendor/urllib3/contrib/socks.py,sha256=Iom0snbHkCuZbZ7Sle2Kueha1W0jYAJ0SyCOtePLaio,6391 -pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=x2kLSh-ASZKsun0FxtraBuLVe3oHuth4YW6yZ5Vof-w,17560 -pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=Umy5u-3Z957GirdapnicXVOpHaM4xdOZABJuJxfaeJA,12162 -pip/_vendor/urllib3/packages/__init__.py,sha256=nlChrGzkjCkmhCX9HrF_qHPUgosfsPQkVIJxiiLhk9g,109 -pip/_vendor/urllib3/packages/ordered_dict.py,sha256=VQaPONfhVMsb8B63Xg7ZOydJqIE_jzeMhVN3Pec6ogw,8935 -pip/_vendor/urllib3/packages/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 -pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/packages/backports/makefile.py,sha256=r1IADol_pBBq2Y1ub4CPyuS2hXuShK47nfFngZRcRhI,1461 -pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py,sha256=WBVbxQBojNAxfZwNavkox3BgJiMA9BJmm-_fwd0jD_o,688 -pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py,sha256=XCW0ydHg171GfOqNbvUAnRzQ0lc0twp5-dIlolgf4RM,5719 -pip/_vendor/urllib3/util/__init__.py,sha256=6Ran4oAVIy40Cu_oEPWnNV9bwF5rXx6G1DUZ7oehjPY,1044 -pip/_vendor/urllib3/util/connection.py,sha256=8K1VXm8BHsM3QATJJGBNRa_MStkzDy1Da2IaPAaCU8c,4279 -pip/_vendor/urllib3/util/queue.py,sha256=myTX3JDHntglKQNBf3b6dasHH-uF-W59vzGSQiFdAfI,497 -pip/_vendor/urllib3/util/request.py,sha256=H5_lrHvtwl2U2BbT1UYN9HpruNc1gsNFlz2njQmhPrQ,3705 -pip/_vendor/urllib3/util/response.py,sha256=SSNL888W-MQ8t3HAi44kNGgF682p6H__ytEXzBYxV_M,2343 -pip/_vendor/urllib3/util/retry.py,sha256=tlxiEq8OU2BSenPpPjYYO1URne8A-qTEgaykam6rZPg,15104 -pip/_vendor/urllib3/util/ssl_.py,sha256=iHJopgSv8_vXfmGg3lOsTS3ldMD9zhe130huHZxQEGU,14022 -pip/_vendor/urllib3/util/timeout.py,sha256=7lHNrgL5YH2cI1j-yZnzV_J8jBlRVdmFhQaNyM1_2b8,9757 -pip/_vendor/urllib3/util/url.py,sha256=qCY_HHUXvo05wAsEERALgExtlgxLnAHSQ7ce1b-g3SM,6487 -pip/_vendor/urllib3/util/wait.py,sha256=_4vvsT1BTTpqxQYK-2kXVfGsUsVRiuc4R4F-0Bf5BPc,5468 -pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579 -pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979 -pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305 -pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563 -pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307 -pip-18.1.dist-info/LICENSE.txt,sha256=ORqHhOMZ2uVDFHfUzJvFBPxdcf2eieHIDxzThV9dfPo,1090 -pip-18.1.dist-info/METADATA,sha256=D7pqBJTuqM9w_HTW91a0XGjLT9vynlBAE4pPCt_W_UE,2588 -pip-18.1.dist-info/WHEEL,sha256=8T8fxefr_r-A79qbOJ9d_AaEgkpCGmEPHc-gpCq5BRg,110 -pip-18.1.dist-info/entry_points.txt,sha256=S_zfxY25QtQDVY1BiLAmOKSkkI5llzCKPLiYOSEupsY,98 -pip-18.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pip-18.1.dist-info/RECORD,, -../../../bin/pip,sha256=GJRRYxCMPyWhKt5YOlES-ErqfPnxSoQhfiQ-bkzU_bM,258 -../../../bin/pip3,sha256=GJRRYxCMPyWhKt5YOlES-ErqfPnxSoQhfiQ-bkzU_bM,258 -../../../bin/pip3.7,sha256=GJRRYxCMPyWhKt5YOlES-ErqfPnxSoQhfiQ-bkzU_bM,258 -pip-18.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pip/__pycache__/__main__.cpython-37.pyc,, -pip/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/__pycache__/six.cpython-37.pyc,, -pip/_vendor/__pycache__/retrying.cpython-37.pyc,, -pip/_vendor/__pycache__/pyparsing.cpython-37.pyc,, -pip/_vendor/__pycache__/ipaddress.cpython-37.pyc,, -pip/_vendor/__pycache__/distro.cpython-37.pyc,, -pip/_vendor/__pycache__/appdirs.cpython-37.pyc,, -pip/_vendor/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-37.pyc,, -pip/_vendor/webencodings/__pycache__/tests.cpython-37.pyc,, -pip/_vendor/webencodings/__pycache__/mklabels.cpython-37.pyc,, -pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc,, -pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc,, -pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc,, -pip/_vendor/urllib3/__pycache__/poolmanager.cpython-37.pyc,, -pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc,, -pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc,, -pip/_vendor/urllib3/__pycache__/exceptions.cpython-37.pyc,, -pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc,, -pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc,, -pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc,, -pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc,, -pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc,, -pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc,, -pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc,, -pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc,, -pip/_vendor/urllib3/util/__pycache__/response.cpython-37.pyc,, -pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc,, -pip/_vendor/urllib3/util/__pycache__/queue.cpython-37.pyc,, -pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc,, -pip/_vendor/urllib3/util/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc,, -pip/_vendor/urllib3/packages/__pycache__/ordered_dict.cpython-37.pyc,, -pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc,, -pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc,, -pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-37.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-37.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc,, -pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc,, -pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/requests/__pycache__/utils.cpython-37.pyc,, -pip/_vendor/requests/__pycache__/structures.cpython-37.pyc,, -pip/_vendor/requests/__pycache__/status_codes.cpython-37.pyc,, -pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc,, -pip/_vendor/requests/__pycache__/packages.cpython-37.pyc,, -pip/_vendor/requests/__pycache__/models.cpython-37.pyc,, -pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc,, -pip/_vendor/requests/__pycache__/help.cpython-37.pyc,, -pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc,, -pip/_vendor/requests/__pycache__/cookies.cpython-37.pyc,, -pip/_vendor/requests/__pycache__/compat.cpython-37.pyc,, -pip/_vendor/requests/__pycache__/certs.cpython-37.pyc,, -pip/_vendor/requests/__pycache__/auth.cpython-37.pyc,, -pip/_vendor/requests/__pycache__/api.cpython-37.pyc,, -pip/_vendor/requests/__pycache__/adapters.cpython-37.pyc,, -pip/_vendor/requests/__pycache__/_internal_utils.cpython-37.pyc,, -pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc,, -pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc,, -pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc,, -pip/_vendor/pytoml/__pycache__/core.cpython-37.pyc,, -pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc,, -pip/_vendor/progress/__pycache__/helpers.cpython-37.pyc,, -pip/_vendor/progress/__pycache__/counter.cpython-37.pyc,, -pip/_vendor/progress/__pycache__/bar.cpython-37.pyc,, -pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc,, -pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/pep517/__pycache__/wrappers.cpython-37.pyc,, -pip/_vendor/pep517/__pycache__/envbuild.cpython-37.pyc,, -pip/_vendor/pep517/__pycache__/compat.cpython-37.pyc,, -pip/_vendor/pep517/__pycache__/colorlog.cpython-37.pyc,, -pip/_vendor/pep517/__pycache__/check.cpython-37.pyc,, -pip/_vendor/pep517/__pycache__/_in_process.cpython-37.pyc,, -pip/_vendor/pep517/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/packaging/__pycache__/version.cpython-37.pyc,, -pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc,, -pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc,, -pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc,, -pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc,, -pip/_vendor/packaging/__pycache__/_structures.cpython-37.pyc,, -pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc,, -pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc,, -pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc,, -pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc,, -pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc,, -pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-37.pyc,, -pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-37.pyc,, -pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-37.pyc,, -pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-37.pyc,, -pip/_vendor/lockfile/__pycache__/linklockfile.cpython-37.pyc,, -pip/_vendor/lockfile/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc,, -pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc,, -pip/_vendor/idna/__pycache__/intranges.cpython-37.pyc,, -pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc,, -pip/_vendor/idna/__pycache__/core.cpython-37.pyc,, -pip/_vendor/idna/__pycache__/compat.cpython-37.pyc,, -pip/_vendor/idna/__pycache__/codec.cpython-37.pyc,, -pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc,, -pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc,, -pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc,, -pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc,, -pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-37.pyc,, -pip/_vendor/html5lib/__pycache__/_inputstream.cpython-37.pyc,, -pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-37.pyc,, -pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-37.pyc,, -pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-37.pyc,, -pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc,, -pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc,, -pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc,, -pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc,, -pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc,, -pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc,, -pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-37.pyc,, -pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc,, -pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc,, -pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc,, -pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-37.pyc,, -pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-37.pyc,, -pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc,, -pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc,, -pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc,, -pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-37.pyc,, -pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc,, -pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-37.pyc,, -pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc,, -pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc,, -pip/_vendor/distlib/__pycache__/version.cpython-37.pyc,, -pip/_vendor/distlib/__pycache__/util.cpython-37.pyc,, -pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc,, -pip/_vendor/distlib/__pycache__/resources.cpython-37.pyc,, -pip/_vendor/distlib/__pycache__/metadata.cpython-37.pyc,, -pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc,, -pip/_vendor/distlib/__pycache__/manifest.cpython-37.pyc,, -pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc,, -pip/_vendor/distlib/__pycache__/index.cpython-37.pyc,, -pip/_vendor/distlib/__pycache__/database.cpython-37.pyc,, -pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc,, -pip/_vendor/distlib/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc,, -pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc,, -pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc,, -pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc,, -pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc,, -pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc,, -pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc,, -pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc,, -pip/_vendor/colorama/__pycache__/ansi.cpython-37.pyc,, -pip/_vendor/colorama/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/version.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/utf8prober.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/jisfreq.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/hebrewprober.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/gb2312freq.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/euctwprober.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/euctwfreq.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/euckrprober.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/eucjpprober.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/enums.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/cp949prober.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/chardistribution.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc,, -pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-37.pyc,, -pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/certifi/__pycache__/core.cpython-37.pyc,, -pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc,, -pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc,, -pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc,, -pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-37.pyc,, -pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc,, -pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc,, -pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc,, -pip/_vendor/cachecontrol/__pycache__/cache.cpython-37.pyc,, -pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc,, -pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-37.pyc,, -pip/_vendor/cachecontrol/__pycache__/__init__.cpython-37.pyc,, -pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc,, -pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-37.pyc,, -pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-37.pyc,, -pip/_internal/__pycache__/wheel.cpython-37.pyc,, -pip/_internal/__pycache__/resolve.cpython-37.pyc,, -pip/_internal/__pycache__/pyproject.cpython-37.pyc,, -pip/_internal/__pycache__/pep425tags.cpython-37.pyc,, -pip/_internal/__pycache__/locations.cpython-37.pyc,, -pip/_internal/__pycache__/index.cpython-37.pyc,, -pip/_internal/__pycache__/exceptions.cpython-37.pyc,, -pip/_internal/__pycache__/download.cpython-37.pyc,, -pip/_internal/__pycache__/configuration.cpython-37.pyc,, -pip/_internal/__pycache__/cache.cpython-37.pyc,, -pip/_internal/__pycache__/build_env.cpython-37.pyc,, -pip/_internal/__pycache__/__init__.cpython-37.pyc,, -pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc,, -pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc,, -pip/_internal/vcs/__pycache__/git.cpython-37.pyc,, -pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc,, -pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc,, -pip/_internal/utils/__pycache__/ui.cpython-37.pyc,, -pip/_internal/utils/__pycache__/typing.cpython-37.pyc,, -pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc,, -pip/_internal/utils/__pycache__/setuptools_build.cpython-37.pyc,, -pip/_internal/utils/__pycache__/packaging.cpython-37.pyc,, -pip/_internal/utils/__pycache__/outdated.cpython-37.pyc,, -pip/_internal/utils/__pycache__/models.cpython-37.pyc,, -pip/_internal/utils/__pycache__/misc.cpython-37.pyc,, -pip/_internal/utils/__pycache__/logging.cpython-37.pyc,, -pip/_internal/utils/__pycache__/hashes.cpython-37.pyc,, -pip/_internal/utils/__pycache__/glibc.cpython-37.pyc,, -pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc,, -pip/_internal/utils/__pycache__/encoding.cpython-37.pyc,, -pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc,, -pip/_internal/utils/__pycache__/compat.cpython-37.pyc,, -pip/_internal/utils/__pycache__/appdirs.cpython-37.pyc,, -pip/_internal/utils/__pycache__/__init__.cpython-37.pyc,, -pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc,, -pip/_internal/req/__pycache__/req_tracker.cpython-37.pyc,, -pip/_internal/req/__pycache__/req_set.cpython-37.pyc,, -pip/_internal/req/__pycache__/req_install.cpython-37.pyc,, -pip/_internal/req/__pycache__/req_file.cpython-37.pyc,, -pip/_internal/req/__pycache__/constructors.cpython-37.pyc,, -pip/_internal/req/__pycache__/__init__.cpython-37.pyc,, -pip/_internal/operations/__pycache__/prepare.cpython-37.pyc,, -pip/_internal/operations/__pycache__/freeze.cpython-37.pyc,, -pip/_internal/operations/__pycache__/check.cpython-37.pyc,, -pip/_internal/operations/__pycache__/__init__.cpython-37.pyc,, -pip/_internal/models/__pycache__/link.cpython-37.pyc,, -pip/_internal/models/__pycache__/index.cpython-37.pyc,, -pip/_internal/models/__pycache__/format_control.cpython-37.pyc,, -pip/_internal/models/__pycache__/candidate.cpython-37.pyc,, -pip/_internal/models/__pycache__/__init__.cpython-37.pyc,, -pip/_internal/commands/__pycache__/wheel.cpython-37.pyc,, -pip/_internal/commands/__pycache__/uninstall.cpython-37.pyc,, -pip/_internal/commands/__pycache__/show.cpython-37.pyc,, -pip/_internal/commands/__pycache__/search.cpython-37.pyc,, -pip/_internal/commands/__pycache__/list.cpython-37.pyc,, -pip/_internal/commands/__pycache__/install.cpython-37.pyc,, -pip/_internal/commands/__pycache__/help.cpython-37.pyc,, -pip/_internal/commands/__pycache__/hash.cpython-37.pyc,, -pip/_internal/commands/__pycache__/freeze.cpython-37.pyc,, -pip/_internal/commands/__pycache__/download.cpython-37.pyc,, -pip/_internal/commands/__pycache__/configuration.cpython-37.pyc,, -pip/_internal/commands/__pycache__/completion.cpython-37.pyc,, -pip/_internal/commands/__pycache__/check.cpython-37.pyc,, -pip/_internal/commands/__pycache__/__init__.cpython-37.pyc,, -pip/_internal/cli/__pycache__/status_codes.cpython-37.pyc,, -pip/_internal/cli/__pycache__/parser.cpython-37.pyc,, -pip/_internal/cli/__pycache__/main_parser.cpython-37.pyc,, -pip/_internal/cli/__pycache__/cmdoptions.cpython-37.pyc,, -pip/_internal/cli/__pycache__/base_command.cpython-37.pyc,, -pip/_internal/cli/__pycache__/autocompletion.cpython-37.pyc,, -pip/_internal/cli/__pycache__/__init__.cpython-37.pyc,, diff --git a/env/lib/python3.7/site-packages/pip-18.1.dist-info/WHEEL b/env/lib/python3.7/site-packages/pip-18.1.dist-info/WHEEL deleted file mode 100644 index 1001235..0000000 --- a/env/lib/python3.7/site-packages/pip-18.1.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.32.1) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/env/lib/python3.7/site-packages/pip-18.1.dist-info/entry_points.txt b/env/lib/python3.7/site-packages/pip-18.1.dist-info/entry_points.txt deleted file mode 100644 index f5809cb..0000000 --- a/env/lib/python3.7/site-packages/pip-18.1.dist-info/entry_points.txt +++ /dev/null @@ -1,5 +0,0 @@ -[console_scripts] -pip = pip._internal:main -pip3 = pip._internal:main -pip3.7 = pip._internal:main - diff --git a/env/lib/python3.7/site-packages/pip-18.1.dist-info/top_level.txt b/env/lib/python3.7/site-packages/pip-18.1.dist-info/top_level.txt deleted file mode 100644 index a1b589e..0000000 --- a/env/lib/python3.7/site-packages/pip-18.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/env/lib/python3.7/site-packages/pip/__init__.py b/env/lib/python3.7/site-packages/pip/__init__.py index ae265fa..5d05da3 100644 --- a/env/lib/python3.7/site-packages/pip/__init__.py +++ b/env/lib/python3.7/site-packages/pip/__init__.py @@ -1 +1 @@ -__version__ = "18.1" +__version__ = "19.1.1" diff --git a/env/lib/python3.7/site-packages/pip/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/__pycache__/__init__.cpython-37.pyc index e5e27cd269d793cd13cd329a12a648ee5fe8f9f9..387875bba8e5112289cde2a9cdb6befefc3e37b3 100644 GIT binary patch delta 48 zcmbQiIE#_jiIy#Ulky2QhS7DfzF|kmI^)pBb0Q&w5 AFaQ7m delta 46 ycmbQmID?VbiI;F+PDk(IX9M5PD0D>S0jQ{`u diff --git a/env/lib/python3.7/site-packages/pip/_internal/__init__.py b/env/lib/python3.7/site-packages/pip/_internal/__init__.py index 276124d..9c1637c 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/__init__.py +++ b/env/lib/python3.7/site-packages/pip/_internal/__init__.py @@ -13,7 +13,7 @@ import sys # 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 +# to add socks as yet another dependency for pip, nor do I want to allow-stderr # in the DEP-8 tests, so just suppress the warning. pdb tells me this has to # be done before the import of pip.vcs. from pip._vendor.urllib3.exceptions import DependencyWarning diff --git a/env/lib/python3.7/site-packages/pip/_internal/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/__pycache__/__init__.cpython-37.pyc index 858e1d02e28f8a3b054502e9438ed00de05fe860..01c8bb79e5e6ba0530a5992e25aa5dddddad9313 100644 GIT binary patch delta 49 zcmZqUYvbc};^pOH0D`>560v3*dCOQhQVJ{cDh$&yHg~faF*4qoypL6l@z&<2tcr{P DGu;j` delta 49 zcmZqUYvbc};^pOH0D`FbYB8o8dCOQhlFQTcvPud~Hg~faF)~I?-p8uO7`6E+t0E%+ DDKiZu diff --git a/env/lib/python3.7/site-packages/pip/_internal/__pycache__/build_env.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/__pycache__/build_env.cpython-37.pyc index dc30dee3d8c0ae5eee685f9a966fa5c49cc97db9..8cb8c4b6dd438bf3097dad5ead2a810d0a93b838 100644 GIT binary patch literal 7395 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 literal 5007 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 diff --git a/env/lib/python3.7/site-packages/pip/_internal/__pycache__/cache.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/__pycache__/cache.cpython-37.pyc index 4a0310196d7f8b5dd088898fed627721ccd47bd5..5231c3e4ce64b60838be0dc8565b535a6c25eddc 100644 GIT binary patch delta 2194 zcma)7OKclO81_D5uV3-|v5C`^7Ft{ylZvE5YN0e~9&HmB(WWJa##+2n$FN>Ivm4q3 z2_rQUNT`QsPMlf<*9f6p5JEy+ID*81!$^f|1wyJgbKw7H>zG6d5Np5e{PWK@|Kpq4 zkH&vF-9HhHhJ5g6f0n=bXlS!PFa5cByxEa_rep@KL^D}QHdB?9XjsSLxo-;BXHMuuU0 z7{+lk0pkQY4CAL@oHSD~PLVJ=95LmqzG8awHkj)a2#rYYXM_#qta* zOT!~Ym1|epZlh%z7FVtkm#cFP$K}d-d#xz(=yZ!V4R^9-yR>Dom2`Idu2h$$82epW z3a24)nnB32YwEaWuB_R2PTg8&n`$AJ0{heOI1vD!y#0;3B1t+c`A6afFi-(Q@WwOj zzCRN#!K>2`;M3U0{)f*9av6qV2cD`Ew`y2c>ozf~w?tG9Yf5{!!{eH;Sy&SJe?x|K84-TzB=Kp#O1pe(lM|Z@HiNNPhHQk$Jso4kki;=aARx& zY(<6kR-XaG9ty6&)^)IZ6n!iay3#>fIu5|qw&5<*<2Y6k6o6u1kCF#>qNeB2;R3?$ zD0!-CHSBk=8oeBC@N@hCJ~<@y%j^22QClV@;mLjtjh2w3D0w^W;S1C(V%V$gRpbzv z%j~7_xjMFzo!J1Lzi9=mJI8r4~sDesp^u9tTSbl6xE} zD6=ANthrZ0QF7$y@}0z~QH0&q5NU3J-D8WhYw_;}MgBo_)&O|WS#7sl)Fmc8#zqsl z92SHt&4yj{_j*asu%*P&Lwo44fSgazRj)T} zrB27$C4EBT?4CXhxTRl^2H1~!Ca~6S*mW9Uf9QG#Go^UAx!?8d_-UtM1l*8DaW2(v zv`f{7?Gg&#%u>TP$sLN{Egpo9%)y3)3T1OY?oKH8x88c2)Le1>dH0z(gF>7=O%%l4 qf@yN?Y_nyqTI6L^hI0%+l{HEHWYk;t7nfBj4+;z^aU=dhJoz_%9iV3b delta 1989 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 delta 2725 zcmZ`*TWB2D8J;scJ9}U4YPFKql2(#+u_w0V#C00#sE*>sHID6EZ0sbHz%bf#v>IzJ z>wjhxE65eaq6A7p)f3V{9&ERSKC~}JeQEtrNT83U(3ZkL3!#O+6#CLo@I&eO&&smA zIJ@k(XU_TWw=@4Z|Jw_t)1^{g5g+sR>^t|jOAYd$?L*H_5rq<(cC%j2%z1e;FQ0X{ z;1$iHS29ap+1%c&Z+bPeCXcf2fLAx`L}7LKm0-=egWixi2a<6|Nu4;GF^UgucH>C8EP7}>5n z*Lt_@UyH7v;Cbyt?TDZWvlu+BLh__YV4T0MEmlUw4xoT8H2GbvKK-nC4pjk)3R40T zEe;tZdfN?_Y&X$RHBYn&?dq9VuI~I#8`e(ji7?beoqsyXtl8k$ezae3}8-dCRxjJd?&K3B)#hR zG=#&*V<0?*pz&({xQ-Ekqx@X{s{TAK7x-uSsXnPl>OiM2@xSE%NS^1vC^Qe8Mxw{< zNHjOFX@~#4@Gr8!|4{ta?30KpZ5GKSSy5my>O?pAvC^L#PauVhLdO;#E8lzJf>#FmV5wN3Jpym!@nfZX2X) z{o^*u0DZ~duK)Vvx25X1Lv7*vqIfV;-2%~pMWPm-*gjZX|J-?HaGH=w9uD2!{HE9d z*${29N-~tK`LXK)S^_=-R%W+=@)j1oENFNEsdc;4VLmnVuHxeUu_V89EI$CxcAfVawM6xYy9&D=?ghD}skKzjbfcFH5F2r6HW7C1a7d;E%*JS#;g8KN*r=uphFd>$L zY8?M|TUJ&v`kLe)1qWmcFNs}v6`{vE)PIt{*!;@u=6ctNZiYvYp@DEpfT8W{9TX@o zo|PbWskOwcb%(i>(O&Ueg6u5+(fB#?K2OG@Liv^gTT$v-UsU0jCw}^NwHw#>QCdm_ zp&K4qdpM!RNOi&pa$*T`EU)0|dkAuh>$u7wWD(>%$9DiMdwzcMsYZ{tAkHomaZ?QP z4=0CIo$${lKR!9%<-qcNG-4i()=Wp{KkW4khtG8$A6!3;{SGn8*bUHL^(9p-b*n4E zisFvTdd1*S+T>49Ep6fr17{J=BgmS44Ob>Y3&BIc8Ixo?5QrNtS_kZ2z>Wc|XuxU% zEE8E-fbj?Px;rdUTT-&DmTQM$i@C04Jv3-Q*iYakB$XH5oLIfYXQt;aHnU}UlNttm zgvZ}UAsL)+;%!9cFDZyOi+M|2{8ZddDxTN(?aYf8nRy(|A*A>R(@kC8Uuk}CdaT}) zL7C}1|J!tPvw*saDC>Zf<@jQz`L;VBM~)lLN9!F_UqS+X_o0j|eFznVDndU(4MBLQ zz)b;3O4Jn8afO%U1v#l<8;|9{!JdMP_-Z4|G0}siYpfN?AUq70IFq%7u}ZQF;`WSP bb_&f6v79tDOTBkjcWXNGtK`4337A! diff --git a/env/lib/python3.7/site-packages/pip/_internal/__pycache__/download.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/__pycache__/download.cpython-37.pyc index d3d2f9d410e0368cb0b3a652626b847102c1a0a0..05192152b7c954196b81ae96e02294ce408d3c21 100644 GIT binary patch delta 7731 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 V6Cwb9!Cm;;s=}oj)iu5M{{e&Ke{BE& delta 7693 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 YVYK7oaaC}gv9e)_hQC0AUB-_81H!F|c>n+a diff --git a/env/lib/python3.7/site-packages/pip/_internal/__pycache__/exceptions.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/__pycache__/exceptions.cpython-37.pyc index 05bac644a412743d56582447807ec82a314b5f0d..d07bfa5bf51c76a126c42c2deddc0db342e29a0e 100644 GIT binary patch delta 3317 zcmbVOOKe+36!kp+o*jSkb?hXzlQ?PO{G7DVHpNZTRv}GG-O@Hy6F!eu&m^(xU+29@ zDJ-&}EDNfp2qCo~R92`9L|7rV2qYvB2#|OSkXW!oLPeEmB?R}5+t`X+WYyLi&AD^$ znLGF1`TV`~$qRuae!tfSzvAuiOScl&17ULK`p}+DN~kmMDR`H?#Kye*0$^9Zso-1o z5gYW~d4D0W93ZxN8&#?2s*QSB@OArgGhi=m0^G!!0k;75Q9oe6#I1k>Gzd5-aU0-f z+5)(RwSs;-;8xmpb<;-Mq@V)??X&|FI;24eaENvS?v%I_aF|8_M7{yXX+$A&KLF zhiMXUQsQ2~BXkt-sKkAM$LKiVaf$l@PtX+Ll;lqUo}^QNr&tT{576CbZAr36d`z z;B~&-u;=Yy9T&g5)8acPYuKs-tPIYnVX&U8VF*ixAJy{>Gep4psTzieWVqqk-7rHJSnsc4=#mU6Z?a(q%z3(o zp<7({{v4@RCKjcoYFe(CGd1m~(1Q_ivuSTCigK4;F0&#{Dm;eJ$v7|ZnzEJ^-3vp{ z3gY`dx|21X*9#Y^K63&z{t|!sXeUKs**u~f=y+9Cuj@nXGg9G8w^vj-a_<9o5GIw*TGhCMJa3!i}}h)Nua zYKOl^weudxS7hsc@T?<(IjFIghQlDs3)X&ia2!Vw)?c6WVgu6Dv30jyA$7^7!TL4f z4~^7a&;guadzQ+o(4xkr>Vo#cz!H3w1qB@h{)*~@1?__pj%?it^^*B|Ve8+XrCyw{ zlHWjD7c{EkP#lD(CE-}O^+^a10?(T}2oK7TzZbcw#AL`1!+6aiW!y2lx5b5?o8*AF z*K_Rj5!As5S^g5wt>)m)(ek_g!VqR&pDaAW08KVBns3YuCliQB-krTnd*C zPhhVX8+6_Btg#K6TV-&9qyQ(KmGqrLg-L8OQVUKdmNgkQ5wGLxl+^%jQ4>o>8M2I0xIF2uSf~U3%n-m zXzvoeBVR6|lI2<{@q%tjWh-#lFc`v=W<3$q#cyl@bo(ysX64?QBj85{Wz)%945 delta 3142 zcmbVOO>7%Q6!xyy_WEz_Bu-){v6I$`6Q@bsq%<@%4J}pL5}<^pMI=J>zy-gxk2B}L-g`}pOINOq9@shQA|B$s;v!z^zwBNM0QM0T zuu21fgMj@c05~9U2yl>u0EYw)0}c}nutq~*uK|vbDB!5T5x^a!6L6=nj{@!@F~Bi_ zcRE1PO?p7lBNUy0dr2H{T;MLi3DO6+PY}ic_mcs@0|IvgPLdShl)ycJ2gwlNA%S}V z?;(2u@1?zvU>tCo3(K40gnqj0C*pn06ZZA zBmqy7DZo=S2mw+gx8lm~=Xa$%zvrIhH|6Ew5Y(Nacrcf4mTeS^lliwd z%!~G$Pw|+0Plpd|{P0*Z2vuS}E_wI!x7>&4R8TOSV%S9%L{X!yj>4$ZK;Ym%22C*Z zDM#97h=6xT14BeG+)|FU%@76e?goaaV7TacW3t^kHuGk`gtIDD^cH-xDOpw*9&IB*7YO& zt4M-B49@2IQ13M=6>5^K%=!^}C}U;Tu%*Rr#%>Mpv6`kdoS?3oW%C`%%DVm{KNDFRnSQ)66zoE|T-5cKpMfSxmElVxQ4uba9g8mIpH!ZY!pnRs22<7CC9fx zZNs)1Lzb+&y7kc7@l}lcC1Zm&Q)3T5;rEhL=l;JwVuPV^13|q3hhgFxJQlu+a7RG{ zRMp20W3_mwcaVRY`tAuja2)79N8W}G9LIw3)#&uDG8A{GMbS=z4LgOR-p5+yzUR-T z^E0@4oT$EOSetsjT&ftXV3p0sY+qdH-Q6G33v%-{6A}dWCN=dk`?{|h5nn>O8Z_;g2*r0HO>_byewS6z3 z!32sW5RM;iCYrY?u|yD9z)LtMVm%L|AK|g^o#P6s9z}{ts-#H)$t&^OqoXa4TKy2z zn~Y2iwXAmxSl8ayZC$K->#yO<6SSal3@#DM>}R& zl-Y%{xrnbA$5*13g=YgvAH9CoLXVU>>=e796r#|0$$I(CeMfiB!07a8XltwEBkGB^ zPFUCTMZ>c4v@7xt0&C{@xjvEW z_b+beX$9BA@N-do@iF{pV^RLg#PnIb9vNO{3@;#thn3;UV%SWET@YdFS=H<4sPm;V W*(%Zn3CyhhAQUMi$7FtWa{OO`b{nSv diff --git a/env/lib/python3.7/site-packages/pip/_internal/__pycache__/index.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/__pycache__/index.cpython-37.pyc index d90a0f0bac5216396849d855e48166826cfbc30b..ff3801951041942089f019d93438d31f16c33037 100644 GIT binary patch literal 28728 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 atK)yd(0>=R`?C|-o!NYL|M;PN=6?gVPhGbF delta 10570 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 Ax&QzG diff --git a/env/lib/python3.7/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc index 40252b9dda36f42d3a6e90093768064b41cbe45f..499302a1fbca17bf96bc86e7ad76a9a1bbf34a94 100644 GIT binary patch delta 1797 zcmZuxOK;p%6!!J_J&(*InM^Wi^G-TVlj$QQeWZatD5Z}n0!3}CR>NejlX&9sxYtf; zB&$KB2-E^|U*jUTea0Ak ze9TaS67B(Rzaa)wZ7w(fQ27lWye}A9Fx}?#{aXn`3TA*S1Ns1$vj`H=79@Lsq-Pp(DDj^V*bH}qVGhxH?P z1drZj1w6(Ic$R|;A7|kld|sa@q7$9?Qo#Zf1||%A1upN@5s0Wp9Pzl5Mu^P&jMWy->Jhx?ZSUaXiq~tZxs* zo}$5i=)-46%U;tdJEk*j+OAi#tZ966%f5YRb)C+N$1ZXkiQoUsoZ?k3@_N{3+b)%-2G$f#IB=Cg6)?r5v4^)JG2DW>e zej}ZdumHCd>2Fdsey&ndNg9qwhF+H^q%31c>BsVc_^t@(cXD6P2?h{-NzS7b%Cav_ z(O=}J%gnMQbYK_&LkYX;Eqm2mtFF{s!>%=r5+Cw22T6t*?7{}|nYLg-2J5Y+vv?n5 zm&Gh0GDoM?enjYb_1aP#s~f8Ot|xwgd_->hBDw8}SPLW{`C^;jK}_$w@5dXmAFs+_ z^BIl+1xuDzYX(;UXfHT15v5K>-H+wmsYm2^&a|@gw zWAXp((Hr>{*ctsu>q9DSYxhuvPQ}ZktfHapST)ZwS3=pe>((aJe1fSZXUkh}+4N3) z0?pGe<5$oy{XIU3M(CbI5if#CRQ!LHf(%8Fw+!O4rqx`>GCfR8P>jP#DHW<1@?T|D zA{QCRB}OhYFU53Q5Q>4xFw@P`$BENRFPAS&Gw)5$wA`v&UpJZt1ylC|5Kc<)0xuw- zNI@E}z=BQ}3efEWl7O-WCn&GdL&?G9b?_;P=PDIw%vb4+WN|NR&QNZ-GfvH04;7Y| z)fQ<+`5;5|QE~-^^pE7kVn2-8Ox3hKgTN5ZMDfgcTMkSOQ5cBS5mXQeYh)5bW(mwNkUHoqk_6EyLB* zuIU-{ldkd_yV9$>9?y9i?wT&{P2lF-22S XN|%JPF&^bnnk83C2%1O-(y#pmMBuXe delta 1551 zcmah|O>7%Q6rNe{pV#a4PZIycPU5DCjgycc2mz!JK@|c*A{;8wbOo{!&m^(q*zW8m zCDKAr6C_j#Db*lO6|Ct2i31l9T)Bea%3+1LAR(1wr5@mbc(XBTdSXZW?fc%m_jcaT z+#CP3WL=5J4Fr$=1(NDXcCo#5lO(A z{E0mS_E-Di)n?VM^h2k}&DBFDlBz` zjD)(;a~&D8r%8!iIz`aF1<}4$1Q|c|==b4)p6+wYUlcZ>?in&kE|ZBRU}o* z{732R>yIP%F&^aaDH*+fbEn;OZ!Ge=%JZpFm>5SDb0b^W#4N-AP<}}c0%wn4i2tOH z3{`|_IAV%{Wju&wiH-1o)I46{IqfB>D)X9FGuEq7CahSD|DcssQ-~w{p*9n{7;r|< z4=jp+Isj5L*urVdCb_NOzb@>maz6;jOvDHh^-g=cu~XaHbZC2XpH`(nnw@7cVQ?Wb z(7%o4R>N`Yo&E00`@kIuK*emH-;ECAZT?+!;~2A+r?8f*kf^VE*i(Aa3BH9r+;zQJ zQ}bdq&BN>#F+kEirF$E+dMHcXPe6`>9Q7jI&p{S8@cOYH+=F*UU2_$^oq5-E<6ex! zJTr?;nG@vShpK3>IBI{+CJp3C+9ZBi7rfQ znD`Lr0)2VELk?PW1p{*q0YsJ}zyB8GCYd-HF`_b-BYISi>!ym+5edWP5j9aw*^v3~ H$rt|xcHV4_ diff --git a/env/lib/python3.7/site-packages/pip/_internal/__pycache__/pep425tags.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/__pycache__/pep425tags.cpython-37.pyc index a31a925b094deb7fc539e66064a692cbcd8edf20..c15177d29be2415243cf084af978b4f09cd8eb50 100644 GIT binary patch delta 3977 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 Ys>b1qsS!Px# diff --git a/env/lib/python3.7/site-packages/pip/_internal/__pycache__/pyproject.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/__pycache__/pyproject.cpython-37.pyc index 1c3149e65ec5669d23deefa34e54a2903693f456..2fc5f6e37c667c9830e6931e0fadc54f08a5d09c 100644 GIT binary patch delta 1300 zcmYjRJ!~9B6yDk0+nxQnpImHXTS!4h0S+nWBuZgWgaQ^Kh+qN%OFjvW);Dv$_3d9~ z=R_{r)1f#84U(;GEnz1e1r4I10Er$Uq!egs8Y&tZsCctBHhY@)-pqXOy?KB4=iCpA zjkoG`SA#Eky7=j>rGv&IdVKKm%1n>Uo=G)oM77xJS+U)-kp_D+!m-nHD!CT9vDfpE z#ymcRJ1g?zdaoWgdX2c*YsRf!3vf2YkG0+f>QEPWn|jm-ev#_;v`+mG<+_7pGuY14 zXe<~B<1FRkVE^(BIBvhcb$5%b-+p`jJ@U~f8yoL#ywfqI@n$lSwU5VH#3cS86JeSJ zku>jwxj6Xl=u#6*{faHR!!`uX-87|`U!23w;;L~BLn{``6QR~J4_71h=D9vT-}7pPDhu1&crw)*@V!L z^XI_ENyHHLZLJDXUW|hg1H|b|i1NM&z#Ie7^oG$!4V_;CxnE@iggPt-Ru%tdxvFo@ zcu~taB)}LsJSwz25}4NZ&?7{xsg~Rbr0*@^I

!Xs6#+OS_(|3WcKE>6slmD)uv_5rc16dFyd8%x^M6<*=)p?#FUa)!BZjybZa4K?$2w5eZs$|+d8L%peY;u=of z!Ygcl0I%w_zx~|!OE1UP&&?ZGyKCL6vi8}KvFPCo<%jmX_c|dF+X?y;Ldt<1qm}ZR z{k6*%AeB{Z$}jLOTXkBeF3Vr==x^v=ZUIy fd^1kzIAU+8(an`-U&jc3dQ10_tAblJFvi}$M=4Cz delta 855 zcmYk4&ui2`6vy)>zb2FHcI^-8UKGV2tk4#J!5*wgK~ME!p@$%ZbSK;Wk!;eLSxO~g zq4g@X#EV6+y?F2>dh_6aQ1Bc)D0uKDo`jy9Y^64b?|XUk$@e{8=JV{Y>FQFYLKOM9 zZ>~M<&g@lZVR`TR~c}45@|r8#%n!R z8k~q-0ux@BdnM$>ZI2697P%%xK?GPWAE|X%&R?mkqd}_kK`O`VW7ZLv8auEJ)XbDY zGsSG5;uQA{w*QZKDGBSqN-@QC;yshY=#G7n20zI`TW|j8&WR{grEPw5lrPztaqe9F)y^l7oFT756qfeZlmJn zkIB{8#VpwH27VN{m5$H7WGi8DFK7wZDqqLW1+)t@Njwopq3fJ<;9Fb-ky{NIiIAL+**~6tC$pnT3Gr1a%CrLx(x3*@Wz;cXKwzi_IO9xH z9o3Lk88r7&-72erhE|<$6Q4~p$lqFGeq=>dGOLmo_j_t^Qi4`lfDj_hub-Y<|RuZM< zk7iejWKd88xrh!i(sY2HdXQ3}r=V@%OAkd4MGr-bUV3S;2-;p+6zQRd0zDKh(D#N^ zBLyuN{N}xRZ{C}E^XAR`YNKwuLG-q>Y;U^$?P|pj)VZqX2g;)3!$@Pk+FW!z5A@K^Y}?m@v$0uaPR*&K zPJG_3tlKNjtJOMn7<42~$QSQ}9XaT_4MuM)!L;lOIt_YG=*%;xX)`g@c(Cd??k&5r z>Qrzaj(=*0@F;&-$W0KK7oZN@g4)*~>ptew8a%;vFy8DxJT#&G*%n;a03AS>1lh@7X6nrKtqt zNV${=Lf&T6VXVNl(4S&~vFSNh(`immeU<+;G&&OxRL^mjSrN>!VT2)svk2!A#t=#f z=MY8_UPKr{80T}^h)y?l>f2Mxt9(ZrxX=&%lkoS708%nR5|E?tshXm-DdgIp^8DwT zsuZR`kqNj2)ITFvSDd=D-DKAp|6}AbDe|;&dGrE^f*54c@z#2Qwq?7Uj>ld=kz&_( z*buK7^T}!CHM`k#>a?V@i~Kjn?6~Muob5{6(|_FsVdi)Zcgrzhl!wce;{0axd! zA=-OiEOQVIMyj4gA+0KqFzh1qFf{pPYdsdIZ8le!O&tsJzVVJj-v>P}1|Z4&PVA7J z=YNisuKZsU8Ow8gaZLOMG@S$VT{NPhk?`}`__9h${Kwsy5wS`4ptrp>Zy@zL0!}Al##^uce5bRZwb56D{LhVN&(2*PzB9m3R*5+y__mz4H-7bRhw|1wuvGFSwh1qzhQlQQg6 z>vqivx@<}@fsc@H!Po^V?ns$wU zr%*~RAwP?Nm7R_8Ul%5|H<7%@N#Ee0n1h&&nAane)Byqosw=DVSNf*+D0bpJODbDM z`b$f|^2TNWx^d=sOr>~?sIsQSWJA$m1u>F@m89gftjejh4*eQY3CggQp_s}fD;t82 zDM%+lJE>;nCz*xkfA9MR84{;)9ZW+>q_iD+u{aC^l&)$1Y5%$O>5#H_LAJ}Y1LeD0 zK(VhOTtR(B1Rsm!29~8Ddg4AmUg{ode-i=Cw0G+g|9GIUw}I;vl`pCiO->m}SmBdF zJ~=R`!1cucJutb48_4k1V0RHj@e-wB5n0?e5i<4^s32}x71#E>iUUsy>x=SLA`CAb zCL&w_3agKo2GA8%Ho6l1`X$}aWBRmyMSskM#soV6IsbU@F$s9I_yH;KsbYH1-)X|z zge5>0XdR{t7?wonMo6J7+pIPxAZ>kz!6RjYHr}bb4VyANh-Uw3Aw+KiBY0ePabiKw zX&ro?Y_kjo)6Ab19S?^MU|AemJS}g)4R7PS#hYk$9xJ_|#&Z9|O$8q>ERT{16xF%L z$_ga#w@@8xaqv)UEUm#MCt~zPfZG&?H_)%v8g$cju1A6Mu&%4J4*MFD&!~Wq!APql LhpqUMBESCwrpSig delta 2173 zcmZuy&2JM&6rb5$uh-tSllU{S4f&v!d(cTl;%&X5X9lId6YE z_vh*8nMfo|;J5JP;9_|CQM6ZjOdgHg8n9?9X{Fk9A$^{(Fw^f5rdz#Dd7+O?C)T7cG2@JY0-ehzynww?w>XcA)9N#EG_4Q<0*tBLK>kT zA&0OJVLw6!A&bx_z6uUsDc)YGmYwyfv3jZQKW3@wSiD-OjB(4ZRc={F>RY@A6kdbJ z#xsZbh9rJZg~kuxaFeHaGruh7hjRkb$j{M0pZM4zMyv7}EP9DrAz z0h!+@acj-0I<}|YDpWQsoA=@?xlrBWN%50@xqAfHYN1}Ysw}VZA(1uS9rZV5YqQv~ z^shNDxa;~U(6UjA7~-MvHSH3IBk9pTSo1i57b@8%1KUL>FYzJVM&XxF6ZJ^1UV}~B zFBBCb(xUxhDw==mf93Jiq-k4@-&sx#$Zo4`;vp&kQFp$KE-NRnCSF(Z6RWstmX=Lx zvt&DVr)KDPr&6=XokT#dJ*85ru0l$V$A<>cz8A#?1~a=xUUB_SJfk;3$UX!>VmnXb z^HLHM+X-H?Sjj0YRV$h(%Z1~ zR2za=v-m8&8%LM`$g8^<6+fnCCtmFbFJ-PkiV91%!wW?RYG6C&a*clvdiF5@qKHH3 zRqBc_(vwr$a#?NDhO%WiL04%~O0JXYj6xi3HOxPwq!FOx&VG;z@v0MU>29EGi0A3) zyOAb&@RX8msTJL(<*qihe`a)>n%&z{xo4X)nW^_BcrTY@52-y5GI9PpoRGlF-AdxR zP1_*hq?|Oan$$_V3esNEq>bQa&JCU=A14|b+GQbEakaKg$wRshKF*<9M|@9x7S%$V z1Fq8Qbwh0m%CSb+Ro$=)a|E3M)tT!AjP-#_RiGK4O69D0-uvBMY#?l1`v!nR92gHx z2nj-v;E@@z-X2vGoLHTI}|2n;Ng$s`*Y)GFCdFu@1^aH zV$rhg<&8>Z%Vf3N)k>|vESA?h4*IV8PQQmb1=NvYAoE4>I5&OyI&NYRd4+$3{D0!Z zVaO)|{(#562tYK0Dv~N2Qdl-1M1yuim@z3KDN-yh();$)=+3cyPwAk4D{q1Z%tgky zpKd=I3?Aw=BHrjflz26b+<|x3M5%x7LJ2rNif|a^Wj`LAlk)^CG5MtQ2g! zXu(I=d@;82lpjDzKT%QOaO&6z08Lh;uw-Pk2`!}Q+LZRDc7vltKEpo+BBa5abU_pb zA1sDoxLm5OtUz6G>iRRuQ)^3Q81%l%3ws?7t$EtaT8(W~tW!Fye3Oc#K|Ks9rvO4- Hutxs?*;~{y diff --git a/env/lib/python3.7/site-packages/pip/_internal/__pycache__/wheel.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/__pycache__/wheel.cpython-37.pyc index 73dee8d3903247a7687e2d450be80f44c1bd8957..95e2e30746309d95a6d199094113d34635a73f3e 100644 GIT binary patch delta 13756 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 diff --git a/env/lib/python3.7/site-packages/pip/_internal/build_env.py b/env/lib/python3.7/site-packages/pip/_internal/build_env.py index 673409d..89830e7 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/build_env.py +++ b/env/lib/python3.7/site-packages/pip/_internal/build_env.py @@ -4,98 +4,173 @@ import logging import os import sys +import textwrap +from collections import OrderedDict from distutils.sysconfig import get_python_lib from sysconfig import get_paths from pip._vendor.pkg_resources import Requirement, VersionConflict, WorkingSet +from pip import __file__ as pip_location from pip._internal.utils.misc import call_subprocess from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING from pip._internal.utils.ui import open_spinner +if MYPY_CHECK_RUNNING: + from typing import Tuple, Set, Iterable, Optional, List + from pip._internal.index import PackageFinder + logger = logging.getLogger(__name__) +class _Prefix: + + def __init__(self, path): + # type: (str) -> None + self.path = path + self.setup = False + self.bin_dir = get_paths( + 'nt' if os.name == 'nt' else 'posix_prefix', + vars={'base': path, 'platbase': path} + )['scripts'] + # Note: prefer distutils' sysconfig to get the + # library paths so PyPy is correctly supported. + purelib = get_python_lib(plat_specific=False, prefix=path) + platlib = get_python_lib(plat_specific=True, prefix=path) + if purelib == platlib: + self.lib_dirs = [purelib] + else: + self.lib_dirs = [purelib, platlib] + + class BuildEnvironment(object): """Creates and manages an isolated environment to install build deps """ def __init__(self): + # type: () -> None self._temp_dir = TempDirectory(kind="build-env") self._temp_dir.create() - @property - def path(self): - return self._temp_dir.path + self._prefixes = OrderedDict(( + (name, _Prefix(os.path.join(self._temp_dir.path, name))) + for name in ('normal', 'overlay') + )) + + self._bin_dirs = [] # type: List[str] + self._lib_dirs = [] # type: List[str] + for prefix in reversed(list(self._prefixes.values())): + self._bin_dirs.append(prefix.bin_dir) + self._lib_dirs.extend(prefix.lib_dirs) + + # Customize site to: + # - ensure .pth files are honored + # - prevent access to system site packages + system_sites = { + os.path.normcase(site) for site in ( + get_python_lib(plat_specific=False), + get_python_lib(plat_specific=True), + ) + } + self._site_dir = os.path.join(self._temp_dir.path, 'site') + if not os.path.exists(self._site_dir): + os.mkdir(self._site_dir) + with open(os.path.join(self._site_dir, 'sitecustomize.py'), 'w') as fp: + fp.write(textwrap.dedent( + ''' + import os, site, sys + + # First, drop system-sites related paths. + original_sys_path = sys.path[:] + known_paths = set() + for path in {system_sites!r}: + site.addsitedir(path, known_paths=known_paths) + system_paths = set( + os.path.normcase(path) + for path in sys.path[len(original_sys_path):] + ) + original_sys_path = [ + path for path in original_sys_path + if os.path.normcase(path) not in system_paths + ] + sys.path = original_sys_path + + # Second, add lib directories. + # ensuring .pth file are processed. + for path in {lib_dirs!r}: + assert not path in sys.path + site.addsitedir(path) + ''' + ).format(system_sites=system_sites, lib_dirs=self._lib_dirs)) def __enter__(self): - self.save_path = os.environ.get('PATH', None) - self.save_pythonpath = os.environ.get('PYTHONPATH', None) - self.save_nousersite = os.environ.get('PYTHONNOUSERSITE', None) + self._save_env = { + name: os.environ.get(name, None) + for name in ('PATH', 'PYTHONNOUSERSITE', 'PYTHONPATH') + } - install_scheme = 'nt' if (os.name == 'nt') else 'posix_prefix' - install_dirs = get_paths(install_scheme, vars={ - 'base': self.path, - 'platbase': self.path, + path = self._bin_dirs[:] + old_path = self._save_env['PATH'] + if old_path: + path.extend(old_path.split(os.pathsep)) + + pythonpath = [self._site_dir] + + os.environ.update({ + 'PATH': os.pathsep.join(path), + 'PYTHONNOUSERSITE': '1', + 'PYTHONPATH': os.pathsep.join(pythonpath), }) - scripts = install_dirs['scripts'] - if self.save_path: - os.environ['PATH'] = scripts + os.pathsep + self.save_path - else: - os.environ['PATH'] = scripts + os.pathsep + os.defpath - - # Note: prefer distutils' sysconfig to get the - # library paths so PyPy is correctly supported. - purelib = get_python_lib(plat_specific=0, prefix=self.path) - platlib = get_python_lib(plat_specific=1, prefix=self.path) - if purelib == platlib: - lib_dirs = purelib - else: - lib_dirs = purelib + os.pathsep + platlib - if self.save_pythonpath: - os.environ['PYTHONPATH'] = lib_dirs + os.pathsep + \ - self.save_pythonpath - else: - os.environ['PYTHONPATH'] = lib_dirs - - os.environ['PYTHONNOUSERSITE'] = '1' - - return self.path - def __exit__(self, exc_type, exc_val, exc_tb): - def restore_var(varname, old_value): + for varname, old_value in self._save_env.items(): if old_value is None: os.environ.pop(varname, None) else: os.environ[varname] = old_value - restore_var('PATH', self.save_path) - restore_var('PYTHONPATH', self.save_pythonpath) - restore_var('PYTHONNOUSERSITE', self.save_nousersite) - def cleanup(self): + # type: () -> None self._temp_dir.cleanup() - def missing_requirements(self, reqs): - """Return a list of the requirements from reqs that are not present + def check_requirements(self, reqs): + # type: (Iterable[str]) -> Tuple[Set[Tuple[str, str]], Set[str]] + """Return 2 sets: + - conflicting requirements: set of (installed, wanted) reqs tuples + - missing requirements: set of reqs """ - missing = [] - with self: - ws = WorkingSet(os.environ["PYTHONPATH"].split(os.pathsep)) + missing = set() + conflicting = set() + if reqs: + ws = WorkingSet(self._lib_dirs) for req in reqs: try: if ws.find(Requirement.parse(req)) is None: - missing.append(req) - except VersionConflict: - missing.append(req) - return missing + missing.add(req) + except VersionConflict as e: + conflicting.add((str(e.args[0].as_requirement()), + str(e.args[1]))) + return conflicting, missing - def install_requirements(self, finder, requirements, message): + def install_requirements( + self, + finder, # type: PackageFinder + requirements, # type: Iterable[str] + prefix_as_string, # type: str + message # type: Optional[str] + ): + # type: (...) -> None + prefix = self._prefixes[prefix_as_string] + assert not prefix.setup + prefix.setup = True + if not requirements: + return args = [ - sys.executable, '-m', 'pip', 'install', '--ignore-installed', - '--no-user', '--prefix', self.path, '--no-warn-script-location', - ] + sys.executable, os.path.dirname(pip_location), 'install', + '--ignore-installed', '--no-user', '--prefix', prefix.path, + '--no-warn-script-location', + ] # type: List[str] if logger.getEffectiveLevel() <= logging.DEBUG: args.append('-v') for format_control in ('no_binary', 'only_binary'): @@ -114,12 +189,10 @@ class BuildEnvironment(object): args.extend(['--trusted-host', host]) if finder.allow_all_prereleases: args.append('--pre') - if finder.process_dependency_links: - args.append('--process-dependency-links') args.append('--') args.extend(requirements) with open_spinner(message) as spinner: - call_subprocess(args, show_stdout=False, spinner=spinner) + call_subprocess(args, spinner=spinner) class NoOpBuildEnvironment(BuildEnvironment): @@ -138,5 +211,5 @@ class NoOpBuildEnvironment(BuildEnvironment): def cleanup(self): pass - def install_requirements(self, finder, requirements, message): + def install_requirements(self, finder, requirements, prefix, message): raise NotImplementedError() diff --git a/env/lib/python3.7/site-packages/pip/_internal/cache.py b/env/lib/python3.7/site-packages/pip/_internal/cache.py index 33bec97..9379343 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/cache.py +++ b/env/lib/python3.7/site-packages/pip/_internal/cache.py @@ -12,8 +12,13 @@ from pip._internal.download import path_to_url from pip._internal.models.link import Link from pip._internal.utils.compat import expanduser from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING from pip._internal.wheel import InvalidWheelFilename, Wheel +if MYPY_CHECK_RUNNING: + from typing import Optional, Set, List, Any + from pip._internal.index import FormatControl + logger = logging.getLogger(__name__) @@ -29,6 +34,7 @@ class Cache(object): """ def __init__(self, cache_dir, format_control, allowed_formats): + # type: (str, FormatControl, Set[str]) -> None super(Cache, self).__init__() self.cache_dir = expanduser(cache_dir) if cache_dir else None self.format_control = format_control @@ -38,6 +44,7 @@ class Cache(object): assert self.allowed_formats.union(_valid_formats) == _valid_formats def _get_cache_path_parts(self, link): + # type: (Link) -> List[str] """Get parts of part that must be os.path.joined with cache_dir """ @@ -63,6 +70,7 @@ class Cache(object): return parts def _get_candidates(self, link, package_name): + # type: (Link, Optional[str]) -> List[Any] can_not_cache = ( not self.cache_dir or not package_name or @@ -87,23 +95,27 @@ class Cache(object): raise def get_path_for_link(self, link): + # type: (Link) -> str """Return a directory to store cached items in for link. """ raise NotImplementedError() def get(self, link, package_name): + # type: (Link, Optional[str]) -> Link """Returns a link to a cached item if it exists, otherwise returns the passed link. """ raise NotImplementedError() def _link_for_candidate(self, link, candidate): + # type: (Link, str) -> Link root = self.get_path_for_link(link) path = os.path.join(root, candidate) return Link(path_to_url(path)) def cleanup(self): + # type: () -> None pass @@ -112,11 +124,13 @@ class SimpleWheelCache(Cache): """ def __init__(self, cache_dir, format_control): + # type: (str, FormatControl) -> None super(SimpleWheelCache, self).__init__( cache_dir, format_control, {"binary"} ) def get_path_for_link(self, link): + # type: (Link) -> str """Return a directory to store cached wheels for link Because there are M wheels for any one sdist, we provide a directory @@ -137,6 +151,7 @@ class SimpleWheelCache(Cache): return os.path.join(self.cache_dir, "wheels", *parts) def get(self, link, package_name): + # type: (Link, Optional[str]) -> Link candidates = [] for wheel_name in self._get_candidates(link, package_name): @@ -160,6 +175,7 @@ class EphemWheelCache(SimpleWheelCache): """ def __init__(self, format_control): + # type: (FormatControl) -> None self._temp_dir = TempDirectory(kind="ephem-wheel-cache") self._temp_dir.create() @@ -168,6 +184,7 @@ class EphemWheelCache(SimpleWheelCache): ) def cleanup(self): + # type: () -> None self._temp_dir.cleanup() @@ -179,6 +196,7 @@ class WheelCache(Cache): """ def __init__(self, cache_dir, format_control): + # type: (str, FormatControl) -> None super(WheelCache, self).__init__( cache_dir, format_control, {'binary'} ) @@ -186,17 +204,21 @@ class WheelCache(Cache): self._ephem_cache = EphemWheelCache(format_control) def get_path_for_link(self, link): + # type: (Link) -> str return self._wheel_cache.get_path_for_link(link) def get_ephem_path_for_link(self, link): + # type: (Link) -> str return self._ephem_cache.get_path_for_link(link) def get(self, link, package_name): + # type: (Link, Optional[str]) -> Link retval = self._wheel_cache.get(link, package_name) if retval is link: retval = self._ephem_cache.get(link, package_name) return retval def cleanup(self): + # type: () -> None self._wheel_cache.cleanup() self._ephem_cache.cleanup() diff --git a/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-37.pyc index 0596d290e23affa909d30c4d1b8bc35560f0e4f2..f73d4453582eca1d1f0f6a43d0382c9739da8b9d 100644 GIT binary patch delta 38 qcmaFL_>_^yiI_^yiIo}QOgQfM-9g8^$XNCE)IAqo}% diff --git a/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-37.pyc index 0e1251c261527d11b9039abd0d520314075e449c..b375d9d2ebee69b10211654ac72330557bb7ef1f 100644 GIT binary patch delta 80 zcmdm_zDb?OiI delta 80 zcmdm_zDb?OiIF+PDk(JCtjik0s}#kPTv}9=npYBEkXVv& hi!&`VCpA7Nv$*6IV_J~{NZ;heLP?BKli7sV005|#7`gxe diff --git a/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-37.pyc index ab16aba9d3021cf0a92c4bfc85164f73e69b4063..86bc1a7ea604f1beb075082a438b14fd0e4d56ac 100644 GIT binary patch literal 7749 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 On=EN%efSTR5C0FS7;qZ^ delta 3216 zcma)8U2Ggz6`ngYJ3Bi&`{SQoukE$7jvXiK#y@dG1gR538d7LW5**ZoY0JdkJF#ao zv%9`?H*uGWHlOh3w3dKZbJP{mOwp=v-v)lmt`TA(?a zZ1saS<)ox;IEHM~P8wQ0FvEKqM^Ime`42NXVz~;d?g5G8+X=PO}=qbd|)hO7r-aNr4&{C-Ix_W zPXFcPNzjtiI_I6J-p8`2Wg07ubiSr^L@q`syrprQ7nD zB6bQi_9bbGyeNXBW4NPzSVVi?UG4e-bq~6~0=8%zKq2Cd%#EcZ=wo$OSme1YY%Qv* zOs=4#@|n5VtKb~K6UhTp#XmD+`84PScwR<(SyZhPJ)*>FGtJIXm7C2B)s|4V*mbJ! zW>MNB(w>rbo860*W-hwN^V zczIi8KZzmRu7O9())hW<%VHk`leToCyi>!ecqP`iiJY#`9L6l5nTJ4ZK5`YvzNO#O zuPfhFT7QDUqrA$;ZfdtIAixy)f94o}W{w9i#~~cuV>b?lkIT2QVto&ne0BrR4!#0| zYjWuaM8UrtnSIX2VI25QNZ(&P_H7m+)gQlFc=)Pv9S(&md@@#PZd=_U?LWf7PwkM- zN6;Rzm912q+EJMaM?Vcdd47}@py$}ON{bJ*Eh9GGFTy73u@S4=uz8&A>&i0B%V&09 z*n$<;%;bYeyonRyg<4lT5A8$~;Qa zw>`Gnj=Utb(e*vfUWWu?WrVK*BpOV{E}(i^j25e8NqoL|l=O=m#qu|_=q^yh+w?iZ zBA#fh+e$1ylI&|WyhQU`oMBcbTEtnBqTXtEjbW;?JVFt{MlcX^0OCKzNswYWkpJC1$kV<+OdL#Z0i*(~>jnHFSIh9Sx`gyc;E&x7lz8pdhsG zxbV8jPZv1exW$l%pP^Txhbw-oqg(_ctwOg#@>*V1i4K1&Z4gT}NWW?W>cmh{vo(uY zq)754uNFz=pzS9%>f&s_`?joMSke+>-KW%Ru{Uwy7ZLCcWhht+rKfd6N?1H(eVhRy z!UHqqPGC2xRk5Z_z4558BN@M9{KQpS*@SqlM9CHL z%hH?0e3EUn;rqZK$~9BSKzI873I$jG>x^dSH{MM~#KSE{)PV#1(g@O;y_i{5$}!G7G*I_qYcX<%OJ=CU52~S z92`9N7~JjVuyO|N70R;WqGsTFVZg z0}{s>5j$gLu~SWvlK6FX!obf*QW3wc4rW6?YV6@eNekqsNq_%r;Pj;92?&I diff --git a/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-37.pyc index fce517bcbc7e20e73d29bf4c5cf81fd472c96b8e..30734361c6c60216c29bba36c8d0bcac35e32f0c 100644 GIT binary patch delta 6104 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 delta 4303 zcmbVOX>eS{5#G1jOS`MnI##ld^&z8`wUQ4>wq;qCjO7bse1I?yn`N~S|ejX9|by@J~T zqcT;cS8+RNRHs6ENOOoPc@F&*88x|7tzL`5VkkN8(C5PMp%luFYkD2L1#_SRTlK;% zd{7BhP>o**YHsuB4b0WTT&RO`sD}pR8kuW^Fw7%Xc#-w$VP@yU0$2!5=yDOW^O(H^ znjuF9B5YtjlP$0qTG2q19W7w44ccJ|4`0f|7c#pHmP3bV5}|X8&O452&M z*aDZqR=AwGR_3eO9KhcdtRul>9gB5V!WbMx*(x{$D?vQMdteaHA-Oo6u#U z-UBzoG1OQC$Keb3+Y7hA7x8y3d<5N;aHEpj=9rt2EPKh zow-Yyy8{${xdQkKlk1th6Yj#V0PbdP0KN)eL&FcV%4TN20pEmg!Nc$fj(-$)-=}Y3{@Xct43!^e1D7%N1U!i* zpMvl3a&2YqX_$g%;JffWcotn>&fIhGJaaEFw~e{)v*RDY4>6o8nE4SiFEX>8nU~9Jz=XNmpGW-;N26cE~D7|*V&*2w1?_Df=1zv?;ie2z4_%*zSXX8p{e*>?xncuRR ztKbdMAR0wj%o7X5LJ<)yVzFoyQPC#a#R{=REEOBYCb2`zAFhBm?{n&d@H??wbX15= z(Ir+6yP3Qi3U)anf0*ia3r#)ddDNrX1^wv>HB|WbYdl!IY=0aemdRSlOgiGS-NQ07 zmbE?ExHN^dgLy%0n$7nfamZ>M`OcblE0t}}CbQ9G+O*<^5ltK#PLEm#I#g9*Q&U+g zzF$mR&Ks!1QKk>U;VIUNwNg#iOg-s8sm&pCGK64zhlQ1nr^GU~E%=_MtF1*%tz{&o zv9g|2+$1+`Zz7YnWX9lFB3fP{q|O#KHa4T0S%Kj2`ZSj_==7sEkA`i{smYe9w~Ov_ zY73MsT^^tUZWoxsl1=KV(wdN$`hF`eF^(7{WyCGXy{`UTx};gJH6dvtFR~&HBArMI zGluid91_4`y&(3*#|%q$ zPHianI%`Q{yR3<?VTuY6fW6&=CYea;n z$0yUn;mp49jFm8}wyDP&yVNW7^*Eis)sKFz9Eub(}OS<5x5&NuA#>_H8=U%lUO z&F6Ap;Bey;92n?emHJC#4Nl0L$KhZD-46QlaGFC$ZND>hx|&X8#*Dm$D~scx^ScJg zlI_JJ9WyOyyV<^^I*9R&W8uObyx37$Y$TorL&VaV*ibSZmlJoA8@d@Bn7=MfPLQkA zELSLzCczkig@8qpCvlL7Lj>ehjuU)jV$=RIX=7sA<9!!-oK*jA8mJFMqv=dEACqiC zQ?@UGwRR|;*e|zEwJ+SOi7s-$nR%F6vuYrABQ8nBUA7Z&<(eQ?V_O%6#j|*j!U&>{ z18)l_-WPmZSQyNe0rD@|$=0dui*{Xo)8 zr+R0}Jq?qk(F-q!{L4ayF$~GMUN-ecM^sxhGmQ&*I9U>n4jY-FxDlNm)ul!B7C zU`HNS%exQdZ^4UBa;JK+`%j)yQYusTub!vvRxhod+p-7=yKvuFI$>ophA9iE@57bI zKiOQQ&&S=Pmadr-6ypiOk2_O(Rc}vyfZkuS5J6v{&h%8O!#yRMU!CX)YXS9IPmM3X zUNVTCuvVo0(NhBi9o2A=oYh z%a85aFD6WRE3y3q8ws`$Tt={sU?;&<1cL;739duHy-B9BSg7#UmN8<72oeNz+wyHE zlMcsbha9Com3)~-z~`MzNG@Ph0VL%jCw#tuQBujp1Z@OS0?Gz?RBi9A_T;E}qe}IL z+QZarM6i8WEfa=_r|p8Q6!K;g93wbIQWx*;8TDFkc+Z`xdkp`HE&z)T#Mgz94GC diff --git a/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-37.pyc index 8400c89ae885f017047b4b2e6d28726927dc3378..655ea9f95b5d114c3153345ae9184169b7cf86e4 100644 GIT binary patch delta 493 zcmYLEO>5gg5Y?T(`QIi^YKBQz{YGf8y zf2s}Oxi|g2zSDWN-FfZ2eb?*l_I4VCCk|#)&*e&Y6okv~@E24I?U@yQl}j2unvXv< zKYWZXbcl!YWs96GL20 z3kACeo`>CHY$hDoy=%;bHP@c|6FT$U7X-6FND9&7?;G$yF31MpCJJ&*)@uI&%2aE2 delta 398 zcmY*U!Ab&A6rKBKbjIf>X)3lb0<{nk5!*y1(hsy~Hw1(D1~EowdT-1ha1+sDn0%nE~SD%>pf&69>GR4_!fyxmX5QGgc@2lW9)0Ldu%fO0c#RC^L`I&(rF)m^|JvBNn0ajBIs<|VQ9;m% Rkwi0LPc5k?n8Z+x#t(Q`R6+m% diff --git a/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/parser.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/parser.cpython-37.pyc index e48ce842390af8aee676c5ae20465c38b154445a..60abd8f9f0a2b88228f6d8f83827d9667799d773 100644 GIT binary patch delta 77 zcmdn%y4RJ*iIh!FX%)Wa*VmjJ=y}<-8f$ erUMlgwM_08l-RsXUYm*W*5pfy-at}LX+8jCkr&zk delta 77 zcmdn%y4RJ*iIF+PDk(JC?9J>h!5Fo9vh+$O#-7c#a^8$= e(|`(#S|;}kN^D*xug%05HTjaFH;|N5nhyX(`4&t7 diff --git a/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-37.pyc index 922cb87105db73b4f9c761d53c858b6b680c8ec6..58423e50132e927dacde6e57e64a0d54e6f65bd4 100644 GIT binary patch delta 34 ocmaFH^o)teiIF+PDk(IXtjOpJ0Fp8Yy#N3J diff --git a/env/lib/python3.7/site-packages/pip/_internal/cli/base_command.py b/env/lib/python3.7/site-packages/pip/_internal/cli/base_command.py index dac4b05..f6108c9 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/cli/base_command.py +++ b/env/lib/python3.7/site-packages/pip/_internal/cli/base_command.py @@ -1,11 +1,13 @@ """Base Command class, and related routines""" -from __future__ import absolute_import +from __future__ import absolute_import, print_function import logging import logging.config import optparse import os +import platform import sys +import traceback from pip._internal.cli import cmdoptions from pip._internal.cli.parser import ( @@ -26,13 +28,19 @@ from pip._internal.req.constructors import ( install_req_from_editable, install_req_from_line, ) from pip._internal.req.req_file import parse_requirements -from pip._internal.utils.logging import setup_logging -from pip._internal.utils.misc import get_prog, normalize_path +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging +from pip._internal.utils.misc import ( + get_prog, normalize_path, redact_password_from_url, +) from pip._internal.utils.outdated import pip_version_check from pip._internal.utils.typing import MYPY_CHECK_RUNNING if MYPY_CHECK_RUNNING: - from typing import Optional # noqa: F401 + from typing import Optional, List, Tuple, Any + from optparse import Values + from pip._internal.cache import WheelCache + from pip._internal.req.req_set import RequirementSet __all__ = ['Command'] @@ -42,10 +50,10 @@ logger = logging.getLogger(__name__) class Command(object): name = None # type: Optional[str] usage = None # type: Optional[str] - hidden = False # type: bool ignore_require_venv = False # type: bool def __init__(self, isolated=False): + # type: (bool) -> None parser_kw = { 'usage': self.usage, 'prog': '%s %s' % (get_prog(), self.name), @@ -69,7 +77,12 @@ class Command(object): ) self.parser.add_option_group(gen_opts) + def run(self, options, args): + # type: (Values, List[Any]) -> Any + raise NotImplementedError + def _build_session(self, options, retries=None, timeout=None): + # type: (Values, Optional[int], Optional[int]) -> PipSession session = PipSession( cache=( normalize_path(os.path.join(options.cache_dir, "http")) @@ -106,21 +119,43 @@ class Command(object): return session def parse_args(self, args): + # type: (List[str]) -> Tuple # factored out for testability return self.parser.parse_args(args) def main(self, args): + # type: (List[str]) -> int options, args = self.parse_args(args) # Set verbosity so that it can be used elsewhere. self.verbosity = options.verbose - options.quiet - setup_logging( + level_number = setup_logging( verbosity=self.verbosity, no_color=options.no_color, user_log_file=options.log, ) + if sys.version_info[:2] == (3, 4): + deprecated( + "Python 3.4 support has been deprecated. pip 19.1 will be the " + "last one supporting it. Please upgrade your Python as Python " + "3.4 won't be maintained after March 2019 (cf PEP 429).", + replacement=None, + gone_in='19.2', + ) + elif sys.version_info[:2] == (2, 7): + message = ( + "A future version of pip will drop support for Python 2.7." + ) + if platform.python_implementation() == "CPython": + message = ( + "Python 2.7 will reach the end of its life on January " + "1st, 2020. Please upgrade your Python as Python 2.7 " + "won't be maintained after that date. " + ) + message + deprecated(message, replacement=None, gone_in=None) + # TODO: Try to get these passing down from the command? # without resorting to os.environ to hold these. # This also affects isolated builds and it should. @@ -156,9 +191,17 @@ class Command(object): return ERROR except CommandError as exc: - logger.critical('ERROR: %s', exc) + logger.critical('%s', exc) logger.debug('Exception information:', exc_info=True) + return ERROR + except BrokenStdoutLoggingError: + # Bypass our logger and write any remaining messages to stderr + # because stdout no longer works. + print('ERROR: Pipe to stdout was broken', file=sys.stderr) + if level_number <= logging.DEBUG: + traceback.print_exc(file=sys.stderr) + return ERROR except KeyboardInterrupt: logger.critical('Operation cancelled by user') @@ -195,8 +238,15 @@ class Command(object): class RequirementCommand(Command): @staticmethod - def populate_requirement_set(requirement_set, args, options, finder, - session, name, wheel_cache): + def populate_requirement_set(requirement_set, # type: RequirementSet + args, # type: List[str] + options, # type: Values + finder, # type: PackageFinder + session, # type: PipSession + name, # type: str + wheel_cache # type: Optional[WheelCache] + ): + # type: (...) -> None """ Marshal cmd line args into a requirement set. """ @@ -214,6 +264,7 @@ class RequirementCommand(Command): for req in args: req_to_add = install_req_from_line( req, None, isolated=options.isolated_mode, + use_pep517=options.use_pep517, wheel_cache=wheel_cache ) req_to_add.is_direct = True @@ -223,6 +274,7 @@ class RequirementCommand(Command): req_to_add = install_req_from_editable( req, isolated=options.isolated_mode, + use_pep517=options.use_pep517, wheel_cache=wheel_cache ) req_to_add.is_direct = True @@ -232,7 +284,8 @@ class RequirementCommand(Command): for req_to_add in parse_requirements( filename, finder=finder, options=options, session=session, - wheel_cache=wheel_cache): + wheel_cache=wheel_cache, + use_pep517=options.use_pep517): req_to_add.is_direct = True requirement_set.add_requirement(req_to_add) # If --require-hashes was a line in a requirements file, tell @@ -251,15 +304,25 @@ class RequirementCommand(Command): 'You must give at least one requirement to %(name)s ' '(see "pip help %(name)s")' % opts) - def _build_package_finder(self, options, session, - platform=None, python_versions=None, - abi=None, implementation=None): + def _build_package_finder( + self, + options, # type: Values + session, # type: PipSession + platform=None, # type: Optional[str] + python_versions=None, # type: Optional[List[str]] + abi=None, # type: Optional[str] + implementation=None # type: Optional[str] + ): + # type: (...) -> PackageFinder """ Create a package finder appropriate to this requirement command. """ index_urls = [options.index_url] + options.extra_index_urls if options.no_index: - logger.debug('Ignoring indexes: %s', ','.join(index_urls)) + logger.debug( + 'Ignoring indexes: %s', + ','.join(redact_password_from_url(url) for url in index_urls), + ) index_urls = [] return PackageFinder( @@ -268,7 +331,6 @@ class RequirementCommand(Command): index_urls=index_urls, trusted_hosts=options.trusted_hosts, allow_all_prereleases=options.pre, - process_dependency_links=options.process_dependency_links, session=session, platform=platform, versions=python_versions, diff --git a/env/lib/python3.7/site-packages/pip/_internal/cli/cmdoptions.py b/env/lib/python3.7/site-packages/pip/_internal/cli/cmdoptions.py index 3033cd4..a09e38f 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/cli/cmdoptions.py +++ b/env/lib/python3.7/site-packages/pip/_internal/cli/cmdoptions.py @@ -9,7 +9,9 @@ pass on state. To be consistent, all options will follow this design. """ from __future__ import absolute_import +import textwrap import warnings +from distutils.util import strtobool from functools import partial from optparse import SUPPRESS_HELP, Option, OptionGroup @@ -22,10 +24,27 @@ from pip._internal.utils.typing import MYPY_CHECK_RUNNING from pip._internal.utils.ui import BAR_TYPES if MYPY_CHECK_RUNNING: - from typing import Any # noqa: F401 + from typing import Any, Callable, Dict, Optional + from optparse import OptionParser, Values + from pip._internal.cli.parser import ConfigOptionParser + + +def raise_option_error(parser, option, msg): + """ + Raise an option parsing error using parser.error(). + + Args: + parser: an OptionParser instance. + option: an Option instance. + msg: the error text. + """ + msg = '{} error: {}'.format(option, msg) + msg = textwrap.fill(' '.join(msg.split())) + parser.error(msg) def make_option_group(group, parser): + # type: (Dict[str, Any], ConfigOptionParser) -> OptionGroup """ Return an OptionGroup object group -- assumed to be dict with 'name' and 'options' keys @@ -38,6 +57,7 @@ def make_option_group(group, parser): def check_install_build_global(options, check_options=None): + # type: (Values, Optional[Values]) -> None """Disable wheels if per-setup.py call options are set. :param options: The OptionParser options to update. @@ -60,6 +80,7 @@ def check_install_build_global(options, check_options=None): def check_dist_restriction(options, check_target=False): + # type: (Values, bool) -> None """Function for determining if custom platform options are allowed. :param options: The OptionParser options. @@ -80,7 +101,7 @@ def check_dist_restriction(options, check_target=False): # Installations or downloads using dist restrictions must not combine # source distributions and dist-specific wheels, as they are not - # gauranteed to be locally compatible. + # guaranteed to be locally compatible. if dist_restriction_set and sdist_dependencies_allowed: raise CommandError( "When restricting platform and interpreter constraints using " @@ -108,7 +129,7 @@ help_ = partial( dest='help', action='help', help='Show help.', -) # type: Any +) # type: Callable[..., Option] isolated_mode = partial( Option, @@ -120,7 +141,7 @@ isolated_mode = partial( "Run pip in an isolated mode, ignoring environment variables and user " "configuration." ), -) +) # type: Callable[..., Option] require_virtualenv = partial( Option, @@ -130,7 +151,7 @@ require_virtualenv = partial( action='store_true', default=False, help=SUPPRESS_HELP -) # type: Any +) # type: Callable[..., Option] verbose = partial( Option, @@ -139,7 +160,7 @@ verbose = partial( action='count', default=0, help='Give more output. Option is additive, and can be used up to 3 times.' -) +) # type: Callable[..., Option] no_color = partial( Option, @@ -148,7 +169,7 @@ no_color = partial( action='store_true', default=False, help="Suppress colored output", -) +) # type: Callable[..., Option] version = partial( Option, @@ -156,7 +177,7 @@ version = partial( dest='version', action='store_true', help='Show version and exit.', -) # type: Any +) # type: Callable[..., Option] quiet = partial( Option, @@ -169,7 +190,7 @@ quiet = partial( ' times (corresponding to WARNING, ERROR, and CRITICAL logging' ' levels).' ), -) # type: Any +) # type: Callable[..., Option] progress_bar = partial( Option, @@ -182,7 +203,7 @@ progress_bar = partial( 'Specify type of progress to be displayed [' + '|'.join(BAR_TYPES.keys()) + '] (default: %default)' ), -) # type: Any +) # type: Callable[..., Option] log = partial( Option, @@ -190,7 +211,7 @@ log = partial( dest="log", metavar="path", help="Path to a verbose appending log." -) # type: Any +) # type: Callable[..., Option] no_input = partial( Option, @@ -200,7 +221,7 @@ no_input = partial( action='store_true', default=False, help=SUPPRESS_HELP -) # type: Any +) # type: Callable[..., Option] proxy = partial( Option, @@ -209,7 +230,7 @@ proxy = partial( type='str', default='', help="Specify a proxy in the form [user:passwd@]proxy.server:port." -) # type: Any +) # type: Callable[..., Option] retries = partial( Option, @@ -219,7 +240,7 @@ retries = partial( default=5, help="Maximum number of retries each connection should attempt " "(default %default times).", -) # type: Any +) # type: Callable[..., Option] timeout = partial( Option, @@ -229,7 +250,7 @@ timeout = partial( type='float', default=15, help='Set the socket timeout (default %default seconds).', -) # type: Any +) # type: Callable[..., Option] skip_requirements_regex = partial( Option, @@ -239,10 +260,11 @@ skip_requirements_regex = partial( type='str', default='', help=SUPPRESS_HELP, -) # type: Any +) # type: Callable[..., Option] def exists_action(): + # type: () -> Option return Option( # Option when path already exist '--exists-action', @@ -253,7 +275,7 @@ def exists_action(): action='append', metavar='action', help="Default action when a path already exists: " - "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort).", + "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.", ) @@ -264,7 +286,7 @@ cert = partial( type='str', metavar='path', help="Path to alternate CA bundle.", -) # type: Any +) # type: Callable[..., Option] client_cert = partial( Option, @@ -275,7 +297,7 @@ client_cert = partial( metavar='path', help="Path to SSL client certificate, a single file containing the " "private key and the certificate in PEM format.", -) # type: Any +) # type: Callable[..., Option] index_url = partial( Option, @@ -287,7 +309,7 @@ index_url = partial( "This should point to a repository compliant with PEP 503 " "(the simple repository API) or a local directory laid out " "in the same format.", -) # type: Any +) # type: Callable[..., Option] def extra_index_url(): @@ -310,10 +332,11 @@ no_index = partial( action='store_true', default=False, help='Ignore package index (only looking at --find-links URLs instead).', -) # type: Any +) # type: Callable[..., Option] def find_links(): + # type: () -> Option return Option( '-f', '--find-links', dest='find_links', @@ -327,6 +350,7 @@ def find_links(): def trusted_host(): + # type: () -> Option return Option( "--trusted-host", dest="trusted_hosts", @@ -338,18 +362,8 @@ def trusted_host(): ) -# Remove after 1.5 -process_dependency_links = partial( - Option, - "--process-dependency-links", - dest="process_dependency_links", - action="store_true", - default=False, - help="Enable the processing of dependency links.", -) # type: Any - - def constraints(): + # type: () -> Option return Option( '-c', '--constraint', dest='constraints', @@ -362,6 +376,7 @@ def constraints(): def requirements(): + # type: () -> Option return Option( '-r', '--requirement', dest='requirements', @@ -374,6 +389,7 @@ def requirements(): def editable(): + # type: () -> Option return Option( '-e', '--editable', dest='editables', @@ -394,15 +410,17 @@ src = partial( help='Directory to check out editable projects into. ' 'The default in a virtualenv is "/src". ' 'The default for global installs is "/src".' -) # type: Any +) # type: Callable[..., Option] def _get_format_control(values, option): + # type: (Values, Option) -> Any """Get a format_control object.""" return getattr(values, option.dest) def _handle_no_binary(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None existing = _get_format_control(parser.values, option) FormatControl.handle_mutual_excludes( value, existing.no_binary, existing.only_binary, @@ -410,6 +428,7 @@ def _handle_no_binary(option, opt_str, value, parser): def _handle_only_binary(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None existing = _get_format_control(parser.values, option) FormatControl.handle_mutual_excludes( value, existing.only_binary, existing.no_binary, @@ -417,6 +436,7 @@ def _handle_only_binary(option, opt_str, value, parser): def no_binary(): + # type: () -> Option format_control = FormatControl(set(), set()) return Option( "--no-binary", dest="format_control", action="callback", @@ -432,6 +452,7 @@ def no_binary(): def only_binary(): + # type: () -> Option format_control = FormatControl(set(), set()) return Option( "--only-binary", dest="format_control", action="callback", @@ -454,7 +475,7 @@ platform = partial( default=None, help=("Only use wheels compatible with . " "Defaults to the platform of the running system."), -) +) # type: Callable[..., Option] python_version = partial( @@ -469,7 +490,7 @@ python_version = partial( "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."), -) +) # type: Callable[..., Option] implementation = partial( @@ -483,7 +504,7 @@ implementation = partial( " or 'ip'. If not specified, then the current " "interpreter implementation is used. Use 'py' to force " "implementation-agnostic wheels."), -) +) # type: Callable[..., Option] abi = partial( @@ -498,10 +519,11 @@ abi = partial( "you will need to specify --implementation, " "--platform, and --python-version when using " "this option."), -) +) # type: Callable[..., Option] def prefer_binary(): + # type: () -> Option return Option( "--prefer-binary", dest="prefer_binary", @@ -518,15 +540,44 @@ cache_dir = partial( default=USER_CACHE_DIR, metavar="dir", help="Store the cache data in

." -) +) # type: Callable[..., Option] + + +def no_cache_dir_callback(option, opt, value, parser): + """ + Process a value provided for the --no-cache-dir option. + + This is an optparse.Option callback for the --no-cache-dir option. + """ + # The value argument will be None if --no-cache-dir is passed via the + # command-line, since the option doesn't accept arguments. However, + # the value can be non-None if the option is triggered e.g. by an + # environment variable, like PIP_NO_CACHE_DIR=true. + if value is not None: + # Then parse the string value to get argument error-checking. + try: + strtobool(value) + except ValueError as exc: + raise_option_error(parser, option=option, msg=str(exc)) + + # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool() + # converted to 0 (like "false" or "no") caused cache_dir to be disabled + # rather than enabled (logic would say the latter). Thus, we disable + # the cache directory not just on values that parse to True, but (for + # backwards compatibility reasons) also on values that parse to False. + # In other words, always set it to False if the option is provided in + # some (valid) form. + parser.values.cache_dir = False + no_cache = partial( Option, "--no-cache-dir", dest="cache_dir", - action="store_false", + action="callback", + callback=no_cache_dir_callback, help="Disable the cache.", -) +) # type: Callable[..., Option] no_deps = partial( Option, @@ -535,7 +586,7 @@ no_deps = partial( action='store_true', default=False, help="Don't install package dependencies.", -) # type: Any +) # type: Callable[..., Option] build_dir = partial( Option, @@ -547,7 +598,7 @@ build_dir = partial( 'The location of temporary directories can be controlled by setting ' 'the TMPDIR environment variable (TEMP on Windows) appropriately. ' 'When passed, build directories are not cleaned in case of failures.' -) # type: Any +) # type: Callable[..., Option] ignore_requires_python = partial( Option, @@ -555,7 +606,7 @@ ignore_requires_python = partial( dest='ignore_requires_python', action='store_true', help='Ignore the Requires-Python information.' -) # type: Any +) # type: Callable[..., Option] no_build_isolation = partial( Option, @@ -566,6 +617,50 @@ no_build_isolation = partial( help='Disable isolation when building a modern source distribution. ' 'Build dependencies specified by PEP 518 must be already installed ' 'if this option is used.' +) # type: Callable[..., Option] + + +def no_use_pep517_callback(option, opt, value, parser): + """ + Process a value provided for the --no-use-pep517 option. + + This is an optparse.Option callback for the no_use_pep517 option. + """ + # Since --no-use-pep517 doesn't accept arguments, the value argument + # will be None if --no-use-pep517 is passed via the command-line. + # However, the value can be non-None if the option is triggered e.g. + # by an environment variable, for example "PIP_NO_USE_PEP517=true". + if value is not None: + msg = """A value was passed for --no-use-pep517, + probably using either the PIP_NO_USE_PEP517 environment variable + or the "no-use-pep517" config file option. Use an appropriate value + of the PIP_USE_PEP517 environment variable or the "use-pep517" + config file option instead. + """ + raise_option_error(parser, option=option, msg=msg) + + # Otherwise, --no-use-pep517 was passed via the command-line. + parser.values.use_pep517 = False + + +use_pep517 = partial( + Option, + '--use-pep517', + dest='use_pep517', + action='store_true', + default=None, + help='Use PEP 517 for building source distributions ' + '(use --no-use-pep517 to force legacy behaviour).' +) # type: Any + +no_use_pep517 = partial( + Option, + '--no-use-pep517', + dest='use_pep517', + action='callback', + callback=no_use_pep517_callback, + default=None, + help=SUPPRESS_HELP ) # type: Any install_options = partial( @@ -579,7 +674,7 @@ install_options = partial( "bin\"). Use multiple --install-option options to pass multiple " "options to setup.py install. If you are using an option with a " "directory path, be sure to use absolute path.", -) # type: Any +) # type: Callable[..., Option] global_options = partial( Option, @@ -589,7 +684,7 @@ global_options = partial( metavar='options', help="Extra global options to be supplied to the setup.py " "call before the install command.", -) # type: Any +) # type: Callable[..., Option] no_clean = partial( Option, @@ -597,7 +692,7 @@ no_clean = partial( action='store_true', default=False, help="Don't clean up build directories." -) # type: Any +) # type: Callable[..., Option] pre = partial( Option, @@ -606,7 +701,7 @@ pre = partial( default=False, help="Include pre-release and development versions. By default, " "pip only finds stable versions.", -) # type: Any +) # type: Callable[..., Option] disable_pip_version_check = partial( Option, @@ -616,7 +711,7 @@ disable_pip_version_check = partial( default=False, help="Don't periodically check PyPI to determine whether a new version " "of pip is available for download. Implied with --no-index.", -) # type: Any +) # type: Callable[..., Option] # Deprecated, Remove later @@ -626,10 +721,11 @@ always_unzip = partial( dest='always_unzip', action='store_true', help=SUPPRESS_HELP, -) # type: Any +) # type: Callable[..., Option] def _merge_hash(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None """Given a value spelled "algo:digest", append the digest to a list pointed to in a dict by the algo name.""" if not parser.values.hashes: @@ -657,7 +753,7 @@ hash = partial( type='string', help="Verify that the package's archive matches this " 'hash before installing. Example: --hash=sha256:abcdef...', -) # type: Any +) # type: Callable[..., Option] require_hashes = partial( @@ -669,7 +765,7 @@ require_hashes = partial( help='Require a hash to check each requirement against, for ' 'repeatable installs. This option is implied when any package in a ' 'requirements file has a --hash option.', -) # type: Any +) # type: Callable[..., Option] ########## @@ -700,7 +796,7 @@ general_group = { disable_pip_version_check, no_color, ] -} +} # type: Dict[str, Any] index_group = { 'name': 'Package Index Options', @@ -709,6 +805,5 @@ index_group = { extra_index_url, no_index, find_links, - process_dependency_links, ] -} +} # type: Dict[str, Any] diff --git a/env/lib/python3.7/site-packages/pip/_internal/cli/main_parser.py b/env/lib/python3.7/site-packages/pip/_internal/cli/main_parser.py index 1774a6b..767f35d 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/cli/main_parser.py +++ b/env/lib/python3.7/site-packages/pip/_internal/cli/main_parser.py @@ -14,11 +14,17 @@ from pip._internal.commands import ( ) from pip._internal.exceptions import CommandError from pip._internal.utils.misc import get_prog +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Tuple, List + __all__ = ["create_main_parser", "parse_command"] def create_main_parser(): + # type: () -> ConfigOptionParser """Creates and returns the main parser for pip's CLI """ @@ -44,7 +50,8 @@ def create_main_parser(): gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser) parser.add_option_group(gen_opts) - parser.main = True # so the help formatter knows + # so the help formatter knows + parser.main = True # type: ignore # create command listing for description command_summaries = get_summaries() @@ -55,6 +62,7 @@ def create_main_parser(): def parse_command(args): + # type: (List[str]) -> Tuple[str, List[str]] parser = create_main_parser() # Note: parser calls disable_interspersed_args(), so the result of this @@ -68,7 +76,7 @@ def parse_command(args): # --version if general_options.version: - sys.stdout.write(parser.version) + sys.stdout.write(parser.version) # type: ignore sys.stdout.write(os.linesep) sys.exit() diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/__init__.py b/env/lib/python3.7/site-packages/pip/_internal/commands/__init__.py index c7d1da3..2e90db3 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/commands/__init__.py +++ b/env/lib/python3.7/site-packages/pip/_internal/commands/__init__.py @@ -20,8 +20,8 @@ from pip._internal.commands.wheel import WheelCommand from pip._internal.utils.typing import MYPY_CHECK_RUNNING if MYPY_CHECK_RUNNING: - from typing import List, Type # noqa: F401 - from pip._internal.cli.base_command import Command # noqa: F401 + from typing import List, Type + from pip._internal.cli.base_command import Command commands_order = [ InstallCommand, diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-37.pyc index 789db495ccf9d00c8ad75500e00c22752eafc743..6b2425ee78ee221aeb0fd1fc8d071549a3180954 100644 GIT binary patch delta 42 xcmbO!JX4t0iI27`3s%Nklizc!0s!^04W$48 delta 42 xcmbO!JX4t0iIzlbV-0%^M-68RlO)4J z7Dk3blW>MYnQ(>*ry4e(Dk~J-S~YAn>}Fu?axu)cT(#V_JYYkB761+5so|>OUdRSC zqzGt8R5(KoYw?mAHXvpxS}|FeX)h!1xlO={U{m}}T18M2sa*(+3PSU_x`xI`^S3G)J$6vi618ul8F6edZAg)EE= zg$Cgag%aTm6;3s*Kvh;Ky0vOpA-eTqF+PDk(JCJcE5RGh@_bAMS1d>m>{% diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc index 308fe904171b1f4614cc7abc50089bf4f9bffbe8..e23fb7a1518689be9a7a0e6352f26c69a900cc36 100644 GIT binary patch delta 2182 zcma)7&u<$=6yDiguh(lkcGCPXl(t(nNxQT*NkdU9N(!Y_LK{j&(h5={cjFm5PS?B6 z>^e#;SCN{Eo_dG|^?+2=(*FQo=!p{&sFxmL51hDgp%M~8;sWojn*49-@g6c zoA=(lc{cv!M9uL=C2HD)U2>%t}^r>x=2vek$7B_C+HWYo5b~)Qi>+Gfa*X!UKB|Mo zJv4SVMx>UstUZX+e)v}(%IG6lA80?0jSv$*4-=6gw9uTm;xjW?VrHqqIdcPXO)-c z%DTHYUS1Mk#`DIDppb{@pB2yIr^HKoA|~sx=00I22ij-!b&@>-Z@Go=GQwf;O`=T> zik6YPycYza>UcKgDlDxyH&GJz>Os|WeSQ$1^d;M+4&y%Wg-4FYLc;hkK148r5(QGS zD1I~+HjpU>^KF>^=Kw9TEb%cw;*SOLro@j>(jr9?C{(5jRUzUEkz74cskTXO5gMoZ zZ7GN?Yw%6HEW=8NRU%p$$WxZf$~kG1+*DeMf2$??OPHS^xtw~C-Uxag65fQ53=jdy ztmO6wnU=CiXyS&<@3juep4MkRhY2kFv(fnu}ciI7REO!p390=w>dq-Dt2kTi;=UHMwK)F-;-X5Dx|}2 zR$V_}HZ7E}2=J%C#OTh#^m70esMCe)NAgW_Q*OyzZILbc!iqZkJTaIZO9|z|Sg71! z>tSrwb{gH8``tM0RQ;gj)#{V?kr*v#lBPCKVhxF>gGsTT${D->@~9rgR%&7cBXA7% zR&l&V+p)~RGoeDu93CjS7^XmKK5QD2h{f1dH1Ri#y&eN`49+@51!a zcS%kW4Tc;ILy?K5YQ%uir>F!5zL#~9BDyS-=J3w$KTBUHqvDVB@WqqB!lOeIgYDOR z{wfGUwd$5VE4J+#sNlKbSpWPSLYG&sfUGU*Js)33w=BZng}DADl8~= z5{6dzWz_xuM#e$?vACM~B#rD4xDK=UEi;-oK>{%Z_-{v#gUVOpLiWzwUmV?`f|p^k z;rcsn&Vgh%Lw{rMiogVDe%&7F9U)||xY#!}^%{~HoCOW;mORQVtvi}Ms1Yl>c8&2# zSa%0?3}jE*-}fCSk+V^uUIK3}qAt?&Bmx%Ub`+!T7H4aAtq$!C!xSntztYW&feS^k z|0yYmv4KNxcABPdufip8eyzl!UKv#aKe1zibo}qyH%90uAqKwFa65cjtPJ+=H*pzd zqf7fLy!cf-8oa%MO`e}Yz>4NrKpYdyF+&`q$#MUk9HSAA--hX8vER=(00_mm zL&GE#KM&nK(mAgO>eYGy`e4AgYdeKTP<8ymb{mD;g&SfmxBnVuCB#~v0ZO>y7&1l$ mkB;s7+*w6ejeff3(T2k&u`l|A06KvI$2SWDF-20cq5KKtGW5v+ delta 1763 zcmZuy%~K;q6rY}%OePdDJ^9{*uS$`we%<}%eg59-&d)dg z8Ec(vX$cGX%RCu)@Ar%Qtts|s|MK!E6Ldijnz3>`6K8@U9JCqjhb)tr5p-1#?Ff3v zkhi5wQfCW-7T*8qjRf=JRl}-g^R`te6|;qsY1F6KuqYF^UXlJ|Y=^G|stM&FsJGRG zRrydPFR0&M4=VkPyTN#3aM3Z+?uwDFmcXs#Ow{FvVlru4<_0i~Q&YWwQ&}?r!u;>x zuA2X_Xsx;ruJecLNcaK@4C8ce^6%AK;^rm(Z=|Ch4{fk`KeAzf$YmmZ{BgL>diY!< z^>zvwo^0AV9c0{ULAXSmpuOgnY|DWjI;kr;OE(R0AcjX6Bpx&1c{=#y1>#6hv6lD` zk>xE3j|xs&osW>X!YZq=RS{PSR~gp;u1ZPzRB(fP!hw1yY%`tR7h%38I@bvqH?$f) zh`7;12Gb;u9JI0^SOaG?MAUG1g#yzhUEWdmgxAr|md?7!K#LyOW}h%0W@X+-5QZ?C zJYh*c5hrDx!08YYMWH4v#~-pip@t?vuCaabfxK{(C8er~o;Z5NlkOWE8uOx5>FhC9 z$53<&&%)zo$#L^`d2QlzGESZpVe@6G3ExUZ_|ujYzu0?GJLMmUitl z*0*3oc~ol!0@0Hf7pCq)lD5js?48NiW})5ZFHOxaK?iLmr&9KmYR;?}jwjlVC$Ht) z6;CnNF$xD%lz|`;P4deNw}|l~lG}d$GzPB_hsp>yk$jBP=|&=mDpOfhiZhwXVw5R( zj*Fe5$Ts^EXkhh2IlCyU!UV52{4MhCp^&h zMGINi$ZUrx&#fBPC`A`#!D#o6@S{c`|g=QPfX!QFH*6blQ7?DI6BXIQ*c*M z@|*f^?fs0U__M^!%r!C=2E(m@mA7?6Q=0LNl0=|j<;n)!#(i_XBgp%%zL&hp{9yh2 zFt5p;gbxjnc?c2l`{W2k|Mmxs^;~%kuRp=$NoA+lY?(^(BX8~el@0N~I(uJjJStAE zYIvck^}OM~C4Mi!)e{%25r0$OgwQX1^1>eqr32GEol5qc;?*R*fHHsbyQ!Tmdi`LW z2=%YuKz@ONDg=ZkQ2vb?lM^6auO*w!n>okH8>X4fp5}!umnI?qM$mr*J$w$qp~hrU zR&k2aL3Kz?sS1r=BrzOOAYrY;3z~MZSh9*Rjb~UylHu!JeJsPj?D|afQhcmC`F^?N z1Jx}_@K&p3`K4KXbJ5B*Ye Ar~m)} diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/download.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/download.cpython-37.pyc index 99ce5e7710c4c53fc9f3a2ee1fb01f4a61a44b51..b7c92f17427c4199de7d1c81dd8c3075c806b602 100644 GIT binary patch delta 668 zcmZ9JL2DC16vs20-Db1xCacy)V@!&slC(w>i#Cl~+Ip}QdMOm7Aj@WVY7)1*>Fh== zL{PkV5rucsOA`d`#e;b8AoUw~5j)G z_~*Pmb@%5-^^Hi{uq*aPJEAXjM!TUdA)$7-pPhuKQX)FmNLUd|ej&r2l%78-CI4wW zbC~fBQohtU+YU9-UE#5a|4zn=w#BZ%H|=NeSK1-turu_W1dxlYC6$&(^(JjzEzPW} zj;jw+Xh-&BYirwiRNAP)f?QG-(KtCS3<>Z=PJDVP3qop=OF_K3?blpKe?Xa6cO8!v zxXLcV2W6jRVRyJdCg8{L5~)CDsi=3xRN{7=#(!VyGXY%%gqfhF$l3 z)7@;&y$4lYy}iuUAWE&eZ&YpSu_^2iqc~>PsCi$vc)!l5=d-%$a~~{+MX_o4wIE_t zJq*|!yi+S0+CFlL(Rui#&T^}hv2=0;1qm^Mm`BKnC8)+$3s*3lMNA{EBPxhn9KlGn zRktnOqBiv@TYz3{{4$O$khw3{<^u{8%YEqBu3=H@zbo@Gw4604#=nsj_!B>UVFOpH zx^CKr=b6;Db$zfTPuMj)w+uJ66q$l`?HtKLPdfpxG?~BdYt7{Rt$ohi!?rsJ6)~7| KKPtobW5omJi?$m8 delta 653 zcmY+BF>ljA6vuOk-MArc5>x_e(}G%45voS1C?P>56oeoWTTzz?$vF0@aq2kE-5FXb zOe`!+Pb^5N$xsQgA&?jfd;=E5UDM^Z&i~zq@zuz8NnJ{jRR3V)AS5 zFFj@-^fwB50`HU~I8ZZ}r#t7Iq@%skNNkW8DncFRN3jw47oEolzN+(vEX@eDGdqZN z3ZwXQ1^>f2XL6v7;?jN`!R*97nTNxPm!t{zl3Va8`9-szZTlV3UxQt3mDJ(AW_9-&^x?JZvREXM;#*x> zj7RZOIZ80vXP7@hMXGUX-E+CHd)=UZ01bWfK|^MvN$R-5YI&5iBKi{&&Ai>F_KxXD zzsV>U%(aE=gDv3-C9p(0N?I+Bf~~`melv@0|Lqdh0xVC}YKv&U5cGo3vjmkp^+T7@ zF7<`UsbCM$sUi$S9ibua!`rFNl`_g3h*d-lQAOO5h|;al^&Hco9u<_`hC=2N*??P_ znd$$pEk_ahk6*}J&SXjdY);XPOnJV8k#Dw zn=Ozcyv{Dn;UJp1zzs^K>&x?f%PZNQdon%vnYHChS96~)I=FBPp(9RPJ608#I$Qn& D9fPqP diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-37.pyc index e8f86b34f975700238da982e02f405bb8e8d7dfa..a429ba1ceb74ced488adda60b8b9c4d16bd4f75a 100644 GIT binary patch delta 53 zcmeAc>lWj2;^pOH0D`>560sY3ir6?(3M=y}4AU|;x3R5bX1q1oluHFjMsfKA$yHp5 E0D6BA5C8xG delta 53 zcmeAc>lWj2;^pOH0D`FbYB3vmir6@k%hU6+N(xOjx3R5bW{jF_%B2D%qqzKmxt5d1iIxt5d1iIER diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/install.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/install.cpython-37.pyc index 0191c194db4422664bc6567129f98cde52a082f6..847ddb330b5cf12ed31c530dbc0b5bce4f607acb 100644 GIT binary patch delta 3799 zcmZWsYit|G5x%`UK1@**B~cGbq;z`NGG$w`?D!Qsj^jrhC5|IMVke4Sn&zG)N~a^W zcT7ZOuS8?lXqqZjvOkJ82~0L<(G&&x5Kt6pQlKpmw5gFFX^WuOUu}y1>c19Ekzbuz zTDI#Rv9r6gv$MOiv)>F~yYvG(a> zMgBsn1Qdp$97DxhfK;NCP}NdA<)UIIbj2kL5oQnte^fiCJflz@rUzE`M-2GRnr@ld z#tU<%J7+Qj2)0ejDCP1CxmnXFI7Y#C+?-{ZbWBcRxaR3c&u3IWa8L^SO_PhIB6CkL zR%98%dO+YEg{7eS{NZtTu{2&Ply=-!vx6>G?B$7>Iq`?qEmgm*;AEwe?44zXVV)!H zsH-GOVkD@tKH%lig7^iY1fa-6k3qv#t|^|*m3hJm*U$i~nit?Y8mawBhB6*X_(_j8^dzj&Q9PsZ9tSjP}7MTClO88p#e2R_gQCJ zk4C<>z8ZX+h%bgyVrTfAxEY=}!nK<225PCgQYT=>Mlapy0l&`;%=d$_jk+o?!l(_< z-CVD$APd~u!1}+!eTRoAoV`dvxoo=>^*}Glg#}5!+BwBBf zBjSzLRL5N-v4>%$D^Q$UBG7i75OJf;iVXpy6^eAT*MHJ(5HckO5(^!^7j@e>nb&!Q z#%Rl`wx)jlJyB0|1#YaVm2UBVV!8^$yJ*{L)Qj_YZ8wjh)!YYothR@?*9lFmLVs5A zTA{Qp@8Yrfy|sOH<+yTr*lXwQ^SjnmMtNJUm4h@<>s;xvubz}Ef8$E+Fz=LCPUau>x?!vx`2VK8UblOMck%!a0q+qW zoDV|X4CN>Xsp@=`rdBt3N%t7AqPK@1xh*n5)3D#GdAlVF<+@1+LF^z;5TjeUjp(E;AyrR-C@KES+Az`Vy7 zsu38fHDK>q#a5qDcp3}{>WQ+ZEnT{((81b4o`%JfJPEQNxkI%l=nzk$%YvF2P;+V_ zvZk{hqIdwHD~Kge(&2@GH{hP;1|PtKUDLclcWC}8KF9~?=2e*MPMuSzlJJZ#8qX-O zbRQ@>BNgoxpLF)e&w~$~tpghKrrJ5EMZBv^q`O+jUjex=7u=~LG^G%0lP1{^9vBO^i1n^-5rmi*c_56B=RyJ5Vv}b!3_50odwP1 zg5x@Vpx}V1{9vA$aD(iOh^4m0Poh}E>#+5-m`oif7sRWnzAEmBwII2OWC2M#5_A++ zLV}LrH*fev7TmyWI7SGfSkZdkWL+rHGM97i4TbC|a)Zz3tTK345;bAq0xvDH#hmNw z^TmQK2GU9LkT{s`jY|t6jI-TH4vLxd7sQ9@N@|E*LIy>08Hu!*iLEJ-?dupq|7*N2 z8(JHI^!Ae~;-DqI(PvC7;%Ind(+w|0fAuv8>(kAR2P54Su5U98h~M^&R&ihcraPYK zH(Q0PS#$!7jSd6vQ+yp1pzU3A5v~v`zxB?HELaGW4fb6WjX`SgLe^!uym=K;H$Sup zsR$%+_jx4jsciofCaBJSQR#ncOeYaFqN*eYS%6OBBut`e9Qr}X2vo=m@D~mQf$D0v zy1w1$RLP1sHh9Hg&*Qqp!AC&BIqnIk%P{hf_1_F`CJ)|#Ci^myuOfLFh##`Rr*OtM zv8Uzi3VRI)U&n5+;8+EFfxRL|hKJ+wiljS!A0_sP=Y~&i|0&9~xH&d!x>>YJc4K)+ zK7WaFnE9}GfP5@I8h)kv0kkS{SK$!zE~%dCX@Ky9x0B;tjVR%&^D=X!8lpHpaEKWi zNb6o;`7qZZ5bgDXT;;(eq|iyl3oQ?G9eXg+?S);nrqcjmcL)M7aO*k%1;m-9qZg~n z@^Kyju|xMM7=`fJP|$Zt^EP=AuSu#2Ni|In;Uo1RsCg6AyaXW&Q73$QC4B-DZ9@V% zW~Z3B=8N`>Rmi)}7z77)4bP8owlcceF+_OFR`QaV*m7!XfW>gAjzrpAI!`#y3T^@L zClhTviXVwLwpiPLh*GILL>l!C=tcm?90X$p+#(JMI;7}g+elHqdOuJ`zk^)34Cuxx zGPh#yq87Xmh6?=VY&LJ@94BvDRyKQg4cPh>6p~AgKx-0;MBs1}_-9C0bv0U565*4!Y<8v$f4xjNJw^rgcOdXEinFtDqwFTKGRZ2nnG*BqTHm2~9}w0fzX* zIWH|6d)E8ibI-qf&$;KG=XcmQukAkB))pr4SBarEri=sIG=K0cVF}iKi?D7ZepAgK zVm++)7ReuGeJly%G*jkCHr0HE{+TvE3UsKn*8C*&CY5i8=cEkx%72HaN1Z@pzzLKG z1u3Vu6<5QtF~klEZCjyaXV$Dleotd**s2%Qi;h{X@ZsjAwojD=@^}UXEycyESu|{r zT#E;3d=w@B6Z2uoJ5EPFV-Cw-bo@M=@d9?eW^kU8uXTPXYh6caUf%8cDm^GC69e?F zq*@|WTrE|~&dMPr3R5i1{Ud}*7A5K~ysrV5FRH;$n{7njdP z$(B-m1*qe0m*@gNcLZsi5S_5z1_AcNZUPVmZ?RrC;mn9m5fClFdqf1wK^WWMofW7R zWqq5iZnyI&()Xp0+}D_5N!U`4bFy(t^uXf1&S}x@Jk~hFQV>r6rsDRMh?`u?i@ww3 zxyx=!q&CV~w|{-qIV)1-tmtI}pfn%`wp4yp^s_-R&`XXGw;xKfMsO58zuio7@u zRd#`8mI7|tc|r_|G)8t)b%&f?<%?oSq}lK$7&}kS5e6nN4PGU%bQ&Bz7VB8|&1%J-7J^4H0Z+zjM;4qSE#Or)}nrxSyVF>>+6cBi`E)*aKnvA(}r zvDU9-X};N(Izq?17Td6Gtn_10RbG2--C3+w3NIKOnKpkIxcr2?(f{#uKag3)3o^qp z9D_gYPx)CG@;${xqqtOn8n0EkW3a;NqG4EewuR5gje#6JCx0?9Vnn=9jT<$c8{7-t zFe?l$#5|aL5nsJf)WHoO0S?b1>_b_XS*ldIQD8>R0E>xJ)+SX>}WRv51@!f{9QB@U)7) zY{<9L=jj#s_w>kvV# z2e@16Lz$5QocnPEjWsZ{y?|*m6Vg-U21LbA$v21g#_?$Gp9E58sM(Hi4&gb3E(FXfUqF}z@Y)_Eu&`WZh7_40XjcAt@FdCu ze(LyPq=PT$R^71WdzmDilwPJk?x(T?WPA)^LI#GPSIbpXULO`$GW-c-K7()(!Oz}R zq%aX)yQA}x;S?NWxmJLvIUbvTX#6_LqyExx@_xPPD12T{j$}FuC=Ef1s}>Zhr>ri> zmq*4A<7T{8vtm2CWf?5rW|<2Gt6GG@$5O7KSc5!amSIiXQ(+?iIFdT@EfmG<#p-Io z;d;?n(2Gl6%QD;yy<~9so{=4xLp_z(E58H6&d7bczS|R4!iqv;ff!(rhBb|bXjpB2 zx~oT_i!wHL{UJ}8nDnTfrJlwxOy3{6`cLbLl2I|%YJBG1=Idh*(PMR7%0XB|SOxG} zET{~$+rpWuSJwFk3crHWplMrXWr?rLzwI84`}y{Z>N}{hM-J~fyYGjn_aN68xSwm> zM3(YEUoik5EMMZ>ZRh0lCL#x9|zpRp8B zII{8coFoL|N-!eg9Qxz`Gp{Q@|EhWjDf`&Eo7;usUh sl|L7(zeWGTg-$?gs#^y9LxiwT%1@@I5(7%g5Z`_D?~*rC<=|7O?R8vb=LOm zn*3<39Et=~6iP=_97>gdsCq)GDplgZ0STc3l|bUeUO?i2kWf_#PQZZ~o2J4SZ0+aw z=6y47-n?(tH*yb-#*ehMMI`z-AEjsR?7S84HVmt};w+DyTfhh-_adIJ`LS|0!hS#EOeRoaUiSVD3;h|gU8kty$!D3VG_#su z=3cxW?-ti6Rv#|L4GiK}#UxhScZrYjTKkeQ#SRo2Gl{IYfw{z);iexuZ|;>9@EjW& z$sM54hxlb;QryL8$H*GhPxs{w@y^A%O5+gSoZ_n+N?lv_d@(7_le@DrzJ~zK{_eDOuwh3tnvJ6*Rgr03pt)AT^|DD!caE>c^K-RA$;$sL zJ=jO|pz|Ds%bTTA{;cU(1!`f||2k?~xCj;$TLp zeAe_x)`3xQ^NkdMZ$D@+nI39gT@w>DYszJWN29!`a|$*zt}0Nxl}Zr*Z$8uE&AoB9 zYjlJaa+4mHyG9~S>LMvrIVR$AgtQtX-NqGNM1&z^`Sw>``-R9+KRp&JnTvCldGH(Z z`W=T-<6;WU)Jp0Vng?pZIah`S8aB=Xv-lv@H#Wg@mUp01Y0N-hu+4|Lwo3RA(eC1S z_xGZN9qFm|BF%qh|MLW^2QZu3h6nn?i0R#fGh_;sMY96DIaCRv2CfD0&QQkBdyYn9Mz5haz603a`^)e$Ej{eJC8o9X-Ep$r z$4sU;#_22r^8>~8fLf57H4ttf&bE57(jMTQOjgwJr_719H<+oFiZv2j(+}Px6I^6y z*^zz!pvRR7bV0{%>={4ox;C(QasXw3*V$ENXw*tKD;3+ZvRa^$4qd3zN}xb_DbT^j zPx`iKt7Q2Vzw6r~R&U?$s|&h?&w8I64wL!+3Si*Z{m0h!^JbMsT+>;Bw|V+V4~@6j z9NRb|%rZm?vY|k&oS%1_DoH@iai~f2<(kL6WP!&-zEh$>xd@ke-ck~WY=7aEtz*K$ zFSdTLc7Zvk7)lJY1VOmqxE}QdHOgix*|uhaN`v6p%U+(^$8NgvNgkyMjni#c#`RZh4wx$bY8$fk%Pyp^2d_qj)%-}u|;Jbsjde@lW&@}&X U0bdI6@c{75ww(5&ku-+?0X)pS^#A|> delta 2014 zcmZ`)>yHyv6rbC9bo$)V?sgw^*OIVcmxruu43Hp?-32xxDiVBE2NK3}0 zII_VmXd)HZ&oogEY&+0bf%1&WdDbv1re&DcOg&pFSSPsa=g2OUt&9rf7SOm?7y)z^ za@1_Mqa*e>>N651b>^USP%@;ar2W#f`1`b!3GO@9J(ai0P_Xjp0(N4}${YJ6)md_2dq zv!e%}i2Q`F@)}F9a#5gT7eQVW|Nd6$E z`!1}cdx4ze zIZzx0lf@L+iS}+%n>8YpJ-krMYU9{Vh6U(;1aUnGC@Z` zGQEq7`w%pSr}jcdcW`b3J+6}gWoRd(kiAzbEmxseJEOYF$y|xUIh43El;>RyOmTPl zpn4WLcf>$yke$7;Db-+DcmKd<@$;a6$b0JUclfaA9-3-yrbzRi)0|a@*J-P;P+IQ5WioCzX_d}zs zDxwd(+kAy|yr$zsQ7ku5u(*u_fW5YuN+!}yQ1%pTobfEqiP<)#lPskP-su)C+o$Uz zJJqPpRyh9gEw=VbFW+`cQ&)DTTSwkXu`j)X)kP)!2y?}U>5Xh!e3!mH@G|Lp{TwEW TZUpFfP#0HMOsa?UxIX+hkD~97 diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/search.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/search.cpython-37.pyc index 34f9dd3c585c169e495e82c2c79e94f736cee11f..aa68e4574e177eb106c52be3560d456c67f78c23 100644 GIT binary patch delta 86 zcmZ3kxLlFPiIF+PDk(JCY|QeROZJv%L1uwod|7HW_g29ggrYXKTt6Mg^y delta 60 zcmcaBa#w`MiIF+PDk(JCT+jNNkuhp>Hv23_Mx)7WoVAQm NlUq2Wf#d_uS^xw)5%B;3 diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-37.pyc index 39d5f41fd686f2c9c06acb0088a6a11e4f4c0bae..4d86357b8f6799e1aa562b1fb7f829bd8f598db4 100644 GIT binary patch delta 924 zcmY*X%}*0S6yMoyKbY=r3!w!81x3Crl&_!yi6)2|Lt>N!HALJLW`LHZl-XSbG7SkP zYD^k27lPPE1AzyVAvoThCE0!b2oLv{GOXJ&qS^+=S$k zBv?X4y#00Sy?7qIu_LMD1ef%p&h_#Mj^T=KI}h?G56j%iJyaN5Ql!@*y~(Nr$m49D&`rx@wsSDuMPT)LFKZKvP@B4xT?RFLQon{|8C`JK*p?q-blsEDD$To= zLtQorf(WB>m<`H&_3r$vd2q~PCTn{#!NwFNsQ@Z$9Ml2k{O zgkh-~imRr08NWVv8`MG1$t+Pn?0BoI8Meia!Z|s}7?!nQXB=mN+O}mKG=MJhjgNu| znlV#CLT*Qw5HU1W3(2kO=ft(zTk?;8Rr^5VVBN#k6_8H@K+WNC|0Wlo>W2OTn|kh) delta 755 zcmYL{&rcIU6vua#?Y7MBYzs}xk3@_7D3n5pfC^C)L=5q!F(_%2P3aEMx-B@f3u3l0 zk%LNXLh|C7)}uG{5AftkV?1fnc=Zo3(US+AK@)cKKKu5)@0;)JWWS~N(`23ytcWXr zn7->C5iNvPpfmIXQhF95dScKEHYX*?j|FjoWJut{XKoFdJtA+(bz6`h!ql1Ysc^I6zzH*Ad=R_&s@$HWL2JW%UtzKu46mYr5={ zVttGAvKwJk_-s?wQg>EcJv$qey4;o{p3VJYk#fG~yY4QVk%PyWm2+*(ua-r^J=l*e z#j%RpRHP#;Z&gDvRfnIkoA>fk8}fN!owmZ?V?-YyhvTwwog37 z;a!j-X~isoga~d5M2Mzpx(L<01g|=l#qajJnUm%I?;A$rlYaqW CQ@$(! diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/check.py b/env/lib/python3.7/site-packages/pip/_internal/commands/check.py index 1be3ec2..801cecc 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/commands/check.py +++ b/env/lib/python3.7/site-packages/pip/_internal/commands/check.py @@ -16,7 +16,7 @@ class CheckCommand(Command): summary = 'Verify installed packages have compatible dependencies.' def run(self, options, args): - package_set = create_package_set_from_installed() + package_set, parsing_probs = create_package_set_from_installed() missing, conflicting = check_package_set(package_set) for project_name in missing: @@ -35,7 +35,7 @@ class CheckCommand(Command): project_name, version, req, dep_name, dep_version, ) - if missing or conflicting: + if missing or conflicting or parsing_probs: return 1 else: logger.info("No broken requirements found.") diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/configuration.py b/env/lib/python3.7/site-packages/pip/_internal/commands/configuration.py index 826c08d..950e205 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/commands/configuration.py +++ b/env/lib/python3.7/site-packages/pip/_internal/commands/configuration.py @@ -6,7 +6,8 @@ from pip._internal.cli.base_command import Command from pip._internal.cli.status_codes import ERROR, SUCCESS from pip._internal.configuration import Configuration, kinds from pip._internal.exceptions import PipError -from pip._internal.locations import venv_config_file +from pip._internal.locations import running_under_virtualenv, site_config_file +from pip._internal.utils.deprecation import deprecated from pip._internal.utils.misc import get_prog logger = logging.getLogger(__name__) @@ -23,7 +24,7 @@ class ConfigurationCommand(Command): set: Set the name=value unset: Unset the value associated with name - If none of --user, --global and --venv are passed, a virtual + If none of --user, --global and --site are passed, a virtual environment configuration file is used if one is active and the file exists. Otherwise, all modifications happen on the to the user file by default. @@ -73,12 +74,23 @@ class ConfigurationCommand(Command): help='Use the user configuration file only' ) + self.cmd_opts.add_option( + '--site', + dest='site_file', + action='store_true', + default=False, + help='Use the current environment configuration file only' + ) + self.cmd_opts.add_option( '--venv', dest='venv_file', action='store_true', default=False, - help='Use the virtualenv configuration file only' + help=( + '[Deprecated] Use the current environment configuration ' + 'file in a virtual environment only' + ) ) self.parser.insert_option_group(0, self.cmd_opts) @@ -127,27 +139,41 @@ class ConfigurationCommand(Command): return SUCCESS def _determine_file(self, options, need_value): - file_options = { - kinds.USER: options.user_file, - kinds.GLOBAL: options.global_file, - kinds.VENV: options.venv_file - } + # Convert legacy venv_file option to site_file or error + if options.venv_file and not options.site_file: + if running_under_virtualenv(): + options.site_file = True + deprecated( + "The --venv option has been deprecated.", + replacement="--site", + gone_in="19.3", + ) + else: + raise PipError( + "Legacy --venv option requires a virtual environment. " + "Use --site instead." + ) - if sum(file_options.values()) == 0: + file_options = [key for key, value in ( + (kinds.USER, options.user_file), + (kinds.GLOBAL, options.global_file), + (kinds.SITE, options.site_file), + ) if value] + + if not file_options: if not need_value: return None - # Default to user, unless there's a virtualenv file. - elif os.path.exists(venv_config_file): - return kinds.VENV + # Default to user, unless there's a site file. + elif os.path.exists(site_config_file): + return kinds.SITE else: return kinds.USER - elif sum(file_options.values()) == 1: - # There's probably a better expression for this. - return [key for key in file_options if file_options[key]][0] + elif len(file_options) == 1: + return file_options[0] raise PipError( "Need exactly one file to operate upon " - "(--user, --venv, --global) to perform." + "(--user, --site, --global) to perform." ) def list_values(self, options, args): diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/download.py b/env/lib/python3.7/site-packages/pip/_internal/commands/download.py index b3f3c6e..a57e4bc 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/commands/download.py +++ b/env/lib/python3.7/site-packages/pip/_internal/commands/download.py @@ -58,6 +58,8 @@ class DownloadCommand(RequirementCommand): cmd_opts.add_option(cmdoptions.require_hashes()) cmd_opts.add_option(cmdoptions.progress_bar()) cmd_opts.add_option(cmdoptions.no_build_isolation()) + cmd_opts.add_option(cmdoptions.use_pep517()) + cmd_opts.add_option(cmdoptions.no_use_pep517()) cmd_opts.add_option( '-d', '--dest', '--destination-dir', '--destination-directory', diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/install.py b/env/lib/python3.7/site-packages/pip/_internal/commands/install.py index 6fc178f..c13da44 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/commands/install.py +++ b/env/lib/python3.7/site-packages/pip/_internal/commands/install.py @@ -30,15 +30,46 @@ from pip._internal.utils.misc import ( from pip._internal.utils.temp_dir import TempDirectory from pip._internal.wheel import WheelBuilder -try: - import wheel -except ImportError: - wheel = None - - logger = logging.getLogger(__name__) +def is_wheel_installed(): + """ + Return whether the wheel package is installed. + """ + try: + import wheel # noqa: F401 + except ImportError: + return False + + return True + + +def build_wheels(builder, pep517_requirements, legacy_requirements, session): + """ + Build wheels for requirements, depending on whether wheel is installed. + """ + # We don't build wheels for legacy requirements if wheel is not installed. + should_build_legacy = is_wheel_installed() + + # Always build PEP 517 requirements + build_failures = builder.build( + pep517_requirements, + session=session, autobuilding=True + ) + + if should_build_legacy: + # We don't care about failures building legacy + # requirements, as we'll fall through to a direct + # install for those. + builder.build( + legacy_requirements, + session=session, autobuilding=True + ) + + return build_failures + + class InstallCommand(RequirementCommand): """ Install packages from: @@ -158,6 +189,8 @@ class InstallCommand(RequirementCommand): cmd_opts.add_option(cmdoptions.ignore_requires_python()) cmd_opts.add_option(cmdoptions.no_build_isolation()) + cmd_opts.add_option(cmdoptions.use_pep517()) + cmd_opts.add_option(cmdoptions.no_use_pep517()) cmd_opts.add_option(cmdoptions.install_options()) cmd_opts.add_option(cmdoptions.global_options()) @@ -314,6 +347,7 @@ class InstallCommand(RequirementCommand): ignore_requires_python=options.ignore_requires_python, ignore_installed=options.ignore_installed, isolated=options.isolated_mode, + use_pep517=options.use_pep517 ) resolver.resolve(requirement_set) @@ -321,20 +355,34 @@ class InstallCommand(RequirementCommand): modifying_pip=requirement_set.has_requirement("pip") ) - # If caching is disabled or wheel is not installed don't - # try to build wheels. - if wheel and options.cache_dir: - # build wheels before install. - wb = WheelBuilder( - finder, preparer, wheel_cache, - build_options=[], global_options=[], - ) - # Ignore the result: a failed wheel will be - # installed from the sdist/vcs whatever. - wb.build( - requirement_set.requirements.values(), - session=session, autobuilding=True - ) + # Consider legacy and PEP517-using requirements separately + legacy_requirements = [] + pep517_requirements = [] + for req in requirement_set.requirements.values(): + if req.use_pep517: + pep517_requirements.append(req) + else: + legacy_requirements.append(req) + + wheel_builder = WheelBuilder( + finder, preparer, wheel_cache, + build_options=[], global_options=[], + ) + + build_failures = build_wheels( + builder=wheel_builder, + pep517_requirements=pep517_requirements, + legacy_requirements=legacy_requirements, + session=session, + ) + + # If we're using PEP 517, we cannot do a direct install + # so we fail here. + if build_failures: + raise InstallationError( + "Could not build wheels for {} which use" + " PEP 517 and cannot be installed directly".format( + ", ".join(r.name for r in build_failures))) to_install = resolver.get_installation_order( requirement_set @@ -472,7 +520,11 @@ class InstallCommand(RequirementCommand): ) def _warn_about_conflicts(self, to_install): - package_set, _dep_info = check_install_conflicts(to_install) + try: + package_set, _dep_info = check_install_conflicts(to_install) + except Exception: + logger.error("Error checking for conflicts.", exc_info=True) + return missing, conflicting = _dep_info # NOTE: There is some duplication here from pip check diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/list.py b/env/lib/python3.7/site-packages/pip/_internal/commands/list.py index c6eeca7..d70782d 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/commands/list.py +++ b/env/lib/python3.7/site-packages/pip/_internal/commands/list.py @@ -118,7 +118,6 @@ class ListCommand(Command): index_urls=index_urls, allow_all_prereleases=options.pre, trusted_hosts=options.trusted_hosts, - process_dependency_links=options.process_dependency_links, session=session, ) @@ -134,14 +133,18 @@ class ListCommand(Command): include_editables=options.include_editable, ) + # get_not_required must be called firstly in order to find and + # filter out all dependencies correctly. Otherwise a package + # can't be identified as requirement because some parent packages + # could be filtered out before. + if options.not_required: + packages = self.get_not_required(packages, options) + if options.outdated: packages = self.get_outdated(packages, options) elif options.uptodate: packages = self.get_uptodate(packages, options) - if options.not_required: - packages = self.get_not_required(packages, options) - self.output_package_listing(packages, options) def get_outdated(self, packages, options): @@ -168,16 +171,8 @@ class ListCommand(Command): logger.debug('Ignoring indexes: %s', ','.join(index_urls)) index_urls = [] - dependency_links = [] - for dist in packages: - if dist.has_metadata('dependency_links.txt'): - dependency_links.extend( - dist.get_metadata_lines('dependency_links.txt'), - ) - with self._build_session(options) as session: finder = self._build_package_finder(options, index_urls, session) - finder.add_dependency_links(dependency_links) for dist in packages: typ = 'unknown' @@ -187,10 +182,11 @@ class ListCommand(Command): all_candidates = [candidate for candidate in all_candidates if not candidate.version.is_prerelease] - if not all_candidates: + evaluator = finder.candidate_evaluator + best_candidate = evaluator.get_best_candidate(all_candidates) + if best_candidate is None: continue - best_candidate = max(all_candidates, - key=finder._candidate_sort_key) + remote_version = best_candidate.version if best_candidate.location.is_wheel: typ = 'wheel' diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/show.py b/env/lib/python3.7/site-packages/pip/_internal/commands/show.py index f92c9bc..a18a902 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/commands/show.py +++ b/env/lib/python3.7/site-packages/pip/_internal/commands/show.py @@ -2,7 +2,7 @@ from __future__ import absolute_import import logging import os -from email.parser import FeedParser # type: ignore +from email.parser import FeedParser from pip._vendor import pkg_resources from pip._vendor.packaging.utils import canonicalize_name diff --git a/env/lib/python3.7/site-packages/pip/_internal/commands/wheel.py b/env/lib/python3.7/site-packages/pip/_internal/commands/wheel.py index 9c1f149..cd72a3d 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/commands/wheel.py +++ b/env/lib/python3.7/site-packages/pip/_internal/commands/wheel.py @@ -67,6 +67,8 @@ class WheelCommand(RequirementCommand): help="Extra arguments to be supplied to 'setup.py bdist_wheel'.", ) cmd_opts.add_option(cmdoptions.no_build_isolation()) + cmd_opts.add_option(cmdoptions.use_pep517()) + cmd_opts.add_option(cmdoptions.no_use_pep517()) cmd_opts.add_option(cmdoptions.constraints()) cmd_opts.add_option(cmdoptions.editable()) cmd_opts.add_option(cmdoptions.requirements()) @@ -157,6 +159,7 @@ class WheelCommand(RequirementCommand): ignore_requires_python=options.ignore_requires_python, ignore_installed=True, isolated=options.isolated_mode, + use_pep517=options.use_pep517 ) resolver.resolve(requirement_set) @@ -167,10 +170,10 @@ class WheelCommand(RequirementCommand): global_options=options.global_options or [], no_clean=options.no_clean, ) - wheels_built_successfully = wb.build( + build_failures = wb.build( requirement_set.requirements.values(), session=session, ) - if not wheels_built_successfully: + if len(build_failures) != 0: raise CommandError( "Failed to build one or more wheels" ) diff --git a/env/lib/python3.7/site-packages/pip/_internal/configuration.py b/env/lib/python3.7/site-packages/pip/_internal/configuration.py index fe6df9b..b199fa7 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/configuration.py +++ b/env/lib/python3.7/site-packages/pip/_internal/configuration.py @@ -15,21 +15,19 @@ import locale import logging import os -from pip._vendor import six from pip._vendor.six.moves import configparser from pip._internal.exceptions import ( ConfigurationError, ConfigurationFileCouldNotBeLoaded, ) from pip._internal.locations import ( - legacy_config_file, new_config_file, running_under_virtualenv, - site_config_files, venv_config_file, + global_config_files, legacy_config_file, new_config_file, site_config_file, ) from pip._internal.utils.misc import ensure_dir, enum from pip._internal.utils.typing import MYPY_CHECK_RUNNING if MYPY_CHECK_RUNNING: - from typing import ( # noqa: F401 + from typing import ( Any, Dict, Iterable, List, NewType, Optional, Tuple ) @@ -59,7 +57,7 @@ def _disassemble_key(name): kinds = enum( USER="user", # User Specific GLOBAL="global", # System Wide - VENV="venv", # Virtual Environment Specific + SITE="site", # [Virtual] Environment Specific ENV="env", # from PIP_CONFIG_FILE ENV_VAR="env-var", # from Environment Variables ) @@ -83,7 +81,7 @@ class Configuration(object): # type: (bool, Kind) -> None super(Configuration, self).__init__() - _valid_load_only = [kinds.USER, kinds.GLOBAL, kinds.VENV, None] + _valid_load_only = [kinds.USER, kinds.GLOBAL, kinds.SITE, None] if load_only not in _valid_load_only: raise ConfigurationError( "Got invalid value for load_only - should be one of {}".format( @@ -95,7 +93,7 @@ class Configuration(object): # The order here determines the override order. self._override_order = [ - kinds.GLOBAL, kinds.USER, kinds.VENV, kinds.ENV, kinds.ENV_VAR + kinds.GLOBAL, kinds.USER, kinds.SITE, kinds.ENV, kinds.ENV_VAR ] self._ignore_env_names = ["version", "help"] @@ -188,7 +186,7 @@ class Configuration(object): # name removed from parser, section may now be empty section_iter = iter(parser.items(section)) try: - val = six.next(section_iter) + val = next(section_iter) except StopIteration: val = None @@ -205,7 +203,7 @@ class Configuration(object): def save(self): # type: () -> None - """Save the currentin-memory state. + """Save the current in-memory state. """ self._ensure_have_load_only() @@ -216,7 +214,7 @@ class Configuration(object): ensure_dir(os.path.dirname(fname)) with open(fname, "w") as f: - parser.write(f) # type: ignore + parser.write(f) # # Private routines @@ -352,7 +350,7 @@ class Configuration(object): yield kinds.ENV, [] # at the base we have any global configuration - yield kinds.GLOBAL, list(site_config_files) + yield kinds.GLOBAL, list(global_config_files) # per-user configuration next should_load_user_config = not self.isolated and not ( @@ -363,8 +361,7 @@ class Configuration(object): yield kinds.USER, [legacy_config_file, new_config_file] # finally virtualenv configuration first trumping others - if running_under_virtualenv(): - yield kinds.VENV, [venv_config_file] + yield kinds.SITE, [site_config_file] def _get_parser_to_modify(self): # type: () -> Tuple[str, RawConfigParser] diff --git a/env/lib/python3.7/site-packages/pip/_internal/download.py b/env/lib/python3.7/site-packages/pip/_internal/download.py index 96f3b65..2683cf0 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/download.py +++ b/env/lib/python3.7/site-packages/pip/_internal/download.py @@ -26,7 +26,6 @@ from pip._vendor.requests.utils import get_netrc_auth from pip._vendor.six.moves import xmlrpc_client # type: ignore 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.six.moves.urllib.parse import unquote as urllib_unquote from pip._vendor.urllib3.util import IS_PYOPENSSL import pip @@ -36,17 +35,24 @@ from pip._internal.models.index import PyPI from pip._internal.utils.encoding import auto_decode from pip._internal.utils.filesystem import check_path_owner from pip._internal.utils.glibc import libc_ver -from pip._internal.utils.logging import indent_log from pip._internal.utils.misc import ( - ARCHIVE_EXTENSIONS, ask_path_exists, backup_dir, call_subprocess, consume, - display_path, format_size, get_installed_version, rmtree, splitext, - unpack_file, + ARCHIVE_EXTENSIONS, ask_path_exists, backup_dir, consume, display_path, + format_size, get_installed_version, rmtree, split_auth_from_netloc, + splitext, unpack_file, ) -from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING from pip._internal.utils.ui import DownloadProgressProvider from pip._internal.vcs import vcs +if MYPY_CHECK_RUNNING: + from typing import ( + Optional, Tuple, Dict, IO, Text, Union + ) + from pip._internal.models.link import Link + from pip._internal.utils.hashes import Hashes + from pip._internal.vcs import AuthInfo + try: import ssl # noqa except ImportError: @@ -64,6 +70,34 @@ __all__ = ['get_file_content', logger = logging.getLogger(__name__) +# These are environment variables present when running under various +# CI systems. For each variable, some CI systems that use the variable +# are indicated. The collection was chosen so that for each of a number +# of popular systems, at least one of the environment variables is used. +# This list is used to provide some indication of and lower bound for +# CI traffic to PyPI. Thus, it is okay if the list is not comprehensive. +# For more background, see: https://github.com/pypa/pip/issues/5499 +CI_ENVIRONMENT_VARIABLES = ( + # Azure Pipelines + 'BUILD_BUILDID', + # Jenkins + 'BUILD_ID', + # AppVeyor, CircleCI, Codeship, Gitlab CI, Shippable, Travis CI + 'CI', +) + + +def looks_like_ci(): + # type: () -> bool + """ + Return whether it looks like pip is running under CI. + """ + # We don't use the method of checking for a tty (e.g. using isatty()) + # because some CI systems mimic a tty (e.g. Travis CI). Thus that + # method doesn't provide definitive information in either direction. + return any(name in os.environ for name in CI_ENVIRONMENT_VARIABLES) + + def user_agent(): """ Return a string representing the user agent. @@ -127,6 +161,16 @@ def user_agent(): if setuptools_version is not None: data["setuptools_version"] = setuptools_version + # Use None rather than False so as not to give the impression that + # pip knows it is not being run under CI. Rather, it is a null or + # inconclusive result. Also, we include some value rather than no + # value to make it easier to know that the check has been run. + data["ci"] = True if looks_like_ci() else None + + user_data = os.environ.get("PIP_USER_AGENT_USER_DATA") + if user_data is not None: + data["user_data"] = user_data + return "{data[installer][name]}/{data[installer][version]} {json}".format( data=data, json=json.dumps(data, separators=(",", ":"), sort_keys=True), @@ -136,14 +180,15 @@ def user_agent(): class MultiDomainBasicAuth(AuthBase): def __init__(self, prompting=True): + # type: (bool) -> None self.prompting = prompting - self.passwords = {} + self.passwords = {} # type: Dict[str, AuthInfo] def __call__(self, req): parsed = urllib_parse.urlparse(req.url) - # Get the netloc without any embedded credentials - netloc = parsed.netloc.rsplit("@", 1)[-1] + # Split the credentials from the netloc. + netloc, url_user_password = split_auth_from_netloc(parsed.netloc) # Set the url of the request to the url without any credentials req.url = urllib_parse.urlunparse(parsed[:1] + (netloc,) + parsed[2:]) @@ -151,9 +196,9 @@ class MultiDomainBasicAuth(AuthBase): # Use any stored credentials that we have for this netloc username, password = self.passwords.get(netloc, (None, None)) - # Extract credentials embedded in the url if we have none stored + # Use the credentials embedded in the url if we have none stored if username is None: - username, password = self.parse_credentials(parsed.netloc) + username, password = url_user_password # Get creds from netrc if we still don't have them if username is None and password is None: @@ -199,6 +244,7 @@ class MultiDomainBasicAuth(AuthBase): # Add our new username and password to the request req = HTTPBasicAuth(username or "", password or "")(resp.request) + req.register_hook("response", self.warn_on_401) # Send our new request new_resp = resp.connection.send(req, **kwargs) @@ -206,14 +252,11 @@ class MultiDomainBasicAuth(AuthBase): return new_resp - def parse_credentials(self, netloc): - if "@" in netloc: - userinfo = netloc.rsplit("@", 1)[0] - if ":" in userinfo: - user, pwd = userinfo.split(":", 1) - return (urllib_unquote(user), urllib_unquote(pwd)) - return urllib_unquote(userinfo), None - return None, None + def warn_on_401(self, resp, **kwargs): + # warn user that they provided incorrect credentials + if resp.status_code == 401: + logger.warning('401 Error, Credentials not correct for %s', + resp.request.url) class LocalFSAdapter(BaseAdapter): @@ -324,7 +367,7 @@ class InsecureHTTPAdapter(HTTPAdapter): class PipSession(requests.Session): - timeout = None + timeout = None # type: Optional[int] def __init__(self, *args, **kwargs): retries = kwargs.pop("retries", 0) @@ -397,6 +440,7 @@ class PipSession(requests.Session): def get_file_content(url, comes_from=None, session=None): + # type: (str, Optional[str], Optional[PipSession]) -> Tuple[str, Text] """Gets the content of a file; it may be a filename, file: URL, or http: URL. Returns (location, content). Content is unicode. @@ -447,6 +491,7 @@ _url_slash_drive_re = re.compile(r'/*([a-z])\|', re.I) def is_url(name): + # type: (Union[str, Text]) -> bool """Returns true if the name looks like a URL""" if ':' not in name: return False @@ -455,6 +500,7 @@ def is_url(name): def url_to_path(url): + # type: (str) -> str """ Convert a file: URL to a path. """ @@ -463,15 +509,24 @@ def url_to_path(url): _, netloc, path, _, _ = urllib_parse.urlsplit(url) - # if we have a UNC path, prepend UNC share notation - if netloc: + if not netloc or netloc == 'localhost': + # According to RFC 8089, same as empty authority. + netloc = '' + elif sys.platform == 'win32': + # If we have a UNC path, prepend UNC share notation. netloc = '\\\\' + netloc + else: + raise ValueError( + 'non-local file URIs are not supported on this platform: %r' + % url + ) path = urllib_request.url2pathname(netloc + path) return path def path_to_url(path): + # type: (Union[str, Text]) -> str """ Convert a path to a file: URL. The path will be made absolute and have quoted path parts. @@ -482,6 +537,7 @@ def path_to_url(path): def is_archive_file(name): + # type: (str) -> bool """Return True if `name` is a considered as an archive file.""" ext = splitext(name)[1].lower() if ext in ARCHIVE_EXTENSIONS: @@ -502,14 +558,17 @@ def _get_used_vcs_backend(link): def is_vcs_url(link): + # type: (Link) -> bool return bool(_get_used_vcs_backend(link)) def is_file_url(link): + # type: (Link) -> bool return link.url.lower().startswith('file:') def is_dir_url(link): + # type: (Link) -> bool """Return whether a file:// Link points to a directory. ``link`` must not have any other scheme but file://. Call is_file_url() @@ -524,7 +583,14 @@ def _progress_indicator(iterable, *args, **kwargs): return iterable -def _download_url(resp, link, content_file, hashes, progress_bar): +def _download_url( + resp, # type: Response + link, # type: Link + content_file, # type: IO + hashes, # type: Hashes + progress_bar # type: str +): + # type: (...) -> None try: total_length = int(resp.headers['content-length']) except (ValueError, KeyError, TypeError): @@ -646,8 +712,15 @@ def _copy_file(filename, location, link): logger.info('Saved %s', display_path(download_location)) -def unpack_http_url(link, location, download_dir=None, - session=None, hashes=None, progress_bar="on"): +def unpack_http_url( + link, # type: Link + location, # type: str + download_dir=None, # type: Optional[str] + session=None, # type: Optional[PipSession] + hashes=None, # type: Optional[Hashes] + progress_bar="on" # type: str +): + # type: (...) -> None if session is None: raise TypeError( "unpack_http_url() missing 1 required keyword argument: 'session'" @@ -684,7 +757,13 @@ def unpack_http_url(link, location, download_dir=None, os.unlink(from_path) -def unpack_file_url(link, location, download_dir=None, hashes=None): +def unpack_file_url( + link, # type: Link + location, # type: str + download_dir=None, # type: Optional[str] + hashes=None # type: Optional[Hashes] +): + # type: (...) -> None """Unpack link into location. If download_dir is provided and link points to a file, make a copy @@ -732,42 +811,6 @@ def unpack_file_url(link, location, download_dir=None, hashes=None): _copy_file(from_path, download_dir, link) -def _copy_dist_from_dir(link_path, location): - """Copy distribution files in `link_path` to `location`. - - Invoked when user requests to install a local directory. E.g.: - - pip install . - pip install ~/dev/git-repos/python-prompt-toolkit - - """ - - # Note: This is currently VERY SLOW if you have a lot of data in the - # directory, because it copies everything with `shutil.copytree`. - # What it should really do is build an sdist and install that. - # See https://github.com/pypa/pip/issues/2195 - - if os.path.isdir(location): - rmtree(location) - - # build an sdist - setup_py = 'setup.py' - sdist_args = [sys.executable] - sdist_args.append('-c') - sdist_args.append(SETUPTOOLS_SHIM % setup_py) - sdist_args.append('sdist') - sdist_args += ['--dist-dir', location] - logger.info('Running setup.py sdist for %s', link_path) - - with indent_log(): - call_subprocess(sdist_args, cwd=link_path, show_stdout=False) - - # unpack sdist into `location` - sdist = os.path.join(location, os.listdir(location)[0]) - logger.info('Unpacking sdist %s into %s', sdist, location) - unpack_file(sdist, location, content_type=None, link=None) - - class PipXmlrpcTransport(xmlrpc_client.Transport): """Provide a `xmlrpclib.Transport` implementation via a `PipSession` object. @@ -797,9 +840,16 @@ class PipXmlrpcTransport(xmlrpc_client.Transport): raise -def unpack_url(link, location, download_dir=None, - only_download=False, session=None, hashes=None, - progress_bar="on"): +def unpack_url( + link, # type: Optional[Link] + location, # type: Optional[str] + download_dir=None, # type: Optional[str] + only_download=False, # type: bool + session=None, # type: Optional[PipSession] + hashes=None, # type: Optional[Hashes] + progress_bar="on" # type: str +): + # type: (...) -> None """Unpack link. If link is a VCS link: if only_download, export into download_dir and ignore location @@ -839,7 +889,14 @@ def unpack_url(link, location, download_dir=None, write_delete_marker_file(location) -def _download_http_url(link, session, temp_dir, hashes, progress_bar): +def _download_http_url( + link, # type: Link + session, # type: PipSession + temp_dir, # type: str + hashes, # type: Hashes + progress_bar # type: str +): + # type: (...) -> Tuple[str, str] """Download link url into temp_dir using provided session""" target_url = link.url.split('#', 1)[0] try: @@ -899,6 +956,7 @@ def _download_http_url(link, session, temp_dir, hashes, progress_bar): def _check_download_dir(link, download_dir, hashes): + # type: (Link, str, Hashes) -> Optional[str] """ Check download_dir for previously downloaded file with correct hash If a correct file is found return its path else None """ diff --git a/env/lib/python3.7/site-packages/pip/_internal/exceptions.py b/env/lib/python3.7/site-packages/pip/_internal/exceptions.py index f1ca6f3..7b291a1 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/exceptions.py +++ b/env/lib/python3.7/site-packages/pip/_internal/exceptions.py @@ -5,6 +5,12 @@ from itertools import chain, groupby, repeat from pip._vendor.six import iteritems +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional + from pip._internal.req.req_install import InstallRequirement + class PipError(Exception): """Base pip exception""" @@ -96,7 +102,7 @@ class HashError(InstallationError): typically available earlier. """ - req = None + req = None # type: Optional[InstallRequirement] head = '' def body(self): diff --git a/env/lib/python3.7/site-packages/pip/_internal/index.py b/env/lib/python3.7/site-packages/pip/_internal/index.py index 8c2f24f..ff614b3 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/index.py +++ b/env/lib/python3.7/site-packages/pip/_internal/index.py @@ -16,7 +16,7 @@ from pip._vendor.distlib.compat import unescape from pip._vendor.packaging import specifiers from pip._vendor.packaging.utils import canonicalize_name from pip._vendor.packaging.version import parse as parse_version -from pip._vendor.requests.exceptions import SSLError +from pip._vendor.requests.exceptions import HTTPError, RetryError, SSLError from pip._vendor.six.moves.urllib import parse as urllib_parse from pip._vendor.six.moves.urllib import request as urllib_request @@ -31,16 +31,33 @@ from pip._internal.models.index import PyPI from pip._internal.models.link import Link from pip._internal.pep425tags import get_supported from pip._internal.utils.compat import ipaddress -from pip._internal.utils.deprecation import deprecated from pip._internal.utils.logging import indent_log from pip._internal.utils.misc import ( - ARCHIVE_EXTENSIONS, SUPPORTED_EXTENSIONS, normalize_path, - remove_auth_from_url, + ARCHIVE_EXTENSIONS, SUPPORTED_EXTENSIONS, WHEEL_EXTENSION, normalize_path, + redact_password_from_url, ) from pip._internal.utils.packaging import check_requires_python -from pip._internal.wheel import Wheel, wheel_ext +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.wheel import Wheel -__all__ = ['FormatControl', 'PackageFinder'] +if MYPY_CHECK_RUNNING: + from logging import Logger + from typing import ( + Tuple, Optional, Any, List, Union, Callable, Set, Sequence, + Iterable, MutableMapping + ) + from pip._vendor.packaging.version import _BaseVersion + from pip._vendor.requests import Response + from pip._internal.pep425tags import Pep425Tag + from pip._internal.req import InstallRequirement + from pip._internal.download import PipSession + + SecureOrigin = Tuple[str, str, Optional[str]] + BuildTag = Tuple[Any, ...] # either empty tuple or Tuple[int, str] + CandidateSortingKey = Tuple[int, _BaseVersion, BuildTag, Optional[int]] + + +__all__ = ['FormatControl', 'FoundCandidates', 'PackageFinder'] SECURE_ORIGINS = [ @@ -53,126 +70,329 @@ SECURE_ORIGINS = [ ("file", "*", None), # ssh is always secure. ("ssh", "*", "*"), -] +] # type: List[SecureOrigin] logger = logging.getLogger(__name__) -def _get_content_type(url, session): - """Get the Content-Type of the given url, using a HEAD request""" +def _match_vcs_scheme(url): + # type: (str) -> Optional[str] + """Look for VCS schemes in the URL. + + Returns the matched VCS scheme, or None if there's no match. + """ + from pip._internal.vcs import VcsSupport + for scheme in VcsSupport.schemes: + if url.lower().startswith(scheme) and url[len(scheme)] in '+:': + return scheme + return None + + +def _is_url_like_archive(url): + # type: (str) -> bool + """Return whether the URL looks like an archive. + """ + filename = Link(url).filename + for bad_ext in ARCHIVE_EXTENSIONS: + if filename.endswith(bad_ext): + return True + return False + + +class _NotHTML(Exception): + def __init__(self, content_type, request_desc): + # type: (str, str) -> None + super(_NotHTML, self).__init__(content_type, request_desc) + self.content_type = content_type + self.request_desc = request_desc + + +def _ensure_html_header(response): + # type: (Response) -> None + """Check the Content-Type header to ensure the response contains HTML. + + Raises `_NotHTML` if the content type is not text/html. + """ + content_type = response.headers.get("Content-Type", "") + if not content_type.lower().startswith("text/html"): + raise _NotHTML(content_type, response.request.method) + + +class _NotHTTP(Exception): + pass + + +def _ensure_html_response(url, session): + # type: (str, PipSession) -> None + """Send a HEAD request to the URL, and ensure the response contains HTML. + + Raises `_NotHTTP` if the URL is not available for a HEAD request, or + `_NotHTML` if the content type is not text/html. + """ scheme, netloc, path, query, fragment = urllib_parse.urlsplit(url) if scheme not in {'http', 'https'}: - # FIXME: some warning or something? - # assertion error? - return '' + raise _NotHTTP() resp = session.head(url, allow_redirects=True) resp.raise_for_status() - return resp.headers.get("Content-Type", "") + _ensure_html_header(resp) -def _handle_get_page_fail(link, reason, url, meth=None): +def _get_html_response(url, session): + # type: (str, PipSession) -> Response + """Access an HTML page with GET, and return the response. + + This consists of three parts: + + 1. If the URL looks suspiciously like an archive, send a HEAD first to + check the Content-Type is HTML, to avoid downloading a large file. + Raise `_NotHTTP` if the content type cannot be determined, or + `_NotHTML` if it is not HTML. + 2. Actually perform the request. Raise HTTP exceptions on network failures. + 3. Check the Content-Type header to make sure we got HTML, and raise + `_NotHTML` otherwise. + """ + if _is_url_like_archive(url): + _ensure_html_response(url, session=session) + + logger.debug('Getting page %s', redact_password_from_url(url)) + + resp = session.get( + url, + headers={ + "Accept": "text/html", + # We don't want to blindly returned cached data for + # /simple/, because authors generally expecting that + # twine upload && pip install will function, but if + # they've done a pip install in the last ~10 minutes + # it won't. Thus by setting this to zero we will not + # blindly use any cached data, however the benefit of + # using max-age=0 instead of no-cache, is that we will + # still support conditional requests, so we will still + # minimize traffic sent in cases where the page hasn't + # changed at all, we will just always incur the round + # trip for the conditional GET now instead of only + # once per 10 minutes. + # For more information, please see pypa/pip#5670. + "Cache-Control": "max-age=0", + }, + ) + 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. + _ensure_html_header(resp) + + return resp + + +def _handle_get_page_fail( + link, # type: Link + reason, # type: Union[str, Exception] + meth=None # type: Optional[Callable[..., None]] +): + # type: (...) -> None if meth is None: meth = logger.debug meth("Could not fetch URL %s: %s - skipping", link, reason) def _get_html_page(link, session=None): + # type: (Link, Optional[PipSession]) -> Optional[HTMLPage] if session is None: raise TypeError( "_get_html_page() missing 1 required keyword argument: 'session'" ) - url = link.url - url = url.split('#', 1)[0] + url = link.url.split('#', 1)[0] # Check for VCS schemes that do not support lookup as web pages. - from pip._internal.vcs import VcsSupport - for scheme in VcsSupport.schemes: - if url.lower().startswith(scheme) and url[len(scheme)] in '+:': - logger.debug('Cannot look at %s URL %s', scheme, link) - return None + vcs_scheme = _match_vcs_scheme(url) + if vcs_scheme: + logger.debug('Cannot look at %s URL %s', vcs_scheme, link) + return None + + # Tack index.html onto file:// URLs that point to directories + scheme, _, path, _, _, _ = urllib_parse.urlparse(url) + if (scheme == 'file' and os.path.isdir(urllib_request.url2pathname(path))): + # add trailing slash if not present so urljoin doesn't trim + # final segment + if not url.endswith('/'): + url += '/' + url = urllib_parse.urljoin(url, 'index.html') + logger.debug(' file: URL is directory, getting %s', url) try: - filename = link.filename - for bad_ext in ARCHIVE_EXTENSIONS: - if filename.endswith(bad_ext): - content_type = _get_content_type(url, session=session) - if content_type.lower().startswith('text/html'): - break - else: - logger.debug( - 'Skipping page %s because of Content-Type: %s', - link, - content_type, - ) - return - - logger.debug('Getting page %s', url) - - # Tack index.html onto file:// URLs that point to directories - (scheme, netloc, path, params, query, fragment) = \ - urllib_parse.urlparse(url) - if (scheme == 'file' and - os.path.isdir(urllib_request.url2pathname(path))): - # add trailing slash if not present so urljoin doesn't trim - # final segment - if not url.endswith('/'): - url += '/' - url = urllib_parse.urljoin(url, 'index.html') - logger.debug(' file: URL is directory, getting %s', url) - - resp = session.get( - url, - headers={ - "Accept": "text/html", - # We don't want to blindly returned cached data for - # /simple/, because authors generally expecting that - # twine upload && pip install will function, but if - # they've done a pip install in the last ~10 minutes - # it won't. Thus by setting this to zero we will not - # blindly use any cached data, however the benefit of - # using max-age=0 instead of no-cache, is that we will - # still support conditional requests, so we will still - # minimize traffic sent in cases where the page hasn't - # changed at all, we will just always incur the round - # trip for the conditional GET now instead of only - # once per 10 minutes. - # For more information, please see pypa/pip#5670. - "Cache-Control": "max-age=0", - }, + resp = _get_html_response(url, session=session) + except _NotHTTP: + logger.debug( + 'Skipping page %s because it looks like an archive, and cannot ' + 'be checked by HEAD.', link, ) - 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. - content_type = resp.headers.get('Content-Type', 'unknown') - if not content_type.lower().startswith("text/html"): - logger.debug( - 'Skipping page %s because of Content-Type: %s', - link, - content_type, - ) - return - - inst = HTMLPage(resp.content, resp.url, resp.headers) - except requests.HTTPError as exc: - _handle_get_page_fail(link, exc, url) + except _NotHTML as exc: + logger.debug( + 'Skipping page %s because the %s request got Content-Type: %s', + link, exc.request_desc, exc.content_type, + ) + except HTTPError as exc: + _handle_get_page_fail(link, exc) + except RetryError as exc: + _handle_get_page_fail(link, exc) except SSLError as exc: reason = "There was a problem confirming the ssl certificate: " reason += str(exc) - _handle_get_page_fail(link, reason, url, meth=logger.info) + _handle_get_page_fail(link, reason, meth=logger.info) except requests.ConnectionError as exc: - _handle_get_page_fail(link, "connection error: %s" % exc, url) + _handle_get_page_fail(link, "connection error: %s" % exc) except requests.Timeout: - _handle_get_page_fail(link, "timed out", url) + _handle_get_page_fail(link, "timed out") else: - return inst + return HTMLPage(resp.content, resp.url, resp.headers) + return None + + +class CandidateEvaluator(object): + + def __init__( + self, + valid_tags, # type: List[Pep425Tag] + prefer_binary=False # type: bool + + ): + # type: (...) -> None + self._prefer_binary = prefer_binary + self._valid_tags = valid_tags + + def is_wheel_supported(self, wheel): + # type: (Wheel) -> bool + return wheel.supported(self._valid_tags) + + def _sort_key(self, candidate): + # type: (InstallationCandidate) -> CandidateSortingKey + """ + Function used to generate link sort key for link tuples. + The greater the return value, the more preferred it is. + 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(self._valid_tags) + 3. source archives + If prefer_binary was set, then all wheels are sorted above sources. + Note: it was considered to embed this logic into the Link + comparison operators, but then different sdist links + with the same version, would have to be considered equal + """ + support_num = len(self._valid_tags) + build_tag = tuple() # type: BuildTag + binary_preference = 0 + if candidate.location.is_wheel: + # can raise InvalidWheelFilename + wheel = Wheel(candidate.location.filename) + 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 + ) + if self._prefer_binary: + binary_preference = 1 + pri = -(wheel.support_index_min(self._valid_tags)) + if wheel.build_tag is not None: + match = re.match(r'^(\d+)(.*)$', wheel.build_tag) + build_tag_groups = match.groups() + build_tag = (int(build_tag_groups[0]), build_tag_groups[1]) + else: # sdist + pri = -(support_num) + return (binary_preference, candidate.version, build_tag, pri) + + def get_best_candidate(self, candidates): + # type: (List[InstallationCandidate]) -> InstallationCandidate + """ + Return the best candidate per the instance's sort order, or None if + no candidates are given. + """ + if not candidates: + return None + + return max(candidates, key=self._sort_key) + + +class FoundCandidates(object): + """A collection of candidates, returned by `PackageFinder.find_candidates`. + + This class is only intended to be instantiated by PackageFinder through + the `from_specifier()` constructor. + + Arguments: + + * `candidates`: A sequence of all available candidates found. + * `specifier`: Specifier to filter applicable versions. + * `prereleases`: Whether prereleases should be accounted. Pass None to + infer from the specifier. + * `evaluator`: A CandidateEvaluator object to sort applicable candidates + by order of preference. + """ + + def __init__( + self, + candidates, # type: List[InstallationCandidate] + versions, # type: Set[str] + evaluator, # type: CandidateEvaluator + ): + # type: (...) -> None + self._candidates = candidates + self._evaluator = evaluator + self._versions = versions + + @classmethod + def from_specifier( + cls, + candidates, # type: List[InstallationCandidate] + specifier, # type: specifiers.BaseSpecifier + prereleases, # type: Optional[bool] + evaluator, # type: CandidateEvaluator + ): + # type: (...) -> FoundCandidates + versions = { + str(v) for v in specifier.filter( + # We turn the version object into a str here because otherwise + # when we're debundled but setuptools isn't, Python will see + # packaging.version.Version and + # pkg_resources._vendor.packaging.version.Version as different + # types. This way we'll use a str as a common data interchange + # format. If we stop using the pkg_resources provided specifier + # and start using our own, we can drop the cast to str(). + (str(c.version) for c in candidates), + prereleases=prereleases, + ) + } + return cls(candidates, versions, evaluator) + + def iter_all(self): + # type: () -> Iterable[InstallationCandidate] + """Iterate through all candidates. + """ + return iter(self._candidates) + + def iter_applicable(self): + # type: () -> Iterable[InstallationCandidate] + """Iterate through candidates matching the versions associated with + this instance. + """ + # Again, converting version to str to deal with debundling. + return (c for c in self.iter_all() if str(c.version) in self._versions) + + def get_best(self): + # type: () -> Optional[InstallationCandidate] + """Return the best candidate available, or None if no applicable + candidates are found. + """ + candidates = list(self.iter_applicable()) + return self._evaluator.get_best_candidate(candidates) class PackageFinder(object): @@ -182,11 +402,21 @@ class PackageFinder(object): packages, by reading pages and looking for appropriate links. """ - def __init__(self, find_links, index_urls, allow_all_prereleases=False, - trusted_hosts=None, process_dependency_links=False, - session=None, format_control=None, platform=None, - versions=None, abi=None, implementation=None, - prefer_binary=False): + def __init__( + self, + find_links, # type: List[str] + index_urls, # type: List[str] + allow_all_prereleases=False, # type: bool + trusted_hosts=None, # type: Optional[Iterable[str]] + session=None, # type: Optional[PipSession] + format_control=None, # type: Optional[FormatControl] + platform=None, # type: Optional[str] + versions=None, # type: Optional[List[str]] + abi=None, # type: Optional[str] + implementation=None, # type: Optional[str] + prefer_binary=False # type: bool + ): + # type: (...) -> None """Create a PackageFinder. :param format_control: A FormatControl object or None. Used to control @@ -203,6 +433,8 @@ class PackageFinder(object): 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. + :param prefer_binary: Whether to prefer an old, but valid, binary + dist over a new source dist. """ if session is None: raise TypeError( @@ -215,7 +447,7 @@ class PackageFinder(object): # it and if it exists, use the normalized version. # This is deliberately conservative - it might be fine just to # blindly normalize anything starting with a ~... - self.find_links = [] + self.find_links = [] # type: List[str] for link in find_links: if link.startswith('~'): new_link = normalize_path(link) @@ -224,10 +456,9 @@ class PackageFinder(object): self.find_links.append(link) self.index_urls = index_urls - self.dependency_links = [] # These are boring links that have already been logged somehow: - self.logged_links = set() + self.logged_links = set() # type: Set[Link] self.format_control = format_control or FormatControl(set(), set()) @@ -235,27 +466,24 @@ class PackageFinder(object): self.secure_origins = [ ("*", host, "*") for host in (trusted_hosts if trusted_hosts else []) - ] + ] # type: List[SecureOrigin] # Do we want to allow _all_ pre-releases? self.allow_all_prereleases = allow_all_prereleases - # Do we process dependency links? - self.process_dependency_links = process_dependency_links - # 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( + valid_tags = get_supported( versions=versions, platform=platform, abi=abi, impl=implementation, ) - - # Do we prefer old, but valid, binary dist over new source dist - self.prefer_binary = prefer_binary + self.candidate_evaluator = CandidateEvaluator( + valid_tags=valid_tags, prefer_binary=prefer_binary, + ) # If we don't have TLS enabled, then WARN if anyplace we're looking # relies on TLS. @@ -271,11 +499,12 @@ class PackageFinder(object): break def get_formatted_locations(self): + # type: () -> str lines = [] if self.index_urls and self.index_urls != [PyPI.simple_url]: lines.append( "Looking in indexes: {}".format(", ".join( - remove_auth_from_url(url) for url in self.index_urls)) + redact_password_from_url(url) for url in self.index_urls)) ) if self.find_links: lines.append( @@ -283,23 +512,9 @@ class PackageFinder(object): ) return "\n".join(lines) - def add_dependency_links(self, links): - # FIXME: this shouldn't be global list this, it should only - # apply to requirements of the package that specifies the - # dependency_links value - # FIXME: also, we should track comes_from (i.e., use Link) - if self.process_dependency_links: - deprecated( - "Dependency Links processing has been deprecated and will be " - "removed in a future release.", - replacement="PEP 508 URL dependencies", - gone_in="18.2", - issue=4187, - ) - self.dependency_links.extend(links) - @staticmethod def _sort_locations(locations, expand_dir=False): + # type: (Sequence[str], bool) -> Tuple[List[str], List[str]] """ Sort locations into "files" (archives) and "urls", and return a pair of lists (files,urls) @@ -332,6 +547,11 @@ class PackageFinder(object): sort_path(os.path.join(path, item)) elif is_file_url: urls.append(url) + else: + logger.warning( + "Path '{0}' is ignored: " + "it is a directory.".format(path), + ) elif os.path.isfile(path): sort_path(path) else: @@ -350,43 +570,8 @@ class PackageFinder(object): return files, urls - def _candidate_sort_key(self, candidate): - """ - Function used to generate link sort key for link tuples. - The greater the return value, the more preferred it is. - 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(self.valid_tags) - 3. source archives - If prefer_binary was set, then all wheels are sorted above sources. - Note: it was considered to embed this logic into the Link - comparison operators, but then different sdist links - with the same version, would have to be considered equal - """ - support_num = len(self.valid_tags) - build_tag = tuple() - binary_preference = 0 - if candidate.location.is_wheel: - # can raise InvalidWheelFilename - wheel = Wheel(candidate.location.filename) - 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 - ) - if self.prefer_binary: - binary_preference = 1 - pri = -(wheel.support_index_min(self.valid_tags)) - if wheel.build_tag is not None: - match = re.match(r'^(\d+)(.*)$', wheel.build_tag) - build_tag_groups = match.groups() - build_tag = (int(build_tag_groups[0]), build_tag_groups[1]) - else: # sdist - pri = -(support_num) - return (binary_preference, candidate.version, build_tag, pri) - def _validate_secure_origin(self, logger, location): + # type: (Logger, Link) -> bool # Determine if this url used a secure transport mechanism parsed = urllib_parse.urlparse(str(location)) origin = (parsed.scheme, parsed.hostname, parsed.port) @@ -418,7 +603,9 @@ class PackageFinder(object): network = ipaddress.ip_network( secure_origin[1] if isinstance(secure_origin[1], six.text_type) - else secure_origin[1].decode("utf8") + # setting secure_origin[1] to proper Union[bytes, str] + # creates problems in other places + else secure_origin[1].decode("utf8") # type: ignore ) except ValueError: # We don't have both a valid address or a valid network, so @@ -458,6 +645,7 @@ class PackageFinder(object): return False def _get_index_urls_locations(self, project_name): + # type: (str) -> List[str] """Returns the locations found via self.index_urls Checks the url_name on the main (first in the list) index and @@ -480,9 +668,10 @@ class PackageFinder(object): return [mkurl_pypi_url(url) for url in self.index_urls] def find_all_candidates(self, project_name): + # type: (str) -> List[Optional[InstallationCandidate]] """Find all available InstallationCandidate for project_name - This checks index_urls, find_links and dependency_links. + This checks index_urls and find_links. All versions found are returned as an InstallationCandidate list. See _link_package_versions for details on which files are accepted @@ -492,21 +681,18 @@ class PackageFinder(object): fl_file_loc, fl_url_loc = self._sort_locations( self.find_links, expand_dir=True, ) - dep_file_loc, dep_url_loc = self._sort_locations(self.dependency_links) file_locations = (Link(url) for url in itertools.chain( - index_file_loc, fl_file_loc, dep_file_loc, + index_file_loc, fl_file_loc, )) # We trust every url that the user has given us whether it was given - # via --index-url or --find-links - # We explicitly do not trust links that came from dependency_links + # via --index-url or --find-links. # We want to filter out any thing which does not have a secure origin. url_locations = [ link for link in itertools.chain( (Link(url) for url in index_url_loc), (Link(url) for url in fl_url_loc), - (Link(url) for url in dep_url_loc), ) if self._validate_secure_origin(logger, link) ] @@ -534,17 +720,6 @@ class PackageFinder(object): self._package_versions(page.iter_links(), search) ) - dependency_versions = self._package_versions( - (Link(url) for url in self.dependency_links), search - ) - if dependency_versions: - logger.debug( - 'dependency_links found: %s', - ', '.join([ - version.location.url for version in dependency_versions - ]) - ) - file_versions = self._package_versions(file_locations, search) if file_versions: file_versions.sort(reverse=True) @@ -557,64 +732,60 @@ class PackageFinder(object): ) # This is an intentional priority ordering - return ( - file_versions + find_links_versions + page_versions + - dependency_versions + return file_versions + find_links_versions + page_versions + + def find_candidates( + self, + project_name, # type: str + specifier=None, # type: Optional[specifiers.BaseSpecifier] + ): + """Find matches for the given project and specifier. + + If given, `specifier` should implement `filter` to allow version + filtering (e.g. ``packaging.specifiers.SpecifierSet``). + + Returns a `FoundCandidates` instance. + """ + if specifier is None: + specifier = specifiers.SpecifierSet() + return FoundCandidates.from_specifier( + self.find_all_candidates(project_name), + specifier=specifier, + prereleases=(self.allow_all_prereleases or None), + evaluator=self.candidate_evaluator, ) def find_requirement(self, req, upgrade): + # type: (InstallRequirement, bool) -> Optional[Link] """Try to find a Link matching req Expects req, an InstallRequirement and upgrade, a boolean Returns a Link if found, Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise """ - all_candidates = self.find_all_candidates(req.name) - - # Filter out anything which doesn't match our specifier - compatible_versions = set( - req.specifier.filter( - # We turn the version object into a str here because otherwise - # when we're debundled but setuptools isn't, Python will see - # packaging.version.Version and - # pkg_resources._vendor.packaging.version.Version as different - # types. This way we'll use a str as a common data interchange - # format. If we stop using the pkg_resources provided specifier - # and start using our own, we can drop the cast to str(). - [str(c.version) for c in all_candidates], - prereleases=( - self.allow_all_prereleases - if self.allow_all_prereleases else None - ), - ) - ) - applicable_candidates = [ - # Again, converting to str to deal with debundling. - c for c in all_candidates if str(c.version) in compatible_versions - ] - - if applicable_candidates: - best_candidate = max(applicable_candidates, - key=self._candidate_sort_key) - else: - best_candidate = None + candidates = self.find_candidates(req.name, req.specifier) + best_candidate = candidates.get_best() + installed_version = None # type: Optional[_BaseVersion] if req.satisfied_by is not None: installed_version = parse_version(req.satisfied_by.version) - else: - installed_version = None + + def _format_versions(cand_iter): + # This repeated parse_version and str() conversion is needed to + # handle different vendoring sources from pip and pkg_resources. + # If we stop using the pkg_resources provided specifier and start + # using our own, we can drop the cast to str(). + return ", ".join(sorted( + {str(c.version) for c in cand_iter}, + key=parse_version, + )) or "none" if installed_version is None and best_candidate is None: logger.critical( 'Could not find a version that satisfies the requirement %s ' '(from versions: %s)', req, - ', '.join( - sorted( - {str(c.version) for c in all_candidates}, - key=parse_version, - ) - ) + _format_versions(candidates.iter_all()), ) raise DistributionNotFound( @@ -649,30 +820,30 @@ class PackageFinder(object): 'Installed version (%s) is most up-to-date (past versions: ' '%s)', installed_version, - ', '.join(sorted(compatible_versions, key=parse_version)) or - "none", + _format_versions(candidates.iter_applicable()), ) raise BestVersionAlreadyInstalled logger.debug( 'Using version %s (newest of versions: %s)', best_candidate.version, - ', '.join(sorted(compatible_versions, key=parse_version)) + _format_versions(candidates.iter_applicable()), ) return best_candidate.location def _get_pages(self, locations, project_name): + # type: (Iterable[Link], str) -> Iterable[HTMLPage] """ Yields (page, page_url) from the given locations, skipping locations that have errors. """ - seen = set() + seen = set() # type: Set[Link] for location in locations: if location in seen: continue seen.add(location) - page = self._get_page(location) + page = _get_html_page(location, session=self.session) if page is None: continue @@ -681,12 +852,13 @@ class PackageFinder(object): _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$') def _sort_links(self, links): + # type: (Iterable[Link]) -> List[Link] """ Returns elements of links in order, non-egg links first, egg links second, while eliminating duplicates """ eggs, no_eggs = [], [] - seen = set() + seen = set() # type: Set[Link] for link in links: if link not in seen: seen.add(link) @@ -696,7 +868,12 @@ class PackageFinder(object): no_eggs.append(link) return no_eggs + eggs - def _package_versions(self, links, search): + def _package_versions( + self, + links, # type: Iterable[Link] + search # type: Search + ): + # type: (...) -> List[Optional[InstallationCandidate]] result = [] for link in self._sort_links(links): v = self._link_package_versions(link, search) @@ -705,11 +882,13 @@ class PackageFinder(object): return result def _log_skipped_link(self, link, reason): + # type: (Link, str) -> None if link not in self.logged_links: logger.debug('Skipping link %s; %s', link, reason) self.logged_links.add(link) def _link_package_versions(self, link, search): + # type: (Link, Search) -> Optional[InstallationCandidate] """Return an InstallationCandidate or None""" version = None if link.egg_fragment: @@ -719,51 +898,51 @@ class PackageFinder(object): egg_info, ext = link.splitext() if not ext: self._log_skipped_link(link, 'not a file') - return + return None if ext not in SUPPORTED_EXTENSIONS: self._log_skipped_link( link, 'unsupported archive format: %s' % ext, ) - return - if "binary" not in search.formats and ext == wheel_ext: + return None + if "binary" not in search.formats and ext == WHEEL_EXTENSION: self._log_skipped_link( link, 'No binaries permitted for %s' % search.supplied, ) - return + return None if "macosx10" in link.path and ext == '.zip': self._log_skipped_link(link, 'macosx10 one') - return - if ext == wheel_ext: + return None + if ext == WHEEL_EXTENSION: try: wheel = Wheel(link.filename) except InvalidWheelFilename: self._log_skipped_link(link, 'invalid wheel filename') - return + return None if canonicalize_name(wheel.name) != search.canonical: self._log_skipped_link( link, 'wrong project name (not %s)' % search.supplied) - return + return None - if not wheel.supported(self.valid_tags): + if not self.candidate_evaluator.is_wheel_supported(wheel): self._log_skipped_link( link, 'it is not compatible with this Python') - return + return None version = wheel.version # This should be up by the search.ok_binary check, but see issue 2700. - if "source" not in search.formats and ext != wheel_ext: + if "source" not in search.formats and ext != WHEEL_EXTENSION: self._log_skipped_link( link, 'No sources permitted for %s' % search.supplied, ) - return + return None if not version: - version = egg_info_matches(egg_info, search.supplied, link) - if version is None: + version = _egg_info_matches(egg_info, search.canonical) + if not version: self._log_skipped_link( link, 'Missing project version for %s' % search.supplied) - return + return None match = self._py_version_re.search(version) if match: @@ -772,7 +951,7 @@ class PackageFinder(object): if py_version != sys.version[:3]: self._log_skipped_link( link, 'Python version is incorrect') - return + return None try: support_this_python = check_requires_python(link.requires_python) except specifiers.InvalidSpecifier: @@ -781,45 +960,57 @@ class PackageFinder(object): 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", + logger.debug("The package %s is incompatible with the python " + "version in use. Acceptable python versions are: %s", link, link.requires_python) - return + return None logger.debug('Found link %s, version: %s', link, version) return InstallationCandidate(search.supplied, version, link) - def _get_page(self, link): - return _get_html_page(link, session=self.session) + +def _find_name_version_sep(egg_info, canonical_name): + # type: (str, str) -> int + """Find the separator's index based on the package's canonical name. + + `egg_info` must be an egg info string for the given package, and + `canonical_name` must be the package's canonical name. + + This function is needed since the canonicalized name does not necessarily + have the same length as the egg info's name part. An example:: + + >>> egg_info = 'foo__bar-1.0' + >>> canonical_name = 'foo-bar' + >>> _find_name_version_sep(egg_info, canonical_name) + 8 + """ + # Project name and version must be separated by one single dash. Find all + # occurrences of dashes; if the string in front of it matches the canonical + # name, this is the one separating the name and version parts. + for i, c in enumerate(egg_info): + if c != "-": + continue + if canonicalize_name(egg_info[:i]) == canonical_name: + return i + raise ValueError("{} does not match {}".format(egg_info, canonical_name)) -def egg_info_matches( - egg_info, search_name, link, - _egg_info_re=re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.I)): +def _egg_info_matches(egg_info, canonical_name): + # type: (str, str) -> Optional[str] """Pull the version part out of a string. :param egg_info: The string to parse. E.g. foo-2.1 - :param search_name: The name of the package this belongs to. None to - infer the name. Note that this cannot unambiguously parse strings - like foo-2-2 which might be foo, 2-2 or foo-2, 2. - :param link: The link the string came from, for logging on failure. + :param canonical_name: The canonicalized name of the package this + belongs to. """ - match = _egg_info_re.search(egg_info) - if not match: - logger.debug('Could not parse version from link: %s', link) + try: + version_start = _find_name_version_sep(egg_info, canonical_name) + 1 + except ValueError: return None - if search_name is None: - full_match = match.group(0) - return full_match.split('-', 1)[-1] - name = match.group(0).lower() - # To match the "safe" name that pkg_resources creates: - name = name.replace('_', '-') - # project name and version must be separated by a dash - look_for = search_name.lower() + "-" - if name.startswith(look_for): - return match.group(0)[len(look_for):] - else: + version = egg_info[version_start:] + if not version: return None + return version def _determine_base_url(document, page_url): @@ -851,28 +1042,46 @@ def _get_encoding_from_headers(headers): return None -_CLEAN_LINK_RE = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) - - def _clean_link(url): + # type: (str) -> str """Makes sure a link is fully encoded. That is, if a ' ' shows up in the link, it will be rewritten to %20 (while not over-quoting % or other characters).""" - return _CLEAN_LINK_RE.sub(lambda match: '%%%2x' % ord(match.group(0)), url) + # Split the URL into parts according to the general structure + # `scheme://netloc/path;parameters?query#fragment`. Note that the + # `netloc` can be empty and the URI will then refer to a local + # filesystem path. + result = urllib_parse.urlparse(url) + # In both cases below we unquote prior to quoting to make sure + # nothing is double quoted. + if result.netloc == "": + # On Windows the path part might contain a drive letter which + # should not be quoted. On Linux where drive letters do not + # exist, the colon should be quoted. We rely on urllib.request + # to do the right thing here. + path = urllib_request.pathname2url( + urllib_request.url2pathname(result.path)) + else: + # In addition to the `/` character we protect `@` so that + # revision strings in VCS URLs are properly parsed. + path = urllib_parse.quote(urllib_parse.unquote(result.path), safe="/@") + return urllib_parse.urlunparse(result._replace(path=path)) class HTMLPage(object): """Represents one page, along with its URL""" def __init__(self, content, url, headers=None): + # type: (bytes, str, MutableMapping[str, str]) -> None self.content = content self.url = url self.headers = headers def __str__(self): - return self.url + return redact_password_from_url(self.url) def iter_links(self): + # type: () -> Iterable[Link] """Yields all links in the page""" document = html5lib.parse( self.content, diff --git a/env/lib/python3.7/site-packages/pip/_internal/locations.py b/env/lib/python3.7/site-packages/pip/_internal/locations.py index 183aaa3..10860f7 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/locations.py +++ b/env/lib/python3.7/site-packages/pip/_internal/locations.py @@ -12,6 +12,11 @@ from distutils.command.install import SCHEME_KEYS # type: ignore from pip._internal.utils import appdirs from pip._internal.utils.compat import WINDOWS, expanduser +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Union, Dict, List, Optional + # Application Directories USER_CACHE_DIR = appdirs.user_cache_dir("pip") @@ -28,6 +33,7 @@ PIP_DELETE_MARKER_FILENAME = 'pip-delete-this-directory.txt' def write_delete_marker_file(directory): + # type: (str) -> None """ Write the pip delete marker file into this directory. """ @@ -37,6 +43,7 @@ def write_delete_marker_file(directory): def running_under_virtualenv(): + # type: () -> bool """ Return True if we're running inside a virtualenv, False otherwise. @@ -50,6 +57,7 @@ def running_under_virtualenv(): def virtualenv_no_global(): + # type: () -> bool """ Return True if in a venv and no system site packages. """ @@ -59,6 +67,8 @@ def virtualenv_no_global(): no_global_file = os.path.join(site_mod_dir, 'no-global-site-packages.txt') if running_under_virtualenv() and os.path.isfile(no_global_file): return True + else: + return False if running_under_virtualenv(): @@ -80,7 +90,8 @@ src_prefix = os.path.abspath(src_prefix) # FIXME doesn't account for venv linked to global site-packages -site_packages = sysconfig.get_path("purelib") +site_packages = sysconfig.get_path("purelib") # type: Optional[str] + # This is because of a bug in PyPy's sysconfig module, see # https://bitbucket.org/pypy/pypy/issues/2506/sysconfig-returns-incorrect-paths # for more information. @@ -124,17 +135,18 @@ else: if sys.platform[:6] == 'darwin' and sys.prefix[:16] == '/System/Library/': bin_py = '/usr/local/bin' -site_config_files = [ +global_config_files = [ os.path.join(path, config_basename) for path in appdirs.site_config_dirs('pip') ] -venv_config_file = os.path.join(sys.prefix, config_basename) +site_config_file = os.path.join(sys.prefix, config_basename) new_config_file = os.path.join(appdirs.user_config_dir("pip"), config_basename) def distutils_scheme(dist_name, user=False, home=None, root=None, isolated=False, prefix=None): + # type:(str, bool, str, str, bool, str) -> dict """ Return a distutils install scheme """ @@ -146,12 +158,15 @@ def distutils_scheme(dist_name, user=False, home=None, root=None, extra_dist_args = {"script_args": ["--no-user-cfg"]} else: extra_dist_args = {} - dist_args = {'name': dist_name} + dist_args = {'name': dist_name} # type: Dict[str, Union[str, List[str]]] dist_args.update(extra_dist_args) d = Distribution(dist_args) + # Ignoring, typeshed issue reported python/typeshed/issues/2567 d.parse_config_files() - i = d.get_command_obj('install', create=True) + # NOTE: Ignoring type since mypy can't find attributes on 'Command' + i = d.get_command_obj('install', create=True) # type: Any + assert i is not None # NOTE: setting user or home has the side-effect of creating the home dir # or user base for installations during finalize_options() # ideally, we'd prefer a scheme class that has no side-effects. @@ -171,7 +186,9 @@ def distutils_scheme(dist_name, user=False, home=None, root=None, # platlib). Note, i.install_lib is *always* set after # finalize_options(); we only want to override here if the user # has explicitly requested it hence going back to the config - if 'install_lib' in d.get_option_dict('install'): + + # Ignoring, typeshed issue reported python/typeshed/issues/2567 + if 'install_lib' in d.get_option_dict('install'): # type: ignore scheme.update(dict(purelib=i.install_lib, platlib=i.install_lib)) if running_under_virtualenv(): diff --git a/env/lib/python3.7/site-packages/pip/_internal/models/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/models/__pycache__/__init__.cpython-37.pyc index d4d9d47bd1995678b9dd754c91fd9f382acb4a62..4957e2050c73ba55217427d04baa6f1ce6351f6e 100644 GIT binary patch delta 38 qcmcb~c$1OGiIE%c%tjw!0Ov{+K(3tfzNCE)Gu?lYh delta 38 qcmcb~c$1OGiIE%c+PtVILDKwe5(3rItBmn@zDGB2M diff --git a/env/lib/python3.7/site-packages/pip/_internal/models/__pycache__/candidate.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/models/__pycache__/candidate.cpython-37.pyc index 20820e1334e8b305e7cbda05bf357bcaa9cc00a6..e439725ec5fe8d0e413544e8bf96a6bde531b271 100644 GIT binary patch delta 552 zcmY*V%SyvQ6rGt&)3i;Z)(1W|BB*3jaN(j*1Y5*+5k=8}jHQ`saFW)U7VJhB`U53f zSNaA1hd*GJeu;Og_z29IbMHOp-aC1+K5}l=aqE$^|=3fSH=q# z?3h}Ng>l$r%%dq)T(o2X($dl3ChvIB3U2!G?Mmw^G0F1CDCG4~HUJ_?g$&An43P7% z9D_@a|G)$=JxB76WNZ#1MFGHV8izZ&o16kj9mblXp;VI#0qUOy(6OjRx{uUL>)FZ# zum~k~VVJ9XPV#IlW^^r0-i-PCbhZsd6Njr{`sr z6q-!VXHu8o0g8j{D+Vzb7}*%P7}=P(82Kg_FiTH9$&_n}q#LL}ld*^wNEPwJ2>~GM z7Ds%1QEEX^e7p#dSIhz=7#Jt#GY5HrOf3=u61RBc*H;RXOr^{e;Z_tkr^>TBiGQ2BnjTmb3`-(Pt3rB}ZA za8WH>;6fh+umz#Ek&go0!VoabXVn_}Mv!ae0<&cXR?C858MuaLh{C+pAF>B7p=!Xx_PWwW{3T(+?!Ph;Ulq2o)u#)Qm2;L!mKmD%g;R}Pj} zm>)AH}a|{uG{Vr;~CZ%kL(vft|7)!t5*~ua0wGr18KBz$p{!0iMr8Px3 zp88#(4f~8U$%InQVovG!XK75qQ7tHO$o8ZWIsyAzJH2F%7O$yzGNAzAbjkcauAArM z8uU&w-^s?EFkxd}Oz&A^jWZjb>oP&raHBouQgsZ0Ba&N+np714l)kh0TL)%jmQ2k|}sT-6GeI2Q*iYh*vZWE0861oWg4dOl(Fj&(tS%(AMy$zRc1y z=avH9Pol>`kbw#Xg4Ju4s-&Dnn|48ts&j78*DQ1+-soQ;FCEMeB(*Hyg@SQ)5gWV0 z^OJ_ykG-(Vu~L-g=|We}a~jOd9c^r}w#YX4UtN;i4kCBgXLq1VPl$pNDj@?_@h>fL B!CC+S delta 1089 zcmZ`&%We}f6t!pan6^ow50FXDgpd#j!K$h>OlNKqw-e9Qc1Z(8 zSro*&njIT;n(O7L5MH@ETj zusk!za1xP-#-vTxDJ6GFfMIEJV`%J93_U;%4zh$F_a zD2P>ek#UU^QPoU=uA3AaV7(XBRV-btzO*T-mF!{}s-XtPE#FWJ_CiQC)2&1Si@DN( z3IgZA5(GIAt+R(B?y^L{k%=%6Y!i&IrPB!;in3my(X8fesIw=?BSC4FG%TlyGS~}3 z{d>Di1Q@dJKv^=g{ehE3*5MjWi!N*OXCQ_(iE)D)>zG#VrpEEHw~?WKwnvxF3TL10 z6QAxo5!v?SMNJNfaI(*IWg(BJDhmi7i1hI9=bdHUPM1@jE*g8)XRwFk+$w--jLFKb75gXS46lwX0=})*NX{WXXV0{JTJa z?@wYuZ+_^kMh6uql0Dy-kV@Y_^XZ2>Pb-G7?+WPjbEcnva%Zdg%GfNfs|yIk$)4uF zoj047GX{)Oe*~}La}ao(HCGn1jlyjGgy2*Yw2!wZ=|JQkUEXCZRnrKBX73Af&G1`3 z+tdFzpNP1!JpLvZf#jfW7@9#>v-RRUoycAnt3C7nr0JO)H!z9NFX5ZeJZuAA*GO8q z%VzP4fn&pVWDY^P2!>gmM(_$bI-2ub{1r=6UdgULsO9<pwY&A;+nq^xs zmb81E-fFLttLB`(Y9HsQcE6La=7}&bm?=~HR4_HF-D@c0&Ph?vn+xS~ z#VEhER$g9RTv?8W7&UA4!0>9mzu9J{(O_-I=rDWt$FZrtt2eIQFy&wfF z%kxDkQdhjdYP&T%Qr0@2O(SL9g?^Dl>cZO9%C%aP{`}`}(r5-Y7^#L~xmI8pMLCjv zYByL8!mJOWKm1i5Q_YQSck4o<75*iU_6$IL5I(;bK*)vz%0=>OxTu^QdES%)@s{v` zbejN@TcjZk3adgO267w?KT#%D71j^B*j~XF&K602z=|S6<49y48^RF|$1#*N3?LZB zbI|d#00K!6U6cVeqK72$${3Q1ggYEo!wwnsKz=D~B<_)1IGUU$gQ1ap;`E_;)P`kK zx8~5xI1x_(Df}*3nJhq`jUeE1kC-Rn*IU$~^T6;$06_{1>g;#{TK}bGPXnm}-@fom zbzzDN#~w#r1k&{`^|91U`4sev3QM4V6yY=iGT9k`NAH2t-+_tK2#KI=um2nm%%N0s`>^c>!8`c5D)(UAYuq*N4*^5ZpJoseiFl zLV*nLtyS||kdf^1yg(JnDEYX{Z#}cJ#IHqWmmvH}@J@I;uNF3Gjjm;LN_U8w}UlKhzvN(rI z%#bKuvuz`OTK@il^U*HEfQ5LhqYFd@_l&;`Ul>rl)sH^xv-IH_`elWt7#liTx zDj<$dc$QZ(Zc^85vyyLZm7I3?L#~$;!h5-yG~-1V-*OcGlRL4K#MUsESZ+WW{MRUT z0?YPG!M10)O@^l!CH6Wg=rF8{EREs*hjo@~(k-UrFz)AIt8t5$a&_8in;n~8#!U0` UcmgU>MP1ZMUeb9{&l6qx7gh*-)Bpeg delta 1714 zcma)6-EQ1e5ccukdi}GTZUrQMfKS1nc`iKtk~|^M7k;kwZOP11qL<0S9(rB zZc6R?&Tl6P;R=~C>sv!gBbVMT9(m+z~WG7JWNEyLsU}`bU*Pw{h~mQg7+lmq=I4y{^T*+v zy^ereI3T*7`$HPjOURW0B$@wWtS%mg%cjA7b&U8<{i9_;JPF4Ci_A`e)0Hvy&-Lzy zlknZvn2P) zbHt)il4ns^wDqcZv%nA=7g?3s=7_TG(&#g95Ywa>FAl$8OsjQT~&wx6kb;JK@6IX|qujVdafw4s*|p*7jz1E@%e#`OMjuCIwosB8%n zI=oa}M8~$y$Mo(sKEIB7i~#&Yx@~o=O{$+-RqKGGmJib{7mE4~YCdiEPIGw?&n?pd z4(Jsl%v~{#zTG1}deA&VKE8-dY>LwIqR6dIQ@&dTvAVAc7HD~_2>YI2e1~$PqB{S3 zV*M`8EA|?~F_bhimS&U{+iV7H&-Y$+N<`*o&{<}*todo2!8l+Y^goBNfUt-lDu6?R zokzHUu!3+IpmbcoS` zZOxSJ8a^=o6uSmDtO#biQI+cokb6^En04H*X%eKYlZUrEamu@`338m@Xmv@C-)~Lb x(!jAiDjdV4pe*sCj;MnumeAZww0aZs*jS0vU=-0y*e7`db0vms%Qg|W@*fKiJwpHh diff --git a/env/lib/python3.7/site-packages/pip/_internal/models/candidate.py b/env/lib/python3.7/site-packages/pip/_internal/models/candidate.py index c736de6..b66c365 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/models/candidate.py +++ b/env/lib/python3.7/site-packages/pip/_internal/models/candidate.py @@ -1,6 +1,12 @@ from pip._vendor.packaging.version import parse as parse_version from pip._internal.utils.models import KeyBasedCompareMixin +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from pip._vendor.packaging.version import _BaseVersion + from pip._internal.models.link import Link + from typing import Any class InstallationCandidate(KeyBasedCompareMixin): @@ -8,8 +14,9 @@ class InstallationCandidate(KeyBasedCompareMixin): """ def __init__(self, project, version, location): + # type: (Any, str, Link) -> None self.project = project - self.version = parse_version(version) + self.version = parse_version(version) # type: _BaseVersion self.location = location super(InstallationCandidate, self).__init__( @@ -18,6 +25,7 @@ class InstallationCandidate(KeyBasedCompareMixin): ) def __repr__(self): + # type: () -> str return "".format( self.project, self.version, self.location, ) diff --git a/env/lib/python3.7/site-packages/pip/_internal/models/format_control.py b/env/lib/python3.7/site-packages/pip/_internal/models/format_control.py index 2748856..53138e4 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/models/format_control.py +++ b/env/lib/python3.7/site-packages/pip/_internal/models/format_control.py @@ -1,16 +1,24 @@ from pip._vendor.packaging.utils import canonicalize_name +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Set, FrozenSet + class FormatControl(object): - """A helper class for controlling formats from which packages are installed. - If a field is falsy, it isn't set. If it is {':all:'}, it should match all - packages except those listed in the other field. Only one field can be set - to {':all:'} at a time. The rest of the time exact package name matches - are listed, with any given package only showing up in one field at a time. + """Helper for managing formats from which a package can be installed. """ + def __init__(self, no_binary=None, only_binary=None): - self.no_binary = set() if no_binary is None else no_binary - self.only_binary = set() if only_binary is None else only_binary + # type: (Optional[Set], Optional[Set]) -> None + if no_binary is None: + no_binary = set() + if only_binary is None: + only_binary = set() + + self.no_binary = no_binary + self.only_binary = only_binary def __eq__(self, other): return self.__dict__ == other.__dict__ @@ -27,6 +35,7 @@ class FormatControl(object): @staticmethod def handle_mutual_excludes(value, target, other): + # type: (str, Optional[Set], Optional[Set]) -> None new = value.split(',') while ':all:' in new: other.clear() @@ -45,6 +54,7 @@ class FormatControl(object): target.add(name) def get_allowed_formats(self, canonical_name): + # type: (str) -> FrozenSet result = {"binary", "source"} if canonical_name in self.only_binary: result.discard('source') @@ -57,6 +67,7 @@ class FormatControl(object): return frozenset(result) def disallow_binaries(self): + # type: () -> None self.handle_mutual_excludes( ':all:', self.no_binary, self.only_binary, ) diff --git a/env/lib/python3.7/site-packages/pip/_internal/models/index.py b/env/lib/python3.7/site-packages/pip/_internal/models/index.py index 870a315..ead1efb 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/models/index.py +++ b/env/lib/python3.7/site-packages/pip/_internal/models/index.py @@ -6,6 +6,7 @@ class PackageIndex(object): """ def __init__(self, url, file_storage_domain): + # type: (str, str) -> None super(PackageIndex, self).__init__() self.url = url self.netloc = urllib_parse.urlsplit(url).netloc @@ -18,6 +19,7 @@ class PackageIndex(object): self.file_storage_domain = file_storage_domain def _url_for_path(self, path): + # type: (str) -> str return urllib_parse.urljoin(self.url, path) diff --git a/env/lib/python3.7/site-packages/pip/_internal/models/link.py b/env/lib/python3.7/site-packages/pip/_internal/models/link.py index 5decb7c..2f42076 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/models/link.py +++ b/env/lib/python3.7/site-packages/pip/_internal/models/link.py @@ -4,9 +4,15 @@ import re from pip._vendor.six.moves.urllib import parse as urllib_parse from pip._internal.download import path_to_url -from pip._internal.utils.misc import splitext +from pip._internal.utils.misc import ( + WHEEL_EXTENSION, redact_password_from_url, splitext, +) from pip._internal.utils.models import KeyBasedCompareMixin -from pip._internal.wheel import wheel_ext +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple, Union + from pip._internal.index import HTMLPage class Link(KeyBasedCompareMixin): @@ -14,6 +20,7 @@ class Link(KeyBasedCompareMixin): """ def __init__(self, url, comes_from=None, requires_python=None): + # type: (str, Optional[Union[str, HTMLPage]], Optional[str]) -> None """ url: url of the resource pointed to (href of the link) @@ -44,15 +51,17 @@ class Link(KeyBasedCompareMixin): else: rp = '' if self.comes_from: - return '%s (from %s)%s' % (self.url, self.comes_from, rp) + return '%s (from %s)%s' % (redact_password_from_url(self.url), + self.comes_from, rp) else: - return str(self.url) + return redact_password_from_url(str(self.url)) def __repr__(self): return '' % self @property def filename(self): + # type: () -> str _, netloc, path, _, _ = urllib_parse.urlsplit(self.url) name = posixpath.basename(path.rstrip('/')) or netloc name = urllib_parse.unquote(name) @@ -61,25 +70,31 @@ class Link(KeyBasedCompareMixin): @property def scheme(self): + # type: () -> str return urllib_parse.urlsplit(self.url)[0] @property def netloc(self): + # type: () -> str return urllib_parse.urlsplit(self.url)[1] @property def path(self): + # type: () -> str return urllib_parse.unquote(urllib_parse.urlsplit(self.url)[2]) def splitext(self): + # type: () -> Tuple[str, str] return splitext(posixpath.basename(self.path.rstrip('/'))) @property def ext(self): + # type: () -> str return self.splitext()[1] @property def url_without_fragment(self): + # type: () -> str scheme, netloc, path, query, fragment = urllib_parse.urlsplit(self.url) return urllib_parse.urlunsplit((scheme, netloc, path, query, None)) @@ -87,6 +102,7 @@ class Link(KeyBasedCompareMixin): @property def egg_fragment(self): + # type: () -> Optional[str] match = self._egg_fragment_re.search(self.url) if not match: return None @@ -96,6 +112,7 @@ class Link(KeyBasedCompareMixin): @property def subdirectory_fragment(self): + # type: () -> Optional[str] match = self._subdirectory_fragment_re.search(self.url) if not match: return None @@ -107,6 +124,7 @@ class Link(KeyBasedCompareMixin): @property def hash(self): + # type: () -> Optional[str] match = self._hash_re.search(self.url) if match: return match.group(2) @@ -114,6 +132,7 @@ class Link(KeyBasedCompareMixin): @property def hash_name(self): + # type: () -> Optional[str] match = self._hash_re.search(self.url) if match: return match.group(1) @@ -121,14 +140,17 @@ class Link(KeyBasedCompareMixin): @property def show_url(self): + # type: () -> Optional[str] return posixpath.basename(self.url.split('#', 1)[0].split('?', 1)[0]) @property def is_wheel(self): - return self.ext == wheel_ext + # type: () -> bool + return self.ext == WHEEL_EXTENSION @property def is_artifact(self): + # type: () -> bool """ Determines if this points to an actual artifact (e.g. a tarball) or if it points to an "abstract" thing like a path or a VCS location. diff --git a/env/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-37.pyc index 12f37c6bb4cf86e003d2ab403f8c2c0a437012bc..9eae1946721ec32a108ed04c16807e6b41bf089b 100644 GIT binary patch delta 38 qcmbQqIFpgbiIk^lgxnF!wi diff --git a/env/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/check.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/check.cpython-37.pyc index e58c9b0d9e10e5e67750c7c3b4b6a788b78cdafa..9f419c6578df86b2fa173302fd6e43f40e8c9bc4 100644 GIT binary patch delta 1589 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 literal 6285 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 GX#Wei{MTOq diff --git a/env/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-37.pyc index 621988ff7cd9ff96107bfd42c2c505b247fdcb13..5bbd7a328cf09fc624bb90466d9b388bfbb0bc79 100644 GIT binary patch delta 4404 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 PackageSet + # type: (**Any) -> Tuple[PackageSet, bool] """Converts a list of distributions into a PackageSet. """ # Default to using all packages installed on the system @@ -36,10 +40,16 @@ def create_package_set_from_installed(**kwargs): kwargs = {"local_only": False, "skip": ()} package_set = {} + problems = False for dist in get_installed_distributions(**kwargs): name = canonicalize_name(dist.project_name) - package_set[name] = PackageDetails(dist.version, dist.requires()) - return package_set + try: + package_set[name] = PackageDetails(dist.version, dist.requires()) + except RequirementParseError as e: + # Don't crash on broken metadata + logging.warning("Error parsing requirements for %s: %s", name, e) + problems = True + return package_set, problems def check_package_set(package_set, should_ignore=None): @@ -95,7 +105,7 @@ def check_install_conflicts(to_install): installing given requirements """ # Start from the current state - package_set = create_package_set_from_installed() + package_set, _ = create_package_set_from_installed() # Install packages would_be_installed = _simulate_installation_of(to_install, package_set) @@ -110,9 +120,6 @@ def check_install_conflicts(to_install): ) -# NOTE from @pradyunsg -# This required a minor update in dependency link handling logic over at -# operations.prepare.IsSDist.dist() to get it working def _simulate_installation_of(to_install, package_set): # type: (List[InstallRequirement], PackageSet) -> Set[str] """Computes the version of packages after installing to_install. @@ -123,7 +130,7 @@ def _simulate_installation_of(to_install, package_set): # Modify it as installing requirement_set would (assuming no errors) for inst_req in to_install: - dist = make_abstract_dist(inst_req).dist(finder=None) + dist = make_abstract_dist(inst_req).dist() name = canonicalize_name(dist.key) package_set[name] = PackageDetails(dist.version, dist.requires()) diff --git a/env/lib/python3.7/site-packages/pip/_internal/operations/freeze.py b/env/lib/python3.7/site-packages/pip/_internal/operations/freeze.py index beb2feb..0c4c761 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/operations/freeze.py +++ b/env/lib/python3.7/site-packages/pip/_internal/operations/freeze.py @@ -5,57 +5,61 @@ import logging import os import re -from pip._vendor import pkg_resources, six +from pip._vendor import six from pip._vendor.packaging.utils import canonicalize_name from pip._vendor.pkg_resources import RequirementParseError -from pip._internal.exceptions import InstallationError +from pip._internal.exceptions import BadCommand, InstallationError from pip._internal.req.constructors import ( install_req_from_editable, install_req_from_line, ) from pip._internal.req.req_file import COMMENT_RE -from pip._internal.utils.deprecation import deprecated from pip._internal.utils.misc import ( - dist_is_editable, get_installed_distributions, make_vcs_requirement_url, + dist_is_editable, get_installed_distributions, ) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Iterator, Optional, List, Container, Set, Dict, Tuple, Iterable, Union + ) + from pip._internal.cache import WheelCache + from pip._vendor.pkg_resources import ( + Distribution, Requirement + ) + + RequirementInfo = Tuple[Optional[Union[str, Requirement]], bool, List[str]] + logger = logging.getLogger(__name__) def freeze( - requirement=None, - find_links=None, local_only=None, user_only=None, skip_regex=None, - isolated=False, - wheel_cache=None, - exclude_editable=False, - skip=()): + requirement=None, # type: Optional[List[str]] + find_links=None, # type: Optional[List[str]] + local_only=None, # type: Optional[bool] + user_only=None, # type: Optional[bool] + skip_regex=None, # type: Optional[str] + isolated=False, # type: bool + wheel_cache=None, # type: Optional[WheelCache] + exclude_editable=False, # type: bool + skip=() # type: Container[str] +): + # type: (...) -> Iterator[str] find_links = find_links or [] skip_match = None if skip_regex: skip_match = re.compile(skip_regex).search - dependency_links = [] - - for dist in pkg_resources.working_set: - if dist.has_metadata('dependency_links.txt'): - dependency_links.extend( - dist.get_metadata_lines('dependency_links.txt') - ) - for link in find_links: - if '#egg=' in link: - dependency_links.append(link) for link in find_links: yield '-f %s' % link - installations = {} + installations = {} # type: Dict[str, FrozenRequirement] for dist in get_installed_distributions(local_only=local_only, skip=(), user_only=user_only): try: - req = FrozenRequirement.from_dist( - dist, - dependency_links - ) + req = FrozenRequirement.from_dist(dist) except RequirementParseError: logger.warning( "Could not parse requirement: %s", @@ -71,10 +75,10 @@ def freeze( # 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() + emitted_options = set() # type: Set[str] # keep track of which files a requirement is in so that we can # give an accurate warning if a requirement appears multiple times. - req_files = collections.defaultdict(list) + req_files = collections.defaultdict(list) # type: Dict[str, List[str]] for req_file_path in requirement: with open(req_file_path) as req_file: for line in req_file: @@ -128,10 +132,10 @@ def freeze( # but has been processed already if not req_files[line_req.name]: logger.warning( - "Requirement file [%s] contains %s, but that " - "package is not installed", + "Requirement file [%s] contains %s, but " + "package %r is not installed", req_file_path, - COMMENT_RE.sub('', line).strip(), + COMMENT_RE.sub('', line).strip(), line_req.name ) else: req_files[line_req.name].append(req_file_path) @@ -157,105 +161,84 @@ def freeze( yield str(installation).rstrip() +def get_requirement_info(dist): + # type: (Distribution) -> RequirementInfo + """ + Compute and return values (req, editable, comments) for use in + FrozenRequirement.from_dist(). + """ + if not dist_is_editable(dist): + return (None, False, []) + + location = os.path.normcase(os.path.abspath(dist.location)) + + from pip._internal.vcs import vcs, RemoteNotFoundError + vc_type = vcs.get_backend_type(location) + + if not vc_type: + req = dist.as_requirement() + logger.debug( + 'No VCS found for editable requirement {!r} in: {!r}', req, + location, + ) + comments = [ + '# Editable install with no version control ({})'.format(req) + ] + return (location, True, comments) + + try: + req = vc_type.get_src_requirement(location, dist.project_name) + except RemoteNotFoundError: + req = dist.as_requirement() + comments = [ + '# Editable {} install with no remote ({})'.format( + vc_type.__name__, req, + ) + ] + return (location, True, comments) + + except BadCommand: + logger.warning( + 'cannot determine version of editable source in %s ' + '(%s command not found in path)', + location, + vc_type.name, + ) + return (None, True, []) + + except InstallationError as exc: + logger.warning( + "Error when trying to get requirement for VCS system %s, " + "falling back to uneditable format", exc + ) + else: + if req is not None: + return (req, True, []) + + logger.warning( + 'Could not determine repository location of %s', location + ) + comments = ['## !! Could not determine repository location'] + + return (None, False, comments) + + class FrozenRequirement(object): def __init__(self, name, req, editable, comments=()): + # type: (str, Union[str, Requirement], bool, Iterable[str]) -> None self.name = name self.req = req self.editable = editable self.comments = comments - _rev_re = re.compile(r'-r(\d+)$') - _date_re = re.compile(r'-(20\d\d\d\d\d\d)$') - @classmethod - def _init_args_from_dist(cls, dist, dependency_links): - """ - Compute and return arguments (req, editable, comments) to pass to - FrozenRequirement.__init__(). - - This method is for use in FrozenRequirement.from_dist(). - """ - location = os.path.normcase(os.path.abspath(dist.location)) - comments = [] - from pip._internal.vcs import vcs, get_src_requirement - if dist_is_editable(dist) and vcs.get_backend_name(location): - editable = True - try: - req = get_src_requirement(dist, location) - except InstallationError as exc: - logger.warning( - "Error when trying to get requirement for VCS system %s, " - "falling back to uneditable format", exc - ) - req = None - if req is None: - logger.warning( - 'Could not determine repository location of %s', location - ) - comments.append( - '## !! Could not determine repository location' - ) - req = dist.as_requirement() - editable = False - else: - editable = False + def from_dist(cls, dist): + # type: (Distribution) -> FrozenRequirement + req, editable, comments = get_requirement_info(dist) + if req is None: req = dist.as_requirement() - specs = req.specs - assert len(specs) == 1 and specs[0][0] in ["==", "==="], \ - 'Expected 1 spec with == or ===; specs = %r; dist = %r' % \ - (specs, dist) - version = specs[0][1] - ver_match = cls._rev_re.search(version) - date_match = cls._date_re.search(version) - if ver_match or date_match: - svn_backend = vcs.get_backend('svn') - if svn_backend: - svn_location = svn_backend().get_location( - dist, - dependency_links, - ) - if not svn_location: - logger.warning( - 'Warning: cannot find svn location for %s', req, - ) - comments.append( - '## FIXME: could not find svn URL in dependency_links ' - 'for this package:' - ) - else: - deprecated( - "SVN editable detection based on dependency links " - "will be dropped in the future.", - replacement=None, - gone_in="18.2", - issue=4187, - ) - comments.append( - '# Installing as editable to satisfy requirement %s:' % - req - ) - if ver_match: - rev = ver_match.group(1) - else: - rev = '{%s}' % date_match.group(1) - editable = True - egg_name = cls.egg_name(dist) - req = make_vcs_requirement_url(svn_location, rev, egg_name) - return (req, editable, comments) - - @classmethod - def from_dist(cls, dist, dependency_links): - args = cls._init_args_from_dist(dist, dependency_links) - return cls(dist.project_name, *args) - - @staticmethod - def egg_name(dist): - name = dist.egg_name() - match = re.search(r'-py\d\.\d$', name) - if match: - name = name[:match.start()] - return name + return cls(dist.project_name, req, editable, comments=comments) def __str__(self): req = self.req diff --git a/env/lib/python3.7/site-packages/pip/_internal/operations/prepare.py b/env/lib/python3.7/site-packages/pip/_internal/operations/prepare.py index 104bea3..077a985 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/operations/prepare.py +++ b/env/lib/python3.7/site-packages/pip/_internal/operations/prepare.py @@ -18,12 +18,20 @@ from pip._internal.utils.compat import expanduser from pip._internal.utils.hashes import MissingHashes from pip._internal.utils.logging import indent_log from pip._internal.utils.misc import display_path, normalize_path -from pip._internal.vcs import vcs +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Optional + from pip._internal.req.req_install import InstallRequirement + from pip._internal.index import PackageFinder + from pip._internal.download import PipSession + from pip._internal.req.req_tracker import RequirementTracker logger = logging.getLogger(__name__) def make_abstract_dist(req): + # type: (InstallRequirement) -> DistAbstraction """Factory to make an abstract dist object. Preconditions: Either an editable req with a source_dir, or satisfied_by or @@ -59,40 +67,70 @@ class DistAbstraction(object): """ def __init__(self, req): - self.req = req + # type: (InstallRequirement) -> None + self.req = req # type: InstallRequirement - def dist(self, finder): + def dist(self): + # type: () -> Any """Return a setuptools Dist object.""" - raise NotImplementedError(self.dist) + raise NotImplementedError def prep_for_dist(self, finder, build_isolation): + # type: (PackageFinder, bool) -> Any """Ensure that we can get a Dist for this requirement.""" - raise NotImplementedError(self.dist) + raise NotImplementedError class IsWheel(DistAbstraction): - def dist(self, finder): + def dist(self): + # type: () -> pkg_resources.Distribution return list(pkg_resources.find_distributions( self.req.source_dir))[0] def prep_for_dist(self, finder, build_isolation): + # type: (PackageFinder, bool) -> Any # FIXME:https://github.com/pypa/pip/issues/1112 pass class IsSDist(DistAbstraction): - def dist(self, finder): - dist = self.req.get_dist() - # FIXME: shouldn't be globally added. - if finder and dist.has_metadata('dependency_links.txt'): - finder.add_dependency_links( - dist.get_metadata_lines('dependency_links.txt') - ) - return dist + def dist(self): + return self.req.get_dist() + + def _raise_conflicts(self, conflicting_with, conflicting_reqs): + conflict_messages = [ + '%s is incompatible with %s' % (installed, wanted) + for installed, wanted in sorted(conflicting_reqs) + ] + raise InstallationError( + "Some build dependencies for %s conflict with %s: %s." % ( + self.req, conflicting_with, ', '.join(conflict_messages)) + ) + + def install_backend_dependencies(self, finder): + # type: (PackageFinder) -> None + """ + Install any extra build dependencies that the backend requests. + + :param finder: a PackageFinder object. + """ + req = self.req + with req.build_env: + # We need to have the env active when calling the hook. + req.spin_message = "Getting requirements to build wheel" + reqs = req.pep517_backend.get_requires_for_build_wheel() + conflicting, missing = req.build_env.check_requirements(reqs) + if conflicting: + self._raise_conflicts("the backend dependencies", conflicting) + req.build_env.install_requirements( + finder, missing, 'normal', + "Installing backend dependencies" + ) def prep_for_dist(self, finder, build_isolation): + # type: (PackageFinder, bool) -> None # Prepare for building. We need to: # 1. Load pyproject.toml (if it exists) # 2. Set up the build environment @@ -105,34 +143,43 @@ class IsSDist(DistAbstraction): # requirements. self.req.build_env = BuildEnvironment() self.req.build_env.install_requirements( - finder, self.req.pyproject_requires, + finder, self.req.pyproject_requires, 'overlay', "Installing build dependencies" ) - missing = [] - if self.req.requirements_to_check: - check = self.req.requirements_to_check - missing = self.req.build_env.missing_requirements(check) + conflicting, missing = self.req.build_env.check_requirements( + self.req.requirements_to_check + ) + if conflicting: + self._raise_conflicts("PEP 517/518 supported requirements", + conflicting) if missing: logger.warning( "Missing build requirements in pyproject.toml for %s.", self.req, ) logger.warning( - "The project does not specify a build backend, and pip " - "cannot fall back to setuptools without %s.", + "The project does not specify a build backend, and " + "pip cannot fall back to setuptools without %s.", " and ".join(map(repr, sorted(missing))) ) - self.req.run_egg_info() + # Install any extra build dependencies that the backend requests. + # This must be done in a second pass, as the pyproject.toml + # dependencies must be installed before we can call the backend. + self.install_backend_dependencies(finder=finder) + + self.req.prepare_metadata() self.req.assert_source_matches_version() class Installed(DistAbstraction): - def dist(self, finder): + def dist(self): + # type: () -> pkg_resources.Distribution return self.req.satisfied_by def prep_for_dist(self, finder, build_isolation): + # type: (PackageFinder, bool) -> Any pass @@ -140,8 +187,17 @@ class RequirementPreparer(object): """Prepares a Requirement """ - def __init__(self, build_dir, download_dir, src_dir, wheel_download_dir, - progress_bar, build_isolation, req_tracker): + def __init__( + self, + build_dir, # type: str + download_dir, # type: Optional[str] + src_dir, # type: str + wheel_download_dir, # type: Optional[str] + progress_bar, # type: str + build_isolation, # type: bool + req_tracker # type: RequirementTracker + ): + # type: (...) -> None super(RequirementPreparer, self).__init__() self.src_dir = src_dir @@ -171,6 +227,7 @@ class RequirementPreparer(object): @property def _download_should_save(self): + # type: () -> bool # TODO: Modify to reduce indentation needed if self.download_dir: self.download_dir = expanduser(self.download_dir) @@ -183,8 +240,15 @@ class RequirementPreparer(object): % display_path(self.download_dir)) return False - def prepare_linked_requirement(self, req, session, finder, - upgrade_allowed, require_hashes): + def prepare_linked_requirement( + self, + req, # type: InstallRequirement + session, # type: PipSession + finder, # type: PackageFinder + upgrade_allowed, # type: bool + require_hashes # type: bool + ): + # type: (...) -> DistAbstraction """Prepare a requirement that would be obtained from req.link """ # TODO: Breakup into smaller functions @@ -298,12 +362,18 @@ class RequirementPreparer(object): abstract_dist.prep_for_dist(finder, self.build_isolation) if self._download_should_save: # Make a .zip of the source_dir we already created. - if req.link.scheme in vcs.all_schemes: + if not req.link.is_artifact: req.archive(self.download_dir) return abstract_dist - def prepare_editable_requirement(self, req, require_hashes, use_user_site, - finder): + def prepare_editable_requirement( + self, + req, # type: InstallRequirement + require_hashes, # type: bool + use_user_site, # type: bool + finder # type: PackageFinder + ): + # type: (...) -> DistAbstraction """Prepare an editable requirement """ assert req.editable, "cannot prepare a non-editable req as editable" @@ -331,6 +401,7 @@ class RequirementPreparer(object): return abstract_dist def prepare_installed_requirement(self, req, require_hashes, skip_reason): + # type: (InstallRequirement, bool, Optional[str]) -> DistAbstraction """Prepare an already-installed requirement """ assert req.satisfied_by, "req should have been satisfied but isn't" diff --git a/env/lib/python3.7/site-packages/pip/_internal/pep425tags.py b/env/lib/python3.7/site-packages/pip/_internal/pep425tags.py index ab1a029..3b68f28 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/pep425tags.py +++ b/env/lib/python3.7/site-packages/pip/_internal/pep425tags.py @@ -12,6 +12,14 @@ from collections import OrderedDict import pip._internal.utils.glibc from pip._internal.utils.compat import get_extension_suffixes +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Tuple, Callable, List, Optional, Union, Dict + ) + + Pep425Tag = Tuple[str, str, str] logger = logging.getLogger(__name__) @@ -19,6 +27,7 @@ _osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)') def get_config_var(var): + # type: (str) -> Optional[str] try: return sysconfig.get_config_var(var) except IOError as e: # Issue #1074 @@ -27,6 +36,7 @@ def get_config_var(var): def get_abbr_impl(): + # type: () -> str """Return abbreviated implementation name.""" if hasattr(sys, 'pypy_version_info'): pyimpl = 'pp' @@ -40,6 +50,7 @@ def get_abbr_impl(): def get_impl_ver(): + # type: () -> str """Return implementation version.""" impl_ver = get_config_var("py_version_nodot") if not impl_ver or get_abbr_impl() == 'pp': @@ -48,17 +59,21 @@ def get_impl_ver(): def get_impl_version_info(): + # type: () -> Tuple[int, ...] """Return sys.version_info-like tuple for use in decrementing the minor version.""" if get_abbr_impl() == 'pp': # as per https://github.com/pypa/pip/issues/2882 - return (sys.version_info[0], sys.pypy_version_info.major, - sys.pypy_version_info.minor) + # attrs exist only on pypy + return (sys.version_info[0], + sys.pypy_version_info.major, # type: ignore + sys.pypy_version_info.minor) # type: ignore else: return sys.version_info[0], sys.version_info[1] def get_impl_tag(): + # type: () -> str """ Returns the Tag for this specific implementation. """ @@ -66,6 +81,7 @@ def get_impl_tag(): def get_flag(var, fallback, expected=True, warn=True): + # type: (str, Callable[..., bool], Union[bool, int], bool) -> bool """Use a fallback method for determining SOABI flags if the needed config var is unset or unavailable.""" val = get_config_var(var) @@ -78,6 +94,7 @@ def get_flag(var, fallback, expected=True, warn=True): def get_abi_tag(): + # type: () -> Optional[str] """Return the ABI tag based on SOABI (if available) or emulate SOABI (CPython 2, PyPy).""" soabi = get_config_var('SOABI') @@ -112,10 +129,12 @@ def get_abi_tag(): def _is_running_32bit(): + # type: () -> bool return sys.maxsize == 2147483647 def get_platform(): + # type: () -> str """Return our platform name 'win32', 'linux_x86_64'""" if sys.platform == 'darwin': # distutils.util.get_platform() returns the release based on the value @@ -142,6 +161,7 @@ def get_platform(): def is_manylinux1_compatible(): + # type: () -> bool # Only Linux, and only x86-64 / i686 if get_platform() not in {"linux_x86_64", "linux_i686"}: return False @@ -158,13 +178,33 @@ def is_manylinux1_compatible(): return pip._internal.utils.glibc.have_compatible_glibc(2, 5) +def is_manylinux2010_compatible(): + # type: () -> bool + # Only Linux, and only x86-64 / i686 + if get_platform() not in {"linux_x86_64", "linux_i686"}: + return False + + # Check for presence of _manylinux module + try: + import _manylinux + return bool(_manylinux.manylinux2010_compatible) + except (ImportError, AttributeError): + # Fall through to heuristic check below + pass + + # Check glibc version. CentOS 6 uses glibc 2.12. + return pip._internal.utils.glibc.have_compatible_glibc(2, 12) + + def get_darwin_arches(major, minor, machine): + # type: (int, int, str) -> List[str] """Return a list of supported arches (including group arches) for the given major, minor and machine architecture of an macOS machine. """ arches = [] def _supports_arch(major, minor, arch): + # type: (int, int, str) -> bool # 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: @@ -205,7 +245,7 @@ def get_darwin_arches(major, minor, machine): ("intel", ("x86_64", "i386")), ("fat64", ("x86_64", "ppc64")), ("fat32", ("x86_64", "i386", "ppc")), - ]) + ]) # type: Dict[str, Tuple[str, ...]] if _supports_arch(major, minor, machine): arches.append(machine) @@ -219,8 +259,24 @@ def get_darwin_arches(major, minor, machine): return arches -def get_supported(versions=None, noarch=False, platform=None, - impl=None, abi=None): +def get_all_minor_versions_as_strings(version_info): + # type: (Tuple[int, ...]) -> List[str] + versions = [] + major = version_info[:-1] + # Support all previous minor Python versions. + for minor in range(version_info[-1], -1, -1): + versions.append(''.join(map(str, major + (minor,)))) + return versions + + +def get_supported( + versions=None, # type: Optional[List[str]] + noarch=False, # type: bool + platform=None, # type: Optional[str] + impl=None, # type: Optional[str] + abi=None # type: Optional[str] +): + # type: (...) -> List[Pep425Tag] """Return a list of supported tags for each version specified in `versions`. @@ -237,16 +293,12 @@ def get_supported(versions=None, noarch=False, platform=None, # Versions must be given with respect to the preference if versions is None: - versions = [] version_info = get_impl_version_info() - major = version_info[:-1] - # Support all previous minor Python versions. - for minor in range(version_info[-1], -1, -1): - versions.append(''.join(map(str, major + (minor,)))) + versions = get_all_minor_versions_as_strings(version_info) impl = impl or get_abbr_impl() - abis = [] + abis = [] # type: List[str] abi = abi or get_abi_tag() if abi: @@ -263,6 +315,7 @@ def get_supported(versions=None, noarch=False, platform=None, if not noarch: arch = platform or get_platform() + arch_prefix, arch_sep, arch_suffix = arch.partition('_') if arch.startswith('macosx'): # support macosx-10.6-intel on macosx-10.9-x86_64 match = _osx_arch_pat.match(arch) @@ -276,8 +329,19 @@ def get_supported(versions=None, noarch=False, platform=None, else: # arch pattern didn't match (?!) arches = [arch] - elif platform is None and is_manylinux1_compatible(): - arches = [arch.replace('linux', 'manylinux1'), arch] + elif arch_prefix == 'manylinux2010': + # manylinux1 wheels run on most manylinux2010 systems with the + # exception of wheels depending on ncurses. PEP 571 states + # manylinux1 wheels should be considered manylinux2010 wheels: + # https://www.python.org/dev/peps/pep-0571/#backwards-compatibility-with-manylinux1-wheels + arches = [arch, 'manylinux1' + arch_sep + arch_suffix] + elif platform is None: + arches = [] + if is_manylinux2010_compatible(): + arches.append('manylinux2010' + arch_sep + arch_suffix) + if is_manylinux1_compatible(): + arches.append('manylinux1' + arch_sep + arch_suffix) + arches.append(arch) else: arches = [arch] diff --git a/env/lib/python3.7/site-packages/pip/_internal/pyproject.py b/env/lib/python3.7/site-packages/pip/_internal/pyproject.py index f938a76..43efbed 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/pyproject.py +++ b/env/lib/python3.7/site-packages/pip/_internal/pyproject.py @@ -2,20 +2,43 @@ from __future__ import absolute_import import io import os +import sys from pip._vendor import pytoml, six from pip._internal.exceptions import InstallationError +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Tuple, Optional, List def _is_list_of_str(obj): + # type: (Any) -> bool return ( isinstance(obj, list) and all(isinstance(item, six.string_types) for item in obj) ) -def load_pyproject_toml(use_pep517, pyproject_toml, setup_py, req_name): +def make_pyproject_path(setup_py_dir): + # type: (str) -> str + path = os.path.join(setup_py_dir, 'pyproject.toml') + + # Python2 __file__ should not be unicode + if six.PY2 and isinstance(path, six.text_type): + path = path.encode(sys.getfilesystemencoding()) + + return path + + +def load_pyproject_toml( + use_pep517, # type: Optional[bool] + pyproject_toml, # type: str + setup_py, # type: str + req_name # type: str +): + # type: (...) -> Optional[Tuple[List[str], str, List[str]]] """Load the pyproject.toml file. Parameters: @@ -46,17 +69,20 @@ def load_pyproject_toml(use_pep517, pyproject_toml, setup_py, req_name): build_system = None # The following cases must use PEP 517 - # We check for use_pep517 equalling False because that - # means the user explicitly requested --no-use-pep517 + # We check for use_pep517 being non-None and falsey because that means + # the user explicitly requested --no-use-pep517. The value 0 as + # opposed to False can occur when the value is provided via an + # environment variable or config file option (due to the quirk of + # strtobool() returning an integer in pip's configuration code). if has_pyproject and not has_setup: - if use_pep517 is False: + if use_pep517 is not None and not use_pep517: raise InstallationError( "Disabling PEP 517 processing is invalid: " "project does not have a setup.py" ) use_pep517 = True elif build_system and "build-backend" in build_system: - if use_pep517 is False: + if use_pep517 is not None and not use_pep517: raise InstallationError( "Disabling PEP 517 processing is invalid: " "project specifies a build backend of {} " @@ -85,11 +111,13 @@ def load_pyproject_toml(use_pep517, pyproject_toml, setup_py, req_name): # section, or the user has no pyproject.toml, but has opted in # explicitly via --use-pep517. # In the absence of any explicit backend specification, we - # assume the setuptools backend, and require wheel and a version - # of setuptools that supports that backend. + # assume the setuptools backend that most closely emulates the + # traditional direct setup.py execution, and require wheel and + # a version of setuptools that supports that backend. + build_system = { - "requires": ["setuptools>=38.2.5", "wheel"], - "build-backend": "setuptools.build_meta", + "requires": ["setuptools>=40.8.0", "wheel"], + "build-backend": "setuptools.build_meta:__legacy__", } # If we're using PEP 517, we have build system information (either @@ -123,22 +151,21 @@ def load_pyproject_toml(use_pep517, pyproject_toml, setup_py, req_name): )) backend = build_system.get("build-backend") - check = [] + check = [] # type: List[str] if backend is None: # If the user didn't specify a backend, we assume they want to use # the setuptools backend. But we can't be sure they have included # a version of setuptools which supplies the backend, or wheel - # (which is neede by the backend) in their requirements. So we + # (which is needed by the backend) in their requirements. So we # make a note to check that those requirements are present once # we have set up the environment. - # TODO: Review this - it's quite a lot of work to check for a very - # specific case. The problem is, that case is potentially quite - # common - projects that adopted PEP 518 early for the ability to - # specify requirements to execute setup.py, but never considered - # needing to mention the build tools themselves. The original PEP - # 518 code had a similar check (but implemented in a different - # way). - backend = "setuptools.build_meta" - check = ["setuptools>=38.2.5", "wheel"] + # This is quite a lot of work to check for a very specific case. But + # the problem is, that case is potentially quite common - projects that + # adopted PEP 518 early for the ability to specify requirements to + # execute setup.py, but never considered needing to mention the build + # tools themselves. The original PEP 518 code had a similar check (but + # implemented in a different way). + backend = "setuptools.build_meta:__legacy__" + check = ["setuptools>=40.8.0", "wheel"] return (requires, backend, check) diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/__init__.py b/env/lib/python3.7/site-packages/pip/_internal/req/__init__.py index b270498..c39f63f 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/req/__init__.py +++ b/env/lib/python3.7/site-packages/pip/_internal/req/__init__.py @@ -6,7 +6,10 @@ from .req_install import InstallRequirement from .req_set import RequirementSet from .req_file import parse_requirements from pip._internal.utils.logging import indent_log +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +if MYPY_CHECK_RUNNING: + from typing import Any, List, Sequence __all__ = [ "RequirementSet", "InstallRequirement", @@ -16,8 +19,14 @@ __all__ = [ logger = logging.getLogger(__name__) -def install_given_reqs(to_install, install_options, global_options=(), - *args, **kwargs): +def install_given_reqs( + to_install, # type: List[InstallRequirement] + install_options, # type: List[str] + global_options=(), # type: Sequence[str] + *args, # type: Any + **kwargs # type: Any +): + # type: (...) -> List[InstallRequirement] """ Install everything in the given list. diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/__init__.cpython-37.pyc index 4e3c7a3e1179cf97d49f170dfa58a11da4b55fc7..d0f41693ce0b5e59293c62831cbc1adf6e3c530e 100644 GIT binary patch delta 387 zcmey!-N4J|#LLUY00eo9C1PzjC-O-!_Dodw@MK8g$l=cAiQ-{oNaZQYNMT6f%;C-D zi{i`WkK)f2h!S9ANa0H1PT@)6O=pP`Ol4Xilq$TCF-jywAca4Lw}mlEG=(XcK~r$z zlq_9M##=(ZkpYqM&K|DL-tj@9etw>Q?wZWEm>u&fZ?X7f7MI-O2u>|5P0dSA-T3bf zqYW?6ML=CFd5O8HnoPHt^bBq>7o`>!fyBYYFKhjh+yecA%mUrayyB9?oE+Vh!pgh~ z!?cXaYRr0!>YGEEa~b8}>Wc(HI(dME7!ViR0SN}a$q!iU*}ztbO;%;iVU(I&z$zkN zQdy9hmtMpHRB?+9%HafZia_C1#67u}RmnpH!~~g!a1n$BvgQ_tO>TZlX-=vgBal}t Z0VH^sIGA`Cp^%A%QG}U=k%O6w4FJJNR(Jpa delta 262 zcmZqR{m9Md#LLUY00dF<)narxCh|!zW=vG~P~}MBOyNr5PG^bYPGwralghi0F^VsR zFNHUSyM-}|KZPlnL6d*tj;zi8jBgliIDrOeGTvgzOUzBxWV*$qXK;(TD7CN%Bn~Ei zS?ibN7U&mb7U*W?6_+IDuUH63@Gx;O P@i2lR3kxF$GZ!-e;Eyy+ diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/constructors.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/constructors.cpython-37.pyc index 62aee57e45f5e17b1c68b41d07ebf7b8c1f3a312..2a10603b04bdec7de0386e6f6333b266928cff10 100644 GIT binary patch delta 3640 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 delta 2952 zcmZuzO^n;d6`tY$kHnR$neM!|U@v5joV(9kv==iy?=E>&yPD~iyX@8M8t4Pk38$KA* zACeoNY!RkKw5#&p!$S0kj28j}Cz!^Jk-*GZf|JBbXblUIGNMmtP+&Ri$?`*)SrBg$ zTAku~Sjvc&2`iLItcFUYW?M2Mnk{}wiX<4i3ZE&y_>2_M@tW(U=U3GNrDu}2r>UQs@&(@Nf{*acFFZ7%9RR}H5#4>1K85?dp2wOd`f3}@$ z7{AJuvJ**#UceWUzZ#XKW}Z|QaZo9_V%DgZ{M6hpp&|L5dFpUBQzmdaJ_F(el;AuF zVoG98$k7=p!25h9wWX>W~6xD6fSA#x~Y{iIG^3 z6h^u_zj8Mhije|#V~gClCXrC;8r-G?-%tjSDdV$!54`UZ9J?ADa7=JO5g-k)2a^Ig z1VGt`k?0F;#FW;5z$7L=GLpYc)Rii%s;(uKLOr=ys17iAbuEh(Ujv=v7Py2$M1i~E z1r!q?>Lx!9RcgQ?IYDEa_dI?9o!>|C0~Bwg02(9wRS@Zfb0_4@pwYYKaNcGP-$d8z zD5@alULHT6g7&9SfX8P=E5s&vahMUA$(O}%eJ2;?_&-7`GVjsgkKqJ^W$p5V78cN& zjXxF^QGY^tH5*-m(HBeQ!LC2j!Sl07?@TkTD}a7AoEerO#q~~QG;YIeUt6vU9(e=+ z8_y4|Sr~OcoC9qhzL;l5ldKak>h>rOH&H<+TC(FlHWQF^&|F=nO z`NxviCJ%nk^0n~La0Oy+L3m0JNMzxXkZ;~2zVI#yUjZAyIs!tCM40`@F90n^2Ah1O z!$mNaJezzBWO8omnX(^H!K=x?rhc?q1+^}4#1W83zfNBQj%Q4xZ|pd}bEnVG3dx7l z*MtuilD}7GpUy}FmA{3fRIkaq4iEk>y0e_Aa~(SJW7t~`Lf-CkKqTQWs3g_=9{2jq z@Or8?uLY=NIh1i4KaAtV!0D$-(+!~>XWyWRb7V zS<)k^rDD^+o9ey3!<%7`2dNHu+;XlpTiw*yhMhIThI6NtaYKD#obeZNo(m|x$p@)1 z4rc@R`4jYKT#J#;KAX~hYPr2$H#psJ+g+!@+B}uBEkNuTYXBQ(M6q|08NW}%@Mlnh zk3bML`9ryLx<(a21J0Nd1&VbJ3NQ%r89p);4CxzC0v`k*Ib-OUBzG(8#~}?m3cnK3 zj@r>837F(cC;;!$4&1AI_=L+GkqM||;v*^fbLDYO81EVh5GeA0*fS4SJNayOZh(w9 z#+Twdq1$VX!-n))m&X`=8A6=Qo@70*3I8w+xIY{4AJe<-urXy;aW0HQI<@EslUr zi{Es^PaE9e?=Q^K$>g^SHFggB7>$=$le*5`fVaRr&KA7NIifPVBsiXYw*0S!qKdXG r9@>W2V>eyrEGB4h3WNlhNY3orR~99zhz2!8EvLPvEfH!gK)Lo`2PUC_ diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_file.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_file.cpython-37.pyc index 07a1afdd6aee6bac91e6fdf5baf7b5d87c7b9d5a..ef7364ca5db0018f48339a9c14d8199e102f3979 100644 GIT binary patch delta 3254 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 delta 2689 zcmZ`5U2hv%_1>BBcs#Zzj_o*hJ{_k`;-sXzZMPpZN>R6T*#*LOTbjjcu^it?;=~y{ zcc$AQ?qEcNSXfnLI}#7w2W*KK#6Dr*2Oyr8S2QZH0$y1_NQ>YBIOn?UqDYK%KJNLr z_ndRjy?36x^8U;7SCdJTz*qU<+?^jS6Y@tKJo_wQJ_F$1es})uj=4oEIXluFWpO*Q zlkX{&f*d7!v@#~SByi)lwKD-Q2`~jP4NwG_0Vn~?0-OLi2`~pR53m4G-m)r-K$iec z0eosptt>N(4IL7D`5JjZZ&gmS5*udbA+5Z?(kydGDlf8GmSrO#Im2>n6eMR^o)v(e zV`FR_=u2#ZO#(g7rr0#l3#`ayfL>(kO;SD)d`y2C+*G$OtB~f)m}(Z#77^rb!l!~h zAUot;Wna5VeoV?V)R^shWhGRWUkGW7$HA7zga4>GqkezO+41(z1(VwH!eyLD0i+Y2 z0&=|`1&kk7GyzZtaNB{am2O9U!&8JI)CY)B{L0Tlh&h(Qad7DtOUs)&nXVwX$kX5Ai58D5;_D>oVqhF;ocqe-4q7@pO zji&9?_UusKY&gv3d>DcVqph~rXgMxV!-!{46u-Z1+s$gdR^PS*YFvJCkSFSg5Mjft z0=RiVBxz8E>Y74Rs;OAiqy{zmd&ZlzGXYv&Ks1Ty*eoL;s{*)K52B~gPkM9I)MF@x z5B-ss75f1c)q~A>K>e7Ab!m_ICZocvLV0*es5>g~s;8mFosQzi{e&0U(V4PK_*IeU zMw!~9ega$#FV-~$w5~9F3RFAkTTBxM-(V3(VLDcPQ_T^7NW}T?M1%_w*@=TD>Zf3I z-8!w1Wr1^Y4Qr$t&McZPO#{J???!^l&gZ-Op!MBNh5EcpIZ zjysfp8X0u*GZ1;!vC!b@IPPb?k#0`V9tD>TZ?v0-tTR2u&p0Ki$)LtP^a?v;-EoO0 z(0X9wO^S@{$q0017E(w&j6(l@Ec-X%kBE`ZAiDkTI&nUPg{NSdUm+Ed>Xh?=P>&S; z2*wJ?pCH|$Laj~%S7h;B1Ee3pK^#bCz*d9(o$g|eGd)TP&{>e)Mk-Uv4MLRo1O#eB ztp4aAdNC?;kXc@iPKrEartsH9-p|3Lv)wt+4yK$3Ib(5Hb^#_X!-&gK8AgjRdIa`M z-4aVO>kva&?7x?2s8_VX$uSykt6B4GHfZ}X=vz(!l{IcZ3aFLL|kILMaSyO&x6y404|n+L`=r?p}S_%F#y8KcbgmU>Z z9c+obP|tw$ZvZYn7DP)xB}~ZI(h{1k@H724@^4bQ8T_PhGK;CoEW-$txY34WCxbr~ zW*6kPeiGF4$oL$1L?L>&2n^AJ(__eJFkBo#%pDj`#?k0y|=+Tz=1$s*Z+6I zc`!PG6UrY4&4OYXP%=IrERO&ETnVS3{IimT)P`3x3eDl!+!@qemdjXa*7i17ZS^8f z6x^72{zfb$WpSnalp99NK z-?Ba1c`J-^yWOnS?XrF>tuPAe>RUA)8i1*C0xnIyd)STpOi z5^T;aUWrz#wPv$gJC`kMc740?OUsH>IVDhwK$ZxP|h)<#;A#r*rH^*)<$@nq%E%qW@Ev=iL<= zD|;<=uW7HUVCLQl?#@n7E%@GSv7}KWqCuey%~A<9i-rXc95wfiVIyZu8gV1}U-0Zv AIRF3v diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_install.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_install.cpython-37.pyc index a34182b1c8c682c8cf76f137babf9684caf5257a..7e8f41c8df45e851cdd05d11a419b07707667462 100644 GIT binary patch delta 10173 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 delta 8145 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 diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-37.pyc index 8daa87c157a6de3be0fe5ccfed44d8d392b43a2b..f78f36103f38af57aaaf7ba9db1739e45f64eb38 100644 GIT binary patch delta 1357 zcmaJ>&2Jk;6yMohugB}P<0ehwI21?XqgW^jm7t;$icl>QB1#&ijZhb%)h0WMx7iQp z?HDzckPmR+z$MxvDgtpsTo5<@0yuEuHh%%!5r>|5Z(LepA#A;$-^{%Cdmr=0j~0G! zH*Yo?u7RKI+xAB{yz^$8eRqDfKaPyZPHL&^yUY+Se1YpqQcpeKV+QI@(ny*;sK8HJxH`Zl3Tpz~6)p)|S8l9eH53U^z%Ad^j`XYJFA{b`*r+ND| z^64>H#vdSk0#{H|wIIOw0)pU0Toxt*Iu+JFTP}aGx-U$bb2NVt%OH5=sdcri+h6Xs za19Fx%D$h+8O)*Dvvf#hCs>+t24OJ}(R2cJiVtVOFqDI9L~0`#=8u2bo2>pSs>&)P zz-qbWyumu5OiUr~nw1XXIN4avJ@hbCZsF;`v4R0dFb(G?H1ZtJ@ z{g?=#gP+b9J`FieMeti>KK{pClm?_7f3iBIQczun*sjV|wEWvU`6@ehg3AvUZ0p|;tjZbFxUMrzWsr*yDV zF1Ra$n{@JwO=~od;33ST==8YB8{FnKUg2}R%Io^Hx2)VCI2y?jh#&x(SlA?Zo!}(| zRZa5a<2XBpR{52Cb=<*+vKGWN=J*)bMlw!{HF-893z{~p1D|dI71Et22UHML3Fz9O zhTvbhNQ482S9Xfb`aJ{vb*ZI`HfbJ#z;Jqc>SRzm7V;M6Cjk1yO!udp{NTPgl)AwG i>WkuUA=4-k8w|}0>X&D7_T+1N%rkAAt2T;fy4K&HQ!Q2i delta 942 zcmaJJ^tP;tciZ?&|kmRd@fKdQ~p26bhb!U+{YF z{z~?sIK>_u%&*Rf%$uz6-m)Nf-H7Zc^TLQSBLCb93Xyro@STJ2=MEceg0VpEo8Q=k zyk(Vn{ZTXSq(=e9u2^_IyhlE4$l{x0TbX zB`pz+mXV_>;7Pb!OIv41)J8Da;fKr`%h7_ek`!Q8{&Fs{aana|HjB6l#|X5GJ8-c; z?13iO?YPkkyrHf#8@q~$5o@TT#2iL)8i5YX{kTN}Fpi)c5Ienx0;n_P^kZrQW+^@5 zKj;!JP)gH}o*67);tEE>5zyunfA=hKH?(>bxT{@Ji$&yfpv%+VngThRP7?gbkif1L+%^@{Y*1fgL z38Iz>P7&x+`6~yL@~bz~TBOWSO^@i|0bMY4q|4(b&vOfZo0qu5J)QN7$_v9rKkb7E zLokVTmEb%9Jy+#+d(CD$Zh|Y)mpCa diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc index 9927332d228a8a82a61f62991e806e6201a093cf..2c164931b8299f660e47c7b2d280fc8da7cc779a 100644 GIT binary patch delta 8404 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 delta 4205 zcmZu!Yit}>6`ngYJ3IUE#@YCh2Z`5?<9L(WNt3p59>j^8Hhs{Nv?-y6X1d-xw%4A0 z_|Ev1uC;9)wa}_+!$qn9LDwy!P^g5k1m#isqf%QT1b;wC^BYxyfBX#y_|6?aQp2w1 z%)RHHd+xdCJ%4$D-Q<~(mX@T3-{>2CUoD)!nc2y*HxItsU>etW!rNEw8tr15Yc_Lk z_X->B;Ypslp^fh6Y2Jc&uiMKreA^9enT;Oct$aIheLTx|;C=9-#@l%N4UM~iFv1*AL9DsT7Ku>==3}bw-v_xsy7?BPN`gz@3Uu^El=uW+p*Mg#Vyw^l!RLh zs$y|<$oMtu+J{}Y&K(KLwIj7sZJ<=~gM#M`6z3-@Q^Cw#G8?;R|1Qw@JBfeHW|nTU z46_))3}CCCVIn7|WAA;Ac!@56(3-83W@g`I-)2EPM9OUmIyI~!VkBJnZnB9@`yyR|i1Om8L5Ot=+yp(f6b%G0U*!OgSJVOez3 z7R#@Sz~$oeG%*U5MbRT)PVIUiO!|}6S&usf&Z8^pk=SZ$bkAb7Tq_iVOW5jX0W=Fb zWm%@Pw4PMD6&EGT_BGhDwxkCH4F%1G`|Iq2_SD&>SUuL%Ia^`k=uA$H^%driaHAfZ zw#1dX(KG^cD%P~>u@z7;t!_54Mx&YBRV`paoYtr8y1A?`vn4A?)D66ig`jTW1aB$6 zFm48BGb!K6?mZD5^|P5b71LDRuBTS?rL>x*>uHD)t=KfKThnpzW?gR@tN+gaiw&Q` z4fBTB)FN3SuZy#Ih1Pi0!AL9ae;qc=vWzahjy-#x#46Ek{0xlF z;qk}iU%QW#zKypc){}fY&*GipJ9r!3X}5*9^A434GQ1OUzDr*0 zsU(Try~OUA{Gg}1!5PAT)|M0uN9R7}{8Q>v5#$9bLP zN&{%j#-H?)mY4T`aHIfK6b`rT1ujfFHCL2N0Yd5x%zYg|v*d8^9~&Ds7RP~8RutQ5 z^awy`xeM?MUy!N=T`6*mr)bUgYhEdE7Xp!>1sfo5iVYb;bJ8vF&PTaNCqj)QSz24tsPx5 zL6@$ZD{Ltiux1O7VXT9LHkD~^BRtcB*1B1bEdx67b#70S zDfUOV&sPJyyDsLb=`V&!@s9L%u3T;F@+@-MickEmD(!Ga&(AaiKREw_5 zbN!1)D*53Y@&H>5Sw%bx!n`FY*+pz0qER;iiVi_ZARmij?ioTf2vFq{mkE4U05J>P zr+A{WXxa%h7ba4xrBi-Q>(_f_{xE`ufrfr29tu$9aL-~u-ZX_EnYKkPKn3CyKqz$N zMcjB?1J2^`vUS|TAjWa{PVW+uXVaz-L&?>f3HTnu3mQ(=^*U4jHniq%dsEHyn!_2W zv@OcvysH{#Fo7lidB<_~s2m)~v-{X=;8jy?*?dl7lCB}M9^9zr>EB) zkF~QgSMK@`<8tNhK6aP<HDPo+CBFT zk^V#5otQu+Lyp+2JuWT8C)}VA1R_j0HBp@_QR8xqIP}QaiF*!EgCXdiQKfpAMjnA7 zfY7Yg+=_TaK7HZI z>jZ1!Jisb( z&@nKz>jT)kTV6bSzM&jcWq{uh;dcST1gaHRw->)9BxOJ4hv5QNPiMvv)?&jz!?bsV7+FZ$3Fd4MoZodNQ56!5Q6T@l}q z`_Et1M|aECkv93-`9+x->6%o{aRO=J3#ye6N=|k295FjgfTBI>BA&!3w5nrM_}o?= wuSB`+{u`2q_L*{(&wB1zNU!;Wa`(M^I{Hm~4;ps6ol18ieC}**Xbmm?UmyLOH~;_u diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/constructors.py b/env/lib/python3.7/site-packages/pip/_internal/req/constructors.py index 4c4641d..0f18b6a 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/req/constructors.py +++ b/env/lib/python3.7/site-packages/pip/_internal/req/constructors.py @@ -11,7 +11,6 @@ InstallRequirement. import logging import os import re -import traceback from pip._vendor.packaging.markers import Marker from pip._vendor.packaging.requirements import InvalidRequirement, Requirement @@ -24,11 +23,20 @@ from pip._internal.download import ( from pip._internal.exceptions import InstallationError from pip._internal.models.index import PyPI, TestPyPI from pip._internal.models.link import Link +from pip._internal.pyproject import make_pyproject_path from pip._internal.req.req_install import InstallRequirement from pip._internal.utils.misc import is_installable_dir +from pip._internal.utils.typing import MYPY_CHECK_RUNNING from pip._internal.vcs import vcs from pip._internal.wheel import Wheel +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Dict, Optional, Set, Tuple, Union, + ) + from pip._internal.cache import WheelCache + + __all__ = [ "install_req_from_editable", "install_req_from_line", "parse_editable" @@ -39,6 +47,7 @@ operators = Specifier._operators.keys() def _strip_extras(path): + # type: (str) -> Tuple[str, Optional[str]] m = re.match(r'^(.+)(\[[^\]]+\])$', path) extras = None if m: @@ -51,6 +60,7 @@ def _strip_extras(path): def parse_editable(editable_req): + # type: (str) -> Tuple[Optional[str], str, Optional[Set[str]]] """Parses an editable requirement into: - a requirement name - an URL @@ -68,10 +78,18 @@ def parse_editable(editable_req): if os.path.isdir(url_no_extras): if not os.path.exists(os.path.join(url_no_extras, 'setup.py')): - raise InstallationError( - "Directory %r is not installable. File 'setup.py' not found." % - url_no_extras + msg = ( + 'File "setup.py" not found. Directory cannot be installed ' + 'in editable mode: {}'.format(os.path.abspath(url_no_extras)) ) + pyproject_path = make_pyproject_path(url_no_extras) + if os.path.isfile(pyproject_path): + msg += ( + '\n(A "pyproject.toml" file was found, but editable ' + 'mode currently requires a setup.py based build.)' + ) + raise InstallationError(msg) + # Treating it as code that has already been checked out url_no_extras = path_to_url(url_no_extras) @@ -116,6 +134,7 @@ def parse_editable(editable_req): def deduce_helpful_msg(req): + # type: (str) -> str """Returns helpful msg in case requirements file does not exist, or cannot be parsed. @@ -136,7 +155,7 @@ def deduce_helpful_msg(req): " the packages specified within it." except RequirementParseError: logger.debug("Cannot parse '%s' as requirements \ - file" % (req), exc_info=1) + file" % (req), exc_info=True) else: msg += " File '%s' does not exist." % (req) return msg @@ -146,9 +165,15 @@ def deduce_helpful_msg(req): def install_req_from_editable( - editable_req, comes_from=None, isolated=False, options=None, - wheel_cache=None, constraint=False + editable_req, # type: str + comes_from=None, # type: Optional[str] + use_pep517=None, # type: Optional[bool] + isolated=False, # type: bool + options=None, # type: Optional[Dict[str, Any]] + wheel_cache=None, # type: Optional[WheelCache] + constraint=False # type: bool ): + # type: (...) -> InstallRequirement name, url, extras_override = parse_editable(editable_req) if url.startswith('file:'): source_dir = url_to_path(url) @@ -167,6 +192,7 @@ def install_req_from_editable( editable=True, link=Link(url), constraint=constraint, + use_pep517=use_pep517, isolated=isolated, options=options if options else {}, wheel_cache=wheel_cache, @@ -175,9 +201,15 @@ def install_req_from_editable( def install_req_from_line( - name, comes_from=None, isolated=False, options=None, wheel_cache=None, - constraint=False + name, # type: str + comes_from=None, # type: Optional[Union[str, InstallRequirement]] + use_pep517=None, # type: Optional[bool] + isolated=False, # type: bool + options=None, # type: Optional[Dict[str, Any]] + wheel_cache=None, # type: Optional[WheelCache] + constraint=False # type: bool ): + # type: (...) -> InstallRequirement """Creates an InstallRequirement from a name, which might be a requirement, directory containing 'setup.py', filename, or URL. """ @@ -186,24 +218,24 @@ def install_req_from_line( else: marker_sep = ';' if marker_sep in name: - name, markers = name.split(marker_sep, 1) - markers = markers.strip() - if not markers: + name, markers_as_string = name.split(marker_sep, 1) + markers_as_string = markers_as_string.strip() + if not markers_as_string: markers = None else: - markers = Marker(markers) + markers = Marker(markers_as_string) else: markers = None name = name.strip() - req = None + req_as_string = None path = os.path.normpath(os.path.abspath(name)) link = None - extras = None + extras_as_string = None if is_url(name): link = Link(name) else: - p, extras = _strip_extras(path) + p, extras_as_string = _strip_extras(path) looks_like_dir = os.path.isdir(p) and ( os.path.sep in name or (os.path.altsep is not None and os.path.altsep in name) or @@ -234,38 +266,41 @@ def install_req_from_line( # wheel file if link.is_wheel: wheel = Wheel(link.filename) # can raise InvalidWheelFilename - req = "%s==%s" % (wheel.name, wheel.version) + req_as_string = "%s==%s" % (wheel.name, wheel.version) else: # set the req to the egg fragment. when it's not there, this # will become an 'unnamed' requirement - req = link.egg_fragment + req_as_string = link.egg_fragment # a requirement specifier else: - req = name + req_as_string = name - if extras: - extras = Requirement("placeholder" + extras.lower()).extras + if extras_as_string: + extras = Requirement("placeholder" + extras_as_string.lower()).extras else: extras = () - if req is not None: + if req_as_string is not None: try: - req = Requirement(req) + req = Requirement(req_as_string) except InvalidRequirement: - if os.path.sep in req: + if os.path.sep in req_as_string: add_msg = "It looks like a path." - add_msg += deduce_helpful_msg(req) - elif '=' in req and not any(op in req for op in operators): + add_msg += deduce_helpful_msg(req_as_string) + elif ('=' in req_as_string and + not any(op in req_as_string for op in operators)): add_msg = "= is not a valid operator. Did you mean == ?" else: - add_msg = traceback.format_exc() + add_msg = "" raise InstallationError( - "Invalid requirement: '%s'\n%s" % (req, add_msg) + "Invalid requirement: '%s'\n%s" % (req_as_string, add_msg) ) + else: + req = None return InstallRequirement( req, comes_from, link=link, markers=markers, - isolated=isolated, + use_pep517=use_pep517, isolated=isolated, options=options if options else {}, wheel_cache=wheel_cache, constraint=constraint, @@ -273,19 +308,25 @@ def install_req_from_line( ) -def install_req_from_req( - req, comes_from=None, isolated=False, wheel_cache=None +def install_req_from_req_string( + req_string, # type: str + comes_from=None, # type: Optional[InstallRequirement] + isolated=False, # type: bool + wheel_cache=None, # type: Optional[WheelCache] + use_pep517=None # type: Optional[bool] ): + # type: (...) -> InstallRequirement try: - req = Requirement(req) + req = Requirement(req_string) except InvalidRequirement: - raise InstallationError("Invalid requirement: '%s'" % req) + raise InstallationError("Invalid requirement: '%s'" % req_string) domains_not_allowed = [ PyPI.file_storage_domain, TestPyPI.file_storage_domain, ] - if req.url and comes_from.link.netloc in domains_not_allowed: + if (req.url and comes_from and comes_from.link and + comes_from.link.netloc in domains_not_allowed): # Explicitly disallow pypi packages that depend on external urls raise InstallationError( "Packages installed from PyPI cannot depend on packages " @@ -294,5 +335,6 @@ def install_req_from_req( ) return InstallRequirement( - req, comes_from, isolated=isolated, wheel_cache=wheel_cache + req, comes_from, isolated=isolated, wheel_cache=wheel_cache, + use_pep517=use_pep517 ) diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/req_file.py b/env/lib/python3.7/site-packages/pip/_internal/req/req_file.py index e7acf7c..270b75c 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/req/req_file.py +++ b/env/lib/python3.7/site-packages/pip/_internal/req/req_file.py @@ -19,6 +19,18 @@ from pip._internal.exceptions import RequirementsFileParseError from pip._internal.req.constructors import ( install_req_from_editable, install_req_from_line, ) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Callable, Iterator, List, NoReturn, Optional, Text, Tuple, + ) + from pip._internal.req import InstallRequirement + from pip._internal.cache import WheelCache + from pip._internal.index import PackageFinder + from pip._internal.download import PipSession + + ReqFileLines = Iterator[Tuple[int, Text]] __all__ = ['parse_requirements'] @@ -43,24 +55,32 @@ SUPPORTED_OPTIONS = [ cmdoptions.no_binary, cmdoptions.only_binary, cmdoptions.pre, - cmdoptions.process_dependency_links, cmdoptions.trusted_host, cmdoptions.require_hashes, -] +] # type: List[Callable[..., optparse.Option]] # options to be passed to requirements SUPPORTED_OPTIONS_REQ = [ cmdoptions.install_options, cmdoptions.global_options, cmdoptions.hash, -] +] # type: List[Callable[..., optparse.Option]] # the 'dest' string values -SUPPORTED_OPTIONS_REQ_DEST = [o().dest for o in SUPPORTED_OPTIONS_REQ] +SUPPORTED_OPTIONS_REQ_DEST = [str(o().dest) for o in SUPPORTED_OPTIONS_REQ] -def parse_requirements(filename, finder=None, comes_from=None, options=None, - session=None, constraint=False, wheel_cache=None): +def parse_requirements( + filename, # type: str + finder=None, # type: Optional[PackageFinder] + comes_from=None, # type: Optional[str] + options=None, # type: Optional[optparse.Values] + session=None, # type: Optional[PipSession] + constraint=False, # type: bool + wheel_cache=None, # type: Optional[WheelCache] + use_pep517=None # type: Optional[bool] +): + # type: (...) -> Iterator[InstallRequirement] """Parse a requirements file and yield InstallRequirement instances. :param filename: Path or url of requirements file. @@ -71,6 +91,7 @@ def parse_requirements(filename, finder=None, comes_from=None, options=None, :param constraint: If true, parsing a constraint file rather than requirements file. :param wheel_cache: Instance of pip.wheel.WheelCache + :param use_pep517: Value of the --use-pep517 option. """ if session is None: raise TypeError( @@ -87,18 +108,19 @@ def parse_requirements(filename, finder=None, comes_from=None, options=None, for line_number, line in lines_enum: req_iter = process_line(line, filename, line_number, finder, comes_from, options, session, wheel_cache, - constraint=constraint) + use_pep517=use_pep517, constraint=constraint) for req in req_iter: yield req def preprocess(content, options): + # type: (Text, Optional[optparse.Values]) -> ReqFileLines """Split, filter, and join lines, and return a line iterator :param content: the content of the requirements file :param options: cli options """ - lines_enum = enumerate(content.splitlines(), start=1) + lines_enum = enumerate(content.splitlines(), start=1) # type: ReqFileLines lines_enum = join_lines(lines_enum) lines_enum = ignore_comments(lines_enum) lines_enum = skip_regex(lines_enum, options) @@ -106,9 +128,19 @@ def preprocess(content, options): return lines_enum -def process_line(line, filename, line_number, finder=None, comes_from=None, - options=None, session=None, wheel_cache=None, - constraint=False): +def process_line( + line, # type: Text + filename, # type: str + line_number, # type: int + finder=None, # type: Optional[PackageFinder] + comes_from=None, # type: Optional[str] + options=None, # type: Optional[optparse.Values] + session=None, # type: Optional[PipSession] + wheel_cache=None, # type: Optional[WheelCache] + use_pep517=None, # type: Optional[bool] + constraint=False # type: bool +): + # type: (...) -> Iterator[InstallRequirement] """Process a single requirements line; This can result in creating/yielding requirements, or updating the finder. @@ -130,13 +162,15 @@ def process_line(line, filename, line_number, finder=None, comes_from=None, defaults = parser.get_default_values() defaults.index_url = None if finder: - # `finder.format_control` will be updated during parsing defaults.format_control = finder.format_control args_str, options_str = break_args_options(line) + # Prior to 2.7.3, shlex cannot deal with unicode entries if sys.version_info < (2, 7, 3): - # 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) + # https://github.com/python/mypy/issues/1174 + options_str = options_str.encode('utf8') # type: ignore + # https://github.com/python/mypy/issues/1174 + opts, _ = parser.parse_args( + shlex.split(options_str), defaults) # type: ignore # preserve for the nested code path line_comes_from = '%s %s (line %s)' % ( @@ -155,6 +189,7 @@ def process_line(line, filename, line_number, finder=None, comes_from=None, req_options[dest] = opts.__dict__[dest] yield install_req_from_line( args_str, line_comes_from, constraint=constraint, + use_pep517=use_pep517, isolated=isolated, options=req_options, wheel_cache=wheel_cache ) @@ -163,6 +198,7 @@ def process_line(line, filename, line_number, finder=None, comes_from=None, isolated = options.isolated_mode if options else False yield install_req_from_editable( opts.editables[0], comes_from=line_comes_from, + use_pep517=use_pep517, constraint=constraint, isolated=isolated, wheel_cache=wheel_cache ) @@ -183,11 +219,11 @@ def process_line(line, filename, line_number, finder=None, comes_from=None, # do a join so relative paths work req_path = os.path.join(os.path.dirname(filename), req_path) # TODO: Why not use `comes_from='-r {} (line {})'` here as well? - parser = parse_requirements( + parsed_reqs = parse_requirements( req_path, finder, comes_from, options, session, constraint=nested_constraint, wheel_cache=wheel_cache ) - for req in parser: + for req in parsed_reqs: yield req # percolate hash-checking option upward @@ -214,14 +250,13 @@ def process_line(line, filename, line_number, finder=None, comes_from=None, finder.find_links.append(value) if opts.pre: finder.allow_all_prereleases = True - if opts.process_dependency_links: - finder.process_dependency_links = True if opts.trusted_hosts: finder.secure_origins.extend( ("*", host, "*") for host in opts.trusted_hosts) def break_args_options(line): + # type: (Text) -> Tuple[str, Text] """Break up the line into an args and options string. We only want to shlex (and then optparse) the options, not the args. args can contain markers which are corrupted by shlex. @@ -235,10 +270,11 @@ def break_args_options(line): else: args.append(token) options.pop(0) - return ' '.join(args), ' '.join(options) + return ' '.join(args), ' '.join(options) # type: ignore def build_parser(line): + # type: (Text) -> optparse.OptionParser """ Return a parser for parsing requirement lines """ @@ -252,20 +288,24 @@ def build_parser(line): # By default optparse sys.exits on parsing errors. We want to wrap # that in our own exception. def parser_exit(self, msg): + # type: (Any, str) -> NoReturn # add offending line msg = 'Invalid requirement: %s\n%s' % (line, msg) raise RequirementsFileParseError(msg) - parser.exit = parser_exit + # NOTE: mypy disallows assigning to a method + # https://github.com/python/mypy/issues/2427 + parser.exit = parser_exit # type: ignore return parser def join_lines(lines_enum): + # type: (ReqFileLines) -> ReqFileLines """Joins a line ending in '\' with the previous line (except when following comments). The joined line takes on the index of the first line. """ primary_line_number = None - new_line = [] + new_line = [] # type: List[Text] for line_number, line in lines_enum: if not line.endswith('\\') or COMMENT_RE.match(line): if COMMENT_RE.match(line): @@ -290,6 +330,7 @@ def join_lines(lines_enum): def ignore_comments(lines_enum): + # type: (ReqFileLines) -> ReqFileLines """ Strips comments and filter empty lines. """ @@ -301,6 +342,7 @@ def ignore_comments(lines_enum): def skip_regex(lines_enum, options): + # type: (ReqFileLines, Optional[optparse.Values]) -> ReqFileLines """ Skip lines that match '--skip-requirements-regex' pattern @@ -314,6 +356,7 @@ def skip_regex(lines_enum, options): def expand_env_variables(lines_enum): + # type: (ReqFileLines) -> ReqFileLines """Replace all environment variables that can be retrieved via `os.getenv`. The only allowed format for environment variables defined in the @@ -322,7 +365,7 @@ def expand_env_variables(lines_enum): 1. Strings that contain a `$` aren't accidentally (partially) expanded. 2. Ensure consistency across platforms for requirement files. - These points are the result of a discusssion on the `github pull + These points are the result of a discussion on the `github pull request #3514 `_. Valid characters in variable names follow the `POSIX standard diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/req_install.py b/env/lib/python3.7/site-packages/pip/_internal/req/req_install.py index c2624fe..25a692e 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/req/req_install.py +++ b/env/lib/python3.7/site-packages/pip/_internal/req/req_install.py @@ -22,7 +22,7 @@ from pip._internal.locations import ( PIP_DELETE_MARKER_FILENAME, running_under_virtualenv, ) from pip._internal.models.link import Link -from pip._internal.pyproject import load_pyproject_toml +from pip._internal.pyproject import load_pyproject_toml, make_pyproject_path from pip._internal.req.req_uninstall import UninstallPathSet from pip._internal.utils.compat import native_str from pip._internal.utils.hashes import Hashes @@ -30,29 +30,55 @@ from pip._internal.utils.logging import indent_log from pip._internal.utils.misc import ( _make_build_dir, ask_path_exists, backup_dir, call_subprocess, display_path, dist_in_site_packages, dist_in_usersite, ensure_dir, - get_installed_version, rmtree, + get_installed_version, redact_password_from_url, rmtree, ) from pip._internal.utils.packaging import get_metadata from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING from pip._internal.utils.ui import open_spinner from pip._internal.vcs import vcs from pip._internal.wheel import move_wheel_files +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Dict, Iterable, List, Mapping, Optional, Sequence, Union, + ) + from pip._internal.build_env import BuildEnvironment + from pip._internal.cache import WheelCache + from pip._internal.index import PackageFinder + from pip._vendor.pkg_resources import Distribution + from pip._vendor.packaging.specifiers import SpecifierSet + from pip._vendor.packaging.markers import Marker + + logger = logging.getLogger(__name__) class InstallRequirement(object): """ Represents something that may be installed later on, may have information - about where to fetch the relavant requirement and also contains logic for + about where to fetch the relevant requirement and also contains logic for installing the said requirement. """ - def __init__(self, req, comes_from, source_dir=None, editable=False, - link=None, update=True, markers=None, - isolated=False, options=None, wheel_cache=None, - constraint=False, extras=()): + def __init__( + self, + req, # type: Optional[Requirement] + comes_from, # type: Optional[Union[str, InstallRequirement]] + source_dir=None, # type: Optional[str] + editable=False, # type: bool + link=None, # type: Optional[Link] + update=True, # type: bool + markers=None, # type: Optional[Marker] + use_pep517=None, # type: Optional[bool] + isolated=False, # type: bool + options=None, # type: Optional[Dict[str, Any]] + wheel_cache=None, # type: Optional[WheelCache] + constraint=False, # type: bool + extras=() # type: Iterable[str] + ): + # type: (...) -> None assert req is None or isinstance(req, Requirement), req self.req = req self.comes_from = comes_from @@ -64,10 +90,10 @@ class InstallRequirement(object): self.editable = editable self._wheel_cache = wheel_cache - if link is not None: - self.link = self.original_link = link - else: - self.link = self.original_link = req and req.url and Link(req.url) + if link is None and req and req.url: + # PEP 508 URL requirement + link = Link(req.url) + self.link = self.original_link = link if extras: self.extras = extras @@ -77,11 +103,11 @@ class InstallRequirement(object): } else: self.extras = set() - if markers is not None: - self.markers = markers - else: - self.markers = req and req.marker - self._egg_info_path = None + if markers is None and req: + markers = req.marker + self.markers = markers + + self._egg_info_path = None # type: Optional[str] # This holds the pkg_resources.Distribution object if this requirement # is already available: self.satisfied_by = None @@ -92,11 +118,11 @@ class InstallRequirement(object): self._temp_build_dir = TempDirectory(kind="req-build") # Used to store the global directory where the _temp_build_dir should # have been created. Cf _correct_build_location method. - self._ideal_build_dir = None + self._ideal_build_dir = None # type: Optional[str] # True if the editable should be updated: self.update = update # Set to True after successful installation - self.install_succeeded = None + self.install_succeeded = None # type: Optional[bool] # UninstallPathSet of uninstalled distribution (for possible rollback) self.uninstalled_pathset = None self.options = options if options else {} @@ -105,32 +131,38 @@ class InstallRequirement(object): self.is_direct = False self.isolated = isolated - self.build_env = NoOpBuildEnvironment() + self.build_env = NoOpBuildEnvironment() # type: BuildEnvironment + + # For PEP 517, the directory where we request the project metadata + # gets stored. We need this to pass to build_wheel, so the backend + # can ensure that the wheel matches the metadata (see the PEP for + # details). + self.metadata_directory = None # type: Optional[str] # The static build requirements (from pyproject.toml) - self.pyproject_requires = None + self.pyproject_requires = None # type: Optional[List[str]] # Build requirements that we will check are available - # TODO: We don't do this for --no-build-isolation. Should we? - self.requirements_to_check = [] + self.requirements_to_check = [] # type: List[str] # The PEP 517 backend we should use to build the project - self.pep517_backend = None + self.pep517_backend = None # type: Optional[Pep517HookCaller] # Are we using PEP 517 for this requirement? # After pyproject.toml has been loaded, the only valid values are True # and False. Before loading, None is valid (meaning "use the default"). # Setting an explicit value before loading pyproject.toml is supported, # but after loading this flag should be treated as read only. - self.use_pep517 = None + self.use_pep517 = use_pep517 def __str__(self): + # type: () -> str if self.req: s = str(self.req) if self.link: - s += ' from %s' % self.link.url + s += ' from %s' % redact_password_from_url(self.link.url) elif self.link: - s = self.link.url + s = redact_password_from_url(self.link.url) else: s = '' if self.satisfied_by is not None: @@ -145,10 +177,12 @@ class InstallRequirement(object): return s def __repr__(self): + # type: () -> str return '<%s object: %s editable=%r>' % ( self.__class__.__name__, str(self), self.editable) def populate_link(self, finder, upgrade, require_hashes): + # type: (PackageFinder, bool, bool) -> None """Ensure that if a link can be found for this, that it is found. Note that self.link may still be None - if Upgrade is False and the @@ -171,16 +205,19 @@ class InstallRequirement(object): # Things that are valid for all kinds of requirements? @property def name(self): + # type: () -> Optional[str] if self.req is None: return None return native_str(pkg_resources.safe_name(self.req.name)) @property def specifier(self): + # type: () -> SpecifierSet return self.req.specifier @property def is_pinned(self): + # type: () -> bool """Return whether I am pinned to an exact version. For example, some-package==1.2 is pinned; some-package>1.2 is not. @@ -191,9 +228,11 @@ class InstallRequirement(object): @property def installed_version(self): + # type: () -> Optional[str] return get_installed_version(self.name) def match_markers(self, extras_requested=None): + # type: (Optional[Iterable[str]]) -> bool if not extras_requested: # Provide an extra to safely evaluate the markers # without matching any extra @@ -207,6 +246,7 @@ class InstallRequirement(object): @property def has_hash_options(self): + # type: () -> bool """Return whether any known-good hashes are specified as options. These activate --require-hashes mode; hashes specified as part of a @@ -216,6 +256,7 @@ class InstallRequirement(object): return bool(self.options.get('hashes', {})) def hashes(self, trust_internet=True): + # type: (bool) -> Hashes """Return a hash-comparer that considers my option- and URL-based hashes to be known-good. @@ -237,6 +278,7 @@ class InstallRequirement(object): return Hashes(good_hashes) def from_path(self): + # type: () -> Optional[str] """Format a nice indicator to show where this "comes from" """ if self.req is None: @@ -252,6 +294,7 @@ class InstallRequirement(object): return s def build_location(self, build_dir): + # type: (str) -> Optional[str] assert build_dir is not None if self._temp_build_dir.path is not None: return self._temp_build_dir.path @@ -279,6 +322,7 @@ class InstallRequirement(object): return os.path.join(build_dir, name) def _correct_build_location(self): + # type: () -> None """Move self._temp_build_dir to self._ideal_build_dir/self.req.name For some requirements (e.g. a path to a directory), the name of the @@ -292,7 +336,8 @@ class InstallRequirement(object): return assert self.req is not None assert self._temp_build_dir.path - assert self._ideal_build_dir.path + assert (self._ideal_build_dir is not None and + self._ideal_build_dir.path) # type: ignore old_location = self._temp_build_dir.path self._temp_build_dir.path = None @@ -311,7 +356,16 @@ class InstallRequirement(object): self.source_dir = os.path.normpath(os.path.abspath(new_location)) self._egg_info_path = None + # Correct the metadata directory, if it exists + if self.metadata_directory: + old_meta = self.metadata_directory + rel = os.path.relpath(old_meta, start=old_location) + new_meta = os.path.join(new_location, rel) + new_meta = os.path.normpath(os.path.abspath(new_meta)) + self.metadata_directory = new_meta + def remove_temporary_source(self): + # type: () -> None """Remove the source files from this requirement, if they are marked for deletion""" if self.source_dir and os.path.exists( @@ -323,6 +377,7 @@ class InstallRequirement(object): self.build_env.cleanup() def check_if_exists(self, use_user_site): + # type: (bool) -> bool """Find an installed distribution that satisfies or conflicts with this requirement, and set self.satisfied_by or self.conflicts_with appropriately. @@ -366,11 +421,22 @@ class InstallRequirement(object): # Things valid for wheels @property def is_wheel(self): - return self.link and self.link.is_wheel + # type: () -> bool + if not self.link: + return False + return self.link.is_wheel - def move_wheel_files(self, wheeldir, root=None, home=None, prefix=None, - warn_script_location=True, use_user_site=False, - pycompile=True): + def move_wheel_files( + self, + wheeldir, # type: str + root=None, # type: Optional[str] + home=None, # type: Optional[str] + prefix=None, # type: Optional[str] + warn_script_location=True, # type: bool + use_user_site=False, # type: bool + pycompile=True # type: bool + ): + # type: (...) -> None move_wheel_files( self.name, self.req, wheeldir, user=use_user_site, @@ -385,12 +451,14 @@ class InstallRequirement(object): # Things valid for sdists @property def setup_py_dir(self): + # type: () -> str return os.path.join( self.source_dir, self.link and self.link.subdirectory_fragment or '') @property def setup_py(self): + # type: () -> str assert self.source_dir, "No source dir for %s" % self setup_py = os.path.join(self.setup_py_dir, 'setup.py') @@ -403,17 +471,13 @@ class InstallRequirement(object): @property def pyproject_toml(self): + # type: () -> str assert self.source_dir, "No source dir for %s" % self - pp_toml = os.path.join(self.setup_py_dir, 'pyproject.toml') - - # Python2 __file__ should not be unicode - if six.PY2 and isinstance(pp_toml, six.text_type): - pp_toml = pp_toml.encode(sys.getfilesystemencoding()) - - return pp_toml + return make_pyproject_path(self.setup_py_dir) def load_pyproject_toml(self): + # type: () -> None """Load the pyproject.toml file. After calling this routine, all of the attributes related to PEP 517 @@ -437,40 +501,40 @@ class InstallRequirement(object): self.pyproject_requires = requires self.pep517_backend = Pep517HookCaller(self.setup_py_dir, backend) - def run_egg_info(self): + # Use a custom function to call subprocesses + self.spin_message = "" + + def runner( + cmd, # type: List[str] + cwd=None, # type: Optional[str] + extra_environ=None # type: Optional[Mapping[str, Any]] + ): + # type: (...) -> None + with open_spinner(self.spin_message) as spinner: + call_subprocess( + cmd, + cwd=cwd, + extra_environ=extra_environ, + spinner=spinner + ) + self.spin_message = "" + + self.pep517_backend._subprocess_runner = runner + + def prepare_metadata(self): + # type: () -> None + """Ensure that project metadata is available. + + Under PEP 517, call the backend hook to prepare the metadata. + Under legacy processing, call setup.py egg-info. + """ assert self.source_dir - if self.name: - logger.debug( - 'Running setup.py (path:%s) egg_info for package %s', - self.setup_py, self.name, - ) - else: - logger.debug( - 'Running setup.py (path:%s) egg_info for package from %s', - self.setup_py, self.link, - ) with indent_log(): - script = SETUPTOOLS_SHIM % self.setup_py - base_cmd = [sys.executable, '-c', script] - if self.isolated: - base_cmd += ["--no-user-cfg"] - egg_info_cmd = base_cmd + ['egg_info'] - # We can't put the .egg-info files at the root, because then the - # source code will be mistaken for an installed egg, causing - # problems - if self.editable: - egg_base_option = [] + if self.use_pep517: + self.prepare_pep517_metadata() else: - egg_info_dir = os.path.join(self.setup_py_dir, 'pip-egg-info') - ensure_dir(egg_info_dir) - egg_base_option = ['--egg-base', 'pip-egg-info'] - with self.build_env: - call_subprocess( - egg_info_cmd + egg_base_option, - cwd=self.setup_py_dir, - show_stdout=False, - command_desc='python setup.py egg_info') + self.run_egg_info() if not self.req: if isinstance(parse_version(self.metadata["Version"]), Version): @@ -489,15 +553,70 @@ class InstallRequirement(object): metadata_name = canonicalize_name(self.metadata["Name"]) if canonicalize_name(self.req.name) != metadata_name: logger.warning( - 'Running setup.py (path:%s) egg_info for package %s ' + 'Generating metadata for package %s ' 'produced metadata for project name %s. Fix your ' '#egg=%s fragments.', - self.setup_py, self.name, metadata_name, self.name + self.name, metadata_name, self.name ) self.req = Requirement(metadata_name) + def prepare_pep517_metadata(self): + # type: () -> None + assert self.pep517_backend is not None + + metadata_dir = os.path.join( + self.setup_py_dir, + 'pip-wheel-metadata' + ) + ensure_dir(metadata_dir) + + with self.build_env: + # Note that Pep517HookCaller implements a fallback for + # prepare_metadata_for_build_wheel, so we don't have to + # consider the possibility that this hook doesn't exist. + backend = self.pep517_backend + self.spin_message = "Preparing wheel metadata" + distinfo_dir = backend.prepare_metadata_for_build_wheel( + metadata_dir + ) + + self.metadata_directory = os.path.join(metadata_dir, distinfo_dir) + + def run_egg_info(self): + # type: () -> None + if self.name: + logger.debug( + 'Running setup.py (path:%s) egg_info for package %s', + self.setup_py, self.name, + ) + else: + logger.debug( + 'Running setup.py (path:%s) egg_info for package from %s', + self.setup_py, self.link, + ) + script = SETUPTOOLS_SHIM % self.setup_py + base_cmd = [sys.executable, '-c', script] + if self.isolated: + base_cmd += ["--no-user-cfg"] + egg_info_cmd = base_cmd + ['egg_info'] + # We can't put the .egg-info files at the root, because then the + # source code will be mistaken for an installed egg, causing + # problems + if self.editable: + egg_base_option = [] # type: List[str] + else: + egg_info_dir = os.path.join(self.setup_py_dir, 'pip-egg-info') + ensure_dir(egg_info_dir) + egg_base_option = ['--egg-base', 'pip-egg-info'] + with self.build_env: + call_subprocess( + egg_info_cmd + egg_base_option, + cwd=self.setup_py_dir, + command_desc='python setup.py egg_info') + @property def egg_info_path(self): + # type: () -> str if self._egg_info_path is None: if self.editable: base = self.source_dir @@ -550,24 +669,38 @@ class InstallRequirement(object): @property def metadata(self): + # type: () -> Any if not hasattr(self, '_metadata'): self._metadata = get_metadata(self.get_dist()) return self._metadata def get_dist(self): - """Return a pkg_resources.Distribution built from self.egg_info_path""" - egg_info = self.egg_info_path.rstrip(os.path.sep) - base_dir = os.path.dirname(egg_info) - metadata = pkg_resources.PathMetadata(base_dir, egg_info) - dist_name = os.path.splitext(os.path.basename(egg_info))[0] - return pkg_resources.Distribution( - os.path.dirname(egg_info), + # type: () -> Distribution + """Return a pkg_resources.Distribution for this requirement""" + if self.metadata_directory: + base_dir, distinfo = os.path.split(self.metadata_directory) + metadata = pkg_resources.PathMetadata( + base_dir, self.metadata_directory + ) + dist_name = os.path.splitext(distinfo)[0] + typ = pkg_resources.DistInfoDistribution + else: + egg_info = self.egg_info_path.rstrip(os.path.sep) + base_dir = os.path.dirname(egg_info) + metadata = pkg_resources.PathMetadata(base_dir, egg_info) + dist_name = os.path.splitext(os.path.basename(egg_info))[0] + # https://github.com/python/mypy/issues/1174 + typ = pkg_resources.Distribution # type: ignore + + return typ( + base_dir, project_name=dist_name, metadata=metadata, ) def assert_source_matches_version(self): + # type: () -> None assert self.source_dir version = self.metadata['version'] if self.req.specifier and version not in self.req.specifier: @@ -586,6 +719,7 @@ class InstallRequirement(object): # For both source distributions and editables def ensure_has_source_dir(self, parent_dir): + # type: (str) -> str """Ensure that a source_dir is set. This will create a temporary build dir if the name of the requirement @@ -600,8 +734,13 @@ class InstallRequirement(object): return self.source_dir # For editable installations - def install_editable(self, install_options, - global_options=(), prefix=None): + def install_editable( + self, + install_options, # type: List[str] + global_options=(), # type: Sequence[str] + prefix=None # type: Optional[str] + ): + # type: (...) -> None logger.info('Running setup.py develop for %s', self.name) if self.isolated: @@ -625,12 +764,12 @@ class InstallRequirement(object): list(install_options), cwd=self.setup_py_dir, - show_stdout=False, ) self.install_succeeded = True def update_editable(self, obtain=True): + # type: (bool) -> None if not self.link: logger.debug( "Cannot update repository at %s; repository location is " @@ -662,6 +801,7 @@ class InstallRequirement(object): # Top-level Actions def uninstall(self, auto_confirm=False, verbose=False, use_user_site=False): + # type: (bool, bool, bool) -> Optional[UninstallPathSet] """ Uninstall the distribution currently satisfying this requirement. @@ -676,7 +816,7 @@ class InstallRequirement(object): """ if not self.check_if_exists(use_user_site): logger.warning("Skipping %s as it is not installed.", self.name) - return + return None dist = self.satisfied_by or self.conflicts_with uninstalled_pathset = UninstallPathSet.from_dist(dist) @@ -684,6 +824,7 @@ class InstallRequirement(object): return uninstalled_pathset def _clean_zip_name(self, name, prefix): # only used by archive. + # type: (str, str) -> str assert name.startswith(prefix + os.path.sep), ( "name %r doesn't start with prefix %r" % (name, prefix) ) @@ -691,9 +832,16 @@ class InstallRequirement(object): name = name.replace(os.path.sep, '/') return name + def _get_archive_name(self, path, parentdir, rootdir): + # type: (str, str, str) -> str + path = os.path.join(parentdir, path) + name = self._clean_zip_name(path, rootdir) + return self.name + '/' + name + # TODO: Investigate if this should be kept in InstallRequirement # Seems to be used only when VCS + downloads def archive(self, build_dir): + # type: (str) -> None assert self.source_dir create_archive = True archive_name = '%s-%s.zip' % (self.name, self.metadata["version"]) @@ -727,23 +875,35 @@ class InstallRequirement(object): if 'pip-egg-info' in dirnames: dirnames.remove('pip-egg-info') for dirname in dirnames: - dirname = os.path.join(dirpath, dirname) - name = self._clean_zip_name(dirname, dir) - zipdir = zipfile.ZipInfo(self.name + '/' + name + '/') + dir_arcname = self._get_archive_name(dirname, + parentdir=dirpath, + rootdir=dir) + zipdir = zipfile.ZipInfo(dir_arcname + '/') zipdir.external_attr = 0x1ED << 16 # 0o755 zip.writestr(zipdir, '') for filename in filenames: if filename == PIP_DELETE_MARKER_FILENAME: continue + file_arcname = self._get_archive_name(filename, + parentdir=dirpath, + rootdir=dir) filename = os.path.join(dirpath, filename) - name = self._clean_zip_name(filename, dir) - zip.write(filename, self.name + '/' + name) + zip.write(filename, file_arcname) zip.close() logger.info('Saved %s', display_path(archive_path)) - def install(self, install_options, global_options=None, root=None, - home=None, prefix=None, warn_script_location=True, - use_user_site=False, pycompile=True): + def install( + self, + install_options, # type: List[str] + global_options=None, # type: Optional[Sequence[str]] + root=None, # type: Optional[str] + home=None, # type: Optional[str] + prefix=None, # type: Optional[str] + warn_script_location=True, # type: bool + use_user_site=False, # type: bool + pycompile=True # type: bool + ): + # type: (...) -> None global_options = global_options if global_options is not None else [] if self.editable: self.install_editable( @@ -773,7 +933,8 @@ class InstallRequirement(object): self.options.get('install_options', []) if self.isolated: - global_options = global_options + ["--no-user-cfg"] + # https://github.com/python/mypy/issues/1174 + global_options = global_options + ["--no-user-cfg"] # type: ignore with TempDirectory(kind="record") as temp_dir: record_filename = os.path.join(temp_dir.path, 'install-record.txt') @@ -787,7 +948,6 @@ class InstallRequirement(object): call_subprocess( install_args + install_options, cwd=self.setup_py_dir, - show_stdout=False, spinner=spinner, ) @@ -797,6 +957,7 @@ class InstallRequirement(object): self.install_succeeded = True def prepend_root(path): + # type: (str) -> str if root is None or not os.path.isabs(path): return path else: @@ -832,8 +993,15 @@ class InstallRequirement(object): with open(inst_files_path, 'w') as f: f.write('\n'.join(new_lines) + '\n') - def get_install_args(self, global_options, record_filename, root, prefix, - pycompile): + def get_install_args( + self, + global_options, # type: Sequence[str] + record_filename, # type: str + root, # type: Optional[str] + prefix, # type: Optional[str] + pycompile # type: bool + ): + # type: (...) -> List[str] install_args = [sys.executable, "-u"] install_args.append('-c') install_args.append(SETUPTOOLS_SHIM % self.setup_py) diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/req_set.py b/env/lib/python3.7/site-packages/pip/_internal/req/req_set.py index b198317..d1966a4 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/req/req_set.py +++ b/env/lib/python3.7/site-packages/pip/_internal/req/req_set.py @@ -5,42 +5,56 @@ from collections import OrderedDict from pip._internal.exceptions import InstallationError from pip._internal.utils.logging import indent_log +from pip._internal.utils.typing import MYPY_CHECK_RUNNING from pip._internal.wheel import Wheel +if MYPY_CHECK_RUNNING: + from typing import Dict, Iterable, List, Optional, Tuple + from pip._internal.req.req_install import InstallRequirement + + logger = logging.getLogger(__name__) class RequirementSet(object): def __init__(self, require_hashes=False, check_supported_wheels=True): + # type: (bool, bool) -> None """Create a RequirementSet. """ - self.requirements = OrderedDict() + self.requirements = OrderedDict() # type: Dict[str, InstallRequirement] # noqa: E501 self.require_hashes = require_hashes self.check_supported_wheels = check_supported_wheels # Mapping of alias: real_name - self.requirement_aliases = {} - self.unnamed_requirements = [] - self.successfully_downloaded = [] - self.reqs_to_cleanup = [] + self.requirement_aliases = {} # type: Dict[str, str] + self.unnamed_requirements = [] # type: List[InstallRequirement] + self.successfully_downloaded = [] # type: List[InstallRequirement] + self.reqs_to_cleanup = [] # type: List[InstallRequirement] def __str__(self): + # type: () -> str reqs = [req for req in self.requirements.values() if not req.comes_from] reqs.sort(key=lambda req: req.name.lower()) return ' '.join([str(req.req) for req in reqs]) def __repr__(self): + # type: () -> str reqs = [req for req in self.requirements.values()] reqs.sort(key=lambda req: req.name.lower()) reqs_str = ', '.join([str(req.req) for req in reqs]) return ('<%s object; %d requirement(s): %s>' % (self.__class__.__name__, len(reqs), reqs_str)) - def add_requirement(self, install_req, parent_req_name=None, - extras_requested=None): + def add_requirement( + self, + install_req, # type: InstallRequirement + parent_req_name=None, # type: Optional[str] + extras_requested=None # type: Optional[Iterable[str]] + ): + # type: (...) -> Tuple[List[InstallRequirement], Optional[InstallRequirement]] # noqa: E501 """Add install_req as a requirement to install. :param parent_req_name: The name of the requirement that needed this @@ -152,6 +166,7 @@ class RequirementSet(object): return [existing_req], existing_req def has_requirement(self, project_name): + # type: (str) -> bool name = project_name.lower() if (name in self.requirements and not self.requirements[name].constraint or @@ -160,12 +175,8 @@ class RequirementSet(object): return True return False - @property - def has_requirements(self): - return list(req for req in self.requirements.values() if not - req.constraint) or self.unnamed_requirements - def get_requirement(self, project_name): + # type: (str) -> InstallRequirement for name in project_name, project_name.lower(): if name in self.requirements: return self.requirements[name] @@ -174,6 +185,7 @@ class RequirementSet(object): raise KeyError("No project with the name %r" % project_name) def cleanup_files(self): + # type: () -> None """Clean up files, remove builds.""" logger.debug('Cleaning up...') with indent_log(): diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/req_tracker.py b/env/lib/python3.7/site-packages/pip/_internal/req/req_tracker.py index 0a86f4c..e36a3f6 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/req/req_tracker.py +++ b/env/lib/python3.7/site-packages/pip/_internal/req/req_tracker.py @@ -7,6 +7,13 @@ import logging import os from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from types import TracebackType + from typing import Iterator, Optional, Set, Type + from pip._internal.req.req_install import InstallRequirement + from pip._internal.models.link import Link logger = logging.getLogger(__name__) @@ -14,6 +21,7 @@ logger = logging.getLogger(__name__) class RequirementTracker(object): def __init__(self): + # type: () -> None self._root = os.environ.get('PIP_REQ_TRACKER') if self._root is None: self._temp_dir = TempDirectory(delete=False, kind='req-tracker') @@ -23,19 +31,28 @@ class RequirementTracker(object): else: self._temp_dir = None logger.debug('Re-using requirements tracker %r', self._root) - self._entries = set() + self._entries = set() # type: Set[InstallRequirement] def __enter__(self): + # type: () -> RequirementTracker return self - def __exit__(self, exc_type, exc_val, exc_tb): + def __exit__( + self, + exc_type, # type: Optional[Type[BaseException]] + exc_val, # type: Optional[BaseException] + exc_tb # type: Optional[TracebackType] + ): + # type: (...) -> None self.cleanup() def _entry_path(self, link): + # type: (Link) -> str hashed = hashlib.sha224(link.url_without_fragment.encode()).hexdigest() return os.path.join(self._root, hashed) def add(self, req): + # type: (InstallRequirement) -> None link = req.link info = str(req) entry_path = self._entry_path(link) @@ -54,12 +71,14 @@ class RequirementTracker(object): logger.debug('Added %s to build tracker %r', req, self._root) def remove(self, req): + # type: (InstallRequirement) -> None link = req.link self._entries.remove(req) os.unlink(self._entry_path(link)) logger.debug('Removed %s from build tracker %r', req, self._root) def cleanup(self): + # type: () -> None for req in set(self._entries): self.remove(req) remove = self._temp_dir is not None @@ -71,6 +90,7 @@ class RequirementTracker(object): @contextlib.contextmanager def track(self, req): + # type: (InstallRequirement) -> Iterator[None] self.add(req) yield self.remove(req) diff --git a/env/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py b/env/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py index a7d8230..733301c 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py +++ b/env/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py @@ -15,14 +15,22 @@ from pip._internal.utils.compat import WINDOWS, cache_from_source, uses_pycache from pip._internal.utils.logging import indent_log from pip._internal.utils.misc import ( FakeFile, ask, dist_in_usersite, dist_is_local, egg_link_path, is_local, - normalize_path, renames, + normalize_path, renames, rmtree, ) -from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.temp_dir import AdjacentTempDirectory, TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Callable, Dict, Iterable, Iterator, List, Optional, Set, Tuple, + ) + from pip._vendor.pkg_resources import Distribution logger = logging.getLogger(__name__) def _script_names(dist, script_name, is_gui): + # type: (Distribution, str, bool) -> List[str] """Create the fully qualified name of the files created by {console,gui}_scripts for the given ``dist``. Returns the list of file names @@ -44,9 +52,11 @@ def _script_names(dist, script_name, is_gui): def _unique(fn): + # type: (Callable) -> Callable[..., Iterator[Any]] @functools.wraps(fn) def unique(*args, **kw): - seen = set() + # type: (Any, Any) -> Iterator[Any] + seen = set() # type: Set[Any] for item in fn(*args, **kw): if item not in seen: seen.add(item) @@ -56,6 +66,7 @@ def _unique(fn): @_unique def uninstallation_paths(dist): + # type: (Distribution) -> Iterator[str] """ Yield all the uninstallation paths for dist based on RECORD-without-.py[co] @@ -78,25 +89,67 @@ def uninstallation_paths(dist): def compact(paths): + # type: (Iterable[str]) -> Set[str] """Compact a path set to contain the minimal number of paths necessary to contain all paths in the set. If /a/path/ and /a/path/to/a/file.txt are both in the set, leave only the shorter path.""" sep = os.path.sep - short_paths = set() + short_paths = set() # type: Set[str] for path in sorted(paths, key=len): - should_add = any( + should_skip = any( path.startswith(shortpath.rstrip("*")) and path[len(shortpath.rstrip("*").rstrip(sep))] == sep for shortpath in short_paths ) - if not should_add: + if not should_skip: short_paths.add(path) return short_paths +def compress_for_rename(paths): + # type: (Iterable[str]) -> Set[str] + """Returns a set containing the paths that need to be renamed. + + This set may include directories when the original sequence of paths + included every file on disk. + """ + case_map = dict((os.path.normcase(p), p) for p in paths) + remaining = set(case_map) + unchecked = sorted(set(os.path.split(p)[0] + for p in case_map.values()), key=len) + wildcards = set() # type: Set[str] + + def norm_join(*a): + # type: (str) -> str + return os.path.normcase(os.path.join(*a)) + + for root in unchecked: + if any(os.path.normcase(root).startswith(w) + for w in wildcards): + # This directory has already been handled. + continue + + all_files = set() # type: Set[str] + all_subdirs = set() # type: Set[str] + for dirname, subdirs, files in os.walk(root): + all_subdirs.update(norm_join(root, dirname, d) + for d in subdirs) + all_files.update(norm_join(root, dirname, f) + for f in files) + # If all the files we found are in our remaining set of files to + # remove, then remove them from the latter set and add a wildcard + # for the directory. + if not (all_files - remaining): + remaining.difference_update(all_files) + wildcards.add(root + os.sep) + + return set(map(case_map.__getitem__, remaining)) | wildcards + + def compress_for_output_listing(paths): + # type: (Iterable[str]) -> Tuple[Set[str], Set[str]] """Returns a tuple of 2 sets of which paths to display to user The first set contains paths that would be deleted. Files of a package @@ -107,7 +160,7 @@ def compress_for_output_listing(paths): folders. """ - will_remove = list(paths) + will_remove = set(paths) will_skip = set() # Determine folders and files @@ -120,7 +173,8 @@ def compress_for_output_listing(paths): folders.add(os.path.dirname(path)) files.add(path) - _normcased_files = set(map(os.path.normcase, files)) + # probably this one https://github.com/python/mypy/issues/390 + _normcased_files = set(map(os.path.normcase, files)) # type: ignore folders = compact(folders) @@ -145,18 +199,131 @@ def compress_for_output_listing(paths): return will_remove, will_skip +class StashedUninstallPathSet(object): + """A set of file rename operations to stash files while + tentatively uninstalling them.""" + def __init__(self): + # type: () -> None + # Mapping from source file root to [Adjacent]TempDirectory + # for files under that directory. + self._save_dirs = {} # type: Dict[str, TempDirectory] + # (old path, new path) tuples for each move that may need + # to be undone. + self._moves = [] # type: List[Tuple[str, str]] + + def _get_directory_stash(self, path): + # type: (str) -> str + """Stashes a directory. + + Directories are stashed adjacent to their original location if + possible, or else moved/copied into the user's temp dir.""" + + try: + save_dir = AdjacentTempDirectory(path) # type: TempDirectory + save_dir.create() + except OSError: + save_dir = TempDirectory(kind="uninstall") + save_dir.create() + self._save_dirs[os.path.normcase(path)] = save_dir + + return save_dir.path + + def _get_file_stash(self, path): + # type: (str) -> str + """Stashes a file. + + If no root has been provided, one will be created for the directory + in the user's temp directory.""" + path = os.path.normcase(path) + head, old_head = os.path.dirname(path), None + save_dir = None + + while head != old_head: + try: + save_dir = self._save_dirs[head] + break + except KeyError: + pass + head, old_head = os.path.dirname(head), head + else: + # Did not find any suitable root + head = os.path.dirname(path) + save_dir = TempDirectory(kind='uninstall') + save_dir.create() + self._save_dirs[head] = save_dir + + relpath = os.path.relpath(path, head) + if relpath and relpath != os.path.curdir: + return os.path.join(save_dir.path, relpath) + return save_dir.path + + def stash(self, path): + # type: (str) -> str + """Stashes the directory or file and returns its new location. + """ + if os.path.isdir(path): + new_path = self._get_directory_stash(path) + else: + new_path = self._get_file_stash(path) + + self._moves.append((path, new_path)) + if os.path.isdir(path) and os.path.isdir(new_path): + # If we're moving a directory, we need to + # remove the destination first or else it will be + # moved to inside the existing directory. + # We just created new_path ourselves, so it will + # be removable. + os.rmdir(new_path) + renames(path, new_path) + return new_path + + def commit(self): + # type: () -> None + """Commits the uninstall by removing stashed files.""" + for _, save_dir in self._save_dirs.items(): + save_dir.cleanup() + self._moves = [] + self._save_dirs = {} + + def rollback(self): + # type: () -> None + """Undoes the uninstall by moving stashed files back.""" + for p in self._moves: + logging.info("Moving to %s\n from %s", *p) + + for new_path, path in self._moves: + try: + logger.debug('Replacing %s from %s', new_path, path) + if os.path.isfile(new_path): + os.unlink(new_path) + elif os.path.isdir(new_path): + rmtree(new_path) + renames(path, new_path) + except OSError as ex: + logger.error("Failed to restore %s", new_path) + logger.debug("Exception: %s", ex) + + self.commit() + + @property + def can_rollback(self): + # type: () -> bool + return bool(self._moves) + + class UninstallPathSet(object): """A set of file paths to be removed in the uninstallation of a requirement.""" def __init__(self, dist): - self.paths = set() - self._refuse = set() - self.pth = {} + # type: (Distribution) -> None + self.paths = set() # type: Set[str] + self._refuse = set() # type: Set[str] + self.pth = {} # type: Dict[str, UninstallPthEntries] self.dist = dist - self.save_dir = TempDirectory(kind="uninstall") - self._moved_paths = [] + self._moved_paths = StashedUninstallPathSet() def _permitted(self, path): + # type: (str) -> bool """ Return True if the given path is one we are permitted to remove/modify, False otherwise. @@ -165,6 +332,7 @@ class UninstallPathSet(object): return is_local(path) def add(self, path): + # type: (str) -> None head, tail = os.path.split(path) # we normalize the head to resolve parent directory symlinks, but not @@ -184,6 +352,7 @@ class UninstallPathSet(object): self.add(cache_from_source(path)) def add_pth(self, pth_file, entry): + # type: (str, str) -> None pth_file = normalize_path(pth_file) if self._permitted(pth_file): if pth_file not in self.pth: @@ -192,12 +361,8 @@ class UninstallPathSet(object): else: self._refuse.add(pth_file) - def _stash(self, path): - return os.path.join( - self.save_dir.path, os.path.splitdrive(path)[1].lstrip(os.path.sep) - ) - def remove(self, auto_confirm=False, verbose=False): + # type: (bool, bool) -> None """Remove paths in ``self.paths`` with confirmation (unless ``auto_confirm`` is True).""" @@ -215,23 +380,26 @@ class UninstallPathSet(object): with indent_log(): if auto_confirm or self._allowed_to_proceed(verbose): - self.save_dir.create() + moved = self._moved_paths - for path in sorted(compact(self.paths)): - new_path = self._stash(path) + for_rename = compress_for_rename(self.paths) + + for path in sorted(compact(for_rename)): + moved.stash(path) logger.debug('Removing file or directory %s', path) - self._moved_paths.append(path) - renames(path, new_path) + for pth in self.pth.values(): pth.remove() logger.info('Successfully uninstalled %s', dist_name_version) def _allowed_to_proceed(self, verbose): + # type: (bool) -> bool """Display which files would be deleted and prompt for confirmation """ def _display(msg, paths): + # type: (str, Iterable[str]) -> None if not paths: return @@ -245,38 +413,39 @@ class UninstallPathSet(object): else: # In verbose mode, display all the files that are going to be # deleted. - will_remove = list(self.paths) + will_remove = set(self.paths) will_skip = set() _display('Would remove:', will_remove) _display('Would not remove (might be manually added):', will_skip) _display('Would not remove (outside of prefix):', self._refuse) + if verbose: + _display('Will actually move:', compress_for_rename(self.paths)) return ask('Proceed (y/n)? ', ('y', 'n')) == 'y' def rollback(self): + # type: () -> None """Rollback the changes previously made by remove().""" - if self.save_dir.path is None: + if not self._moved_paths.can_rollback: logger.error( "Can't roll back %s; was not uninstalled", self.dist.project_name, ) - return False + return logger.info('Rolling back uninstall of %s', self.dist.project_name) - for path in self._moved_paths: - tmp_path = self._stash(path) - logger.debug('Replacing %s', path) - renames(tmp_path, path) + self._moved_paths.rollback() for pth in self.pth.values(): pth.rollback() def commit(self): + # type: () -> None """Remove temporary save dir: rollback will no longer be possible.""" - self.save_dir.cleanup() - self._moved_paths = [] + self._moved_paths.commit() @classmethod def from_dist(cls, dist): + # type: (Distribution) -> UninstallPathSet dist_path = normalize_path(dist.location) if not dist_is_local(dist): logger.info( @@ -408,15 +577,17 @@ class UninstallPathSet(object): class UninstallPthEntries(object): def __init__(self, pth_file): + # type: (str) -> None if not os.path.isfile(pth_file): raise UninstallationError( "Cannot remove entries from nonexistent file %s" % pth_file ) self.file = pth_file - self.entries = set() - self._saved_lines = None + self.entries = set() # type: Set[str] + self._saved_lines = None # type: Optional[List[bytes]] def add(self, entry): + # type: (str) -> None entry = os.path.normcase(entry) # On Windows, os.path.normcase converts the entry to use # backslashes. This is correct for entries that describe absolute @@ -427,6 +598,7 @@ class UninstallPthEntries(object): self.entries.add(entry) def remove(self): + # type: () -> None logger.debug('Removing pth entries from %s:', self.file) with open(self.file, 'rb') as fh: # windows uses '\r\n' with py3k, but uses '\n' with py2.x @@ -449,6 +621,7 @@ class UninstallPthEntries(object): fh.writelines(lines) def rollback(self): + # type: () -> bool if self._saved_lines is None: logger.error( 'Cannot roll back changes to %s, none were made', self.file diff --git a/env/lib/python3.7/site-packages/pip/_internal/resolve.py b/env/lib/python3.7/site-packages/pip/_internal/resolve.py index 2d9f1c5..f49667b 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/resolve.py +++ b/env/lib/python3.7/site-packages/pip/_internal/resolve.py @@ -18,10 +18,22 @@ from pip._internal.exceptions import ( BestVersionAlreadyInstalled, DistributionNotFound, HashError, HashErrors, UnsupportedPythonVersion, ) -from pip._internal.req.constructors import install_req_from_req +from pip._internal.req.constructors import install_req_from_req_string from pip._internal.utils.logging import indent_log from pip._internal.utils.misc import dist_in_usersite, ensure_dir from pip._internal.utils.packaging import check_dist_requires_python +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, DefaultDict, List, Set + from pip._internal.download import PipSession + from pip._internal.req.req_install import InstallRequirement + from pip._internal.index import PackageFinder + from pip._internal.req.req_set import RequirementSet + from pip._internal.operations.prepare import ( + DistAbstraction, RequirementPreparer + ) + from pip._internal.cache import WheelCache logger = logging.getLogger(__name__) @@ -33,9 +45,22 @@ class Resolver(object): _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"} - def __init__(self, preparer, session, finder, wheel_cache, use_user_site, - ignore_dependencies, ignore_installed, ignore_requires_python, - force_reinstall, isolated, upgrade_strategy): + def __init__( + self, + preparer, # type: RequirementPreparer + session, # type: PipSession + finder, # type: PackageFinder + wheel_cache, # type: Optional[WheelCache] + use_user_site, # type: bool + ignore_dependencies, # type: bool + ignore_installed, # type: bool + ignore_requires_python, # type: bool + force_reinstall, # type: bool + isolated, # type: bool + upgrade_strategy, # type: str + use_pep517=None # type: Optional[bool] + ): + # type: (...) -> None super(Resolver, self).__init__() assert upgrade_strategy in self._allowed_strategies @@ -47,7 +72,8 @@ class Resolver(object): # information about both sdist and wheels transparently. self.wheel_cache = wheel_cache - self.require_hashes = None # This is set in resolve + # This is set in resolve + self.require_hashes = None # type: Optional[bool] self.upgrade_strategy = upgrade_strategy self.force_reinstall = force_reinstall @@ -56,10 +82,13 @@ class Resolver(object): self.ignore_installed = ignore_installed self.ignore_requires_python = ignore_requires_python self.use_user_site = use_user_site + self.use_pep517 = use_pep517 - self._discovered_dependencies = defaultdict(list) + self._discovered_dependencies = \ + defaultdict(list) # type: DefaultDict[str, List] def resolve(self, requirement_set): + # type: (RequirementSet) -> None """Resolve what operations need to be done As a side-effect of this method, the packages (and their dependencies) @@ -94,7 +123,7 @@ class Resolver(object): # exceptions cannot be checked ahead of time, because # req.populate_link() needs to be called before we can make decisions # based on link type. - discovered_reqs = [] + discovered_reqs = [] # type: List[InstallRequirement] hash_errors = HashErrors() for req in chain(root_reqs, discovered_reqs): try: @@ -109,6 +138,7 @@ class Resolver(object): raise hash_errors def _is_upgrade_allowed(self, req): + # type: (InstallRequirement) -> bool if self.upgrade_strategy == "to-satisfy-only": return False elif self.upgrade_strategy == "eager": @@ -118,6 +148,7 @@ class Resolver(object): return req.is_direct def _set_req_to_reinstall(self, req): + # type: (InstallRequirement) -> None """ Set a requirement to be installed. """ @@ -129,6 +160,7 @@ class Resolver(object): # XXX: Stop passing requirement_set for options def _check_skip_installed(self, req_to_install): + # type: (InstallRequirement) -> Optional[str] """Check if req_to_install should be skipped. This will check if the req is installed, and whether we should upgrade @@ -181,6 +213,7 @@ class Resolver(object): return None def _get_abstract_dist_for(self, req): + # type: (InstallRequirement) -> DistAbstraction """Takes a InstallRequirement and returns a single AbstractDist \ representing a prepared variant of the same. """ @@ -237,7 +270,12 @@ class Resolver(object): return abstract_dist - def _resolve_one(self, requirement_set, req_to_install): + def _resolve_one( + self, + requirement_set, # type: RequirementSet + req_to_install # type: InstallRequirement + ): + # type: (...) -> List[InstallRequirement] """Prepare a single requirements file. :return: A list of additional InstallRequirements to also install. @@ -256,7 +294,7 @@ class Resolver(object): abstract_dist = self._get_abstract_dist_for(req_to_install) # Parse and return dependencies - dist = abstract_dist.dist(self.finder) + dist = abstract_dist.dist() try: check_dist_requires_python(dist) except UnsupportedPythonVersion as err: @@ -265,14 +303,15 @@ class Resolver(object): else: raise - more_reqs = [] + more_reqs = [] # type: List[InstallRequirement] def add_req(subreq, extras_requested): - sub_install_req = install_req_from_req( + sub_install_req = install_req_from_req_string( str(subreq), req_to_install, isolated=self.isolated, wheel_cache=self.wheel_cache, + use_pep517=self.use_pep517 ) parent_req_name = req_to_install.name to_scan_again, add_to_parent = requirement_set.add_requirement( @@ -326,6 +365,7 @@ class Resolver(object): return more_reqs def get_installation_order(self, req_set): + # type: (RequirementSet) -> List[InstallRequirement] """Create the installation order. The installation order is topological - requirements are installed @@ -336,7 +376,7 @@ class Resolver(object): # installs the user specified things in the order given, except when # dependencies must come earlier to achieve topological order. order = [] - ordered_reqs = set() + ordered_reqs = set() # type: Set[InstallRequirement] def schedule(req): if req.satisfied_by or req in ordered_reqs: diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-37.pyc index a69d93bdf9b34357593245f54ef643d2f08d0a8e..4c1a0bb2703754e8ff8a95b27e9614fc24058650 100644 GIT binary patch delta 38 qcmbQjIE9hNiI-g^~4R@iv6#tE8f`Sc#U&j98a;xi6B3=ULF|N_~Ie!6?lVZ zxp4@+B5(3MFW{=gi@b!sGB5KA&J|weHJq!?qWJ5eh%B;K>(!iU&%DL_hQgfs9bNnZ zjDAj~XYMdx`h;=Q;C0;A;PS`JY8@p%FI$k5Kiv6f$G-gj)ytdq_KmHrYg_N3Rr$aT zqv<#BtMYmt%lL(f22M}b*P`KQZRCzRt{+By&+G6n5B&Y}ySL+Q^+L9SF`M9?3){$8>$ z2r&7Kg;b@|M3Z82f@j31fH+tk^#lZiI!N4JS4DeUt-`?!cO?eFuXX`73o8#yOKzDJsn^srLA zRj)&5x?5j`>=Ln`CRmKWYutskc%|9Ro@iS9X>;Y(`xp?CFqY9|2_#TKl@w4Aiy$t> zKQw=TfoZ382p8fih`Xth!2MjRZt|cIsIa(BTeXR63y`k z0mqv)yGZl4iZXhi;Rp=`rt2t8hcb@TW5K%?T(_D@#4(m g4K%5UXJFuI7_xR=e^X!4EUm7!6l?{0=}yc40bQc~)&Kwi delta 1085 zcmZ8f&ubGw6yCSH-E215&1Rb)8&lI%t92BfXh|&s0Jcz{~p-@6*t( za_L3zQb)mqVDY9x4+cEdlm9^v9&!@@1#g~wZzJiC9rl~yy_s*m_s#oK{(jlIW}1eC zU**Hu<(<>pmJ7Sv6Z0L7MYg0$jAdAq8Cy_^vn-1<6IUj)SORkvvsn`71asIh&bA-r zAD`I_n6j3vBz?Q$+?ATHD*3~Y4ZZ^s4L?zF?n_Pip2Sitji*vfxh;9_b7m|(tOvzf zi}}UPY9KUt*WH89svbvepCq0UO)aC>HdmXE+D~T1EA7Hq0y9B|w5L_sRxQvK2Mk$P zY#f%%-R>{V*R%+3;8AhIywi!%k_dT{z$CB;9D-ql-cUVYbTMIMpTHy2pFPhrJ&HgX#G|+N}#Hf z&P1m`%YgzOilnRiA_j6jB~-%0lVSAO^@;F$l=q;%N&*7p2&gV|1){Gr8&`=C3qEEOdEv=Dd3vS?Pd(_X7*ze&D6Q3lcCFP|FYk(PnezC- z@dJZHzYl6m2{&8N$XFg1rR?ZJc=Lbi&`Ue0xBZnv#k|4Ifr}v7D%gN84UQ5ARi;^0 z44F@Mcd`=@%Mt4sK}77kFJVe7=cZ$ayb^D7r$+a1LqIM|ny$zog9e(cf{JJZpA$cG zUym?}6I*azxcQ?@xAMi4kc_-^7l_w&{1tz%*`S_7DC6 zZIcWG1z;WchZzs9d$8oCg;~gJp`DJHE)<|5ZWhjTIJv;Xt|`)Ll3C;mJ$o;< z*jR7z_5$ZE9`YViF_6;JON|!WSo6y&o(aYguw7*xblH||MV~QdjWPY4p3!qEs?O>7%Q6yBL#uQ!|Z+D@I+O_S95Yw9#{8u|kfQK1c`4OP>sN!4a0WI1_bXXEwS zon5za1u{~5K%7!mq9>#lI3OW$$ps{i2yv=76|_fAs1g!q4v07Fs)<^Pt^H=^d*6HW zcHW!aDf}{Ho=qfl34iXF+4n2M_suMMU?2%{2O0)E4FH0BuaNLh$ zc2#oe4JpF51R8XK4&7it0!&Ck3epwbI>6M2{p{c)Vhyma%|Ym?#1=otIZUG;(-^7hsGon9h-~FLo3b3p)h=r&irHI@wNZ2f`m9km z3;Q8^PqN0C@^Bmuu(3y!NN~U!g?`YHKODInjMCVK85o4_d&HV>bvOn?ojDu=1C>Yi zB>W?$mvi#9Nox|L4MQ63N8JpvBhGMb%4$y`J=&pR493ws4ToU@j%>(Q0RzoEJO=qk zWSce&v4Y7e-KKSe#W!c+Xq8&8!4xFX>o_~XG)Ub=E1!aCNFjI9)u7OsfxIl`XYX8G z_M7E$&fh5cIk3xR7OYTrw&&97mDS?Hg>wrRi&w8LEiEpc&(kor(rh>^R94uQpC@6L z-6#QY=6PHT9@B3~PjE;6Q-hl=cWbu15!97w@>cM<^3gyRyDTJY{2-1U7!b2TgtNh1 z?A=je$Wz|Yt^b#9A^0Np=14#4tS(-650srh)Ncvt3m#~d_M~u)SD0V&ea;VymCD@pIAr(Xr)n|;;Z4AcHNvlfeu&z;_-Q$y%@L~xx4syDuP6Vetlt1ygye2%pu^}zAfgj z^8N&k9dCK(Gd)4cncyp9Zgvsrkd`6T%C^IbP5Y&HGEniUaPC2n5`md`Z|E}4_M{jU zJ*sya4LiZD#D_C`>#cg&fcDlN411Wp!EThk`qq97I{ZBXsd~pYa+N@SLz- z5KxVH=H9Y--3?`I|4_DFKQHr|FgpUGEOv8_$|%x(ijOC*tE2}1WCqEpV4yeGp2anv zK?vhcy;8wD(K#m&d~~gn4ZBe&-eNA)dBMY~ixv(0BNq2&+$}kUrf)l5!EZH0fS3@d z&laM=d0c?F+F|!%tx@OxInL`m>}~`f_ZHiygmpqdmynotBysGuC@jwiQbsZ~&){XZ z*P1?y{Q0Et$wxk%Rj~IMFESCCiyCrq$+&3uaNlmoT4{a5b{TK+sOho6+Y*l&RWuS$ z2)Wj9N`AS{Yy6tvjtejah#u)Q)2lio)aGk-Xgch)=nT(CP)Leu7%Q6y6!H*X!+i?Iiw99LH^%q;AusRcS>^2x$>Pw2;#FP*@>FuHVFUY_Hw% zMr{y~NK_zBO*JPj&~gC@sE{Hd!2yX25;qPABm-3sT&M)%TrRw~E@~A1yq<5~zW2R1 zZ|1$(Z>G1VoRhJbrQy$gcl@O@BR8BZOW&9{zrJPzgHXeE?F*WBPS-@NZpqtBqh~FF zws6B~qLpcApL}5dpl1&}YdEiCO<1c7E1Op;qLKH061vbRMfq2z& zlft-}66ss(%*}}CN){6Ju>1}B+#Ck&Zwxkv+##lU$ATsDZhp-Y`4!Y*5`&n;aNXKu za_~VKA$O>^m>7akJ?iFyhy(R7a*jdLEqGZ-LHe5JjtKo`5i(-r7H1k{+`>9!!9>IE zz$F*BcyJJgAbO3tdprxKAm5W=7%XIt{*^8Ue-G0uH1;;f+%XI{0&%pDdr8z58~Nsh zJAvBWJuU2kQMB%Zy)XvjmqKm{X-0i!x`kc zQCYsSbaBlWoq$+klGHM%P8cKE85BDvg2wX9;SQ7ID0egJcRi!78&RgKw+$8Iukfwu z$Zf_3)E%?xP7o(j6@J`dd34Zpn8h*8xVjs?Jbf6|xYtKloC+oXGLDXcpfUBD_2kSfN>V2{ zhVXyh8_4N-^R4?x zAlaaL4jSH9-Po(s+pA}ER+pD+SGRc(`Mx#VsCE2GtJ$9WSiRxQ6rTI9upgZZ8bE_)#UmiAdBeuAS{cf)2$W;1zK*@^G7HtH8khJ1p8%@a^8X{$dH zM+-Ynp15D*=mcLct`_^g+7~1CL*B#fli^z;a|A8CHQS%%M^B+BD+E9w5W2h~w*{cn z=-Rbb#cwPy_ z2!a(K<`-0kQu_f%hxA(5#1F8}IO}I7bMP_nEze49f&PcpMygntLY|yN=tdf?YL(i0 zo>XOmQT0VC$MKHaX<0l%n!Nxq zl8~|`CEX559WJBl$8>Hz=q~Cc88ie{Qqt*n&32>gFSle0wE`uN7MIk4nMmGza6|)D4N+MKt*AJq`KB$Zc zPCSZ+2Em)+#k(wc-NXKgx$iMQL9i1%SWr~)@)Y&HLGmT(%tay=(N%xQYzVvMWZ=5> zc`b{g99<%4qSYj5)nYy?$B}I&FpfQFH=&%w2s%wt?!^Q~F{YIivJ!EVt>?$+Nn|0v zypo^K{V04dW(QRjE(9JN*N>)t{#I=mht$&m%>jH=>n!M*)b9^P#{^S3K5{0BNBYPq z_W)tXY<%)K(mU|r9%ec!>#DQJB=wjNnlv=QHDSCFv`bValiUZ%JnF-a(Wpwz`EU+0 zv>o=iG|<4%B?E$>eTO&yQ9{1dcK4tD^S@O6319V#ApI^!3Vx&bi)m)vH%63IjI{wYD&5%1Zh%SftafNa+(vLrX6NaU)3E3bM1b zRa?764J{3g{R3|O7cD_Y>6<>D_ks8QjSM1zCDZg0b@oGI_siD{Ou}_y$OIuSOykRR#w?6(Fde`qjt5VixDz8xp=h+n81? diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-37.pyc index f7332aa1380c11a85daae169882fc9ab8f43cdbd..9f13569239eb94baf44eb2c7a1e11592de13b21d 100644 GIT binary patch delta 524 zcmYk0%SyvQ6oxaCd)icO6>7aL6r@61YC&A63-8w|S{DYTXlGg@lQd3Ju-$ay3y9## zh2j&qcjXhfj!)n#xN;^HaR$zJ{{Q^UoHy-5H)gfaH$r0m7iD)779~pJnP^|$B zpOPr{46GE2BlA|U1`#+CvWYLgN;!K8!sOn`!AW&xb8Tg(dU#weZigO*k$J_<}YYFa6OS3(zH2XJw{hWalBka%b#X{hC1<&?! zw(AGygyhh5+r25)FYl+sVmHk)ev)q|Cx8JmFby&w4H7^Cbd0&#p-`zc5w7_(#bgL6 zrbE2RuqX3X+YK;v&q=-&*u>8VZO?Wa6!L)bD?}!!#EZ;rZFzsMdR$qb4|UevKZ@I@ zG489irsLTJ(|#W1UsJySzcR{W+Je(WErOQ-Q~o$B8i+28LkSFuzbf+Lq9OhOX_xrc+-iI5Q`X#vq`URNuu!zMRBr8Fni XjuFT!mH-kQj9|zNrNKNNW-ev`a-vSV diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc index 9039fbf51746618b05136768f6b76773801394e3..6e095641219acf5890f46ab64fa4f1ced278fa52 100644 GIT binary patch delta 83 zcmaFP@{)zuiIDY`lov(^=~U)fz{4n+s%(I<_Rjv3eZKwR-u5HD`+P8XIJocAl08nca2k)8EUjmG zB7=|bR^WOaF=gXbpi;c!X{J69)yCMbTkBbrtS4cz7RG5dl5$PFJc-|I98QWKaAVQK zoOBL_Fb60&&@^m=flVE7sG9q9n|1+O#h%gI)VPYNI(RBO<4G_+=0`F-81wVOt9X$% zQ3!Lv1RHrKv_UNupN*}aE~A!Ed_!H)=S3|oEi>%ms=3g)iNTbi5NZQMh*~ao%&(`{ zFj87oO&^p7;-0+!dYEPDZ1%UoUG)AiYZa5Ko_^mf9nKH)ELQ>NiegCBv|Q3Mk5Vq+ z_WC@Gv*5LgN3x%1p-lVPNfO3K%Fr41xnt@#mX?3Bs%7o!N;8dB<5pW_o6%I{GPnbn WQT+&)GMt!Emzr?VV3%2o&Hn}f3ygLE delta 518 zcmZ8dze~eV5YD}%=`(55Dk}8{Ruo!0h@yfZ(!og_T)K(yX#1i@(k8y7I=YCv1YDgR z#nnH;NhG7V_%Aqlmx_uRzRTTx-*@lsz3^r`JH?`<;dgLXJAATloC@sT)R&sNG_JIR zoXklRqbc)}W6aADX<_7&wX}x)LBa;4rFJI@{6XvruNMX?-hX(h!@7yh)IN7rCG^5&uOG#2-(T)t9QRM-vyEhxZB{vQqHzQ*Zvg`f9NpA8n9Kr; zsnN%4RsnF5JH2L;UFNCE$+KRWS|F*DNef_riDCoBK+Pp!?6gLSJ%`ZH)eQa55)ggp zk-3#IO(#y;=dS1my|5j79p4qlzSrrlVJo87Y3R(+Syhu;_0&Ko#(f|Me diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-37.pyc index 15bfa4e0ee1c680e42a1b1543fa6c881e8188e4f..2e5868af8ef729a2015d832164f9f7a24dab2f98 100644 GIT binary patch delta 1205 zcmah}O>YxN7~a_rdu;FeD~{thp%MXv3@GNattdqbkR}n}Kt7PN2u6!{6K}G+HZyCf z35OhLe?Zt<5AC5+50!e#kLa84YY9F9*4c-{0;D2poVq3PL#+5mIpS0%q`drx8RztwWZmU3yNEGOFt=Y$!osW z>?z=7w*tK4P32)?+ErJTR`uYIS5I3+Rv&IW+F*AV=kMNUE9;%kQfHxMNd2DQjivs; z7qO&w{K(MbW zayR<%%4RS5U%gZ~52gqet;rmo)qW;qBKcEaCyh5oyWNCYp28GFvexZ+-5us^IesK! z*6j_W9npprfqN91JU6!66A-mj-hc-`hwy0nG3it2XG{m`lcUv zCzXkl9V_AF{bOl1kr{915~{ScoYV(S+~XH9*@>bcohYoKOb1ZZ$#Y$Pr_QKrAtE$2Oj6&0_9jw zT0hJ^SzcLMn`eu2tBXf1!^@CktQ$B&Fg7ZhmO{lgjL}Jrkjduso zA;&)hnK>c_6qyJXLJ^^afZp>8LKOi`k=E+k%5rBRHFkbgX8JF-y>6V|*XRP$J8UZ7 tgCGsDeMxVHeRmjmw+S%u6@aNywWiiIlbEVbrs1iRqG}qtk=M#|9{`Sa_38is delta 921 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 literal 5316 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≠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 K2ah0z3I8wXQ>{M$ delta 9760 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 Z%_hOg7$l?PWaM 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 AP5=M^ delta 533 zcmY*VO-sW-5bbVavrUsWt&Oc{t>R}v@%tc(f(K9D6oeuT(oI7&P3tzrKj1|@mG!P3 zMQ;lJ4DSK&;=!92PtK+w8rV0J-Fa``%th`oo7&cOH3nbhX6o=N(M=W5Wp~o$ zHttX*LkUfs$0}K>(j>%ws!<(cj;3fDqDk>ytZZ~Y8c)|~6_-rV`re!m8m;-3+nRIz zc5vi*bG0+aKMqb;_`9@W8c@@Yx~c@rNR>tr%RjBjyJ$(!Sp)+jD*{Z2>Ks4}X-MrI zoJBH@!yha1m%h(<0$!QQAL3g{K?xdefqAEnr!3hwPr6o+o~xl+ZH2S0>Rce^shvP|zhd%vZ@+H4>3M*Z;?f zl)(=uN4v1u4qWx-hY1WsU?#RGga$&@vg)0n!)(i9STGf@={TqA}Kx0Y}5CL~F+PDk(IXEWv2SS`3l`0K*Un`Tzg` diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc index dd727108f31a02c44508dba73016d0431686a8ab..0378b314fe2301ea97bd71743c794f3f78b7a85e 100644 GIT binary patch delta 2062 zcmZuy&2!sC6yMc{Ei1NTIw?()Hi*)+@l4}>2j~DZX`4wqfZHL36irt2_ZiK8qp= zB1-T;aHkPzdr|1-Wj=<}$5G%$*q_F621OPH?sTCCamMLB+M4;_gcZtV$8$uvY)P;h zn+hE*u%HJ&fY>exVpH&f?$TZ9GP&Ko(vh|=3aKZzNlihwCP^PBPISOATkffCxla#( zqcEp@DIFvSNJnWaZMq@zxwi5Np=5Jzm2Bo#$#!uNpqc{U6foWa?1lfZW89-J;&$5r zJ_5Wq1iS};?kZd?h^T6&frrb?V;pH`m_`8UhJjy+$>MX9Hx19Mv!I}l*oI6q-E|1F zsMdj*4HpPLAco6KJLXW;5%Le+iAXV@h*WNR>nxI8=0zz7{1LwI2GL>5udl%sjPc6oO?eoH zI$W73^TE>M<*VJ|a{1Dg#gA4ZrRFpj#zyJPp2!57Nb0 zEp5|Y26WjzwWY^&uu_coa&U`K4;nl^E)z!fdwq2 ztIz}VNy{h+ManAa$+*DgbCF&ySGL3!XXP@-63Fq-$mhfJx=Cllr~0v15iTuhz`^*D K(vmLcuKo-0;Rcuh delta 194 zcmZouJ0Z&F#LLUY00dF<)nd%KCh|!z`b|`qGi6C(NMXuhjba7T%sFhi>{0BD45>^D zI8r$mGDdN^Go-Mju(mLyu%>c1Ge_~HFat2FmW*h0MKMF-v9sr diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/typing.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/typing.cpython-37.pyc index d287fe3ac905b49278cdb170992d84723928aa54..f0da31cd5d50012dd3444db0c16a9d377e214986 100644 GIT binary patch delta 44 ycmeC-`p3!Z#LLUY00eo9C1O)2^6D@;ZL|_*nH;dQOteyPGchon?8{QbkzAgh NmsL_|GWj@*IRK@A54HdR diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/ui.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/ui.cpython-37.pyc index 4534fedff0a03c8aa1d894665da6ccb77f9b1c31..3c17a072106270bd59a029ab206a523f1be13066 100644 GIT binary patch delta 4638 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 delta 4614 zcma)9S!^7~5uKhrxLhu&<+aQE5HGDrE)S79C{mUvixh2L5p`H2+3VqUlN@<=cHJ`+ zN!iX?rXpDg>{#d=cC07|6a)?s_(K8mkqgRS0^~;@N-zcj2MCfF2>j!~Kz^K5^>Vos zO$Fqji`}oQs;jH3s(XKR@q7?RwOXz02h6%uy;d*##b!gQQEQa_pxKma)|zF% z#B52mYOO?Jt^CiRGh}X0wP|fcSq{Uf)GSH0YwaYfoL8(mufjTB3cf?QN)-I4s>}PAW7^%dac6oOQ2wv>q5&&`KCr!n{Z8 zg>eng5gLVYRPy)1xF$<$0jQNgKLB;K9>(>opY^c56`wW$SOaYYtdR|{ zohx2#5RfL?3`jE|y@2cjq=mKu(h5igAVYv`r)_|=0kRE{VL;kx2Ou4QR06UakWQNI z0;mh1a)9;#w1dU~i2)J@WG^5)X*VF24VB zmg9pk-b44oc&{8ElH&X5h?E|u>a-FY75CKBS-FJZF-ID2}C(q{x zq4V5um}wn1mJBOK#F*!}pSYew*7E(ko;azhfq-{|Nw7vwI*i*ND7;gA?2QDHi*wdx z=j9>sg?Be;7sI}0vO|2YtoFX;`_MyTqN!Nl)(OJA3rRPSGxy&v-bwsBaU2uB2}ZW} zLN`WuJoj$^Cki5iFr@cC4_1;P>~hKMk<6~&Hs-8_l{^UNsaB1;OCIhhA*MHC7ESNXs3% z{)G(H9rlVaN?Y~~10UawWDk=4NThuQBG(#$iDhWE3M8QN5s|L06(5x*OV()+Q)TV_ z^-oeU3KLmWAPOZ;Nnxp);y`V5P*r6;%|NYjg!nbs+zZ;AckH@i{f3A|-_-h`cDjNTTX zhOf0?K&m~=Xb?Z z6@A$W;aLBTa zGwJh&wQG>emCho=c_6Ei()OiL$y+TQg6{l@_-|GJ!A<=9|2&C?{1{q3AEqH6zH{br zC9cO_wxI$zG`-;D%sUJs`~Z@*1IqQJH5yF(4wd?W1U!Ds4^5nm_J|vi=E296Z>r#V zkozMl$YrTG9*qlMG%~aW(HB7M;hHGnFTlE!JGLO00HH@>v}W(Y%BNSeY2B4@0?uIz zN?rsdABkVrG>AmBVJe(gl)o6Zs6_`YA4AJ+pKx9J?(=APym0$$QPm8n`P-T*mCvlI zYTAk~F_k`9C!CbRPEG4pgeeGqx=xsi-`D(OKvvaRfcbGC`4}z)kxaj!#g?2zW?r}1 zf5cyF?_QijfiV>DaT$7-5s>lM0zFJ?d8fj(tYpaJ`lJHM<$B>Z|I)36m&6ystvmSK zhLgPr6Z{eqnTv8Axgttz8n6r|K7*FK6ENb{fR8i5>$3+Y0FS{9pVF6Ns#`pM=yc-D zg;PhSWt9UY1XXYjo)mUsM&}$0$GRoDL|;Q=d4#MclS0BItnw@3`3BpMwS}J*j~a%j z%CNglE|jx*gGWoD0#RnI)}Rhl7Y1&{>m>nigap(eQAtqcuZlB`_eop?np&G4S0Ss_ zJ{0t#AQ6*I+8ADg{Hs7#tCZ`p(u=N-GSku5Zvr@6a0k4O#tJ(Te`z|By@nc4%@aZa zq-^GlqZHNxg{-Csje*oy4QBJ~<#D534kBq z#9k94t^dkmq+Rv3#N+W64h%}H)D0w7Z*IO89Ih`hYnY6qB6#R~f1?$};SE zM)^EUa|3xw;KnuJ43^EJN zc)0!NWK7&_>zG8HuE%7SygB&SQ3Us&KOHFHy0ZYKd`3^cw2;}L4h_LHIwwABy9w`P z5dIbtOjQ0Bs>wYZH;Q@D${BPd-o_9a_uJnbliQQ`mzsMjguo%XnaEkNL4|xU8mJ+Z z(~#~MKD8ky<%vprz70INCuYGNg=4(|vlDq^0z^@RrGZeOh~I#d?G$yL?>~d*C4J)- zC2~*5RsZBl%j-B@(7fj8MO2DUK85(<3zDl%;z3tbM7m}NWRNYwl5sUl@?UVcg8&3_MOW8_5auxRgY3(NeJ_DSoniSym< z;{ERWNjz&_j0EGFmmtCT str r""" Return full path to the user-specific cache dir for this application. @@ -61,6 +66,7 @@ def user_cache_dir(appname): def user_data_dir(appname, roaming=False): + # type: (str, bool) -> str r""" Return full path to the user-specific data dir for this application. @@ -113,6 +119,7 @@ def user_data_dir(appname, roaming=False): def user_config_dir(appname, roaming=True): + # type: (str, bool) -> str """Return full path to the user-specific config dir for this application. "appname" is the name of application. @@ -146,6 +153,7 @@ def user_config_dir(appname, roaming=True): # for the discussion regarding site_config_dirs locations # see def site_config_dirs(appname): + # type: (str) -> List[str] r"""Return a list of potential user-shared config dirs for this application. "appname" is the name of application. @@ -186,6 +194,7 @@ def site_config_dirs(appname): # -- Windows support functions -- def _get_win_folder_from_registry(csidl_name): + # type: (str) -> str """ 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_* @@ -208,6 +217,7 @@ def _get_win_folder_from_registry(csidl_name): def _get_win_folder_with_ctypes(csidl_name): + # type: (str) -> str csidl_const = { "CSIDL_APPDATA": 26, "CSIDL_COMMON_APPDATA": 35, diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/compat.py b/env/lib/python3.7/site-packages/pip/_internal/utils/compat.py index 3114f2d..845436e 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/compat.py +++ b/env/lib/python3.7/site-packages/pip/_internal/utils/compat.py @@ -11,6 +11,11 @@ import sys from pip._vendor.six import text_type +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Tuple, Text + try: import ipaddress except ImportError: @@ -18,8 +23,8 @@ except ImportError: from pip._vendor import ipaddress # type: ignore except ImportError: import ipaddr as ipaddress # type: ignore - ipaddress.ip_address = ipaddress.IPAddress - ipaddress.ip_network = ipaddress.IPNetwork + ipaddress.ip_address = ipaddress.IPAddress # type: ignore + ipaddress.ip_network = ipaddress.IPNetwork # type: ignore __all__ = [ @@ -68,6 +73,7 @@ else: def console_to_str(data): + # type: (bytes) -> Text """Return a string, safe for output, of subprocess output. We assume the data is in the locale preferred encoding. @@ -88,13 +94,13 @@ def console_to_str(data): # Now try to decode the data - if we fail, warn the user and # decode with replacement. try: - s = data.decode(encoding) + decoded_data = data.decode(encoding) except UnicodeDecodeError: logger.warning( "Subprocess output does not appear to be encoded as %s", encoding, ) - s = data.decode(encoding, errors=backslashreplace_decode) + decoded_data = data.decode(encoding, errors=backslashreplace_decode) # Make sure we can print the output, by encoding it to the output # encoding with replacement of unencodable characters, and then @@ -112,20 +118,25 @@ def console_to_str(data): "encoding", None) if output_encoding: - s = s.encode(output_encoding, errors="backslashreplace") - s = s.decode(output_encoding) + output_encoded = decoded_data.encode( + output_encoding, + errors="backslashreplace" + ) + decoded_data = output_encoded.decode(output_encoding) - return s + return decoded_data if sys.version_info >= (3,): def native_str(s, replace=False): + # type: (str, bool) -> str if isinstance(s, bytes): return s.decode('utf-8', 'replace' if replace else 'strict') return s else: def native_str(s, replace=False): + # type: (str, bool) -> str # Replace is ignored -- unicode to UTF-8 can't fail if isinstance(s, text_type): return s.encode('utf-8') @@ -133,6 +144,7 @@ else: def get_path_uid(path): + # type: (str) -> int """ Return path's uid. @@ -174,6 +186,7 @@ else: def expanduser(path): + # type: (str) -> str """ Expand ~ and ~user constructions. @@ -199,6 +212,7 @@ WINDOWS = (sys.platform.startswith("win") or def samefile(file1, file2): + # type: (str, str) -> bool """Provide an alternative for os.path.samefile on Windows/Python2""" if hasattr(os.path, 'samefile'): return os.path.samefile(file1, file2) @@ -210,13 +224,15 @@ def samefile(file1, file2): if hasattr(shutil, 'get_terminal_size'): def get_terminal_size(): + # type: () -> Tuple[int, int] """ Returns a tuple (x, y) representing the width(x) and the height(y) in characters of the terminal window. """ - return tuple(shutil.get_terminal_size()) + return tuple(shutil.get_terminal_size()) # type: ignore else: def get_terminal_size(): + # type: () -> Tuple[int, int] """ Returns a tuple (x, y) representing the width(x) and the height(y) in characters of the terminal window. diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py b/env/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py index bd744cf..8c896f8 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py +++ b/env/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py @@ -12,7 +12,10 @@ from pip import __version__ as current_version from pip._internal.utils.typing import MYPY_CHECK_RUNNING if MYPY_CHECK_RUNNING: - from typing import Any, Optional # noqa: F401 + from typing import Any, Optional + + +DEPRECATION_MSG_PREFIX = "DEPRECATION: " class PipDeprecationWarning(Warning): @@ -41,6 +44,7 @@ def _showwarning(message, category, filename, lineno, file=None, line=None): def install_warning_logger(): + # type: () -> None # Enable our Deprecation Warnings warnings.simplefilter("default", PipDeprecationWarning, append=True) @@ -76,7 +80,7 @@ def deprecated(reason, replacement, gone_in, issue=None): # Construct a nice message. # This is purposely eagerly formatted as we want it to appear as if someone # typed this entire message out. - message = "DEPRECATION: " + reason + message = DEPRECATION_MSG_PREFIX + reason if replacement is not None: message += " A possible replacement is {}.".format(replacement) if issue is not None: diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/encoding.py b/env/lib/python3.7/site-packages/pip/_internal/utils/encoding.py index 56f6036..30139f2 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/encoding.py +++ b/env/lib/python3.7/site-packages/pip/_internal/utils/encoding.py @@ -3,20 +3,26 @@ import locale import re import sys +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Tuple, Text + BOMS = [ - (codecs.BOM_UTF8, 'utf8'), - (codecs.BOM_UTF16, 'utf16'), - (codecs.BOM_UTF16_BE, 'utf16-be'), - (codecs.BOM_UTF16_LE, 'utf16-le'), - (codecs.BOM_UTF32, 'utf32'), - (codecs.BOM_UTF32_BE, 'utf32-be'), - (codecs.BOM_UTF32_LE, 'utf32-le'), -] + (codecs.BOM_UTF8, 'utf-8'), + (codecs.BOM_UTF16, 'utf-16'), + (codecs.BOM_UTF16_BE, 'utf-16-be'), + (codecs.BOM_UTF16_LE, 'utf-16-le'), + (codecs.BOM_UTF32, 'utf-32'), + (codecs.BOM_UTF32_BE, 'utf-32-be'), + (codecs.BOM_UTF32_LE, 'utf-32-le'), +] # type: List[Tuple[bytes, Text]] ENCODING_RE = re.compile(br'coding[:=]\s*([-\w.]+)') def auto_decode(data): + # type: (bytes) -> Text """Check a bytes string for a BOM to correctly detect the encoding Fallback to locale.getpreferredencoding(False) like open() on Python3""" diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py b/env/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py index 1e9cebd..1e6b033 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py +++ b/env/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py @@ -5,6 +5,7 @@ from pip._internal.utils.compat import get_path_uid def check_path_owner(path): + # type: (str) -> bool # If we don't have a way to check the effective uid of this process, then # we'll just assume that we own the directory. if not hasattr(os, "geteuid"): @@ -26,3 +27,4 @@ def check_path_owner(path): return os.access(path, os.W_OK) else: previous, path = path, os.path.dirname(path) + return False # assume we don't own the path diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/glibc.py b/env/lib/python3.7/site-packages/pip/_internal/utils/glibc.py index ebcfc5b..5bea655 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/glibc.py +++ b/env/lib/python3.7/site-packages/pip/_internal/utils/glibc.py @@ -4,8 +4,14 @@ import ctypes import re import warnings +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple + def glibc_version_string(): + # type: () -> Optional[str] "Returns glibc version string, or None if not using glibc." # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen @@ -32,6 +38,7 @@ def glibc_version_string(): # Separated out from have_compatible_glibc for easier unit testing def check_glibc_version(version_str, required_major, minimum_minor): + # type: (str, int, int) -> bool # Parse string and check against requested version. # # We use a regexp instead of str.split because we want to discard any @@ -48,7 +55,8 @@ def check_glibc_version(version_str, required_major, minimum_minor): def have_compatible_glibc(required_major, minimum_minor): - version_str = glibc_version_string() + # type: (int, int) -> bool + version_str = glibc_version_string() # type: Optional[str] if version_str is None: return False return check_glibc_version(version_str, required_major, minimum_minor) @@ -72,6 +80,7 @@ def have_compatible_glibc(required_major, minimum_minor): # misleading. Solution: instead of using platform, use our code that actually # works. def libc_ver(): + # type: () -> Tuple[str, str] """Try to determine the glibc version Returns a tuple of strings (lib, version) which default to empty strings diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/hashes.py b/env/lib/python3.7/site-packages/pip/_internal/utils/hashes.py index 8b909ba..a714206 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/hashes.py +++ b/env/lib/python3.7/site-packages/pip/_internal/utils/hashes.py @@ -8,6 +8,18 @@ from pip._internal.exceptions import ( HashMismatch, HashMissing, InstallationError, ) from pip._internal.utils.misc import read_chunks +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Dict, List, BinaryIO, NoReturn, Iterator + ) + from pip._vendor.six import PY3 + if PY3: + from hashlib import _Hash + else: + from hashlib import _hash as _Hash + # The recommended hash algo of the moment. Change this whenever the state of # the art changes; it won't hurt backward compatibility. @@ -25,6 +37,7 @@ class Hashes(object): """ def __init__(self, hashes=None): + # type: (Dict[str, List[str]]) -> None """ :param hashes: A dict of algorithm names pointing to lists of allowed hex digests @@ -32,6 +45,7 @@ class Hashes(object): self._allowed = {} if hashes is None else hashes def check_against_chunks(self, chunks): + # type: (Iterator[bytes]) -> None """Check good hashes against ones built from iterable of chunks of data. @@ -55,9 +69,11 @@ class Hashes(object): self._raise(gots) def _raise(self, gots): + # type: (Dict[str, _Hash]) -> NoReturn raise HashMismatch(self._allowed, gots) def check_against_file(self, file): + # type: (BinaryIO) -> None """Check good hashes against a file-like object Raise HashMismatch if none match. @@ -66,14 +82,17 @@ class Hashes(object): return self.check_against_chunks(read_chunks(file)) def check_against_path(self, path): + # type: (str) -> None with open(path, 'rb') as file: return self.check_against_file(file) def __nonzero__(self): + # type: () -> bool """Return whether I know any known-good hashes.""" return bool(self._allowed) def __bool__(self): + # type: () -> bool return self.__nonzero__() @@ -85,10 +104,12 @@ class MissingHashes(Hashes): """ def __init__(self): + # type: () -> None """Don't offer the ``hashes`` kwarg.""" # Pass our favorite hash in to generate a "gotten hash". With the # empty list, it will never match, so an error will always raise. super(MissingHashes, self).__init__(hashes={FAVORITE_HASH: []}) def _raise(self, gots): + # type: (Dict[str, _Hash]) -> NoReturn raise HashMissing(gots[FAVORITE_HASH].hexdigest()) diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/logging.py b/env/lib/python3.7/site-packages/pip/_internal/utils/logging.py index d9b9541..a28e88c 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/logging.py +++ b/env/lib/python3.7/site-packages/pip/_internal/utils/logging.py @@ -1,12 +1,18 @@ from __future__ import absolute_import import contextlib +import errno import logging import logging.handlers import os +import sys +from logging import Filter + +from pip._vendor.six import PY2 from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.misc import ensure_dir +from pip._internal.utils.deprecation import DEPRECATION_MSG_PREFIX +from pip._internal.utils.misc import ensure_dir, subprocess_logger try: import threading @@ -26,6 +32,48 @@ _log_state = threading.local() _log_state.indentation = 0 +class BrokenStdoutLoggingError(Exception): + """ + Raised if BrokenPipeError occurs for the stdout stream while logging. + """ + pass + + +# BrokenPipeError does not exist in Python 2 and, in addition, manifests +# differently in Windows and non-Windows. +if WINDOWS: + # In Windows, a broken pipe can show up as EINVAL rather than EPIPE: + # https://bugs.python.org/issue19612 + # https://bugs.python.org/issue30418 + if PY2: + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return (exc_class is IOError and + exc.errno in (errno.EINVAL, errno.EPIPE)) + else: + # In Windows, a broken pipe IOError became OSError in Python 3. + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return ((exc_class is BrokenPipeError) or # noqa: F821 + (exc_class is OSError and + exc.errno in (errno.EINVAL, errno.EPIPE))) +elif PY2: + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return (exc_class is IOError and exc.errno == errno.EPIPE) +else: + # Then we are in the non-Windows Python 3 case. + def _is_broken_pipe_error(exc_class, exc): + """ + Return whether an exception is a broken pipe error. + + Args: + exc_class: an exception class. + exc: an exception instance. + """ + return (exc_class is BrokenPipeError) # noqa: F821 + + @contextlib.contextmanager def indent_log(num=2): """ @@ -44,15 +92,47 @@ def get_indentation(): class IndentingFormatter(logging.Formatter): + def __init__(self, *args, **kwargs): + """ + A logging.Formatter that obeys the indent_log() context manager. + + :param add_timestamp: A bool indicating output lines should be prefixed + with their record's timestamp. + """ + self.add_timestamp = kwargs.pop("add_timestamp", False) + super(IndentingFormatter, self).__init__(*args, **kwargs) + + def get_message_start(self, formatted, levelno): + """ + Return the start of the formatted log message (not counting the + prefix to add to each line). + """ + if levelno < logging.WARNING: + return '' + if formatted.startswith(DEPRECATION_MSG_PREFIX): + # Then the message already has a prefix. We don't want it to + # look like "WARNING: DEPRECATION: ...." + return '' + if levelno < logging.ERROR: + return 'WARNING: ' + + return 'ERROR: ' def format(self, record): """ Calls the standard formatter, but will indent all of the log messages by our current indentation level. """ - formatted = logging.Formatter.format(self, record) + formatted = super(IndentingFormatter, self).format(record) + message_start = self.get_message_start(formatted, record.levelno) + formatted = message_start + formatted + + prefix = '' + if self.add_timestamp: + prefix = self.formatTime(record, "%Y-%m-%dT%H:%M:%S ") + prefix += " " * get_indentation() formatted = "".join([ - (" " * get_indentation()) + line + prefix + line for line in formatted.splitlines(True) ]) return formatted @@ -83,6 +163,16 @@ class ColorizedStreamHandler(logging.StreamHandler): if WINDOWS and colorama: self.stream = colorama.AnsiToWin32(self.stream) + def _using_stdout(self): + """ + Return whether the handler is using sys.stdout. + """ + if WINDOWS and colorama: + # Then self.stream is an AnsiToWin32 object. + return self.stream.wrapped is sys.stdout + + return self.stream is sys.stdout + def should_color(self): # Don't colorize things if we do not have colorama or if told not to if not colorama or self._no_color: @@ -115,6 +205,19 @@ class ColorizedStreamHandler(logging.StreamHandler): return msg + # The logging module says handleError() can be customized. + def handleError(self, record): + exc_class, exc = sys.exc_info()[:2] + # If a broken pipe occurred while calling write() or flush() on the + # stdout stream in logging's Handler.emit(), then raise our special + # exception so we can handle it in main() instead of logging the + # broken pipe error and continuing. + if (exc_class and self._using_stdout() and + _is_broken_pipe_error(exc_class, exc)): + raise BrokenStdoutLoggingError() + + return super(ColorizedStreamHandler, self).handleError(record) + class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler): @@ -123,7 +226,7 @@ class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler): return logging.handlers.RotatingFileHandler._open(self) -class MaxLevelFilter(logging.Filter): +class MaxLevelFilter(Filter): def __init__(self, level): self.level = level @@ -132,8 +235,22 @@ class MaxLevelFilter(logging.Filter): return record.levelno < self.level +class ExcludeLoggerFilter(Filter): + + """ + A logging Filter that excludes records from a logger (or its children). + """ + + def filter(self, record): + # The base Filter class allows only records from a logger (or its + # children). + return not super(ExcludeLoggerFilter, self).filter(record) + + def setup_logging(verbosity, no_color, user_log_file): """Configures and sets up all of the logging + + Returns the requested logging level, as its integer value. """ # Determine the level to be logging at. @@ -148,6 +265,8 @@ def setup_logging(verbosity, no_color, user_log_file): else: level = "INFO" + level_number = getattr(logging, level) + # The "root" logger should match the "console" level *unless* we also need # to log to a user log file. include_user_log = user_log_file is not None @@ -171,6 +290,9 @@ def setup_logging(verbosity, no_color, user_log_file): "stream": "pip._internal.utils.logging.ColorizedStreamHandler", "file": "pip._internal.utils.logging.BetterRotatingFileHandler", } + handlers = ["console", "console_errors", "console_subprocess"] + ( + ["user_log"] if include_user_log else [] + ) logging.config.dictConfig({ "version": 1, @@ -180,12 +302,25 @@ def setup_logging(verbosity, no_color, user_log_file): "()": "pip._internal.utils.logging.MaxLevelFilter", "level": logging.WARNING, }, + "restrict_to_subprocess": { + "()": "logging.Filter", + "name": subprocess_logger.name, + }, + "exclude_subprocess": { + "()": "pip._internal.utils.logging.ExcludeLoggerFilter", + "name": subprocess_logger.name, + }, }, "formatters": { "indent": { "()": IndentingFormatter, "format": "%(message)s", }, + "indent_with_timestamp": { + "()": IndentingFormatter, + "format": "%(message)s", + "add_timestamp": True, + }, }, "handlers": { "console": { @@ -193,7 +328,7 @@ def setup_logging(verbosity, no_color, user_log_file): "class": handler_classes["stream"], "no_color": no_color, "stream": log_streams["stdout"], - "filters": ["exclude_warnings"], + "filters": ["exclude_subprocess", "exclude_warnings"], "formatter": "indent", }, "console_errors": { @@ -201,6 +336,17 @@ def setup_logging(verbosity, no_color, user_log_file): "class": handler_classes["stream"], "no_color": no_color, "stream": log_streams["stderr"], + "filters": ["exclude_subprocess"], + "formatter": "indent", + }, + # A handler responsible for logging to the console messages + # from the "subprocessor" logger. + "console_subprocess": { + "level": level, + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stderr"], + "filters": ["restrict_to_subprocess"], "formatter": "indent", }, "user_log": { @@ -208,14 +354,12 @@ def setup_logging(verbosity, no_color, user_log_file): "class": handler_classes["file"], "filename": additional_log_file, "delay": True, - "formatter": "indent", + "formatter": "indent_with_timestamp", }, }, "root": { "level": root_level, - "handlers": ["console", "console_errors"] + ( - ["user_log"] if include_user_log else [] - ), + "handlers": handlers, }, "loggers": { "pip._vendor": { @@ -223,3 +367,5 @@ def setup_logging(verbosity, no_color, user_log_file): } }, }) + + return level_number diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/misc.py b/env/lib/python3.7/site-packages/pip/_internal/utils/misc.py index 84a421f..ca7a529 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/misc.py +++ b/env/lib/python3.7/site-packages/pip/_internal/utils/misc.py @@ -3,7 +3,6 @@ from __future__ import absolute_import import contextlib import errno import io -import locale # we have a submodule named 'logging' which would shadow this if we used the # regular name: import logging as std_logging @@ -23,8 +22,9 @@ from pip._vendor import pkg_resources # why we ignore the type on this import. from pip._vendor.retrying import retry # type: ignore from pip._vendor.six import PY2 -from pip._vendor.six.moves import input +from pip._vendor.six.moves import input, shlex_quote from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib.parse import unquote as urllib_unquote from pip._internal.exceptions import CommandError, InstallationError from pip._internal.locations import ( @@ -34,12 +34,23 @@ from pip._internal.locations import ( from pip._internal.utils.compat import ( WINDOWS, console_to_str, expanduser, stdlib_pkgs, ) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING if PY2: from io import BytesIO as StringIO else: from io import StringIO +if MYPY_CHECK_RUNNING: + from typing import ( + Optional, Tuple, Iterable, List, Match, Union, Any, Mapping, Text, + AnyStr, Container + ) + from pip._vendor.pkg_resources import Distribution + from pip._internal.models.link import Link + from pip._internal.utils.ui import SpinnerInterface + + __all__ = ['rmtree', 'display_path', 'backup_dir', 'ask', 'splitext', 'format_size', 'is_installable_dir', @@ -49,19 +60,24 @@ __all__ = ['rmtree', 'display_path', 'backup_dir', 'renames', 'get_prog', 'unzip_file', 'untar_file', 'unpack_file', 'call_subprocess', 'captured_stdout', 'ensure_dir', - 'ARCHIVE_EXTENSIONS', 'SUPPORTED_EXTENSIONS', + 'ARCHIVE_EXTENSIONS', 'SUPPORTED_EXTENSIONS', 'WHEEL_EXTENSION', 'get_installed_version', 'remove_auth_from_url'] logger = std_logging.getLogger(__name__) +subprocess_logger = std_logging.getLogger('pip.subprocessor') +LOG_DIVIDER = '----------------------------------------' + +WHEEL_EXTENSION = '.whl' BZ2_EXTENSIONS = ('.tar.bz2', '.tbz') XZ_EXTENSIONS = ('.tar.xz', '.txz', '.tlz', '.tar.lz', '.tar.lzma') -ZIP_EXTENSIONS = ('.zip', '.whl') +ZIP_EXTENSIONS = ('.zip', WHEEL_EXTENSION) TAR_EXTENSIONS = ('.tar.gz', '.tgz', '.tar') ARCHIVE_EXTENSIONS = ( ZIP_EXTENSIONS + BZ2_EXTENSIONS + TAR_EXTENSIONS + XZ_EXTENSIONS) SUPPORTED_EXTENSIONS = ZIP_EXTENSIONS + TAR_EXTENSIONS + try: import bz2 # noqa SUPPORTED_EXTENSIONS += BZ2_EXTENSIONS @@ -76,14 +92,8 @@ except ImportError: logger.debug('lzma module is not available') -def import_or_raise(pkg_or_module_string, ExceptionType, *args, **kwargs): - try: - return __import__(pkg_or_module_string) - except ImportError: - raise ExceptionType(*args, **kwargs) - - def ensure_dir(path): + # type: (AnyStr) -> None """os.path.makedirs without EEXIST.""" try: os.makedirs(path) @@ -93,6 +103,7 @@ def ensure_dir(path): def get_prog(): + # type: () -> str try: prog = os.path.basename(sys.argv[0]) if prog in ('__main__.py', '-c'): @@ -107,6 +118,7 @@ def get_prog(): # Retry every half second for up to 3 seconds @retry(stop_max_delay=3000, wait_fixed=500) def rmtree(dir, ignore_errors=False): + # type: (str, bool) -> None shutil.rmtree(dir, ignore_errors=ignore_errors, onerror=rmtree_errorhandler) @@ -127,6 +139,7 @@ def rmtree_errorhandler(func, path, exc_info): def display_path(path): + # type: (Union[str, Text]) -> str """Gives the display value for a given path, making it relative to cwd if possible.""" path = os.path.normcase(os.path.abspath(path)) @@ -139,6 +152,7 @@ def display_path(path): def backup_dir(dir, ext='.bak'): + # type: (str, str) -> str """Figure out the name of a directory to back up the given dir to (adding .bak, .bak2, etc)""" n = 1 @@ -150,6 +164,7 @@ def backup_dir(dir, ext='.bak'): def ask_path_exists(message, options): + # type: (str, Iterable[str]) -> str for action in os.environ.get('PIP_EXISTS_ACTION', '').split(): if action in options: return action @@ -157,6 +172,7 @@ def ask_path_exists(message, options): def ask(message, options): + # type: (str, Iterable[str]) -> str """Ask the message interactively, with the given possible responses""" while 1: if os.environ.get('PIP_NO_INPUT'): @@ -176,6 +192,7 @@ def ask(message, options): def format_size(bytes): + # type: (float) -> str if bytes > 1000 * 1000: return '%.1fMB' % (bytes / 1000.0 / 1000) elif bytes > 10 * 1000: @@ -187,6 +204,7 @@ def format_size(bytes): def is_installable_dir(path): + # type: (str) -> bool """Is path is a directory containing setup.py or pyproject.toml? """ if not os.path.isdir(path): @@ -201,6 +219,7 @@ def is_installable_dir(path): def is_svn_page(html): + # type: (Union[str, Text]) -> Optional[Match[Union[str, Text]]] """ Returns true if the page appears to be the index page of an svn repository """ @@ -209,6 +228,7 @@ def is_svn_page(html): def file_contents(filename): + # type: (str) -> Text with open(filename, 'rb') as fp: return fp.read().decode('utf-8') @@ -223,6 +243,7 @@ def read_chunks(file, size=io.DEFAULT_BUFFER_SIZE): def split_leading_dir(path): + # type: (Union[str, Text]) -> List[Union[str, Text]] path = path.lstrip('/').lstrip('\\') if '/' in path and (('\\' in path and path.find('/') < path.find('\\')) or '\\' not in path): @@ -230,10 +251,11 @@ def split_leading_dir(path): elif '\\' in path: return path.split('\\', 1) else: - return path, '' + return [path, ''] def has_leading_dir(paths): + # type: (Iterable[Union[str, Text]]) -> bool """Returns true if all the paths have the same leading path name (i.e., everything is in one subdirectory in an archive)""" common_prefix = None @@ -249,6 +271,7 @@ def has_leading_dir(paths): def normalize_path(path, resolve_symlinks=True): + # type: (str, bool) -> str """ Convert a path to its canonical, case-normalized, absolute version. @@ -262,6 +285,7 @@ def normalize_path(path, resolve_symlinks=True): def splitext(path): + # type: (str) -> Tuple[str, str] """Like os.path.splitext, but take off .tar too""" base, ext = posixpath.splitext(path) if base.lower().endswith('.tar'): @@ -271,6 +295,7 @@ def splitext(path): def renames(old, new): + # type: (str, str) -> None """Like os.renames(), but handles renaming across devices.""" # Implementation borrowed from os.renames(). head, tail = os.path.split(new) @@ -288,6 +313,7 @@ def renames(old, new): def is_local(path): + # type: (str) -> bool """ Return True if path is within sys.prefix, if we're running in a virtualenv. @@ -300,6 +326,7 @@ def is_local(path): def dist_is_local(dist): + # type: (Distribution) -> bool """ Return True if given Distribution object is installed locally (i.e. within current virtualenv). @@ -311,6 +338,7 @@ def dist_is_local(dist): def dist_in_usersite(dist): + # type: (Distribution) -> bool """ Return True if given Distribution is installed in user site. """ @@ -319,6 +347,7 @@ def dist_in_usersite(dist): def dist_in_site_packages(dist): + # type: (Distribution) -> bool """ Return True if given Distribution is installed in sysconfig.get_python_lib(). @@ -329,7 +358,10 @@ def dist_in_site_packages(dist): def dist_is_editable(dist): - """Is distribution an editable install?""" + # type: (Distribution) -> bool + """ + Return True if given Distribution is an editable install. + """ for path_item in sys.path: egg_link = os.path.join(path_item, dist.project_name + '.egg-link') if os.path.isfile(egg_link): @@ -342,6 +374,7 @@ def get_installed_distributions(local_only=True, include_editables=True, editables_only=False, user_only=False): + # type: (bool, Container[str], bool, bool, bool) -> List[Distribution] """ Return a list of installed Distribution objects. @@ -385,7 +418,8 @@ def get_installed_distributions(local_only=True, def user_test(d): return True - return [d for d in pkg_resources.working_set + # because of pkg_resources vendoring, mypy cannot find stub in typeshed + return [d for d in pkg_resources.working_set # type: ignore if local_test(d) and d.key not in skip and editable_test(d) and @@ -395,6 +429,7 @@ def get_installed_distributions(local_only=True, def egg_link_path(dist): + # type: (Distribution) -> Optional[str] """ Return the path for the .egg-link file if it exists, otherwise, None. @@ -429,9 +464,11 @@ def egg_link_path(dist): egglink = os.path.join(site, dist.project_name) + '.egg-link' if os.path.isfile(egglink): return egglink + return None def dist_location(dist): + # type: (Distribution) -> str """ Get the site-packages location of this distribution. Generally this is dist.location, except in the case of develop-installed @@ -453,6 +490,7 @@ def current_umask(): def unzip_file(filename, location, flatten=True): + # type: (str, str, bool) -> None """ Unzip the file (with path `filename`) to the destination `location`. All files are written based on system defaults and umask (i.e. permissions are @@ -468,7 +506,6 @@ def unzip_file(filename, location, flatten=True): leading = has_leading_dir(zip.namelist()) and flatten for info in zip.infolist(): name = info.filename - data = zip.read(name) fn = name if leading: fn = split_leading_dir(name)[1] @@ -479,9 +516,12 @@ def unzip_file(filename, location, flatten=True): ensure_dir(fn) else: ensure_dir(dir) - fp = open(fn, 'wb') + # Don't use read() to avoid allocating an arbitrarily large + # chunk of memory for the file's content + fp = zip.open(name) try: - fp.write(data) + with open(fn, 'wb') as destfp: + shutil.copyfileobj(fp, destfp) finally: fp.close() mode = info.external_attr >> 16 @@ -496,6 +536,7 @@ def unzip_file(filename, location, flatten=True): def untar_file(filename, location): + # type: (str, str) -> None """ Untar the file (with path `filename`) to the destination `location`. All files are written based on system defaults and umask (i.e. permissions @@ -520,23 +561,21 @@ def untar_file(filename, location): mode = 'r:*' tar = tarfile.open(filename, mode) try: - # note: python<=2.5 doesn't seem to know about pax headers, filter them leading = has_leading_dir([ member.name for member in tar.getmembers() - if member.name != 'pax_global_header' ]) for member in tar.getmembers(): fn = member.name - if fn == 'pax_global_header': - continue if leading: - fn = split_leading_dir(fn)[1] + # https://github.com/python/mypy/issues/1174 + fn = split_leading_dir(fn)[1] # type: ignore path = os.path.join(location, fn) if member.isdir(): ensure_dir(path) elif member.issym(): try: - tar._extract_member(member, path) + # https://github.com/python/typeshed/issues/2673 + tar._extract_member(member, path) # type: ignore except Exception as exc: # Some corrupt tar files seem to produce this # (specifically bad symlinks) @@ -561,7 +600,8 @@ def untar_file(filename, location): shutil.copyfileobj(fp, destfp) fp.close() # Update the timestamp (useful for cython compiled files) - tar.utime(member, path) + # https://github.com/python/typeshed/issues/2673 + tar.utime(member, path) # type: ignore # member have any execute permissions for user/group/world? if member.mode & 0o111: # make dest file have execute for user/group/world @@ -571,7 +611,13 @@ def untar_file(filename, location): tar.close() -def unpack_file(filename, location, content_type, link): +def unpack_file( + filename, # type: str + location, # type: str + content_type, # type: Optional[str] + link # type: Optional[Link] +): + # type: (...) -> None filename = os.path.realpath(filename) if (content_type == 'application/zip' or filename.lower().endswith(ZIP_EXTENSIONS) or @@ -604,50 +650,75 @@ def unpack_file(filename, location, content_type, link): ) -def call_subprocess(cmd, show_stdout=True, cwd=None, - on_returncode='raise', - command_desc=None, - extra_environ=None, unset_environ=None, spinner=None): +def format_command_args(args): + # type: (List[str]) -> str + """ + Format command arguments for display. + """ + return ' '.join(shlex_quote(arg) for arg in args) + + +def call_subprocess( + cmd, # type: List[str] + show_stdout=False, # type: bool + cwd=None, # type: Optional[str] + on_returncode='raise', # type: str + extra_ok_returncodes=None, # type: Optional[Iterable[int]] + command_desc=None, # type: Optional[str] + extra_environ=None, # type: Optional[Mapping[str, Any]] + unset_environ=None, # type: Optional[Iterable[str]] + spinner=None # type: Optional[SpinnerInterface] +): + # type: (...) -> Optional[Text] """ Args: + show_stdout: if true, use INFO to log the subprocess's stderr and + stdout streams. Otherwise, use DEBUG. Defaults to False. + extra_ok_returncodes: an iterable of integer return codes that are + acceptable, in addition to 0. Defaults to None, which means []. unset_environ: an iterable of environment variable names to unset prior to calling subprocess.Popen(). """ + if extra_ok_returncodes is None: + extra_ok_returncodes = [] if unset_environ is None: unset_environ = [] - # This function's handling of subprocess output is confusing and I - # previously broke it terribly, so as penance I will write a long comment - # explaining things. + # Most places in pip use show_stdout=False. What this means is-- # - # The obvious thing that affects output is the show_stdout= - # kwarg. show_stdout=True means, let the subprocess write directly to our - # stdout. Even though it is nominally the default, it is almost never used - # inside pip (and should not be used in new code without a very good - # reason); as of 2016-02-22 it is only used in a few places inside the VCS - # wrapper code. Ideally we should get rid of it entirely, because it - # creates a lot of complexity here for a rarely used feature. + # - We connect the child's output (combined stderr and stdout) to a + # single pipe, which we read. + # - We log this output to stderr at DEBUG level as it is received. + # - If DEBUG logging isn't enabled (e.g. if --verbose logging wasn't + # requested), then we show a spinner so the user can still see the + # subprocess is in progress. + # - If the subprocess exits with an error, we log the output to stderr + # at ERROR level if it hasn't already been displayed to the console + # (e.g. if --verbose logging wasn't enabled). This way we don't log + # the output to the console twice. # - # Most places in pip set show_stdout=False. What this means is: - # - We connect the child stdout to a pipe, which we read. - # - By default, we hide the output but show a spinner -- unless the - # subprocess exits with an error, in which case we show the output. - # - If the --verbose option was passed (= loglevel is DEBUG), then we show - # the output unconditionally. (But in this case we don't want to show - # the output a second time if it turns out that there was an error.) - # - # stderr is always merged with stdout (even if show_stdout=True). + # If show_stdout=True, then the above is still done, but with DEBUG + # replaced by INFO. if show_stdout: - stdout = None + # Then log the subprocess output at INFO level. + log_subprocess = subprocess_logger.info + used_level = std_logging.INFO else: - stdout = subprocess.PIPE + # Then log the subprocess output using DEBUG. This also ensures + # it will be logged to the log file (aka user_log), if enabled. + log_subprocess = subprocess_logger.debug + used_level = std_logging.DEBUG + + # Whether the subprocess will be visible in the console. + showing_subprocess = subprocess_logger.getEffectiveLevel() <= used_level + + # Only use the spinner if we're not showing the subprocess output + # and we have a spinner. + use_spinner = not showing_subprocess and spinner is not None + if command_desc is None: - cmd_parts = [] - for part in cmd: - if ' ' in part or '\n' in part or '"' in part or "'" in part: - part = '"%s"' % part.replace('"', '\\"') - cmd_parts.append(part) - command_desc = ' '.join(cmd_parts) - logger.debug("Running command %s", command_desc) + command_desc = format_command_args(cmd) + + log_subprocess("Running command %s", command_desc) env = os.environ.copy() if extra_environ: env.update(extra_environ) @@ -656,55 +727,55 @@ def call_subprocess(cmd, show_stdout=True, cwd=None, try: proc = subprocess.Popen( cmd, stderr=subprocess.STDOUT, stdin=subprocess.PIPE, - stdout=stdout, cwd=cwd, env=env, + stdout=subprocess.PIPE, cwd=cwd, env=env, ) proc.stdin.close() except Exception as exc: - logger.critical( + subprocess_logger.critical( "Error %s while executing command %s", exc, command_desc, ) raise all_output = [] - if stdout is not None: - while True: - line = console_to_str(proc.stdout.readline()) - if not line: - break - line = line.rstrip() - all_output.append(line + '\n') - if logger.getEffectiveLevel() <= std_logging.DEBUG: - # Show the line immediately - logger.debug(line) - else: - # Update the spinner - if spinner is not None: - spinner.spin() + while True: + line = console_to_str(proc.stdout.readline()) + if not line: + break + line = line.rstrip() + all_output.append(line + '\n') + + # Show the line immediately. + log_subprocess(line) + # Update the spinner. + if use_spinner: + spinner.spin() try: proc.wait() finally: if proc.stdout: proc.stdout.close() - if spinner is not None: - if proc.returncode: + proc_had_error = ( + proc.returncode and proc.returncode not in extra_ok_returncodes + ) + if use_spinner: + if proc_had_error: spinner.finish("error") else: spinner.finish("done") - if proc.returncode: + if proc_had_error: if on_returncode == 'raise': - if (logger.getEffectiveLevel() > std_logging.DEBUG and - not show_stdout): - logger.info( + if not showing_subprocess: + # Then the subprocess streams haven't been logged to the + # console yet. + subprocess_logger.error( 'Complete output from command %s:', command_desc, ) - logger.info( - ''.join(all_output) + - '\n----------------------------------------' - ) + # The all_output value already ends in a newline. + subprocess_logger.error(''.join(all_output) + LOG_DIVIDER) raise InstallationError( 'Command "%s" failed with error code %s in %s' % (command_desc, proc.returncode, cwd)) elif on_returncode == 'warn': - logger.warning( + subprocess_logger.warning( 'Command "%s" had error code %s in %s', command_desc, proc.returncode, cwd, ) @@ -713,32 +784,7 @@ def call_subprocess(cmd, show_stdout=True, cwd=None, else: raise ValueError('Invalid value: on_returncode=%s' % repr(on_returncode)) - if not show_stdout: - return ''.join(all_output) - - -def read_text_file(filename): - """Return the contents of *filename*. - - Try to decode the file contents with utf-8, the preferred system encoding - (e.g., cp1252 on some Windows machines), and latin1, in that order. - Decoding a byte string with latin1 will never raise an error. In the worst - case, the returned string will contain some garbage characters. - - """ - with open(filename, 'rb') as fp: - data = fp.read() - - encodings = ['utf-8', locale.getpreferredencoding(False), 'latin1'] - for enc in encodings: - try: - data = data.decode(enc) - except UnicodeDecodeError: - continue - break - - assert type(data) != bytes # Latin1 should have worked. - return data + return ''.join(all_output) def _make_build_dir(build_dir): @@ -805,6 +851,13 @@ def captured_stdout(): return captured_output('stdout') +def captured_stderr(): + """ + See captured_stdout(). + """ + return captured_output('stderr') + + class cached_property(object): """A property that is only computed once per instance and then replaces itself with an ordinary attribute. Deleting the attribute resets the @@ -856,20 +909,6 @@ def enum(*sequential, **named): return type('Enum', (), enums) -def make_vcs_requirement_url(repo_url, rev, egg_project_name, subdir=None): - """ - Return the URL for a VCS requirement. - - Args: - repo_url: the remote VCS url, with any needed VCS prefix (e.g. "git+"). - """ - req = '{}@{}#egg={}'.format(repo_url, rev, egg_project_name) - if subdir: - req += '&subdirectory={}'.format(subdir) - - return req - - def split_auth_from_netloc(netloc): """ Parse out and remove the auth information from a netloc. @@ -887,22 +926,36 @@ def split_auth_from_netloc(netloc): # Split from the left because that's how urllib.parse.urlsplit() # behaves if more than one : is present (which again can be checked # using the password attribute of the return value) - user_pass = tuple(auth.split(':', 1)) + user_pass = auth.split(':', 1) else: user_pass = auth, None + user_pass = tuple( + None if x is None else urllib_unquote(x) for x in user_pass + ) + return netloc, user_pass -def 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. +def redact_netloc(netloc): + # type: (str) -> str + """ + Replace the password in a netloc with "****", if it exists. - # parsed url + For example, "user:pass@example.com" returns "user:****@example.com". + """ + netloc, (user, password) = split_auth_from_netloc(netloc) + if user is None: + return netloc + password = '' if password is None else ':****' + return '{user}{password}@{netloc}'.format(user=urllib_parse.quote(user), + password=password, + netloc=netloc) + + +def _transform_url(url, transform_netloc): purl = urllib_parse.urlsplit(url) - netloc, user_pass = split_auth_from_netloc(purl.netloc) - + netloc = transform_netloc(purl.netloc) # stripped url url_pieces = ( purl.scheme, netloc, purl.path, purl.query, purl.fragment @@ -911,6 +964,24 @@ def remove_auth_from_url(url): return surl +def _get_netloc(netloc): + return split_auth_from_netloc(netloc)[0] + + +def remove_auth_from_url(url): + # type: (str) -> str + # Return a copy of url with 'username:password@' removed. + # username/pass params are passed to subversion through flags + # and are not recognized in the url. + return _transform_url(url, _get_netloc) + + +def redact_password_from_url(url): + # type: (str) -> str + """Replace the password in a given url with ****.""" + return _transform_url(url, redact_netloc) + + def protect_pip_from_modification_on_windows(modifying_pip): """Protection of pip.exe from modification on Windows diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/outdated.py b/env/lib/python3.7/site-packages/pip/_internal/utils/outdated.py index 5bfbfe1..3b58cd5 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/outdated.py +++ b/env/lib/python3.7/site-packages/pip/_internal/utils/outdated.py @@ -13,6 +13,13 @@ from pip._internal.index import PackageFinder from pip._internal.utils.compat import WINDOWS from pip._internal.utils.filesystem import check_path_owner from pip._internal.utils.misc import ensure_dir, get_installed_version +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + import optparse + from typing import Any, Dict + from pip._internal.download import PipSession + SELFCHECK_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ" @@ -22,7 +29,8 @@ logger = logging.getLogger(__name__) class SelfCheckState(object): def __init__(self, cache_dir): - self.state = {} + # type: (str) -> None + self.state = {} # type: Dict[str, Any] self.statefile_path = None # Try to load the existing state @@ -37,6 +45,7 @@ class SelfCheckState(object): pass def save(self, pypi_version, current_time): + # type: (str, datetime.datetime) -> None # If we do not have a path to cache in, don't bother saving. if not self.statefile_path: return @@ -68,6 +77,7 @@ class SelfCheckState(object): def was_installed_by_pip(pkg): + # type: (str) -> bool """Checks whether pkg was installed by pip This is used not to display the upgrade message when pip is in fact @@ -82,6 +92,7 @@ def was_installed_by_pip(pkg): def pip_version_check(session, options): + # type: (PipSession, optparse.Values) -> None """Check for an update for pip. Limit the frequency of checks to once per week. State is stored either in @@ -116,15 +127,12 @@ def pip_version_check(session, options): index_urls=[options.index_url] + options.extra_index_urls, allow_all_prereleases=False, # Explicitly set to False trusted_hosts=options.trusted_hosts, - process_dependency_links=options.process_dependency_links, session=session, ) - all_candidates = finder.find_all_candidates("pip") - if not all_candidates: + candidate = finder.find_candidates("pip").get_best() + if candidate is None: return - pypi_version = str( - max(all_candidates, key=lambda c: c.version).version - ) + pypi_version = str(candidate.version) # save that we've performed a check state.save(pypi_version, current_time) diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/packaging.py b/env/lib/python3.7/site-packages/pip/_internal/utils/packaging.py index c43142f..449f3fd 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/packaging.py +++ b/env/lib/python3.7/site-packages/pip/_internal/utils/packaging.py @@ -2,18 +2,26 @@ from __future__ import absolute_import import logging import sys -from email.parser import FeedParser # type: ignore +from email.parser import FeedParser from pip._vendor import pkg_resources from pip._vendor.packaging import specifiers, version from pip._internal import exceptions from pip._internal.utils.misc import display_path +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional + from email.message import Message + from pip._vendor.pkg_resources import Distribution + logger = logging.getLogger(__name__) def check_requires_python(requires_python): + # type: (Optional[str]) -> bool """ Check if the python version in use match the `requires_python` specifier. @@ -34,6 +42,7 @@ def check_requires_python(requires_python): def get_metadata(dist): + # type: (Distribution) -> Message if (isinstance(dist, pkg_resources.DistInfoDistribution) and dist.has_metadata('METADATA')): metadata = dist.get_metadata('METADATA') @@ -68,6 +77,7 @@ def check_dist_requires_python(dist): def get_installer(dist): + # type: (Distribution) -> str if dist.has_metadata('INSTALLER'): for line in dist.get_metadata_lines('INSTALLER'): if line.strip(): diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py b/env/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py index edc506b..2c81ad5 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py +++ b/env/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py @@ -1,5 +1,7 @@ from __future__ import absolute_import +import errno +import itertools import logging import os.path import tempfile @@ -58,7 +60,7 @@ class TempDirectory(object): self.cleanup() def create(self): - """Create a temporary directory and store it's path in self.path + """Create a temporary directory and store its path in self.path """ if self.path is not None: logger.debug( @@ -80,3 +82,74 @@ class TempDirectory(object): if self.path is not None and os.path.exists(self.path): rmtree(self.path) self.path = None + + +class AdjacentTempDirectory(TempDirectory): + """Helper class that creates a temporary directory adjacent to a real one. + + Attributes: + original + The original directory to create a temp directory for. + path + After calling create() or entering, contains the full + path to the temporary directory. + delete + Whether the directory should be deleted when exiting + (when used as a contextmanager) + + """ + # The characters that may be used to name the temp directory + # We always prepend a ~ and then rotate through these until + # a usable name is found. + # pkg_resources raises a different error for .dist-info folder + # with leading '-' and invalid metadata + LEADING_CHARS = "-~.=%0123456789" + + def __init__(self, original, delete=None): + super(AdjacentTempDirectory, self).__init__(delete=delete) + self.original = original.rstrip('/\\') + + @classmethod + def _generate_names(cls, name): + """Generates a series of temporary names. + + The algorithm replaces the leading characters in the name + with ones that are valid filesystem characters, but are not + valid package names (for both Python and pip definitions of + package). + """ + for i in range(1, len(name)): + for candidate in itertools.combinations_with_replacement( + cls.LEADING_CHARS, i - 1): + new_name = '~' + ''.join(candidate) + name[i:] + if new_name != name: + yield new_name + + # If we make it this far, we will have to make a longer name + for i in range(len(cls.LEADING_CHARS)): + for candidate in itertools.combinations_with_replacement( + cls.LEADING_CHARS, i): + new_name = '~' + ''.join(candidate) + name + if new_name != name: + yield new_name + + def create(self): + root, name = os.path.split(self.original) + for candidate in self._generate_names(name): + path = os.path.join(root, candidate) + try: + os.mkdir(path) + except OSError as ex: + # Continue if the name exists already + if ex.errno != errno.EEXIST: + raise + else: + self.path = os.path.realpath(path) + break + + if not self.path: + # Final fallback on the default behavior. + self.path = os.path.realpath( + tempfile.mkdtemp(prefix="pip-{}-".format(self.kind)) + ) + logger.debug("Created temporary directory: {}".format(self.path)) diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/typing.py b/env/lib/python3.7/site-packages/pip/_internal/utils/typing.py index e085cdf..10170ce 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/typing.py +++ b/env/lib/python3.7/site-packages/pip/_internal/utils/typing.py @@ -21,7 +21,7 @@ In pip, all static-typing related imports should be guarded as follows: from pip._internal.utils.typing import MYPY_CHECK_RUNNING if MYPY_CHECK_RUNNING: - from typing import ... # noqa: F401 + from typing import ... Ref: https://github.com/python/mypy/issues/3216 """ diff --git a/env/lib/python3.7/site-packages/pip/_internal/utils/ui.py b/env/lib/python3.7/site-packages/pip/_internal/utils/ui.py index 6bab904..0902ce7 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/utils/ui.py +++ b/env/lib/python3.7/site-packages/pip/_internal/utils/ui.py @@ -8,11 +8,8 @@ import time from signal import SIGINT, default_int_handler, signal from pip._vendor import six -from pip._vendor.progress.bar import ( - Bar, ChargingBar, FillingCirclesBar, FillingSquaresBar, IncrementalBar, - ShadyBar, -) -from pip._vendor.progress.helpers import HIDE_CURSOR, SHOW_CURSOR, WritelnMixin +from pip._vendor.progress import HIDE_CURSOR, SHOW_CURSOR +from pip._vendor.progress.bar import Bar, FillingCirclesBar, IncrementalBar from pip._vendor.progress.spinner import Spinner from pip._internal.utils.compat import WINDOWS @@ -21,7 +18,7 @@ from pip._internal.utils.misc import format_size from pip._internal.utils.typing import MYPY_CHECK_RUNNING if MYPY_CHECK_RUNNING: - from typing import Any # noqa: F401 + from typing import Any, Iterator, IO try: from pip._vendor import colorama @@ -168,7 +165,7 @@ class WindowsMixin(object): # The Windows terminal does not support the hide/show cursor ANSI codes # even with colorama. So we'll ensure that hide_cursor is False on # Windows. - # This call neds to go before the super() call, so that hide_cursor + # This call needs to go before the super() call, so that hide_cursor # is set in time. The base progress bar class writes the "hide cursor" # code to the terminal in its init, so if we don't set this soon # enough, we get a "hide" with no corresponding "show"... @@ -203,7 +200,7 @@ class BaseDownloadProgressBar(WindowsMixin, InterruptibleMixin, class DefaultDownloadProgressBar(BaseDownloadProgressBar, - _BaseBar): # type: ignore + _BaseBar): pass @@ -216,20 +213,6 @@ class DownloadIncrementalBar(BaseDownloadProgressBar, # type: ignore pass -class DownloadChargingBar(BaseDownloadProgressBar, # type: ignore - ChargingBar): - pass - - -class DownloadShadyBar(BaseDownloadProgressBar, ShadyBar): # type: ignore - pass - - -class DownloadFillingSquaresBar(BaseDownloadProgressBar, # type: ignore - FillingSquaresBar): - pass - - class DownloadFillingCirclesBar(BaseDownloadProgressBar, # type: ignore FillingCirclesBar): pass @@ -241,7 +224,7 @@ class DownloadBlueEmojiProgressBar(BaseDownloadProgressBar, # type: ignore class DownloadProgressSpinner(WindowsMixin, InterruptibleMixin, - DownloadProgressMixin, WritelnMixin, Spinner): + DownloadProgressMixin, Spinner): file = sys.stdout suffix = "%(downloaded)s %(download_speed)s" @@ -292,6 +275,7 @@ def DownloadProgressProvider(progress_bar, max=None): @contextlib.contextmanager def hidden_cursor(file): + # type: (IO) -> Iterator[None] # The Windows terminal does not support the hide/show cursor ANSI codes, # even via colorama. So don't even try. if WINDOWS: @@ -311,19 +295,32 @@ def hidden_cursor(file): class RateLimiter(object): def __init__(self, min_update_interval_seconds): + # type: (float) -> None self._min_update_interval_seconds = min_update_interval_seconds - self._last_update = 0 + self._last_update = 0 # type: float def ready(self): + # type: () -> bool now = time.time() delta = now - self._last_update return delta >= self._min_update_interval_seconds def reset(self): + # type: () -> None self._last_update = time.time() -class InteractiveSpinner(object): +class SpinnerInterface(object): + def spin(self): + # type: () -> None + raise NotImplementedError() + + def finish(self, final_status): + # type: (str) -> None + raise NotImplementedError() + + +class InteractiveSpinner(SpinnerInterface): def __init__(self, message, file=None, spin_chars="-\\|/", # Empirically, 8 updates/second looks nice min_update_interval_seconds=0.125): @@ -352,6 +349,7 @@ class InteractiveSpinner(object): self._rate_limiter.reset() def spin(self): + # type: () -> None if self._finished: return if not self._rate_limiter.ready(): @@ -359,6 +357,7 @@ class InteractiveSpinner(object): self._write(next(self._spin_cycle)) def finish(self, final_status): + # type: (str) -> None if self._finished: return self._write(final_status) @@ -371,8 +370,9 @@ class InteractiveSpinner(object): # We still print updates occasionally (once every 60 seconds by default) to # act as a keep-alive for systems like Travis-CI that take lack-of-output as # an indication that a task has frozen. -class NonInteractiveSpinner(object): +class NonInteractiveSpinner(SpinnerInterface): def __init__(self, message, min_update_interval_seconds=60): + # type: (str, float) -> None self._message = message self._finished = False self._rate_limiter = RateLimiter(min_update_interval_seconds) @@ -384,6 +384,7 @@ class NonInteractiveSpinner(object): logger.info("%s: %s", self._message, status) def spin(self): + # type: () -> None if self._finished: return if not self._rate_limiter.ready(): @@ -391,6 +392,7 @@ class NonInteractiveSpinner(object): self._update("still running...") def finish(self, final_status): + # type: (str) -> None if self._finished: return self._update("finished with status '%s'" % (final_status,)) @@ -399,13 +401,14 @@ class NonInteractiveSpinner(object): @contextlib.contextmanager def open_spinner(message): + # type: (str) -> Iterator[SpinnerInterface] # Interactive spinner goes directly to sys.stdout rather than being routed # through the logging system, but it acts like it has level INFO, # i.e. it's only displayed if we're at level INFO or better. # Non-interactive spinner goes through the logging system, so it is always # in sync with logging configuration. if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO: - spinner = InteractiveSpinner(message) + spinner = InteractiveSpinner(message) # type: SpinnerInterface else: spinner = NonInteractiveSpinner(message) try: diff --git a/env/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py b/env/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py index 794b35d..6fca079 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py +++ b/env/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py @@ -7,24 +7,49 @@ import os import shutil import sys +from pip._vendor import pkg_resources from pip._vendor.six.moves.urllib import parse as urllib_parse from pip._internal.exceptions import BadCommand from pip._internal.utils.misc import ( - display_path, backup_dir, call_subprocess, rmtree, ask_path_exists, + ask_path_exists, backup_dir, call_subprocess, display_path, rmtree, ) from pip._internal.utils.typing import MYPY_CHECK_RUNNING if MYPY_CHECK_RUNNING: - from typing import Dict, Optional, Tuple # noqa: F401 - from pip._internal.cli.base_command import Command # noqa: F401 + from typing import ( + Any, Dict, Iterable, List, Mapping, Optional, Text, Tuple, Type + ) + from pip._internal.utils.ui import SpinnerInterface -__all__ = ['vcs', 'get_src_requirement'] + AuthInfo = Tuple[Optional[str], Optional[str]] + +__all__ = ['vcs'] logger = logging.getLogger(__name__) +def make_vcs_requirement_url(repo_url, rev, project_name, subdir=None): + """ + Return the URL for a VCS requirement. + + Args: + repo_url: the remote VCS url, with any needed VCS prefix (e.g. "git+"). + project_name: the (unescaped) project name. + """ + egg_project_name = pkg_resources.to_filename(project_name) + req = '{}@{}#egg={}'.format(repo_url, rev, egg_project_name) + if subdir: + req += '&subdirectory={}'.format(subdir) + + return req + + +class RemoteNotFoundError(Exception): + pass + + class RevOptions(object): """ @@ -34,10 +59,16 @@ class RevOptions(object): Instances of this class should be treated as if immutable. """ - def __init__(self, vcs, rev=None, extra_args=None): + def __init__( + self, + vc_class, # type: Type[VersionControl] + rev=None, # type: Optional[str] + extra_args=None, # type: Optional[List[str]] + ): + # type: (...) -> None """ Args: - vcs: a VersionControl object. + vc_class: a VersionControl subclass. rev: the name of the revision to install. extra_args: a list of extra options. """ @@ -46,51 +77,56 @@ class RevOptions(object): self.extra_args = extra_args self.rev = rev - self.vcs = vcs + self.vc_class = vc_class def __repr__(self): - return ''.format(self.vcs.name, self.rev) + return ''.format(self.vc_class.name, self.rev) @property def arg_rev(self): + # type: () -> Optional[str] if self.rev is None: - return self.vcs.default_arg_rev + return self.vc_class.default_arg_rev return self.rev def to_args(self): + # type: () -> List[str] """ Return the VCS-specific command arguments. """ - args = [] + args = [] # type: List[str] rev = self.arg_rev if rev is not None: - args += self.vcs.get_base_rev_args(rev) + args += self.vc_class.get_base_rev_args(rev) args += self.extra_args return args def to_display(self): + # type: () -> str if not self.rev: return '' return ' (to revision {})'.format(self.rev) def make_new(self, rev): + # type: (str) -> RevOptions """ Make a copy of the current instance, but with a new rev. Args: rev: the name of the revision for the new object. """ - return self.vcs.make_rev_options(rev, extra_args=self.extra_args) + return self.vc_class.make_rev_options(rev, extra_args=self.extra_args) class VcsSupport(object): - _registry = {} # type: Dict[str, Command] + _registry = {} # type: Dict[str, Type[VersionControl]] schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn'] def __init__(self): + # type: () -> None # Register more schemes with urlparse for various version control # systems urllib_parse.uses_netloc.extend(self.schemes) @@ -104,20 +140,24 @@ class VcsSupport(object): @property def backends(self): + # type: () -> List[Type[VersionControl]] return list(self._registry.values()) @property def dirnames(self): + # type: () -> List[str] return [backend.dirname for backend in self.backends] @property def all_schemes(self): - schemes = [] + # type: () -> List[str] + schemes = [] # type: List[str] for backend in self.backends: schemes.extend(backend.schemes) return schemes def register(self, cls): + # type: (Type[VersionControl]) -> None if not hasattr(cls, 'name'): logger.warning('Cannot register VCS %s', cls.__name__) return @@ -126,6 +166,7 @@ class VcsSupport(object): logger.debug('Registered VCS backend: %s', cls.name) def unregister(self, cls=None, name=None): + # type: (Optional[Type[VersionControl]], Optional[str]) -> None if name in self._registry: del self._registry[name] elif cls in self._registry.values(): @@ -133,27 +174,24 @@ class VcsSupport(object): else: logger.warning('Cannot unregister because no class or name given') - def get_backend_name(self, location): + def get_backend_type(self, location): + # type: (str) -> Optional[Type[VersionControl]] """ - Return the name of the version control backend if found at given - location, e.g. vcs.get_backend_name('/path/to/vcs/checkout') + Return the type of the version control backend if found at given + location, e.g. vcs.get_backend_type('/path/to/vcs/checkout') """ for vc_type in self._registry.values(): if vc_type.controls_location(location): logger.debug('Determine that %s uses VCS: %s', location, vc_type.name) - return vc_type.name + return vc_type return None def get_backend(self, name): + # type: (str) -> Optional[Type[VersionControl]] name = name.lower() if name in self._registry: return self._registry[name] - - def get_backend_from_location(self, location): - vc_type = self.get_backend_name(location) - if vc_type: - return self.get_backend(vc_type) return None @@ -163,17 +201,68 @@ vcs = VcsSupport() class VersionControl(object): name = '' dirname = '' + repo_name = '' # List of supported schemes for this Version Control schemes = () # type: Tuple[str, ...] # Iterable of environment variable names to pass to call_subprocess(). unset_environ = () # type: Tuple[str, ...] default_arg_rev = None # type: Optional[str] + @classmethod + def should_add_vcs_url_prefix(cls, remote_url): + """ + Return whether the vcs prefix (e.g. "git+") should be added to a + repository's remote url when used in a requirement. + """ + return not remote_url.lower().startswith('{}:'.format(cls.name)) + + @classmethod + def get_subdirectory(cls, repo_dir): + """ + Return the path to setup.py, relative to the repo root. + """ + return None + + @classmethod + def get_requirement_revision(cls, repo_dir): + """ + Return the revision string that should be used in a requirement. + """ + return cls.get_revision(repo_dir) + + @classmethod + def get_src_requirement(cls, repo_dir, project_name): + """ + Return the requirement string to use to redownload the files + currently at the given repository directory. + + Args: + project_name: the (unescaped) project name. + + The return value has a form similar to the following: + + {repository_url}@{revision}#egg={project_name} + """ + repo_url = cls.get_remote_url(repo_dir) + if repo_url is None: + return None + + if cls.should_add_vcs_url_prefix(repo_url): + repo_url = '{}+{}'.format(cls.name, repo_url) + + revision = cls.get_requirement_revision(repo_dir) + subdir = cls.get_subdirectory(repo_dir) + req = make_vcs_requirement_url(repo_url, revision, project_name, + subdir=subdir) + + return req + def __init__(self, url=None, *args, **kwargs): self.url = url super(VersionControl, self).__init__(*args, **kwargs) - def get_base_rev_args(self, rev): + @staticmethod + def get_base_rev_args(rev): """ Return the base revision arguments for a vcs command. @@ -182,7 +271,9 @@ class VersionControl(object): """ raise NotImplementedError - def make_rev_options(self, rev=None, extra_args=None): + @classmethod + def make_rev_options(cls, rev=None, extra_args=None): + # type: (Optional[str], Optional[List[str]]) -> RevOptions """ Return a RevOptions object. @@ -190,15 +281,17 @@ class VersionControl(object): rev: the name of a revision to install. extra_args: a list of extra options. """ - return RevOptions(self, rev, extra_args=extra_args) + return RevOptions(cls, rev, extra_args=extra_args) - def _is_local_repository(self, repo): + @classmethod + def _is_local_repository(cls, repo): + # type: (str) -> bool """ posix absolute paths start with os.path.sep, win32 ones start with drive (like c:\\folder) """ drive, tail = os.path.splitdrive(repo) - return repo.startswith(os.path.sep) or drive + return repo.startswith(os.path.sep) or bool(drive) def export(self, location): """ @@ -207,7 +300,8 @@ class VersionControl(object): """ raise NotImplementedError - def get_netloc_and_auth(self, netloc, scheme): + @classmethod + def get_netloc_and_auth(cls, netloc, scheme): """ Parse the repository URL's netloc, and return the new netloc to use along with auth information. @@ -225,7 +319,9 @@ class VersionControl(object): """ return netloc, (None, None) - def get_url_rev_and_auth(self, url): + @classmethod + def get_url_rev_and_auth(cls, url): + # type: (str) -> Tuple[str, Optional[str], AuthInfo] """ Parse the repository URL to use, and return the URL, revision, and auth info to use. @@ -241,20 +337,22 @@ class VersionControl(object): ) # Remove the vcs prefix. scheme = scheme.split('+', 1)[1] - netloc, user_pass = self.get_netloc_and_auth(netloc, scheme) + netloc, user_pass = cls.get_netloc_and_auth(netloc, scheme) rev = None if '@' in path: path, rev = path.rsplit('@', 1) url = urllib_parse.urlunsplit((scheme, netloc, path, query, '')) return url, rev, user_pass - def make_rev_args(self, username, password): + @staticmethod + def make_rev_args(username, password): """ Return the RevOptions "extra arguments" to use in obtain(). """ return [] def get_url_rev_options(self, url): + # type: (str) -> Tuple[str, RevOptions] """ Return the URL and RevOptions object to use in obtain() and in some cases export(), as a tuple (url, rev_options). @@ -266,20 +364,25 @@ class VersionControl(object): return url, rev_options - def normalize_url(self, url): + @staticmethod + def normalize_url(url): + # type: (str) -> str """ Normalize a URL for comparison by unquoting it and removing any trailing slash. """ return urllib_parse.unquote(url).rstrip('/') - def compare_urls(self, url1, url2): + @classmethod + def compare_urls(cls, url1, url2): + # type: (str, str) -> bool """ Compare two repo URLs for identity, ignoring incidental differences. """ - return (self.normalize_url(url1) == self.normalize_url(url2)) + return (cls.normalize_url(url1) == cls.normalize_url(url2)) - def fetch_new(self, dest, url, rev_options): + @classmethod + def fetch_new(cls, dest, url, rev_options): """ Fetch a revision from a repository, in the case that this is the first fetch from the repository. @@ -308,7 +411,8 @@ class VersionControl(object): """ raise NotImplementedError - def is_commit_id_equal(self, dest, name): + @classmethod + def is_commit_id_equal(cls, dest, name): """ Return whether the id of the current commit equals the given name. @@ -319,6 +423,7 @@ class VersionControl(object): raise NotImplementedError def obtain(self, dest): + # type: (str) -> None """ Install or update in editable mode the package represented by this VersionControl object. @@ -334,7 +439,7 @@ class VersionControl(object): rev_display = rev_options.to_display() if self.is_repository_directory(dest): - existing_url = self.get_url(dest) + existing_url = self.get_remote_url(dest) if self.compare_urls(existing_url, url): logger.debug( '%s in %s exists, and has correct URL (%s)', @@ -370,7 +475,9 @@ class VersionControl(object): self.name, self.repo_name, ) - prompt = ('(i)gnore, (w)ipe, (b)ackup ', ('i', 'w', 'b')) + # https://github.com/python/mypy/issues/1174 + prompt = ('(i)gnore, (w)ipe, (b)ackup ', # type: ignore + ('i', 'w', 'b')) logger.warning( 'The plan is to install the %s repository %s', @@ -409,6 +516,7 @@ class VersionControl(object): self.switch(dest, url, rev_options) def unpack(self, location): + # type: (str) -> None """ Clean up current location and download the url repository (and vcs infos) into location @@ -417,42 +525,49 @@ class VersionControl(object): rmtree(location) self.obtain(location) - def get_src_requirement(self, dist, location): - """ - Return a string representing the requirement needed to - redownload the files currently present in location, something - like: - {repository_url}@{revision}#egg={project_name}-{version_identifier} - """ - raise NotImplementedError - - def get_url(self, location): + @classmethod + def get_remote_url(cls, location): """ Return the url used at location + + Raises RemoteNotFoundError if the repository does not have a remote + url configured. """ raise NotImplementedError - def get_revision(self, location): + @classmethod + def get_revision(cls, location): """ Return the current commit id of the files at the given location. """ raise NotImplementedError - def run_command(self, cmd, show_stdout=True, cwd=None, - on_returncode='raise', - command_desc=None, - extra_environ=None, spinner=None): + @classmethod + def run_command( + cls, + cmd, # type: List[str] + show_stdout=True, # type: bool + cwd=None, # type: Optional[str] + on_returncode='raise', # type: str + extra_ok_returncodes=None, # type: Optional[Iterable[int]] + command_desc=None, # type: Optional[str] + extra_environ=None, # type: Optional[Mapping[str, Any]] + spinner=None # type: Optional[SpinnerInterface] + ): + # type: (...) -> Optional[Text] """ Run a VCS subcommand This is simply a wrapper around call_subprocess that adds the VCS command name, and checks that the VCS is available """ - cmd = [self.name] + cmd + cmd = [cls.name] + cmd try: return call_subprocess(cmd, show_stdout, cwd, - on_returncode, - command_desc, extra_environ, - unset_environ=self.unset_environ, + on_returncode=on_returncode, + extra_ok_returncodes=extra_ok_returncodes, + command_desc=command_desc, + extra_environ=extra_environ, + unset_environ=cls.unset_environ, spinner=spinner) except OSError as e: # errno.ENOENT = no such file or directory @@ -461,12 +576,13 @@ class VersionControl(object): raise BadCommand( 'Cannot find command %r - do you have ' '%r installed and in your ' - 'PATH?' % (self.name, self.name)) + 'PATH?' % (cls.name, cls.name)) else: raise # re-raise exception if a different error occurred @classmethod def is_repository_directory(cls, path): + # type: (str) -> bool """ Return whether a directory path is a repository directory. """ @@ -476,6 +592,7 @@ class VersionControl(object): @classmethod def controls_location(cls, location): + # type: (str) -> bool """ Check if a location is controlled by the vcs. It is meant to be overridden to implement smarter detection @@ -485,25 +602,3 @@ class VersionControl(object): the Git override checks that Git is actually available. """ return cls.is_repository_directory(location) - - -def get_src_requirement(dist, location): - version_control = vcs.get_backend_from_location(location) - if version_control: - try: - return version_control().get_src_requirement(dist, - location) - except BadCommand: - logger.warning( - 'cannot determine version of editable source in %s ' - '(%s command not found in path)', - location, - version_control.name, - ) - return dist.as_requirement() - logger.warning( - 'cannot determine version of editable source in %s (is not SVN ' - 'checkout, Git clone, Mercurial clone or Bazaar branch)', - location, - ) - return dist.as_requirement() diff --git a/env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc index 411f9aba3263e8f79eec0324dce2c056ce37e2d9..69b5b4fc9dda7959f344db0d64ca789a082c11bf 100644 GIT binary patch delta 7346 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 diff --git a/env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc index c8bd1ffd9c6532408cc00a632388c28eb89fd2ae..80c537a20ef1a06f706947c5e3b372ce5bae7b30 100644 GIT binary patch delta 1573 zcmZ8hPj4GV6yKR$uXoqujpL-XleCm34UJKgssVw7N)?i{piuDu<*w{=UJB+}Ss{Bg#+A zW>xsZ2~j;H;6pz$8t%bQ%QdPQ@1(sbd=&J;Y+Kv1n@J(mHL^&at0uXyH~rMuBHZT1 zeYaT@4tKb_Z#*GQmwUXlZ!|qo;*6Jb8RI@516i3@_&B_MQOdomd}7}LpE0nVNj)Fw}8Ww2U}Ofsx1$Up*1i*EgX_h=wtfW1m1=eWI)^Iz#JA2jT+RLo6jiJ z+JdwN^|2M~-GP*)bUWDz(u^nlY@^|5nxxtqm0mpTq**F$$fYORA`AL53IJh{^s-J8 zr*aZCCE1UIR?_W;G1tW`2}0RU8@lVPR9EUd{q(*xGDG0F{e0%Y(~#5Ca;>a5O>MX?1xH=X6cc%H0xK zYdeU=&JFlXD?p&QTlVJL5Os$)$SB9?67qG>o}@SvOD=)-UG=Xm)~*BBprRdJFEWFb|7RxNBfoQj%3JHsmrU0>q;ylh2a?3#0 z;pFpWnCeUCg}(sbcL35wG`Ox-+&8DNc-n&v>tsSuRq z;|xL{2SAE$k_nuHdzcA<8MI1#;t-E|@b-XXWcS=^xEqFY>BL7(dUx-SV1Um*|G@*e z5R7~aNW+w))WB;8de}*EXwG0@qj)1_6HHT_P3YW@-mIEo@6Dq9aVYGXw&JiWPKQxn zuv#eu)o7zkHDs5_r22);lQs1>yS#_Xt67@C)V8`J+fKNg0Z~4ky3~rG_DAAH6l3=# z4pClzc?-E!B-jdF4uagHC88(@PH-G|FK?U+mY6lg1z2-n-3g_PMirDhtbl5 zRw|2NBk@m2yHL-2;3=fMjl!!)FbB4v4a*OTlNRJ0BG%5$Zo>PKxP|{~X%z^g4y-Gq Mj8sU4dS>PR{|zTzvj6}9 delta 1943 zcmZt{U5`^mbmo5d_O{#o?0x|Y2yDeAN)QzYK|aKgbydJfih6VH4Bfli_LjM~EYy-s zWD{bPn9ckEx`_|?z)vudSKoZ_W&Q!a@u)9)&U9ggcsFy->6!C2=WBnNezL20wovd1 zeAR~szxb@US)8OlY#zF>*bJ%xC5$kqQD_#cMNPYnp=POCY7SS2Dd9$cgpY2~>exlX zJeJ!aEXPat%<4EF?oaUXEeblu6;kmxA00hws({65yAj<9+flZxCY#YJ4{z1dQ1F|b zSnwuqWno7&lp~s%;JiXr;VN&o&%<3UOT?YcXAAUOxrffK&)z3DD07&*k*m4`*Hw@C zEWbgjITo-2V4oG)5a2v3v0=c0))`@=8(y`*#@IOUifn?F0S~cBHU+rErr8YO;rqlQ z)e#7NmvYWV-6#^u{JJZ;))9b8{ziQo$Uo>~nwR&C1GFfAHa_%fYxUMjcJrA0%h+oV zLq=!h9&_%3fysprF`jd9QV#&5JzB^77)xDaL5OMKRSYo>NST7)(u@I^k?ZC}ejjRT zb5!=t{Y4Xg=iq3IpUB_M^6AWClo=1`kMnnp9_iaXV})WJdSt~J_(Kjenf1V=af^LWF_c+bV=A96Cu?Dvv80nNRa|8xsj_qp9ez7bvsAbc zguo{$r_*XjwN;fDomN;&n$4)iD(2u#UL&bRS)8<#mqA@a77yOM{Y12}n~*X&090B8 zK^A_W2CMJLb-ubOCX``=HKC>rZ z!_@A$QMnsDt1X8uzV(h#?of$Hl|&8_Fp5qQIPVbH}DIFy+G>##tk7@l@H6w74yf%d5Hh zQ2RTCA{I;{lo@3dy{#<4+sUg@yLGN7b_o>HF#v>)&?5DyZ}@#`OC11EzwiBh>quH~^hjI= z0)~L}j4gWC?3w8ZBUebz?9(mMHy8{?I?s%rStf8x`lgn%dbDrBy^TY%WiWe++_f{O zXZEa~eb2-(S?XG_22N;r_;0!(-UUa30$8uO;(fr%ZX|15h~s#10T~{z*TYuStq0z2Dn?NbZ> zbXDjW?N0AhLx3Huv!^pA7V#&xmMVl{tpQD6 z{}04Bsq$^)I#Kx3K^K diff --git a/env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/git.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/git.cpython-37.pyc index fb770c6637f61ecf92d6bc12e93d06721d0da3b4..913fdc9a285ca9adc51b0fc0f1b795971ade3879 100644 GIT binary patch delta 3635 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 diff --git a/env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc index d7a86f69509de1444b76330d740a35e7eacadff8..f396d44271ebf253e463116aa25fac451ab75ac7 100644 GIT binary patch delta 1546 zcmb7E&2QX96!+NPUE4eMeq_mRnzk`11y*8{Ac0gNLPJZbgi3`#>W53UGM>rW$m`wA zc#~#{ltXi)0;1s$C_+LiIU)XpN{BN@A1jc!azmVW;|-gSo|x7A=I#4_^WOM}b5GCO zS8Ur-U?tzT?$7Vrb7*h>m3QAk3QUYSiT~~-f z%sqve)PAUWb?Q8xq4oVAuU1foNyLY-zug`BX((pVo4XpsS%b}Y0I1?2qIfDno<>wp zCz@9vx>uwnQXs`WlDfd;_ya=$P^bqKxn@<2TjnPep zft|xYZ!f3);qovVcA|u*ejInm#&+`H_4QDEuC5_f9H@VyqWD&GmouHycs(=XLExv+ zAjyoB_J>^(u_J%Xk)EpnXT&q@2`Y<6`gzn42l~ZE6S!F^9dv!xnkr! zv&pS9bDgF^*iGox1+d_C07d=zQehP}=YbrnosBkP4ItaqOdW7GD;^c^&7T8CR@(Ae z5+yyh0RNbb*fv>9sHMxzQ&Eb1D}pd9;!f$CIq8f^=WR7N%FWvautY|yandr^TN54Q zD|<$o<%#I5DSkCx{nVA5ISGprPFiM8kEUHl`-7BrM=ZVuDqN~4s*Z}tK^8L5xb-1r z!H7kEymV4sRIE#P$G0u_aD7bE5lh@Oq%Nbw0guuF+wREj#BLD!Nsn@xf@m}1&@DF^ z^*^KRHP`2^pSV$y(jH|?Q*UC+T)1~s(BVC-LUL`5xp3rVWmQOx(L|Op@q4;PJV|;Y zya{&P08k3zFZ0&!IGn~imivZId#(qjyzeon+zE#@&e>HYx4yS8uO={d2MbOOSmvIMzPUeRi(3zh2eR@2y_!>9MfsCL6D4O^QyQnUH!xzyt@i#uZ zn_+mtX%zHn8V(4nfKvVxvvLsooFB4Zmh87A$bn~6^Y~eDKitUE@(q2HGIIwSvlCyA2euuIed}fxqa`IRL)4dsR uRsueg1Cp6=r#A*Ym`QeBGUap5ePsrty@-R+b9sp!$F(rRsH$38_3poBuxWk( delta 1651 zcmaJ>OK%)S5T2fyoyYFXKKx!MPK<>EE3`HTatU#4oB)!+283{=3DRb@-PxTm`*6)T zmY21RlpHt#Rv+NT?j=%=2yx@ajSJ$0G`|2Ya78&$)lTBaff-FzO?Q1=)%E)2;^R4g z-S@K^KEd}_KK=U0FS9R?UU_T1oei=~;~KZ3T-ysgCEJnT&IkE+At*3S=)-sK=PWR|9+=z+GTaO-p5fLbEwH)G9pq@2XOX)+$35g( z?(;nI953)9a*vnz7;>MF^9kg6KFOz$7x*-vL0;tLkG0Bd>TU}8Gn-{O`3GCxCQs-g z&hWd5Uu+>6uqH!&w)I5AyP2_w?xhBZ2jJtTB2TX`C+*&HFYHyrPMp-EsM^?TcJ3!T zZ^&(ZjWPMH{wK5L7smV&H4LOpraz0S7eukPhLCuW{`w}Qxup#rFkrA5R6l_usk zj4?OoEqi47`R02Fj~!)R-pX#jxdm(Z(=S!4l+dW2h?UPfT`msZ!EpS)ad{&*b$B*D zY3a1BTB{znJ~}aYeBb_sGk1OAnbK|;{d8Vu#WD;v&49r31p@BVNZS{>-^BR%Yp0es+ z)Hgt+V#6x3G!u3A1f*GP3P`9}T5yZj9noyoI`y_lGdL;21P;m1XZ4(#I6so(q?jOj zT_ESvB4K*ay)PPx!k*91IK?c6#_2h88<8;;l!o<@#|p`^39Od>+}YU0`Li(jLvCY% zQu4e)UP3uF$>Y;j<(xO2yNg?~njX4b_2yYg-t`s_KfqO}63V439ADOs8!a4vF_dVR zni8%MxkiLqM@0?RNuoHx7LgB$oYaSs)QF%FPC`sj2irisx??!*q~ke7C*wGdg|7>w zTA7qp|1wMErhi)pOOE`7Z5!9q5>BqATG&Yhbg*%7R0CBuxU}hFRNwD5n*xAJ5NJfG c<5CAi6BC6S=be+~{Cu{^JXX}RM)8yX08P+xBLDyZ diff --git a/env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc index dc9de523adaeb89c7d24593269131c2fdb8b9563..816b0fd5f2ac204a1889fd15fd2426a3b717ab70 100644 GIT binary patch delta 3293 zcmbVOO>7)V74GWpnd#~28ISGp_}^|PG08wYBoMS46Ozq_BrF?DHqHWRE!*x)mB*d* zbWf^#{3k~vWUp2rArZBZR)~YMNC>1AmmqQFz=6{WZm1*#2PA%OyC;MY@LtW>PAs_4 zqki-1)%&S>_1;(goAd8oD7{)NnhHGOkH)_F=h-KvG4iV?r@zo`<(+)XbWEa9g=T_6 z%W^EqXM^1~?t;k4Nd491lT| zaXKM&hrw==PD#E3{4|}B{0Q)~)RuhpT}4-%QOMSuFqb>`*BOst$3lzKt~x@B>G#!_ z(xK|`%+lSTDv%Ma5yXzkSu0AI+u;EpfX(xP^j~V#ppUk~&GV~k>6A9#9go+dPC#9c zQg^)(qpsWLY}Mbi!6H_HDC+j9qmcFgY0x033=jUJ;Wc<;0|+HMN)wM-UD{R`xLiz) z2#vG)dVgi0#Rq|i!6r-G`(Dgk&emOzH{(<2rnivvZEd!D5GDh1^e)3}0z=7T2=oA| zs!6Cu_3x^W)g5)8?2xAF9;a5k5Xzk0v~4UrfK(|MJ`<}+E?ua3)*f(VdD9rA2#hS`fqzY zi4VLV1oOkyh_^g!1v}!0&d}$|%2E`vl@;6XE$G0c7YA0e%A*!&#p@v`HLxV?FiPzE zGE~fH{m@-^k$Zm3;zj#ak6w#fEia^t_G_z$)_yEa4|jTGx?KeSXAhIJonKh!FXRT4 zLjfvl!-cFyon(pQDGO4s8KS^Dq1)&M5@y^@aPJ#_vL>{Eg(3q;;U^*^6D72k*A|)| zCc^xh7j)Ql&LdvS2t8)Os#EHR>zBC5^~a8NFcJ81B1({6*t6RgzF4AfC}IF>6uYIb za0b>IPXJMhIw=#A=;|0yl?;&*$*MYxwJ@=ObXgR4a(|9sLZ^(x2(o zd8}}eOCs3@d=y5t44*}z5kw7n(0o4qNT00q+8btM6Y-P4-AL`s`)&z1=($I=tT4e* zA6NM&Q1vttgh&1%1g&>4Tu9w)Hv`DcN+>0h$`|7CpvtQ+Zfa`v;2jC15Ro`=vkyx^h8QJ;ri zi-|0PA)HrD&OM0ykbe@{vWuqybt$0_w#mm(40W_w%gbc&v+0I;<@Adw78aU;x{o;A z1e5p#5GDKU_vRcSR{HP4xRC`xP2=U%w&td!z1-_f5bwepMI(L#axvrYtTarxXFzV(zG2?Jg#&M1CFQbd2K(E8_d+EjC+Mjn7nJzvD(%Sf;sMQ+36h;aP#Fgn=i+4Plx6L*e9DfM!HaJjt? z`f&w_lF`W+(TPP2O(&|FRSk7}{8;1lF2!d*9{7Ne&!x+QYoF%hV9KX~z|E=F&j~_b zYoOpoR^XctM^(0p9@txp_{{r6lG7u=1Z&&W8 zrRvq`UZM5eBZvqcd%16&2Gyyve?lu+)7tj*b0_V`^2+cN*QYLf)bWDaSo-tod^Q0C z{&M<<>S$LK8Ugf8izRCje-U_s!zN4u7-`U+@CJirdY+e3co7*N0Rr&_wD8#6}HvJBnOt*LUc zY*?l>Vl7CNs76i||fuDk`|p*Yr2 zh)vzYGlR1xR2)pefnGm;`og%>ifAWbm+{V*Flwm=fuCxTie{0rYQk*_KWJ*;wQ^T^ F<39wy9sK|R delta 2999 zcmbVO&2JmW72nxilEdYvB#IxVB+GFenT{#hg$pNz?KrNR1cfU!5s(&a;w{Y?Q7bJ! z{B|kY0#%`~+nid|*o)B~D)p8&CMr)p zo3A%-=l$Mq=JBPc7qd4q8OOk<@$1(<`p@j6Y?=M>(ZbaoW(Y&X{A9;zIGt1@)k!zf zolGO6+v9$=lWXKU`9_`@(%zjAi9Obs)EY-^N^42f3R-heo0jHoQI=3EziWt;NIx`0 zTIL>Djf%|go{*J2hPKTWqn3GQ7?1u{xoY3?x*Ij79Iq>6H+218yJoAj@PfYIyzlm# z;hHLUnj6yHYy~dJy8{nohei&-j~3Xe=r+4kYSGUfJl4JvJdXa(syiYk;t!2RLL>yo zl8dBpuuP8KYd9h!vRF@voXBID787C;%giUnDic$p@Q^pMTAvn0)N`UF%GjS56>$Q~ z2~ia@SWb#rF^A=pI4S0_EPP_vMq_#<`pjHl>F96fL2DT-I&Yth%87qZs8q1l8@fR#dV_GemTE+0ewNwM+q_s$;7FASdwQ}; z!JzB5dYw+QD{3*wQ789%t!C);x-cD$c(w4tIheq1m_jih{f_^JWuoO|akWT|B@!_b zRT48OYVol-TgV`UX=sam0Xo!Yt8M-VI6yeJPQ1`FOvN?4{eWK zg;O;Bh3T)d2Cw3fH=@At{;%0*aQ2mGIyJv@fU`KZ(5FMYipsqoj?A0J$KT(!LStk- zVC!t#9@)W(yKxMY+EA+g%LuCc;qtGO?VaS=E&TyTgWcf@|IJt)3UUqq|@rd9tgekzKe<< zj8OcbUpX>5nRnvj-HVp;rPMaLmqvlv_kRALmndfA;80w~5&Al5!~iNWY(m%Tw&60? z4)$U;8cw`&b8M4F>WCyLo*2uYV#^pmw#~|jpETnZqR5P!+}xTxj-MxAPJG7L*P_Q$ zYfH-VWmj2VH$)aS7cVF_{=LKPeePWG5#UH{{cFFCmI@!4P>X(6_{OaoIcGux3l(ca zZ_vlu52(gEN6@ar|1mcI0YA;I@iE73#p?BY9seB+Xn_n~JYo=TdTn9%iMoK{ka(ma^$*2m`b2w6)Q8yt$nX9#4g zL@+jXneMem$dY>ovY#m|WIwxt>=@c3Yh;gN4+z|`Oedw*rRydyb5?ZG;`#|gHZR9U#B%pD` zd>oO>nPVd7&8-Y(j*(t)d|otP`nJvnA{(5o&o5 z1q!}HLhmI77KSA5qfi;wZTUzfE$RENdx!$ef*YFGbiNQFmhcN`71|a3n%v?Up5ivX zSzb+N(g~jA1%948nnG*U=xMonj*>x{AR86D`z*Sc+r(l1Vy7phA1u=8G(P95(e+9p zixkqseDm8of`;{~np6@-Egbk6}!-4n+x;>{A0)Jb<_l^~ArdjSuh9t|(6uLRazqI?)5vmVD{s(.*)') +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple + logger = logging.getLogger(__name__) @@ -26,9 +29,44 @@ class Subversion(VersionControl): repo_name = 'checkout' schemes = ('svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn') - def get_base_rev_args(self, rev): + @classmethod + def should_add_vcs_url_prefix(cls, remote_url): + return True + + @staticmethod + def get_base_rev_args(rev): return ['-r', rev] + def get_vcs_version(self): + # type: () -> Optional[Tuple[int, ...]] + """Return the version of the currently installed Subversion client. + + :return: A tuple containing the parts of the version information or + ``None`` if the version returned from ``svn`` could not be parsed. + :raises: BadCommand: If ``svn`` is not installed. + """ + # Example versions: + # svn, version 1.10.3 (r1842928) + # compiled Feb 25 2019, 14:20:39 on x86_64-apple-darwin17.0.0 + # svn, version 1.7.14 (r1542130) + # compiled Mar 28 2018, 08:49:13 on x86_64-pc-linux-gnu + version_prefix = 'svn, version ' + version = self.run_command(['--version'], show_stdout=False) + if not version.startswith(version_prefix): + return None + + version = version[len(version_prefix):].split()[0] + version_list = version.split('.') + try: + parsed_version = tuple(map(int, version_list)) + except ValueError: + return None + + if not parsed_version: + return None + + return parsed_version + def export(self, location): """Export the svn repository at the url to the destination location""" url, rev_options = self.get_url_rev_options(self.url) @@ -42,7 +80,8 @@ class Subversion(VersionControl): cmd_args = ['export'] + rev_options.to_args() + [url, location] self.run_command(cmd_args, show_stdout=False) - def fetch_new(self, dest, url, rev_options): + @classmethod + def fetch_new(cls, dest, url, rev_options): rev_display = rev_options.to_display() logger.info( 'Checking out %s%s to %s', @@ -51,7 +90,7 @@ class Subversion(VersionControl): display_path(dest), ) cmd_args = ['checkout', '-q'] + rev_options.to_args() + [url, dest] - self.run_command(cmd_args) + cls.run_command(cmd_args) def switch(self, dest, url, rev_options): cmd_args = ['switch'] + rev_options.to_args() + [url, dest] @@ -61,21 +100,8 @@ class Subversion(VersionControl): cmd_args = ['update'] + rev_options.to_args() + [dest] self.run_command(cmd_args) - def get_location(self, dist, dependency_links): - for url in dependency_links: - egg_fragment = Link(url).egg_fragment - if not egg_fragment: - continue - if '-' in egg_fragment: - # FIXME: will this work when a package has - in the name? - key = '-'.join(egg_fragment.split('-')[:-1]).lower() - else: - key = egg_fragment - if key == dist.key: - return url.split('#', 1)[0] - return None - - def get_revision(self, location): + @classmethod + def get_revision(cls, location): """ Return the maximum revision for all files under a given location """ @@ -83,16 +109,16 @@ class Subversion(VersionControl): revision = 0 for base, dirs, files in os.walk(location): - if self.dirname not in dirs: + if cls.dirname not in dirs: dirs[:] = [] continue # no sense walking uncontrolled subdirs - dirs.remove(self.dirname) - entries_fn = os.path.join(base, self.dirname, 'entries') + dirs.remove(cls.dirname) + entries_fn = os.path.join(base, cls.dirname, 'entries') if not os.path.exists(entries_fn): # FIXME: should we warn? continue - dirurl, localrev = self._get_svn_url_rev(base) + dirurl, localrev = cls._get_svn_url_rev(base) if base == location: base = dirurl + '/' # save the root url @@ -102,7 +128,8 @@ class Subversion(VersionControl): revision = max(revision, localrev) return revision - def get_netloc_and_auth(self, netloc, scheme): + @classmethod + def get_netloc_and_auth(cls, netloc, scheme): """ This override allows the auth information to be passed to svn via the --username and --password options instead of via the URL. @@ -110,19 +137,20 @@ class Subversion(VersionControl): if scheme == 'ssh': # The --username and --password options can't be used for # svn+ssh URLs, so keep the auth information in the URL. - return super(Subversion, self).get_netloc_and_auth( - netloc, scheme) + return super(Subversion, cls).get_netloc_and_auth(netloc, scheme) return split_auth_from_netloc(netloc) - def get_url_rev_and_auth(self, url): + @classmethod + def get_url_rev_and_auth(cls, url): # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it - url, rev, user_pass = super(Subversion, self).get_url_rev_and_auth(url) + url, rev, user_pass = super(Subversion, cls).get_url_rev_and_auth(url) if url.startswith('ssh://'): url = 'svn+' + url return url, rev, user_pass - def make_rev_args(self, username, password): + @staticmethod + def make_rev_args(username, password): extra_args = [] if username: extra_args += ['--username', username] @@ -131,7 +159,8 @@ class Subversion(VersionControl): return extra_args - def get_url(self, location): + @classmethod + def get_remote_url(cls, location): # In cases where the source is in a subdirectory, not alongside # setup.py we have to look up in the location until we find a real # setup.py @@ -149,12 +178,13 @@ class Subversion(VersionControl): ) return None - return self._get_svn_url_rev(location)[0] + return cls._get_svn_url_rev(location)[0] - def _get_svn_url_rev(self, location): + @classmethod + def _get_svn_url_rev(cls, location): from pip._internal.exceptions import InstallationError - entries_path = os.path.join(location, self.dirname, 'entries') + entries_path = os.path.join(location, cls.dirname, 'entries') if os.path.exists(entries_path): with open(entries_path) as f: data = f.read() @@ -177,7 +207,7 @@ class Subversion(VersionControl): else: try: # subversion >= 1.7 - xml = self.run_command( + xml = cls.run_command( ['info', '--xml', location], show_stdout=False, ) @@ -195,17 +225,8 @@ class Subversion(VersionControl): return url, rev - def get_src_requirement(self, dist, location): - repo = self.get_url(location) - if repo is None: - return None - repo = 'svn+' + repo - rev = self.get_revision(location) - # FIXME: why not project name? - egg_project_name = dist.egg_name().split('-', 1)[0] - return make_vcs_requirement_url(repo, rev, egg_project_name) - - def is_commit_id_equal(self, dest, name): + @classmethod + def is_commit_id_equal(cls, dest, name): """Always assume the versions don't match""" return False diff --git a/env/lib/python3.7/site-packages/pip/_internal/wheel.py b/env/lib/python3.7/site-packages/pip/_internal/wheel.py index 5ce890e..1bdbe93 100644 --- a/env/lib/python3.7/site-packages/pip/_internal/wheel.py +++ b/env/lib/python3.7/site-packages/pip/_internal/wheel.py @@ -30,9 +30,11 @@ from pip._internal.exceptions import ( from pip._internal.locations import ( PIP_DELETE_MARKER_FILENAME, distutils_scheme, ) +from pip._internal.models.link import Link from pip._internal.utils.logging import indent_log from pip._internal.utils.misc import ( - call_subprocess, captured_stdout, ensure_dir, read_chunks, + LOG_DIVIDER, call_subprocess, captured_stdout, ensure_dir, + format_command_args, read_chunks, ) from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM from pip._internal.utils.temp_dir import TempDirectory @@ -40,9 +42,21 @@ from pip._internal.utils.typing import MYPY_CHECK_RUNNING from pip._internal.utils.ui import open_spinner if MYPY_CHECK_RUNNING: - from typing import Dict, List, Optional # noqa: F401 + from typing import ( + Dict, List, Optional, Sequence, Mapping, Tuple, IO, Text, Any, Iterable + ) + from pip._vendor.packaging.requirements import Requirement + from pip._internal.req.req_install import InstallRequirement + from pip._internal.download import PipSession + from pip._internal.index import FormatControl, PackageFinder + from pip._internal.operations.prepare import ( + RequirementPreparer + ) + from pip._internal.cache import WheelCache + from pip._internal.pep425tags import Pep425Tag + + InstalledCSVRow = Tuple[str, ...] -wheel_ext = '.whl' VERSION_COMPATIBLE = (1, 0) @@ -50,7 +64,12 @@ VERSION_COMPATIBLE = (1, 0) logger = logging.getLogger(__name__) +def normpath(src, p): + return os.path.relpath(src, p).replace(os.path.sep, '/') + + def rehash(path, blocksize=1 << 20): + # type: (str, int) -> Tuple[str, str] """Return (hash, length) for path using hashlib.sha256()""" h = hashlib.sha256() length = 0 @@ -61,20 +80,32 @@ def rehash(path, blocksize=1 << 20): digest = 'sha256=' + urlsafe_b64encode( h.digest() ).decode('latin1').rstrip('=') - return (digest, length) + # unicode/str python2 issues + return (digest, str(length)) # type: ignore def open_for_csv(name, mode): + # type: (str, Text) -> IO if sys.version_info[0] < 3: - nl = {} + nl = {} # type: Dict[str, Any] bin = 'b' else: - nl = {'newline': ''} + nl = {'newline': ''} # type: Dict[str, Any] bin = '' return open(name, mode + bin, **nl) +def replace_python_tag(wheelname, new_tag): + # type: (str, str) -> str + """Replace the Python tag in a wheel file name with a new value. + """ + parts = wheelname.split('-') + parts[-3] = new_tag + return '-'.join(parts) + + def fix_script(path): + # type: (str) -> Optional[bool] """Replace #!python with #!/path/to/python Return True if file was changed.""" # XXX RECORD hashes will need to be updated @@ -90,6 +121,7 @@ def fix_script(path): script.write(firstline) script.write(rest) return True + return None dist_info_re = re.compile(r"""^(?P(?P.+?)(-(?P.+?))?) @@ -97,6 +129,7 @@ dist_info_re = re.compile(r"""^(?P(?P.+?)(-(?P.+?))?) def root_is_purelib(name, wheeldir): + # type: (str, str) -> bool """ Return True if the extracted wheel in wheeldir should go into purelib. """ @@ -113,6 +146,7 @@ def root_is_purelib(name, wheeldir): def get_entrypoints(filename): + # type: (str) -> Tuple[Dict[str, str], Dict[str, str]] if not os.path.exists(filename): return {}, {} @@ -144,7 +178,7 @@ def get_entrypoints(filename): def message_about_scripts_not_on_PATH(scripts): - # type: (List[str]) -> Optional[str] + # type: (Sequence[str]) -> Optional[str] """Determine if any scripts are not on PATH and format a warning. Returns a warning message if one or more scripts are not on PATH, @@ -178,12 +212,12 @@ def message_about_scripts_not_on_PATH(scripts): # Format a message msg_lines = [] for parent_dir, scripts in warn_for.items(): - scripts = sorted(scripts) - if len(scripts) == 1: - start_text = "script {} is".format(scripts[0]) + sorted_scripts = sorted(scripts) # type: List[str] + if len(sorted_scripts) == 1: + start_text = "script {} is".format(sorted_scripts[0]) else: start_text = "scripts {} are".format( - ", ".join(scripts[:-1]) + " and " + scripts[-1] + ", ".join(sorted_scripts[:-1]) + " and " + sorted_scripts[-1] ) msg_lines.append( @@ -204,10 +238,81 @@ def message_about_scripts_not_on_PATH(scripts): return "\n".join(msg_lines) -def move_wheel_files(name, req, wheeldir, user=False, home=None, root=None, - pycompile=True, scheme=None, isolated=False, prefix=None, - warn_script_location=True): +def sorted_outrows(outrows): + # type: (Iterable[InstalledCSVRow]) -> List[InstalledCSVRow] + """ + Return the given rows of a RECORD file in sorted order. + + Each row is a 3-tuple (path, hash, size) and corresponds to a record of + a RECORD file (see PEP 376 and PEP 427 for details). For the rows + passed to this function, the size can be an integer as an int or string, + or the empty string. + """ + # Normally, there should only be one row per path, in which case the + # second and third elements don't come into play when sorting. + # However, in cases in the wild where a path might happen to occur twice, + # we don't want the sort operation to trigger an error (but still want + # determinism). Since the third element can be an int or string, we + # coerce each element to a string to avoid a TypeError in this case. + # For additional background, see-- + # https://github.com/pypa/pip/issues/5868 + return sorted(outrows, key=lambda row: tuple(str(x) for x in row)) + + +def get_csv_rows_for_installed( + old_csv_rows, # type: Iterable[List[str]] + installed, # type: Dict[str, str] + changed, # type: set + generated, # type: List[str] + lib_dir, # type: str +): + # type: (...) -> List[InstalledCSVRow] + """ + :param installed: A map from archive RECORD path to installation RECORD + path. + """ + installed_rows = [] # type: List[InstalledCSVRow] + for row in old_csv_rows: + if len(row) > 3: + logger.warning( + 'RECORD line has more than three elements: {}'.format(row) + ) + # Make a copy because we are mutating the row. + row = list(row) + old_path = row[0] + new_path = installed.pop(old_path, old_path) + row[0] = new_path + if new_path in changed: + digest, length = rehash(new_path) + row[1] = digest + row[2] = length + installed_rows.append(tuple(row)) + for f in generated: + digest, length = rehash(f) + installed_rows.append((normpath(f, lib_dir), digest, str(length))) + for f in installed: + installed_rows.append((installed[f], '', '')) + return installed_rows + + +def move_wheel_files( + name, # type: str + req, # type: Requirement + wheeldir, # type: str + user=False, # type: bool + home=None, # type: Optional[str] + root=None, # type: Optional[str] + pycompile=True, # type: bool + scheme=None, # type: Optional[Mapping[str, str]] + isolated=False, # type: bool + prefix=None, # type: Optional[str] + warn_script_location=True # type: bool +): + # type: (...) -> None """Install a wheel""" + # TODO: Investigate and break this up. + # TODO: Look into moving this into a dedicated class for representing an + # installation. if not scheme: scheme = distutils_scheme( @@ -220,7 +325,7 @@ def move_wheel_files(name, req, wheeldir, user=False, home=None, root=None, else: lib_dir = scheme['platlib'] - info_dir = [] + info_dir = [] # type: List[str] data_dirs = [] source = wheeldir.rstrip(os.path.sep) + os.path.sep @@ -228,9 +333,9 @@ def move_wheel_files(name, req, wheeldir, user=False, home=None, root=None, # installed = files copied from the wheel to the destination # changed = files changed while installing (scripts #! line typically) # generated = files newly generated during the install (script wrappers) - installed = {} + installed = {} # type: Dict[str, str] changed = set() - generated = [] + generated = [] # type: List[str] # Compile all of the pyc files that we're going to be installing if pycompile: @@ -240,9 +345,6 @@ def move_wheel_files(name, req, wheeldir, user=False, home=None, root=None, compileall.compile_dir(source, force=True, quiet=True) logger.debug(stdout.getvalue()) - def normpath(src, p): - return os.path.relpath(src, p).replace(os.path.sep, '/') - def record_installed(srcfile, destfile, modified=False): """Map archive RECORD paths to installation RECORD paths.""" oldpath = normpath(srcfile, wheeldir) @@ -388,8 +490,9 @@ def move_wheel_files(name, req, wheeldir, user=False, home=None, root=None, "import_name": entry.suffix.split(".")[0], "func": entry.suffix, } - - maker._get_script_text = _get_script_text + # ignore type, because mypy disallows assigning to a method, + # see https://github.com/python/mypy/issues/2427 + maker._get_script_text = _get_script_text # type: ignore maker.script_template = r"""# -*- coding: utf-8 -*- import re import sys @@ -499,28 +602,23 @@ if __name__ == '__main__': with open_for_csv(record, 'r') as record_in: with open_for_csv(temp_record, 'w+') as record_out: reader = csv.reader(record_in) + outrows = get_csv_rows_for_installed( + reader, installed=installed, changed=changed, + generated=generated, lib_dir=lib_dir, + ) writer = csv.writer(record_out) - outrows = [] - for row in reader: - row[0] = installed.pop(row[0], row[0]) - if row[0] in changed: - row[1], row[2] = rehash(row[0]) - outrows.append(tuple(row)) - for f in generated: - digest, length = rehash(f) - outrows.append((normpath(f, lib_dir), digest, length)) - for f in installed: - outrows.append((installed[f], '', '')) - for row in sorted(outrows): + # Sort to simplify testing. + for row in sorted_outrows(outrows): writer.writerow(row) shutil.move(temp_record, record) def wheel_version(source_dir): + # type: (Optional[str]) -> Optional[Tuple[int, ...]] """ Return the Wheel-Version of an extracted wheel, if possible. - Otherwise, return False if we couldn't parse / extract it. + Otherwise, return None if we couldn't parse / extract it. """ try: dist = [d for d in pkg_resources.find_on_path(None, source_dir)][0] @@ -532,10 +630,11 @@ def wheel_version(source_dir): version = tuple(map(int, version.split('.'))) return version except Exception: - return False + return None def check_compatibility(version, name): + # type: (Optional[Tuple[int, ...]], str) -> None """ Raises errors or warns if called with an incompatible Wheel-Version. @@ -567,7 +666,8 @@ def check_compatibility(version, name): class Wheel(object): """A wheel file""" - # TODO: maybe move the install code into this class + # TODO: Maybe move the class into the models sub-package + # TODO: Maybe move the install code into this class wheel_file_re = re.compile( r"""^(?P(?P.+?)-(?P.*?)) @@ -577,6 +677,7 @@ class Wheel(object): ) def __init__(self, filename): + # type: (str) -> None """ :raises InvalidWheelFilename: when the filename is invalid for a wheel """ @@ -602,6 +703,7 @@ class Wheel(object): } def support_index_min(self, tags=None): + # type: (Optional[List[Pep425Tag]]) -> Optional[int] """ Return the lowest index that one of the wheel's file_tag combinations achieves in the supported_tags list e.g. if there are 8 supported tags, @@ -614,17 +716,144 @@ class Wheel(object): return min(indexes) if indexes else None def supported(self, tags=None): + # type: (Optional[List[Pep425Tag]]) -> bool """Is this wheel supported on this system?""" if tags is None: # for mock tags = pep425tags.get_supported() return bool(set(tags).intersection(self.file_tags)) +def _contains_egg_info( + s, _egg_info_re=re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.I)): + """Determine whether the string looks like an egg_info. + + :param s: The string to parse. E.g. foo-2.1 + """ + return bool(_egg_info_re.search(s)) + + +def should_use_ephemeral_cache( + req, # type: InstallRequirement + format_control, # type: FormatControl + autobuilding, # type: bool + cache_available # type: bool +): + # type: (...) -> Optional[bool] + """ + Return whether to build an InstallRequirement object using the + ephemeral cache. + + :param cache_available: whether a cache directory is available for the + autobuilding=True case. + + :return: True or False to build the requirement with ephem_cache=True + or False, respectively; or None not to build the requirement. + """ + if req.constraint: + return None + if req.is_wheel: + if not autobuilding: + logger.info( + 'Skipping %s, due to already being wheel.', req.name, + ) + return None + if not autobuilding: + return False + + if req.editable or not req.source_dir: + return None + + if req.link and not req.link.is_artifact: + # VCS checkout. Build wheel just for this run. + return True + + if "binary" not in format_control.get_allowed_formats( + canonicalize_name(req.name)): + logger.info( + "Skipping bdist_wheel for %s, due to binaries " + "being disabled for it.", req.name, + ) + return None + + link = req.link + base, ext = link.splitext() + if cache_available and _contains_egg_info(base): + return False + + # Otherwise, build the wheel just for this run using the ephemeral + # cache since we are either in the case of e.g. a local directory, or + # no cache directory is available to use. + return True + + +def format_command_result( + command_args, # type: List[str] + command_output, # type: str +): + # type: (...) -> str + """ + Format command information for logging. + """ + command_desc = format_command_args(command_args) + text = 'Command arguments: {}\n'.format(command_desc) + + if not command_output: + text += 'Command output: None' + elif logger.getEffectiveLevel() > logging.DEBUG: + text += 'Command output: [use --verbose to show]' + else: + if not command_output.endswith('\n'): + command_output += '\n' + text += 'Command output:\n{}{}'.format(command_output, LOG_DIVIDER) + + return text + + +def get_legacy_build_wheel_path( + names, # type: List[str] + temp_dir, # type: str + req, # type: InstallRequirement + command_args, # type: List[str] + command_output, # type: str +): + # type: (...) -> Optional[str] + """ + Return the path to the wheel in the temporary build directory. + """ + # Sort for determinism. + names = sorted(names) + if not names: + msg = ( + 'Legacy build of wheel for {!r} created no files.\n' + ).format(req.name) + msg += format_command_result(command_args, command_output) + logger.warning(msg) + return None + + if len(names) > 1: + msg = ( + 'Legacy build of wheel for {!r} created more than one file.\n' + 'Filenames (choosing first): {}\n' + ).format(req.name, names) + msg += format_command_result(command_args, command_output) + logger.warning(msg) + + return os.path.join(temp_dir, names[0]) + + class WheelBuilder(object): """Build wheels from a RequirementSet.""" - def __init__(self, finder, preparer, wheel_cache, - build_options=None, global_options=None, no_clean=False): + def __init__( + self, + finder, # type: PackageFinder + preparer, # type: RequirementPreparer + wheel_cache, # type: WheelCache + build_options=None, # type: Optional[List[str]] + global_options=None, # type: Optional[List[str]] + no_clean=False # type: bool + ): + # type: (...) -> None self.finder = finder self.preparer = preparer self.wheel_cache = wheel_cache @@ -647,15 +876,18 @@ class WheelBuilder(object): def _build_one_inside_env(self, req, output_dir, python_tag=None): with TempDirectory(kind="wheel") as temp_dir: - if self.__build_one(req, temp_dir.path, python_tag=python_tag): + if req.use_pep517: + builder = self._build_one_pep517 + else: + builder = self._build_one_legacy + wheel_path = builder(req, temp_dir.path, python_tag=python_tag) + if wheel_path is not None: + wheel_name = os.path.basename(wheel_path) + dest_path = os.path.join(output_dir, wheel_name) try: - wheel_name = os.listdir(temp_dir.path)[0] - wheel_path = os.path.join(output_dir, wheel_name) - shutil.move( - os.path.join(temp_dir.path, wheel_name), wheel_path - ) + shutil.move(wheel_path, dest_path) logger.info('Stored in directory: %s', output_dir) - return wheel_path + return dest_path except Exception: pass # Ignore return, we can't do anything else useful. @@ -672,10 +904,48 @@ class WheelBuilder(object): SETUPTOOLS_SHIM % req.setup_py ] + list(self.global_options) - def __build_one(self, req, tempd, python_tag=None): + def _build_one_pep517(self, req, tempd, python_tag=None): + """Build one InstallRequirement using the PEP 517 build process. + + Returns path to wheel if successfully built. Otherwise, returns None. + """ + assert req.metadata_directory is not None + if self.build_options: + # PEP 517 does not support --build-options + logger.error('Cannot build wheel for %s using PEP 517 when ' + '--build-options is present' % (req.name,)) + return None + try: + req.spin_message = 'Building wheel for %s (PEP 517)' % (req.name,) + logger.debug('Destination directory: %s', tempd) + wheel_name = req.pep517_backend.build_wheel( + tempd, + metadata_directory=req.metadata_directory + ) + if python_tag: + # General PEP 517 backends don't necessarily support + # a "--python-tag" option, so we rename the wheel + # file directly. + new_name = replace_python_tag(wheel_name, python_tag) + os.rename( + os.path.join(tempd, wheel_name), + os.path.join(tempd, new_name) + ) + # Reassign to simplify the return at the end of function + wheel_name = new_name + except Exception: + logger.error('Failed building wheel for %s', req.name) + return None + return os.path.join(tempd, wheel_name) + + def _build_one_legacy(self, req, tempd, python_tag=None): + """Build one InstallRequirement using the "legacy" build process. + + Returns path to wheel if successfully built. Otherwise, returns None. + """ base_args = self._base_setup_args(req) - spin_message = 'Running setup.py bdist_wheel for %s' % (req.name,) + spin_message = 'Building wheel for %s (setup.py)' % (req.name,) with open_spinner(spin_message) as spinner: logger.debug('Destination directory: %s', tempd) wheel_args = base_args + ['bdist_wheel', '-d', tempd] \ @@ -685,13 +955,21 @@ class WheelBuilder(object): wheel_args += ["--python-tag", python_tag] try: - call_subprocess(wheel_args, cwd=req.setup_py_dir, - show_stdout=False, spinner=spinner) - return True + output = call_subprocess(wheel_args, cwd=req.setup_py_dir, + spinner=spinner) except Exception: spinner.finish("error") logger.error('Failed building wheel for %s', req.name) - return False + return None + names = os.listdir(tempd) + wheel_path = get_legacy_build_wheel_path( + names=names, + temp_dir=tempd, + req=req, + command_args=wheel_args, + command_output=output, + ) + return wheel_path def _clean_one(self, req): base_args = self._base_setup_args(req) @@ -699,63 +977,52 @@ class WheelBuilder(object): logger.info('Running setup.py clean for %s', req.name) clean_args = base_args + ['clean', '--all'] try: - call_subprocess(clean_args, cwd=req.source_dir, show_stdout=False) + call_subprocess(clean_args, cwd=req.source_dir) return True except Exception: logger.error('Failed cleaning build dir for %s', req.name) return False - def build(self, requirements, session, autobuilding=False): + def build( + self, + requirements, # type: Iterable[InstallRequirement] + session, # type: PipSession + autobuilding=False # type: bool + ): + # type: (...) -> List[InstallRequirement] """Build wheels. :param unpack: If True, replace the sdist we built from with the newly built wheel, in preparation for installation. :return: True if all the wheels built correctly. """ - from pip._internal import index - from pip._internal.models.link import Link - - building_is_possible = self._wheel_dir or ( - autobuilding and self.wheel_cache.cache_dir - ) - assert building_is_possible - buildset = [] format_control = self.finder.format_control + # Whether a cache directory is available for autobuilding=True. + cache_available = bool(self._wheel_dir or self.wheel_cache.cache_dir) + for req in requirements: - if req.constraint: + ephem_cache = should_use_ephemeral_cache( + req, format_control=format_control, autobuilding=autobuilding, + cache_available=cache_available, + ) + if ephem_cache is None: continue - if req.is_wheel: - if not autobuilding: - logger.info( - 'Skipping %s, due to already being wheel.', req.name, - ) - elif autobuilding and req.editable: - pass - elif autobuilding and not req.source_dir: - pass - elif autobuilding and req.link and not req.link.is_artifact: - # VCS checkout. Build wheel just for this run. - buildset.append((req, True)) - else: - ephem_cache = False - if autobuilding: - link = req.link - base, ext = link.splitext() - if index.egg_info_matches(base, None, link) is None: - # E.g. local directory. Build wheel just for this run. - ephem_cache = True - if "binary" not in format_control.get_allowed_formats( - canonicalize_name(req.name)): - logger.info( - "Skipping bdist_wheel for %s, due to binaries " - "being disabled for it.", req.name, - ) - continue - buildset.append((req, ephem_cache)) + + buildset.append((req, ephem_cache)) if not buildset: - return True + return [] + + # Is any wheel build not using the ephemeral cache? + if any(not ephem_cache for _, ephem_cache in buildset): + have_directory_for_build = self._wheel_dir or ( + autobuilding and self.wheel_cache.cache_dir + ) + assert have_directory_for_build + + # TODO by @pradyunsg + # Should break up this method into 2 separate methods. # Build the wheels. logger.info( @@ -827,5 +1094,5 @@ class WheelBuilder(object): 'Failed to build %s', ' '.join([req.name for req in build_failure]), ) - # Return True if all builds were successful - return len(build_failure) == 0 + # Return a list of requirements that failed to build + return build_failure diff --git a/env/lib/python3.7/site-packages/pip/_vendor/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/__init__.py index a0aae81..c1d9508 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/__init__.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/__init__.py @@ -30,24 +30,21 @@ def vendored(modulename): vendored_name = "{0}.{1}".format(__name__, modulename) try: - __import__(vendored_name, globals(), locals(), level=0) + __import__(modulename, globals(), locals(), level=0) except ImportError: - try: - __import__(modulename, globals(), locals(), level=0) - except ImportError: - # We can just silently allow import failures to pass here. If we - # got to this point it means that ``import pip._vendor.whatever`` - # failed and so did ``import whatever``. Since we're importing this - # upfront in an attempt to alias imports, not erroring here will - # just mean we get a regular import error whenever pip *actually* - # tries to import one of these modules to use it, which actually - # gives us a better error message than we would have otherwise - # gotten. - pass - else: - sys.modules[vendored_name] = sys.modules[modulename] - base, head = vendored_name.rsplit(".", 1) - setattr(sys.modules[base], head, sys.modules[modulename]) + # We can just silently allow import failures to pass here. If we + # got to this point it means that ``import pip._vendor.whatever`` + # failed and so did ``import whatever``. Since we're importing this + # upfront in an attempt to alias imports, not erroring here will + # just mean we get a regular import error whenever pip *actually* + # tries to import one of these modules to use it, which actually + # gives us a better error message than we would have otherwise + # gotten. + pass + else: + sys.modules[vendored_name] = sys.modules[modulename] + base, head = vendored_name.rsplit(".", 1) + setattr(sys.modules[base], head, sys.modules[modulename]) # If we're operating in a debundled setup, then we want to go ahead and trigger @@ -74,11 +71,13 @@ if DEBUNDLED: vendored("packaging") vendored("packaging.version") vendored("packaging.specifiers") + vendored("pep517") vendored("pkg_resources") vendored("progress") vendored("pytoml") vendored("retrying") vendored("requests") + vendored("requests.exceptions") vendored("requests.packages") vendored("requests.packages.urllib3") vendored("requests.packages.urllib3._collections") diff --git a/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/__init__.cpython-37.pyc index 70608d2debd811dc4528cf0ef6d8c10b347c6987..6b6cdaff91ea144de6d23414e5748daf2ce381fa 100644 GIT binary patch delta 189 zcmZn?`!CAt#LLUY00eo9C1Uj^@=7v(o2VYZ_-SLs6h^UB-W0QDMn(o8Z4RPSn1dNK zEj9}=u`+UT0QEQnadFvXMP`x7vCJ}z7L%)(T_zu4KE{z!SeaL0n3gel5{ov60LXYo z9;V5sS&p!?6{HrJ8k$e;V>J^NE=nydO)V}d)=RBOPAw?O%+K3=i1i$cL=jK}3s46K eBM`E(u!*p7NU<@iFi+mVWj%R67tiF^T;c#_^e*%O delta 185 zcmew_+9by7#LLUY00dF<)ncYhr*@zKVLDU56>%)tzrW}B6mSQ)vvfohzA zxOmBALuL_W#uDach7y)$h7_h0=3W*?hH!?wDi($k)@-h#d5jDoIN5<&kuhO%60-|y zBtsrk#N?&S$2pSA)AO=Q3QZ=LuxRs%fh=a^VPayGVB}+*yqx98e{7hK{1PX;KX diff --git a/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/appdirs.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/appdirs.cpython-37.pyc index 75df8f28030f40be62f6571848efddbd72a60160..194ad4bf033ca8d8e333cd43ea47d528c5b73d32 100644 GIT binary patch delta 37 rcmcb*fbr@AMjj_#UM>b8$XhHCyOF1tha;u1GOxlgEo1XSo-NJ*(KQRr delta 37 rcmcb*fbr@AMjj_#UM>b8h?=h!vyrElhaJuj=I&}8#Mo-NJ*&{7M* diff --git a/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/distro.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/distro.cpython-37.pyc index 4d7087409e87478711c7d0451e19bf0642f7b444..4cff2b0f9b76c3f18d51a7d4f6ee2278d599dd03 100644 GIT binary patch delta 5330 zcma(VSxj8l_1!lsGs7@uF$@^9FT-ZA*-S8A04D^;j%?S<*k%~G&(6RwGrsc%8$1Lr zBz9~kYIM~$OXChrmAb0xMtzNyN~sbx`D&Aorc$K7O8sflREkuo%|{#er{~-U1B}LU zK%95px%aI1EcbEsHTnMQvU^`{u0w*K$eSf+zP|giyM#RZa>L0*YNfUi@#j(-wZm`D z4^4hIbx=Fd@)SAcq0VLE-y|>>VEHtcx@n%`qMoxBe*xV?^J&2n@fXrUTC^nji|Afj zOiO^WneL-rS_)V(9i(M+3t%O5h?di>fO+XKt)P`li^N|__tPp`4a729Lu*0E7FtK^ z;aN@}rwz0bR<=?fZ30RKZKf^otfZ~94W3nW8*PVYHSM6=;aNj>&`x;P(k|K!&pO&e zd*NCCxI}l-z9otFDGk?5{ziCzjP@@{ZM0tye2VXy#7>ePh0C8O?<=daz@gIuqL#3&mPP zk+>QRhg<3SxyZ$iv(F$=`~_w~dz5XXp}5MTZLvA#1kND*#bp4JmpS&uuV5lC}8!PF~W{~SowEah>zv-R9}-;SN&6B z2+3U$5{Lzv8ut-a0Gl&~6asB4S#`$E3Wbo4+J3T4Sdu#voQg6Co?%aRAw?i$8y{%s z);_J?MCRsp=o8En<8o=U?sqLEY0a=C4zII`JUVEvFphe2|u7W93552R&~Z zQFJ6Qgb(**E3p4Q&2Hg$`dYLPdtbw}8SAUA%t-PI*!^jGw}(||slLDB-o^fsx=L7F z7cFtfRY3b9&9I48i4^;L|BsRBg@LlHOx3{jO`6HWss+>613}U&Vzc5?P*pK2v#G5C z2`*?PMpJOJ8twL;apK+RjcyM>TtaFfP|Yp-?he%h6Keo~3p6wd3qCVzM1m0JO+Jpq~G0Uo)xW<%117nowK^f;F{k*}FQ0 zT^Q`~kZ%6VBa5x5mkl83N3aXQZUk%6M1)bzfOhKW7o-JQARsNqLkQTo86AUu&jNwl zTKL!`>BP<_Iwr&R#jvQLZUm8Ghlc`(js!-AAT=ud#lv{^df~dop^+m; z4SJiMw+ zw@gM85mkiTI5Df?nJ^W*wQgT&^KoIBPG&QGMbrMQ@v$R>6!0$tS>>ajXS=c)Z7pT{}}6&Yu7A?~Q+5huCTwWSbi}V4VCH!7m=U6DLdo?5yCQP5kze zyV0sL{_f=88iXT6L=O@=OC~d%9yR=TblZp>utE5X_X3!6B&8{d60dYbGD|9%cChUP zu0TXeN-3F=WfE%#%w%AAF*+ep6I_qX^D+MPsY2eXoH>JKAmVq>XVyJ|jDeurN0qr@ z#-eO3fgWNc3TifiX;@5>RW><@Tl-8YAiZZ$#TWu~8jc7H#wbFJzHrYdN4svuUbM1- ze{y|G{b~`UQzi2#alZ9wljk}}6`Mf$*<*-P>?vLz@o8T@Q%}6v!i-bunAS9PEc-GJ zpK<=`^y54-mCL`H{!=sDvYdgnne!0MICZADi`8=T%s)EBY0JV=h6S>kdzFA^x`xdo zu9Zj1$ts(IyB@`crJmHLqorxKv)_gdo5OS3{n(nebKiyyJJm~?ixrZB9^8+asar$w zv!SrU`uUD{Ljwj|cdcGD#6m`s!Grq&zY>2^b`kzbeAKo-X&REw4DbrIZ}I%W^9PSh zG$%=>t?aENp*da&prc=kOi-twz6bBlH1z;=Ar(Ff?5Z>6qPei@@=D9{f-Px7YSNa< zU6$}I<)-dsvV!HUV#b=GBWWQ}G9FD+Pm<6$*g5YA#iOmgy-Vf)eAD+iEDL{LVgmYKB9NwHH=8ePJl%MDsQI+dmuzV~9dGvShPQdS(f5F~@KduB zR;+Y(jDI*gSo0l3MXhE;ZVDEDf@RmqeHY5Mx=m);ZgCU4>?RJ`L#)J39Pn$G?ecsx zuS$Bg#D!DDDTZwbh4%2jTx_?_B6^;0nj1D+=X3n@Txns3F3i3!wVQMK@*+CT#u11~ zvkx$zm0d!@MF6@ftVDEcB1VI%!iJEH&cK!=;tRON91cYkU7nt0SCA$=%usj>79OB; zID{m(863$cE?FkLEcy20RiOD~-6AS*-qgzQOJfO%PG-0UIC~Dk^9ZgZxPid%7O@u) z+ytN(;>QZygN=Hgj7C)WN`z)5I)xB&8~475;3Wi^(ZOoT=VJ>WpA`K~4AiHA1~QJ} z{y799LMIUu@vyALgPlOC;L0|JzYnYB{MxgAM>~P?hQ`k(_?OStj!_~i-~g2&Utt!c zY|9eViScfN8p%(Z*jUn(vQzUi?4>|ULQ2nVR^?QV>VTX#C(SA6GR%$RQluLui3=vl zJ!6va(Z$k5{LjI;yan?~DI%YcF3u*+P@9njIVr2Tpz5RZ_f<>Env_A536$Mebzr0jxV@7}CcdxY9ieTdruz3Kw zEezl0G{jgRzM11urm`FSKUeB2b^-y?R83omh7pa_YF@JmVc4bHnG!?~6p^92ZRC&`yQ||bg?r?) zvCI+i3ecJ6U)nC$i_{s%_d^Iog?a&lTWA~!2?VqJSI@U~3hzZKqW7SKNZ5{G2ZBxncuQw{5a9ngi~}+9npd6M!au)Wv51px z?M7i-N%1Q|%thS=|430olQZy-m?&k~;TX0ahV6ifp@h}I#8eXjKm*qqEzB1m3|+9$ zBEwN&3$lC6CUHF?eBnlMU7n-Bo?~~wZ_etkE7vvXDsYv!oUTo-A^T?5#eZ|-b8?X1 zd101p;zc*R;CpBEX1nz~DtwV&xj9gb_Yd7d6Em^+y6W}v&u)$sZH%LCo(YB`cX{Wn zX7WBCztyxT!X>iu7zz|p-$g8n;2wfsBf$2h+my&`h(#k}{)`MR**;S&l=u!e^iYcQJ7+7)Rzn@IC@@>TAv!@#a@=H=7)G RCx83)sBOV&vKKqZ{{g|~R`dV> delta 5303 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 g@F4;b=T+Mb=knGYK9j@j`NV$!&x{Op diff --git a/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-37.pyc index d1d0782994e6628a59890cc83fd67a39c44bafbc..776525018bce32cf00709aea793b9210b8f9bbcf 100644 GIT binary patch delta 82655 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 sk*zhlTcaM48*QuE%?hIoz8o#A3T{ei~)u%){ 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 TMqg$I74yHu-MXvTJ?j4f5xG%& delta 65557 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/retrying.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/retrying.cpython-37.pyc index 1e33738cbdd97c52f6967f580a190b324b101555..2881d2debc4405d64c5ef5130f3ba34b1bfba939 100644 GIT binary patch delta 930 zcmZva%WD%+6vn-iOq}M`np7rjlD4r{jndecH5v^f7Qwz~tgT?nBu%DmN}Wtk(vnhF z;z|&a+l3%>SH+3s%;uqa zb3)slAgYiYB3;1!EYOR4wYq7VcG4%ibCgw!JhekJZfECFcq-~3usIhe`Dm#zgim=l&6 zF+o@<4=4i8aWbh;u9}3fq|zMlZ5e3r?dVIE+^vLT7Hc>B{cCB2oC@;!o{{S{Z%Rm4C delta 929 zcmZvb%TE(g6vnyJheKar3z;G*mo#+8XN z=CCj^!T-QVy3&8bxSd23H!fVTG%;?x->oJ!VUqdv=DXi{+;gXgsl$}-ir?>Pkk8!f zo`v_myr$F?bRaEy`5?f-_+Lr>&~+fg+4hj=E0Sx?nzav}2%}Ki(#cZdiI?aZ-KmgJ8QDsXTjCYyBXmW>v;Dt3v1Hiqy=ep?Pjg z?coGbfz%M`EcPdX4(z+io0e5fcvW|{wwfn5_M+@FI-Bmmp;eYC18s>f7_Y|CSoQ*a zzzrY?3;=_`5HJdi0O*ZeoQxUV9eyh2`Ca%|dl1wE46+0h;IEk;}s5i_!hsjg@Mx z^N;9~|31P?5(!kB?MSu$UyX_|r1^6+#Hm>0hB}=lWDQ({?vOPcN=x|FrPW! vvGObOLNNte0Oo)#;0zFwu-%2_4J%h6ClvH3YmPSVP) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/six.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/__pycache__/six.cpython-37.pyc index 3e612ea97b09e735f026f6a89ceb7d4697a24c45..d6e203592ef8ae80c4a91717f93bde645d550fc5 100644 GIT binary patch delta 1830 zcmb`H&ua+Y170vkb~BX^dT}M{48!kr+1%{;`uly>j}@|f%+zW^EnBU?hrn(htx0l zkWBIiQ5(udF5EeRPUcT?QDE+SvSS`&q|5E-W6objMsOoPzxHlGzmPG~dwTl|HPN>% z_%g4KY1^64Lb@j_(LoCh_${n^4xmv4egLe(!dWPydig}G#!n-#Vrr1ziz)u2;6j@} zjUC%uB~}s#;SPZLz#@1J+z{crI}&!7{)iF!*E_^|8}`#A_&u^10+)Duz?#9#{qSJ$ zX@=oq+y?-8I5HI$2rD_Ess1tV$ZOp1O1>sbuJJWJE0-#~=c!$Xzn5sU(eek~&X{IkQAc9zL(C)5UmY{Lua7WDX6N_@Si1uro+!!;|~nY2AJBGuTr70+`St3Po@fgeLAanBG_w+Iy<%L37G>W#vK< zqAG8`cZXA!*9uZ9DQ`6}wxiFIo<0znl9U`O^f$rBfwW9Kf&&~-u6RBQEr1XUV67mX z*}_bRB6(+_>ka>-bDx)9hr;}I=O*7x@r5}a?)tPnS7sRSz#-|8+=G+ef|O!F(@fC4 zrm479m0H2*PhzMzHdpn3;I!)$zRv&Z`f{B!jiT4tvCiZQ`{IAgQK4#Qm(W?^-QsH# dTk&naH<8583$uxbl7D@)GP)tUfoo@~{sZYF-m3rr delta 462 zcmZoV$N2paBcBs5FBbz4M9o)=Sy3^OPl9pZMs*op;kF5kDY-zL*TNW8nCh!%O zg)>C=M^6ChUobIMhif4tBSQ*vFoQPoHgQ12Yiw%g`YZ#k>8Z=oZpAVH|(&U)@B~)RuT$mrD$mHBGan>ri#FUiD4#6Um zX9e<3UKeK0%w05X^T%ifCe}n|28QCvVsWOdx0nMWjV1@giL*^-WMC+oF*!HROg|VT z%?AoS4i-i(MiwS6Mh+ldGzX~U7Ds%1aY1Twe7q*3pC*%^pXQ{=-{N8zXH5={cbC7# zS&~{&5?@kTka~+Xsj?)s_!f6kW?o`ZC0K0p>iCiI0;zaDXh$^FigwXJde?x1puf_3Hbm3 delta 35 pcmaFL{gj)>iI0;zaE>F+PDk(JCJde?x1pudM3GDy? diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc index 9a8a8e56cf3cd44ebe1416c29fc953f8b54c58e1..c26f646df6100ba489eaedb35964d33f239a09b1 100644 GIT binary patch delta 35 pcmdlWzCoPFiIF+PDk(JCJdsh86#$z;31k2O diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc index 70a17034a431fb1a984593cc930b15bec91afa60..79d1d8b8978ea569239a0adb4b1afe27b2e46caf 100644 GIT binary patch delta 34 ocmX@fdXkmLiIF+PDk(IXoXL~`0Fbi@HUIzs diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc index 8341d4593f8b72389e8ae967b844448afe6015db..f0dff8ee1dc8d71ce8e5544333c0cd3cd3d30e60 100644 GIT binary patch delta 35 pcmZ2sy~3KuiI1X0dDXh$^FigwXyqJkq8UUn$3BUjV delta 35 pcmZ2sy~3KuiI1X0dE>F+PDk(JCyqJkq8UUl73A6wJ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc index 608f4c109c42a290d6d077041cf16fb813519efd..5c8b1cf8c9769b346db72476e891ac1545fa22da 100644 GIT binary patch delta 35 pcmdlduup);iI35Ngx delta 35 pcmdlduup);iIF+PDk(JC+{M@<005We390}9 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc index 9c3a4193216f15640a8a717f04a4dcc95290d3fe..9dc2d85a1cb5a37816bef159aadb38321f37e3df 100644 GIT binary patch delta 35 pcmaE)@JNBjiIF+PDk(JCoWl5z4*;n53SIyJ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc index b5da00dc1d94d139b1cae3b3eebbda9d13a2c073..1f165f6f7a18bddf09aaa336b7b9e501027f8a64 100644 GIT binary patch delta 34 ocmaFH@{EPYiIF+PDk(JC9L^-k1puet326WT diff --git a/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc index 213c37305bbae27157aa4676ebc049936b32ac74..ca5b6c36416a3b9ffd220343b02a43458a3c3aaa 100644 GIT binary patch delta 35 pcmaFF{fL{#iIF+PDk(JC9K<+*1puKx377x? diff --git a/env/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py index aa329fb..632db8e 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py @@ -1,3 +1,3 @@ -from .core import where, old_where +from .core import where -__version__ = "2018.08.24" +__version__ = "2019.03.09" diff --git a/env/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc index 6313534b7ccdb1440108cbd05c859bac69e0cc3d..ff26625caeed45a484357a2f4fd3f5ba6f2aec09 100644 GIT binary patch delta 155 zcmaFKc$JaYiIav7r-85vTTqL@;cgBdhgUNQou zG#PKPmS?0ErB-nn85mmX85rvsSo&!)-(pG5FG?+90xG%19UotoT2!2wpBEp$lA(wd sCz&=iIav7r-bD5%;7#UKSqL@>dgBdhg zUNQouHJNU)mS?0ErQYJq&q;{~Gpo3a3=A#w3@r4FO#C!iZm}fi7o`?40aX_<1BqMQ p@$qG;Ma7xE=i&tjw!0Ov{)!-x2_avE=i-PtVILDKwcl-x2_Z^a*PK diff --git a/env/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-37.pyc index 810b26a6a2fd2b0299c641fe77b5f22283061c62..eb336536c477c4381124343b7918772c5f505a1d 100644 GIT binary patch delta 192 zcmbQhxsut%iI1v6-}PAp5CY{QhovXY^QWAXz=F^-hN%Df80w2aCB7!@LKv6g3~7Nzol%wYi% z42(QXMIbvhnQyVj$EV~c$Hy0eYyt}wae!C|f)mKS#bJ}1pHiBWY6lVr8^XfK!3+TI CN+gj0 literal 1168 zcmZ`&Piqu06i;SmcV~xIOF;y^>0ATKY;%lq?tzwE59Cj>_N{lTZ*kdR-vS&j&lZJ6#Y z2tiUJs0a$0(q;|P;0+O>h|YTffz(MF2%3gXB4K@ZSC&?SJ1KT5EeiQDvs&rV*|&tj z*oV+lnH@7H^U5lJ$_^SU23a0Ruw!ENzR%tjGINq07|7VNQ&U-ZXD2F`jkD64i4t(* z4I4?1b&XMX-ju9z=q3@vh%I-Rnhl%(>3SlJh#@d=3%lYn-1{S+Th3 za4t;F`43_{P;evuJRkURIVe@RwLozzpN{mAKY5CW&EylQg|UN0R|dJU5?W&eaB>Ub zLnV%y{R&^i7Af)y4eo*PxsLD&u~!i8NJXG(M4>)JLP*e(kEKK17Ev%n`@{F7_Z@U;!mu2ov4{eQ#9 YFXqgBiC!I2E21%t!;Mbdj=M4a3kD539RL6T diff --git a/env/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem b/env/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem index 85de024..84636dd 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem +++ b/env/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem @@ -326,36 +326,6 @@ OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- -# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association -# Label: "Visa eCommerce Root" -# Serial: 25952180776285836048024890241505565794 -# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 -# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 -# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr -MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl -cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw -CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h -dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l -cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h -2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E -lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV -ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq -299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t -vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL -dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF -AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 -LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd -7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw -++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - # Issuer: CN=AAA Certificate Services O=Comodo CA Limited # Subject: CN=AAA Certificate Services O=Comodo CA Limited # Label: "Comodo AAA Services root" @@ -4298,3 +4268,391 @@ rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV 57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 -----END CERTIFICATE----- + +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 146587175971765017618439757810265552097 +# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85 +# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8 +# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX +mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 +zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P +fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc +vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 +Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp +zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO +Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW +k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ +DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF +lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW +Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 +d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z +XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR +gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 +d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv +J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg +DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM ++SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy +F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 +SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws +E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R2 O=Google Trust Services LLC +# Subject: CN=GTS Root R2 O=Google Trust Services LLC +# Label: "GTS Root R2" +# Serial: 146587176055767053814479386953112547951 +# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b +# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d +# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg +GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu +XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd +re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu +PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 +mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K +8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj +x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR +nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 +kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok +twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp +8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT +vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT +z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA +pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb +pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB +R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R +RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk +0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC +5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF +izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn +yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R3 O=Google Trust Services LLC +# Subject: CN=GTS Root R3 O=Google Trust Services LLC +# Label: "GTS Root R3" +# Serial: 146587176140553309517047991083707763997 +# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25 +# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5 +# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5 +-----BEGIN CERTIFICATE----- +MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A +DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk +fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA +njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 146587176229350439916519468929765261721 +# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26 +# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb +# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd +-----BEGIN CERTIFICATE----- +MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l +xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 +CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx +sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Global G2 Root O=UniTrust +# Subject: CN=UCA Global G2 Root O=UniTrust +# Label: "UCA Global G2 Root" +# Serial: 124779693093741543919145257850076631279 +# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 +# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a +# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH +bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x +CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds +b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr +b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 +kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm +VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R +VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc +C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj +tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY +D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv +j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl +NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 +iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP +O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV +ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj +L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl +1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU +b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV +PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj +y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb +EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg +DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI ++Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy +YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX +UB+K+wb1whnw0A== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Extended Validation Root O=UniTrust +# Subject: CN=UCA Extended Validation Root O=UniTrust +# Label: "UCA Extended Validation Root" +# Serial: 106100277556486529736699587978573607008 +# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 +# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a +# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF +eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx +MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV +BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog +D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS +sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop +O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk +sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi +c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj +VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz +KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ +TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G +sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs +1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD +fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN +l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ +VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 +c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp +4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s +t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj +2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO +vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C +xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx +cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM +fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax +-----END CERTIFICATE----- + +# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Label: "Certigna Root CA" +# Serial: 269714418870597844693661054334862075617 +# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 +# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 +# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw +WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw +MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x +MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD +VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX +BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO +ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M +CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu +I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm +TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh +C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf +ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz +IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT +Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k +JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 +hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB +GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov +L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo +dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr +aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq +hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L +6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG +HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 +0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB +lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi +o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 +gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v +faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 +Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh +jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw +3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign Root CA - G1" +# Serial: 235931866688319308814040 +# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac +# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c +# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD +VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU +ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH +MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO +MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv +Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz +f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO +8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq +d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM +tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt +Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB +o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x +PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM +wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d +GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH +6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby +RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign ECC Root CA - G3" +# Serial: 287880440101571086945156 +# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 +# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 +# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG +EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo +bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ +TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s +b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 +WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS +fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB +zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq +hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB +CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD ++JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Label: "emSign Root CA - C1" +# Serial: 825510296613316004955058 +# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 +# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 +# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG +A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg +SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v +dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ +BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ +HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH +3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH +GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c +xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 +aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq +TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 +/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 +kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG +YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT ++xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo +WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Label: "emSign ECC Root CA - C3" +# Serial: 582948710642506000014504 +# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 +# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 +# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG +EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx +IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND +IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci +MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti +sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O +BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB +Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c +3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J +0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Label: "Hongkong Post Root CA 3" +# Serial: 46170865288971385588281144162979347873371282084 +# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 +# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 +# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 +-----BEGIN CERTIFICATE----- +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 +mpv0 +-----END CERTIFICATE----- diff --git a/env/lib/python3.7/site-packages/pip/_vendor/certifi/core.py b/env/lib/python3.7/site-packages/pip/_vendor/certifi/core.py index eab9d1d..7271acf 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/certifi/core.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/certifi/core.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- """ @@ -8,30 +7,9 @@ certifi.py This module returns the installation location of cacert.pem. """ import os -import warnings - - -class DeprecatedBundleWarning(DeprecationWarning): - """ - The weak security bundle is being deprecated. Please bother your service - provider to get them to stop using cross-signed roots. - """ def where(): f = os.path.dirname(__file__) return os.path.join(f, 'cacert.pem') - - -def old_where(): - warnings.warn( - "The weak security bundle has been removed. certifi.old_where() is now an alias " - "of certifi.where(). Please update your code to use certifi.where() instead. " - "certifi.old_where() will be removed in 2018.", - DeprecatedBundleWarning - ) - return where() - -if __name__ == '__main__': - print(where()) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc index d388777c8de7078cf8b08b04617f8a4f6ada50c1..3a53db842eaa0cc3650febb049bfacd039f1f673 100644 GIT binary patch delta 34 ocmZ3$wt$VtiIF+PDk(IXoWisR0ES};H~;_u diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc index d0d79d4d2ff71417f089bbf862af19612a3fbe35..2a2833b76e7c977383ce10433402ea6a5beea586 100644 GIT binary patch delta 36 qcmex=neqQ+Mjj_#UM>b8$XhHCyOC!@CPzwPWnP70TE^rfnbrX1U<|7O delta 36 qcmex=neqQ+Mjj_#UM>b8h?=h!vyo>*CP#94dR|sZp~>VUnbrX0i430r diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc index 4717a20e70da3c503bea3a55af9291110cbfad7f..38b09c8c974ac9a2c4ac5afe95eb7fb8386eaeb8 100644 GIT binary patch delta 35 pcmdnOv4w-jiI560sY3_A_#%6jtU{7^Y=xzRb9V4FHwk3L*di delta 35 pcmZn{Y!~El;^pOH0D`FbYB3vm_A_!Mm#61tl@yw6zRb9V4FHt=3KjqW diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc index fc1a8d72428eb577a6c5bced19ca1024d860cac1..5da55ee30f22b3e0e01ea43b9804f9b97a0acfbf 100644 GIT binary patch delta 35 pcmX>obx?}OiIobx?}OiIF+PDk(JCoW!<`1pty$32FcU diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc index 7a4927eaa6a6bc814725c7eff880920deccd2ba7..b613077738a0ba14492eddcb191c2b7a5822917e 100644 GIT binary patch delta 32 mcmdnaw4I5^iI560sY3M432J3M=y}4AU|;Ycf4$2LOw&2^IhV delta 35 pcmeAZ=@a2`;^pOH0D`FbYB3vmM432}%hU6+N(xOjYcf4$2LOu92?_uJ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc index 6d12de97bfc4a9b6135a94eaba39fdd1010e2843..7b0227487ebd2c43dee2054c5b27ed2fc790c04d 100644 GIT binary patch delta 35 pcmZn^X%yjc;^pOH0D`>560sY3#8@~|3M=y}4AU|;Yq4Bs1ptUu2=V{` delta 35 pcmZn^X%yjc;^pOH0D`FbYB3vm#8^0z%hU6+N(xOjYq4Bs1ptR~2<89) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc index 418861b686a86b6305e092bd0e9c7a528fa2f71d..88d81de3ad93f1e55447026f972c06f0712e4b0a 100644 GIT binary patch delta 34 ocmaE7_RfsQiIobWn)LiIobWn)LiIF+PDk(JC+{v_q4FI0`3H|^8 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc index 3904c881debced12d2f85c8f4930de0610acd658..1b335b634aa348eb816d71f38dc336a4649f1a95 100644 GIT binary patch delta 34 ocmewy`#F}!iIb8$XhHCyOBrDizB75GOxlgEn~8kmn{It84Aq+ delta 36 qcmex9h4K3oMjj_#UM>b8h?=h!vyn&5izB%_Juj=I&}6cemn{IsLJGkE diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc index 687ed12b626b3b1e1c0b26644c605bfd541a5944..6cb426dfe5ffe3c944be9fd411b31f5ca6df0e8f 100644 GIT binary patch delta 35 pcmX@YafE}%iIb8$XhHCyOHN_C`U?RWnP70TE=9-Fe?DgQVVAQ delta 36 qcmX@ThVk?oMjj_#UM>b8h?=h!vyta-C`WR6dR|sZp~+;yFe?Dfdkb3t diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc index 306087246bdbabf9ff32869f125441ede511f39b..29d9e9a7e941378af9b09bf53595552bd1fb1249 100644 GIT binary patch delta 37 rcmcb#g6Yxb8$XhHCyOHO42S-X_WnP70TE^zz9pT&n;h7BZ delta 37 rcmcb#g6Yxb8h?=h!vyta{2S;*wdR|sZp~>do9pT&n;I<6p diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc index 30acaf59e8dcbf3b91e4a344a7b54cbc36541cbe..b28db55809f60d73435a8a4cb62461760c1f5daa 100644 GIT binary patch delta 36 qcmZ3mgK@zQMjj_#UM>b8$XhHCyOC#YG)GEdWnP70TE^sq(eVJo!V9?o delta 36 qcmZ3mgK@zQMjj_#UM>b8h?=h!vyo?QG)HoIdR|sZp~>Wf(eVJn>kF*_ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc index 5a16309af32315236b1eabd3cc77efe1d54acba3..8c7cb00176e0801cf2f345d5131d9e6d6d3d37a8 100644 GIT binary patch delta 36 qcmezHi1EWCMjj_#UM>b8$XhHCyOHNu0Y^$b8h?=h!vytam0Y`FqdR|sZp~>W11=9fL!VNS4 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc index f3e2935e90bf0d056f279d344a6d7903869b7bdb..b2b64edd08f4f6b3af1fe9c23fae9b309a1ddf4a 100644 GIT binary patch delta 36 qcmeyio$=dtMjj_#UM>b8$XhHCyOF0onj@vKGOxlgEo1WR=x6}f{R|TT delta 36 qcmeyio$=dtMjj_#UM>b8h?=h!vyrDgnj^V9Juj=I&}8!L=x6}fCJYAv diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc index d456a4297c0cd6f0e0653fc409a54926e1ef1e7e..b5b88a7f9d78fafb173df422964c4e4a98def2d0 100644 GIT binary patch delta 36 qcmbQemT~r4Mjj_#UM>b8$XhHCyOGB-j3cG6GOxlgEn~88m>&SP{|c4> delta 36 qcmbQemT~r4Mjj_#UM>b8h?=h!vysO#j3c=`Juj=I&}6c2m>&SPC<=-I diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc index f83acd46159179479965f1eb946b3f213a63d1a1..019f1edf1f24206303a1a7622afeaf55ea627918 100644 GIT binary patch delta 36 qcmbQbgK_E(Mjj_#UM>b8$XhHCyOC#6G)GEdWnP70TE^sU(eVJl1q+P; delta 36 qcmbQbgK_E(Mjj_#UM>b8h?=h!vyo>}G)HoIdR|sZp~>WJ(eVJkE(?JG diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc index 0f85f870e7b50753b0b90954dd48ae40294f2a51..3bf4eb5d8cb5dd44125f50be738f5503a5f6a033 100644 GIT binary patch delta 36 qcmZo$%hb8$XhHCyOGB#j3cG6GOxlgEn~7@m_GowoC=)) delta 36 qcmbQcmT~S{Mjj_#UM>b8h?=h!vysOtj3c=`Juj=I&}6b-m_Gov#R`!C diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc index 0ff4af6e1c7648971d74e31efdfece371115dab2..048ab24b490f07531f84b5ceeaadfa493d156c65 100644 GIT binary patch delta 35 pcmX>sc36zZiIsc36zZiIF+PDk(JC?8^F&6#$$13C#ci diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc index c9f4a9c111619564d0f1cad1dc1fbf97a4928724..6918e5990705cdb98bcfddf50185208a1414a2dc 100644 GIT binary patch delta 35 pcmeAX>=EQ~;^pOH0D`>560sY3n3*_I3M=y}4AU|;i!+t70RV^?2zLMg delta 35 pcmeAX>=EQ~;^pOH0D`FbYB3vmn3*_|%hU6+N(xOji!+t70RV?J2x|ZU diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc index a2a808549e0a1aad45702a72873502dfa2fa1a4c..dae9f1ce6d296bbfeda20b5302596240850080d1 100644 GIT binary patch delta 35 pcmdnav7Lj*iIF+PDk(JC+`zP*5dfJ23BCXT diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc index d2cb60c93c703a0622ec099884cabf07ebc0ebb9..a2fb1b168d3b1874393e4c5f5103b8fde7225a02 100644 GIT binary patch delta 35 pcmbPKHK~fniIOaQdpT+VVIV&`JiOaT%MknRZ?iO`Ji_E(I@iI_E(I@iIF+PDk(JCJe%ne2LQ3J3eErk diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc index 0b2e01d3aa7ffe0613620d4cba48e8463e2abc8f..f0e3d62107b917d961a8ea679eb7ddc4ad3bc19d 100644 GIT binary patch delta 35 pcmZ3;vyg|!iI_cP2_ygj delta 35 pcmZ3;vyg|!iI_Zr2^atX diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc index 588f49863918ed633abd942579f72c9a4f3bc589..f22f5f1412e547f876d995facea379ae4e1dc0a1 100644 GIT binary patch delta 35 pcmcaDbX$nWiIF+PDk(JC+{$!~4FILh3P=C| diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc index de87d51a641540a1df44071b6c126f56a9d0a84c..eaf77dcbc2ec68c780354986539192baad53a92d 100644 GIT binary patch delta 35 pcmbQKJ5!g(iI560sY3{xEW+6jtU{7^Y=x7GNr41pt*|30MFC delta 35 pcmZqUZ{z22;^pOH0D`FbYB3vm{xEVRm#61tl@yw67GNr41pt(P2}}S0 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-37.pyc index a2c08d6c0bf96a959ae054209a81eb3fac1f5079..bca11d573543bcc06d771ef025662fc378aa22e6 100644 GIT binary patch delta 34 ocmeBX?q=q3;^pOH0D`>560sY3Y#BLH3M=y}4AU|u2Qpd#0DmY5Y5)KL delta 34 ocmeBX?q=q3;^pOH0D`FbYB3vmY#BL{%hU6+N(xOT2Qpd#0De&jUH||9 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc index 3d8424a8c6b7f2b4d3409554d2aa41c1f9c4bc1c..eaaa54340d12ecb2384987e1dea4b80743982b20 100644 GIT binary patch delta 38 qcmbQiID?VLiIo diff --git a/env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc index 835ef58b5586a471573c7e4957a651cfb4e03e45..4b73d6b4bab09fecc3ece927c798b4674af38dc0 100644 GIT binary patch delta 2478 zcmb7FOKcle6rDF?kH?PVxJjCiNt=EkjoZd?LRDG{rKK&D(z*zTegf^(@k|o`#_pX- z^O36vQUqcFR1dK(bOWqFmSBNEAf&QF2niNEBv=3oB*czQSKRx?&By8nTkpL8{hWK> zo!|Grawzs>dwWE|pL4tK(yzleV}0z6o4X1_Pb-#gg>EQT$nIFtCgV6atT4{Qa=yu8 zStS{{d8gPzm+$>F92~*sp61uoB3|SGY4SU0iTJ6|}?T8h#I<{Y_iRYqnJ&N z+v;()<3j~H@$TKDqh6&pS}W8>3XbdL%HY}qSHa*MVXUT|RngyrenPv}Xfs3hj zypmL*13M9Laur(&@u7;EPEA-Ml^(`u)5AO_;P!&N5EcIqRuyd93kgL^fSWc}< z%m05<(0zM>+;3U}{ip&G1jOE&DdcjtIz>FH_Ri!!Q~CM8@POobWI`mQ^k&b#+C_Di*e6ATt?z?&7hNN1tCl zW1c*loj7rP;;E$JM@g-^B4j()3Q%=~<}SJ-Vw$dJRp*ed=GX=dqR1uS%}k)3?JwaCq36q0*S6q6oHWA*6!MLx zDnQ~N!RE@RuIgx`jyASh=u68aqkL~Lb)}mG^%77%%X9(?zw}!eHK<}Tdy7)|I)yR| z>E%HbA&$)@FoFSQ=!PbnW<(*{cqjN7WAF0Qq5V%}>U!-o5}*}BQKc$Jw~Y6csB&Ga zYjwp8*Hz3R1H8Ikh1GL%MCbSyq0}g85#ijNR|VU(J*nPjV=L|e6)I>WAU0qp?>EMR zunoujtkJWX3J8!0NE3__r1+9CG}iL0h?Zxtx%B1~Ro8Sasz!nl&0q%`!>B$IVx9Z!C7a%Zb^Wy_q$H(6|a8M&ddbmLh2F4iyYX;D3ff;_$w`$?DPrTOKK z-b2!6ii-$Nm*?DBNZ}YBC7pg*ge|ntB8o2D;vaWB&i3(tI(qsCkW|%8OKJnM58l$f zP|@In@t!OAc=5c5D9zotnqgI z1Ex!txA4QAgWWCGPTSZG)4uw{5yre4BR9diFi=MmT$7XEDUZ}z0 z?|FLjTf6B76iB)XMH-g~T8t~>+K>FN&EunV{GLP8bkZi6A!xZ{;o5hNQ#})G$2r=j zuLw{*LCW`GC)g>$o`qRjuJNyWyW`_D%o5N(9N>TS9?wX=r6y7$f|3sro}P2^ru@7G zXt?%)5zG;6L9oSEdx*i`_)_05tisRrZ=a%%0K7K2MQy3J6di`00d~90Y`>Wm zh-*k)5)U2>zIZVv7B8)d7u`gS#;A!WFP^--CdR~riP3{sFZz9NDaDnWt9y zB|mT-Qx&llJFvqLpcREpCiEZ#*IxZlfp-3b+GFI`mc3$l;|%{pH8)d*z-sJUjSEtw zMnzBQ?0gl(a48khHUb|Ia| zvG)%?P|6g&!82(IEjd7ue#0hEta+H zh7>8w8sWFKQGPcvezJ$;qiawI-M!PHyB;>3hQlZ~#vhIjYBOexkH@l)_8|ub2xxDg zy!4w~268lmBQOw*XoMNMp+UO-RqQjy-sY9~pE`W&p9##aAW=uv8=t?jNjuDLVJBiVWe*- z%D=}yNZ)+qzM^MIN2HMl8G(6Zz)J*8r(ZzcM|{598;~(h(yOrZp;flQUJc;+-HZ6I z-NVg_U&Osn>H|H!?BrD>g;wxFY*lLZlwjp1J%7c|F1wz)UWRjDaJ%=d<8%V3Ct#u+ zqFsU} ziCyG>9!jSkBJvpm+J_wP?mK@`#(RO*q(nqzJVbn{;^i$HmIDzXQbZ)JUtg0m^8{NL zY@^vGisJYDcHdpL%xez}EzZ)tmkF*Aln8PNB95=y3JYP$#gb~Ioc68}+)ttOeSvrf z1>hoX{LJ~D5L@ZrhjOHR%RM%Bz=Nl3<1OD1qIM(9U+Jk$k&nModZX& z?RGK})&0eyo8RqublX8ng>iP(cPb_K9A!G7hhQ-L)eK9sl!iT-`c=e;q`LkAIOB?7 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc index 8d6c12e722e26ad7330296a05235ebf447c4abeb..84bfb155541be3868207be080f3585ddc69609d7 100644 GIT binary patch delta 36 qcmcc2bD4+NiI5 delta 36 qcmcc2bD4+NiIyL0K84|a%9_A?3EaROnV4r7P+#k(VNm^|KYsX|lJN zczI>WsL&IiCXiYHfjH76NYMkrz81##Z#A~jFvL=IT zttjY(iBYSsRNtwm@2i`e>Rx6@Ety{KHfPrfG}upS=BWhrsz_Pz}LJ}hxSrbSGQQ)KnTVQ|hTbcji9PF@HoI5JRBr!=#@BdB_Xu$YpgU zTTn&E;zDmZYew3YtU7YuT;Pr*nGai?{m?g$x2tb$w=gj}VRT1sCz)8bP^NuKveEu- z^CR4mGK{ESx7=y{uuOGRC7Rjq@@dUJib0+OTu^y;vY6`e zvMhHA7umVQz{(^xlW8+?nd+5JenD*P5@>WXs+88kRrSbipZSV?f_;G334N&hGshjA zqotblmOh>*1B(n?8(C@0GH}j@(X3Rfn=6K>o}GO_puyGGTw&RF&euU8o=s?-4XlRNej@e4sw>zm*e~Vd<`E>CT|#Sk6C3#^s#= delta 1093 zcmYjQ&u`pB6!sghy|!bgNtzHXO=un36tme?lmd#VXqu#HBNSy}cTrmlby;F3yJh30 z&$G0ka6oC{Rw9c5UHt>MtgV|n$#r?-4b>6zkg9LRrbxBlo`^f}rbnJKxSGKg93~Tw zFpMy%H~XJvg^hSyhUQ9N%KmO>)Vn(!iKFU4;dhu+?+;JDf-bF{pg-m978HaDCRp@2 z0$p|2SOQo5VfbLFe~qPcZC+^+XtYXz3wV<3Ehe6~0vW6Hr!NsmErLkg)+GEO?rUmb zF2hOn(42*i`pYa&>Y3h7KF^Asb`tgCG&4VI_XcsQszu-1;WGq*23S_tioPgm>Z{_3 zxqzrVY&^~uM-vn>JCzu>cU#>EeWqs^UR95a)rsq5rg=>$t;4V@YQ*v)>Y{bRo1;CM(UuZZ^i^t=kKEu>I5~|@!Flzw_4T{7-;nm6v8U(z^-Tnt zf5H$rI7JIR!cIg{BBddr_ zbrpE$ugnvHWd?SSHUk$HhX_KmwOXsyFZ{1NJIbt2Voc)RnT6236w8K;*7J)NdaW0S zl+i=)_$jVWex<^~O0BkmRUYRVFS2!pAUvk-Ia5n#dA!E3!sJLJmaF|F?f2qlSN7t| vc#-Mi#(S%m8_hcA`tdu#WrlTnc(ahGTf^6m>ZH1EnU?Mrt%5UVIhOMbyAtR` diff --git a/env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc index aa14dc98333ce2617aff6676ca148fbb54b9b907..9be612bd4dbe236a17167f329019a6bc7c4cf382 100644 GIT binary patch delta 429 zcmY+8&r1S97>4)TAG71Qu2x{`K_o-6PC}4Gr-*()c99?=5o;}}SZUpZ#oD1ipbp=) zLs5sQQ+TdphXkSMBtic{S8vg$c&Hh8zhNF`p7$a7mNe%B0U^<{Zz6?M^wHb~ZXF%l z^~`RiS%;hokZx0JQk4}+|GJn$p^CIy3!T5z=CU;C?gUlq7XU%M>Ha8uRDGlQ}Ei11(J}i zQl;8Nub9d}1qMP6$r0ea6Qx13p9)&$G~82>xK1kid={V0u&|d0Ew=E}jQUao^C|wA y5jN0;gHNf8o+t6w({~J0hWaK-Ma6FL4DRqG)Ed!*pEeVmb0Gv52@%DOq5Lo0eq8$i delta 401 zcmY+8u}i~H5XN(9@^XDm(iA~6v_WW5f({BDM5j6wgz8ceDP7c{5Fub2P)Z`=s9Wz3 zuoX8!kmBg#(4`i{zJw0?4!%3ycgOepC_k3XO~c@lc&)pIcHe$B4*`$PPXa$Y ztBx*UTLFj0s#B1fk}L1H@U0$%VW;b6`fQGhY*kZ|W6)`jeZmU4+7E0{79XHaPdI@F z^|J4zH3QJ^GyVk2h3{1m50#k@`H`Pa&AlI{G>PIE1x7VuP&O4cqX0RXbG6IB2J diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc index b98327a2cf2bccb932908c4e262fda06b4e7a193..59b7825f022de0a6314248eb802e880d2a520b30 100644 GIT binary patch delta 44 ycmeD9#n|zSk;jRbmx}=i@)k?PZsa+@!I4r}nO9+$ma+K?$I}AFsLi`7{g?qecMmlH delta 44 zcmeD9#n|zSk;jRbmx}=iqUNi`Y~(q>!I4~^o|jcpXtMbV$I}AFTbp-P`Y{6lJwOks diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-37.pyc index 86d3794eb6be3730732f0e5a46daec52ef0a252c..33977ec6dd50ef47c3d4265790b6852247ed5fc4 100644 GIT binary patch delta 8769 zcma)C4RBo5b>92-SF0b(wj@h7$SZ8wUinA1@h`|mHu66PjN z?P{Z#n$frS=iGD8J@=e*&%KY2zOSA8fmXM%wl?gcf0-wm58U|LeRa*^f&1n^Ts_zv zYZe~er&p!#`+iGdFcOPUHLO?bHF~XH*YA(D8Nt!Zj5+5-Y_2{f)~?sb=IK+7CViSd zU2ibj^~SznY`)$UTd>8W&(NDsdGux@deR%~pn8j5NA)_cFQocRJxuj5*B4QJmR?Qu zYGV=6FQ)pwOY|CQs4*5(!xCz^RIjCaE!R7ZC9$POXKWd@x9YR0eKs>%u1EDY{jyUc zcDX)BpL@y^TcNk>^XPY_K3`uzzpK=9;y&S1TeVdor}>&qTQ*$1-%e|z+Uz-`kqhfO zt-)MpE|puH%9vInonEXTIi49>);FLQ`j?1hD&~J;*=(Y8{K>SDkTODL*+vi*@-mdc z#)Y{k%_CT=mIU7FiJ;0u!=_>BMqeVIwjA$aO>LN4*Ft<%_T$mBfd8^kf zWWggu8mmralIgr|#Et&`GS18t^Iog^s&DRGMWxBt>r9LH8&*7-NDdH>Orke!=t=e8 z)%#cRnBoHcM-%D1QNf>vl3peb?W3Ws>XDjb%U95ptW3G`&re>>d*ZSojMnhKBIbtO1tguyW)%1Huf4$7emFcj^_=INxOdt}q1u`@T&;U`-#yw$%|4GVuJ`Qr z+~l#Qk2dIjh;U95o?$WC$YmisRucqjo)l*a2HCdzHoU&~VjLWIZ7{}r;$9OWGFim+mH)hj% zS!1-eXtt(dWQfzX^}Y4oL|4AQ>ec#|fJu$!M)g7cj43rDEb4?N8t6|G0b858RTOxS z;Y&OXZ?xP;RVSP>*&Q=ULpGrwvPFG7Z7kGpWLTP55G5FH2WU!u0qb?9kYQ#FnXnAk zJ|3e+6U;pRu&5UyQD?s~?bqJ!?bIT-5=6a@H<>nFmkk~@q?yWQD!JA}H>pftmL!mw z#Gvsl`;(@R#eP^j%P#k$#4C$X$qBIOyNYy8+4YG@Wu6LO;$V>K&093R`MTZHvPA1G zv0ni8r8y8^O4=)`$X!A}8YV@YNhhkWoalY~?OA8NVztW7ZtYG$@ZdngOjwqbyD-JI z00S@uo&Ldul^lpxxgn5+xCNbkfDZM;*^zk_+tHYl*`q1lFej|<6E!{ZJE5!Uws~C~ zlsI12N+X@HQb&z=E@2H!x`0|Npf8nnN!skew!1`+E4ML}%Sy|X2T7J_&^6UilI);A zE042kT#kFF-x0baj+Sq->YCFcI@I1dy9$f27(`XM1kefKSiAv*ho zLI{*sf&{kAd*x7|B5xWrtbwd9<7kGgQU_!J5^xMKuD1nlkwbAa_3WTO^AZBY_i#hV z8}f!V3iFH9j=ArM2D`2OYof86`rS45qQus6i+X?FymcF?9;?-}$1>?`LXYQV+KdJD zRKHXm@0Qw z<5nCCSXn)lv>b{a78^KghCMq1-A7(KE78H0?*TR%i3!B8SI=1jo z(0BjRrU59-2_8$xOe)jw_)XHe<=PYP48nj+5k$l8rg%wt5#I-z)6 z8aWw{zhJ+;><40P$zZ@{++ecSfFUJIQZ_Xh1mbbyNId>`>b=XK>#P_(>84^z3XKEt z_>a}gE86QTqlEf+#k@J~#99skAcj*@?sl?(c0+AgdFgU&hWrxX3_t-M1eB!Y5_@6; zb*xi&tvoIoZU3t8YS%P^lBbGL$*JOV8zFP-9OwoC`dn8KPF37J*GX$7zToh0cH`Qe zKH7ogx)p)XW5liMk#);fT}DO9PZL%`K7wK(Ck<@Ftsp503Hcm4m@QV#N6NQ;+s;bG zU<7!$68|Me)E31_8tL?yNMK6tbQYAnY^>5zXV-ryn(WVA^`bUy9Vj%p9u!vrW~p5p z=j&Iacmtpxz(?lzIqX_@4?1ualGOl2RCx_xC!h-O6#&u%SImVdeVM?~vZmaw-rG2D zGj!r=wHqZw8FyZ`{=KNe+#S&;&(rVNVkRnlmfCdn^BpCFi@21`d!k<1G}ftkJ;~1u zsKI!gE)wzh291si`Xf*OU|WlNZK&S<_nucpXr?>KUiI|mWl>hN=4eZnIwDoEmlwia z2(iiRU~c^lD!8Th$_iagBTkNACNlko<4sc<7zOKMClPbLxFZ2xH6 z9b)VARFtm(D&%HHZX#L6i1)058z@uuV>@0HYnahrf!kDqG3UZ`jwbu$H_=lu8iYf( z+S#CmaAcDW>{ZWP+qIGftB{Fx8QNhS-y~&L7E=~^1YBK!Ma%BRp00U#B2C@0{=mQH$d zddobPq7>{q=;jl_hvZjI2c4 z5D%i=luxSf?YXi&0^%^oRrjv=G8(kLT=`;D$Bi?^IeXKM+q?ysvV59g&t?hQ3u2x0 zqD>I&l31I3fFN35w!nWtE3f76se}b2ddaKN3RY~yP9S9>v7~zvCBNT8^WA`n3oAsc z-DQLaQzj?FhADppy0-ukz&`;XTdX>fwDO5`oHfKT5H>U3jAfUvllq)Sc9nSXRl?9Y z*)_il$6iAH_TBrx;SF3$CAmkfJJ4Ks2Sq5rsX|s|<`PMRWSqFU@}EHvNM>~-X}T-I zF3D#Byvq3~u`h>see5JowKoQyIf_eE30Du)rhNVrYfw)fWe*vy_12 zKJyFv(*q+~69hj|osRZo zxB3>ZA$&QYgD3rxC{+! z%Mp}b0>F&R`Kt6lv)G_c59B*I026q-B zAb%LJ3a}E;4d7Y8o01~rQFK>KaN4yHy_}WIKnV&O+oK2?HUK^XbQ6rNgeBtTU_h_8 z`1WDHHF&kJc=Ah|dK{6gkp4nd7amTAa&rBBs!OH{&w|WP!7!DRun_k_;4YME0k|j8 z1(%%Ll8F>R@rsopUG$^shZ7hT*1Ij;7 z*o(}5F%zRs_}TS$(Mde+$?_TXwAC`>6L9`90V(2tQFaxfer7d`2i0$_Bem<$smTaB zuToaNE3n=zK9@Hy`8qnM^O05-Iyri5SDTJ54Lkwb3+mRRvkH7-Ac*iu=f==)V0@kH zK@loDq2iU&l%G;H7PQhFM7hA*dl*zz*ljnuc2iyc9<;s_sa&6%<(@|);w~@8U0O{s zJ^mkRKBn4^z5D-9CjU{j4JF#gEsprH%d@InePJp%;5+tLhYo3bvD7`Aqk%G=aKK;{ zuoq&>$IS9QjD8Cc0o)9z;0=HMiQRu|m$r{p9w;3~cxca>hI|ym9wTt728<#1p@RG_ zf@VH~f@C@t-P9|1JHGg!zVc&rVdSWIN*%eaaTX7mD1hVVv-tPw+->`(l$jK%;-{*r zu&7W9l%<81Z0)xYE0oE~K|T?8K_+&HEhw?MutJJwXh2YF6@ayp1QGA%2PnY;D%K$V zQ0jl#FBDdJ3l-u~#|dpo=jL5>XnnSnGK^_Cu)9xTu@I#^*>s+AF$hD6_+j$vi%1iq z@ra^R)zOou-C)mwC_-(Y73`O&j#JAf4fbEA(Qd#-e3CF?_X^BmpTjxZ)p-1tzXr*J zfQ!U#NVeZg!LFGKA)in437_qp`jt2GA~pOOLx%+0?EkoAk$aU)}SigZ!~d;vgB@oQ_F`h22*Z zUYy-}uUB+`h!G*#go#S)`3bc;Rs6z|p`?+s5hq{_k>BZV@=-ML4wX1Fz4LxdHJw<* zs?2b)E@pU_6a6kdLT@tB=bbITYsp90seYr{7hzqFFQFeY<@mf6(>V0j7uU1a=j}}oysNDqmx1Dl4bFK0{3}XNBScD1 ze_48pWI8@PzfFCAqjo=ZworRb%Nn+vn6Yc}&;qmk$0^^-c)NY1RZ)J1Ybhba0#I1s!yB}9~edXotyovtO zr0#UkwYyoxi|@!6a690OfIa|)sbUPi8zoNF zQYej!8Le~tFnE(6jU0c!OymaSA<%TR0yz+m@3W-uZytFMI{NN^bVh`kO;nW=9!wlI z;>_p`wffPWVu5}7(HDekEDJCmvBdG_vN_kCgR&j1towP~r5icNM=#P@Hbyv0vN9uc zrXwLFLUKAf@Aw0X`A3-9B_y3E7!ve7K!mh_2-9Ckgw;!C?-05dPpygCxb2#{DE{wkYTEIigej;qf;LQH-u4!csab zm!ho!Gx|%dPT(-TEccsk?@5fPP;C{f7W=i_Pb;k<5|0mG5d-vJSjgqXmRw>f7_a7U zGfr4-K3`uLr4~0W+<_9(2q#Fc(oYf6JutVSeHq{nfGz-O)4jCec8pV92GD{y>b{P% zeRZSC>kFe)4S-~hkG|HWIUQE-oNsA&-$&>*j{b*&c-*NXtzAPB&=WMf6dU#{s_w}d z2Y(3`TLFB&u^r;7*xRu9Y8%fhxEShBpfWZ7T~V{Bm?u#qhb8*B{Q+UwQ+zoeB{yX*P? zm1RX@p*AVuX*15@(bPyhdI&U$+f9HHN|K&HlZHT&29o}1O4344I6ctNh7)SqL+^Kg zX?L|z+?u2N&*RRWd+*%W%rgC&^TY2sE4G)H2ORV-^w^3&{OYS`Di({=XWAYq6%Ng< zmBbg1)Q8S|uRcTFfL5xNY2{kQpeNL%`=*-pOQ%I>xwatGqE&`kwS{`Ewn(ees`VDF zX22I(q1A@kb~>~=ZSg6Gwpd?z(iI9)zh0}Leg*eeQU4MxK>YysS5tq9R!aR+eKp~? zQ-7&ecIqaFR;IVpKnD#h)5-~t*CbX8u8?;6mZ)8I2w4m0kU3yA{F4LB4 zEvFoz%e7W*1%20RZQ4ruZcs0ZGs2~Mon6^4IPZ5hUP?;1u%*)+Np+@Tsg78}FeCAJ zNA&n$V%R*kUiEm^h_!0W^TfIa!n8cmxE_(Rk=n9}Kv2kLv_ZxO%h75juu=7Te{d~h z^3s5zo0>ilNykmgbyPoLc_XQmp3s6$CSkd?m|+$XvRn~O+p3QEc5iB#r7KtE_A1(S z8BMg)pW!Fqce#b1{>f$PUEh zq4nye@~+I-g$d8Kjzj-3>78&*xhK5SV$wa~mU}1M!(u`l^~%Jty|l!4TFAhJcgk;; zOcNOyFau`kpmWkUwravh>zgM1X4zEvgm=O}?VK!OT7)?nm1B)h0&4m-0Qq85g?{iL;9du}7pW{ZyEe>NFEVTbO@z#h zupP*oscQvd277BFs>>S8gZrSH84LLb^#t=9@}UL04g#l$zXfEs30+1^-8P>u5ROqx zz~KoHYkpCY{mr6(ckS-M+MNV~F3S~-8yj6Br2v_3GKxa14-gQCL$yHS7@c- zCg7+lQ%y^&v)k)_EN+Ewuqg5tv{+EMqvd5su{CcSzU@Ktim(u#$Dw0ZzprGI^=q8{ zdGc)_pWg$#=ao65Ffl1Fu#EcFFOYDHjOdP_b4iHoyH#SukolcFqqp3!Gq`I4aE265adBtW9S*-hV zsmCK`Y*Y`YBIeM%43~r9fmqx|X~;g@e2+MM1g!YB;v5_09XUS(fbOtu2df^Uv|?b zG-1YkE*6C_a?TD%;!o zw5VZ^WJO1?lFi_dDrs9GwyCvk4GpZ#dEAz{?N#x%C)+V=1&m}`M)h!7#^;a!a+1&v zsm&|Dc3JLR=f|`v;Sb?RLJQA0&p>v0utIb*8*D5&3UVb;4Z7^p@ucG9RF*Ib6u`1$ z&4@~_dOGtNYRRowQzDsM&I&_bGpWU*rbWTPWCPtsXd$*}sUJ(nq&`ANXht-VL3;%kcWDNl|KS-U@he2C(8;5oluXj9&S1bLh~00r)cVS)!u&iVn}xq(kb;! z`;m(weU^~!QmZ;HiuA{Xbgz1*b6T}tMzh#PM>OcoOUrgE=;uCr+Myhm@*mJ}w3!r>pN_tv*o7Do%!uwli@ z7RYcM0Bl%gTJm@zo{VU4L3ta-S+OV8;D%)#_o4p)z=Hs10rFgOi#?@^CN`<(Hk=UE z*|lBYcJ@{SlecQ5mQ}(@AK`R1C-A{z&UPzdm4xl0fV7sU3kq*%w_dr&O($^wmi68{ zuwq<&XUn=Sgcz!9BW6S*w_4tm)Nu^sK*=-7endIjWYv72I=g%J6e|WRK*Q$vDNrk) zVJE7`*B+3ZOtB+A6Gc0$Ks(;HZ z^@v6hHl-S`Dc!*lnHA2e--^}D5 z%_g<)+GsF`K0l`A3y0};5)OA~e}3(M3V*##^MLy4j&&PY#kM%cW%9^NQ(<;-tx#uVoJr>)W>H zI=KL%*jdK*aMtx)dJ;A3E!hh_cZuskMt%dJh;t@n=ZykFd}u|~fH{!;yWKB|jZElE zpjJs>*72~N<&*>RJZ6ek12LU_c~7;|zXWT9JfN%_Hg90Yig;pe`giLmu9Gq;XG$HJ z0#)0j)b70<)kPa5Y5Ml;y?cXV>C4z)ruyv1ssdE?!+rJQZ1&&wg`D22Fjud3?{8W3 zMJ!n;pT!7FPxh!g_SbLt7MjS&mK&w9T!f}4W>ASNcc6{jY{bTO$=ZN_%P*@p_Sctl z4Dlc?8S+W>(f+Hpf~*zbC~Ds+{~80%fm9)T7^*ogV^rJE-0G=NLpf-i%cc(WxH7O| z`R4@o?~ovHL2QvOj0pmL5^_jIAXr%-%qtjWS-wpz2oUMF9h*t9wOZbofsN>rMYZsE zvEm+p0>P-836|Q~FfbA`W^$T*9e8g5uLNY?+8z~ z@#xWF;lJf1Cqzw}eg4*GU5!hz159DulQsuBHU@>|*Ar1HmlA`0^2h3qL$#TLqXhO_ z1S~J1=uyL#>B|`Y3INNw0xfo1KTF8oV3is}5lKhD^*WfhJn>jUr$C60T`p|I$^sJu zR;8*vTq)kkwjG{y)`H#f(kKN@x?l}9wHkdv4;jUaN0wv|5XU{O#+Ft?{%n@ccp2(V zBNd7282={Y%m^wi>RBQ{=TIae%vAm@z;^&3isd5nl>dk>j?wb4WzF7ZUUN8l9rF8_ z{W-ut0dT#|rs||iFC;D&t=2Zr8O6ktbOXT!`BP_hDpD=3WE1dU-FAR$2+Rg5p5n|f zS6dQ6U~%^S{*db+@L4ik_EYxJ@H#gpasgkyhi(snIm8cRw1_zDzBzkt;JoP1Ym7Yt zaYDWc07CLr0(3C&T-&61- zjsWkY`yc_!o9rLfqbAp0&GOGMo>Sdyl3tEch*F_e4?izzv;Q*ec3#iN5Wy6i%OPsf zG2BicOC)3(6FEv;&sf!XFDt%99Z{Vldorx$hp}b@zT$HWC zEY~cxXrX4AJvSz{6{Eif0G(M;m?M@43&O6MN0aO)BiFctn52XHOZr$MTEzW@lFfK= z8B59T`_-U~We_#!#z5ES6kCn`bZ|F~$}#}l$mn`ZUSY~e40kkmqb(5Itd}bx)KSL_ z+wa~60zz8IjdevFSXHTrH1wIQ04Sfj+`LO&9b%PbQKjK_j1YCO!`HA{) zwD!7T43@wwY{78a@&bX7dpwpJu#4pOKC}|G(~hUG{EJ3ks~0ur0Md(_WmI zS@68seuRDeiKHCil)DG4vtyy$%4fFVOp^8p8ubIPmimFjhy6BMFpwgdqz5tbSJ`(m zU9LcFXW^Jb0D(`xw(0K_>7BeyTwoIf}(Kn1+Befj8UH8m*KoE$YxIU`K zDWj*&RN9nh!0#d=7%DN+{q`W4W15Qoxl+hlK}RaHub*ykT@FUZos$6yPX7u5V217r zraofG7cjtzMpmBnzVoW_Y->An;Erg+MteJpy*3~NaAr%@s8Pn0fTEP4l{S3zjXwvMPXT0Ja(4Wf{850YIgIGVj4E zq~FOMUC>E2VfZWDPQS+=2rTfI`dxwYK$E{w0z-DvCF}U3b*>EectZ^&D**Be%Q=cX zg^4=>J_~RcfDYgX;Mjc+T3jj)p_LOLSYdhK2?jrDS)M@|Ne#&uaDoQ_Ie_O*T+%Oz z4tXyouz}^XFQ8h;pOVSZ7wZ2BRwE5E1h>evUSNRJ$I_q4@ag?W2RdV|yoB~$M|UMFgm=ZWQFjS4>T-ONhh zmJqFc;Ve5bRt5T={HWzUO0V97hCTa7STWZUsiuO)a59}9GMF+#ak$Iq$4)Q(7Z7qC zktH`EQ*i{l_^x6FGU4z*+DuEG-ZY({`4|AF%w1@q2(f(eRA%U>?Tn+L@(O|($1Z}0Xx>HNg@G>r ICI0&V1(*QmLjV8( diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-37.pyc index bc86c72c52c60ab59942a1ecdb6bec5952263997..c8c5203590e530f30cad7e5be6bac9b9029e3de8 100644 GIT binary patch delta 993 zcmZvb%}*0i6vcfGofZNiMr#P#nyQerni5%oL1+usk3W*#Mz-+b|&uM%0Gd)W#gQw!DyVMznnSuwsYT^+r@ddIM3=64GndB zoXc2iN^jKfczo()#kg}Schhc^k^a=e;RTW$N*VDvHOEb zZ!iJf3+x9ljPOn=WavhoEdIHrL%xARKi_T%%=ST^1(FWJ`>GE-2jib-RNzemS)d&- z9SD|7)#mhqmQfYwgm>ZJgYSW9rhKNJua?fEbYd4L9c3@HzLy%Wpxs;6$kdAl&G1+x zG>a_gKHwe*EwljCI}pCSW|fsfNh9|F?(B7cW>0z5;#fx2N$kxTwEJD*o7N}XS%jR^ zwSsEWQ~c!r2Ky07OY9o&j<$z}oSv{;jq?!tuLIS$3^l@+qER^usn}c5iWGVcJ?S9q zs}99syaKX-VrSahWcHB1==k<~UAWTO+Wi2IRN0&zIsKEdejezGv7|lP)g~QZM)@tU0=VN76han~X%W5S8$JHW5==xQ zJQL2cnzRnh#)a&LZ3bVipcZM$GLp5FcV%&zpWKZ zmXH)fb!QHHXqoTCF0oC1A>J*QoK7n9=kYjO=ilRjGZ$gF|DNjFk?bG_p)9MY|$2oYKW>Lo-VXE`UIII@OlynE9`dJc-*?7^Ywgj_2S^+Na3WGAM2%@>i$XCihvxCF6by^+E@XEKL&}5<54$*tQ-W7~Lhl!R5 z-;^9yo7SLNUZ`HPZNbVy$s5x&&bPXP!4HW4eWBFLo01z*v^*z2@(CnkO!yu1woxoO zLeVVUt2ySQ6~3Lk$Ts*us#7h?BvtrQD#h0Lk5uUF1sLAHr#kj{Edh%F2fQx7hWZS6 oE%U}h)<=BwRv>Nm(Ce!M6D8&oXx+yDRo diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc index 1aa00836108065a1284ae83eb32e82e13c98dc5b..99b5f86c135e88fd2d95f54a2bff863ea656360e 100644 GIT binary patch delta 2427 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 delta 34 ocmZn*Xba$R;^pOH0D`FbYB3vmJ~4A7m#61tl@yvRW@AwS0Gdq+R{#J2 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc index 0a8401a85338542fd9a5099a8e3f864e154f5dbe..c2a8402df1be2245d626e5a3b3ca87c344cb4643 100644 GIT binary patch delta 344 zcmcbhbU}&7iIEMM9HUB`5D= z5uALESs%<(nyknIW0gQzAQcW^*+3K>+HBfD3yOp$GqTA~KFewZlms#%YLq6IvBAta z31)5n#WsscToR}wiX}BCqZmjQWfT`lfsBxzJdstHQE~Eq&Qfl9kbokH;0B3q4&wUG z#AXWO8%_4-HCNOJG1)+b6OhnkDKY`Etw4k&h)|upoHv-!XY+4f9ws&!kcjMLUI7iD z>1G0o{K`OqTP#JX#U-~GQ;SqUHcYM*P#4eyDRc)Bt{}o=@&*AfZXXcSA4CLBW)<`X E08KVh9smFU delta 344 zcmcbhbU}&7iIHA<7q*kIOCC2O5)I0S@Q%z1;nKbH-hV7&&DwtX_I+~hV-?=;e+5Yj{bI* z-XDSoLl9?+i;GtAk8f{E^Nly-QX%6|o*7^gE`Z9U>^&e9F*D2QR|(IuT$abbi*W$T z*Rz^;GK3N~SD41;3Da4vFoV?zrEI=X#uf-O*+OBKSiV^$REUP%lUO}ZGn+ZtBDT06 zgvz-p*1#J3RjiTwXoNY;Az0aSf{iT^s<^F*C2(7UVzV<%qsrpyTVLDlUmln-BRpF>cEI24-MQ)?ui?`&pO3hUX^khk5eLle7Sh_3Wq{*qUM6Y|UT%R!|Iq+v_G3D@V3 z!A99{83lM3odqAmE3&$9SPcj8%9PD8AbY3U)NoWjP;>_1D|u7#Wq@mP$Fv{RFj0P{ zR09wtmz3Sn!1MTY#R({uA5M&K)7m z6~ZOLWx{tH;b?IUA4-7FCm@aB!-Y#?l;G9m5W?nqhweHTAIqQB`vEL+-l9Gz7$xIX z4vS9uzr@n-=0cBwiy>F6k7S8d4#IGa773H%RdZ;ZMQ_!Y#DsC+Pm>VljT$ za0CSGZ2TxvR*38mFx`9qayULamUgBc)fq=eVFw9_C_L zBl=cZ#!1ReV<~DFZ#Jd#l46`@BY8*~K5U7O;MG(*Ejk^4_G7nmYa#`OW8LjiPq%x8 z*x_mG<$e0vmKGb$ylu4S9;tUHPH}mRO8WbhBZd&d_g$s18_&8tk;^Ei5ZVQ^E|#a? zhuy*m454G`mn9Vc8^J}OK3fctzJ?IoiTWW@pT%@{8jRs|cd2e1zv-YHaNh>wW3v52 zP=e!em8Zt2=XS|JP|O+}^pwDDgw|~_%J7x4jkv2dqk?LXE)tXqE|8>*S0Ct+f+FLU zC=DD>*=Ux6#@EfHC+RT(@3!W`E!oue23UTjNa{?a@>FtofgT44RI#L-9mdlvC;cQT z_i_m1BJ+3iq_;?UPFY-vOvXa-YQ0jRazW)T$}M>^l_e^2&~XZitTdOxdao}aNZ}nt5ONgU7pCH5#ZsYvUR2W6EGsi{m zYUJHhUPXGf!Un(8!+(c^z0yOn(&)nafEWyll0@4sMH6T-Bm1NDN7)ypA<1M&#Y>$9 zupQ&Q{ZNfNy!pm3jdwaSI@T{HR0)^(MG M4!3r#)PPp=FR5D^T>t<8 delta 1824 zcmZ`)YfzMB6#mXGyDYF=5)4Iw1$TiJH4#)$5Li(Ig%n8H50qBkkE`tBw`&HYX-U$g z-8?^#nh9`N_m?_Y&Cm~t?UFj zf0@KqvGPudmGd0ET)-;iLRKj|xc_k$&Hd5BznJMOB>NhzM0XoZb(e0@NiRfTh~U$w2_Cuy2|MYp~wB3u^GD z^*%g-H*5=GKh8+OslMPI6ARuV?bU&_Md}IJD}f|tHg(LvCYudMQ@UXjKA)Or>qsi} z`IOc+Uz5AR;`3O%iqF!j_*~58b6M&=s>SBDhvE;ZS!OkdUxvDXz=O9_^No!lN!|p^ zON-Y>ff=1?W3WwIZodrBjhX2mK$kY0eqIL$@atJSphqiu#G!*DT35y(z?a(E%!>e5 zG{@YdI!M&Qvh@H4Eiz|Z59{!7!4$OQeFhoYVBSP7Cth3hI&8-0@;jjeLks#~8&7e< z(->RW2hZa1!YX(Mr#ZTzQ~Szc1khps;s$Mg(Fud`M;dnkO(lon3$4FoT$gf*JQoSh z6I>wZ=im=jp7JSfZQ1CJb zyFvZG#_APHx`e%}3a8&9^C|)LQt1GHbeYFj+}gH5X;s`lg)LE4kIE06TJD&6jgm$Q z{vg;+Fh&sbA50|cE{EB;tNa_j5v3LT1A`Ax;WJ)>P-?O1sqd*D%`YiV{-arXFE|?w!tT zcnc3ZT>&y8G=O&5Y6#=)-@|fw1WsX2^-Q>h4b_P-j$PHshM#%yhxkeLcX6WO_tZto=0QAE(^eo7k5MFWGPnGp#brfHs%n=naaP!MY8wRwzXxQes&BRC zwJ`uc;kI=}dBfbn3szIXuLMp4(%Ehb=t`I3k0|td6_xl0F8dT^4ehBFH&vT$FmZ;* zw5r-aA?iMb{w5HuBCy)EG|E7N2NQ^}4trf$a05qNFNcXs7nCA#`}zbik$RTu#XP@} zb&iAI==G?4+xT39-bCs~9A&+`m8ntmIRVeCPl4;2uI?qUpP@=pEx=DWkNpil+K@JJrdo6D|M$TUd9?+5c#Nb29l`;}AKvysmoOx@>9vnFK1jWTU zcev#@Hn~YiwVm9tJkf3p&^bv4gj$s3Ag|N delta 35 pcmcZ=aw~+#iIF+PDk(JC?8+>v4gjz|39JAB diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc index 8b6c47d185a2b8074d666c0b2f51fd69881a5a44..bedfc41d23f7fd3bfe0a03756199e9255ccd25db 100644 GIT binary patch delta 656 zcmY*X&ubGw6n<~^M|L+m$r?3j8xgG)B{xB+XAv)Y(L)-G0VzY3Mz%CrYXWZwQoIzz zKrTfuvj`pq*?+)8FW$X)^&q`@6g-G;)?ai6hBuGzec$)q%zpQvE3Zo#0k8DULjUJ` z`Na>^&LkaQ*?d%d_g^H_9|%CO1=|sysQpZAImT6(qppxJ9#wK2bx2TU6|^9Kbd6)D z1=>m1$x~t=hPMffuN|d$b`xxCl?57px_SNok9;N zG*J$^N&$%$P}P#paQuMq2F$SE)iIl@nwSkrigTeQ`7<0+nXQq`@xIVCU8lOKD?i8K zC#q?wDkPhr<)p!Ni8(>?uW-8WLe>~W%rTxK*qxm;r&N$5f(pyBq$EF0NsbKbWWqFU z%t&EcOqJLkjuSJ-f{H9=Qu~izgS7ciZund69;BiNCVp8YEr^Nuh;7b6j1EF$zd)8tHC9JMzDo-1yh{p{fC{NnNl9L&Ei j@8WjRztBQ_T0B{KC-8Z(a_Jf3LGkwTI^xv=J0bo8DK(~- delta 631 zcmY*XOKTKC5U%QZ?9A-+?zrl1lGPwleB>DQ>OsV#;De2ZC}NsKcX1?}i5jV9k-aU5 z3j<4T_WS`s##2sS%|GzsLGYe~=+)}Q2kC~Uy7=n*zN+rs&Zr}=N*MvKm3L=XKYx(l z{9x_HM%v9bFO|RiH_6}t0SLPAEaDTjpNXzxT!jVd3i(@$B&gB?a$2CB^Z|KF^hEy( zf$@~Xm>}gkj$IpP{t$GSRVY;MP`qvEh$0gxkDNjvEQ5lZa0~7Ng(fUOS1F)@U~(%^ zwE|;&`H=7$jPZU)$804sRkjsVTnH`6A7j5i%}SC5t_oe#b*h`1@(b+mQ%y@%A=v~i zcN$z*HwnqV;_1kR>_{(SjugS}tYMBS6%>e|!f9DDB|k<BuyREh25 zFfo&~RAezbwg32KNSpuU9_I%$?ZJeknNd~pT433?CMsq|Z(Ufse{{Ji*4<-;Sw`$l z4cb;&b#r`Jmv3{7{W{IINpA3qu{YP8u%oefJMY_Yp?2eyx1Fu$quK9yHn;0u=g*K= z+xsW)*l&R`Zx?GKz*t1+^R0;iCgsoeBZ2efz4&>wCtU3A#Rt$ YGw%fs%cXO#5hvxx^DBr;WqmQk-$M_fiU0rr diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-37.pyc index 01e28db3c1a65db9ef1d0c007a55b2c17e9afd82..a918a8898e29bfe778736f40e2577a1e03a19d29 100644 GIT binary patch delta 5023 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 delta 5011 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-37.pyc index e02d0f94525aa46e76ea15478ebb32d58bee2efd..0dc1d39664da45927b4d051fd65159dc7a6be133 100644 GIT binary patch delta 2327 zcma)8ZA_C_6!w<#Qbe>Ote^rGboe5z0y0z(T%{n$hafuRL~P3|zFG?2f+#rIa84a= zY&*J5ol0UR`v~IJX|hCRZp+-CE&I@9dAGzL`?0uW$&&pu*|PiGw(6oT_Q!M2J@9C3b28PY08Aa4-FqKE^si$1;jdiI7xHyh$v)kUWkVY%TpUX9a5}r`?v~ z0b6?Vf=UDUXrtYp&;U{cc%end?fFS9VrwujUyRkneSACpVm~qywhh*;GCmvf(*a3< zwKSOZDdY4{RTgc|4ho+?WN&8uXY=PWWeEh9Qt`au;&mWR046{+a~tRsfDeG|s7ly) zH5jV_Zu)!Px8`O+($0dXEW02i?n#L`TXGISpi_Wh-rlJPcs~vwV&Q1ceD)k&$$9&( zoy4deSa?b1>mXg2?^<-%BtL|sM_9zsVZh5!jol~6TDq3AkaV@w1{30TGD-K}1CKI5 z->L2YEAc#ebNlTw4Cy@f0YmWHAVYqEk{0-E@+yz;H%KE31|QSfetIVFYP@`HFGLy5M}1HHWGe9x>f}t^2Dx z`dZF{Jr51<>w=00`ST762Oo>N3!(s(NqoCl?l1>`QLO4zo-7t#MvaAP=DjwNRVnX> z&NE`PKpQ_q#|!hGK-U;CU7l{k%(X6mxPjdCbKyRABD8VwezOZbq?-C-9bT>5!@J~; z9}x==pYT^eNBBEIquYdr;@GMOJbpeznM>1Khr&#YlWTs>6V!Nw5$6bYd%XVWUS5Oa z)kJT!!djTV!{$Ua6lcV4SZE7`hC(No&R}ea#+UUh34oITC=+1B;bI=2CI*1UUkAHa zfT(LZeoQ=Qm^-=N&flU|FT*0bF%#|wK%yd1gqE`%ao9^r81vry!a|+BjUuQ>`E~?-> z_~G`sD{qS#tyj2`--V!ww?X~=Fx@25oXQT; zPZg_}kL>PL)! zSeeGQ(T++NyDW0=7icZdrn0I{>=K=7zMOyRD4HEsxuSt9pzU66Y>#uR}Uz1 zTS5~xDI&xfH6OC85&CA$kL;Q-m_gT94<$_qEfJF($EaQL?rpU#*3Up*1AGqn0uIxz z2yz^`!aoQLn;dJwPvKX{R9A;T1C4bm`;z+Wc34VO)mhkRe0lWq{3U~u>0x%-LVAXsSoA&@?fH;5!@CiVs_%f(?0OI9{ Ro?iz{5kNO;lWAJR@V`URGDH9X delta 2327 zcma)8du)?c6yNQ-uN`Ah#%4EQ8{L5MjkU0sgKcb3+P&Ng+XxaIY+oNVA9P*0?U)X9 z3JNmNX$}%6$Ve2Yk(X3V43B{(=sy}CkeE*s{_qcjiHU!cXgueBEns+r{_(r#o_p>& z=bqQs;}h)o1e@;6%$$~jzfBX1dOn-(HJW`x!SJ@&j;i=hXr62y93m&bK5Ei{OBz3c2wqi(+K8V9VLaT=C(YgG{Q&Tf7J?xrI<_ zjj{$fZoO@6Kqj1Mo)@3Y&1QwQB;qD85)=}25R?))` zlN$A_K{du#<4(@t`NU-XT!BCGPqR?`oq`%eCP~T$-iZsZ1jRm^b-`crSFvtz*sM8y z#1@tmqVfp5u*qi2@DS-IQ0Nwn+sdb!tagUNWzYar_F;TgztpRlD?8xNg#}%8Mh6nVLnWU57BVAWHH+fmrLHg zt0yz5hcvt<;#d{$Unhce|2rrt zFToFT@Uapj;4R%{6K)9OX%8qOyB^{4%aFCiXBAI*guPeb#F9NvsBI5CTXrQ~WGNZ$ zhlXj;-d24tOmoSdCyy1|1!l))3*}nx1fgj+L>xtU^kaK2oO2vu-SOt7hYa_!b$@jy zv*oCG;i2w*Tj6?;zi=NKJdbr3r2>>vxQfdiX6Jixm1pp5T=+`ptdtAywTY-o@jmK2 zEj1AK^ZhVhS@slljg}fwVw#Z$A|btjT<~kXRBSA+Zr^wbTp3Aj;LS{xJ?BRsHE4Gi%&>5_OF1zY&RyW_U{K2|LvE6iAW zH@LgHTi1GeyWH#ASFdsNCQ_0%yj2Z_^of@$Ok&ATxvcQr%GQ>XC^0OR>hGa?9X9D3 zyJlXN_@SfZFD7XqBGibXmvEndf=3C3gAI0e3eGgGg5Mj;kg_x$V<+KsV?ma9Z>rvY zVoVN+3Hf*9O{~=Gt8VpBjKx5c&Dyl^V1IzCzFv%$s37V}O$rSJg8{CYh7=xF!$D5t zSCe=&62f`@nBn3F=FCMibDYn~)GM0Nuli!Vf-H&;$T4D?d;|Rv6|3Mh@%8rk!uh_L z9KbQ1PyWt2jGF^k^`i1q7(WanYi{F=R$b2Q4@nRwJYD}-r#mssxojW&;%Z@Du(@-Y z2Ws78|NFosTkubJMfDqa?GD?0JB@TuX5>^(CiPOH_sZ#d0zW6NpFn}mraTse?M+U0 z5n~@hv@{k&Lvs(i07si|;g^+00kllwceJjxFoV9M{4&86k%Z@4Md6t`U4i2JgeFPzb zegY9C$~%_`#t4AmZGv%v2?UL`@{edUNpOn5L|`U}6NnIBBr2VN{N?05zfLe60dBNs J!_2i~{{cazF6jUO diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc index e2cf888fbc8eb9421c15cf6bc12d3c20a0fe2c64..01472237a8244f8c492f579e90c20dc16c39afff 100644 GIT binary patch delta 5294 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 delta 5055 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc index f9b52fe63b13e4f8036c7992a507e561168b460d..1a0d50b24121024e3609bab3089316e6733d45d9 100644 GIT binary patch delta 40 scmdnNyn~s?iIF+PDk(IXT+V32S`3l`0L2;!egFUf diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc index 16a493d2eaaaaa331e3e2f786884b46e8ec08d63..57975de69e791d691030dd216af122be9f3a90c3 100644 GIT binary patch delta 35 pcmeC>=;h#X;^pOH0D`>560sY3<}-4n6jtU{7^Y=x-pm-q1OSol34Q=;h#X;^pOH0D`FbYB3vm<}-36m#61tl@yw6-pm-q1OSl>3331c diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc index 29b1fe0dc780ceb45dfcdce2e9c65ee3695eedbe..b841ddc4e9925b8aa0152dd0cc385c232beeaa9c 100644 GIT binary patch delta 37 rcmaF4jPd0%Mjj_#UM>b8$XhHCyOC!xD@RIUWnP70TE^z>teboR*`Ew2 delta 37 rcmaF4jPd0%Mjj_#UM>b8h?=h!vyo>pD@Ss9dR|sZp~>d$teboR*t`rI diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc index 938f077710ae5b3f31ebcc00becd8186a97d3dbe..35649cdd75eaaa34a2bfc183e9c19e7a00b0de14 100644 GIT binary patch delta 35 pcmX?AeX5$riI`e$3T*%Y delta 35 pcmX?AeX5$riIF+PDk(JC?7`Ax2>`c73Sj^M diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc index dd9bc35504abe2fff5f3389d7ad118918f92fb4a..7da0f4b60397024808499c1abf098e251aa204c1 100644 GIT binary patch delta 10883 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 delta 10896 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/database.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/database.py index a19905e..b13cdac 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/database.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/distlib/database.py @@ -20,7 +20,8 @@ import zipimport from . import DistlibException, resources from .compat import StringIO from .version import get_scheme, UnsupportedVersionError -from .metadata import Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME +from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME, + LEGACY_METADATA_FILENAME) from .util import (parse_requirement, cached_property, parse_name_and_version, read_exports, write_exports, CSVReader, CSVWriter) @@ -132,7 +133,9 @@ class DistributionPath(object): if not r or r.path in seen: continue if self._include_dist and entry.endswith(DISTINFO_EXT): - possible_filenames = [METADATA_FILENAME, WHEEL_METADATA_FILENAME] + possible_filenames = [METADATA_FILENAME, + WHEEL_METADATA_FILENAME, + LEGACY_METADATA_FILENAME] for metadata_filename in possible_filenames: metadata_path = posixpath.join(entry, metadata_filename) pydist = finder.find(metadata_path) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/locators.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/locators.py index 11d2636..5c655c3 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/locators.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/distlib/locators.py @@ -255,7 +255,9 @@ class Locator(object): if path.endswith('.whl'): try: wheel = Wheel(path) - if is_compatible(wheel, self.wheel_tags): + if not is_compatible(wheel, self.wheel_tags): + logger.debug('Wheel not compatible: %s', path) + else: if project_name is None: include = True else: @@ -613,6 +615,7 @@ class SimpleScrapingLocator(Locator): # as it is for coordinating our internal threads - the ones created # in _prepare_threads. self._gplock = threading.RLock() + self.platform_check = False # See issue #112 def _prepare_threads(self): """ @@ -658,8 +661,8 @@ class SimpleScrapingLocator(Locator): del self.result return result - platform_dependent = re.compile(r'\b(linux-(i\d86|x86_64|arm\w+)|' - r'win(32|-amd64)|macosx-?\d+)\b', re.I) + platform_dependent = re.compile(r'\b(linux_(i\d86|x86_64|arm\w+)|' + r'win(32|_amd64)|macosx_?\d+)\b', re.I) def _is_platform_dependent(self, url): """ @@ -677,7 +680,7 @@ class SimpleScrapingLocator(Locator): Note that the return value isn't actually used other than as a boolean value. """ - if self._is_platform_dependent(url): + if self.platform_check and self._is_platform_dependent(url): info = None else: info = self.convert_url_to_download_info(url, self.project_name) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/metadata.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/metadata.py index 6d6470f..77eed7f 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/metadata.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/distlib/metadata.py @@ -91,7 +91,9 @@ _426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', _426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension') -_566_FIELDS = _426_FIELDS + ('Description-Content-Type',) +# See issue #106: Sometimes 'Requires' occurs wrongly in the metadata. Include +# it in the tuple literal below to allow it (for now) +_566_FIELDS = _426_FIELDS + ('Description-Content-Type', 'Requires') _566_MARKERS = ('Description-Content-Type',) @@ -377,8 +379,8 @@ class LegacyMetadata(object): value = msg[field] if value is not None and value != 'UNKNOWN': self.set(field, value) - logger.debug('Attempting to set metadata for %s', self) - self.set_metadata_version() + # logger.debug('Attempting to set metadata for %s', self) + # self.set_metadata_version() def write(self, filepath, skip_unknown=False): """Write the metadata fields to filepath.""" @@ -648,6 +650,7 @@ class LegacyMetadata(object): METADATA_FILENAME = 'pydist.json' WHEEL_METADATA_FILENAME = 'metadata.json' +LEGACY_METADATA_FILENAME = 'METADATA' class Metadata(object): diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/scripts.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/scripts.py index 0b7c3d0..8e22cb9 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/scripts.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/distlib/scripts.py @@ -236,8 +236,10 @@ class ScriptMaker(object): def _write_script(self, names, shebang, script_bytes, filenames, ext): use_launcher = self.add_launchers and self._is_nt linesep = os.linesep.encode('utf-8') + if not shebang.endswith(linesep): + shebang += linesep if not use_launcher: - script_bytes = shebang + linesep + script_bytes + script_bytes = shebang + script_bytes else: # pragma: no cover if ext == 'py': launcher = self._get_launcher('t') @@ -247,7 +249,7 @@ class ScriptMaker(object): with ZipFile(stream, 'w') as zf: zf.writestr('__main__.py', script_bytes) zip_data = stream.getvalue() - script_bytes = launcher + shebang + linesep + zip_data + script_bytes = launcher + shebang + zip_data for name in names: outname = os.path.join(self.target_dir, name) if use_launcher: # pragma: no cover diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/util.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/util.py index 0b14a93..9d4bfd3 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/util.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/distlib/util.py @@ -545,16 +545,14 @@ class FileOperator(object): def write_binary_file(self, path, data): self.ensure_dir(os.path.dirname(path)) if not self.dry_run: + if os.path.exists(path): + os.remove(path) with open(path, 'wb') as f: f.write(data) self.record_as_written(path) def write_text_file(self, path, data, encoding): - self.ensure_dir(os.path.dirname(path)) - if not self.dry_run: - with open(path, 'wb') as f: - f.write(data.encode(encoding)) - self.record_as_written(path) + self.write_binary_file(path, data.encode(encoding)) def set_mode(self, bits, mask, files): if os.name == 'posix' or (os.name == 'java' and os._name == 'posix'): @@ -582,7 +580,7 @@ class FileOperator(object): if self.record: self.dirs_created.add(path) - def byte_compile(self, path, optimize=False, force=False, prefix=None): + def byte_compile(self, path, optimize=False, force=False, prefix=None, hashed_invalidation=False): dpath = cache_from_source(path, not optimize) logger.info('Byte-compiling %s to %s', path, dpath) if not self.dry_run: @@ -592,7 +590,10 @@ class FileOperator(object): else: assert path.startswith(prefix) diagpath = path[len(prefix):] - py_compile.compile(path, dpath, diagpath, True) # raise error + compile_kwargs = {} + if hashed_invalidation and hasattr(py_compile, 'PycInvalidationMode'): + compile_kwargs['invalidation_mode'] = py_compile.PycInvalidationMode.CHECKED_HASH + py_compile.compile(path, dpath, diagpath, True, **compile_kwargs) # raise error self.record_as_written(dpath) return dpath diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distlib/wheel.py b/env/lib/python3.7/site-packages/pip/_vendor/distlib/wheel.py index 7737223..b04bfae 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/distlib/wheel.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/distlib/wheel.py @@ -442,7 +442,9 @@ class Wheel(object): This can be used to issue any warnings to raise any exceptions. If kwarg ``lib_only`` is True, only the purelib/platlib files are installed, and the headers, scripts, data and dist-info metadata are - not written. + not written. If kwarg ``bytecode_hashed_invalidation`` is True, written + bytecode will try to use file-hash based invalidation (PEP-552) on + supported interpreter versions (CPython 2.7+). The return value is a :class:`InstalledDistribution` instance unless ``options.lib_only`` is True, in which case the return value is ``None``. @@ -451,6 +453,7 @@ class Wheel(object): dry_run = maker.dry_run warner = kwargs.get('warner') lib_only = kwargs.get('lib_only', False) + bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', False) pathname = os.path.join(self.dirname, self.filename) name_ver = '%s-%s' % (self.name, self.version) @@ -557,7 +560,8 @@ class Wheel(object): '%s' % outfile) if bc and outfile.endswith('.py'): try: - pyc = fileop.byte_compile(outfile) + pyc = fileop.byte_compile(outfile, + hashed_invalidation=bc_hashed_invalidation) outfiles.append(pyc) except Exception: # Don't give up if byte-compilation fails, diff --git a/env/lib/python3.7/site-packages/pip/_vendor/distro.py b/env/lib/python3.7/site-packages/pip/_vendor/distro.py index aa4defc..3306163 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/distro.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/distro.py @@ -17,12 +17,12 @@ The ``distro`` package (``distro`` stands for Linux Distribution) provides information about the Linux distribution it runs on, such as a reliable machine-readable distro ID, or version information. -It is a renewed alternative implementation for Python's original +It is the recommended replacement for Python's original :py:func:`platform.linux_distribution` function, but it provides much more functionality. An alternative implementation became necessary because Python -3.5 deprecated this function, and Python 3.7 is expected to remove it -altogether. Its predecessor function :py:func:`platform.dist` was already -deprecated since Python 2.6 and is also expected to be removed in Python 3.7. +3.5 deprecated this function, and Python 3.8 will remove it altogether. +Its predecessor function :py:func:`platform.dist` was already +deprecated since Python 2.6 and will also be removed in Python 3.8. Still, there are many cases in which access to OS distribution information is needed. See `Python issue 1322 `_ for more information. @@ -48,7 +48,9 @@ _OS_RELEASE_BASENAME = 'os-release' #: with blanks translated to underscores. #: #: * Value: Normalized value. -NORMALIZED_OS_ID = {} +NORMALIZED_OS_ID = { + 'ol': 'oracle', # Oracle Enterprise Linux +} #: Translation table for normalizing the "Distributor ID" attribute returned by #: the lsb_release command, for use by the :func:`distro.id` method. @@ -812,10 +814,14 @@ class LinuxDistribution(object): For details, see :func:`distro.codename`. """ - return self.os_release_attr('codename') \ - or self.lsb_release_attr('codename') \ - or self.distro_release_attr('codename') \ - or '' + try: + # Handle os_release specially since distros might purposefully set + # this to empty string to have no codename + return self._os_release_info['codename'] + except KeyError: + return self.lsb_release_attr('codename') \ + or self.distro_release_attr('codename') \ + or '' def info(self, pretty=False, best=False): """ @@ -872,6 +878,7 @@ class LinuxDistribution(object): For details, see :func:`distro.uname_info`. """ + return self._uname_info def os_release_attr(self, attribute): """ @@ -963,23 +970,30 @@ class LinuxDistribution(object): if isinstance(v, bytes): v = v.decode('utf-8') props[k.lower()] = v - if k == 'VERSION': - # this handles cases in which the codename is in - # the `(CODENAME)` (rhel, centos, fedora) format - # or in the `, CODENAME` format (Ubuntu). - codename = re.search(r'(\(\D+\))|,(\s+)?\D+', v) - if codename: - codename = codename.group() - codename = codename.strip('()') - codename = codename.strip(',') - codename = codename.strip() - # codename appears within paranthese. - props['codename'] = codename - else: - props['codename'] = '' else: # Ignore any tokens that are not variable assignments pass + + if 'version_codename' in props: + # os-release added a version_codename field. Use that in + # preference to anything else Note that some distros purposefully + # do not have code names. They should be setting + # version_codename="" + props['codename'] = props['version_codename'] + elif 'ubuntu_codename' in props: + # Same as above but a non-standard field name used on older Ubuntus + props['codename'] = props['ubuntu_codename'] + elif 'version' in props: + # If there is no version_codename, parse it from the version + codename = re.search(r'(\(\D+\))|,(\s+)?\D+', props['version']) + if codename: + codename = codename.group() + codename = codename.strip('()') + codename = codename.strip(',') + codename = codename.strip() + # codename appears within paranthese. + props['codename'] = codename + return props @cached_property @@ -1072,7 +1086,10 @@ class LinuxDistribution(object): # file), because we want to use what was specified as best as # possible. match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) - if match: + if 'name' in distro_info \ + and 'cloudlinux' in distro_info['name'].lower(): + distro_info['id'] = 'cloudlinux' + elif match: distro_info['id'] = match.group(1) return distro_info else: @@ -1113,6 +1130,8 @@ class LinuxDistribution(object): # The name is always present if the pattern matches self.distro_release_file = filepath distro_info['id'] = match.group(1) + if 'cloudlinux' in distro_info['name'].lower(): + distro_info['id'] = 'cloudlinux' return distro_info return {} diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc index fd125abb63e36123b7e664fb9968952afae24430..1e28eb16d1cfa51d779628458c8d2828fc34a3db 100644 GIT binary patch delta 34 ocmey$`IVE$iIb8$XhHCyOF1lnIomJGOxlgEo1Q_=3vIC&5Ogb8h?=h!vyrEdnIpM8Juj=I&}8u<=3vHKn-_b8$XhHCyOF1kjU%P7GOxlgEo1W}wn?)A%n=L0 delta 37 rcmZ2-glWkUCLSkVUM>b8h?=h!vyrEcjU%}{Juj=I&}8!@wn?)A%PtGG diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc index 2f67cc54b474c825334685e180eb4c671fc3013c..608b22b5042982516db01b317349e14b4c1bccae 100644 GIT binary patch delta 35 pcmdlhxmS|MiIE43KIYT delta 35 pcmdlhxmS|MiIBW3I_lH diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc index 7e8ac242fe5d950350f0427f0bbb64257b662adc..fd70f095e2d580bb708b185ab730a84b15b0aef5 100644 GIT binary patch delta 37 rcmey{!t%F;g~y4Pmx}=i@)k?PZsa+a%#l)9nO9+$ma+L!^6Ys4;N=Zn delta 37 rcmey{!t%F;g~y4Pmx}=iqUNi`Y~(qY%#mE4o|jcpXtMcH^6Ys4-~tU% diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc index 8ef42cf13c0d49ac1f4e2504d151d3c9aaefedb7..01c889f4e9766b8453dcbd3bbf3f29a47ac6d3f8 100644 GIT binary patch delta 41 vcmaF$oAuRiRvsr_UM>b8$XhHCyOHM-D@RIUWnP70T1N9T*6q(&8Cfa-EPM_r delta 41 vcmaF$oAuRiRvsr_UM>b8h?=h!vytZ#D@Ss9dR|sZp-J;I*6q(&8Cfa-D`^fL diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc index 55ddcb75302618c134da553b625a577c3059437e..cae17c0bc938474bbd548b1515663a83080b5a24 100644 GIT binary patch delta 35 pcmZ1!vM7YdiIF+PDk(IXY{cjT0GXQ!761SM diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc index 18788af40aebb927bb86db979e9e8c04e1bf0ec8..49be76fddbe38029d74b69730364297528b4e7b5 100644 GIT binary patch delta 35 pcmdnVy_1{AiIF+PDk(JCT+igl3ILoq32FcU diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc index 24a1608fe112a3ec197262fba9bdcef12fe0cdd3..cb90a77ac25ff891467a1ae8bd04d4ff86acd1ad 100644 GIT binary patch delta 35 pcmeAc>=xv4;^pOH0D`>560sY3n3y=xv4;^pOH0D`FbYB3vmn3y<{%hU6+N(xOji!qh50RV>G2xkBQ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc index dee7907692e5947bba8d2f37dd5ea48884d0586f..77eaa416a131a5b399a8f9d0156ed305e9ff6400 100644 GIT binary patch delta 38 qcmbQsIG2&fiI_+s3C92c delta 35 pcmey#`ID2!iIF+PDk(JCY{GPu2>_(|3A+FQ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc index 8052b4406be503f2cd478665a52e24cc5a40c51e..2d2263755f282051248218b6b3e47a07b63d6913 100644 GIT binary patch delta 35 pcmZ3^ww#T}iIF+PDk(JCY{2-P5de;C2{-@% diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc index b688c377e552a5b616fa46dbed2f93ff8d94c16d..a952f1b7fd8859470fc326b0eabc5b840a799edf 100644 GIT binary patch delta 35 pcmZ3?x0sK|iIF+PDk(JCtikk~1ptoe2{`}& diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc index 4931536102fdf3c609848f3e5b3609dd04a41e9b..0809387abbe2f1b2da8c811b5aba7bcf4f74bddf 100644 GIT binary patch delta 35 pcmbO)GGBzpiIdJVhoWqP5TNB+ub_50pXw= zIEWV$=VZL;L1T=Gt``p^rW!n$;K^v#|G|S-FTU9|lJE{+X6DU&-^{$Xv&D9{So35! z+~^ZWe|B=|P4i4ETeKHiM*^&FKWy8Un1d~mdG;HZBdP8n^Z8`|oD(YZ*=k{#3mYUa z29}^8|25Vld&eo$X(&~I7p;n+!x#H;=L$QqCz3Xs)>kSPA24f$B8Sh|5`E8J;eK>g zNM&LjLh5GhDf?*uiOo0oV+=1TalET^9Vy-3(C-YESMY@rXHop2Ja1P>C1@F|T!)0P zJs2cw2%p4lR>xeTtMjE$bsF?Sm3x{;$q!8#)hgF5IRG(yl;}?o86=6Z(PhkA8#NA8 z3+eydu8J$5+P@OF{E~bB6|btNBD*40Zi7u?53KSH6S|2_0$w%NIP~EIRc3GTo!Z4@ z{I2#k^%8AA!2mWVJ0-6JRFf0O4o#D>x0Ar4b!sLh3O0kI@ow|H*Bz3sAI=fcFt(*S z*cc9{6gG+FRPVu9FiHtm1UP=(bW0t!c6e`D`$KArv2mP8Ulcs|)BE?Ps3cT0sbwlNfUMgrBTp;2z1lK7ZG;3PLg0mFpAy^O~OW=-2OLBrmjTdw$Py?d|pC}R% z`&u`kbhw?%%!l7b*1dm_7>^R&5P?dNA;=PlJf9QJ=ZjjwG>cr*^7#WQnL(VA25~o& zV^bK;o@R?UkZqTyDLjU`>`-frOnNZrBl!0$b4o|glJK3-jp_Nx+_h<#q1!Mm;oyzD KUt#~uDuKT~;n(W` delta 856 zcmZ8f&1(};5YG$A#(qQ;+e4+rv`uQaCY#ue=|^g@A1PL_kw{CCVhEepHg>ZcXP1W7 zgFW}xu-$yR&1WIY9)=s7i{Z&&7R|4 z@0ySrjdlsC#pq-9!TA#{G+{xB`$555O6-VMUomdjH`Dl3NwO&ZRGxGuNhN5TYutdd z!fwDISt>qEI&2s7sh;j$#_JW76O%B)toVaoxC;r&!RMPzV}7@IxDqPNalh^}me8Yl1Vv~SZ&2w2+xz$Pi&nkhxsgBym diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc index 0510bcb0f4dce77f421acd02ac55bd2baee74b77..e18e893005ac60d76ac61e57c27502aeb47963bf 100644 GIT binary patch delta 35 pcmbQwHJ^*eiIF+PDk(JCY{C4T5de+&2{Zrz diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc index a660f4d7f09f5270bd1de6091a6709f31c901dfa..18e3f2d057e80a6dd8022afe80fadc7582b543ce 100644 GIT binary patch delta 34 ocmZo*Z(!$f;^pOH0D`>560sY3#F;r#3M=y}4AU|uYcq!e0D9pFF8}}l delta 34 ocmZo*Z(!$f;^pOH0D`FbYB3vm#F;sg%hU6+N(xOTYcq!e0D1}tBLDyZ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc index 7e048d100a2eb689148a868f00319e44b4e709b7..d9a5ae0820947fb1ccd4c6ed5f6b09bb19d8403f 100644 GIT binary patch delta 35 pcmcc0eU+QXiIQdpT+VVIV&`784SMgXiU3n2gi delta 35 pcmcc0eU+QXiIT%MknRZ?iO`784SMgXfw3l#tW diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc index cc089e92fe8b547e44b8b880235b581f9192fed8..c4d9a3fa137d252dabd1992810263c61c53751f3 100644 GIT binary patch delta 35 pcmZ3?y_lQFiIF+PDk(JC+`=Ny2mq732@n7P diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc index 2a2ff0fd728f7c2ea28261696cc61f48f6691f3f..fce6e544d173846144dd719d6309b8048428fa95 100644 GIT binary patch delta 34 ocmX>rc~+9giI<{9 delta 34 ocmX>rc~+9giIQejuF3iIQejuF3iIF+PDk(JCJcU_D0|2mh3N!!! diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc index 981e291bbfb9719cc5b3a5c1a0ea21539f124ae5..51b52e2d0a350bbb36b24a88426f202032d3ca54 100644 GIT binary patch delta 35 pcmeD4==0!l;^pOH0D`>560sY3`j|LU3M=y}4AU|;FJj731OTD43K0MR delta 35 pcmeD4==0!l;^pOH0D`FbYB3vm`j|M9%hU6+N(xOjFJj731OTAW3IzZF diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc index 4615a21bcf13e14de4a8b6ff1f962d07363e288d..37c7392c8d877da979aff094b4bb681872134162 100644 GIT binary patch delta 35 pcmZ1&voMCoiIF+PDk(JC9K&){69A@a3M>Es diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc index 607b23703c9714480200e386dc31e40a09a1403c..c9ad906a2328a75fc95bc7de0331e2c2acb94faa 100644 GIT binary patch delta 35 pcmaDF{WO}#iIF+PDk(JCtip0o69BW&3O)b; diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc index 43291d3b96873933c71e1017c091a583adbe42ab..1fde618f984a534a3166cc217bf21d673f99063e 100644 GIT binary patch delta 35 pcmew)_eqY&iI3aS7A delta 35 pcmew)_eqY&iIF+PDk(JCT+IHT9RRLI3Z4J} diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc index 10b3a2dbad231e3bb5405f3611932b7a3ece2fa1..428806a43a9fbb0b117e2b4e6a8bb1ad1a9c1337 100644 GIT binary patch delta 35 pcmZ2xw#F+PDk(JC9Kn1}8~~k=3D*Ds diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc index caa33abf1b057b7a41e3e17a62270ec7589506c4..0c0ade60becc2863e5f84e6a9e9af47a016eae3d 100644 GIT binary patch delta 35 pcmeC@?dRoj;^pOH0D`>560sY3dYL&=3M=y}4AU|;FJykl1OSty3IG5A delta 35 pcmeC@?dRoj;^pOH0D`FbYB3vmdYL(r%hU6+N(xOjFJykl1OSr33G@H} diff --git a/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc index 7699f4bdd0a363476c16ed13535afd5de328c000..ef04999511189993d321f0621f1addb062091621 100644 GIT binary patch delta 35 pcmbOyJx`j)iI1E1EF+PDk(JCypU-Q3jm&n3IG5A diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc index 4d072e4175e37e0f9b561d7a64134a7dbaf04527..f0f87426a2be05fa4df4f06c407489ac19f5814b 100644 GIT binary patch delta 32 mcmcb{c#VETEztjw!0Ov{+KzzhI~LL delta 32 mcmcb{c#VETE&PtVILDKwe5zzhI}gb8K< diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-37.pyc index efe10c4736bec1238a52f00747bc0882bfd33202..fa6749bd6d98a72628b33214f0170ced9b619421 100644 GIT binary patch delta 35 pcmX>repZ~viIrepZ~viIF+PDk(JCti!aB69Ak92~q$6 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-37.pyc index 868d8f7b9970976c1966088b8dfd6d8383827c78..9108b59dbe866c4dca87a607bb2ed1b01ee5b56d 100644 GIT binary patch delta 33 ncmdnTvX6zwiI6d7I4N$UDt%hL%Lkil;z%w}&&w()G}+w9^h>mU2~e`quZCd(LkiFB^HJfrfjYvD@FzoEMZDvTEJYxu#mBtv57H~A&)77p@apb zy4VLO#|#p!VF+db>S6`zN`mNusH({C}FRu2U}Ib0Ttk^VGw5k zN_c}0pKLT$3CWUQbD zkjcQr#K^_S#K^@pmp ITrynp05B|EX#fBK diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc index 6d0f886cde4e18e22840933c57fe64acc946cdc8..96d856cd3ac7af29c01af162a47ca7c704983944 100644 GIT binary patch delta 859 zcmXxi%}Z2K9LDkUJJ&NW&fI2vf6JFgW4bqI-h+!fP$dL4cBIPXF z7=botQIcp_o$8(IWZ_+87nIa502Xi>S^c-gDu@`QCHyxr=)?pV7mY6znq1 zY^F!@dGW~mRmQ#|tnr027SVBY?@jOukxSj9<6Ny7LqzU0MIWuYN&g0ZSXIppi7ExF=*ApY7J+m}9nCk@DP|2y%|$=GjI z8Cc-Lbn6$?+v|N{x_GDe`t{BbdY+A0z9#ff&#H($s#d@==ax{KPtdw$gOTLPK9G)oWEOq*r Y+~^DGv;4X5oJjZImw^j;#w<7f1JLfUNdN!< delta 331 zcmeBK&bVsFBbz4M9o)=DV@o{@EF8_f%!}f3=Tj}amGgV2*%Bgj4DiC<`kh|22J5AHbaBWGHl#TjISqaa7Fdclxhz7XsOSUT%MknRZ?g&vA~$M7$ge-*cb{R diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc index 73163271fef549bcb8aefc3300cafa8a2e70e2d8..3c539fb483ca5ac84d9a5c5d2e8f05be2345fdfe 100644 GIT binary patch delta 2437 zcmYk84^UNA9>?GJymv4564bR-5EW3|pcEgOW@~Pw5u;nm;zEj^p7^5J6T2V{8I7f*s{uwq>V@9S4QAuiG0x2pq&h9z)-SOQ!^X~i2=lA=4&-tC- zIcM(BW&5#CyT?3tce_PAN#&j^3e|iMPpm%vXa=#z?T6ZM~p9$uU-J)?Q2t0F6v{Isdg$IFF%ECP9)< z-v!NT@f1sSyyXcSZT{kyBmZ zB6RTkewCiR<|Ov3f>d8GR>zBGS%Qsb30sl2(L@Ig>Hm)|5Zf!1f9b!h(#j#HK-WDX zkp254H>Ok zYrHUh7;B!4k9862Bq36wi){BtkqwM{1tJ41Z7P1_g^!^NJaHNx1^ReF5VCFT?vtpd z7Z3UJSu>a3#tuN!WUg+&e=`LI<+$?^T zkyE)+!qC+?rLxXM15Qkk@RQfkt+Lz=20W7@;o3BuQQ4?WH0fo9Z;|lZOk7u4X%4RG z19k3{@SWWVcVi#t8*nI3!pZ_HbYthNcEKS$GGs^+xr5E*iD>GMYrK9moP^v8A1u zjs<*oCw5s`Z1Pml1-Qd`&4``rkhZaN|IFI2!hgyL7YUHIypUw1iARrM z16T10!g$R!^Z;{M=`W~bb8p}o*R-~Fi)mpc+j;}N@Mi0N#nU6jvGH`tKjX>w|B5kI z-r9%fz;52c3~S5;&;wq+Os_2HHzDzM`~=r5UX!*l-vkp+H1RwW-)rIpCQePf*u+as zyxPe}>*fD2(KYbkL_YR54#FcQ$pzm_Vjm7*qd0GWx`PJdT8HXEagMx6!VBkJW&9v* zqm0|E=bmWUX68MJB%b&?8WnwO1QOB=HXY1UxiFKo)NoqU)wgn)CV4M`sQ46n}>!xpcldriT+r7@zS58KF9zm8mi(G=)41wkD1I6+`TJ8kvqu?8h|n>8j*G zS0hrTZ8Tz&iN9sy8798P#LG?mn2Fc2uQrmgPc)g_=S*(PkZbrDX&b{Q4RNxGOtm^| z7|4({1iwYf!B1=@{wf!BcY(L>AeG>&bI1&%*p+!Q@ZbL+Rp37PWR8Ky7fZZ?k^LfP z9|>_{)_#z5(bDCe+^39`fN!WE4wYr65<&So6g%RTZx| zyaw@sLl%h}p${J7c3|65iT@+BPx^=mk!rD!6fg0=C~yheahMz(xl81yr;t7XKec)p$Dq delta 2078 zcmYk74Oq=r9LMkP-21;J6>FoqcyyO66_qk?GnUYjUa@M8T9MMCTP|DHlSeOJHso(k zgmi0>gq(3ao=k7kGt8D^lGv=gg)1+uWS*V#|KCmbKKK9p@8|dXeSa_K{LlZ`EsK|} z7S=viRu&5Oi7Xr)Rj$gjwuAYV@1-NOB$ymVm%(B^M25ue3sa0K6t}1x1&?v;i&I`g zCn*v%f_d!f_~gX26mL>z@odf@ln^Z_6gmUb8-o&J#EMWSbJL%V;-%2VHczN8bLC{8bF*G<|xiy@GDZ7i?$0(p_%-+FdV^aVjGbRxWooIkOz^qAm&8+ise!M zpeNl?5h}IHl4s;Hj$}_vJ%Awk#!M1Fi*2>al1y^8Y%(?uD`lBU%j!XFhz}vX32B0i z{#?P($`v8RkP@qeHAKD2*_6|uXBJO=2#HEeoSr|h*~aV+9B4U zShk70F0U2DJfoJ(KF)+{D&vUyhfmcKxp$g{#hs2N2dkV-VexgW#-`dd;{4M~usZGf zW)04WwhfNKn}UTx$!-y!l)%Ddi3$t2Y1toGTWdR%>o6BHgAh3z?1d$6lj9I|ouy6)(UI}QaWi-?Qwpq;R z#TckE(d-0HH!ov!)^d1cqVB1jPS7!GOoIz1x^FF~XVRgXF3NyT6Aj7XG$0$=>028h z%uLRfw2jmFt&F;Dhj}KtZa1fEcQN|W9_C9~W$l1*F}$R@Qs|Q1aMn?1f*aD*mmYzC zsBa~FfuM~ZCs3}G^@C1vrDzJ5=%CXO!L12ZP%1x!^g%VBfK4@9vGQ6tA&({MJcqGA zv!+H|ghD}F8m7Td0GZL$%TU7_YlQEpS2LWGH$L6l%KcwmhjnyO8>|QL#RJNQwX zTacraMqT(9_bIr|8j9`!0YHH>?!YK~`3?~9r8#$@6W{}^yAM^;Lr6D0-~pZwV6uvx zVvBIlLok8{Pk#iH>9$8;t+d*!f&WjreN=n`0j3Qw^(ha%-31=B;5p<2p4$yc@Q9x3 zh8o1xW@CLHt51hZ`yg3Px2u=!H9F)K)Cia=QJYM=0kOS~Rj5e7_Lk@x*0>=D8g7A@ z?^8>3T)^4ypf<{m#de@ehM;l*cMX?=wbXMMssq|M0@Vvx@AMx%>B#BA(VX^;W%PVC zIM69>JW=a7)G6Qt@1q`RW_P?fG)zRR)VOCl`dfk%KjiS~3=aK1HhJdG;c%uua#iD? zP}C+8dky}>o2}T^V4luB4Ed_)=1)*A&}WfokTfVQ^@`v|Aqwpk==xYRRDMuvW4PF! zIJ8E2c*q0!@yEGr7|__qDOwvi&OQ;9j@SF zJv#gOyxunp70mBV2VYV@p4pG*_v6+5cuhb4TR(ocms+ktZc1wZH7b>R2v6r_)@C5B zn%3u_gECcSbGl*!@=(*vZKzD9XSZG76pyb! p6@#;Yom;v5vXNhQVq*pJhZ}gx5wrt09YGV=xCb0X2IYJd_%Gv8BO?F+ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/core.py b/env/lib/python3.7/site-packages/pip/_vendor/idna/core.py index 090c2c1..104624a 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/idna/core.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/idna/core.py @@ -267,10 +267,7 @@ def alabel(label): try: label = label.encode('ascii') - try: - ulabel(label) - except IDNAError: - raise IDNAError('The label {0} is not a valid A-label'.format(label)) + ulabel(label) if not valid_label_length(label): raise IDNAError('Label too long') return label diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/idnadata.py b/env/lib/python3.7/site-packages/pip/_vendor/idna/idnadata.py index 17974e2..a80c959 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/idna/idnadata.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/idna/idnadata.py @@ -1,6 +1,6 @@ # This file is automatically generated by tools/idna-data -__version__ = "10.0.0" +__version__ = "11.0.0" scripts = { 'Greek': ( 0x37000000374, @@ -49,7 +49,7 @@ scripts = { 0x30210000302a, 0x30380000303c, 0x340000004db6, - 0x4e0000009feb, + 0x4e0000009ff0, 0xf9000000fa6e, 0xfa700000fada, 0x200000002a6d7, @@ -62,7 +62,7 @@ scripts = { 'Hebrew': ( 0x591000005c8, 0x5d0000005eb, - 0x5f0000005f5, + 0x5ef000005f5, 0xfb1d0000fb37, 0xfb380000fb3d, 0xfb3e0000fb3f, @@ -248,6 +248,7 @@ joining_types = { 0x6fb: 68, 0x6fc: 68, 0x6ff: 68, + 0x70f: 84, 0x710: 82, 0x712: 68, 0x713: 68, @@ -522,6 +523,7 @@ joining_types = { 0x1875: 68, 0x1876: 68, 0x1877: 68, + 0x1878: 68, 0x1880: 85, 0x1881: 85, 0x1882: 85, @@ -690,6 +692,70 @@ joining_types = { 0x10bad: 68, 0x10bae: 68, 0x10baf: 85, + 0x10d00: 76, + 0x10d01: 68, + 0x10d02: 68, + 0x10d03: 68, + 0x10d04: 68, + 0x10d05: 68, + 0x10d06: 68, + 0x10d07: 68, + 0x10d08: 68, + 0x10d09: 68, + 0x10d0a: 68, + 0x10d0b: 68, + 0x10d0c: 68, + 0x10d0d: 68, + 0x10d0e: 68, + 0x10d0f: 68, + 0x10d10: 68, + 0x10d11: 68, + 0x10d12: 68, + 0x10d13: 68, + 0x10d14: 68, + 0x10d15: 68, + 0x10d16: 68, + 0x10d17: 68, + 0x10d18: 68, + 0x10d19: 68, + 0x10d1a: 68, + 0x10d1b: 68, + 0x10d1c: 68, + 0x10d1d: 68, + 0x10d1e: 68, + 0x10d1f: 68, + 0x10d20: 68, + 0x10d21: 68, + 0x10d22: 82, + 0x10d23: 68, + 0x10f30: 68, + 0x10f31: 68, + 0x10f32: 68, + 0x10f33: 82, + 0x10f34: 68, + 0x10f35: 68, + 0x10f36: 68, + 0x10f37: 68, + 0x10f38: 68, + 0x10f39: 68, + 0x10f3a: 68, + 0x10f3b: 68, + 0x10f3c: 68, + 0x10f3d: 68, + 0x10f3e: 68, + 0x10f3f: 68, + 0x10f40: 68, + 0x10f41: 68, + 0x10f42: 68, + 0x10f43: 68, + 0x10f44: 68, + 0x10f45: 85, + 0x10f51: 68, + 0x10f52: 68, + 0x10f53: 68, + 0x10f54: 82, + 0x110bd: 85, + 0x110cd: 85, 0x1e900: 68, 0x1e901: 68, 0x1e902: 68, @@ -1034,14 +1100,15 @@ codepoint_classes = { 0x52d0000052e, 0x52f00000530, 0x5590000055a, - 0x56100000587, + 0x56000000587, + 0x58800000589, 0x591000005be, 0x5bf000005c0, 0x5c1000005c3, 0x5c4000005c6, 0x5c7000005c8, 0x5d0000005eb, - 0x5f0000005f3, + 0x5ef000005f3, 0x6100000061b, 0x62000000640, 0x64100000660, @@ -1054,12 +1121,13 @@ codepoint_classes = { 0x7100000074b, 0x74d000007b2, 0x7c0000007f6, + 0x7fd000007fe, 0x8000000082e, 0x8400000085c, 0x8600000086b, 0x8a0000008b5, 0x8b6000008be, - 0x8d4000008e2, + 0x8d3000008e2, 0x8e300000958, 0x96000000964, 0x96600000970, @@ -1077,6 +1145,7 @@ codepoint_classes = { 0x9e0000009e4, 0x9e6000009f2, 0x9fc000009fd, + 0x9fe000009ff, 0xa0100000a04, 0xa0500000a0b, 0xa0f00000a11, @@ -1136,8 +1205,7 @@ codepoint_classes = { 0xbd000000bd1, 0xbd700000bd8, 0xbe600000bf0, - 0xc0000000c04, - 0xc0500000c0d, + 0xc0000000c0d, 0xc0e00000c11, 0xc1200000c29, 0xc2a00000c3a, @@ -1276,7 +1344,7 @@ codepoint_classes = { 0x17dc000017de, 0x17e0000017ea, 0x18100000181a, - 0x182000001878, + 0x182000001879, 0x1880000018ab, 0x18b0000018f6, 0x19000000191f, @@ -1544,11 +1612,11 @@ codepoint_classes = { 0x309d0000309f, 0x30a1000030fb, 0x30fc000030ff, - 0x31050000312f, + 0x310500003130, 0x31a0000031bb, 0x31f000003200, 0x340000004db6, - 0x4e0000009feb, + 0x4e0000009ff0, 0xa0000000a48d, 0xa4d00000a4fe, 0xa5000000a60d, @@ -1655,8 +1723,10 @@ codepoint_classes = { 0xa7a50000a7a6, 0xa7a70000a7a8, 0xa7a90000a7aa, + 0xa7af0000a7b0, 0xa7b50000a7b6, 0xa7b70000a7b8, + 0xa7b90000a7ba, 0xa7f70000a7f8, 0xa7fa0000a828, 0xa8400000a874, @@ -1664,8 +1734,7 @@ codepoint_classes = { 0xa8d00000a8da, 0xa8e00000a8f8, 0xa8fb0000a8fc, - 0xa8fd0000a8fe, - 0xa9000000a92e, + 0xa8fd0000a92e, 0xa9300000a954, 0xa9800000a9c1, 0xa9cf0000a9da, @@ -1743,7 +1812,7 @@ codepoint_classes = { 0x10a0500010a07, 0x10a0c00010a14, 0x10a1500010a18, - 0x10a1900010a34, + 0x10a1900010a36, 0x10a3800010a3b, 0x10a3f00010a40, 0x10a6000010a7d, @@ -1756,6 +1825,11 @@ codepoint_classes = { 0x10b8000010b92, 0x10c0000010c49, 0x10cc000010cf3, + 0x10d0000010d28, + 0x10d3000010d3a, + 0x10f0000010f1d, + 0x10f2700010f28, + 0x10f3000010f51, 0x1100000011047, 0x1106600011070, 0x1107f000110bb, @@ -1763,10 +1837,11 @@ codepoint_classes = { 0x110f0000110fa, 0x1110000011135, 0x1113600011140, + 0x1114400011147, 0x1115000011174, 0x1117600011177, 0x11180000111c5, - 0x111ca000111cd, + 0x111c9000111cd, 0x111d0000111db, 0x111dc000111dd, 0x1120000011212, @@ -1786,7 +1861,7 @@ codepoint_classes = { 0x1132a00011331, 0x1133200011334, 0x113350001133a, - 0x1133c00011345, + 0x1133b00011345, 0x1134700011349, 0x1134b0001134e, 0x1135000011351, @@ -1796,6 +1871,7 @@ codepoint_classes = { 0x1137000011375, 0x114000001144b, 0x114500001145a, + 0x1145e0001145f, 0x11480000114c6, 0x114c7000114c8, 0x114d0000114da, @@ -1807,15 +1883,17 @@ codepoint_classes = { 0x116500001165a, 0x11680000116b8, 0x116c0000116ca, - 0x117000001171a, + 0x117000001171b, 0x1171d0001172c, 0x117300001173a, + 0x118000001183b, 0x118c0000118ea, 0x118ff00011900, 0x11a0000011a3f, 0x11a4700011a48, 0x11a5000011a84, 0x11a8600011a9a, + 0x11a9d00011a9e, 0x11ac000011af9, 0x11c0000011c09, 0x11c0a00011c37, @@ -1831,6 +1909,13 @@ codepoint_classes = { 0x11d3c00011d3e, 0x11d3f00011d48, 0x11d5000011d5a, + 0x11d6000011d66, + 0x11d6700011d69, + 0x11d6a00011d8f, + 0x11d9000011d92, + 0x11d9300011d99, + 0x11da000011daa, + 0x11ee000011ef7, 0x120000001239a, 0x1248000012544, 0x130000001342f, @@ -1845,11 +1930,12 @@ codepoint_classes = { 0x16b5000016b5a, 0x16b6300016b78, 0x16b7d00016b90, + 0x16e6000016e80, 0x16f0000016f45, 0x16f5000016f7f, 0x16f8f00016fa0, 0x16fe000016fe2, - 0x17000000187ed, + 0x17000000187f2, 0x1880000018af3, 0x1b0000001b11f, 0x1b1700001b2fc, diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py b/env/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py index 39c192b..257e898 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py @@ -1,2 +1,2 @@ -__version__ = '2.7' +__version__ = '2.8' diff --git a/env/lib/python3.7/site-packages/pip/_vendor/idna/uts46data.py b/env/lib/python3.7/site-packages/pip/_vendor/idna/uts46data.py index 79731cb..a68ed4c 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/idna/uts46data.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/idna/uts46data.py @@ -4,7 +4,7 @@ """IDNA Mapping Table from UTS46.""" -__version__ = "10.0.0" +__version__ = "11.0.0" def _seg_0(): return [ (0x0, '3'), @@ -1029,11 +1029,8 @@ def _seg_9(): (0x556, 'M', u'ֆ'), (0x557, 'X'), (0x559, 'V'), - (0x560, 'X'), - (0x561, 'V'), (0x587, 'M', u'եւ'), - (0x588, 'X'), - (0x589, 'V'), + (0x588, 'V'), (0x58B, 'X'), (0x58D, 'V'), (0x590, 'X'), @@ -1041,15 +1038,15 @@ def _seg_9(): (0x5C8, 'X'), (0x5D0, 'V'), (0x5EB, 'X'), - (0x5F0, 'V'), + (0x5EF, 'V'), (0x5F5, 'X'), + (0x606, 'V'), + (0x61C, 'X'), + (0x61E, 'V'), ] def _seg_10(): return [ - (0x606, 'V'), - (0x61C, 'X'), - (0x61E, 'V'), (0x675, 'M', u'اٴ'), (0x676, 'M', u'وٴ'), (0x677, 'M', u'ۇٴ'), @@ -1064,7 +1061,7 @@ def _seg_10(): (0x7B2, 'X'), (0x7C0, 'V'), (0x7FB, 'X'), - (0x800, 'V'), + (0x7FD, 'V'), (0x82E, 'X'), (0x830, 'V'), (0x83F, 'X'), @@ -1078,7 +1075,7 @@ def _seg_10(): (0x8B5, 'X'), (0x8B6, 'V'), (0x8BE, 'X'), - (0x8D4, 'V'), + (0x8D3, 'V'), (0x8E2, 'X'), (0x8E3, 'V'), (0x958, 'M', u'क़'), @@ -1118,7 +1115,7 @@ def _seg_10(): (0x9E0, 'V'), (0x9E4, 'X'), (0x9E6, 'V'), - (0x9FE, 'X'), + (0x9FF, 'X'), (0xA01, 'V'), (0xA04, 'X'), (0xA05, 'V'), @@ -1147,19 +1144,19 @@ def _seg_10(): (0xA4E, 'X'), (0xA51, 'V'), (0xA52, 'X'), + (0xA59, 'M', u'ਖ਼'), + (0xA5A, 'M', u'ਗ਼'), + (0xA5B, 'M', u'ਜ਼'), ] def _seg_11(): return [ - (0xA59, 'M', u'ਖ਼'), - (0xA5A, 'M', u'ਗ਼'), - (0xA5B, 'M', u'ਜ਼'), (0xA5C, 'V'), (0xA5D, 'X'), (0xA5E, 'M', u'ਫ਼'), (0xA5F, 'X'), (0xA66, 'V'), - (0xA76, 'X'), + (0xA77, 'X'), (0xA81, 'V'), (0xA84, 'X'), (0xA85, 'V'), @@ -1250,16 +1247,14 @@ def _seg_11(): (0xBE6, 'V'), (0xBFB, 'X'), (0xC00, 'V'), - (0xC04, 'X'), - ] - -def _seg_12(): - return [ - (0xC05, 'V'), (0xC0D, 'X'), (0xC0E, 'V'), (0xC11, 'X'), (0xC12, 'V'), + ] + +def _seg_12(): + return [ (0xC29, 'X'), (0xC2A, 'V'), (0xC3A, 'X'), @@ -1278,8 +1273,6 @@ def _seg_12(): (0xC66, 'V'), (0xC70, 'X'), (0xC78, 'V'), - (0xC84, 'X'), - (0xC85, 'V'), (0xC8D, 'X'), (0xC8E, 'V'), (0xC91, 'X'), @@ -1355,10 +1348,6 @@ def _seg_12(): (0xE83, 'X'), (0xE84, 'V'), (0xE85, 'X'), - ] - -def _seg_13(): - return [ (0xE87, 'V'), (0xE89, 'X'), (0xE8A, 'V'), @@ -1366,6 +1355,10 @@ def _seg_13(): (0xE8D, 'V'), (0xE8E, 'X'), (0xE94, 'V'), + ] + +def _seg_13(): + return [ (0xE98, 'X'), (0xE99, 'V'), (0xEA0, 'X'), @@ -1459,10 +1452,6 @@ def _seg_13(): (0x124E, 'X'), (0x1250, 'V'), (0x1257, 'X'), - ] - -def _seg_14(): - return [ (0x1258, 'V'), (0x1259, 'X'), (0x125A, 'V'), @@ -1470,6 +1459,10 @@ def _seg_14(): (0x1260, 'V'), (0x1289, 'X'), (0x128A, 'V'), + ] + +def _seg_14(): + return [ (0x128E, 'X'), (0x1290, 'V'), (0x12B1, 'X'), @@ -1538,7 +1531,7 @@ def _seg_14(): (0x1810, 'V'), (0x181A, 'X'), (0x1820, 'V'), - (0x1878, 'X'), + (0x1879, 'X'), (0x1880, 'V'), (0x18AB, 'X'), (0x18B0, 'V'), @@ -1563,10 +1556,6 @@ def _seg_14(): (0x19DB, 'X'), (0x19DE, 'V'), (0x1A1C, 'X'), - ] - -def _seg_15(): - return [ (0x1A1E, 'V'), (0x1A5F, 'X'), (0x1A60, 'V'), @@ -1574,6 +1563,10 @@ def _seg_15(): (0x1A7F, 'V'), (0x1A8A, 'X'), (0x1A90, 'V'), + ] + +def _seg_15(): + return [ (0x1A9A, 'X'), (0x1AA0, 'V'), (0x1AAE, 'X'), @@ -1667,10 +1660,6 @@ def _seg_15(): (0x1D68, 'M', u'ρ'), (0x1D69, 'M', u'φ'), (0x1D6A, 'M', u'χ'), - ] - -def _seg_16(): - return [ (0x1D6B, 'V'), (0x1D78, 'M', u'н'), (0x1D79, 'V'), @@ -1678,6 +1667,10 @@ def _seg_16(): (0x1D9C, 'M', u'c'), (0x1D9D, 'M', u'ɕ'), (0x1D9E, 'M', u'ð'), + ] + +def _seg_16(): + return [ (0x1D9F, 'M', u'ɜ'), (0x1DA0, 'M', u'f'), (0x1DA1, 'M', u'ɟ'), @@ -1771,10 +1764,6 @@ def _seg_16(): (0x1E36, 'M', u'ḷ'), (0x1E37, 'V'), (0x1E38, 'M', u'ḹ'), - ] - -def _seg_17(): - return [ (0x1E39, 'V'), (0x1E3A, 'M', u'ḻ'), (0x1E3B, 'V'), @@ -1782,6 +1771,10 @@ def _seg_17(): (0x1E3D, 'V'), (0x1E3E, 'M', u'ḿ'), (0x1E3F, 'V'), + ] + +def _seg_17(): + return [ (0x1E40, 'M', u'ṁ'), (0x1E41, 'V'), (0x1E42, 'M', u'ṃ'), @@ -1875,10 +1868,6 @@ def _seg_17(): (0x1E9F, 'V'), (0x1EA0, 'M', u'ạ'), (0x1EA1, 'V'), - ] - -def _seg_18(): - return [ (0x1EA2, 'M', u'ả'), (0x1EA3, 'V'), (0x1EA4, 'M', u'ấ'), @@ -1886,6 +1875,10 @@ def _seg_18(): (0x1EA6, 'M', u'ầ'), (0x1EA7, 'V'), (0x1EA8, 'M', u'ẩ'), + ] + +def _seg_18(): + return [ (0x1EA9, 'V'), (0x1EAA, 'M', u'ẫ'), (0x1EAB, 'V'), @@ -1979,10 +1972,6 @@ def _seg_18(): (0x1F0B, 'M', u'ἃ'), (0x1F0C, 'M', u'ἄ'), (0x1F0D, 'M', u'ἅ'), - ] - -def _seg_19(): - return [ (0x1F0E, 'M', u'ἆ'), (0x1F0F, 'M', u'ἇ'), (0x1F10, 'V'), @@ -1990,6 +1979,10 @@ def _seg_19(): (0x1F18, 'M', u'ἐ'), (0x1F19, 'M', u'ἑ'), (0x1F1A, 'M', u'ἒ'), + ] + +def _seg_19(): + return [ (0x1F1B, 'M', u'ἓ'), (0x1F1C, 'M', u'ἔ'), (0x1F1D, 'M', u'ἕ'), @@ -2083,10 +2076,6 @@ def _seg_19(): (0x1F9A, 'M', u'ἢι'), (0x1F9B, 'M', u'ἣι'), (0x1F9C, 'M', u'ἤι'), - ] - -def _seg_20(): - return [ (0x1F9D, 'M', u'ἥι'), (0x1F9E, 'M', u'ἦι'), (0x1F9F, 'M', u'ἧι'), @@ -2094,6 +2083,10 @@ def _seg_20(): (0x1FA1, 'M', u'ὡι'), (0x1FA2, 'M', u'ὢι'), (0x1FA3, 'M', u'ὣι'), + ] + +def _seg_20(): + return [ (0x1FA4, 'M', u'ὤι'), (0x1FA5, 'M', u'ὥι'), (0x1FA6, 'M', u'ὦι'), @@ -2187,10 +2180,6 @@ def _seg_20(): (0x2024, 'X'), (0x2027, 'V'), (0x2028, 'X'), - ] - -def _seg_21(): - return [ (0x202F, '3', u' '), (0x2030, 'V'), (0x2033, 'M', u'′′'), @@ -2198,6 +2187,10 @@ def _seg_21(): (0x2035, 'V'), (0x2036, 'M', u'‵‵'), (0x2037, 'M', u'‵‵‵'), + ] + +def _seg_21(): + return [ (0x2038, 'V'), (0x203C, '3', u'!!'), (0x203D, 'V'), @@ -2291,10 +2284,6 @@ def _seg_21(): (0x2120, 'M', u'sm'), (0x2121, 'M', u'tel'), (0x2122, 'M', u'tm'), - ] - -def _seg_22(): - return [ (0x2123, 'V'), (0x2124, 'M', u'z'), (0x2125, 'V'), @@ -2302,6 +2291,10 @@ def _seg_22(): (0x2127, 'V'), (0x2128, 'M', u'z'), (0x2129, 'V'), + ] + +def _seg_22(): + return [ (0x212A, 'M', u'k'), (0x212B, 'M', u'å'), (0x212C, 'M', u'b'), @@ -2395,10 +2388,6 @@ def _seg_22(): (0x226E, '3'), (0x2270, 'V'), (0x2329, 'M', u'〈'), - ] - -def _seg_23(): - return [ (0x232A, 'M', u'〉'), (0x232B, 'V'), (0x2427, 'X'), @@ -2406,6 +2395,10 @@ def _seg_23(): (0x244B, 'X'), (0x2460, 'M', u'1'), (0x2461, 'M', u'2'), + ] + +def _seg_23(): + return [ (0x2462, 'M', u'3'), (0x2463, 'M', u'4'), (0x2464, 'M', u'5'), @@ -2499,10 +2492,6 @@ def _seg_23(): (0x24CF, 'M', u'z'), (0x24D0, 'M', u'a'), (0x24D1, 'M', u'b'), - ] - -def _seg_24(): - return [ (0x24D2, 'M', u'c'), (0x24D3, 'M', u'd'), (0x24D4, 'M', u'e'), @@ -2510,6 +2499,10 @@ def _seg_24(): (0x24D6, 'M', u'g'), (0x24D7, 'M', u'h'), (0x24D8, 'M', u'i'), + ] + +def _seg_24(): + return [ (0x24D9, 'M', u'j'), (0x24DA, 'M', u'k'), (0x24DB, 'M', u'l'), @@ -2541,13 +2534,9 @@ def _seg_24(): (0x2B76, 'V'), (0x2B96, 'X'), (0x2B98, 'V'), - (0x2BBA, 'X'), - (0x2BBD, 'V'), (0x2BC9, 'X'), (0x2BCA, 'V'), - (0x2BD3, 'X'), - (0x2BEC, 'V'), - (0x2BF0, 'X'), + (0x2BFF, 'X'), (0x2C00, 'M', u'ⰰ'), (0x2C01, 'M', u'ⰱ'), (0x2C02, 'M', u'ⰲ'), @@ -2603,10 +2592,6 @@ def _seg_24(): (0x2C62, 'M', u'ɫ'), (0x2C63, 'M', u'ᵽ'), (0x2C64, 'M', u'ɽ'), - ] - -def _seg_25(): - return [ (0x2C65, 'V'), (0x2C67, 'M', u'ⱨ'), (0x2C68, 'V'), @@ -2618,6 +2603,10 @@ def _seg_25(): (0x2C6E, 'M', u'ɱ'), (0x2C6F, 'M', u'ɐ'), (0x2C70, 'M', u'ɒ'), + ] + +def _seg_25(): + return [ (0x2C71, 'V'), (0x2C72, 'M', u'ⱳ'), (0x2C73, 'V'), @@ -2707,10 +2696,6 @@ def _seg_25(): (0x2CCD, 'V'), (0x2CCE, 'M', u'ⳏ'), (0x2CCF, 'V'), - ] - -def _seg_26(): - return [ (0x2CD0, 'M', u'ⳑ'), (0x2CD1, 'V'), (0x2CD2, 'M', u'ⳓ'), @@ -2722,6 +2707,10 @@ def _seg_26(): (0x2CD8, 'M', u'ⳙ'), (0x2CD9, 'V'), (0x2CDA, 'M', u'ⳛ'), + ] + +def _seg_26(): + return [ (0x2CDB, 'V'), (0x2CDC, 'M', u'ⳝ'), (0x2CDD, 'V'), @@ -2768,7 +2757,7 @@ def _seg_26(): (0x2DD8, 'V'), (0x2DDF, 'X'), (0x2DE0, 'V'), - (0x2E4A, 'X'), + (0x2E4F, 'X'), (0x2E80, 'V'), (0x2E9A, 'X'), (0x2E9B, 'V'), @@ -2811,10 +2800,6 @@ def _seg_26(): (0x2F20, 'M', u'士'), (0x2F21, 'M', u'夂'), (0x2F22, 'M', u'夊'), - ] - -def _seg_27(): - return [ (0x2F23, 'M', u'夕'), (0x2F24, 'M', u'大'), (0x2F25, 'M', u'女'), @@ -2826,6 +2811,10 @@ def _seg_27(): (0x2F2B, 'M', u'尸'), (0x2F2C, 'M', u'屮'), (0x2F2D, 'M', u'山'), + ] + +def _seg_27(): + return [ (0x2F2E, 'M', u'巛'), (0x2F2F, 'M', u'工'), (0x2F30, 'M', u'己'), @@ -2915,10 +2904,6 @@ def _seg_27(): (0x2F84, 'M', u'至'), (0x2F85, 'M', u'臼'), (0x2F86, 'M', u'舌'), - ] - -def _seg_28(): - return [ (0x2F87, 'M', u'舛'), (0x2F88, 'M', u'舟'), (0x2F89, 'M', u'艮'), @@ -2930,6 +2915,10 @@ def _seg_28(): (0x2F8F, 'M', u'行'), (0x2F90, 'M', u'衣'), (0x2F91, 'M', u'襾'), + ] + +def _seg_28(): + return [ (0x2F92, 'M', u'見'), (0x2F93, 'M', u'角'), (0x2F94, 'M', u'言'), @@ -3019,13 +3008,9 @@ def _seg_28(): (0x309F, 'M', u'より'), (0x30A0, 'V'), (0x30FF, 'M', u'コト'), - ] - -def _seg_29(): - return [ (0x3100, 'X'), (0x3105, 'V'), - (0x312F, 'X'), + (0x3130, 'X'), (0x3131, 'M', u'ᄀ'), (0x3132, 'M', u'ᄁ'), (0x3133, 'M', u'ᆪ'), @@ -3034,6 +3019,10 @@ def _seg_29(): (0x3136, 'M', u'ᆭ'), (0x3137, 'M', u'ᄃ'), (0x3138, 'M', u'ᄄ'), + ] + +def _seg_29(): + return [ (0x3139, 'M', u'ᄅ'), (0x313A, 'M', u'ᆰ'), (0x313B, 'M', u'ᆱ'), @@ -3123,10 +3112,6 @@ def _seg_29(): (0x318F, 'X'), (0x3190, 'V'), (0x3192, 'M', u'一'), - ] - -def _seg_30(): - return [ (0x3193, 'M', u'二'), (0x3194, 'M', u'三'), (0x3195, 'M', u'四'), @@ -3138,6 +3123,10 @@ def _seg_30(): (0x319B, 'M', u'丙'), (0x319C, 'M', u'丁'), (0x319D, 'M', u'天'), + ] + +def _seg_30(): + return [ (0x319E, 'M', u'地'), (0x319F, 'M', u'人'), (0x31A0, 'V'), @@ -3227,10 +3216,6 @@ def _seg_30(): (0x3256, 'M', u'26'), (0x3257, 'M', u'27'), (0x3258, 'M', u'28'), - ] - -def _seg_31(): - return [ (0x3259, 'M', u'29'), (0x325A, 'M', u'30'), (0x325B, 'M', u'31'), @@ -3242,6 +3227,10 @@ def _seg_31(): (0x3261, 'M', u'ᄂ'), (0x3262, 'M', u'ᄃ'), (0x3263, 'M', u'ᄅ'), + ] + +def _seg_31(): + return [ (0x3264, 'M', u'ᄆ'), (0x3265, 'M', u'ᄇ'), (0x3266, 'M', u'ᄉ'), @@ -3331,10 +3320,6 @@ def _seg_31(): (0x32BA, 'M', u'45'), (0x32BB, 'M', u'46'), (0x32BC, 'M', u'47'), - ] - -def _seg_32(): - return [ (0x32BD, 'M', u'48'), (0x32BE, 'M', u'49'), (0x32BF, 'M', u'50'), @@ -3346,6 +3331,10 @@ def _seg_32(): (0x32C5, 'M', u'6月'), (0x32C6, 'M', u'7月'), (0x32C7, 'M', u'8月'), + ] + +def _seg_32(): + return [ (0x32C8, 'M', u'9月'), (0x32C9, 'M', u'10月'), (0x32CA, 'M', u'11月'), @@ -3435,10 +3424,6 @@ def _seg_32(): (0x331E, 'M', u'コーポ'), (0x331F, 'M', u'サイクル'), (0x3320, 'M', u'サンチーム'), - ] - -def _seg_33(): - return [ (0x3321, 'M', u'シリング'), (0x3322, 'M', u'センチ'), (0x3323, 'M', u'セント'), @@ -3450,6 +3435,10 @@ def _seg_33(): (0x3329, 'M', u'ノット'), (0x332A, 'M', u'ハイツ'), (0x332B, 'M', u'パーセント'), + ] + +def _seg_33(): + return [ (0x332C, 'M', u'パーツ'), (0x332D, 'M', u'バーレル'), (0x332E, 'M', u'ピアストル'), @@ -3539,10 +3528,6 @@ def _seg_33(): (0x3382, 'M', u'μa'), (0x3383, 'M', u'ma'), (0x3384, 'M', u'ka'), - ] - -def _seg_34(): - return [ (0x3385, 'M', u'kb'), (0x3386, 'M', u'mb'), (0x3387, 'M', u'gb'), @@ -3554,6 +3539,10 @@ def _seg_34(): (0x338D, 'M', u'μg'), (0x338E, 'M', u'mg'), (0x338F, 'M', u'kg'), + ] + +def _seg_34(): + return [ (0x3390, 'M', u'hz'), (0x3391, 'M', u'khz'), (0x3392, 'M', u'mhz'), @@ -3643,10 +3632,6 @@ def _seg_34(): (0x33E6, 'M', u'7日'), (0x33E7, 'M', u'8日'), (0x33E8, 'M', u'9日'), - ] - -def _seg_35(): - return [ (0x33E9, 'M', u'10日'), (0x33EA, 'M', u'11日'), (0x33EB, 'M', u'12日'), @@ -3658,6 +3643,10 @@ def _seg_35(): (0x33F1, 'M', u'18日'), (0x33F2, 'M', u'19日'), (0x33F3, 'M', u'20日'), + ] + +def _seg_35(): + return [ (0x33F4, 'M', u'21日'), (0x33F5, 'M', u'22日'), (0x33F6, 'M', u'23日'), @@ -3673,7 +3662,7 @@ def _seg_35(): (0x3400, 'V'), (0x4DB6, 'X'), (0x4DC0, 'V'), - (0x9FEB, 'X'), + (0x9FF0, 'X'), (0xA000, 'V'), (0xA48D, 'X'), (0xA490, 'V'), @@ -3747,10 +3736,6 @@ def _seg_35(): (0xA692, 'M', u'ꚓ'), (0xA693, 'V'), (0xA694, 'M', u'ꚕ'), - ] - -def _seg_36(): - return [ (0xA695, 'V'), (0xA696, 'M', u'ꚗ'), (0xA697, 'V'), @@ -3762,6 +3747,10 @@ def _seg_36(): (0xA69D, 'M', u'ь'), (0xA69E, 'V'), (0xA6F8, 'X'), + ] + +def _seg_36(): + return [ (0xA700, 'V'), (0xA722, 'M', u'ꜣ'), (0xA723, 'V'), @@ -3851,10 +3840,6 @@ def _seg_36(): (0xA780, 'M', u'ꞁ'), (0xA781, 'V'), (0xA782, 'M', u'ꞃ'), - ] - -def _seg_37(): - return [ (0xA783, 'V'), (0xA784, 'M', u'ꞅ'), (0xA785, 'V'), @@ -3866,6 +3851,10 @@ def _seg_37(): (0xA78E, 'V'), (0xA790, 'M', u'ꞑ'), (0xA791, 'V'), + ] + +def _seg_37(): + return [ (0xA792, 'M', u'ꞓ'), (0xA793, 'V'), (0xA796, 'M', u'ꞗ'), @@ -3893,7 +3882,7 @@ def _seg_37(): (0xA7AC, 'M', u'ɡ'), (0xA7AD, 'M', u'ɬ'), (0xA7AE, 'M', u'ɪ'), - (0xA7AF, 'X'), + (0xA7AF, 'V'), (0xA7B0, 'M', u'ʞ'), (0xA7B1, 'M', u'ʇ'), (0xA7B2, 'M', u'ʝ'), @@ -3903,6 +3892,8 @@ def _seg_37(): (0xA7B6, 'M', u'ꞷ'), (0xA7B7, 'V'), (0xA7B8, 'X'), + (0xA7B9, 'V'), + (0xA7BA, 'X'), (0xA7F7, 'V'), (0xA7F8, 'M', u'ħ'), (0xA7F9, 'M', u'œ'), @@ -3917,8 +3908,6 @@ def _seg_37(): (0xA8CE, 'V'), (0xA8DA, 'X'), (0xA8E0, 'V'), - (0xA8FE, 'X'), - (0xA900, 'V'), (0xA954, 'X'), (0xA95F, 'V'), (0xA97D, 'X'), @@ -3955,10 +3944,6 @@ def _seg_37(): (0xAB5F, 'M', u'ꭒ'), (0xAB60, 'V'), (0xAB66, 'X'), - ] - -def _seg_38(): - return [ (0xAB70, 'M', u'Ꭰ'), (0xAB71, 'M', u'Ꭱ'), (0xAB72, 'M', u'Ꭲ'), @@ -3970,6 +3955,10 @@ def _seg_38(): (0xAB78, 'M', u'Ꭸ'), (0xAB79, 'M', u'Ꭹ'), (0xAB7A, 'M', u'Ꭺ'), + ] + +def _seg_38(): + return [ (0xAB7B, 'M', u'Ꭻ'), (0xAB7C, 'M', u'Ꭼ'), (0xAB7D, 'M', u'Ꭽ'), @@ -4059,10 +4048,6 @@ def _seg_38(): (0xF907, 'M', u'龜'), (0xF909, 'M', u'契'), (0xF90A, 'M', u'金'), - ] - -def _seg_39(): - return [ (0xF90B, 'M', u'喇'), (0xF90C, 'M', u'奈'), (0xF90D, 'M', u'懶'), @@ -4074,6 +4059,10 @@ def _seg_39(): (0xF913, 'M', u'邏'), (0xF914, 'M', u'樂'), (0xF915, 'M', u'洛'), + ] + +def _seg_39(): + return [ (0xF916, 'M', u'烙'), (0xF917, 'M', u'珞'), (0xF918, 'M', u'落'), @@ -4163,10 +4152,6 @@ def _seg_39(): (0xF96C, 'M', u'塞'), (0xF96D, 'M', u'省'), (0xF96E, 'M', u'葉'), - ] - -def _seg_40(): - return [ (0xF96F, 'M', u'說'), (0xF970, 'M', u'殺'), (0xF971, 'M', u'辰'), @@ -4178,6 +4163,10 @@ def _seg_40(): (0xF977, 'M', u'亮'), (0xF978, 'M', u'兩'), (0xF979, 'M', u'凉'), + ] + +def _seg_40(): + return [ (0xF97A, 'M', u'梁'), (0xF97B, 'M', u'糧'), (0xF97C, 'M', u'良'), @@ -4267,10 +4256,6 @@ def _seg_40(): (0xF9D0, 'M', u'類'), (0xF9D1, 'M', u'六'), (0xF9D2, 'M', u'戮'), - ] - -def _seg_41(): - return [ (0xF9D3, 'M', u'陸'), (0xF9D4, 'M', u'倫'), (0xF9D5, 'M', u'崙'), @@ -4282,6 +4267,10 @@ def _seg_41(): (0xF9DB, 'M', u'率'), (0xF9DC, 'M', u'隆'), (0xF9DD, 'M', u'利'), + ] + +def _seg_41(): + return [ (0xF9DE, 'M', u'吏'), (0xF9DF, 'M', u'履'), (0xF9E0, 'M', u'易'), @@ -4371,10 +4360,6 @@ def _seg_41(): (0xFA39, 'M', u'塀'), (0xFA3A, 'M', u'墨'), (0xFA3B, 'M', u'層'), - ] - -def _seg_42(): - return [ (0xFA3C, 'M', u'屮'), (0xFA3D, 'M', u'悔'), (0xFA3E, 'M', u'慨'), @@ -4386,6 +4371,10 @@ def _seg_42(): (0xFA44, 'M', u'梅'), (0xFA45, 'M', u'海'), (0xFA46, 'M', u'渚'), + ] + +def _seg_42(): + return [ (0xFA47, 'M', u'漢'), (0xFA48, 'M', u'煮'), (0xFA49, 'M', u'爫'), @@ -4475,10 +4464,6 @@ def _seg_42(): (0xFA9F, 'M', u'犯'), (0xFAA0, 'M', u'猪'), (0xFAA1, 'M', u'瑱'), - ] - -def _seg_43(): - return [ (0xFAA2, 'M', u'甆'), (0xFAA3, 'M', u'画'), (0xFAA4, 'M', u'瘝'), @@ -4490,6 +4475,10 @@ def _seg_43(): (0xFAAA, 'M', u'着'), (0xFAAB, 'M', u'磌'), (0xFAAC, 'M', u'窱'), + ] + +def _seg_43(): + return [ (0xFAAD, 'M', u'節'), (0xFAAE, 'M', u'类'), (0xFAAF, 'M', u'絛'), @@ -4579,10 +4568,6 @@ def _seg_43(): (0xFB38, 'M', u'טּ'), (0xFB39, 'M', u'יּ'), (0xFB3A, 'M', u'ךּ'), - ] - -def _seg_44(): - return [ (0xFB3B, 'M', u'כּ'), (0xFB3C, 'M', u'לּ'), (0xFB3D, 'X'), @@ -4594,6 +4579,10 @@ def _seg_44(): (0xFB43, 'M', u'ףּ'), (0xFB44, 'M', u'פּ'), (0xFB45, 'X'), + ] + +def _seg_44(): + return [ (0xFB46, 'M', u'צּ'), (0xFB47, 'M', u'קּ'), (0xFB48, 'M', u'רּ'), @@ -4683,10 +4672,6 @@ def _seg_44(): (0xFC19, 'M', u'خج'), (0xFC1A, 'M', u'خح'), (0xFC1B, 'M', u'خم'), - ] - -def _seg_45(): - return [ (0xFC1C, 'M', u'سج'), (0xFC1D, 'M', u'سح'), (0xFC1E, 'M', u'سخ'), @@ -4698,6 +4683,10 @@ def _seg_45(): (0xFC24, 'M', u'ضخ'), (0xFC25, 'M', u'ضم'), (0xFC26, 'M', u'طح'), + ] + +def _seg_45(): + return [ (0xFC27, 'M', u'طم'), (0xFC28, 'M', u'ظم'), (0xFC29, 'M', u'عج'), @@ -4787,10 +4776,6 @@ def _seg_45(): (0xFC7D, 'M', u'في'), (0xFC7E, 'M', u'قى'), (0xFC7F, 'M', u'قي'), - ] - -def _seg_46(): - return [ (0xFC80, 'M', u'كا'), (0xFC81, 'M', u'كل'), (0xFC82, 'M', u'كم'), @@ -4802,6 +4787,10 @@ def _seg_46(): (0xFC88, 'M', u'ما'), (0xFC89, 'M', u'مم'), (0xFC8A, 'M', u'نر'), + ] + +def _seg_46(): + return [ (0xFC8B, 'M', u'نز'), (0xFC8C, 'M', u'نم'), (0xFC8D, 'M', u'نن'), @@ -4891,10 +4880,6 @@ def _seg_46(): (0xFCE1, 'M', u'بم'), (0xFCE2, 'M', u'به'), (0xFCE3, 'M', u'تم'), - ] - -def _seg_47(): - return [ (0xFCE4, 'M', u'ته'), (0xFCE5, 'M', u'ثم'), (0xFCE6, 'M', u'ثه'), @@ -4906,6 +4891,10 @@ def _seg_47(): (0xFCEC, 'M', u'كم'), (0xFCED, 'M', u'لم'), (0xFCEE, 'M', u'نم'), + ] + +def _seg_47(): + return [ (0xFCEF, 'M', u'نه'), (0xFCF0, 'M', u'يم'), (0xFCF1, 'M', u'يه'), @@ -4995,10 +4984,6 @@ def _seg_47(): (0xFD57, 'M', u'تمخ'), (0xFD58, 'M', u'جمح'), (0xFD5A, 'M', u'حمي'), - ] - -def _seg_48(): - return [ (0xFD5B, 'M', u'حمى'), (0xFD5C, 'M', u'سحج'), (0xFD5D, 'M', u'سجح'), @@ -5010,6 +4995,10 @@ def _seg_48(): (0xFD66, 'M', u'صمم'), (0xFD67, 'M', u'شحم'), (0xFD69, 'M', u'شجي'), + ] + +def _seg_48(): + return [ (0xFD6A, 'M', u'شمخ'), (0xFD6C, 'M', u'شمم'), (0xFD6E, 'M', u'ضحى'), @@ -5099,10 +5088,6 @@ def _seg_48(): (0xFDF3, 'M', u'اكبر'), (0xFDF4, 'M', u'محمد'), (0xFDF5, 'M', u'صلعم'), - ] - -def _seg_49(): - return [ (0xFDF6, 'M', u'رسول'), (0xFDF7, 'M', u'عليه'), (0xFDF8, 'M', u'وسلم'), @@ -5114,6 +5099,10 @@ def _seg_49(): (0xFDFE, 'X'), (0xFE00, 'I'), (0xFE10, '3', u','), + ] + +def _seg_49(): + return [ (0xFE11, 'M', u'、'), (0xFE12, 'X'), (0xFE13, '3', u':'), @@ -5203,10 +5192,6 @@ def _seg_49(): (0xFE8F, 'M', u'ب'), (0xFE93, 'M', u'ة'), (0xFE95, 'M', u'ت'), - ] - -def _seg_50(): - return [ (0xFE99, 'M', u'ث'), (0xFE9D, 'M', u'ج'), (0xFEA1, 'M', u'ح'), @@ -5218,6 +5203,10 @@ def _seg_50(): (0xFEB1, 'M', u'س'), (0xFEB5, 'M', u'ش'), (0xFEB9, 'M', u'ص'), + ] + +def _seg_50(): + return [ (0xFEBD, 'M', u'ض'), (0xFEC1, 'M', u'ط'), (0xFEC5, 'M', u'ظ'), @@ -5307,10 +5296,6 @@ def _seg_50(): (0xFF41, 'M', u'a'), (0xFF42, 'M', u'b'), (0xFF43, 'M', u'c'), - ] - -def _seg_51(): - return [ (0xFF44, 'M', u'd'), (0xFF45, 'M', u'e'), (0xFF46, 'M', u'f'), @@ -5322,6 +5307,10 @@ def _seg_51(): (0xFF4C, 'M', u'l'), (0xFF4D, 'M', u'm'), (0xFF4E, 'M', u'n'), + ] + +def _seg_51(): + return [ (0xFF4F, 'M', u'o'), (0xFF50, 'M', u'p'), (0xFF51, 'M', u'q'), @@ -5411,10 +5400,6 @@ def _seg_51(): (0xFFA5, 'M', u'ᆬ'), (0xFFA6, 'M', u'ᆭ'), (0xFFA7, 'M', u'ᄃ'), - ] - -def _seg_52(): - return [ (0xFFA8, 'M', u'ᄄ'), (0xFFA9, 'M', u'ᄅ'), (0xFFAA, 'M', u'ᆰ'), @@ -5426,6 +5411,10 @@ def _seg_52(): (0xFFB0, 'M', u'ᄚ'), (0xFFB1, 'M', u'ᄆ'), (0xFFB2, 'M', u'ᄇ'), + ] + +def _seg_52(): + return [ (0xFFB3, 'M', u'ᄈ'), (0xFFB4, 'M', u'ᄡ'), (0xFFB5, 'M', u'ᄉ'), @@ -5515,10 +5504,6 @@ def _seg_52(): (0x10300, 'V'), (0x10324, 'X'), (0x1032D, 'V'), - ] - -def _seg_53(): - return [ (0x1034B, 'X'), (0x10350, 'V'), (0x1037B, 'X'), @@ -5530,6 +5515,10 @@ def _seg_53(): (0x103D6, 'X'), (0x10400, 'M', u'𐐨'), (0x10401, 'M', u'𐐩'), + ] + +def _seg_53(): + return [ (0x10402, 'M', u'𐐪'), (0x10403, 'M', u'𐐫'), (0x10404, 'M', u'𐐬'), @@ -5619,10 +5608,6 @@ def _seg_53(): (0x10570, 'X'), (0x10600, 'V'), (0x10737, 'X'), - ] - -def _seg_54(): - return [ (0x10740, 'V'), (0x10756, 'X'), (0x10760, 'V'), @@ -5634,6 +5619,10 @@ def _seg_54(): (0x1080A, 'V'), (0x10836, 'X'), (0x10837, 'V'), + ] + +def _seg_54(): + return [ (0x10839, 'X'), (0x1083C, 'V'), (0x1083D, 'X'), @@ -5666,11 +5655,11 @@ def _seg_54(): (0x10A15, 'V'), (0x10A18, 'X'), (0x10A19, 'V'), - (0x10A34, 'X'), + (0x10A36, 'X'), (0x10A38, 'V'), (0x10A3B, 'X'), (0x10A3F, 'V'), - (0x10A48, 'X'), + (0x10A49, 'X'), (0x10A50, 'V'), (0x10A59, 'X'), (0x10A60, 'V'), @@ -5723,10 +5712,6 @@ def _seg_54(): (0x10C9B, 'M', u'𐳛'), (0x10C9C, 'M', u'𐳜'), (0x10C9D, 'M', u'𐳝'), - ] - -def _seg_55(): - return [ (0x10C9E, 'M', u'𐳞'), (0x10C9F, 'M', u'𐳟'), (0x10CA0, 'M', u'𐳠'), @@ -5738,6 +5723,10 @@ def _seg_55(): (0x10CA6, 'M', u'𐳦'), (0x10CA7, 'M', u'𐳧'), (0x10CA8, 'M', u'𐳨'), + ] + +def _seg_55(): + return [ (0x10CA9, 'M', u'𐳩'), (0x10CAA, 'M', u'𐳪'), (0x10CAB, 'M', u'𐳫'), @@ -5752,9 +5741,15 @@ def _seg_55(): (0x10CC0, 'V'), (0x10CF3, 'X'), (0x10CFA, 'V'), - (0x10D00, 'X'), + (0x10D28, 'X'), + (0x10D30, 'V'), + (0x10D3A, 'X'), (0x10E60, 'V'), (0x10E7F, 'X'), + (0x10F00, 'V'), + (0x10F28, 'X'), + (0x10F30, 'V'), + (0x10F5A, 'X'), (0x11000, 'V'), (0x1104E, 'X'), (0x11052, 'V'), @@ -5770,7 +5765,7 @@ def _seg_55(): (0x11100, 'V'), (0x11135, 'X'), (0x11136, 'V'), - (0x11144, 'X'), + (0x11147, 'X'), (0x11150, 'V'), (0x11177, 'X'), (0x11180, 'V'), @@ -5811,7 +5806,7 @@ def _seg_55(): (0x11334, 'X'), (0x11335, 'V'), (0x1133A, 'X'), - (0x1133C, 'V'), + (0x1133B, 'V'), (0x11345, 'X'), (0x11347, 'V'), (0x11349, 'X'), @@ -5827,16 +5822,16 @@ def _seg_55(): (0x1136D, 'X'), (0x11370, 'V'), (0x11375, 'X'), - ] - -def _seg_56(): - return [ (0x11400, 'V'), (0x1145A, 'X'), (0x1145B, 'V'), (0x1145C, 'X'), (0x1145D, 'V'), - (0x1145E, 'X'), + ] + +def _seg_56(): + return [ + (0x1145F, 'X'), (0x11480, 'V'), (0x114C8, 'X'), (0x114D0, 'V'), @@ -5856,11 +5851,13 @@ def _seg_56(): (0x116C0, 'V'), (0x116CA, 'X'), (0x11700, 'V'), - (0x1171A, 'X'), + (0x1171B, 'X'), (0x1171D, 'V'), (0x1172C, 'X'), (0x11730, 'V'), (0x11740, 'X'), + (0x11800, 'V'), + (0x1183C, 'X'), (0x118A0, 'M', u'𑣀'), (0x118A1, 'M', u'𑣁'), (0x118A2, 'M', u'𑣂'), @@ -5902,8 +5899,6 @@ def _seg_56(): (0x11A50, 'V'), (0x11A84, 'X'), (0x11A86, 'V'), - (0x11A9D, 'X'), - (0x11A9E, 'V'), (0x11AA3, 'X'), (0x11AC0, 'V'), (0x11AF9, 'X'), @@ -5931,14 +5926,28 @@ def _seg_56(): (0x11D3B, 'X'), (0x11D3C, 'V'), (0x11D3E, 'X'), - ] - -def _seg_57(): - return [ (0x11D3F, 'V'), (0x11D48, 'X'), (0x11D50, 'V'), (0x11D5A, 'X'), + (0x11D60, 'V'), + ] + +def _seg_57(): + return [ + (0x11D66, 'X'), + (0x11D67, 'V'), + (0x11D69, 'X'), + (0x11D6A, 'V'), + (0x11D8F, 'X'), + (0x11D90, 'V'), + (0x11D92, 'X'), + (0x11D93, 'V'), + (0x11D99, 'X'), + (0x11DA0, 'V'), + (0x11DAA, 'X'), + (0x11EE0, 'V'), + (0x11EF9, 'X'), (0x12000, 'V'), (0x1239A, 'X'), (0x12400, 'V'), @@ -5973,6 +5982,8 @@ def _seg_57(): (0x16B78, 'X'), (0x16B7D, 'V'), (0x16B90, 'X'), + (0x16E60, 'V'), + (0x16E9B, 'X'), (0x16F00, 'V'), (0x16F45, 'X'), (0x16F50, 'V'), @@ -5982,7 +5993,7 @@ def _seg_57(): (0x16FE0, 'V'), (0x16FE2, 'X'), (0x17000, 'V'), - (0x187ED, 'X'), + (0x187F2, 'X'), (0x18800, 'V'), (0x18AF3, 'X'), (0x1B000, 'V'), @@ -6024,21 +6035,23 @@ def _seg_57(): (0x1D1C1, 'V'), (0x1D1E9, 'X'), (0x1D200, 'V'), + ] + +def _seg_58(): + return [ (0x1D246, 'X'), + (0x1D2E0, 'V'), + (0x1D2F4, 'X'), (0x1D300, 'V'), (0x1D357, 'X'), (0x1D360, 'V'), - (0x1D372, 'X'), + (0x1D379, 'X'), (0x1D400, 'M', u'a'), (0x1D401, 'M', u'b'), (0x1D402, 'M', u'c'), (0x1D403, 'M', u'd'), (0x1D404, 'M', u'e'), (0x1D405, 'M', u'f'), - ] - -def _seg_58(): - return [ (0x1D406, 'M', u'g'), (0x1D407, 'M', u'h'), (0x1D408, 'M', u'i'), @@ -6126,6 +6139,10 @@ def _seg_58(): (0x1D45A, 'M', u'm'), (0x1D45B, 'M', u'n'), (0x1D45C, 'M', u'o'), + ] + +def _seg_59(): + return [ (0x1D45D, 'M', u'p'), (0x1D45E, 'M', u'q'), (0x1D45F, 'M', u'r'), @@ -6139,10 +6156,6 @@ def _seg_58(): (0x1D467, 'M', u'z'), (0x1D468, 'M', u'a'), (0x1D469, 'M', u'b'), - ] - -def _seg_59(): - return [ (0x1D46A, 'M', u'c'), (0x1D46B, 'M', u'd'), (0x1D46C, 'M', u'e'), @@ -6230,6 +6243,10 @@ def _seg_59(): (0x1D4C1, 'M', u'l'), (0x1D4C2, 'M', u'm'), (0x1D4C3, 'M', u'n'), + ] + +def _seg_60(): + return [ (0x1D4C4, 'X'), (0x1D4C5, 'M', u'p'), (0x1D4C6, 'M', u'q'), @@ -6243,10 +6260,6 @@ def _seg_59(): (0x1D4CE, 'M', u'y'), (0x1D4CF, 'M', u'z'), (0x1D4D0, 'M', u'a'), - ] - -def _seg_60(): - return [ (0x1D4D1, 'M', u'b'), (0x1D4D2, 'M', u'c'), (0x1D4D3, 'M', u'd'), @@ -6334,6 +6347,10 @@ def _seg_60(): (0x1D526, 'M', u'i'), (0x1D527, 'M', u'j'), (0x1D528, 'M', u'k'), + ] + +def _seg_61(): + return [ (0x1D529, 'M', u'l'), (0x1D52A, 'M', u'm'), (0x1D52B, 'M', u'n'), @@ -6347,10 +6364,6 @@ def _seg_60(): (0x1D533, 'M', u'v'), (0x1D534, 'M', u'w'), (0x1D535, 'M', u'x'), - ] - -def _seg_61(): - return [ (0x1D536, 'M', u'y'), (0x1D537, 'M', u'z'), (0x1D538, 'M', u'a'), @@ -6438,6 +6451,10 @@ def _seg_61(): (0x1D58C, 'M', u'g'), (0x1D58D, 'M', u'h'), (0x1D58E, 'M', u'i'), + ] + +def _seg_62(): + return [ (0x1D58F, 'M', u'j'), (0x1D590, 'M', u'k'), (0x1D591, 'M', u'l'), @@ -6451,10 +6468,6 @@ def _seg_61(): (0x1D599, 'M', u't'), (0x1D59A, 'M', u'u'), (0x1D59B, 'M', u'v'), - ] - -def _seg_62(): - return [ (0x1D59C, 'M', u'w'), (0x1D59D, 'M', u'x'), (0x1D59E, 'M', u'y'), @@ -6542,6 +6555,10 @@ def _seg_62(): (0x1D5F0, 'M', u'c'), (0x1D5F1, 'M', u'd'), (0x1D5F2, 'M', u'e'), + ] + +def _seg_63(): + return [ (0x1D5F3, 'M', u'f'), (0x1D5F4, 'M', u'g'), (0x1D5F5, 'M', u'h'), @@ -6555,10 +6572,6 @@ def _seg_62(): (0x1D5FD, 'M', u'p'), (0x1D5FE, 'M', u'q'), (0x1D5FF, 'M', u'r'), - ] - -def _seg_63(): - return [ (0x1D600, 'M', u's'), (0x1D601, 'M', u't'), (0x1D602, 'M', u'u'), @@ -6646,6 +6659,10 @@ def _seg_63(): (0x1D654, 'M', u'y'), (0x1D655, 'M', u'z'), (0x1D656, 'M', u'a'), + ] + +def _seg_64(): + return [ (0x1D657, 'M', u'b'), (0x1D658, 'M', u'c'), (0x1D659, 'M', u'd'), @@ -6659,10 +6676,6 @@ def _seg_63(): (0x1D661, 'M', u'l'), (0x1D662, 'M', u'm'), (0x1D663, 'M', u'n'), - ] - -def _seg_64(): - return [ (0x1D664, 'M', u'o'), (0x1D665, 'M', u'p'), (0x1D666, 'M', u'q'), @@ -6750,6 +6763,10 @@ def _seg_64(): (0x1D6B9, 'M', u'θ'), (0x1D6BA, 'M', u'σ'), (0x1D6BB, 'M', u'τ'), + ] + +def _seg_65(): + return [ (0x1D6BC, 'M', u'υ'), (0x1D6BD, 'M', u'φ'), (0x1D6BE, 'M', u'χ'), @@ -6763,10 +6780,6 @@ def _seg_64(): (0x1D6C6, 'M', u'ε'), (0x1D6C7, 'M', u'ζ'), (0x1D6C8, 'M', u'η'), - ] - -def _seg_65(): - return [ (0x1D6C9, 'M', u'θ'), (0x1D6CA, 'M', u'ι'), (0x1D6CB, 'M', u'κ'), @@ -6854,6 +6867,10 @@ def _seg_65(): (0x1D71F, 'M', u'δ'), (0x1D720, 'M', u'ε'), (0x1D721, 'M', u'ζ'), + ] + +def _seg_66(): + return [ (0x1D722, 'M', u'η'), (0x1D723, 'M', u'θ'), (0x1D724, 'M', u'ι'), @@ -6867,10 +6884,6 @@ def _seg_65(): (0x1D72C, 'M', u'ρ'), (0x1D72D, 'M', u'θ'), (0x1D72E, 'M', u'σ'), - ] - -def _seg_66(): - return [ (0x1D72F, 'M', u'τ'), (0x1D730, 'M', u'υ'), (0x1D731, 'M', u'φ'), @@ -6958,6 +6971,10 @@ def _seg_66(): (0x1D785, 'M', u'φ'), (0x1D786, 'M', u'χ'), (0x1D787, 'M', u'ψ'), + ] + +def _seg_67(): + return [ (0x1D788, 'M', u'ω'), (0x1D789, 'M', u'∂'), (0x1D78A, 'M', u'ε'), @@ -6971,10 +6988,6 @@ def _seg_66(): (0x1D792, 'M', u'γ'), (0x1D793, 'M', u'δ'), (0x1D794, 'M', u'ε'), - ] - -def _seg_67(): - return [ (0x1D795, 'M', u'ζ'), (0x1D796, 'M', u'η'), (0x1D797, 'M', u'θ'), @@ -7062,6 +7075,10 @@ def _seg_67(): (0x1D7EC, 'M', u'0'), (0x1D7ED, 'M', u'1'), (0x1D7EE, 'M', u'2'), + ] + +def _seg_68(): + return [ (0x1D7EF, 'M', u'3'), (0x1D7F0, 'M', u'4'), (0x1D7F1, 'M', u'5'), @@ -7075,10 +7092,6 @@ def _seg_67(): (0x1D7F9, 'M', u'3'), (0x1D7FA, 'M', u'4'), (0x1D7FB, 'M', u'5'), - ] - -def _seg_68(): - return [ (0x1D7FC, 'M', u'6'), (0x1D7FD, 'M', u'7'), (0x1D7FE, 'M', u'8'), @@ -7143,6 +7156,8 @@ def _seg_68(): (0x1E95A, 'X'), (0x1E95E, 'V'), (0x1E960, 'X'), + (0x1EC71, 'V'), + (0x1ECB5, 'X'), (0x1EE00, 'M', u'ا'), (0x1EE01, 'M', u'ب'), (0x1EE02, 'M', u'ج'), @@ -7164,6 +7179,10 @@ def _seg_68(): (0x1EE12, 'M', u'ق'), (0x1EE13, 'M', u'ر'), (0x1EE14, 'M', u'ش'), + ] + +def _seg_69(): + return [ (0x1EE15, 'M', u'ت'), (0x1EE16, 'M', u'ث'), (0x1EE17, 'M', u'خ'), @@ -7179,10 +7198,6 @@ def _seg_68(): (0x1EE21, 'M', u'ب'), (0x1EE22, 'M', u'ج'), (0x1EE23, 'X'), - ] - -def _seg_69(): - return [ (0x1EE24, 'M', u'ه'), (0x1EE25, 'X'), (0x1EE27, 'M', u'ح'), @@ -7268,6 +7283,10 @@ def _seg_69(): (0x1EE81, 'M', u'ب'), (0x1EE82, 'M', u'ج'), (0x1EE83, 'M', u'د'), + ] + +def _seg_70(): + return [ (0x1EE84, 'M', u'ه'), (0x1EE85, 'M', u'و'), (0x1EE86, 'M', u'ز'), @@ -7283,10 +7302,6 @@ def _seg_69(): (0x1EE90, 'M', u'ف'), (0x1EE91, 'M', u'ص'), (0x1EE92, 'M', u'ق'), - ] - -def _seg_70(): - return [ (0x1EE93, 'M', u'ر'), (0x1EE94, 'M', u'ش'), (0x1EE95, 'M', u'ت'), @@ -7372,6 +7387,10 @@ def _seg_70(): (0x1F122, '3', u'(s)'), (0x1F123, '3', u'(t)'), (0x1F124, '3', u'(u)'), + ] + +def _seg_71(): + return [ (0x1F125, '3', u'(v)'), (0x1F126, '3', u'(w)'), (0x1F127, '3', u'(x)'), @@ -7382,15 +7401,11 @@ def _seg_70(): (0x1F12C, 'M', u'r'), (0x1F12D, 'M', u'cd'), (0x1F12E, 'M', u'wz'), - (0x1F12F, 'X'), + (0x1F12F, 'V'), (0x1F130, 'M', u'a'), (0x1F131, 'M', u'b'), (0x1F132, 'M', u'c'), (0x1F133, 'M', u'd'), - ] - -def _seg_71(): - return [ (0x1F134, 'M', u'e'), (0x1F135, 'M', u'f'), (0x1F136, 'M', u'g'), @@ -7476,6 +7491,10 @@ def _seg_71(): (0x1F239, 'M', u'割'), (0x1F23A, 'M', u'営'), (0x1F23B, 'M', u'配'), + ] + +def _seg_72(): + return [ (0x1F23C, 'X'), (0x1F240, 'M', u'〔本〕'), (0x1F241, 'M', u'〔三〕'), @@ -7491,21 +7510,17 @@ def _seg_71(): (0x1F251, 'M', u'可'), (0x1F252, 'X'), (0x1F260, 'V'), - ] - -def _seg_72(): - return [ (0x1F266, 'X'), (0x1F300, 'V'), (0x1F6D5, 'X'), (0x1F6E0, 'V'), (0x1F6ED, 'X'), (0x1F6F0, 'V'), - (0x1F6F9, 'X'), + (0x1F6FA, 'X'), (0x1F700, 'V'), (0x1F774, 'X'), (0x1F780, 'V'), - (0x1F7D5, 'X'), + (0x1F7D9, 'X'), (0x1F800, 'V'), (0x1F80C, 'X'), (0x1F810, 'V'), @@ -7521,15 +7536,21 @@ def _seg_72(): (0x1F910, 'V'), (0x1F93F, 'X'), (0x1F940, 'V'), - (0x1F94D, 'X'), - (0x1F950, 'V'), - (0x1F96C, 'X'), - (0x1F980, 'V'), - (0x1F998, 'X'), + (0x1F971, 'X'), + (0x1F973, 'V'), + (0x1F977, 'X'), + (0x1F97A, 'V'), + (0x1F97B, 'X'), + (0x1F97C, 'V'), + (0x1F9A3, 'X'), + (0x1F9B0, 'V'), + (0x1F9BA, 'X'), (0x1F9C0, 'V'), - (0x1F9C1, 'X'), + (0x1F9C3, 'X'), (0x1F9D0, 'V'), - (0x1F9E7, 'X'), + (0x1FA00, 'X'), + (0x1FA60, 'V'), + (0x1FA6E, 'X'), (0x20000, 'V'), (0x2A6D7, 'X'), (0x2A700, 'V'), @@ -7574,6 +7595,10 @@ def _seg_72(): (0x2F81F, 'M', u'㓟'), (0x2F820, 'M', u'刻'), (0x2F821, 'M', u'剆'), + ] + +def _seg_73(): + return [ (0x2F822, 'M', u'割'), (0x2F823, 'M', u'剷'), (0x2F824, 'M', u'㔕'), @@ -7595,10 +7620,6 @@ def _seg_72(): (0x2F836, 'M', u'及'), (0x2F837, 'M', u'叟'), (0x2F838, 'M', u'𠭣'), - ] - -def _seg_73(): - return [ (0x2F839, 'M', u'叫'), (0x2F83A, 'M', u'叱'), (0x2F83B, 'M', u'吆'), @@ -7678,6 +7699,10 @@ def _seg_73(): (0x2F887, 'M', u'幩'), (0x2F888, 'M', u'㡢'), (0x2F889, 'M', u'𢆃'), + ] + +def _seg_74(): + return [ (0x2F88A, 'M', u'㡼'), (0x2F88B, 'M', u'庰'), (0x2F88C, 'M', u'庳'), @@ -7699,10 +7724,6 @@ def _seg_73(): (0x2F89E, 'M', u'志'), (0x2F89F, 'M', u'忹'), (0x2F8A0, 'M', u'悁'), - ] - -def _seg_74(): - return [ (0x2F8A1, 'M', u'㤺'), (0x2F8A2, 'M', u'㤜'), (0x2F8A3, 'M', u'悔'), @@ -7782,6 +7803,10 @@ def _seg_74(): (0x2F8ED, 'M', u'櫛'), (0x2F8EE, 'M', u'㰘'), (0x2F8EF, 'M', u'次'), + ] + +def _seg_75(): + return [ (0x2F8F0, 'M', u'𣢧'), (0x2F8F1, 'M', u'歔'), (0x2F8F2, 'M', u'㱎'), @@ -7803,10 +7828,6 @@ def _seg_74(): (0x2F902, 'M', u'流'), (0x2F903, 'M', u'浩'), (0x2F904, 'M', u'浸'), - ] - -def _seg_75(): - return [ (0x2F905, 'M', u'涅'), (0x2F906, 'M', u'𣴞'), (0x2F907, 'M', u'洴'), @@ -7886,6 +7907,10 @@ def _seg_75(): (0x2F953, 'M', u'祖'), (0x2F954, 'M', u'𥚚'), (0x2F955, 'M', u'𥛅'), + ] + +def _seg_76(): + return [ (0x2F956, 'M', u'福'), (0x2F957, 'M', u'秫'), (0x2F958, 'M', u'䄯'), @@ -7907,10 +7932,6 @@ def _seg_75(): (0x2F969, 'M', u'糣'), (0x2F96A, 'M', u'紀'), (0x2F96B, 'M', u'𥾆'), - ] - -def _seg_76(): - return [ (0x2F96C, 'M', u'絣'), (0x2F96D, 'M', u'䌁'), (0x2F96E, 'M', u'緇'), @@ -7990,6 +8011,10 @@ def _seg_76(): (0x2F9B8, 'M', u'蚈'), (0x2F9B9, 'M', u'蜎'), (0x2F9BA, 'M', u'蛢'), + ] + +def _seg_77(): + return [ (0x2F9BB, 'M', u'蝹'), (0x2F9BC, 'M', u'蜨'), (0x2F9BD, 'M', u'蝫'), @@ -8011,10 +8036,6 @@ def _seg_76(): (0x2F9CD, 'M', u'䚾'), (0x2F9CE, 'M', u'䛇'), (0x2F9CF, 'M', u'誠'), - ] - -def _seg_77(): - return [ (0x2F9D0, 'M', u'諭'), (0x2F9D1, 'M', u'變'), (0x2F9D2, 'M', u'豕'), @@ -8094,6 +8115,10 @@ def _seg_77(): (0x2FA1D, 'M', u'𪘀'), (0x2FA1E, 'X'), (0xE0100, 'I'), + ] + +def _seg_78(): + return [ (0xE01F0, 'X'), ] @@ -8176,4 +8201,5 @@ uts46data = tuple( + _seg_75() + _seg_76() + _seg_77() + + _seg_78() ) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/__init__.cpython-37.pyc index c2a6a9d2f2edc94d1b64a97f376c8b9a9c11709a..abbfa854a831f9c3e01792c5c0834ac050edc086 100644 GIT binary patch delta 35 pcmeD1?eOJs;^pOH0D`>560sY3`Z+jK3M=y}4AU|;FXnhE3jm_i3X%W- delta 35 pcmeD1?eOJs;^pOH0D`FbYB3vm`Z+j~%hU6+N(xOjFXnhE3jm?;3Wfjx diff --git a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-37.pyc index 183bb94b70b973cc332786b3db3d3d24f6cfa2da..5ffeff996db43c7882ca1b669fb5a4e6fb89259c 100644 GIT binary patch delta 35 pcmX>qcvO(biIqcvO(biIF+PDk(JC9Ltiy0sx!Y30?pI diff --git a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-37.pyc index 036ef7bddd418b5674232d860f720b8ba44d410d..0ce2eca220b9efe765c8d7ae3627d34f03c6b61f 100644 GIT binary patch delta 35 pcmZ24vR;J8iI3q3P}I} delta 35 pcmZ24vR;J8iI0`3OxV- diff --git a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-37.pyc index cc9a5eddacec27cdfe826719efcaed595206dcd3..3e32b6d88745cf234db755d54dec9541a462d24c 100644 GIT binary patch delta 35 pcmX@EdR&#qiI1O6gDXh$^FigwXJfB&E9{{Hf3F80& delta 35 pcmX@EdR&#qiI1O6gE>F+PDk(JCJfB&E9{{E*3D*Ds diff --git a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-37.pyc index 296d15d5e6813aa251584c9d44496a896dbddf51..2a36825fdb0dafe8a98d8ca73194180411d5c800 100644 GIT binary patch delta 35 pcmew*^Gk-uiIF+PDk(JCT+G7G1puwT39kSE diff --git a/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-37.pyc index ac8c5f8fb3aa097fccccf7c1dc1371794cfd1156..7fec0bf8049e5fa7eb1e1a9997599352e75a95ad 100644 GIT binary patch delta 35 pcmca4a7lp2iIF+PDk(JCtj(m(1^}9W2+sfj diff --git a/env/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc index 1d82eb9c518362e168c35e0e8bff66c5d29b9c93..231781ba2759ce8bfa28bca855358eed496d9266 100644 GIT binary patch delta 35 pcmaFG|B9c-iIStk^lg)s|h>+ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc index b8e24d48f477b21ad0242c95f025d9374c10e290..bf051050abe27cf3057aae43ebe97f780f3e69dd 100644 GIT binary patch delta 35 pcmcaCa9M!IiIF+PDk(JCJe_e58vvwB3OoP+ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc index 44c4ecd4b8ff7a558134f2d80a817a80c4a93c85..4c62af9a5ca2015c05cac6bf6aeb564b9dd735e9 100644 GIT binary patch delta 45 zcmdnKpK<$sMjj_#UM>b8$XhHCyOBqhi6f=3GOxlgEn~AG(<^4CBEHSCY_lQ(C!q}- delta 45 zcmdnKpK<$sMjj_#UM>b8h?=h!vyn%Zi6gl@Juj=I&}6eA(<^4CVusDKY_lQ(CJ_w- diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__about__.py b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__about__.py index 21fc6ce..7481c9e 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__about__.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__about__.py @@ -4,18 +4,24 @@ from __future__ import absolute_import, division, print_function __all__ = [ - "__title__", "__summary__", "__uri__", "__version__", "__author__", - "__email__", "__license__", "__copyright__", + "__title__", + "__summary__", + "__uri__", + "__version__", + "__author__", + "__email__", + "__license__", + "__copyright__", ] __title__ = "packaging" __summary__ = "Core utilities for Python packages" __uri__ = "https://github.com/pypa/packaging" -__version__ = "18.0" +__version__ = "19.0" __author__ = "Donald Stufft and individual contributors" __email__ = "donald@stufft.io" __license__ = "BSD or Apache License, Version 2.0" -__copyright__ = "Copyright 2014-2018 %s" % __author__ +__copyright__ = "Copyright 2014-2019 %s" % __author__ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__init__.py index 5ee6220..a0cf67d 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__init__.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__init__.py @@ -4,11 +4,23 @@ from __future__ import absolute_import, division, print_function from .__about__ import ( - __author__, __copyright__, __email__, __license__, __summary__, __title__, - __uri__, __version__ + __author__, + __copyright__, + __email__, + __license__, + __summary__, + __title__, + __uri__, + __version__, ) __all__ = [ - "__title__", "__summary__", "__uri__", "__version__", "__author__", - "__email__", "__license__", "__copyright__", + "__title__", + "__summary__", + "__uri__", + "__version__", + "__author__", + "__email__", + "__license__", + "__copyright__", ] diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc index d41d76007098dfacbeac71b1c4becae51fdafc9e..d578a5a760537e007e9f748a2a4c7375f58c8cd9 100644 GIT binary patch delta 84 zcmZ3&x`CC~iIF+PDk(IX9L8iOAp%q; S!pz0U#mvG8giJsPA{ha7G!4@L diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc index 4e5207bfd411a7227df1e5cf7d3f38edc5feefee..8ff90c3e0c9dfb3520f8d66ded91189934afb264 100644 GIT binary patch delta 58 zcmZo->0{w_;^pOH0D`>560t@bdDk&=q!d=>RT!paOg_wLDkcP!5@FKdVPZsv0B{Bg A{{R30 delta 46 zcmeBUX=34Z;^pOH0D`FbYB7u(dDk&=B$ub>Wt9|~Og_wL%Ebnh5@FI{<6;B=@QMkV diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc index 70de80132cb912ea9aa0976bf7fa7a32d94c1c8a..0cb896495ab12ec21c6b7b3edd9f2d4ff5b62a11 100644 GIT binary patch delta 42 wcmX@cevF;hiIOV delta 42 wcmX@cevF;hiI560sc{d1DwkQVJ{cDh$&yCKoaqGjdE`%2>k4Jz0t=laX)o zLuT>Gvzh!D1;MPZ?D~@pn5`H^z`Q2rI7V?GE0s|S%#UO7W0VE6j<7^9DomDToy^EM zc_ZsJMvck;*yJbgVKkh4gH4rD8_3IH)SJA3Qyyrx>g4t8YCstf?<;#GqY0Rm#}UnF x4raaN@Mg3EvJ@tVa(Xe^0$FK{4wKorYPi*bo+uUq5*&<^`?&I1W!aboWC3?FKzINE delta 227 zcmZn?YZBvi;^pOH0D`FbYB60Kd1DwklFQTcvPud~CKoaqGjdK|%2>k4Gg*o$laYV& zLuT>Gvzh!Dg}|(@?D~@pn5`H^!MrBsI7SH|E0s|i%#UO7W0V84j<7^9Do&PVoy^EI zc_ZsJMy<*J*yJbgVKkh4gH4rD7s$(DG?=`AQyyrx>g4t8YK+EU-dFZWMl&!gk0YAV y63lwZ;mv3RWGPGz<@92-2eQ%_ohGw$)o^P7Jy9$KBsiER_i^R3%CRvE$N>O(lt7LE diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc index df19a280c31bfebd4d834e484f1d39cd1d0b3ba5..29ebeff30a3fecd20e022f5d14c9c3df98168f86 100644 GIT binary patch delta 1017 zcmYLHOH5Ni6y;9)rmye4(%SaXXIm_-hEQDqQ86e~G^mvLC8&shpa_C3PDMUZxw{UqvY{R$~P&N|1fwTU4 zV-vBWb9gX+OsvQ1z=Ddcws1H%m`ys0{K!Eulo4VJb_c>q>6)UE4-=F@(4~O^er7Pr z3!I>_AY~Y2Vk^!C68I#rgx{upbj`Uy9q*QOH*WKWYVX)8K~fcKXqx2N+_9>`tZ0!7 z*3>-7nrXyoq?*NQJRE!sJF(hauE`)pmK&i!8M6i+;3cyXdho9K!hBAyyxn&&m%(6~FXW@`!ad;N?&YwBzg0e5HegS)2MT6j@ z>RSwp(N$dbNSvG2!%Bjfi7P8lf>n4_IRk!~j5tS-bcmSbeRv>N4-uS>t%E6i6%XO3 znBvi8?9yvj-3V2+`boL@l!Oz7RaI%w&qyxcCbjxv914HmKBYXwD3{D~d} z{}_YbB*u7B6Vn(IjqxTXp162uxR7}9V!%WbjR$A8CMNF7``-7ynVp?C^Y(kgQiEfc z!=ak!>3LXsB=o}3WmWpe2GWDs)73a+T?fnYzV$7H3Af;+JOyhoT=X0^;GE*Yg`z`H zh1->BsHXiWY{4d5x3->wWfTHM!l$-LNZ>ZL#ZkkmWT>JH$Fyqvpgz)e{!{Ucb_tsC zht>{KuGzjyvZmOGr;BgNW6Vrwb@t2S1)6rAkS`bLyz?d8#wk~y-bBJp7G(kxs8B44 zrkrhA9AeERl z1sN150WpdT%V*#)UJ10jM)_5~Eh5Ws96tv-;b*R9MI4|BlfgRZ!pFf?x*I5tom@EVPx*4Av#o1`( zjs7m*c}W00g}(y AQ2+n{ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc index cc3086071d4e218f07923cbc99fc02ecf752f260..3993a9cd081febbd3e0451831761448c31e450bd 100644 GIT binary patch delta 674 zcmYjP&ubG=5Z-zFcC-6-v(1lU1E!Ls2#ug^q-ZSuq8AlvMT;j*q;}ILX}Zz3+fd^c z#9T~|zMH3n+`LIIQYd)ve-IWg;!#g}Qam^>_29yM`_0TZ`)20tuj#L+oTYf2DfoD! zOyyzfowH31_vtflx3p0gJ^D?%h`FD_*XsHrGCn81Xs`6EV|vim&jZmxjAHAzKL+N& z3`x@%!X6E2ley{^;jb}jg>(oqv!(LGKy_&kUV=9(HT*52Jx1mqO72UACgzOkD{-uG z_-BcOiJ{_=O{E8+^2iAi7)y?M5?PA>k?0Xu!EDM^R+XYI`o_%Jh;B4mwQlm3*I8>d z+}!g&}aCzi5Qs|U|&S$&1yY_0dduV8Y*%jLjY{8Y4YPZuH&EoVyx4~I`dfP z>H`{L1r8Bg>1q$Kw+heW*ij{@F=vrm#hK#RBxFe3N z%+vx>>G}qOq0^Xg(n#|K@!i^mNYv~ZxO~vJKS5glIJ}Gy>FvkO+IoPZBWp_RI}=b9 eZ=7od0w?hJNpOgb=HOBpq1c{W<|MIIrv3$(9-qqq delta 617 zcmY+C&ui2`6vyXHCeukaNwYPA=&D^`iCYN$}!9@J)I$;eGObKa%;*kRJ#B?DsCXu1)Z2zL{;^ zEWh_2G0}dyn#9@TlWNF*n)BF8Rcb!qXSE{gyZM@*E96#}p8&c|)Z2;ni#)S(Yd~W$ zf^{}vu`ORAO9kz8Q|ojyGa@5rJ5xh=30e(EC=wnK{mdM!xblN$?u|%7SIH2t<7Sgs z^9${xD$6gL2`%0$M})1A8dLAYOwji)B~R`>T#KqVu3c$VpV!xGQ|hl+Q7!8rKaR#_ zU2Rxb_f}C7px}WI9F7?R=@hs6ZOubp9kmyiZVe!(=-C($y|WPj`iw2vE9$JMTRZj0 z#GT;;8sW=*^ENJgM^57!ee=9_p+4EuM^0ltW^s2d8S}I&vrZ(nrLmD_QXWPn>xdea z3#w8&w5Nwj8XyP=%AtbcV@#=L>8`84B^MDj!0~ThV1=RV^kf)rsO{33#zoz~tg)oA z?|)QuI)_-sNCiT0HX(M4vYb=booCQgADtO!Z2fXR!>&_$TK@`T-n}1p+8GXg^=6@^ c=;T7x$3qOjqYj1#3~b8KFCL~5P{**1e^SDW4gdfE diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc index 1f4740bc62f731ae8a0fd8ad387f2fe89d42c727..f80886b15647e9ccc46ae9e32d8a0c0483b2c2e9 100644 GIT binary patch delta 1239 zcmZ`&YfKbZ6rOW;c916zs|tLt{&$AzKpgL2<3auGW8;eW>Sa^#GGQPo9Z<>N|Wi+07mS*s(yo10Gxve}TM7 z#f8iICs4>2_oav6!${h52w;PJ7iyF1at1)-q;d-&`IWK;)>f+Ao2m~PAcD%gI$X0k za4}=ac!+Zn-&-WH3dPSvJHy|Ed)1E4>R5+`e-!Okiy1Xy!fc+8jwdC#Cw$ zZO8dCJGPXS!b3b)b{^(YU%mtj_+$B^beigGr!e8qhZS7(-(!CP4pcm_ouvGMrUJdT zoePRNXc!EXvX_9L1^U5?8-Ygn1i$fagE)3o7O4u~IiG}bJDoR~s5F2+LZKUPS2-Y( zd{Wg4QX#db9Ys$~vph�ceNuoN85$P*AkVjn-tFKBiFX;c%Qo6z|vU&yCUY4bt?Q zXd!^2bAc=M7DF-9V)$5bCYyH60My`%x2xeSdTV>35+`e4Knup|+F=x**VRcEdBscU ztoOi&SW)j+yD70M^`6k8U7gwl&RSf08>QNCx_&=RmB(2WAH*F^?&NC?CNN##B`P?K zbC|$AySLJ1GdEccY2k23q%$0D$D!S~vQol4t||S`GJyw;c@V|w#y4?nPxOB^x%zDK z^poy=DZ07Mti_3U8VxW)t+{czu{_nDGksMKhmS?Ov~c(mHF@*Z5oxgcE99KT^`=_G z1g%ze9g#DbusASb6=4k9_Qu(DhBvJ5N!l*r=dkFVl~;Bp=rVKrBR+F_1yP9Sqm N?|@)ZbaJ|E`3KX&JuCnK delta 1281 zcmZ`&YfKzf6y9@pc9HOX2`Y6=~ONJdiwJAeevkKt{$d5Gy2?M|HyF2>}MYl`B5yrO*vSXex$-_ zHHd3z9w@d9+_zn(65+ThFH{8yLX7e}2K@^!*7l@f}sT<_&<_a-~&>;s& z?x9Fe(4Sb=XPkctVp4(P4`4n!AG0A3 z4(OR!$ZBU6!tYrZnU%1j7h+?F4{O=`7%!+SXG!~ZOT#G&&BWcDPbn2kxu={e@vIV$ zTgYcKTl31?&V+CYAqU0F@gf&N#g*Vm;Y}CBREZdGr_3Bol@z97Z{-?Av8}3=W^t(M z41J7yRVU~(91XohU*M0>S9A-X?^u2{SA6DN;mAKNsWr0FoOx2vv zIKrbnkz$+ikl0ZwU>J?Hl`Mr}xOR+ku~FN?KhT>w`Sd)Vsw>ev;&cykqH-Wvp*dY= zCtH*|iZHj+Pf>Gu=MyAX3o#4Q8akwL9>cHox?HpA8*j+e`i0VA0RsYJxZcoJJi^UN z!3lE1LaH@L!Q?I4u$?7Qa*#2CPt<@})_8%a8(%(BPjSdiG3r9R=_l&L{^tF38t*qZ z%dd#slb~=m4I(#O?K;FA-^sBdW8~RBBZ0A&fNW%NUlj8#I%dNmK50p(mphM`cfuv4 zO^75l0?rCZpmg^(0;Y72J*Btz;9y^GZw&pr7raSgf#6hbZAqX)%eDFW`y{&dT=-v3 z0Uz$JJw<45DU)NHGGi_Ibcvs9Z}Ln*I3jkM$DOc_ipc4$(p(yJ zL^2mCHicwGB}r!dXUBVO_c?2^eTdeP({bGUx=1AoHZlc>ztxz*Vn=m}=+9#!Qx-QA zrg{~-V&%)PsC;qD;dV)iRn0agkk(m3hf&}8FujI>&RXwrkwy%eA%?_AwptV40Jk~| Xymi{R#jb@EJAaN_JgQYmRrG%VRyH-S diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc index 977a2716b5bb4026ade717ed7a7c13a847c5682e..099d1419ca200694f39194be85dc9ddda169b252 100644 GIT binary patch delta 76 zcmZqS{=>!R#LLUY00eo9C1O9YZsfCIG4=)uIOK6yHGAEWkUHI|KH dN+6YNOpH8?d`xUiEX-VtLM&>`lfSa`0|31b5K{mE delta 84 zcmeyv)xyo^#LLUY00dF<)natmHu708awM0h=Vg@?nr!xC^k8Dto;;nokI`_l8p}pG jEs#n!CPp4cJ|;FM7G^F+Ar=-!7Dgr@lwzIymZcv6{A>@L diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-37.pyc index 07ccea0e5a883ad074a41765e58f424b1a6ebc4e..73487e9e27ba6c0650daf2cc89da7163f9877963 100644 GIT binary patch delta 1608 zcmaJ>TWDNW6rFuvb2F2<^T?efGo9(Y(#%XInKUM8(zMZ}ucVqjjHxM>%&mE2LX(_H z^P)dNq536sOR$0n?T3PbmV6lKuP6qgpjdFeM694c6>7l`MfaYY6bl<3q2Yykp zp&i+!nYio~-%`Ih}5N+1-t|-65@km!_~MU*i*DvePt*J^~#! ze{>fBPU3OTv(Su?47o~9%PKAk%Q}sBJj;-0r@N$EmYA3)?*N`L`fVzHZ0K+fw~SLe z^IER~FJRg`3&Z%9_cC0<$KFw}@S?8(WB94hf+?)=7hndL{4+3zUj?H0mwy4n zWtw-zS~%Bof4OxfeO}DXPl&};afkyQcrTrFA7-|bb!KdLlTu)Z12Z{bRc2_6h;HFhwslg988)=7Qcq_6LX{Dg3 zBq*sWUq~HJ<;hEeyg-iENh51yDT zSH&>}3-O%xJXxX@-;6iVxlqAn;r>qR;xAG5`9um#98C1ucfsJa@K>(_wYZfyPJ};* z5W#qI$R_xip!#XgINnTNAi~3BiUb!=nwU$3;cQ8Lfq`D_+OaV`5WV25lP z>p_&&>*sU63Ofo?U@eX3qx3OrsD?q@Ziwl9yaGgkPrhc1CUZ>YBpr%Q($qkV;lA82 zP?n7=LH>1O(1$J6I1%I4p3TZ4M^9V&8d*Dv6fg3oUe4gwlMEdAWn+xq{c~fXYMdf# z9N`=3&?MOJ#LG>l5|G3=UTey0YvdNM;3rKNJ7?IOWjMvq&oIEi*HgF|IBCIc5z7o* w4DHjCuRp|}3RBX7{!*oE$O@Q>Ug^_(QC}zDL;J5Qx?k^7WZ#M&bIH2TTEP46rFuvoVk~I(HUkKXF8o3UIPqB3l(TfOIs84Gw8j|y(GOG85MvYUpO4h|ewYJyWx$iVrqHj((K|B9k@qrf(Yi+ub~#(wL8#)LVv?} zkkkts2Xd=o`1-7qoy%M!;B*1^dr*@!7T_;R5EP4khksK_y?`sON_JO zt3t!~D?*-sEyph_qR@#yRIC}@o677q$%cqR7v2$T#{Nx72rs)M+hiZOqp%OZaIYB$ zH)TOwHfy%Y-ZG=mi#N?Hkj6gi0iDz7!wKsE_2HTohZNqjVpbDx;U^Hv`uA22;5Z)f z9EVmcrfSSmg>5e^O4~k(H$2ObWzs4M+m`tvu|qiM9dM-hp;y2#-t_k0A4hy%7{vx( z0nXxUzH@L6|MX45c^viU-~xW^x1oUHKn{wy6qtiW{HiLBe+ACKQ+TFo5mss3lj1v) z?F=0RB~g^~#k^cxk)6zO!_mqntS%mLQ)Lg86!Ez!9H4I@MnGk)?06pFCA=4`ffE=G zy=Oec+N1bsC`rVRph>|&BPExKX%01sqE?asVt}b9eoR}1TLi#H1MhlL?H$W2rw1KU>QvX@5U#s^2TgD z$?c6AT&e==7j|kuM?aqE7FlA*hQoM0QLR5l0}tL#OnWwIUYai#z;gi{-qq}Tlu6#X zq|MG>yoCO2jeFC{r&w!nTXn$OyT%MoReJbv-9up#2a17gs^J!3r*ONya(qC4x zWinWu8m7YMQfczW%c&7Z;42G!Bxpx>dfchvKho{O&(dvHIfE)rW2U^8!%o~;n=`mb zYB1-pB{zNt@9nmm{}&A!m5#<*ECRy4(t#jdTd_)vfC6q(OYT zep+Wc4dKuAGkOn2BgBQV&~P-8qmkrGE?d$u=RO*;5kp(Hl-n#B79{zGz6E}SLean^ zTZl9^G=AR9Z(VXbWiP`af{ap9WqzpyQU=OHImlC|F_Nj%Cny}l!;;A0PD*FHtDa05@6^bm-ldT;~)KmwBe10+*rCbI|BO zzdHg#6`;{)@UJ2i;pS9KRZijgY^$+CdU+9F&yIG@ayZBEFvBs16Ab)drNzM2$O(oe z2CkC!xn+g%V5_f#?<=SXdU-;r)V!KTRaa@E(r@^8`n%~eG`}VSqDNEx&$v{PFjZmw E4ZkNwV*mgE diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/_compat.py b/env/lib/python3.7/site-packages/pip/_vendor/packaging/_compat.py index 210bb80..25da473 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/packaging/_compat.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/packaging/_compat.py @@ -12,9 +12,9 @@ PY3 = sys.version_info[0] == 3 # flake8: noqa if PY3: - string_types = str, + string_types = (str,) else: - string_types = basestring, + string_types = (basestring,) def with_metaclass(meta, *bases): @@ -27,4 +27,5 @@ def with_metaclass(meta, *bases): class metaclass(meta): def __new__(cls, name, this_bases, d): return meta(name, bases, d) - return type.__new__(metaclass, 'temporary_class', (), {}) + + return type.__new__(metaclass, "temporary_class", (), {}) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/_structures.py b/env/lib/python3.7/site-packages/pip/_vendor/packaging/_structures.py index e9fc4a0..68dcca6 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/packaging/_structures.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/packaging/_structures.py @@ -5,7 +5,6 @@ from __future__ import absolute_import, division, print_function class Infinity(object): - def __repr__(self): return "Infinity" @@ -38,7 +37,6 @@ Infinity = Infinity() class NegativeInfinity(object): - def __repr__(self): return "-Infinity" diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py b/env/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py index e5834ce..5482476 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py @@ -17,8 +17,11 @@ from .specifiers import Specifier, InvalidSpecifier __all__ = [ - "InvalidMarker", "UndefinedComparison", "UndefinedEnvironmentName", - "Marker", "default_environment", + "InvalidMarker", + "UndefinedComparison", + "UndefinedEnvironmentName", + "Marker", + "default_environment", ] @@ -42,7 +45,6 @@ class UndefinedEnvironmentName(ValueError): class Node(object): - def __init__(self, value): self.value = value @@ -57,62 +59,52 @@ class Node(object): class Variable(Node): - def serialize(self): return str(self) class Value(Node): - def serialize(self): return '"{0}"'.format(self) class Op(Node): - def serialize(self): return str(self) VARIABLE = ( - L("implementation_version") | - L("platform_python_implementation") | - L("implementation_name") | - L("python_full_version") | - L("platform_release") | - L("platform_version") | - L("platform_machine") | - L("platform_system") | - 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") + L("implementation_version") + | L("platform_python_implementation") + | L("implementation_name") + | L("python_full_version") + | L("platform_release") + | L("platform_version") + | L("platform_machine") + | L("platform_system") + | L("python_version") + | L("sys_platform") + | L("os_name") + | L("os.name") + | L("sys.platform") # PEP-345 + | L("platform.version") # PEP-345 + | L("platform.machine") # PEP-345 + | L("platform.python_implementation") # PEP-345 + | L("python_implementation") # PEP-345 + | L("extra") # undocumented setuptools legacy ) 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' + "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("===") | - L("==") | - L(">=") | - L("<=") | - L("!=") | - L("~=") | - L(">") | - L("<") + L("===") | L("==") | L(">=") | L("<=") | L("!=") | L("~=") | L(">") | L("<") ) MARKER_OP = VERSION_CMP | L("not in") | L("in") @@ -152,8 +144,11 @@ def _format_marker(marker, first=True): # where the single item is itself it's own list. In that case we want skip # the rest of this function so that we don't get extraneous () on the # outside. - if (isinstance(marker, list) and len(marker) == 1 and - isinstance(marker[0], (list, tuple))): + if ( + isinstance(marker, list) + and len(marker) == 1 + and isinstance(marker[0], (list, tuple)) + ): return _format_marker(marker[0]) if isinstance(marker, list): @@ -239,20 +234,20 @@ def _evaluate_markers(markers, environment): def format_full_version(info): - version = '{0.major}.{0.minor}.{0.micro}'.format(info) + version = "{0.major}.{0.minor}.{0.micro}".format(info) kind = info.releaselevel - if kind != 'final': + if kind != "final": version += kind[0] + str(info.serial) return version def default_environment(): - if hasattr(sys, 'implementation'): + if hasattr(sys, "implementation"): iver = format_full_version(sys.implementation.version) implementation_name = sys.implementation.name else: - iver = '0' - implementation_name = '' + iver = "0" + implementation_name = "" return { "implementation_name": implementation_name, @@ -270,13 +265,13 @@ def default_environment(): class Marker(object): - def __init__(self, marker): try: self._markers = _coerce_parse_result(MARKER.parseString(marker)) except ParseException as e: err_str = "Invalid marker: {0!r}, parse error at {1!r}".format( - marker, marker[e.loc:e.loc + 8]) + marker, marker[e.loc : e.loc + 8] + ) raise InvalidMarker(err_str) def __str__(self): diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/requirements.py b/env/lib/python3.7/site-packages/pip/_vendor/packaging/requirements.py index d40bd8c..dbc5f11 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/packaging/requirements.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/packaging/requirements.py @@ -38,8 +38,8 @@ IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) NAME = IDENTIFIER("name") EXTRA = IDENTIFIER -URI = Regex(r'[^ ]+')("url") -URL = (AT + URI) +URI = Regex(r"[^ ]+")("url") +URL = AT + URI EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") @@ -48,17 +48,18 @@ VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY -VERSION_MANY = Combine(VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), - joinString=",", adjacent=False)("_raw_spec") +VERSION_MANY = Combine( + VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), joinString=",", adjacent=False +)("_raw_spec") _VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)) -_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or '') +_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or "") VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") MARKER_EXPR.setParseAction( - lambda s, l, t: Marker(s[t._original_start:t._original_end]) + lambda s, l, t: Marker(s[t._original_start : t._original_end]) ) MARKER_SEPARATOR = SEMICOLON MARKER = MARKER_SEPARATOR + MARKER_EXPR @@ -66,8 +67,7 @@ MARKER = MARKER_SEPARATOR + MARKER_EXPR VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) URL_AND_MARKER = URL + Optional(MARKER) -NAMED_REQUIREMENT = \ - NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) +NAMED_REQUIREMENT = NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd # pyparsing isn't thread safe during initialization, so we do it eagerly, see @@ -92,15 +92,21 @@ class Requirement(object): try: req = REQUIREMENT.parseString(requirement_string) except ParseException as e: - raise InvalidRequirement("Parse error at \"{0!r}\": {1}".format( - requirement_string[e.loc:e.loc + 8], e.msg - )) + raise InvalidRequirement( + 'Parse error at "{0!r}": {1}'.format( + requirement_string[e.loc : e.loc + 8], e.msg + ) + ) self.name = req.name if req.url: parsed_url = urlparse.urlparse(req.url) - if not (parsed_url.scheme and parsed_url.netloc) or ( - not parsed_url.scheme and not parsed_url.netloc): + if parsed_url.scheme == "file": + if urlparse.urlunparse(parsed_url) != req.url: + raise InvalidRequirement("Invalid URL given") + elif not (parsed_url.scheme and parsed_url.netloc) or ( + not parsed_url.scheme and not parsed_url.netloc + ): raise InvalidRequirement("Invalid URL: {0}".format(req.url)) self.url = req.url else: @@ -120,6 +126,8 @@ class Requirement(object): if self.url: parts.append("@ {0}".format(self.url)) + if self.marker: + parts.append(" ") if self.marker: parts.append("; {0}".format(self.marker)) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/specifiers.py b/env/lib/python3.7/site-packages/pip/_vendor/packaging/specifiers.py index 4c79899..743576a 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/packaging/specifiers.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/packaging/specifiers.py @@ -19,7 +19,6 @@ class InvalidSpecifier(ValueError): class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): - @abc.abstractmethod def __str__(self): """ @@ -84,10 +83,7 @@ class _IndividualSpecifier(BaseSpecifier): if not match: raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) - self._spec = ( - match.group("operator").strip(), - match.group("version").strip(), - ) + self._spec = (match.group("operator").strip(), match.group("version").strip()) # Store whether or not this Specifier should accept prereleases self._prereleases = prereleases @@ -99,11 +95,7 @@ class _IndividualSpecifier(BaseSpecifier): else "" ) - return "<{0}({1!r}{2})>".format( - self.__class__.__name__, - str(self), - pre, - ) + return "<{0}({1!r}{2})>".format(self.__class__.__name__, str(self), pre) def __str__(self): return "{0}{1}".format(*self._spec) @@ -194,8 +186,9 @@ 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 beginning. @@ -213,8 +206,7 @@ class _IndividualSpecifier(BaseSpecifier): class LegacySpecifier(_IndividualSpecifier): - _regex_str = ( - r""" + _regex_str = r""" (?P(==|!=|<=|>=|<|>)) \s* (?P @@ -225,10 +217,8 @@ class LegacySpecifier(_IndividualSpecifier): # them, and a comma since it's a version separator. ) """ - ) - _regex = re.compile( - r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) _operators = { "==": "equal", @@ -269,13 +259,13 @@ def _require_version_compare(fn): if not isinstance(prospective, Version): return False return fn(self, prospective, spec) + return wrapped class Specifier(_IndividualSpecifier): - _regex_str = ( - r""" + _regex_str = r""" (?P(~=|==|!=|<=|>=|<|>|===)) (?P (?: @@ -367,10 +357,8 @@ class Specifier(_IndividualSpecifier): ) ) """ - ) - _regex = re.compile( - r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) _operators = { "~=": "compatible", @@ -397,8 +385,7 @@ 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] @@ -407,8 +394,9 @@ 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): @@ -428,7 +416,7 @@ class Specifier(_IndividualSpecifier): # Shorten the prospective version to be the same length as the spec # so that we can determine if the specifier is a prefix of the # prospective version or not. - prospective = prospective[:len(spec)] + prospective = prospective[: len(spec)] # Pad out our two sides with zeros so that they both equal the same # length. @@ -567,27 +555,17 @@ 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[0]):]) - right_split.append(right[len(right_split[0]):]) + left_split.append(left[len(left_split[0]) :]) + right_split.append(right[len(right_split[0]) :]) # Insert our padding - left_split.insert( - 1, - ["0"] * max(0, len(right_split[0]) - len(left_split[0])), - ) - right_split.insert( - 1, - ["0"] * max(0, len(left_split[0]) - len(right_split[0])), - ) + left_split.insert(1, ["0"] * max(0, len(right_split[0]) - len(left_split[0]))) + right_split.insert(1, ["0"] * max(0, len(left_split[0]) - len(right_split[0]))) - return ( - list(itertools.chain(*left_split)), - list(itertools.chain(*right_split)), - ) + return (list(itertools.chain(*left_split)), list(itertools.chain(*right_split))) class SpecifierSet(BaseSpecifier): - def __init__(self, specifiers="", prereleases=None): # Split on , to break each indidivual specifier into it's own item, and # strip each item to remove leading/trailing whitespace. @@ -721,10 +699,7 @@ class SpecifierSet(BaseSpecifier): # given version is contained within all of them. # Note: This use of all() here means that an empty set of specifiers # will always return True, this is an explicit design decision. - return all( - s.contains(item, prereleases=prereleases) - for s in self._specs - ) + return all(s.contains(item, prereleases=prereleases) for s in self._specs) def filter(self, iterable, prereleases=None): # Determine if we're forcing a prerelease or not, if we're not forcing diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/utils.py b/env/lib/python3.7/site-packages/pip/_vendor/packaging/utils.py index 4b94a82..8841878 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/packaging/utils.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/packaging/utils.py @@ -36,13 +36,7 @@ def canonicalize_version(version): # Release segment # NB: This strips trailing '.0's to normalize - parts.append( - re.sub( - r'(\.0)+$', - '', - ".".join(str(x) for x in version.release) - ) - ) + parts.append(re.sub(r"(\.0)+$", "", ".".join(str(x) for x in version.release))) # Pre-release if version.pre is not None: diff --git a/env/lib/python3.7/site-packages/pip/_vendor/packaging/version.py b/env/lib/python3.7/site-packages/pip/_vendor/packaging/version.py index 6ed5cbb..95157a1 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/packaging/version.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/packaging/version.py @@ -10,14 +10,11 @@ import re from ._structures import Infinity -__all__ = [ - "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN" -] +__all__ = ["parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN"] _Version = collections.namedtuple( - "_Version", - ["epoch", "release", "dev", "pre", "post", "local"], + "_Version", ["epoch", "release", "dev", "pre", "post", "local"] ) @@ -40,7 +37,6 @@ class InvalidVersion(ValueError): class _BaseVersion(object): - def __hash__(self): return hash(self._key) @@ -70,7 +66,6 @@ class _BaseVersion(object): class LegacyVersion(_BaseVersion): - def __init__(self, version): self._version = str(version) self._key = _legacy_cmpkey(self._version) @@ -126,12 +121,14 @@ class LegacyVersion(_BaseVersion): return False -_legacy_version_component_re = re.compile( - r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE, -) +_legacy_version_component_re = re.compile(r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE) _legacy_version_replacement_map = { - "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@", + "pre": "c", + "preview": "c", + "-": "final-", + "rc": "c", + "dev": "@", } @@ -215,10 +212,7 @@ VERSION_PATTERN = r""" class Version(_BaseVersion): - _regex = re.compile( - r"^\s*" + VERSION_PATTERN + r"\s*$", - re.VERBOSE | re.IGNORECASE, - ) + _regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE) def __init__(self, version): # Validate the version and parse it into pieces @@ -230,18 +224,11 @@ class Version(_BaseVersion): self._version = _Version( epoch=int(match.group("epoch")) if match.group("epoch") else 0, release=tuple(int(i) for i in match.group("release").split(".")), - pre=_parse_letter_version( - match.group("pre_l"), - match.group("pre_n"), - ), + pre=_parse_letter_version(match.group("pre_l"), match.group("pre_n")), post=_parse_letter_version( - match.group("post_l"), - match.group("post_n1") or match.group("post_n2"), - ), - dev=_parse_letter_version( - match.group("dev_l"), - match.group("dev_n"), + match.group("post_l"), match.group("post_n1") or match.group("post_n2") ), + dev=_parse_letter_version(match.group("dev_l"), match.group("dev_n")), local=_parse_local_version(match.group("local")), ) @@ -395,12 +382,7 @@ def _cmpkey(epoch, release, pre, post, dev, local): # re-reverse it back into the correct order and make it a tuple and use # that for our sorting key. release = tuple( - reversed(list( - itertools.dropwhile( - lambda x: x == 0, - reversed(release), - ) - )) + reversed(list(itertools.dropwhile(lambda x: x == 0, reversed(release)))) ) # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. @@ -433,9 +415,6 @@ def _cmpkey(epoch, release, pre, post, dev, local): # - Numeric segments sort numerically # - Shorter versions sort before longer versions when the prefixes # match exactly - local = tuple( - (i, "") if isinstance(i, int) else (-Infinity, i) - for i in local - ) + local = tuple((i, "") if isinstance(i, int) else (-Infinity, i) for i in local) return epoch, release, pre, post, dev, local diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/pep517/__init__.py index 8beedea..9c1a098 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/pep517/__init__.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/pep517/__init__.py @@ -1,4 +1,4 @@ """Wrappers to build Python packages using PEP 517 hooks """ -__version__ = '0.2' +__version__ = '0.5.0' diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-37.pyc index cd73fb1167afadf361e748a6ee850343ae5326d6..8318882b2408b93af9b087e8959cb8b69a573893 100644 GIT binary patch delta 43 xcmaFM_@0s1iImud3?Tpj delta 41 vcmaFQ_?D5^iIEpm6!!RM*Xwn>o830uY&MDeLxWpF5)e`Ul%}C+DQTffT7|BtEN92dy4kh2 zW2Z^bh7?kX6R6P~0I5PyBqR>yKqUm1o;X*W5b}*1haM0I4jd3~#%+^SLc-R(8Nc`D z`Tc(1TMrK#Q(aw}0FVDw>FT{bn??!!wK+7mepbLKoW3RCw5xAO)h?{!%q^j6U=3$s z&tV;R!JfxPwHxPf9?k{ajSH|BaS`u=eHY$`cjKO0sJa{P!6o4IfYn}H2CHRmbq{>^ z;R<|L_;(5S;{nj?#a0$~;T~MV0}Z8G#)H@dcAs0pdlyCWr`xw7AOXvBg0=sC0bM~< z%N;mgm~v{1u8%MK&JD+FItxwr-Gj4^7rNN=>gKX*)*RmtBGYTN0}`20!!;L@E3}at z9r{KfEEAmkeR3pfwMW`sd)V{C$Z0l*@%2@IWvt$y?@I??APQ*q!U{zoD&pTYIPxb2 zRE6~_tgud3#r`v^dL(tw23nKn1-~QtOXx^sVWrZMzDQx| zOLSVeYOEFN|!@uLpMBYr5eK z{UhCrEUKw@(QSH99i_jiV+S-79_-dV-{svf^o|?Z%MI6U+ATM7uoF2$bUd>k4bf_* zuXYIj9%qxJajjSm+OAJ>z$ZhD$V{U!|JwBQd3);ex$~Fo3#Vphre}%81e&`N5vRtw zi4=ihsY%QxoC#0CA^K}(cywnlWDvyju)+cmA+1AUdXOfv;;5*E$l(1~GzX;;FX)|Y z1&z@kftvJ}teM?rj3RviU8APHA04Hq^$z_>e_m!eppW#$b(Y~c6*iV4uNf<~puPIi zR%Efd;DoO4v|Pf9M@E2Ha-2(&g+1cdqJXR>QJ5gC>TTk(RI!9MpRFjneiK&GDrptE zOoh0h@yN)IM%y=81~p4c4F6|`On}nur}nnD-UR)}XdNSLB1xJNHkTyB$W~_fiOmE# z3FLEFPsaKreUSU`=>NSv2{-RS%@3Xc2RTC@ z7WyQe9HEa2V^*9Yu7mAsAwbbM=yGV}fyUZ0@gkRtEG4F=iY3%ftHpA8XOOYnayYbHIsJ+h$VRw$K|^e^N$8oDRYl+fLNrlbN`) zkNI?rk=Ge{lac2bVUV75H$yUxI%JHU*4gy(F(hnAc=Hq1a$7YdtS;mNBh1UB-?pOS zCl0#miB^D@n(hPx$&k4rLjiS|WVYayR4Fg32D~|0QgyYc_LQ`|YUE{LYa-N}y(wAk GQPIDCubS`x delta 1795 zcmZ`(OKcNo5Z-@xy zp=F-V=M4#e_BXpP|1@;Rtg=UU_FUZJ8c*Mr>>Ss52ETc3@GO2!p0f))&rMtxd4U)4 zTjC`?fZqW=!OOgIo7rVP$cONx@}|UxdG)r$tM1^oVh`cI#z$~J67PrkD6gYjm1lUC zSNIUGucqu8ALF%gJRWgJ`3vhZ{OOKtOHAVGMakOrV3J*87d4DnMS2Y>cneu5tufAO zQcvniJ2IE=vCB%2_2ixsDqXhCdTLjJGdJp8Wk==8J$6RAV)jyDs;hQW+j396z91ec z7PCcBtusx`sN>>_x;Xi*1O>GI_~dNZ>dbb$&Wz^=VWZicS=s!+Ukk4v67$M#D>9ws z4X??a<;Kdo>+>pwWg?SggB6+1ROBXulK9QMz}Ce6!eMm+f8uKDkXAyms4h+w>f&MQ z;9l|x29Ql61vz9=N@FrJ(3B>_fGBI1*|z9t^NF#0+J#hXOl)bpWGIW#^zjoF z)Pg}`L&To5K8$CxNJ+4L>r9tn_`&DtCARBXji~5wF9;pazt(oHc}+JsDgM%HY*J)0 z_t_WXyUbh?%&dxemC5y3pBNZ9d;vQtu!ou+a#CI#vSV2-66{ zAN!~qej}icLYW*YiT(e@%V8ASdSbSZ7a0zVo#LFZim!-2;jy|Zg_(5&zGV0$;iHu8syw$S zU6OqHJt@@IjIJ8$UB>guFVybG@)zm;uogq@A> zz*^AuErtm6x$B2k7Usp@<@p!w47d&M&@IfOe4LYQY=RfM@u`)v#raD0Wg2eVSZ%l0 zaWv7Ot&@&})}JaSB^jx$hUeeMRZtgSSH`wX8P3tU?l^SgI2Jo^)ssF@qoR!0>a-zj zddr~TK89?RZU+ZCjc_#{jU=>Dx;#kibz(Gv36yCLfnJ(qq9$oYLkcty@5D$40v3!D zd(t|fb^tx@aexp5rQfl56=$R`w%UB7=`PU|85|XN1}l4H-O%&8smgj*FX@9uLC+VJ QqM~PHY%2XVMK9~@UsgkKoB#j- diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-37.pyc index f4fa36f65a5e6eed18ea64a4609b2857956c9632..4bdd71adb978e640922827b6cb34e1bf83940423 100644 GIT binary patch delta 1797 zcmeHH&2Jk;6rUOIm)G`s?KUNC+>|&j#6?LUZGft+L|c$@K;i(Rs8VG)-c7unce(F|dHpRUYnmhTDrvsRJ`Q2d1$yt>6wqM;TW4c5{h%Brd0JqRG^{b^DaI zM&&L25X)+EF<+}>`PXiA{6QQC6fsL?UT^a-2-ll-W{YT(cl?$Y@J#+%nmgB2 z2CMB(&ksG-mdlp#0ui^O-epVm5TqxYp{r(mC|8^lj!kW*!3BfC_>z3z`G77+R=#O0 zVF3&B>+;g_6TQ?n+Clg&s0ChGLM?D+fHpH226LH1`FUx(^Tsj;IVI1zSE?64Y?>L1 zM5cx94WFNt-?`5>9*@n>fYlus0%=0%K|0C!nNKUVXJ3SAX7;1?b!Y{DRm~!?Flfi! zaRYO(1XQ_LsV_f=BJu?qwz)dsQO6g8E8?9+6_%Y@vA;1`3;MpI9e+lCQJJBc{HfA7 tsm|iz0dUoc^XRyOfFa delta 1738 zcmcIkPiP!f7@zm%-`mOT>`wl)X$fi8uF;jIDaO=FTM6+ZT6(FdES7b%GbWSW%x>SC z5E5ot%9frK3-3}2#mzxH8IT@@f_D#Iq%hEv7ZFPj-o%67_g31q7vmu_yl=nneSi1& zesAu-{J5N7&F38rp6XZgpWOT||10ScG~uyeq3a!3;&a$dw7zzSe7V;pyC+jJAgQ)V z_X*JweP9FxwU4xT*3c5O>F`ye;R`-1P*H(?P5W4bOl@FC+CJ%0m1m@MpQ_C1VMZ^} zH?6=7tib*P9GJE{t=c_r#$IT4Fw!iCzG1V3^|h|9+Bm6>ZT1d!XJCL_s>2AhYbf7X zYK)A~Q&Vpmfjc@vY7CqpzfbNEaZLRuZ3tT0u?hiW(1ZY)3p4@>}ybt0c{qwEGWUI5-i8>2WERuSwwb0mEk2jMWZ^*mW zQh5pw^#c$ZaR?SA+L^|TtS-gQy?O79(^@@`@qP@)<3NE>Wg>_~ zQfoJ>OhE}6S9m-J#Z;i&lDECrJVqEb;PSwt{EU3)-6R#cQn+uO!2v4rm%{5yFQgk= z^(g)t++q@hMi|^l2I&@cpj451gkO~J6&I{UEOAzLi`U05fm*RM+7_7+*SA7`UjAM@ zSN?Zpz6?>{!xG33jZBhh%9rJeKl92turs^WUS9_!_}j{Ai?f}2vY{Blb=cw)vhTmN zJdY}p1Mu2j>+p6X6kR%l fz!^sX9il3)jW178_9nZ)N{&zAvqb?{W-;Y~(x3$dOW5nO9+$mNEG;qcx+kJ9cVJ{?$<0a4o4lLDlQDKOE9Wjo cjmZZ%MH#gxU*o*Um_K<1S1T(s2ak|D0EZG9SpWb4 delta 141 zcmdlkwn>c7iIZqST#S5-QjAoeEKF=by+GZ}T$+<_b6#Z3n!J{)m6eHuTgU|fl2aKl diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-37.pyc index 1d665bacb67b6a16454426a3cf7fbeb70749bca1..0dfd8abcbedbf1c7d3dc102358ab08804dff4f54 100644 GIT binary patch delta 35 pcmX@lex9AjiIF+PDk(JCoWq#R1OS}Z32y)Z diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-37.pyc index fd358d367dd0dd5027ecd774d765df7421c9204e..737a5ddb3f0852f57bd7fb6cf410ea445b9bff28 100644 GIT binary patch delta 344 zcmXAj&q~8U5XLi`O}Yt5BVtQxddNlaR1mCs5kZT#^x#!Q4TVHBLW)U+3atowu;^`0 z-s+#D2$BczJ$mp(1a-C!%#WG*zS*5u|I@cOZQE2Rk{9>z=EL4)B0RrL`b)**YG~$$7l-U(wpu|eIN`z23GrH9t zi(#zF{t1SBz|&ffkG20Eq+2JSNSk;k79hcQ5rc*m!x#H@5=CJa;6$BwqyA|x2s-kU zGC^TFm{4RKkBo;>MULfhg7Y$GrYd}4ie z=9?SXIvIt+f$EFFx|moPSr~a3`6kP9Xt=Tfg+bUEBwYn0Y8bK@inM?vV+unyXOUJ3 zQx@X_W)OcNBap|kfEB`K1gT^Ls^KVdncT;r%9u5I3r7|s%Vc>@g~<<@g@sZpGE3s) z<3Z*M00{<0xyhBBJ>n7|0UjX1!NMZO!o5Pv_>PT(yjhQInNx?*fnkyJ<^w!zOhCoQ`E31Mfl7)vK!h8Ja0d|{Ai@+xfNX~l qf*_VBkZ1;CTqb)?4&u)O8oZa^j1A<9BG1V``R&=6IM@Y3xx@hON=9n{ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-37.pyc index eb60294683942ab0a9bcd12a8edbb393eac6c407..43ad030ba6111f2299ce9019fd9488dd6cfbe905 100644 GIT binary patch delta 1994 zcmZuy&2Jk;6rb5$uh;9fW4lh{Kxj8@q21C1sw#y;)sLhR{Q#>_3e*xT8_%R!$Jt$G z$7!27iqu5nfcU8P00#~U9Jmt>95`_1%xO8m4Iy!W|A6<_Nh;c`^nQLb^JeDFo8SEW z+p(WdmZwW4lfV~z+jze*@~GUPKR!DC)$<3|)z&aOz=l|5gSHO7Mp%{AHVCWn5g2JO zw*?D<`9uFF?u-}Sp)dyd<} z^JC6zf8Lf0+@2dm+HEfgLW$%4QWOe_5kVHQ5Qd9(B*He2g-hm-ZDvMXG=rBM?QQNJ*sGC$enQ+T(-mp36~FE#}>M zVZ%ydJh5x_HP`h6U%Kujbj4UlLQSgEmC+kKnmYZ;72whgTof0RyOC{V5`I_%^szAU z7(kzN$f^SOPh7&tJA{%fN$>~hQE>#K990~JpO%ir{*a4Qiv(YO@_MR!*Rq@a6mB!P z6&*5!9FIJe<5QEG$#QXGyPEri9>Pt<355SMK^%v^bID}s?DjwUPxK;&IErvE5{bW) zuXqtV_M49n;u_eXeCGDwMnk!l1>zJ~3RlV2bF}Q}Vgft%BA(3W6pY>mi!A_RZ8wWQ z&{J7fbg+stSY^Ll@EVu4CrfAO*=)u>=Xe=H_C3c-Fz_JxvOKkhJSc$8fW_Yc;Cp9u z6khbABF5mJl}(kYTXaGHGnt+)+tC6 z7^2+)rRWq{zOVX}88|L;n^rcbaAh6DWHr~%ZI+n1Ma4r|en_)c5n5l!A#5>g6lnD( zd5gR^AXup>D5UxqQZmh5x;b<8YVzICp~bX*WA+A6*`2<1_4Ui{^re~Wv(3wJEvOXY zIe?X7*ppFDPIh9DmSQi6d(l8rTV@ctJBpi{g3F!=+-0xpR8lp*AE(wb7qK4(@QCI^ zcv0h(;o;Q0D}2e_Y_VL_3H?AENv>DM*KEwJAh^c{gX$eF1q!XG062Pft!V-E+YP)W zF3#ZCI08~3)j;gLC)t8L{TM8^0Z6_~%ZjcTv_=h8qZY`Q1=^9xSn_A(^o7z>(hsx5 zF$64}cmV-lgg{yg*p zbVgIN9R?EQxa-dic4#DDSI5TA;c_NGYCe9nnUITDlV7XHCeCBP5C#-x@3na(q0CvG z1{Fg^PW5oE!`o6EhO|Z|QsdlG$a-CV9(fR>Tw2tibuj$36icb8R-vL*G_&v@5J9>I delta 1185 zcmZ`&&u<$=6rLaZ+v~MsuM;P6LsP22Mx-i;z$HRz(jrBmD6}AzRp`p~Y*Ra7*UXL+ zT5XgH_l62YbE!ChbLN6De*k{~65NoM10ZqX$_)u5-q>8R^*(zQ+o%y$X>T0LUJHQ)-gum5!?<5G&oJLZD5>7uCiz1MZtE zy$0*d1whW&_rAscQpg7!3q=Mf_ZgsM4#@R=)&sR zOwUOd3nz!M4hf9ed_pl2C8*|#a*lI-UjwxVO6v*TgClEHnWWo80>zEo7*&~bj`=5I z<|CXNtTYdkd<)$~x6x##?heP$=pO{2(68Ov+TITR-5a~>FTNUWzO()2^=R|j)*Cl= zuFH38OQ!)TXy=#}G)|5lmePUf55$#TmL_3okYs~?Kjk83p~GV_;7N4UJ`8FFNwdNP zL6@gVp>@*!gMwxcvcf%zdDcx6FwVV{BCIO(J;<`r0Q^(I5-n0G}SsXGeY?Dx`c z!VT%xmrs@VLYv2JHa(^LvEWtM49v+mL;HT39z;p|{g|()dVvCU4Oc!WG}abvURLV~ zc#0_#9zbM@fP*a$d&D3Xwr~ww)Wa^RVh3yZq5QhOwqD{hkj85Y>I&3Kt6X)xSU6r5t3wTX_Axc7`Rf1x diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/_in_process.py b/env/lib/python3.7/site-packages/pip/_vendor/pep517/_in_process.py index baa14d3..d6524b6 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/pep517/_in_process.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/pep517/_in_process.py @@ -21,19 +21,28 @@ import sys # This is run as a script, not a module, so it can't do a relative import import compat + +class BackendUnavailable(Exception): + """Raised if we cannot import the backend""" + + def _build_backend(): """Find and load the build backend""" ep = os.environ['PEP517_BUILD_BACKEND'] mod_path, _, obj_path = ep.partition(':') - obj = import_module(mod_path) + try: + obj = import_module(mod_path) + except ImportError: + raise BackendUnavailable if obj_path: for path_part in obj_path.split('.'): obj = getattr(obj, path_part) return obj + def get_requires_for_build_wheel(config_settings): """Invoke the optional get_requires_for_build_wheel hook - + Returns [] if the hook is not defined. """ backend = _build_backend() @@ -44,9 +53,10 @@ def get_requires_for_build_wheel(config_settings): else: return hook(config_settings) + def prepare_metadata_for_build_wheel(metadata_directory, config_settings): """Invoke optional prepare_metadata_for_build_wheel - + Implements a fallback by building a wheel if the hook isn't defined. """ backend = _build_backend() @@ -58,8 +68,10 @@ def prepare_metadata_for_build_wheel(metadata_directory, config_settings): else: return hook(metadata_directory, config_settings) + WHEEL_BUILT_MARKER = 'PEP517_ALREADY_BUILT_WHEEL' + def _dist_info_files(whl_zip): """Identify the .dist-info folder inside a wheel ZipFile.""" res = [] @@ -71,11 +83,13 @@ def _dist_info_files(whl_zip): return res raise Exception("No .dist-info folder found in wheel") -def _get_wheel_metadata_from_wheel(backend, metadata_directory, config_settings): + +def _get_wheel_metadata_from_wheel( + backend, metadata_directory, config_settings): """Build a wheel and extract the metadata from it. - - Fallback for when the build backend does not define the 'get_wheel_metadata' - hook. + + Fallback for when the build backend does not + define the 'get_wheel_metadata' hook. """ from zipfile import ZipFile whl_basename = backend.build_wheel(metadata_directory, config_settings) @@ -88,6 +102,7 @@ def _get_wheel_metadata_from_wheel(backend, metadata_directory, config_settings) zipf.extractall(path=metadata_directory, members=dist_info) return dist_info[0].split('/')[0] + def _find_already_built_wheel(metadata_directory): """Check for a wheel already built during the get_wheel_metadata hook. """ @@ -105,14 +120,16 @@ def _find_already_built_wheel(metadata_directory): print('Found multiple .whl files; unspecified behaviour. ' 'Will call build_wheel.') return None - + # Exactly one .whl file return whl_files[0] + def build_wheel(wheel_directory, config_settings, metadata_directory=None): """Invoke the mandatory build_wheel hook. - - If a wheel was already built in the prepare_metadata_for_build_wheel fallback, this + + If a wheel was already built in the + prepare_metadata_for_build_wheel fallback, this will copy it rather than rebuilding the wheel. """ prebuilt_whl = _find_already_built_wheel(metadata_directory) @@ -137,12 +154,15 @@ def get_requires_for_build_sdist(config_settings): else: return hook(config_settings) + class _DummyException(Exception): """Nothing should ever raise this exception""" + class GotUnsupportedOperation(Exception): """For internal use when backend raises UnsupportedOperation""" + def build_sdist(sdist_directory, config_settings): """Invoke the mandatory build_sdist hook.""" backend = _build_backend() @@ -151,6 +171,7 @@ def build_sdist(sdist_directory, config_settings): except getattr(backend, 'UnsupportedOperation', _DummyException): raise GotUnsupportedOperation + HOOK_NAMES = { 'get_requires_for_build_wheel', 'prepare_metadata_for_build_wheel', @@ -159,6 +180,7 @@ HOOK_NAMES = { 'build_sdist', } + def main(): if len(sys.argv) < 3: sys.exit("Needs args: hook_name, control_dir") @@ -173,10 +195,13 @@ def main(): json_out = {'unsupported': False, 'return_val': None} try: json_out['return_val'] = hook(**hook_input['kwargs']) + except BackendUnavailable: + json_out['no_backend'] = True except GotUnsupportedOperation: json_out['unsupported'] = True - + compat.write_json(json_out, pjoin(control_dir, 'output.json'), indent=2) + if __name__ == '__main__': main() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/check.py b/env/lib/python3.7/site-packages/pip/_vendor/pep517/check.py index c65d51c..f4cdc6b 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/pep517/check.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/pep517/check.py @@ -18,10 +18,11 @@ from .wrappers import Pep517HookCaller log = logging.getLogger(__name__) -def check_build_sdist(hooks): + +def check_build_sdist(hooks, build_sys_requires): with BuildEnvironment() as env: try: - env.pip_install(hooks.build_sys_requires) + env.pip_install(build_sys_requires) log.info('Installed static build dependencies') except CalledProcessError: log.error('Failed to install static build dependencies') @@ -30,7 +31,7 @@ def check_build_sdist(hooks): try: reqs = hooks.get_requires_for_build_sdist({}) log.info('Got build requires: %s', reqs) - except: + except Exception: log.error('Failure in get_requires_for_build_sdist', exc_info=True) return False @@ -47,12 +48,13 @@ def check_build_sdist(hooks): try: filename = hooks.build_sdist(td, {}) log.info('build_sdist returned %r', filename) - except: + except Exception: log.info('Failure in build_sdist', exc_info=True) return False if not filename.endswith('.tar.gz'): - log.error("Filename %s doesn't have .tar.gz extension", filename) + log.error( + "Filename %s doesn't have .tar.gz extension", filename) return False path = pjoin(td, filename) @@ -73,10 +75,11 @@ def check_build_sdist(hooks): return True -def check_build_wheel(hooks): + +def check_build_wheel(hooks, build_sys_requires): with BuildEnvironment() as env: try: - env.pip_install(hooks.build_sys_requires) + env.pip_install(build_sys_requires) log.info('Installed static build dependencies') except CalledProcessError: log.error('Failed to install static build dependencies') @@ -85,7 +88,7 @@ def check_build_wheel(hooks): try: reqs = hooks.get_requires_for_build_wheel({}) log.info('Got build requires: %s', reqs) - except: + except Exception: log.error('Failure in get_requires_for_build_sdist', exc_info=True) return False @@ -102,7 +105,7 @@ def check_build_wheel(hooks): try: filename = hooks.build_wheel(td, {}) log.info('build_wheel returned %r', filename) - except: + except Exception: log.info('Failure in build_wheel', exc_info=True) return False @@ -151,8 +154,8 @@ def check(source_dir): hooks = Pep517HookCaller(source_dir, backend) - sdist_ok = check_build_sdist(hooks) - wheel_ok = check_build_wheel(hooks) + sdist_ok = check_build_sdist(hooks, requires) + wheel_ok = check_build_wheel(hooks, requires) if not sdist_ok: log.warning('Sdist checks failed; scroll up to see') @@ -164,7 +167,8 @@ def check(source_dir): def main(argv=None): ap = argparse.ArgumentParser() - ap.add_argument('source_dir', + ap.add_argument( + 'source_dir', help="A directory containing pyproject.toml") args = ap.parse_args(argv) @@ -178,17 +182,21 @@ def main(argv=None): print(ansi('Checks failed', 'red')) sys.exit(1) + ansi_codes = { 'reset': '\x1b[0m', 'bold': '\x1b[1m', 'red': '\x1b[31m', 'green': '\x1b[32m', } + + def ansi(s, attr): if os.name != 'nt' and sys.stdout.isatty(): return ansi_codes[attr] + str(s) + ansi_codes['reset'] else: return str(s) + if __name__ == '__main__': main() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/colorlog.py b/env/lib/python3.7/site-packages/pip/_vendor/pep517/colorlog.py index 26cf748..69c8a59 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/pep517/colorlog.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/pep517/colorlog.py @@ -24,6 +24,7 @@ try: except ImportError: curses = None + def _stderr_supports_color(): color = False if curses and hasattr(sys.stderr, 'isatty') and sys.stderr.isatty(): @@ -35,13 +36,14 @@ def _stderr_supports_color(): pass return color + class LogFormatter(logging.Formatter): """Log formatter with colour support """ DEFAULT_COLORS = { - logging.INFO: 2, # Green - logging.WARNING: 3, # Yellow - logging.ERROR: 1, # Red + logging.INFO: 2, # Green + logging.WARNING: 3, # Yellow + logging.ERROR: 1, # Red logging.CRITICAL: 1, } @@ -75,7 +77,8 @@ class LogFormatter(logging.Formatter): fg_color = str(fg_color, "ascii") for levelno, code in self.DEFAULT_COLORS.items(): - self._colors[levelno] = str(curses.tparm(fg_color, code), "ascii") + self._colors[levelno] = str( + curses.tparm(fg_color, code), "ascii") self._normal = str(curses.tigetstr("sgr0"), "ascii") scr = curses.initscr() @@ -83,15 +86,16 @@ class LogFormatter(logging.Formatter): curses.endwin() else: self._normal = '' - # Default width is usually 80, but too wide is worse than too narrow + # Default width is usually 80, but too wide is + # worse than too narrow self.termwidth = 70 def formatMessage(self, record): - l = len(record.message) + mlen = len(record.message) right_text = '{initial}-{name}'.format(initial=record.levelname[0], name=record.name) - if l + len(right_text) < self.termwidth: - space = ' ' * (self.termwidth - (l + len(right_text))) + if mlen + len(right_text) < self.termwidth: + space = ' ' * (self.termwidth - (mlen + len(right_text))) else: space = ' ' @@ -103,6 +107,7 @@ class LogFormatter(logging.Formatter): return record.message + space + start_color + right_text + end_color + def enable_colourful_output(level=logging.INFO): handler = logging.StreamHandler() handler.setFormatter(LogFormatter()) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/envbuild.py b/env/lib/python3.7/site-packages/pip/_vendor/pep517/envbuild.py index c264f46..f7ac5f4 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/pep517/envbuild.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/pep517/envbuild.py @@ -14,6 +14,7 @@ from .wrappers import Pep517HookCaller log = logging.getLogger(__name__) + def _load_pyproject(source_dir): with open(os.path.join(source_dir, 'pyproject.toml')) as f: pyproject_data = pytoml.load(f) @@ -89,11 +90,17 @@ class BuildEnvironment(object): if not reqs: return log.info('Calling pip to install %s', reqs) - check_call([sys.executable, '-m', 'pip', 'install', '--ignore-installed', - '--prefix', self.path] + list(reqs)) + check_call([ + sys.executable, '-m', 'pip', 'install', '--ignore-installed', + '--prefix', self.path] + list(reqs)) def __exit__(self, exc_type, exc_val, exc_tb): - if self._cleanup and (self.path is not None) and os.path.isdir(self.path): + needs_cleanup = ( + self._cleanup and + self.path is not None and + os.path.isdir(self.path) + ) + if needs_cleanup: shutil.rmtree(self.path) if self.save_path is None: @@ -106,6 +113,7 @@ class BuildEnvironment(object): else: os.environ['PYTHONPATH'] = self.save_pythonpath + def build_wheel(source_dir, wheel_dir, config_settings=None): """Build a wheel from a source directory using PEP 517 hooks. diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pep517/wrappers.py b/env/lib/python3.7/site-packages/pip/_vendor/pep517/wrappers.py index 28260f3..b14b899 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/pep517/wrappers.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/pep517/wrappers.py @@ -10,6 +10,7 @@ from . import compat _in_proc_script = pjoin(dirname(abspath(__file__)), '_in_process.py') + @contextmanager def tempdir(): td = mkdtemp() @@ -18,9 +19,24 @@ def tempdir(): finally: shutil.rmtree(td) + +class BackendUnavailable(Exception): + """Will be raised if the backend cannot be imported in the hook process.""" + + class UnsupportedOperation(Exception): """May be raised by build_sdist if the backend indicates that it can't.""" + +def default_subprocess_runner(cmd, cwd=None, extra_environ=None): + """The default method of calling the wrapper subprocess.""" + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + + check_call(cmd, cwd=cwd, env=env) + + class Pep517HookCaller(object): """A wrapper around a source directory to be built with a PEP 517 backend. @@ -30,6 +46,16 @@ class Pep517HookCaller(object): def __init__(self, source_dir, build_backend): self.source_dir = abspath(source_dir) self.build_backend = build_backend + self._subprocess_runner = default_subprocess_runner + + # TODO: Is this over-engineered? Maybe frontends only need to + # set this when creating the wrapper, not on every call. + @contextmanager + def subprocess_runner(self, runner): + prev = self._subprocess_runner + self._subprocess_runner = runner + yield + self._subprocess_runner = prev def get_requires_for_build_wheel(self, config_settings=None): """Identify packages required for building a wheel @@ -45,7 +71,8 @@ class Pep517HookCaller(object): 'config_settings': config_settings }) - def prepare_metadata_for_build_wheel(self, metadata_directory, config_settings=None): + def prepare_metadata_for_build_wheel( + self, metadata_directory, config_settings=None): """Prepare a *.dist-info folder with metadata for this project. Returns the name of the newly created folder. @@ -59,7 +86,9 @@ class Pep517HookCaller(object): 'config_settings': config_settings, }) - def build_wheel(self, wheel_directory, config_settings=None, metadata_directory=None): + def build_wheel( + self, wheel_directory, config_settings=None, + metadata_directory=None): """Build a wheel from this project. Returns the name of the newly created file. @@ -103,10 +132,7 @@ class Pep517HookCaller(object): 'config_settings': config_settings, }) - def _call_hook(self, hook_name, kwargs): - env = os.environ.copy() - # On Python 2, pytoml returns Unicode values (which is correct) but the # environment passed to check_call needs to contain string values. We # convert here by encoding using ASCII (the backend can only contain @@ -118,17 +144,20 @@ class Pep517HookCaller(object): else: build_backend = self.build_backend - env['PEP517_BUILD_BACKEND'] = build_backend with tempdir() as td: compat.write_json({'kwargs': kwargs}, pjoin(td, 'input.json'), indent=2) # Run the hook in a subprocess - check_call([sys.executable, _in_proc_script, hook_name, td], - cwd=self.source_dir, env=env) + self._subprocess_runner( + [sys.executable, _in_proc_script, hook_name, td], + cwd=self.source_dir, + extra_environ={'PEP517_BUILD_BACKEND': build_backend} + ) data = compat.read_json(pjoin(td, 'output.json')) if data.get('unsupported'): raise UnsupportedOperation + if data.get('no_backend'): + raise BackendUnavailable return data['return_val'] - diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__init__.py index 0b432f6..fdd40de 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__init__.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__init__.py @@ -39,6 +39,8 @@ import tempfile import textwrap import itertools import inspect +import ntpath +import posixpath from pkgutil import get_importer try: @@ -238,6 +240,9 @@ __all__ = [ 'register_finder', 'register_namespace_handler', 'register_loader_type', 'fixup_namespace_packages', 'get_importer', + # Warnings + 'PkgResourcesDeprecationWarning', + # Deprecated/backward compatibility only 'run_main', 'AvailableDistributions', ] @@ -1398,8 +1403,15 @@ class NullProvider: def has_resource(self, resource_name): return self._has(self._fn(self.module_path, resource_name)) + def _get_metadata_path(self, name): + return self._fn(self.egg_info, name) + def has_metadata(self, name): - return self.egg_info and self._has(self._fn(self.egg_info, name)) + if not self.egg_info: + return self.egg_info + + path = self._get_metadata_path(name) + return self._has(path) def get_metadata(self, name): if not self.egg_info: @@ -1463,10 +1475,86 @@ class NullProvider: ) def _fn(self, base, resource_name): + self._validate_resource_path(resource_name) if resource_name: return os.path.join(base, *resource_name.split('/')) return base + @staticmethod + def _validate_resource_path(path): + """ + Validate the resource paths according to the docs. + https://setuptools.readthedocs.io/en/latest/pkg_resources.html#basic-resource-access + + >>> warned = getfixture('recwarn') + >>> warnings.simplefilter('always') + >>> vrp = NullProvider._validate_resource_path + >>> vrp('foo/bar.txt') + >>> bool(warned) + False + >>> vrp('../foo/bar.txt') + >>> bool(warned) + True + >>> warned.clear() + >>> vrp('/foo/bar.txt') + >>> bool(warned) + True + >>> vrp('foo/../../bar.txt') + >>> bool(warned) + True + >>> warned.clear() + >>> vrp('foo/f../bar.txt') + >>> bool(warned) + False + + Windows path separators are straight-up disallowed. + >>> vrp(r'\\foo/bar.txt') + Traceback (most recent call last): + ... + ValueError: Use of .. or absolute path in a resource path \ +is not allowed. + + >>> vrp(r'C:\\foo/bar.txt') + Traceback (most recent call last): + ... + ValueError: Use of .. or absolute path in a resource path \ +is not allowed. + + Blank values are allowed + + >>> vrp('') + >>> bool(warned) + False + + Non-string values are not. + + >>> vrp(None) + Traceback (most recent call last): + ... + AttributeError: ... + """ + invalid = ( + os.path.pardir in path.split(posixpath.sep) or + posixpath.isabs(path) or + ntpath.isabs(path) + ) + if not invalid: + return + + msg = "Use of .. or absolute path in a resource path is not allowed." + + # Aggressively disallow Windows absolute paths + if ntpath.isabs(path) and not posixpath.isabs(path): + raise ValueError(msg) + + # for compatibility, warn; in future + # raise ValueError(msg) + warnings.warn( + msg[:-1] + " and will raise exceptions in a future release.", + DeprecationWarning, + stacklevel=4, + ) + def _get(self, path): if hasattr(self.loader, 'get_data'): return self.loader.get_data(path) @@ -1787,6 +1875,9 @@ class FileMetadata(EmptyProvider): def __init__(self, path): self.path = path + def _get_metadata_path(self, name): + return self.path + def has_metadata(self, name): return name == 'PKG-INFO' and os.path.isfile(self.path) @@ -1885,7 +1976,7 @@ def find_eggs_in_zip(importer, path_item, only=False): if only: # don't yield nested distros return - for subitem in metadata.resource_listdir('/'): + for subitem in metadata.resource_listdir(''): if _is_egg_path(subitem): subpath = os.path.join(path_item, subitem) dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath) @@ -2228,7 +2319,18 @@ register_namespace_handler(object, null_ns_handler) def normalize_path(filename): """Normalize a file/dir name for comparison purposes""" - return os.path.normcase(os.path.realpath(filename)) + return os.path.normcase(os.path.realpath(os.path.normpath(_cygwin_patch(filename)))) + + +def _cygwin_patch(filename): # pragma: nocover + """ + Contrary to POSIX 2008, on Cygwin, getcwd (3) contains + symlink components. Using + os.path.abspath() works around this limitation. A fix in os.getcwd() + would probably better, in Cygwin even more so, except + that this seems to be by design... + """ + return os.path.abspath(filename) if sys.platform == 'cygwin' else filename def _normalize_cached(filename, _cache={}): @@ -2324,7 +2426,7 @@ class EntryPoint: warnings.warn( "Parameters to load are deprecated. Call .resolve and " ".require separately.", - DeprecationWarning, + PkgResourcesDeprecationWarning, stacklevel=2, ) if require: @@ -2569,10 +2671,14 @@ class Distribution: try: return self._version except AttributeError: - version = _version_from_file(self._get_metadata(self.PKG_INFO)) + version = self._get_version() if version is None: - tmpl = "Missing 'Version:' header and/or %s file" - raise ValueError(tmpl % self.PKG_INFO, self) + path = self._get_metadata_path_for_display(self.PKG_INFO) + msg = ( + "Missing 'Version:' header and/or {} file at path: {}" + ).format(self.PKG_INFO, path) + raise ValueError(msg, self) + return version @property @@ -2630,11 +2736,34 @@ class Distribution: ) return deps + def _get_metadata_path_for_display(self, name): + """ + Return the path to the given metadata file, if available. + """ + try: + # We need to access _get_metadata_path() on the provider object + # directly rather than through this class's __getattr__() + # since _get_metadata_path() is marked private. + path = self._provider._get_metadata_path(name) + + # Handle exceptions e.g. in case the distribution's metadata + # provider doesn't support _get_metadata_path(). + except Exception: + return '[could not detect]' + + return path + def _get_metadata(self, name): if self.has_metadata(name): for line in self.get_metadata_lines(name): yield line + def _get_version(self): + lines = self._get_metadata(self.PKG_INFO) + version = _version_from_file(lines) + + return version + def activate(self, path=None, replace=False): """Ensure distribution is importable on `path` (default=sys.path)""" if path is None: @@ -2853,7 +2982,7 @@ class EggInfoDistribution(Distribution): take an extra step and try to get the version number from the metadata file itself instead of the filename. """ - md_version = _version_from_file(self._get_metadata(self.PKG_INFO)) + md_version = self._get_version() if md_version: self._version = md_version return self @@ -3147,3 +3276,11 @@ def _initialize_master_working_set(): # match order list(map(working_set.add_entry, sys.path)) globals().update(locals()) + +class PkgResourcesDeprecationWarning(Warning): + """ + Base class for warning about deprecations in ``pkg_resources`` + + This class is not derived from ``DeprecationWarning``, and as such is + visible by default. + """ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc index b6c7d2110b5cfd87b3b1cf71e234465b841d994f..9f2c47942bd7a89bc34457d4b50c9e382e1f5d3b 100644 GIT binary patch delta 23097 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 delta 19694 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 K=Dtm$+y4Uq2V0r| diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc index ca0dca3a9ee4643970c3afce56fedd3ede0430a9..8fad86198135b0ec615d2504895ec554993d2fbe 100644 GIT binary patch delta 34 ocmcc4a-D_8iIF+PDk(IXoWS@U0F(3y(*OVf diff --git a/env/lib/python3.7/site-packages/pip/_vendor/progress/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/progress/__init__.py index a41f65d..e434c25 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/progress/__init__.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/progress/__init__.py @@ -12,31 +12,49 @@ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -from __future__ import division +from __future__ import division, print_function from collections import deque from datetime import timedelta from math import ceil from sys import stderr -from time import time +try: + from time import monotonic +except ImportError: + from time import time as monotonic -__version__ = '1.4' +__version__ = '1.5' + +HIDE_CURSOR = '\x1b[?25l' +SHOW_CURSOR = '\x1b[?25h' class Infinite(object): file = stderr sma_window = 10 # Simple Moving Average window + check_tty = True + hide_cursor = True - def __init__(self, *args, **kwargs): + def __init__(self, message='', **kwargs): self.index = 0 - self.start_ts = time() + self.start_ts = monotonic() self.avg = 0 + self._avg_update_ts = self.start_ts self._ts = self.start_ts self._xput = deque(maxlen=self.sma_window) for key, val in kwargs.items(): setattr(self, key, val) + self._width = 0 + self.message = message + + if self.file and self.is_tty(): + if self.hide_cursor: + print(HIDE_CURSOR, end='', file=self.file) + print(self.message, end='', file=self.file) + self.file.flush() + def __getitem__(self, key): if key.startswith('_'): return None @@ -44,7 +62,7 @@ class Infinite(object): @property def elapsed(self): - return int(time() - self.start_ts) + return int(monotonic() - self.start_ts) @property def elapsed_td(self): @@ -52,8 +70,14 @@ class Infinite(object): def update_avg(self, n, dt): if n > 0: + xput_len = len(self._xput) self._xput.append(dt / n) - self.avg = sum(self._xput) / len(self._xput) + now = monotonic() + # update when we're still filling _xput, then after every second + if (xput_len < self.sma_window or + now - self._avg_update_ts > 1): + self.avg = sum(self._xput) / len(self._xput) + self._avg_update_ts = now def update(self): pass @@ -61,11 +85,34 @@ class Infinite(object): def start(self): pass + def clearln(self): + if self.file and self.is_tty(): + print('\r\x1b[K', end='', file=self.file) + + def write(self, s): + if self.file and self.is_tty(): + line = self.message + s.ljust(self._width) + print('\r' + line, end='', file=self.file) + self._width = max(self._width, len(s)) + self.file.flush() + + def writeln(self, line): + if self.file and self.is_tty(): + self.clearln() + print(line, end='', file=self.file) + self.file.flush() + def finish(self): - pass + if self.file and self.is_tty(): + print(file=self.file) + if self.hide_cursor: + print(SHOW_CURSOR, end='', file=self.file) + + def is_tty(self): + return self.file.isatty() if self.check_tty else True def next(self, n=1): - now = time() + now = monotonic() dt = now - self._ts self.update_avg(n, dt) self._ts = now @@ -73,12 +120,17 @@ class Infinite(object): self.update() def iter(self, it): - try: + with self: for x in it: yield x self.next() - finally: - self.finish() + + def __enter__(self): + self.start() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.finish() class Progress(Infinite): @@ -119,9 +171,7 @@ class Progress(Infinite): except TypeError: pass - try: + with self: for x in it: yield x self.next() - finally: - self.finish() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc index 6492871387a77f1da8ef2b65e4f3f43a73553ede..661ee849c6b4c0366ae68b4c4113bc3139769522 100644 GIT binary patch literal 5515 zcmbtYNpl;=74Dt|7%T+A#S(4Cvh2tU5?hj!I9s_K#Y=3JE3_@ikqyf=fzd+})L;Ph z3?z~TRi%ooa&k~oIpmN-s>s9#=P&g&C;f!@l<(^Sh9FJ)5}>B{p7&nA?=3xV&dpT? ze#yU9KL78c5dUFk`U}vwh9~_e3MG_`MPIgM-)TFNeJ6JNUfZ*6H}?CbcFDHAxZDrg zfo=P7rC)7VrPyg=M=7rL>+QM}w?%T%6Vcq=svb(gKW59At#S5KkvN|S6|@_w(wr)W7QP`&%Tv^PjhW2k#c7Oszy zZiaqK8ec{CMiCm7tk;iJ6lWcDyl&KsQJ2z8MOt&ZKS&1IAnA2E&9%GktCwHfEv#DBiFb_f1JnDvOss+^ZYEdnrZmMPV1nLEKPMt@+s8-aIsF&1J zY8CaedQm;CE`ZV#>KSzrBj?n!>N(Ws)%VpU)GO+F9NSAKxSp){l3o@)CKzrR(REPs z=TDyZQKw&_P;x9nk;y%Q+Oa)%EVdlZOqkm?3~jFV{yDen>XWKFc|vm=~4 zSUj{af<*qBmf)58?02@~DA9Fx9pgrcGTwSGj#^8`?yi$+ebi zT(}Dh3B7Z}2#z)p9N zs1%~p;`GaB)2>clA7;vmG9kZol04?Sl$Srgv(U`%(SaW1T~FW1IoXpBX8P&}e_*@z#Endhqq25D3k$K^xXIwbNiN1P^&& zfp#d*i-%6;Bdj>*0ktF6ZAkI5@))4on+6+k5EL%oTl+@NeOso=j7-*(`tjB%&GeJt z!wP9!LQky<pQ_rZJHcXG{XB zk_TCryK{y2;hI7K+I0nw1riNtEdKJG6x&aYB~rabit;-E8;lCV_+I@svVJ8#5;p{L zdj<)xE%iItIkh^cml?VJE!JRhdKb$k8YXMd@DW>_KV83+Wy-*~Ao+8Wl=-Qgu#QR? zMhRXQhJPSIDu@APcdZ{ec?AY}do^-l!AjGrEj- z=GJJVFkxt|PQSp`4^Wr@DdRBGK>y1eyUfC3i?Gr>MQ!~K(;$6~1?9{G2-T|JV{x6u zZ&_SAUOdk(z38)e(w9&KNaO6^sV)V6-K%>+EpYMof^ty8->n8HJ-dszD}Dqcf9Vj# z^yc-YScgwl&VJB#BTu=?v-c_=ZC{mayM%UG1-4yAyP~SL9iVM5oVb%!@~dXMs^(P_ zx2Bp}P>ZPRUqbcmIRJUd1RqYa>jH=5h{&MBODQ??&9T^X81BZ-pXn=|1DE_A+JI)! z0zdyc);?A!a0T$w5fq@AYFND(7m2N1F*O;F_X5om`@Ls>*>ig;gHgqV;$5PTGJteiTR;jBs1Qa^(* zbHRVi5MC^#E>Lky?&7RZcb7J7ovKyqbq)(kNV^J3d1`FIg?VDAz|jgi{JgLw5Lf}_ z0~jDLIa3Gi#dP!H$xGma~@iy>T=qt1)2318UDwyEh=@If4cI-5OW|$Cz zIlh1`dm?l21q@M>|NN`hnNifWQS|C*QPj&5SZc{sZXvY1qxC?~hF1L>%xPYdPKaZD z^w$`lT%H_cgShPD(w_&}LNW%~Rzt7x6(6wpkcABvAF)MC)NK}bSP+Vuu*l;?$QHwa znVa~iZWPB;KXnNcK-O(8vObFr?~iy=A~TST1k*pGfpv&$t!0L{^-(s`2ydF2*HpQw zbq8@A*$;k`uQmZcqrNI|lAYmg>?w={diNiI)>v{Bj!$tvKK$=b+ITim7a&CNJaXkki&uwn} E4-K44`~Uy| literal 3867 zcmbtXTW=f36`t7(xui&nl9j}Xfz}P0v}|LkY28bT)K!}lMNvQr(6mk#2^K78B~xB5 zso9}!pr0flPw8K%_1M2OuYK}g=u^LMmb;=A`6)}xnKL`HbIzRGH~eF_+ZK4@f4}>s z=?L*(4yq>rvx`>DK$K826B8LrN#4u6i68rp_p@LU#-ZbbtTAcEO~;2>G-<^x$2YR} zq#d`xH{-QG3l*u>rBJQ3bK%EbjN57rUwe5lf+ zc?zaw#*emLST)#HQNMJsZURK!w=*h~F5P%;jc zr~FG1H&mcP^vyI<4b{997cy>vcN&9lm%7Gls-wDC*HJySj=rnw-Bowg)}@Ts z)obc?yy>eqaGp19^p|{poR3ZVf;JyX5I*6ueS*ID6hz5|NQ99W0=?%({z4pj7zHK- z*HGR!T+=+gzwn+%SK?#w)z+8ZGyhp&S_`r87r_NwbM){rTm{koo~AHbXfiy_(tOai z;W$_6scz!EjS4f=CNYKehsOuj2d8N&+b$-<^|SFRI;7&(PRTyFM7Rbp4@s7qJJO!ZI&=pmlVg}0FR#1$%zLGT~K z8it90{vJ~!aKY^@gFDnTo^1?gGsKbgi}}R*h;`k?>w)j=Wo2$XWo|mJJ)fzeNfQMB zFR^&(yGZus`L+7jYhE%S-RE4#b2x?Mp4e>{jg6J3-_j2iME{kd94t!@`ZZ+VThWdyked2EZnnX~m=7mulGt{V zOr~m{k?$nQ(R`SdGn%!?2K(bI)$3q2YoPufUq&dlvs9Zim)ZJlPB^>Lr1~c$RJv53 zX}zMbGcAjsrhV?A6?_$;Tio#CN38FCa`D;gR6|Go5G%X)@zo^joYq5_SpuEc{ z_R~Q5DsTuKf)7>0@eS}z6*;~MzNOlZkH7iRP`Y8JPH=Hc1kly0dYkYx=Op=VUVNoPWX&X??5O6Qr;P)U`nq;nZ;O_@&m?I+iSi1CWx&026B6)&B;wlzIm zmAtAh%d!UFengg$Ni9j9_i9NcAi3beJY%SiBbE~69L@)nKq&Jzz?(oN(JL*>x>}_b zvA_o7e56;Z6!Xaj2U9bhfmc_ddTJ5_|^<@70jtaO@fqLj4YQcV4os&(3D)pR}IpZ{dXA;VR;K2(D9m=3rD~LB zSyis+CIr}rT;xg@%O36K)QTiAp!xv^0#_FI2J1wt{kfTIpp|9-*tO9#%hHj-AHC(j zkBFBt{*iNcPa8~z=83CbxZIr;4%N#4FSvXkr<#8e0ey|>KM%2ugPXDlQ^yf0znZnIbf2vgtSBAn)fsazAv?-$g#abI5a&XSjM-2?meoG675cgRiCGbs{H2MPnIf zd_ff1RGzLXH z6c|JDbFtEHv?{Hw*4$PzZr7t|jz8XMZeQNm6yMYtRuoK|VXm0frtV?66d3_>WDOGZ z6Z8>G5Kzc27$<5V6mZ7mW-~qgR4~N2F(STbw|6bv>}Uwz_g^3X9`3INHca9YoFOO@ z&;xp=@0Iy1I?v&ZN%Ax^(E6#;GDTc8X2mCca`}&Z>HB&mC}E&0lz=*i5yI2GE0n)RzJ! zTBE*wT)F{TOXV9v8hDTwZ>-8y=}$@})_MmZY_?&9+-1#2$x3S=l_kmVh+o!HrmJdV z)jl&nL*9Swh;z7m3ukO2*vw<5s;gqu7!#3G5TEU}#jbc1Nrp?4OH1Bh9(V6kB>HpM z4CZA&MNXMn;-xda`>$~p@OZT=4)MTC+*)m;)9yf6s{v(zO9WJUAjM^C%WeYd1Ry1W p9tU(USWvDb_PBOp-)KDIohZCXa>OKur`oEg`FY>=4g7|E{WlQM!94%~ delta 1225 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/progress/bar.py b/env/lib/python3.7/site-packages/pip/_vendor/progress/bar.py index 025e61c..8819efd 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/progress/bar.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/progress/bar.py @@ -19,18 +19,15 @@ from __future__ import unicode_literals import sys from . import Progress -from .helpers import WritelnMixin -class Bar(WritelnMixin, Progress): +class Bar(Progress): width = 32 - message = '' suffix = '%(index)d/%(max)d' bar_prefix = ' |' bar_suffix = '| ' empty_fill = ' ' fill = '#' - hide_cursor = True def update(self): filled_length = int(self.width * self.progress) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/progress/counter.py b/env/lib/python3.7/site-packages/pip/_vendor/progress/counter.py index 6b45a1e..d955ca4 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/progress/counter.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/progress/counter.py @@ -16,27 +16,20 @@ from __future__ import unicode_literals from . import Infinite, Progress -from .helpers import WriteMixin -class Counter(WriteMixin, Infinite): - message = '' - hide_cursor = True - +class Counter(Infinite): def update(self): self.write(str(self.index)) -class Countdown(WriteMixin, Progress): - hide_cursor = True - +class Countdown(Progress): def update(self): self.write(str(self.remaining)) -class Stack(WriteMixin, Progress): +class Stack(Progress): phases = (' ', '▁', '▂', '▃', '▄', '▅', '▆', '▇', '█') - hide_cursor = True def update(self): nphases = len(self.phases) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/progress/helpers.py b/env/lib/python3.7/site-packages/pip/_vendor/progress/helpers.py deleted file mode 100644 index 0cde44e..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/progress/helpers.py +++ /dev/null @@ -1,91 +0,0 @@ -# Copyright (c) 2012 Giorgos Verigakis -# -# Permission to use, copy, modify, and distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -from __future__ import print_function - - -HIDE_CURSOR = '\x1b[?25l' -SHOW_CURSOR = '\x1b[?25h' - - -class WriteMixin(object): - hide_cursor = False - - def __init__(self, message=None, **kwargs): - super(WriteMixin, self).__init__(**kwargs) - self._width = 0 - if message: - self.message = message - - if self.file and self.file.isatty(): - if self.hide_cursor: - print(HIDE_CURSOR, end='', file=self.file) - print(self.message, end='', file=self.file) - self.file.flush() - - def write(self, s): - if self.file and self.file.isatty(): - b = '\b' * self._width - c = s.ljust(self._width) - print(b + c, end='', file=self.file) - self._width = max(self._width, len(s)) - self.file.flush() - - def finish(self): - if self.file and self.file.isatty() and self.hide_cursor: - print(SHOW_CURSOR, end='', file=self.file) - - -class WritelnMixin(object): - hide_cursor = False - - def __init__(self, message=None, **kwargs): - super(WritelnMixin, self).__init__(**kwargs) - if message: - self.message = message - - if self.file and self.file.isatty() and self.hide_cursor: - print(HIDE_CURSOR, end='', file=self.file) - - def clearln(self): - if self.file and self.file.isatty(): - print('\r\x1b[K', end='', file=self.file) - - def writeln(self, line): - if self.file and self.file.isatty(): - self.clearln() - print(line, end='', file=self.file) - self.file.flush() - - def finish(self): - if self.file and self.file.isatty(): - print(file=self.file) - if self.hide_cursor: - print(SHOW_CURSOR, end='', file=self.file) - - -from signal import signal, SIGINT -from sys import exit - - -class SigIntMixin(object): - """Registers a signal handler that calls finish on SIGINT""" - - def __init__(self, *args, **kwargs): - super(SigIntMixin, self).__init__(*args, **kwargs) - signal(SIGINT, self._sigint_handler) - - def _sigint_handler(self, signum, frame): - self.finish() - exit(0) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/progress/spinner.py b/env/lib/python3.7/site-packages/pip/_vendor/progress/spinner.py index 464c7b2..4e100ca 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/progress/spinner.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/progress/spinner.py @@ -16,11 +16,9 @@ from __future__ import unicode_literals from . import Infinite -from .helpers import WriteMixin -class Spinner(WriteMixin, Infinite): - message = '' +class Spinner(Infinite): phases = ('-', '\\', '|', '/') hide_cursor = True @@ -40,5 +38,6 @@ class MoonSpinner(Spinner): class LineSpinner(Spinner): phases = ['⎺', '⎻', '⎼', '⎽', '⎼', '⎻'] + class PixelSpinner(Spinner): - phases = ['⣾','⣷', '⣯', '⣟', '⡿', '⢿', '⣻', '⣽'] + phases = ['⣾', '⣷', '⣯', '⣟', '⡿', '⢿', '⣻', '⣽'] diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pyparsing.py b/env/lib/python3.7/site-packages/pip/_vendor/pyparsing.py index 865152d..9d6a01d 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/pyparsing.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/pyparsing.py @@ -1,6 +1,7 @@ +#-*- coding: utf-8 -*- # module pyparsing.py # -# Copyright (c) 2003-2018 Paul T. McGuire +# Copyright (c) 2003-2019 Paul T. McGuire # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the @@ -27,15 +28,18 @@ __doc__ = \ pyparsing module - Classes and methods to define and execute parsing grammars ============================================================================= -The pyparsing module is an alternative approach to creating and executing simple grammars, -vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you -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. +The pyparsing module is an alternative approach to creating and +executing simple grammars, vs. the traditional lex/yacc approach, or the +use of regular expressions. With pyparsing, you 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{", !"}), 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):: +Here is a program to parse "Hello, World!" (or any greeting of the form +``", !"``), built up using :class:`Word`, +:class:`Literal`, and :class:`And` elements +(the :class:`'+'` operators create :class:`And` expressions, +and the strings are auto-converted to :class:`Literal` expressions):: from pip._vendor.pyparsing import Word, alphas @@ -49,33 +53,48 @@ The program outputs the following:: Hello, World! -> ['Hello', ',', 'World', '!'] -The Python representation of the grammar is quite readable, owing to the self-explanatory -class names, and the use of '+', '|' and '^' operators. +The Python representation of the grammar is quite readable, owing to the +self-explanatory class names, and the use of '+', '|' and '^' operators. -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 :class:`ParseResults` object returned from +:class:`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: - - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) - - quoted strings - - embedded comments +The pyparsing module handles some of the problems that are typically +vexing when writing text parsers: + + - extra or missing whitespace (the above program will also handle + "Hello,World!", "Hello , World !", etc.) + - quoted strings + - embedded comments Getting Started - ----------------- -Visit the classes L{ParserElement} and L{ParseResults} to see the base classes that most other pyparsing +Visit the classes :class:`ParserElement` and :class:`ParseResults` to +see the base classes that most other pyparsing classes inherit from. Use the docstrings for examples of how to: - - construct literal match expressions from L{Literal} and L{CaselessLiteral} classes - - construct character word-group expressions using the L{Word} class - - see how to create repetitive expressions using L{ZeroOrMore} and L{OneOrMore} classes - - use L{'+'}, L{'|'}, L{'^'}, and L{'&'} operators to combine simple expressions into more complex ones - - associate names with your parsed results using L{ParserElement.setResultsName} - - find some helpful expression short-cuts like L{delimitedList} and L{oneOf} - - find more useful common expressions in the L{pyparsing_common} namespace class + + - construct literal match expressions from :class:`Literal` and + :class:`CaselessLiteral` classes + - construct character word-group expressions using the :class:`Word` + class + - see how to create repetitive expressions using :class:`ZeroOrMore` + and :class:`OneOrMore` classes + - use :class:`'+'`, :class:`'|'`, :class:`'^'`, + and :class:`'&'` operators to combine simple expressions into + more complex ones + - associate names with your parsed results using + :class:`ParserElement.setResultsName` + - find some helpful expression short-cuts like :class:`delimitedList` + and :class:`oneOf` + - find more useful common expressions in the :class:`pyparsing_common` + namespace class """ -__version__ = "2.2.1" -__versionTime__ = "18 Sep 2018 00:49 UTC" +__version__ = "2.4.0" +__versionTime__ = "07 Apr 2019 18:28 UTC" __author__ = "Paul McGuire " import string @@ -91,6 +110,12 @@ import traceback import types from datetime import datetime +try: + # Python 3 + from itertools import filterfalse +except ImportError: + from itertools import ifilterfalse as filterfalse + try: from _thread import RLock except ImportError: @@ -113,27 +138,47 @@ except ImportError: except ImportError: _OrderedDict = None +try: + from types import SimpleNamespace +except ImportError: + class SimpleNamespace: pass + +# version compatibility configuration +__compat__ = SimpleNamespace() +__compat__.__doc__ = """ + A cross-version compatibility configuration for pyparsing features that will be + released in a future version. By setting values in this configuration to True, + those features can be enabled in prior versions for compatibility development + and testing. + + - collect_all_And_tokens - flag to enable fix for Issue #63 that fixes erroneous grouping + of results names when an And expression is nested within an Or or MatchFirst; set to + True to enable bugfix to be released in pyparsing 2.4 +""" +__compat__.collect_all_And_tokens = True + + #~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) -__all__ = [ +__all__ = [ '__version__', '__versionTime__', '__author__', '__compat__', 'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', 'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', -'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', +'PrecededBy', 'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', 'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', 'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', -'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', -'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', +'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', +'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', 'Char', 'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', 'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', 'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', 'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', 'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', 'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', -'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', +'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', +'CloseMatch', 'tokenMap', 'pyparsing_common', 'pyparsing_unicode', 'unicode_set', ] system_version = tuple(sys.version_info)[:3] @@ -142,6 +187,7 @@ if PY_3: _MAX_INT = sys.maxsize basestring = str unichr = chr + unicode = str _ustr = str # build list of single arg builtins, that can be used as parse actions @@ -152,9 +198,11 @@ else: range = xrange def _ustr(obj): - """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries - str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It - then < returns the unicode object | encodes it with the default encoding | ... >. + """Drop-in replacement for str(obj) that tries to be Unicode + friendly. It first tries str(obj). If that fails with + a UnicodeEncodeError, then it tries unicode(obj). It then + < returns the unicode object | encodes it with the default + encoding | ... >. """ if isinstance(obj,unicode): return obj @@ -179,9 +227,9 @@ else: singleArgBuiltins.append(getattr(__builtin__,fname)) except AttributeError: continue - + _generatorType = type((y for y in range(1))) - + def _xml_escape(data): """Escape &, <, >, ", ', etc. in a string of data.""" @@ -192,9 +240,6 @@ def _xml_escape(data): data = data.replace(from_, to_) return data -class _Constants(object): - pass - alphas = string.ascii_uppercase + string.ascii_lowercase nums = "0123456789" hexnums = nums + "ABCDEFabcdef" @@ -220,16 +265,16 @@ class ParseBaseException(Exception): @classmethod def _from_exception(cls, pe): """ - internal factory method to simplify creating one type of ParseException + 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: - - 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 + - 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 """ if( aname == "lineno" ): return lineno( self.loc, self.pstr ) @@ -262,22 +307,94 @@ 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 - + - 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 + + @staticmethod + def explain(exc, depth=16): + """ + Method to take an exception and translate the Python internal traceback into a list + of the pyparsing expressions that caused the exception to be raised. + + Parameters: + + - exc - exception raised during parsing (need not be a ParseException, in support + of Python exceptions that might be raised in a parse action) + - depth (default=16) - number of levels back in the stack trace to list expression + and function names; if None, the full stack trace names will be listed; if 0, only + the failing input line, marker, and exception string will be shown + + Returns a multi-line string listing the ParserElements and/or function names in the + exception's stack trace. + + Note: the diagnostic output will include string representations of the expressions + that failed to parse. These representations will be more helpful if you use `setName` to + give identifiable names to your expressions. Otherwise they will use the default string + forms, which may be cryptic to read. + + explain() is only supported under Python 3. + """ + import inspect + + if depth is None: + depth = sys.getrecursionlimit() + ret = [] + if isinstance(exc, ParseBaseException): + ret.append(exc.line) + ret.append(' ' * (exc.col - 1) + '^') + ret.append("{0}: {1}".format(type(exc).__name__, exc)) + + if depth > 0: + callers = inspect.getinnerframes(exc.__traceback__, context=depth) + seen = set() + for i, ff in enumerate(callers[-depth:]): + frm = ff[0] + + f_self = frm.f_locals.get('self', None) + if isinstance(f_self, ParserElement): + if frm.f_code.co_name not in ('parseImpl', '_parseNoCache'): + continue + if f_self in seen: + continue + seen.add(f_self) + + self_type = type(f_self) + ret.append("{0}.{1} - {2}".format(self_type.__module__, + self_type.__name__, + f_self)) + elif f_self is not None: + self_type = type(f_self) + ret.append("{0}.{1}".format(self_type.__module__, + self_type.__name__)) + else: + code = frm.f_code + if code.co_name in ('wrapper', ''): + continue + + ret.append("{0}".format(code.co_name)) + + depth -= 1 + if not depth: + break + + return '\n'.join(ret) + class ParseFatalException(ParseBaseException): """user-throwable exception thrown when inconsistent parse content @@ -285,9 +402,11 @@ class ParseFatalException(ParseBaseException): pass class ParseSyntaxException(ParseFatalException): - """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""" + """just like :class:`ParseFatalException`, but thrown internally + when an :class:`ErrorStop` ('-' operator) indicates + that parsing is to stop immediately because an unbacktrackable + syntax error has been found. + """ pass #~ class ReparseException(ParseBaseException): @@ -304,7 +423,9 @@ class ParseSyntaxException(ParseFatalException): #~ self.reparseLoc = restartLoc class RecursiveGrammarException(Exception): - """exception thrown by L{ParserElement.validate} if the grammar could be improperly recursive""" + """exception thrown by :class:`ParserElement.validate` if the + grammar could be improperly recursive + """ def __init__( self, parseElementList ): self.parseElementTrace = parseElementList @@ -322,16 +443,18 @@ class _ParseResultsWithOffset(object): self.tup = (self.tup[0],i) class ParseResults(object): - """ - 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.} - see L{ParserElement.setResultsName}) + """Structured parse results, to provide multiple means of access to + the parsed data: + + - as a list (``len(results)``) + - by list index (``results[0], results[1]``, etc.) + - by attribute (``results.`` - see :class:`ParserElement.setResultsName`) Example:: + integer = Word(nums) - date_str = (integer.setResultsName("year") + '/' - + integer.setResultsName("month") + '/' + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + integer.setResultsName("day")) # equivalent form: # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") @@ -348,7 +471,9 @@ class ParseResults(object): test("'month' in result") test("'minutes' in result") test("result.dump()", str) + prints:: + list(result) -> ['1999', '/', '12', '/', '31'] result[0] -> '1999' result['month'] -> '12' @@ -398,7 +523,7 @@ class ParseResults(object): toklist = [ toklist ] if asList: if isinstance(toklist,ParseResults): - self[name] = _ParseResultsWithOffset(toklist.copy(),0) + self[name] = _ParseResultsWithOffset(ParseResults(toklist.__toklist), 0) else: self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) self[name].__name = name @@ -467,19 +592,19 @@ class ParseResults(object): def _itervalues( self ): return (self[k] for k in self._iterkeys()) - + def _iteritems( self ): return ((k, self[k]) for k in self._iterkeys()) if PY_3: - keys = _iterkeys - """Returns an iterator of all named result keys (Python 3.x only).""" + keys = _iterkeys + """Returns an iterator of all named result keys.""" values = _itervalues - """Returns an iterator of all named result values (Python 3.x only).""" + """Returns an iterator of all named result values.""" items = _iteritems - """Returns an iterator of all named result key-value tuples (Python 3.x only).""" + """Returns an iterator of all named result key-value tuples.""" else: iterkeys = _iterkeys @@ -498,7 +623,7 @@ class ParseResults(object): def values( self ): """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 key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" return list(self.iteritems()) @@ -507,19 +632,20 @@ class ParseResults(object): """Since keys() returns an iterator, this method is helpful in bypassing code that looks for the existence of any defined results names.""" return bool(self.__tokdict) - + def pop( self, *args, **kwargs): """ - 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()}. + 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()``. Example:: + def remove_first(tokens): tokens.pop(0) print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] @@ -536,7 +662,9 @@ class ParseResults(object): return tokens patt.addParseAction(remove_LABEL) print(patt.parseString("AAB 123 321").dump()) + prints:: + ['AAB', '123', '321'] - LABEL: AAB @@ -549,8 +677,8 @@ class ParseResults(object): args = (args[0], v) else: raise TypeError("pop() got an unexpected keyword argument '%s'" % k) - if (isinstance(args[0], int) or - len(args) == 1 or + if (isinstance(args[0], int) or + len(args) == 1 or args[0] in self): index = args[0] ret = self[index] @@ -563,14 +691,15 @@ class ParseResults(object): 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. + such name, then returns the given ``defaultValue`` or ``None`` if no + ``defaultValue`` is specified. + + Similar to ``dict.get()``. - Similar to C{dict.get()}. - Example:: + integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") result = date_str.parseString("1999/12/31") print(result.get("year")) # -> '1999' @@ -585,10 +714,11 @@ class ParseResults(object): def insert( self, index, insStr ): """ Inserts new element at location index in the list of parsed tokens. - - Similar to C{list.insert()}. + + Similar to ``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 @@ -607,8 +737,9 @@ class ParseResults(object): 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))) @@ -621,8 +752,9 @@ class ParseResults(object): 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])) @@ -630,7 +762,7 @@ class ParseResults(object): print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' """ if isinstance(itemseq, ParseResults): - self += itemseq + self.__iadd__(itemseq) else: self.__toklist.extend(itemseq) @@ -646,7 +778,7 @@ class ParseResults(object): return self[name] except KeyError: return "" - + if name in self.__tokdict: if name not in self.__accumNames: return self.__tokdict[name][-1][0] @@ -671,7 +803,7 @@ class ParseResults(object): self[k] = v if isinstance(v[0],ParseResults): v[0].__parent = wkref(self) - + self.__toklist += other.__toklist self.__accumNames.update( other.__accumNames ) return self @@ -683,7 +815,7 @@ class ParseResults(object): else: # this may raise a TypeError - so be it return other + self - + def __repr__( self ): return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) @@ -706,11 +838,12 @@ class ParseResults(object): 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'] @@ -722,12 +855,13 @@ class ParseResults(object): 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'} @@ -740,7 +874,7 @@ class ParseResults(object): item_fn = self.items else: item_fn = self.iteritems - + def toItem(obj): if isinstance(obj, ParseResults): if obj.haskeys(): @@ -749,15 +883,15 @@ class ParseResults(object): 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 :class:`ParseResults` object. """ ret = ParseResults( self.__toklist ) - ret.__tokdict = self.__tokdict.copy() + ret.__tokdict = dict(self.__tokdict.items()) ret.__parent = self.__parent ret.__accumNames.update( self.__accumNames ) ret.__name = self.__name @@ -833,22 +967,25 @@ class ParseResults(object): def getName(self): r""" - Returns the results name for this token expression. Useful when several + 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") + 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 @@ -870,17 +1007,20 @@ class ParseResults(object): 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. + Diagnostic method for listing out the contents of + a :class:`ParseResults`. Accepts an optional ``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 @@ -910,16 +1050,18 @@ class ParseResults(object): 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 + `pprint `_ module. + Accepts additional positional or keyword args as defined for + `pprint.pprint `_ . Example:: + ident = Word(alphas, alphanums) num = Word(nums) func = Forward() @@ -927,7 +1069,9 @@ class ParseResults(object): 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', @@ -970,24 +1114,25 @@ def col (loc,strg): The first column is number 1. Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See L{I{ParserElement.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. + before starting the parsing process. See + :class:`ParserElement.parseString` for more + information on parsing strings containing ```` 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. """ s = strg return 1 if 0} 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. - """ + Note - the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See :class:`ParserElement.parseString` + for more information on parsing strings containing ```` 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. + """ return strg.count("\n",0,loc) + 1 def line( loc, strg ): @@ -1041,7 +1186,7 @@ def _trim_arity(func, maxargs=2): return lambda s,l,t: func(t) limit = [0] foundArity = [False] - + # traceback return data structure changed in Py3.5 - normalize back to plain tuples if system_version[:2] >= (3,5): def extract_stack(limit=0): @@ -1056,12 +1201,12 @@ def _trim_arity(func, maxargs=2): else: extract_stack = traceback.extract_stack extract_tb = traceback.extract_tb - - # synthesize what would be returned by traceback.extract_stack at the call to + + # 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 + # 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) @@ -1092,7 +1237,7 @@ def _trim_arity(func, maxargs=2): # copy func name to wrapper for sensible debug output func_name = "" try: - func_name = getattr(func, '__name__', + func_name = getattr(func, '__name__', getattr(func, '__class__').__name__) except Exception: func_name = str(func) @@ -1111,9 +1256,10 @@ class ParserElement(object): 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'] @@ -1124,18 +1270,19 @@ 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 = 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 = integer("year") + '/' + integer("month") + '/' + integer("day") date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] """ @@ -1149,7 +1296,7 @@ class ParserElement(object): self.resultsName = None self.saveAsList = savelist self.skipWhitespace = True - self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + self.whiteChars = set(ParserElement.DEFAULT_WHITE_CHARS) self.copyDefaultWhiteChars = True self.mayReturnEmpty = False # used when checking for left-recursion self.keepTabs = False @@ -1166,18 +1313,24 @@ class ParserElement(object): 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 :class:`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()}:: + + Equivalent form of ``expr.copy()`` is just ``expr()``:: + integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") """ cpy = copy.copy( self ) @@ -1190,8 +1343,9 @@ class ParserElement(object): def setName( self, name ): """ 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) """ @@ -1205,17 +1359,18 @@ class ParserElement(object): """ 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; + NOTE: this returns a *copy* of the original :class:`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__>}. + ``expr("name")`` in place of ``expr.setResultsName("name")`` + - see :class:`__call__`. Example:: - date_str = (integer.setResultsName("year") + '/' - + integer.setResultsName("month") + '/' + + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + integer.setResultsName("day")) # equivalent form: @@ -1231,7 +1386,7 @@ class ParserElement(object): def setBreak(self,breakFlag = True): """Method to invoke the Python pdb debugger when this element is - about to be parsed. Set C{breakFlag} to True to enable, False to + about to be parsed. Set ``breakFlag`` to True to enable, False to disable. """ if breakFlag: @@ -1250,25 +1405,28 @@ class ParserElement(object): def setParseAction( self, *fns, **kwargs ): """ Define one or more actions 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 + Parse action fn is a callable method with 0-3 arguments, called as ``fn(s,loc,toks)`` , + ``fn(loc,toks)`` , ``fn(toks)`` , or just ``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 :class:`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. Optional keyword arguments: - - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing + - callDuringTry = (default= ``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. - + before starting the parsing process. See :class:`parseString for more + information on parsing strings containing ```` 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 @@ -1287,24 +1445,25 @@ class ParserElement(object): def addParseAction( self, *fns, **kwargs ): """ - Add one or more parse actions to expression's list of parse actions. See L{I{setParseAction}}. - - See examples in L{I{copy}}. + Add one or more parse actions to expression's list of parse actions. See :class:`setParseAction`. + + See examples in :class:`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}} for function call signatures. Unlike C{setParseAction}, - functions passed to C{addCondition} need to return boolean success/fail of the condition. + """Add a boolean predicate function to expression's list of parse actions. See + :class:`setParseAction` for function call signatures. Unlike ``setParseAction``, + functions passed to ``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 - + - 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") @@ -1315,8 +1474,9 @@ class ParserElement(object): msg = kwargs.get("message", "failed user-defined condition") exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException for fn in fns: + fn = _trim_arity(fn) def pa(s,l,t): - if not bool(_trim_arity(fn)(s,l,t)): + if not bool(fn(s,l,t)): raise exc_type(s,l,msg) self.parseAction.append(pa) self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) @@ -1325,12 +1485,12 @@ class ParserElement(object): def setFailAction( self, fn ): """Define action to perform if parsing fails at this expression. Fail acton fn is a callable function that takes the arguments - C{fn(s,loc,expr,err)} where: - - s = string being parsed - - loc = location where expression match was attempted and failed - - expr = the parse expression that failed - - err = the exception thrown - The function returns no value. It may throw C{L{ParseFatalException}} + ``fn(s,loc,expr,err)`` where: + - s = string being parsed + - loc = location where expression match was attempted and failed + - expr = the parse expression that failed + - err = the exception thrown + The function returns no value. It may throw :class:`ParseFatalException` if it is desired to stop parsing immediately.""" self.failAction = fn return self @@ -1412,8 +1572,14 @@ class ParserElement(object): if debugging: try: for fn in self.parseAction: - tokens = fn( instring, tokensStart, retTokens ) - if tokens is not None: + try: + tokens = fn( instring, tokensStart, retTokens ) + except IndexError as parse_action_exc: + exc = ParseException("exception raised in parse action") + exc.__cause__ = parse_action_exc + raise exc + + if tokens is not None and tokens is not retTokens: retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), @@ -1425,8 +1591,14 @@ class ParserElement(object): raise else: for fn in self.parseAction: - tokens = fn( instring, tokensStart, retTokens ) - if tokens is not None: + try: + tokens = fn( instring, tokensStart, retTokens ) + except IndexError as parse_action_exc: + exc = ParseException("exception raised in parse action") + exc.__cause__ = parse_action_exc + raise exc + + if tokens is not None and tokens is not retTokens: retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), @@ -1443,7 +1615,7 @@ 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) @@ -1465,7 +1637,7 @@ class ParserElement(object): def clear(self): cache.clear() - + def cache_len(self): return len(cache) @@ -1577,23 +1749,23 @@ class ParserElement(object): 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. - + + - cache_size_limit - (default= ``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 - program must call the class method C{ParserElement.enablePackrat()}. If - your program uses C{psyco} to "compile as you go", you must call - 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. - + program must call the class method :class:`ParserElement.enablePackrat`. + For best results, call ``enablePackrat()`` immediately after + importing pyparsing. + Example:: + from pip._vendor import pyparsing pyparsing.ParserElement.enablePackrat() """ @@ -1612,23 +1784,25 @@ class ParserElement(object): 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()}}). + successfully parsed, then set ``parseAll`` to True (equivalent to ending + the grammar with ``StringEnd()``). - Note: C{parseString} implicitly calls C{expandtabs()} on the input string, + Note: ``parseString`` implicitly calls ``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 + the grammar uses parse actions that use the ``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} - + + - calling ``parseWithTabs`` on your grammar before calling ``parseString`` + (see :class:`parseWithTabs`) + - define your parse action using the full ``(s,loc,toks)`` signature, and + reference the input string using the parse action's ``s`` argument + - explictly expand the tabs in your input string before calling + ``parseString`` + Example:: + Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text """ @@ -1659,22 +1833,23 @@ class ParserElement(object): """ 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. + ``maxMatches`` argument, to clip scanning after 'n' matches are found. If + ``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 + being parsed. See :class:`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 @@ -1728,19 +1903,22 @@ class ParserElement(object): 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 + Extension to :class:`scanString`, to modify matching text with modified tokens that may + be returned from a parse action. To use ``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, + Invoking ``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. - + action. ``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:: + + prints:: + Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. """ out = [] @@ -1771,19 +1949,22 @@ class ParserElement(object): def searchString( self, instring, maxMatches=_MAX_INT ): """ - Another extension to C{L{scanString}}, simplifying the access to the tokens found + Another extension to :class:`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. - + ``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")) # the sum() builtin can be used to merge results into a single ParseResults object print(sum(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))) + prints:: + [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']] ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity'] """ @@ -1799,14 +1980,17 @@ class ParserElement(object): 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 + May be called with optional ``maxsplit`` argument, to limit the number of splits; + and the optional ``includeSeparators`` argument (default= ``False``), if the separating matching text should be included in the split results. - - Example:: + + 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 @@ -1820,14 +2004,17 @@ class ParserElement(object): def __add__(self, other ): """ - Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement - converts them to L{Literal}s by default. - + Implementation of + operator - returns :class:`And`. Adding strings to a ParserElement + converts them to :class:`Literal`s by default. + Example:: + greet = Word(alphas) + "," + Word(alphas) + "!" hello = "Hello, World!" print (hello, "->", greet.parseString(hello)) - Prints:: + + prints:: + Hello, World! -> ['Hello', ',', 'World', '!'] """ if isinstance( other, basestring ): @@ -1840,7 +2027,7 @@ class ParserElement(object): 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 :class:`ParserElement` """ if isinstance( other, basestring ): other = ParserElement._literalStringClass( other ) @@ -1852,7 +2039,7 @@ class ParserElement(object): def __sub__(self, other): """ - Implementation of - operator, returns C{L{And}} with error stop + Implementation of - operator, returns :class:`And` with error stop """ if isinstance( other, basestring ): other = ParserElement._literalStringClass( other ) @@ -1864,7 +2051,7 @@ class ParserElement(object): 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 :class:`ParserElement` """ if isinstance( other, basestring ): other = ParserElement._literalStringClass( other ) @@ -1876,23 +2063,23 @@ class ParserElement(object): 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 - 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)} - (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)} + Implementation of * operator, allows use of ``expr * 3`` in place of + ``expr + expr + expr``. Expressions may also me multiplied by a 2-integer + tuple, similar to ``{min,max}`` multipliers in regular expressions. Tuples + may also include ``None`` as in: + - ``expr*(n,None)`` or ``expr*(n,)`` is equivalent + to ``expr*n + ZeroOrMore(expr)`` + (read as "at least n instances of ``expr``") + - ``expr*(None,n)`` is equivalent to ``expr*(0,n)`` + (read as "0 to n instances of ``expr``") + - ``expr*(None,None)`` is equivalent to ``ZeroOrMore(expr)`` + - ``expr*(1,None)`` is equivalent to ``OneOrMore(expr)`` - Note that C{expr*(None,n)} does not raise an exception if + Note that ``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 + ``expr*(None,n)`` does not enforce a maximum number of expr occurrences. If this behavior is desired, then write - C{expr*(None,n) + ~expr} + ``expr*(None,n) + ~expr`` """ if isinstance(other,int): minElements, optElements = other,0 @@ -1947,7 +2134,7 @@ class ParserElement(object): def __or__(self, other ): """ - Implementation of | operator - returns C{L{MatchFirst}} + Implementation of | operator - returns :class:`MatchFirst` """ if isinstance( other, basestring ): other = ParserElement._literalStringClass( other ) @@ -1959,7 +2146,7 @@ class ParserElement(object): 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 :class:`ParserElement` """ if isinstance( other, basestring ): other = ParserElement._literalStringClass( other ) @@ -1971,7 +2158,7 @@ class ParserElement(object): def __xor__(self, other ): """ - Implementation of ^ operator - returns C{L{Or}} + Implementation of ^ operator - returns :class:`Or` """ if isinstance( other, basestring ): other = ParserElement._literalStringClass( other ) @@ -1983,7 +2170,7 @@ class ParserElement(object): 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 :class:`ParserElement` """ if isinstance( other, basestring ): other = ParserElement._literalStringClass( other ) @@ -1995,7 +2182,7 @@ class ParserElement(object): def __and__(self, other ): """ - Implementation of & operator - returns C{L{Each}} + Implementation of & operator - returns :class:`Each` """ if isinstance( other, basestring ): other = ParserElement._literalStringClass( other ) @@ -2007,7 +2194,7 @@ class ParserElement(object): 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 :class:`ParserElement` """ if isinstance( other, basestring ): other = ParserElement._literalStringClass( other ) @@ -2019,23 +2206,24 @@ class ParserElement(object): def __invert__( self ): """ - Implementation of ~ operator - returns C{L{NotAny}} + Implementation of ~ operator - returns :class:`NotAny` """ return NotAny( self ) def __call__(self, name=None): """ - 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}}. + Shortcut for :class:`setResultsName`, with ``listAllMatches=False``. + + If ``name`` is given with a trailing ``'*'`` character, then ``listAllMatches`` will be + passed as ``True``. + + If ``name` is omitted, same as calling :class:`copy`. Example:: + # these are equivalent userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") - userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") + userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") """ if name is not None: return self.setResultsName(name) @@ -2044,7 +2232,7 @@ class ParserElement(object): def suppress( self ): """ - Suppresses the output of this C{ParserElement}; useful to keep punctuation from + Suppresses the output of this :class:`ParserElement`; useful to keep punctuation from cluttering up returned output. """ return Suppress( self ) @@ -2052,7 +2240,7 @@ class ParserElement(object): 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 + :class:`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 @@ -2069,9 +2257,9 @@ class ParserElement(object): 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 ````s to spaces before parsing the input string. + Must be called before ``parseString`` when the input grammar contains elements that + match ```` characters. """ self.keepTabs = True return self @@ -2081,11 +2269,12 @@ class ParserElement(object): 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'] """ @@ -2112,19 +2301,21 @@ class ParserElement(object): def setDebug( self, flag=True ): """ Enable display of debugging messages while doing pattern matching. - Set C{flag} to True to enable, False to disable. + Set ``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) @@ -2137,12 +2328,12 @@ class ParserElement(object): 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, + specified using :class:`setDebugActions`. Prior to attempting + to match the ``wd`` expression, the debugging message ``"Match at loc (,)"`` + is shown. Then if the parse succeeds, a ``"Matched"`` message is shown, or an ``"Exception raised"`` + message is shown. Also note the use of :class:`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...)"}. + name created for the :class:`Word` expression without calling ``setName`` is ``"W:(ABCD...)"``. """ if flag: self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) @@ -2212,14 +2403,15 @@ class ParserElement(object): def matches(self, testString, parseAll=True): """ - Method for quick testing of a parser against a test string. Good for simple + 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: - testString - to test against this expression for a match - - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests - + - parseAll - (default= ``True``) - flag to pass to :class:`parseString` when running tests + Example:: + expr = Word(nums) assert expr.matches("100") """ @@ -2228,28 +2420,32 @@ class ParserElement(object): return True except ParseBaseException: return False - - def runTests(self, tests, parseAll=True, comment='#', fullDump=True, printResults=True, failureTests=False): + + def runTests(self, tests, parseAll=True, comment='#', + fullDump=True, printResults=True, failureTests=False, postParse=None): """ 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 + - parseAll - (default= ``True``) - flag to pass to :class:`parseString` when running tests + - comment - (default= ``'#'``) - 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; + - fullDump - (default= ``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 + - printResults - (default= ``True``) prints test output to stdout + - failureTests - (default= ``False``) indicates if these tests are expected to fail parsing + - postParse - (default= ``None``) optional callback for successful parse results; called as + `fn(test_string, parse_results)` and returns a string to be added to the test output 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 + (or failed if ``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(''' @@ -2273,7 +2469,9 @@ class ParserElement(object): 3.14.159 ''', failureTests=True) print("Success" if result[0] else "Failed!") + prints:: + # unsigned integer 100 [100] @@ -2291,7 +2489,7 @@ class ParserElement(object): [1e-12] Success - + # stray character 100Z ^ @@ -2313,7 +2511,7 @@ class ParserElement(object): 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): @@ -2332,10 +2530,20 @@ class ParserElement(object): out = ['\n'.join(comments), t] comments = [] try: - t = t.replace(r'\n','\n') + # convert newline marks to actual newlines, and strip leading BOM if present + NL = Literal(r'\n').addParseAction(replaceWith('\n')).ignore(quotedString) + BOM = '\ufeff' + t = NL.transformString(t.lstrip(BOM)) result = self.parseString(t, parseAll=parseAll) out.append(result.dump(full=fullDump)) success = success and not failureTests + if postParse is not None: + try: + pp_value = postParse(t, result) + if pp_value is not None: + out.append(str(pp_value)) + except Exception as e: + out.append("{0} failed: {1}: {2}".format(postParse.__name__, type(e).__name__, e)) except ParseBaseException as pe: fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" if '\n' in t: @@ -2357,21 +2565,20 @@ class ParserElement(object): print('\n'.join(out)) allResults.append((t, result)) - + return success, allResults - + class Token(ParserElement): - """ - Abstract C{ParserElement} subclass, for defining atomic matching patterns. + """Abstract :class:`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__() @@ -2381,8 +2588,7 @@ 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__() @@ -2396,18 +2602,18 @@ 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 case-insensitive matching, use :class:`CaselessLiteral`. + For keyword matching (force word break before and after the matched string), - use L{Keyword} or L{CaselessKeyword}. + use :class:`Keyword` or :class:`CaselessKeyword`. """ def __init__( self, matchString ): super(Literal,self).__init__() @@ -2437,21 +2643,29 @@ _L = 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}}: - - 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}. - + """Token to exactly match a specified string as a keyword, that is, + it must be immediately followed by a non-keyword character. Compare + with :class:`Literal`: + + - ``Literal("if")`` will match the leading ``'if'`` in + ``'ifAndOnlyIf'``. + - ``Keyword("if")`` will not; it will only match the leading + ``'if'`` in ``'if x=1'``, or ``'if(y==2)'`` + + Accepts two optional constructor arguments in addition to the + keyword string: + + - ``identChars`` is a string of characters that would be valid + identifier characters, defaulting to all alphanumerics + "_" and + "$" + - ``caseless`` allows case-insensitive matching, default is ``False``. + Example:: + Keyword("start").parseString("start") # -> ['start'] Keyword("start").parseString("starting") # -> Exception - For case-insensitive matching, use L{CaselessKeyword}. + For case-insensitive matching, use :class:`CaselessKeyword`. """ DEFAULT_KEYWORD_CHARS = alphanums+"_$" @@ -2502,15 +2716,15 @@ class Keyword(Token): Keyword.DEFAULT_KEYWORD_CHARS = chars class CaselessLiteral(Literal): - """ - Token to match a specified string, ignoring case of letters. + """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}.) + + (Contrast with example for :class:`CaselessKeyword`.) """ def __init__( self, matchString ): super(CaselessLiteral,self).__init__( matchString.upper() ) @@ -2526,36 +2740,39 @@ class CaselessLiteral(Literal): class CaselessKeyword(Keyword): """ - Caseless version of L{Keyword}. + Caseless version of :class:`Keyword`. Example:: + OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] - - (Contrast with example for L{CaselessLiteral}.) + + (Contrast with example for :class:`CaselessLiteral`.) """ def __init__( self, matchString, identChars=None ): super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) - def parseImpl( self, instring, loc, doActions=True ): - if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and - (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ): - 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. - + """A variation on :class:`Literal` which matches "close" matches, + that is, strings with at most 'n' mismatching characters. + :class:`CloseMatch` takes parameters: + + - ``match_string`` - string to be matched + - ``maxMismatches`` - (``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: + + - ``mismatches`` - a list of the positions within the + match_string where mismatches were found + - ``original`` - the original match_string used to compare + against the input string + + If ``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) @@ -2604,55 +2821,62 @@ class CloseMatch(Token): 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, + """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}. + maximum, and/or exact length. The default value for ``min`` is + 1 (a minimum value < 1 is not valid); the default values for + ``max`` and ``exact`` are 0, meaning no maximum or exact + length restriction. An optional ``excludeChars`` parameter can + list characters that might be found in the input ``bodyChars`` + string; useful to define a word of all printables except for one or + two characters, for instance. + + :class:`srange` is useful for defining custom character set strings + for defining ``Word`` expressions, using range notation from + regular expression character sets. + + A common mistake is to use :class:`Word` to match a specific literal + string, as in ``Word("Address")``. Remember that :class:`Word` + uses the string argument to define *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 :class:`Literal` or :class:`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) + + - :class:`alphas` + - :class:`nums` + - :class:`alphanums` + - :class:`hexnums` + - :class:`alphas8bit` (alphabetic characters in ASCII range 128-255 + - accented, tilded, umlauted, etc.) + - :class:`punc8bit` (non-alphabetic characters in ASCII range + 128-255 - currency, symbols, superscripts, diacriticals, etc.) + - :class:`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__() if excludeChars: + excludeChars = set(excludeChars) initChars = ''.join(c for c in initChars if c not in excludeChars) if bodyChars: bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) @@ -2713,7 +2937,7 @@ class Word(Token): loc = result.end() return loc, result.group() - if not(instring[ loc ] in self.initChars): + if instring[loc] not in self.initChars: raise ParseException(instring, loc, self.errmsg, self) start = loc @@ -2728,9 +2952,9 @@ class Word(Token): throwException = False if loc - start < self.minLen: throwException = True - if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: + elif self.maxSpecified and loc < instrlen and instring[loc] in bodychars: throwException = True - if self.asKeyword: + elif self.asKeyword: if (start>0 and instring[start-1] in bodychars) or (loc...)}), these will be preserved as - named parse results. + r"""Token for matching strings that match a given regular + expression. Defined with string specifying the regular expression in + a form recognized by the stdlib Python `re module `_. + If the given regex contains named groups (defined using ``(?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})") + # ref: https://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?{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): - """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.""" + def __init__( self, pattern, flags=0, asGroupList=False, asMatch=False): + """The parameters ``pattern`` and ``flags`` are passed + to the ``re.compile()`` function as-is. See the Python + `re module `_ module for an + explanation of the acceptable patterns and flags. + """ super(Regex,self).__init__() if isinstance(pattern, basestring): @@ -2801,7 +3041,7 @@ class Regex(Token): self.pattern = \ self.reString = str(pattern) self.flags = flags - + else: raise ValueError("Regex may only be constructed with a string or a compiled RE object") @@ -2809,19 +3049,43 @@ class Regex(Token): self.errmsg = "Expected " + self.name self.mayIndexError = False self.mayReturnEmpty = True + self.asGroupList = asGroupList + self.asMatch = asMatch + if self.asGroupList: + self.parseImpl = self.parseImplAsGroupList + if self.asMatch: + self.parseImpl = self.parseImplAsMatch - def parseImpl( self, instring, loc, doActions=True ): + def parseImpl(self, instring, loc, doActions=True): result = self.re.match(instring,loc) if not result: raise ParseException(instring, loc, self.errmsg, self) loc = result.end() - d = result.groupdict() ret = ParseResults(result.group()) + d = result.groupdict() if d: - for k in d: - ret[k] = d[k] - return loc,ret + for k, v in d.items(): + ret[k] = v + return loc, ret + + def parseImplAsGroupList(self, instring, loc, doActions=True): + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result.groups() + return loc, ret + + def parseImplAsMatch(self, instring, loc, doActions=True): + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result + return loc, ret def __str__( self ): try: @@ -2834,28 +3098,70 @@ class Regex(Token): return self.strRepr + def sub(self, repl): + r""" + Return Regex with an attached parse action to transform the parsed + result as if called using `re.sub(expr, repl, string) `_. + + Example:: + + make_html = Regex(r"(\w+):(.*?):").sub(r"<\1>\2") + print(make_html.transformString("h1:main title:")) + # prints "

main title

" + """ + if self.asGroupList: + warnings.warn("cannot use sub() with Regex(asGroupList=True)", + SyntaxWarning, stacklevel=2) + raise SyntaxError() + + if self.asMatch and callable(repl): + warnings.warn("cannot use sub() with a callable with Regex(asMatch=True)", + SyntaxWarning, stacklevel=2) + raise SyntaxError() + + if self.asMatch: + def pa(tokens): + return tokens[0].expand(repl) + else: + def pa(tokens): + return self.re.sub(repl, tokens[0]) + return self.addParseAction(pa) class QuotedString(Token): 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}) + + - 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= ``False`` ) + - unquoteResults - boolean indicating whether the matched text + should be unquoted (default= ``True`` ) + - endQuoteChar - string of one or more characters defining the + end of the quote delimited string (default= ``None`` => same as + quoteChar) + - convertWhitespaceEscapes - convert escaped whitespace + (``'\t'``, ``'\n'``, etc.) to actual whitespace + (default= ``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']] @@ -2973,19 +3279,23 @@ class QuotedString(Token): class CharsNotIn(Token): - """ - 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. + """Token for matching words composed of characters *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 ``min`` is + 1 (a minimum value < 1 is not valid); the default values for + ``max`` and ``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 ): @@ -2994,7 +3304,9 @@ class CharsNotIn(Token): self.notChars = notChars if min < 1: - raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted") + raise ValueError( + "cannot specify a minimum length < 1; use " + + "Optional(CharsNotIn()) if zero-length char group is permitted") self.minLen = min @@ -3044,19 +3356,38 @@ 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 ``" \\t\\r\\n"``. Also takes optional ``min``, + ``max``, and ``exact`` arguments, as defined for the + :class:`Word` class. """ whiteStrs = { - " " : "", - "\t": "", - "\n": "", - "\r": "", - "\f": "", + ' ' : '', + '\t': '', + '\n': '', + '\r': '', + '\f': '', + 'u\00A0': '', + 'u\1680': '', + 'u\180E': '', + 'u\2000': '', + 'u\2001': '', + 'u\2002': '', + 'u\2003': '', + 'u\2004': '', + 'u\2005': '', + 'u\2006': '', + 'u\2007': '', + 'u\2008': '', + 'u\2009': '', + 'u\200A': '', + 'u\200B': '', + 'u\202F': '', + 'u\205F': '', + 'u\3000': '', } def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): super(White,self).__init__() @@ -3079,7 +3410,7 @@ class White(Token): self.minLen = exact def parseImpl( self, instring, loc, doActions=True ): - if not(instring[ loc ] in self.matchWhite): + if instring[loc] not in self.matchWhite: raise ParseException(instring, loc, self.errmsg, self) start = loc loc += 1 @@ -3102,8 +3433,8 @@ 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__() @@ -3128,11 +3459,11 @@ class GoToColumn(_PositionToken): class LineStart(_PositionToken): - """ - Matches if current position is at the beginning of a line within the parse string - + r"""Matches if current position is at the beginning of a line within + the parse string + Example:: - + test = '''\ AAA this line AAA and this line @@ -3142,10 +3473,11 @@ class LineStart(_PositionToken): for t in (LineStart() + 'AAA' + restOfLine).searchString(test): print(t) - - Prints:: + + prints:: + ['AAA', ' this line'] - ['AAA', ' and this line'] + ['AAA', ' and this line'] """ def __init__( self ): @@ -3158,8 +3490,8 @@ class LineStart(_PositionToken): 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__() @@ -3178,8 +3510,8 @@ 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__() @@ -3193,8 +3525,7 @@ 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__() @@ -3211,12 +3542,13 @@ 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 + ``wordChars`` (default= ``printables``). To emulate the + ``\b`` behavior of regular expressions, use + ``WordStart(alphanums)``. ``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__() @@ -3231,12 +3563,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 ``wordChars`` + (default= ``printables``). To emulate the ``\b`` behavior of + regular expressions, use ``WordEnd(alphanums)``. ``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__() @@ -3254,8 +3586,8 @@ 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) @@ -3286,7 +3618,7 @@ class ParseExpression(ParserElement): return self def leaveWhitespace( self ): - """Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on + """Extends ``leaveWhitespace`` defined in base class, and also invokes ``leaveWhitespace`` on all contained expressions.""" self.skipWhitespace = False self.exprs = [ e.copy() for e in self.exprs ] @@ -3347,19 +3679,15 @@ class ParseExpression(ParserElement): self.mayIndexError |= other.mayIndexError self.errmsg = "Expected " + _ustr(self) - - return self - def setResultsName( self, name, listAllMatches=False ): - ret = super(ParseExpression,self).setResultsName(name,listAllMatches) - return ret + return self def validate( self, validateTrace=[] ): tmp = validateTrace[:]+[self] for e in self.exprs: e.validate(tmp) self.checkRecursion( [] ) - + def copy(self): ret = super(ParseExpression,self).copy() ret.exprs = [e.copy() for e in self.exprs] @@ -3367,12 +3695,14 @@ class ParseExpression(ParserElement): class And(ParseExpression): """ - Requires all given C{ParseExpression}s to be found in the given order. + Requires all given :class:`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. + May be constructed using the ``'+'`` operator. + May also be constructed using the ``'-'`` operator, which will + suppress backtracking. Example:: + integer = Word(nums) name_expr = OneOrMore(Word(alphas)) @@ -3394,6 +3724,11 @@ class And(ParseExpression): self.skipWhitespace = self.exprs[0].skipWhitespace self.callPreparse = True + def streamline(self): + super(And, self).streamline() + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + return self + def parseImpl( self, instring, loc, doActions=True ): # pass False as last arg to _parse for first element, since we already # pre-parsed the string as part of our And pre-parsing @@ -3442,17 +3777,20 @@ 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 :class:`ParseExpression` is found. If + two expressions match, the expression that matches the longest + string will be used. May be constructed using the ``'^'`` + 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 ): @@ -3462,6 +3800,12 @@ class Or(ParseExpression): else: self.mayReturnEmpty = True + def streamline(self): + super(Or, self).streamline() + if __compat__.collect_all_And_tokens: + self.saveAsList = any(e.saveAsList for e in self.exprs) + return self + def parseImpl( self, instring, loc, doActions=True ): maxExcLoc = -1 maxException = None @@ -3521,14 +3865,14 @@ 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 :class:`ParseExpression` is found. If + two expressions match, the first one listed is the one that will + match. May be constructed using the ``'|'`` 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']] @@ -3544,6 +3888,12 @@ class MatchFirst(ParseExpression): else: self.mayReturnEmpty = True + def streamline(self): + super(MatchFirst, self).streamline() + if __compat__.collect_all_And_tokens: + self.saveAsList = any(e.saveAsList for e in self.exprs) + return self + def parseImpl( self, instring, loc, doActions=True ): maxExcLoc = -1 maxException = None @@ -3589,12 +3939,13 @@ 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 :class:`ParseExpression` s to be found, but in + any order. Expressions may be separated by whitespace. + + May be constructed using the ``'&'`` 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) @@ -3603,7 +3954,7 @@ class Each(ParseExpression): color_attr = "color:" + color("color") size_attr = "size:" + integer("size") - # use Each (using operator '&') to accept attributes in any order + # 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) @@ -3613,7 +3964,9 @@ class Each(ParseExpression): 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 @@ -3647,6 +4000,12 @@ class Each(ParseExpression): self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) self.skipWhitespace = True self.initExprGroups = True + self.saveAsList = True + + def streamline(self): + super(Each, self).streamline() + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + return self def parseImpl( self, instring, loc, doActions=True ): if self.initExprGroups: @@ -3713,8 +4072,8 @@ class Each(ParseExpression): class ParseElementEnhance(ParserElement): - """ - Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens. + """Abstract subclass of :class:`ParserElement`, for combining and + post-processing parsed tokens. """ def __init__( self, expr, savelist=False ): super(ParseElementEnhance,self).__init__(savelist) @@ -3790,20 +4149,25 @@ class ParseElementEnhance(ParserElement): class FollowedBy(ParseElementEnhance): - """ - 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. + """Lookahead matching of the given parse expression. + ``FollowedBy`` does *not* advance the parsing position within + the input string, it only verifies that the specified parse + expression matches at the current position. ``FollowedBy`` + always returns a null token list. If any results names are defined + in the lookahead expression, those *will* be returned for access by + name. 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 ): @@ -3811,20 +4175,108 @@ class FollowedBy(ParseElementEnhance): self.mayReturnEmpty = True def parseImpl( self, instring, loc, doActions=True ): - self.expr.tryParse( instring, loc ) - return loc, [] + _, ret = self.expr._parse(instring, loc, doActions=doActions) + del ret[:] + return loc, ret + + +class PrecededBy(ParseElementEnhance): + """Lookbehind matching of the given parse expression. + ``PrecededBy`` does not advance the parsing position within the + input string, it only verifies that the specified parse expression + matches prior to the current position. ``PrecededBy`` always + returns a null token list, but if a results name is defined on the + given expression, it is returned. + + Parameters: + + - expr - expression that must match prior to the current parse + location + - retreat - (default= ``None``) - (int) maximum number of characters + to lookbehind prior to the current parse location + + If the lookbehind expression is a string, Literal, Keyword, or + a Word or CharsNotIn with a specified exact or maximum length, then + the retreat parameter is not required. Otherwise, retreat must be + specified to give a maximum number of characters to look back from + the current parse position for a lookbehind match. + + Example:: + + # VB-style variable names with type prefixes + int_var = PrecededBy("#") + pyparsing_common.identifier + str_var = PrecededBy("$") + pyparsing_common.identifier + + """ + def __init__(self, expr, retreat=None): + super(PrecededBy, self).__init__(expr) + self.expr = self.expr().leaveWhitespace() + self.mayReturnEmpty = True + self.mayIndexError = False + self.exact = False + if isinstance(expr, str): + retreat = len(expr) + self.exact = True + elif isinstance(expr, (Literal, Keyword)): + retreat = expr.matchLen + self.exact = True + elif isinstance(expr, (Word, CharsNotIn)) and expr.maxLen != _MAX_INT: + retreat = expr.maxLen + self.exact = True + elif isinstance(expr, _PositionToken): + retreat = 0 + self.exact = True + self.retreat = retreat + self.errmsg = "not preceded by " + str(expr) + self.skipWhitespace = False + + def parseImpl(self, instring, loc=0, doActions=True): + if self.exact: + if loc < self.retreat: + raise ParseException(instring, loc, self.errmsg) + start = loc - self.retreat + _, ret = self.expr._parse(instring, start) + else: + # retreat specified a maximum lookbehind window, iterate + test_expr = self.expr + StringEnd() + instring_slice = instring[:loc] + last_expr = ParseException(instring, loc, self.errmsg) + for offset in range(1, min(loc, self.retreat+1)): + try: + _, ret = test_expr._parse(instring_slice, loc-offset) + except ParseBaseException as pbe: + last_expr = pbe + else: + break + else: + raise last_expr + # return empty list of tokens, but preserve any defined results names + del ret[:] + return loc, ret class NotAny(ParseElementEnhance): - """ - 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. + """Lookahead to disallow matching with the given parse expression. + ``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, ``NotAny`` does + *not* skip over leading whitespace. ``NotAny`` always returns + a null token list. May be constructed using the '~' operator. Example:: - + + AND, OR, NOT = map(CaselessKeyword, "AND OR NOT".split()) + + # take care not to mistake keywords for identifiers + ident = ~(AND | OR | NOT) + Word(alphas) + boolean_term = Optional(NOT) + ident + + # very crude boolean expression - to support parenthesis groups and + # operation hierarchy, use infixNotation + boolean_expr = boolean_term + ZeroOrMore((AND | OR) + boolean_term) + + # integers that are followed by "." are actually floats + integer = Word(nums) + ~Char(".") """ def __init__( self, expr ): super(NotAny,self).__init__(expr) @@ -3862,7 +4314,7 @@ class _MultipleMatch(ParseElementEnhance): 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: @@ -3884,18 +4336,18 @@ class _MultipleMatch(ParseElementEnhance): pass return loc, tokens - + class OneOrMore(_MultipleMatch): - """ - Repetition of one or more of the given expression. - + """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) + - stopOn - (default= ``None``) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) Example:: + data_word = Word(alphas) label = data_word + FollowedBy(':') attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) @@ -3906,7 +4358,7 @@ class OneOrMore(_MultipleMatch): # 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() """ @@ -3921,21 +4373,20 @@ class OneOrMore(_MultipleMatch): return self.strRepr class ZeroOrMore(_MultipleMatch): - """ - Optional repetition of zero or more of the given expression. - + """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) + - stopOn - (default= ``None``) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) - Example: similar to L{OneOrMore} + Example: similar to :class:`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) @@ -3960,27 +4411,29 @@ class _NullToken(object): _optionalNotMatched = _NullToken() class Optional(ParseElementEnhance): - """ - Optional matching of the given expression. + """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'] @@ -4024,20 +4477,21 @@ class Optional(ParseElementEnhance): return self.strRepr class SkipTo(ParseElementEnhance): - """ - Token for skipping over all undefined text until the matched expression is found. + """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 + - include - (default= ``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 + - ignore - (default= ``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, + - failOn - (default= ``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 @@ -4054,14 +4508,16 @@ class SkipTo(ParseElementEnhance): # - 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 + 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 @@ -4084,7 +4540,7 @@ class SkipTo(ParseElementEnhance): self.mayReturnEmpty = True self.mayIndexError = False self.includeMatch = include - self.asList = False + self.saveAsList = False if isinstance(failOn, basestring): self.failOn = ParserElement._literalStringClass(failOn) else: @@ -4098,14 +4554,14 @@ class SkipTo(ParseElementEnhance): 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: @@ -4113,7 +4569,7 @@ class SkipTo(ParseElementEnhance): tmploc = self_ignoreExpr_tryParse(instring, tmploc) except ParseBaseException: break - + try: expr_parse(instring, tmploc, doActions=False, callPreParse=False) except (ParseException, IndexError): @@ -4131,7 +4587,7 @@ class SkipTo(ParseElementEnhance): loc = tmploc skiptext = instring[startloc:loc] skipresult = ParseResults(skiptext) - + if self.includeMatch: loc, mat = expr_parse(instring,loc,doActions,callPreParse=False) skipresult += mat @@ -4139,23 +4595,31 @@ class SkipTo(ParseElementEnhance): return loc, skipresult class Forward(ParseElementEnhance): - """ - Forward declaration of an expression to be defined later - + """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. + When the expression is known, it is assigned to the ``Forward`` + variable using the '<<' operator. + + Note: take care when assigning to ``Forward`` not to overlook + precedence of operators. - 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}:: + explicitly group the values inserted into the ``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}. + See :class:`ParseResults.pprint` for an example of a recursive + parser created using ``Forward``. """ def __init__( self, other=None ): super(Forward,self).__init__( other, savelist=False ) @@ -4172,10 +4636,10 @@ class Forward(ParseElementEnhance): self.saveAsList = self.expr.saveAsList self.ignoreExprs.extend(self.expr.ignoreExprs) return self - + def __ilshift__(self, other): return self << other - + def leaveWhitespace( self ): self.skipWhitespace = False return self @@ -4197,18 +4661,18 @@ 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 + # Avoid infinite recursion by setting a temporary name + self.name = self.__class__.__name__ + ": ..." + + # Use the string representation of main expression. try: if self.expr is not None: retString = _ustr(self.expr) else: retString = "None" finally: - self.__class__ = self._revertClass + del self.name return self.__class__.__name__ + ": " + retString def copy(self): @@ -4219,25 +4683,22 @@ class Forward(ParseElementEnhance): ret <<= self return ret -class _ForwardNoRecurse(Forward): - def __str__( self ): - return "..." - class TokenConverter(ParseElementEnhance): """ - Abstract subclass of C{ParseExpression}, for converting parsed results. + Abstract subclass of :class:`ParseExpression`, for converting parsed results. """ def __init__( self, expr, savelist=False ): super(TokenConverter,self).__init__( expr )#, savelist ) self.saveAsList = False 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 + ``'adjacent=False'`` in the constructor. Example:: + real = Word(nums) + '.' + Word(nums) print(real.parseString('3.1416')) # -> ['3', '.', '1416'] # will also erroneously match the following @@ -4276,10 +4737,11 @@ 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 :class:`ZeroOrMore` and :class:`OneOrMore` expressions. Example:: + ident = Word(alphas) num = Word(nums) term = ident | num @@ -4297,32 +4759,34 @@ 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'] + # 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 @@ -4330,7 +4794,8 @@ class Dict(TokenConverter): - 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. + + See more examples at :class:`ParseResults` of accessing fields by results name. """ def __init__( self, expr ): super(Dict,self).__init__( expr ) @@ -4362,10 +4827,10 @@ 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) @@ -4375,10 +4840,13 @@ class Suppress(TokenConverter): # 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}.) + + (See also :class:`delimitedList`.) """ def postParse( self, instring, loc, tokenlist ): return [] @@ -4388,8 +4856,7 @@ 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) @@ -4404,13 +4871,15 @@ class OnlyOnce(object): self.called = False def traceParseAction(f): - """ - 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. + """Decorator for debugging parse actions. + + When the parse action is called, this decorator will print + ``">> entering method-name(line:, , )"``. + When the parse action completes, the decorator will print + ``"<<"`` followed by the returned value, or any exception that the parse action raised. Example:: + wd = Word(alphas) @traceParseAction @@ -4419,7 +4888,9 @@ def traceParseAction(f): 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'], {})) < ['aa', 'bb', 'cc'] delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] """ @@ -4467,16 +4940,21 @@ 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. + """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. + The matched tokens returns the array of expr tokens as a list - the + leading count token is suppressed. + + If ``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, @@ -4507,17 +4985,19 @@ 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:: + """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. + + will match ``"1:1"``, but not ``"1:2"``. Because this + matches a previous literal, will also match the leading + ``"1:1"`` in ``"1:10"``. If this is not desired, use + :class:`matchPreviousExpr`. Do *not* use with packrat parsing + enabled. """ rep = Forward() def copyTokenToRepeater(s,l,t): @@ -4535,18 +5015,19 @@ def matchPreviousLiteral(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:: + """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. + + will match ``"1:1"``, but not ``"1:2"``. Because this + matches by expressions, will *not* match the leading ``"1:1"`` + in ``"1:10"``; the expressions are evaluated first, and then + compared, so ``"1"`` is compared with ``"10"``. Do *not* use + with packrat parsing enabled. """ rep = Forward() e2 = expr.copy() @@ -4571,26 +5052,33 @@ 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 :class:`MatchFirst` for best performance. 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) + + - strs - a string of space-delimited literals, or a collection of + string literals + - caseless - (default= ``False``) - treat all literals as + caseless + - useRegex - (default= ``True``) - as an optimization, will + generate a Regex object; otherwise, will generate + a :class:`MatchFirst` object (if ``caseless=True``, or if + creating a :class:`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: @@ -4644,19 +5132,21 @@ def oneOf( strs, caseless=False, useRegex=True ): 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 :class:`Dict`, :class:`ZeroOrMore`, and + :class:`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 :class:`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) @@ -4666,7 +5156,9 @@ def dictOf( key, value ): 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 @@ -4676,29 +5168,34 @@ def dictOf( key, value ): SQUARE {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} """ - return Dict( ZeroOrMore( Group ( key + value ) ) ) + return Dict(OneOrMore(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. 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. + """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 ``asString`` argument is passed as + ``False``, then the return value is + a :class:`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 + :class:`originalTextFor` contains expressions with defined + results names, you must set ``asString`` to ``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'] """ @@ -4715,29 +5212,33 @@ def originalTextFor(expr, asString=True): matchExpr.ignoreExprs = expr.ignoreExprs return matchExpr -def ungroup(expr): +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]) + return TokenConverter(expr).addParseAction(lambda t:t[0]) def locatedExpr(expr): - """ - Helper to decorate a returned token with its starting and ending locations in the input string. + """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 ```` characters, you + may want to call :class:`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]] @@ -4761,22 +5262,30 @@ _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:: + 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: + + 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.) + - 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.) """ _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: @@ -4785,9 +5294,8 @@ def srange(s): 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: @@ -4795,24 +5303,26 @@ 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}()}. + """Helper method for common parse actions that simply return + a literal value. Especially useful when used with + :class:`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. + """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'"] @@ -4823,18 +5333,20 @@ def removeQuotes(s,l,t): return t[0][1:-1] 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. + """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 + ``hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))``, + which will convert the parsed data to an integer using base 16. + + Example (compare the last to example in :class:`ParserElement.transformString`:: - 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 @@ -4844,7 +5356,9 @@ def tokenMap(func, *args): 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] @@ -4858,7 +5372,7 @@ def tokenMap(func, *args): return [func(tokn, *args) for tokn in t] try: - func_name = getattr(func, '__name__', + func_name = getattr(func, '__name__', getattr(func, '__class__').__name__) except Exception: func_name = str(func) @@ -4867,12 +5381,16 @@ def tokenMap(func, *args): 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}""" +"""(Deprecated) Helper parse action to convert tokens to upper case. +Deprecated in favor of :class:`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): +"""(Deprecated) Helper parse action to convert tokens to lower case. +Deprecated in favor of :class:`pyparsing_common.downcaseTokens`""" + +def _makeTags(tagStr, xml, + suppress_LT=Suppress("<"), + suppress_GT=Suppress(">")): """Internal helper to construct opening and closing tag expressions, given a tag name""" if isinstance(tagStr,basestring): resname = tagStr @@ -4883,74 +5401,88 @@ def _makeTags(tagStr, xml): tagAttrName = Word(alphas,alphanums+"_-:") if (xml): tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) - openTag = Suppress("<") + tagStr("tag") + \ - Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ - Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + openTag = (suppress_LT + + tagStr("tag") + + Dict(ZeroOrMore(Group(tagAttrName + Suppress("=") + tagAttrValue ))) + + Optional("/", default=[False])("empty").setParseAction(lambda s,l,t:t[0]=='/') + + suppress_GT) else: - printablesLessRAbrack = "".join(c for c in printables if c not in ">") - tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) - openTag = Suppress("<") + tagStr("tag") + \ - Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ - Optional( Suppress("=") + tagAttrValue ) ))) + \ - Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") - closeTag = Combine(_L("") + tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printables, excludeChars=">") + openTag = (suppress_LT + + tagStr("tag") + + Dict(ZeroOrMore(Group(tagAttrName.setParseAction(downcaseTokens) + + Optional(Suppress("=") + tagAttrValue)))) + + Optional("/",default=[False])("empty").setParseAction(lambda s,l,t:t[0]=='/') + + suppress_GT) + closeTag = Combine(_L("", adjacent=False) - openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname) - closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("" % resname) + openTag.setName("<%s>" % resname) + # add start results name in parse action now that ungrouped names are not reported at two levels + openTag.addParseAction(lambda t: t.__setitem__("start"+"".join(resname.replace(":"," ").title().split()), t.copy())) + closeTag = closeTag("end"+"".join(resname.replace(":"," ").title().split())).setName("" % resname) openTag.tag = resname closeTag.tag = resname + openTag.tag_body = SkipTo(closeTag()) return openTag, closeTag def makeHTMLTags(tagStr): - """ - 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. + """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 + + 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 + # 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 + + pyparsing -> https://github.com/pyparsing/pyparsing/wiki """ return _makeTags( tagStr, False ) def makeXMLTags(tagStr): - """ - Helper to construct opening and closing tag expressions for XML, given a tag name. Matches - tags only in the given upper/lower case. + """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} + Example: similar to :class:`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 :class:`makeXMLTags` or + :class:`makeHTMLTags`. Use ``withAttribute`` to qualify + a starting tag with a required attribute value, to avoid false + matches on common tags such as ```` or ``
``. - 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. - - If just testing for C{class} (with or without a namespace), use C{L{withClass}}. + Call ``withAttribute`` with a series of attribute names and + values. Specify the list of filter attributes names and values as: - To verify that the attribute exists, but without specifying a value, pass - C{withAttribute.ANY_VALUE} as the value. + - keyword arguments, as in ``(align="right")``, or + - as an explicit dict with ``**`` operator, when an attribute + name is also a Python reserved word, as in ``**{"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. + + If just testing for ``class`` (with or without a namespace), use + :class:`withClass`. + + To verify that the attribute exists, but without specifying a value, + pass ``withAttribute.ANY_VALUE`` as the value. Example:: + html = '''
Some text @@ -4958,7 +5490,7 @@ def withAttribute(*args,**attrDict):
1,3 2,3 1,1
this has no type
- + ''' div,div_end = makeHTMLTags("div") @@ -4967,13 +5499,15 @@ def withAttribute(*args,**attrDict): 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 @@ -4995,11 +5529,12 @@ 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 :class:`withAttribute` when + matching on a div class - made difficult because ``class`` is + a reserved word in Python. Example:: + html = '''
Some text @@ -5007,84 +5542,96 @@ def withClass(classname, namespace=''):
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}) + return withAttribute(**{classattr : classname}) -opAssoc = _Constants() +opAssoc = SimpleNamespace() 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. 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. + """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 + :class:`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}. + - 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 + ``opAssoc.RIGHT`` and ``opAssoc.LEFT``. - parseAction is the parse action to be associated with - expressions matching this operator expression (the - parse action tuple member may be omitted); if the parse action - is passed a tuple or list of functions, this is equivalent to - calling C{setParseAction(*fn)} (L{ParserElement.setParseAction}) - - lpar - expression for matching left-parentheses (default=C{Suppress('(')}) - - rpar - expression for matching right-parentheses (default=C{Suppress(')')}) + expressions matching this operator expression (the parse action + tuple member may be omitted); if the parse action is passed + a tuple or list of functions, this is equivalent to calling + ``setParseAction(*fn)`` + (:class:`ParserElement.setParseAction`) + - lpar - expression for matching left-parentheses + (default= ``Suppress('(')``) + - rpar - expression for matching right-parentheses + (default= ``Suppress(')')``) Example:: - # simple example of four-function arithmetic with ints and variable names + + # simple example of four-function arithmetic with ints and + # variable names integer = pyparsing_common.signed_integer - varname = pyparsing_common.identifier - + 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]]] @@ -5094,6 +5641,12 @@ def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): -2--11 [[['-', 2], '-', ['-', 11]]] """ + # captive version of FollowedBy that does not do parse actions or capture results names + class _FB(FollowedBy): + def parseImpl(self, instring, loc, doActions=True): + self.expr.tryParse(instring, loc) + return loc, [] + ret = Forward() lastExpr = baseExpr | ( lpar + ret + rpar ) for i,operDef in enumerate(opList): @@ -5101,19 +5654,20 @@ def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): 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") + raise ValueError( + "if numterms=3, opExpr must be a tuple or list of two expressions") opExpr1, opExpr2 = opExpr thisExpr = Forward().setName(termName) if rightLeftAssoc == opAssoc.LEFT: if arity == 1: - matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) + matchExpr = _FB(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) elif arity == 2: if opExpr is not None: - matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) + matchExpr = _FB(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) else: - matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) + matchExpr = _FB(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) elif arity == 3: - matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ + matchExpr = _FB(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) else: raise ValueError("operator must be unary (1), binary (2), or ternary (3)") @@ -5122,14 +5676,14 @@ def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): # try to avoid LR with this extra test if not isinstance(opExpr, Optional): opExpr = Optional(opExpr) - matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) + matchExpr = _FB(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) elif arity == 2: if opExpr is not None: - matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) + matchExpr = _FB(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) else: - matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) + matchExpr = _FB(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) elif arity == 3: - matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ + matchExpr = _FB(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) else: raise ValueError("operator must be unary (1), binary (2), or ternary (3)") @@ -5146,7 +5700,8 @@ def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): return ret operatorPrecedence = infixNotation -"""(Deprecated) Former name of C{L{infixNotation}}, will be dropped in a future release.""" +"""(Deprecated) Former name of :class:`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") @@ -5155,28 +5710,33 @@ quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+) 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=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}) + - 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= :class:`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 ``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 + :class:`Or` or :class:`MatchFirst`. The default is + :class:`quotedString`, but if no expressions are to be ignored, then + pass ``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+'_') @@ -5186,29 +5746,31 @@ def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.cop code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) - c_function = (decl_data_type("type") + c_function = (decl_data_type("type") + ident("name") - + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + code_body("body")) c_function.ignore(cStyleComment) - + source_code = ''' - int is_odd(int x) { - return (x%2); + 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 { + + 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']] """ @@ -5226,7 +5788,7 @@ def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.cop ).setParseAction(lambda t:t[0].strip())) else: if ignoreExpr is not None: - content = (Combine(OneOrMore(~ignoreExpr + + content = (Combine(OneOrMore(~ignoreExpr + ~Literal(opener) + ~Literal(closer) + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) ).setParseAction(lambda t:t[0].strip())) @@ -5245,23 +5807,24 @@ def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.cop 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 - is repeated within the indented block - - 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 - the current level; set to False for block of left-most statements - (default=C{True}) - A valid block must contain at least one C{blockStatement}. + - blockStatementExpr - expression defining syntax of statement that + is repeated within the indented block + - 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 the current level; set to False for block of left-most + statements (default= ``True``) + + A valid block must contain at least one ``blockStatement``. Example:: + data = ''' def A(z): A1 @@ -5302,7 +5865,9 @@ def indentedBlock(blockStatementExpr, indentStack, indent=True): parseTree = module_body.parseString(data) parseTree.pprint() + prints:: + [['def', 'A', ['(', 'z', ')'], @@ -5320,14 +5885,19 @@ def indentedBlock(blockStatementExpr, indentStack, indent=True): 'spam', ['(', 'x', 'y', ')'], ':', - [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] + [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] """ + backup_stack = indentStack[:] + + def reset_stack(): + indentStack[:] = backup_stack + def checkPeerIndent(s,l,t): if l >= len(s): return curCol = col(l,s) if curCol != indentStack[-1]: if curCol > indentStack[-1]: - raise ParseFatalException(s,l,"illegal nesting") + raise ParseException(s,l,"illegal nesting") raise ParseException(s,l,"not a peer entry") def checkSubIndent(s,l,t): @@ -5355,6 +5925,7 @@ def indentedBlock(blockStatementExpr, indentStack, indent=True): else: smExpr = Group( Optional(NL) + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) + smExpr.setFailAction(lambda a, b, c, d: reset_stack()) blockStatementExpr.ignore(_bslash + LineEnd()) return smExpr.setName('indented block') @@ -5370,51 +5941,61 @@ def replaceHTMLEntity(t): # it's easy to get these comment structures wrong - they're very common, so may as well make them available cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") -"Comment of the form C{/* ... */}" +"Comment of the form ``/* ... */``" htmlComment = Regex(r"").setName("HTML comment") -"Comment of the form C{}" +"Comment of the form ````" restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") -"Comment of the form C{// ... (to end of line)}" +"Comment of the form ``// ... (to end of line)``" cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") -"Comment of either form C{L{cStyleComment}} or C{L{dblSlashComment}}" +"Comment of either form :class:`cStyleComment` or :class:`dblSlashComment`" javaStyleComment = cppStyleComment -"Same as C{L{cppStyleComment}}" +"Same as :class:`cppStyleComment`" pythonStyleComment = Regex(r"#.*").setName("Python style comment") -"Comment of the form C{# ... (to end of line)}" +"Comment of the form ``# ... (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}.""" +"""(Deprecated) Predefined expression of 1 or more printable words or +quoted strings, separated by commas. + +This expression is deprecated in favor of :class:`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} + """Here are some common low-level expressions that may be useful in + jump-starting parser development: + + - numeric forms (:class:`integers`, :class:`reals`, + :class:`scientific notation`) + - common :class:`programming identifiers` + - network addresses (:class:`MAC`, + :class:`IPv4`, :class:`IPv6`) + - ISO8601 :class:`dates` and + :class:`datetime` + - :class:`UUID` + - :class:`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}} + + - :class:`convertToInteger` + - :class:`convertToFloat` + - :class:`convertToDate` + - :class:`convertToDatetime` + - :class:`stripHTMLTags` + - :class:`upcaseTokens` + - :class:`downcaseTokens` Example:: + pyparsing_common.number.runTests(''' # any int or real number, returned as the appropriate type 100 @@ -5461,7 +6042,9 @@ class pyparsing_common: # uuid 12345678-1234-5678-1234-567812345678 ''') + prints:: + # any int or real number, returned as the appropriate type 100 [100] @@ -5563,7 +6146,8 @@ class pyparsing_common: """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""" + """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() @@ -5571,12 +6155,12 @@ class pyparsing_common: 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})" + "IPv4 address (``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") @@ -5585,7 +6169,7 @@ class pyparsing_common: _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)" @@ -5595,13 +6179,16 @@ class pyparsing_common: 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"}) + - fmt - format to be passed to datetime.strptime (default= ``"%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): @@ -5613,17 +6200,20 @@ class pyparsing_common: @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 + """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"}) + - fmt - format to be passed to datetime.strptime (default= ``"%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): @@ -5634,31 +6224,34 @@ class pyparsing_common: 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 date (``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{' '}" + "ISO8601 datetime (``yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)``) - trailing seconds, milliseconds, and timezone optional; accepts separating ``'T'`` or ``' '``" 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})" + "UUID (``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 + """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' + + # 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' + print(table_text.parseString(text).body) + + Prints:: + + More info at the pyparsing wiki page """ return pyparsing_common._html_stripper.transformString(tokens[0]) - _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') + _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.""" @@ -5670,6 +6263,164 @@ class pyparsing_common: """Parse action to convert tokens to lower case.""" +class _lazyclassproperty(object): + def __init__(self, fn): + self.fn = fn + self.__doc__ = fn.__doc__ + self.__name__ = fn.__name__ + + def __get__(self, obj, cls): + if cls is None: + cls = type(obj) + if not hasattr(cls, '_intern') or any(cls._intern is getattr(superclass, '_intern', []) for superclass in cls.__mro__[1:]): + cls._intern = {} + attrname = self.fn.__name__ + if attrname not in cls._intern: + cls._intern[attrname] = self.fn(cls) + return cls._intern[attrname] + + +class unicode_set(object): + """ + A set of Unicode characters, for language-specific strings for + ``alphas``, ``nums``, ``alphanums``, and ``printables``. + A unicode_set is defined by a list of ranges in the Unicode character + set, in a class attribute ``_ranges``, such as:: + + _ranges = [(0x0020, 0x007e), (0x00a0, 0x00ff),] + + A unicode set can also be defined using multiple inheritance of other unicode sets:: + + class CJK(Chinese, Japanese, Korean): + pass + """ + _ranges = [] + + @classmethod + def _get_chars_for_ranges(cls): + ret = [] + for cc in cls.__mro__: + if cc is unicode_set: + break + for rr in cc._ranges: + ret.extend(range(rr[0], rr[-1]+1)) + return [unichr(c) for c in sorted(set(ret))] + + @_lazyclassproperty + def printables(cls): + "all non-whitespace characters in this range" + return u''.join(filterfalse(unicode.isspace, cls._get_chars_for_ranges())) + + @_lazyclassproperty + def alphas(cls): + "all alphabetic characters in this range" + return u''.join(filter(unicode.isalpha, cls._get_chars_for_ranges())) + + @_lazyclassproperty + def nums(cls): + "all numeric digit characters in this range" + return u''.join(filter(unicode.isdigit, cls._get_chars_for_ranges())) + + @_lazyclassproperty + def alphanums(cls): + "all alphanumeric characters in this range" + return cls.alphas + cls.nums + + +class pyparsing_unicode(unicode_set): + """ + A namespace class for defining common language unicode_sets. + """ + _ranges = [(32, sys.maxunicode)] + + class Latin1(unicode_set): + "Unicode set for Latin-1 Unicode Character Range" + _ranges = [(0x0020, 0x007e), (0x00a0, 0x00ff),] + + class LatinA(unicode_set): + "Unicode set for Latin-A Unicode Character Range" + _ranges = [(0x0100, 0x017f),] + + class LatinB(unicode_set): + "Unicode set for Latin-B Unicode Character Range" + _ranges = [(0x0180, 0x024f),] + + class Greek(unicode_set): + "Unicode set for Greek Unicode Character Ranges" + _ranges = [ + (0x0370, 0x03ff), (0x1f00, 0x1f15), (0x1f18, 0x1f1d), (0x1f20, 0x1f45), (0x1f48, 0x1f4d), + (0x1f50, 0x1f57), (0x1f59,), (0x1f5b,), (0x1f5d,), (0x1f5f, 0x1f7d), (0x1f80, 0x1fb4), (0x1fb6, 0x1fc4), + (0x1fc6, 0x1fd3), (0x1fd6, 0x1fdb), (0x1fdd, 0x1fef), (0x1ff2, 0x1ff4), (0x1ff6, 0x1ffe), + ] + + class Cyrillic(unicode_set): + "Unicode set for Cyrillic Unicode Character Range" + _ranges = [(0x0400, 0x04ff)] + + class Chinese(unicode_set): + "Unicode set for Chinese Unicode Character Range" + _ranges = [(0x4e00, 0x9fff), (0x3000, 0x303f), ] + + class Japanese(unicode_set): + "Unicode set for Japanese Unicode Character Range, combining Kanji, Hiragana, and Katakana ranges" + _ranges = [ ] + + class Kanji(unicode_set): + "Unicode set for Kanji Unicode Character Range" + _ranges = [(0x4E00, 0x9Fbf), (0x3000, 0x303f), ] + + class Hiragana(unicode_set): + "Unicode set for Hiragana Unicode Character Range" + _ranges = [(0x3040, 0x309f), ] + + class Katakana(unicode_set): + "Unicode set for Katakana Unicode Character Range" + _ranges = [(0x30a0, 0x30ff), ] + + class Korean(unicode_set): + "Unicode set for Korean Unicode Character Range" + _ranges = [(0xac00, 0xd7af), (0x1100, 0x11ff), (0x3130, 0x318f), (0xa960, 0xa97f), (0xd7b0, 0xd7ff), (0x3000, 0x303f), ] + + class CJK(Chinese, Japanese, Korean): + "Unicode set for combined Chinese, Japanese, and Korean (CJK) Unicode Character Range" + pass + + class Thai(unicode_set): + "Unicode set for Thai Unicode Character Range" + _ranges = [(0x0e01, 0x0e3a), (0x0e3f, 0x0e5b), ] + + class Arabic(unicode_set): + "Unicode set for Arabic Unicode Character Range" + _ranges = [(0x0600, 0x061b), (0x061e, 0x06ff), (0x0700, 0x077f), ] + + class Hebrew(unicode_set): + "Unicode set for Hebrew Unicode Character Range" + _ranges = [(0x0590, 0x05ff), ] + + class Devanagari(unicode_set): + "Unicode set for Devanagari Unicode Character Range" + _ranges = [(0x0900, 0x097f), (0xa8e0, 0xa8ff)] + +pyparsing_unicode.Japanese._ranges = (pyparsing_unicode.Japanese.Kanji._ranges + + pyparsing_unicode.Japanese.Hiragana._ranges + + pyparsing_unicode.Japanese.Katakana._ranges) + +# define ranges in language character sets +if PY_3: + setattr(pyparsing_unicode, "العربية", pyparsing_unicode.Arabic) + setattr(pyparsing_unicode, "中文", pyparsing_unicode.Chinese) + setattr(pyparsing_unicode, "кириллица", pyparsing_unicode.Cyrillic) + setattr(pyparsing_unicode, "Ελληνικά", pyparsing_unicode.Greek) + setattr(pyparsing_unicode, "עִברִית", pyparsing_unicode.Hebrew) + setattr(pyparsing_unicode, "日本語", pyparsing_unicode.Japanese) + setattr(pyparsing_unicode.Japanese, "漢字", pyparsing_unicode.Japanese.Kanji) + setattr(pyparsing_unicode.Japanese, "カタカナ", pyparsing_unicode.Japanese.Katakana) + setattr(pyparsing_unicode.Japanese, "ひらがな", pyparsing_unicode.Japanese.Hiragana) + setattr(pyparsing_unicode, "한국어", pyparsing_unicode.Korean) + setattr(pyparsing_unicode, "ไทย", pyparsing_unicode.Thai) + setattr(pyparsing_unicode, "देवनागरी", pyparsing_unicode.Devanagari) + + if __name__ == "__main__": selectToken = CaselessLiteral("select") @@ -5683,7 +6434,7 @@ if __name__ == "__main__": 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py index 8dc7315..8ed060f 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py @@ -1,3 +1,4 @@ from .core import TomlError from .parser import load, loads -from .writer import dump, dumps +from .test import translate_to_test +from .writer import dump, dumps \ No newline at end of file diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc index 1456bc4969f07889185d6bf0b7deac0dc3d466f6..f94683bfc4bbc47fe33bcdb655fc93c4f9540409 100644 GIT binary patch delta 178 zcmbQwbe4(NiIhRl3HA%$#jb)r8KwT7AuG>_S58=*e~bI0+K3X1)6?~ zt-L6+B(I#Lufi}bW8zaI NE|4A`Mgc}1MgU85FRlOp delta 133 zcmX@hG@psriI560sY3EEqXb3M=y}4AU|;`!MP=v3>^00RX)z31I*L delta 41 scmZo*Z(!$f;^pOH0D`FbYB3vmEEqYG%hU6+N(xOj`!MP=u@-~m0J(k$)c^nh diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc index ae6275affb1af417c475bdb138ccdc45c7e571bb..834ed90d560026be32c11a3ca7b660c7214bb29f 100644 GIT binary patch delta 4353 zcmbUkTWnlM_0HY9?}yj#^)vRy@n++=cHSg$6FY?L?R?e*3oL}INy zK6B>0&zUo`A6|KLDt0Cq^eOPkzZIFivR6?)#>Ljh1IRdh%@<#fjg+ZMwX7@WPPlWP zgoh}G`jVF_9SU_WsO*B_OZfAe5lHx{i@MhoBbZjHhkDmYB1C=Eze#h@01X1I;fo3l z(S|jJHms_Nut6$~G`vm{O|+3Vttp9SNofX33vHpTKqcx+QfFPEAR0zcQ^EYO6k4{Bq{wZe zQH8K}P8=g6$Q5@m>;mRRfGj&?SpaB3qzB*C9d6ar2zZ>ZFwZ+Lci}=fiUre_lE$0{ zhTqBmnX%7Dt-QL(Q59WlY;GJ;_+| zo^YfV84K}3p!cw>tlLh3w6X0HW@kGswsTED3-aFvu9GI-75oJ`$=?rNBolm3=*aE~ z`z>`xW)=3>s!X~A0HGvTZIUqJURJ<$o_g9bNJ z77CdBqsA`&Y53%D&EV6_7=`p5o@|`9&0KxD84xIenWbl?i5SM@$QpTu(XnZiSM7|- z{T*p_Z$?+=A>uA?G&kBphI?E1eS*S21Np5FJ zeOsAj#;bgzIWa2D->ftLBH%lvyqno&2IpqWW@anpew+yE1kNCe@ z7M@2*9B{>LNrp2!uGwB|*1e)34~+0yESWOqlBtEA?m!0{OW48R;lFIXa(Ec!9d!!P z$P-HLf&rGxSQSX*jZ+=K#|Q!(U$Rb+y=(rwPLu&&B_4*EtCC=qc&j8@B{!-h5O)hQ zCrF;%f<60QyMx$W{z=E_BmS8=E1zaJqBm~LF1vj*eO}+}zLdOxfk}g}3%<|6*Zehr zd1XaidWWYvC(5r`o|01Wt}7LlI@Sr*R@D^;b(S0&yb~4(D^k~j!b*9KD0$@ctt&(+ zsTIZYmmI5Poe<@=3+TiOATD=;HI1;}q1ZfE73!{pO6oekWIR)LPux8W-pCHyz`G@* ze1PC1pk0Awyum(5vXryPDQkR_$GZ-;I5K(5F8@W?5t^R5#rR8Iy=6@nO5h~1;Cu-O zgF8;%snH@SZUx=g$-6`~Q9v=JXb{Ie-Bi4&}1Yb!?XZt-Gs#0wnCh?+5|gZ^5|tKHuB3n>^s>d!~YedrzN;Mo;fO-5-sY z_@_Na1Ipl&OP2pVmFIdl%2+aWU0Km+sH9cA6pCjBOWG**8+eMU zWCms-p4KYaUnR4w2T(!2EXYcgJj(`Q74MJ_AG@nB0D;}-KZ~}O<#7H6uH}h-6)}0N zzlqpQ1URag69C+fY4{~!;UPGI#779eilB&K900tPikolod8Fa^WDgMFNQk@biH)vG ze@5*iq{CV`@m+7qXZeni&ML6~XZV^W{@(5p(#8V=7f6NA4*a$JZ6Gs_;JXO+Bfx;! zn*cVm!iErc*JWVat#Ra)S*X}d@?h5-6dri}+V5TsPPHi<0PB7!G|SU3?;STpZdy6( zAQyWMkhghY@bPuj1BQ!eWE{cU2xMmDXz@!4(_0+OWrw-J+hTSZLv%vTUABX|YD3WECxUPBm zY_N**EUaZJevCU9M_tKlp$gAfu0R*F#wh|ECbIRB015NHq1LF6_+ajD{RNtQ#1r14 Kc+Pp+edIsn+_}L3 delta 5431 zcma(VTWlQFb?(gUdf&T#za4w+*x5LalaPcY7$*%NXc|mHUa)Z(t@qBFwfB`ffHhXV?HlJAbr{%u@QzQC8w500FG$0~e#Y_eji3tp;pD^y=p z*$J~L=_}}_Kk1_$>b<3yfs9IL^fq=osAvhI%C>0hB(8?FOu0V&i}fNNmqK zNhfzmbOMNjbT6F*(IL8z?uYNV9610Z!}K0{5GW%M?;&~^;yr9?3p-b}{Ko{k$z^r zuwY+3$a~cBpdWZFcoY`kXVf>xLx_eE)KxI#5qhqeqLLd8DTKB0W^Hm3xe^-l!WU~o z;6reyEW>qxiY?{iqSmDPB7i3d3-f0^7kcqUXr-d%N=aiL6GQ6efAxGp+WGIiPaKtY zJVM>OPmo2|99j~j1X=K0OXZf#E%~Z{YThiE%Oy5F#M4bLJx~uQp|V~S)3dgjhZh_W z;SwvRP0KR2s|ifyvX-4L=1bGVe8PA0@OC|{59A?yNgo274Iq%=V<0RJU?=~xZ}6nd zi!`S%W(!p4wz+JxP8bLIF65Q+n5LRvt}dwthx$H#*#A6{iI4_BOopObX`$J3ImkmO zZ?bvQuv2q6vmu?*i^n+$F78Hu(3%IGN^$B8P^jkzeY#a{&sUVPp$g+c1*+ zwaBTVM}QC3-#3tb8>gOw5K{b~k?FyQ@5&{ojq;1p(>?!HM<$ic&GXNq%lAr;&>Xms zqSsP|w0Rf9!E~`;E#*yv7VQPT7`wD*2HiV*S0_XO7Py(VQGoHkH}`UX^L-O_gI{IF zEM}JY)#h`qne$(51_W+^ndSSXi4lxR%b5j+(XlfqueuqPii z<}U-jUCLj}E;C=}t8Et!okE`b5lBDozBq*6FwBB&GQ)U-huaq)LrE-fP>oO=C7A{w zp}St|_Vtn}H;nMxER{CrQt8F*?!XE*mvIHZ#edy?@!)Qh*BTU}k-JQ}7YbNDYrhML zoSp7K>v(uDEaRX8J#l^dIuhJD6ohSafML?!<6m~Xk!(i^bf7_xE<7v)WzE&(PExwK zRItH<+#(pd2v|#*Om^9*7kjx%WQD^8^Z^&0r`u1X=0_38?f)2JXZilF{wbU?_7nmG zK^g%?ASV$-mPz4z=PJUFVOW2GL}g&sYY--6&^e+j{jHC1m&^uv)eA zF3(SQAFW7XukpWRJs|sx^>Kq}5%4PUG0a?*gsa3~CGjd5tCHC&nXHmf!Y|02AO&Uu zhkLr=q0DRqO9-w35G2F@(S7uA=<-~F+3~U2*~!e6m8QVuL4V-N?zHq1*ln#BDN?Bcgna}lnt@5;^t|_+9_B+a2U|m^LskTn2zN)U0bwZS@UZ4{@h`8ho)%jq& zTXA_VDb%wTcGPujNW3%dGLT-P3mY*2>>PkZ#N9A*%92R+;-+U;_{H7>QQb&C&4iXM z*mAb{+r0yW?ur&zEo|6BLSvifm^+>PkG);PKL;Hao|p>JiAp+103beXWKa!|KEht) zgMB}%)HArEj*UqtSG2LQv4o#JfnK}_K!l9Bl$A}xsRe6+N$=zghmBm;MruBX1L(X6 zY|^00G#QKLbzDBGyL{xl-MNPR0v8dm{f4Lehsmq_rT!V?%&u8_<6t>4f!_zVzR%a* zk8S(jHM@6~jwg=qI({ta?7BQYamAI}J zp|V#}VsiYNl=oA3qs^--ZD~_#lvbD0sg#@SX1isrwL(Kq6EdvBLM!_UF_%n3;EJR; z+N`(iFYDz%Iam&r!ywe+_#NE|I6)`mpsQZm)~2iy$G7e)M`*j_aUzbI(a$LmTF`C- zmsGaP4YL*^1}pCX>lKKMb~*Z@_qJ+zX?Gp#aWU3GdmSC()xdyMO8ekF;%FFI-3+1q z(##KFM@1dwTc?P!eA4c4z%AG>(X~#y%TXLc2VR4{0TgAedtD)l-BGErC~F=H7mux> z+v?R5mlW7g%30-cVUStAs#Dz`Oj!S2P8 za;(mwtW`X81eI-)w)_Ouv8g(J`8@bc&_yuuRGs@j75<<4ZfjRVmmm*uh#S0vXm;Ka zO&_L*Do{p7`QT8e+_EcbJiemE<8jsvi&&PxJ2&tKUN$zc!fjwvy%9h#g#b^I?1__6 z=(cFeHtlR4`T;}MB0=^F0&foqPX=x>HhT_utK>4&f9!s%WKWe`sjwcv1-T(exk~P5 z!|;~qch4bN8|1Mh3rBRTaJVHx)|8h(z&)W}MoiYcR}jOa3yRIAS5P^GmQR(W7s4ys z8H;_df?R&%Joud~7EJbre8(`TnX^+cBz?zny311S_972NJaE{n2=Mq! zG`mF#19gLudLZ!Cw;DyPO_nn4A zRvz6S0`s5Xv0mpl$zp0pmv#7c{Bv2gk_d+8ZIDntq(&%;X!q^yI0)~ zI|@S=`KLQ~R1izUQ~%(Rc>*454**k15~?IsN~j7y0%%mDI(+NyPb5i?{DDMCdZ{0_ zOn|))BK2b*72zYxKJE#JIEvx!E;0kR!zQDcIg_zWd$Y;&7Bl#|eLk@PqtGJO8lRPx z`hwiMd5zjK%0G?tRelN*o8AA90pF%k_?O@kEp5#==xyE7TOZ$23~I1VmC@*c$SOf* zr0Q+9VB5GBaXAW&TJ}PNnedhw7^xe;$-ze&cmxnfS%BIHry=Qqe#ud(x(N4os==A4 z27vV5CAlYpMfBC$vPG+Y)h5C|iyynW&QSmB@|qjbnTF9jHNA zGMFZ^BQb^^^JW(o&g*}%-BE$zR zkxzvOw%|%^D{_~22G(^JRW2Y{L?FBEPZ9eJ!7mYDS{i`dsd4?A$_$A=F<(4izU4%WN@z`ijMb7~EBT)oLPzYMSd?}kV zSq@2Z^A!-2yZ$C(vbL5Hdltd-2pj}hkJ&d7$cpy?V(%eXNAL=Qmmx4zn%};zuAJj%)_}@g_rW61G diff --git a/env/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc index 35a26307d4cb118572090c70a50ac59976361434..e22a1d99d356f5b2c24703c72deea6f559ae8777 100644 GIT binary patch delta 1705 zcmZ`(&2Jk;6yMohuh;h4PMps+X>dXLSlWc7DU?=8L`w_GCD2C7!6e#lJ(FacjqSW$ zhkUs~B!Y9;8{&|P6Z8V=fg2K6{s4qVNZdfVaDZD*ytlSOiD2z{GxOe?_kQnV=BG

z$-8+E&Rx8Z_woy9rJJksihZsBgh1I$w$&?Mxyps(d!Yc=59Ur-Q<7V*!nzweuw0&; zoV?_3$eNve84B#q z)G0GhnFZa?e`hMY1sZbEzv0$uqQW6dTU|0wY9Ip10+|Rx7s6NoIh4x8vR@BYd!tvh z8$)FCq=;n4Sga3@U*C%DK{x3sc0y{ts6c=8k=8f;67t|O30S%11}+hAfJiJY(kk|m zb3{;fYr+Xa@G2{v(a+kjX`^^Y9d#m2zki=x>?upR2HRtyvX)#>n6jaA1+&WLFrc)v zCbpgOstbXwN_A`;M#wtF_fIURsi_rF5nDBw8H>KrCmxUsn>Eq=TNMqqAbETgwOaWt zV1{7~_hl*!t9&JCVCMDATY@DzXZN~}{ro!_|G(n&RSjys;dsMkq0KW1?j($T0nn%PNwushyZ z+EK3-qxUnfN1r7M`&SSdP>-C;23$qn9fGYQ(UqN|)9SrV*RPAQDZg6A&YT%LOWICy zcNfh!8fVc{J5lEaG=`91jRqFg25Vq#j+GFr#Sd7h?x`4@+A11`Xsc+eQJgOBHs)+i z8coM>W?=%&*cuRQ$=3cC`CW3^L~eIQ&&;{~Yji>fQ3IKHv>l27sJ_zVZYV-;U4R}d z_#SrIaJ=MRIg|;!g6n~_9@HzObq}Bl*imfre7*?SB#z)^BnnG2i*;f@q>;9%X;z?( z6*Dd(b3lcO=Rc%AWh@)bW~K+JYiu%V$4uEu-Ov&{O)b<_kZOiNv|>Uk(sy2a?W z_3oAU1~<)0#_!t(kzI@7hZ(W#leZOk;x?!N&zJbL5+ delta 2001 zcmZuy-ER{|5Z}2kpFiUSV+?^3AsjfsPCy9M2oR+7Qz8-#3Thha8t*y1#6Fw7H6+H7 zs}iYws)|nP6H=2$R8_6Sf6%^Eed+{a;?9R>nW_D)okMX~c zWoFaq1jFCr50gv(WS(XU@cq+MQ+?N5u{b--xW1~1SvR(5yYa;YALk~wHeoTzW8CI( zp5RHI;%T0F7F$g55uV*-i)lW}$8gT@13ZWG2tUa4IA{4GUch;jALWPn5!5oqwRz?o z+adc7sBFjgYAxaC7^&O{QK!OWCwwx`-&yX5(StTq~@ z+M{KEMLxI~K8Mpc;wTeXNEq0V0g=X)0$+g`z>)%~;J$+T08ThD1&INqMHVFn5Fda& zfRxC+7}GSE*#X=|TvoN+c6}b1b_@lc(uEr+2$YG&g^UhFij0``Mkn|pAI|BQCrRhd z1d^_`)G1D1ToXr-5jiA^Ii}JZt}n*JANBF8Z_&X79YAf@j5tbr$B0Cy$7vPW$W+{* zR&BeLKnl-a9t(BjlyMr5!wbgkr3qa0*uBCA^k9o^vlMIPd%)RhY=HrLpmD&EYhA5W znM2oNUQliLou;EHtvoGGkr9gUzDtAnm1Wm=*V^LR+3+vpe4i{iFa-6ws7ky<=J7Kq zwR;6)cnP9}e2wBsKbq-!-oX)2P&h*6+7@t~8=DCKCVK+g_#jksu4{h!czWYrS35U> z8p3a^n|;zQ=$79AE6(EHc^rX;#9-aym3m7ws}fTxkmW0lRt>Z2T6xbU^xGOrh)H|{ zBLWZK(5X_d>X;_webUZAkfqn0qD+mPI)RHGTcH6sFzPvUFvkvIK}FOUXOVL|1(fu% z86?+dN7yoQ?90va4M$h0rdJcKz^%1>9;n#Mg~6-0*8@bV$ze+F-<8T#WDCoovMYND zl?8-}fdS$&&UY*w)B4qin()ii=-l zwg*pu8%LP0aWmRCu|@pKtqsjDqm;R7h(CD@xdgX2v>qh!Z64oB^l(k@5zVu09naXx zDB7^l#u!g*Lr*(|QHi)Da!$nhM5x38KY7k zcYNA=SBREybU`_#4AP;jpi{4VYx^nqVN~;?j3P5Qf{REPBp?MjEUN_4tVWdjoDBud z1}ho{Sdhn6M$4kCt%>rBZ|$!El3_k^wMfs#pE4f_4;z0J zaw}*F>2hVPy6b@;7-F8tIFUIdO2@vhEO$*(ZzhkTC@EXG4_y(s+(`~w1byBFRe`c( z^?n08w;9dhoz&YC6#EDq!d{^DT_V(HMGVPj;ZLcneOfv29{mqsldIG_vLoC|MNl6Q zCXtVb+(e@EU_DSNg5b6Misxf{xlV^ShKEv!Sz_s%Bu)~cd>Z1Xei9{7 0: - suffix = '+' - else: - suffix = '-' - offs = -offs - suffix = '{0}{1:.02}{2:.02}'.format(suffix, offs // 60, offs % 60) - - if v.microsecond: - return v.strftime('%Y-%m-%dT%H:%M:%S.%f') + suffix - else: - return v.strftime('%Y-%m-%dT%H:%M:%S') + suffix + return format_rfc3339(v) elif isinstance(v, list): - return _format_list(v) + return '[{0}]'.format(', '.join(_format_value(obj) for obj in v)) + elif isinstance(v, dict): + return '{{{0}}}'.format(', '.join('{} = {}'.format(_escape_id(k), _format_value(obj)) for k, obj in v.items())) else: raise RuntimeError(v) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py index 3f3f4f2..80c4ce1 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py @@ -22,7 +22,7 @@ usage: ... or POST: >>> payload = dict(key1='value1', key2='value2') - >>> r = requests.post('http://httpbin.org/post', data=payload) + >>> r = requests.post('https://httpbin.org/post', data=payload) >>> print(r.text) { ... @@ -57,10 +57,10 @@ def check_compatibility(urllib3_version, chardet_version): # Check urllib3 for compatibility. major, minor, patch = urllib3_version # noqa: F811 major, minor, patch = int(major), int(minor), int(patch) - # urllib3 >= 1.21.1, <= 1.23 + # urllib3 >= 1.21.1, <= 1.24 assert major == 1 assert minor >= 21 - assert minor <= 23 + assert minor <= 24 # Check chardet for compatibility. major, minor, patch = chardet_version.split('.')[:3] @@ -79,14 +79,14 @@ def _check_cryptography(cryptography_version): return if cryptography_version < [1, 3, 4]: - warning = 'Old version of cryptography ({0}) may cause slowdown.'.format(cryptography_version) + warning = 'Old version of cryptography ({}) may cause slowdown.'.format(cryptography_version) warnings.warn(warning, RequestsDependencyWarning) # Check imported dependencies for compatibility. try: check_compatibility(urllib3.__version__, chardet.__version__) except (AssertionError, ValueError): - warnings.warn("urllib3 ({0}) or chardet ({1}) doesn't match a supported " + warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported " "version!".format(urllib3.__version__, chardet.__version__), RequestsDependencyWarning) @@ -125,12 +125,7 @@ from .exceptions import ( # Set default logging handler to avoid "No handler found" warnings. import logging -try: # Python 2.7+ - from logging import NullHandler -except ImportError: - class NullHandler(logging.Handler): - def emit(self, record): - pass +from logging import NullHandler logging.getLogger(__name__).addHandler(NullHandler()) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc index db44191c414da4af60403e4e1970024d4a9468a6..9a03bfb9155e8faba3248658fb6fc446f7a7245a 100644 GIT binary patch delta 224 zcmZ1=`$dY+iIQz5@dAvq(lC?&N7$lol$ z$-^Xki#;VZEwMDGBt(<3NC4F^X`erCbD-QtLk&r8fr WjgOx!%csxiHQATXlZA&#h#3GP%|Pn_ delta 553 zcmYjMPixdr5TAK@G%@a$AWDO}HC}9U(faQwY+C-D+`O8gHO9uKYe zi#A^QxbhW8`xZlXMl=VW?;$*dc$ES__0)Vvq=``J9bji!V*;$foBj2%=6fB8$s^#+ z=?1@ffYV#t8^Zx2aN4)oGQYvjG3Tv@z~}>T&xbz=fO($}bDn0Yv)OL%I9t748OnY0 z)ohz2IQyb~BDhp!3$KmnSvT%y!)pc6zvK1dhrWz!Mcw$^@Ny|cZ}+OR`eN;+>m<^N zo`jO|OeHSQz8N(#imC&TM3F*MS$a}A4n8vQiMo|cz}J|jHly;Mf}*OhlIlfe8_H6u z90OH^ExDv(my|T+Vy|3~JW3>+Cl8&i;F9t|Z#E5Ruzz$baK2c3E-Ew;dlb7&!lzI^%m`F0!_Zy0jGP v-Y))_9rS0N<8RQ`|7}nn>+)2|r4Emc+gu3f^NVx@l9BxotM=?U#GeMN;N diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc index 47aa3cbfbd1cdd703169114a7bcb5e42c4d3f168..bfd8d898080e25e857a0ef308634062f6e9649cf 100644 GIT binary patch delta 45 zcmey({F|A_iI1Q`G)HBFrP~5nPg^?qrurja0FfC*9I!0dr3a1Q} delta 45 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 delta 4048 zcmZ`+TWlN072VlgK15O!^_DD4qTZ$@nUeg7EX#VNvK(SKt6h_=d(f;txh)^Em{ka zXcetVw;EwBY_w@@g04-s8y#AQ(W!MBU0RpXt#uncT92_u+hatuh|sA^?=^b0UNNpu z_Zj_KzZf^9_Zd+wY7A%t#-KK6?9z4_by}SyF_a|PS&7`dP1N^S5 zyRsW}`rt8T0Ew_}{ukFh(#L<~?x?`|Y%jt-fZ^gF+&@!DloxylYlUb_?x?1op-1?q zzS;IcP>m24#c4aVT#0nn)KBwg{pbB?kqsjp=6C(o(JfV&JAiEQUi9oBJSG-`m#A_; zk%+I7_3^*C8jFFzsQdW|kT~8MmNjC@jKwCAEYGp*wZ)hb&%|eS#`=NB#u3C@pTyDE z5T*c}P%@LWV!3QKy`dj*u_*sxRcFrxihU@FO{cSoxlPx$)-CL1`CqHXUs6F=fyZnB zu%y?e83Lst-|*g&Qe;Y6Au9w@shmj=kmDc5+YQftc+3_6Te@7ACpNL9Tarzvw4%(& z&qD>x%T(gmt6RIbLyEEavTSr#&*;~3Y-|}#pgmPu>g5A94g5j1|MaF53xg&TmQxms z#Vw1OvDm};*&L%yClHIx>K2rVrN?5gqFG#*L;}3OW~Fc(h7m723I9rQb|o#{FddJn z!wieDr&01~cq6JP1;-_fvS&cUab1n47xbOg0q+Jo8}GgedS(DXQryHXSCNn$C`N1F zmW30J+q4)g=?tXm(bq8ygX7?3?&4DopU6WR&fhW;Q8z2@iXNvrGuaNgkDcV>P4(Toa2oEoon9x9hvgITK<(L0 z?SpaTOd|-{*7gwl!l`_uz+*F6_LJi8o9-#(IDeyciVX1IwYIsdVD{1okA~~HKisAc zg*uLLE25mq;!DEZj7Kb>^rTE=O5lX@(n+9YUrzp))H6TVY3} z9KR4;)md_8@qV$l?K8Q(8fTrsS$@pvf*DI>AvVp(zK+nqn>(8dS8=$6YOd);ONZl& z>Ov8>gyTtMvvWz^WJ5^#wo|xSRtg-9j>>d1=XenzxsMfAaC#w`rm;=&S76G-Oh`Vr zQv7A-cjUruAXp=U3&2sYWTCz~kxn9Az5U*pIA|~`H7IezZb9NQ5U?}E4#mZ=ClF>( zrL2@H)DjzK5t;5>oS8b^2%~tj*ndH=2XWdg)Q;j8J$uPvwC=#+smGbH;kd;HG9z;7 zjrg7&8DWQkHm`CLAqg5h!Y4M1>FELFHzT7a3jq8s{lIXK>2+`1A&cbjlVS?LuR z|LsMwZ}WWLSer1jqcZ&)Hx*iVs`#Mq6?q6XBFaN{_Mowy^Wv1oHnxw>-;B->U-4hj zdxRIdUHtCg>|x9p>q1j-JmXlbT2#{ZUU}50*g7Wv`p}8Ohp@S9X$=n66tUgwa^3@! zYm*-p`Rwu) zvP>>WRHkx1a6NEQdO@1Me^JUb2-9U?`r}LhOe(fgGI@tAp0dl#|Ja^X030c|z33Xc zL^po0fFNjlR(<*49Z~>O6}E?hm(ZF7VOj_x;7L_lRkUoCNjjVM`3N*Mmva2>nB_0^2!f-vUK*?eVoNEHNLf~q3smro< zi!SSnQkMnxn%1R!b*am;no})yH6*t}M5A)m^<+K>)9SXAThZfX2s1Wi7holsJCLBT z)s||Xk-@Oco`FP_L!v@fhg}ZWaTO07Y%FvN**`au_!^`qkm|C!A*wRFy+QRLW!|>- z*pM1pwF>Rph9n~N-m~^TCg~NDkFCDPB>h72Cu<){p!XE!I=0mwt(we-u#6};sj&79 zCvgE=j_lCB1=_tr`_zVZ09|;z8Z*$}SpC-J0TCUA{d7Zp1XpIEj|#I(K9*d}>=u$i zA^EN~wCzGhUWSN2T;5wQaZTQ`q5dd~2{k=+f)K(J(<%)k+t zq+u&*=-CA;{LKMQM~ncTNRB$4rHkx3|MSSxHE0G}IMEJbQvlu00e0diyUBh-;4W***N+h!rKV%Ac*7UD*yCISNlBBjt5S;Y);RxAE0zXu&%^S(G2~V zheijRpF>_*Zow*@ZH^Bb<;^Z(n7=eSNe=V1(T2`eG~h>AMkqtT{)dGTDiPZGgVE7K z8xC&+L~0&7QvYAf7+yD}`_+@UvXGgBOXvH@!Z12ScNFN4*)1fz>Fmqm?s42D2iZlT zlXM8%KCSCS10p*2Hwav$?}3g~8RW&IZA9gNJUUDi9vsvAMu5$ZAdDg$MK}lGgr<%i zpM37r`PegO&z?GWQai>@@OQ`R3!*hYk7_Ry~L?av78{hx)$#5>*Fs1h&qlrm9CDCAYWfk2J7iys`XXhOZnq;S^pWX*ke6*2>u z>{mQCewDn>|2^Kw|2{r`=_6!{bcrODBl&BDAVLK~2;nyfm_5gBK>L$6S+yV%Sp$rV zCW6%>$F*Q3L0Si6etV+jwBv&oWFZ0F1#~~nz-2cPT2R-gUrXq@QYS0wCX6Cc80|Rf zK)|KK7a*D{N=y|al8UB+-F3YTAjAa@71oeK4a01~2RB&gfQ_v+d{PHS&Gi`;m s6x_Y2sPHM42evv{_ zWeJc`lCMylnwP?*00EN~nGGk`3QG&1>zKS=Sd;^ zRT!paOrFlI&!|25IJY}v^kjaXDiZDG73!Xx#2dzK5A;DX3&qOy$pCo2e7 z5M#GESYmQlg1hpNpS^mxGs!9|QsQ CxptWV delta 533 zcmdmBw8MzkiI## zW}ZSxMyf(#X=+iWLUBn^W?s5NT7J>whk{CzH3X#tL7H+hi%S&p(-cZd3vz(E6B42| zvQsN{6v`5FN>eps6A~0O$}@9vKxP89=IW;ACFiH4rfBLwtOHw|mYI{Po0FNHI=MhF zaI-h_9QMgCxF&EUm#61tl@yvxZs68u)SSG5+nv#W@(=DRQXRW?ayV}ow=K}u#VjDd zb8X(io6N}Qy;+7ojgc{8aKSu<>2Mw13>_4)uq$` diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-37.pyc index d1de425b6bea3b181a728c0ce3a7ccb79238843f..3c136909c9d86f8bc4f0d259823f50261ca20ddb 100644 GIT binary patch delta 191 zcmaFs@Y;dbiIske$s4(Oe7?=%36cAIu#GV%CC) Kn9V8joQweP=`{cV delta 186 zcmaFu@YaFXiI9lFQTc zvPud~HuJMS}*De<|2?l-((i~VD4BDvj#*&Z%&fuWCQ?n CZZPiv diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-37.pyc index 4538915b3d8c1d7dc282c8691662cd959bf86aa9..9e09ed669f093bb9bcf7307bfac221173376e819 100644 GIT binary patch delta 34 ocmX@da*l<^iI`Tpd0Eax~<3M=y}4AU|uA7M3Obea5} NRh~(Ld9oCn8USW&PB{Po delta 333 zcmZ3;bAX4}iIb8$XhHC`)?y}3M)rSVP#&0VOqxKO4ftsJbXYoZy+vS!oV=u z!&cE_4sR`U2}2E2Gb4~>Zf2BVsAZ{PDe_6-tYs}>tYIx-s$pqn6k}*+Y+|foUcg+# zw2+aJp@gM|IfY9SC<>&xZGimA8*N49SyT8Hf<*X1B0yRIszMORXUk&W{M7a_BO}M; z^Y-})dLUP_GcjU=Y>XVtn-d&(nHXnI&T~>_oHcohlRe|z$yb~{|SK1=j32yW8z@sW8`AwVU%DhS~K~q z>nz4glQZ1*U@<}7-H>tB1ZH6Z53$?@XildpK#u&Qv#bBO`~jdf%S delta 357 zcmdlniE-*AMqVdgUM>b8h?=h!vuY!63M)r)d3s(}NukN+O4ftseEdK;Zy+vS1|&)* zyV)vw^zzm+moU~aH8TQ9=4M6-hFX>ymLk6t&RW(IrW)1~<{Fk}MlptF#wMWr0+t%4 zg^Y|0C9E~fDO{33Q6SB21LRL$Z!0R#mcq9XB*G680n!3c6@oxMdltv$$F`3d**R~q zq+}+SOg?U(&tU*`2Ll@u<768LNk*p4VGg`ZjI$=EIH@wup4{bR&v<9@DW{E$x|?g9 z4HzdMa*1bTpRD9MNBTD-&<_G2y&N2jY)l-Ce2iR-Jd6@dMQbPDbe+YxXL5<#p2=?R zI*O}-YBV{Ef`C*J3y3HI5sN^?Oc1el@)Y+dZhj`9c@jWA1KZ@E?gnfNK~jq+>wBzb QTs!%;M+B=fhdh@E0Gzy8H~;_u diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc index bb1fd7e1b15c214ccbc1bb9e245ef226b4212ad1..09931aa541a1cf1560621fdf7f2985b1d3a30402 100644 GIT binary patch delta 35 pcmcbnbxn)MiIF+PDk(JCEXiUk2mqlr2@C)L diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/help.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/help.cpython-37.pyc index f732d9fc893be2f64dee6cbfa751819c87bfb53f..922b6ff817df7737110358b93d02314d2e6cd947 100644 GIT binary patch delta 134 zcmca7a#@7WiIFE$*ru@`1!K9YS~km zYuHm*vN?-ZO*UZDX6Ky470jT?H93hbXYw<)>66c~NpRm{PfsmLEGa1}Qk~q(K9x~r lvNA_76EoZ73XU_3g_B)5m#}F7Ed$EF=geX?<6z}r1OS;;Ch`CP delta 145 zcmcaCa!-WMiI4MOEWD+HNf(kBSjR{1~ zP#{gMY|JGRLbu2=s9_v5cmp*WR=NpnK~c)g@z9s$!{YvAIx`#WoCSTEiAofA%h+Dj z_9+h@+wyukS>;taD~em)>*s}-<~N7x=$gdUOAxb!k;u*O$v z^oDk)1{Jx)HB$#>#X7uO?=-CJnin=eX1>|{$j1O(!XtLkr=@JUVdQ@CG?j%&Q^jeZ L?C+{&o}J@Ad-g%U delta 318 zcmX|)ze~eF6vyAY#9k7Ng9X7&C=`Pd9mJ_rP)Et2&_R??a%pT0O>?>857H_A2RAsX zV@Fs2lurH=&iZcgJw9LF-TU!f@-Ob6`o0Gg*KggM-%p?8z@pa~QEiea5GdFSC_IM- z8@z(RiV~!b2}YRl%CJRJ!|lcbYs_H827pj90kneAQVZO3l80scZ9_L_m(L~S7nYTZ&P!%0lt>pd!il)COD^X&x6g33kfEg& zRO3)!^psIXA<4g>q?a-g>>+}Du&2sy_)r8rq($@}WbYj~KRD-iIdHyBBJmi8-3CLt zz$-XvXuA?v%Ntgdtz#moRkWW^7!vSwpb~@V% zy1cPM`M4|4>s8vFP8!aV^(%53%SupLc7Cv|I8_DW#QzUx*9s##2zaCk~G=poxRT9xYw4Z_ZgxuS&hu z9qJD6yeM)9Z$T1HC^T!AE&nJ*6M4>w*E)A7sCt8>tJsloHYJz%R?tY0L~5#diX>%J zCNRR1m2mPxJk7&H*k-AtTBqX&z5RSfGM`MP7BOZas4!2&{92NjylS%bgRLL zS8TGOIt`2LN23*(XQrl35t%H$&yTb@ey)fu?!O{(L!x<;lv+e)D6hsOX;p8ZTE}LZ zN5Dx}O9%YyNy~a*VD!yl5trH9BV)igool_z`7%c-8mZf1hMt{vd=Pbw#(tq+sQLqU C65^8p delta 658 zcmW+zT}V@57(UNAXGbwdwBfX2)1{S4Oe)Q^sWsOwDw<_l%w))R{6o%u&Z$%;q82H2 zVSN>u7m^kP{jpwxhzQY4BnTvflIkLe=q3;^1R>~KFFeo1`@YY^`!o0&tFK`8n9Ugi zkHF;4bJ3)ETuBdIY}dMsSQ$N4D$L>!iGEq9z-DZD>|55LIougCIwM+Zyf;76##(GU zXwBvX(;WF!p7R#?&NjB*#X8-xM}ZBdB?&X+boBxznkWqemgjq92}R6QHU~Fb zEPIJeHdMZW-PFIoKtw&ecOZcQ=BPZ6A?9>vvqzQIE}1VXap;AdMuaXw&*TgUhImD2 zLl|N4QaaB_USSx+Xb_5}6Cv>4REQi3$370-!6_lM*!q!x!L1Sq3&T>I*d#!RiD7}| zSC#nV5#Du;>-3aXMqkk>RgXqAU3CS6?W&<0t%e#5y4>B7P;0kd<8rsFn%WbM*A&a~ z_gu1)7K&(wsu?RXzdM_#+H1X>viturNr57Y$N>9VHH$Ged2kSS$m#wBOwfAu7vKR~ zs=beAbm5Ri1ktFc449=ibuzHX=DhRxz($WSEVG#1&MJHse59kkY7>6b$T2(cnWm3- zh}cY-{!W;d`8+P_tG_LB!Ip+yN-7awV98pmA{%Ot;h{4PF+PDk(IX+{@?&0F@;PasU7T diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc index a9941b33031c7251587f297ae49238dd973d017d..8c51a56ac7134ed710e15ba3d5de8d22c3699948 100644 GIT binary patch delta 4995 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 Qp}0(3<|SUcm@Y2+A5LZLL;wH) delta 5029 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 object from a urllib3 @@ -378,7 +379,7 @@ class HTTPAdapter(BaseAdapter): when subclassing the :class:`HTTPAdapter `. - :param proxies: The url of the proxy being used for this request. + :param proxy: The url of the proxy being used for this request. :rtype: dict """ headers = {} @@ -407,7 +408,10 @@ class HTTPAdapter(BaseAdapter): :rtype: requests.Response """ - conn = self.get_connection(request.url, proxies) + try: + conn = self.get_connection(request.url, proxies) + except LocationValueError as e: + raise InvalidURL(e, request=request) self.cert_verify(conn, request.url, verify, cert) url = self.request_url(request, proxies) @@ -421,7 +425,7 @@ class HTTPAdapter(BaseAdapter): timeout = TimeoutSauce(connect=connect, read=read) except ValueError as e: # this may raise a string formatting error. - err = ("Invalid timeout {0}. Pass a (connect, read) " + err = ("Invalid timeout {}. Pass a (connect, read) " "timeout tuple, or a single float to set " "both timeouts to the same value".format(timeout)) raise ValueError(err) @@ -471,11 +475,10 @@ class HTTPAdapter(BaseAdapter): # Receive the response from the server try: - # For Python 2.7+ versions, use buffering of HTTP - # responses + # For Python 2.7, use buffering of HTTP responses r = low_conn.getresponse(buffering=True) except TypeError: - # For compatibility with Python 2.6 versions and back + # For compatibility with Python 3.3+ r = low_conn.getresponse() resp = HTTPResponse.from_httplib( diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/api.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/api.py index a2cc84d..abada96 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/api.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/requests/api.py @@ -18,8 +18,10 @@ def request(method, url, **kwargs): :param method: method for the new :class:`Request` object. :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. - :param data: (optional) Dictionary or list of tuples ``[(key, value)]`` (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. @@ -47,7 +49,7 @@ def request(method, url, **kwargs): Usage:: >>> import requests - >>> req = requests.request('GET', 'http://httpbin.org/get') + >>> req = requests.request('GET', 'https://httpbin.org/get') """ @@ -62,7 +64,8 @@ def get(url, params=None, **kwargs): r"""Sends a GET request. :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response @@ -102,7 +105,8 @@ def post(url, data=None, json=None, **kwargs): r"""Sends a POST request. :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. :param json: (optional) json data to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object @@ -116,7 +120,8 @@ def put(url, data=None, **kwargs): r"""Sends a PUT request. :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. :param json: (optional) json data to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object @@ -130,7 +135,8 @@ def patch(url, data=None, **kwargs): r"""Sends a PATCH request. :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. :param json: (optional) json data to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/auth.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/auth.py index 4ae4594..bdde51c 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/auth.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/requests/auth.py @@ -38,7 +38,7 @@ def _basic_auth_str(username, password): if not isinstance(username, basestring): warnings.warn( "Non-string usernames will no longer be supported in Requests " - "3.0.0. Please convert the object you've passed in ({0!r}) to " + "3.0.0. Please convert the object you've passed in ({!r}) to " "a string or bytes object in the near future to avoid " "problems.".format(username), category=DeprecationWarning, @@ -48,7 +48,7 @@ def _basic_auth_str(username, password): if not isinstance(password, basestring): warnings.warn( "Non-string passwords will no longer be supported in Requests " - "3.0.0. Please convert the object you've passed in ({0!r}) to " + "3.0.0. Please convert the object you've passed in ({!r}) to " "a string or bytes object in the near future to avoid " "problems.".format(password), category=DeprecationWarning, diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/compat.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/compat.py index ec5d305..6a86893 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/compat.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/requests/compat.py @@ -47,9 +47,8 @@ if is_py2: import cookielib from Cookie import Morsel from StringIO import StringIO - from collections import Callable, Mapping, MutableMapping + from collections import Callable, Mapping, MutableMapping, OrderedDict - from pip._vendor.urllib3.packages.ordered_dict import OrderedDict builtin_str = str bytes = str diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/cookies.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/cookies.py index 50883a8..56fccd9 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/cookies.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/requests/cookies.py @@ -444,20 +444,21 @@ def create_cookie(name, value, **kwargs): By default, the pair of `name` and `value` will be set for the domain '' and sent on every request (this is sometimes called a "supercookie"). """ - result = dict( - version=0, - name=name, - value=value, - port=None, - domain='', - path='/', - secure=False, - expires=None, - discard=True, - comment=None, - comment_url=None, - rest={'HttpOnly': None}, - rfc2109=False,) + result = { + 'version': 0, + 'name': name, + 'value': value, + 'port': None, + 'domain': '', + 'path': '/', + 'secure': False, + 'expires': None, + 'discard': True, + 'comment': None, + 'comment_url': None, + 'rest': {'HttpOnly': None}, + 'rfc2109': False, + } badargs = set(kwargs) - set(result) if badargs: @@ -511,6 +512,7 @@ def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): :param cookiejar: (optional) A cookiejar to add the cookies to. :param overwrite: (optional) If False, will not replace cookies already in the jar with new ones. + :rtype: CookieJar """ if cookiejar is None: cookiejar = RequestsCookieJar() @@ -529,6 +531,7 @@ def merge_cookies(cookiejar, cookies): :param cookiejar: CookieJar object to add the cookies to. :param cookies: Dictionary or CookieJar object to be added. + :rtype: CookieJar """ if not isinstance(cookiejar, cookielib.CookieJar): raise ValueError('You can only merge into CookieJar') diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/help.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/help.py index df1b4eb..3c3072b 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/help.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/requests/help.py @@ -89,8 +89,7 @@ def info(): 'version': getattr(idna, '__version__', ''), } - # OPENSSL_VERSION_NUMBER doesn't exist in the Python 2.6 ssl module. - system_ssl = getattr(ssl, 'OPENSSL_VERSION_NUMBER', None) + system_ssl = ssl.OPENSSL_VERSION_NUMBER system_ssl_info = { 'version': '%x' % system_ssl if system_ssl is not None else '' } diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/hooks.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/hooks.py index 32b32de..7a51f21 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/hooks.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/requests/hooks.py @@ -15,14 +15,14 @@ HOOKS = ['response'] def default_hooks(): - return dict((event, []) for event in HOOKS) + return {event: [] for event in HOOKS} # TODO: response is the only one def dispatch_hook(key, hooks, hook_data, **kwargs): """Dispatches a hook dictionary on a given piece of data.""" - hooks = hooks or dict() + hooks = hooks or {} hooks = hooks.get(key) if hooks: if hasattr(hooks, '__call__'): diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/models.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/models.py index 4230535..0839957 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/models.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/requests/models.py @@ -204,9 +204,13 @@ class Request(RequestHooksMixin): :param url: URL to send. :param headers: dictionary of headers to send. :param files: dictionary of {filename: fileobject} files to multipart upload. - :param data: the body to attach to the request. If a dictionary is provided, form-encoding will take place. + :param data: the body to attach to the request. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. :param json: json for the body to attach to the request (if files or data is not specified). - :param params: dictionary of URL parameters to append to the URL. + :param params: URL parameters to append to the URL. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. :param auth: Auth handler or (user, pass) tuple. :param cookies: dictionary or CookieJar of cookies to attach to this request. :param hooks: dictionary of callback hooks, for internal usage. @@ -214,7 +218,7 @@ class Request(RequestHooksMixin): Usage:: >>> import requests - >>> req = requests.Request('GET', 'http://httpbin.org/get') + >>> req = requests.Request('GET', 'https://httpbin.org/get') >>> req.prepare() """ @@ -274,7 +278,7 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): Usage:: >>> import requests - >>> req = requests.Request('GET', 'http://httpbin.org/get') + >>> req = requests.Request('GET', 'https://httpbin.org/get') >>> r = req.prepare() @@ -648,10 +652,7 @@ class Response(object): if not self._content_consumed: self.content - return dict( - (attr, getattr(self, attr, None)) - for attr in self.__attrs__ - ) + return {attr: getattr(self, attr, None) for attr in self.__attrs__} def __setstate__(self, state): for name, value in state.items(): @@ -780,7 +781,7 @@ class Response(object): return chunks - def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None, delimiter=None): + def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=False, delimiter=None): """Iterates over the response data, one line at a time. When stream=True is set on the request, this avoids reading the content at once into memory for large responses. diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py index ba13526..d73d700 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py @@ -19,7 +19,7 @@ from .cookies import ( from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT from .hooks import default_hooks, dispatch_hook from ._internal_utils import to_native_string -from .utils import to_key_val_list, default_headers +from .utils import to_key_val_list, default_headers, DEFAULT_PORTS from .exceptions import ( TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) @@ -115,6 +115,31 @@ class SessionRedirectMixin(object): return to_native_string(location, 'utf8') return None + def should_strip_auth(self, old_url, new_url): + """Decide whether Authorization header should be removed when redirecting""" + old_parsed = urlparse(old_url) + new_parsed = urlparse(new_url) + if old_parsed.hostname != new_parsed.hostname: + return True + # Special case: allow http -> https redirect when using the standard + # ports. This isn't specified by RFC 7235, but is kept to avoid + # breaking backwards compatibility with older versions of requests + # that allowed any redirects on the same host. + if (old_parsed.scheme == 'http' and old_parsed.port in (80, None) + and new_parsed.scheme == 'https' and new_parsed.port in (443, None)): + return False + + # Handle default port usage corresponding to scheme. + changed_port = old_parsed.port != new_parsed.port + changed_scheme = old_parsed.scheme != new_parsed.scheme + default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) + if (not changed_scheme and old_parsed.port in default_port + and new_parsed.port in default_port): + return False + + # Standard case: root URI must match + return changed_port or changed_scheme + def resolve_redirects(self, resp, req, stream=False, timeout=None, verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs): """Receives a Response. Returns a generator of Responses or Requests.""" @@ -236,14 +261,10 @@ class SessionRedirectMixin(object): headers = prepared_request.headers url = prepared_request.url - if 'Authorization' in headers: + if 'Authorization' in headers and self.should_strip_auth(response.request.url, url): # If we get redirected to a new host, we should strip out any # authentication headers. - original_parsed = urlparse(response.request.url) - redirect_parsed = urlparse(url) - - if (original_parsed.hostname != redirect_parsed.hostname): - del headers['Authorization'] + del headers['Authorization'] # .netrc might have more auth for us on our new host. new_auth = get_netrc_auth(url) if self.trust_env else None @@ -299,7 +320,7 @@ class SessionRedirectMixin(object): """ method = prepared_request.method - # http://tools.ietf.org/html/rfc7231#section-6.4.4 + # https://tools.ietf.org/html/rfc7231#section-6.4.4 if response.status_code == codes.see_other and method != 'HEAD': method = 'GET' @@ -325,13 +346,13 @@ class Session(SessionRedirectMixin): >>> import requests >>> s = requests.Session() - >>> s.get('http://httpbin.org/get') + >>> s.get('https://httpbin.org/get') Or as a context manager:: >>> with requests.Session() as s: - >>> s.get('http://httpbin.org/get') + >>> s.get('https://httpbin.org/get') """ @@ -453,8 +474,8 @@ class Session(SessionRedirectMixin): :param url: URL for the new :class:`Request` object. :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. - :param data: (optional) Dictionary, bytes, or file-like object to send - in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. :param json: (optional) json to send in the body of the :class:`Request`. :param headers: (optional) Dictionary of HTTP Headers to send with the @@ -550,7 +571,8 @@ class Session(SessionRedirectMixin): r"""Sends a POST request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. :param json: (optional) json to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :rtype: requests.Response @@ -562,7 +584,8 @@ class Session(SessionRedirectMixin): r"""Sends a PUT request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :rtype: requests.Response """ @@ -573,7 +596,8 @@ class Session(SessionRedirectMixin): r"""Sends a PATCH request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :rtype: requests.Response """ @@ -723,7 +747,7 @@ class Session(SessionRedirectMixin): self.adapters[key] = self.adapters.pop(key) def __getstate__(self): - state = dict((attr, getattr(self, attr, None)) for attr in self.__attrs__) + state = {attr: getattr(self, attr, None) for attr in self.__attrs__} return state def __setstate__(self, state): @@ -735,7 +759,12 @@ def session(): """ Returns a :class:`Session` for context-management. + .. deprecated:: 1.0.0 + + This method has been deprecated since version 1.0.0 and is only kept for + backwards compatibility. New code should use :class:`~requests.sessions.Session` + to create a session. This may be removed at a future date. + :rtype: Session """ - return Session() diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/status_codes.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/status_codes.py index ff462c6..813e8c4 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/status_codes.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/requests/status_codes.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -""" +r""" The ``codes`` object defines a mapping from common names for HTTP statuses to their numerical codes, accessible either as attributes or as dictionary items. diff --git a/env/lib/python3.7/site-packages/pip/_vendor/requests/utils.py b/env/lib/python3.7/site-packages/pip/_vendor/requests/utils.py index 431f6be..8170a8d 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/requests/utils.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/requests/utils.py @@ -38,6 +38,8 @@ NETRC_FILES = ('.netrc', '_netrc') DEFAULT_CA_BUNDLE_PATH = certs.where() +DEFAULT_PORTS = {'http': 80, 'https': 443} + if sys.platform == 'win32': # provide a proxy_bypass version on Windows without DNS lookups @@ -173,10 +175,10 @@ def get_netrc_auth(url, raise_errors=False): for f in NETRC_FILES: try: - loc = os.path.expanduser('~/{0}'.format(f)) + loc = os.path.expanduser('~/{}'.format(f)) except KeyError: # os.path.expanduser can fail when $HOME is undefined and - # getpwuid fails. See http://bugs.python.org/issue20164 & + # getpwuid fails. See https://bugs.python.org/issue20164 & # https://github.com/requests/requests/issues/1846 return @@ -264,7 +266,7 @@ def from_key_val_list(value): >>> from_key_val_list([('key', 'val')]) OrderedDict([('key', 'val')]) >>> from_key_val_list('string') - ValueError: need more than 1 value to unpack + ValueError: cannot encode objects that are not 2-tuples >>> from_key_val_list({'key': 'val'}) OrderedDict([('key', 'val')]) @@ -466,7 +468,7 @@ def _parse_content_type_header(header): if index_of_equals != -1: key = param[:index_of_equals].strip(items_to_strip) value = param[index_of_equals + 1:].strip(items_to_strip) - params_dict[key] = value + params_dict[key.lower()] = value return content_type, params_dict @@ -706,6 +708,10 @@ def should_bypass_proxies(url, no_proxy): no_proxy = get_proxy('no_proxy') parsed = urlparse(url) + if parsed.hostname is None: + # URLs don't always have hostnames, e.g. file:/// urls. + return True + if no_proxy: # We need to check whether we match here. We need to see if we match # the end of the hostname, both with and without the port. @@ -725,7 +731,7 @@ def should_bypass_proxies(url, no_proxy): else: host_with_port = parsed.hostname if parsed.port: - host_with_port += ':{0}'.format(parsed.port) + host_with_port += ':{}'.format(parsed.port) for host in no_proxy: if parsed.hostname.endswith(host) or host_with_port.endswith(host): @@ -733,13 +739,8 @@ def should_bypass_proxies(url, no_proxy): # to apply the proxies on this URL. return True - # If the system proxy settings indicate that this URL should be bypassed, - # don't proxy. - # The proxy_bypass function is incredibly buggy on OS X in early versions - # of Python 2.6, so allow this call to fail. Only catch the specific - # exceptions we've seen, though: this call failing in other ways can reveal - # legitimate problems. with set_environ('no_proxy', no_proxy_arg): + # parsed.hostname can be `None` in cases such as a file URI. try: bypass = proxy_bypass(parsed.hostname) except (TypeError, socket.gaierror): diff --git a/env/lib/python3.7/site-packages/pip/_vendor/six.py b/env/lib/python3.7/site-packages/pip/_vendor/six.py index 6bf4fd3..89b2188 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/six.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/six.py @@ -1,4 +1,4 @@ -# Copyright (c) 2010-2017 Benjamin Peterson +# Copyright (c) 2010-2018 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 @@ -29,7 +29,7 @@ import sys import types __author__ = "Benjamin Peterson " -__version__ = "1.11.0" +__version__ = "1.12.0" # Useful for very coarse version differentiation. @@ -844,10 +844,71 @@ def add_metaclass(metaclass): orig_vars.pop(slots_var) orig_vars.pop('__dict__', None) orig_vars.pop('__weakref__', None) + if hasattr(cls, '__qualname__'): + orig_vars['__qualname__'] = cls.__qualname__ return metaclass(cls.__name__, cls.__bases__, orig_vars) return wrapper +def ensure_binary(s, encoding='utf-8', errors='strict'): + """Coerce **s** to six.binary_type. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> encoded to `bytes` + - `bytes` -> `bytes` + """ + if isinstance(s, text_type): + return s.encode(encoding, errors) + elif isinstance(s, binary_type): + return s + else: + raise TypeError("not expecting type '%s'" % type(s)) + + +def ensure_str(s, encoding='utf-8', errors='strict'): + """Coerce *s* to `str`. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + if not isinstance(s, (text_type, binary_type)): + raise TypeError("not expecting type '%s'" % type(s)) + if PY2 and isinstance(s, text_type): + s = s.encode(encoding, errors) + elif PY3 and isinstance(s, binary_type): + s = s.decode(encoding, errors) + return s + + +def ensure_text(s, encoding='utf-8', errors='strict'): + """Coerce *s* to six.text_type. + + For Python 2: + - `unicode` -> `unicode` + - `str` -> `unicode` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + if isinstance(s, binary_type): + return s.decode(encoding, errors) + elif isinstance(s, text_type): + return s + else: + raise TypeError("not expecting type '%s'" % type(s)) + + + def python_2_unicode_compatible(klass): """ A decorator that defines __unicode__ and __str__ methods under Python 2. diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py index 4bd533b..148a9c3 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py @@ -23,16 +23,11 @@ from .util.retry import Retry # Set default logging handler to avoid "No handler found" warnings. import logging -try: # Python 2.7+ - from logging import NullHandler -except ImportError: - class NullHandler(logging.Handler): - def emit(self, record): - pass +from logging import NullHandler __author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' __license__ = 'MIT' -__version__ = '1.23' +__version__ = '1.24.1' __all__ = ( 'HTTPConnectionPool', diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc index 9b6737a3f5e6680302dd85f8521819f1b2abc94d..6e8126050ba4b17e7ffb6b29eb9571987ad28bf0 100644 GIT binary patch delta 481 zcmX>tG($k$iIX`m2PHO$jHc$DwU<2#+V|UBGSSbr4lWj%ABQ| zBAUvXrIsR=BHqgkQ~?r^0E(z%h-hGlXr@TRv~gx>0S%T+kpdd5ox&WiiClROhDe|0}>3JT#Ouy0*qWh$irA9Jh_N%rz*%8 zuvtY)AeIP_hydbZCLqDU0_JP#Ob%d|W>lY?!@i1B6ewII2qY$(au~>nfq3E|LK;Zi zVs&wK3UvqDTBI?#kt0WIP9Ve&LG18q!te-zjG=J@89;$iJl+dqAh7 z;+6u`q)XB;18o}k4RjO~>KOh76?-xc8MvF>yM5fZ-*@}k*JNRBd^}EYnFsmjxluxX zieR`@ysV;mTki@7y*C>{LK z_N|N^vRx@a8dJup)F5;5zs#kROw3+FU>!0DTmtzKF|x;7^bYOShZ@Bxp{=5Mljs;R zDG*aau~MIya`;N&6IiN?MzO?6(e9yn3OXPNO{*V?Aq9%Zob6zQvwDjIPhvH6ziuse zn(gIwqg`sa39nOgoKpSuOV{q~T=!=qi@iW$%|>TVK!$VZu2$_j&V!l@4&!A}tQtz7 zT9#XDGRq3$mep)Q*Ae$I%i8JIoI!<84~PC8&!N)65#>tx z>b2wV(q|gsGuY?vD^}@W5FHCE0wjTs#Nt$?8ja%~qg?klBVTeSq6bqm*!Ds^2z4o3 z#75a)8PVyIzcKP@UQi0T1fvg|?H2E>bKc@X^pAF5jb6@(j|n;P1-u23`|E2P6)w2& olK(i$iURc%)sTY_9jG@4-*j8X$h+bHh-Os@DJN)3d9S8^1N|hPEdT%j diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc index d4d54d0575a8e25f9918c67a7dee7f0c925b92f2..751d323d1c855b8477ff9fde5afeec0109fc13dc 100644 GIT binary patch delta 420 zcmW-dJ4hT+7=`ETnAv%|x}!TR8g(_g3yK64d~_Ch2qEzShN~%*>kD@jwNZ$o_`t$u z`4Iz#5Rn*6BX|i&uoNsr#7HiUKibFKSq(aC8Gi+tDvrqu1UX*6Gw+!YA=IF9K}QQ2si; z(xX^6HmEl?gKfHqjbfKteZqHf>AwelP;dMLj>KJjA2=0z1!o~#h)hv8a7TZNH%)n< zG7mk2H;^>JpFTs*MmlxX70tk?!d>Yt|HXF2BhQ-q4}z&1u6JR z)QxW9MG+M>s0*vRhfq<`g|)h}3fC)oHOit;CY9PiLkbk;fAnPhP+adYzoZ zOWK(tEQ@!kbHG~~@4167;(N~<;G4MF`$NTFQSQ$JZTd9u7;&m>U4>7h=_dN&``>RL{W zXiQ_YWji)ASfmwq6HWqj1~XepH|6vxISO*xNfT|WUs-3I49_(Boq?CM_MD;dK|WNc zO7h$!){33M|XRlHVUJ0dt$h!931~ z!8~_h4sIk`1-IxF-I7ysN1PG2?39&D$=0Yl=8U=H&bS(4oZ~FR`q{wS)H%Uv?<5;!LoBhH zHo6ZB#5siIA*4VGleG=OH{{cUR_aGE_ACGm(qYOM2Vd%c8V2G5z~L71gTW&Csr+#8 zDX8hd(CssZA89~|>LjOiW4;yWL2QSLw*tLRy85lPK)d@K{kP6{%2~`i%TqfNiy(Sg04r-y%Sh{h$;3d)wu+Wz86qloOT*-xygfW+Fj|kw9}FMg zj)6UXkWUeKo`c6*1n{Ab0oIh(^&k?MjJ!>Q*mo3>AzNCF1_stPhyoe`P`wsmiukJ9 z`V!>60{aN)7fp-;RHGt_@hs@E86iHDa3Vw|@@?XAsRsOaxVWVe?$uG)( z7A_}%#W6;ABM_A>pDj-45%G*{7jxT(M^)pWse;lD!xkckfJG1mgd=a2d(VLGkdrw7 zh^tu5PvPLlvNm4q6UjtkQcq1oCB`>q3O!^v_iR%argjeL5(#Yp9!3V@R z+FnVR0Kou0g2zh$Sj3`+N=GUs*#2(mmt+Kk3FC@~TQ#=>+&zk-Dc$n3m1AJ>StSl% zLl6k)yLerOgss8_F{XQZ#T8B5g4NG$9oAz<-4OpvtReqeg^FNcZfd#zk@r3 z>AT3yJ{a|NBmdO~5&6+*ZX5W`j9uh0o>LT|UxZ)1QDPBh?xL5)9ZIw|3nGmnf22`v z>hShh^haS`lvz74@)p5rj9JYX&fw}^2_iHDvp3FS%-*A5GpBrv_mTnKBmTr5?CDPi z<_TPSk8GR^bUfzaA(bX9*|>^_W8mQ2lxnQRlKkP=@~kR%6OsyDg{%@S1Q$V7;&qf1 z=T`SGj8BvC=>xi|M#BC+SoL|7&MRB_=EUW*j}Td%qS%Z_iJJ(I@cQ618JV0)htXB; zFZ;eY;6YW+PZla0xMmpu996u*>pZmZ(#Kv`KFY@A+&FR{{sm~B1A;~^Vj?efi<-Jg z4Y(}jPbTkPQ+^yps2o&;y9JB>Kj}L#8^z5r7|XyedibU49}=;%q9eau`Q7$6z#z;l zdvGWDoE_dt;wju;b&&$qN_Ro$)Sy9ABn|sgVi_h8I9oj%+O=AJ)87=lRulNX z6ahdOZFN>x*W0VYL)9w?Izsv^qPjEBpmbaQW9n>t7Dar=i92#}`mb}}L{asA7o}~0 r(Cob0fH%09Kn*szz@Wuld41+Wg>r6&Ckb!<#7 delta 2813 zcmZ`*U2Gf25x(6!lE>qpL`ft?QWEuV#tI|blC9dVBe|9xBaR)QN@HJLoN4Xphvbp; z^6Z+<334DK4FWi|u}upUX-lPVZBd{VTJ)hUism6G5TFlvC~z=Z^sNDcqCoo4zIA3P zSZUCT+E25y-|o)L&J6YM%m26%KO2h~3jCNqn7aPX!sB>`{Pywm(QR4_nn9*8wH9Ww&!7foQ<%; z1I0XHCm#|1%eXynF4)J-`MPG$ne*Zad7`g=eZ5|BZ_SC{(Zi%qd_r3!w|7JR6Cr2C zLg0twwY?{SUy!dDh5esWsZejY_Q{ilm5t3-0e{!)4Q{i-T7wr}Zo3y@RT*;k?&KFzD*#$%9oX5K-7)FOGWxIg{1p91mMS8jn%5{T8*Z= z*{HXQ5gtUf`tr47zS?XweRbV-`J~jf+ATkN$L1|yTATH?hMyA8hf|av5+53iqq9J& z!f3?-6cQv+HA;;@RO?airC(TCd08xF^LxvYKdadzK;W^bfE#>mqtSBj?|m^bMyBUM zQKTGce&9~IcH90Oo1cIsvG+#LB|;8~k9s!%Pbc$aUR+C#lM`YqnIT8Sx0AEvd*XxS zm8%-izXYQ-0pJmck>Ua}!jv7A7d)jycV$VyiYjBJUiPDwd%Iq@YZh9@3G6ItzJ>ww zLlBj+>vCcBrGwI&Gs5c|jsFVo&;h`IEh>K8_iAYoCj30WzC-*BDn93YXte=1t-9}v z+5S@`C2IZmPwDv9FhXl2t!#x|-BZ2r4(0E9>KfTn?^ZnZobt7sTZU(}esb$QST~Tp zLtDQW;{z{|_r$G%A3-egsjpH#CEBSQ(a6osdYQK^x81bGUsBT$qfolg_X1jU5x@^_ z*kxvOz93Gf&yf$rc6urnCk8yGK{P^1RQx>s=9v;wBbzM?l3{ZVQkLV}`+Ac%nl^Xa z@^$=R%XVEjYZ2CD0Qd!zEO9rJA40K}0?-FFszZtZ4n+InhMvtHLW_4sgr} zJ_1k-a;yYCE5188bv6K-R*Q7eXJ{z+f>Nn~syR1gkMz=Y?=5dQl`Wkfy&eJcu} zXmJv!VlMlvbW3L9Wl_y8>x@1`OT*&V*)dh)XT@K$=_DRnG(Ho!sz~HAa|idIMMAee z{#QE5Kto%A2#XuJL3%GO9*<|lJGtJq8?cj?5gde@0DjuKaOuj~rAyYit8SzdWojqp8oR`e%YLd<5=^P;+;e-} zUf7r1A#UF`2>m;RX%8`>5->|_X>MOv>uJ`2o5E`=X&4z8gD|olq#_GE#6$#hDmnh4 zn}feo z5(HQrDU?sh1gXQU7~+_4yn)a}kZ*JkBtOxzIlQoJk@d1;^XlGj3R7fsvYWlwra3-W z_k?pOEh8)mZESf#R?i^L(+KiLYziE&0Di)9%I@mM zfhjFqvH_sPyFD6dI(Bn3Rs3^oCWn1!0V`z%1cmC5!ci@#!e3P^jeq01G~}tfT?=Ji zz6SLFUmF}&`|()W;xrAK=l+Mv|GkKj;#^Eje6;;GF#XHy$GqFQGQ$0039;6xx(*FP&=Wz1? diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc index 92640c1bd6794eb6d7739a9233b037b4c33d878b..0b1835baa7f1bf38b4497c324fce1164f379e077 100644 GIT binary patch delta 369 zcmX@NlX2G$Mm{HAUM>b8$XhHCE7>`bPl9pTM)eFvTc#}MRHiJK45lbocZL+v6tNbD z6tPsNRE=hqC^w*pc!~s2L?YF#nK{ZmMKVRIg(1o#MLI&=OW4b_U{N1t3wwxPYOCA&U`+nShviAu}ULjAbDMBSQ*fFoP!3VBH6x44Q^OX5pP^YT)2igbZmi}XN*H;}l+o}3R9PA-`wCoNQz0ThvE2Aa1{h=$DB_R-0R87&MF0Q* delta 540 zcmdnBgYn!>Mm{HAUM>b8h?=h!)6q4NPl9pPM)eFvN9R0oLqC8WiQ)Ga&*XA>f!Ymxg<>`4@ zC50xNpR-1L)-wYw;s9c2ATCY;5|vyvj9Cn|OyLZ9QY;K5jM-d8DvS&u2oz_kWr}3T zV~SuXVa{SnVa#SMa;ss;Vl8&7VFJ=@K+N9E#K@2*gy4hZo0&nn7jP^Dnv%j4%%I6! z)x)I#0+Va~+v+u$i{=4se#r(RSb&6|Cg&}#;?$D(lG41q)SRLOpx7<$cqEbaAQ7Ij z)S}|d{Ji+gytMoxZ=g_-E{M8xtcJBOfCVlK`UtlMvJ9@BlYP#;D2j0v|CNZf*?P!^n7PvR#NTqvzzFka>(Z zCu@fqG74>u4NYcdjG25eLYVRHF+PDk(JC9K|fH3IMne3J3rI diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc index 62f5a01286bf1badbefa160b5f104d4275fa310e..c77907bb8daf90720d35608a0b69b4475ad3b297 100644 GIT binary patch delta 35 pcmX@8dr+6hiIF+PDk(JCtiv=_1OT3M31t8P diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc index 6f281bb2fdc49f756469406b31887c9f2a20130d..b65eb00a0fd956c610c07cde3bdf37add6783b3c 100644 GIT binary patch delta 35 pcmbO$I#-m(iIDKkdi1oD9 zT3}$G#H#b^r0x4C}E?KU!ZM@G}cK|H65+`WQT-8CxF-(k)vBS*136fZ0R#R`OhXVxJXE z{g~&c?xIRZ5KSM#5rh!!DQY2W+U=qeQhNzKgA60(@sj6xeTA&TL= z?89+%V4^OLt7?2NVT|PP8ezU|ZN+s(XboYQj~8Q>M*=H4h7qzncjAlyve%815QiA` zRCtL+^H;nh#7|vr7h~VzJ}C{c6qh#Xt~9cVm#fZ^Df+pp*|Mh}byX*cPM50X4&Ki+ zrlewO6jXd@3L%0p&OjFSE)UcX>G_9{Gljd2pf%eqAI6jAU zxLg=OkP%QLzMGlX9PbYZ-kfo_t=L7h%R zGY0H%3j-3u-pdGjtH>Ok^}2n?!eh<~md`6?l6|NnY{*ArO5QoehB_}C<){W#P?T>KEZ0RrljRfN;P4!TvABk^!D8ByYKS>8SPod>x9DCGzZ zHJ&~EkXbB*4z_2`mY*FLYge&C7Jo}O8h=_ik2~xqgz0)ylPQ2^Kb3sJ;_`h)^RWWr O5Cviu9SepDN8mSX0uNpQ delta 1210 zcmZuvNlX(_80M8}DNAhy*-Eg6Eol`?6-9yz5l~!$Nh=hPFmxHAEFE|hgp@=N5)v1p zJQ9qUm`FSbCmcC=^TJVMJoZGQoF&GSC*Svmr8dstn?L{Zz3*RULpwpsWs4;%jep&* zt9mxpE%OFasJ$`-h?XmDN#@YK{^($Atd{*TH+S&7CJD$8$Jxz$hnEN-nMZ#B&tH`KPHKyaRe)rf)|pYNu8 zqovD#%iHX8nyDc5AbbiSvtaHSvZ}qv%_o(&;pyh!Bzj(oG=w&_Z+Wc-BD0c$wroMR z%M&ZOM80Sr3T6oDV4k95T$;D&g7Ge|+13_|K9XKpXKv!ZHm5}KT0$CDLqqgDH)#mr z4E^CDIFOi-Mpbo~CJ9C)MOTFTerap=9zz}8(6jrw|&{lWNDGoO+tLk?XYw8*BuQ;g{Ks2j~qwSdB^X{u8>K#Q&yXu#K+v_4t0R&a*CPIQ2=_NAV?w=0~F_G<$-A}Q2A9dhq=i&FSB}= zBmV&kjDV!svk_MriL+-ehX-f6drpbWQL0W&%a~**Doz8Q1H>^3$uiq=l^9X=aN+pc z9kHDZx_~4bK#WvmrtHb6U&Oy&D(VScMCm~@AX(N-CmM-eoTgX;)FjOMT*qa)#QLhM z$O@aQ{yB*K@Fv8Kh&II`3i&U=d>{|=+dIxVg#NQ%(KjDpiYS!6XIm$mDjuWo3E(MU z9^eIt=EaLM?5f*g6%1lMm`#LDxSNkKZgFxroCf{*Ap7htB%j!}`**hBo&{MS`%zP4 e>VVnK?4HiNlALt&*(_p{48$zi?x&5}{C@#>&Ip(Q diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc index 8916a608f46230b4ad68bba4b73b4e4364e48477..3a7766fb4e3114ce3163f9c0f5332a55d4c94238 100644 GIT binary patch delta 138 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/_collections.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/_collections.py index 6e36b84..34f2381 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/_collections.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/_collections.py @@ -14,10 +14,7 @@ except ImportError: # Platform-specific: No threads available pass -try: # Python 2.7+ - from collections import OrderedDict -except ImportError: - from .packages.ordered_dict import OrderedDict +from collections import OrderedDict from .exceptions import InvalidHeader from .packages.six import iterkeys, itervalues, PY3 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py index a03b573..02b3665 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py @@ -2,7 +2,6 @@ from __future__ import absolute_import import datetime import logging import os -import sys import socket from socket import error as SocketError, timeout as SocketTimeout import warnings @@ -78,9 +77,6 @@ class HTTPConnection(_HTTPConnection, object): - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool` - ``source_address``: Set the source address for the current connection. - - .. note:: This is ignored for Python 2.6. It is only applied for 2.7 and 3.x - - ``socket_options``: Set specific options on the underlying socket. If not specified, then defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. @@ -108,21 +104,13 @@ class HTTPConnection(_HTTPConnection, object): if six.PY3: # Python 3 kw.pop('strict', None) - # Pre-set source_address in case we have an older Python like 2.6. + # Pre-set source_address. self.source_address = kw.get('source_address') - if sys.version_info < (2, 7): # Python 2.6 - # _HTTPConnection on Python 2.6 will balk at this keyword arg, but - # not newer versions. We can still use it when creating a - # connection though, so we pop it *after* we have saved it as - # self.source_address. - kw.pop('source_address', None) - #: The socket options provided by the user. If no options are #: provided, we use the default options. self.socket_options = kw.pop('socket_options', self.default_socket_options) - # Superclass also sets self.source_address in Python 2.7+. _HTTPConnection.__init__(self, *args, **kw) @property @@ -183,10 +171,7 @@ class HTTPConnection(_HTTPConnection, object): def _prepare_conn(self, conn): self.sock = conn - # the _tunnel_host attribute was added in python 2.6.3 (via - # http://hg.python.org/cpython/rev/0f57b30a152f) so pythons 2.6(0-2) do - # not have them. - if getattr(self, '_tunnel_host', None): + if self._tunnel_host: # TODO: Fix tunnel so it doesn't depend on self.sock state. self._tunnel() # Mark this connection as not reusable @@ -217,13 +202,13 @@ class HTTPConnection(_HTTPConnection, object): self.endheaders() if body is not None: - stringish_types = six.string_types + (six.binary_type,) + stringish_types = six.string_types + (bytes,) if isinstance(body, stringish_types): body = (body,) for chunk in body: if not chunk: continue - if not isinstance(chunk, six.binary_type): + if not isinstance(chunk, bytes): chunk = chunk.encode('utf8') len_str = hex(len(chunk))[2:] self.send(len_str.encode('utf-8')) @@ -242,7 +227,7 @@ class HTTPSConnection(HTTPConnection): def __init__(self, host, port=None, key_file=None, cert_file=None, strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, - ssl_context=None, **kw): + ssl_context=None, server_hostname=None, **kw): HTTPConnection.__init__(self, host, port, strict=strict, timeout=timeout, **kw) @@ -250,6 +235,7 @@ class HTTPSConnection(HTTPConnection): self.key_file = key_file self.cert_file = cert_file self.ssl_context = ssl_context + self.server_hostname = server_hostname # Required property for Google AppEngine 1.9.0 which otherwise causes # HTTPS requests to go out as HTTP. (See Issue #356) @@ -270,6 +256,7 @@ class HTTPSConnection(HTTPConnection): keyfile=self.key_file, certfile=self.cert_file, ssl_context=self.ssl_context, + server_hostname=self.server_hostname ) @@ -312,12 +299,9 @@ class VerifiedHTTPSConnection(HTTPSConnection): def connect(self): # Add certificate verification conn = self._new_conn() - hostname = self.host - if getattr(self, '_tunnel_host', None): - # _tunnel_host was added in Python 2.6.3 - # (See: http://hg.python.org/cpython/rev/0f57b30a152f) + if self._tunnel_host: self.sock = conn # Calls self._set_hostport(), so self.host is # self._tunnel_host below. @@ -328,6 +312,10 @@ class VerifiedHTTPSConnection(HTTPSConnection): # Override the host with the one we're requesting data from. hostname = self._tunnel_host + server_hostname = hostname + if self.server_hostname is not None: + server_hostname = self.server_hostname + is_time_off = datetime.date.today() < RECENT_DATE if is_time_off: warnings.warn(( @@ -352,7 +340,7 @@ class VerifiedHTTPSConnection(HTTPSConnection): certfile=self.cert_file, ca_certs=self.ca_certs, ca_cert_dir=self.ca_cert_dir, - server_hostname=hostname, + server_hostname=server_hostname, ssl_context=context) if self.assert_fingerprint: @@ -373,7 +361,7 @@ class VerifiedHTTPSConnection(HTTPSConnection): 'for details.)'.format(hostname)), SubjectAltNameWarning ) - _match_hostname(cert, self.assert_hostname or hostname) + _match_hostname(cert, self.assert_hostname or server_hostname) self.is_verified = ( context.verify_mode == ssl.CERT_REQUIRED or diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py index 8fcb0bc..f7a8f19 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py @@ -89,7 +89,7 @@ class ConnectionPool(object): # This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 -_blocking_errnos = set([errno.EAGAIN, errno.EWOULDBLOCK]) +_blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK} class HTTPConnectionPool(ConnectionPool, RequestMethods): @@ -313,7 +313,7 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): # Catch possible read timeouts thrown as SSL errors. If not the # case, rethrow the original. We need to do this because of: # http://bugs.python.org/issue10272 - if 'timed out' in str(err) or 'did not complete (read)' in str(err): # Python 2.6 + if 'timed out' in str(err) or 'did not complete (read)' in str(err): # Python < 2.7.4 raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) def _make_request(self, conn, method, url, timeout=_Default, chunked=False, @@ -375,7 +375,7 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): try: try: # Python 2.7, use buffering of HTTP responses httplib_response = conn.getresponse(buffering=True) - except TypeError: # Python 2.6 and older, Python 3 + except TypeError: # Python 3 try: httplib_response = conn.getresponse() except Exception as e: @@ -801,17 +801,7 @@ class HTTPSConnectionPool(HTTPConnectionPool): Establish tunnel connection early, because otherwise httplib would improperly set Host: header to proxy's IP:port. """ - # Python 2.7+ - try: - set_tunnel = conn.set_tunnel - except AttributeError: # Platform-specific: Python 2.6 - set_tunnel = conn._set_tunnel - - if sys.version_info <= (2, 6, 4) and not self.proxy_headers: # Python 2.6.4 and older - set_tunnel(self._proxy_host, self.port) - else: - set_tunnel(self._proxy_host, self.port, self.proxy_headers) - + conn.set_tunnel(self._proxy_host, self.port, self.proxy_headers) conn.connect() def _new_conn(self): diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc index 37e36be0e28dc263a0cef1324dae9bcd1d836309..278aa271318ffd26314f0c1439aef43da62f187e 100644 GIT binary patch delta 38 qcmbQkIERtPiIh*rk?>}*-@IhDlRayhQzh-YJWRl?>F<_%=1r| zf4!Kzlt@G+{F&d#d*3e~CuLSRUiu;v)8fWVS5{;u4bmFZ62}i0_X79k`22mQly@a9 zsii)bv=oni=2t4Hr?m{~86H9XIn=Y-H0sklje3>KcWO!vv98n+7nB9WMP(83jB-Zv z-89;84da}4Ffb3-+WW#6S;=HEW*1-EhY)6v6+4mLjcHUMN028tVH-&^WRnrDl%VFu)ed)5 z;11~A2J*O5j)ms~v;%jl&7IahRK#+jgq&9jn@k=a6{gwCUS-P^nOqhq;O-v z?Ve@YTz&sTc!8o;#m_TW(_?j$aYxkUAK3%(huqq{7rx8xMD8=hD8BTKX~C}pcYR;^ zzGO#1C)k#p&{&igA&zEm-lQ^If7kAeYIz0KMqsQsGPoHFbexo?f%_iS)`+_q-Bx>G zX{Un(bun8kXX3QPr(165(!k;NwOit1aWPNZR}#2$?|?ia*cBfYH}Y?yXR@ak#G_&@ z5oG~-PR;D%IHvs$VO z^OSjk;CX@s!Mg-I1Q!Ul2sQ{#nLWuH^jTq-t7m7?-ByE!rNpG z8CD0|)q#@OuipOH4FNysbK8L!g{%@#kCb@d(Tx>H?{cf}c=aez&qUKb7#)%XX$sAC zEURPim6JaWl=RWW$F6mI7C4syEN~-uIc{Kf4&WWbwj{OwZ4%vkpyHJ{PR3gS%*p%t%lXYkvoZmw}_!gFnK!SliGIVR*;RJe*h4ZMBM-Y delta 2102 zcmZ`)&2Jk;6yI4p>y6|1BXwdYb{r@Dh+L?XrctO=0ZpmnMi958rG=$v<$5OWCboAw zyH1-@gZ?Y9ut+&>_JM%*CFD4SOrVPzh0d&F>qTFAe zAA$)#f{;Y$S?i8QP?iFC8`}RHQ@cO)f7++TrA{ozUe(YvkBE zLwI3T8qA8nW3?0t3xrP|SRi=({W+-%N}aE>do|PBa+n{&(Pp*bYf^M;uif2$a9+m&ZAn7J_?-p}hRpIt|P7 zHO`v$Ci8>qw$MVkF`8Q+#JgcV^oYm2#AcE^ud?Jmt*t8mvP5|L!TAD zjZF>eBnW?<=mEgpV5X0ds0e50X2)<#20<3rJd6rzw^%TH2d%+f$bL&^MPhvGBLnp@ z0AF9@cGI+4p3J?Z+hR4(4{}ze-BQ@^rx576$fF5aDhF7f5r2$dH1=N_KV+KJu9+s! z;Ou&DFpl>NMysVL3Uqc@(QfyqX>t1^CPgMw>AS#TzGjDm`KUK81xwCVMUK&ZZAVS=RsCvRDu=GVBP(pvTfJlAzySl zPQD~B*$iI;4b)p5I({4BWqIP5#go1C0Iw*KvVF{uvy5H0M%Kv_6+T?*Q0Zz<~y7&jEw1% O6}k5_I!u1Zy%+!jCNdKM delta 170 zcmew-(IUy~#LLUY00dF<)ne*4@_u9HNG?y$%PJ`}nas^n&G=_>JBvC`CPOV_3Udu( z3X2WHsf*m5PRxV%$S3v?ZGGRsnLaXIJb<)tQzRvcUi7y7^1ZF-)Hbwy^7RJrj UI9(VSGbT%O?`L$Je4BeQ0P5*7*8l(j diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc index 9e2d45955a31578daf9a9f98ccb735da439ace2c..22869170e4527626eb5c4363c953f15d61a6c7fe 100644 GIT binary patch delta 2259 zcmZ8iYiu0V6`nggJ6>-bZ|vRpk=XIZ&DvQzcI?C(AjBjDClm;V#4!+uWSQ)Y?eVT> zmNVlQtVw{N1VVV|AV7$RO@gResRAt`NC<(1#6J{O>JJzmQrjQ>Lq+?GN>$UIb2n^N zW;EZNx##`3cV2P-T&&-}c5PIl%emBY;_C4G_3zb2%!ikp#lgwx@)x!L3=axM(%o&d3`pHvP(l#BV&vJ6EX_?G-k_%Q6EPoE1qHA-BhJTr#3-)Bcj_5p!wvX# zytlueMb}0eA|fI*DGqyRrJ7KfKGx848$I4<*q^w#)o<_{OX^D8ubD}#iYL_(?vqy1 zR@R%kS#wso&TA@vm&k~{8Y#+Rv=K2y?L3j-=9)^r7BrKnN%ckbVM;Hpjs~HT(J|l| zNvp7dUXa1jrcHG}5b3cYT~Tqq=@F5^e>63VzhiClU|n-iGi`W=?*k0u!R9N`AT(v%oTC+&jexM>07x6G)ZW}W&Uyyx>G=f%ro2Ei4c~x6>>zxC7_oAC(|{1iaiZg<(;Q<^ z3s!EPqVrui$?92#hZv49ur)Zvu#X|fU@}+?lMHc&DF)69rWxu8(i&6)0-IM4F>n(k z;I$?_oTslX*q*doWl^G@<@@%m<<9xkD5+j2gD;TW4R|H_S%ZvP^DM`_9x$HYobLU9 z*OdgSVW&eCQ#0)P5PrLPi`b2#^L63ko1GhV>1GB$?d%f=@Nb>tjnYNLo1XJccft9& zLt&rP@4~{b&JR35)X{VeR2v1X0>>DtRSd#%^HkNDdk^l}a;1%hClXVZpDkJzWOEky z_N1LNd<#xuEOkp{lms|v98V33V|XrQ#n>g8Vvo||zfv32JdaB&4s_j_kZiRQ5Id4G z&vms52Y=IbVE8^-0-i9KVBk>zE(7s?l)o}qnEP@)h=-aO2UBEYcCOTLU&Js+lp~1;s=lwi6Bhu_SVn2`D zd&gU)V2sN?Z-G6zl%1smTNdh#-VX5+e$snVoW-_ndn-{@)So8xS8-|E9-Y;L7Od-Q z(WDaZsb^{JE&OrYrR&Byikw}XrmhxjPtGv@u5YV&8~@n%E*UTNcZzX*tG_q=B5A%` zzSVRLlA|koo{rEQF6r_h;kBJNc3hzEKk$I5L?{CIn_6?6 zUw6YYjt_N;lejpvU+l+^haQyYt~{DxEs4M>?9L3Ye}hO0$jIf5Da)&r>Ly&u^oT58 z&J600v*@k(P3HG4&#xS|;bl$+E>L1m$GRdz>mJiZou;XJXx)+j0)dz=EC2ui delta 2122 zcmZuxU2GIp6rQ_3v)k?8vfXA|T9>uZy4(L{X)Cp~q%0W1kI)t=rF2<#hIZTSPPsGv z0k;r-!~y|hP6CQXT1jjq5heS8!3TXZN-!oq&I5^>h)+Hkj7E9zoV(Db#7X9xGv}Op z?)lC+_x?O_O)KgyEObfu4BV(0oawkz^m(2$F+H3fHI8k_ev|jNJsd=%!W7FnX_jSJ zMmo!8B|{ozignD+*JY%6i(*?qT}JAaLiTu;W&bU{!#V@_Bp5};$BM5V-(Gz69s~-Q zlE&FAW715!VvS0N*3VifSjMuzxCe$j)%l+NQijdjGSUKrTb{p|9X=|lgNG$y?;^!1 zK#=4Di;KCKo0UPxTMK>O2#dgHJ|Eohmb(Qpm$S%;9xle);eofD-Gg7fm#Z?C`BjEv z)U&{%#K@Mh&6g;$;y5QgwRp4dm$tBurL4wVR>lYMt3xW(AeJ9EzWTCurkWbPJ2#?@_FI-S+I!5Ap+%PzQ z1@g-7!u_&I`AanGLD*UzD9n?Y+hSuf^H}+g>_qt^7TiS$51>xYKK3^=)(_Qzji-pFna9<{6cREtevlRo5*#8B+$lDX5p)t9 zCWsRpAxIFE5GVwqWGYD_J==16{3vNxW|hxHr$*3H0lx*3;T%bQi6k~%@S|YQlS!hk z5zf5$^(w)_rmJb?DFNuM3e~MlB}Zt9M#!2AJS>ue#j15I3=gV4U@1tht&qj0!*FqJ z1M7e<*6wqQEu8wuq@ifj>0Fa#ehgQ4L)*H!#(gODg&cgT*IZ1{>lA*esHR;s^x0}M zZUaa4UF`o?)vMV-FsnPAJ5Wp6L7*ng_CQaKT1dh16j1Ek>^S8ZS0{D#2>eu|c!b%K z+nQqLd>r}lH$Jnb?4!qx_#_4?5X!byuu4_)EBTzFjqf>x<~b0xorM#@p)YQHbfgb(D8Ib02i0Y z`~oVk!o7x@s2pnau^yOe46^s&M&lxCUTvyE&1h4d{R;Yhn7!U)W%4a5hXgm9+tK4; z^R_PHZ#okyH|Rn!9b@Wo5;&kL@GcW3S@qDF_DIGo*)=1Os273(UW zQh97d(~Wd|Ts5tU^bFq)S0ZcJr*J!x>_0(!QS(ga1PvrNj&mx#DbqPuIj2&J((%hA zQE~V+f(3%*rU^-m!WuM8fwtiQn}_c<|QT5DK7Nv>V+aqI1} zx5(9|Bol^dPa5jD&fg^CIHcNwtx*!a1f>Lif_8!(2&SwZ8O3&Rab#vmO=S2S+;6*3 S>~}`oCuLS(vsq-TyXQaGP3Xx0 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc index 9ab99354f010a7066e2ac9e81fe22c37df8a4bed..cf2355a1f0211394c669ae3b869fb847f179f471 100644 GIT binary patch delta 37 rcmdnn&A7Llk;jRbmx}=i@)k?PZseKD$&pf6nO9+$ma%yyr-%&z#0Lu2 delta 37 rcmdnn&A7Llk;jRbmx}=iqUNi`Y~-2B$&p;1o|jcpXtH@Fr-%&z!z2pI diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc index 930a350d27c93e539746e3308e2e05e5b9839f63..881d9f511d451db11b08e14d685545b3b325dd00 100644 GIT binary patch delta 35 pcmeyT`cIX|iIF+PDk(JCY|MU|8vw1~3KReU diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc index 329bd6cdc3e57c3baad902df8940b1f5c4a2fb5f..fff771397003157ee61c3f3f49afa03023a82be2 100644 GIT binary patch delta 38 qcmZ3>xR#N}iI&^NZBmn@jbqS{c delta 38 qcmZ3>xR#N}iI&;pWk^lg%?FkzI diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc index 16c22be74f53312cfb1ad10b04fb2a4c04856dfb..2862f0123df4e4df7d85ac313a9757f4c95a80ca 100644 GIT binary patch delta 42 wcmbOeFeiY=iIF+PDk(JC+$1Q*!+2}+Oxb2G0Q61_bpQYW diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc index 8974672091fa50fab747f00b0233bb41e2aabb97..eafeefe6f13e61acc5382816e0f24c7a02030a49 100644 GIT binary patch delta 35 pcmbPfHPed6iI= (3, 0): + if name is None: + return None + elif sys.version_info >= (3, 0): name = name.decode('utf-8') return name @@ -223,9 +231,10 @@ def get_subj_alt_name(peer_cert): # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8 # decoded. This is pretty frustrating, but that's what the standard library # does with certificates, and so we need to attempt to do the same. + # We also want to skip over names which cannot be idna encoded. names = [ - ('DNS', _dnsname_to_stdlib(name)) - for name in ext.get_values_for_type(x509.DNSName) + ('DNS', name) for name in map(_dnsname_to_stdlib, ext.get_values_for_type(x509.DNSName)) + if name is not None ] names.extend( ('IP Address', str(name)) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc index c4fad728712c2de061f02fc068c5a8582807e29d..b7b857635fd4873901f8393de3e6e3f1f776cbec 100644 GIT binary patch delta 32 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 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc index fa7a7a71ffce9605700a808c012e30d976543760..bea292662f4af51d62dc73857db02b867f78bfd1 100644 GIT binary patch delta 69 zcmZ3sk8#;PMjj_#UM>b8$XhHCyOC!bKSxSoWnP70TE^y6{L9=JKTj?UTgo_jvUqqA Y#wnZMN1HPP03+%cmjD0& delta 69 zcmZ3sk8#;PMjj_#UM>b8h?=h!vyo>TKSy$TdR|sZp~>b`{L9=JizgR`EoGcESv&p5WBmn@hj|r6k delta 38 qcmZ3^xSWy4iI&jXTk^lg$2MGxP diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc index c34676cf5fd72631e8480690167ee41e52e66aec..cabc3b0fe5c8abdcf7dbd148348e6e2ce425fe2b 100644 GIT binary patch delta 306 zcmXwzF-yci5QS%UH=Es!L6Ji&t;ALkuFpS^!$z=M!f}D1$rcK;9GK2Fjh%PcTAcVN z4*Um}_7*laHck$2rkFP$kH`DAUp6oD+yPJhe0a5b&3AFWhX4TxJM`#hAHONhX!`B?T4#^@V$19dHX7w@i z4`yaV1d|b0`y8q;%}qVc#aCtBfqSSj(6%hRnCj^qvSNJx*t@qv1JJ71LH=D7Wq=h$!0lGQJRnN7<8 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py index 75b80dc..740db37 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py @@ -16,7 +16,7 @@ def backport_makefile(self, mode="r", buffering=None, encoding=None, """ Backport of ``socket.makefile`` from Python 3.5. """ - if not set(mode) <= set(["r", "w", "b"]): + if not set(mode) <= {"r", "w", "b"}: raise ValueError( "invalid mode %r (only r, w, b allowed)" % (mode,) ) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ordered_dict.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ordered_dict.py deleted file mode 100644 index 4479363..0000000 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ordered_dict.py +++ /dev/null @@ -1,259 +0,0 @@ -# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. -# Passes Python2.7's test suite and incorporates all the latest updates. -# Copyright 2009 Raymond Hettinger, released under the MIT License. -# http://code.activestate.com/recipes/576693/ -try: - from thread import get_ident as _get_ident -except ImportError: - from dummy_thread import get_ident as _get_ident - -try: - from _abcoll import KeysView, ValuesView, ItemsView -except ImportError: - pass - - -class OrderedDict(dict): - 'Dictionary that remembers insertion order' - # An inherited dict maps keys to values. - # The inherited dict provides __getitem__, __len__, __contains__, and get. - # The remaining methods are order-aware. - # Big-O running times for all methods are the same as for regular dictionaries. - - # The internal self.__map dictionary maps keys to links in a doubly linked list. - # The circular doubly linked list starts and ends with a sentinel element. - # The sentinel element never gets deleted (this simplifies the algorithm). - # Each link is stored as a list of length three: [PREV, NEXT, KEY]. - - def __init__(self, *args, **kwds): - '''Initialize an ordered dictionary. Signature is the same as for - regular dictionaries, but keyword arguments are not recommended - because their insertion order is arbitrary. - - ''' - if len(args) > 1: - raise TypeError('expected at most 1 arguments, got %d' % len(args)) - try: - self.__root - except AttributeError: - self.__root = root = [] # sentinel node - root[:] = [root, root, None] - self.__map = {} - self.__update(*args, **kwds) - - def __setitem__(self, key, value, dict_setitem=dict.__setitem__): - 'od.__setitem__(i, y) <==> od[i]=y' - # Setting a new item creates a new link which goes at the end of the linked - # list, and the inherited dictionary is updated with the new key/value pair. - if key not in self: - root = self.__root - last = root[0] - last[1] = root[0] = self.__map[key] = [last, root, key] - dict_setitem(self, key, value) - - def __delitem__(self, key, dict_delitem=dict.__delitem__): - 'od.__delitem__(y) <==> del od[y]' - # Deleting an existing item uses self.__map to find the link which is - # then removed by updating the links in the predecessor and successor nodes. - dict_delitem(self, key) - link_prev, link_next, key = self.__map.pop(key) - link_prev[1] = link_next - link_next[0] = link_prev - - def __iter__(self): - 'od.__iter__() <==> iter(od)' - root = self.__root - curr = root[1] - while curr is not root: - yield curr[2] - curr = curr[1] - - def __reversed__(self): - 'od.__reversed__() <==> reversed(od)' - root = self.__root - curr = root[0] - while curr is not root: - yield curr[2] - curr = curr[0] - - def clear(self): - 'od.clear() -> None. Remove all items from od.' - try: - for node in self.__map.itervalues(): - del node[:] - root = self.__root - root[:] = [root, root, None] - self.__map.clear() - except AttributeError: - pass - dict.clear(self) - - def popitem(self, last=True): - '''od.popitem() -> (k, v), return and remove a (key, value) pair. - Pairs are returned in LIFO order if last is true or FIFO order if false. - - ''' - if not self: - raise KeyError('dictionary is empty') - root = self.__root - if last: - link = root[0] - link_prev = link[0] - link_prev[1] = root - root[0] = link_prev - else: - link = root[1] - link_next = link[1] - root[1] = link_next - link_next[0] = root - key = link[2] - del self.__map[key] - value = dict.pop(self, key) - return key, value - - # -- the following methods do not depend on the internal structure -- - - def keys(self): - 'od.keys() -> list of keys in od' - return list(self) - - def values(self): - 'od.values() -> list of values in od' - return [self[key] for key in self] - - def items(self): - 'od.items() -> list of (key, value) pairs in od' - return [(key, self[key]) for key in self] - - def iterkeys(self): - 'od.iterkeys() -> an iterator over the keys in od' - return iter(self) - - def itervalues(self): - 'od.itervalues -> an iterator over the values in od' - for k in self: - yield self[k] - - def iteritems(self): - 'od.iteritems -> an iterator over the (key, value) items in od' - for k in self: - yield (k, self[k]) - - def update(*args, **kwds): - '''od.update(E, **F) -> None. Update od from dict/iterable E and F. - - If E is a dict instance, does: for k in E: od[k] = E[k] - If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] - Or if E is an iterable of items, does: for k, v in E: od[k] = v - In either case, this is followed by: for k, v in F.items(): od[k] = v - - ''' - if len(args) > 2: - raise TypeError('update() takes at most 2 positional ' - 'arguments (%d given)' % (len(args),)) - elif not args: - raise TypeError('update() takes at least 1 argument (0 given)') - self = args[0] - # Make progressively weaker assumptions about "other" - other = () - if len(args) == 2: - other = args[1] - if isinstance(other, dict): - for key in other: - self[key] = other[key] - elif hasattr(other, 'keys'): - for key in other.keys(): - self[key] = other[key] - else: - for key, value in other: - self[key] = value - for key, value in kwds.items(): - self[key] = value - - __update = update # let subclasses override update without breaking __init__ - - __marker = object() - - def pop(self, key, default=__marker): - '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. - If key is not found, d is returned if given, otherwise KeyError is raised. - - ''' - if key in self: - result = self[key] - del self[key] - return result - if default is self.__marker: - raise KeyError(key) - return default - - def setdefault(self, key, default=None): - 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' - if key in self: - return self[key] - self[key] = default - return default - - def __repr__(self, _repr_running={}): - 'od.__repr__() <==> repr(od)' - call_key = id(self), _get_ident() - if call_key in _repr_running: - return '...' - _repr_running[call_key] = 1 - try: - if not self: - return '%s()' % (self.__class__.__name__,) - return '%s(%r)' % (self.__class__.__name__, self.items()) - finally: - del _repr_running[call_key] - - def __reduce__(self): - 'Return state information for pickling' - items = [[k, self[k]] for k in self] - inst_dict = vars(self).copy() - for k in vars(OrderedDict()): - inst_dict.pop(k, None) - if inst_dict: - return (self.__class__, (items,), inst_dict) - return self.__class__, (items,) - - def copy(self): - 'od.copy() -> a shallow copy of od' - return self.__class__(self) - - @classmethod - def fromkeys(cls, iterable, value=None): - '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S - and values equal to v (which defaults to None). - - ''' - d = cls() - for key in iterable: - d[key] = value - return d - - def __eq__(self, other): - '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive - while comparison to a regular mapping is order-insensitive. - - ''' - if isinstance(other, OrderedDict): - return len(self)==len(other) and self.items() == other.items() - return dict.__eq__(self, other) - - def __ne__(self, other): - return not self == other - - # -- the following methods are only used in Python 2.7 -- - - def viewkeys(self): - "od.viewkeys() -> a set-like object providing a view on od's keys" - return KeysView(self) - - def viewvalues(self): - "od.viewvalues() -> an object providing a view on od's values" - return ValuesView(self) - - def viewitems(self): - "od.viewitems() -> a set-like object providing a view on od's items" - return ItemsView(self) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc index f061e45aa8d0c5ca6ed62ad33950f22eed1a60db..23c3fafe56fb1daef408c241843136febec4118e 100644 GIT binary patch delta 34 ocmey*{GXY}iIF+PDk(IXJcBVE0HI_G0RR91 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc index a083eea3defffdc9697d5b98e32faf5f2f0984da..874224a3069b302e6fff9290b632619dcf057a86 100644 GIT binary patch delta 88 zcmX>mc}$YmiImc}$YmiIF+PDk(IXoW|@20E>|b`Tzg` diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc index 40c054af5aee3c486433b7f7c559f791ada05eda..046534ffaa1be601afb006781dd9f0e4bee38019 100644 GIT binary patch delta 800 zcmZ8fTTc@~6rMA?bZ58i0)-Utf)|XY5=1nTh{i;;#!F(1N+L~gQ#xB&Y^Uq&f?!H` zkY^LJf1t!C9}Pc2;FISpF%o8SzB6+!-<~~ZzK`sWy7R@N!*HpOqf4hs zyY48c-3ycVTe-GXvw%rUiXB!HK3}yZm%M36TRJ;Xb7Wo?(36)%>7p*kemQ`;=ojVS zd#JgRKVy~B?uUoRe{tlmKw9$ZVd$$@f$}|Htp~cJKL7j%=LNbyFbU}nO30bJ1T{)Dk$f}Lzy&5OjDf}fEd zK#?qi4ei%s-)nS~@*8o`QD+ic+^ROqghn&63RhVUk>ZefhKDM5NH`F#CZoLT1Jqt1(I*^nDt0xST z%vTNlbn|S?dmPW^9>#Q`*VkpzX!1S4aV0g!8OyzP^b=sT7n$NOSQqq5478Fh=h3#% z)WzCx5FMIFR9AAjv!RF3m5P;mxfZW!-}5v*n1fQx zxAh>_Cf)lGQVS;+>tH$i2knx5gkX|@rjxZ*6S2Nb@V}z$l)VCRv)z$vEr0wLwLcn0 Tpw~121w$M&!M!Sk$cyp6MwO+{ delta 684 zcmZ8e&2G~`5Z+lk_Qp;^f&z((gaDx;gZhJtDp4vVN?VB{ae(sEsFD@DPDw}|vvw$; zL`9-65c$T1aO4K+fj8jJ)sH~mfCDh&2!XoRd^7XS&S!h(u>QSPS}7JShNtmidi!g6 zRI0<%(WNWP2drWEykkl(c}tU~6bH}{GA}Kx=0P0oPJ0Yhp@=(t;4e7PUXSd5anV diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-37.pyc index ed62fcdcb5e49f119a2d6f14e1593a3ff920f466..7e5a1eafd6bf8df2d1bfc75a7052443a8f7937f6 100644 GIT binary patch delta 35 pcmaFL{*;}^iI2>_xX38nx5 delta 35 pcmaFL{*;}^iIF+PDk(JC9LhL>2>_uz37P-^ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc index cda3ff7e8d5148b65729fd6f2c6cb203d70a3e44..06c77462a6d679b85ebe7e09ebd5301ba0b288c5 100644 GIT binary patch delta 35 pcmaDQ@k)ZniIy2X=O9G_d7Q<7PbSX6S0HL0>BwfGiuaY<1T$O28)TkILBi7BZ?#YOx;evtr( z5Cjsp*b5RXbMg~YCJVA^D@XxF7zB72*%*14cz~FNk%gIqk&TIuk%ftau}E%n7;6Zl jus2XqF$YK~CmSOdBTzzZ@?JI{HaVaOkjc+(%%}YfiJV4CC$im3R#KBl3wRt9M2&1qo$XpJPB2G3&E=Hh)(j;~tHYuP$k<#QKc4J0) E0OOV&EdT%j diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc index 9ccaa2ca3ebed1fb4fab006005a1eb268a19d901..1fe8963358ff748bea2204b301a38f27faf8da8e 100644 GIT binary patch delta 387 zcmX?{bR>z_iIy6r~myn|uN(g8_=30)8?dh2nNyNlROGfkV&WFUx}0V1+NL^+74nEY73nlW&4yn#NOA4tG^@)QFP#>&Ze4blMQw_`v6 delta 378 zcmX?-bU2CEiI6B93E+~)KAf$SW~<>`4@C50xNHN+KJ z7>hT1Nq=Et44Z5(C(0N!d83N( za(lv*6-8~HFaMZPHyR`m3nY*=fXyf8mihO>Wm$umw9f45S6@L%4H`qCjE^ sAOd0_h?Nc^vOq)`h$x@@M8BFbU~+0HTLr3IG5A diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc index b2f977abd6d1fad5ff1deb8e3858b16cc61ca02f..d9c7e1fb60a7ec9d41dbc81e37663e03164a9b67 100644 GIT binary patch delta 1371 zcmYjRO>7%Q6rMNxll88>b`#h6rNMTR;*!t=lQbzM|F&p>1e`{IMc5{u4RPW+?d-Nn z(1wE2o+4E$qY4T2kf`@o$agrDD>o35C6IbRf&&LQAR#Wi*;I%f&G+8C_x78g_hx>2 z>+q628;h9)zxuWR9TGatmQV8HD<5~T6AVJi$&4W!Ze&d&WFW!Eq}mG z@r|+4eh#U)~jXaAGe?=zXjuV$wGPSO=yAWHVBQK>dQ=g+@no3M{#bQ$G|iQi+rJ$KRP zB@qayKy_VFQ64u#4B8nm#G>7Ig1?Fp{DOoj3De?%oo>5 zKa`FX0x=U{V78DOqDquTsR=spvT&15Lurju$cwh*Irv(Jb1Y zhryP?&!AVU(*TPwprNJ2=pGHIuP>5Nwmg$YC{-0R6VOFMi4zIZm?FpYtw6;BgMI8< z5gss{%83Rl=3Q$jDMh>WGA^c=i}7KU;a+&J)TR-d@%ch=X8Fy_&fLYfUoVuFnz6Y; z>9SKQyt90n&>wVf2Qnl8$SDC}y_0=0S z->JCV_pqLejr{Wmpsyn(pAz4u&sgD-K9b`L;_vkEn7paHAi+Y&MVqR(UD*n6)Nw6` zOAhZ)QAUN^m=I3p6u9D(%z%{zT(sOHNs7mr5#Zu!rZf35j(xHTyvwHn@fCbbxd0nvjYpDiF*SRZ7&(!M!S)~m+iH16JXB%3zg*-82|tP delta 1833 zcmZWqOK%)S5bo-E?Ck8ruV6>E6OSKC*u-%XCyw*Nkob`YArHrqh?Quw*&f@o-pp)z z+DSGV%ZMZr2n1640OA0SkT`G&Xb%W+Kmv&iR}N?-5D+1eV^Dqo)w4bz80~&t{Z&_Y zS9MkQ`srU@%OB6>Y=YnXC)=+4aNx`QfNqs zO#}j2utDxMI_00n47}PHHrrtB3MyPO4~)!H2Ci1ob)u1F2znV^CcaJyklGHWDa|s> z8%$@$eKKz{lclgtu~wF5_I;SQScYYhNwYSVXD!Is%);Ha^F6pkfpQC*rzs`FQ>{sj z5}gok$<@>|xGMweYS$rD@WV>0@uNy^67q>P2oGc`{V+GK*!0E-`C0l9ye)rA&#Y}m zDk2pU<^?dg2X8_I5h+qel91hfcsW?%&MlXRUf?^yf^)tumQZ4W8#;a>K zu2Ozf9=CV3y^ozx1(JXX6ii*-wRgju{M_ET1D&_{lt@Rg08GQ4?Lnk}K;OfhX|j>7 zWJVfK?Ux~=qTCGcxZIa5oJbbR#MbQ+_tF0_)|JFn!X_uOF;;aCDA=dqxPmPT5_1Fh z`Ej-zPROsbeddSAhnwZE*)Gk5PWe1L02$ep8!E(FSP$du#$gmae<5hj^pcusLcuWw zQ}Rr%zw4HoCXZl2H`vt5Sh{Um>Bbwm#}vMhds_QsYsa<5e@x{efcBR{xLf5^Bnru*qj2DtQwB z;kyV}wxnh!g$t{CggLlu@m}m}K8>(|BP=gurWjqN5f%D5lC;J~YbLF(pCFY~M9&dQ ziYZ}5I@6ebPvg}{Ur$F`ZAsXV0Pu#0^kOE_8<^~PM=YoLTg*f@8|j$vsm7<9G-FL2 z&m7;6I8(?ag_wBE`;duqlhd!6;z8_nnm+8 z3wdfnD`p3;HiGT}pq*Mn_WT7|XHHcM{;)FT?^`-Xu~Ih*c68)`Qwp)1Tqg{x&W(Vr zRNeoVu_xt#D5qe2vPye8X74{!zZ9OBI|nc1Q20V%tiGSq=doL^Ke)O{bLx5|+v2A?SuL0EMHv_#8$e#yxZRa@mZM741O%k)6VjbaYkj2`dSQ(vQ zVxMz4Joutn!x8+XoF8264wX2kphrOxwaZExlg|csLnQl$`iCouIEN6M!S#w;7W|rG q78IzO;Yr+;-?+eqT$g+>bQVnc)6k)g!&Z;gWwjEpClV*Xp8N-Uyq>H8 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc index fcf7c239739944349edd78a670a8adb6a9da47aa..026fba1c41dca263ad63f3d63a3fb1cffc11c232 100644 GIT binary patch delta 35 pcmbR4GTnv8iIF+PDk(JCtjhOE7yz0+38er4 diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc index 96f664af559e3709fc1295aea02c0f934d0f5114..ec4198ac77639c42ecfefa50ed0adcd91b1a861d 100644 GIT binary patch delta 35 pcmbQJF;RoZiIF+PDk(JCT*^F0005Rb36cN+ diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc index 3b83d336cd5b3941ba97aeb106b1cd1e100c708e..1e6bd0d7125af2f919418c6ce0d730d78994ae8e 100644 GIT binary patch delta 588 zcmXAk&ubGw6vyA2NoL1Q*VdYn4MHLYQn!L>XrSWBU-csXpgE*H^iZ=2X;u>Yx{^jV z7VJS#FFJa!2;QZ41#hCBg}wN1c=Sy&!+hrZ-kbNn%xC|t@7?k|7kCXm`8yZBc;8Wn z`{Ti3z1uT?@Y}+BE+rU3q-imR5Y1N+9KAxANQ7rM64}p&q6o3-JCUT#7cjV-h!~H- zhY50@h=6*bu-bMXVL&xnG?OK);LQw^G{c9SFNlw0zn06WDp(jP82akex&qA(VJ@_B!yv!X6o9K#48bV=?MKJt`FpvmOZ}w$75#lUp zx1Ee6wVy+0u`e`^AO{1CeSi)_w7H!gVI=5H$i3e38if1}eCX>u#$yAarsvT~0 z1p^>mVQkpc9=mIb;|@pn2E)NQ4Il6b2GC~?@dy#tpp$bz3oTnB@~CWFm0xfu%h$=i zWju9DYubJEL^oH7_K2ogjQ6Oj;tX-oJ;eZyK!sCy23^4>FVzFL%qo@4Z&fJG+0^b9 z2%53^WefI26R-|cVHldLsjOo&v*KMhhpAUsG5@@L!e!~Tx#sjJ(rh4e5R`-^`@1he3kK%{{dw{f=vJb diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/connection.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/connection.py index 5cf488f..5ad70b2 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/connection.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/connection.py @@ -1,6 +1,7 @@ from __future__ import absolute_import import socket from .wait import NoWayToWaitForSocketError, wait_for_read +from ..contrib import _appengine_environ def is_connection_dropped(conn): # Platform-specific @@ -105,6 +106,13 @@ def _has_ipv6(host): sock = None has_ipv6 = False + # App Engine doesn't support IPV6 sockets and actually has a quota on the + # number of sockets that can be used, so just early out here instead of + # creating a socket needlessly. + # See https://github.com/urllib3/urllib3/issues/1446 + if _appengine_environ.is_appengine_sandbox(): + return False + if socket.has_ipv6: # has_ipv6 returns true if cPython was compiled with IPv6 support. # It does not tell us if the system has IPv6 support enabled. To diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/response.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/response.py index 67cf730..3d54864 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/response.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/response.py @@ -59,8 +59,14 @@ def assert_header_parsing(headers): get_payload = getattr(headers, 'get_payload', None) unparsed_data = None - if get_payload: # Platform-specific: Python 3. - unparsed_data = get_payload() + if get_payload: + # get_payload is actually email.message.Message.get_payload; + # we're only interested in the result if it's not a multipart message + if not headers.is_multipart(): + payload = get_payload() + + if isinstance(payload, (bytes, str)): + unparsed_data = payload if defects or unparsed_data: raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/retry.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/retry.py index 7ad3dc6..e7d0abd 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/retry.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/retry.py @@ -115,7 +115,7 @@ class Retry(object): (most errors are resolved immediately by a second try without a delay). urllib3 will sleep for:: - {backoff factor} * (2 ^ ({number of total retries} - 1)) + {backoff factor} * (2 ** ({number of total retries} - 1)) seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py index 3254280..dfc553f 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py @@ -56,9 +56,8 @@ except ImportError: OP_NO_COMPRESSION = 0x20000 -# Python 2.7 and earlier didn't have inet_pton on non-Linux -# so we fallback on inet_aton in those cases. This means that -# we can only detect IPv4 addresses in this case. +# Python 2.7 doesn't have inet_pton on non-Linux so we fallback on inet_aton in +# those cases. This means that we can only detect IPv4 addresses in this case. if hasattr(socket, 'inet_pton'): inet_pton = socket.inet_pton else: @@ -67,7 +66,7 @@ else: from pip._vendor import ipaddress def inet_pton(_, host): - if isinstance(host, six.binary_type): + if isinstance(host, bytes): host = host.decode('ascii') return ipaddress.ip_address(host) @@ -115,10 +114,7 @@ try: except ImportError: import sys - class SSLContext(object): # Platform-specific: Python 2 & 3.1 - supports_set_ciphers = ((2, 7) <= sys.version_info < (3,) or - (3, 2) <= sys.version_info) - + class SSLContext(object): # Platform-specific: Python 2 def __init__(self, protocol_version): self.protocol = protocol_version # Use default values from a real SSLContext @@ -141,12 +137,6 @@ except ImportError: raise SSLError("CA directories not supported in older Pythons") def set_ciphers(self, cipher_suite): - if not self.supports_set_ciphers: - raise TypeError( - 'Your version of Python does not support setting ' - 'a custom cipher suite. Please upgrade to Python ' - '2.7, 3.2, or later if you need this functionality.' - ) self.ciphers = cipher_suite def wrap_socket(self, socket, server_hostname=None, server_side=False): @@ -167,10 +157,7 @@ except ImportError: 'ssl_version': self.protocol, 'server_side': server_side, } - if self.supports_set_ciphers: # Platform-specific: Python 2.7+ - return wrap_socket(socket, ciphers=self.ciphers, **kwargs) - else: # Platform-specific: Python 2.6 - return wrap_socket(socket, **kwargs) + return wrap_socket(socket, ciphers=self.ciphers, **kwargs) def assert_fingerprint(cert, fingerprint): @@ -276,6 +263,8 @@ def create_urllib3_context(ssl_version=None, cert_reqs=None, """ context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23) + context.set_ciphers(ciphers or DEFAULT_CIPHERS) + # Setting the default here, as we may have no ssl module on import cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs @@ -291,9 +280,6 @@ def create_urllib3_context(ssl_version=None, cert_reqs=None, context.options |= options - if getattr(context, 'supports_set_ciphers', True): # Platform-specific: Python 2.6 - context.set_ciphers(ciphers or DEFAULT_CIPHERS) - context.verify_mode = cert_reqs if getattr(context, 'check_hostname', None) is not None: # Platform-specific: Python 3.2 # We do our own verification, including fingerprints and alternative @@ -316,8 +302,7 @@ def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, A pre-made :class:`SSLContext` object. If none is provided, one will be created using :func:`create_urllib3_context`. :param ciphers: - A string of ciphers we wish the client to support. This is not - supported on Python 2.6 as the ssl module does not support it. + A string of ciphers we wish the client to support. :param ca_cert_dir: A directory containing CA certificates in multiple separate files, as supported by OpenSSL's -CApath flag or the capath argument to @@ -334,7 +319,7 @@ def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, if ca_certs or ca_cert_dir: try: context.load_verify_locations(ca_certs, ca_cert_dir) - except IOError as e: # Platform-specific: Python 2.6, 2.7, 3.2 + except IOError as e: # Platform-specific: Python 2.7 raise SSLError(e) # Py33 raises FileNotFoundError which subclasses OSError # These are not equivalent unless we check the errno attribute @@ -378,7 +363,7 @@ def is_ipaddress(hostname): :param str hostname: Hostname to examine. :return: True if the hostname is an IP address, False otherwise. """ - if six.PY3 and isinstance(hostname, six.binary_type): + if six.PY3 and isinstance(hostname, bytes): # IDN A-label bytes are ASCII compatible. hostname = hostname.decode('ascii') diff --git a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py index fa686ef..4db71ba 100644 --- a/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py +++ b/env/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py @@ -43,9 +43,6 @@ if sys.version_info >= (3, 5): else: # Old and broken Pythons. def _retry_on_intr(fn, timeout): - if timeout is not None and timeout <= 0: - return fn(timeout) - if timeout is None: deadline = float("inf") else: @@ -117,7 +114,7 @@ def _have_working_poll(): # from libraries like eventlet/greenlet. try: poll_obj = select.poll() - poll_obj.poll(0) + _retry_on_intr(poll_obj.poll, 0) except (AttributeError, OSError): return False else: diff --git a/env/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc index d869d280e2f33d049294e9dce1d55d18db000f42..76f58c6e37da6ed78ebe161ed6798616ae9bf668 100644 GIT binary patch delta 35 pcmZ4By}+BtiIF+PDk(JCoXut`4*;R+36KB) diff --git a/env/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc b/env/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc index ffc978fc18c3ab8c86e2818a2734ad9dca90996b..4484d86735af801e6b32e17b65e6bfcdcb128fdf 100644 GIT binary patch delta 35 pcmX>ne@>pqiIne@>pqiI=iI=iI0;tYDXh$^FigwXJdbHUI{=`=3K#$Y delta 35 pcmdlhvR8!1iI0;tYE>F+PDk(JCJdbHUI{=^H3Jd@M diff --git a/env/lib/python3.7/site-packages/pkg_resources/__init__.py b/env/lib/python3.7/site-packages/pkg_resources/__init__.py index 6ca68da..97e08d6 100644 --- a/env/lib/python3.7/site-packages/pkg_resources/__init__.py +++ b/env/lib/python3.7/site-packages/pkg_resources/__init__.py @@ -39,6 +39,8 @@ import tempfile import textwrap import itertools import inspect +import ntpath +import posixpath from pkgutil import get_importer try: @@ -1401,8 +1403,15 @@ class NullProvider: def has_resource(self, resource_name): return self._has(self._fn(self.module_path, resource_name)) + def _get_metadata_path(self, name): + return self._fn(self.egg_info, name) + def has_metadata(self, name): - return self.egg_info and self._has(self._fn(self.egg_info, name)) + if not self.egg_info: + return self.egg_info + + path = self._get_metadata_path(name) + return self._has(path) def get_metadata(self, name): if not self.egg_info: @@ -1466,10 +1475,86 @@ class NullProvider: ) def _fn(self, base, resource_name): + self._validate_resource_path(resource_name) if resource_name: return os.path.join(base, *resource_name.split('/')) return base + @staticmethod + def _validate_resource_path(path): + """ + Validate the resource paths according to the docs. + https://setuptools.readthedocs.io/en/latest/pkg_resources.html#basic-resource-access + + >>> warned = getfixture('recwarn') + >>> warnings.simplefilter('always') + >>> vrp = NullProvider._validate_resource_path + >>> vrp('foo/bar.txt') + >>> bool(warned) + False + >>> vrp('../foo/bar.txt') + >>> bool(warned) + True + >>> warned.clear() + >>> vrp('/foo/bar.txt') + >>> bool(warned) + True + >>> vrp('foo/../../bar.txt') + >>> bool(warned) + True + >>> warned.clear() + >>> vrp('foo/f../bar.txt') + >>> bool(warned) + False + + Windows path separators are straight-up disallowed. + >>> vrp(r'\\foo/bar.txt') + Traceback (most recent call last): + ... + ValueError: Use of .. or absolute path in a resource path \ +is not allowed. + + >>> vrp(r'C:\\foo/bar.txt') + Traceback (most recent call last): + ... + ValueError: Use of .. or absolute path in a resource path \ +is not allowed. + + Blank values are allowed + + >>> vrp('') + >>> bool(warned) + False + + Non-string values are not. + + >>> vrp(None) + Traceback (most recent call last): + ... + AttributeError: ... + """ + invalid = ( + os.path.pardir in path.split(posixpath.sep) or + posixpath.isabs(path) or + ntpath.isabs(path) + ) + if not invalid: + return + + msg = "Use of .. or absolute path in a resource path is not allowed." + + # Aggressively disallow Windows absolute paths + if ntpath.isabs(path) and not posixpath.isabs(path): + raise ValueError(msg) + + # for compatibility, warn; in future + # raise ValueError(msg) + warnings.warn( + msg[:-1] + " and will raise exceptions in a future release.", + DeprecationWarning, + stacklevel=4, + ) + def _get(self, path): if hasattr(self.loader, 'get_data'): return self.loader.get_data(path) @@ -1790,6 +1875,9 @@ class FileMetadata(EmptyProvider): def __init__(self, path): self.path = path + def _get_metadata_path(self, name): + return self.path + def has_metadata(self, name): return name == 'PKG-INFO' and os.path.isfile(self.path) @@ -1888,7 +1976,7 @@ def find_eggs_in_zip(importer, path_item, only=False): if only: # don't yield nested distros return - for subitem in metadata.resource_listdir('/'): + for subitem in metadata.resource_listdir(''): if _is_egg_path(subitem): subpath = os.path.join(path_item, subitem) dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath) @@ -2583,10 +2671,14 @@ class Distribution: try: return self._version except AttributeError: - version = _version_from_file(self._get_metadata(self.PKG_INFO)) + version = self._get_version() if version is None: - tmpl = "Missing 'Version:' header and/or %s file" - raise ValueError(tmpl % self.PKG_INFO, self) + path = self._get_metadata_path_for_display(self.PKG_INFO) + msg = ( + "Missing 'Version:' header and/or {} file at path: {}" + ).format(self.PKG_INFO, path) + raise ValueError(msg, self) + return version @property @@ -2644,11 +2736,34 @@ class Distribution: ) return deps + def _get_metadata_path_for_display(self, name): + """ + Return the path to the given metadata file, if available. + """ + try: + # We need to access _get_metadata_path() on the provider object + # directly rather than through this class's __getattr__() + # since _get_metadata_path() is marked private. + path = self._provider._get_metadata_path(name) + + # Handle exceptions e.g. in case the distribution's metadata + # provider doesn't support _get_metadata_path(). + except Exception: + return '[could not detect]' + + return path + def _get_metadata(self, name): if self.has_metadata(name): for line in self.get_metadata_lines(name): yield line + def _get_version(self): + lines = self._get_metadata(self.PKG_INFO) + version = _version_from_file(lines) + + return version + def activate(self, path=None, replace=False): """Ensure distribution is importable on `path` (default=sys.path)""" if path is None: @@ -2867,7 +2982,7 @@ class EggInfoDistribution(Distribution): take an extra step and try to get the version number from the metadata file itself instead of the filename. """ - md_version = _version_from_file(self._get_metadata(self.PKG_INFO)) + md_version = self._get_version() if md_version: self._version = md_version return self diff --git a/env/lib/python3.7/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc index 132b9897e62e85da0b60f8a3ce131dff71e005c5..8baa11ef36695ba6e16e076e4a5bb63f2f7d4d63 100644 GIT binary patch delta 22347 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 delta 19680 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 diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc index d2de1fcf30f440e5b685ff1ef0281a5e2d08d4c3..b8e297be182672dbd38ae6666fa5458c5c7f23e8 100644 GIT binary patch delta 38 qcmbQsIG2&fiIb8$XhHCyOC!r4@XL2WnP70TE^y+Ja?P{$C?Z0 delta 37 rcmZ3wka6ikMjj_#UM>b8h?=h!vyo>j4@Yu&dR|sZp~>cxJa?P{#g&-(k%rSvTG6|gtkboSbh;ik5 zYI`lNpeT64sI%(2E1v5C;<@q!mGyRY*JBlRQUCg?=g0-Z?!T^;H+@u9S5;S6*X!5* zu)ECrd&l{^+q~7)U9z~=w=Ao4q4jy!(c)XHZ@2fvRaR{Gt)kxA z(fz%S>#40Rs?{?3Yd|fY>aE|W|Iw-G(P}#&)vC<6DDg)6@ihHgEeW`Vy3w*TmWcJ% z`8`raePCga&O&Up*7h6{e+Sj8Z2;Q?dwY%+?Hd%J^v*y+@4pKdx46Ulu1~tS%S!G0 zXxjEjzg#@sN5CW0UDlDJRO?vZ3*1+Q3lg(a168MY5Ph#fyR8KBJWiE^ALwK|FRd)| z*)i3ARaQk6cUikUPj%Rc8b?W)vYr0gDsKey_5DU<2dK`|M%@GqHv`;)#<2wjC6&bm z1!^aL#TSbJphkd?`L)m3_9aZ*}gF%^@QG>;OJ=mocT!0 zHGy{q^c5{vS^WlmN#g04)m!Ye#%3*d|Aj~~?|ZX4h~3tkS;IOvr3Plevf6Fvjvl-- z<1YGb%c?B;cW_f(qwOfG-OxT({~?3gK1IJgQgH`SW~KK{wN?+QbaOGZ0lIsv_@QM9 z4O*&atu;fZcW=T8Gw~caVFCS>*-6_=1tSI7k((ae!Y%QS+8gLLY-X%jVX4sr#4hXh z(PxPl1MiI9BizuhCq=zvT|f4PF0cXhI03tLQDLQ>svDQt8GNgk0rmmx z2Y3Zw1#`YL@aDKqf~@vmXV1@Ef$}8;$X3eBioNP@D0m&f1_0WSC}@Bf_;c2^iEK(Tc#Hb0&%m7_cWnMHpcW zwxitZGictj(k6Dz12c9^ncrJcZO3_iH5Fb}==UnH;c3ly)wA5BqLzBvvC3Ofxx`z- z60qYdi;HWN^7@Ls)wZ})ePmre@umcz3=i!i(p?8@)TH?dpHe9kj?9k7C&fv%+xSJwP9JRbxU?@l;4#-GvS9uh=9KH`oKPZ4RI*aI4(9QNwJi4oH_O&IuH?YdX@7G~hMM!p z1iqlZ>Ro`S#vyZ$+h}nIJ=?BDOAFP4Y8C?<3#r~$;$5cJ1+LGJbC5TQ+q)i(g&vVA86KE7z4>}RkR zR#ka@C1GFS#88{Mj&_0a`K#rbJQ|*arl)tAzd_Gf7Ls>y)6R)j&r5DjMh`QYVv5VX zg(@P<4%SDP+)Yc$hQg^Xwu|?f#Us`?h2y#$4)-$Cwc$+NN6pf#lA^NYL)6IQFcUAP z(!bEFNQOs>rV6&ilFQS1`UxW_r-~S#9kZmoj9kn6)+;5ai6hoOO2&_2qlK=_#AGQ) zhy5WcFwdDC+f`FlLNnCkGHOk>%Dm}mEbI5t21ZR{?L<0JY1SXSIxT7r%(HR7Dp?n% zhz|OzRN=I|r4>ofqjN-F5kc*-ekgsQOOzS*k!VXacudB3)mwjCFec%lFpfy~-PW*$ zy`Au~){(1HE&sxcMly|dU@wBzPADj>CgUM@n+w^12-a5mV>_z7RkowD#;@AzH8VvA zkrC)pHpr0_>CA2z+*lWvcO-!>EguOAaIe$t&HmAc*e*Mr;l}Z z^^0dj#H|idv#5?$XLNlv)D>0h*gOvfa{OhoE6;eN=mv(RI---Y<9h3ZC8No_)0d`= z2L}yiFR&_}!c09P1Usg%dd{?5rBTmXhBiHIiS=bmhlrlmy-WMKo<(IZ>(J8EMWz+A zY=0lNT#Pnsjvu21TccqIKet&3s@m25$1xYIE8-I}!5`(va~zMA$8V<;oL8u-y)(Sk zHRb;5f`anO%0)F*if0F?*-jsM0QT-mV#KWoK*9m=OOzN#$F7L65V}%68rpp52_21Y|b*1vtqS$!m z+Rl=iiYoOyusRBTwMOhL)_5~{2NCafOo_M3ztDD;)|8j4o+y!dxdv5qT0h&$Nn;&j zrogyB{@SY?NuVEcK?>eo#hU7gmbhwh#&L~{?Fvf>md+hl-Fp^$s@Uk{H`?G(g$*&{ zfWmW;AlPtPhA1J0qjBJ-2fT%bC`)H`=I6!3N!I^7QkqLaR3tmCIL(V$Pw0& z%r1fRulZQ^;fdv;QZi%A6+1?i(#lR^+lF6G@~R8e26&M`)rMS|j;3Y?vi5}?Q(Rf& z^HXoMSGjCS*1tB{y&Jd8qZa2H;o2!V$QMhjop=1P`(5D8U0t}u%h3@pyV13GXJGZ6uR6x@#8?h$R{~rP(1$vz zC3spxfE2@+9K}_&O}+S`z^0wwiwxenU5yUM&~-DOkR1qhRr@F>kQ{jYo(~)uphp_< zl~gY+^Dk5@(X<{^Ol+d|1^)8DOTuL=(Au=StGLm+fA?C?)-d*vcedk-l(%qEc6s3f z^?THDkS5fvfs6KRj~%jsin2+)9Qivc3aeBN8u38crJz9=m7~;G9d`6<0}~$`E+YN8 z1CXd~=+8*dmHkqvzuJz1SPuRIPd@I7>F*4;r4}2|c`gc;LLxMSVU9>?*s|28wp-sk zIe8j$<1)^!Cpu&RFmZN!TpyBE9f~a|GSwt>-1+H z>cU#S4ec_(PAK9HiTj6Vj%4!mi80pj0NSkvfFZCG3~h`x4u2Bqk+q~*$~_P z-0b)UHGvM#=Q>vL^3L0PCX=Gp0WVlp*8p4#um>Oj@Log|9ILQ}bw}BH)IJP=orJNX zRrm>0GIC=rtw1f*N7*7`CaDphXnKqF)r+Hrkx$_4mmDJVW)#!Eut=6uR3D%p)_F)` ziP_246)#`eu%6iOPhvU60|oYWv{3)W zn()fXZXH06*7Z;s>Z9|wgZ17k740CG22HHF2MUW{pfdF&wYFnmX4Q7+9EUAI&RlY*l3y?_0573`;R87{dsyyk!(*L=o(@_P_4`Eooiy#=;&= zq!k{Z85G8ATgwlQUlpgKB5YGIU6pv1w*(s*^)$LX1JFcR2!g_s>G>Awqr!AF5GJ=Y z5~cpn$54_jnYMMi-W+`#;U>J*QNAE_dXnrI8247fDTvtrw;QJNBtleWL(b*iQa=Y( z&E;%(wB3umwFRYRrIm^qZ7A^kx0m&7Xr3Vxc?m<0w(DU1>+MUsomlGD(u0#%Mdck| zTv=Z3EyiM6jWB+3jradU>P{nd=8x^Tk?5^4_T&~N-ch^|xX&IcTyR$u$9(e65EpCy zNh|$Or@}vBxa^R4+W7F3BMe?u+4(G{GEZo0VtfWLv6H!ls%*!UoP66kEobIT+ZEcE z@nnM|Q1|c}f8U`UiLU@P&sbLC0ij==B~t@+htF}PJc~MR@B*IR0Jtsi>Ie0%!EfUE zDgt(EiW>S6_F6us@;z0IM z^pupry3j0nUw@wMT7|(VNGXr@x1gwOfCwoQoxX!I9sxUf_OBdmFryh5GmG;Owez%N z&u608))j@zrWN{&7m_=RrDUlprzM?P+6|Q3tVh1?(KSeqb}aU?xfJFyoBRtwZ-`g- zH>bsf-l0?)LycPN5o^@ZbIg{st%7*eCjh(vvo3k9;U$bCf``B^hXq&BlkF}jEvJ}} zQo%d~9u|)yl+t7E_XLYE^k%|8iQ@qi9`Hae1hHj$-AvI|ToH)>;eKcP^`L;TA=J#o zzDKOX$0qk--kMMfMF>pkeV_}Cdj8Ly9VsZlCJ-GdJz#Wv{qMw37l$bK8RQ!uw#9O3 zw(#$OGLNH{`q*yDbNVQsRBb!)q#oCG4$;}gh>}h3l;Hgi(O-=CifOsc&ap8X^)=P0 zZvY+#{%`3iye1kfG1$vx=`6SK=$SF%SdPKg`ed;wH{rEg7fe#BQqA;NRz=ZMel9h5 zze^1GA6Sg!_=0D+g>;E)f&Vjt9LQt$91>% zA}uVpQSC*yq;)7qCt~#nh~_T6sJ*x?;paxeiBcYrNLjlvMlNwDEtiglKuBT07Tla9 z2L5ldNDa147OAJsOt*&21c{l6{~I42f|Pgddg^?%ZO8{4T59l;j{iRfq7QcxJ1PH9 z@n7)f&SJGp($Fmyhpzf2-(yfOQ;hCGDQ)_?9LUha|)GDr=mivX?x zK#Y#hF*CMHJ4t0t+Hn)wC+d_;vDl66ATvU#krrgq1oKn?Mutby#@vt8TC!8r(xAl0aYn`0uBZ&bE{W%9Ev8QK`&mW)b z;mqDoB3)ghznCO?c8(fCbTf-wg?d#+i)1T^PN2o4FR_!!G^=)cm=k z??NWZx2PmTdAfMU zWxNJSx0w>R%@DVb<@Ae7jfBe1B7pq?rHM^aZUjm*z{GEe;`*5)^VCK0%}jC3X++WS zVpbPzdX4SbDHA7UkDryBUvTcE3ujNCF|lC6l<_lWD&~my4Pe%=-IA1=ibZ=b6ur*E z=8Vn;lz4sq2@A=&hjWdifNMO!SOP7`D)`ie!Y9sSVa0PJ7M2=^K4$|kPmF?DWO#mMn7^J9n1xbRTIX^)5%w8ZkEA`uuFWw|AtpA7Sd zi^YgjXMR$N_#}q*6`7Zc4eePEzA*D@pML35kuew()MP{92f{;|2%%1DSqs5#i)aNP ztYgbXmsM=Pk>=)Y>Lw83D3Le3(eX9dkee9bW}=C6d*nIPZalkan~vQ!Fxu_d5fxD4 zfi{gOog8M1P9PLi5K#JHIWZH^KbDJWBYB$9@*mscnjf{?7EE<@h1e8FJF#

  • E|q6Xl|> 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

    F0Uqn<*O zrvX|C3qeq57(El^eMFd!X2Rr}#t&2bzs69GEsd6S+us;{6yYYk*;zg-bY_a|+%)dZ zgcA_4|L>d5;^Bj+%7&b)J(YeAs@lrg@MyaidX|<{R#nz2X0*A$i{Dz(tGRgwP2@Rr zJyI{l`tq%ddmLNp*5dt>mPh2>zPz@&+Eb2c)Q2$sl6ueoht!=$>dYV8aSPE~W9&&$ zCEi&)+jOrzOt|2vD1!Oqz)%-!{s}AdV3*QI&|P*#JZx(4lVb~>PucC%QCV(qX%dO3 z*uC69uWZNUDaE#P>XaEXY*%ny#)A!xKyByQ{oaFHlV1XA9HgH96Hn0 zX)oS!g=g{f8o(`0uY9o9HRN?XuO?u}Q^4pct>KV^z5gmM^(?6?^;Y;x%Y4So?X=c? zmfJ7vv2Ax9R*w0!in<4=wt%Y#(NarNU4a{x1gx@1B6MLz|=+= z_ki6yd)6G_WJa^_#Ns?a^>RD1=Q9Cpd`;<+sipq%1?0|RDOakhX)w&}B z-5;PwI~Hr%LW*#iP5y;=H^{5|>yu)F8!5HMP$Sm*t~KhrGtH7TQ9(TFV*s9dS(iM^ z@Z`m@Koi*IfM7K}+3u3cYKjIa6U<%UZgD??xkA={Hdu_I?Fs)xjs#3#z#W+lVoUVu z86r`vYHI)eea@scpn!lOSj|Me?^=hBOv+*2T2Ttd22AN4pbPeT?$2Evolt;9AR1D7 z!07n8KZs#24o>bd$glphEtW~MgttMN`>}-D*ltR5dMTgevz>TS59t=z+O1N7dY81q)V&~3``WoLaf!RI*Q&V28tNe zcRJ8f6o_T|myRT-Ly+dfx<``82+3?zlIW4b>ku>|R=IvWB(WdU1YV~QB`zsVv!keDXYPn?+^&6x=hGZX$dK2igebM1cOd?YsK z1I{cxFt79fkAdhzUBq3K`lsbt;D)YZg-qE5-C|-0ndA!=?T+d*yNi#gUUETNU~~^r zCfv)R_h7b1Kh#s)n}HG&dtcGaCKj>x4Q$91bA%i2D%2?8$`;FI4!bNKdjp85@x<)Q zn)47$SwG%eywGh1$RH!2&IecvfXEz+vcT3pVn%GYL`h|>>TwlX9qLX4#3gPl0+|uY zh#*-ls`SIdL^u7^05Kr4Elg=}oj6bwC-6*hDToB~S7N_jHBihnBjgE)PahsAUUerE zWe6_t{2=kXIQ?ECV>@eU%R{{lK3h3Lv!Jn)DyynJCAErz7}{sU>iVGGmq!+B{G$FL zPi!|iYj`=^xrin^#UlHFkkTe&Jw?nRb)_0EYxHYFL``S}^RPUBsF=qpOxG_D73Vd3 zN9rBcvLLW~m?)A14id8Bf+7mNnElnz5c&{|#q4-LZI#Y2Ii7>Yw|)>9f0|g4nA?w< zHpmOTBr#y2Klvz$?N^XroL`vBIlUi6rdq2%pD22DjhI1X0n7QJ-8#2Gbf1QvnmLZ= zvkl;cc^ZosELUFp@Sgn^yd4FAxJFGQkekF)39U7VV;>24Q-PS(nddo|;*7J}js|z4 zK~V0UCyDjT-#}wgz?n(PPtrqiZcMT2Ly9ggF33G6YCe+l5tvo&4oH|*l?QkE7X$lJ zfNdZK6IUDYlSkdHcv^|F+wpW4!1C>Y_W|q#*ag6gNsj6s#m~n8I5y=N>#zJ1fTJzS z9#fVLKlcHcxC>7l%)E)Gw*VkbiVmjc&n}r#RBVEZRqe9r&1ZOx(+(;PPu&6j1Mm&N z5&hI;an>Xrb4etXW(OEJw!)B5sQ_I8x&!n8$O6a)=mo$U9;##dU0&JVj z_}isd7Ky%tk17N@N~M9O6s;FGOLuDffU}ZqLVUvhE z4W(IN?l(kn-3&3{#6|J-3~|J1MA7*oRu?UIjd9qWCQK~IpIKO3a`wdYXPq;BLdp2a z`O{}8=7?7eVAil5O-ilBqCMw}-lt<(Mu!3_JYN6!1?1dA`NfgIbq2r~0#RfYc=Uv&`X;FJtBr$TrHKopamKUYkYXR(6fLki-q+Z~k0 zU$4BunJFyv5X+EjTb8%!Z%f4b!K^?QAWQ5_5I-Ja{cWBYdg8WrN~u^ZPG|K7{ajqA zE1`r(*b1Vte6UP3jf}7yP3OnM{GoC&;>4MsSRp=%p;g6zi^bJRtOsw1dG&&R{$i0e z1OwD$K;Z{MT^bLePKd6BK#zqq0}$4+)uP*Sw%>4dvyZwSL^wv|rEa8u&6eUO2e6rF z;@BQ}4z&Z%E?S^toehk3M|MOdlyacuB1#KFY|+_+k{SX^@2@6icIh9g#nh2J%xLH7V;n<<_E!&olxbiGLGdORW)Dj(N8sq z)B68l{s zXBkjzO$O!u4TEBWQLJj+3K19M#2Q;KvqWG0utOa21%Wwt(lwdh~K;WwYgHL&AY ztrf^x^I$FkmgcFbE#N<_JX=&K&P063$6|KrU)G3QOi0CDZl#)M&=}m2I-#u ziBqFaN)MxPL@EmijS(qNPe;?qtVZz{Hw6#fuMua6oApK4&^m6duD?dqjAC5pqt_kC zqR*|b^?NYgt65+$bgYVq2AOR>@O5`fT-%dX+ZSxHYIozQnO617mgpuv(O+01TP)N` z*NW-OLDP<#N)gKx?CaXD3FpxAtB|#&zzb7n87W>_eM(5}PBg;7+H_A{b!oY0nz0mR ztOJcI0pVUE^pfY_L!kMOhvFTfhJ5>7dyA1!T9i7WNl zTJ)#sV38K@8>?e&w6Z$xG5U23tGo7kF?M*gP>3~qObd(MEG}`7O)b4i+{+pNhDx2> zAcp9RZWfc4vyHSz#~2fmGPc`WYy7|B;mod*J?C(AyOjnb@wz!%tgb*M_OTb@X|Cy5 z>#&_D-cMw8?_0zd`8-p`nwDAMg~I^G!F1VygAJNXF)o|$$U^Xw^z=W9J|yTRe-w|- zE~APK@maG*_Uq#tIB;NYL#%nurPh(|wo(F<0PDw4!XIuG!>6=#$p4Ewj^84N$jls~ zsg?osLsu@t)1?G{bY{jS#8bZG!rR4zQezEY2?A~a9=|IX zU4OAn>>tK9n*vcVqEYk|3>|O`tJ+&j3TQpN^pAIm+fQYw$C%U>OPDvVkR7sPt9-sX z^3|cWVwZVn;naDK1A7ec|D5}2wxeTUEjW23_H4)iX^1k$|5l7 z9&wo*z+FubcNNxn)bY4YAHGl2^y5A{OdrFR)wWmRbjJ<%|2J#=@9r0Fv7ARJjwCgt zODrr@Fn44*X7kW@&x zCweOe>dSYE#sSPku-B~A=Iq~r06t+_riIb6DPPrDT%A056(A7alU~k zg*O2;LQA~hXIr}9DN&liO*tQd^gWwKrBh$OSG-oh-HPmyMLHeNoTI7vC`F}0!`Q5EYlHE6=U>F#1(C+BqNd0M zxf%lGE+2L26u9jf(P$R%e44+3&Xxw9D4mLk(AW=txPv@Uxg$)7&kXW;I6hj(tLbp~ zY2s2g&tSj!`~f=GqF*kaa`)>U&x)%}vN9X2V@D-4Yw%=$Ex5qiu|;ccyh+#pO{~pg z7E>Wj-o^`N*i)#$cKGQye^70ydf0Q~&gcsL@i{SSNTlabx)EYYwiwO?n2i!pQZ-|0@KTC$qE-2$W@!r*1 z#wHTf_4~xY39YzfG;L{u0=ELK5ebo42)~QmC=`%@2dJ8ya(`1q?qCOA?_7>?g zr4k(U_LP;DFQl&q?#2tw@3Te2NR^X7l+~mD*Q?^B6qqhfi__8G+JzoE!Mi;eVGVjs zT#?0OoB1iAgSuO}l5YB=*Tj+m%r5V$vFw6o`UKeQ=&LWA?xCf-r+guQPZgACvcBbY zaaA0&P3LA*jvn-eI6VPFyp>C8)QxY5VcmX0|JXKoO!C44WNGN&J6+x~*I&IMa-$|r zcq=GkV>~-`L!X#wHr%!b6DWIAyd|TX!<_wMh%sLr$uO47QWyuUEQO%?a_LdLc;Kb| z;$so#BNXi#dYq&5if=@Ed}&QtMd?`TSiC-TK=fPA7#;=QEYP|JR<{LDt<(+u&=F7i z`o|neyN&8ZKS4(+kJ2S{>b{V^Yv^Deg9q?=%acvRNm2I@^^j=Si4;^~GCxZ|mB-L7 zz4@TH_BhOh_xVc?iB&FEp4Oio5@Vz5dCJ>jV6W?;(-?CQ{F(U_)S&h+++oy(8XmM7M^f55!1g4V^)pox^`&4Ff+E z!^I44$YY^yepILu^p*21e|``)fM4WIk2x4&<3&bUNvyjczi}|^TfphXq!eU8+qv51rm8KF-&^!c zU9ER~FY*f`-Vjbty^mKAvP~yva3g?O6YwN~kwp7u^)=>_gXA{ZJw4_JF*S{SUTh7e zEO5<&1%gxcEkB4Z?Qg?#(CIz(gLp2%I5H}2aAfA_!-vFa(ffY*M=|(>#>SkV#3jcy zHjexx29G?pKRc!?t2{zS!A#aJ6QW~>#ahCYPy7Bpnzi{ZkjN=kbJ~T^U%K-LP&y8xXjff?vSJJqn|X{`m4Cq zEMK_Y0rZZ8$zYhktC#Dh$$k0U-Byd2OjPGs7Olz5x1t~w&ux}q@p_(+D@=-j+i~Q} z?T)rQ*{>6%yfK40;~6U$BA6M=WFC|CYf^6L#&sfrf3P9~f3?9>Ox2b{?lkKrrq3FW z>;W={mWwCEO4OmYec7ScI^`Kf$F`_QpwB(!X_7fSTKLpCMs9PMrAHFv$X3RoQBbf! zVYNvte(jbQ8VO*Whn7su*7BkG?D9By%84gW>^Qkz8o?ohZ201koh_M{nJm5LiHM`| zdVdF5ox`>H%v%-^{)UatOpuFCffH$vmoHP%1D-Gw&{;UXO-z)zQ4=pL+Fc|p6T-BO zUUYS$v`6uD_h%RpH{d}U9`=!;ZpYE?ObKNj=?rIZs8M>OqwJK_T2+CqR4NKEUTLAh zV&I{AA6R(+gxFJaP8h2Z6Tu>GHD8pq*k;ipSx!pluMZLzl=`O3_tq*8W?r9qKwp$B zdr(^bvSc}DQY$-+biQrBL6dzqdL2*803Qw?x<#T}{W;JxMW)9LjJR{>W!TGU6MRP3 zMMH+{->DTR98;Q`hyt%<$UbshfXEh;5Lxm(fks9_a8R?Ji#u5-G}UahZo!iVu{3iM|L+UW_H6Ex^z4Z5XMs3!s&y33BvA_QVM1;b+INQ%YG zqGc;@4@B&HnoB)~O52KSoBkq8KHZIt+TF~kvqExL?ez=UvP%}{iEu_B^dVp~7X^9` zhWu35UUKySwlj!d^#s}DG_wzT$&;f_^?M+Wi0L2A2~X)Q-R;d(-yi&=1x@hbvBg5+ z<4|^oDsOppeT9cV7cy4>L~{Yv3xT`63%{5Jr;a|3E>z&yOgKVU-q$2;)(qV5+M|9E+ghnE0?Z?z*MV%6~Q=7n8mm;wH3ot-gfJlpL3G*M0573VLmUD)Op z$ldzo33A{VmJJbUrNl^h0i#1btkhOI@DXR z<-Y@DQLjUj{yIqD0(1@^oa%8yC?by0_s^2WZZu$Dim$PH%$9vx-y0b*uNa`U!Byu# z!)*D0Q_R(Qb7igZDlC3>oh$T?xw7+ctn+eXZC71sKHZ>ayK!8ifUZJmbzg?b|KS5! zVxx=xd9FOS7y4|>{9g1zsxBb?F2E8LP{qI{7s+}@f1DdKu_CVYW1X|F;81iU&|v*c z4q*eH><2s*mtIUB5S9uIRlC2zZkfGotzwAQ5ahY*A>W z!5gI~;mx%)N&C>FcETy*>7OK-DAcEcrUmkA8OsAfw9|v%5F;{?_aITNp+9t~PB2>q zahcUcqjpxySy`+mruiaXxdE{CKq4}t(U(@sD@Lp%+Vt63o$@To&7^l6D{x=A*W6)g z=Kn9k{S@l+!0;Mb?&t+;RD=R^MTA&Z3p$U~$ve*gofdT<-Y_rp(tINQ711EAe{TMK z35vXA`a<7&i7d!($!(0`mIr$)mV-Kyo*}9Q+q$oks|WQXdieT|52De7pE%n<{LmG& zWj^|@djT65$(SW|D=!*m>93T`5VHbqpZqo^5uZR%g-(RY7G=7015IO@OQn-;In+5z zWl;)$BQYvcOZ}U}I(_R#>2!SyZMW06FO`E`K+*iA{)*7Vz~QyiFD)UX?ARdF5{`!H zM}uiK(+<3l@%csWZ-IvO~-S$$M?Z92CUja)h>IGfHw}J02m1|tCc$6K6k^*{_ zoDgF^h2NszyGmvThj*49w^nwsM)z>*+(vnB%Fi&YU!a`Otv)(&t<2DM8)S^Dk`AAd za_(!Cle$DI3ckv$Mg6%ME5Q@nUpT)=7l=&PE7!^);#Zbm;MujZBQC$x`+qNU+-N}t zZjNXKy8c0)>M;CX(2Rpd!@-jEa?pUo5P+LDz`V$Uknh7FR!o?ucc#v1MH;61_4V=$ zC(fW+JBFm|fg5C(6!sk~vNnCiEwg&r26<^)7Opca^xP=V?g0${fCC}Ra65=P=G_*O zFp@iE6E~ulG^XaNjl_oHMP^@m!s)sBbUU8yq|XYLs-A(DH_Drw@@C`I5`Z^kcxJ#g z>c4K1`57Qiy=GgB1YDo$o|Hq!xp;n|BmWuRIi!%7O|TrUTU)U&CQjlD;&I*%SnZQtsu&2m}_ zCKHv4)?rh8ezQDThQxT}MwtWNdfz1bC!{s2mll|FldO>3DLxcp5VTNC;EP-22v;_{ zcPH(Kdr2&O?qCk6f}nAU@9If+$}@6|Gsi1T`A4a{P2YQ`>|+jUV(KQxTZ<;w0~?RM z%h1?q?kQtx+wk58z?gg zcHbq$bQiy@jhzauA!UPZgt5Ogz5Srf3^m+v&`if-coYTh)wOi5 z4!-~L(nT_U#W^BAGaUH*ko-8l8w+m~kn{q`A`p&*^uIopAN4|**s>f27~pE6F@^&D z?LXu*;v)UnXEMWlea0Ap%*<4wIInF>@lVp`&ARfRvj1{EDCB~tj?61;joe9AD6clZ zrYgDZ?UXWdhYM%mn$sHU8wb(_7`KB!W)hwz155!p6J=-7lkJ=~apH8_HM3~K#G+!` z<*VU_WNtAq>;j$kxx7z&qo4jf0-J(-V2#=pXxerZApM_$f*ME^?;^L`K#LQhm2lz7O z6v^X_`Bf%4GT5M43qhA^#-Xl|4sXgu5K9R_aHw4r_)t2M9HZx;>?lpc3Y=@mG7_{m z^FWCn>~c(thWZ+p<55S-DykWttbyx6lauqsJ4SYY4{9}EQbO2jI{3I5ElAe-xp>FK zmcBllPOArfy^AM-bnR{L$nMJ;z{Nxt7#>UUXIz^Mh7PoMK0={E7ZQ0An2u&U`s%TAlV z#!MhN6>4@$5& z_XGN`P%KM!49vfU7_nm)(>0g)Zxav}y3qmP0Kf_Wj+r?IuLL{KLsR1cN&%kIpCvoa z5r5SqQyg8F!@JrY=xBkDZdl{{P}Mxt%0YQ79irm9^@alvjF3NYq#$~MGT|F54q`Mx z`53fv(*lt2(Ou2#wfPt{pC99MD05KxLI5vS)~}^FlF$5c|sU={{+Wb8>lS@g&q?AI%#!yiLJ& z)gLd|m+#Xzr#bSHc2`<&F9X{;bqpJ2|GhcwSG|HJu!Nb1?_2si;~6 zFdrZXWi@y@4`48U=IO^eInGFa3kB-|rlIuLb~-WLkuj8$z9lHm2N(x18Q=nd{pjXm p)E|wX@K5S`Jv-e|chXSEtOl>x)@R{q5kR?v@01JtknZ?Z{2%`R>ZAYw diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-37.pyc index 252e7a0c08d6522e7dacc8aba932bbb98b10ddac..b5e4dfbc41dbe4ff09ea9a3c9f08b7e4ed53a12b 100644 GIT binary patch delta 69 zcmZ3sk8#;PMjj_#UM>b8$XhHCyOC!bKSxSoWnP70TE^y6{L9=JKTj?UTgo_jvUqqA Y#wnZMN1HPP03+%cmjD0& delta 69 zcmZ3sk8#;PMjj_#UM>b8h?=h!vyo>TKSy$TdR|sZp~>b`{L9=JizgR`EoGcESvF+PDk(IX9L5w60E#pS=Kufz diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc index 6ca5cea8c61a7f78f5d8e58feaa19cd0ae59fa10..a07fbcfb2868663034f2c6ba75d734d143ea2113 100644 GIT binary patch delta 34 ocmbQtGMRo delta 35 pcmcc4ex04iiIF+PDk(JCT*$bH69AE}31t8P diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc index 630a5b5d8c53f216725252ee02142da16ccdc56e..c3a1c5daf32822a292d5c1a5d150e59c1d1fb4de 100644 GIT binary patch delta 581 zcmXAm&ui0g7{+~57q_NcU1Qob)U6dg^6Uk z>@q#*dlEbhJcytN$x-|l1h4TR{sD?G@S-r^HwNC%`@CV~s^qH)7(_Zb7QOOJDVD( zy|sX?CB*a8(k-aamVS)6ryrru`k1`Oo_<`tES_`Xc{0cHy^MK=-H)faZK_VEn{GN- zkU^QqZ7Mmg3|Bsfr|8b1k8p{y#&}qae5JF(X19$JEYc_AD>Ue3{I532x3Cz1b`k{+ z_C1k=D*Z`h4T*rWf|4LAxJXmx(TRr05y2wE4=p$w_JDuje<&C0vQ(F`v$o=5O^yXo z=0(lX8`FjseKE(Fko*Zf`jy;)EA-r|9_-1Hb-|io$=kIa0+gwn%0rF3l&i{T#4Q@u zEU$Dpsl-~r%&u?Emr7lCS_d{DLL@E NAjlTD_UK#Y-9Km}l%fCt delta 581 zcmXAmPiqrV6vcBVc5E|gV>3=N8Dg7=7G~9gmTa0Bv`JGeMx$7bT8U{0N#mq_GbY$7 z{zEsxh2E7=usbQ#h0Id?3WD2lA$|ZwD7aCm_l^Vich9@?=J3v&L19n`pB)_y1?Z{1 zox1rUd~ImB-fvoMXXCWn8PZ0;#;0SiB|CtzNR!*6NQavHBcg*=qR(DZ*)khI2*xB) za*c5lU=in|6}d=bv4Gpryu8TrB0dSJa2|h0XTwW0@D6oawj&CdQ72+$f6(r>EHmiI zcWYv;A;bk-Qw=EN3-u)NKs}D1)oDJ*fjT2!XU{5op30JZPi0dD%wdtIwkca(C)KjV z8D2U#;?5}c;UWs`hxD(G) zuvdiX1`12^!MQ907%Eq#W=SatV}#{eaCk~vsLH)+d!jp8|u zD~4M>yYDd;^pOH0D`>560sY3Qdu}s3M=y}4AU|eSF$iNex6*#n!{A2Klue~50Khi z#byp$Z)e2X9S~`1(1DKKwQiLBskbu*f~Tw1dB{2f8bun gXtjAh&viyVGoZ{Zw)~{5)Z`MN%t3DP$+P)#0hUZOVgLXD delta 206 zcmeB>>yYDd;^pOH0D`FbYB3vmQdu~X%hU6+N(xODSF$iN7Ei8X&0#8LnEZmZ2S{x$ zW825XrVmtJWU$$aGlEge9LT=Kl9ivCcZ;n!zo;ZNr3fT_i@CU@s7Mv85J+e;71>SR z!!?5!q`b%-B*F+3N#qXYb_R)ff(Wn42e~E0je$&WATH(r5*%zS>>Q#Tfb8$XhHCyOAf1i6f=3GOxlgEn{;Q(;-X7&y#g+@|lVnHqWzh zWnt`{{KUb5tqZ8UsC%-OV!LJvm)b^ z$rIUxCwDn-6$MKxgJg{03MWp^=2xCv?lK3bto&qm*Lbikl9La(MnPF7Zku4vVH6i; zoI1(fnR6o0)LYDnd6knl3W;w{cHhJZQzGpt#W;1cnP(j1#LZJZT^WIf-1d4cIs@bk oaS$N^B4&b!*^_U3n=y7y7V^;qk~TgujMFF2^l=BWANm9U0B6`-WdHyG delta 315 zcmdlui*e&DMjj_#UM>b8h?=h!vymr^i6gl@Juj=I&}4HK(;-X7;>o%;`Ao$Oo9EfM zvM}~ce&XQ3)(KQz)HPYlF_Ce?aL!U>bJ`IRS^yUf8UD?i!YH6Cn>WDuF+PDk(IXEXKG40E_Pk>;M1& diff --git a/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc index cf960fe5b80a873756aa03de102e6e7574ca2180..755bf5bbc07f702337523229ff6efb48905b11e9 100644 GIT binary patch delta 1156 zcmZ{j%TE(g6o-5Jm=2w`!M0FZ9;GkaLRwlXP%u6aF_HKJv@t;_r3}x~mRm$1aX~bO zjV5|x+$p4q8x4t8H~s}K4AJPS8zVc73yCXTdCyEW#^Nl#Irp63IdkqkcQ%JMhx8{5 z2AzUEnL^#@GrdE_PcE)zRw7d~#i;6rl6;4|d=0$O>?)}XwzL*#)~ew(S7UIqoPd%x zvKRHhwyyS`_K~a!R>olOchCZldD}jMUA~-cfd^Il3Eo%z5p3ux1%*Zr>!idjh)Xls zNov8iB-EhghK$e)F9aLcA}xzM!UiF2u;;Wv&ah5Gk|h|2%f1!kdD$v{G6D%jFsU8U z!BFCJG@BFY(kkslUl+oJh#|URN2n{ls@^1I07gttNgwcLC$n43N6BeecbZ8UuA99i zTr8M>YRGYTXj^WGVyd2@q?xAKt2sK1jzL5}gzXVS8^*MW)Ix4vT!k&418&=WBmyt( zcLXW<5NdHFcG6Ltt?weN@>WB)BgFh{P!}sf7$lMcQGyX^q3;Y!ld6Cny~t_f=V&#NnGG7Mx=8 z09R2Ki%cVo7%yKu{EQXS&GV)i3~A(0`GcREZ?PffoE{Q``_4gb7A0-))#)JJpm&Xj z#?T?n7RM?NxCgEOjuoD}-nAY^Nj2gK;uu3fSyEAPxkM;EAT8-x3=PA!+e?!0!5!2m znPZI`xe`hQM}gGWg4?rWl2vjB4v5P4BMw$?j~|C$vL({lR5G1d7HNJqn@QwFcJq=; zS(>N)m`A7ykJ>uH7H4oSJTnw(o+t@N=mZqJUx+kOos;>;nS%YtPY#L>Jmzx&6>Vj2 z`Lc1$Dqj?OseB3gd_gh@i@q_Eg15dXquL+h)-Y!dV*bmqc{J0AlZaD@0Yn%fAh08f T+o#tM*eOl1pTr6u{k^{cPTUA^ delta 1150 zcmZ{j-A|Hn6vsKdJRmR505woVKm=^yyP|70&9>Z}DaO`P1JozP7r-Ax;nr5GHE-&| zv({be+`6&373-$Ipo`{eb;V7aceO6^vab3a9&9a)i_h;o=X}q3&htBmozPB5KVmRw zW&C%2yLI-J-mcIr+>R%gv+F&DZp8z+JR`$hwHe>5j!w*GwG!V6wFW0o^2wQvAIyaZ z+PW?Ewxsb_#_;$gXvP;B%PE2*O*z|)&#F!ne5(2**wj`E_G~WRNl{o6vrDN(W~R1E zs3psZN!>8C;J(fV&cdN?6Y$v3fa`{P;KyT!1$EWaB~QM3g3iKG^%ev=D7BN&!%@_v zSt>2EY@YR!ua96P^b>-3s5@JDTeAZ&hBL;OFoGJBgWGMUA-Ih99VTeUyCyfZ7xqlQ zRB!>GTXKzEl&a?_s^TnlE6qaWm?Vs1hqcoXpqM(cu$EpC^SJA=<72A_I`ED4iLR8~ zOS^Jy71#teijgf8?pwZT-WNGHadHUuipKY|+TMY$cNzA9@&7=PGX;IiND{#B4m$)&39 zU`D#^`WSy0r^#rzAyaBV4g#z*4hj~_hUoJwy%$Wu-NgWhYwWinR?7YUaLV}y2sjzAr;C?Q9nPT4&F Ko7CeM@9=MS=>?qt diff --git a/env/lib/python3.7/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc index 6fe3338c43a9ff70e543b9e750ac7d1346be3d79..188737a92994f2314144f0d14092a9177ac93c65 100644 GIT binary patch delta 35 pcmX>hbV7*7iIhbV7*7iIF+PDk(JCEXAb94gi-H2&Di3 diff --git a/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/INSTALLER b/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/LICENSE b/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/LICENSE deleted file mode 100644 index 6e0693b..0000000 --- a/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2016 Jason R Coombs - -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/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/METADATA b/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/METADATA deleted file mode 100644 index dc811f4..0000000 --- a/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/METADATA +++ /dev/null @@ -1,73 +0,0 @@ -Metadata-Version: 2.1 -Name: setuptools -Version: 40.6.3 -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 -Project-URL: Documentation, https://setuptools.readthedocs.io/ -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.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: System :: Archiving :: Packaging -Classifier: Topic :: System :: Systems Administration -Classifier: Topic :: Utilities -Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* -Description-Content-Type: text/x-rst; charset=UTF-8 -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: https://travis-ci.org/pypa/setuptools - -.. image:: https://img.shields.io/appveyor/ci/pypa/setuptools/master.svg?label=Windows%20build%20%40%20Appveyor - :target: https://ci.appveyor.com/project/pypa/setuptools/branch/master - -.. image:: https://img.shields.io/codecov/c/github/pypa/setuptools/master.svg - :target: https://codecov.io/gh/pypa/setuptools - -.. image:: https://img.shields.io/pypi/pyversions/setuptools.svg - -.. image:: https://tidelift.com/badges/github/pypa/setuptools - :target: https://tidelift.com/subscription/pkg/pypi-setuptools?utm_source=pypi-setuptools&utm_medium=readme - -See the `Installation Instructions -`_ in the Python Packaging -User's Guide for instructions on installing, upgrading, and uninstalling -Setuptools. - -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/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/RECORD b/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/RECORD deleted file mode 100644 index 7a8a2b5..0000000 --- a/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/RECORD +++ /dev/null @@ -1,188 +0,0 @@ -easy_install.py,sha256=MDC9vt5AxDsXX5qcKlBz2TnW6Tpuv_AobnfhCJ9X3PM,126 -pkg_resources/__init__.py,sha256=d7w_yqCD39lZE0-qxhWXPYoc-pZc3G2mD7EU2xhRLpM,104720 -pkg_resources/py31compat.py,sha256=-WQ0e4c3RG_acdhwC3gLiXhP_lg4G5q7XYkZkQg0gxU,558 -pkg_resources/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pkg_resources/_vendor/appdirs.py,sha256=MievUEuv3l_mQISH5SF0shDk_BNhHHzYiAPrT3ITN4I,24701 -pkg_resources/_vendor/pyparsing.py,sha256=tmrp-lu-qO1i75ZzIN5A12nKRRD1Cm4Vpk-5LR9rims,232055 -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=cHiEfHuLmm6rs5Ve_ztBfMI7Lr31vss-D4wkqF5xzlI,2498 -setuptools/__init__.py,sha256=ipsF2yFkfHmryPP8ASJEtOj9N9OuYkk8HxxIJyOHtj0,6001 -setuptools/_deprecation_warning.py,sha256=jU9-dtfv6cKmtQJOXN8nP1mm7gONw5kKEtiPtbwnZyI,218 -setuptools/archive_util.py,sha256=kw8Ib_lKjCcnPKNbS7h8HztRVK0d5RacU3r_KRdVnmM,6592 -setuptools/build_meta.py,sha256=v5rAo9IKlgjNHNcpStcUBG0ChHI-OjNOkCZ_liGuuLA,5995 -setuptools/cli-32.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536 -setuptools/cli-64.exe,sha256=KLABu5pyrnokJCv6skjXZ6GsXeyYHGcqOUT3oHI3Xpo,74752 -setuptools/cli.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536 -setuptools/config.py,sha256=nCkzIQRWTpVwvtSlFm1kOeSLMMHXmB7hENxwZUT6X9Q,19751 -setuptools/dep_util.py,sha256=fgixvC1R7sH3r13ktyf7N0FALoqEXL1cBarmNpSEoWg,935 -setuptools/depends.py,sha256=hC8QIDcM3VDpRXvRVA6OfL9AaQfxvhxHcN_w6sAyNq8,5837 -setuptools/dist.py,sha256=HyRYLlPp_gkcnvQf8o1RsGq99LtghAeAfxWxbf40KxA,44675 -setuptools/extension.py,sha256=uc6nHI-MxwmNCNPbUiBnybSyqhpJqjbhvOQ-emdvt_E,1729 -setuptools/glibc.py,sha256=X64VvGPL2AbURKwYRsWJOXXGAYOiF_v2qixeTkAULuU,3146 -setuptools/glob.py,sha256=o75cHrOxYsvn854thSxE0x9k8JrKDuhP_rRXlVB00Q4,5084 -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=FGc9fffh7gAxMLFmJs2DW_OYWpBjkdbNS2n14UAK4NA,5264 -setuptools/msvc.py,sha256=uuRFaZzjJt5Fv3ZmyKUUuLtjx12_8G9RILigGec4irI,40838 -setuptools/namespaces.py,sha256=F0Nrbv8KCT2OrO7rwa03om4N4GZKAlnce-rr-cgDQa8,3199 -setuptools/package_index.py,sha256=yeifZQhJVRwPSaQmRrVPxbXRy-1lF5KdTFV8NAb3YcE,40342 -setuptools/pep425tags.py,sha256=bSGwlybcIpssx9kAv_hqAUJzfEpXSzYRp2u-nDYPdbk,10862 -setuptools/py27compat.py,sha256=3mwxRMDk5Q5O1rSXOERbQDXhFqwDJhhUitfMW_qpUCo,536 -setuptools/py31compat.py,sha256=REvrUBibUHgqI9S-ww0C9bhU-n8PyaQ8Slr1_NRxaaE,820 -setuptools/py33compat.py,sha256=OubjldHJH1KGE1CKt1kRU-Q55keftHT3ea1YoL0ZSco,1195 -setuptools/py36compat.py,sha256=VUDWxmu5rt4QHlGTRtAFu6W5jvfL6WBjeDAzeoBy0OM,2891 -setuptools/sandbox.py,sha256=9UbwfEL5QY436oMI1LtFWohhoZ-UzwHvGyZjUH_qhkw,14276 -setuptools/script (dev).tmpl,sha256=RUzQzCQUaXtwdLtYHWYbIQmOaES5Brqq1FvUA_tu-5I,218 -setuptools/script.tmpl,sha256=WGTt5piezO27c-Dbx6l5Q4T3Ff20A5z7872hv3aAhYY,138 -setuptools/site-patch.py,sha256=OumkIHMuoSenRSW1382kKWI1VAwxNE86E5W8iDd34FY,2302 -setuptools/ssl_support.py,sha256=YBDJsCZjSp62CWjxmSkke9kn9rhHHj25Cus6zhJRW3c,8492 -setuptools/unicode_utils.py,sha256=NOiZ_5hD72A6w-4wVj8awHFM3n51Kmw1Ic_vx15XFqw,996 -setuptools/version.py,sha256=og_cuZQb0QI6ukKZFfZWPlr1HgJBPPn2vO2m_bI9ZTE,144 -setuptools/wheel.py,sha256=A8hKSqHWZ5KM0-VP_DtptxpMxVF9pQwjWZcHGklxq2o,8102 -setuptools/windows_support.py,sha256=5GrfqSP2-dLGJoZTq2g6dCKkyQxxa2n5IQiXlJCoYEE,714 -setuptools/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -setuptools/_vendor/pyparsing.py,sha256=tmrp-lu-qO1i75ZzIN5A12nKRRD1Cm4Vpk-5LR9rims,232055 -setuptools/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 -setuptools/_vendor/packaging/__about__.py,sha256=zkcCPTN_6TcLW0Nrlg0176-R1QQ_WVPTm8sz1R4-HjM,720 -setuptools/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 -setuptools/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 -setuptools/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416 -setuptools/_vendor/packaging/markers.py,sha256=Gvpk9EY20yKaMTiKgQZ8yFEEpodqVgVYtfekoic1Yts,8239 -setuptools/_vendor/packaging/requirements.py,sha256=t44M2HVWtr8phIz2OhnILzuGT3rTATaovctV1dpnVIg,4343 -setuptools/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025 -setuptools/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421 -setuptools/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556 -setuptools/command/__init__.py,sha256=NWzJ0A1BEengZpVeqUyWLNm2bk4P3F4iL5QUErHy7kA,594 -setuptools/command/alias.py,sha256=KjpE0sz_SDIHv3fpZcIQK-sCkJz-SrC6Gmug6b9Nkc8,2426 -setuptools/command/bdist_egg.py,sha256=be-IBpr1zhS9i6GjKANJgzkbH3ChImdWY7S-j0r2BK8,18167 -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=81CTgsqjBjNl_HOgCJ1lQ5vv1NIM3RBpcoVGpqT4N1M,12897 -setuptools/command/build_py.py,sha256=yWyYaaS9F3o9JbIczn064A5g1C5_UiKRDxGaTqYbtLE,9596 -setuptools/command/develop.py,sha256=Sl1iMOORbAnp5BqiXmyMBD0uuvEnhSfOCqbxIPRiJPc,8060 -setuptools/command/dist_info.py,sha256=5t6kOfrdgALT-P3ogss6PF9k-Leyesueycuk3dUyZnI,960 -setuptools/command/easy_install.py,sha256=telww7CuPsoTtvlpY-ktnZGT85cZ6xGCGZa0vHvFJ-Q,87273 -setuptools/command/egg_info.py,sha256=3lsuTHQFjmAw6slzRrB3HjLiF2TaImpWHREllAPhyv8,25541 -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=LO3MvYKPE8dN1m-KkrBRHC68ZFoPvA_vI8Xgp7vv6zI,534 -setuptools/command/rotate.py,sha256=co5C1EkI7P0GGT6Tqz-T2SIj2LBJTZXYELpmao6d4KQ,2164 -setuptools/command/saveopts.py,sha256=za7QCBcQimKKriWcoCcbhxPjUz30gSB74zuTL47xpP4,658 -setuptools/command/sdist.py,sha256=obDTe2BmWt2PlnFPZZh7e0LWvemEsbCCO9MzhrTZjm8,6711 -setuptools/command/setopt.py,sha256=NTWDyx-gjDF-txf4dO577s7LOzHVoKR0Mq33rFxaRr8,5085 -setuptools/command/test.py,sha256=fSl5OsZWSmFR3QJRvyy2OxbcYkuIkPvykWNOhFvAcUA,9228 -setuptools/command/upload.py,sha256=BpQCjKtJZ4kEb0qIOiTjlJtbpapmNacC27nG2ZlSxTY,6825 -setuptools/command/upload_docs.py,sha256=oXiGplM_cUKLwE4CWWw98RzCufAu8tBhMC97GegFcms,7311 -setuptools/extern/__init__.py,sha256=TxeNKFMSfBMzBpBDiHx8Dh3RzsdVmvWaXhtZ03DZMs0,2499 -setuptools-40.6.3.dist-info/LICENSE,sha256=wyo6w5WvYyHv0ovnPQagDw22q4h9HCHU_sRhKNIFbVo,1078 -setuptools-40.6.3.dist-info/METADATA,sha256=zQ7OKsTw2wXshXUxcGIuLdaogfxtuSBL0etbFqo_PoY,3094 -setuptools-40.6.3.dist-info/WHEEL,sha256=_wJFdOYk7i3xxT8ElOkUJvOdOvfNGbR9g-bf6UQT6sU,110 -setuptools-40.6.3.dist-info/dependency_links.txt,sha256=HlkCFkoK5TbZ5EMLbLKYhLcY_E31kBWD8TqW2EgmatQ,239 -setuptools-40.6.3.dist-info/entry_points.txt,sha256=jBqCYDlVjl__sjYFGXo1JQGIMAYFJE-prYWUtnMZEew,2990 -setuptools-40.6.3.dist-info/top_level.txt,sha256=2HUXVVwA4Pff1xgTFr3GsTXXKaPaO6vlG6oNJ_4u4Tg,38 -setuptools-40.6.3.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 -setuptools-40.6.3.dist-info/RECORD,, -../../../bin/easy_install,sha256=i9AMXcQNSROizXtuqR3_a2F5KS3S3g6Qsh82N-U6tpA,276 -../../../bin/easy_install-3.7,sha256=i9AMXcQNSROizXtuqR3_a2F5KS3S3g6Qsh82N-U6tpA,276 -setuptools-40.6.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -__pycache__/easy_install.cpython-37.pyc,, -setuptools/__pycache__/windows_support.cpython-37.pyc,, -setuptools/__pycache__/wheel.cpython-37.pyc,, -setuptools/__pycache__/version.cpython-37.pyc,, -setuptools/__pycache__/unicode_utils.cpython-37.pyc,, -setuptools/__pycache__/ssl_support.cpython-37.pyc,, -setuptools/__pycache__/site-patch.cpython-37.pyc,, -setuptools/__pycache__/sandbox.cpython-37.pyc,, -setuptools/__pycache__/py36compat.cpython-37.pyc,, -setuptools/__pycache__/py33compat.cpython-37.pyc,, -setuptools/__pycache__/py31compat.cpython-37.pyc,, -setuptools/__pycache__/py27compat.cpython-37.pyc,, -setuptools/__pycache__/pep425tags.cpython-37.pyc,, -setuptools/__pycache__/package_index.cpython-37.pyc,, -setuptools/__pycache__/namespaces.cpython-37.pyc,, -setuptools/__pycache__/msvc.cpython-37.pyc,, -setuptools/__pycache__/monkey.cpython-37.pyc,, -setuptools/__pycache__/lib2to3_ex.cpython-37.pyc,, -setuptools/__pycache__/launch.cpython-37.pyc,, -setuptools/__pycache__/glob.cpython-37.pyc,, -setuptools/__pycache__/glibc.cpython-37.pyc,, -setuptools/__pycache__/extension.cpython-37.pyc,, -setuptools/__pycache__/dist.cpython-37.pyc,, -setuptools/__pycache__/depends.cpython-37.pyc,, -setuptools/__pycache__/dep_util.cpython-37.pyc,, -setuptools/__pycache__/config.cpython-37.pyc,, -setuptools/__pycache__/build_meta.cpython-37.pyc,, -setuptools/__pycache__/archive_util.cpython-37.pyc,, -setuptools/__pycache__/_deprecation_warning.cpython-37.pyc,, -setuptools/__pycache__/__init__.cpython-37.pyc,, -setuptools/extern/__pycache__/__init__.cpython-37.pyc,, -setuptools/command/__pycache__/upload_docs.cpython-37.pyc,, -setuptools/command/__pycache__/upload.cpython-37.pyc,, -setuptools/command/__pycache__/test.cpython-37.pyc,, -setuptools/command/__pycache__/setopt.cpython-37.pyc,, -setuptools/command/__pycache__/sdist.cpython-37.pyc,, -setuptools/command/__pycache__/saveopts.cpython-37.pyc,, -setuptools/command/__pycache__/rotate.cpython-37.pyc,, -setuptools/command/__pycache__/register.cpython-37.pyc,, -setuptools/command/__pycache__/py36compat.cpython-37.pyc,, -setuptools/command/__pycache__/install_scripts.cpython-37.pyc,, -setuptools/command/__pycache__/install_lib.cpython-37.pyc,, -setuptools/command/__pycache__/install_egg_info.cpython-37.pyc,, -setuptools/command/__pycache__/install.cpython-37.pyc,, -setuptools/command/__pycache__/egg_info.cpython-37.pyc,, -setuptools/command/__pycache__/easy_install.cpython-37.pyc,, -setuptools/command/__pycache__/dist_info.cpython-37.pyc,, -setuptools/command/__pycache__/develop.cpython-37.pyc,, -setuptools/command/__pycache__/build_py.cpython-37.pyc,, -setuptools/command/__pycache__/build_ext.cpython-37.pyc,, -setuptools/command/__pycache__/build_clib.cpython-37.pyc,, -setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc,, -setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc,, -setuptools/command/__pycache__/bdist_egg.cpython-37.pyc,, -setuptools/command/__pycache__/alias.cpython-37.pyc,, -setuptools/command/__pycache__/__init__.cpython-37.pyc,, -setuptools/_vendor/__pycache__/six.cpython-37.pyc,, -setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc,, -setuptools/_vendor/__pycache__/__init__.cpython-37.pyc,, -setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc,, -setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc,, -setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc,, -setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc,, -setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc,, -setuptools/_vendor/packaging/__pycache__/_structures.cpython-37.pyc,, -setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc,, -setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc,, -setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc,, -pkg_resources/__pycache__/py31compat.cpython-37.pyc,, -pkg_resources/__pycache__/__init__.cpython-37.pyc,, -pkg_resources/extern/__pycache__/__init__.cpython-37.pyc,, -pkg_resources/_vendor/__pycache__/six.cpython-37.pyc,, -pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc,, -pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc,, -pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc,, -pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc,, -pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc,, -pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc,, -pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc,, -pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc,, -pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc,, -pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc,, -pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc,, -pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc,, diff --git a/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/WHEEL b/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/WHEEL deleted file mode 100644 index c4bde30..0000000 --- a/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.32.3) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/dependency_links.txt b/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/dependency_links.txt deleted file mode 100644 index e87d021..0000000 --- a/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/dependency_links.txt +++ /dev/null @@ -1,2 +0,0 @@ -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/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/entry_points.txt b/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/entry_points.txt deleted file mode 100644 index 4159fd0..0000000 --- a/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/entry_points.txt +++ /dev/null @@ -1,65 +0,0 @@ -[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 - diff --git a/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/top_level.txt b/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/top_level.txt deleted file mode 100644 index 4577c6a..0000000 --- a/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/top_level.txt +++ /dev/null @@ -1,3 +0,0 @@ -easy_install -pkg_resources -setuptools diff --git a/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/zip-safe b/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/zip-safe deleted file mode 100644 index 8b13789..0000000 --- a/env/lib/python3.7/site-packages/setuptools-40.6.3.dist-info/zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/env/lib/python3.7/site-packages/setuptools/__init__.py b/env/lib/python3.7/site-packages/setuptools/__init__.py index e438036..a71b2bb 100644 --- a/env/lib/python3.7/site-packages/setuptools/__init__.py +++ b/env/lib/python3.7/site-packages/setuptools/__init__.py @@ -5,12 +5,14 @@ import sys import functools import distutils.core import distutils.filelist +import re +from distutils.errors import DistutilsOptionError from distutils.util import convert_path from fnmatch import fnmatchcase from ._deprecation_warning import SetuptoolsDeprecationWarning -from setuptools.extern.six import PY3 +from setuptools.extern.six import PY3, string_types from setuptools.extern.six.moves import filter, map import setuptools.version @@ -161,6 +163,37 @@ class Command(_Command): _Command.__init__(self, dist) vars(self).update(kw) + def _ensure_stringlike(self, option, what, default=None): + val = getattr(self, option) + if val is None: + setattr(self, option, default) + return default + elif not isinstance(val, string_types): + raise DistutilsOptionError("'%s' must be a %s (got `%s`)" + % (option, what, val)) + return val + + def ensure_string_list(self, option): + r"""Ensure that 'option' is a list of strings. If 'option' is + currently a string, we split it either on /,\s*/ or /\s+/, so + "foo bar baz", "foo,bar,baz", and "foo, bar baz" all become + ["foo", "bar", "baz"]. + """ + val = getattr(self, option) + if val is None: + return + elif isinstance(val, string_types): + setattr(self, option, re.split(r',\s*|\s+', val)) + else: + if isinstance(val, list): + ok = all(isinstance(v, string_types) for v in val) + else: + ok = False + if not ok: + raise DistutilsOptionError( + "'%s' must be a list of strings (got %r)" + % (option, val)) + def reinitialize_command(self, command, reinit_subcommands=0, **kw): cmd = _Command.reinitialize_command(self, command, reinit_subcommands) vars(cmd).update(kw) diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc index b35792df498f983b8ba300594f88859cdd21a0ce..fbc98725aba1cfd0c11c50714fbce69da53c6bec 100644 GIT binary patch delta 3159 zcmZWrU2I!P6~1%twSDc_j_t(GPu=v!iJQ7j?Ea?PZ57IHy6m!2HvQQ`FAc8i87EHe zwcVMU{zR@UNEZ+w#A=?95VS(#2??Z%$G*V}yp#t7x-V!Yv=2PM0}n{c3+IfRACha& zcjx@fIWuR@Ju`ng`;W`XcM^%122bl3qbnl+X>yc&@6(yHJ>88s5lX1xT3*zN5)JyM z8}kO70o4z=aWCN{pdY3YH|Y&JgNkptDKG7$y^NDlbkrU4hMi$A>tq$JyE$hBY{lGB zZ_F7}ya9LIJK`Mi@=jjSarbD?n{Xz82-Adn%(ESvXl&9c&?FtCDVnAkIz)$QcGYsG zSek#%rk+pJ+zSF)BkRTW&{7_j?g?%d3JK! za89w4>$A=rOaGYgS#}EgWx8^dPCV0`3Oz=X@IK8#>u1(auWRgdRb%$^vx+|Vf;i{F zm`&4QEX~e?v2%2i7GT5$M%L#Wgig`vXT-S(W8Qk9!GiRgTB#_1NGRuVN0FGf_(q^zvywuLcBWtLCvixx_R?$g==2iCu#X7^worp0>hO@5~l{T zJ90iEuP3hFnnD_viJMXLn{|)*Yi-JL2^@#@XL=wm!yu?Y6S!ZNVd^@G=i>Qzh@(WF zN$2E$6SwU*^T4p}GqW3_hw?%4;=%$-zl3lV;avpfeb1-rsbPyC-GnA|0E_TN`FZkp z$CV$0Uj$x2HUjeSptnmP`9!`RWF#)^UgNAExrzZ=qpTDh!L{%s2@X zzARs*E>)I6!aqRxDnbeX;=6?XeMWXfKa$0CfxIo>Pftw6X^4j5`-sp8wcx9wXW7B+xk

    d9uBtSQeoVHEAO}aP_eQ7H{Qxr3{w<&!4 zKC^3fQP?L|+rE9TDDIU?y-*NYWso914=k!Q=>3qQ=~86tpV!o?Y##z(&-BAF zV>bl^*M-t(w;OhU!J=&2A2jx>#OyaueUo$6^4;DO7}eLFwI4BCblj$I!=E+%HOB3B z%dX7c6(=ipo7-3KTZLI0$yp$wAqjQ1&jP1AN;Z^FNQ8RZ zV`!zP=JO34h~q)4|Jo|7ly|)>ZCN;nF1W7~2s%EvBe)v^+bBR+TS+}7uph*SoV^Wa z#si&d5HPY-()k_GP`Lzs{Gj>!2sy2%5TJlGe$cO=sXAan5!^|M|I4E)M!9^&ZP#nA zSSarn+V{3*4&?fQ?dT_dk(WwQ{x$S>NBLJN{&k=OowFdMwtyc&+JIp7liyUy&mA1K zqEy=(htmD!ZbDy&Uw$v`5094L&s-zd}#t#(a>%iq-25`n97w|}~*4vQR9uw6X zUxjze7aZ#p|0Y5m0Zs37r;4Q7xHJfU006tK8F(qEhKMY@}O+yb>uWTL1K~V&C3SB^v-ap7AoCzpMV&6P* zib1N{Xu=|4N2{XgbzJsG;EFJS77CM$!8hc+?7zYrK=Y#fIA^=cbO~uZJyb@N41Nat zIA6!|Y8$M|*`c}@K~Lc5FQC;wc|sQKdkj(3t$e$lH0mo;id2MxYmt_X3`fpN)*3!mC@L@j-lT8U0 zOf0T)Rc(xiB!R|6aNDRkjw4> delta 1977 zcmZ8hTWlLe6x~_B*3NokJ8|qJcCvXVZJe}8N>y5{K4`0|5BfkzodT}wnIv|1ZFhD< zA3u?3#TNpq`9P|WXe7Q6QiTdgNbpyL-~$PX53~~h2nqP6{o&qmA69Jb*?Z62$K1Pj z=CA#~E?I|@$%Fhz)}_%%^XM=nS83%+fh-eMCe*p8SFw+P(@!A4mMf~EK_2)4*~U3uZN>Kl=JdrY>epA zjV(|1BZ2UE|Dx}<7u)rAsowPbs^gSu*Vmd2|JsUt6q_YW5C4vB5Yi`W@$;zydKD2y z5Ju$>@mKqwhY~iDLjWgaG4aLH1gcX2LA36z)*UXUL75|pQ^`AEqumYw{_shHl2Qn* z^gv(OC00-*LAY6U`3vL6@dInT$#1kpxh>x{-`M?9$INI~eV>b_2RV>Z8w!jAPSw4_ zs^vCN9z5EulKj9dO{joix(`jUif6Ko#4tcZUQF)n=|fdjnUxlknAO9mWD@Ob!Lj8ItDi8){v%!tTH+iKZQH-P=>^0!gN-uUu?wYR(< z)dL8xARI)%)h-W})<*6S0M_g200t3<;8Ga15qU2))zejt{5e&~Zi1DEqo;)oG7vUNl!(*vNowEXY2d^$gyRSn05tX_%3VR8 zExj*m>2WeE-%F3A4ZIFu=wmDf!yXsC^2hY=#ZzD!=vS|A_kIodPvm!*5&6%+(b+R- z)h~FxS@-Kzr+$l9YEMtYSz^>}A}7K%cHSszw{RUVx9`@eBZiMD?(481h8^>x0ivM(0FCI$tAvrRs5k zGa?oMg0MO>+j@py=YcE_?x~K01Qn@RljsyfQ1i2lOM2(*#RT^@9N+8Oq7BPIsQ!D5+}WNghM6GIH(=G7nTSCWBmXx62rl3LJNJ)6z`$5^wV+^VEGCXd;QZ!~V@Sr}BOwPjSzL+q8K#x|ANV<+ssI20 diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-37.pyc index 7c6bda1f28a8b42cbd4572bfb138d9f04810b67d..035a8d2d2b86b50ea834649aeaf4fdcf0944d2ac 100644 GIT binary patch delta 40 scmZo*X<*@T;^pOH0D`>560sY33K=<43M=y}4AU|uw=$Noeg;Va0J|><@&Et; delta 40 rcmZo*X<*@T;^pOH0D`FbYB3vm3K=<)%hU6+N(xOTw=$No7K5Y!w~z^D diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/archive_util.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/archive_util.cpython-37.pyc index 1010c808beff4ba093c509350d95f7d2aaff9343..d22c9d732cd37d49a45f22d258550267ffa8c56e 100644 GIT binary patch delta 68 zcmaE={#2dEiIF+PDk(JCoW{h@&se;kpzg4 O1raVF!fvvI@KOL*{t!t3 diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/build_meta.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/build_meta.cpython-37.pyc index c5e04eb1ce82b9934dc2d5ecdf4a41ace54797e3..b1684637ff720ff7a7409d2be2f3be0d7c3c705c 100644 GIT binary patch literal 8251 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 delta 2952 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 B1{weW delta 1354 zcmZ9MYfKzf6vyYxKB#P$=XO~Z$}W#CowAfI6sTApSwPdYwi-;VV+j)Ow%rzX*Sphd z({0kqDrq%7dTL8dBk)B-3|KNI8jS^QqG$*jKNv&QXqp&5R6~r3sUM8z3_e=sW`6fS z=P~!5Id}Ju^YBp?@}h2cu0oeS5js@+;9TAl&J9CP9Z4KBp4@4kbe?tk7swe?bP$TJ z3easr)$MUbcZg~%a0j3UBkqR&d{HbsS!ERTf>^%TB)pa`jOB_gqD1(zK%OFcDiwaq zQ%pJ}%0#*4@rcc$BCF_|L_h>-_KHeTMRSQz`xLF#Ty!Vy!R68v#Ie)=d(OT+-M#z! zdNEkG3WZo${*7ap_E?O+mY;FmCYAOOlzcq7`F+O-sZwmNn06#c1}itof?iCGKo7Yr=iCDzH$yg$Cs-gDu0fHT#PD$2GTNAbCw6MReRuJv#@3y97&*M zadyiU5a#`%9Dwuqqt}OrYxBS`Pt<-6a2C6?6#RyBTIYt~KNqfQTOnxrwz&Z&FjUtc zy2wi*;}YXlhPARy-r>UOx*8bA<+=yJhu-kfR!MOy8`H+15g!_f8Ap>sa^aF|mZOX@ z#s$U;46CHeIMq|)l5J!-Lw9-`ejE1Fer|^c0p7#Mx3}im$-a^9ZuUoUa=W)4GCY(? zTLuIe_9>d_$&pbrFr^ZCD94-`Iw)6N_)>l|Ry7>5Yc4s7&o|WPPtcoIa)#qWu|zs1 zU&k8_^>sONfUJ_MkcSzUIjE>7mXfg{swtUxbWkSZi6e3hgAotdu{ol(SRZB$+z`2k zaGm=QB%#=xK*Od24=1Rqo#tFn&DqE^01|gJ*1{-0)>sKCJl*IIyhS-Hc4H(py#Bp2 zthFcy1IECk07oFERU>*MfoBFV@PkYX6XIesgBm zO@MBErA>zmc&n{3_%Vmx_&1)8?;>j}V}Vo)cHH+<-~&?oHFfQDa3eI^+WvY-%Pj8h zsB*^=hCDTpO2!jLdN0b|SZxWqUpJ;eqxaU8r5@VV11>;M`SNyxkkxiuk1k7}I6&P$TVq_RE;!^h;^be8l KIcEzO^!*K0M^Lc< diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/dep_util.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/dep_util.cpython-37.pyc index ea1109379171add7432d0446d825ed8818dd67f2..d31184c58c3854d7ac14f924d85059fcdaaca84d 100644 GIT binary patch delta 34 ocmdnYwwaB`iIF+PDk(IXJdtS;0FGG+o&W#< diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/depends.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/depends.cpython-37.pyc index 753142469d7873b97999b6f94354951dc59c5efa..7b44884ce7dca017266950182cac5079af410866 100644 GIT binary patch delta 35 pcmaE(@kWEkiI}>AON{X3o`%! delta 35 pcmaE(@kWEkiI}>AON^z3nu^o diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/dist.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/dist.cpython-37.pyc index 20057504f697210d93c6beee7d67aebba31c66ef..3ba01d86467420bbad87ab53d5fa35ece2ed4283 100644 GIT binary patch delta 12305 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 ylOJ5PoiJQ}kAJ@ZO8<2z)%k<|W`D@j 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 diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/extension.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/extension.cpython-37.pyc index 7153415beb0df8c51cb330ca69826dcfdc12647a..9b373d10ca3ca55fa1040d5dcfb620019c722f16 100644 GIT binary patch delta 35 pcmbQtKbfD$iI560sY35|}ws3M=y}4AU|;moW2j0|1W|2-N@p delta 35 pcmZpYZIb12;^pOH0D`FbYB3vm5|}xX%hU6+N(xOjmoW2j0|1UP2+05d diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/launch.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/launch.cpython-37.pyc index 7c08480b321fb0aa551221427bd3f716b8710b6f..2e26d1e6703d0633c2669833e7abc6e3a148326f 100644 GIT binary patch delta 34 ocmdnQwuz0$iIF+PDk(IXJdJ4%0FG-3pa1{> diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-37.pyc index 44981eb4e6e25255bce43c1cf1e21db2b91c2cbc..733b2230e0a36289954941d39618c6ed8cdef027 100644 GIT binary patch delta 35 pcmcaBbXSPSiI delta 35 pcmcaBbXSPSiIF+PDk(JCEY9S{4gj2<2;l$# diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/monkey.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/monkey.cpython-37.pyc index aabe15ef101a9b9911510e3770a09ccd02daa2ca..dcb2e22d5152e628b42ab514b3fb1f69aabec06b 100644 GIT binary patch delta 439 zcmXAlyGjF55Qa0^xLMW>$&whO!Jw?5Ar|IR1tp>hh@v2 z5mXWU|H3pKXyx!2D}&%lx7~I+HB5Oo+BU!fDf&}PEG+!_ZoTL9dWb1{*NY>0)|woy z9Ov`vU;yT6ari4y;(8G1JLnE{-czeLoRd}$muSN{f;GA}GFq8i(tss;H73nC7Z)6^ zpWy?Hdy!Dl4<%X;XJFMk4d-BfjUC)#@Jn_j-(c*kZMR>|7I0V$z#TCRL6M##d9x^T zd=RwlTDNN3I7bs^B9fAZAwf*AM-?-h`~Lykc3LfN42dCMjZwjZK;DagW5~RG!5EwQkc=T2<%dh4bT_|Nq>3&%J}(AZILv!@7^x-p%yEgArG>X78kX=3bO( zMtK2;ev~IQ#eNfLGMMn*1J9t2agF2js5T%*zv=|UyoullK$fPoR4&WzXMmAcP;#6R zK^4J26mqn$El1L<^n>;DPRH)HFyq~8+W=Kk^w)$~IQQ>6N3QLgk~FWW9I(uQ#et8`}+v^uxs0c-SOOqxk9t~ne( z!v~o3qTz}kYP1$9z>3$4lwfw19o%B@OLin*XY8pR=c-vOV@M3ZZ7~eNJiSHd%z2SV z`$5ZUoi{BD3zRX_(Tp^V2;zcWYM8~+@CPi*ZnwEHEQWkF#spP?ychq+ka_urTXXXd Du<~D* diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/msvc.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/msvc.cpython-37.pyc index b4dc8acc992d9f0b1de5f455079bd4f3c527453f..994a5f70c3cfe811b64f004352eb7bc46ebb7d2d 100644 GIT binary patch delta 37 rcmccJ!*siciN}eTmx}=i@)k?PZseKG!jV!~nO9+$ma%y~%bG?2&U6d) delta 37 rcmccJ!*siciN}eTmx}=iqUNi`Y~-2E!jW8_o|jcpXtH@d%bG?2&5;Y~ diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/namespaces.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/namespaces.cpython-37.pyc index a9c2886bb26e87e96dd6b9f3a11d076e2926c6f9..701d2d25b5cb0d1a533a3b64bfb4e2726a02b2c4 100644 GIT binary patch delta 35 pcmew%{X?3^iI|LNHvqEx3T*%Y delta 35 pcmew%{X?3^iI|LNHvqC23Sj^M diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc index 1553312297ed6cf16f7ccad4b428ccc7b241ddb5..baec63d92b487e5d635e7911c6fabf148363fcd1 100644 GIT binary patch delta 2463 zcmaJ?YfK#16`nJ*?_HMV{iuMAA%=|&wi5>%Ft#x^U=lmnF>!coH_P5#v#{*KoxwbO z2d5#G8aIht->N^VCW0oa+^R|&P1RWW*N3X8{n4hCl62J{DSzxdT;tU0!&OSp863B< zqK=qv&;8Eho;mlN%WI#)w>BVnsGz{7;FEo&GWzwGzY(m2S6^@ZHtgtSVOIJq40p3W zb|2e<(qVR#)w2eajxaS@#nhC>?q}t=?qU6M9cJMXnNklvz`EF>XO-dMc%kX{P%D}s{hFxhAe*aB`o2OpOjE9 z4-a)ihxN6gFu49szI)_r!wqHIzaZ8=d3AUYJhF3S=Ycim7BK1JYldsWz2XtD3ZpL5 zVLDBh={7y4S2*=G;aYJr&noaW<`pjHW6D?6Duuk{4@ash&}JD%Rnuqsg%52IQTL|x z{zwK?UrZj0K3BU3^LSiS6rDavfdGWS0p(B$wfF|)t>`<@DSz|jfzT03_yB!C7s1EY zwwNE_F}dfdW34r3(nh$sJAA($PK+lLlet-3HqXqalLm4TCvPX06BOYMlAa*wmR)0I zRRcucQ`5c3os+q-8tIF_fm{4M-v3bb_!$hDm}9ib>@@Ax%t>yZ`G4`tz9@d1H91zV zp1(?2P+#+#1h)uo6MRZwck~UCb`#h=7^Gwsf@*?#f*OJ=WU@hUji7_LeFRkAd_Xti zMmjN-G{$pmvkdr&n!?*;DA@vklLwOjhCyq8>M?*p`Qn*BLW>+9|83O>I!AyHZ~o*c zvfXndavX8kH3Z6yK+&@Zg>v&7pc69tTgz%h?-u0$4BQ4g*Zcwdq|D zlBF{zAR|*VYfTdr<;1Ozho|>KzNtWLxqBdn(zsya0$2Yq+Di!p-jL^P!wRm zAj*X+ArVBmP!z5d;n;gu@$$+B?r3P+O^wGWCXE15h}(yR_ag9CJC-U!6D9TqQDhdI zC1$BvW|oU0q3xVh$w(CA>G$&SH5t54oHqd!)xmaY$Y{yCYh`?UTEVy1Z*T&h;eYon(0T3bE-p9(Nbf z9~1PVf8HHuj3;%S&r>uz?mkj}MDTrrTDf>;aMTo~8(%$)Ae0q_8emj2!BkB}sJv1@R%I$3CjKYY7W?(-Oxl>$lf0>s zaHM@YuIqCwdT>0a8@S4GBib0j3u%A&^9GIE!;Po^*QkYeVkXBUkoR${g^@PWxh#%B zAF})?Lf*-ene^1XcOaF#hdvQsMNvb*yW~&j9w`_g&hByG7p&m?IzUuzEM%cwW*6Jw zU-I%|Z=GGy)9A;ar)}OsDep<8Gs)?=F^)A1p6haMMa?OB>fFP9Bt-yIy!*$)=n;wX z7syf57xc{=dkB}jlp?ke#0V}D_a4Ck>+N#~p*~*_i{VWdPh_xUu^9gj>3R_IaFox} z;sd$cZ1Z0v@8h)oikvt5dp{)c2_gpx7HK(3lHFN!oIFclx1rq&KOhr2>&^bWK+;yc Y9xCLQmI~n+xov65y~E=UXdcIZ0Ar?cApigX delta 2147 zcmb7ETWl0%6rMA)J3G7E8(X%NQei2jutG~gD3lhY7fK;mD3(jNg;Mt4w%f~=&Q4n_ z{}f^&O1z|clm``PU%Vxf$QUG=Xrew~d=NDOY;iHRObd_qTZ>JJ`zB`F==`f%18FmELbu!;L1RK_aUbe1JpIa|eM zux!CrGC4At$xRBI$q*m=!VtUB(KPdY={&MK%{m6Lba@fmF|;5Ay&r9#j}pd zPfNiy)+zb4qJ?{#W35KlLhGp7{J1Mlm*|^|^A}`bEZ<|Tn12jl6mKp#3+J&RoDEm- z#uI1Yy!G|MWdPUFRS<+RoL?{pZdzLlUXw-CuS@O-yjqw6H&9!8)pu1W>Q@8=9r^(A zF?1D8g=;~Dd6TCz4jerqnxVS-7^g43=7hwE<9nr{V>8Je2L9 z^9ZdX91CrP1YB8{?;d3?4sEJFiv4v{){Sy?$jP)}&_|h@tIWfs{qkgq{0~k;3Uf1M zSgw~%r>Poht82*3ox>o`9@EP`B3Gcu`ONyIt{uRQ8@3*R0{m%frfAmft*4@e#dA>^8xl1orG+Besyho~}f?<~=%2CYD8zNpON}cL~lDEG1hJ zL4kmggt*aYM8h2sqotFLH()VHili^Wq(~n8hRY&%p~fn1S_e>rFE;-Ox!Bb5?c|V1 z4uW1g{^%rSdpbi{6)o|RS*H+t_9zaAqd8D#os5F4Euti+UV-1WZI>GXw@g}veeJKR zVM<`=>*#QeQ^0G5>3F!~2Q@;jX3R6vVFwPz`~u&Ojor_%-s~&~h~l}O^C201UDeQr ztn265QA)b6Bq}QUCv?qTf*o`PWqcRAFeZ8yx1QHs00s`mGlkX%@gA>1`Ei0>R5`mv z&>M;*#Wf+Jf#ywcYc8FvVOdz{lZLHE#-4iBlugBS&`_H$u81)Qu?TYwhgb=D7@h?# zGewMbg(0=VkjfQ%89wrG;7Ouz{FR-;_p4^%$F0Ps><^CEeixkF0?YU+R(?y zATomW`b(6k#Gi?e|1Z^wqn=8Nxdht?2FZ4oV7YaSuK)<)O>;V2K!1Os_XUcmBIjPL z?O#)Rk?2M;))4g3v5uJCPudN=gTQXS-JbU;gc_jlCzvVrVN%M7R@~9ay4xemg-wd@ O#R+@*op}k0=J*>}lq*jF diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/pep425tags.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/pep425tags.cpython-37.pyc index 8482a0ab0a4cce0e77c4127dac2a8d965c09a330..1c1ddc53eb4bd5243002bcf5a90cb9178c5a3e17 100644 GIT binary patch delta 593 zcmYL_&ubGw6vv&dyVb-=lL(UCRtwc?q6e*!hSVRatu7%Nqy+ItDd{#lA;I0PeY@g% zQBdkdq{WB+0V;S^3LY!|6CMW7qTY%JFIJtGAkN`4U%v0X?_=gq>350GaGuzqPVg$X z;J@R(w#!|)7sM0o&c;J67-Tbk&yln^+mL*&;q3dcmIH{`6gZo_?FJQ-=199sxH9mkF18E;yvm5NhaW zs?5drnfV$Op+6_}ZV(Btph1ny{+QI;PBeMypGkoQt!EZb76$%zLLKL`M@O%!x-=YU zbwmg)is^lZ1}xL0DsKlGgVcewk&D%~Sb>E3v9ktdsb4j0K774SsZsv_L z$&0vY9@`r$sp9Um+uazJ$bW#p%n`#QIfVzTmuw9`TBq3@Zd(m@ALoY0ESri|0R L_jat|(_#1v(IcB9 delta 574 zcmYL_!A}!W5XPCsU9fdqS`*Vl$X)l#3oD za3WwB;*|ssUNwZH%3tB(c{UMloH#(loh8I~_`NUR%zQ6z{`Q>rs99AF)OcrRr|p^j zRedGZ7ppJqMR%!d@4aN#fkVevKS)jutpqH-jsvUlZm%EHjQbu$tubH0h^LZ(y|fja zh8!IQ5%M&9?GNP9Ib^v!a6lIRKce0hA)XRPLU4z8~B*OwKF zxL`Us&oTZwBrLKn(WmGDSbM*tpJk<=ooU*N4a#?glbv#R5%gI+V!LVnK^1<``Mp)DlWB%R&04bzHCd3C^2x yxw4D~`|s#fiz_c#rm0Eag$+8;`(T33^eK2t6OAo;j*EFlf#E0nZ*0(dBmM)wosp&h diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc index e24404ca32f8e23c09d5e2ac82f041aebd43a0c9..4b6d72a45aac9d9e891bf46f3ce7663c98b3f260 100644 GIT binary patch delta 40 ucmZo?YiHwe;^pOH0D`>560sY3q8K?+3M=y}4AU|u=P`a^{5(0CX$b(rt_$n{ delta 40 ucmZo?YiHwe;^pOH0D`FbYB3vmq8K@n%hU6+N(xOT=P`a^ES{Xqv;+XZ4+~%b diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/py31compat.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/py31compat.cpython-37.pyc index 335f0be085fd79f585f921b05dcd1d223c1d6d39..63078a910d139e49d90a5e68c777cd753a39c83b 100644 GIT binary patch delta 214 zcmeC=oXW}T#LLUY00eo9C1Tw+^0qT7G68waKiz$tvhOv)v z@6=%&Ra= z%b3i_)Wr=_16EkXIe8k>85DjlbDliNDMj2MLIAE3SF+PDk(JCJcH4jnK5ee6P6YL>OKrY diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/py36compat.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/py36compat.cpython-37.pyc deleted file mode 100644 index d14207dac0cda0c030038369baa2957a9b6a7698..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2156 zcmZuy&2QX96rZuZ{)%^#rfCWY39AyQE0Gl13My1kX;UhJ2o)bqSru7c&+KLrukFmt zrn@UI2hsx

    &ptNRCJxIiUU{NOR@Xf1xMd%yyeZt*sfqdGqGIpWoNqY&Js#Pv?(! z9(=KY(0_U{e{3Lbz!3LfB8cD|b@bQD@xba>SkrcH51fu;XeVzB+>VRU9Yh+$eT0a6 zV0Ao-c6{RPBK|e-{bN4C-=KEz6m+A_HdZSeOvs^Rx%jG*tSoMGUUJ|ELULJl%QA;W zW8?PC@9t#!%=~$Q@(tin)WHOGEP^{WV6chv2zMM}fhAYHr7dvQ1tVpVR4ErU$;zU~ z`bm%FR80O2V|cz~qcv8<6)*Q0VMRagmHc7K$y!zps#LNr%b6T&ZrmFdnO2q>jx6IY zH7Zz<FPQ^I5{w`rV}gvMZ7ZZi>Q zc`8IqM;WbPw~U7sNhLjP(`ZRW%m!6X2ego26V8*lE7y&{W@bJ2RtvsO7`I@Ee=vj< zLpad@Pa&Mr+Oc6cyEeb3U8jRcJP27pLb5<2(j+ai*l$kl!s(-_EgQ9cfTwm1F5mU} zw>3I+kI)oLk9UFg$&gi!qZ=fF@Pa7cdvyoV?8>`4jIfp^r(A20` zJBQ&B0?E$Q1$v=&kMPt3`N&ZI=tk|q?zL%92jncEeNqRtz3ai(Ic(N$9UNKHunrDe zWQCjq8Z_5o&#L`8xQ_OoY@xm1w-CrK9wChO_!c6oHQHI)bsuB?_vld5Wc77)c*dak z^#N#ru>d;J&N5gC08cdjtd2nbo;+KlI+81Ocz`2xU}IEV1YGBhHg0x<*{<1(W*m?P z$t_g8>mYePPD-8{fQVZa6NwE1K6KKdRN)_wFC?_JPbNaxo!IfM^E zO+>d$4&T-J%qI~mgiP~%t(yuuS(>k^Je7vCFz4i~J6W7B^!91SkkeC)ZJH9w#qkl5 zaaKujY!I?DRc^&;kBue^bVReY*+Mzn<$x+@2>6u4%Ti7*oGiulmrL@@=8~Bq`DXO_FDLP2ohj{k-g^dD~LnKIPp~P~{OmPWZ5BpI6bW z(2XU|UGSW;#aM7pQw!QN$#bwlkCzi#2rAW?9xKSH7Qr1Y@25pkLg~XlX+X*s)U*Mi zywdb8p%(j8CbLCCSSFPX4CQeOo`!P(o)t_ciCToNGDyM9{A7bkIuI%*08W;x5a>|wvyk$YD! z0oY+Bp<|1aWHr9>!K{U@S7WvOa?lq+t@s=!gd;n$Tw=-Yu?p=}=D zU{K_iIkVZe4IF+2_W4yk=?I*dUKrHg6FMb)+z$9zAk@oZ?{qW?$en+Bq%U%T~bXtkXG0W9Wd1^@s6 diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/sandbox.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/sandbox.cpython-37.pyc index 0a0defcf2391114c51584b8dd7ad075dd786bc67..b854f18fc15260b62d256e85c72322ca0070e933 100644 GIT binary patch delta 176 zcmeCF?5X5&;^pOH0D`>560sY3_A_&&6jtU{7^Y=xzRY}#n=xwgEdG0pVUsHbZUf0s z!5+rA&5s1RnHZBdzZ1@7WK5nMBdRGJ1vKC`5Erw6jAG|uEQ;DZLv%hPqDUm767`b_|_B2+Zc%Z_fL?EHbROAI>CvEmNCvWyPR diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/site-patch.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/site-patch.cpython-37.pyc index dc49a1fbfc4d28b47e9cbb788a4b5b0357451d89..bccae15fcb773254c096058bfad9f3fd9ed4169d 100644 GIT binary patch delta 35 pcmdnRy^EX2iIF+PDk(JC?8scn1OSyk2@wDQ diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc index bb175262e819cb1c12d2c7e796256ceacd5b1a6f..87957a28e83ccc194b185bd3eed8d445f845352c 100644 GIT binary patch delta 410 zcmaEC^2CJKiI4Uxr^1Bv3T=Q)@XLd z&yy8-_b|FlzAq@T`5W(3CIJti&LU4Baf`XQIH$;K@@s*3#*oS0f}Py1ASr7Q5x4oi zU_B#SFo>NrIYl^IC>6v^0}(<%LX)v5b@D@D8OF@b|Abu`8KWn=h;C!c0!c?t5)%{6 z1+nsAs*8ld5|g#XLV+q9#iUd~@<21dD!`H;fu}%R%mO4h82MO=awqQ>)7A%xM{y*k zq!gFr7p2}}$xF;l)nqCv1_^V`z1uxs)3q-mWqHWKTXx5av-b7A4Ft>2w4!3KKYk~A6qDhSu)vAQjR+w#Iynt aZj;L;lLRtB%rX$c2_mY2AuB#fDj5K(h-D)H delta 464 zcmX|;Jxjw-6oz|i`lUu%YtvfLp;h zi~a=(xVUukAGlBJ@Hr>r4J{2bXceR}gle5GG%R&!EP( zU@detutcLAVc+V7E}3_eya-14BvT?a2*ZdJ<4zDpx1~m1H(t<$gm5v%!^_rBIM0|0 z`N*TUf+1IdDN4j7tr6%HPIa85m7RGN)s{6)H;Y2(hG}Zr-zF;ILZ{|5DEPqJ+2?0N z5;vi%OlBxo{l!vAG#lKorFyYuq}-fS9MIYo{7l{y|Hnc+I?YXZNd>Hrjt?A=&Jyx)F?tv*leP!}LI;0C I6j)sU1>#X}KL7v# diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc index fb92f2eafa07eb6aeb139595be69367b69ddf8d7..94f89d19e3f660e8495fca38a0f866496b7fe4aa 100644 GIT binary patch delta 35 pcmaFM@s@+fiI_>53RwUE delta 35 pcmaFM@s@+fiIF+PDk(JCoX7Z|2>_;X3QYh2 diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/version.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/version.cpython-37.pyc index e15991363dbee69b6d6066088775dd6786a0cb4a..727f2e65f3cb25c93d3e14272e2c14a8f792c394 100644 GIT binary patch delta 32 mcmZ3&w1kPriI7%Q6yDiguXop8+p+U!hx`$m)M@ims<`|l0n(ocwMA{B(#jHDoXo~qXZ@4e z32mZOIV4hDp&-H_aRXb31LD9T7bFVm0qBJj5=iWc14j-VQAAbdZGw}=*1rAbeecbC zZ{C~zAydy7Q-+}n{8#$C{hd#Dj3oMgXW-I?| z8a`H>NHLm?`Z(z5#aK4xW7TOY#tdlT+m7{Y5{GbjOUS0C z1#IBRmVhIhVzvWIvqCz$7Tx)~A0c)Y4ejR9tkm7j^V@rAgcd6!6}vKImt2~2oFTlt zTDp5?VUhhV51ZaUD96pcHO5WAsFpX%q(3lwv7e$hiq9(s?!Zu_DKIMp=m zl1)u>f<0FLObs?z-_AFYX)fIojlE1DiqMV zP!Rbe@khpJNhB#Olw=y%6tK80)fD!bHn=gyjo0L1E1ypXJ)^ReH;LtzSIE5Odf^MU zONl+VLhW*iyaqvE2LV1rOdbZ?guKa#<$-q z6V1=&L*C+io_%Ya=UF^8?rjwGbyP)Et%cxS7qPl6JrJ;l^)2CnM8njek*ZV`YSFr| zDQ==o^gz5X+!yal3z9$QYE>x2E(n|Go=T-!Qx&aCbrA`GsZ>yE!F356b+LgXbfM&t(IMp1sbk65Pl_SCapBo1~i7hcfe6AH684J&1(?5tP;qIJ3lbbaB9|f|AtA&CE*!WlN8rKup7g6&1FWlI$T;R*B02lOZ*#oko0p8uy0=s43J<19H_?6 z2X8)`2kHeJgO%nzQt`+~6r&x&S=5wb(XQF7SRCWK!9TO-nyPQ-o5;*4yA%9T=oiw< zD@spCQ#uHbm93h!+@Rxc@*QP#Qo)c~*<>r9fyiKJXWCFMkKk zc8jID(=eDlTeWWS?(mg?AyApHDl8CqMR+BXR7Bco3N@L@>w+n6NxK2Q5*~Wz3Yf0Q z=dE(N5cKOtU&hea5m2KdfTw_7tQn4VJdIW*=nXKMg4e}E2t?%V>K{`f^r_5cl z+5BPTL0B!w{$V_EWzGvamNRQnItlA13+z|Jgl0pX=jwO)WaJBy=l?`9(0a{gmto}FljfjNmivjkqF57 z&#_#ljkRxztBM)l63xUGSqrn|YIrxrN&I0jjwyxsqxf`ZGY>C{)8HJ9Hswmv0M3+AkUSYnOXqRtGD6ei zKpivf62q|?-{#Bh_iuO50J=($5XBDqb%e`NF>UIpe!vpmEUKaC9|kX>r_Is2Q>@lY zFrM`ql~HZy)5*S`^o+$88?0Whx=&qaNUFqWm~SQ*hWzscsDoZ_BeZgT760M|pg4C8 zekyf3BNLg#f{K&|RK+O#i;{#W?oXw@CL_lh4-Qx*bUuTe&^ySR$M*~NJs(Mbka*gQ zrua^}C%J^yX#g)cXIB{vZy*0PJ=Wd*B+8SBety%i`sIE;lP6?^Pj#kyPR2y9y9nqXF&OhA9Pxg=g@XPr3#Ej{P7%&mVW?g2)Oz{P(W@ix<(y z-})6`o=7cv3yIdKlwpG0`XVh^?%^lEZ&QGu%?^?ve=Xac38AIxHakX_F`B|F+1^MP zHJN?fuyp<~+glz+=^2Di5&94?k7Jj+S!quhbL!?|)fy*Y;pPEkXq?h|#1u5~=#gZ2 LM52adNlE_?YMXqu diff --git a/env/lib/python3.7/site-packages/setuptools/__pycache__/windows_support.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/__pycache__/windows_support.cpython-37.pyc index 49fa5d378466a3891ab35310e66a280f7c28e5e8..80dbe597d20fcbe8ac9ea551f3f69de58df4ed34 100644 GIT binary patch delta 73 zcmX@lex9AjiIImWh diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc index 2160210b88e0aa890b5f2d72cd14e401e1c5692f..e279403cf14f2c193c519e074d324b534dc50031 100644 GIT binary patch delta 26129 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 a^r4FFg>7;beil0{&)XTHBOM*TivI_)v-Exd delta 26110 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 diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/six.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/six.cpython-37.pyc index 933326ab8ed4618e154cc3fd4605b38fc3c8768c..60d07e96100e45fad18ed75fc8370700d8700776 100644 GIT binary patch delta 69 zcmZ3yk8$xnMjj_#UM>b8$XhHCyOC!bKSxSoWnP70TE^y6{EOWfKTpmJTgo_jvPgIl Yb8h?=h!vyo>TKSy$TdR|sZp~>b`{EOWfiznxWEoGcEStPuO Xal+>IaC;UY=XkUVHq)$ delta 34 ocmdnQx`~y?iIF+PDk(IX9L5v_0Eue|-T(jq diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc index c4ed9d214e33a381900e1a836ce79026c7e6cbfa..54d85a0e770fb8d6c796981131dba7cddd68884e 100644 GIT binary patch delta 34 ocmbQhGJ%E1iIF+PDk(JCT*x?|69ACh30wdG diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc index 734e69fc180bde56fe8303d317d912c27ed7b077..7f0dd459d143a551ba2a2a85f743c06e7c802c0b 100644 GIT binary patch delta 657 zcmX|<&ubG=5XXI+X4@of60@$^q|vlR4|_@li_ne~_9@j9K3{vnfeS z{Q+7}>cIhTf}lqQWp4`p1A=!~5YK`l^x`2D-)zB!`OM6B=DmIMcDIY$#qm=U6TyAr z;jgr-@5ihDu|{`;4~{i&I;KAsU^{p({7ixzDv=hst%xa{^E09`wIr535oXJ@0SmIQ z1SKcFUuSFy3$aSzjF9210M15d@KbD3ULs`$>mh}m!=2b%?Yt1&5wmUgV3BGO%EJZQ zHlWwGcoDz?*Jm0W%3kL!tIc(vE8ng|#{gI+(ck7=#FMn%LyDp@K2VObG7gm){H$c? z@Iz%*zD%_modADCMlx?H%?apZP!MiY=2ma2%^^>TG@sp+vcjf?<+5-R2M0c~OL$zJ z3(`ieWUYzKY;}>X;s^B`YvS{R!_a~#LD2)gi08#^e2*ts1^>oRs5CHKApD;fF5-fA zWWGt_VZy3_>#Oq(J>ZV+O=?4fM7agl`kD<@YV$_9PEieCYdY)T7cC>WtNmtu{FQjg zuHe&TCEBN!0b!kBIDeA&87pBom19+Wm$GHLTX=-wP|`VlC?Ul!BYQ9F J|W+)M693RAK)%*21eohLZv~AD_dIiD|h;%2{kiRdx#hBo;SL3&9&RJKTW^)fCEOWzG$7 zI<{2-u)zzOh6Q!Mvuk%OJ?P1|nsCzqI74EnV_71eru9Cu6xDG@J;LfZQs?lKny15$ z)Oq5USb!ql+5drE#D(Ny zgf{XddsA%2ldG(W?~`AdfzJ+%qRXNLD?adfsw8gXTPn@Y;osD;Bn=Gb3IFGX3%H^k zUNT5LL}&_l!KQUr4}0T#lX7U0D7V4By~$yn+Wb+jQPjX!n$EiTS<4IVYQIayEetUh&A7`4(^8`A=K^{Vaum1F$_>~f zjE`%$n=3`PNxVi_@% diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc index 5496a5e2d002dfffd4c161cfad34d30212fb5147..64edc87fd2f0ae7b325196bb55e1e330a2877e29 100644 GIT binary patch delta 210 zcmew_`(KvFiIm6@$=+z)*PlH{mD;Rdw|sD zVzzxuYz9E(MTVQrIU^XgEP(7=ELr)PdAHb#^NUJSQ;I;+x0s7dii%Xh3W0}i|j8>bc@my!*GXu)pV#`m;N=+^S%IxD7pFD{#7Xa3{H#`6U delta 210 zcmew_`(KvFiIF+PDk(IXT*>m6v3PPhYYtN}!{n!|JwR%6 zG21>SHhrM-B7@E5oDqy#=0Nr>maP2DyjyI=`9&qEDMcXZTg=5JMMbJ$g+M}+smN~f zPOcfeAmv5wAQ48ONCTh9b8$XhHCyOAf1i6f=3GOxlgEn{;Q(|$|F&y%%m@|lVnHqW+k zWnt`{{LsOHtqZ8UsC%-yVbb-Vz zuCTly`R z8MxJ-T^W(afb8h?=h!vymr^i6gl@Juj=I&}4HK(|$|F;>lVz`Ao$On`hg& zvM}~ce(2!9)(KQz)HPY%F_Ce?WC1?8$;%xBz$~fFLQV#ZMjaq|a}d!FA|`+cT_ACb zD=aamG}X1JD8ERPxkwl!E(RhdPcCsj!Pqfb&{Y^{PN2(vB)0ry7uR^O>5`N8x<)}+ zhHjf+&M*XOnlkyXn=|8t&5rID85JSU1DdPJR3r^DUJ^tIfCxblF=eu`XB^O+gCdff zS9|I(0+~0wUQ0~}$%%sq2@o*@M9cyaE|VXK83J9z@1qGMEq!7br%j&b;|^rs^9cX| D_Y7L% diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc index 89bbd06c26679b9702101d9d9ac6a997179b0cd3..44f5743098186e23be9488b68f5f01e4a42215b6 100644 GIT binary patch delta 34 ocmX@je43fZiIF+PDk(IXEXKGM0E;FF;{X5v diff --git a/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc index 25e3dcc4585fe80e6996a03e179b0bd1dbe18687..18fd553e6ecd7437329ca1ff01203ab3caaed12b 100644 GIT binary patch delta 1040 zcmZvbUr1AN6vubwcD>v6%GxyDoKC&2xn$F6>NF~?43g5EHGIkZJO8%LUuEf&zVsO3 zc?rT4d_g#<=HK@bK(553qqyHjYohtEAb-*bNFyWhE6jx0y=E~={4 zK%e+p@$HQ~PmVk?GZ%jpijAilau$s68#gmvp0RAIML0vb*!?YN;hrPFLj z!xdX`>Z_6jsKq_ig>iKOf)q_>zR%`&=}~Goe+hyiZmMTA5_aUINF+za{W;OZxn_o) z5oWZcR%~wpIBogmBaKL`fH)VT}ztjiNCXD`^Hg>V>;S4w68ZeiL`yCn1V| z+>`1-id#n07NWRVI&?H&6QvR}7!3D}6qpQttElBBm2rc?vv*9BiHSIVcDm%uawF+O z>v5!PUgBY7I&G{8_sdZCb#xe+`{@Y>VpQ*!j+-OK_^5o=|C`f{vGTZmoJF%PW@dgX ze@qv3x1tKdxKz=jOmIp12b|FTw4kMOAlT38^g?-;`c_*xI(C=*qTuVwZQEHcu`$ju zF5pwGP`b`xFRp7|7{qNYK-|~%?0T9s-UOHEn~!3Fw-tJ@+v|Z2On6;ILnL0~3zsP{ zm}D@51Y!tRy+43gRU{3NO8=>sr$#+|RbBoZQA1Dt4Us517;!7J**0H*M#O#nFpM93 v4MeC8O7q+^iH+5L;VBNM8J8JX7@dqdhQeSsVvzBW!7jxx-9!<7s&4-WX>RKP delta 1033 zcmZvaUr1AN6vywGyVvXPuB=V7&FS2(bFR2k^S^|p86=3))j%Rk%|AJ7n?KFaCw=KL z#Pbq_Dfl87gpMG3>(PfG-$DYTpdcuF>Y*3=ox4qFx`)p__k7R4opV-wk#WGvL8MoJL=Tcvl zB;YT#6yxe5=y<3;Fy7`0d+C`vC|rS1Esb7BXyDkFlPr-OW3%(Dk$g=AJE57-l3KI9 z0qDj7`%CCV(c$HGz|juZaVg&cHMrpLLrrSk@mGY)_}n??zDQ|Sj(u^0B_1VNgdBZ@ zF4SFh5W>5z2-M<^>#1S{*ONxWI!&x0HD1~bywnSKtE_W@@A?KFxX(fq|F~mn)~zVQoAw(;>u|JuL84}S zXk)NOJSxZZTqm3H;eL8r^f4YEluqlz#;H^x>Hqa=9>)>g7kJtlo4_{z6uYoibw;S!-8m$hQ4 zhs+3WX?_^OJx%94(hluuH`nMC6p}uD6pQ?A(1&5a2f8rfci{)k?C7D5%REXj%U}Wt z*f6g9e*oR8L>eMhz|E>L5ACWqn8(gjMdK5ZxRq^jGjrN20iCyq2kyWKz7N!MLUl-* pr<_S_tR85IkvT=UO1MVoCe#oV0!_n)2y=vC!U*3)34W^X_y_7+>Ei$Z diff --git a/env/lib/python3.7/site-packages/setuptools/build_meta.py b/env/lib/python3.7/site-packages/setuptools/build_meta.py index 463d375..e40904a 100644 --- a/env/lib/python3.7/site-packages/setuptools/build_meta.py +++ b/env/lib/python3.7/site-packages/setuptools/build_meta.py @@ -26,6 +26,7 @@ bug reports or API stability): Again, this is not a formal definition! Just a "taste" of the module. """ +import io import os import sys import tokenize @@ -34,7 +35,17 @@ import contextlib import setuptools import distutils +from setuptools.py31compat import TemporaryDirectory +from pkg_resources import parse_requirements + +__all__ = ['get_requires_for_build_sdist', + 'get_requires_for_build_wheel', + 'prepare_metadata_for_build_wheel', + 'build_wheel', + 'build_sdist', + '__legacy__', + 'SetupRequirementsError'] class SetupRequirementsError(BaseException): def __init__(self, specifiers): @@ -43,7 +54,9 @@ class SetupRequirementsError(BaseException): class Distribution(setuptools.dist.Distribution): def fetch_build_eggs(self, specifiers): - raise SetupRequirementsError(specifiers) + specifier_list = list(map(str, parse_requirements(specifiers))) + + raise SetupRequirementsError(specifier_list) @classmethod @contextlib.contextmanager @@ -74,109 +87,168 @@ def _to_str(s): return s -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 - __name__ = '__main__' - f = getattr(tokenize, 'open', open)(__file__) - code = f.read().replace('\\r\\n', '\\n') - f.close() - exec(compile(code, __file__, 'exec'), locals()) - - -def _fix_config(config_settings): - config_settings = config_settings or {} - config_settings.setdefault('--global-option', []) - return config_settings - - -def _get_build_requires(config_settings, requirements): - config_settings = _fix_config(config_settings) - - 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_immediate_subdirectories(a_dir): return [name for name in os.listdir(a_dir) if os.path.isdir(os.path.join(a_dir, name))] -def get_requires_for_build_wheel(config_settings=None): - config_settings = _fix_config(config_settings) - return _get_build_requires(config_settings, requirements=['wheel']) +def _file_with_extension(directory, extension): + matching = ( + f for f in os.listdir(directory) + if f.endswith(extension) + ) + file, = matching + return file -def get_requires_for_build_sdist(config_settings=None): - config_settings = _fix_config(config_settings) - return _get_build_requires(config_settings, requirements=[]) +def _open_setup_script(setup_script): + if not os.path.exists(setup_script): + # Supply a default setup.py + return io.StringIO(u"from setuptools import setup; setup()") + + return getattr(tokenize, 'open', open)(setup_script) -def prepare_metadata_for_build_wheel(metadata_directory, config_settings=None): - sys.argv = sys.argv[:1] + ['dist_info', '--egg-base', _to_str(metadata_directory)] - _run_setup() +class _BuildMetaBackend(object): - dist_info_directory = metadata_directory - while True: - dist_infos = [f for f in os.listdir(dist_info_directory) - if f.endswith('.dist-info')] + def _fix_config(self, config_settings): + config_settings = config_settings or {} + config_settings.setdefault('--global-option', []) + return config_settings - if len(dist_infos) == 0 and \ - len(_get_immediate_subdirectories(dist_info_directory)) == 1: - dist_info_directory = os.path.join( - dist_info_directory, os.listdir(dist_info_directory)[0]) - continue + def _get_build_requires(self, config_settings, requirements): + config_settings = self._fix_config(config_settings) - assert len(dist_infos) == 1 - break + sys.argv = sys.argv[:1] + ['egg_info'] + \ + config_settings["--global-option"] + try: + with Distribution.patch(): + self.run_setup() + except SetupRequirementsError as e: + requirements += e.specifiers - # PEP 517 requires that the .dist-info directory be placed in the - # metadata_directory. To comply, we MUST copy the directory to the root - if dist_info_directory != metadata_directory: - shutil.move( - os.path.join(dist_info_directory, dist_infos[0]), - metadata_directory) - shutil.rmtree(dist_info_directory, ignore_errors=True) + return requirements - return dist_infos[0] + def run_setup(self, setup_script='setup.py'): + # Note that we can reuse our build directory between calls + # Correctness comes first, then optimization later + __file__ = setup_script + __name__ = '__main__' + + with _open_setup_script(__file__) as f: + code = f.read().replace(r'\r\n', r'\n') + + exec(compile(code, __file__, 'exec'), locals()) + + def get_requires_for_build_wheel(self, config_settings=None): + config_settings = self._fix_config(config_settings) + return self._get_build_requires(config_settings, requirements=['wheel']) + + def get_requires_for_build_sdist(self, config_settings=None): + config_settings = self._fix_config(config_settings) + return self._get_build_requires(config_settings, requirements=[]) + + def prepare_metadata_for_build_wheel(self, metadata_directory, + config_settings=None): + sys.argv = sys.argv[:1] + ['dist_info', '--egg-base', + _to_str(metadata_directory)] + self.run_setup() + + dist_info_directory = metadata_directory + while True: + dist_infos = [f for f in os.listdir(dist_info_directory) + if f.endswith('.dist-info')] + + if (len(dist_infos) == 0 and + len(_get_immediate_subdirectories(dist_info_directory)) == 1): + + dist_info_directory = os.path.join( + dist_info_directory, os.listdir(dist_info_directory)[0]) + continue + + assert len(dist_infos) == 1 + break + + # PEP 517 requires that the .dist-info directory be placed in the + # metadata_directory. To comply, we MUST copy the directory to the root + if dist_info_directory != metadata_directory: + shutil.move( + os.path.join(dist_info_directory, dist_infos[0]), + metadata_directory) + shutil.rmtree(dist_info_directory, ignore_errors=True) + + return dist_infos[0] + + def build_wheel(self, wheel_directory, config_settings=None, + metadata_directory=None): + config_settings = self._fix_config(config_settings) + wheel_directory = os.path.abspath(wheel_directory) + + # Build the wheel in a temporary directory, then copy to the target + with TemporaryDirectory(dir=wheel_directory) as tmp_dist_dir: + sys.argv = (sys.argv[:1] + + ['bdist_wheel', '--dist-dir', tmp_dist_dir] + + config_settings["--global-option"]) + self.run_setup() + + wheel_basename = _file_with_extension(tmp_dist_dir, '.whl') + wheel_path = os.path.join(wheel_directory, wheel_basename) + if os.path.exists(wheel_path): + # os.rename will fail overwriting on non-unix env + os.remove(wheel_path) + os.rename(os.path.join(tmp_dist_dir, wheel_basename), wheel_path) + + return wheel_basename + + def build_sdist(self, sdist_directory, config_settings=None): + config_settings = self._fix_config(config_settings) + sdist_directory = os.path.abspath(sdist_directory) + sys.argv = sys.argv[:1] + ['sdist', '--formats', 'gztar'] + \ + config_settings["--global-option"] + \ + ["--dist-dir", sdist_directory] + self.run_setup() + + return _file_with_extension(sdist_directory, '.tar.gz') -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) +class _BuildMetaLegacyBackend(_BuildMetaBackend): + """Compatibility backend for setuptools - wheels = [f for f in os.listdir(wheel_directory) - if f.endswith('.whl')] + This is a version of setuptools.build_meta that endeavors to maintain backwards + compatibility with pre-PEP 517 modes of invocation. It exists as a temporary + bridge between the old packaging mechanism and the new packaging mechanism, + and will eventually be removed. + """ + def run_setup(self, setup_script='setup.py'): + # In order to maintain compatibility with scripts assuming that + # the setup.py script is in a directory on the PYTHONPATH, inject + # '' into sys.path. (pypa/setuptools#1642) + sys_path = list(sys.path) # Save the original path - assert len(wheels) == 1 - return wheels[0] + script_dir = os.path.dirname(os.path.abspath(setup_script)) + if script_dir not in sys.path: + sys.path.insert(0, script_dir) + + try: + super(_BuildMetaLegacyBackend, + self).run_setup(setup_script=setup_script) + finally: + # While PEP 517 frontends should be calling each hook in a fresh + # subprocess according to the standard (and thus it should not be + # strictly necessary to restore the old sys.path), we'll restore + # the original path so that the path manipulation does not persist + # within the hook after run_setup is called. + sys.path[:] = sys_path + +# The primary backend +_BACKEND = _BuildMetaBackend() + +get_requires_for_build_wheel = _BACKEND.get_requires_for_build_wheel +get_requires_for_build_sdist = _BACKEND.get_requires_for_build_sdist +prepare_metadata_for_build_wheel = _BACKEND.prepare_metadata_for_build_wheel +build_wheel = _BACKEND.build_wheel +build_sdist = _BACKEND.build_sdist -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"] + \ - ["--dist-dir", sdist_directory] - _run_setup() - - sdists = [f for f in os.listdir(sdist_directory) - if f.endswith('.tar.gz')] - - assert len(sdists) == 1 - return sdists[0] +# The legacy backend +__legacy__ = _BuildMetaLegacyBackend() diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/__init__.cpython-37.pyc index ae8e27706439cc44abfce30db6b9d2ab339dedea..c1f0375b0c108a3fd3feef9ff1218a61efee3464 100644 GIT binary patch delta 34 ocmdnPx`&m=iIF+PDk(IXoXHdn0F6uu4*&oF diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/alias.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/alias.cpython-37.pyc index 088f91ddb1e8e516a354b29692755eac0655c962..2af65c73e42f03c5c44c54a33add41461cae2d49 100644 GIT binary patch delta 35 pcmX>gbU=v5iI0snYDXh$^FigwXJcn@!I{={D3K;+Z delta 35 pcmX>gbU=v5iI0snYE>F+PDk(JCJcn@!I{=^f3Jm}N diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-37.pyc index 1215c27a433a644b13f823d118af2b692803fa63..aeeda65dcaf31c8c055540a68149bc450e1f4726 100644 GIT binary patch delta 34 ocmX?;cP5X=iIF+PDk(JCJdMeg1puOh3AF$K diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc index 4639f7843f6aa49143a92413b354ddcffb87ceff..38c078f0841e13694352cd299e36c09c43fdaa05 100644 GIT binary patch delta 35 pcmZ3*zKWg4iI7%Q6z=$E?Zj^C*r{Wusp8aekkiDe(}o6UspI}pC4>?b+9qusC%eYmY{B2xz(KAyw4EN%r8;-{{2xkH#13C`sExvUVY>E^%lPl}m6`;<3n zk=r9miJqJMc|;wBp|etJ8b-yeu4}S1$64H%p_^-V#jz@Ci(L9De;pCq`{47Ko&Zc? zJ!R1i&CBBP0&7Usxl9ad_{%Uw>5M#H<*f?&Y*(o^8k(u{Y0(|)pOn;gF25oj0wV(E{`EE+-q_`2?w4Exo zD)m8rFApOwpqnJQ+~$AwFS}ULHgwyud5G4^PH+PjwVNA!hwF~!2K8D+HTZFOFC$%W z)v#>M?NTYK>F9=C5I+ud4ofZH#R8>i;$r-B%iT_^=`@-STA6NSBy)t7L@9H>Jc^8C zfGNNN;3D7>;2K~JumrFH4qyXN0;JG+Vq)+kV(h`-ffyv_R{_faT|6C}Pir*X&xmUI z*aZVDEI+P^%Lg`#>*RgnC&-80u4&uWINqAmoLijla0Qz9tAN);Z#Fk1mHh7fa5YBV_m)Ha+4vrm+@?)E7Au+@agtpMci6BA-N+~qd5E&=C!5cPfcXka4 zJs?UCRobdF?^3BnoZFr%OTBXB(rXXhs^!3;Md}5qm#Px#e9u*)wz2Z*y_q*N?|t9Q zJ}x~jMQ3;I>h9pb^27aCzm0y>8D741-ClLyoso|w z3WF9V6*&vT9H6)r9TQV>Ji3`j2CvVwP1mei=53==Z@6aNcIYe|L8oS!OAgKRMiVqH zCz5e-vGr&4k?1QSQx_aQ%3@uVcLQlJ;2UFI^KN5u9$=uK>22Tb8S zXE80Kou$nStRdYbl^E2}37De%M(V55MumNj7pyiKhON_#?2V<5DC&wh3;xQTmaBU{ z<_AQUgB-~*l!RYF3af?IQtZ0O6nO0gR_e5DXbJMelK{X@Rlr&Kdv8N5%Ei8$5miX} zkIG;AM#SZ<_S}Ka;tJ5 zXnQD(IKOGLtAH}V0l0v50NRC;=sZ~%`Is4dG%^~4#Iy*g0BZ92$c2>7%YA~W?&d{D zz%Rn;N4mT^x;bI7?O7*-7WR6Ij$;tMH7AMcL_1u8COQK+CkHaQtWx$&0`z<>$roJCsk$!F N2QX^@U7pOn|2J{BTj&4) diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc index 553beba217e8aa9c1d6053a1908a923584a06b64..4bff49e1a19fd0461016b4271a8dd72a5193afb1 100644 GIT binary patch delta 183 zcmaFt^w^2ViIQdpT+VVIV&`8%VU0AtiT%MknRZ?iO`8%VU0OPIAazfLY8RI8!6K!CO zoop^X`ar{%wBrt zEVgweY6PD|>j9x4aaR%1Cn1l54^SDO~vbnmJ51u1%d@kUgVp*n+KiW<6ex69H(|8>%PDiIA4Pq4JQE zET^6oY|W0oCD>6XQA<1Vb-A1Yo^Hp07h4z0SzBHdO2)NYCpQ;}M~Ke97S93Zr1sV! zxcBb-URH1IZMm)8Zo_94&)aQZy3)8jdvS$-Aze>kaDnD5FI%k&TcIjnl%L4Pfl1N2 z4+*3)yemJgYd}5&$1m{P@~3OvTt}#-dgQeT%XV|jti`)Sz)8SK_e9_;9i+>W9oD z%5}1Zf25Q~a~Pux(3dnSbtjN3blHcL{!m^&n?{jZS@JQ>z-+B9Th#HJZCZ8wAl_)w zdc||EI{hj{P}w-*`i#0uZRR!`f$==pope~muCPiV+aL?l{0%)lMzf$@QYjWK5FIzr zm{V_g73R_Oa*sfLYfQHvRBD74h zi7l>6bc5f}C)BP6osIVRpZff$4oL{Lm}M}vYhpsRI5ZwPL;P55YAw+dh`^Gy6#WfG zAdOUy;HzLs3x=Va3FR1o#fWNBkKEgHy}n+jw^j%M=cgZX0>j7|RRj z>l}Dn5Kar{f!Ez)qa+6B5ku%n{7!6d0h26|uqHutsqK2UZTmd_azWGg>!9Nk|4 z6?(6p|7m&d5)J#k6U2e$HLDdIA3BZNIsUzIgs41ejw=($nB<4d5t8L+%}EmHubLAF z2dZv@Rs)WI06-uaISzH#i6OyPgd^!hA(|+Y#O5t?p3I>+#JwLsVj%9B31rW0I0Msn zS3m5*{8pRw)>9wz6GI=Y6~Q1Ji9m5KgUF|0d=j#cAcWI#45%Pd^_srZPZB3TkYB0L z20ew#r%>KzLm0xTL<;6@r$nK1X{J(U`_)r zAE<%>)*F01@w*Z_Q~7Fg-)?kC7Z8dF;XH3gN(2bBrHb!_OF(p+^ccUH98yzet<) z;zOIO=+;|J%8C!Js?9r@X)@kV7B71^_&~EPx8X9&y2TIX&dnW06&v8+gaa9?HfR*H ztYz4Jj8V(_nSYZz^LQRjNWVq{H^eJG?AA+dmpXN5=P#h?V^aijb&~&(%X256T6_uq zrWX)iMz9bZgk^*kg!^vq7YM8I9ULG35ox9@YLX^V55IWTM;uMZs?rCgK_~;1?dA JlvxuF`~yJR&l~^% delta 2013 zcmZWp-EZ4e6!*0q$8qd5angLW-Jol`En{8x1w$}xqHD#MhV}s(G9AH<-Oj0E!QO@Lx=|sYtna&US@HG2u#6yMWr87VhzO40B>ilVvvToX_01q} z<>S5Vo0jPotl=jGC*^221xIu9jiQ_D$yNzyX-5Z|-V?2|BVQD%#`@Q1r=>`r^Fl_w z#SZgY%}76Ivnyv^W;-^sqfE0!1Kamj-C7&yTSXEOV(^>dCBSX5^MDB!-=>N>|tzLB02NA$8OdASlV_`lfo#rPk{7IiLTKSSMpVP^zO9 zv{44=b2RP1jbxiHhv3p@%Io7ryh_@OA%=>kkUN2Z4p9|=zm^<(x(u6YlA`~S=z5XL z+@S5-%%!`4WTi1qzSmr-Ej1&BfqIuw)I1oh-TbHI!MsLvq7jvd@KCG z9FHBEL`$X+(6wrU?#KOJgd(5Oc2x&b`Vib$u)+d>kSu_)CK@Sb_%-dZ@*EKaCNv1W z#Y9MkBl+M$t+4#J9&VE^%q39KD1b zqa^`#T>@?Ag$u%qK-(B|@CJ45(uGZl|B;?4V{KGP9E~Wo*ztU)=3Zy?Fh8YFlHI(n z&(DkkOI#KIF!m(#&!SxGb9vKpKzZJTD7qRLi`I=3e zbPl&lr-?;wX`MC<8kjE7F&GAV5^s}XoqBB+R;9R4EaQGtOe}f68>#hHletZJd>{rx zAbp#^oBdIVm1+D&?&vhCq~{Rs8&9iv6agZ2(GK0Xmqo8d=lOPSOo@ln0sd$1NMYcC z3n20-KV$X|;IO6_0jgqbWZ(P&cD(H*U>{b3s;p44GhR4Z7-wjmr zU$Y{$R`Z%3tJS{YtHn#l9!Hisz~8P!GR9+2C|#?;EV3D+wc2-FES`+*lS zc37kC)s9Eq021{*aE2IefvisPY^lUQDw!8wf-_w}xQy^Jf`hPxu#B*ycE@#e^GjGE z&Qw*GMO9KIiqvX_r^~ZX#A)6GXZiwwl?z?gX|q<#4-Y|8x=@2S9wVc@vJ6Istq!fb z;m(+*Dc&hh4aW(dMJ;LMmf5Rq*W!1|<0Co}@xA|<$A2qNW(qKqb?7u%Dy#{|{{pwR B!B7AI diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/dist_info.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/dist_info.cpython-37.pyc index b78b8df205865f1c63869fe1cc27c0ede8e3d85f..bbcd8b0376ff290b2fcaa88cb71f0ae8ac8cdfa4 100644 GIT binary patch delta 35 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 delta 10729 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 O@slS#fE1lexBdZ3-J=u$ delta 618 zcmY*W&ubGw6rOLh*-SRsHnpX;M%4CDsJ{?@;Hk7mtxeJx6Iu}|h_+A&w$^dQ%Z47B zgNo9_L-f`SqFB5ri#HV!d(o5r3Bd|NTMDM<`esGM9p>YEZ@%}vH#-lP(R=|X<2bh9 z@A6XL#L8>uO-xSSnVzkBcLzpWqxT)g@2($-3Z*FgwK>HTTC^bKS*vri?nOh8NcjTRfxEN`ph` zL`ubZ9<{eK{~r~S2dGiaS{?XRD+Ihb@0Trcvy-$oT*SeK=4%=@H0aUQmIghe k+SXuldFVl#r4H&H8{1iwj%=4w#$-ZT(w3$zWt(jM4K|#X)c^nh diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc index f833fb19b3b14c6b0f21625a74e2675eae877084..a2aec6ef820bd3a9cdcb1bf9d9093ff866713184 100644 GIT binary patch delta 335 zcmZpdZ560sY3b~16K6jtU{7^Y=RKFegz_<1rbb1rKUCs4uU02Z;y zz06Y>c_u5doMPmj{FX(Lk#90Tt2!h9WOLR!ZULa8B0dnoJ^28uC!_FWF1CJdUL?^a zZ1Id@n_1W$m>Gp8yK;pxN=%;3RnI8CS(=-XkqxY0aIzAQBaE5JGt)p1q+bk3XtETs zf!I1g;udpqZb}hYiWMXVCfGqNsmVsXPK+0Q%c980JDHzVosn;{Icps^KTuH-FNolpe1O%HQD`z3TR%4slIRk) zct+99EbI=>!rpWFuZDM%l@wyy`$F&gFH~;06ivfe0ZG0W#_qPjN|N zNoI0xYDq?ZN|6{yTyioSUq6onkg3UZi%HL*$YSzBJ}pM)$!GXv1;jxrj6sAvh)|sT XlTVio6l_IilXduI80{u|^4kFb`{+bU diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-37.pyc index 8da6f6ac0249b2b3083c3e07d9ad09928d6e979a..b2df38f576c2e779549d7fa23d05060c4b7fd0d7 100644 GIT binary patch delta 35 pcmX>hbV7*7iIL)3X1>$ delta 35 pcmX>hbV7*7iIJB3V#3q diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/install_lib.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/install_lib.cpython-37.pyc index a9be6bd26d4952b5cbbef5a5612c188d8be727d1..f1d4e9f09573faaadd2925b50146ae0aa9f74ec4 100644 GIT binary patch delta 35 pcmca2e?^|hiIvcwUgliIvcwUgliIbPBLJ#P3K;+Z delta 35 pcmaFK`jVB$iIbPBLJyr3Jm}N diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/rotate.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/rotate.cpython-37.pyc index 6892cd9d5927e2bdf271ce0af10219ae3835548e..e3dd386ca339760a684e678bf82208aac89ddd88 100644 GIT binary patch delta 35 pcmdldyib_NiIF+PDk(JC+|Q)X4gj6j34QF+PDk(JC9K$5b2mq!630wdG diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/sdist.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/sdist.cpython-37.pyc index 8af135834d515f6d55ac5e0339b7a42f7a2592ce..50b5a6141a147dbf4180d139acc356d16888b7b7 100644 GIT binary patch delta 650 zcmY*WL5mYH7@cIM-LbY+R^1AAmmFMXN2KVwf_Svxv6n@VqLw(xbg~_1YLdF{&{7YA z2aj`?DV{uvXYuaU+pK><#JdN-(6ZDo;-;;XLx2$ZRU(zxv%ZQVU-0!7IO|QT{)^28&i9MR1X-JRbh^o z98^13)C{*=`y1IwH{$bPq=*PfECQY=J_tq3Jt7nd(j*kaiR6sX1Uh4|PZOQi$SOR= zhuV_5sMy{zy6rm;|7#UL?b18gd9^vl2j8l=79(WXW6}DDie_m?~{iVj4<#=LIHk_leH_X$^jR1;_WKWKQFJt z8<+D7L#_wQ`U55cUD}Y4*l-obpHGHz8|HGyz+(fC3|uqN2JjuZ3q$EZ2_?4-!MREC2ui delta 85 zcmca@veJOhiI560sY3?3p=I3M=y}4AU|;2Q!=S0RWG%2+{xm delta 35 pcmZoyZdc}U;^pOH0D`FbYB3vm?3p=|%hU6+N(xOj2Q!=S0RWE82*v;a diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/test.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/test.cpython-37.pyc index 35725bc3eabc1b6b5b73b3d189337dc93add6006..9a944dd9170642cc28bd385c2461fcc6d45a1c1b 100644 GIT binary patch delta 1693 zcmZuxO>7%Q6!xq){$Iz59Vd=sr%Bo-t_W#MtCIhpHncP-QUL|Yv@9F%)Y)L~I`gG%J;*nRgb|cMtguA(8)`lT$_lJ$EimIeCLQ0Q>&)2R;4PvMwv~iDSr2j zi?dRhbc-*fWI$i5nd>L6u81F`!ImW0r0V}l8&Z_TL1wO#DC-ipT27H3@ny>ek`j_{ zIMI!)3u%-F05amNZ;2ccAN#T=(2={@&}q`{0JakzTLuV70hx7(N4~eSDYQC{&}4w_ zX2os)t0$4oc^PUtUTb+Z?+4(u3T-lR{Hj`{TvgABL|}O42s#}`cpAYC?<7jQ2kj;^ z0>lhFjqpgo%SP(&1jeKxH@;m9%-m@=OoJO*$+%8ctHKS-w3q7Jp*SI<;_vWN$`~l+ z{Ok<8*t6nzr1RJ)n)x9(jdR9aUfM~hY!~-Lloo4|4su!Cj?{V&Iy%Uy%~g#RZAK)O<3;NmZlX`A;=g2X1oO55V_yn7h>aQtOUua>Co$OWrX zV~fc64AZ8Jvj|!w#dg~Q4A)5e>&?S;0r+>t{q_oZUnJs3<8z#>%J*8hZ_~3yJ|Q<` z?ibI;(*u_`eZWXMnegb|B@gku0`E;}le`gNZy|FpP`@2d5`PvPF6M&b)5I}30kZf$ zab<9SX6!ZC{~R70_dOvWiNaqZvHGPB4U17v9`4?6@;EqAq$XXju&E!#pUIC-UjoCt zY%o>N%iKi@*j#r7s=&2UN!1OT+uw?>I{yn-!IDiN6ve}?(FF{KVHunttC}kI-OkDG z(BxZp?5W=H;CKsVof&AcKR(9`wm;R+r+SEg0qEyguUPG#J^eDOHoArqPO8&lS4swF z3T|K*SstMup^Pvie(64%UI)>Ms*KuJ=^9lvTcs6-61XC+h_6%xIA?y#9-GIGc#hvu(;1)#1h*2eF^rC3Bzsb9b+dJ^POQL1(U~3TLn(Kd6;O2p!L9rUDA@>G zqL}^qMfL*9IJSlXlZL=(xk14wH8xJtCUS(oa{_Do9

      P;9EX3XoYsfY(I`erix>A zN5~G~C~Rst(ySzE2TgX#muZJM+k*~y3RZr-5M$!;M5>^AR zvSD}_=sQY*yvc@5i**#W-T2uOf+8pqkAfz@+1Eo};{+`Z6z(+KmzR!_HY0Mfbj8Zb zT2@AI)~i;Fi!1AT-g0#PIha(&=7uTgD8U$kNAD;}2MZk}^E4`E@oUgyipXgux7%@~ z{!kedA|A~H#~Az(>|w9el~9zi2}r7=<|Nu@WPTEV{22lf!Bx$I?eM}%%_&sMe1fKA zw@Vs4yx$qr! z621!$#U5kHPop`9cJ1?S(z?>sS~=IeF#N8i*hXDx|B11FcoaF6YRZ~Cl9Q@D`i@rpL0c08+>|!Oys#r|`S&$`)C4vI{0iKTCgcsA74FIPPomvS zPGYcyi~?VGJqiDGEvFBY=gX*mfS(;l@C5@*!&hKx{f#3A<@vNw}CuT)Ii7 zbc$X7{Nm!pMJ}M633$AD8s%)rw2FGEV%Cb5?Mh{%WbtF<9Yb+bqbzI!Y6%E_gbxv1hgRWP#gM$6P5FWxtd1n~f+5-p* WJ9r~ZWvZaEh%hRuf+R*VTJS$J?qGia diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/upload.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/upload.cpython-37.pyc index 635fbd8b60bed1cba47319708c1f0e68280b5b7c..5654eab95e3841b087a7243a3067e444930b6e81 100644 GIT binary patch delta 263 zcmdm>u~388iIYofYZJyQ-#E^8DkBSQ*93UdxyE_)O^n9Y*I zk;@sy1!lA6aOd(w@qpQEIlQ@iQG8%Fdk%lDK$JkPV3Z)3&ygdPD;y;ZW^?9<k?BRGq(ZSr&>XCbkoIH3L_4-nxEB1ATS b6jEfAkpQwe7{QQWt9|~Z2rzv%)wZ^ zIh%V4Gh^mv0shB~vbI1M7YPH2Tb!;H$*Bb;nfZB|Ohx=4;kL;Ff{z(HCVvr}#n?Kz tU&vWpyeJkV;SM6aK!ga0(AxY&NRd%a3drVQghD1BCLTs01kwUv8UVoKJ(&Oi diff --git a/env/lib/python3.7/site-packages/setuptools/command/__pycache__/upload_docs.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/command/__pycache__/upload_docs.cpython-37.pyc index 605733915a8dc961ce6ecc89130b2ea1ab61f119..238e2cd58d714287f8b09726bebae46db20bfc6f 100644 GIT binary patch delta 35 pcmcble@UOmiIF+PDk(JCoXV6d3IL~|3Dy7r diff --git a/env/lib/python3.7/site-packages/setuptools/command/develop.py b/env/lib/python3.7/site-packages/setuptools/command/develop.py index fdc9fc4..009e4f9 100644 --- a/env/lib/python3.7/site-packages/setuptools/command/develop.py +++ b/env/lib/python3.7/site-packages/setuptools/command/develop.py @@ -7,7 +7,7 @@ import io from setuptools.extern import six -from pkg_resources import Distribution, PathMetadata, normalize_path +import pkg_resources from setuptools.command.easy_install import easy_install from setuptools import namespaces import setuptools @@ -65,9 +65,9 @@ class develop(namespaces.DevelopInstaller, easy_install): if self.egg_path is None: self.egg_path = os.path.abspath(ei.egg_base) - target = normalize_path(self.egg_base) - egg_path = normalize_path(os.path.join(self.install_dir, - self.egg_path)) + target = pkg_resources.normalize_path(self.egg_base) + egg_path = pkg_resources.normalize_path( + os.path.join(self.install_dir, self.egg_path)) if egg_path != target: raise DistutilsOptionError( "--egg-path must be a relative path from the install" @@ -75,9 +75,9 @@ class develop(namespaces.DevelopInstaller, easy_install): ) # Make a distribution for the package's source - self.dist = Distribution( + self.dist = pkg_resources.Distribution( target, - PathMetadata(target, os.path.abspath(ei.egg_info)), + pkg_resources.PathMetadata(target, os.path.abspath(ei.egg_info)), project_name=ei.egg_name ) @@ -97,13 +97,14 @@ class develop(namespaces.DevelopInstaller, easy_install): 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( + resolved = pkg_resources.normalize_path( os.path.join(install_dir, egg_path, path_to_setup) ) - if resolved != normalize_path(os.curdir): + if resolved != pkg_resources.normalize_path(os.curdir): raise DistutilsOptionError( "Can't get a consistent path to setup script from" - " installation directory", resolved, normalize_path(os.curdir)) + " installation directory", resolved, + pkg_resources.normalize_path(os.curdir)) return path_to_setup def install_for_development(self): @@ -114,7 +115,7 @@ class develop(namespaces.DevelopInstaller, easy_install): self.reinitialize_command('build_py', inplace=0) self.run_command('build_py') bpy_cmd = self.get_finalized_command("build_py") - build_path = normalize_path(bpy_cmd.build_lib) + build_path = pkg_resources.normalize_path(bpy_cmd.build_lib) # Build extensions self.reinitialize_command('egg_info', egg_base=build_path) @@ -128,7 +129,8 @@ class develop(namespaces.DevelopInstaller, easy_install): self.egg_path = build_path self.dist.location = build_path # XXX - self.dist._provider = PathMetadata(build_path, ei_cmd.egg_info) + self.dist._provider = pkg_resources.PathMetadata( + build_path, ei_cmd.egg_info) else: # Without 2to3 inplace works fine: self.run_command('egg_info') @@ -200,6 +202,7 @@ class VersionlessRequirement: name as the 'requirement' so that scripts will work across multiple versions. + >>> from pkg_resources import Distribution >>> dist = Distribution(project_name='foo', version='1.0') >>> str(dist.as_requirement()) 'foo==1.0' diff --git a/env/lib/python3.7/site-packages/setuptools/command/egg_info.py b/env/lib/python3.7/site-packages/setuptools/command/egg_info.py index d9fe3da..5d8f451 100644 --- a/env/lib/python3.7/site-packages/setuptools/command/egg_info.py +++ b/env/lib/python3.7/site-packages/setuptools/command/egg_info.py @@ -568,6 +568,7 @@ class manifest_maker(sdist): def add_defaults(self): sdist.add_defaults(self) + self.check_license() self.filelist.append(self.template) self.filelist.append(self.manifest) rcfiles = list(walk_revctrl()) diff --git a/env/lib/python3.7/site-packages/setuptools/command/sdist.py b/env/lib/python3.7/site-packages/setuptools/command/sdist.py index bcfae4d..dc25398 100644 --- a/env/lib/python3.7/site-packages/setuptools/command/sdist.py +++ b/env/lib/python3.7/site-packages/setuptools/command/sdist.py @@ -198,3 +198,24 @@ class sdist(sdist_add_defaults, orig.sdist): continue self.filelist.append(line) manifest.close() + + def check_license(self): + """Checks if license_file' is configured and adds it to + 'self.filelist' if the value contains a valid path. + """ + + opts = self.distribution.get_option_dict('metadata') + + # ignore the source of the value + _, license_file = opts.get('license_file', (None, None)) + + if license_file is None: + log.debug("'license_file' option was not specified") + return + + if not os.path.exists(license_file): + log.warn("warning: Failed to find the configured license file '%s'", + license_file) + return + + self.filelist.append(license_file) diff --git a/env/lib/python3.7/site-packages/setuptools/command/test.py b/env/lib/python3.7/site-packages/setuptools/command/test.py index dde0118..973e4eb 100644 --- a/env/lib/python3.7/site-packages/setuptools/command/test.py +++ b/env/lib/python3.7/site-packages/setuptools/command/test.py @@ -15,6 +15,7 @@ from pkg_resources import (resource_listdir, resource_exists, normalize_path, working_set, _namespace_packages, evaluate_marker, add_activation_listener, require, EntryPoint) from setuptools import Command +from .build_py import _unique_everseen __metaclass__ = type @@ -186,7 +187,7 @@ class test(Command): orig_pythonpath = os.environ.get('PYTHONPATH', nothing) current_pythonpath = os.environ.get('PYTHONPATH', '') try: - prefix = os.pathsep.join(paths) + prefix = os.pathsep.join(_unique_everseen(paths)) to_join = filter(None, [prefix, current_pythonpath]) new_path = os.pathsep.join(to_join) if new_path: diff --git a/env/lib/python3.7/site-packages/setuptools/command/upload.py b/env/lib/python3.7/site-packages/setuptools/command/upload.py index dd17f7a..6db8888 100644 --- a/env/lib/python3.7/site-packages/setuptools/command/upload.py +++ b/env/lib/python3.7/site-packages/setuptools/command/upload.py @@ -2,7 +2,6 @@ import io import os import hashlib import getpass -import platform from base64 import standard_b64encode @@ -16,6 +15,7 @@ from setuptools.extern.six.moves.urllib.request import urlopen, Request from setuptools.extern.six.moves.urllib.error import HTTPError from setuptools.extern.six.moves.urllib.parse import urlparse + class upload(orig.upload): """ Override default upload behavior to obtain password @@ -80,7 +80,7 @@ class upload(orig.upload): 'version': meta.get_version(), # file content - 'content': (os.path.basename(filename),content), + 'content': (os.path.basename(filename), content), 'filetype': command, 'pyversion': pyversion, 'md5_digest': hashlib.md5(content).hexdigest(), diff --git a/env/lib/python3.7/site-packages/setuptools/config.py b/env/lib/python3.7/site-packages/setuptools/config.py index d1ac673..b662604 100644 --- a/env/lib/python3.7/site-packages/setuptools/config.py +++ b/env/lib/python3.7/site-packages/setuptools/config.py @@ -246,6 +246,26 @@ class ConfigHandler: value = value.lower() return value in ('1', 'true', 'yes') + @classmethod + def _exclude_files_parser(cls, key): + """Returns a parser function to make sure field inputs + are not files. + + Parses a value after getting the key so error messages are + more informative. + + :param key: + :rtype: callable + """ + def parser(value): + exclude_directive = 'file:' + if value.startswith(exclude_directive): + raise ValueError( + 'Only strings are accepted for the {0} field, ' + 'files are not accepted'.format(key)) + return value + return parser + @classmethod def _parse_file(cls, value): """Represents value as a string, allowing including text @@ -255,7 +275,6 @@ class ConfigHandler: directory with setup.py. Examples: - file: LICENSE file: README.rst, CHANGELOG.md, src/file.txt :param str value: @@ -394,7 +413,7 @@ class ConfigHandler: section_parser_method = getattr( self, - # Dots in section names are tranlsated into dunderscores. + # Dots in section names are translated into dunderscores. ('parse_section%s' % method_postfix).replace('.', '__'), None) @@ -407,8 +426,8 @@ class ConfigHandler: def _deprecated_config_handler(self, func, msg, warning_class): """ this function will wrap around parameters that are deprecated - - :param msg: deprecation message + + :param msg: deprecation message :param warning_class: class of warning exception to be raised :param func: function to be wrapped around """ @@ -416,7 +435,7 @@ class ConfigHandler: def config_handler(*args, **kwargs): warnings.warn(msg, warning_class) return func(*args, **kwargs) - + return config_handler @@ -449,18 +468,20 @@ class ConfigMetadataHandler(ConfigHandler): parse_list = self._parse_list parse_file = self._parse_file parse_dict = self._parse_dict + exclude_files_parser = self._exclude_files_parser return { 'platforms': parse_list, 'keywords': parse_list, 'provides': parse_list, - 'requires': self._deprecated_config_handler(parse_list, - "The requires parameter is deprecated, please use " + + 'requires': self._deprecated_config_handler( + parse_list, + "The requires parameter is deprecated, please use " "install_requires for runtime dependencies.", DeprecationWarning), 'obsoletes': parse_list, 'classifiers': self._get_parser_compound(parse_file, parse_list), - 'license': parse_file, + 'license': exclude_files_parser('license'), 'description': parse_file, 'long_description': parse_file, 'version': self._parse_version, diff --git a/env/lib/python3.7/site-packages/setuptools/dist.py b/env/lib/python3.7/site-packages/setuptools/dist.py index 7062ae8..9a165de 100644 --- a/env/lib/python3.7/site-packages/setuptools/dist.py +++ b/env/lib/python3.7/site-packages/setuptools/dist.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- __all__ = ['Distribution'] +import io +import sys import re import os import warnings @@ -9,9 +11,11 @@ import distutils.log import distutils.core import distutils.cmd import distutils.dist +from distutils.util import strtobool +from distutils.debug import DEBUG +from distutils.fancy_getopt import translate_longopt import itertools - from collections import defaultdict from email import message_from_file @@ -32,7 +36,6 @@ 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__('setuptools.extern.packaging.specifiers') __import__('setuptools.extern.packaging.version') @@ -130,7 +133,6 @@ def write_pkg_file(self, file): def write_field(key, value): file.write("%s: %s\n" % (key, value)) - write_field('Metadata-Version', str(version)) write_field('Name', self.get_name()) write_field('Version', self.get_version()) @@ -332,7 +334,7 @@ def check_packages(dist, attr, value): _Distribution = get_unpatched(distutils.core.Distribution) -class Distribution(Distribution_parse_config_files, _Distribution): +class Distribution(_Distribution): """Distribution with support for features, tests, and package data This is an enhanced version of 'distutils.dist.Distribution' that @@ -556,12 +558,141 @@ class Distribution(Distribution_parse_config_files, _Distribution): req.marker = None return req + def _parse_config_files(self, filenames=None): + """ + Adapted from distutils.dist.Distribution.parse_config_files, + this method provides the same functionality in subtly-improved + ways. + """ + from setuptools.extern.six.moves.configparser import ConfigParser + + # Ignore install directory options if we have a venv + if six.PY3 and 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() + for filename in filenames: + with io.open(filename, encoding='utf-8') as reader: + if DEBUG: + self.announce(" reading {filename}".format(**locals())) + (parser.read_file if six.PY3 else parser.readfp)(reader) + 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 = self._try_str(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) + + @staticmethod + def _try_str(val): + """ + On Python 2, much of distutils relies on string values being of + type 'str' (bytes) and not unicode text. If the value can be safely + encoded to bytes using the default encoding, prefer that. + + Why the default encoding? Because that value can be implicitly + decoded back to text if needed. + + Ref #1653 + """ + if six.PY3: + return val + try: + return val.encode() + except UnicodeEncodeError: + pass + return val + + def _set_command_options(self, command_obj, option_dict=None): + """ + Set the options for 'command_obj' from 'option_dict'. Basically + this means copying elements of a dictionary ('option_dict') to + attributes of an instance ('command'). + + 'command_obj' must be a Command instance. If 'option_dict' is not + supplied, uses the standard option dictionary for this command + (from 'self.command_options'). + + (Adopted from distutils.dist.Distribution._set_command_options) + """ + command_name = command_obj.get_command_name() + if option_dict is None: + option_dict = self.get_option_dict(command_name) + + if DEBUG: + self.announce(" setting options for '%s' command:" % command_name) + for (option, (source, value)) in option_dict.items(): + if DEBUG: + self.announce(" %s = %s (from %s)" % (option, value, + source)) + try: + bool_opts = [translate_longopt(o) + for o in command_obj.boolean_options] + except AttributeError: + bool_opts = [] + try: + neg_opt = command_obj.negative_opt + except AttributeError: + neg_opt = {} + + try: + is_string = isinstance(value, six.string_types) + if option in neg_opt and is_string: + setattr(command_obj, neg_opt[option], not strtobool(value)) + elif option in bool_opts and is_string: + setattr(command_obj, option, strtobool(value)) + elif hasattr(command_obj, option): + setattr(command_obj, option, value) + else: + raise DistutilsOptionError( + "error in %s: command '%s' has no such option '%s'" + % (source, command_name, option)) + except ValueError as msg: + raise DistutilsOptionError(msg) + def parse_config_files(self, filenames=None, ignore_option_errors=False): """Parses configuration files from various levels and loads configuration. """ - _Distribution.parse_config_files(self, filenames=filenames) + self._parse_config_files(filenames=filenames) parse_configuration(self, self.command_options, ignore_option_errors=ignore_option_errors) @@ -747,7 +878,7 @@ class Distribution(Distribution_parse_config_files, _Distribution): 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 + For example, 'dist.include(py_modules=["x"])' would add 'x' to the distribution's 'py_modules' attribute, if it was not already there. @@ -965,7 +1096,6 @@ class Distribution(Distribution_parse_config_files, _Distribution): return _Distribution.handle_display_options(self, option_order) # Stdout may be StringIO (e.g. in tests) - import io if not isinstance(sys.stdout, io.TextIOWrapper): return _Distribution.handle_display_options(self, option_order) @@ -1144,4 +1274,5 @@ class Feature: class DistDeprecationWarning(SetuptoolsDeprecationWarning): - """Class for warning about deprecations in dist in setuptools. Not ignored by default, unlike DeprecationWarning.""" + """Class for warning about deprecations in dist in + setuptools. Not ignored by default, unlike DeprecationWarning.""" diff --git a/env/lib/python3.7/site-packages/setuptools/extern/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/setuptools/extern/__pycache__/__init__.cpython-37.pyc index e0e2c8aca8de703facbc221c480fe38bf3dd9fca..5a22f7ec86cf7bcdb27baa1ea8b08db03c50c27b 100644 GIT binary patch delta 35 pcmX>pbW(`NiIA2(|zK delta 35 pcmX>pbW(`NiIF+PDk(JCEW@PB4gi;c2&w=8 diff --git a/env/lib/python3.7/site-packages/setuptools/package_index.py b/env/lib/python3.7/site-packages/setuptools/package_index.py index 1608b91..6b06f2c 100644 --- a/env/lib/python3.7/site-packages/setuptools/package_index.py +++ b/env/lib/python3.7/site-packages/setuptools/package_index.py @@ -856,7 +856,7 @@ class PackageIndex(Environment): 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) - auth, host = urllib.parse.splituser(netloc) + auth, host = _splituser(netloc) if auth: if ':' in auth: user, pw = auth.split(':', 1) @@ -897,7 +897,7 @@ class PackageIndex(Environment): if rev is not None: self.info("Checking out %s", rev) - os.system("(cd %s && git checkout --quiet %s)" % ( + os.system("git -C %s checkout --quiet %s" % ( filename, rev, )) @@ -913,7 +913,7 @@ class PackageIndex(Environment): if rev is not None: self.info("Updating to %s", rev) - os.system("(cd %s && hg up -C -r %s -q)" % ( + os.system("hg --cwd %s up -C -r %s -q" % ( filename, rev, )) @@ -1047,7 +1047,8 @@ class PyPIConfig(configparser.RawConfigParser): def open_with_auth(url, opener=urllib.request.urlopen): """Open a urllib2 request, handling HTTP authentication""" - scheme, netloc, path, params, query, frag = urllib.parse.urlparse(url) + parsed = urllib.parse.urlparse(url) + scheme, netloc, path, params, query, frag = parsed # Double scheme does not raise on Mac OS X as revealed by a # failing test. We would expect "nonnumeric port". Refs #20. @@ -1055,7 +1056,7 @@ def open_with_auth(url, opener=urllib.request.urlopen): raise http_client.InvalidURL("nonnumeric port: ''") if scheme in ('http', 'https'): - auth, host = urllib.parse.splituser(netloc) + auth, address = _splituser(netloc) else: auth = None @@ -1068,7 +1069,7 @@ def open_with_auth(url, opener=urllib.request.urlopen): if auth: auth = "Basic " + _encode_auth(auth) - parts = scheme, host, path, params, query, frag + parts = scheme, address, path, params, query, frag new_url = urllib.parse.urlunparse(parts) request = urllib.request.Request(new_url) request.add_header("Authorization", auth) @@ -1082,13 +1083,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 == address: parts = s2, netloc, path2, param2, query2, frag2 fp.url = urllib.parse.urlunparse(parts) return fp +# copy of urllib.parse._splituser from Python 3.8 +def _splituser(host): + """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" + user, delim, host = host.rpartition('@') + return (user if delim else None), host + + # adding a timeout to avoid freezing package_index open_with_auth = socket_timeout(_SOCKET_TIMEOUT)(open_with_auth) diff --git a/env/lib/python3.7/site-packages/setuptools/pep425tags.py b/env/lib/python3.7/site-packages/setuptools/pep425tags.py index 8bf4277..48745a2 100644 --- a/env/lib/python3.7/site-packages/setuptools/pep425tags.py +++ b/env/lib/python3.7/site-packages/setuptools/pep425tags.py @@ -161,7 +161,7 @@ def is_manylinux1_compatible(): 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 macOS machine. + the given major, minor and machine architecture of a macOS machine. """ arches = [] diff --git a/env/lib/python3.7/site-packages/setuptools/py31compat.py b/env/lib/python3.7/site-packages/setuptools/py31compat.py index 1a0705e..e1da7ee 100644 --- a/env/lib/python3.7/site-packages/setuptools/py31compat.py +++ b/env/lib/python3.7/site-packages/setuptools/py31compat.py @@ -17,9 +17,9 @@ except ImportError: errors on deletion. """ - def __init__(self): + def __init__(self, **kwargs): self.name = None # Handle mkdtemp raising an exception - self.name = tempfile.mkdtemp() + self.name = tempfile.mkdtemp(**kwargs) def __enter__(self): return self.name diff --git a/env/lib/python3.7/site-packages/setuptools/py36compat.py b/env/lib/python3.7/site-packages/setuptools/py36compat.py deleted file mode 100644 index f527969..0000000 --- a/env/lib/python3.7/site-packages/setuptools/py36compat.py +++ /dev/null @@ -1,82 +0,0 @@ -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/env/lib/python3.7/site-packages/setuptools/ssl_support.py b/env/lib/python3.7/site-packages/setuptools/ssl_support.py index 6362f1f..226db69 100644 --- a/env/lib/python3.7/site-packages/setuptools/ssl_support.py +++ b/env/lib/python3.7/site-packages/setuptools/ssl_support.py @@ -59,7 +59,7 @@ if not match_hostname: def _dnsname_match(dn, hostname, max_wildcards=1): """Matching according to RFC 6125, section 6.4.3 - http://tools.ietf.org/html/rfc6125#section-6.4.3 + https://tools.ietf.org/html/rfc6125#section-6.4.3 """ pats = [] if not dn: diff --git a/env/lib/python3.7/site-packages/setuptools/wheel.py b/env/lib/python3.7/site-packages/setuptools/wheel.py index 95a794a..e11f0a1 100644 --- a/env/lib/python3.7/site-packages/setuptools/wheel.py +++ b/env/lib/python3.7/site-packages/setuptools/wheel.py @@ -8,10 +8,11 @@ import posixpath import re import zipfile -from pkg_resources import Distribution, PathMetadata, parse_version +import pkg_resources +import setuptools +from pkg_resources import parse_version from setuptools.extern.packaging.utils import canonicalize_name from setuptools.extern.six import PY3 -from setuptools import Distribution as SetuptoolsDistribution from setuptools import pep425tags from setuptools.command.egg_info import write_requirements @@ -79,7 +80,7 @@ class Wheel: return next((True for t in self.tags() if t in supported_tags), False) def egg_name(self): - return Distribution( + return pkg_resources.Distribution( project_name=self.project_name, version=self.version, platform=(None if self.platform == 'any' else get_platform()), ).egg_name() + '.egg' @@ -130,9 +131,9 @@ class Wheel: zf.extractall(destination_eggdir) # Convert metadata. dist_info = os.path.join(destination_eggdir, dist_info) - dist = Distribution.from_location( + dist = pkg_resources.Distribution.from_location( destination_eggdir, dist_info, - metadata=PathMetadata(destination_eggdir, dist_info), + metadata=pkg_resources.PathMetadata(destination_eggdir, dist_info), ) # Note: Evaluate and strip markers now, @@ -155,7 +156,7 @@ class Wheel: os.path.join(egg_info, 'METADATA'), os.path.join(egg_info, 'PKG-INFO'), ) - setup_dist = SetuptoolsDistribution( + setup_dist = setuptools.Distribution( attrs=dict( install_requires=install_requires, extras_require=extras_require, diff --git a/env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/INSTALLER b/env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/LICENSE.txt b/env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/LICENSE.txt deleted file mode 100644 index c3441e6..0000000 --- a/env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/LICENSE.txt +++ /dev/null @@ -1,22 +0,0 @@ -"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/env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/METADATA b/env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/METADATA deleted file mode 100644 index cef8071..0000000 --- a/env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/METADATA +++ /dev/null @@ -1,60 +0,0 @@ -Metadata-Version: 2.1 -Name: wheel -Version: 0.32.3 -Summary: A built-package format for Python. -Home-page: https://github.com/pypa/wheel -Author: Daniel Holth -Author-email: dholth@fastmail.fm -Maintainer: Alex Grönholm -Maintainer-email: alex.gronholm@nextday.fi -License: MIT -Project-URL: Issue Tracker, https://github.com/pypa/wheel/issues -Project-URL: Documentation, https://wheel.readthedocs.io/ -Project-URL: Changelog, https://wheel.readthedocs.io/en/stable/news.html -Keywords: wheel,packaging -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Topic :: System :: Archiving :: Packaging -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* -Provides-Extra: test -Requires-Dist: pytest (>=3.0.0) ; extra == 'test' -Requires-Dist: pytest-cov ; extra == 'test' - -wheel -===== - -This library is the reference implementation of the Python wheel packaging -standard, as defined in `PEP 427`_. - -It has two different roles: - -#. A setuptools_ extension for building wheels that provides the - ``bdist_wheel`` setuptools command -#. A command line tool for working with wheel files - -It should be noted that wheel is **not** intended to be used as a library, and -as such there is no stable, public API. - -.. _PEP 427: https://www.python.org/dev/peps/pep-0427/ -.. _setuptools: https://pypi.org/project/setuptools/ - - -Code of Conduct ---------------- - -Everyone interacting in the wheel 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/env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/RECORD b/env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/RECORD deleted file mode 100644 index b535e48..0000000 --- a/env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/RECORD +++ /dev/null @@ -1,34 +0,0 @@ -wheel/__init__.py,sha256=AgAP7YAmbZj84_nCH9za8R0UXHylXdfKNSyg5g1xLZ4,96 -wheel/__main__.py,sha256=lF-YLO4hdQmoWuh4eWZd8YL1U95RSdm76sNLBXa0vjE,417 -wheel/bdist_wheel.py,sha256=0hM63ZD01ATEMRAr6t0mbmhf2y8pbRkMnWGioed9n-o,14627 -wheel/metadata.py,sha256=a3QgT8C4QOvrS-8RFdNCn7XWUUqEZpcHelmI8XLTDnY,4691 -wheel/pep425tags.py,sha256=Jdjbnq17kqwPRKJCMb2E1VccNgnC3H6iQL7VGaxkPao,5908 -wheel/pkginfo.py,sha256=GR76kupQzn1x9sKDaXuE6B6FsZ4OkfRtG7pndlXPvQ4,1257 -wheel/util.py,sha256=bYkw5oMccfazVCoYQwKkkemoVyMAFoR34mmKBx8R1NI,859 -wheel/wheelfile.py,sha256=mxv8kcRvXMME4xQstpiiQv59bHc42edS6z8kDAco6iw,6990 -wheel/cli/__init__.py,sha256=DsCXkrL_jsTHoR0nhmcwkrlNdkaXw0uV0NL-yYoYQuU,2461 -wheel/cli/convert.py,sha256=me0l6G4gSw-EBVhzjSr7yWYWBp9spMz7mnXlyJTiXso,9497 -wheel/cli/install.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -wheel/cli/pack.py,sha256=RViq4mnUk8s7R5kcrgX0XntX2zalDTeoTSBzLk31SaI,2145 -wheel/cli/unpack.py,sha256=0VWzT7U_xyenTPwEVavxqvdee93GPvAFHnR3Uu91aRc,673 -wheel-0.32.3.dist-info/LICENSE.txt,sha256=zKniDGrx_Pv2lAjzd3aShsvuvN7TNhAMm0o_NfvmNeQ,1125 -wheel-0.32.3.dist-info/METADATA,sha256=1gweIMsoaCjJWccLOuQJCZqj_cWYVM80LkUQosJ4wC8,2082 -wheel-0.32.3.dist-info/WHEEL,sha256=_wJFdOYk7i3xxT8ElOkUJvOdOvfNGbR9g-bf6UQT6sU,110 -wheel-0.32.3.dist-info/entry_points.txt,sha256=N8HbYFST3yrNQYeB2wXWBEPUhFsEtKNRPaCFGJPyqyc,108 -wheel-0.32.3.dist-info/top_level.txt,sha256=HxSBIbgEstMPe4eFawhA66Mq-QYHMopXVoAncfjb_1c,6 -wheel-0.32.3.dist-info/RECORD,, -../../../bin/wheel,sha256=C2tTqyXPXEVjwHG2wEstUaTSZQqHNo2IvGKL_5xerTw,254 -wheel-0.32.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -wheel/__pycache__/wheelfile.cpython-37.pyc,, -wheel/__pycache__/util.cpython-37.pyc,, -wheel/__pycache__/pkginfo.cpython-37.pyc,, -wheel/__pycache__/pep425tags.cpython-37.pyc,, -wheel/__pycache__/metadata.cpython-37.pyc,, -wheel/__pycache__/bdist_wheel.cpython-37.pyc,, -wheel/__pycache__/__main__.cpython-37.pyc,, -wheel/__pycache__/__init__.cpython-37.pyc,, -wheel/cli/__pycache__/unpack.cpython-37.pyc,, -wheel/cli/__pycache__/pack.cpython-37.pyc,, -wheel/cli/__pycache__/install.cpython-37.pyc,, -wheel/cli/__pycache__/convert.cpython-37.pyc,, -wheel/cli/__pycache__/__init__.cpython-37.pyc,, diff --git a/env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/WHEEL b/env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/WHEEL deleted file mode 100644 index c4bde30..0000000 --- a/env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.32.3) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/entry_points.txt b/env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/entry_points.txt deleted file mode 100644 index b27acad..0000000 --- a/env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/entry_points.txt +++ /dev/null @@ -1,6 +0,0 @@ -[console_scripts] -wheel = wheel.cli:main - -[distutils.commands] -bdist_wheel = wheel.bdist_wheel:bdist_wheel - diff --git a/env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/top_level.txt b/env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/top_level.txt deleted file mode 100644 index 2309722..0000000 --- a/env/lib/python3.7/site-packages/wheel-0.32.3.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -wheel diff --git a/env/lib/python3.7/site-packages/wheel/__init__.py b/env/lib/python3.7/site-packages/wheel/__init__.py index 6938633..0f8ca70 100644 --- a/env/lib/python3.7/site-packages/wheel/__init__.py +++ b/env/lib/python3.7/site-packages/wheel/__init__.py @@ -1,2 +1,2 @@ # __variables__ with double-quoted values will be available in setup.py: -__version__ = "0.32.3" +__version__ = "0.33.4" diff --git a/env/lib/python3.7/site-packages/wheel/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/wheel/__pycache__/__init__.cpython-37.pyc index ada2e521b44aa9e5c27263690f9e46ae203e3bd5..f342b641bd0e7d2c7e82adb359f9e626a0c20ee6 100644 GIT binary patch delta 45 xcmbQoIFFIXiIF+PDk(IXJehF{0E)*6b^rhX diff --git a/env/lib/python3.7/site-packages/wheel/__pycache__/bdist_wheel.cpython-37.pyc b/env/lib/python3.7/site-packages/wheel/__pycache__/bdist_wheel.cpython-37.pyc index 6fbc88914340d2cd55d65b5f5255f72a08525454..44680ff6f99d86fc0f1b32ecf4d3c2fb16a4560d 100644 GIT binary patch delta 1093 zcmYjQO>7%Q6rMNhUH`7_q)BWishdA1b)bO?RDM)w1r>)%M9@|$s;I2gvx)84>vVQg zQZXwd8KIz3wbBShB1PI2YB?ghQia5!;@%rvx;HrY#*G8w&AI|sn&kN66Ub7g3);{G=_H&}$m+}p0I;h=SdwWhb(?ysY6z{7M6K3H zDJ^~`;w&9IrO_#Y&WS-Ivv-_j&XKEgp6+Ia#D!KSPz4CUoc`crI74H*omnjLSE z9Noe%1>|GROL{3U&BpyQiYg*0QX(BBybNa3cfnaztzOnH|NC+SJ!XW~nGGPIUKX>X z>4e6btR}ck%Rb-V5ZjpRQE|8Ci`vU3*$5?rb z3^o5nR&h@ZiO6qi&%e*LyVO~YS2c}7V>C?XrI>wLF+;RtLE+3)o>Z01Ng@eEGN z&n6cNk-pjIP3sDF>~uGpVK8|aN=5z#{#1EOg^mhc6>OO)9pqF_AOi*%H2l8wC%~uj zuu_8q`Ag+>*q47*-pn4LB+`1$7MJqO^jZBY%+vDo=|A)@5mm$OnI1r0KAk;p>>|N; zW&P+=IFwrTZF3)qx-lByfn2Yig<5#0`VEEKa&`V3oC*8$CjgrA+l4MtnZ=b;KPZa= zhDh&ivo`0C6izk!xFBv>{GLh^+}dFL10~I?5X!B^HRC4*AIrnVd-^SeZ^_e3zb<`^ zC^A23Sys1k!{Sc6Z*z46u7>BK3b*7dwM%e8?$>7Fk-T4P!DE?UzF2#pifWWA>9~Kh U-L<&-`}6po;|l#IzgXV;2RS+^X#fBK delta 1020 zcmYjQNoW*76s@XWW=l^r&aN4gOlC}6;w8AE#03S#;D(AsT1}0~OeT}0x?QOzhXF-{ z7%4;)A>ERL2R(#QFXBP;=t(_j-wYnTc^7|mf;v!t-uwU6>;Hexyczs`#Mo;XQ3Ri} zbEToeg7J}rhp&#*tM*iX^E>HR@D`EMOU+&S&)9S;$Rcp|!Lc#~A&y)`v4+QI%>`ze^kfOy$JXXb7S%weU>>77Cog;G|HED`xmw4~^_c=QHuizW>x8y)O?ug@+ysSs6})BZFoe1^gq!rxkm5}1PRI$$*hpS+c<)oVPut%IIu+_AUu9EgN;il|0aHHMLd#Hi!wE^ys7__nf zJYv9MXt#43Bwf5^xw`@&SaBfihDy=H(8Lov>Xw$+a!u~5$RjkFMqp&v>$pKv4RUXV z6X$WahexFgY!Mwp$I%&N_kzBirbkdiao5v~y`h1)aY??;GxB|IoF!HwSXCC-@~Wzv zf^476G{BCc6R0;g=o=R=S8CL>hFN9OwtRi^x;;8k_q8DHhbnc;zEG>36my9bJ|JEt ze&WsIX|k*NC3yD-TZHlKHH!q^mkR}E4J3+uMLkQVY^;cMe#w8Gd+iNnJa zFeodR*<(pnR=z;lQ7Mhfups6Oefnz&--@q=C)#a*+r{3!)@`sloq#&yYhpHWH{84VR=aR_V^*wq!YuY$@WUwOR-oS#c##o(g{2- S=1SREFm9WyeG>0W*Zu(IX%y)I diff --git a/env/lib/python3.7/site-packages/wheel/__pycache__/metadata.cpython-37.pyc b/env/lib/python3.7/site-packages/wheel/__pycache__/metadata.cpython-37.pyc index 90e9a6a6f7660c3c313f15d8a72546add0ce4e33..cc2b30989c7fea77e53cc5cd6f1f326f260646dd 100644 GIT binary patch delta 288 zcmeB`ohHlc#LLUY00eo9C1RsD@}@9xq!d=>RT!paOs-^#6J-TTB?EDB5Rj;Y)A!98|4NH+#3R4Y>7z2>al*K+-jyZ{uV{#+2E>jWr4RHlxMn*Wt9|~Os-^#6J-HPB?ED>ACRc7z2>al*Kk#i8+apeR3QzL(YDtBGbu-ICF%H zOo0ktvH%H9rkBh>s>ph>BUcl*8Hi~CB5Wp~KFiSBCF|jZfd2aUSsbgleoqUczQpyD=af`V)wWNp%$SSf2a}!fi wiX0|83P>?}PL2@>W^|ssL0~mw(&QLHbw>BeErLnhAZF+PDk(JC+|QWB0syPi3K{?a diff --git a/env/lib/python3.7/site-packages/wheel/__pycache__/util.cpython-37.pyc b/env/lib/python3.7/site-packages/wheel/__pycache__/util.cpython-37.pyc index ce1530e3c6ed4ce23add0997190a567db16fad45..31ba8b7213623f80db0b5d5c11964b7be8b48c30 100644 GIT binary patch delta 318 zcmXYrze)o^5XN`*?)LWnB?>8$6becT2`IK=q3KekNVgy&%*I>{n|OD|T%#7j!tU7C z&OC?KzQVnMuVCd~;tb4>@B4;fzP(>B>P3-HOsS9N)q4@Oo--qmAWVta5(I2C6;#rR zg``E0-jU>7+QN}AVZy~a+UTr6aMh6B#&wOmgKX=fi+n|dj~@Dl0R|Wvh8SVZFhUrT zqurnCkD_?%;C-%^r=#)7<5G3=-nYzj1g$(osJV8T$!5Z2c=_l;#L+b@P zdTqTzS9k4$vszL&7fTw?N-NFNGF-?cjc4jQR-;+sm@H{l3vMsZWZEB;e3&J%y6q42 Z+`imvn~Z~Ls|Ge@G<2%zGwyK4*&njsP9XpQ delta 233 zcmeyxd6JXYiIq98P56k{r57E=m?Btr^QHbaqK zDsvP|3V#Yq3Tq2v6l)$|DjSe5kirJxr?97Rv@k@mr*Nil0cnmD?i3y%&6&cR!Uv?e zCeE6wnp~cqmsL_|qF K4pt5}4mJRz?>3tN diff --git a/env/lib/python3.7/site-packages/wheel/__pycache__/wheelfile.cpython-37.pyc b/env/lib/python3.7/site-packages/wheel/__pycache__/wheelfile.cpython-37.pyc index fb9774151b6d614b5b982b9908d6fca99cbba7f1..ca28521eac357d78a4fe471f22b4de9eb3430117 100644 GIT binary patch delta 1844 zcmZux&2Jk;6rb5Iuh;g*vGd`$X%eb7se?!Zs1cM2t za4pD%d8Z(`9@ycKGZYq`VmRy!OPLXr!m?AAJQIwBqt0kJ=8T2o&UjdHD&d4P5mucl zCBD($$IJu1u`#);IQvN`Vu{533Dyxt@irL zg}sE9DXpZRC}SqOcC&rs`9?GSUO6&U0S_Y${Zy-zSNHx_Dk_~!b>kaa+WXEZ)3dXn z69)I|9nORnwAwyD1R}?5dQsDjdZEyw)-7LTy7U@`om$!#!xNFuZQpZ!@89LMZ%NmLE&C!prj*F_H0j z9Zh^HJ|ZXgx{X%gM?tz?xI}NH4+^Ib$7Vm9=o{891(qAIlaO7}f&m$NJ@~Vr-FqRx6BuXyx z8(uGn-6y&7E^6gR%_DmaVF5s>f#2pwfZ^v&hl~5?Iw;l~7($`T?0YJb9BsIpUMe2l z#*{`oR2b2>0C&g+l;hPb{~Q=)^r|8mV65(tEgEYZdP14PRHiZgp0=eVO5ga1G$=Dz z=C%o^lzwKHoFY4Pmr?>+GtPq4+MW8lm<3q8 zL;Ays8kZ8rIaf8;cQSVXN)M9bTt!1b^WBHqn8+2qVH^CgjTOJIWS?0rn&`Q5YE~i8?OBlF$j# zP%jfot|^Ry1qy!#4z1ScApV+A78dzU5b+ZTw*WvVGv;wAKg=$#`)&V5mmmLv5R*g- z?9%k~_u+%v0=F|*w+Q)x*2aX==*s#W6gOs*Q0vikVaQ4VCkJz9GZH#@9Y(@@BpGx8 zS#UDXWa?Dm296$c%n{y3koi~uCOmW9kFR?{&*vFj>-C@$`893eL4=z>M2Hd4p-0Zi zcJMI>K7$dVhA35P&=S?Cr57RfM_^^pk@U;bs5uF02;F4*bLo{8>`>4on%)aXmv|2r zvI`Ds^gUc+Ee&kM2mX`Dk0Z+Wfnqv6QJ#1eS&gpNW`yOsjb7a2zUy*~F#iBSzLx1k z3tca64w{w1eZGOZ(e!S4mR?Nv$`=)Ge>yUDX%59QWO(oYJuS>-Xb`=?KaM#S%>d*T WlRo+9q4-CXJe|=rMWLo@W&Q;?>6t75 delta 1663 zcmZuxOK%)S5bo-E?(FQt_Qvld5^NqD1t%g2C`t$@#Cf1#JA@b*B^p-Sv+-kQchfV* zma{7(IY5NO!5XAU2#NKD6XIf!I3mOe@e7(07jotb7pi7O5+P>PUw_k8Q(aw;{{GnG zqs5Dbg2V9fzB+t+Zfd7E4&Uq?Ik2S*CU|IgMmC$CiL(}3k?q;Qkn3SCa=d)TjnIt> zULh)a#i-CF#;tHT8u3P=idTvDdHbSKZ!{Y7#()Jze_Yssu`;pCy-86J zIpI72Z|Vvwio9?iFyRKJZOxnB`6B=$y$+Z5zJL*cvGiL$YB$#JwpNmRr_*2giP9(@ zA=c?2+9b${Jx3eYU@Cpy{2GS#elbU&atLM0ltH5{h0??2Rv@eCpVq<37z$(tUB!z$T~>GYtZVtX#6iq=S>H{s z7LVEmNnXmKbfb7+Y=Vs2apFhGaug_wSX%_?&&8AT6d0Ku;eBGOqzX;N<3#Bg__{JS zvuI`BJaI|Bhk764h>HjeTqwdY9|bpkz4XJK5SQe20+S%KP63k(1QZK3?2DjTUkekz z9^P$ZD3&7WlQc`8OY9;6C0A)-(2_IAD3R&A<^4x8H;pC*OBqY`c**}y%q02nY5HaP z%$A1Cz(I5TF~UQ(g8j6blN-oDz$(ueqTqe)6V?Qw3H^bMQr_2h*(J6OyU>F!2%~S{ zs<{gHOcJ)OD>>d|@=J;m* ze((7G-YXf-)%c(vUdsZfD?W2luA$9Ap?`p^23cD?ZN$HF=kErsV51{1JR%o3g3i;$ z;p*0=>7d!;4*t`?)n&%MgW8bd%}&-wgC@L%5@ldnNAX~9I>Vp_vb0hiN=ijmW^#oX zm%o`(KUgcx>SGh%uDhfeq>kCpmpl>No788k+yoK z#-4VHphZ+2^s7*TUce)lfW*;Bp%VuZwM2;Vw+; KI_F?(j`a^>?`3ZQ diff --git a/env/lib/python3.7/site-packages/wheel/bdist_wheel.py b/env/lib/python3.7/site-packages/wheel/bdist_wheel.py index 5796970..c79307b 100644 --- a/env/lib/python3.7/site-packages/wheel/bdist_wheel.py +++ b/env/lib/python3.7/site-packages/wheel/bdist_wheel.py @@ -57,7 +57,7 @@ class bdist_wheel(Command): ('skip-build', None, "skip rebuilding everything (for testing/debugging)"), ('relative', None, - "build the archive using relative paths" + "build the archive using relative paths " "(default: false)"), ('owner=', 'u', "Owner name used when creating a tar file" @@ -183,6 +183,10 @@ class bdist_wheel(Command): def run(self): build_scripts = self.reinitialize_command('build_scripts') build_scripts.executable = 'python' + build_scripts.force = True + + build_ext = self.reinitialize_command('build_ext') + build_ext.inplace = False if not self.skip_build: self.run_command('build') diff --git a/env/lib/python3.7/site-packages/wheel/cli/__init__.py b/env/lib/python3.7/site-packages/wheel/cli/__init__.py index 635f40f..95740bf 100644 --- a/env/lib/python3.7/site-packages/wheel/cli/__init__.py +++ b/env/lib/python3.7/site-packages/wheel/cli/__init__.py @@ -27,7 +27,7 @@ def unpack_f(args): def pack_f(args): from .pack import pack - pack(args.directory, args.dest_dir) + pack(args.directory, args.dest_dir, args.build_number) def convert_f(args): @@ -54,6 +54,7 @@ def parser(): repack_parser.add_argument('directory', help='Root directory of the unpacked wheel') repack_parser.add_argument('--dest-dir', '-d', default=os.path.curdir, help="Directory to store the wheel (default %(default)s)") + repack_parser.add_argument('--build-number', help="Build tag to use in the wheel name") repack_parser.set_defaults(func=pack_f) convert_parser = s.add_parser('convert', help='Convert egg or wininst to wheel') diff --git a/env/lib/python3.7/site-packages/wheel/cli/__pycache__/__init__.cpython-37.pyc b/env/lib/python3.7/site-packages/wheel/cli/__pycache__/__init__.cpython-37.pyc index 7ea10d01617e1f2c0c01bbeafce11aa4961a5b0f..9666108f3b7264008bb9497866c776c6344fcf8c 100644 GIT binary patch delta 717 zcmYjOzi-n(6!zKYA8`^>)U^3g(l~C~C{#fdkdT_8A`1%=17bqRb^0z%+{8)G4$uq2KK?AcxrId{`ok@QHZZH{k2%9OlP?3FA9y=v& z606<*fP^$Jxc-dL&L|`enJ)4(EwMXz6P4L6c5{^^c})93^k1&9A6$0WA6!J&Sy6p` zf*}V>AkSqaO=Vw=Ovua;=aR3$GUSEwN|`D?h5{6!1S@letKxhWv`F_2KLyudagHyd zWmts@*cVx9l)mIw1t;;tQ_OG52!$4{vgikbyF? zg-pI%3A6alIeVKbpcZ?dIzx5VGz%v!QEn#Xu1EL7SnqkE7e$mdxkBp#(gLa?Q3;R2 zSPLT{lr|KaG$8&qMuZw7D}kgXJoNg(10D-=93-Ui>rG_JGDnOSkS)`;BsHYQl~{LO r811=kY`SiD5=|&^T`CK^Edh50?66e8hFh@fbmwway2hpK-87Kx^< delta 561 zcmYk3zfTlF6vy}N?Ck9iSRveTx94&0aU977fy7`zp+OUAEG)zZO$fQSXLe%_oSlHg zvm-!EE*7sd7&{AXG{(fv_!rpfmL~oa+BmaNFvVxyd*APTGn4sR{XHGr9v}A%wKm_* zKYHVS3O<0-+kZSr<&%Lm7Dqy-xbL~c1Audm{N5=iMA}IPU>PEr$*NK^fESZ2Ak(DF8vF6S1_W;uC`k^TjcT~ zPx-OY2W;cqp>yUuG431P4sF`^piS@XcYa4-wXG4-t5OH*^rbYbw4bHtiW^R!uPZU5 zZ_Z1VUa$%m6atmFu;K^GXPKRK~V*2KbuVy)kHDXp0X)c>7RRCpVvvC z(1qOUCr@H=NjI*NPrY#Ns+J3nud7HQXW2oP+nK~zh%OV0^vjFjF8%dpV2x^ibaPo- luWQ`U(0`u0cb@g)U773*M3Ge1%7wS+c2#4I_WWBA{ReF@c`X0{ diff --git a/env/lib/python3.7/site-packages/wheel/cli/__pycache__/convert.cpython-37.pyc b/env/lib/python3.7/site-packages/wheel/cli/__pycache__/convert.cpython-37.pyc index b9492032ef2c76c60ddefb32e1ac936f8f79a112..695418833f2fd88325dbae103ec6c6d5bb7ff04d 100644 GIT binary patch delta 35 pcmbPfFw=m?iIF+PDk(JC+{iRT6abq<3CREe diff --git a/env/lib/python3.7/site-packages/wheel/cli/__pycache__/install.cpython-37.pyc b/env/lib/python3.7/site-packages/wheel/cli/__pycache__/install.cpython-37.pyc deleted file mode 100644 index 57f8ba004fbac72765a3ae06aaec29436c8b6a1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139 zcmZ?b<>g`kf~fgwF(CReh=2h`Aj1KOi&=m~3PUi1CZpdE=*g3J58}yWRahUq_jtd&f4uzczn@pvl#(RK3C=V%%$|nDT~^=F47p48h=&%QgJGC1k|xpIr6%#{elaY@po{}e&8?5svnMAK`_fu4eUy~3@dg$y`!eQ_m7XVGq7sErB|o?JDuV3 zVhHL;QhP5uI9XQl{|*Ii)_McCs>5Quv-Jo!COePEn|4XO8pZ-57ia-pNT6f_x-5ah Qei5f&WRJu+*em(v-}i-ni2wiq delta 526 zcmY+B&ubMi5XWb-yV>lIydQn`*?O=CrBJO<&_l0QTReDCgh~;lbxP?21$P4;%u?t| z+l#asPhQOa1w#FA3WC?(dnjIX_Nib4lVLvj&W|LY2j>%dN$V7Nt$mq&w*EnXABr~O zrP&g;fUSJ;5wAqT2rJwSPVb0v#RL@j@BkXDaTl#1ISo}{A}?*wppPkTunLVbFiL!S z05%}i1T`McRuLs6-hqwoLyeWRvi!u=QXjUNZM9XP>=8VMr(iP5NwZeAT2{wQIy)DT zV${7r66*Ps`aZQh#MrC9K51}^n^ftau`JRAw+(IDh(=VI$!$i1S{%+-xzTiq&oa)O zq~UvkU^=6&?=^rkU~}JZ?~d@_teP&@Oep)dDb7&6c(e6tWM1EK>)~;H60JU1UVi9~ z7pQX9N)B#XZR DY592T diff --git a/env/lib/python3.7/site-packages/wheel/cli/__pycache__/unpack.cpython-37.pyc b/env/lib/python3.7/site-packages/wheel/cli/__pycache__/unpack.cpython-37.pyc index 59fa601c8a013aa22f51aa03afa6dd1e72fb86a6..d3cf0f0af353ebf5f77a97dff119fbae8dd1a67c 100644 GIT binary patch delta 34 ocmZo?Z)fLm;^pOH0D`>560sY3jxceg6jtU{7^Y=RzQME}0Er_B?*IS* delta 34 ocmZo?Z)fLm;^pOH0D`FbYB3vmjxcc~m#61tl@yvxzQME}0EkQp;{X5v diff --git a/env/lib/python3.7/site-packages/wheel/cli/pack.py b/env/lib/python3.7/site-packages/wheel/cli/pack.py index 45c70f2..af6e81c 100644 --- a/env/lib/python3.7/site-packages/wheel/cli/pack.py +++ b/env/lib/python3.7/site-packages/wheel/cli/pack.py @@ -10,7 +10,7 @@ from wheel.wheelfile import WheelFile DIST_INFO_RE = re.compile(r"^(?P(?P.+?)-(?P\d.*?))\.dist-info$") -def pack(directory, dest_dir): +def pack(directory, dest_dir, build_number): """Repack a previously unpacked wheel directory into a new wheel file. The .dist-info/WHEEL file must contain one or more tags so that the target @@ -31,6 +31,10 @@ def pack(directory, dest_dir): dist_info_dir = dist_info_dirs[0] name_version = DIST_INFO_RE.match(dist_info_dir).group('namever') + # Add the build number if specific + if build_number: + name_version += '-' + build_number + # Read the tags from .dist-info/WHEEL with open(os.path.join(directory, dist_info_dir, 'WHEEL')) as f: tags = [line.split(' ')[1].rstrip() for line in f if line.startswith('Tag: ')] diff --git a/env/lib/python3.7/site-packages/wheel/metadata.py b/env/lib/python3.7/site-packages/wheel/metadata.py index 3edf6ae..ab0c07e 100644 --- a/env/lib/python3.7/site-packages/wheel/metadata.py +++ b/env/lib/python3.7/site-packages/wheel/metadata.py @@ -34,7 +34,7 @@ def convert_requirements(requirements): for req in requirements: parsed_requirement = pkg_resources.Requirement.parse(req) spec = requires_to_requires_dist(parsed_requirement) - extras = ",".join(parsed_requirement.extras) + extras = ",".join(sorted(parsed_requirement.extras)) if extras: extras = "[%s]" % extras yield (parsed_requirement.project_name + extras + spec) diff --git a/env/lib/python3.7/site-packages/wheel/util.py b/env/lib/python3.7/site-packages/wheel/util.py index be0aa9b..0afb54a 100644 --- a/env/lib/python3.7/site-packages/wheel/util.py +++ b/env/lib/python3.7/site-packages/wheel/util.py @@ -1,10 +1,13 @@ import base64 +import io import sys if sys.version_info[0] < 3: text_type = unicode # noqa: F821 + StringIO = io.BytesIO + def native(s, encoding='utf-8'): if isinstance(s, unicode): return s.encode(encoding) @@ -12,6 +15,8 @@ if sys.version_info[0] < 3: else: text_type = str + StringIO = io.StringIO + def native(s, encoding='utf-8'): if isinstance(s, bytes): return s.decode(encoding) diff --git a/env/lib/python3.7/site-packages/wheel/wheelfile.py b/env/lib/python3.7/site-packages/wheel/wheelfile.py index 635aa77..ddf8509 100644 --- a/env/lib/python3.7/site-packages/wheel/wheelfile.py +++ b/env/lib/python3.7/site-packages/wheel/wheelfile.py @@ -1,15 +1,17 @@ from __future__ import print_function +import csv import hashlib import os.path import re +import stat import time from collections import OrderedDict from distutils import log as logger from zipfile import ZIP_DEFLATED, ZipInfo, ZipFile from wheel.cli import WheelError -from wheel.util import urlsafe_b64decode, as_unicode, native, urlsafe_b64encode, as_bytes +from wheel.util import urlsafe_b64decode, as_unicode, native, urlsafe_b64encode, as_bytes, StringIO # Non-greedy matching of an optional build number may be too clever (more # invalid wheel filenames will match). Separate regex for .dist-info? @@ -131,7 +133,7 @@ class WheelFile(ZipFile): data = f.read() zinfo = ZipInfo(arcname or filename, date_time=get_zipinfo_datetime(st.st_mtime)) - zinfo.external_attr = st.st_mode << 16 + zinfo.external_attr = (stat.S_IMODE(st.st_mode) | stat.S_IFMT(st.st_mode)) << 16 zinfo.compress_type = ZIP_DEFLATED self.writestr(zinfo, data, compress_type) @@ -148,13 +150,20 @@ class WheelFile(ZipFile): def close(self): # Write RECORD if self.fp is not None and self.mode == 'w' and self._file_hashes: - content = '\n'.join('{},{}={},{}'.format(fname, algorithm, hash_, - self._file_sizes[fname]) - for fname, (algorithm, hash_) in self._file_hashes.items()) - content += '\n{},,\n'.format(self.record_path) + data = StringIO() + writer = csv.writer(data, delimiter=',', quotechar='"', lineterminator='\n') + writer.writerows(( + ( + fname, + algorithm + "=" + hash_, + self._file_sizes[fname] + ) + for fname, (algorithm, hash_) in self._file_hashes.items() + )) + writer.writerow((format(self.record_path), "", "")) zinfo = ZipInfo(native(self.record_path), date_time=get_zipinfo_datetime()) zinfo.compress_type = ZIP_DEFLATED zinfo.external_attr = 0o664 << 16 - self.writestr(zinfo, as_bytes(content)) + self.writestr(zinfo, as_bytes(data.getvalue())) ZipFile.close(self) diff --git a/env/lib/python3.7/site.py b/env/lib/python3.7/site.py index 7969769..dc9887a 100644 --- a/env/lib/python3.7/site.py +++ b/env/lib/python3.7/site.py @@ -63,8 +63,9 @@ ImportError exception, it is silently ignored. """ -import sys import os +import sys + try: import __builtin__ as builtins except ImportError: @@ -83,33 +84,34 @@ ENABLE_USER_SITE = None USER_SITE = None USER_BASE = None -_is_64bit = (getattr(sys, 'maxsize', None) or getattr(sys, 'maxint')) > 2**32 -_is_pypy = hasattr(sys, 'pypy_version_info') -_is_jython = sys.platform[:4] == 'java' +_is_64bit = (getattr(sys, "maxsize", None) or getattr(sys, "maxint")) > 2 ** 32 +_is_pypy = hasattr(sys, "pypy_version_info") +_is_jython = sys.platform[:4] == "java" if _is_jython: ModuleType = type(os) + def makepath(*paths): dir = os.path.join(*paths) - if _is_jython and (dir == '__classpath__' or - dir.startswith('__pyclasspath__')): + if _is_jython and (dir == "__classpath__" or dir.startswith("__pyclasspath__")): return dir, dir dir = os.path.abspath(dir) return dir, os.path.normcase(dir) + def abs__file__(): """Set all module' __file__ attribute to an absolute path""" for m in sys.modules.values(): - if ((_is_jython and not isinstance(m, ModuleType)) or - hasattr(m, '__loader__')): + if (_is_jython and not isinstance(m, ModuleType)) or hasattr(m, "__loader__"): # only modules need the abspath in Jython. and don't mess # with a PEP 302-supplied __file__ continue - f = getattr(m, '__file__', None) + f = getattr(m, "__file__", None) if f is None: continue m.__file__ = os.path.abspath(f) + def removeduppaths(): """ Remove duplicate entries from sys.path along with making them absolute""" @@ -128,18 +130,21 @@ def removeduppaths(): sys.path[:] = L return known_paths + # XXX This should not be part of site.py, since it is needed even when # using the -S option for Python. See http://www.python.org/sf/586680 def addbuilddir(): """Append ./build/lib. in case we're running in the build dir (especially for Guido :-)""" from distutils.util import get_platform - s = "build/lib.%s-%.3s" % (get_platform(), sys.version) - if hasattr(sys, 'gettotalrefcount'): - s += '-pydebug' + + s = "build/lib.{}-{:.3}".format(get_platform(), sys.version) + if hasattr(sys, "gettotalrefcount"): + s += "-pydebug" s = os.path.join(os.path.dirname(sys.path[-1]), s) sys.path.append(s) + def _init_pathinfo(): """Return a set containing all existing directory entries from sys.path""" d = set() @@ -152,6 +157,7 @@ def _init_pathinfo(): continue return d + def addpackage(sitedir, name, known_paths): """Add a new path to known_paths by combining sitedir and 'name' or execute sitedir if it starts with 'import'""" @@ -162,7 +168,7 @@ def addpackage(sitedir, name, known_paths): reset = 0 fullname = os.path.join(sitedir, name) try: - f = open(fullname, "rU") + f = open(fullname, "r") except IOError: return try: @@ -183,6 +189,7 @@ def addpackage(sitedir, name, known_paths): known_paths = None return known_paths + def addsitedir(sitedir, known_paths=None): """Add 'sitedir' argument to sys.path if missing and handle .pth files in 'sitedir'""" @@ -193,7 +200,7 @@ def addsitedir(sitedir, known_paths=None): reset = 0 sitedir, sitedircase = makepath(sitedir) if not sitedircase in known_paths: - sys.path.append(sitedir) # Add path component + sys.path.append(sitedir) # Add path component try: names = os.listdir(sitedir) except os.error: @@ -206,6 +213,7 @@ def addsitedir(sitedir, known_paths=None): known_paths = None return known_paths + def addsitepackages(known_paths, sys_prefix=sys.prefix, exec_prefix=sys.exec_prefix): """Add site-packages (and possibly site-python) to sys.path""" prefixes = [os.path.join(sys_prefix, "local"), sys_prefix] @@ -214,31 +222,32 @@ def addsitepackages(known_paths, sys_prefix=sys.prefix, exec_prefix=sys.exec_pre for prefix in prefixes: if prefix: - if sys.platform in ('os2emx', 'riscos') or _is_jython: + if sys.platform in ("os2emx", "riscos") or _is_jython: sitedirs = [os.path.join(prefix, "Lib", "site-packages")] elif _is_pypy: - sitedirs = [os.path.join(prefix, 'site-packages')] - elif sys.platform == 'darwin' and prefix == sys_prefix: + sitedirs = [os.path.join(prefix, "site-packages")] + elif sys.platform == "darwin" and prefix == sys_prefix: - if prefix.startswith("/System/Library/Frameworks/"): # Apple's Python + if prefix.startswith("/System/Library/Frameworks/"): # Apple's Python - sitedirs = [os.path.join("/Library/Python", sys.version[:3], "site-packages"), - os.path.join(prefix, "Extras", "lib", "python")] + sitedirs = [ + os.path.join("/Library/Python", sys.version[:3], "site-packages"), + os.path.join(prefix, "Extras", "lib", "python"), + ] - else: # any other Python distros on OSX work this way - sitedirs = [os.path.join(prefix, "lib", - "python" + sys.version[:3], "site-packages")] + else: # any other Python distros on OSX work this way + sitedirs = [os.path.join(prefix, "lib", "python" + sys.version[:3], "site-packages")] - elif os.sep == '/': - sitedirs = [os.path.join(prefix, - "lib", - "python" + sys.version[:3], - "site-packages"), - os.path.join(prefix, "lib", "site-python"), - os.path.join(prefix, "python" + sys.version[:3], "lib-dynload")] + elif os.sep == "/": + sitedirs = [ + os.path.join(prefix, "lib", "python" + sys.version[:3], "site-packages"), + os.path.join(prefix, "lib", "site-python"), + os.path.join(prefix, "python" + sys.version[:3], "lib-dynload"), + ] lib64_dir = os.path.join(prefix, "lib64", "python" + sys.version[:3], "site-packages") - if (os.path.exists(lib64_dir) and - os.path.realpath(lib64_dir) not in [os.path.realpath(p) for p in sitedirs]): + if os.path.exists(lib64_dir) and os.path.realpath(lib64_dir) not in [ + os.path.realpath(p) for p in sitedirs + ]: if _is_64bit: sitedirs.insert(0, lib64_dir) else: @@ -246,42 +255,32 @@ def addsitepackages(known_paths, sys_prefix=sys.prefix, exec_prefix=sys.exec_pre try: # sys.getobjects only available in --with-pydebug build sys.getobjects - sitedirs.insert(0, os.path.join(sitedirs[0], 'debug')) + sitedirs.insert(0, os.path.join(sitedirs[0], "debug")) except AttributeError: pass # Debian-specific dist-packages directories: - sitedirs.append(os.path.join(prefix, "local/lib", - "python" + sys.version[:3], - "dist-packages")) - if sys.version[0] == '2': - sitedirs.append(os.path.join(prefix, "lib", - "python" + sys.version[:3], - "dist-packages")) + sitedirs.append(os.path.join(prefix, "local/lib", "python" + sys.version[:3], "dist-packages")) + if sys.version[0] == "2": + sitedirs.append(os.path.join(prefix, "lib", "python" + sys.version[:3], "dist-packages")) else: - sitedirs.append(os.path.join(prefix, "lib", - "python" + sys.version[0], - "dist-packages")) + sitedirs.append(os.path.join(prefix, "lib", "python" + sys.version[0], "dist-packages")) sitedirs.append(os.path.join(prefix, "lib", "dist-python")) else: sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")] - if sys.platform == 'darwin': + if sys.platform == "darwin": # for framework builds *only* we add the standard Apple # locations. Currently only per-user, but /Library and # /Network/Library could be added too - if 'Python.framework' in prefix: - home = os.environ.get('HOME') + 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')) + sitedirs.append(os.path.join(home, "Library", "Python", sys.version[:3], "site-packages")) for sitedir in sitedirs: if os.path.isdir(sitedir): addsitedir(sitedir, known_paths) return None + def check_enableusersite(): """Check if user site directory is safe for inclusion @@ -292,7 +291,7 @@ def check_enableusersite(): False: Disabled by user (command line option) True: Safe and enabled """ - if hasattr(sys, 'flags') and getattr(sys.flags, 'no_user_site', False): + if hasattr(sys, "flags") and getattr(sys.flags, "no_user_site", False): return False if hasattr(os, "getuid") and hasattr(os, "geteuid"): @@ -306,6 +305,7 @@ def check_enableusersite(): return True + def addusersitepackages(known_paths): """Add a per user site-package to sys.path @@ -324,7 +324,7 @@ def addusersitepackages(known_paths): def joinuser(*args): return os.path.expanduser(os.path.join(*args)) - #if sys.platform in ('os2emx', 'riscos'): + # if sys.platform in ('os2emx', 'riscos'): # # Don't know what to put here # USER_BASE = '' # USER_SITE = '' @@ -334,31 +334,24 @@ def addusersitepackages(known_paths): USER_BASE = env_base else: USER_BASE = joinuser(base, "Python") - USER_SITE = os.path.join(USER_BASE, - "Python" + sys.version[0] + sys.version[2], - "site-packages") + USER_SITE = os.path.join(USER_BASE, "Python" + sys.version[0] + sys.version[2], "site-packages") else: if env_base: USER_BASE = env_base else: USER_BASE = joinuser("~", ".local") - USER_SITE = os.path.join(USER_BASE, "lib", - "python" + sys.version[:3], - "site-packages") + USER_SITE = os.path.join(USER_BASE, "lib", "python" + sys.version[:3], "site-packages") if ENABLE_USER_SITE and os.path.isdir(USER_SITE): addsitedir(USER_SITE, known_paths) if ENABLE_USER_SITE: for dist_libdir in ("lib", "local/lib"): - user_site = os.path.join(USER_BASE, dist_libdir, - "python" + sys.version[:3], - "dist-packages") + user_site = os.path.join(USER_BASE, dist_libdir, "python" + sys.version[:3], "dist-packages") if os.path.isdir(user_site): addsitedir(user_site, known_paths) return known_paths - def setBEGINLIBPATH(): """The OS/2 EMX port has optional extension modules that do double duty as DLLs (and must use the .DLL file extension) for other extensions. @@ -368,12 +361,12 @@ def setBEGINLIBPATH(): """ dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload") - libpath = os.environ['BEGINLIBPATH'].split(';') + libpath = os.environ["BEGINLIBPATH"].split(";") if libpath[-1]: libpath.append(dllpath) else: libpath[-1] = dllpath - os.environ['BEGINLIBPATH'] = ';'.join(libpath) + os.environ["BEGINLIBPATH"] = ";".join(libpath) def setquit(): @@ -381,18 +374,20 @@ def setquit(): These are simply strings that display a hint on how to exit. """ - if os.sep == ':': - eof = 'Cmd-Q' - elif os.sep == '\\': - eof = 'Ctrl-Z plus Return' + if os.sep == ":": + eof = "Cmd-Q" + elif os.sep == "\\": + eof = "Ctrl-Z plus Return" else: - eof = 'Ctrl-D (i.e. EOF)' + eof = "Ctrl-D (i.e. EOF)" class Quitter(object): def __init__(self, name): self.name = name + def __repr__(self): - return 'Use %s() or %s to exit' % (self.name, eof) + return "Use {}() or {} to exit".format(self.name, eof) + def __call__(self, code=None): # Shells like IDLE catch the SystemExit, but listen when their # stdin wrapper is closed. @@ -401,8 +396,9 @@ def setquit(): except: pass raise SystemExit(code) - builtins.quit = Quitter('quit') - builtins.exit = Quitter('exit') + + builtins.quit = Quitter("quit") + builtins.exit = Quitter("exit") class _Printer(object): @@ -426,7 +422,7 @@ class _Printer(object): for filename in self.__files: filename = os.path.join(dir, filename) try: - fp = open(filename, "rU") + fp = open(filename, "r") data = fp.read() fp.close() break @@ -436,7 +432,7 @@ class _Printer(object): break if not data: data = self.__data - self.__lines = data.split('\n') + self.__lines = data.split("\n") self.__linecnt = len(self.__lines) def __repr__(self): @@ -444,11 +440,11 @@ class _Printer(object): if len(self.__lines) <= self.MAXLINES: return "\n".join(self.__lines) else: - return "Type %s() to see the full %s text" % ((self.__name,)*2) + return "Type %s() to see the full %s text" % ((self.__name,) * 2) def __call__(self): self.__setup() - prompt = 'Hit Return for more, or q (and Return) to quit: ' + prompt = "Hit Return for more, or q (and Return) to quit: " lineno = 0 while 1: try: @@ -464,31 +460,33 @@ class _Printer(object): key = raw_input(prompt) except NameError: key = input(prompt) - if key not in ('', 'q'): + if key not in ("", "q"): key = None - if key == 'q': + if key == "q": break + def setcopyright(): """Set 'copyright' and 'credits' in __builtin__""" builtins.copyright = _Printer("copyright", sys.copyright) if _is_jython: - builtins.credits = _Printer( - "credits", - "Jython is maintained by the Jython developers (www.jython.org).") + builtins.credits = _Printer("credits", "Jython is maintained by the Jython developers (www.jython.org).") elif _is_pypy: + builtins.credits = _Printer("credits", "PyPy is maintained by the PyPy developers: http://pypy.org/") + else: builtins.credits = _Printer( "credits", - "PyPy is maintained by the PyPy developers: http://pypy.org/") - else: - builtins.credits = _Printer("credits", """\ + """\ Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands - for supporting Python development. See www.python.org for more information.""") + for supporting Python development. See www.python.org for more information.""", + ) here = os.path.dirname(os.__file__) builtins.license = _Printer( - "license", "See http://www.python.org/%.3s/license.html" % sys.version, + "license", + "See http://www.python.org/%.3s/license.html" % sys.version, ["LICENSE.txt", "LICENSE"], - [os.path.join(here, os.pardir), here, os.curdir]) + [os.path.join(here, os.pardir), here, os.curdir], + ) class _Helper(object): @@ -498,38 +496,45 @@ class _Helper(object): """ def __repr__(self): - return "Type help() for interactive help, " \ - "or help(object) for help about object." + return "Type help() for interactive help, " "or help(object) for help about object." + def __call__(self, *args, **kwds): import pydoc + return pydoc.help(*args, **kwds) + def sethelper(): builtins.help = _Helper() + def aliasmbcs(): """On Windows, some default encodings are not provided by Python, while they are always available as "mbcs" in each locale. Make them usable by aliasing to "mbcs" in such a case.""" - if sys.platform == 'win32': + if sys.platform == "win32": import locale, codecs + enc = locale.getdefaultlocale()[1] - if enc.startswith('cp'): # "cp***" ? + if enc.startswith("cp"): # "cp***" ? try: codecs.lookup(enc) except LookupError: import encodings + encodings._cache[enc] = encodings._unknown - encodings.aliases.aliases[enc] = 'mbcs' + encodings.aliases.aliases[enc] = "mbcs" + def setencoding(): """Set the string encoding used by the Unicode implementation. The default is 'ascii', but if you're willing to experiment, you can change this.""" - encoding = "ascii" # Default value set by _PyUnicode_Init() + encoding = "ascii" # Default value set by _PyUnicode_Init() if 0: # Enable to support locale aware default string encodings. import locale + loc = locale.getdefaultlocale() if loc[1]: encoding = loc[1] @@ -539,7 +544,7 @@ def setencoding(): encoding = "undefined" if encoding != "ascii": # On Non-Unicode builds this will raise an AttributeError... - sys.setdefaultencoding(encoding) # Needs Python Unicode build ! + sys.setdefaultencoding(encoding) # Needs Python Unicode build ! def execsitecustomize(): @@ -549,41 +554,40 @@ def execsitecustomize(): except ImportError: pass + def virtual_install_main_packages(): - f = open(os.path.join(os.path.dirname(__file__), 'orig-prefix.txt')) + f = open(os.path.join(os.path.dirname(__file__), "orig-prefix.txt")) sys.real_prefix = f.read().strip() f.close() pos = 2 hardcoded_relative_dirs = [] - if sys.path[0] == '': + if sys.path[0] == "": pos += 1 if _is_jython: - paths = [os.path.join(sys.real_prefix, 'Lib')] + paths = [os.path.join(sys.real_prefix, "Lib")] elif _is_pypy: if sys.version_info > (3, 2): - cpyver = '%d' % sys.version_info[0] + cpyver = "%d" % sys.version_info[0] elif sys.pypy_version_info >= (1, 5): - cpyver = '%d.%d' % sys.version_info[:2] + cpyver = "%d.%d" % sys.version_info[:2] else: - cpyver = '%d.%d.%d' % sys.version_info[:3] - paths = [os.path.join(sys.real_prefix, 'lib_pypy'), - os.path.join(sys.real_prefix, 'lib-python', cpyver)] + cpyver = "%d.%d.%d" % sys.version_info[:3] + paths = [os.path.join(sys.real_prefix, "lib_pypy"), os.path.join(sys.real_prefix, "lib-python", cpyver)] if sys.pypy_version_info < (1, 9): - paths.insert(1, os.path.join(sys.real_prefix, - 'lib-python', 'modified-%s' % cpyver)) - hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below + paths.insert(1, os.path.join(sys.real_prefix, "lib-python", "modified-%s" % cpyver)) + hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below # # This is hardcoded in the Python executable, but relative to sys.prefix: for path in paths[:]: - plat_path = os.path.join(path, 'plat-%s' % sys.platform) + plat_path = os.path.join(path, "plat-%s" % sys.platform) if os.path.exists(plat_path): paths.append(plat_path) - elif sys.platform == 'win32': - paths = [os.path.join(sys.real_prefix, 'Lib'), os.path.join(sys.real_prefix, 'DLLs')] + elif sys.platform == "win32": + paths = [os.path.join(sys.real_prefix, "Lib"), os.path.join(sys.real_prefix, "DLLs")] else: - paths = [os.path.join(sys.real_prefix, 'lib', 'python'+sys.version[:3])] - hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below - lib64_path = os.path.join(sys.real_prefix, 'lib64', 'python'+sys.version[:3]) + paths = [os.path.join(sys.real_prefix, "lib", "python" + sys.version[:3])] + hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below + lib64_path = os.path.join(sys.real_prefix, "lib64", "python" + sys.version[:3]) if os.path.exists(lib64_path): if _is_64bit: paths.insert(0, lib64_path) @@ -595,28 +599,28 @@ def virtual_install_main_packages(): # Python 3.3+, this lives in sys.implementation, while in Python 2.7 # it lives in sys. try: - arch = getattr(sys, 'implementation', sys)._multiarch + arch = getattr(sys, "implementation", sys)._multiarch except AttributeError: # This is a non-multiarch aware Python. Fallback to the old way. arch = sys.platform - plat_path = os.path.join(sys.real_prefix, 'lib', - 'python'+sys.version[:3], - 'plat-%s' % arch) + plat_path = os.path.join(sys.real_prefix, "lib", "python" + sys.version[:3], "plat-%s" % arch) if os.path.exists(plat_path): paths.append(plat_path) # This is hardcoded in the Python executable, but # relative to sys.prefix, so we have to fix up: for path in list(paths): - tk_dir = os.path.join(path, 'lib-tk') + tk_dir = os.path.join(path, "lib-tk") if os.path.exists(tk_dir): paths.append(tk_dir) # These are hardcoded in the Apple's Python executable, # but relative to sys.prefix, so we have to fix them up: - if sys.platform == 'darwin': - hardcoded_paths = [os.path.join(relative_dir, module) - for relative_dir in hardcoded_relative_dirs - for module in ('plat-darwin', 'plat-mac', 'plat-mac/lib-scriptpackages')] + if sys.platform == "darwin": + hardcoded_paths = [ + os.path.join(relative_dir, module) + for relative_dir in hardcoded_relative_dirs + for module in ("plat-darwin", "plat-mac", "plat-mac/lib-scriptpackages") + ] for path in hardcoded_paths: if os.path.exists(path): @@ -624,6 +628,7 @@ def virtual_install_main_packages(): sys.path.extend(paths) + def force_global_eggs_after_local_site_packages(): """ Force easy_installed eggs in the global environment to get placed @@ -633,16 +638,18 @@ def force_global_eggs_after_local_site_packages(): around. """ - egginsert = getattr(sys, '__egginsert', 0) + egginsert = getattr(sys, "__egginsert", 0) for i, path in enumerate(sys.path): if i > egginsert and path.startswith(sys.prefix): egginsert = i sys.__egginsert = egginsert + 1 + def virtual_addsitepackages(known_paths): force_global_eggs_after_local_site_packages() return addsitepackages(known_paths, sys_prefix=sys.real_prefix) + def fixclasspath(): """Adjust the special classpath sys.path entries for Jython. These entries should follow the base virtualenv lib directories. @@ -650,13 +657,14 @@ def fixclasspath(): paths = [] classpaths = [] for path in sys.path: - if path == '__classpath__' or path.startswith('__pyclasspath__'): + if path == "__classpath__" or path.startswith("__pyclasspath__"): classpaths.append(path) else: paths.append(path) sys.path = paths sys.path.extend(classpaths) + def execusercustomize(): """Run custom user specific code, if available.""" try: @@ -665,17 +673,76 @@ def execusercustomize(): pass +def enablerlcompleter(): + """Enable default readline configuration on interactive prompts, by + registering a sys.__interactivehook__. + If the readline module can be imported, the hook will set the Tab key + as completion key and register ~/.python_history as history file. + This can be overridden in the sitecustomize or usercustomize module, + or in a PYTHONSTARTUP file. + """ + + def register_readline(): + import atexit + + try: + import readline + import rlcompleter + except ImportError: + return + + # Reading the initialization (config) file may not be enough to set a + # completion key, so we set one first and then read the file. + readline_doc = getattr(readline, "__doc__", "") + if readline_doc is not None and "libedit" in readline_doc: + readline.parse_and_bind("bind ^I rl_complete") + else: + readline.parse_and_bind("tab: complete") + + try: + readline.read_init_file() + except OSError: + # An OSError here could have many causes, but the most likely one + # is that there's no .inputrc file (or .editrc file in the case of + # Mac OS X + libedit) in the expected location. In that case, we + # want to ignore the exception. + pass + + if readline.get_current_history_length() == 0: + # If no history was loaded, default to .python_history. + # The guard is necessary to avoid doubling history size at + # each interpreter exit when readline was already configured + # through a PYTHONSTARTUP hook, see: + # http://bugs.python.org/issue5845#msg198636 + history = os.path.join(os.path.expanduser("~"), ".python_history") + try: + readline.read_history_file(history) + except OSError: + pass + + def write_history(): + try: + readline.write_history_file(history) + except (FileNotFoundError, PermissionError): + # home directory does not exist or is not writable + # https://bugs.python.org/issue19891 + pass + + atexit.register(write_history) + + sys.__interactivehook__ = register_readline + + def main(): global ENABLE_USER_SITE virtual_install_main_packages() abs__file__() paths_in_sys = removeduppaths() - if (os.name == "posix" and sys.path and - os.path.basename(sys.path[-1]) == "Modules"): + if os.name == "posix" and sys.path and os.path.basename(sys.path[-1]) == "Modules": addbuilddir() if _is_jython: fixclasspath() - GLOBAL_SITE_PACKAGES = not os.path.exists(os.path.join(os.path.dirname(__file__), 'no-global-site-packages.txt')) + GLOBAL_SITE_PACKAGES = not os.path.exists(os.path.join(os.path.dirname(__file__), "no-global-site-packages.txt")) if not GLOBAL_SITE_PACKAGES: ENABLE_USER_SITE = False if ENABLE_USER_SITE is None: @@ -684,11 +751,13 @@ def main(): paths_in_sys = addusersitepackages(paths_in_sys) if GLOBAL_SITE_PACKAGES: paths_in_sys = virtual_addsitepackages(paths_in_sys) - if sys.platform == 'os2emx': + if sys.platform == "os2emx": setBEGINLIBPATH() setquit() setcopyright() sethelper() + if sys.version_info[0] == 3: + enablerlcompleter() aliasmbcs() setencoding() execsitecustomize() @@ -700,8 +769,10 @@ def main(): if hasattr(sys, "setdefaultencoding"): del sys.setdefaultencoding + main() + def _script(): help = """\ %s [--user-base] [--user-site] @@ -721,22 +792,24 @@ def _script(): if not args: print("sys.path = [") for dir in sys.path: - print(" %r," % (dir,)) + print(" {!r},".format(dir)) print("]") + def exists(path): if os.path.isdir(path): return "exists" else: return "doesn't exist" - print("USER_BASE: %r (%s)" % (USER_BASE, exists(USER_BASE))) - print("USER_SITE: %r (%s)" % (USER_SITE, exists(USER_BASE))) - print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE) + + print("USER_BASE: {!r} ({})".format(USER_BASE, exists(USER_BASE))) + print("USER_SITE: {!r} ({})".format(USER_SITE, exists(USER_BASE))) + print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE) sys.exit(0) buffer = [] - if '--user-base' in args: + if "--user-base" in args: buffer.append(USER_BASE) - if '--user-site' in args: + if "--user-site" in args: buffer.append(USER_SITE) if buffer: @@ -751,8 +824,10 @@ def _script(): sys.exit(3) else: import textwrap + print(textwrap.dedent(help % (sys.argv[0], os.pathsep))) sys.exit(10) -if __name__ == '__main__': + +if __name__ == "__main__": _script() diff --git a/env/pip-selfcheck.json b/env/pip-selfcheck.json deleted file mode 100644 index 7b9f0fe..0000000 --- a/env/pip-selfcheck.json +++ /dev/null @@ -1 +0,0 @@ -{"last_check":"2018-12-28T22:10:35Z","pypi_version":"18.1"} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index f2590b2..97af891 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ ipwhois +dnspython \ No newline at end of file