add python3.6 modules
This commit is contained in:
parent
7080253073
commit
e9dacd2bf3
228 changed files with 10923 additions and 6804 deletions
|
@ -1,3 +1,3 @@
|
||||||
to update you need:
|
to update you need:
|
||||||
|
|
||||||
apt install python3-pip python3.4 python3.5 python3.4-dev python3.5-dev
|
apt install python3-pip python3.4 python3.5 python3.4-dev python3.5-dev python3.6 python3.6-dev
|
||||||
|
|
|
@ -6,6 +6,7 @@ Home-page: http://www.sqlalchemy.org
|
||||||
Author: Mike Bayer
|
Author: Mike Bayer
|
||||||
Author-email: mike_mp@zzzcomputing.com
|
Author-email: mike_mp@zzzcomputing.com
|
||||||
License: MIT License
|
License: MIT License
|
||||||
|
Description-Content-Type: UNKNOWN
|
||||||
Platform: UNKNOWN
|
Platform: UNKNOWN
|
||||||
Classifier: Development Status :: 5 - Production/Stable
|
Classifier: Development Status :: 5 - Production/Stable
|
||||||
Classifier: Intended Audience :: Developers
|
Classifier: Intended Audience :: Developers
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
SQLAlchemy-1.0.12.dist-info/DESCRIPTION.rst,sha256=ZN8fj2owI_rw0Emr3_RXqoNfTFkThjiZy7xcCzg1W_g,5013
|
SQLAlchemy-1.0.12.dist-info/DESCRIPTION.rst,sha256=ZN8fj2owI_rw0Emr3_RXqoNfTFkThjiZy7xcCzg1W_g,5013
|
||||||
SQLAlchemy-1.0.12.dist-info/METADATA,sha256=fntYBelbmQAxIrj5_YGLpIGPzwQBxiA_6kJwVdrwMF4,5786
|
SQLAlchemy-1.0.12.dist-info/METADATA,sha256=xCBLJSNub29eg_Bm-fHTUT_al-Sr8jh38ztUF4_s1so,5820
|
||||||
SQLAlchemy-1.0.12.dist-info/RECORD,,
|
SQLAlchemy-1.0.12.dist-info/RECORD,,
|
||||||
SQLAlchemy-1.0.12.dist-info/WHEEL,sha256=HslHw5cSLCuyOLxj8duGAooHNvXnupcmoBU1NzRPr2w,104
|
SQLAlchemy-1.0.12.dist-info/WHEEL,sha256=AEztX7vHDtcgysb-4-5-DyIKMLIPg6NMxY9dXTRdoXQ,104
|
||||||
SQLAlchemy-1.0.12.dist-info/metadata.json,sha256=JpEwQiqyWE4fnbo3thN5jZ_9e7jYut521x-nYPY27A4,965
|
SQLAlchemy-1.0.12.dist-info/metadata.json,sha256=QT7EcApgL9QrRqR1YIngngveBNd13H8h-oNK9fsxj0U,1004
|
||||||
SQLAlchemy-1.0.12.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11
|
SQLAlchemy-1.0.12.dist-info/top_level.txt,sha256=rp-ZgB7D8G11ivXON5VGPjupT1voYmWqkciDt5Uaw_Q,11
|
||||||
sqlalchemy/__init__.py,sha256=fTurvwmGkoRt_zdwxoZNWTHg6VdzvBpeHyPmUnexOK4,2112
|
sqlalchemy/__init__.py,sha256=fTurvwmGkoRt_zdwxoZNWTHg6VdzvBpeHyPmUnexOK4,2112
|
||||||
sqlalchemy/cprocessors.cpython-34m.so,sha256=9c-YOtWdmfG-k2sVd7Z2mpBiNFXtvi29UgfOxNPOOPM,42824
|
sqlalchemy/cprocessors.cpython-34m.so,sha256=hvG3A0r4VO9gevdsLGZYRdqNfG2rahDIFUqJ-fUxAB4,52136
|
||||||
sqlalchemy/cresultproxy.cpython-34m.so,sha256=NW56qP26QzyMYvdFfLv15pXoJRQSlDDoxIBzfcMzmQI,54056
|
sqlalchemy/cresultproxy.cpython-34m.so,sha256=piAFu3JE3mOaKpNSg6vcu8jGTl_-X6elUDWS2h_YOfQ,61504
|
||||||
sqlalchemy/cutils.cpython-34m.so,sha256=Nr_Lwl_q1cujcQksdw2oLYMsxh7lbgn06TUhjfNZNZQ,25280
|
sqlalchemy/cutils.cpython-34m.so,sha256=-ARQsTXx0XDzghnRNCwdaxm2eeIn2TuEqoU_Wb18h6E,34312
|
||||||
sqlalchemy/events.py,sha256=j8yref-XfuJxkPKbvnZmB4jeUAIujPcbLAzD2cKV4f4,43944
|
sqlalchemy/events.py,sha256=j8yref-XfuJxkPKbvnZmB4jeUAIujPcbLAzD2cKV4f4,43944
|
||||||
sqlalchemy/exc.py,sha256=NhA5R5nDdducWkp0MXtlQ0-Q6iF_rhqkHWblIfuSYGk,11706
|
sqlalchemy/exc.py,sha256=NhA5R5nDdducWkp0MXtlQ0-Q6iF_rhqkHWblIfuSYGk,11706
|
||||||
sqlalchemy/inspection.py,sha256=zMa-2nt-OQ0Op1dqq0Z2XCnpdAFSTkqif5Kdi8Wz8AU,3093
|
sqlalchemy/inspection.py,sha256=zMa-2nt-OQ0Op1dqq0Z2XCnpdAFSTkqif5Kdi8Wz8AU,3093
|
||||||
|
@ -191,186 +191,186 @@ sqlalchemy/util/langhelpers.py,sha256=Nhe3Y9ieK6JaFYejjYosVOjOSSIBT2V385Hu6HGcyZ
|
||||||
sqlalchemy/util/queue.py,sha256=rs3W0LDhKt7M_dlQEjYpI9KS-bzQmmwN38LE_-RRVvU,6548
|
sqlalchemy/util/queue.py,sha256=rs3W0LDhKt7M_dlQEjYpI9KS-bzQmmwN38LE_-RRVvU,6548
|
||||||
sqlalchemy/util/topological.py,sha256=xKsYjjAat4p8cdqRHKwibLzr6WONbPTC0X8Mqg7jYno,2794
|
sqlalchemy/util/topological.py,sha256=xKsYjjAat4p8cdqRHKwibLzr6WONbPTC0X8Mqg7jYno,2794
|
||||||
SQLAlchemy-1.0.12.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
SQLAlchemy-1.0.12.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||||
sqlalchemy/testing/__pycache__/replay_fixture.cpython-34.pyc,,
|
|
||||||
sqlalchemy/engine/__pycache__/strategies.cpython-34.pyc,,
|
|
||||||
sqlalchemy/connectors/__pycache__/mxodbc.cpython-34.pyc,,
|
|
||||||
sqlalchemy/ext/__pycache__/hybrid.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/firebird/__pycache__/kinterbasdb.cpython-34.pyc,,
|
|
||||||
sqlalchemy/engine/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
sqlalchemy/sql/__pycache__/expression.cpython-34.pyc,,
|
|
||||||
sqlalchemy/orm/__pycache__/relationships.cpython-34.pyc,,
|
|
||||||
sqlalchemy/ext/declarative/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/__pycache__/fixtures.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/__pycache__/assertions.cpython-34.pyc,,
|
|
||||||
sqlalchemy/util/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/suite/__pycache__/test_select.cpython-34.pyc,,
|
|
||||||
sqlalchemy/orm/__pycache__/unitofwork.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/suite/__pycache__/test_insert.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/mysql/__pycache__/oursql.cpython-34.pyc,,
|
|
||||||
sqlalchemy/orm/__pycache__/descriptor_props.cpython-34.pyc,,
|
|
||||||
sqlalchemy/sql/__pycache__/selectable.cpython-34.pyc,,
|
|
||||||
sqlalchemy/__pycache__/exc.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-34.pyc,,
|
|
||||||
sqlalchemy/orm/__pycache__/interfaces.cpython-34.pyc,,
|
|
||||||
sqlalchemy/ext/declarative/__pycache__/clsregistry.cpython-34.pyc,,
|
|
||||||
sqlalchemy/connectors/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
sqlalchemy/engine/__pycache__/url.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/sqlite/__pycache__/base.cpython-34.pyc,,
|
|
||||||
sqlalchemy/sql/__pycache__/base.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/__pycache__/util.cpython-34.pyc,,
|
|
||||||
sqlalchemy/ext/__pycache__/serializer.cpython-34.pyc,,
|
|
||||||
sqlalchemy/sql/__pycache__/dml.cpython-34.pyc,,
|
|
||||||
sqlalchemy/sql/__pycache__/functions.cpython-34.pyc,,
|
|
||||||
sqlalchemy/orm/__pycache__/attributes.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-34.pyc,,
|
|
||||||
sqlalchemy/orm/__pycache__/strategy_options.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/suite/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
sqlalchemy/sql/__pycache__/elements.cpython-34.pyc,,
|
|
||||||
sqlalchemy/orm/__pycache__/deprecated_interfaces.cpython-34.pyc,,
|
|
||||||
sqlalchemy/__pycache__/interfaces.cpython-34.pyc,,
|
|
||||||
sqlalchemy/engine/__pycache__/interfaces.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-34.pyc,,
|
|
||||||
sqlalchemy/__pycache__/pool.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/sybase/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
sqlalchemy/event/__pycache__/attr.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/firebird/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
sqlalchemy/sql/__pycache__/visitors.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-34.pyc,,
|
|
||||||
sqlalchemy/sql/__pycache__/util.cpython-34.pyc,,
|
|
||||||
sqlalchemy/__pycache__/inspection.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
sqlalchemy/orm/__pycache__/events.cpython-34.pyc,,
|
|
||||||
sqlalchemy/orm/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
sqlalchemy/connectors/__pycache__/pyodbc.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/mssql/__pycache__/mxodbc.cpython-34.pyc,,
|
|
||||||
sqlalchemy/sql/__pycache__/schema.cpython-34.pyc,,
|
|
||||||
sqlalchemy/util/__pycache__/queue.cpython-34.pyc,,
|
|
||||||
sqlalchemy/sql/__pycache__/sqltypes.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/__pycache__/assertsql.cpython-34.pyc,,
|
|
||||||
sqlalchemy/orm/__pycache__/session.cpython-34.pyc,,
|
|
||||||
sqlalchemy/orm/__pycache__/evaluator.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/plugin/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
sqlalchemy/util/__pycache__/compat.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/__pycache__/entities.cpython-34.pyc,,
|
|
||||||
sqlalchemy/event/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-34.pyc,,
|
|
||||||
sqlalchemy/orm/__pycache__/scoping.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/__pycache__/mock.cpython-34.pyc,,
|
|
||||||
sqlalchemy/sql/__pycache__/annotation.cpython-34.pyc,,
|
|
||||||
sqlalchemy/__pycache__/processors.cpython-34.pyc,,
|
|
||||||
sqlalchemy/engine/__pycache__/reflection.cpython-34.pyc,,
|
|
||||||
sqlalchemy/ext/__pycache__/baked.cpython-34.pyc,,
|
|
||||||
sqlalchemy/ext/declarative/__pycache__/api.cpython-34.pyc,,
|
|
||||||
sqlalchemy/connectors/__pycache__/zxJDBC.cpython-34.pyc,,
|
|
||||||
sqlalchemy/__pycache__/events.cpython-34.pyc,,
|
|
||||||
sqlalchemy/orm/__pycache__/path_registry.cpython-34.pyc,,
|
sqlalchemy/orm/__pycache__/path_registry.cpython-34.pyc,,
|
||||||
sqlalchemy/orm/__pycache__/dynamic.cpython-34.pyc,,
|
|
||||||
sqlalchemy/sql/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
sqlalchemy/sql/__pycache__/default_comparator.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/firebird/__pycache__/base.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/mysql/__pycache__/gaerdbms.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
sqlalchemy/ext/__pycache__/horizontal_shard.cpython-34.pyc,,
|
|
||||||
sqlalchemy/engine/__pycache__/base.cpython-34.pyc,,
|
|
||||||
sqlalchemy/ext/__pycache__/orderinglist.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/mssql/__pycache__/base.cpython-34.pyc,,
|
|
||||||
sqlalchemy/sql/__pycache__/ddl.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-34.pyc,,
|
|
||||||
sqlalchemy/util/__pycache__/_collections.cpython-34.pyc,,
|
|
||||||
sqlalchemy/orm/__pycache__/strategies.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
sqlalchemy/sql/__pycache__/crud.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/__pycache__/profiling.cpython-34.pyc,,
|
|
||||||
sqlalchemy/ext/__pycache__/mutable.cpython-34.pyc,,
|
|
||||||
sqlalchemy/engine/__pycache__/threadlocal.cpython-34.pyc,,
|
|
||||||
sqlalchemy/ext/__pycache__/compiler.cpython-34.pyc,,
|
|
||||||
sqlalchemy/ext/__pycache__/instrumentation.cpython-34.pyc,,
|
|
||||||
sqlalchemy/sql/__pycache__/compiler.cpython-34.pyc,,
|
|
||||||
sqlalchemy/engine/__pycache__/result.cpython-34.pyc,,
|
|
||||||
sqlalchemy/orm/__pycache__/query.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-34.pyc,,
|
|
||||||
sqlalchemy/event/__pycache__/api.cpython-34.pyc,,
|
|
||||||
sqlalchemy/orm/__pycache__/identity.cpython-34.pyc,,
|
|
||||||
sqlalchemy/orm/__pycache__/sync.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
sqlalchemy/util/__pycache__/deprecations.cpython-34.pyc,,
|
|
||||||
sqlalchemy/orm/__pycache__/exc.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/__pycache__/distutils_run.cpython-34.pyc,,
|
|
||||||
sqlalchemy/sql/__pycache__/naming.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/postgresql/__pycache__/pypostgresql.cpython-34.pyc,,
|
|
||||||
sqlalchemy/ext/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
sqlalchemy/util/__pycache__/topological.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/mssql/__pycache__/zxjdbc.cpython-34.pyc,,
|
|
||||||
sqlalchemy/databases/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/__pycache__/engines.cpython-34.pyc,,
|
|
||||||
sqlalchemy/ext/__pycache__/associationproxy.cpython-34.pyc,,
|
sqlalchemy/ext/__pycache__/associationproxy.cpython-34.pyc,,
|
||||||
sqlalchemy/orm/__pycache__/properties.cpython-34.pyc,,
|
|
||||||
sqlalchemy/sql/__pycache__/operators.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/__pycache__/warnings.cpython-34.pyc,,
|
|
||||||
sqlalchemy/sql/__pycache__/type_api.cpython-34.pyc,,
|
|
||||||
sqlalchemy/util/__pycache__/langhelpers.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/suite/__pycache__/test_types.cpython-34.pyc,,
|
|
||||||
sqlalchemy/event/__pycache__/base.cpython-34.pyc,,
|
|
||||||
sqlalchemy/ext/__pycache__/automap.cpython-34.pyc,,
|
|
||||||
sqlalchemy/event/__pycache__/legacy.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/postgresql/__pycache__/zxjdbc.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/__pycache__/runner.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/mssql/__pycache__/adodbapi.cpython-34.pyc,,
|
|
||||||
sqlalchemy/event/__pycache__/registry.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/suite/__pycache__/test_results.cpython-34.pyc,,
|
|
||||||
sqlalchemy/__pycache__/__init__.cpython-34.pyc,,
|
sqlalchemy/__pycache__/__init__.cpython-34.pyc,,
|
||||||
sqlalchemy/__pycache__/schema.cpython-34.pyc,,
|
sqlalchemy/orm/__pycache__/deprecated_interfaces.cpython-34.pyc,,
|
||||||
sqlalchemy/orm/__pycache__/mapper.cpython-34.pyc,,
|
sqlalchemy/orm/__pycache__/dynamic.cpython-34.pyc,,
|
||||||
sqlalchemy/dialects/sybase/__pycache__/pyodbc.cpython-34.pyc,,
|
sqlalchemy/event/__pycache__/legacy.cpython-34.pyc,,
|
||||||
sqlalchemy/testing/__pycache__/pickleable.cpython-34.pyc,,
|
sqlalchemy/event/__pycache__/api.cpython-34.pyc,,
|
||||||
sqlalchemy/dialects/sybase/__pycache__/pysybase.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/oracle/__pycache__/zxjdbc.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-34.pyc,,
|
|
||||||
sqlalchemy/orm/__pycache__/dependency.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
sqlalchemy/__pycache__/types.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/__pycache__/config.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/postgresql/__pycache__/base.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/plugin/__pycache__/noseplugin.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/__pycache__/exclusions.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/__pycache__/schema.cpython-34.pyc,,
|
|
||||||
sqlalchemy/engine/__pycache__/default.cpython-34.pyc,,
|
|
||||||
sqlalchemy/engine/__pycache__/util.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/postgresql/__pycache__/constraints.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/mysql/__pycache__/zxjdbc.cpython-34.pyc,,
|
|
||||||
sqlalchemy/orm/__pycache__/persistence.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/firebird/__pycache__/fdb.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/sybase/__pycache__/mxodbc.cpython-34.pyc,,
|
|
||||||
sqlalchemy/testing/__pycache__/provision.cpython-34.pyc,,
|
|
||||||
sqlalchemy/dialects/__pycache__/postgres.cpython-34.pyc,,
|
sqlalchemy/dialects/__pycache__/postgres.cpython-34.pyc,,
|
||||||
sqlalchemy/orm/__pycache__/collections.cpython-34.pyc,,
|
sqlalchemy/testing/__pycache__/profiling.cpython-34.pyc,,
|
||||||
sqlalchemy/testing/__pycache__/requirements.cpython-34.pyc,,
|
sqlalchemy/dialects/firebird/__pycache__/__init__.cpython-34.pyc,,
|
||||||
sqlalchemy/ext/declarative/__pycache__/base.cpython-34.pyc,,
|
sqlalchemy/dialects/mysql/__pycache__/gaerdbms.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/mysql/__pycache__/oursql.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/suite/__pycache__/test_types.cpython-34.pyc,,
|
||||||
|
sqlalchemy/event/__pycache__/registry.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/__pycache__/distutils_run.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/mssql/__pycache__/mxodbc.cpython-34.pyc,,
|
||||||
|
sqlalchemy/engine/__pycache__/base.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/postgresql/__pycache__/pypostgresql.cpython-34.pyc,,
|
||||||
|
sqlalchemy/util/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
sqlalchemy/util/__pycache__/topological.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/firebird/__pycache__/kinterbasdb.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/persistence.cpython-34.pyc,,
|
||||||
|
sqlalchemy/connectors/__pycache__/mxodbc.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/mssql/__pycache__/base.cpython-34.pyc,,
|
||||||
|
sqlalchemy/connectors/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
sqlalchemy/sql/__pycache__/elements.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/suite/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
sqlalchemy/util/__pycache__/langhelpers.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/__pycache__/entities.cpython-34.pyc,,
|
||||||
|
sqlalchemy/engine/__pycache__/interfaces.cpython-34.pyc,,
|
||||||
|
sqlalchemy/sql/__pycache__/schema.cpython-34.pyc,,
|
||||||
|
sqlalchemy/ext/__pycache__/baked.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/postgresql/__pycache__/zxjdbc.cpython-34.pyc,,
|
||||||
sqlalchemy/orm/__pycache__/base.cpython-34.pyc,,
|
sqlalchemy/orm/__pycache__/base.cpython-34.pyc,,
|
||||||
sqlalchemy/orm/__pycache__/instrumentation.cpython-34.pyc,,
|
sqlalchemy/connectors/__pycache__/pyodbc.cpython-34.pyc,,
|
||||||
sqlalchemy/__pycache__/log.cpython-34.pyc,,
|
sqlalchemy/sql/__pycache__/annotation.cpython-34.pyc,,
|
||||||
sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-34.pyc,,
|
sqlalchemy/dialects/oracle/__pycache__/zxjdbc.cpython-34.pyc,,
|
||||||
sqlalchemy/orm/__pycache__/loading.cpython-34.pyc,,
|
sqlalchemy/testing/__pycache__/runner.cpython-34.pyc,,
|
||||||
sqlalchemy/orm/__pycache__/state.cpython-34.pyc,,
|
sqlalchemy/testing/__pycache__/schema.cpython-34.pyc,,
|
||||||
sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-34.pyc,,
|
sqlalchemy/orm/__pycache__/relationships.cpython-34.pyc,,
|
||||||
sqlalchemy/dialects/oracle/__pycache__/base.cpython-34.pyc,,
|
sqlalchemy/__pycache__/pool.cpython-34.pyc,,
|
||||||
sqlalchemy/orm/__pycache__/util.cpython-34.pyc,,
|
sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
sqlalchemy/sql/__pycache__/ddl.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/sybase/__pycache__/pyodbc.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/dependency.cpython-34.pyc,,
|
||||||
|
sqlalchemy/sql/__pycache__/visitors.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/__pycache__/provision.cpython-34.pyc,,
|
||||||
sqlalchemy/dialects/postgresql/__pycache__/json.cpython-34.pyc,,
|
sqlalchemy/dialects/postgresql/__pycache__/json.cpython-34.pyc,,
|
||||||
sqlalchemy/dialects/mysql/__pycache__/base.cpython-34.pyc,,
|
sqlalchemy/sql/__pycache__/selectable.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/exc.cpython-34.pyc,,
|
||||||
|
sqlalchemy/ext/declarative/__pycache__/clsregistry.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/interfaces.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/__pycache__/assertions.cpython-34.pyc,,
|
||||||
|
sqlalchemy/ext/__pycache__/compiler.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/suite/__pycache__/test_select.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/firebird/__pycache__/fdb.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/unitofwork.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/__pycache__/util.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-34.pyc,,
|
||||||
|
sqlalchemy/__pycache__/interfaces.cpython-34.pyc,,
|
||||||
|
sqlalchemy/engine/__pycache__/util.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
sqlalchemy/__pycache__/schema.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/sync.cpython-34.pyc,,
|
||||||
|
sqlalchemy/__pycache__/processors.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/firebird/__pycache__/base.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-34.pyc,,
|
||||||
|
sqlalchemy/databases/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
sqlalchemy/sql/__pycache__/sqltypes.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/oracle/__pycache__/base.cpython-34.pyc,,
|
||||||
|
sqlalchemy/sql/__pycache__/functions.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-34.pyc,,
|
||||||
|
sqlalchemy/ext/__pycache__/automap.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/__pycache__/mock.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/__pycache__/requirements.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/suite/__pycache__/test_results.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/postgresql/__pycache__/base.cpython-34.pyc,,
|
||||||
|
sqlalchemy/util/__pycache__/deprecations.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/state.cpython-34.pyc,,
|
||||||
|
sqlalchemy/event/__pycache__/base.cpython-34.pyc,,
|
||||||
|
sqlalchemy/__pycache__/log.cpython-34.pyc,,
|
||||||
|
sqlalchemy/connectors/__pycache__/zxJDBC.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/identity.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/attributes.cpython-34.pyc,,
|
||||||
|
sqlalchemy/ext/declarative/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/sqlite/__pycache__/base.cpython-34.pyc,,
|
||||||
|
sqlalchemy/ext/__pycache__/serializer.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/properties.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/mapper.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/__pycache__/fixtures.cpython-34.pyc,,
|
||||||
|
sqlalchemy/sql/__pycache__/base.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/events.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/mysql/__pycache__/zxjdbc.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/strategy_options.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/sybase/__pycache__/mxodbc.cpython-34.pyc,,
|
||||||
|
sqlalchemy/util/__pycache__/compat.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-34.pyc,,
|
||||||
|
sqlalchemy/sql/__pycache__/compiler.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-34.pyc,,
|
||||||
|
sqlalchemy/__pycache__/inspection.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/plugin/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/mssql/__pycache__/adodbapi.cpython-34.pyc,,
|
||||||
|
sqlalchemy/engine/__pycache__/url.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
sqlalchemy/engine/__pycache__/result.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/suite/__pycache__/test_insert.cpython-34.pyc,,
|
||||||
|
sqlalchemy/event/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/scoping.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/instrumentation.cpython-34.pyc,,
|
||||||
sqlalchemy/dialects/sybase/__pycache__/base.cpython-34.pyc,,
|
sqlalchemy/dialects/sybase/__pycache__/base.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/plugin/__pycache__/noseplugin.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/__pycache__/exclusions.cpython-34.pyc,,
|
||||||
|
sqlalchemy/ext/__pycache__/mutable.cpython-34.pyc,,
|
||||||
|
sqlalchemy/sql/__pycache__/default_comparator.cpython-34.pyc,,
|
||||||
|
sqlalchemy/engine/__pycache__/default.cpython-34.pyc,,
|
||||||
|
sqlalchemy/__pycache__/types.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/session.cpython-34.pyc,,
|
||||||
|
sqlalchemy/util/__pycache__/_collections.cpython-34.pyc,,
|
||||||
|
sqlalchemy/engine/__pycache__/reflection.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/sybase/__pycache__/pysybase.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/__pycache__/assertsql.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/__pycache__/replay_fixture.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/__pycache__/config.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/strategies.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/util.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/mysql/__pycache__/base.cpython-34.pyc,,
|
||||||
|
sqlalchemy/sql/__pycache__/crud.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-34.pyc,,
|
||||||
|
sqlalchemy/engine/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/loading.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-34.pyc,,
|
||||||
|
sqlalchemy/sql/__pycache__/operators.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/__pycache__/pickleable.cpython-34.pyc,,
|
||||||
|
sqlalchemy/sql/__pycache__/expression.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-34.pyc,,
|
||||||
|
sqlalchemy/sql/__pycache__/naming.cpython-34.pyc,,
|
||||||
|
sqlalchemy/ext/__pycache__/horizontal_shard.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/sybase/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
sqlalchemy/engine/__pycache__/threadlocal.cpython-34.pyc,,
|
||||||
|
sqlalchemy/ext/declarative/__pycache__/api.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/__pycache__/warnings.cpython-34.pyc,,
|
||||||
|
sqlalchemy/sql/__pycache__/util.cpython-34.pyc,,
|
||||||
|
sqlalchemy/sql/__pycache__/dml.cpython-34.pyc,,
|
||||||
|
sqlalchemy/ext/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/collections.cpython-34.pyc,,
|
||||||
|
sqlalchemy/sql/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-34.pyc,,
|
||||||
|
sqlalchemy/ext/__pycache__/orderinglist.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/postgresql/__pycache__/constraints.cpython-34.pyc,,
|
||||||
|
sqlalchemy/__pycache__/exc.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-34.pyc,,
|
||||||
|
sqlalchemy/engine/__pycache__/strategies.cpython-34.pyc,,
|
||||||
|
sqlalchemy/ext/declarative/__pycache__/base.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/evaluator.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/query.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/mssql/__pycache__/zxjdbc.cpython-34.pyc,,
|
||||||
|
sqlalchemy/orm/__pycache__/descriptor_props.cpython-34.pyc,,
|
||||||
|
sqlalchemy/__pycache__/events.cpython-34.pyc,,
|
||||||
|
sqlalchemy/sql/__pycache__/type_api.cpython-34.pyc,,
|
||||||
|
sqlalchemy/util/__pycache__/queue.cpython-34.pyc,,
|
||||||
|
sqlalchemy/ext/__pycache__/hybrid.cpython-34.pyc,,
|
||||||
|
sqlalchemy/event/__pycache__/attr.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-34.pyc,,
|
||||||
|
sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-34.pyc,,
|
||||||
|
sqlalchemy/ext/__pycache__/instrumentation.cpython-34.pyc,,
|
||||||
|
sqlalchemy/testing/__pycache__/engines.cpython-34.pyc,,
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
Wheel-Version: 1.0
|
Wheel-Version: 1.0
|
||||||
Generator: bdist_wheel (0.29.0)
|
Generator: bdist_wheel (0.30.0)
|
||||||
Root-Is-Purelib: false
|
Root-Is-Purelib: false
|
||||||
Tag: cp34-cp34m-linux_x86_64
|
Tag: cp34-cp34m-linux_x86_64
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: Jython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Database :: Front-Ends", "Operating System :: OS Independent"], "extensions": {"python.details": {"contacts": [{"email": "mike_mp@zzzcomputing.com", "name": "Mike Bayer", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "http://www.sqlalchemy.org"}}}, "generator": "bdist_wheel (0.29.0)", "license": "MIT License", "metadata_version": "2.0", "name": "SQLAlchemy", "summary": "Database Abstraction Library", "test_requires": [{"requires": ["mock", "pytest (>=2.5.2)", "pytest-xdist"]}], "version": "1.0.12"}
|
{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: Jython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Database :: Front-Ends", "Operating System :: OS Independent"], "description_content_type": "UNKNOWN", "extensions": {"python.details": {"contacts": [{"email": "mike_mp@zzzcomputing.com", "name": "Mike Bayer", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "http://www.sqlalchemy.org"}}}, "generator": "bdist_wheel (0.30.0)", "license": "MIT License", "metadata_version": "2.0", "name": "SQLAlchemy", "summary": "Database Abstraction Library", "test_requires": [{"requires": ["mock", "pytest (>=2.5.2)", "pytest-xdist"]}], "version": "1.0.12"}
|
|
@ -1,238 +0,0 @@
|
||||||
===============================
|
|
||||||
Installing and Using Setuptools
|
|
||||||
===============================
|
|
||||||
|
|
||||||
.. contents:: **Table of Contents**
|
|
||||||
|
|
||||||
|
|
||||||
`Change History <https://pythonhosted.org/setuptools/history.html>`_.
|
|
||||||
|
|
||||||
-------------------------
|
|
||||||
Installation Instructions
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
The recommended way to bootstrap setuptools on any system is to download
|
|
||||||
`ez_setup.py`_ and run it using the target Python environment. Different
|
|
||||||
operating systems have different recommended techniques to accomplish this
|
|
||||||
basic routine, so below are some examples to get you started.
|
|
||||||
|
|
||||||
Setuptools requires Python 2.6 or later. To install setuptools
|
|
||||||
on Python 2.4 or Python 2.5, use the `bootstrap script for Setuptools 1.x
|
|
||||||
<https://bitbucket.org/pypa/setuptools/raw/bootstrap-py24/ez_setup.py>`_.
|
|
||||||
|
|
||||||
The link provided to ez_setup.py is a bookmark to bootstrap script for the
|
|
||||||
latest known stable release.
|
|
||||||
|
|
||||||
.. _ez_setup.py: https://bootstrap.pypa.io/ez_setup.py
|
|
||||||
|
|
||||||
Windows (Powershell 3 or later)
|
|
||||||
===============================
|
|
||||||
|
|
||||||
For best results, uninstall previous versions FIRST (see `Uninstalling`_).
|
|
||||||
|
|
||||||
Using Windows 8 (which includes PowerShell 3) or earlier versions of Windows
|
|
||||||
with PowerShell 3 installed, it's possible to install with one simple
|
|
||||||
Powershell command. Start up Powershell and paste this command::
|
|
||||||
|
|
||||||
> (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python -
|
|
||||||
|
|
||||||
You must start the Powershell with Administrative privileges or you may choose
|
|
||||||
to install a user-local installation::
|
|
||||||
|
|
||||||
> (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python - --user
|
|
||||||
|
|
||||||
If you have Python 3.3 or later, you can use the ``py`` command to install to
|
|
||||||
different Python versions. For example, to install to Python 3.3 if you have
|
|
||||||
Python 2.7 installed::
|
|
||||||
|
|
||||||
> (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | py -3 -
|
|
||||||
|
|
||||||
The recommended way to install setuptools on Windows is to download
|
|
||||||
`ez_setup.py`_ and run it. The script will download the appropriate
|
|
||||||
distribution file and install it for you.
|
|
||||||
|
|
||||||
Once installation is complete, you will find an ``easy_install`` program in
|
|
||||||
your Python ``Scripts`` subdirectory. For simple invocation and best results,
|
|
||||||
add this directory to your ``PATH`` environment variable, if it is not already
|
|
||||||
present. If you did a user-local install, the ``Scripts`` subdirectory is
|
|
||||||
``$env:APPDATA\Python\Scripts``.
|
|
||||||
|
|
||||||
|
|
||||||
Windows (simplified)
|
|
||||||
====================
|
|
||||||
|
|
||||||
For Windows without PowerShell 3 or for installation without a command-line,
|
|
||||||
download `ez_setup.py`_ using your preferred web browser or other technique
|
|
||||||
and "run" that file.
|
|
||||||
|
|
||||||
|
|
||||||
Unix (wget)
|
|
||||||
===========
|
|
||||||
|
|
||||||
Most Linux distributions come with wget.
|
|
||||||
|
|
||||||
Download `ez_setup.py`_ and run it using the target Python version. The script
|
|
||||||
will download the appropriate version and install it for you::
|
|
||||||
|
|
||||||
> wget https://bootstrap.pypa.io/ez_setup.py -O - | python
|
|
||||||
|
|
||||||
Note that you will may need to invoke the command with superuser privileges to
|
|
||||||
install to the system Python::
|
|
||||||
|
|
||||||
> wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python
|
|
||||||
|
|
||||||
Alternatively, Setuptools may be installed to a user-local path::
|
|
||||||
|
|
||||||
> wget https://bootstrap.pypa.io/ez_setup.py -O - | python - --user
|
|
||||||
|
|
||||||
Note that on some older systems (noted on Debian 6 and CentOS 5 installations),
|
|
||||||
`wget` may refuse to download `ez_setup.py`, complaining that the certificate common name `*.c.ssl.fastly.net`
|
|
||||||
does not match the host name `bootstrap.pypa.io`. In addition, the `ez_setup.py` script may then encounter similar problems using
|
|
||||||
`wget` internally to download `setuptools-x.y.zip`, complaining that the certificate common name of `www.python.org` does not match the
|
|
||||||
host name `pypi.python.org`. Those are known issues, related to a bug in the older versions of `wget`
|
|
||||||
(see `Issue 59 <https://bitbucket.org/pypa/pypi/issue/59#comment-5881915>`_). If you happen to encounter them,
|
|
||||||
install Setuptools as follows::
|
|
||||||
|
|
||||||
> wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py
|
|
||||||
> python ez_setup.py --insecure
|
|
||||||
|
|
||||||
|
|
||||||
Unix including Mac OS X (curl)
|
|
||||||
==============================
|
|
||||||
|
|
||||||
If your system has curl installed, follow the ``wget`` instructions but
|
|
||||||
replace ``wget`` with ``curl`` and ``-O`` with ``-o``. For example::
|
|
||||||
|
|
||||||
> curl https://bootstrap.pypa.io/ez_setup.py -o - | python
|
|
||||||
|
|
||||||
|
|
||||||
Advanced Installation
|
|
||||||
=====================
|
|
||||||
|
|
||||||
For more advanced installation options, such as installing to custom
|
|
||||||
locations or prefixes, download and extract the source
|
|
||||||
tarball from `Setuptools on PyPI <https://pypi.python.org/pypi/setuptools>`_
|
|
||||||
and run setup.py with any supported distutils and Setuptools options.
|
|
||||||
For example::
|
|
||||||
|
|
||||||
setuptools-x.x$ python setup.py install --prefix=/opt/setuptools
|
|
||||||
|
|
||||||
Use ``--help`` to get a full options list, but we recommend consulting
|
|
||||||
the `EasyInstall manual`_ for detailed instructions, especially `the section
|
|
||||||
on custom installation locations`_.
|
|
||||||
|
|
||||||
.. _EasyInstall manual: https://pythonhosted.org/setuptools/EasyInstall
|
|
||||||
.. _the section on custom installation locations: https://pythonhosted.org/setuptools/EasyInstall#custom-installation-locations
|
|
||||||
|
|
||||||
|
|
||||||
Downloads
|
|
||||||
=========
|
|
||||||
|
|
||||||
All setuptools downloads can be found at `the project's home page in the Python
|
|
||||||
Package Index`_. Scroll to the very bottom of the page to find the links.
|
|
||||||
|
|
||||||
.. _the project's home page in the Python Package Index: https://pypi.python.org/pypi/setuptools
|
|
||||||
|
|
||||||
In addition to the PyPI downloads, the development version of ``setuptools``
|
|
||||||
is available from the `Bitbucket repo`_, and in-development versions of the
|
|
||||||
`0.6 branch`_ are available as well.
|
|
||||||
|
|
||||||
.. _Bitbucket repo: https://bitbucket.org/pypa/setuptools/get/default.tar.gz#egg=setuptools-dev
|
|
||||||
.. _0.6 branch: http://svn.python.org/projects/sandbox/branches/setuptools-0.6/#egg=setuptools-dev06
|
|
||||||
|
|
||||||
Uninstalling
|
|
||||||
============
|
|
||||||
|
|
||||||
On Windows, if Setuptools was installed using an ``.exe`` or ``.msi``
|
|
||||||
installer, simply use the uninstall feature of "Add/Remove Programs" in the
|
|
||||||
Control Panel.
|
|
||||||
|
|
||||||
Otherwise, to uninstall Setuptools or Distribute, regardless of the Python
|
|
||||||
version, delete all ``setuptools*`` and ``distribute*`` files and
|
|
||||||
directories from your system's ``site-packages`` directory
|
|
||||||
(and any other ``sys.path`` directories) FIRST.
|
|
||||||
|
|
||||||
If you are upgrading or otherwise plan to re-install Setuptools or Distribute,
|
|
||||||
nothing further needs to be done. If you want to completely remove Setuptools,
|
|
||||||
you may also want to remove the 'easy_install' and 'easy_install-x.x' scripts
|
|
||||||
and associated executables installed to the Python scripts directory.
|
|
||||||
|
|
||||||
--------------------------------
|
|
||||||
Using Setuptools and EasyInstall
|
|
||||||
--------------------------------
|
|
||||||
|
|
||||||
Here are some of the available manuals, tutorials, and other resources for
|
|
||||||
learning about Setuptools, Python Eggs, and EasyInstall:
|
|
||||||
|
|
||||||
* `The EasyInstall user's guide and reference manual`_
|
|
||||||
* `The setuptools Developer's Guide`_
|
|
||||||
* `The pkg_resources API reference`_
|
|
||||||
* `The Internal Structure of Python Eggs`_
|
|
||||||
|
|
||||||
Questions, comments, and bug reports should be directed to the `distutils-sig
|
|
||||||
mailing list`_. If you have written (or know of) any tutorials, documentation,
|
|
||||||
plug-ins, or other resources for setuptools users, please let us know about
|
|
||||||
them there, so this reference list can be updated. If you have working,
|
|
||||||
*tested* patches to correct problems or add features, you may submit them to
|
|
||||||
the `setuptools bug tracker`_.
|
|
||||||
|
|
||||||
.. _setuptools bug tracker: https://bitbucket.org/pypa/setuptools/issues
|
|
||||||
.. _The Internal Structure of Python Eggs: https://pythonhosted.org/setuptools/formats.html
|
|
||||||
.. _The setuptools Developer's Guide: https://pythonhosted.org/setuptools/setuptools.html
|
|
||||||
.. _The pkg_resources API reference: https://pythonhosted.org/setuptools/pkg_resources.html
|
|
||||||
.. _The EasyInstall user's guide and reference manual: https://pythonhosted.org/setuptools/easy_install.html
|
|
||||||
.. _distutils-sig mailing list: http://mail.python.org/pipermail/distutils-sig/
|
|
||||||
|
|
||||||
|
|
||||||
-------
|
|
||||||
Credits
|
|
||||||
-------
|
|
||||||
|
|
||||||
* The original design for the ``.egg`` format and the ``pkg_resources`` API was
|
|
||||||
co-created by Phillip Eby and Bob Ippolito. Bob also implemented the first
|
|
||||||
version of ``pkg_resources``, and supplied the OS X operating system version
|
|
||||||
compatibility algorithm.
|
|
||||||
|
|
||||||
* Ian Bicking implemented many early "creature comfort" features of
|
|
||||||
easy_install, including support for downloading via Sourceforge and
|
|
||||||
Subversion repositories. Ian's comments on the Web-SIG about WSGI
|
|
||||||
application deployment also inspired the concept of "entry points" in eggs,
|
|
||||||
and he has given talks at PyCon and elsewhere to inform and educate the
|
|
||||||
community about eggs and setuptools.
|
|
||||||
|
|
||||||
* Jim Fulton contributed time and effort to build automated tests of various
|
|
||||||
aspects of ``easy_install``, and supplied the doctests for the command-line
|
|
||||||
``.exe`` wrappers on Windows.
|
|
||||||
|
|
||||||
* Phillip J. Eby is the seminal author of setuptools, and
|
|
||||||
first proposed the idea of an importable binary distribution format for
|
|
||||||
Python application plug-ins.
|
|
||||||
|
|
||||||
* Significant parts of the implementation of setuptools were funded by the Open
|
|
||||||
Source Applications Foundation, to provide a plug-in infrastructure for the
|
|
||||||
Chandler PIM application. In addition, many OSAF staffers (such as Mike
|
|
||||||
"Code Bear" Taylor) contributed their time and stress as guinea pigs for the
|
|
||||||
use of eggs and setuptools, even before eggs were "cool". (Thanks, guys!)
|
|
||||||
|
|
||||||
* Tarek Ziadé is the principal author of the Distribute fork, which
|
|
||||||
re-invigorated the community on the project, encouraged renewed innovation,
|
|
||||||
and addressed many defects.
|
|
||||||
|
|
||||||
* Since the merge with Distribute, Jason R. Coombs is the
|
|
||||||
maintainer of setuptools. The project is maintained in coordination with
|
|
||||||
the Python Packaging Authority (PyPA) and the larger Python community.
|
|
||||||
|
|
||||||
.. _files:
|
|
||||||
|
|
||||||
|
|
||||||
---------------
|
|
||||||
Code of Conduct
|
|
||||||
---------------
|
|
||||||
|
|
||||||
Everyone interacting in the setuptools project's codebases, issue trackers,
|
|
||||||
chat rooms, and mailing lists is expected to follow the
|
|
||||||
`PyPA Code of Conduct`_.
|
|
||||||
|
|
||||||
.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/
|
|
||||||
|
|
||||||
|
|
|
@ -1,263 +0,0 @@
|
||||||
Metadata-Version: 2.0
|
|
||||||
Name: setuptools
|
|
||||||
Version: 20.1.1
|
|
||||||
Summary: Easily download, build, install, upgrade, and uninstall Python packages
|
|
||||||
Home-page: https://bitbucket.org/pypa/setuptools
|
|
||||||
Author: Python Packaging Authority
|
|
||||||
Author-email: distutils-sig@python.org
|
|
||||||
License: UNKNOWN
|
|
||||||
Keywords: CPAN PyPI distutils eggs package management
|
|
||||||
Platform: UNKNOWN
|
|
||||||
Classifier: Development Status :: 5 - Production/Stable
|
|
||||||
Classifier: Intended Audience :: Developers
|
|
||||||
Classifier: License :: OSI Approved :: MIT License
|
|
||||||
Classifier: Operating System :: OS Independent
|
|
||||||
Classifier: Programming Language :: Python :: 2.6
|
|
||||||
Classifier: Programming Language :: Python :: 2.7
|
|
||||||
Classifier: Programming Language :: Python :: 3
|
|
||||||
Classifier: Programming Language :: Python :: 3.3
|
|
||||||
Classifier: Programming Language :: Python :: 3.4
|
|
||||||
Classifier: Programming Language :: Python :: 3.5
|
|
||||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
||||||
Classifier: Topic :: System :: Archiving :: Packaging
|
|
||||||
Classifier: Topic :: System :: Systems Administration
|
|
||||||
Classifier: Topic :: Utilities
|
|
||||||
|
|
||||||
===============================
|
|
||||||
Installing and Using Setuptools
|
|
||||||
===============================
|
|
||||||
|
|
||||||
.. contents:: **Table of Contents**
|
|
||||||
|
|
||||||
|
|
||||||
`Change History <https://pythonhosted.org/setuptools/history.html>`_.
|
|
||||||
|
|
||||||
-------------------------
|
|
||||||
Installation Instructions
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
The recommended way to bootstrap setuptools on any system is to download
|
|
||||||
`ez_setup.py`_ and run it using the target Python environment. Different
|
|
||||||
operating systems have different recommended techniques to accomplish this
|
|
||||||
basic routine, so below are some examples to get you started.
|
|
||||||
|
|
||||||
Setuptools requires Python 2.6 or later. To install setuptools
|
|
||||||
on Python 2.4 or Python 2.5, use the `bootstrap script for Setuptools 1.x
|
|
||||||
<https://bitbucket.org/pypa/setuptools/raw/bootstrap-py24/ez_setup.py>`_.
|
|
||||||
|
|
||||||
The link provided to ez_setup.py is a bookmark to bootstrap script for the
|
|
||||||
latest known stable release.
|
|
||||||
|
|
||||||
.. _ez_setup.py: https://bootstrap.pypa.io/ez_setup.py
|
|
||||||
|
|
||||||
Windows (Powershell 3 or later)
|
|
||||||
===============================
|
|
||||||
|
|
||||||
For best results, uninstall previous versions FIRST (see `Uninstalling`_).
|
|
||||||
|
|
||||||
Using Windows 8 (which includes PowerShell 3) or earlier versions of Windows
|
|
||||||
with PowerShell 3 installed, it's possible to install with one simple
|
|
||||||
Powershell command. Start up Powershell and paste this command::
|
|
||||||
|
|
||||||
> (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python -
|
|
||||||
|
|
||||||
You must start the Powershell with Administrative privileges or you may choose
|
|
||||||
to install a user-local installation::
|
|
||||||
|
|
||||||
> (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python - --user
|
|
||||||
|
|
||||||
If you have Python 3.3 or later, you can use the ``py`` command to install to
|
|
||||||
different Python versions. For example, to install to Python 3.3 if you have
|
|
||||||
Python 2.7 installed::
|
|
||||||
|
|
||||||
> (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | py -3 -
|
|
||||||
|
|
||||||
The recommended way to install setuptools on Windows is to download
|
|
||||||
`ez_setup.py`_ and run it. The script will download the appropriate
|
|
||||||
distribution file and install it for you.
|
|
||||||
|
|
||||||
Once installation is complete, you will find an ``easy_install`` program in
|
|
||||||
your Python ``Scripts`` subdirectory. For simple invocation and best results,
|
|
||||||
add this directory to your ``PATH`` environment variable, if it is not already
|
|
||||||
present. If you did a user-local install, the ``Scripts`` subdirectory is
|
|
||||||
``$env:APPDATA\Python\Scripts``.
|
|
||||||
|
|
||||||
|
|
||||||
Windows (simplified)
|
|
||||||
====================
|
|
||||||
|
|
||||||
For Windows without PowerShell 3 or for installation without a command-line,
|
|
||||||
download `ez_setup.py`_ using your preferred web browser or other technique
|
|
||||||
and "run" that file.
|
|
||||||
|
|
||||||
|
|
||||||
Unix (wget)
|
|
||||||
===========
|
|
||||||
|
|
||||||
Most Linux distributions come with wget.
|
|
||||||
|
|
||||||
Download `ez_setup.py`_ and run it using the target Python version. The script
|
|
||||||
will download the appropriate version and install it for you::
|
|
||||||
|
|
||||||
> wget https://bootstrap.pypa.io/ez_setup.py -O - | python
|
|
||||||
|
|
||||||
Note that you will may need to invoke the command with superuser privileges to
|
|
||||||
install to the system Python::
|
|
||||||
|
|
||||||
> wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python
|
|
||||||
|
|
||||||
Alternatively, Setuptools may be installed to a user-local path::
|
|
||||||
|
|
||||||
> wget https://bootstrap.pypa.io/ez_setup.py -O - | python - --user
|
|
||||||
|
|
||||||
Note that on some older systems (noted on Debian 6 and CentOS 5 installations),
|
|
||||||
`wget` may refuse to download `ez_setup.py`, complaining that the certificate common name `*.c.ssl.fastly.net`
|
|
||||||
does not match the host name `bootstrap.pypa.io`. In addition, the `ez_setup.py` script may then encounter similar problems using
|
|
||||||
`wget` internally to download `setuptools-x.y.zip`, complaining that the certificate common name of `www.python.org` does not match the
|
|
||||||
host name `pypi.python.org`. Those are known issues, related to a bug in the older versions of `wget`
|
|
||||||
(see `Issue 59 <https://bitbucket.org/pypa/pypi/issue/59#comment-5881915>`_). If you happen to encounter them,
|
|
||||||
install Setuptools as follows::
|
|
||||||
|
|
||||||
> wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py
|
|
||||||
> python ez_setup.py --insecure
|
|
||||||
|
|
||||||
|
|
||||||
Unix including Mac OS X (curl)
|
|
||||||
==============================
|
|
||||||
|
|
||||||
If your system has curl installed, follow the ``wget`` instructions but
|
|
||||||
replace ``wget`` with ``curl`` and ``-O`` with ``-o``. For example::
|
|
||||||
|
|
||||||
> curl https://bootstrap.pypa.io/ez_setup.py -o - | python
|
|
||||||
|
|
||||||
|
|
||||||
Advanced Installation
|
|
||||||
=====================
|
|
||||||
|
|
||||||
For more advanced installation options, such as installing to custom
|
|
||||||
locations or prefixes, download and extract the source
|
|
||||||
tarball from `Setuptools on PyPI <https://pypi.python.org/pypi/setuptools>`_
|
|
||||||
and run setup.py with any supported distutils and Setuptools options.
|
|
||||||
For example::
|
|
||||||
|
|
||||||
setuptools-x.x$ python setup.py install --prefix=/opt/setuptools
|
|
||||||
|
|
||||||
Use ``--help`` to get a full options list, but we recommend consulting
|
|
||||||
the `EasyInstall manual`_ for detailed instructions, especially `the section
|
|
||||||
on custom installation locations`_.
|
|
||||||
|
|
||||||
.. _EasyInstall manual: https://pythonhosted.org/setuptools/EasyInstall
|
|
||||||
.. _the section on custom installation locations: https://pythonhosted.org/setuptools/EasyInstall#custom-installation-locations
|
|
||||||
|
|
||||||
|
|
||||||
Downloads
|
|
||||||
=========
|
|
||||||
|
|
||||||
All setuptools downloads can be found at `the project's home page in the Python
|
|
||||||
Package Index`_. Scroll to the very bottom of the page to find the links.
|
|
||||||
|
|
||||||
.. _the project's home page in the Python Package Index: https://pypi.python.org/pypi/setuptools
|
|
||||||
|
|
||||||
In addition to the PyPI downloads, the development version of ``setuptools``
|
|
||||||
is available from the `Bitbucket repo`_, and in-development versions of the
|
|
||||||
`0.6 branch`_ are available as well.
|
|
||||||
|
|
||||||
.. _Bitbucket repo: https://bitbucket.org/pypa/setuptools/get/default.tar.gz#egg=setuptools-dev
|
|
||||||
.. _0.6 branch: http://svn.python.org/projects/sandbox/branches/setuptools-0.6/#egg=setuptools-dev06
|
|
||||||
|
|
||||||
Uninstalling
|
|
||||||
============
|
|
||||||
|
|
||||||
On Windows, if Setuptools was installed using an ``.exe`` or ``.msi``
|
|
||||||
installer, simply use the uninstall feature of "Add/Remove Programs" in the
|
|
||||||
Control Panel.
|
|
||||||
|
|
||||||
Otherwise, to uninstall Setuptools or Distribute, regardless of the Python
|
|
||||||
version, delete all ``setuptools*`` and ``distribute*`` files and
|
|
||||||
directories from your system's ``site-packages`` directory
|
|
||||||
(and any other ``sys.path`` directories) FIRST.
|
|
||||||
|
|
||||||
If you are upgrading or otherwise plan to re-install Setuptools or Distribute,
|
|
||||||
nothing further needs to be done. If you want to completely remove Setuptools,
|
|
||||||
you may also want to remove the 'easy_install' and 'easy_install-x.x' scripts
|
|
||||||
and associated executables installed to the Python scripts directory.
|
|
||||||
|
|
||||||
--------------------------------
|
|
||||||
Using Setuptools and EasyInstall
|
|
||||||
--------------------------------
|
|
||||||
|
|
||||||
Here are some of the available manuals, tutorials, and other resources for
|
|
||||||
learning about Setuptools, Python Eggs, and EasyInstall:
|
|
||||||
|
|
||||||
* `The EasyInstall user's guide and reference manual`_
|
|
||||||
* `The setuptools Developer's Guide`_
|
|
||||||
* `The pkg_resources API reference`_
|
|
||||||
* `The Internal Structure of Python Eggs`_
|
|
||||||
|
|
||||||
Questions, comments, and bug reports should be directed to the `distutils-sig
|
|
||||||
mailing list`_. If you have written (or know of) any tutorials, documentation,
|
|
||||||
plug-ins, or other resources for setuptools users, please let us know about
|
|
||||||
them there, so this reference list can be updated. If you have working,
|
|
||||||
*tested* patches to correct problems or add features, you may submit them to
|
|
||||||
the `setuptools bug tracker`_.
|
|
||||||
|
|
||||||
.. _setuptools bug tracker: https://bitbucket.org/pypa/setuptools/issues
|
|
||||||
.. _The Internal Structure of Python Eggs: https://pythonhosted.org/setuptools/formats.html
|
|
||||||
.. _The setuptools Developer's Guide: https://pythonhosted.org/setuptools/setuptools.html
|
|
||||||
.. _The pkg_resources API reference: https://pythonhosted.org/setuptools/pkg_resources.html
|
|
||||||
.. _The EasyInstall user's guide and reference manual: https://pythonhosted.org/setuptools/easy_install.html
|
|
||||||
.. _distutils-sig mailing list: http://mail.python.org/pipermail/distutils-sig/
|
|
||||||
|
|
||||||
|
|
||||||
-------
|
|
||||||
Credits
|
|
||||||
-------
|
|
||||||
|
|
||||||
* The original design for the ``.egg`` format and the ``pkg_resources`` API was
|
|
||||||
co-created by Phillip Eby and Bob Ippolito. Bob also implemented the first
|
|
||||||
version of ``pkg_resources``, and supplied the OS X operating system version
|
|
||||||
compatibility algorithm.
|
|
||||||
|
|
||||||
* Ian Bicking implemented many early "creature comfort" features of
|
|
||||||
easy_install, including support for downloading via Sourceforge and
|
|
||||||
Subversion repositories. Ian's comments on the Web-SIG about WSGI
|
|
||||||
application deployment also inspired the concept of "entry points" in eggs,
|
|
||||||
and he has given talks at PyCon and elsewhere to inform and educate the
|
|
||||||
community about eggs and setuptools.
|
|
||||||
|
|
||||||
* Jim Fulton contributed time and effort to build automated tests of various
|
|
||||||
aspects of ``easy_install``, and supplied the doctests for the command-line
|
|
||||||
``.exe`` wrappers on Windows.
|
|
||||||
|
|
||||||
* Phillip J. Eby is the seminal author of setuptools, and
|
|
||||||
first proposed the idea of an importable binary distribution format for
|
|
||||||
Python application plug-ins.
|
|
||||||
|
|
||||||
* Significant parts of the implementation of setuptools were funded by the Open
|
|
||||||
Source Applications Foundation, to provide a plug-in infrastructure for the
|
|
||||||
Chandler PIM application. In addition, many OSAF staffers (such as Mike
|
|
||||||
"Code Bear" Taylor) contributed their time and stress as guinea pigs for the
|
|
||||||
use of eggs and setuptools, even before eggs were "cool". (Thanks, guys!)
|
|
||||||
|
|
||||||
* Tarek Ziadé is the principal author of the Distribute fork, which
|
|
||||||
re-invigorated the community on the project, encouraged renewed innovation,
|
|
||||||
and addressed many defects.
|
|
||||||
|
|
||||||
* Since the merge with Distribute, Jason R. Coombs is the
|
|
||||||
maintainer of setuptools. The project is maintained in coordination with
|
|
||||||
the Python Packaging Authority (PyPA) and the larger Python community.
|
|
||||||
|
|
||||||
.. _files:
|
|
||||||
|
|
||||||
|
|
||||||
---------------
|
|
||||||
Code of Conduct
|
|
||||||
---------------
|
|
||||||
|
|
||||||
Everyone interacting in the setuptools project's codebases, issue trackers,
|
|
||||||
chat rooms, and mailing lists is expected to follow the
|
|
||||||
`PyPA Code of Conduct`_.
|
|
||||||
|
|
||||||
.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/
|
|
||||||
|
|
||||||
|
|
|
@ -1,104 +0,0 @@
|
||||||
easy_install.py,sha256=MDC9vt5AxDsXX5qcKlBz2TnW6Tpuv_AobnfhCJ9X3PM,126
|
|
||||||
_markerlib/__init__.py,sha256=GSmhZqvAitLJHhSgtqqusfq2nJ_ClP3oy3Lm0uZLIsU,552
|
|
||||||
_markerlib/markers.py,sha256=YuFp0-osufFIoqnzG3L0Z2fDCx4Vln3VUDeXJ2DA_1I,3979
|
|
||||||
_markerlib-0.0.0.dist-info/DESCRIPTION.rst,sha256=MDsJej8DPV2OKpAKpu74g-2xksRd-uGTeZn4W7D1dnI,9940
|
|
||||||
_markerlib-0.0.0.dist-info/METADATA,sha256=l8LCWR8HLdKmOz1QMU2JQREbM9o4dCsMPkBdBSi_Jgo,10997
|
|
||||||
_markerlib-0.0.0.dist-info/RECORD,,
|
|
||||||
_markerlib-0.0.0.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110
|
|
||||||
_markerlib-0.0.0.dist-info/dependency_links.txt,sha256=oUNXJEArClXFiSSvfFwUKY8TYjeIXhuFfCpXn5K0DCE,226
|
|
||||||
_markerlib-0.0.0.dist-info/entry_points.txt,sha256=S6yRfyEABPIKq4cNMNO_7LHXzFVZW-exLSrKSI6kgNU,2779
|
|
||||||
_markerlib-0.0.0.dist-info/metadata.json,sha256=OwUAZgU-PBMGwfXh2QKg7ec1Kh9aGVfWnOB5mrc48HA,4242
|
|
||||||
_markerlib-0.0.0.dist-info/top_level.txt,sha256=7780fzudMJkykiTcIrAQ8m8Lll6kot3EEePye3VJgEE,49
|
|
||||||
_markerlib-0.0.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
||||||
setuptools/__init__.py,sha256=WEGb6BRGN2dz3eJTbNRUfInUAhb6_OZJyYAndPGJm6w,5440
|
|
||||||
setuptools/archive_util.py,sha256=N30WE5ZQjkytzhAodAXw4FkK-9J5AP1ChrClHnZthOA,6609
|
|
||||||
setuptools/depends.py,sha256=WyJIhjIX7D5-JpGSnMAPHEoDcVPQxaO0405keTQT6jM,6418
|
|
||||||
setuptools/dist.py,sha256=txOleyyt2xCSTkUjCGW4MYZB8a1xsbC8MulDhSnoivQ,35701
|
|
||||||
setuptools/extension.py,sha256=YvsyGHWVWzhNOXMHU239FR14wxw2WwdMLLzWsRP6_IY,1694
|
|
||||||
setuptools/launch.py,sha256=hP3qZxDNu5Hf9C-VAkEP4IC_YYfR1XfxMTj6EguxxCg,730
|
|
||||||
setuptools/lib2to3_ex.py,sha256=6jPF9sJuHiz0cyg4cwIBLl2VMAxcl3GYSZwWAOuJplU,1998
|
|
||||||
setuptools/msvc9_support.py,sha256=fo2vjb-dna1SEuHezQCTuelCo6XFBv5cqaI56ABJ1vw,2187
|
|
||||||
setuptools/package_index.py,sha256=T6tZGPHApup6Gl3kz1sCLtY7kmMUXLBKweSAORYS2Qc,39490
|
|
||||||
setuptools/py26compat.py,sha256=1Vvuf-hj5bTM3OAXv6vgJQImulne12ann053caOgikU,481
|
|
||||||
setuptools/py27compat.py,sha256=CGj-jZcFgHUkrEdLvArkxHj96tAaMbG2-yJtUVU7QVI,306
|
|
||||||
setuptools/py31compat.py,sha256=cqYSVBd2pxvKl75185z40htfEr6EKC29KvSBiSoqHOA,1636
|
|
||||||
setuptools/sandbox.py,sha256=tuMRu_8R0_w6Qer9VqDiOTqKy1qr_GjHi-2QAg7TMz0,14210
|
|
||||||
setuptools/script (dev).tmpl,sha256=f7MR17dTkzaqkCMSVseyOCMVrPVSMdmTQsaB8cZzfuI,201
|
|
||||||
setuptools/script.tmpl,sha256=WGTt5piezO27c-Dbx6l5Q4T3Ff20A5z7872hv3aAhYY,138
|
|
||||||
setuptools/site-patch.py,sha256=K-0-cAx36mX_PG-qPZwosG9ZLCliRjquKQ4nHiJvvzg,2389
|
|
||||||
setuptools/ssl_support.py,sha256=tAFeeyFPVle_GgarPkNrdfnCJgP9PyN_QYGXTgypoyc,8119
|
|
||||||
setuptools/unicode_utils.py,sha256=8zVyrL_MFc6P5AmErs21rr7z-3N1pZ_NkOcDC7BPElU,995
|
|
||||||
setuptools/utils.py,sha256=08Z7mt-9mvrx-XvmS5EyKoRn2lxNTlgFsUwBU3Eq9JQ,293
|
|
||||||
setuptools/version.py,sha256=E3F8rAlTgCNpmTTY2YGy4T_1iQn3gKsePB7TVIcObu0,23
|
|
||||||
setuptools/windows_support.py,sha256=5GrfqSP2-dLGJoZTq2g6dCKkyQxxa2n5IQiXlJCoYEE,714
|
|
||||||
setuptools/command/__init__.py,sha256=1AM3hv_zCixE7kTXA-onWfK_2KF8GC8fUw3WSxzi5Fg,564
|
|
||||||
setuptools/command/alias.py,sha256=KjpE0sz_SDIHv3fpZcIQK-sCkJz-SrC6Gmug6b9Nkc8,2426
|
|
||||||
setuptools/command/bdist_egg.py,sha256=Km4CsGbevhvej6kKEfvTYxfkPoQijUyXmImNifrO4Tg,17184
|
|
||||||
setuptools/command/bdist_rpm.py,sha256=B7l0TnzCGb-0nLlm6rS00jWLkojASwVmdhW2w5Qz_Ak,1508
|
|
||||||
setuptools/command/bdist_wininst.py,sha256=_6dz3lpB1tY200LxKPLM7qgwTCceOMgaWFF-jW2-pm0,637
|
|
||||||
setuptools/command/build_ext.py,sha256=pkQ8xp3YPVGGLkGv-SvfxC_GqFpboph1AFEoMFOgQMo,11964
|
|
||||||
setuptools/command/build_py.py,sha256=HvJ88JuougDccaowYlfMV12kYtd0GLahg2DR2vQRqL4,7983
|
|
||||||
setuptools/command/develop.py,sha256=VxSYbpM2jQqtRBn5klIjPVBo3sWKNZMlSbHHiRLUlZo,7383
|
|
||||||
setuptools/command/easy_install.py,sha256=WDidYAhIEWCT-63bVvoazy8HcITEWDn4Xzgrj3YZgz0,88492
|
|
||||||
setuptools/command/egg_info.py,sha256=0_8eI8hgLAlGt8Xk5kiodY_d9lxG6_RSescJISKBJgA,16890
|
|
||||||
setuptools/command/install.py,sha256=QwaFiZRU3ytIHoPh8uJ9EqV3Fu9C4ca4B7UGAo95tws,4685
|
|
||||||
setuptools/command/install_egg_info.py,sha256=fEqU1EplTs_vUjAzwiEB7LrtdZBQ3BefwuUZLZBDEQ0,5027
|
|
||||||
setuptools/command/install_lib.py,sha256=5IZM251t4DzOdZAXCezdROr3X0SeeE41eyV059RNgZ4,5011
|
|
||||||
setuptools/command/install_scripts.py,sha256=vX2JC6v7l090N7CrTfihWBklNbPvfNKAY2LRtukM9XE,2231
|
|
||||||
setuptools/command/register.py,sha256=bHlMm1qmBbSdahTOT8w6UhA-EgeQIz7p6cD-qOauaiI,270
|
|
||||||
setuptools/command/rotate.py,sha256=QGZS2t4CmBl7t79KQijNCjRMU50lu3nRhu4FXWB5LIE,2038
|
|
||||||
setuptools/command/saveopts.py,sha256=za7QCBcQimKKriWcoCcbhxPjUz30gSB74zuTL47xpP4,658
|
|
||||||
setuptools/command/sdist.py,sha256=kQetnPMw6ao3nurWGJZgS4HkOH4AknzMOSvqbVA6jGA,7050
|
|
||||||
setuptools/command/setopt.py,sha256=cygJaJWJmiVhR0e_Uh_0_fWyCxMJIqK-Bu6K0LyYUtU,5086
|
|
||||||
setuptools/command/test.py,sha256=N2f5RwxkjwU3YQzFYHtzHr636-pdX9XJDuPg5Y92kSo,6888
|
|
||||||
setuptools/command/upload.py,sha256=OjAryq4ZoARZiaTN_MpuG1X8Pu9CJNCKmmbMg-gab5I,649
|
|
||||||
setuptools/command/upload_docs.py,sha256=htXpASci5gKP0RIrGZRRmbll7RnTRuwvKWZkYsBlDMM,6815
|
|
||||||
setuptools/extern/__init__.py,sha256=mTrrj4yLMdFeEwwnqKnSuvZM5RM-HPZ1iXLgaYDlB9o,132
|
|
||||||
../../../bin/easy_install,sha256=LopKneUXvnG_dqCSZe6amF-Bf4WEh1ny0uo28w2_nQ0,299
|
|
||||||
../../../bin/easy_install-3.4,sha256=LopKneUXvnG_dqCSZe6amF-Bf4WEh1ny0uo28w2_nQ0,299
|
|
||||||
_markerlib-0.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
|
||||||
setuptools/extern/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/bdist_wininst.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/install_egg_info.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/egg_info.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/sdist.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/launch.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/version.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/site-patch.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/saveopts.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/easy_install.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/rotate.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/build_ext.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/utils.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/windows_support.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/py26compat.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/extension.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/msvc9_support.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/py27compat.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/upload_docs.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/install_scripts.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/build_py.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/sandbox.cpython-34.pyc,,
|
|
||||||
_markerlib/__pycache__/markers.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/py31compat.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/alias.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/setopt.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/dist.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/depends.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/ssl_support.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/register.cpython-34.pyc,,
|
|
||||||
_markerlib/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/unicode_utils.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/install_lib.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/install.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/bdist_rpm.cpython-34.pyc,,
|
|
||||||
__pycache__/easy_install.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/upload.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/lib2to3_ex.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/bdist_egg.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/test.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/archive_util.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/package_index.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/develop.cpython-34.pyc,,
|
|
|
@ -1,2 +0,0 @@
|
||||||
https://pypi.python.org/packages/source/c/certifi/certifi-2015.11.20.tar.gz#md5=25134646672c695c1ff1593c2dd75d08
|
|
||||||
https://pypi.python.org/packages/source/w/wincertstore/wincertstore-0.2.zip#md5=ae728f2f007185648d0c7a8679b361e2
|
|
|
@ -1 +0,0 @@
|
||||||
{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Archiving :: Packaging", "Topic :: System :: Systems Administration", "Topic :: Utilities"], "extensions": {"python.commands": {"wrap_console": {"easy_install": "setuptools.command.easy_install:main"}}, "python.details": {"contacts": [{"email": "distutils-sig@python.org", "name": "Python Packaging Authority", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://bitbucket.org/pypa/setuptools"}}, "python.exports": {"console_scripts": {"easy_install": "setuptools.command.easy_install:main"}, "distutils.commands": {"alias": "setuptools.command.alias:alias", "bdist_egg": "setuptools.command.bdist_egg:bdist_egg", "bdist_rpm": "setuptools.command.bdist_rpm:bdist_rpm", "bdist_wininst": "setuptools.command.bdist_wininst:bdist_wininst", "build_ext": "setuptools.command.build_ext:build_ext", "build_py": "setuptools.command.build_py:build_py", "develop": "setuptools.command.develop:develop", "easy_install": "setuptools.command.easy_install:easy_install", "egg_info": "setuptools.command.egg_info:egg_info", "install": "setuptools.command.install:install", "install_egg_info": "setuptools.command.install_egg_info:install_egg_info", "install_lib": "setuptools.command.install_lib:install_lib", "install_scripts": "setuptools.command.install_scripts:install_scripts", "register": "setuptools.command.register:register", "rotate": "setuptools.command.rotate:rotate", "saveopts": "setuptools.command.saveopts:saveopts", "sdist": "setuptools.command.sdist:sdist", "setopt": "setuptools.command.setopt:setopt", "test": "setuptools.command.test:test", "upload": "setuptools.command.upload:upload", "upload_docs": "setuptools.command.upload_docs:upload_docs"}, "distutils.setup_keywords": {"convert_2to3_doctests": "setuptools.dist:assert_string_list", "dependency_links": "setuptools.dist:assert_string_list", "eager_resources": "setuptools.dist:assert_string_list", "entry_points": "setuptools.dist:check_entry_points", "exclude_package_data": "setuptools.dist:check_package_data", "extras_require": "setuptools.dist:check_extras", "include_package_data": "setuptools.dist:assert_bool", "install_requires": "setuptools.dist:check_requirements", "namespace_packages": "setuptools.dist:check_nsp", "package_data": "setuptools.dist:check_package_data", "packages": "setuptools.dist:check_packages", "setup_requires": "setuptools.dist:check_requirements", "test_loader": "setuptools.dist:check_importable", "test_runner": "setuptools.dist:check_importable", "test_suite": "setuptools.dist:check_test_suite", "tests_require": "setuptools.dist:check_requirements", "use_2to3": "setuptools.dist:assert_bool", "use_2to3_exclude_fixers": "setuptools.dist:assert_string_list", "use_2to3_fixers": "setuptools.dist:assert_string_list", "zip_safe": "setuptools.dist:assert_bool"}, "egg_info.writers": {"PKG-INFO": "setuptools.command.egg_info:write_pkg_info", "dependency_links.txt": "setuptools.command.egg_info:overwrite_arg", "depends.txt": "setuptools.command.egg_info:warn_depends_obsolete", "eager_resources.txt": "setuptools.command.egg_info:overwrite_arg", "entry_points.txt": "setuptools.command.egg_info:write_entries", "namespace_packages.txt": "setuptools.command.egg_info:overwrite_arg", "requires.txt": "setuptools.command.egg_info:write_requirements", "top_level.txt": "setuptools.command.egg_info:write_toplevel_names"}, "setuptools.installation": {"eggsecutable": "setuptools.command.easy_install:bootstrap"}}}, "generator": "bdist_wheel (0.29.0)", "keywords": ["CPAN", "PyPI", "distutils", "eggs", "package", "management"], "metadata_version": "2.0", "name": "setuptools", "summary": "Easily download, build, install, upgrade, and uninstall Python packages", "version": "20.1.1"}
|
|
|
@ -1,4 +0,0 @@
|
||||||
_markerlib
|
|
||||||
easy_install
|
|
||||||
pkg_resources
|
|
||||||
setuptools
|
|
|
@ -1,16 +0,0 @@
|
||||||
try:
|
|
||||||
import ast
|
|
||||||
from _markerlib.markers import default_environment, compile, interpret
|
|
||||||
except ImportError:
|
|
||||||
if 'ast' in globals():
|
|
||||||
raise
|
|
||||||
def default_environment():
|
|
||||||
return {}
|
|
||||||
def compile(marker):
|
|
||||||
def marker_fn(environment=None, override=None):
|
|
||||||
# 'empty markers are True' heuristic won't install extra deps.
|
|
||||||
return not marker.strip()
|
|
||||||
marker_fn.__doc__ = marker
|
|
||||||
return marker_fn
|
|
||||||
def interpret(marker, environment=None, override=None):
|
|
||||||
return compile(marker)()
|
|
|
@ -1,119 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
"""Interpret PEP 345 environment markers.
|
|
||||||
|
|
||||||
EXPR [in|==|!=|not in] EXPR [or|and] ...
|
|
||||||
|
|
||||||
where EXPR belongs to any of those:
|
|
||||||
|
|
||||||
python_version = '%s.%s' % (sys.version_info[0], sys.version_info[1])
|
|
||||||
python_full_version = sys.version.split()[0]
|
|
||||||
os.name = os.name
|
|
||||||
sys.platform = sys.platform
|
|
||||||
platform.version = platform.version()
|
|
||||||
platform.machine = platform.machine()
|
|
||||||
platform.python_implementation = platform.python_implementation()
|
|
||||||
a free string, like '2.6', or 'win32'
|
|
||||||
"""
|
|
||||||
|
|
||||||
__all__ = ['default_environment', 'compile', 'interpret']
|
|
||||||
|
|
||||||
import ast
|
|
||||||
import os
|
|
||||||
import platform
|
|
||||||
import sys
|
|
||||||
import weakref
|
|
||||||
|
|
||||||
_builtin_compile = compile
|
|
||||||
|
|
||||||
try:
|
|
||||||
from platform import python_implementation
|
|
||||||
except ImportError:
|
|
||||||
if os.name == "java":
|
|
||||||
# Jython 2.5 has ast module, but not platform.python_implementation() function.
|
|
||||||
def python_implementation():
|
|
||||||
return "Jython"
|
|
||||||
else:
|
|
||||||
raise
|
|
||||||
|
|
||||||
|
|
||||||
# restricted set of variables
|
|
||||||
_VARS = {'sys.platform': sys.platform,
|
|
||||||
'python_version': '%s.%s' % sys.version_info[:2],
|
|
||||||
# FIXME parsing sys.platform is not reliable, but there is no other
|
|
||||||
# way to get e.g. 2.7.2+, and the PEP is defined with sys.version
|
|
||||||
'python_full_version': sys.version.split(' ', 1)[0],
|
|
||||||
'os.name': os.name,
|
|
||||||
'platform.version': platform.version(),
|
|
||||||
'platform.machine': platform.machine(),
|
|
||||||
'platform.python_implementation': python_implementation(),
|
|
||||||
'extra': None # wheel extension
|
|
||||||
}
|
|
||||||
|
|
||||||
for var in list(_VARS.keys()):
|
|
||||||
if '.' in var:
|
|
||||||
_VARS[var.replace('.', '_')] = _VARS[var]
|
|
||||||
|
|
||||||
def default_environment():
|
|
||||||
"""Return copy of default PEP 385 globals dictionary."""
|
|
||||||
return dict(_VARS)
|
|
||||||
|
|
||||||
class ASTWhitelist(ast.NodeTransformer):
|
|
||||||
def __init__(self, statement):
|
|
||||||
self.statement = statement # for error messages
|
|
||||||
|
|
||||||
ALLOWED = (ast.Compare, ast.BoolOp, ast.Attribute, ast.Name, ast.Load, ast.Str)
|
|
||||||
# Bool operations
|
|
||||||
ALLOWED += (ast.And, ast.Or)
|
|
||||||
# Comparison operations
|
|
||||||
ALLOWED += (ast.Eq, ast.Gt, ast.GtE, ast.In, ast.Is, ast.IsNot, ast.Lt, ast.LtE, ast.NotEq, ast.NotIn)
|
|
||||||
|
|
||||||
def visit(self, node):
|
|
||||||
"""Ensure statement only contains allowed nodes."""
|
|
||||||
if not isinstance(node, self.ALLOWED):
|
|
||||||
raise SyntaxError('Not allowed in environment markers.\n%s\n%s' %
|
|
||||||
(self.statement,
|
|
||||||
(' ' * node.col_offset) + '^'))
|
|
||||||
return ast.NodeTransformer.visit(self, node)
|
|
||||||
|
|
||||||
def visit_Attribute(self, node):
|
|
||||||
"""Flatten one level of attribute access."""
|
|
||||||
new_node = ast.Name("%s.%s" % (node.value.id, node.attr), node.ctx)
|
|
||||||
return ast.copy_location(new_node, node)
|
|
||||||
|
|
||||||
def parse_marker(marker):
|
|
||||||
tree = ast.parse(marker, mode='eval')
|
|
||||||
new_tree = ASTWhitelist(marker).generic_visit(tree)
|
|
||||||
return new_tree
|
|
||||||
|
|
||||||
def compile_marker(parsed_marker):
|
|
||||||
return _builtin_compile(parsed_marker, '<environment marker>', 'eval',
|
|
||||||
dont_inherit=True)
|
|
||||||
|
|
||||||
_cache = weakref.WeakValueDictionary()
|
|
||||||
|
|
||||||
def compile(marker):
|
|
||||||
"""Return compiled marker as a function accepting an environment dict."""
|
|
||||||
try:
|
|
||||||
return _cache[marker]
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
if not marker.strip():
|
|
||||||
def marker_fn(environment=None, override=None):
|
|
||||||
""""""
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
compiled_marker = compile_marker(parse_marker(marker))
|
|
||||||
def marker_fn(environment=None, override=None):
|
|
||||||
"""override updates environment"""
|
|
||||||
if override is None:
|
|
||||||
override = {}
|
|
||||||
if environment is None:
|
|
||||||
environment = default_environment()
|
|
||||||
environment.update(override)
|
|
||||||
return eval(compiled_marker, environment)
|
|
||||||
marker_fn.__doc__ = marker
|
|
||||||
_cache[marker] = marker_fn
|
|
||||||
return _cache[marker]
|
|
||||||
|
|
||||||
def interpret(marker, environment=None):
|
|
||||||
return compile(marker)(environment)
|
|
|
@ -6,6 +6,7 @@ Home-page: https://github.com/warner/python-ed25519
|
||||||
Author: Brian Warner
|
Author: Brian Warner
|
||||||
Author-email: warner-python-ed25519@lothar.com
|
Author-email: warner-python-ed25519@lothar.com
|
||||||
License: MIT
|
License: MIT
|
||||||
|
Description-Content-Type: UNKNOWN
|
||||||
Platform: UNKNOWN
|
Platform: UNKNOWN
|
||||||
Classifier: Development Status :: 5 - Production/Stable
|
Classifier: Development Status :: 5 - Production/Stable
|
||||||
Classifier: Intended Audience :: Developers
|
Classifier: Intended Audience :: Developers
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
ed25519/__init__.py,sha256=0AicD1xQAforRdrUWwmmURJkZ3Gi1lqaifukwZNYJos,401
|
ed25519/__init__.py,sha256=0AicD1xQAforRdrUWwmmURJkZ3Gi1lqaifukwZNYJos,401
|
||||||
ed25519/_ed25519.cpython-34m.so,sha256=lQsx9-Rms4glBHDzWgcSZ4kgoWp-fVN9O3lGztOiNO8,255624
|
ed25519/_ed25519.cpython-34m.so,sha256=-qvpNKMbtiJoFhWHlvH83lGmJEntE9ISrt8hYZE4zig,262968
|
||||||
ed25519/_version.py,sha256=yb119RosJrH_RO02_o3o12GWQvkxx3xD4X7UrJW9vTY,469
|
ed25519/_version.py,sha256=yb119RosJrH_RO02_o3o12GWQvkxx3xD4X7UrJW9vTY,469
|
||||||
ed25519/keys.py,sha256=AbMFsbxn0qbwmQ6HntpNURsOGq_y4puwFxs6U7Of2eo,7123
|
ed25519/keys.py,sha256=AbMFsbxn0qbwmQ6HntpNURsOGq_y4puwFxs6U7Of2eo,7123
|
||||||
ed25519/test_ed25519.py,sha256=IG8ot-yARHi6PoyJY6ixS1l2L23hE1lCXbSH-XQPCCM,12389
|
ed25519/test_ed25519.py,sha256=IG8ot-yARHi6PoyJY6ixS1l2L23hE1lCXbSH-XQPCCM,12389
|
||||||
../../../bin/edsig,sha256=SA1mUUWCjAAaSEe6MKSpVWg-2qXwuiuK3PodCAUwCN0,2853
|
../../../bin/edsig,sha256=SA1mUUWCjAAaSEe6MKSpVWg-2qXwuiuK3PodCAUwCN0,2853
|
||||||
ed25519-1.4.dist-info/DESCRIPTION.rst,sha256=8UWGEqjPrB7zPyxLA5Ep6JL58ANbe0Wybqth188exdc,434
|
ed25519-1.4.dist-info/DESCRIPTION.rst,sha256=8UWGEqjPrB7zPyxLA5Ep6JL58ANbe0Wybqth188exdc,434
|
||||||
ed25519-1.4.dist-info/METADATA,sha256=5SfqBgerND9vMg8dq81VUTwDclNFkXr30DkD9K95gZU,1114
|
ed25519-1.4.dist-info/METADATA,sha256=8xAIfsJS4nw5H1ui1jHsVntmwcMjIzm4j_LHEaW3wNQ,1148
|
||||||
ed25519-1.4.dist-info/RECORD,,
|
ed25519-1.4.dist-info/RECORD,,
|
||||||
ed25519-1.4.dist-info/WHEEL,sha256=HslHw5cSLCuyOLxj8duGAooHNvXnupcmoBU1NzRPr2w,104
|
ed25519-1.4.dist-info/WHEEL,sha256=AEztX7vHDtcgysb-4-5-DyIKMLIPg6NMxY9dXTRdoXQ,104
|
||||||
ed25519-1.4.dist-info/metadata.json,sha256=LyRoPQ8zyOxjJH1CoRteHtukVr0HLA_z_rRyigiJl5c,802
|
ed25519-1.4.dist-info/metadata.json,sha256=6X6ChTS1aIj99pNHtLNerEBCuO-F-P2Z1GgSMt2svQw,841
|
||||||
ed25519-1.4.dist-info/top_level.txt,sha256=U3-N9ZJMBO9MUuZLwoiMbsWSkxsd0TfkNSuzO6O_gYY,8
|
ed25519-1.4.dist-info/top_level.txt,sha256=U3-N9ZJMBO9MUuZLwoiMbsWSkxsd0TfkNSuzO6O_gYY,8
|
||||||
ed25519-1.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
ed25519-1.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||||
ed25519/__pycache__/test_ed25519.cpython-34.pyc,,
|
|
||||||
ed25519/__pycache__/keys.cpython-34.pyc,,
|
ed25519/__pycache__/keys.cpython-34.pyc,,
|
||||||
ed25519/__pycache__/_version.cpython-34.pyc,,
|
ed25519/__pycache__/_version.cpython-34.pyc,,
|
||||||
ed25519/__pycache__/__init__.cpython-34.pyc,,
|
ed25519/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
ed25519/__pycache__/test_ed25519.cpython-34.pyc,,
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
Wheel-Version: 1.0
|
Wheel-Version: 1.0
|
||||||
Generator: bdist_wheel (0.29.0)
|
Generator: bdist_wheel (0.30.0)
|
||||||
Root-Is-Purelib: false
|
Root-Is-Purelib: false
|
||||||
Tag: cp34-cp34m-linux_x86_64
|
Tag: cp34-cp34m-linux_x86_64
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Topic :: Security :: Cryptography"], "extensions": {"python.details": {"contacts": [{"email": "warner-python-ed25519@lothar.com", "name": "Brian Warner", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/warner/python-ed25519"}}}, "generator": "bdist_wheel (0.29.0)", "license": "MIT", "metadata_version": "2.0", "name": "ed25519", "summary": "Ed25519 public-key signatures", "version": "1.4"}
|
{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Topic :: Security :: Cryptography"], "description_content_type": "UNKNOWN", "extensions": {"python.details": {"contacts": [{"email": "warner-python-ed25519@lothar.com", "name": "Brian Warner", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/warner/python-ed25519"}}}, "generator": "bdist_wheel (0.30.0)", "license": "MIT", "metadata_version": "2.0", "name": "ed25519", "summary": "Ed25519 public-key signatures", "version": "1.4"}
|
Binary file not shown.
Binary file not shown.
BIN
lib/python3.4/site-packages/ed25519/_ed25519.cpython-36m-x86_64-linux-gnu.so
Executable file
BIN
lib/python3.4/site-packages/ed25519/_ed25519.cpython-36m-x86_64-linux-gnu.so
Executable file
Binary file not shown.
|
@ -1,9 +0,0 @@
|
||||||
netifaces.cpython-34m.so,sha256=EeBiWGLxMMMKQaD6B1EoqpC_NIiyqj5dW8sxPOffQNY,61520
|
|
||||||
netifaces-0.10.4.dist-info/DESCRIPTION.rst,sha256=EyJf6yFbUVkw5TpZ0M61ZeVbtCZdHYAqSdfTXT4lo6w,8397
|
|
||||||
netifaces-0.10.4.dist-info/METADATA,sha256=nrFMGFClFWGJIsVo8nC9bLS6iermD9vl6cCQS56eG50,9130
|
|
||||||
netifaces-0.10.4.dist-info/RECORD,,
|
|
||||||
netifaces-0.10.4.dist-info/WHEEL,sha256=HslHw5cSLCuyOLxj8duGAooHNvXnupcmoBU1NzRPr2w,104
|
|
||||||
netifaces-0.10.4.dist-info/metadata.json,sha256=FHsfPfcnSFKu412WegZiPVzBB-sHxrG_wCDSiaB6SHQ,846
|
|
||||||
netifaces-0.10.4.dist-info/top_level.txt,sha256=PqMTaIuWtSjkdQHX6lH1Lmpv2aqBUYAGqATB8z3A6TQ,10
|
|
||||||
netifaces-0.10.4.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
||||||
netifaces-0.10.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
|
|
@ -1 +0,0 @@
|
||||||
{"classifiers": ["Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Topic :: System :: Networking", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.5", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3"], "extensions": {"python.details": {"contacts": [{"email": "alastair@alastairs-place.net", "name": "Alastair Houghton", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://bitbucket.org/al45tair/netifaces"}}}, "generator": "bdist_wheel (0.29.0)", "license": "MIT License", "metadata_version": "2.0", "name": "netifaces", "summary": "Portable network interface information.", "version": "0.10.4"}
|
|
|
@ -1,4 +1,4 @@
|
||||||
netifaces 0.10.4
|
netifaces 0.10.6
|
||||||
================
|
================
|
||||||
|
|
||||||
.. image:: https://drone.io/bitbucket.org/al45tair/netifaces/status.png
|
.. image:: https://drone.io/bitbucket.org/al45tair/netifaces/status.png
|
||||||
|
@ -24,10 +24,13 @@ This package attempts to solve that problem.
|
||||||
|
|
||||||
First you need to install it, which you can do by typing::
|
First you need to install it, which you can do by typing::
|
||||||
|
|
||||||
tar xvzf netifaces-0.10.4.tar.gz
|
tar xvzf netifaces-0.10.6.tar.gz
|
||||||
cd netifaces-0.10.4
|
cd netifaces-0.10.6
|
||||||
python setup.py install
|
python setup.py install
|
||||||
|
|
||||||
|
**Note that you will need the relevant developer tools for your platform**,
|
||||||
|
as netifaces is written in C and installing this way will compile the extension.
|
||||||
|
|
||||||
Once that's done, you'll need to start Python and do something like the
|
Once that's done, you'll need to start Python and do something like the
|
||||||
following::
|
following::
|
||||||
|
|
||||||
|
@ -164,7 +167,7 @@ wish to contribute a patch, please use BitBucket to send a pull request.
|
||||||
|
|
||||||
It's an MIT-style license. Here goes:
|
It's an MIT-style license. Here goes:
|
||||||
|
|
||||||
Copyright (c) 2007-2014 Alastair Houghton
|
Copyright (c) 2007-2017 Alastair Houghton
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
|
@ -1,11 +1,12 @@
|
||||||
Metadata-Version: 2.0
|
Metadata-Version: 2.0
|
||||||
Name: netifaces
|
Name: netifaces
|
||||||
Version: 0.10.4
|
Version: 0.10.6
|
||||||
Summary: Portable network interface information.
|
Summary: Portable network interface information.
|
||||||
Home-page: https://bitbucket.org/al45tair/netifaces
|
Home-page: https://bitbucket.org/al45tair/netifaces
|
||||||
Author: Alastair Houghton
|
Author: Alastair Houghton
|
||||||
Author-email: alastair@alastairs-place.net
|
Author-email: alastair@alastairs-place.net
|
||||||
License: MIT License
|
License: MIT License
|
||||||
|
Description-Content-Type: UNKNOWN
|
||||||
Platform: UNKNOWN
|
Platform: UNKNOWN
|
||||||
Classifier: Development Status :: 4 - Beta
|
Classifier: Development Status :: 4 - Beta
|
||||||
Classifier: Intended Audience :: Developers
|
Classifier: Intended Audience :: Developers
|
||||||
|
@ -18,7 +19,7 @@ Classifier: Programming Language :: Python :: 2.6
|
||||||
Classifier: Programming Language :: Python :: 2.7
|
Classifier: Programming Language :: Python :: 2.7
|
||||||
Classifier: Programming Language :: Python :: 3
|
Classifier: Programming Language :: Python :: 3
|
||||||
|
|
||||||
netifaces 0.10.4
|
netifaces 0.10.6
|
||||||
================
|
================
|
||||||
|
|
||||||
.. image:: https://drone.io/bitbucket.org/al45tair/netifaces/status.png
|
.. image:: https://drone.io/bitbucket.org/al45tair/netifaces/status.png
|
||||||
|
@ -44,10 +45,13 @@ This package attempts to solve that problem.
|
||||||
|
|
||||||
First you need to install it, which you can do by typing::
|
First you need to install it, which you can do by typing::
|
||||||
|
|
||||||
tar xvzf netifaces-0.10.4.tar.gz
|
tar xvzf netifaces-0.10.6.tar.gz
|
||||||
cd netifaces-0.10.4
|
cd netifaces-0.10.6
|
||||||
python setup.py install
|
python setup.py install
|
||||||
|
|
||||||
|
**Note that you will need the relevant developer tools for your platform**,
|
||||||
|
as netifaces is written in C and installing this way will compile the extension.
|
||||||
|
|
||||||
Once that's done, you'll need to start Python and do something like the
|
Once that's done, you'll need to start Python and do something like the
|
||||||
following::
|
following::
|
||||||
|
|
||||||
|
@ -184,7 +188,7 @@ wish to contribute a patch, please use BitBucket to send a pull request.
|
||||||
|
|
||||||
It's an MIT-style license. Here goes:
|
It's an MIT-style license. Here goes:
|
||||||
|
|
||||||
Copyright (c) 2007-2014 Alastair Houghton
|
Copyright (c) 2007-2017 Alastair Houghton
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
|
@ -0,0 +1,9 @@
|
||||||
|
netifaces.cpython-34m.so,sha256=KiLZHMhvo_x40-9D0bLqZoVzQsGbimZY_33SUPowm9E,72976
|
||||||
|
netifaces-0.10.6.dist-info/DESCRIPTION.rst,sha256=WCNR0xdB7g_1r_U6WwIedMlurGlPeDjvJX-NBElPoII,8555
|
||||||
|
netifaces-0.10.6.dist-info/METADATA,sha256=InwXovYI_sgETAChE4hBUFbkSwYlZ_gWeKcNvyX8KOA,9322
|
||||||
|
netifaces-0.10.6.dist-info/RECORD,,
|
||||||
|
netifaces-0.10.6.dist-info/WHEEL,sha256=AEztX7vHDtcgysb-4-5-DyIKMLIPg6NMxY9dXTRdoXQ,104
|
||||||
|
netifaces-0.10.6.dist-info/metadata.json,sha256=W-IHSrO0Ma846gdBr18QTsvc9GjGN0SgAnZha0vW9tU,885
|
||||||
|
netifaces-0.10.6.dist-info/top_level.txt,sha256=PqMTaIuWtSjkdQHX6lH1Lmpv2aqBUYAGqATB8z3A6TQ,10
|
||||||
|
netifaces-0.10.6.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
||||||
|
netifaces-0.10.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
|
@ -1,5 +1,5 @@
|
||||||
Wheel-Version: 1.0
|
Wheel-Version: 1.0
|
||||||
Generator: bdist_wheel (0.29.0)
|
Generator: bdist_wheel (0.30.0)
|
||||||
Root-Is-Purelib: false
|
Root-Is-Purelib: false
|
||||||
Tag: cp34-cp34m-linux_x86_64
|
Tag: cp34-cp34m-linux_x86_64
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
{"classifiers": ["Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Topic :: System :: Networking", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.5", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3"], "description_content_type": "UNKNOWN", "extensions": {"python.details": {"contacts": [{"email": "alastair@alastairs-place.net", "name": "Alastair Houghton", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://bitbucket.org/al45tair/netifaces"}}}, "generator": "bdist_wheel (0.30.0)", "license": "MIT License", "metadata_version": "2.0", "name": "netifaces", "summary": "Portable network interface information.", "version": "0.10.6"}
|
Binary file not shown.
BIN
lib/python3.4/site-packages/netifaces.cpython-35m-x86_64-linux-gnu.so
Normal file → Executable file
BIN
lib/python3.4/site-packages/netifaces.cpython-35m-x86_64-linux-gnu.so
Normal file → Executable file
Binary file not shown.
BIN
lib/python3.4/site-packages/netifaces.cpython-36m-x86_64-linux-gnu.so
Executable file
BIN
lib/python3.4/site-packages/netifaces.cpython-36m-x86_64-linux-gnu.so
Executable file
Binary file not shown.
|
@ -19,9 +19,12 @@ tool for installing Python packages.
|
||||||
.. image:: https://img.shields.io/pypi/v/pip.svg
|
.. image:: https://img.shields.io/pypi/v/pip.svg
|
||||||
:target: https://pypi.python.org/pypi/pip
|
:target: https://pypi.python.org/pypi/pip
|
||||||
|
|
||||||
.. image:: https://img.shields.io/travis/pypa/pip/develop.svg
|
.. image:: https://img.shields.io/travis/pypa/pip/master.svg
|
||||||
:target: http://travis-ci.org/pypa/pip
|
:target: http://travis-ci.org/pypa/pip
|
||||||
|
|
||||||
|
.. image:: https://img.shields.io/appveyor/ci/pypa/pip.svg
|
||||||
|
:target: https://ci.appveyor.com/project/pypa/pip/history
|
||||||
|
|
||||||
.. image:: https://readthedocs.org/projects/pip/badge/?version=stable
|
.. image:: https://readthedocs.org/projects/pip/badge/?version=stable
|
||||||
:target: https://pip.pypa.io/en/stable
|
:target: https://pip.pypa.io/en/stable
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
Metadata-Version: 2.0
|
Metadata-Version: 2.0
|
||||||
Name: pip
|
Name: pip
|
||||||
Version: 8.1.1
|
Version: 9.0.1
|
||||||
Summary: The PyPA recommended tool for installing Python packages.
|
Summary: The PyPA recommended tool for installing Python packages.
|
||||||
Home-page: https://pip.pypa.io/
|
Home-page: https://pip.pypa.io/
|
||||||
Author: The pip developers
|
Author: The pip developers
|
||||||
|
@ -20,6 +20,7 @@ Classifier: Programming Language :: Python :: 3.3
|
||||||
Classifier: Programming Language :: Python :: 3.4
|
Classifier: Programming Language :: Python :: 3.4
|
||||||
Classifier: Programming Language :: Python :: 3.5
|
Classifier: Programming Language :: Python :: 3.5
|
||||||
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
||||||
|
Requires-Python: >=2.6,!=3.0.*,!=3.1.*,!=3.2.*
|
||||||
Provides-Extra: testing
|
Provides-Extra: testing
|
||||||
Requires-Dist: mock; extra == 'testing'
|
Requires-Dist: mock; extra == 'testing'
|
||||||
Requires-Dist: pretend; extra == 'testing'
|
Requires-Dist: pretend; extra == 'testing'
|
||||||
|
@ -48,9 +49,12 @@ tool for installing Python packages.
|
||||||
.. image:: https://img.shields.io/pypi/v/pip.svg
|
.. image:: https://img.shields.io/pypi/v/pip.svg
|
||||||
:target: https://pypi.python.org/pypi/pip
|
:target: https://pypi.python.org/pypi/pip
|
||||||
|
|
||||||
.. image:: https://img.shields.io/travis/pypa/pip/develop.svg
|
.. image:: https://img.shields.io/travis/pypa/pip/master.svg
|
||||||
:target: http://travis-ci.org/pypa/pip
|
:target: http://travis-ci.org/pypa/pip
|
||||||
|
|
||||||
|
.. image:: https://img.shields.io/appveyor/ci/pypa/pip.svg
|
||||||
|
:target: https://ci.appveyor.com/project/pypa/pip/history
|
||||||
|
|
||||||
.. image:: https://readthedocs.org/projects/pip/badge/?version=stable
|
.. image:: https://readthedocs.org/projects/pip/badge/?version=stable
|
||||||
:target: https://pip.pypa.io/en/stable
|
:target: https://pip.pypa.io/en/stable
|
||||||
|
|
|
@ -1,117 +1,123 @@
|
||||||
pip/__init__.py,sha256=fFs-ytm2H4V2evGESaozmF7U0BaGIMM0drFJZ5Ifj4s,10427
|
pip/__init__.py,sha256=00QWSreEBjb8Y8sPs8HeqgLXSB-3UrONJxo4J5APxEc,11348
|
||||||
pip/__main__.py,sha256=V6Kh-IEDEFpt1cahRE6MajUF_14qJR_Qsvn4MjWZXzE,584
|
pip/__main__.py,sha256=V6Kh-IEDEFpt1cahRE6MajUF_14qJR_Qsvn4MjWZXzE,584
|
||||||
pip/basecommand.py,sha256=Zlg6SE42TIjRyt1mct0LCkgNxcKKnss3xvASJyDqucE,11429
|
pip/basecommand.py,sha256=TTlmZesQ4Vuxcto2KqwZGmgmN5ioHEl_DeFev9ie_SA,11910
|
||||||
pip/baseparser.py,sha256=Nlc7Un9gat27xtB24SnKL_3pZZOoh62gNNRdS6tDRZY,10465
|
pip/baseparser.py,sha256=AKMOeF3fTrRroiv0DmTQbdiLW0DQux2KqGC_dJJB9d0,10465
|
||||||
pip/cmdoptions.py,sha256=pf24iszA39rhcJ5DjFA4oD_z5vTI0NG98qUahHs3qPM,15878
|
pip/cmdoptions.py,sha256=pRptFz05iFEfSW4Flg3x1_P92sYlFvq7elhnwujikNY,16473
|
||||||
pip/download.py,sha256=oJ3sZ8I6ct9X3eoXQ9xm_Ne0e6N85G_rWaERmMCVF2k,31722
|
pip/download.py,sha256=rA0wbmqC2n9ejX481YJSidmKgQqQDjdaxkHkHlAN68k,32171
|
||||||
pip/exceptions.py,sha256=GdDhHOROBj-kW2rgerLJYXsxN8ENy1BX5RUb_Vs9TXM,7980
|
pip/exceptions.py,sha256=BvqH-Jw3tP2b-2IJ2kjrQemOAPMqKrQMLRIZHZQpJXk,8121
|
||||||
pip/index.py,sha256=kpyj_O5c0VVlvhg5VuVm4oAGGh6RvD7Xr0syPN-eGa0,37191
|
pip/index.py,sha256=L6UhtAEZc2qw7BqfQrkPQcw2gCgEw3GukLRSA95BNyI,39950
|
||||||
pip/locations.py,sha256=MqUzS8YI2wDa7oFzTQw4zM4s0Hci05yubxfU_kTXXlU,5632
|
pip/locations.py,sha256=9rJRlgonC6QC2zGDIn_7mXaoZ9_tF_IHM2BQhWVRgbo,5626
|
||||||
pip/pep425tags.py,sha256=4PNr9hd8OsXnKYR2q2oLzfDDhF5bFBwUZA-ZQxAClSI,11318
|
pip/pep425tags.py,sha256=q3kec4f6NHszuGYIhGIbVvs896D06uJAnKFgJ_wce44,10980
|
||||||
pip/status_codes.py,sha256=F6uDG6Gj7RNKQJUDnd87QKqI16Us-t-B0wPF_4QMpWc,156
|
pip/status_codes.py,sha256=F6uDG6Gj7RNKQJUDnd87QKqI16Us-t-B0wPF_4QMpWc,156
|
||||||
pip/wheel.py,sha256=qg1DgjXtiQCnY-IJY5HC5VgpeQm9WCjDKYmefSfOjq0,32088
|
pip/wheel.py,sha256=QSWmGs2ui-n4UMWm0JUY6aMCcwNKungVzbWsxI9KlJQ,32010
|
||||||
pip/_vendor/__init__.py,sha256=9EPZ-JLxtXMt71Fp5_pKTTe1QbJZZVlN81rsRYEvlpA,4781
|
pip/_vendor/__init__.py,sha256=L-0x9jj0HSZen1Fm2U0GUbxfjfwQPIXc4XJ4IAxy8D8,4804
|
||||||
pip/commands/__init__.py,sha256=naZ1iIWRutNznOVpLj8qyn1GPE0B5rhCWCrSUOZSt4M,2145
|
pip/commands/__init__.py,sha256=2Uq3HCdjchJD9FL1LB7rd5v6UySVAVizX0W3EX3hIoE,2244
|
||||||
pip/commands/completion.py,sha256=2BEUY3jowgemiIGgUP3rpk6A9My4Eu8rTPosFxlESOE,1967
|
pip/commands/check.py,sha256=-A7GI1-WZBh9a4P6UoH_aR-J7I8Lz8ly7m3wnCjmevs,1382
|
||||||
pip/commands/download.py,sha256=dMRtH0JMBhNGlJWr1qC29vOeiBzG2K0OjOAfzdxSVgA,4804
|
pip/commands/completion.py,sha256=kkPgVX7SUcJ_8Juw5GkgWaxHN9_45wmAr9mGs1zXEEs,2453
|
||||||
pip/commands/freeze.py,sha256=KmQoLf-HruqBDzc-F2-ganGVn2lboNQqppfyrMsx3SU,2774
|
pip/commands/download.py,sha256=8RuuPmSYgAq3iEDTqZY_1PDXRqREdUULHNjWJeAv7Mo,7810
|
||||||
|
pip/commands/freeze.py,sha256=h6-yFMpjCjbNj8-gOm5UuoF6cg14N5rPV4TCi3_CeuI,2835
|
||||||
pip/commands/hash.py,sha256=MCt4jEFyfoce0lVeNEz1x49uaTY-VDkKiBvvxrVcHkw,1597
|
pip/commands/hash.py,sha256=MCt4jEFyfoce0lVeNEz1x49uaTY-VDkKiBvvxrVcHkw,1597
|
||||||
pip/commands/help.py,sha256=84HWkEdnGP_AEBHnn8gJP2Te0XTXRKFoXqXopbOZTNo,982
|
pip/commands/help.py,sha256=84HWkEdnGP_AEBHnn8gJP2Te0XTXRKFoXqXopbOZTNo,982
|
||||||
pip/commands/install.py,sha256=DvRVVwfUy6LV-AtNcxl9kLl7XOc7G7087ZhdD4QbP60,15628
|
pip/commands/install.py,sha256=o-CR1TKf-b1qaFv47nNlawqsIfDjXyIzv_iJUw1Trag,18069
|
||||||
pip/commands/list.py,sha256=u76U5TLODQ2g53sSUA4q6WhYus7usbuWuITQJsCnP3E,7412
|
pip/commands/list.py,sha256=93bCiFyt2Qut_YHkYHJMZHpXladmxsjS-yOtZeb3uqI,11369
|
||||||
pip/commands/search.py,sha256=9ClAcFzkJ_7AksTkNrUed5qzsplpBtMlJByJLqiZFqw,4777
|
pip/commands/search.py,sha256=oTs9QNdefnrmCV_JeftG0PGiMuYVmiEDF1OUaYsmDao,4502
|
||||||
pip/commands/show.py,sha256=dytBbI9XV-ChpV51tsuBygZJJO-QaO2Gtz5kbLkBCZE,5815
|
pip/commands/show.py,sha256=ZYM57_7U8KP9MQIIyHKQdZxmiEZByy-DRzB697VFoTY,5891
|
||||||
pip/commands/uninstall.py,sha256=tz8cXz4WdpUdnt3RvpdQwH6_SNMB50egBIZWa1dwfcc,2884
|
pip/commands/uninstall.py,sha256=tz8cXz4WdpUdnt3RvpdQwH6_SNMB50egBIZWa1dwfcc,2884
|
||||||
pip/commands/wheel.py,sha256=iT92Uo8qpVILl_Yk8L7AtkFVYGmY0ep5oDeyQSpwkLs,7528
|
pip/commands/wheel.py,sha256=z5SEhws2YRMb0Ml1IEkg6jFZMLRpLl86bHCrQbYt5zo,7729
|
||||||
pip/compat/__init__.py,sha256=7WN0B0XMYIldfminnT679VoEJLxNQPi9MFwCIt1_llU,4669
|
pip/compat/__init__.py,sha256=2Xs_IpsmdRgHbQgQO0c8_lPvHJnQXHyGWxPbLbYJL4c,4672
|
||||||
pip/compat/dictconfig.py,sha256=dRrelPDWrceDSzFT51RTEVY2GuM7UDyc5Igh_tn4Fvk,23096
|
pip/compat/dictconfig.py,sha256=dRrelPDWrceDSzFT51RTEVY2GuM7UDyc5Igh_tn4Fvk,23096
|
||||||
pip/compat/ordereddict.py,sha256=6RQCd4PyTE4tvLUoAnsygvrreOSTV4BRDbc_4gCSkTs,4110
|
|
||||||
pip/models/__init__.py,sha256=0Rs7_RA4DxeOkWT5Cq4CQzDrSEhvYcN3TH2cazr72PE,71
|
pip/models/__init__.py,sha256=0Rs7_RA4DxeOkWT5Cq4CQzDrSEhvYcN3TH2cazr72PE,71
|
||||||
pip/models/index.py,sha256=pUfbO__v3mD9j-2n_ClwPS8pVyx4l2wIwyvWt8GMCRA,487
|
pip/models/index.py,sha256=pUfbO__v3mD9j-2n_ClwPS8pVyx4l2wIwyvWt8GMCRA,487
|
||||||
pip/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
pip/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||||
pip/operations/freeze.py,sha256=H6xpxe1XgoNm5f3UXK47kNy0OQfM5jzo4UUwQu7G-Lo,4048
|
pip/operations/check.py,sha256=uwUN9cs1sPo7c0Sj6pRrSv7b22Pk29SXUImTelVchMQ,1590
|
||||||
|
pip/operations/freeze.py,sha256=k-7w7LsM-RpPv7ERBzHiPpYkH-GuYfHLyR-Cp_1VPL0,5194
|
||||||
pip/req/__init__.py,sha256=vFwZY8_Vc1WU1zFAespg1My_r_AT3n7cN0W9eX0EFqk,276
|
pip/req/__init__.py,sha256=vFwZY8_Vc1WU1zFAespg1My_r_AT3n7cN0W9eX0EFqk,276
|
||||||
pip/req/req_file.py,sha256=3eaVnPMUAjikLdC5i8hZUAf8aAOby2UxmAVFf94FOXY,11928
|
pip/req/req_file.py,sha256=fG9MDsXUNPhmGwxUiwrIXEynyD8Q7s3L47-hLZPDXq0,11926
|
||||||
pip/req/req_install.py,sha256=aG0_hj8WqLLUH5tO40OFIncIxU50Vm4rFqYcx5hmoYk,45589
|
pip/req/req_install.py,sha256=gYrH-lwQMmt55VVbav_EtRIPu94cQbHFHm_Kq6AeHbg,46487
|
||||||
pip/req/req_set.py,sha256=Xwia1h7o2Z3Qogae3RHIDCGlXS3w2AeQPG8LBz7GmFM,32312
|
pip/req/req_set.py,sha256=jHspXqcA2FxcF05dgUIAZ5huYPv6bn0wRUX0Z7PKmaA,34462
|
||||||
pip/req/req_uninstall.py,sha256=fdH2VgCjEC8NRYDS7fRu3ZJaBBUEy-N5muwxDX5MBNM,6897
|
pip/req/req_uninstall.py,sha256=fdH2VgCjEC8NRYDS7fRu3ZJaBBUEy-N5muwxDX5MBNM,6897
|
||||||
pip/utils/__init__.py,sha256=SSixMJeh2SdjNgra_50jaC0jdmXFewLkFh_-a3tw9ks,28256
|
pip/utils/__init__.py,sha256=zk1vF2EzHZX1ZKPwgeC9I6yKvs8IJ6NZEfXgp2IP8hI,27912
|
||||||
pip/utils/appdirs.py,sha256=KTpZANfjYw5K2tZ0_jNNdP_kMxQAns79qZWelwaJo0c,7896
|
pip/utils/appdirs.py,sha256=kj2LK-I2fC5QnEh_A_v-ev_IQMcXaWWF5DE39sNvCLQ,8811
|
||||||
pip/utils/build.py,sha256=4smLRrfSCmXmjEnVnMFh2tBEpNcSLRe6J0ejZJ-wWJE,1312
|
pip/utils/build.py,sha256=4smLRrfSCmXmjEnVnMFh2tBEpNcSLRe6J0ejZJ-wWJE,1312
|
||||||
pip/utils/deprecation.py,sha256=DR3cKqzovYu9Pif7c9bT2KmwekfW95N3BsI45_5u38I,2239
|
pip/utils/deprecation.py,sha256=X_FMjtDbMJqfqEkdRrki-mYyIdPB6I6DHUTCA_ChY6M,2232
|
||||||
pip/utils/encoding.py,sha256=NQxGiFS5GbeAveLZTnx92t5r0PYqvt0iRnP2u9SGG1w,971
|
pip/utils/encoding.py,sha256=NQxGiFS5GbeAveLZTnx92t5r0PYqvt0iRnP2u9SGG1w,971
|
||||||
pip/utils/filesystem.py,sha256=ZEVBuYM3fqr2_lgOESh4Y7fPFszGD474zVm_M3Mb5Tk,899
|
pip/utils/filesystem.py,sha256=ZEVBuYM3fqr2_lgOESh4Y7fPFszGD474zVm_M3Mb5Tk,899
|
||||||
|
pip/utils/glibc.py,sha256=jcQYjt_oJLPKVZB28Kauy4Sw70zS-wawxoU1HHX36_0,2939
|
||||||
pip/utils/hashes.py,sha256=oMk7cd3PbJgzpSQyXq1MytMud5f6H5Oa2YY5hYuCq6I,2866
|
pip/utils/hashes.py,sha256=oMk7cd3PbJgzpSQyXq1MytMud5f6H5Oa2YY5hYuCq6I,2866
|
||||||
pip/utils/logging.py,sha256=7yWu4gZw-Qclj7X80QVdpGWkdTWGKT4LiUVKcE04pro,3327
|
pip/utils/logging.py,sha256=7yWu4gZw-Qclj7X80QVdpGWkdTWGKT4LiUVKcE04pro,3327
|
||||||
pip/utils/outdated.py,sha256=fNwOCL5r2EftPGhgCYGMKu032HC8cV-JAr9lp0HmToM,5455
|
pip/utils/outdated.py,sha256=fNwOCL5r2EftPGhgCYGMKu032HC8cV-JAr9lp0HmToM,5455
|
||||||
pip/utils/setuptools_build.py,sha256=8IGop-SZ6lxUl5HMOjLRaDlORPugIH_b_b2Y67x4jQc,240
|
pip/utils/packaging.py,sha256=qhmli14odw6DIhWJgQYS2Q0RrSbr8nXNcG48f5yTRms,2080
|
||||||
|
pip/utils/setuptools_build.py,sha256=0blfscmNJW_iZ5DcswJeDB_PbtTEjfK9RL1R1WEDW2E,278
|
||||||
pip/utils/ui.py,sha256=pbDkSAeumZ6jdZcOJ2yAbx8iBgeP2zfpqNnLJK1gskQ,11597
|
pip/utils/ui.py,sha256=pbDkSAeumZ6jdZcOJ2yAbx8iBgeP2zfpqNnLJK1gskQ,11597
|
||||||
pip/vcs/__init__.py,sha256=lnea41zMq9HqB1Qo7hxy2IjUzk5WtBvnoloCCMR6Vk4,12349
|
pip/vcs/__init__.py,sha256=WafFliUTHMmsSISV8PHp1M5EXDNSWyJr78zKaQmPLdY,12374
|
||||||
pip/vcs/bazaar.py,sha256=tYTwc4b4off8mr0O2o8SiGejqBDJxcbDBMSMd9-ISYc,3803
|
pip/vcs/bazaar.py,sha256=tYTwc4b4off8mr0O2o8SiGejqBDJxcbDBMSMd9-ISYc,3803
|
||||||
pip/vcs/git.py,sha256=u16VCiNW_a9AaYqLri2b8-f4lOZlOYwsGpHHV3uv_dQ,10218
|
pip/vcs/git.py,sha256=5LfWryi78A-2ULjEZJvCTarJ_3l8venwXASlwm8hiug,11197
|
||||||
pip/vcs/mercurial.py,sha256=xG6rDiwHCRytJEs23SIHBXl_SwQo2jkkdD_6rVVP5h4,3472
|
pip/vcs/mercurial.py,sha256=xG6rDiwHCRytJEs23SIHBXl_SwQo2jkkdD_6rVVP5h4,3472
|
||||||
pip/vcs/subversion.py,sha256=mGT7sAzuVc1u-9MPoXJNyShnRzhdJpDdGNuhhzUPv6w,8687
|
pip/vcs/subversion.py,sha256=GAuX2Sk7IZvJyEzENKcVld_wGBrQ3fpXDlXjapZEYdI,9350
|
||||||
pip-8.1.1.dist-info/DESCRIPTION.rst,sha256=jSvW1qOjwzndvm_p_DexGCVJfwgg3rWPMJWzf6Rmsfc,1167
|
pip-9.0.1.dist-info/DESCRIPTION.rst,sha256=Va8Wj1XBpTbVQ2Z41mZRJdALEeziiS_ZewWn1H2ecY4,1287
|
||||||
pip-8.1.1.dist-info/METADATA,sha256=p_9D2tGGDX-wd8S14XVVx0K-qOjDrrwu-CmYn9Dndlc,2362
|
pip-9.0.1.dist-info/METADATA,sha256=mvs_tLoKAbECXY_6QHiVWQsagSL-1UjolQTpScT8JSk,2529
|
||||||
pip-8.1.1.dist-info/RECORD,,
|
pip-9.0.1.dist-info/RECORD,,
|
||||||
pip-8.1.1.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110
|
pip-9.0.1.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110
|
||||||
pip-8.1.1.dist-info/entry_points.txt,sha256=GWc-Wb9WUKZ1EuVWNz-G0l3BeIpbNJLx0OJbZ61AAV0,68
|
pip-9.0.1.dist-info/entry_points.txt,sha256=GWc-Wb9WUKZ1EuVWNz-G0l3BeIpbNJLx0OJbZ61AAV0,68
|
||||||
pip-8.1.1.dist-info/metadata.json,sha256=wAnzudgBGV69N0kQOAgeAXIjQSbkBZhZEs98ULrfRUE,1513
|
pip-9.0.1.dist-info/metadata.json,sha256=aqvkETDy4mHUBob-2Fn5WWlXORi_M2OSfQ2HQCUU_Fk,1565
|
||||||
pip-8.1.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
pip-9.0.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||||
../../../bin/pip,sha256=MEQVvFZcu35ZQaa5ungLLm_kHRGvmD4u-AbMJaTm8vU,271
|
../../../bin/pip,sha256=kUtfTrIe4CRluRco6nKs-hUx0Eir2ABPF8Rr_1zK534,272
|
||||||
../../../bin/pip3,sha256=MEQVvFZcu35ZQaa5ungLLm_kHRGvmD4u-AbMJaTm8vU,271
|
../../../bin/pip3,sha256=kUtfTrIe4CRluRco6nKs-hUx0Eir2ABPF8Rr_1zK534,272
|
||||||
../../../bin/pip3.4,sha256=MEQVvFZcu35ZQaa5ungLLm_kHRGvmD4u-AbMJaTm8vU,271
|
../../../bin/pip3.4,sha256=kUtfTrIe4CRluRco6nKs-hUx0Eir2ABPF8Rr_1zK534,272
|
||||||
pip-8.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
pip-9.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||||
pip/utils/__pycache__/deprecation.cpython-34.pyc,,
|
|
||||||
pip/commands/__pycache__/completion.cpython-34.pyc,,
|
|
||||||
pip/vcs/__pycache__/mercurial.cpython-34.pyc,,
|
|
||||||
pip/req/__pycache__/req_file.cpython-34.pyc,,
|
|
||||||
pip/__pycache__/pep425tags.cpython-34.pyc,,
|
|
||||||
pip/vcs/__pycache__/bazaar.cpython-34.pyc,,
|
|
||||||
pip/utils/__pycache__/setuptools_build.cpython-34.pyc,,
|
|
||||||
pip/commands/__pycache__/list.cpython-34.pyc,,
|
|
||||||
pip/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
pip/models/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
pip/commands/__pycache__/wheel.cpython-34.pyc,,
|
|
||||||
pip/utils/__pycache__/ui.cpython-34.pyc,,
|
|
||||||
pip/commands/__pycache__/help.cpython-34.pyc,,
|
|
||||||
pip/compat/__pycache__/ordereddict.cpython-34.pyc,,
|
|
||||||
pip/compat/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
pip/utils/__pycache__/logging.cpython-34.pyc,,
|
|
||||||
pip/commands/__pycache__/show.cpython-34.pyc,,
|
|
||||||
pip/req/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
pip/utils/__pycache__/filesystem.cpython-34.pyc,,
|
|
||||||
pip/vcs/__pycache__/git.cpython-34.pyc,,
|
|
||||||
pip/req/__pycache__/req_set.cpython-34.pyc,,
|
|
||||||
pip/utils/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
pip/operations/__pycache__/freeze.cpython-34.pyc,,
|
|
||||||
pip/compat/__pycache__/dictconfig.cpython-34.pyc,,
|
|
||||||
pip/commands/__pycache__/hash.cpython-34.pyc,,
|
|
||||||
pip/req/__pycache__/req_uninstall.cpython-34.pyc,,
|
|
||||||
pip/operations/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
pip/commands/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
pip/req/__pycache__/req_install.cpython-34.pyc,,
|
|
||||||
pip/utils/__pycache__/build.cpython-34.pyc,,
|
|
||||||
pip/utils/__pycache__/encoding.cpython-34.pyc,,
|
|
||||||
pip/__pycache__/basecommand.cpython-34.pyc,,
|
|
||||||
pip/__pycache__/download.cpython-34.pyc,,
|
|
||||||
pip/__pycache__/cmdoptions.cpython-34.pyc,,
|
|
||||||
pip/utils/__pycache__/outdated.cpython-34.pyc,,
|
|
||||||
pip/commands/__pycache__/download.cpython-34.pyc,,
|
|
||||||
pip/utils/__pycache__/appdirs.cpython-34.pyc,,
|
|
||||||
pip/__pycache__/exceptions.cpython-34.pyc,,
|
pip/__pycache__/exceptions.cpython-34.pyc,,
|
||||||
pip/__pycache__/__main__.cpython-34.pyc,,
|
pip/utils/__pycache__/ui.cpython-34.pyc,,
|
||||||
|
pip/__pycache__/basecommand.cpython-34.pyc,,
|
||||||
|
pip/commands/__pycache__/check.cpython-34.pyc,,
|
||||||
|
pip/utils/__pycache__/packaging.cpython-34.pyc,,
|
||||||
|
pip/utils/__pycache__/build.cpython-34.pyc,,
|
||||||
pip/vcs/__pycache__/__init__.cpython-34.pyc,,
|
pip/vcs/__pycache__/__init__.cpython-34.pyc,,
|
||||||
pip/vcs/__pycache__/subversion.cpython-34.pyc,,
|
pip/__pycache__/download.cpython-34.pyc,,
|
||||||
pip/utils/__pycache__/hashes.cpython-34.pyc,,
|
pip/utils/__pycache__/setuptools_build.cpython-34.pyc,,
|
||||||
pip/commands/__pycache__/uninstall.cpython-34.pyc,,
|
pip/req/__pycache__/req_uninstall.cpython-34.pyc,,
|
||||||
pip/__pycache__/baseparser.cpython-34.pyc,,
|
pip/utils/__pycache__/deprecation.cpython-34.pyc,,
|
||||||
pip/commands/__pycache__/freeze.cpython-34.pyc,,
|
pip/operations/__pycache__/check.cpython-34.pyc,,
|
||||||
pip/_vendor/__pycache__/__init__.cpython-34.pyc,,
|
pip/_vendor/__pycache__/__init__.cpython-34.pyc,,
|
||||||
pip/commands/__pycache__/search.cpython-34.pyc,,
|
pip/utils/__pycache__/outdated.cpython-34.pyc,,
|
||||||
pip/__pycache__/locations.cpython-34.pyc,,
|
|
||||||
pip/commands/__pycache__/install.cpython-34.pyc,,
|
pip/commands/__pycache__/install.cpython-34.pyc,,
|
||||||
pip/models/__pycache__/index.cpython-34.pyc,,
|
pip/operations/__pycache__/__init__.cpython-34.pyc,,
|
||||||
pip/__pycache__/index.cpython-34.pyc,,
|
pip/commands/__pycache__/freeze.cpython-34.pyc,,
|
||||||
pip/__pycache__/wheel.cpython-34.pyc,,
|
pip/req/__pycache__/req_set.cpython-34.pyc,,
|
||||||
|
pip/operations/__pycache__/freeze.cpython-34.pyc,,
|
||||||
|
pip/__pycache__/baseparser.cpython-34.pyc,,
|
||||||
|
pip/commands/__pycache__/hash.cpython-34.pyc,,
|
||||||
|
pip/commands/__pycache__/download.cpython-34.pyc,,
|
||||||
|
pip/commands/__pycache__/wheel.cpython-34.pyc,,
|
||||||
|
pip/commands/__pycache__/help.cpython-34.pyc,,
|
||||||
|
pip/utils/__pycache__/glibc.cpython-34.pyc,,
|
||||||
|
pip/__pycache__/locations.cpython-34.pyc,,
|
||||||
|
pip/commands/__pycache__/list.cpython-34.pyc,,
|
||||||
|
pip/compat/__pycache__/dictconfig.cpython-34.pyc,,
|
||||||
|
pip/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
pip/utils/__pycache__/hashes.cpython-34.pyc,,
|
||||||
|
pip/compat/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
pip/vcs/__pycache__/git.cpython-34.pyc,,
|
||||||
|
pip/req/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
pip/__pycache__/__main__.cpython-34.pyc,,
|
||||||
pip/__pycache__/status_codes.cpython-34.pyc,,
|
pip/__pycache__/status_codes.cpython-34.pyc,,
|
||||||
|
pip/models/__pycache__/index.cpython-34.pyc,,
|
||||||
|
pip/__pycache__/pep425tags.cpython-34.pyc,,
|
||||||
|
pip/commands/__pycache__/uninstall.cpython-34.pyc,,
|
||||||
|
pip/vcs/__pycache__/bazaar.cpython-34.pyc,,
|
||||||
|
pip/req/__pycache__/req_install.cpython-34.pyc,,
|
||||||
|
pip/vcs/__pycache__/mercurial.cpython-34.pyc,,
|
||||||
|
pip/commands/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
pip/commands/__pycache__/show.cpython-34.pyc,,
|
||||||
|
pip/__pycache__/index.cpython-34.pyc,,
|
||||||
|
pip/commands/__pycache__/completion.cpython-34.pyc,,
|
||||||
|
pip/req/__pycache__/req_file.cpython-34.pyc,,
|
||||||
|
pip/__pycache__/cmdoptions.cpython-34.pyc,,
|
||||||
|
pip/utils/__pycache__/filesystem.cpython-34.pyc,,
|
||||||
|
pip/__pycache__/wheel.cpython-34.pyc,,
|
||||||
|
pip/utils/__pycache__/appdirs.cpython-34.pyc,,
|
||||||
|
pip/utils/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
pip/vcs/__pycache__/subversion.cpython-34.pyc,,
|
||||||
|
pip/utils/__pycache__/logging.cpython-34.pyc,,
|
||||||
|
pip/commands/__pycache__/search.cpython-34.pyc,,
|
||||||
|
pip/utils/__pycache__/encoding.cpython-34.pyc,,
|
||||||
|
pip/models/__pycache__/__init__.cpython-34.pyc,,
|
|
@ -1 +1 @@
|
||||||
{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Topic :: Software Development :: Build Tools", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: Implementation :: PyPy"], "extensions": {"python.commands": {"wrap_console": {"pip": "pip:main", "pip3": "pip:main", "pip3.5": "pip:main"}}, "python.details": {"contacts": [{"email": "python-virtualenv@groups.google.com", "name": "The pip developers", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://pip.pypa.io/"}}, "python.exports": {"console_scripts": {"pip": "pip:main", "pip3": "pip:main", "pip3.5": "pip:main"}}}, "extras": ["testing"], "generator": "bdist_wheel (0.29.0)", "keywords": ["easy_install", "distutils", "setuptools", "egg", "virtualenv"], "license": "MIT", "metadata_version": "2.0", "name": "pip", "run_requires": [{"extra": "testing", "requires": ["mock", "pretend", "pytest", "scripttest (>=1.3)", "virtualenv (>=1.10)"]}], "summary": "The PyPA recommended tool for installing Python packages.", "test_requires": [{"requires": ["mock", "pretend", "pytest", "scripttest (>=1.3)", "virtualenv (>=1.10)"]}], "version": "8.1.1"}
|
{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Topic :: Software Development :: Build Tools", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: Implementation :: PyPy"], "extensions": {"python.commands": {"wrap_console": {"pip": "pip:main", "pip3": "pip:main", "pip3.5": "pip:main"}}, "python.details": {"contacts": [{"email": "python-virtualenv@groups.google.com", "name": "The pip developers", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://pip.pypa.io/"}}, "python.exports": {"console_scripts": {"pip": "pip:main", "pip3": "pip:main", "pip3.5": "pip:main"}}}, "extras": ["testing"], "generator": "bdist_wheel (0.29.0)", "keywords": ["easy_install", "distutils", "setuptools", "egg", "virtualenv"], "license": "MIT", "metadata_version": "2.0", "name": "pip", "requires_python": ">=2.6,!=3.0.*,!=3.1.*,!=3.2.*", "run_requires": [{"extra": "testing", "requires": ["mock", "pretend", "pytest", "scripttest (>=1.3)", "virtualenv (>=1.10)"]}], "summary": "The PyPA recommended tool for installing Python packages.", "test_requires": [{"requires": ["mock", "pretend", "pytest", "scripttest (>=1.3)", "virtualenv (>=1.10)"]}], "version": "9.0.1"}
|
|
@ -10,6 +10,18 @@ import warnings
|
||||||
import sys
|
import sys
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
# 2016-06-17 barry@debian.org: urllib3 1.14 added optional support for socks,
|
||||||
|
# but if invoked (i.e. imported), it will issue a warning to stderr if socks
|
||||||
|
# isn't available. requests unconditionally imports urllib3's socks contrib
|
||||||
|
# module, triggering this warning. The warning breaks DEP-8 tests (because of
|
||||||
|
# the stderr output) and is just plain annoying in normal usage. I don't want
|
||||||
|
# to add socks as yet another dependency for pip, nor do I want to allow-stder
|
||||||
|
# in the DEP-8 tests, so just suppress the warning. pdb tells me this has to
|
||||||
|
# be done before the import of pip.vcs.
|
||||||
|
from pip._vendor.requests.packages.urllib3.exceptions import DependencyWarning
|
||||||
|
warnings.filterwarnings("ignore", category=DependencyWarning) # noqa
|
||||||
|
|
||||||
|
|
||||||
from pip.exceptions import InstallationError, CommandError, PipError
|
from pip.exceptions import InstallationError, CommandError, PipError
|
||||||
from pip.utils import get_installed_distributions, get_prog
|
from pip.utils import get_installed_distributions, get_prog
|
||||||
from pip.utils import deprecation, dist_is_editable
|
from pip.utils import deprecation, dist_is_editable
|
||||||
|
@ -31,12 +43,12 @@ import pip.cmdoptions
|
||||||
cmdoptions = pip.cmdoptions
|
cmdoptions = pip.cmdoptions
|
||||||
|
|
||||||
# The version as used in the setup.py and the docs conf.py
|
# The version as used in the setup.py and the docs conf.py
|
||||||
__version__ = "8.1.1"
|
__version__ = "9.0.1"
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
# Hide the InsecureRequestWArning from urllib3
|
# Hide the InsecureRequestWarning from urllib3
|
||||||
warnings.filterwarnings("ignore", category=InsecureRequestWarning)
|
warnings.filterwarnings("ignore", category=InsecureRequestWarning)
|
||||||
|
|
||||||
|
|
||||||
|
@ -44,7 +56,7 @@ def autocomplete():
|
||||||
"""Command and option completion for the main option parser (and options)
|
"""Command and option completion for the main option parser (and options)
|
||||||
and its subcommands (and options).
|
and its subcommands (and options).
|
||||||
|
|
||||||
Enable by sourcing one of the completion shell scripts (bash or zsh).
|
Enable by sourcing one of the completion shell scripts (bash, zsh or fish).
|
||||||
"""
|
"""
|
||||||
# Don't complete if user hasn't sourced bash_completion file.
|
# Don't complete if user hasn't sourced bash_completion file.
|
||||||
if 'PIP_AUTO_COMPLETE' not in os.environ:
|
if 'PIP_AUTO_COMPLETE' not in os.environ:
|
||||||
|
@ -212,7 +224,11 @@ def main(args=None):
|
||||||
|
|
||||||
# Needed for locale.getpreferredencoding(False) to work
|
# Needed for locale.getpreferredencoding(False) to work
|
||||||
# in pip.utils.encoding.auto_decode
|
# in pip.utils.encoding.auto_decode
|
||||||
|
try:
|
||||||
locale.setlocale(locale.LC_ALL, '')
|
locale.setlocale(locale.LC_ALL, '')
|
||||||
|
except locale.Error as e:
|
||||||
|
# setlocale can apparently crash if locale are uninitialized
|
||||||
|
logger.debug("Ignoring error %s when setting locale", e)
|
||||||
command = commands_dict[cmd_name](isolated=check_isolated(cmd_args))
|
command = commands_dict[cmd_name](isolated=check_isolated(cmd_args))
|
||||||
return command.main(cmd_args)
|
return command.main(cmd_args)
|
||||||
|
|
||||||
|
|
|
@ -64,6 +64,7 @@ if DEBUNDLED:
|
||||||
vendored("cachecontrol")
|
vendored("cachecontrol")
|
||||||
vendored("colorama")
|
vendored("colorama")
|
||||||
vendored("distlib")
|
vendored("distlib")
|
||||||
|
vendored("distro")
|
||||||
vendored("html5lib")
|
vendored("html5lib")
|
||||||
vendored("lockfile")
|
vendored("lockfile")
|
||||||
vendored("six")
|
vendored("six")
|
||||||
|
|
|
@ -117,6 +117,12 @@ class Command(object):
|
||||||
else:
|
else:
|
||||||
level = "INFO"
|
level = "INFO"
|
||||||
|
|
||||||
|
# The root logger should match the "console" level *unless* we
|
||||||
|
# specified "--log" to send debug logs to a file.
|
||||||
|
root_level = level
|
||||||
|
if options.log:
|
||||||
|
root_level = "DEBUG"
|
||||||
|
|
||||||
logging_dictConfig({
|
logging_dictConfig({
|
||||||
"version": 1,
|
"version": 1,
|
||||||
"disable_existing_loggers": False,
|
"disable_existing_loggers": False,
|
||||||
|
@ -155,7 +161,7 @@ class Command(object):
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"root": {
|
"root": {
|
||||||
"level": level,
|
"level": root_level,
|
||||||
"handlers": list(filter(None, [
|
"handlers": list(filter(None, [
|
||||||
"console",
|
"console",
|
||||||
"console_errors",
|
"console_errors",
|
||||||
|
@ -305,13 +311,15 @@ class RequirementCommand(Command):
|
||||||
'to %(name)s (see "pip help %(name)s")' % opts)
|
'to %(name)s (see "pip help %(name)s")' % opts)
|
||||||
logger.warning(msg)
|
logger.warning(msg)
|
||||||
|
|
||||||
def _build_package_finder(self, options, session):
|
def _build_package_finder(self, options, session,
|
||||||
|
platform=None, python_versions=None,
|
||||||
|
abi=None, implementation=None):
|
||||||
"""
|
"""
|
||||||
Create a package finder appropriate to this requirement command.
|
Create a package finder appropriate to this requirement command.
|
||||||
"""
|
"""
|
||||||
index_urls = [options.index_url] + options.extra_index_urls
|
index_urls = [options.index_url] + options.extra_index_urls
|
||||||
if options.no_index:
|
if options.no_index:
|
||||||
logger.info('Ignoring indexes: %s', ','.join(index_urls))
|
logger.debug('Ignoring indexes: %s', ','.join(index_urls))
|
||||||
index_urls = []
|
index_urls = []
|
||||||
|
|
||||||
return PackageFinder(
|
return PackageFinder(
|
||||||
|
@ -322,4 +330,8 @@ class RequirementCommand(Command):
|
||||||
allow_all_prereleases=options.pre,
|
allow_all_prereleases=options.pre,
|
||||||
process_dependency_links=options.process_dependency_links,
|
process_dependency_links=options.process_dependency_links,
|
||||||
session=session,
|
session=session,
|
||||||
|
platform=platform,
|
||||||
|
versions=python_versions,
|
||||||
|
abi=abi,
|
||||||
|
implementation=implementation,
|
||||||
)
|
)
|
||||||
|
|
|
@ -113,6 +113,7 @@ class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter):
|
||||||
|
|
||||||
|
|
||||||
class CustomOptionParser(optparse.OptionParser):
|
class CustomOptionParser(optparse.OptionParser):
|
||||||
|
|
||||||
def insert_option_group(self, idx, *args, **kwargs):
|
def insert_option_group(self, idx, *args, **kwargs):
|
||||||
"""Insert an OptionGroup at a given position."""
|
"""Insert an OptionGroup at a given position."""
|
||||||
group = self.add_option_group(*args, **kwargs)
|
group = self.add_option_group(*args, **kwargs)
|
||||||
|
@ -273,7 +274,7 @@ class ConfigOptionParser(CustomOptionParser):
|
||||||
yield (_environ_prefix_re.sub("", key).lower(), val)
|
yield (_environ_prefix_re.sub("", key).lower(), val)
|
||||||
|
|
||||||
def get_default_values(self):
|
def get_default_values(self):
|
||||||
"""Overridding to make updating the defaults after instantiation of
|
"""Overriding to make updating the defaults after instantiation of
|
||||||
the option parser possible, _update_defaults() does the dirty work."""
|
the option parser possible, _update_defaults() does the dirty work."""
|
||||||
if not self.process_default_values:
|
if not self.process_default_values:
|
||||||
# Old, pre-Optik 1.5 behaviour.
|
# Old, pre-Optik 1.5 behaviour.
|
||||||
|
|
|
@ -114,7 +114,10 @@ quiet = partial(
|
||||||
dest='quiet',
|
dest='quiet',
|
||||||
action='count',
|
action='count',
|
||||||
default=0,
|
default=0,
|
||||||
help='Give less output.')
|
help=('Give less output. Option is additive, and can be used up to 3'
|
||||||
|
' times (corresponding to WARNING, ERROR, and CRITICAL logging'
|
||||||
|
' levels).')
|
||||||
|
)
|
||||||
|
|
||||||
log = partial(
|
log = partial(
|
||||||
Option,
|
Option,
|
||||||
|
@ -184,12 +187,12 @@ def exists_action():
|
||||||
'--exists-action',
|
'--exists-action',
|
||||||
dest='exists_action',
|
dest='exists_action',
|
||||||
type='choice',
|
type='choice',
|
||||||
choices=['s', 'i', 'w', 'b'],
|
choices=['s', 'i', 'w', 'b', 'a'],
|
||||||
default=[],
|
default=[],
|
||||||
action='append',
|
action='append',
|
||||||
metavar='action',
|
metavar='action',
|
||||||
help="Default action when a path already exists: "
|
help="Default action when a path already exists: "
|
||||||
"(s)witch, (i)gnore, (w)ipe, (b)ackup.")
|
"(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.")
|
||||||
|
|
||||||
|
|
||||||
cert = partial(
|
cert = partial(
|
||||||
|
@ -216,7 +219,10 @@ index_url = partial(
|
||||||
dest='index_url',
|
dest='index_url',
|
||||||
metavar='URL',
|
metavar='URL',
|
||||||
default=PyPI.simple_url,
|
default=PyPI.simple_url,
|
||||||
help='Base URL of Python Package Index (default %default).')
|
help="Base URL of Python Package Index (default %default). "
|
||||||
|
"This should point to a repository compliant with PEP 503 "
|
||||||
|
"(the simple repository API) or a local directory laid out "
|
||||||
|
"in the same format.")
|
||||||
|
|
||||||
|
|
||||||
def extra_index_url():
|
def extra_index_url():
|
||||||
|
@ -226,7 +232,9 @@ def extra_index_url():
|
||||||
metavar='URL',
|
metavar='URL',
|
||||||
action='append',
|
action='append',
|
||||||
default=[],
|
default=[],
|
||||||
help='Extra URLs of package indexes to use in addition to --index-url.'
|
help="Extra URLs of package indexes to use in addition to "
|
||||||
|
"--index-url. Should follow the same rules as "
|
||||||
|
"--index-url."
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -469,6 +477,13 @@ build_dir = partial(
|
||||||
help='Directory to unpack packages into and build in.'
|
help='Directory to unpack packages into and build in.'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
ignore_requires_python = partial(
|
||||||
|
Option,
|
||||||
|
'--ignore-requires-python',
|
||||||
|
dest='ignore_requires_python',
|
||||||
|
action='store_true',
|
||||||
|
help='Ignore the Requires-Python information.')
|
||||||
|
|
||||||
install_options = partial(
|
install_options = partial(
|
||||||
Option,
|
Option,
|
||||||
'--install-option',
|
'--install-option',
|
||||||
|
@ -510,7 +525,7 @@ disable_pip_version_check = partial(
|
||||||
"--disable-pip-version-check",
|
"--disable-pip-version-check",
|
||||||
dest="disable_pip_version_check",
|
dest="disable_pip_version_check",
|
||||||
action="store_true",
|
action="store_true",
|
||||||
default=False,
|
default=True,
|
||||||
help="Don't periodically check PyPI to determine whether a new version "
|
help="Don't periodically check PyPI to determine whether a new version "
|
||||||
"of pip is available for download. Implied with --no-index.")
|
"of pip is available for download. Implied with --no-index.")
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@ from pip.commands.freeze import FreezeCommand
|
||||||
from pip.commands.hash import HashCommand
|
from pip.commands.hash import HashCommand
|
||||||
from pip.commands.help import HelpCommand
|
from pip.commands.help import HelpCommand
|
||||||
from pip.commands.list import ListCommand
|
from pip.commands.list import ListCommand
|
||||||
|
from pip.commands.check import CheckCommand
|
||||||
from pip.commands.search import SearchCommand
|
from pip.commands.search import SearchCommand
|
||||||
from pip.commands.show import ShowCommand
|
from pip.commands.show import ShowCommand
|
||||||
from pip.commands.install import InstallCommand
|
from pip.commands.install import InstallCommand
|
||||||
|
@ -27,6 +28,7 @@ commands_dict = {
|
||||||
UninstallCommand.name: UninstallCommand,
|
UninstallCommand.name: UninstallCommand,
|
||||||
DownloadCommand.name: DownloadCommand,
|
DownloadCommand.name: DownloadCommand,
|
||||||
ListCommand.name: ListCommand,
|
ListCommand.name: ListCommand,
|
||||||
|
CheckCommand.name: CheckCommand,
|
||||||
WheelCommand.name: WheelCommand,
|
WheelCommand.name: WheelCommand,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,6 +40,7 @@ commands_order = [
|
||||||
FreezeCommand,
|
FreezeCommand,
|
||||||
ListCommand,
|
ListCommand,
|
||||||
ShowCommand,
|
ShowCommand,
|
||||||
|
CheckCommand,
|
||||||
SearchCommand,
|
SearchCommand,
|
||||||
WheelCommand,
|
WheelCommand,
|
||||||
HashCommand,
|
HashCommand,
|
||||||
|
|
39
lib/python3.4/site-packages/pip/commands/check.py
Normal file
39
lib/python3.4/site-packages/pip/commands/check.py
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from pip.basecommand import Command
|
||||||
|
from pip.operations.check import check_requirements
|
||||||
|
from pip.utils import get_installed_distributions
|
||||||
|
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class CheckCommand(Command):
|
||||||
|
"""Verify installed packages have compatible dependencies."""
|
||||||
|
name = 'check'
|
||||||
|
usage = """
|
||||||
|
%prog [options]"""
|
||||||
|
summary = 'Verify installed packages have compatible dependencies.'
|
||||||
|
|
||||||
|
def run(self, options, args):
|
||||||
|
dists = get_installed_distributions(local_only=False, skip=())
|
||||||
|
missing_reqs_dict, incompatible_reqs_dict = check_requirements(dists)
|
||||||
|
|
||||||
|
for dist in dists:
|
||||||
|
key = '%s==%s' % (dist.project_name, dist.version)
|
||||||
|
|
||||||
|
for requirement in missing_reqs_dict.get(key, []):
|
||||||
|
logger.info(
|
||||||
|
"%s %s requires %s, which is not installed.",
|
||||||
|
dist.project_name, dist.version, requirement.project_name)
|
||||||
|
|
||||||
|
for requirement, actual in incompatible_reqs_dict.get(key, []):
|
||||||
|
logger.info(
|
||||||
|
"%s %s has requirement %s, but you have %s %s.",
|
||||||
|
dist.project_name, dist.version, requirement,
|
||||||
|
actual.project_name, actual.version)
|
||||||
|
|
||||||
|
if missing_reqs_dict or incompatible_reqs_dict:
|
||||||
|
return 1
|
||||||
|
else:
|
||||||
|
logger.info("No broken requirements found.")
|
|
@ -26,13 +26,21 @@ function _pip_completion {
|
||||||
PIP_AUTO_COMPLETE=1 $words[1] ) )
|
PIP_AUTO_COMPLETE=1 $words[1] ) )
|
||||||
}
|
}
|
||||||
compctl -K _pip_completion pip
|
compctl -K _pip_completion pip
|
||||||
|
""", 'fish': """
|
||||||
|
function __fish_complete_pip
|
||||||
|
set -lx COMP_WORDS (commandline -o) ""
|
||||||
|
set -lx COMP_CWORD (math (contains -i -- (commandline -t) $COMP_WORDS)-1)
|
||||||
|
set -lx PIP_AUTO_COMPLETE 1
|
||||||
|
string split \ -- (eval $COMP_WORDS[1])
|
||||||
|
end
|
||||||
|
complete -fa "(__fish_complete_pip)" -c pip
|
||||||
"""}
|
"""}
|
||||||
|
|
||||||
|
|
||||||
class CompletionCommand(Command):
|
class CompletionCommand(Command):
|
||||||
"""A helper command to be used for command completion."""
|
"""A helper command to be used for command completion."""
|
||||||
name = 'completion'
|
name = 'completion'
|
||||||
summary = 'A helper command used for command completion'
|
summary = 'A helper command used for command completion.'
|
||||||
|
|
||||||
def __init__(self, *args, **kw):
|
def __init__(self, *args, **kw):
|
||||||
super(CompletionCommand, self).__init__(*args, **kw)
|
super(CompletionCommand, self).__init__(*args, **kw)
|
||||||
|
@ -51,6 +59,12 @@ class CompletionCommand(Command):
|
||||||
const='zsh',
|
const='zsh',
|
||||||
dest='shell',
|
dest='shell',
|
||||||
help='Emit completion code for zsh')
|
help='Emit completion code for zsh')
|
||||||
|
cmd_opts.add_option(
|
||||||
|
'--fish', '-f',
|
||||||
|
action='store_const',
|
||||||
|
const='fish',
|
||||||
|
dest='shell',
|
||||||
|
help='Emit completion code for fish')
|
||||||
|
|
||||||
self.parser.insert_option_group(0, cmd_opts)
|
self.parser.insert_option_group(0, cmd_opts)
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,8 @@ from __future__ import absolute_import
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
from pip.exceptions import CommandError
|
||||||
|
from pip.index import FormatControl
|
||||||
from pip.req import RequirementSet
|
from pip.req import RequirementSet
|
||||||
from pip.basecommand import RequirementCommand
|
from pip.basecommand import RequirementCommand
|
||||||
from pip import cmdoptions
|
from pip import cmdoptions
|
||||||
|
@ -63,6 +65,53 @@ class DownloadCommand(RequirementCommand):
|
||||||
help=("Download packages into <dir>."),
|
help=("Download packages into <dir>."),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
cmd_opts.add_option(
|
||||||
|
'--platform',
|
||||||
|
dest='platform',
|
||||||
|
metavar='platform',
|
||||||
|
default=None,
|
||||||
|
help=("Only download wheels compatible with <platform>. "
|
||||||
|
"Defaults to the platform of the running system."),
|
||||||
|
)
|
||||||
|
|
||||||
|
cmd_opts.add_option(
|
||||||
|
'--python-version',
|
||||||
|
dest='python_version',
|
||||||
|
metavar='python_version',
|
||||||
|
default=None,
|
||||||
|
help=("Only download wheels compatible with Python "
|
||||||
|
"interpreter version <version>. If not specified, then the "
|
||||||
|
"current system interpreter minor version is used. A major "
|
||||||
|
"version (e.g. '2') can be specified to match all "
|
||||||
|
"minor revs of that major version. A minor version "
|
||||||
|
"(e.g. '34') can also be specified."),
|
||||||
|
)
|
||||||
|
|
||||||
|
cmd_opts.add_option(
|
||||||
|
'--implementation',
|
||||||
|
dest='implementation',
|
||||||
|
metavar='implementation',
|
||||||
|
default=None,
|
||||||
|
help=("Only download wheels compatible with Python "
|
||||||
|
"implementation <implementation>, e.g. 'pp', 'jy', 'cp', "
|
||||||
|
" or 'ip'. If not specified, then the current "
|
||||||
|
"interpreter implementation is used. Use 'py' to force "
|
||||||
|
"implementation-agnostic wheels."),
|
||||||
|
)
|
||||||
|
|
||||||
|
cmd_opts.add_option(
|
||||||
|
'--abi',
|
||||||
|
dest='abi',
|
||||||
|
metavar='abi',
|
||||||
|
default=None,
|
||||||
|
help=("Only download wheels compatible with Python "
|
||||||
|
"abi <abi>, e.g. 'pypy_41'. If not specified, then the "
|
||||||
|
"current interpreter abi tag is used. Generally "
|
||||||
|
"you will need to specify --implementation, "
|
||||||
|
"--platform, and --python-version when using "
|
||||||
|
"this option."),
|
||||||
|
)
|
||||||
|
|
||||||
index_opts = cmdoptions.make_option_group(
|
index_opts = cmdoptions.make_option_group(
|
||||||
cmdoptions.non_deprecated_index_group,
|
cmdoptions.non_deprecated_index_group,
|
||||||
self.parser,
|
self.parser,
|
||||||
|
@ -73,14 +122,41 @@ class DownloadCommand(RequirementCommand):
|
||||||
|
|
||||||
def run(self, options, args):
|
def run(self, options, args):
|
||||||
options.ignore_installed = True
|
options.ignore_installed = True
|
||||||
|
|
||||||
|
if options.python_version:
|
||||||
|
python_versions = [options.python_version]
|
||||||
|
else:
|
||||||
|
python_versions = None
|
||||||
|
|
||||||
|
dist_restriction_set = any([
|
||||||
|
options.python_version,
|
||||||
|
options.platform,
|
||||||
|
options.abi,
|
||||||
|
options.implementation,
|
||||||
|
])
|
||||||
|
binary_only = FormatControl(set(), set([':all:']))
|
||||||
|
if dist_restriction_set and options.format_control != binary_only:
|
||||||
|
raise CommandError(
|
||||||
|
"--only-binary=:all: must be set and --no-binary must not "
|
||||||
|
"be set (or must be set to :none:) when restricting platform "
|
||||||
|
"and interpreter constraints using --python-version, "
|
||||||
|
"--platform, --abi, or --implementation."
|
||||||
|
)
|
||||||
|
|
||||||
options.src_dir = os.path.abspath(options.src_dir)
|
options.src_dir = os.path.abspath(options.src_dir)
|
||||||
options.download_dir = normalize_path(options.download_dir)
|
options.download_dir = normalize_path(options.download_dir)
|
||||||
|
|
||||||
ensure_dir(options.download_dir)
|
ensure_dir(options.download_dir)
|
||||||
|
|
||||||
with self._build_session(options) as session:
|
with self._build_session(options) as session:
|
||||||
|
finder = self._build_package_finder(
|
||||||
finder = self._build_package_finder(options, session)
|
options=options,
|
||||||
|
session=session,
|
||||||
|
platform=options.platform,
|
||||||
|
python_versions=python_versions,
|
||||||
|
abi=options.abi,
|
||||||
|
implementation=options.implementation,
|
||||||
|
)
|
||||||
build_delete = (not (options.no_clean or options.build_dir))
|
build_delete = (not (options.no_clean or options.build_dir))
|
||||||
if options.cache_dir and not check_path_owner(options.cache_dir):
|
if options.cache_dir and not check_path_owner(options.cache_dir):
|
||||||
logger.warning(
|
logger.warning(
|
||||||
|
|
|
@ -29,12 +29,13 @@ class FreezeCommand(Command):
|
||||||
|
|
||||||
self.cmd_opts.add_option(
|
self.cmd_opts.add_option(
|
||||||
'-r', '--requirement',
|
'-r', '--requirement',
|
||||||
dest='requirement',
|
dest='requirements',
|
||||||
action='store',
|
action='append',
|
||||||
default=None,
|
default=[],
|
||||||
metavar='file',
|
metavar='file',
|
||||||
help="Use the order in the given requirements file and its "
|
help="Use the order in the given requirements file and its "
|
||||||
"comments when generating output.")
|
"comments when generating output. This option can be "
|
||||||
|
"used multiple times.")
|
||||||
self.cmd_opts.add_option(
|
self.cmd_opts.add_option(
|
||||||
'-f', '--find-links',
|
'-f', '--find-links',
|
||||||
dest='find_links',
|
dest='find_links',
|
||||||
|
@ -73,7 +74,7 @@ class FreezeCommand(Command):
|
||||||
skip.update(DEV_PKGS)
|
skip.update(DEV_PKGS)
|
||||||
|
|
||||||
freeze_kwargs = dict(
|
freeze_kwargs = dict(
|
||||||
requirement=options.requirement,
|
requirement=options.requirements,
|
||||||
find_links=options.find_links,
|
find_links=options.find_links,
|
||||||
local_only=options.local,
|
local_only=options.local,
|
||||||
user_only=options.user,
|
user_only=options.user,
|
||||||
|
|
|
@ -18,7 +18,7 @@ from pip.exceptions import (
|
||||||
InstallationError, CommandError, PreviousBuildDirError,
|
InstallationError, CommandError, PreviousBuildDirError,
|
||||||
)
|
)
|
||||||
from pip import cmdoptions
|
from pip import cmdoptions
|
||||||
from pip.utils import ensure_dir
|
from pip.utils import ensure_dir, get_installed_version
|
||||||
from pip.utils.build import BuildDirectory
|
from pip.utils.build import BuildDirectory
|
||||||
from pip.utils.deprecation import RemovedInPip10Warning
|
from pip.utils.deprecation import RemovedInPip10Warning
|
||||||
from pip.utils.filesystem import check_path_owner
|
from pip.utils.filesystem import check_path_owner
|
||||||
|
@ -95,8 +95,21 @@ class InstallCommand(RequirementCommand):
|
||||||
dest='upgrade',
|
dest='upgrade',
|
||||||
action='store_true',
|
action='store_true',
|
||||||
help='Upgrade all specified packages to the newest available '
|
help='Upgrade all specified packages to the newest available '
|
||||||
'version. This process is recursive regardless of whether '
|
'version. The handling of dependencies depends on the '
|
||||||
'a dependency is already satisfied.'
|
'upgrade-strategy used.'
|
||||||
|
)
|
||||||
|
|
||||||
|
cmd_opts.add_option(
|
||||||
|
'--upgrade-strategy',
|
||||||
|
dest='upgrade_strategy',
|
||||||
|
default='eager',
|
||||||
|
choices=['only-if-needed', 'eager'],
|
||||||
|
help='Determines how dependency upgrading should be handled. '
|
||||||
|
'"eager" - dependencies are upgraded regardless of '
|
||||||
|
'whether the currently installed version satisfies the '
|
||||||
|
'requirements of the upgraded package(s). '
|
||||||
|
'"only-if-needed" - are upgraded only when they do not '
|
||||||
|
'satisfy the requirements of the upgraded package(s).'
|
||||||
)
|
)
|
||||||
|
|
||||||
cmd_opts.add_option(
|
cmd_opts.add_option(
|
||||||
|
@ -113,6 +126,7 @@ class InstallCommand(RequirementCommand):
|
||||||
default=default_user,
|
default=default_user,
|
||||||
help='Ignore the installed packages (reinstalling instead).')
|
help='Ignore the installed packages (reinstalling instead).')
|
||||||
|
|
||||||
|
cmd_opts.add_option(cmdoptions.ignore_requires_python())
|
||||||
cmd_opts.add_option(cmdoptions.no_deps())
|
cmd_opts.add_option(cmdoptions.no_deps())
|
||||||
|
|
||||||
cmd_opts.add_option(cmdoptions.install_options())
|
cmd_opts.add_option(cmdoptions.install_options())
|
||||||
|
@ -197,6 +211,15 @@ class InstallCommand(RequirementCommand):
|
||||||
cmdoptions.resolve_wheel_no_use_binary(options)
|
cmdoptions.resolve_wheel_no_use_binary(options)
|
||||||
cmdoptions.check_install_build_global(options)
|
cmdoptions.check_install_build_global(options)
|
||||||
|
|
||||||
|
if options.as_egg:
|
||||||
|
warnings.warn(
|
||||||
|
"--egg has been deprecated and will be removed in the future. "
|
||||||
|
"This flag is mutually exclusive with large parts of pip, and "
|
||||||
|
"actually using it invalidates pip's ability to manage the "
|
||||||
|
"installation process.",
|
||||||
|
RemovedInPip10Warning,
|
||||||
|
)
|
||||||
|
|
||||||
if options.allow_external:
|
if options.allow_external:
|
||||||
warnings.warn(
|
warnings.warn(
|
||||||
"--allow-external has been deprecated and will be removed in "
|
"--allow-external has been deprecated and will be removed in "
|
||||||
|
@ -287,9 +310,11 @@ class InstallCommand(RequirementCommand):
|
||||||
src_dir=options.src_dir,
|
src_dir=options.src_dir,
|
||||||
download_dir=options.download_dir,
|
download_dir=options.download_dir,
|
||||||
upgrade=options.upgrade,
|
upgrade=options.upgrade,
|
||||||
|
upgrade_strategy=options.upgrade_strategy,
|
||||||
as_egg=options.as_egg,
|
as_egg=options.as_egg,
|
||||||
ignore_installed=options.ignore_installed,
|
ignore_installed=options.ignore_installed,
|
||||||
ignore_dependencies=options.ignore_dependencies,
|
ignore_dependencies=options.ignore_dependencies,
|
||||||
|
ignore_requires_python=options.ignore_requires_python,
|
||||||
force_reinstall=options.force_reinstall,
|
force_reinstall=options.force_reinstall,
|
||||||
use_user_site=options.use_user_site,
|
use_user_site=options.use_user_site,
|
||||||
target_dir=temp_target_dir,
|
target_dir=temp_target_dir,
|
||||||
|
@ -334,6 +359,14 @@ class InstallCommand(RequirementCommand):
|
||||||
root=options.root_path,
|
root=options.root_path,
|
||||||
prefix=options.prefix_path,
|
prefix=options.prefix_path,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
possible_lib_locations = get_lib_location_guesses(
|
||||||
|
user=options.use_user_site,
|
||||||
|
home=temp_target_dir,
|
||||||
|
root=options.root_path,
|
||||||
|
prefix=options.prefix_path,
|
||||||
|
isolated=options.isolated_mode,
|
||||||
|
)
|
||||||
reqs = sorted(
|
reqs = sorted(
|
||||||
requirement_set.successfully_installed,
|
requirement_set.successfully_installed,
|
||||||
key=operator.attrgetter('name'))
|
key=operator.attrgetter('name'))
|
||||||
|
@ -341,9 +374,11 @@ class InstallCommand(RequirementCommand):
|
||||||
for req in reqs:
|
for req in reqs:
|
||||||
item = req.name
|
item = req.name
|
||||||
try:
|
try:
|
||||||
if hasattr(req, 'installed_version'):
|
installed_version = get_installed_version(
|
||||||
if req.installed_version:
|
req.name, possible_lib_locations
|
||||||
item += '-' + req.installed_version
|
)
|
||||||
|
if installed_version:
|
||||||
|
item += '-' + installed_version
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
items.append(item)
|
items.append(item)
|
||||||
|
@ -370,8 +405,19 @@ class InstallCommand(RequirementCommand):
|
||||||
if options.target_dir:
|
if options.target_dir:
|
||||||
ensure_dir(options.target_dir)
|
ensure_dir(options.target_dir)
|
||||||
|
|
||||||
lib_dir = distutils_scheme('', home=temp_target_dir)['purelib']
|
# Checking both purelib and platlib directories for installed
|
||||||
|
# packages to be moved to target directory
|
||||||
|
lib_dir_list = []
|
||||||
|
|
||||||
|
purelib_dir = distutils_scheme('', home=temp_target_dir)['purelib']
|
||||||
|
platlib_dir = distutils_scheme('', home=temp_target_dir)['platlib']
|
||||||
|
|
||||||
|
if os.path.exists(purelib_dir):
|
||||||
|
lib_dir_list.append(purelib_dir)
|
||||||
|
if os.path.exists(platlib_dir) and platlib_dir != purelib_dir:
|
||||||
|
lib_dir_list.append(platlib_dir)
|
||||||
|
|
||||||
|
for lib_dir in lib_dir_list:
|
||||||
for item in os.listdir(lib_dir):
|
for item in os.listdir(lib_dir):
|
||||||
target_item_dir = os.path.join(options.target_dir, item)
|
target_item_dir = os.path.join(options.target_dir, item)
|
||||||
if os.path.exists(target_item_dir):
|
if os.path.exists(target_item_dir):
|
||||||
|
@ -402,3 +448,8 @@ class InstallCommand(RequirementCommand):
|
||||||
)
|
)
|
||||||
shutil.rmtree(temp_target_dir)
|
shutil.rmtree(temp_target_dir)
|
||||||
return requirement_set
|
return requirement_set
|
||||||
|
|
||||||
|
|
||||||
|
def get_lib_location_guesses(*args, **kwargs):
|
||||||
|
scheme = distutils_scheme('', *args, **kwargs)
|
||||||
|
return [scheme['purelib'], scheme['platlib']]
|
||||||
|
|
|
@ -1,7 +1,14 @@
|
||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
|
|
||||||
|
import json
|
||||||
import logging
|
import logging
|
||||||
import warnings
|
import warnings
|
||||||
|
try:
|
||||||
|
from itertools import zip_longest
|
||||||
|
except ImportError:
|
||||||
|
from itertools import izip_longest as zip_longest
|
||||||
|
|
||||||
|
from pip._vendor import six
|
||||||
|
|
||||||
from pip.basecommand import Command
|
from pip.basecommand import Command
|
||||||
from pip.exceptions import CommandError
|
from pip.exceptions import CommandError
|
||||||
|
@ -11,7 +18,6 @@ from pip.utils import (
|
||||||
from pip.utils.deprecation import RemovedInPip10Warning
|
from pip.utils.deprecation import RemovedInPip10Warning
|
||||||
from pip.cmdoptions import make_option_group, index_group
|
from pip.cmdoptions import make_option_group, index_group
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
@ -68,6 +74,23 @@ class ListCommand(Command):
|
||||||
"pip only finds stable versions."),
|
"pip only finds stable versions."),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
cmd_opts.add_option(
|
||||||
|
'--format',
|
||||||
|
action='store',
|
||||||
|
dest='list_format',
|
||||||
|
choices=('legacy', 'columns', 'freeze', 'json'),
|
||||||
|
help="Select the output format among: legacy (default), columns, "
|
||||||
|
"freeze or json.",
|
||||||
|
)
|
||||||
|
|
||||||
|
cmd_opts.add_option(
|
||||||
|
'--not-required',
|
||||||
|
action='store_true',
|
||||||
|
dest='not_required',
|
||||||
|
help="List packages that are not dependencies of "
|
||||||
|
"installed packages.",
|
||||||
|
)
|
||||||
|
|
||||||
index_opts = make_option_group(index_group, self.parser)
|
index_opts = make_option_group(index_group, self.parser)
|
||||||
|
|
||||||
self.parser.insert_option_group(0, index_opts)
|
self.parser.insert_option_group(0, index_opts)
|
||||||
|
@ -110,38 +133,62 @@ class ListCommand(Command):
|
||||||
"no longer has any effect.",
|
"no longer has any effect.",
|
||||||
RemovedInPip10Warning,
|
RemovedInPip10Warning,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if options.list_format is None:
|
||||||
|
warnings.warn(
|
||||||
|
"The default format will switch to columns in the future. "
|
||||||
|
"You can use --format=(legacy|columns) (or define a "
|
||||||
|
"format=(legacy|columns) in your pip.conf under the [list] "
|
||||||
|
"section) to disable this warning.",
|
||||||
|
RemovedInPip10Warning,
|
||||||
|
)
|
||||||
|
|
||||||
if options.outdated and options.uptodate:
|
if options.outdated and options.uptodate:
|
||||||
raise CommandError(
|
raise CommandError(
|
||||||
"Options --outdated and --uptodate cannot be combined.")
|
"Options --outdated and --uptodate cannot be combined.")
|
||||||
|
|
||||||
if options.outdated:
|
packages = get_installed_distributions(
|
||||||
self.run_outdated(options)
|
local_only=options.local,
|
||||||
elif options.uptodate:
|
user_only=options.user,
|
||||||
self.run_uptodate(options)
|
editables_only=options.editable,
|
||||||
else:
|
|
||||||
self.run_listing(options)
|
|
||||||
|
|
||||||
def run_outdated(self, options):
|
|
||||||
for dist, latest_version, typ in sorted(
|
|
||||||
self.find_packages_latest_versions(options),
|
|
||||||
key=lambda p: p[0].project_name.lower()):
|
|
||||||
if latest_version > dist.parsed_version:
|
|
||||||
logger.info(
|
|
||||||
'%s - Latest: %s [%s]',
|
|
||||||
self.output_package(dist), latest_version, typ,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def find_packages_latest_versions(self, 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):
|
||||||
|
return [
|
||||||
|
dist for dist in self.iter_packages_latest_infos(packages, options)
|
||||||
|
if dist.latest_version > dist.parsed_version
|
||||||
|
]
|
||||||
|
|
||||||
|
def get_uptodate(self, packages, options):
|
||||||
|
return [
|
||||||
|
dist for dist in self.iter_packages_latest_infos(packages, options)
|
||||||
|
if dist.latest_version == dist.parsed_version
|
||||||
|
]
|
||||||
|
|
||||||
|
def get_not_required(self, packages, options):
|
||||||
|
dep_keys = set()
|
||||||
|
for dist in packages:
|
||||||
|
dep_keys.update(requirement.key for requirement in dist.requires())
|
||||||
|
return set(pkg for pkg in packages if pkg.key not in dep_keys)
|
||||||
|
|
||||||
|
def iter_packages_latest_infos(self, packages, options):
|
||||||
index_urls = [options.index_url] + options.extra_index_urls
|
index_urls = [options.index_url] + options.extra_index_urls
|
||||||
if options.no_index:
|
if options.no_index:
|
||||||
logger.info('Ignoring indexes: %s', ','.join(index_urls))
|
logger.debug('Ignoring indexes: %s', ','.join(index_urls))
|
||||||
index_urls = []
|
index_urls = []
|
||||||
|
|
||||||
dependency_links = []
|
dependency_links = []
|
||||||
for dist in get_installed_distributions(
|
for dist in packages:
|
||||||
local_only=options.local,
|
|
||||||
user_only=options.user,
|
|
||||||
editables_only=options.editable):
|
|
||||||
if dist.has_metadata('dependency_links.txt'):
|
if dist.has_metadata('dependency_links.txt'):
|
||||||
dependency_links.extend(
|
dependency_links.extend(
|
||||||
dist.get_metadata_lines('dependency_links.txt'),
|
dist.get_metadata_lines('dependency_links.txt'),
|
||||||
|
@ -151,12 +198,7 @@ class ListCommand(Command):
|
||||||
finder = self._build_package_finder(options, index_urls, session)
|
finder = self._build_package_finder(options, index_urls, session)
|
||||||
finder.add_dependency_links(dependency_links)
|
finder.add_dependency_links(dependency_links)
|
||||||
|
|
||||||
installed_packages = get_installed_distributions(
|
for dist in packages:
|
||||||
local_only=options.local,
|
|
||||||
user_only=options.user,
|
|
||||||
editables_only=options.editable,
|
|
||||||
)
|
|
||||||
for dist in installed_packages:
|
|
||||||
typ = 'unknown'
|
typ = 'unknown'
|
||||||
all_candidates = finder.find_all_candidates(dist.key)
|
all_candidates = finder.find_all_candidates(dist.key)
|
||||||
if not options.pre:
|
if not options.pre:
|
||||||
|
@ -173,17 +215,12 @@ class ListCommand(Command):
|
||||||
typ = 'wheel'
|
typ = 'wheel'
|
||||||
else:
|
else:
|
||||||
typ = 'sdist'
|
typ = 'sdist'
|
||||||
yield dist, remote_version, typ
|
# This is dirty but makes the rest of the code much cleaner
|
||||||
|
dist.latest_version = remote_version
|
||||||
|
dist.latest_filetype = typ
|
||||||
|
yield dist
|
||||||
|
|
||||||
def run_listing(self, options):
|
def output_legacy(self, dist):
|
||||||
installed_packages = get_installed_distributions(
|
|
||||||
local_only=options.local,
|
|
||||||
user_only=options.user,
|
|
||||||
editables_only=options.editable,
|
|
||||||
)
|
|
||||||
self.output_package_listing(installed_packages)
|
|
||||||
|
|
||||||
def output_package(self, dist):
|
|
||||||
if dist_is_editable(dist):
|
if dist_is_editable(dist):
|
||||||
return '%s (%s, %s)' % (
|
return '%s (%s, %s)' % (
|
||||||
dist.project_name,
|
dist.project_name,
|
||||||
|
@ -193,17 +230,108 @@ class ListCommand(Command):
|
||||||
else:
|
else:
|
||||||
return '%s (%s)' % (dist.project_name, dist.version)
|
return '%s (%s)' % (dist.project_name, dist.version)
|
||||||
|
|
||||||
def output_package_listing(self, installed_packages):
|
def output_legacy_latest(self, dist):
|
||||||
installed_packages = sorted(
|
return '%s - Latest: %s [%s]' % (
|
||||||
installed_packages,
|
self.output_legacy(dist),
|
||||||
|
dist.latest_version,
|
||||||
|
dist.latest_filetype,
|
||||||
|
)
|
||||||
|
|
||||||
|
def output_package_listing(self, packages, options):
|
||||||
|
packages = sorted(
|
||||||
|
packages,
|
||||||
key=lambda dist: dist.project_name.lower(),
|
key=lambda dist: dist.project_name.lower(),
|
||||||
)
|
)
|
||||||
for dist in installed_packages:
|
if options.list_format == 'columns' and packages:
|
||||||
logger.info(self.output_package(dist))
|
data, header = format_for_columns(packages, options)
|
||||||
|
self.output_package_listing_columns(data, header)
|
||||||
|
elif options.list_format == 'freeze':
|
||||||
|
for dist in packages:
|
||||||
|
logger.info("%s==%s", dist.project_name, dist.version)
|
||||||
|
elif options.list_format == 'json':
|
||||||
|
logger.info(format_for_json(packages, options))
|
||||||
|
else: # legacy
|
||||||
|
for dist in packages:
|
||||||
|
if options.outdated:
|
||||||
|
logger.info(self.output_legacy_latest(dist))
|
||||||
|
else:
|
||||||
|
logger.info(self.output_legacy(dist))
|
||||||
|
|
||||||
def run_uptodate(self, options):
|
def output_package_listing_columns(self, data, header):
|
||||||
uptodate = []
|
# insert the header first: we need to know the size of column names
|
||||||
for dist, version, typ in self.find_packages_latest_versions(options):
|
if len(data) > 0:
|
||||||
if dist.parsed_version == version:
|
data.insert(0, header)
|
||||||
uptodate.append(dist)
|
|
||||||
self.output_package_listing(uptodate)
|
pkg_strings, sizes = tabulate(data)
|
||||||
|
|
||||||
|
# Create and add a separator.
|
||||||
|
if len(data) > 0:
|
||||||
|
pkg_strings.insert(1, " ".join(map(lambda x: '-' * x, sizes)))
|
||||||
|
|
||||||
|
for val in pkg_strings:
|
||||||
|
logger.info(val)
|
||||||
|
|
||||||
|
|
||||||
|
def tabulate(vals):
|
||||||
|
# From pfmoore on GitHub:
|
||||||
|
# https://github.com/pypa/pip/issues/3651#issuecomment-216932564
|
||||||
|
assert len(vals) > 0
|
||||||
|
|
||||||
|
sizes = [0] * max(len(x) for x in vals)
|
||||||
|
for row in vals:
|
||||||
|
sizes = [max(s, len(str(c))) for s, c in zip_longest(sizes, row)]
|
||||||
|
|
||||||
|
result = []
|
||||||
|
for row in vals:
|
||||||
|
display = " ".join([str(c).ljust(s) if c is not None else ''
|
||||||
|
for s, c in zip_longest(sizes, row)])
|
||||||
|
result.append(display)
|
||||||
|
|
||||||
|
return result, sizes
|
||||||
|
|
||||||
|
|
||||||
|
def format_for_columns(pkgs, options):
|
||||||
|
"""
|
||||||
|
Convert the package data into something usable
|
||||||
|
by output_package_listing_columns.
|
||||||
|
"""
|
||||||
|
running_outdated = options.outdated
|
||||||
|
# Adjust the header for the `pip list --outdated` case.
|
||||||
|
if running_outdated:
|
||||||
|
header = ["Package", "Version", "Latest", "Type"]
|
||||||
|
else:
|
||||||
|
header = ["Package", "Version"]
|
||||||
|
|
||||||
|
data = []
|
||||||
|
if any(dist_is_editable(x) for x in pkgs):
|
||||||
|
header.append("Location")
|
||||||
|
|
||||||
|
for proj in pkgs:
|
||||||
|
# if we're working on the 'outdated' list, separate out the
|
||||||
|
# latest_version and type
|
||||||
|
row = [proj.project_name, proj.version]
|
||||||
|
|
||||||
|
if running_outdated:
|
||||||
|
row.append(proj.latest_version)
|
||||||
|
row.append(proj.latest_filetype)
|
||||||
|
|
||||||
|
if dist_is_editable(proj):
|
||||||
|
row.append(proj.location)
|
||||||
|
|
||||||
|
data.append(row)
|
||||||
|
|
||||||
|
return data, header
|
||||||
|
|
||||||
|
|
||||||
|
def format_for_json(packages, options):
|
||||||
|
data = []
|
||||||
|
for dist in packages:
|
||||||
|
info = {
|
||||||
|
'name': dist.project_name,
|
||||||
|
'version': six.text_type(dist.version),
|
||||||
|
}
|
||||||
|
if options.outdated:
|
||||||
|
info['latest_version'] = six.text_type(dist.latest_version)
|
||||||
|
info['latest_filetype'] = dist.latest_filetype
|
||||||
|
data.append(info)
|
||||||
|
return json.dumps(data)
|
||||||
|
|
|
@ -5,12 +5,14 @@ import sys
|
||||||
import textwrap
|
import textwrap
|
||||||
|
|
||||||
from pip.basecommand import Command, SUCCESS
|
from pip.basecommand import Command, SUCCESS
|
||||||
|
from pip.compat import OrderedDict
|
||||||
from pip.download import PipXmlrpcTransport
|
from pip.download import PipXmlrpcTransport
|
||||||
from pip.models import PyPI
|
from pip.models import PyPI
|
||||||
from pip.utils import get_terminal_size
|
from pip.utils import get_terminal_size
|
||||||
from pip.utils.logging import indent_log
|
from pip.utils.logging import indent_log
|
||||||
from pip.exceptions import CommandError
|
from pip.exceptions import CommandError
|
||||||
from pip.status_codes import NO_MATCHES_FOUND
|
from pip.status_codes import NO_MATCHES_FOUND
|
||||||
|
from pip._vendor.packaging.version import parse as parse_version
|
||||||
from pip._vendor import pkg_resources
|
from pip._vendor import pkg_resources
|
||||||
from pip._vendor.six.moves import xmlrpc_client
|
from pip._vendor.six.moves import xmlrpc_client
|
||||||
|
|
||||||
|
@ -28,7 +30,7 @@ class SearchCommand(Command):
|
||||||
def __init__(self, *args, **kw):
|
def __init__(self, *args, **kw):
|
||||||
super(SearchCommand, self).__init__(*args, **kw)
|
super(SearchCommand, self).__init__(*args, **kw)
|
||||||
self.cmd_opts.add_option(
|
self.cmd_opts.add_option(
|
||||||
'--index',
|
'-i', '--index',
|
||||||
dest='index',
|
dest='index',
|
||||||
metavar='URL',
|
metavar='URL',
|
||||||
default=PyPI.pypi_url,
|
default=PyPI.pypi_url,
|
||||||
|
@ -67,21 +69,17 @@ def transform_hits(hits):
|
||||||
packages with the list of versions stored inline. This converts the
|
packages with the list of versions stored inline. This converts the
|
||||||
list from pypi into one we can use.
|
list from pypi into one we can use.
|
||||||
"""
|
"""
|
||||||
packages = {}
|
packages = OrderedDict()
|
||||||
for hit in hits:
|
for hit in hits:
|
||||||
name = hit['name']
|
name = hit['name']
|
||||||
summary = hit['summary']
|
summary = hit['summary']
|
||||||
version = hit['version']
|
version = hit['version']
|
||||||
score = hit['_pypi_ordering']
|
|
||||||
if score is None:
|
|
||||||
score = 0
|
|
||||||
|
|
||||||
if name not in packages.keys():
|
if name not in packages.keys():
|
||||||
packages[name] = {
|
packages[name] = {
|
||||||
'name': name,
|
'name': name,
|
||||||
'summary': summary,
|
'summary': summary,
|
||||||
'versions': [version],
|
'versions': [version],
|
||||||
'score': score,
|
|
||||||
}
|
}
|
||||||
else:
|
else:
|
||||||
packages[name]['versions'].append(version)
|
packages[name]['versions'].append(version)
|
||||||
|
@ -89,16 +87,8 @@ def transform_hits(hits):
|
||||||
# if this is the highest version, replace summary and score
|
# if this is the highest version, replace summary and score
|
||||||
if version == highest_version(packages[name]['versions']):
|
if version == highest_version(packages[name]['versions']):
|
||||||
packages[name]['summary'] = summary
|
packages[name]['summary'] = summary
|
||||||
packages[name]['score'] = score
|
|
||||||
|
|
||||||
# each record has a unique name now, so we will convert the dict into a
|
return list(packages.values())
|
||||||
# list sorted by score
|
|
||||||
package_list = sorted(
|
|
||||||
packages.values(),
|
|
||||||
key=lambda x: x['score'],
|
|
||||||
reverse=True,
|
|
||||||
)
|
|
||||||
return package_list
|
|
||||||
|
|
||||||
|
|
||||||
def print_results(hits, name_column_width=None, terminal_width=None):
|
def print_results(hits, name_column_width=None, terminal_width=None):
|
||||||
|
@ -116,11 +106,10 @@ def print_results(hits, name_column_width=None, terminal_width=None):
|
||||||
summary = hit['summary'] or ''
|
summary = hit['summary'] or ''
|
||||||
version = hit.get('versions', ['-'])[-1]
|
version = hit.get('versions', ['-'])[-1]
|
||||||
if terminal_width is not None:
|
if terminal_width is not None:
|
||||||
|
target_width = terminal_width - name_column_width - 5
|
||||||
|
if target_width > 10:
|
||||||
# wrap and indent summary to fit terminal
|
# wrap and indent summary to fit terminal
|
||||||
summary = textwrap.wrap(
|
summary = textwrap.wrap(summary, target_width)
|
||||||
summary,
|
|
||||||
terminal_width - name_column_width - 5,
|
|
||||||
)
|
|
||||||
summary = ('\n' + ' ' * (name_column_width + 3)).join(summary)
|
summary = ('\n' + ' ' * (name_column_width + 3)).join(summary)
|
||||||
|
|
||||||
line = '%-*s - %s' % (name_column_width,
|
line = '%-*s - %s' % (name_column_width,
|
||||||
|
@ -141,6 +130,4 @@ def print_results(hits, name_column_width=None, terminal_width=None):
|
||||||
|
|
||||||
|
|
||||||
def highest_version(versions):
|
def highest_version(versions):
|
||||||
return next(iter(
|
return max(versions, key=parse_version)
|
||||||
sorted(versions, key=pkg_resources.parse_version, reverse=True)
|
|
||||||
))
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ import os
|
||||||
from pip.basecommand import Command
|
from pip.basecommand import Command
|
||||||
from pip.status_codes import SUCCESS, ERROR
|
from pip.status_codes import SUCCESS, ERROR
|
||||||
from pip._vendor import pkg_resources
|
from pip._vendor import pkg_resources
|
||||||
|
from pip._vendor.packaging.utils import canonicalize_name
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
@ -37,7 +38,8 @@ class ShowCommand(Command):
|
||||||
query = args
|
query = args
|
||||||
|
|
||||||
results = search_packages_info(query)
|
results = search_packages_info(query)
|
||||||
if not print_results(results, options.files):
|
if not print_results(
|
||||||
|
results, list_files=options.files, verbose=options.verbose):
|
||||||
return ERROR
|
return ERROR
|
||||||
return SUCCESS
|
return SUCCESS
|
||||||
|
|
||||||
|
@ -49,9 +51,12 @@ def search_packages_info(query):
|
||||||
pip generated 'installed-files.txt' in the distributions '.egg-info'
|
pip generated 'installed-files.txt' in the distributions '.egg-info'
|
||||||
directory.
|
directory.
|
||||||
"""
|
"""
|
||||||
installed = dict(
|
installed = {}
|
||||||
[(p.project_name.lower(), p) for p in pkg_resources.working_set])
|
for p in pkg_resources.working_set:
|
||||||
query_names = [name.lower() for name in query]
|
installed[canonicalize_name(p.project_name)] = p
|
||||||
|
|
||||||
|
query_names = [canonicalize_name(name) for name in query]
|
||||||
|
|
||||||
for dist in [installed[pkg] for pkg in query_names if pkg in installed]:
|
for dist in [installed[pkg] for pkg in query_names if pkg in installed]:
|
||||||
package = {
|
package = {
|
||||||
'name': dist.project_name,
|
'name': dist.project_name,
|
||||||
|
@ -85,13 +90,11 @@ def search_packages_info(query):
|
||||||
entry_points = dist.get_metadata_lines('entry_points.txt')
|
entry_points = dist.get_metadata_lines('entry_points.txt')
|
||||||
package['entry_points'] = entry_points
|
package['entry_points'] = entry_points
|
||||||
|
|
||||||
installer = None
|
|
||||||
if dist.has_metadata('INSTALLER'):
|
if dist.has_metadata('INSTALLER'):
|
||||||
for line in dist.get_metadata_lines('INSTALLER'):
|
for line in dist.get_metadata_lines('INSTALLER'):
|
||||||
if line.strip():
|
if line.strip():
|
||||||
installer = line.strip()
|
package['installer'] = line.strip()
|
||||||
break
|
break
|
||||||
package['installer'] = installer
|
|
||||||
|
|
||||||
# @todo: Should pkg_resources.Distribution have a
|
# @todo: Should pkg_resources.Distribution have a
|
||||||
# `get_pkg_info` method?
|
# `get_pkg_info` method?
|
||||||
|
@ -105,9 +108,6 @@ def search_packages_info(query):
|
||||||
# It looks like FeedParser cannot deal with repeated headers
|
# It looks like FeedParser cannot deal with repeated headers
|
||||||
classifiers = []
|
classifiers = []
|
||||||
for line in metadata.splitlines():
|
for line in metadata.splitlines():
|
||||||
if not line:
|
|
||||||
break
|
|
||||||
# Classifier: License :: OSI Approved :: MIT License
|
|
||||||
if line.startswith('Classifier: '):
|
if line.startswith('Classifier: '):
|
||||||
classifiers.append(line[len('Classifier: '):])
|
classifiers.append(line[len('Classifier: '):])
|
||||||
package['classifiers'] = classifiers
|
package['classifiers'] = classifiers
|
||||||
|
@ -117,38 +117,38 @@ def search_packages_info(query):
|
||||||
yield package
|
yield package
|
||||||
|
|
||||||
|
|
||||||
def print_results(distributions, list_all_files):
|
def print_results(distributions, list_files=False, verbose=False):
|
||||||
"""
|
"""
|
||||||
Print the informations from installed distributions found.
|
Print the informations from installed distributions found.
|
||||||
"""
|
"""
|
||||||
results_printed = False
|
results_printed = False
|
||||||
for dist in distributions:
|
for i, dist in enumerate(distributions):
|
||||||
results_printed = True
|
results_printed = True
|
||||||
|
if i > 0:
|
||||||
logger.info("---")
|
logger.info("---")
|
||||||
logger.info("Metadata-Version: %s", dist.get('metadata-version'))
|
logger.info("Name: %s", dist.get('name', ''))
|
||||||
logger.info("Name: %s", dist['name'])
|
logger.info("Version: %s", dist.get('version', ''))
|
||||||
logger.info("Version: %s", dist['version'])
|
logger.info("Summary: %s", dist.get('summary', ''))
|
||||||
logger.info("Summary: %s", dist.get('summary'))
|
logger.info("Home-page: %s", dist.get('home-page', ''))
|
||||||
logger.info("Home-page: %s", dist.get('home-page'))
|
logger.info("Author: %s", dist.get('author', ''))
|
||||||
logger.info("Author: %s", dist.get('author'))
|
logger.info("Author-email: %s", dist.get('author-email', ''))
|
||||||
logger.info("Author-email: %s", dist.get('author-email'))
|
logger.info("License: %s", dist.get('license', ''))
|
||||||
if dist['installer'] is not None:
|
logger.info("Location: %s", dist.get('location', ''))
|
||||||
logger.info("Installer: %s", dist['installer'])
|
logger.info("Requires: %s", ', '.join(dist.get('requires', [])))
|
||||||
logger.info("License: %s", dist.get('license'))
|
if verbose:
|
||||||
logger.info("Location: %s", dist['location'])
|
logger.info("Metadata-Version: %s",
|
||||||
logger.info("Requires: %s", ', '.join(dist['requires']))
|
dist.get('metadata-version', ''))
|
||||||
|
logger.info("Installer: %s", dist.get('installer', ''))
|
||||||
logger.info("Classifiers:")
|
logger.info("Classifiers:")
|
||||||
for classifier in dist['classifiers']:
|
for classifier in dist.get('classifiers', []):
|
||||||
logger.info(" %s", classifier)
|
logger.info(" %s", classifier)
|
||||||
if list_all_files:
|
|
||||||
logger.info("Files:")
|
|
||||||
if 'files' in dist:
|
|
||||||
for line in dist['files']:
|
|
||||||
logger.info(" %s", line.strip())
|
|
||||||
else:
|
|
||||||
logger.info("Cannot locate installed-files.txt")
|
|
||||||
if 'entry_points' in dist:
|
|
||||||
logger.info("Entry-points:")
|
logger.info("Entry-points:")
|
||||||
for line in dist['entry_points']:
|
for entry in dist.get('entry_points', []):
|
||||||
|
logger.info(" %s", entry.strip())
|
||||||
|
if list_files:
|
||||||
|
logger.info("Files:")
|
||||||
|
for line in dist.get('files', []):
|
||||||
logger.info(" %s", line.strip())
|
logger.info(" %s", line.strip())
|
||||||
|
if "files" not in dist:
|
||||||
|
logger.info("Cannot locate installed-files.txt")
|
||||||
return results_printed
|
return results_printed
|
||||||
|
|
|
@ -24,7 +24,7 @@ class WheelCommand(RequirementCommand):
|
||||||
|
|
||||||
Wheel is a built-package format, and offers the advantage of not
|
Wheel is a built-package format, and offers the advantage of not
|
||||||
recompiling your software during every install. For more details, see the
|
recompiling your software during every install. For more details, see the
|
||||||
wheel docs: http://wheel.readthedocs.org/en/latest.
|
wheel docs: https://wheel.readthedocs.io/en/latest/
|
||||||
|
|
||||||
Requirements: setuptools>=0.8, and wheel.
|
Requirements: setuptools>=0.8, and wheel.
|
||||||
|
|
||||||
|
@ -70,6 +70,7 @@ class WheelCommand(RequirementCommand):
|
||||||
cmd_opts.add_option(cmdoptions.editable())
|
cmd_opts.add_option(cmdoptions.editable())
|
||||||
cmd_opts.add_option(cmdoptions.requirements())
|
cmd_opts.add_option(cmdoptions.requirements())
|
||||||
cmd_opts.add_option(cmdoptions.src())
|
cmd_opts.add_option(cmdoptions.src())
|
||||||
|
cmd_opts.add_option(cmdoptions.ignore_requires_python())
|
||||||
cmd_opts.add_option(cmdoptions.no_deps())
|
cmd_opts.add_option(cmdoptions.no_deps())
|
||||||
cmd_opts.add_option(cmdoptions.build_dir())
|
cmd_opts.add_option(cmdoptions.build_dir())
|
||||||
|
|
||||||
|
@ -151,12 +152,14 @@ class WheelCommand(RequirementCommand):
|
||||||
|
|
||||||
index_urls = [options.index_url] + options.extra_index_urls
|
index_urls = [options.index_url] + options.extra_index_urls
|
||||||
if options.no_index:
|
if options.no_index:
|
||||||
logger.info('Ignoring indexes: %s', ','.join(index_urls))
|
logger.debug('Ignoring indexes: %s', ','.join(index_urls))
|
||||||
index_urls = []
|
index_urls = []
|
||||||
|
|
||||||
if options.build_dir:
|
if options.build_dir:
|
||||||
options.build_dir = os.path.abspath(options.build_dir)
|
options.build_dir = os.path.abspath(options.build_dir)
|
||||||
|
|
||||||
|
options.src_dir = os.path.abspath(options.src_dir)
|
||||||
|
|
||||||
with self._build_session(options) as session:
|
with self._build_session(options) as session:
|
||||||
finder = self._build_package_finder(options, session)
|
finder = self._build_package_finder(options, session)
|
||||||
build_delete = (not (options.no_clean or options.build_dir))
|
build_delete = (not (options.no_clean or options.build_dir))
|
||||||
|
@ -169,6 +172,7 @@ class WheelCommand(RequirementCommand):
|
||||||
download_dir=None,
|
download_dir=None,
|
||||||
ignore_dependencies=options.ignore_dependencies,
|
ignore_dependencies=options.ignore_dependencies,
|
||||||
ignore_installed=True,
|
ignore_installed=True,
|
||||||
|
ignore_requires_python=options.ignore_requires_python,
|
||||||
isolated=options.isolated_mode,
|
isolated=options.isolated_mode,
|
||||||
session=session,
|
session=session,
|
||||||
wheel_cache=wheel_cache,
|
wheel_cache=wheel_cache,
|
||||||
|
|
|
@ -15,7 +15,7 @@ except ImportError:
|
||||||
try:
|
try:
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
except ImportError:
|
except ImportError:
|
||||||
from pip.compat.ordereddict import OrderedDict
|
from pip._vendor.ordereddict import OrderedDict
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import ipaddress
|
import ipaddress
|
||||||
|
@ -115,7 +115,7 @@ def get_path_uid(path):
|
||||||
file_uid = os.fstat(fd).st_uid
|
file_uid = os.fstat(fd).st_uid
|
||||||
os.close(fd)
|
os.close(fd)
|
||||||
else: # AIX and Jython
|
else: # AIX and Jython
|
||||||
# WARNING: time of check vulnerabity, but best we can do w/o NOFOLLOW
|
# WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW
|
||||||
if not os.path.islink(path):
|
if not os.path.islink(path):
|
||||||
# older versions of Jython don't have `os.fstat`
|
# older versions of Jython don't have `os.fstat`
|
||||||
file_uid = os.stat(path).st_uid
|
file_uid = os.stat(path).st_uid
|
||||||
|
|
|
@ -1,129 +0,0 @@
|
||||||
# Copyright (c) 2009 Raymond Hettinger
|
|
||||||
#
|
|
||||||
# Permission is hereby granted, free of charge, to any person
|
|
||||||
# obtaining a copy of this software and associated documentation files
|
|
||||||
# (the "Software"), to deal in the Software without restriction,
|
|
||||||
# including without limitation the rights to use, copy, modify, merge,
|
|
||||||
# publish, distribute, sublicense, and/or sell copies of the Software,
|
|
||||||
# and to permit persons to whom the Software is furnished to do so,
|
|
||||||
# subject to the following conditions:
|
|
||||||
#
|
|
||||||
# The above copyright notice and this permission notice shall be
|
|
||||||
# included in all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
||||||
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
||||||
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
||||||
# OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
# flake8: noqa
|
|
||||||
|
|
||||||
from UserDict import DictMixin
|
|
||||||
|
|
||||||
class OrderedDict(dict, DictMixin):
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwds):
|
|
||||||
if len(args) > 1:
|
|
||||||
raise TypeError('expected at most 1 arguments, got %d' % len(args))
|
|
||||||
try:
|
|
||||||
self.__end
|
|
||||||
except AttributeError:
|
|
||||||
self.clear()
|
|
||||||
self.update(*args, **kwds)
|
|
||||||
|
|
||||||
def clear(self):
|
|
||||||
self.__end = end = []
|
|
||||||
end += [None, end, end] # sentinel node for doubly linked list
|
|
||||||
self.__map = {} # key --> [key, prev, next]
|
|
||||||
dict.clear(self)
|
|
||||||
|
|
||||||
def __setitem__(self, key, value):
|
|
||||||
if key not in self:
|
|
||||||
end = self.__end
|
|
||||||
curr = end[1]
|
|
||||||
curr[2] = end[1] = self.__map[key] = [key, curr, end]
|
|
||||||
dict.__setitem__(self, key, value)
|
|
||||||
|
|
||||||
def __delitem__(self, key):
|
|
||||||
dict.__delitem__(self, key)
|
|
||||||
key, prev, next = self.__map.pop(key)
|
|
||||||
prev[2] = next
|
|
||||||
next[1] = prev
|
|
||||||
|
|
||||||
def __iter__(self):
|
|
||||||
end = self.__end
|
|
||||||
curr = end[2]
|
|
||||||
while curr is not end:
|
|
||||||
yield curr[0]
|
|
||||||
curr = curr[2]
|
|
||||||
|
|
||||||
def __reversed__(self):
|
|
||||||
end = self.__end
|
|
||||||
curr = end[1]
|
|
||||||
while curr is not end:
|
|
||||||
yield curr[0]
|
|
||||||
curr = curr[1]
|
|
||||||
|
|
||||||
def popitem(self, last=True):
|
|
||||||
if not self:
|
|
||||||
raise KeyError('dictionary is empty')
|
|
||||||
if last:
|
|
||||||
key = reversed(self).next()
|
|
||||||
else:
|
|
||||||
key = iter(self).next()
|
|
||||||
value = self.pop(key)
|
|
||||||
return key, value
|
|
||||||
|
|
||||||
def __reduce__(self):
|
|
||||||
items = [[k, self[k]] for k in self]
|
|
||||||
tmp = self.__map, self.__end
|
|
||||||
del self.__map, self.__end
|
|
||||||
inst_dict = vars(self).copy()
|
|
||||||
self.__map, self.__end = tmp
|
|
||||||
if inst_dict:
|
|
||||||
return (self.__class__, (items,), inst_dict)
|
|
||||||
return self.__class__, (items,)
|
|
||||||
|
|
||||||
def keys(self):
|
|
||||||
return list(self)
|
|
||||||
|
|
||||||
setdefault = DictMixin.setdefault
|
|
||||||
update = DictMixin.update
|
|
||||||
pop = DictMixin.pop
|
|
||||||
values = DictMixin.values
|
|
||||||
items = DictMixin.items
|
|
||||||
iterkeys = DictMixin.iterkeys
|
|
||||||
itervalues = DictMixin.itervalues
|
|
||||||
iteritems = DictMixin.iteritems
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
if not self:
|
|
||||||
return '%s()' % (self.__class__.__name__,)
|
|
||||||
return '%s(%r)' % (self.__class__.__name__, self.items())
|
|
||||||
|
|
||||||
def copy(self):
|
|
||||||
return self.__class__(self)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def fromkeys(cls, iterable, value=None):
|
|
||||||
d = cls()
|
|
||||||
for key in iterable:
|
|
||||||
d[key] = value
|
|
||||||
return d
|
|
||||||
|
|
||||||
def __eq__(self, other):
|
|
||||||
if isinstance(other, OrderedDict):
|
|
||||||
if len(self) != len(other):
|
|
||||||
return False
|
|
||||||
for p, q in zip(self.items(), other.items()):
|
|
||||||
if p != q:
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
return dict.__eq__(self, other)
|
|
||||||
|
|
||||||
def __ne__(self, other):
|
|
||||||
return not self == other
|
|
|
@ -33,6 +33,7 @@ from pip.utils.encoding import auto_decode
|
||||||
from pip.utils.filesystem import check_path_owner
|
from pip.utils.filesystem import check_path_owner
|
||||||
from pip.utils.logging import indent_log
|
from pip.utils.logging import indent_log
|
||||||
from pip.utils.setuptools_build import SETUPTOOLS_SHIM
|
from pip.utils.setuptools_build import SETUPTOOLS_SHIM
|
||||||
|
from pip.utils.glibc import libc_ver
|
||||||
from pip.utils.ui import DownloadProgressBar, DownloadProgressSpinner
|
from pip.utils.ui import DownloadProgressBar, DownloadProgressSpinner
|
||||||
from pip.locations import write_delete_marker_file
|
from pip.locations import write_delete_marker_file
|
||||||
from pip.vcs import vcs
|
from pip.vcs import vcs
|
||||||
|
@ -40,6 +41,7 @@ from pip._vendor import requests, six
|
||||||
from pip._vendor.requests.adapters import BaseAdapter, HTTPAdapter
|
from pip._vendor.requests.adapters import BaseAdapter, HTTPAdapter
|
||||||
from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth
|
from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth
|
||||||
from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response
|
from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response
|
||||||
|
from pip._vendor.requests.utils import get_netrc_auth
|
||||||
from pip._vendor.requests.structures import CaseInsensitiveDict
|
from pip._vendor.requests.structures import CaseInsensitiveDict
|
||||||
from pip._vendor.requests.packages import urllib3
|
from pip._vendor.requests.packages import urllib3
|
||||||
from pip._vendor.cachecontrol import CacheControlAdapter
|
from pip._vendor.cachecontrol import CacheControlAdapter
|
||||||
|
@ -88,21 +90,22 @@ def user_agent():
|
||||||
data["implementation"]["version"] = platform.python_version()
|
data["implementation"]["version"] = platform.python_version()
|
||||||
|
|
||||||
if sys.platform.startswith("linux"):
|
if sys.platform.startswith("linux"):
|
||||||
distro = dict(filter(
|
from pip._vendor import distro
|
||||||
|
distro_infos = dict(filter(
|
||||||
lambda x: x[1],
|
lambda x: x[1],
|
||||||
zip(["name", "version", "id"], platform.linux_distribution()),
|
zip(["name", "version", "id"], distro.linux_distribution()),
|
||||||
))
|
))
|
||||||
libc = dict(filter(
|
libc = dict(filter(
|
||||||
lambda x: x[1],
|
lambda x: x[1],
|
||||||
zip(["lib", "version"], platform.libc_ver()),
|
zip(["lib", "version"], libc_ver()),
|
||||||
))
|
))
|
||||||
if libc:
|
if libc:
|
||||||
distro["libc"] = libc
|
distro_infos["libc"] = libc
|
||||||
if distro:
|
if distro_infos:
|
||||||
data["distro"] = distro
|
data["distro"] = distro_infos
|
||||||
|
|
||||||
if sys.platform.startswith("darwin") and platform.mac_ver()[0]:
|
if sys.platform.startswith("darwin") and platform.mac_ver()[0]:
|
||||||
data["distro"] = {"name": "OS X", "version": platform.mac_ver()[0]}
|
data["distro"] = {"name": "macOS", "version": platform.mac_ver()[0]}
|
||||||
|
|
||||||
if platform.system():
|
if platform.system():
|
||||||
data.setdefault("system", {})["name"] = platform.system()
|
data.setdefault("system", {})["name"] = platform.system()
|
||||||
|
@ -145,6 +148,11 @@ class MultiDomainBasicAuth(AuthBase):
|
||||||
if username is None:
|
if username is None:
|
||||||
username, password = self.parse_credentials(parsed.netloc)
|
username, password = self.parse_credentials(parsed.netloc)
|
||||||
|
|
||||||
|
# Get creds from netrc if we still don't have them
|
||||||
|
if username is None and password is None:
|
||||||
|
netrc_auth = get_netrc_auth(req.url)
|
||||||
|
username, password = netrc_auth if netrc_auth else (None, None)
|
||||||
|
|
||||||
if username or password:
|
if username or password:
|
||||||
# Store the username and password
|
# Store the username and password
|
||||||
self.passwords[netloc] = (username, password)
|
self.passwords[netloc] = (username, password)
|
||||||
|
@ -163,7 +171,7 @@ class MultiDomainBasicAuth(AuthBase):
|
||||||
if resp.status_code != 401:
|
if resp.status_code != 401:
|
||||||
return resp
|
return resp
|
||||||
|
|
||||||
# We are not able to prompt the user so simple return the response
|
# We are not able to prompt the user so simply return the response
|
||||||
if not self.prompting:
|
if not self.prompting:
|
||||||
return resp
|
return resp
|
||||||
|
|
||||||
|
@ -331,7 +339,7 @@ class PipSession(requests.Session):
|
||||||
total=retries,
|
total=retries,
|
||||||
|
|
||||||
# A 503 error from PyPI typically means that the Fastly -> Origin
|
# A 503 error from PyPI typically means that the Fastly -> Origin
|
||||||
# connection got interupted in some way. A 503 error in general
|
# connection got interrupted in some way. A 503 error in general
|
||||||
# is typically considered a transient error so we'll go ahead and
|
# is typically considered a transient error so we'll go ahead and
|
||||||
# retry it.
|
# retry it.
|
||||||
status_forcelist=[503],
|
status_forcelist=[503],
|
||||||
|
@ -602,8 +610,8 @@ def _copy_file(filename, location, link):
|
||||||
download_location = os.path.join(location, link.filename)
|
download_location = os.path.join(location, link.filename)
|
||||||
if os.path.exists(download_location):
|
if os.path.exists(download_location):
|
||||||
response = ask_path_exists(
|
response = ask_path_exists(
|
||||||
'The file %s exists. (i)gnore, (w)ipe, (b)ackup ' %
|
'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)abort' %
|
||||||
display_path(download_location), ('i', 'w', 'b'))
|
display_path(download_location), ('i', 'w', 'b', 'a'))
|
||||||
if response == 'i':
|
if response == 'i':
|
||||||
copy = False
|
copy = False
|
||||||
elif response == 'w':
|
elif response == 'w':
|
||||||
|
@ -617,6 +625,8 @@ def _copy_file(filename, location, link):
|
||||||
display_path(dest_file),
|
display_path(dest_file),
|
||||||
)
|
)
|
||||||
shutil.move(download_location, dest_file)
|
shutil.move(download_location, dest_file)
|
||||||
|
elif response == 'a':
|
||||||
|
sys.exit(-1)
|
||||||
if copy:
|
if copy:
|
||||||
shutil.copy(filename, download_location)
|
shutil.copy(filename, download_location)
|
||||||
logger.info('Saved %s', display_path(download_location))
|
logger.info('Saved %s', display_path(download_location))
|
||||||
|
@ -679,7 +689,7 @@ def unpack_file_url(link, location, download_dir=None, hashes=None):
|
||||||
return
|
return
|
||||||
|
|
||||||
# If --require-hashes is off, `hashes` is either empty, the
|
# If --require-hashes is off, `hashes` is either empty, the
|
||||||
# link's embeddded hash, or MissingHashes; it is required to
|
# link's embedded hash, or MissingHashes; it is required to
|
||||||
# match. If --require-hashes is on, we are satisfied by any
|
# match. If --require-hashes is on, we are satisfied by any
|
||||||
# hash in `hashes` matching: a URL-based or an option-based
|
# hash in `hashes` matching: a URL-based or an option-based
|
||||||
# one; no internet-sourced hash will be in `hashes`.
|
# one; no internet-sourced hash will be in `hashes`.
|
||||||
|
@ -749,6 +759,7 @@ class PipXmlrpcTransport(xmlrpc_client.Transport):
|
||||||
"""Provide a `xmlrpclib.Transport` implementation via a `PipSession`
|
"""Provide a `xmlrpclib.Transport` implementation via a `PipSession`
|
||||||
object.
|
object.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, index_url, session, use_datetime=False):
|
def __init__(self, index_url, session, use_datetime=False):
|
||||||
xmlrpc_client.Transport.__init__(self, use_datetime)
|
xmlrpc_client.Transport.__init__(self, use_datetime)
|
||||||
index_parts = urllib_parse.urlparse(index_url)
|
index_parts = urllib_parse.urlparse(index_url)
|
||||||
|
|
|
@ -237,3 +237,8 @@ class HashMismatch(HashError):
|
||||||
self.gots[hash_name].hexdigest())
|
self.gots[hash_name].hexdigest())
|
||||||
prefix = ' or'
|
prefix = ' or'
|
||||||
return '\n'.join(lines)
|
return '\n'.join(lines)
|
||||||
|
|
||||||
|
|
||||||
|
class UnsupportedPythonVersion(InstallationError):
|
||||||
|
"""Unsupported python version according to Requires-Python package
|
||||||
|
metadata."""
|
||||||
|
|
|
@ -20,19 +20,22 @@ from pip.utils import (
|
||||||
cached_property, splitext, normalize_path,
|
cached_property, splitext, normalize_path,
|
||||||
ARCHIVE_EXTENSIONS, SUPPORTED_EXTENSIONS,
|
ARCHIVE_EXTENSIONS, SUPPORTED_EXTENSIONS,
|
||||||
)
|
)
|
||||||
from pip.utils.deprecation import RemovedInPip9Warning, RemovedInPip10Warning
|
from pip.utils.deprecation import RemovedInPip10Warning
|
||||||
from pip.utils.logging import indent_log
|
from pip.utils.logging import indent_log
|
||||||
|
from pip.utils.packaging import check_requires_python
|
||||||
from pip.exceptions import (
|
from pip.exceptions import (
|
||||||
DistributionNotFound, BestVersionAlreadyInstalled, InvalidWheelFilename,
|
DistributionNotFound, BestVersionAlreadyInstalled, InvalidWheelFilename,
|
||||||
UnsupportedWheel,
|
UnsupportedWheel,
|
||||||
)
|
)
|
||||||
from pip.download import HAS_TLS, is_url, path_to_url, url_to_path
|
from pip.download import HAS_TLS, is_url, path_to_url, url_to_path
|
||||||
from pip.wheel import Wheel, wheel_ext
|
from pip.wheel import Wheel, wheel_ext
|
||||||
from pip.pep425tags import supported_tags
|
from pip.pep425tags import get_supported
|
||||||
from pip._vendor import html5lib, requests, six
|
from pip._vendor import html5lib, requests, six
|
||||||
from pip._vendor.packaging.version import parse as parse_version
|
from pip._vendor.packaging.version import parse as parse_version
|
||||||
from pip._vendor.packaging.utils import canonicalize_name
|
from pip._vendor.packaging.utils import canonicalize_name
|
||||||
|
from pip._vendor.packaging import specifiers
|
||||||
from pip._vendor.requests.exceptions import SSLError
|
from pip._vendor.requests.exceptions import SSLError
|
||||||
|
from pip._vendor.distlib.compat import unescape
|
||||||
|
|
||||||
|
|
||||||
__all__ = ['FormatControl', 'fmt_ctl_handle_mutual_exclude', 'PackageFinder']
|
__all__ = ['FormatControl', 'fmt_ctl_handle_mutual_exclude', 'PackageFinder']
|
||||||
|
@ -104,12 +107,24 @@ class PackageFinder(object):
|
||||||
|
|
||||||
def __init__(self, find_links, index_urls, allow_all_prereleases=False,
|
def __init__(self, find_links, index_urls, allow_all_prereleases=False,
|
||||||
trusted_hosts=None, process_dependency_links=False,
|
trusted_hosts=None, process_dependency_links=False,
|
||||||
session=None, format_control=None):
|
session=None, format_control=None, platform=None,
|
||||||
|
versions=None, abi=None, implementation=None):
|
||||||
"""Create a PackageFinder.
|
"""Create a PackageFinder.
|
||||||
|
|
||||||
:param format_control: A FormatControl object or None. Used to control
|
:param format_control: A FormatControl object or None. Used to control
|
||||||
the selection of source packages / binary packages when consulting
|
the selection of source packages / binary packages when consulting
|
||||||
the index and links.
|
the index and links.
|
||||||
|
:param platform: A string or None. If None, searches for packages
|
||||||
|
that are supported by the current system. Otherwise, will find
|
||||||
|
packages that can be built on the platform passed in. These
|
||||||
|
packages will only be downloaded for distribution: they will
|
||||||
|
not be built locally.
|
||||||
|
:param versions: A list of strings or None. This is passed directly
|
||||||
|
to pep425tags.py in the get_supported() method.
|
||||||
|
:param abi: A string or None. This is passed directly
|
||||||
|
to pep425tags.py in the get_supported() method.
|
||||||
|
:param implementation: A string or None. This is passed directly
|
||||||
|
to pep425tags.py in the get_supported() method.
|
||||||
"""
|
"""
|
||||||
if session is None:
|
if session is None:
|
||||||
raise TypeError(
|
raise TypeError(
|
||||||
|
@ -153,6 +168,14 @@ class PackageFinder(object):
|
||||||
# The Session we'll use to make requests
|
# The Session we'll use to make requests
|
||||||
self.session = session
|
self.session = session
|
||||||
|
|
||||||
|
# The valid tags to check potential found wheel candidates against
|
||||||
|
self.valid_tags = get_supported(
|
||||||
|
versions=versions,
|
||||||
|
platform=platform,
|
||||||
|
abi=abi,
|
||||||
|
impl=implementation,
|
||||||
|
)
|
||||||
|
|
||||||
# If we don't have TLS enabled, then WARN if anyplace we're looking
|
# If we don't have TLS enabled, then WARN if anyplace we're looking
|
||||||
# relies on TLS.
|
# relies on TLS.
|
||||||
if not HAS_TLS:
|
if not HAS_TLS:
|
||||||
|
@ -175,7 +198,7 @@ class PackageFinder(object):
|
||||||
warnings.warn(
|
warnings.warn(
|
||||||
"Dependency Links processing has been deprecated and will be "
|
"Dependency Links processing has been deprecated and will be "
|
||||||
"removed in a future release.",
|
"removed in a future release.",
|
||||||
RemovedInPip9Warning,
|
RemovedInPip10Warning,
|
||||||
)
|
)
|
||||||
self.dependency_links.extend(links)
|
self.dependency_links.extend(links)
|
||||||
|
|
||||||
|
@ -236,22 +259,22 @@ class PackageFinder(object):
|
||||||
If not finding wheels, then sorted by version only.
|
If not finding wheels, then sorted by version only.
|
||||||
If finding wheels, then the sort order is by version, then:
|
If finding wheels, then the sort order is by version, then:
|
||||||
1. existing installs
|
1. existing installs
|
||||||
2. wheels ordered via Wheel.support_index_min()
|
2. wheels ordered via Wheel.support_index_min(self.valid_tags)
|
||||||
3. source archives
|
3. source archives
|
||||||
Note: it was considered to embed this logic into the Link
|
Note: it was considered to embed this logic into the Link
|
||||||
comparison operators, but then different sdist links
|
comparison operators, but then different sdist links
|
||||||
with the same version, would have to be considered equal
|
with the same version, would have to be considered equal
|
||||||
"""
|
"""
|
||||||
support_num = len(supported_tags)
|
support_num = len(self.valid_tags)
|
||||||
if candidate.location.is_wheel:
|
if candidate.location.is_wheel:
|
||||||
# can raise InvalidWheelFilename
|
# can raise InvalidWheelFilename
|
||||||
wheel = Wheel(candidate.location.filename)
|
wheel = Wheel(candidate.location.filename)
|
||||||
if not wheel.supported():
|
if not wheel.supported(self.valid_tags):
|
||||||
raise UnsupportedWheel(
|
raise UnsupportedWheel(
|
||||||
"%s is not a supported wheel for this platform. It "
|
"%s is not a supported wheel for this platform. It "
|
||||||
"can't be sorted." % wheel.filename
|
"can't be sorted." % wheel.filename
|
||||||
)
|
)
|
||||||
pri = -(wheel.support_index_min())
|
pri = -(wheel.support_index_min(self.valid_tags))
|
||||||
else: # sdist
|
else: # sdist
|
||||||
pri = -(support_num)
|
pri = -(support_num)
|
||||||
return (candidate.version, pri)
|
return (candidate.version, pri)
|
||||||
|
@ -335,7 +358,9 @@ class PackageFinder(object):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def mkurl_pypi_url(url):
|
def mkurl_pypi_url(url):
|
||||||
loc = posixpath.join(url, urllib_parse.quote(project_name.lower()))
|
loc = posixpath.join(
|
||||||
|
url,
|
||||||
|
urllib_parse.quote(canonicalize_name(project_name)))
|
||||||
# For maximum compatibility with easy_install, ensure the path
|
# For maximum compatibility with easy_install, ensure the path
|
||||||
# ends in a trailing slash. Although this isn't in the spec
|
# ends in a trailing slash. Although this isn't in the spec
|
||||||
# (and PyPI can handle it without the slash) some other index
|
# (and PyPI can handle it without the slash) some other index
|
||||||
|
@ -579,7 +604,6 @@ class PackageFinder(object):
|
||||||
|
|
||||||
def _link_package_versions(self, link, search):
|
def _link_package_versions(self, link, search):
|
||||||
"""Return an InstallationCandidate or None"""
|
"""Return an InstallationCandidate or None"""
|
||||||
|
|
||||||
version = None
|
version = None
|
||||||
if link.egg_fragment:
|
if link.egg_fragment:
|
||||||
egg_info = link.egg_fragment
|
egg_info = link.egg_fragment
|
||||||
|
@ -610,7 +634,8 @@ class PackageFinder(object):
|
||||||
self._log_skipped_link(
|
self._log_skipped_link(
|
||||||
link, 'wrong project name (not %s)' % search.supplied)
|
link, 'wrong project name (not %s)' % search.supplied)
|
||||||
return
|
return
|
||||||
if not wheel.supported():
|
|
||||||
|
if not wheel.supported(self.valid_tags):
|
||||||
self._log_skipped_link(
|
self._log_skipped_link(
|
||||||
link, 'it is not compatible with this Python')
|
link, 'it is not compatible with this Python')
|
||||||
return
|
return
|
||||||
|
@ -638,6 +663,18 @@ class PackageFinder(object):
|
||||||
self._log_skipped_link(
|
self._log_skipped_link(
|
||||||
link, 'Python version is incorrect')
|
link, 'Python version is incorrect')
|
||||||
return
|
return
|
||||||
|
try:
|
||||||
|
support_this_python = check_requires_python(link.requires_python)
|
||||||
|
except specifiers.InvalidSpecifier:
|
||||||
|
logger.debug("Package %s has an invalid Requires-Python entry: %s",
|
||||||
|
link.filename, link.requires_python)
|
||||||
|
support_this_python = True
|
||||||
|
|
||||||
|
if not support_this_python:
|
||||||
|
logger.debug("The package %s is incompatible with the python"
|
||||||
|
"version in use. Acceptable python versions are:%s",
|
||||||
|
link, link.requires_python)
|
||||||
|
return
|
||||||
logger.debug('Found link %s, version: %s', link, version)
|
logger.debug('Found link %s, version: %s', link, version)
|
||||||
|
|
||||||
return InstallationCandidate(search.supplied, version, link)
|
return InstallationCandidate(search.supplied, version, link)
|
||||||
|
@ -690,7 +727,7 @@ class HTMLPage(object):
|
||||||
self.content = content
|
self.content = content
|
||||||
self.parsed = html5lib.parse(
|
self.parsed = html5lib.parse(
|
||||||
self.content,
|
self.content,
|
||||||
encoding=encoding,
|
transport_encoding=encoding,
|
||||||
namespaceHTMLElements=False,
|
namespaceHTMLElements=False,
|
||||||
)
|
)
|
||||||
self.url = url
|
self.url = url
|
||||||
|
@ -826,7 +863,9 @@ class HTMLPage(object):
|
||||||
url = self.clean_link(
|
url = self.clean_link(
|
||||||
urllib_parse.urljoin(self.base_url, href)
|
urllib_parse.urljoin(self.base_url, href)
|
||||||
)
|
)
|
||||||
yield Link(url, self)
|
pyrequire = anchor.get('data-requires-python')
|
||||||
|
pyrequire = unescape(pyrequire) if pyrequire else None
|
||||||
|
yield Link(url, self, requires_python=pyrequire)
|
||||||
|
|
||||||
_clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I)
|
_clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I)
|
||||||
|
|
||||||
|
@ -840,7 +879,19 @@ class HTMLPage(object):
|
||||||
|
|
||||||
class Link(object):
|
class Link(object):
|
||||||
|
|
||||||
def __init__(self, url, comes_from=None):
|
def __init__(self, url, comes_from=None, requires_python=None):
|
||||||
|
"""
|
||||||
|
Object representing a parsed link from https://pypi.python.org/simple/*
|
||||||
|
|
||||||
|
url:
|
||||||
|
url of the resource pointed to (href of the link)
|
||||||
|
comes_from:
|
||||||
|
instance of HTMLPage where the link was found, or string.
|
||||||
|
requires_python:
|
||||||
|
String containing the `Requires-Python` metadata field, specified
|
||||||
|
in PEP 345. This may be specified by a data-requires-python
|
||||||
|
attribute in the HTML link tag, as described in PEP 503.
|
||||||
|
"""
|
||||||
|
|
||||||
# url can be a UNC windows share
|
# url can be a UNC windows share
|
||||||
if url.startswith('\\\\'):
|
if url.startswith('\\\\'):
|
||||||
|
@ -848,10 +899,15 @@ class Link(object):
|
||||||
|
|
||||||
self.url = url
|
self.url = url
|
||||||
self.comes_from = comes_from
|
self.comes_from = comes_from
|
||||||
|
self.requires_python = requires_python if requires_python else None
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
if self.requires_python:
|
||||||
|
rp = ' (requires-python:%s)' % self.requires_python
|
||||||
|
else:
|
||||||
|
rp = ''
|
||||||
if self.comes_from:
|
if self.comes_from:
|
||||||
return '%s (from %s)' % (self.url, self.comes_from)
|
return '%s (from %s)%s' % (self.url, self.comes_from, rp)
|
||||||
else:
|
else:
|
||||||
return str(self.url)
|
return str(self.url)
|
||||||
|
|
||||||
|
|
|
@ -73,7 +73,7 @@ else:
|
||||||
"The folder you are executing pip from can no longer be found."
|
"The folder you are executing pip from can no longer be found."
|
||||||
)
|
)
|
||||||
|
|
||||||
# under Mac OS X + virtualenv sys.prefix is not properly resolved
|
# under macOS + virtualenv sys.prefix is not properly resolved
|
||||||
# it is something like /path/to/python/bin/..
|
# it is something like /path/to/python/bin/..
|
||||||
# Note: using realpath due to tmp dirs on OSX being symlinks
|
# Note: using realpath due to tmp dirs on OSX being symlinks
|
||||||
src_prefix = os.path.abspath(src_prefix)
|
src_prefix = os.path.abspath(src_prefix)
|
||||||
|
@ -110,7 +110,7 @@ else:
|
||||||
config_basename,
|
config_basename,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Forcing to use /usr/local/bin for standard Mac OS X framework installs
|
# Forcing to use /usr/local/bin for standard macOS framework installs
|
||||||
# Also log to ~/Library/Logs/ for use with the Console.app log viewer
|
# Also log to ~/Library/Logs/ for use with the Console.app log viewer
|
||||||
if sys.platform[:6] == 'darwin' and sys.prefix[:16] == '/System/Library/':
|
if sys.platform[:6] == 'darwin' and sys.prefix[:16] == '/System/Library/':
|
||||||
bin_py = '/usr/local/bin'
|
bin_py = '/usr/local/bin'
|
||||||
|
|
49
lib/python3.4/site-packages/pip/operations/check.py
Normal file
49
lib/python3.4/site-packages/pip/operations/check.py
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
|
||||||
|
|
||||||
|
def check_requirements(installed_dists):
|
||||||
|
missing_reqs_dict = {}
|
||||||
|
incompatible_reqs_dict = {}
|
||||||
|
|
||||||
|
for dist in installed_dists:
|
||||||
|
key = '%s==%s' % (dist.project_name, dist.version)
|
||||||
|
|
||||||
|
missing_reqs = list(get_missing_reqs(dist, installed_dists))
|
||||||
|
if missing_reqs:
|
||||||
|
missing_reqs_dict[key] = missing_reqs
|
||||||
|
|
||||||
|
incompatible_reqs = list(get_incompatible_reqs(
|
||||||
|
dist, installed_dists))
|
||||||
|
if incompatible_reqs:
|
||||||
|
incompatible_reqs_dict[key] = incompatible_reqs
|
||||||
|
|
||||||
|
return (missing_reqs_dict, incompatible_reqs_dict)
|
||||||
|
|
||||||
|
|
||||||
|
def get_missing_reqs(dist, installed_dists):
|
||||||
|
"""Return all of the requirements of `dist` that aren't present in
|
||||||
|
`installed_dists`.
|
||||||
|
|
||||||
|
"""
|
||||||
|
installed_names = set(d.project_name.lower() for d in installed_dists)
|
||||||
|
missing_requirements = set()
|
||||||
|
|
||||||
|
for requirement in dist.requires():
|
||||||
|
if requirement.project_name.lower() not in installed_names:
|
||||||
|
missing_requirements.add(requirement)
|
||||||
|
yield requirement
|
||||||
|
|
||||||
|
|
||||||
|
def get_incompatible_reqs(dist, installed_dists):
|
||||||
|
"""Return all of the requirements of `dist` that are present in
|
||||||
|
`installed_dists`, but have incompatible versions.
|
||||||
|
|
||||||
|
"""
|
||||||
|
installed_dists_by_name = {}
|
||||||
|
for installed_dist in installed_dists:
|
||||||
|
installed_dists_by_name[installed_dist.project_name] = installed_dist
|
||||||
|
|
||||||
|
for requirement in dist.requires():
|
||||||
|
present_dist = installed_dists_by_name.get(requirement.project_name)
|
||||||
|
|
||||||
|
if present_dist and present_dist not in requirement:
|
||||||
|
yield (requirement, present_dist)
|
|
@ -5,9 +5,11 @@ import re
|
||||||
|
|
||||||
import pip
|
import pip
|
||||||
from pip.req import InstallRequirement
|
from pip.req import InstallRequirement
|
||||||
|
from pip.req.req_file import COMMENT_RE
|
||||||
from pip.utils import get_installed_distributions
|
from pip.utils import get_installed_distributions
|
||||||
from pip._vendor import pkg_resources
|
from pip._vendor import pkg_resources
|
||||||
from pip._vendor.packaging.utils import canonicalize_name
|
from pip._vendor.packaging.utils import canonicalize_name
|
||||||
|
from pip._vendor.pkg_resources import RequirementParseError
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
@ -42,14 +44,27 @@ def freeze(
|
||||||
for dist in get_installed_distributions(local_only=local_only,
|
for dist in get_installed_distributions(local_only=local_only,
|
||||||
skip=(),
|
skip=(),
|
||||||
user_only=user_only):
|
user_only=user_only):
|
||||||
|
try:
|
||||||
req = pip.FrozenRequirement.from_dist(
|
req = pip.FrozenRequirement.from_dist(
|
||||||
dist,
|
dist,
|
||||||
dependency_links
|
dependency_links
|
||||||
)
|
)
|
||||||
|
except RequirementParseError:
|
||||||
|
logger.warning(
|
||||||
|
"Could not parse requirement: %s",
|
||||||
|
dist.project_name
|
||||||
|
)
|
||||||
|
continue
|
||||||
installations[req.name] = req
|
installations[req.name] = req
|
||||||
|
|
||||||
if requirement:
|
if requirement:
|
||||||
with open(requirement) as req_file:
|
# the options that don't get turned into an InstallRequirement
|
||||||
|
# should only be emitted once, even if the same option is in multiple
|
||||||
|
# requirements files, so we need to keep track of what has been emitted
|
||||||
|
# so that we don't emit it again if it's seen again
|
||||||
|
emitted_options = set()
|
||||||
|
for req_file_path in requirement:
|
||||||
|
with open(req_file_path) as req_file:
|
||||||
for line in req_file:
|
for line in req_file:
|
||||||
if (not line.strip() or
|
if (not line.strip() or
|
||||||
line.strip().startswith('#') or
|
line.strip().startswith('#') or
|
||||||
|
@ -63,7 +78,10 @@ def freeze(
|
||||||
'--trusted-host',
|
'--trusted-host',
|
||||||
'--process-dependency-links',
|
'--process-dependency-links',
|
||||||
'--extra-index-url'))):
|
'--extra-index-url'))):
|
||||||
yield line.rstrip()
|
line = line.rstrip()
|
||||||
|
if line not in emitted_options:
|
||||||
|
emitted_options.add(line)
|
||||||
|
yield line
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if line.startswith('-e') or line.startswith('--editable'):
|
if line.startswith('-e') or line.startswith('--editable'):
|
||||||
|
@ -79,16 +97,16 @@ def freeze(
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
line_req = InstallRequirement.from_line(
|
line_req = InstallRequirement.from_line(
|
||||||
line,
|
COMMENT_RE.sub('', line).strip(),
|
||||||
isolated=isolated,
|
isolated=isolated,
|
||||||
wheel_cache=wheel_cache,
|
wheel_cache=wheel_cache,
|
||||||
)
|
)
|
||||||
|
|
||||||
if not line_req.name:
|
if not line_req.name:
|
||||||
logger.info(
|
logger.info(
|
||||||
"Skipping line because it's not clear what it "
|
"Skipping line in requirement file [%s] because "
|
||||||
"would install: %s",
|
"it's not clear what it would install: %s",
|
||||||
line.strip(),
|
req_file_path, line.strip(),
|
||||||
)
|
)
|
||||||
logger.info(
|
logger.info(
|
||||||
" (add #egg=PackageName to the URL to avoid"
|
" (add #egg=PackageName to the URL to avoid"
|
||||||
|
@ -96,9 +114,9 @@ def freeze(
|
||||||
)
|
)
|
||||||
elif line_req.name not in installations:
|
elif line_req.name not in installations:
|
||||||
logger.warning(
|
logger.warning(
|
||||||
"Requirement file contains %s, but that package is"
|
"Requirement file [%s] contains %s, but that "
|
||||||
" not installed",
|
"package is not installed",
|
||||||
line.strip(),
|
req_file_path, COMMENT_RE.sub('', line).strip(),
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
yield str(installations[line_req.name]).rstrip()
|
yield str(installations[line_req.name]).rstrip()
|
||||||
|
|
|
@ -6,7 +6,6 @@ import sys
|
||||||
import warnings
|
import warnings
|
||||||
import platform
|
import platform
|
||||||
import logging
|
import logging
|
||||||
import ctypes
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import sysconfig
|
import sysconfig
|
||||||
|
@ -16,7 +15,7 @@ except ImportError: # pragma nocover
|
||||||
import distutils.util
|
import distutils.util
|
||||||
|
|
||||||
from pip.compat import OrderedDict
|
from pip.compat import OrderedDict
|
||||||
|
import pip.utils.glibc
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -125,7 +124,7 @@ def get_platform():
|
||||||
if sys.platform == 'darwin':
|
if sys.platform == 'darwin':
|
||||||
# distutils.util.get_platform() returns the release based on the value
|
# distutils.util.get_platform() returns the release based on the value
|
||||||
# of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may
|
# of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may
|
||||||
# be signficantly older than the user's current machine.
|
# be significantly older than the user's current machine.
|
||||||
release, _, machine = platform.mac_ver()
|
release, _, machine = platform.mac_ver()
|
||||||
split_ver = release.split('.')
|
split_ver = release.split('.')
|
||||||
|
|
||||||
|
@ -160,46 +159,17 @@ def is_manylinux1_compatible():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Check glibc version. CentOS 5 uses glibc 2.5.
|
# Check glibc version. CentOS 5 uses glibc 2.5.
|
||||||
return have_compatible_glibc(2, 5)
|
return pip.utils.glibc.have_compatible_glibc(2, 5)
|
||||||
|
|
||||||
|
|
||||||
def have_compatible_glibc(major, minimum_minor):
|
|
||||||
# ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen
|
|
||||||
# manpage says, "If filename is NULL, then the returned handle is for the
|
|
||||||
# main program". This way we can let the linker do the work to figure out
|
|
||||||
# which libc our process is actually using.
|
|
||||||
process_namespace = ctypes.CDLL(None)
|
|
||||||
try:
|
|
||||||
gnu_get_libc_version = process_namespace.gnu_get_libc_version
|
|
||||||
except AttributeError:
|
|
||||||
# Symbol doesn't exist -> therefore, we are not linked to
|
|
||||||
# glibc.
|
|
||||||
return False
|
|
||||||
|
|
||||||
# Call gnu_get_libc_version, which returns a string like "2.5".
|
|
||||||
gnu_get_libc_version.restype = ctypes.c_char_p
|
|
||||||
version_str = gnu_get_libc_version()
|
|
||||||
# py2 / py3 compatibility:
|
|
||||||
if not isinstance(version_str, str):
|
|
||||||
version_str = version_str.decode("ascii")
|
|
||||||
|
|
||||||
# Parse string and check against requested version.
|
|
||||||
version = [int(piece) for piece in version_str.split(".")]
|
|
||||||
if len(version) < 2:
|
|
||||||
warnings.warn("Expected glibc version with 2 components major.minor,"
|
|
||||||
" got: %s" % version_str, RuntimeWarning)
|
|
||||||
return False
|
|
||||||
return version[0] == major and version[1] >= minimum_minor
|
|
||||||
|
|
||||||
|
|
||||||
def get_darwin_arches(major, minor, machine):
|
def get_darwin_arches(major, minor, machine):
|
||||||
"""Return a list of supported arches (including group arches) for
|
"""Return a list of supported arches (including group arches) for
|
||||||
the given major, minor and machine architecture of an OS X machine.
|
the given major, minor and machine architecture of an macOS machine.
|
||||||
"""
|
"""
|
||||||
arches = []
|
arches = []
|
||||||
|
|
||||||
def _supports_arch(major, minor, arch):
|
def _supports_arch(major, minor, arch):
|
||||||
# Looking at the application support for OS X versions in the chart
|
# Looking at the application support for macOS versions in the chart
|
||||||
# provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears
|
# provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears
|
||||||
# our timeline looks roughly like:
|
# our timeline looks roughly like:
|
||||||
#
|
#
|
||||||
|
@ -253,12 +223,19 @@ def get_darwin_arches(major, minor, machine):
|
||||||
return arches
|
return arches
|
||||||
|
|
||||||
|
|
||||||
def get_supported(versions=None, noarch=False):
|
def get_supported(versions=None, noarch=False, platform=None,
|
||||||
|
impl=None, abi=None):
|
||||||
"""Return a list of supported tags for each version specified in
|
"""Return a list of supported tags for each version specified in
|
||||||
`versions`.
|
`versions`.
|
||||||
|
|
||||||
:param versions: a list of string versions, of the form ["33", "32"],
|
:param versions: a list of string versions, of the form ["33", "32"],
|
||||||
or None. The first version will be assumed to support our ABI.
|
or None. The first version will be assumed to support our ABI.
|
||||||
|
:param platform: specify the exact platform you want valid
|
||||||
|
tags for, or None. If None, use the local system platform.
|
||||||
|
:param impl: specify the exact implementation you want valid
|
||||||
|
tags for, or None. If None, use the local interpreter impl.
|
||||||
|
:param abi: specify the exact abi you want valid
|
||||||
|
tags for, or None. If None, use the local interpreter abi.
|
||||||
"""
|
"""
|
||||||
supported = []
|
supported = []
|
||||||
|
|
||||||
|
@ -271,11 +248,11 @@ def get_supported(versions=None, noarch=False):
|
||||||
for minor in range(version_info[-1], -1, -1):
|
for minor in range(version_info[-1], -1, -1):
|
||||||
versions.append(''.join(map(str, major + (minor,))))
|
versions.append(''.join(map(str, major + (minor,))))
|
||||||
|
|
||||||
impl = get_abbr_impl()
|
impl = impl or get_abbr_impl()
|
||||||
|
|
||||||
abis = []
|
abis = []
|
||||||
|
|
||||||
abi = get_abi_tag()
|
abi = abi or get_abi_tag()
|
||||||
if abi:
|
if abi:
|
||||||
abis[0:0] = [abi]
|
abis[0:0] = [abi]
|
||||||
|
|
||||||
|
@ -290,8 +267,8 @@ def get_supported(versions=None, noarch=False):
|
||||||
abis.append('none')
|
abis.append('none')
|
||||||
|
|
||||||
if not noarch:
|
if not noarch:
|
||||||
arch = get_platform()
|
arch = platform or get_platform()
|
||||||
if sys.platform == 'darwin':
|
if arch.startswith('macosx'):
|
||||||
# support macosx-10.6-intel on macosx-10.9-x86_64
|
# support macosx-10.6-intel on macosx-10.9-x86_64
|
||||||
match = _osx_arch_pat.match(arch)
|
match = _osx_arch_pat.match(arch)
|
||||||
if match:
|
if match:
|
||||||
|
@ -304,7 +281,7 @@ def get_supported(versions=None, noarch=False):
|
||||||
else:
|
else:
|
||||||
# arch pattern didn't match (?!)
|
# arch pattern didn't match (?!)
|
||||||
arches = [arch]
|
arches = [arch]
|
||||||
elif is_manylinux1_compatible():
|
elif platform is None and is_manylinux1_compatible():
|
||||||
arches = [arch.replace('linux', 'manylinux1'), arch]
|
arches = [arch.replace('linux', 'manylinux1'), arch]
|
||||||
else:
|
else:
|
||||||
arches = [arch]
|
arches = [arch]
|
||||||
|
@ -314,6 +291,15 @@ def get_supported(versions=None, noarch=False):
|
||||||
for arch in arches:
|
for arch in arches:
|
||||||
supported.append(('%s%s' % (impl, versions[0]), abi, arch))
|
supported.append(('%s%s' % (impl, versions[0]), abi, arch))
|
||||||
|
|
||||||
|
# abi3 modules compatible with older version of Python
|
||||||
|
for version in versions[1:]:
|
||||||
|
# abi3 was introduced in Python 3.2
|
||||||
|
if version in ('31', '30'):
|
||||||
|
break
|
||||||
|
for abi in abi3s: # empty set if not Python 3
|
||||||
|
for arch in arches:
|
||||||
|
supported.append(("%s%s" % (impl, version), abi, arch))
|
||||||
|
|
||||||
# Has binaries, does not use the Python API:
|
# Has binaries, does not use the Python API:
|
||||||
for arch in arches:
|
for arch in arches:
|
||||||
supported.append(('py%s' % (versions[0][0]), 'none', arch))
|
supported.append(('py%s' % (versions[0][0]), 'none', arch))
|
||||||
|
|
|
@ -135,7 +135,7 @@ def process_line(line, filename, line_number, finder=None, comes_from=None,
|
||||||
defaults.format_control = finder.format_control
|
defaults.format_control = finder.format_control
|
||||||
args_str, options_str = break_args_options(line)
|
args_str, options_str = break_args_options(line)
|
||||||
if sys.version_info < (2, 7, 3):
|
if sys.version_info < (2, 7, 3):
|
||||||
# Priori to 2.7.3, shlex can not deal with unicode entries
|
# Prior to 2.7.3, shlex cannot deal with unicode entries
|
||||||
options_str = options_str.encode('utf8')
|
options_str = options_str.encode('utf8')
|
||||||
opts, _ = parser.parse_args(shlex.split(options_str), defaults)
|
opts, _ = parser.parse_args(shlex.split(options_str), defaults)
|
||||||
|
|
||||||
|
|
|
@ -15,9 +15,11 @@ from distutils.util import change_root
|
||||||
from email.parser import FeedParser
|
from email.parser import FeedParser
|
||||||
|
|
||||||
from pip._vendor import pkg_resources, six
|
from pip._vendor import pkg_resources, six
|
||||||
from pip._vendor.distlib.markers import interpret as markers_interpret
|
|
||||||
from pip._vendor.packaging import specifiers
|
from pip._vendor.packaging import specifiers
|
||||||
|
from pip._vendor.packaging.markers import Marker
|
||||||
|
from pip._vendor.packaging.requirements import InvalidRequirement, Requirement
|
||||||
from pip._vendor.packaging.utils import canonicalize_name
|
from pip._vendor.packaging.utils import canonicalize_name
|
||||||
|
from pip._vendor.packaging.version import Version, parse as parse_version
|
||||||
from pip._vendor.six.moves import configparser
|
from pip._vendor.six.moves import configparser
|
||||||
|
|
||||||
import pip.wheel
|
import pip.wheel
|
||||||
|
@ -25,7 +27,7 @@ import pip.wheel
|
||||||
from pip.compat import native_str, get_stdlib, WINDOWS
|
from pip.compat import native_str, get_stdlib, WINDOWS
|
||||||
from pip.download import is_url, url_to_path, path_to_url, is_archive_file
|
from pip.download import is_url, url_to_path, path_to_url, is_archive_file
|
||||||
from pip.exceptions import (
|
from pip.exceptions import (
|
||||||
InstallationError, UninstallationError, UnsupportedWheel,
|
InstallationError, UninstallationError,
|
||||||
)
|
)
|
||||||
from pip.locations import (
|
from pip.locations import (
|
||||||
bin_py, running_under_virtualenv, PIP_DELETE_MARKER_FILENAME, bin_user,
|
bin_py, running_under_virtualenv, PIP_DELETE_MARKER_FILENAME, bin_user,
|
||||||
|
@ -38,14 +40,13 @@ from pip.utils import (
|
||||||
)
|
)
|
||||||
|
|
||||||
from pip.utils.hashes import Hashes
|
from pip.utils.hashes import Hashes
|
||||||
from pip.utils.deprecation import RemovedInPip9Warning, RemovedInPip10Warning
|
from pip.utils.deprecation import RemovedInPip10Warning
|
||||||
from pip.utils.logging import indent_log
|
from pip.utils.logging import indent_log
|
||||||
from pip.utils.setuptools_build import SETUPTOOLS_SHIM
|
from pip.utils.setuptools_build import SETUPTOOLS_SHIM
|
||||||
from pip.utils.ui import open_spinner
|
from pip.utils.ui import open_spinner
|
||||||
from pip.req.req_uninstall import UninstallPathSet
|
from pip.req.req_uninstall import UninstallPathSet
|
||||||
from pip.vcs import vcs
|
from pip.vcs import vcs
|
||||||
from pip.wheel import move_wheel_files, Wheel
|
from pip.wheel import move_wheel_files, Wheel
|
||||||
from pip._vendor.packaging.version import Version
|
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
@ -65,6 +66,10 @@ def _strip_extras(path):
|
||||||
return path_no_extras, extras
|
return path_no_extras, extras
|
||||||
|
|
||||||
|
|
||||||
|
def _safe_extras(extras):
|
||||||
|
return set(pkg_resources.safe_extra(extra) for extra in extras)
|
||||||
|
|
||||||
|
|
||||||
class InstallRequirement(object):
|
class InstallRequirement(object):
|
||||||
|
|
||||||
def __init__(self, req, comes_from, source_dir=None, editable=False,
|
def __init__(self, req, comes_from, source_dir=None, editable=False,
|
||||||
|
@ -74,8 +79,8 @@ class InstallRequirement(object):
|
||||||
self.extras = ()
|
self.extras = ()
|
||||||
if isinstance(req, six.string_types):
|
if isinstance(req, six.string_types):
|
||||||
try:
|
try:
|
||||||
req = pkg_resources.Requirement.parse(req)
|
req = Requirement(req)
|
||||||
except pkg_resources.RequirementParseError:
|
except InvalidRequirement:
|
||||||
if os.path.sep in req:
|
if os.path.sep in req:
|
||||||
add_msg = "It looks like a path. Does it exist ?"
|
add_msg = "It looks like a path. Does it exist ?"
|
||||||
elif '=' in req and not any(op in req for op in operators):
|
elif '=' in req and not any(op in req for op in operators):
|
||||||
|
@ -84,7 +89,7 @@ class InstallRequirement(object):
|
||||||
add_msg = traceback.format_exc()
|
add_msg = traceback.format_exc()
|
||||||
raise InstallationError(
|
raise InstallationError(
|
||||||
"Invalid requirement: '%s'\n%s" % (req, add_msg))
|
"Invalid requirement: '%s'\n%s" % (req, add_msg))
|
||||||
self.extras = req.extras
|
self.extras = _safe_extras(req.extras)
|
||||||
|
|
||||||
self.req = req
|
self.req = req
|
||||||
self.comes_from = comes_from
|
self.comes_from = comes_from
|
||||||
|
@ -95,7 +100,10 @@ class InstallRequirement(object):
|
||||||
self._wheel_cache = wheel_cache
|
self._wheel_cache = wheel_cache
|
||||||
self.link = self.original_link = link
|
self.link = self.original_link = link
|
||||||
self.as_egg = as_egg
|
self.as_egg = as_egg
|
||||||
|
if markers is not None:
|
||||||
self.markers = markers
|
self.markers = markers
|
||||||
|
else:
|
||||||
|
self.markers = req and req.marker
|
||||||
self._egg_info_path = None
|
self._egg_info_path = None
|
||||||
# This holds the pkg_resources.Distribution object if this requirement
|
# This holds the pkg_resources.Distribution object if this requirement
|
||||||
# is already available:
|
# is already available:
|
||||||
|
@ -148,7 +156,7 @@ class InstallRequirement(object):
|
||||||
wheel_cache=wheel_cache)
|
wheel_cache=wheel_cache)
|
||||||
|
|
||||||
if extras_override is not None:
|
if extras_override is not None:
|
||||||
res.extras = extras_override
|
res.extras = _safe_extras(extras_override)
|
||||||
|
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
@ -170,6 +178,8 @@ class InstallRequirement(object):
|
||||||
markers = markers.strip()
|
markers = markers.strip()
|
||||||
if not markers:
|
if not markers:
|
||||||
markers = None
|
markers = None
|
||||||
|
else:
|
||||||
|
markers = Marker(markers)
|
||||||
else:
|
else:
|
||||||
markers = None
|
markers = None
|
||||||
name = name.strip()
|
name = name.strip()
|
||||||
|
@ -209,11 +219,6 @@ class InstallRequirement(object):
|
||||||
# wheel file
|
# wheel file
|
||||||
if link.is_wheel:
|
if link.is_wheel:
|
||||||
wheel = Wheel(link.filename) # can raise InvalidWheelFilename
|
wheel = Wheel(link.filename) # can raise InvalidWheelFilename
|
||||||
if not wheel.supported():
|
|
||||||
raise UnsupportedWheel(
|
|
||||||
"%s is not a supported wheel on this platform." %
|
|
||||||
wheel.filename
|
|
||||||
)
|
|
||||||
req = "%s==%s" % (wheel.name, wheel.version)
|
req = "%s==%s" % (wheel.name, wheel.version)
|
||||||
else:
|
else:
|
||||||
# set the req to the egg fragment. when it's not there, this
|
# set the req to the egg fragment. when it's not there, this
|
||||||
|
@ -230,8 +235,8 @@ class InstallRequirement(object):
|
||||||
wheel_cache=wheel_cache, constraint=constraint)
|
wheel_cache=wheel_cache, constraint=constraint)
|
||||||
|
|
||||||
if extras:
|
if extras:
|
||||||
res.extras = pkg_resources.Requirement.parse('__placeholder__' +
|
res.extras = _safe_extras(
|
||||||
extras).extras
|
Requirement('placeholder' + extras).extras)
|
||||||
|
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
@ -312,7 +317,12 @@ class InstallRequirement(object):
|
||||||
# package is not available yet so we create a temp directory
|
# package is not available yet so we create a temp directory
|
||||||
# Once run_egg_info will have run, we'll be able
|
# Once run_egg_info will have run, we'll be able
|
||||||
# to fix it via _correct_build_location
|
# to fix it via _correct_build_location
|
||||||
self._temp_build_dir = tempfile.mkdtemp('-build', 'pip-')
|
# Some systems have /tmp as a symlink which confuses custom
|
||||||
|
# builds (such as numpy). Thus, we ensure that the real path
|
||||||
|
# is returned.
|
||||||
|
self._temp_build_dir = os.path.realpath(
|
||||||
|
tempfile.mkdtemp('-build', 'pip-')
|
||||||
|
)
|
||||||
self._ideal_build_dir = build_dir
|
self._ideal_build_dir = build_dir
|
||||||
return self._temp_build_dir
|
return self._temp_build_dir
|
||||||
if self.editable:
|
if self.editable:
|
||||||
|
@ -362,7 +372,7 @@ class InstallRequirement(object):
|
||||||
def name(self):
|
def name(self):
|
||||||
if self.req is None:
|
if self.req is None:
|
||||||
return None
|
return None
|
||||||
return native_str(self.req.project_name)
|
return native_str(pkg_resources.safe_name(self.req.name))
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def setup_py_dir(self):
|
def setup_py_dir(self):
|
||||||
|
@ -426,33 +436,31 @@ class InstallRequirement(object):
|
||||||
egg_info_cmd + egg_base_option,
|
egg_info_cmd + egg_base_option,
|
||||||
cwd=self.setup_py_dir,
|
cwd=self.setup_py_dir,
|
||||||
show_stdout=False,
|
show_stdout=False,
|
||||||
command_level=logging.DEBUG,
|
|
||||||
command_desc='python setup.py egg_info')
|
command_desc='python setup.py egg_info')
|
||||||
|
|
||||||
if not self.req:
|
if not self.req:
|
||||||
if isinstance(
|
if isinstance(parse_version(self.pkg_info()["Version"]), Version):
|
||||||
pkg_resources.parse_version(self.pkg_info()["Version"]),
|
|
||||||
Version):
|
|
||||||
op = "=="
|
op = "=="
|
||||||
else:
|
else:
|
||||||
op = "==="
|
op = "==="
|
||||||
self.req = pkg_resources.Requirement.parse(
|
self.req = Requirement(
|
||||||
"".join([
|
"".join([
|
||||||
self.pkg_info()["Name"],
|
self.pkg_info()["Name"],
|
||||||
op,
|
op,
|
||||||
self.pkg_info()["Version"],
|
self.pkg_info()["Version"],
|
||||||
]))
|
])
|
||||||
|
)
|
||||||
self._correct_build_location()
|
self._correct_build_location()
|
||||||
else:
|
else:
|
||||||
metadata_name = canonicalize_name(self.pkg_info()["Name"])
|
metadata_name = canonicalize_name(self.pkg_info()["Name"])
|
||||||
if canonicalize_name(self.req.project_name) != metadata_name:
|
if canonicalize_name(self.req.name) != metadata_name:
|
||||||
logger.warning(
|
logger.warning(
|
||||||
'Running setup.py (path:%s) egg_info for package %s '
|
'Running setup.py (path:%s) egg_info for package %s '
|
||||||
'produced metadata for project name %s. Fix your '
|
'produced metadata for project name %s. Fix your '
|
||||||
'#egg=%s fragments.',
|
'#egg=%s fragments.',
|
||||||
self.setup_py, self.name, metadata_name, self.name
|
self.setup_py, self.name, metadata_name, self.name
|
||||||
)
|
)
|
||||||
self.req = pkg_resources.Requirement.parse(metadata_name)
|
self.req = Requirement(metadata_name)
|
||||||
|
|
||||||
def egg_info_data(self, filename):
|
def egg_info_data(self, filename):
|
||||||
if self.satisfied_by is not None:
|
if self.satisfied_by is not None:
|
||||||
|
@ -486,7 +494,7 @@ class InstallRequirement(object):
|
||||||
# Don't search in anything that looks like a virtualenv
|
# Don't search in anything that looks like a virtualenv
|
||||||
# environment
|
# environment
|
||||||
if (
|
if (
|
||||||
os.path.exists(
|
os.path.lexists(
|
||||||
os.path.join(root, dir, 'bin', 'python')
|
os.path.join(root, dir, 'bin', 'python')
|
||||||
) or
|
) or
|
||||||
os.path.exists(
|
os.path.exists(
|
||||||
|
@ -540,7 +548,7 @@ class InstallRequirement(object):
|
||||||
def assert_source_matches_version(self):
|
def assert_source_matches_version(self):
|
||||||
assert self.source_dir
|
assert self.source_dir
|
||||||
version = self.pkg_info()['version']
|
version = self.pkg_info()['version']
|
||||||
if version not in self.req:
|
if self.req.specifier and version not in self.req.specifier:
|
||||||
logger.warning(
|
logger.warning(
|
||||||
'Requested %s, but installing version %s',
|
'Requested %s, but installing version %s',
|
||||||
self,
|
self,
|
||||||
|
@ -682,6 +690,10 @@ class InstallRequirement(object):
|
||||||
'easy-install.pth')
|
'easy-install.pth')
|
||||||
paths_to_remove.add_pth(easy_install_pth, './' + easy_install_egg)
|
paths_to_remove.add_pth(easy_install_pth, './' + easy_install_egg)
|
||||||
|
|
||||||
|
elif egg_info_exists and dist.egg_info.endswith('.dist-info'):
|
||||||
|
for path in pip.wheel.uninstallation_paths(dist):
|
||||||
|
paths_to_remove.add(path)
|
||||||
|
|
||||||
elif develop_egg_link:
|
elif develop_egg_link:
|
||||||
# develop egg
|
# develop egg
|
||||||
with open(develop_egg_link, 'r') as fh:
|
with open(develop_egg_link, 'r') as fh:
|
||||||
|
@ -695,10 +707,6 @@ class InstallRequirement(object):
|
||||||
'easy-install.pth')
|
'easy-install.pth')
|
||||||
paths_to_remove.add_pth(easy_install_pth, dist.location)
|
paths_to_remove.add_pth(easy_install_pth, dist.location)
|
||||||
|
|
||||||
elif egg_info_exists and dist.egg_info.endswith('.dist-info'):
|
|
||||||
for path in pip.wheel.uninstallation_paths(dist):
|
|
||||||
paths_to_remove.add(path)
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
logger.debug(
|
logger.debug(
|
||||||
'Not sure how to uninstall: %s - Check: %s',
|
'Not sure how to uninstall: %s - Check: %s',
|
||||||
|
@ -769,8 +777,8 @@ class InstallRequirement(object):
|
||||||
archive_path = os.path.join(build_dir, archive_name)
|
archive_path = os.path.join(build_dir, archive_name)
|
||||||
if os.path.exists(archive_path):
|
if os.path.exists(archive_path):
|
||||||
response = ask_path_exists(
|
response = ask_path_exists(
|
||||||
'The file %s exists. (i)gnore, (w)ipe, (b)ackup ' %
|
'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)bort ' %
|
||||||
display_path(archive_path), ('i', 'w', 'b'))
|
display_path(archive_path), ('i', 'w', 'b', 'a'))
|
||||||
if response == 'i':
|
if response == 'i':
|
||||||
create_archive = False
|
create_archive = False
|
||||||
elif response == 'w':
|
elif response == 'w':
|
||||||
|
@ -784,6 +792,8 @@ class InstallRequirement(object):
|
||||||
display_path(dest_file),
|
display_path(dest_file),
|
||||||
)
|
)
|
||||||
shutil.move(archive_path, dest_file)
|
shutil.move(archive_path, dest_file)
|
||||||
|
elif response == 'a':
|
||||||
|
sys.exit(-1)
|
||||||
if create_archive:
|
if create_archive:
|
||||||
zip = zipfile.ZipFile(
|
zip = zipfile.ZipFile(
|
||||||
archive_path, 'w', zipfile.ZIP_DEFLATED,
|
archive_path, 'w', zipfile.ZIP_DEFLATED,
|
||||||
|
@ -816,9 +826,15 @@ class InstallRequirement(object):
|
||||||
name = name.replace(os.path.sep, '/')
|
name = name.replace(os.path.sep, '/')
|
||||||
return name
|
return name
|
||||||
|
|
||||||
def match_markers(self):
|
def match_markers(self, extras_requested=None):
|
||||||
|
if not extras_requested:
|
||||||
|
# Provide an extra to safely evaluate the markers
|
||||||
|
# without matching any extra
|
||||||
|
extras_requested = ('',)
|
||||||
if self.markers is not None:
|
if self.markers is not None:
|
||||||
return markers_interpret(self.markers)
|
return any(
|
||||||
|
self.markers.evaluate({'extra': extra})
|
||||||
|
for extra in extras_requested)
|
||||||
else:
|
else:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@ -850,30 +866,8 @@ class InstallRequirement(object):
|
||||||
temp_location = tempfile.mkdtemp('-record', 'pip-')
|
temp_location = tempfile.mkdtemp('-record', 'pip-')
|
||||||
record_filename = os.path.join(temp_location, 'install-record.txt')
|
record_filename = os.path.join(temp_location, 'install-record.txt')
|
||||||
try:
|
try:
|
||||||
install_args = [sys.executable, "-u"]
|
install_args = self.get_install_args(
|
||||||
install_args.append('-c')
|
global_options, record_filename, root, prefix)
|
||||||
install_args.append(SETUPTOOLS_SHIM % self.setup_py)
|
|
||||||
install_args += list(global_options) + \
|
|
||||||
['install', '--record', record_filename]
|
|
||||||
|
|
||||||
if not self.as_egg:
|
|
||||||
install_args += ['--single-version-externally-managed']
|
|
||||||
|
|
||||||
if root is not None:
|
|
||||||
install_args += ['--root', root]
|
|
||||||
if prefix is not None:
|
|
||||||
install_args += ['--prefix', prefix]
|
|
||||||
|
|
||||||
if self.pycompile:
|
|
||||||
install_args += ["--compile"]
|
|
||||||
else:
|
|
||||||
install_args += ["--no-compile"]
|
|
||||||
|
|
||||||
if running_under_virtualenv():
|
|
||||||
py_ver_str = 'python' + sysconfig.get_python_version()
|
|
||||||
install_args += ['--install-headers',
|
|
||||||
os.path.join(sys.prefix, 'include', 'site',
|
|
||||||
py_ver_str, self.name)]
|
|
||||||
msg = 'Running setup.py install for %s' % (self.name,)
|
msg = 'Running setup.py install for %s' % (self.name,)
|
||||||
with open_spinner(msg) as spinner:
|
with open_spinner(msg) as spinner:
|
||||||
with indent_log():
|
with indent_log():
|
||||||
|
@ -946,6 +940,34 @@ class InstallRequirement(object):
|
||||||
self.source_dir = self.build_location(parent_dir)
|
self.source_dir = self.build_location(parent_dir)
|
||||||
return self.source_dir
|
return self.source_dir
|
||||||
|
|
||||||
|
def get_install_args(self, global_options, record_filename, root, prefix):
|
||||||
|
install_args = [sys.executable, "-u"]
|
||||||
|
install_args.append('-c')
|
||||||
|
install_args.append(SETUPTOOLS_SHIM % self.setup_py)
|
||||||
|
install_args += list(global_options) + \
|
||||||
|
['install', '--record', record_filename]
|
||||||
|
|
||||||
|
if not self.as_egg:
|
||||||
|
install_args += ['--single-version-externally-managed']
|
||||||
|
|
||||||
|
if root is not None:
|
||||||
|
install_args += ['--root', root]
|
||||||
|
if prefix is not None:
|
||||||
|
install_args += ['--prefix', prefix]
|
||||||
|
|
||||||
|
if self.pycompile:
|
||||||
|
install_args += ["--compile"]
|
||||||
|
else:
|
||||||
|
install_args += ["--no-compile"]
|
||||||
|
|
||||||
|
if running_under_virtualenv():
|
||||||
|
py_ver_str = 'python' + sysconfig.get_python_version()
|
||||||
|
install_args += ['--install-headers',
|
||||||
|
os.path.join(sys.prefix, 'include', 'site',
|
||||||
|
py_ver_str, self.name)]
|
||||||
|
|
||||||
|
return install_args
|
||||||
|
|
||||||
def remove_temporary_source(self):
|
def remove_temporary_source(self):
|
||||||
"""Remove the source files from this requirement, if they are marked
|
"""Remove the source files from this requirement, if they are marked
|
||||||
for deletion"""
|
for deletion"""
|
||||||
|
@ -994,12 +1016,24 @@ class InstallRequirement(object):
|
||||||
if self.req is None:
|
if self.req is None:
|
||||||
return False
|
return False
|
||||||
try:
|
try:
|
||||||
self.satisfied_by = pkg_resources.get_distribution(self.req)
|
# get_distribution() will resolve the entire list of requirements
|
||||||
|
# anyway, and we've already determined that we need the requirement
|
||||||
|
# in question, so strip the marker so that we don't try to
|
||||||
|
# evaluate it.
|
||||||
|
no_marker = Requirement(str(self.req))
|
||||||
|
no_marker.marker = None
|
||||||
|
self.satisfied_by = pkg_resources.get_distribution(str(no_marker))
|
||||||
|
if self.editable and self.satisfied_by:
|
||||||
|
self.conflicts_with = self.satisfied_by
|
||||||
|
# when installing editables, nothing pre-existing should ever
|
||||||
|
# satisfy
|
||||||
|
self.satisfied_by = None
|
||||||
|
return True
|
||||||
except pkg_resources.DistributionNotFound:
|
except pkg_resources.DistributionNotFound:
|
||||||
return False
|
return False
|
||||||
except pkg_resources.VersionConflict:
|
except pkg_resources.VersionConflict:
|
||||||
existing_dist = pkg_resources.get_distribution(
|
existing_dist = pkg_resources.get_distribution(
|
||||||
self.req.project_name
|
self.req.name
|
||||||
)
|
)
|
||||||
if self.use_user_site:
|
if self.use_user_site:
|
||||||
if dist_in_usersite(existing_dist):
|
if dist_in_usersite(existing_dist):
|
||||||
|
@ -1085,24 +1119,6 @@ def _strip_postfix(req):
|
||||||
return req
|
return req
|
||||||
|
|
||||||
|
|
||||||
def _build_req_from_url(url):
|
|
||||||
|
|
||||||
parts = [p for p in url.split('#', 1)[0].split('/') if p]
|
|
||||||
|
|
||||||
req = None
|
|
||||||
if len(parts) > 2 and parts[-2] in ('tags', 'branches', 'tag', 'branch'):
|
|
||||||
req = parts[-3]
|
|
||||||
elif len(parts) > 1 and parts[-1] == 'trunk':
|
|
||||||
req = parts[-2]
|
|
||||||
if req:
|
|
||||||
warnings.warn(
|
|
||||||
'Sniffing the requirement name from the url is deprecated and '
|
|
||||||
'will be removed in the future. Please specify an #egg segment '
|
|
||||||
'instead.', RemovedInPip9Warning,
|
|
||||||
stacklevel=2)
|
|
||||||
return req
|
|
||||||
|
|
||||||
|
|
||||||
def parse_editable(editable_req, default_vcs=None):
|
def parse_editable(editable_req, default_vcs=None):
|
||||||
"""Parses an editable requirement into:
|
"""Parses an editable requirement into:
|
||||||
- a requirement name
|
- a requirement name
|
||||||
|
@ -1142,9 +1158,7 @@ def parse_editable(editable_req, default_vcs=None):
|
||||||
return (
|
return (
|
||||||
package_name,
|
package_name,
|
||||||
url_no_extras,
|
url_no_extras,
|
||||||
pkg_resources.Requirement.parse(
|
Requirement("placeholder" + extras.lower()).extras,
|
||||||
'__placeholder__' + extras
|
|
||||||
).extras,
|
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
return package_name, url_no_extras, None
|
return package_name, url_no_extras, None
|
||||||
|
@ -1156,6 +1170,11 @@ def parse_editable(editable_req, default_vcs=None):
|
||||||
|
|
||||||
if '+' not in url:
|
if '+' not in url:
|
||||||
if default_vcs:
|
if default_vcs:
|
||||||
|
warnings.warn(
|
||||||
|
"--default-vcs has been deprecated and will be removed in "
|
||||||
|
"the future.",
|
||||||
|
RemovedInPip10Warning,
|
||||||
|
)
|
||||||
url = default_vcs + '+' + url
|
url = default_vcs + '+' + url
|
||||||
else:
|
else:
|
||||||
raise InstallationError(
|
raise InstallationError(
|
||||||
|
@ -1174,7 +1193,9 @@ def parse_editable(editable_req, default_vcs=None):
|
||||||
|
|
||||||
package_name = Link(url).egg_fragment
|
package_name = Link(url).egg_fragment
|
||||||
if not package_name:
|
if not package_name:
|
||||||
package_name = _build_req_from_url(editable_req)
|
raise InstallationError(
|
||||||
|
"Could not detect requirement name, please specify one with #egg="
|
||||||
|
)
|
||||||
if not package_name:
|
if not package_name:
|
||||||
raise InstallationError(
|
raise InstallationError(
|
||||||
'--editable=%s is not the right format; it must have '
|
'--editable=%s is not the right format; it must have '
|
||||||
|
|
|
@ -14,14 +14,16 @@ from pip.download import (is_file_url, is_dir_url, is_vcs_url, url_to_path,
|
||||||
from pip.exceptions import (InstallationError, BestVersionAlreadyInstalled,
|
from pip.exceptions import (InstallationError, BestVersionAlreadyInstalled,
|
||||||
DistributionNotFound, PreviousBuildDirError,
|
DistributionNotFound, PreviousBuildDirError,
|
||||||
HashError, HashErrors, HashUnpinned,
|
HashError, HashErrors, HashUnpinned,
|
||||||
DirectoryUrlHashUnsupported, VcsHashUnsupported)
|
DirectoryUrlHashUnsupported, VcsHashUnsupported,
|
||||||
|
UnsupportedPythonVersion)
|
||||||
from pip.req.req_install import InstallRequirement
|
from pip.req.req_install import InstallRequirement
|
||||||
from pip.utils import (
|
from pip.utils import (
|
||||||
display_path, dist_in_usersite, ensure_dir, normalize_path)
|
display_path, dist_in_usersite, ensure_dir, normalize_path)
|
||||||
from pip.utils.hashes import MissingHashes
|
from pip.utils.hashes import MissingHashes
|
||||||
from pip.utils.logging import indent_log
|
from pip.utils.logging import indent_log
|
||||||
|
from pip.utils.packaging import check_dist_requires_python
|
||||||
from pip.vcs import vcs
|
from pip.vcs import vcs
|
||||||
|
from pip.wheel import Wheel
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -140,11 +142,12 @@ class Installed(DistAbstraction):
|
||||||
class RequirementSet(object):
|
class RequirementSet(object):
|
||||||
|
|
||||||
def __init__(self, build_dir, src_dir, download_dir, upgrade=False,
|
def __init__(self, build_dir, src_dir, download_dir, upgrade=False,
|
||||||
ignore_installed=False, as_egg=False, target_dir=None,
|
upgrade_strategy=None, ignore_installed=False, as_egg=False,
|
||||||
ignore_dependencies=False, force_reinstall=False,
|
target_dir=None, ignore_dependencies=False,
|
||||||
use_user_site=False, session=None, pycompile=True,
|
force_reinstall=False, use_user_site=False, session=None,
|
||||||
isolated=False, wheel_download_dir=None,
|
pycompile=True, isolated=False, wheel_download_dir=None,
|
||||||
wheel_cache=None, require_hashes=False):
|
wheel_cache=None, require_hashes=False,
|
||||||
|
ignore_requires_python=False):
|
||||||
"""Create a RequirementSet.
|
"""Create a RequirementSet.
|
||||||
|
|
||||||
:param wheel_download_dir: Where still-packed .whl files should be
|
:param wheel_download_dir: Where still-packed .whl files should be
|
||||||
|
@ -170,6 +173,7 @@ class RequirementSet(object):
|
||||||
# the wheelhouse output by 'pip wheel'.
|
# the wheelhouse output by 'pip wheel'.
|
||||||
self.download_dir = download_dir
|
self.download_dir = download_dir
|
||||||
self.upgrade = upgrade
|
self.upgrade = upgrade
|
||||||
|
self.upgrade_strategy = upgrade_strategy
|
||||||
self.ignore_installed = ignore_installed
|
self.ignore_installed = ignore_installed
|
||||||
self.force_reinstall = force_reinstall
|
self.force_reinstall = force_reinstall
|
||||||
self.requirements = Requirements()
|
self.requirements = Requirements()
|
||||||
|
@ -177,6 +181,7 @@ class RequirementSet(object):
|
||||||
self.requirement_aliases = {}
|
self.requirement_aliases = {}
|
||||||
self.unnamed_requirements = []
|
self.unnamed_requirements = []
|
||||||
self.ignore_dependencies = ignore_dependencies
|
self.ignore_dependencies = ignore_dependencies
|
||||||
|
self.ignore_requires_python = ignore_requires_python
|
||||||
self.successfully_downloaded = []
|
self.successfully_downloaded = []
|
||||||
self.successfully_installed = []
|
self.successfully_installed = []
|
||||||
self.reqs_to_cleanup = []
|
self.reqs_to_cleanup = []
|
||||||
|
@ -207,7 +212,8 @@ class RequirementSet(object):
|
||||||
return ('<%s object; %d requirement(s): %s>'
|
return ('<%s object; %d requirement(s): %s>'
|
||||||
% (self.__class__.__name__, len(reqs), reqs_str))
|
% (self.__class__.__name__, len(reqs), reqs_str))
|
||||||
|
|
||||||
def add_requirement(self, install_req, parent_req_name=None):
|
def add_requirement(self, install_req, parent_req_name=None,
|
||||||
|
extras_requested=None):
|
||||||
"""Add install_req as a requirement to install.
|
"""Add install_req as a requirement to install.
|
||||||
|
|
||||||
:param parent_req_name: The name of the requirement that needed this
|
:param parent_req_name: The name of the requirement that needed this
|
||||||
|
@ -216,21 +222,35 @@ class RequirementSet(object):
|
||||||
links that point outside the Requirements set. parent_req must
|
links that point outside the Requirements set. parent_req must
|
||||||
already be added. Note that None implies that this is a user
|
already be added. Note that None implies that this is a user
|
||||||
supplied requirement, vs an inferred one.
|
supplied requirement, vs an inferred one.
|
||||||
|
:param extras_requested: an iterable of extras used to evaluate the
|
||||||
|
environement markers.
|
||||||
:return: Additional requirements to scan. That is either [] if
|
:return: Additional requirements to scan. That is either [] if
|
||||||
the requirement is not applicable, or [install_req] if the
|
the requirement is not applicable, or [install_req] if the
|
||||||
requirement is applicable and has just been added.
|
requirement is applicable and has just been added.
|
||||||
"""
|
"""
|
||||||
name = install_req.name
|
name = install_req.name
|
||||||
if not install_req.match_markers():
|
if not install_req.match_markers(extras_requested):
|
||||||
logger.warning("Ignoring %s: markers %r don't match your "
|
logger.warning("Ignoring %s: markers '%s' don't match your "
|
||||||
"environment", install_req.name,
|
"environment", install_req.name,
|
||||||
install_req.markers)
|
install_req.markers)
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
# This check has to come after we filter requirements with the
|
||||||
|
# environment markers.
|
||||||
|
if install_req.link and install_req.link.is_wheel:
|
||||||
|
wheel = Wheel(install_req.link.filename)
|
||||||
|
if not wheel.supported():
|
||||||
|
raise InstallationError(
|
||||||
|
"%s is not a supported wheel on this platform." %
|
||||||
|
wheel.filename
|
||||||
|
)
|
||||||
|
|
||||||
install_req.as_egg = self.as_egg
|
install_req.as_egg = self.as_egg
|
||||||
install_req.use_user_site = self.use_user_site
|
install_req.use_user_site = self.use_user_site
|
||||||
install_req.target_dir = self.target_dir
|
install_req.target_dir = self.target_dir
|
||||||
install_req.pycompile = self.pycompile
|
install_req.pycompile = self.pycompile
|
||||||
|
install_req.is_direct = (parent_req_name is None)
|
||||||
|
|
||||||
if not name:
|
if not name:
|
||||||
# url or path requirement w/o an egg fragment
|
# url or path requirement w/o an egg fragment
|
||||||
self.unnamed_requirements.append(install_req)
|
self.unnamed_requirements.append(install_req)
|
||||||
|
@ -243,7 +263,7 @@ class RequirementSet(object):
|
||||||
if (parent_req_name is None and existing_req and not
|
if (parent_req_name is None and existing_req and not
|
||||||
existing_req.constraint and
|
existing_req.constraint and
|
||||||
existing_req.extras == install_req.extras and not
|
existing_req.extras == install_req.extras and not
|
||||||
existing_req.req.specs == install_req.req.specs):
|
existing_req.req.specifier == install_req.req.specifier):
|
||||||
raise InstallationError(
|
raise InstallationError(
|
||||||
'Double requirement given: %s (already in %s, name=%r)'
|
'Double requirement given: %s (already in %s, name=%r)'
|
||||||
% (install_req, existing_req, name))
|
% (install_req, existing_req, name))
|
||||||
|
@ -365,6 +385,13 @@ class RequirementSet(object):
|
||||||
if hash_errors:
|
if hash_errors:
|
||||||
raise hash_errors
|
raise hash_errors
|
||||||
|
|
||||||
|
def _is_upgrade_allowed(self, req):
|
||||||
|
return self.upgrade and (
|
||||||
|
self.upgrade_strategy == "eager" or (
|
||||||
|
self.upgrade_strategy == "only-if-needed" and req.is_direct
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
def _check_skip_installed(self, req_to_install, finder):
|
def _check_skip_installed(self, req_to_install, finder):
|
||||||
"""Check if req_to_install should be skipped.
|
"""Check if req_to_install should be skipped.
|
||||||
|
|
||||||
|
@ -386,17 +413,20 @@ class RequirementSet(object):
|
||||||
# Check whether to upgrade/reinstall this req or not.
|
# Check whether to upgrade/reinstall this req or not.
|
||||||
req_to_install.check_if_exists()
|
req_to_install.check_if_exists()
|
||||||
if req_to_install.satisfied_by:
|
if req_to_install.satisfied_by:
|
||||||
skip_reason = 'satisfied (use --upgrade to upgrade)'
|
upgrade_allowed = self._is_upgrade_allowed(req_to_install)
|
||||||
if self.upgrade:
|
|
||||||
|
# Is the best version is installed.
|
||||||
best_installed = False
|
best_installed = False
|
||||||
|
|
||||||
|
if upgrade_allowed:
|
||||||
# For link based requirements we have to pull the
|
# For link based requirements we have to pull the
|
||||||
# tree down and inspect to assess the version #, so
|
# tree down and inspect to assess the version #, so
|
||||||
# its handled way down.
|
# its handled way down.
|
||||||
if not (self.force_reinstall or req_to_install.link):
|
if not (self.force_reinstall or req_to_install.link):
|
||||||
try:
|
try:
|
||||||
finder.find_requirement(req_to_install, self.upgrade)
|
finder.find_requirement(
|
||||||
|
req_to_install, upgrade_allowed)
|
||||||
except BestVersionAlreadyInstalled:
|
except BestVersionAlreadyInstalled:
|
||||||
skip_reason = 'up-to-date'
|
|
||||||
best_installed = True
|
best_installed = True
|
||||||
except DistributionNotFound:
|
except DistributionNotFound:
|
||||||
# No distribution found, so we squash the
|
# No distribution found, so we squash the
|
||||||
|
@ -413,6 +443,15 @@ class RequirementSet(object):
|
||||||
req_to_install.conflicts_with = \
|
req_to_install.conflicts_with = \
|
||||||
req_to_install.satisfied_by
|
req_to_install.satisfied_by
|
||||||
req_to_install.satisfied_by = None
|
req_to_install.satisfied_by = None
|
||||||
|
|
||||||
|
# Figure out a nice message to say why we're skipping this.
|
||||||
|
if best_installed:
|
||||||
|
skip_reason = 'already up-to-date'
|
||||||
|
elif self.upgrade_strategy == "only-if-needed":
|
||||||
|
skip_reason = 'not upgraded as not directly required'
|
||||||
|
else:
|
||||||
|
skip_reason = 'already satisfied'
|
||||||
|
|
||||||
return skip_reason
|
return skip_reason
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
@ -453,7 +492,7 @@ class RequirementSet(object):
|
||||||
'req_to_install.satisfied_by is set to %r'
|
'req_to_install.satisfied_by is set to %r'
|
||||||
% (req_to_install.satisfied_by,))
|
% (req_to_install.satisfied_by,))
|
||||||
logger.info(
|
logger.info(
|
||||||
'Requirement already %s: %s', skip_reason,
|
'Requirement %s: %s', skip_reason,
|
||||||
req_to_install)
|
req_to_install)
|
||||||
else:
|
else:
|
||||||
if (req_to_install.link and
|
if (req_to_install.link and
|
||||||
|
@ -479,6 +518,7 @@ class RequirementSet(object):
|
||||||
abstract_dist.prep_for_dist()
|
abstract_dist.prep_for_dist()
|
||||||
if self.is_download:
|
if self.is_download:
|
||||||
req_to_install.archive(self.download_dir)
|
req_to_install.archive(self.download_dir)
|
||||||
|
req_to_install.check_if_exists()
|
||||||
elif req_to_install.satisfied_by:
|
elif req_to_install.satisfied_by:
|
||||||
if require_hashes:
|
if require_hashes:
|
||||||
logger.debug(
|
logger.debug(
|
||||||
|
@ -509,7 +549,10 @@ class RequirementSet(object):
|
||||||
% (req_to_install, req_to_install.source_dir)
|
% (req_to_install, req_to_install.source_dir)
|
||||||
)
|
)
|
||||||
req_to_install.populate_link(
|
req_to_install.populate_link(
|
||||||
finder, self.upgrade, require_hashes)
|
finder,
|
||||||
|
self._is_upgrade_allowed(req_to_install),
|
||||||
|
require_hashes
|
||||||
|
)
|
||||||
# We can't hit this spot and have populate_link return None.
|
# We can't hit this spot and have populate_link return None.
|
||||||
# req_to_install.satisfied_by is None here (because we're
|
# req_to_install.satisfied_by is None here (because we're
|
||||||
# guarded) and upgrade has no impact except when satisfied_by
|
# guarded) and upgrade has no impact except when satisfied_by
|
||||||
|
@ -619,9 +662,17 @@ class RequirementSet(object):
|
||||||
# # parse dependencies # #
|
# # parse dependencies # #
|
||||||
# ###################### #
|
# ###################### #
|
||||||
dist = abstract_dist.dist(finder)
|
dist = abstract_dist.dist(finder)
|
||||||
|
try:
|
||||||
|
check_dist_requires_python(dist)
|
||||||
|
except UnsupportedPythonVersion as e:
|
||||||
|
if self.ignore_requires_python:
|
||||||
|
logger.warning(e.args[0])
|
||||||
|
else:
|
||||||
|
req_to_install.remove_temporary_source()
|
||||||
|
raise
|
||||||
more_reqs = []
|
more_reqs = []
|
||||||
|
|
||||||
def add_req(subreq):
|
def add_req(subreq, extras_requested):
|
||||||
sub_install_req = InstallRequirement(
|
sub_install_req = InstallRequirement(
|
||||||
str(subreq),
|
str(subreq),
|
||||||
req_to_install,
|
req_to_install,
|
||||||
|
@ -629,7 +680,8 @@ class RequirementSet(object):
|
||||||
wheel_cache=self._wheel_cache,
|
wheel_cache=self._wheel_cache,
|
||||||
)
|
)
|
||||||
more_reqs.extend(self.add_requirement(
|
more_reqs.extend(self.add_requirement(
|
||||||
sub_install_req, req_to_install.name))
|
sub_install_req, req_to_install.name,
|
||||||
|
extras_requested=extras_requested))
|
||||||
|
|
||||||
# We add req_to_install before its dependencies, so that we
|
# We add req_to_install before its dependencies, so that we
|
||||||
# can refer to it when adding dependencies.
|
# can refer to it when adding dependencies.
|
||||||
|
@ -656,7 +708,7 @@ class RequirementSet(object):
|
||||||
set(dist.extras) & set(req_to_install.extras)
|
set(dist.extras) & set(req_to_install.extras)
|
||||||
)
|
)
|
||||||
for subreq in dist.requires(available_requested):
|
for subreq in dist.requires(available_requested):
|
||||||
add_req(subreq)
|
add_req(subreq, extras_requested=available_requested)
|
||||||
|
|
||||||
# cleanup tmp src
|
# cleanup tmp src
|
||||||
self.reqs_to_cleanup.append(req_to_install)
|
self.reqs_to_cleanup.append(req_to_install)
|
||||||
|
|
|
@ -42,7 +42,7 @@ __all__ = ['rmtree', 'display_path', 'backup_dir',
|
||||||
'normalize_path',
|
'normalize_path',
|
||||||
'renames', 'get_terminal_size', 'get_prog',
|
'renames', 'get_terminal_size', 'get_prog',
|
||||||
'unzip_file', 'untar_file', 'unpack_file', 'call_subprocess',
|
'unzip_file', 'untar_file', 'unpack_file', 'call_subprocess',
|
||||||
'captured_stdout', 'remove_tracebacks', 'ensure_dir',
|
'captured_stdout', 'ensure_dir',
|
||||||
'ARCHIVE_EXTENSIONS', 'SUPPORTED_EXTENSIONS',
|
'ARCHIVE_EXTENSIONS', 'SUPPORTED_EXTENSIONS',
|
||||||
'get_installed_version']
|
'get_installed_version']
|
||||||
|
|
||||||
|
@ -639,20 +639,9 @@ def unpack_file(filename, location, content_type, link):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def remove_tracebacks(output):
|
|
||||||
pattern = (r'(?:\W+File "(?:.*)", line (?:.*)\W+(?:.*)\W+\^\W+)?'
|
|
||||||
r'Syntax(?:Error|Warning): (?:.*)')
|
|
||||||
output = re.sub(pattern, '', output)
|
|
||||||
if PY2:
|
|
||||||
return output
|
|
||||||
# compileall.compile_dir() prints different messages to stdout
|
|
||||||
# in Python 3
|
|
||||||
return re.sub(r"\*\*\* Error compiling (?:.*)", '', output)
|
|
||||||
|
|
||||||
|
|
||||||
def call_subprocess(cmd, show_stdout=True, cwd=None,
|
def call_subprocess(cmd, show_stdout=True, cwd=None,
|
||||||
on_returncode='raise',
|
on_returncode='raise',
|
||||||
command_level=std_logging.DEBUG, command_desc=None,
|
command_desc=None,
|
||||||
extra_environ=None, spinner=None):
|
extra_environ=None, spinner=None):
|
||||||
# This function's handling of subprocess output is confusing and I
|
# This function's handling of subprocess output is confusing and I
|
||||||
# previously broke it terribly, so as penance I will write a long comment
|
# previously broke it terribly, so as penance I will write a long comment
|
||||||
|
@ -686,7 +675,7 @@ def call_subprocess(cmd, show_stdout=True, cwd=None,
|
||||||
part = '"%s"' % part.replace('"', '\\"')
|
part = '"%s"' % part.replace('"', '\\"')
|
||||||
cmd_parts.append(part)
|
cmd_parts.append(part)
|
||||||
command_desc = ' '.join(cmd_parts)
|
command_desc = ' '.join(cmd_parts)
|
||||||
logger.log(command_level, "Running command %s", command_desc)
|
logger.debug("Running command %s", command_desc)
|
||||||
env = os.environ.copy()
|
env = os.environ.copy()
|
||||||
if extra_environ:
|
if extra_environ:
|
||||||
env.update(extra_environ)
|
env.update(extra_environ)
|
||||||
|
@ -745,7 +734,7 @@ def call_subprocess(cmd, show_stdout=True, cwd=None,
|
||||||
raise ValueError('Invalid value: on_returncode=%s' %
|
raise ValueError('Invalid value: on_returncode=%s' %
|
||||||
repr(on_returncode))
|
repr(on_returncode))
|
||||||
if not show_stdout:
|
if not show_stdout:
|
||||||
return remove_tracebacks(''.join(all_output))
|
return ''.join(all_output)
|
||||||
|
|
||||||
|
|
||||||
def read_text_file(filename):
|
def read_text_file(filename):
|
||||||
|
@ -856,14 +845,17 @@ class cached_property(object):
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
def get_installed_version(dist_name):
|
def get_installed_version(dist_name, lookup_dirs=None):
|
||||||
"""Get the installed version of dist_name avoiding pkg_resources cache"""
|
"""Get the installed version of dist_name avoiding pkg_resources cache"""
|
||||||
# Create a requirement that we'll look for inside of setuptools.
|
# Create a requirement that we'll look for inside of setuptools.
|
||||||
req = pkg_resources.Requirement.parse(dist_name)
|
req = pkg_resources.Requirement.parse(dist_name)
|
||||||
|
|
||||||
# We want to avoid having this cached, so we need to construct a new
|
# We want to avoid having this cached, so we need to construct a new
|
||||||
# working set each time.
|
# working set each time.
|
||||||
|
if lookup_dirs is None:
|
||||||
working_set = pkg_resources.WorkingSet()
|
working_set = pkg_resources.WorkingSet()
|
||||||
|
else:
|
||||||
|
working_set = pkg_resources.WorkingSet(lookup_dirs)
|
||||||
|
|
||||||
# Get the installed distribution from our working set
|
# Get the installed distribution from our working set
|
||||||
dist = working_set.find(req)
|
dist = working_set.find(req)
|
||||||
|
|
|
@ -8,6 +8,7 @@ import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from pip.compat import WINDOWS, expanduser
|
from pip.compat import WINDOWS, expanduser
|
||||||
|
from pip._vendor.six import PY2, text_type
|
||||||
|
|
||||||
|
|
||||||
def user_cache_dir(appname):
|
def user_cache_dir(appname):
|
||||||
|
@ -17,7 +18,7 @@ def user_cache_dir(appname):
|
||||||
"appname" is the name of application.
|
"appname" is the name of application.
|
||||||
|
|
||||||
Typical user cache directories are:
|
Typical user cache directories are:
|
||||||
Mac OS X: ~/Library/Caches/<AppName>
|
macOS: ~/Library/Caches/<AppName>
|
||||||
Unix: ~/.cache/<AppName> (XDG default)
|
Unix: ~/.cache/<AppName> (XDG default)
|
||||||
Windows: C:\Users\<username>\AppData\Local\<AppName>\Cache
|
Windows: C:\Users\<username>\AppData\Local\<AppName>\Cache
|
||||||
|
|
||||||
|
@ -35,6 +36,11 @@ def user_cache_dir(appname):
|
||||||
# Get the base path
|
# Get the base path
|
||||||
path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA"))
|
path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA"))
|
||||||
|
|
||||||
|
# When using Python 2, return paths as bytes on Windows like we do on
|
||||||
|
# other operating systems. See helper function docs for more details.
|
||||||
|
if PY2 and isinstance(path, text_type):
|
||||||
|
path = _win_path_to_bytes(path)
|
||||||
|
|
||||||
# Add our app name and Cache directory to it
|
# Add our app name and Cache directory to it
|
||||||
path = os.path.join(path, appname, "Cache")
|
path = os.path.join(path, appname, "Cache")
|
||||||
elif sys.platform == "darwin":
|
elif sys.platform == "darwin":
|
||||||
|
@ -67,7 +73,7 @@ def user_data_dir(appname, roaming=False):
|
||||||
for a discussion of issues.
|
for a discussion of issues.
|
||||||
|
|
||||||
Typical user data directories are:
|
Typical user data directories are:
|
||||||
Mac OS X: ~/Library/Application Support/<AppName>
|
macOS: ~/Library/Application Support/<AppName>
|
||||||
Unix: ~/.local/share/<AppName> # or in
|
Unix: ~/.local/share/<AppName> # or in
|
||||||
$XDG_DATA_HOME, if defined
|
$XDG_DATA_HOME, if defined
|
||||||
Win XP (not roaming): C:\Documents and Settings\<username>\ ...
|
Win XP (not roaming): C:\Documents and Settings\<username>\ ...
|
||||||
|
@ -110,12 +116,12 @@ def user_config_dir(appname, roaming=True):
|
||||||
for a discussion of issues.
|
for a discussion of issues.
|
||||||
|
|
||||||
Typical user data directories are:
|
Typical user data directories are:
|
||||||
Mac OS X: same as user_data_dir
|
macOS: same as user_data_dir
|
||||||
Unix: ~/.config/<AppName>
|
Unix: ~/.config/<AppName>
|
||||||
Win *: same as user_data_dir
|
Win *: same as user_data_dir
|
||||||
|
|
||||||
For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME.
|
For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME.
|
||||||
That means, by deafult "~/.config/<AppName>".
|
That means, by default "~/.config/<AppName>".
|
||||||
"""
|
"""
|
||||||
if WINDOWS:
|
if WINDOWS:
|
||||||
path = user_data_dir(appname, roaming=roaming)
|
path = user_data_dir(appname, roaming=roaming)
|
||||||
|
@ -136,7 +142,7 @@ def site_config_dirs(appname):
|
||||||
"appname" is the name of application.
|
"appname" is the name of application.
|
||||||
|
|
||||||
Typical user config directories are:
|
Typical user config directories are:
|
||||||
Mac OS X: /Library/Application Support/<AppName>/
|
macOS: /Library/Application Support/<AppName>/
|
||||||
Unix: /etc or $XDG_CONFIG_DIRS[i]/<AppName>/ for each value in
|
Unix: /etc or $XDG_CONFIG_DIRS[i]/<AppName>/ for each value in
|
||||||
$XDG_CONFIG_DIRS
|
$XDG_CONFIG_DIRS
|
||||||
Win XP: C:\Documents and Settings\All Users\Application ...
|
Win XP: C:\Documents and Settings\All Users\Application ...
|
||||||
|
@ -222,3 +228,21 @@ if WINDOWS:
|
||||||
_get_win_folder = _get_win_folder_with_ctypes
|
_get_win_folder = _get_win_folder_with_ctypes
|
||||||
except ImportError:
|
except ImportError:
|
||||||
_get_win_folder = _get_win_folder_from_registry
|
_get_win_folder = _get_win_folder_from_registry
|
||||||
|
|
||||||
|
|
||||||
|
def _win_path_to_bytes(path):
|
||||||
|
"""Encode Windows paths to bytes. Only used on Python 2.
|
||||||
|
|
||||||
|
Motivation is to be consistent with other operating systems where paths
|
||||||
|
are also returned as bytes. This avoids problems mixing bytes and Unicode
|
||||||
|
elsewhere in the codebase. For more details and discussion see
|
||||||
|
<https://github.com/pypa/pip/issues/3463>.
|
||||||
|
|
||||||
|
If encoding using ASCII and MBCS fails, return the original Unicode path.
|
||||||
|
"""
|
||||||
|
for encoding in ('ASCII', 'MBCS'):
|
||||||
|
try:
|
||||||
|
return path.encode(encoding)
|
||||||
|
except (UnicodeEncodeError, LookupError):
|
||||||
|
pass
|
||||||
|
return path
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
"""
|
"""
|
||||||
A module that implments tooling to enable easy warnings about deprecations.
|
A module that implements tooling to enable easy warnings about deprecations.
|
||||||
"""
|
"""
|
||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
|
|
||||||
|
@ -15,15 +15,15 @@ class Pending(object):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class RemovedInPip9Warning(PipDeprecationWarning):
|
class RemovedInPip10Warning(PipDeprecationWarning):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class RemovedInPip10Warning(PipDeprecationWarning, Pending):
|
class RemovedInPip11Warning(PipDeprecationWarning, Pending):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class Python26DeprecationWarning(PipDeprecationWarning, Pending):
|
class Python26DeprecationWarning(PipDeprecationWarning):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
81
lib/python3.4/site-packages/pip/utils/glibc.py
Normal file
81
lib/python3.4/site-packages/pip/utils/glibc.py
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
from __future__ import absolute_import
|
||||||
|
|
||||||
|
import re
|
||||||
|
import ctypes
|
||||||
|
import platform
|
||||||
|
import warnings
|
||||||
|
|
||||||
|
|
||||||
|
def glibc_version_string():
|
||||||
|
"Returns glibc version string, or None if not using glibc."
|
||||||
|
|
||||||
|
# ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen
|
||||||
|
# manpage says, "If filename is NULL, then the returned handle is for the
|
||||||
|
# main program". This way we can let the linker do the work to figure out
|
||||||
|
# which libc our process is actually using.
|
||||||
|
process_namespace = ctypes.CDLL(None)
|
||||||
|
try:
|
||||||
|
gnu_get_libc_version = process_namespace.gnu_get_libc_version
|
||||||
|
except AttributeError:
|
||||||
|
# Symbol doesn't exist -> therefore, we are not linked to
|
||||||
|
# glibc.
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Call gnu_get_libc_version, which returns a string like "2.5"
|
||||||
|
gnu_get_libc_version.restype = ctypes.c_char_p
|
||||||
|
version_str = gnu_get_libc_version()
|
||||||
|
# py2 / py3 compatibility:
|
||||||
|
if not isinstance(version_str, str):
|
||||||
|
version_str = version_str.decode("ascii")
|
||||||
|
|
||||||
|
return version_str
|
||||||
|
|
||||||
|
|
||||||
|
# Separated out from have_compatible_glibc for easier unit testing
|
||||||
|
def check_glibc_version(version_str, required_major, minimum_minor):
|
||||||
|
# Parse string and check against requested version.
|
||||||
|
#
|
||||||
|
# We use a regexp instead of str.split because we want to discard any
|
||||||
|
# random junk that might come after the minor version -- this might happen
|
||||||
|
# in patched/forked versions of glibc (e.g. Linaro's version of glibc
|
||||||
|
# uses version strings like "2.20-2014.11"). See gh-3588.
|
||||||
|
m = re.match(r"(?P<major>[0-9]+)\.(?P<minor>[0-9]+)", version_str)
|
||||||
|
if not m:
|
||||||
|
warnings.warn("Expected glibc version with 2 components major.minor,"
|
||||||
|
" got: %s" % version_str, RuntimeWarning)
|
||||||
|
return False
|
||||||
|
return (int(m.group("major")) == required_major and
|
||||||
|
int(m.group("minor")) >= minimum_minor)
|
||||||
|
|
||||||
|
|
||||||
|
def have_compatible_glibc(required_major, minimum_minor):
|
||||||
|
version_str = glibc_version_string()
|
||||||
|
if version_str is None:
|
||||||
|
return False
|
||||||
|
return check_glibc_version(version_str, required_major, minimum_minor)
|
||||||
|
|
||||||
|
|
||||||
|
# platform.libc_ver regularly returns completely nonsensical glibc
|
||||||
|
# versions. E.g. on my computer, platform says:
|
||||||
|
#
|
||||||
|
# ~$ python2.7 -c 'import platform; print(platform.libc_ver())'
|
||||||
|
# ('glibc', '2.7')
|
||||||
|
# ~$ python3.5 -c 'import platform; print(platform.libc_ver())'
|
||||||
|
# ('glibc', '2.9')
|
||||||
|
#
|
||||||
|
# But the truth is:
|
||||||
|
#
|
||||||
|
# ~$ ldd --version
|
||||||
|
# ldd (Debian GLIBC 2.22-11) 2.22
|
||||||
|
#
|
||||||
|
# This is unfortunate, because it means that the linehaul data on libc
|
||||||
|
# versions that was generated by pip 8.1.2 and earlier is useless and
|
||||||
|
# misleading. Solution: instead of using platform, use our code that actually
|
||||||
|
# works.
|
||||||
|
def libc_ver():
|
||||||
|
glibc_version = glibc_version_string()
|
||||||
|
if glibc_version is None:
|
||||||
|
# For non-glibc platforms, fall back on platform.libc_ver
|
||||||
|
return platform.libc_ver()
|
||||||
|
else:
|
||||||
|
return ("glibc", glibc_version)
|
63
lib/python3.4/site-packages/pip/utils/packaging.py
Normal file
63
lib/python3.4/site-packages/pip/utils/packaging.py
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
from __future__ import absolute_import
|
||||||
|
|
||||||
|
from email.parser import FeedParser
|
||||||
|
|
||||||
|
import logging
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from pip._vendor.packaging import specifiers
|
||||||
|
from pip._vendor.packaging import version
|
||||||
|
from pip._vendor import pkg_resources
|
||||||
|
|
||||||
|
from pip import exceptions
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def check_requires_python(requires_python):
|
||||||
|
"""
|
||||||
|
Check if the python version in use match the `requires_python` specifier.
|
||||||
|
|
||||||
|
Returns `True` if the version of python in use matches the requirement.
|
||||||
|
Returns `False` if the version of python in use does not matches the
|
||||||
|
requirement.
|
||||||
|
|
||||||
|
Raises an InvalidSpecifier if `requires_python` have an invalid format.
|
||||||
|
"""
|
||||||
|
if requires_python is None:
|
||||||
|
# The package provides no information
|
||||||
|
return True
|
||||||
|
requires_python_specifier = specifiers.SpecifierSet(requires_python)
|
||||||
|
|
||||||
|
# We only use major.minor.micro
|
||||||
|
python_version = version.parse('.'.join(map(str, sys.version_info[:3])))
|
||||||
|
return python_version in requires_python_specifier
|
||||||
|
|
||||||
|
|
||||||
|
def get_metadata(dist):
|
||||||
|
if (isinstance(dist, pkg_resources.DistInfoDistribution) and
|
||||||
|
dist.has_metadata('METADATA')):
|
||||||
|
return dist.get_metadata('METADATA')
|
||||||
|
elif dist.has_metadata('PKG-INFO'):
|
||||||
|
return dist.get_metadata('PKG-INFO')
|
||||||
|
|
||||||
|
|
||||||
|
def check_dist_requires_python(dist):
|
||||||
|
metadata = get_metadata(dist)
|
||||||
|
feed_parser = FeedParser()
|
||||||
|
feed_parser.feed(metadata)
|
||||||
|
pkg_info_dict = feed_parser.close()
|
||||||
|
requires_python = pkg_info_dict.get('Requires-Python')
|
||||||
|
try:
|
||||||
|
if not check_requires_python(requires_python):
|
||||||
|
raise exceptions.UnsupportedPythonVersion(
|
||||||
|
"%s requires Python '%s' but the running Python is %s" % (
|
||||||
|
dist.project_name,
|
||||||
|
requires_python,
|
||||||
|
'.'.join(map(str, sys.version_info[:3])),)
|
||||||
|
)
|
||||||
|
except specifiers.InvalidSpecifier as e:
|
||||||
|
logger.warning(
|
||||||
|
"Package %s has an invalid Requires-Python entry %s - %s" % (
|
||||||
|
dist.project_name, requires_python, e))
|
||||||
|
return
|
|
@ -1,6 +1,8 @@
|
||||||
# Shim to wrap setup.py invocation with setuptools
|
# Shim to wrap setup.py invocation with setuptools
|
||||||
SETUPTOOLS_SHIM = (
|
SETUPTOOLS_SHIM = (
|
||||||
"import setuptools, tokenize;__file__=%r;"
|
"import setuptools, tokenize;__file__=%r;"
|
||||||
"exec(compile(getattr(tokenize, 'open', open)(__file__).read()"
|
"f=getattr(tokenize, 'open', open)(__file__);"
|
||||||
".replace('\\r\\n', '\\n'), __file__, 'exec'))"
|
"code=f.read().replace('\\r\\n', '\\n');"
|
||||||
|
"f.close();"
|
||||||
|
"exec(compile(code, __file__, 'exec'))"
|
||||||
)
|
)
|
||||||
|
|
|
@ -5,6 +5,7 @@ import errno
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
|
import sys
|
||||||
|
|
||||||
from pip._vendor.six.moves.urllib import parse as urllib_parse
|
from pip._vendor.six.moves.urllib import parse as urllib_parse
|
||||||
|
|
||||||
|
@ -106,7 +107,7 @@ class VersionControl(object):
|
||||||
def _is_local_repository(self, repo):
|
def _is_local_repository(self, repo):
|
||||||
"""
|
"""
|
||||||
posix absolute paths start with os.path.sep,
|
posix absolute paths start with os.path.sep,
|
||||||
win32 ones ones start with drive (like c:\\folder)
|
win32 ones start with drive (like c:\\folder)
|
||||||
"""
|
"""
|
||||||
drive, tail = os.path.splitdrive(repo)
|
drive, tail = os.path.splitdrive(repo)
|
||||||
return repo.startswith(os.path.sep) or drive
|
return repo.startswith(os.path.sep) or drive
|
||||||
|
@ -271,6 +272,8 @@ class VersionControl(object):
|
||||||
)
|
)
|
||||||
shutil.move(dest, dest_dir)
|
shutil.move(dest, dest_dir)
|
||||||
checkout = True
|
checkout = True
|
||||||
|
elif response == 'a':
|
||||||
|
sys.exit(-1)
|
||||||
return checkout
|
return checkout
|
||||||
|
|
||||||
def unpack(self, location):
|
def unpack(self, location):
|
||||||
|
@ -307,7 +310,7 @@ class VersionControl(object):
|
||||||
|
|
||||||
def run_command(self, cmd, show_stdout=True, cwd=None,
|
def run_command(self, cmd, show_stdout=True, cwd=None,
|
||||||
on_returncode='raise',
|
on_returncode='raise',
|
||||||
command_level=logging.DEBUG, command_desc=None,
|
command_desc=None,
|
||||||
extra_environ=None, spinner=None):
|
extra_environ=None, spinner=None):
|
||||||
"""
|
"""
|
||||||
Run a VCS subcommand
|
Run a VCS subcommand
|
||||||
|
@ -317,7 +320,7 @@ class VersionControl(object):
|
||||||
cmd = [self.name] + cmd
|
cmd = [self.name] + cmd
|
||||||
try:
|
try:
|
||||||
return call_subprocess(cmd, show_stdout, cwd,
|
return call_subprocess(cmd, show_stdout, cwd,
|
||||||
on_returncode, command_level,
|
on_returncode,
|
||||||
command_desc, extra_environ,
|
command_desc, extra_environ,
|
||||||
spinner)
|
spinner)
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
|
|
|
@ -8,6 +8,7 @@ from pip.compat import samefile
|
||||||
from pip.exceptions import BadCommand
|
from pip.exceptions import BadCommand
|
||||||
from pip._vendor.six.moves.urllib import parse as urllib_parse
|
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 import request as urllib_request
|
||||||
|
from pip._vendor.packaging.version import parse as parse_version
|
||||||
|
|
||||||
from pip.utils import display_path, rmtree
|
from pip.utils import display_path, rmtree
|
||||||
from pip.vcs import vcs, VersionControl
|
from pip.vcs import vcs, VersionControl
|
||||||
|
@ -49,6 +50,19 @@ class Git(VersionControl):
|
||||||
|
|
||||||
super(Git, self).__init__(url, *args, **kwargs)
|
super(Git, self).__init__(url, *args, **kwargs)
|
||||||
|
|
||||||
|
def get_git_version(self):
|
||||||
|
VERSION_PFX = 'git version '
|
||||||
|
version = self.run_command(['version'], show_stdout=False)
|
||||||
|
if version.startswith(VERSION_PFX):
|
||||||
|
version = version[len(VERSION_PFX):]
|
||||||
|
else:
|
||||||
|
version = ''
|
||||||
|
# get first 3 positions of the git version becasue
|
||||||
|
# on windows it is x.y.z.windows.t, and this parses as
|
||||||
|
# LegacyVersion which always smaller than a Version.
|
||||||
|
version = '.'.join(version.split('.')[:3])
|
||||||
|
return parse_version(version)
|
||||||
|
|
||||||
def export(self, location):
|
def export(self, location):
|
||||||
"""Export the Git repository at the url to the destination location"""
|
"""Export the Git repository at the url to the destination location"""
|
||||||
temp_dir = tempfile.mkdtemp('-export', 'pip-')
|
temp_dir = tempfile.mkdtemp('-export', 'pip-')
|
||||||
|
@ -99,6 +113,10 @@ class Git(VersionControl):
|
||||||
|
|
||||||
def update(self, dest, rev_options):
|
def update(self, dest, rev_options):
|
||||||
# First fetch changes from the default remote
|
# First fetch changes from the default remote
|
||||||
|
if self.get_git_version() >= parse_version('1.9.0'):
|
||||||
|
# fetch tags in addition to everything else
|
||||||
|
self.run_command(['fetch', '-q', '--tags'], cwd=dest)
|
||||||
|
else:
|
||||||
self.run_command(['fetch', '-q'], cwd=dest)
|
self.run_command(['fetch', '-q'], cwd=dest)
|
||||||
# Then reset to wanted revision (maybe even origin/master)
|
# Then reset to wanted revision (maybe even origin/master)
|
||||||
if rev_options:
|
if rev_options:
|
||||||
|
@ -139,8 +157,13 @@ class Git(VersionControl):
|
||||||
remotes = self.run_command(
|
remotes = self.run_command(
|
||||||
['config', '--get-regexp', 'remote\..*\.url'],
|
['config', '--get-regexp', 'remote\..*\.url'],
|
||||||
show_stdout=False, cwd=location)
|
show_stdout=False, cwd=location)
|
||||||
first_remote = remotes.splitlines()[0]
|
remotes = remotes.splitlines()
|
||||||
url = first_remote.split(' ')[1]
|
found_remote = remotes[0]
|
||||||
|
for remote in remotes:
|
||||||
|
if remote.startswith('remote.origin.url '):
|
||||||
|
found_remote = remote
|
||||||
|
break
|
||||||
|
url = found_remote.split(' ')[1]
|
||||||
return url.strip()
|
return url.strip()
|
||||||
|
|
||||||
def get_revision(self, location):
|
def get_revision(self, location):
|
||||||
|
|
|
@ -60,6 +60,7 @@ class Subversion(VersionControl):
|
||||||
"""Export the svn repository at the url to the destination location"""
|
"""Export the svn repository at the url to the destination location"""
|
||||||
url, rev = self.get_url_rev()
|
url, rev = self.get_url_rev()
|
||||||
rev_options = get_rev_options(url, rev)
|
rev_options = get_rev_options(url, rev)
|
||||||
|
url = self.remove_auth_from_url(url)
|
||||||
logger.info('Exporting svn repository %s to %s', url, location)
|
logger.info('Exporting svn repository %s to %s', url, location)
|
||||||
with indent_log():
|
with indent_log():
|
||||||
if os.path.exists(location):
|
if os.path.exists(location):
|
||||||
|
@ -79,6 +80,7 @@ class Subversion(VersionControl):
|
||||||
def obtain(self, dest):
|
def obtain(self, dest):
|
||||||
url, rev = self.get_url_rev()
|
url, rev = self.get_url_rev()
|
||||||
rev_options = get_rev_options(url, rev)
|
rev_options = get_rev_options(url, rev)
|
||||||
|
url = self.remove_auth_from_url(url)
|
||||||
if rev:
|
if rev:
|
||||||
rev_display = ' (to revision %s)' % rev
|
rev_display = ' (to revision %s)' % rev
|
||||||
else:
|
else:
|
||||||
|
@ -217,6 +219,24 @@ class Subversion(VersionControl):
|
||||||
"""Always assume the versions don't match"""
|
"""Always assume the versions don't match"""
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def remove_auth_from_url(url):
|
||||||
|
# Return a copy of url with 'username:password@' removed.
|
||||||
|
# username/pass params are passed to subversion through flags
|
||||||
|
# and are not recognized in the url.
|
||||||
|
|
||||||
|
# parsed url
|
||||||
|
purl = urllib_parse.urlsplit(url)
|
||||||
|
stripped_netloc = \
|
||||||
|
purl.netloc.split('@')[-1]
|
||||||
|
|
||||||
|
# stripped url
|
||||||
|
url_pieces = (
|
||||||
|
purl.scheme, stripped_netloc, purl.path, purl.query, purl.fragment
|
||||||
|
)
|
||||||
|
surl = urllib_parse.urlunsplit(url_pieces)
|
||||||
|
return surl
|
||||||
|
|
||||||
|
|
||||||
def get_rev_options(url, rev):
|
def get_rev_options(url, rev):
|
||||||
if rev:
|
if rev:
|
||||||
|
|
|
@ -298,10 +298,11 @@ def move_wheel_files(name, req, wheeldir, user=False, home=None, root=None,
|
||||||
continue
|
continue
|
||||||
elif (is_base and
|
elif (is_base and
|
||||||
s.endswith('.dist-info') and
|
s.endswith('.dist-info') and
|
||||||
# is self.req.project_name case preserving?
|
canonicalize_name(s).startswith(
|
||||||
s.lower().startswith(
|
canonicalize_name(req.name))):
|
||||||
req.project_name.replace('-', '_').lower())):
|
assert not info_dir, ('Multiple .dist-info directories: ' +
|
||||||
assert not info_dir, 'Multiple .dist-info directories'
|
destsubdir + ', ' +
|
||||||
|
', '.join(info_dir))
|
||||||
info_dir.append(destsubdir)
|
info_dir.append(destsubdir)
|
||||||
for f in files:
|
for f in files:
|
||||||
# Skip unwanted files
|
# Skip unwanted files
|
||||||
|
@ -417,7 +418,7 @@ import sys
|
||||||
from %(module)s import %(import_name)s
|
from %(module)s import %(import_name)s
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
|
||||||
sys.exit(%(func)s())
|
sys.exit(%(func)s())
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -438,7 +439,7 @@ if __name__ == '__main__':
|
||||||
# Because setuptools and pip are bundled with _ensurepip and virtualenv,
|
# Because setuptools and pip are bundled with _ensurepip and virtualenv,
|
||||||
# we need to use universal wheels. So, as a stopgap until Metadata 2.0, we
|
# we need to use universal wheels. So, as a stopgap until Metadata 2.0, we
|
||||||
# override the versioned entry points in the wheel and generate the
|
# override the versioned entry points in the wheel and generate the
|
||||||
# correct ones. This code is purely a short-term measure until Metadat 2.0
|
# correct ones. This code is purely a short-term measure until Metadata 2.0
|
||||||
# is available.
|
# is available.
|
||||||
#
|
#
|
||||||
# To add the level of hack in this section of code, in order to support
|
# To add the level of hack in this section of code, in order to support
|
||||||
|
@ -757,11 +758,8 @@ class WheelBuilder(object):
|
||||||
if not autobuilding:
|
if not autobuilding:
|
||||||
logger.info(
|
logger.info(
|
||||||
'Skipping %s, due to already being wheel.', req.name)
|
'Skipping %s, due to already being wheel.', req.name)
|
||||||
elif req.editable:
|
elif autobuilding and req.editable:
|
||||||
if not autobuilding:
|
pass
|
||||||
logger.info(
|
|
||||||
'Skipping bdist_wheel for %s, due to being editable',
|
|
||||||
req.name)
|
|
||||||
elif autobuilding and req.link and not req.link.is_artifact:
|
elif autobuilding and req.link and not req.link.is_artifact:
|
||||||
pass
|
pass
|
||||||
elif autobuilding and not req.source_dir:
|
elif autobuilding and not req.source_dir:
|
||||||
|
@ -801,7 +799,7 @@ class WheelBuilder(object):
|
||||||
try:
|
try:
|
||||||
ensure_dir(output_dir)
|
ensure_dir(output_dir)
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
logger.warn("Building wheel for %s failed: %s",
|
logger.warning("Building wheel for %s failed: %s",
|
||||||
req.name, e)
|
req.name, e)
|
||||||
build_failure.append(req)
|
build_failure.append(req)
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -1,26 +1,36 @@
|
||||||
pkg_resources/__init__.py,sha256=bucu_98c11mzrGldEJeqxArn14F7ZmURsb-8CaNSbVo,108616
|
pkg_resources/__init__.py,sha256=qasrGUKwGQ8dGJP5SOEhLJoWRizj5HinbD2bXfrOH28,103308
|
||||||
pkg_resources/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
pkg_resources/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||||
|
pkg_resources/_vendor/appdirs.py,sha256=tgGaL0m4Jo2VeuGfoOOifLv7a7oUEJu2n1vRkqoPw-0,22374
|
||||||
|
pkg_resources/_vendor/pyparsing.py,sha256=PifeLY3-WhIcBVzLtv0U4T_pwDtPruBhBCkg5vLqa28,229867
|
||||||
pkg_resources/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098
|
pkg_resources/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098
|
||||||
pkg_resources/_vendor/packaging/__about__.py,sha256=YzdrW-1lWmyCBDyrcNkZbJo4tiDWXpoiqPjfyCYMzIE,1073
|
pkg_resources/_vendor/packaging/__about__.py,sha256=zkcCPTN_6TcLW0Nrlg0176-R1QQ_WVPTm8sz1R4-HjM,720
|
||||||
pkg_resources/_vendor/packaging/__init__.py,sha256=2V8n-eEpSgBuXlV8hlMmhU7ZklpsrrusWMZNp2gC4Hs,906
|
pkg_resources/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513
|
||||||
pkg_resources/_vendor/packaging/_compat.py,sha256=wofog8iYo_zudt_10i6JiXKHDs5GhCuXC09hCuSJiv4,1253
|
pkg_resources/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860
|
||||||
pkg_resources/_vendor/packaging/_structures.py,sha256=93YvgrEE2HgFp8AdXy0pwCRVnZeutRHO_-puJ7T0cPw,1809
|
pkg_resources/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416
|
||||||
pkg_resources/_vendor/packaging/specifiers.py,sha256=UV9T01_kKloA8PSeMI3HTYBSJ_4KLs00yLvrlciZ3yU,28079
|
pkg_resources/_vendor/packaging/markers.py,sha256=uEcBBtGvzqltgnArqb9c4RrcInXezDLos14zbBHhWJo,8248
|
||||||
pkg_resources/_vendor/packaging/version.py,sha256=dEGrWZJZ6sef1xMxSfDCego2hS3Q86by0hUIFVk-AGc,11949
|
pkg_resources/_vendor/packaging/requirements.py,sha256=SikL2UynbsT0qtY9ltqngndha_sfo0w6XGFhAhoSoaQ,4355
|
||||||
pkg_resources/extern/__init__.py,sha256=azKvXDutMVFe3c641wdiwndjtku92Bl3_iGVAIMKnsM,2461
|
pkg_resources/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025
|
||||||
|
pkg_resources/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421
|
||||||
|
pkg_resources/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556
|
||||||
|
pkg_resources/extern/__init__.py,sha256=JUtlHHvlxHSNuB4pWqNjcx7n6kG-fwXg7qmJ2zNJlIY,2487
|
||||||
pkg_resources-0.0.0.dist-info/DESCRIPTION.rst,sha256=OCTuuN6LcWulhHS3d5rfjdsQtW22n7HENFRh6jC6ego,10
|
pkg_resources-0.0.0.dist-info/DESCRIPTION.rst,sha256=OCTuuN6LcWulhHS3d5rfjdsQtW22n7HENFRh6jC6ego,10
|
||||||
pkg_resources-0.0.0.dist-info/METADATA,sha256=FOYDX6cmnDUkWo-yhqWQYtjKIMZR2IW2G1GFZhA6gUQ,177
|
pkg_resources-0.0.0.dist-info/METADATA,sha256=FOYDX6cmnDUkWo-yhqWQYtjKIMZR2IW2G1GFZhA6gUQ,177
|
||||||
pkg_resources-0.0.0.dist-info/RECORD,,
|
pkg_resources-0.0.0.dist-info/RECORD,,
|
||||||
pkg_resources-0.0.0.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110
|
pkg_resources-0.0.0.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110
|
||||||
pkg_resources-0.0.0.dist-info/metadata.json,sha256=8ZVRFU96pY_wnWouockCkvXw981Y0iDB5nQFFGq8ZiY,221
|
pkg_resources-0.0.0.dist-info/metadata.json,sha256=8ZVRFU96pY_wnWouockCkvXw981Y0iDB5nQFFGq8ZiY,221
|
||||||
pkg_resources-0.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
pkg_resources-0.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||||
pkg_resources/extern/__pycache__/__init__.cpython-34.pyc,,
|
pkg_resources/_vendor/packaging/__pycache__/version.cpython-34.pyc,,
|
||||||
pkg_resources/_vendor/__pycache__/__init__.cpython-34.pyc,,
|
pkg_resources/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
pkg_resources/_vendor/__pycache__/appdirs.cpython-34.pyc,,
|
||||||
|
pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-34.pyc,,
|
||||||
pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-34.pyc,,
|
pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-34.pyc,,
|
||||||
|
pkg_resources/_vendor/__pycache__/__init__.cpython-34.pyc,,
|
||||||
|
pkg_resources/_vendor/packaging/__pycache__/utils.cpython-34.pyc,,
|
||||||
|
pkg_resources/_vendor/__pycache__/six.cpython-34.pyc,,
|
||||||
|
pkg_resources/_vendor/__pycache__/pyparsing.cpython-34.pyc,,
|
||||||
|
pkg_resources/_vendor/packaging/__pycache__/markers.cpython-34.pyc,,
|
||||||
pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-34.pyc,,
|
pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-34.pyc,,
|
||||||
pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-34.pyc,,
|
pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-34.pyc,,
|
||||||
pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-34.pyc,,
|
pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-34.pyc,,
|
||||||
pkg_resources/__pycache__/__init__.cpython-34.pyc,,
|
pkg_resources/extern/__pycache__/__init__.cpython-34.pyc,,
|
||||||
pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-34.pyc,,
|
|
||||||
pkg_resources/_vendor/packaging/__pycache__/version.cpython-34.pyc,,
|
|
||||||
pkg_resources/_vendor/__pycache__/six.cpython-34.pyc,,
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
552
lib/python3.4/site-packages/pkg_resources/_vendor/appdirs.py
Normal file
552
lib/python3.4/site-packages/pkg_resources/_vendor/appdirs.py
Normal file
|
@ -0,0 +1,552 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2005-2010 ActiveState Software Inc.
|
||||||
|
# Copyright (c) 2013 Eddy Petrișor
|
||||||
|
|
||||||
|
"""Utilities for determining application-specific dirs.
|
||||||
|
|
||||||
|
See <http://github.com/ActiveState/appdirs> for details and usage.
|
||||||
|
"""
|
||||||
|
# Dev Notes:
|
||||||
|
# - MSDN on where to store app data files:
|
||||||
|
# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120
|
||||||
|
# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html
|
||||||
|
# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
|
||||||
|
|
||||||
|
__version_info__ = (1, 4, 0)
|
||||||
|
__version__ = '.'.join(map(str, __version_info__))
|
||||||
|
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
|
PY3 = sys.version_info[0] == 3
|
||||||
|
|
||||||
|
if PY3:
|
||||||
|
unicode = str
|
||||||
|
|
||||||
|
if sys.platform.startswith('java'):
|
||||||
|
import platform
|
||||||
|
os_name = platform.java_ver()[3][0]
|
||||||
|
if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc.
|
||||||
|
system = 'win32'
|
||||||
|
elif os_name.startswith('Mac'): # "Mac OS X", etc.
|
||||||
|
system = 'darwin'
|
||||||
|
else: # "Linux", "SunOS", "FreeBSD", etc.
|
||||||
|
# Setting this to "linux2" is not ideal, but only Windows or Mac
|
||||||
|
# are actually checked for and the rest of the module expects
|
||||||
|
# *sys.platform* style strings.
|
||||||
|
system = 'linux2'
|
||||||
|
else:
|
||||||
|
system = sys.platform
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def user_data_dir(appname=None, appauthor=None, version=None, roaming=False):
|
||||||
|
r"""Return full path to the user-specific data dir for this application.
|
||||||
|
|
||||||
|
"appname" is the name of application.
|
||||||
|
If None, just the system directory is returned.
|
||||||
|
"appauthor" (only used on Windows) is the name of the
|
||||||
|
appauthor or distributing body for this application. Typically
|
||||||
|
it is the owning company name. This falls back to appname. You may
|
||||||
|
pass False to disable it.
|
||||||
|
"version" is an optional version path element to append to the
|
||||||
|
path. You might want to use this if you want multiple versions
|
||||||
|
of your app to be able to run independently. If used, this
|
||||||
|
would typically be "<major>.<minor>".
|
||||||
|
Only applied when appname is present.
|
||||||
|
"roaming" (boolean, default False) can be set True to use the Windows
|
||||||
|
roaming appdata directory. That means that for users on a Windows
|
||||||
|
network setup for roaming profiles, this user data will be
|
||||||
|
sync'd on login. See
|
||||||
|
<http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>
|
||||||
|
for a discussion of issues.
|
||||||
|
|
||||||
|
Typical user data directories are:
|
||||||
|
Mac OS X: ~/Library/Application Support/<AppName>
|
||||||
|
Unix: ~/.local/share/<AppName> # or in $XDG_DATA_HOME, if defined
|
||||||
|
Win XP (not roaming): C:\Documents and Settings\<username>\Application Data\<AppAuthor>\<AppName>
|
||||||
|
Win XP (roaming): C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>
|
||||||
|
Win 7 (not roaming): C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>
|
||||||
|
Win 7 (roaming): C:\Users\<username>\AppData\Roaming\<AppAuthor>\<AppName>
|
||||||
|
|
||||||
|
For Unix, we follow the XDG spec and support $XDG_DATA_HOME.
|
||||||
|
That means, by default "~/.local/share/<AppName>".
|
||||||
|
"""
|
||||||
|
if system == "win32":
|
||||||
|
if appauthor is None:
|
||||||
|
appauthor = appname
|
||||||
|
const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA"
|
||||||
|
path = os.path.normpath(_get_win_folder(const))
|
||||||
|
if appname:
|
||||||
|
if appauthor is not False:
|
||||||
|
path = os.path.join(path, appauthor, appname)
|
||||||
|
else:
|
||||||
|
path = os.path.join(path, appname)
|
||||||
|
elif system == 'darwin':
|
||||||
|
path = os.path.expanduser('~/Library/Application Support/')
|
||||||
|
if appname:
|
||||||
|
path = os.path.join(path, appname)
|
||||||
|
else:
|
||||||
|
path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share"))
|
||||||
|
if appname:
|
||||||
|
path = os.path.join(path, appname)
|
||||||
|
if appname and version:
|
||||||
|
path = os.path.join(path, version)
|
||||||
|
return path
|
||||||
|
|
||||||
|
|
||||||
|
def site_data_dir(appname=None, appauthor=None, version=None, multipath=False):
|
||||||
|
"""Return full path to the user-shared data dir for this application.
|
||||||
|
|
||||||
|
"appname" is the name of application.
|
||||||
|
If None, just the system directory is returned.
|
||||||
|
"appauthor" (only used on Windows) is the name of the
|
||||||
|
appauthor or distributing body for this application. Typically
|
||||||
|
it is the owning company name. This falls back to appname. You may
|
||||||
|
pass False to disable it.
|
||||||
|
"version" is an optional version path element to append to the
|
||||||
|
path. You might want to use this if you want multiple versions
|
||||||
|
of your app to be able to run independently. If used, this
|
||||||
|
would typically be "<major>.<minor>".
|
||||||
|
Only applied when appname is present.
|
||||||
|
"multipath" is an optional parameter only applicable to *nix
|
||||||
|
which indicates that the entire list of data dirs should be
|
||||||
|
returned. By default, the first item from XDG_DATA_DIRS is
|
||||||
|
returned, or '/usr/local/share/<AppName>',
|
||||||
|
if XDG_DATA_DIRS is not set
|
||||||
|
|
||||||
|
Typical user data directories are:
|
||||||
|
Mac OS X: /Library/Application Support/<AppName>
|
||||||
|
Unix: /usr/local/share/<AppName> or /usr/share/<AppName>
|
||||||
|
Win XP: C:\Documents and Settings\All Users\Application Data\<AppAuthor>\<AppName>
|
||||||
|
Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.)
|
||||||
|
Win 7: C:\ProgramData\<AppAuthor>\<AppName> # Hidden, but writeable on Win 7.
|
||||||
|
|
||||||
|
For Unix, this is using the $XDG_DATA_DIRS[0] default.
|
||||||
|
|
||||||
|
WARNING: Do not use this on Windows. See the Vista-Fail note above for why.
|
||||||
|
"""
|
||||||
|
if system == "win32":
|
||||||
|
if appauthor is None:
|
||||||
|
appauthor = appname
|
||||||
|
path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA"))
|
||||||
|
if appname:
|
||||||
|
if appauthor is not False:
|
||||||
|
path = os.path.join(path, appauthor, appname)
|
||||||
|
else:
|
||||||
|
path = os.path.join(path, appname)
|
||||||
|
elif system == 'darwin':
|
||||||
|
path = os.path.expanduser('/Library/Application Support')
|
||||||
|
if appname:
|
||||||
|
path = os.path.join(path, appname)
|
||||||
|
else:
|
||||||
|
# XDG default for $XDG_DATA_DIRS
|
||||||
|
# only first, if multipath is False
|
||||||
|
path = os.getenv('XDG_DATA_DIRS',
|
||||||
|
os.pathsep.join(['/usr/local/share', '/usr/share']))
|
||||||
|
pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)]
|
||||||
|
if appname:
|
||||||
|
if version:
|
||||||
|
appname = os.path.join(appname, version)
|
||||||
|
pathlist = [os.sep.join([x, appname]) for x in pathlist]
|
||||||
|
|
||||||
|
if multipath:
|
||||||
|
path = os.pathsep.join(pathlist)
|
||||||
|
else:
|
||||||
|
path = pathlist[0]
|
||||||
|
return path
|
||||||
|
|
||||||
|
if appname and version:
|
||||||
|
path = os.path.join(path, version)
|
||||||
|
return path
|
||||||
|
|
||||||
|
|
||||||
|
def user_config_dir(appname=None, appauthor=None, version=None, roaming=False):
|
||||||
|
r"""Return full path to the user-specific config dir for this application.
|
||||||
|
|
||||||
|
"appname" is the name of application.
|
||||||
|
If None, just the system directory is returned.
|
||||||
|
"appauthor" (only used on Windows) is the name of the
|
||||||
|
appauthor or distributing body for this application. Typically
|
||||||
|
it is the owning company name. This falls back to appname. You may
|
||||||
|
pass False to disable it.
|
||||||
|
"version" is an optional version path element to append to the
|
||||||
|
path. You might want to use this if you want multiple versions
|
||||||
|
of your app to be able to run independently. If used, this
|
||||||
|
would typically be "<major>.<minor>".
|
||||||
|
Only applied when appname is present.
|
||||||
|
"roaming" (boolean, default False) can be set True to use the Windows
|
||||||
|
roaming appdata directory. That means that for users on a Windows
|
||||||
|
network setup for roaming profiles, this user data will be
|
||||||
|
sync'd on login. See
|
||||||
|
<http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>
|
||||||
|
for a discussion of issues.
|
||||||
|
|
||||||
|
Typical user data directories are:
|
||||||
|
Mac OS X: same as user_data_dir
|
||||||
|
Unix: ~/.config/<AppName> # or in $XDG_CONFIG_HOME, if defined
|
||||||
|
Win *: same as user_data_dir
|
||||||
|
|
||||||
|
For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME.
|
||||||
|
That means, by deafult "~/.config/<AppName>".
|
||||||
|
"""
|
||||||
|
if system in ["win32", "darwin"]:
|
||||||
|
path = user_data_dir(appname, appauthor, None, roaming)
|
||||||
|
else:
|
||||||
|
path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config"))
|
||||||
|
if appname:
|
||||||
|
path = os.path.join(path, appname)
|
||||||
|
if appname and version:
|
||||||
|
path = os.path.join(path, version)
|
||||||
|
return path
|
||||||
|
|
||||||
|
|
||||||
|
def site_config_dir(appname=None, appauthor=None, version=None, multipath=False):
|
||||||
|
"""Return full path to the user-shared data dir for this application.
|
||||||
|
|
||||||
|
"appname" is the name of application.
|
||||||
|
If None, just the system directory is returned.
|
||||||
|
"appauthor" (only used on Windows) is the name of the
|
||||||
|
appauthor or distributing body for this application. Typically
|
||||||
|
it is the owning company name. This falls back to appname. You may
|
||||||
|
pass False to disable it.
|
||||||
|
"version" is an optional version path element to append to the
|
||||||
|
path. You might want to use this if you want multiple versions
|
||||||
|
of your app to be able to run independently. If used, this
|
||||||
|
would typically be "<major>.<minor>".
|
||||||
|
Only applied when appname is present.
|
||||||
|
"multipath" is an optional parameter only applicable to *nix
|
||||||
|
which indicates that the entire list of config dirs should be
|
||||||
|
returned. By default, the first item from XDG_CONFIG_DIRS is
|
||||||
|
returned, or '/etc/xdg/<AppName>', if XDG_CONFIG_DIRS is not set
|
||||||
|
|
||||||
|
Typical user data directories are:
|
||||||
|
Mac OS X: same as site_data_dir
|
||||||
|
Unix: /etc/xdg/<AppName> or $XDG_CONFIG_DIRS[i]/<AppName> for each value in
|
||||||
|
$XDG_CONFIG_DIRS
|
||||||
|
Win *: same as site_data_dir
|
||||||
|
Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.)
|
||||||
|
|
||||||
|
For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False
|
||||||
|
|
||||||
|
WARNING: Do not use this on Windows. See the Vista-Fail note above for why.
|
||||||
|
"""
|
||||||
|
if system in ["win32", "darwin"]:
|
||||||
|
path = site_data_dir(appname, appauthor)
|
||||||
|
if appname and version:
|
||||||
|
path = os.path.join(path, version)
|
||||||
|
else:
|
||||||
|
# XDG default for $XDG_CONFIG_DIRS
|
||||||
|
# only first, if multipath is False
|
||||||
|
path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg')
|
||||||
|
pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)]
|
||||||
|
if appname:
|
||||||
|
if version:
|
||||||
|
appname = os.path.join(appname, version)
|
||||||
|
pathlist = [os.sep.join([x, appname]) for x in pathlist]
|
||||||
|
|
||||||
|
if multipath:
|
||||||
|
path = os.pathsep.join(pathlist)
|
||||||
|
else:
|
||||||
|
path = pathlist[0]
|
||||||
|
return path
|
||||||
|
|
||||||
|
|
||||||
|
def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True):
|
||||||
|
r"""Return full path to the user-specific cache dir for this application.
|
||||||
|
|
||||||
|
"appname" is the name of application.
|
||||||
|
If None, just the system directory is returned.
|
||||||
|
"appauthor" (only used on Windows) is the name of the
|
||||||
|
appauthor or distributing body for this application. Typically
|
||||||
|
it is the owning company name. This falls back to appname. You may
|
||||||
|
pass False to disable it.
|
||||||
|
"version" is an optional version path element to append to the
|
||||||
|
path. You might want to use this if you want multiple versions
|
||||||
|
of your app to be able to run independently. If used, this
|
||||||
|
would typically be "<major>.<minor>".
|
||||||
|
Only applied when appname is present.
|
||||||
|
"opinion" (boolean) can be False to disable the appending of
|
||||||
|
"Cache" to the base app data dir for Windows. See
|
||||||
|
discussion below.
|
||||||
|
|
||||||
|
Typical user cache directories are:
|
||||||
|
Mac OS X: ~/Library/Caches/<AppName>
|
||||||
|
Unix: ~/.cache/<AppName> (XDG default)
|
||||||
|
Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Cache
|
||||||
|
Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Cache
|
||||||
|
|
||||||
|
On Windows the only suggestion in the MSDN docs is that local settings go in
|
||||||
|
the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming
|
||||||
|
app data dir (the default returned by `user_data_dir` above). Apps typically
|
||||||
|
put cache data somewhere *under* the given dir here. Some examples:
|
||||||
|
...\Mozilla\Firefox\Profiles\<ProfileName>\Cache
|
||||||
|
...\Acme\SuperApp\Cache\1.0
|
||||||
|
OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value.
|
||||||
|
This can be disabled with the `opinion=False` option.
|
||||||
|
"""
|
||||||
|
if system == "win32":
|
||||||
|
if appauthor is None:
|
||||||
|
appauthor = appname
|
||||||
|
path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA"))
|
||||||
|
if appname:
|
||||||
|
if appauthor is not False:
|
||||||
|
path = os.path.join(path, appauthor, appname)
|
||||||
|
else:
|
||||||
|
path = os.path.join(path, appname)
|
||||||
|
if opinion:
|
||||||
|
path = os.path.join(path, "Cache")
|
||||||
|
elif system == 'darwin':
|
||||||
|
path = os.path.expanduser('~/Library/Caches')
|
||||||
|
if appname:
|
||||||
|
path = os.path.join(path, appname)
|
||||||
|
else:
|
||||||
|
path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache'))
|
||||||
|
if appname:
|
||||||
|
path = os.path.join(path, appname)
|
||||||
|
if appname and version:
|
||||||
|
path = os.path.join(path, version)
|
||||||
|
return path
|
||||||
|
|
||||||
|
|
||||||
|
def user_log_dir(appname=None, appauthor=None, version=None, opinion=True):
|
||||||
|
r"""Return full path to the user-specific log dir for this application.
|
||||||
|
|
||||||
|
"appname" is the name of application.
|
||||||
|
If None, just the system directory is returned.
|
||||||
|
"appauthor" (only used on Windows) is the name of the
|
||||||
|
appauthor or distributing body for this application. Typically
|
||||||
|
it is the owning company name. This falls back to appname. You may
|
||||||
|
pass False to disable it.
|
||||||
|
"version" is an optional version path element to append to the
|
||||||
|
path. You might want to use this if you want multiple versions
|
||||||
|
of your app to be able to run independently. If used, this
|
||||||
|
would typically be "<major>.<minor>".
|
||||||
|
Only applied when appname is present.
|
||||||
|
"opinion" (boolean) can be False to disable the appending of
|
||||||
|
"Logs" to the base app data dir for Windows, and "log" to the
|
||||||
|
base cache dir for Unix. See discussion below.
|
||||||
|
|
||||||
|
Typical user cache directories are:
|
||||||
|
Mac OS X: ~/Library/Logs/<AppName>
|
||||||
|
Unix: ~/.cache/<AppName>/log # or under $XDG_CACHE_HOME if defined
|
||||||
|
Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Logs
|
||||||
|
Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Logs
|
||||||
|
|
||||||
|
On Windows the only suggestion in the MSDN docs is that local settings
|
||||||
|
go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in
|
||||||
|
examples of what some windows apps use for a logs dir.)
|
||||||
|
|
||||||
|
OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA`
|
||||||
|
value for Windows and appends "log" to the user cache dir for Unix.
|
||||||
|
This can be disabled with the `opinion=False` option.
|
||||||
|
"""
|
||||||
|
if system == "darwin":
|
||||||
|
path = os.path.join(
|
||||||
|
os.path.expanduser('~/Library/Logs'),
|
||||||
|
appname)
|
||||||
|
elif system == "win32":
|
||||||
|
path = user_data_dir(appname, appauthor, version)
|
||||||
|
version = False
|
||||||
|
if opinion:
|
||||||
|
path = os.path.join(path, "Logs")
|
||||||
|
else:
|
||||||
|
path = user_cache_dir(appname, appauthor, version)
|
||||||
|
version = False
|
||||||
|
if opinion:
|
||||||
|
path = os.path.join(path, "log")
|
||||||
|
if appname and version:
|
||||||
|
path = os.path.join(path, version)
|
||||||
|
return path
|
||||||
|
|
||||||
|
|
||||||
|
class AppDirs(object):
|
||||||
|
"""Convenience wrapper for getting application dirs."""
|
||||||
|
def __init__(self, appname, appauthor=None, version=None, roaming=False,
|
||||||
|
multipath=False):
|
||||||
|
self.appname = appname
|
||||||
|
self.appauthor = appauthor
|
||||||
|
self.version = version
|
||||||
|
self.roaming = roaming
|
||||||
|
self.multipath = multipath
|
||||||
|
|
||||||
|
@property
|
||||||
|
def user_data_dir(self):
|
||||||
|
return user_data_dir(self.appname, self.appauthor,
|
||||||
|
version=self.version, roaming=self.roaming)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def site_data_dir(self):
|
||||||
|
return site_data_dir(self.appname, self.appauthor,
|
||||||
|
version=self.version, multipath=self.multipath)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def user_config_dir(self):
|
||||||
|
return user_config_dir(self.appname, self.appauthor,
|
||||||
|
version=self.version, roaming=self.roaming)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def site_config_dir(self):
|
||||||
|
return site_config_dir(self.appname, self.appauthor,
|
||||||
|
version=self.version, multipath=self.multipath)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def user_cache_dir(self):
|
||||||
|
return user_cache_dir(self.appname, self.appauthor,
|
||||||
|
version=self.version)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def user_log_dir(self):
|
||||||
|
return user_log_dir(self.appname, self.appauthor,
|
||||||
|
version=self.version)
|
||||||
|
|
||||||
|
|
||||||
|
#---- internal support stuff
|
||||||
|
|
||||||
|
def _get_win_folder_from_registry(csidl_name):
|
||||||
|
"""This is a fallback technique at best. I'm not sure if using the
|
||||||
|
registry for this guarantees us the correct answer for all CSIDL_*
|
||||||
|
names.
|
||||||
|
"""
|
||||||
|
import _winreg
|
||||||
|
|
||||||
|
shell_folder_name = {
|
||||||
|
"CSIDL_APPDATA": "AppData",
|
||||||
|
"CSIDL_COMMON_APPDATA": "Common AppData",
|
||||||
|
"CSIDL_LOCAL_APPDATA": "Local AppData",
|
||||||
|
}[csidl_name]
|
||||||
|
|
||||||
|
key = _winreg.OpenKey(
|
||||||
|
_winreg.HKEY_CURRENT_USER,
|
||||||
|
r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
|
||||||
|
)
|
||||||
|
dir, type = _winreg.QueryValueEx(key, shell_folder_name)
|
||||||
|
return dir
|
||||||
|
|
||||||
|
|
||||||
|
def _get_win_folder_with_pywin32(csidl_name):
|
||||||
|
from win32com.shell import shellcon, shell
|
||||||
|
dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0)
|
||||||
|
# Try to make this a unicode path because SHGetFolderPath does
|
||||||
|
# not return unicode strings when there is unicode data in the
|
||||||
|
# path.
|
||||||
|
try:
|
||||||
|
dir = unicode(dir)
|
||||||
|
|
||||||
|
# Downgrade to short path name if have highbit chars. See
|
||||||
|
# <http://bugs.activestate.com/show_bug.cgi?id=85099>.
|
||||||
|
has_high_char = False
|
||||||
|
for c in dir:
|
||||||
|
if ord(c) > 255:
|
||||||
|
has_high_char = True
|
||||||
|
break
|
||||||
|
if has_high_char:
|
||||||
|
try:
|
||||||
|
import win32api
|
||||||
|
dir = win32api.GetShortPathName(dir)
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
except UnicodeError:
|
||||||
|
pass
|
||||||
|
return dir
|
||||||
|
|
||||||
|
|
||||||
|
def _get_win_folder_with_ctypes(csidl_name):
|
||||||
|
import ctypes
|
||||||
|
|
||||||
|
csidl_const = {
|
||||||
|
"CSIDL_APPDATA": 26,
|
||||||
|
"CSIDL_COMMON_APPDATA": 35,
|
||||||
|
"CSIDL_LOCAL_APPDATA": 28,
|
||||||
|
}[csidl_name]
|
||||||
|
|
||||||
|
buf = ctypes.create_unicode_buffer(1024)
|
||||||
|
ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf)
|
||||||
|
|
||||||
|
# Downgrade to short path name if have highbit chars. See
|
||||||
|
# <http://bugs.activestate.com/show_bug.cgi?id=85099>.
|
||||||
|
has_high_char = False
|
||||||
|
for c in buf:
|
||||||
|
if ord(c) > 255:
|
||||||
|
has_high_char = True
|
||||||
|
break
|
||||||
|
if has_high_char:
|
||||||
|
buf2 = ctypes.create_unicode_buffer(1024)
|
||||||
|
if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024):
|
||||||
|
buf = buf2
|
||||||
|
|
||||||
|
return buf.value
|
||||||
|
|
||||||
|
def _get_win_folder_with_jna(csidl_name):
|
||||||
|
import array
|
||||||
|
from com.sun import jna
|
||||||
|
from com.sun.jna.platform import win32
|
||||||
|
|
||||||
|
buf_size = win32.WinDef.MAX_PATH * 2
|
||||||
|
buf = array.zeros('c', buf_size)
|
||||||
|
shell = win32.Shell32.INSTANCE
|
||||||
|
shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf)
|
||||||
|
dir = jna.Native.toString(buf.tostring()).rstrip("\0")
|
||||||
|
|
||||||
|
# Downgrade to short path name if have highbit chars. See
|
||||||
|
# <http://bugs.activestate.com/show_bug.cgi?id=85099>.
|
||||||
|
has_high_char = False
|
||||||
|
for c in dir:
|
||||||
|
if ord(c) > 255:
|
||||||
|
has_high_char = True
|
||||||
|
break
|
||||||
|
if has_high_char:
|
||||||
|
buf = array.zeros('c', buf_size)
|
||||||
|
kernel = win32.Kernel32.INSTANCE
|
||||||
|
if kernal.GetShortPathName(dir, buf, buf_size):
|
||||||
|
dir = jna.Native.toString(buf.tostring()).rstrip("\0")
|
||||||
|
|
||||||
|
return dir
|
||||||
|
|
||||||
|
if system == "win32":
|
||||||
|
try:
|
||||||
|
import win32com.shell
|
||||||
|
_get_win_folder = _get_win_folder_with_pywin32
|
||||||
|
except ImportError:
|
||||||
|
try:
|
||||||
|
from ctypes import windll
|
||||||
|
_get_win_folder = _get_win_folder_with_ctypes
|
||||||
|
except ImportError:
|
||||||
|
try:
|
||||||
|
import com.sun.jna
|
||||||
|
_get_win_folder = _get_win_folder_with_jna
|
||||||
|
except ImportError:
|
||||||
|
_get_win_folder = _get_win_folder_from_registry
|
||||||
|
|
||||||
|
|
||||||
|
#---- self test code
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
appname = "MyApp"
|
||||||
|
appauthor = "MyCompany"
|
||||||
|
|
||||||
|
props = ("user_data_dir", "site_data_dir",
|
||||||
|
"user_config_dir", "site_config_dir",
|
||||||
|
"user_cache_dir", "user_log_dir")
|
||||||
|
|
||||||
|
print("-- app dirs (with optional 'version')")
|
||||||
|
dirs = AppDirs(appname, appauthor, version="1.0")
|
||||||
|
for prop in props:
|
||||||
|
print("%s: %s" % (prop, getattr(dirs, prop)))
|
||||||
|
|
||||||
|
print("\n-- app dirs (without optional 'version')")
|
||||||
|
dirs = AppDirs(appname, appauthor)
|
||||||
|
for prop in props:
|
||||||
|
print("%s: %s" % (prop, getattr(dirs, prop)))
|
||||||
|
|
||||||
|
print("\n-- app dirs (without optional 'appauthor')")
|
||||||
|
dirs = AppDirs(appname)
|
||||||
|
for prop in props:
|
||||||
|
print("%s: %s" % (prop, getattr(dirs, prop)))
|
||||||
|
|
||||||
|
print("\n-- app dirs (with disabled 'appauthor')")
|
||||||
|
dirs = AppDirs(appname, appauthor=False)
|
||||||
|
for prop in props:
|
||||||
|
print("%s: %s" % (prop, getattr(dirs, prop)))
|
|
@ -1,16 +1,6 @@
|
||||||
# Copyright 2014 Donald Stufft
|
# This file is dual licensed under the terms of the Apache License, Version
|
||||||
#
|
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# for complete details.
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
from __future__ import absolute_import, division, print_function
|
from __future__ import absolute_import, division, print_function
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
|
@ -22,10 +12,10 @@ __title__ = "packaging"
|
||||||
__summary__ = "Core utilities for Python packages"
|
__summary__ = "Core utilities for Python packages"
|
||||||
__uri__ = "https://github.com/pypa/packaging"
|
__uri__ = "https://github.com/pypa/packaging"
|
||||||
|
|
||||||
__version__ = "15.3"
|
__version__ = "16.8"
|
||||||
|
|
||||||
__author__ = "Donald Stufft"
|
__author__ = "Donald Stufft and individual contributors"
|
||||||
__email__ = "donald@stufft.io"
|
__email__ = "donald@stufft.io"
|
||||||
|
|
||||||
__license__ = "Apache License, Version 2.0"
|
__license__ = "BSD or Apache License, Version 2.0"
|
||||||
__copyright__ = "Copyright 2014 %s" % __author__
|
__copyright__ = "Copyright 2014-2016 %s" % __author__
|
||||||
|
|
|
@ -1,16 +1,6 @@
|
||||||
# Copyright 2014 Donald Stufft
|
# This file is dual licensed under the terms of the Apache License, Version
|
||||||
#
|
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# for complete details.
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
from __future__ import absolute_import, division, print_function
|
from __future__ import absolute_import, division, print_function
|
||||||
|
|
||||||
from .__about__ import (
|
from .__about__ import (
|
||||||
|
|
|
@ -1,16 +1,6 @@
|
||||||
# Copyright 2014 Donald Stufft
|
# This file is dual licensed under the terms of the Apache License, Version
|
||||||
#
|
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# for complete details.
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
from __future__ import absolute_import, division, print_function
|
from __future__ import absolute_import, division, print_function
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
|
@ -1,16 +1,6 @@
|
||||||
# Copyright 2014 Donald Stufft
|
# This file is dual licensed under the terms of the Apache License, Version
|
||||||
#
|
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# for complete details.
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
from __future__ import absolute_import, division, print_function
|
from __future__ import absolute_import, division, print_function
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -52,13 +52,26 @@ class Node(object):
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<{0}({1!r})>".format(self.__class__.__name__, str(self))
|
return "<{0}({1!r})>".format(self.__class__.__name__, str(self))
|
||||||
|
|
||||||
|
def serialize(self):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
|
||||||
class Variable(Node):
|
class Variable(Node):
|
||||||
pass
|
|
||||||
|
def serialize(self):
|
||||||
|
return str(self)
|
||||||
|
|
||||||
|
|
||||||
class Value(Node):
|
class Value(Node):
|
||||||
pass
|
|
||||||
|
def serialize(self):
|
||||||
|
return '"{0}"'.format(self)
|
||||||
|
|
||||||
|
|
||||||
|
class Op(Node):
|
||||||
|
|
||||||
|
def serialize(self):
|
||||||
|
return str(self)
|
||||||
|
|
||||||
|
|
||||||
VARIABLE = (
|
VARIABLE = (
|
||||||
|
@ -73,9 +86,23 @@ VARIABLE = (
|
||||||
L("python_version") |
|
L("python_version") |
|
||||||
L("sys_platform") |
|
L("sys_platform") |
|
||||||
L("os_name") |
|
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("extra")
|
||||||
)
|
)
|
||||||
VARIABLE.setParseAction(lambda s, l, t: Variable(t[0]))
|
ALIASES = {
|
||||||
|
'os.name': 'os_name',
|
||||||
|
'sys.platform': 'sys_platform',
|
||||||
|
'platform.version': 'platform_version',
|
||||||
|
'platform.machine': 'platform_machine',
|
||||||
|
'platform.python_implementation': 'platform_python_implementation',
|
||||||
|
'python_implementation': 'platform_python_implementation'
|
||||||
|
}
|
||||||
|
VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0])))
|
||||||
|
|
||||||
VERSION_CMP = (
|
VERSION_CMP = (
|
||||||
L("===") |
|
L("===") |
|
||||||
|
@ -89,6 +116,7 @@ VERSION_CMP = (
|
||||||
)
|
)
|
||||||
|
|
||||||
MARKER_OP = VERSION_CMP | L("not in") | L("in")
|
MARKER_OP = VERSION_CMP | L("not in") | L("in")
|
||||||
|
MARKER_OP.setParseAction(lambda s, l, t: Op(t[0]))
|
||||||
|
|
||||||
MARKER_VALUE = QuotedString("'") | QuotedString('"')
|
MARKER_VALUE = QuotedString("'") | QuotedString('"')
|
||||||
MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0]))
|
MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0]))
|
||||||
|
@ -135,7 +163,7 @@ def _format_marker(marker, first=True):
|
||||||
else:
|
else:
|
||||||
return "(" + " ".join(inner) + ")"
|
return "(" + " ".join(inner) + ")"
|
||||||
elif isinstance(marker, tuple):
|
elif isinstance(marker, tuple):
|
||||||
return '{0} {1} "{2}"'.format(*marker)
|
return " ".join([m.serialize() for m in marker])
|
||||||
else:
|
else:
|
||||||
return marker
|
return marker
|
||||||
|
|
||||||
|
@ -154,13 +182,13 @@ _operators = {
|
||||||
|
|
||||||
def _eval_op(lhs, op, rhs):
|
def _eval_op(lhs, op, rhs):
|
||||||
try:
|
try:
|
||||||
spec = Specifier("".join([op, rhs]))
|
spec = Specifier("".join([op.serialize(), rhs]))
|
||||||
except InvalidSpecifier:
|
except InvalidSpecifier:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
return spec.contains(lhs)
|
return spec.contains(lhs)
|
||||||
|
|
||||||
oper = _operators.get(op)
|
oper = _operators.get(op.serialize())
|
||||||
if oper is None:
|
if oper is None:
|
||||||
raise UndefinedComparison(
|
raise UndefinedComparison(
|
||||||
"Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs)
|
"Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs)
|
||||||
|
|
|
@ -1,16 +1,6 @@
|
||||||
# Copyright 2014 Donald Stufft
|
# This file is dual licensed under the terms of the Apache License, Version
|
||||||
#
|
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# for complete details.
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
from __future__ import absolute_import, division, print_function
|
from __future__ import absolute_import, division, print_function
|
||||||
|
|
||||||
import abc
|
import abc
|
||||||
|
@ -204,8 +194,8 @@ class _IndividualSpecifier(BaseSpecifier):
|
||||||
# If our version is a prerelease, and we were not set to allow
|
# If our version is a prerelease, and we were not set to allow
|
||||||
# prereleases, then we'll store it for later incase nothing
|
# prereleases, then we'll store it for later incase nothing
|
||||||
# else matches this specifier.
|
# else matches this specifier.
|
||||||
if (parsed_version.is_prerelease
|
if (parsed_version.is_prerelease and not
|
||||||
and not (prereleases or self.prereleases)):
|
(prereleases or self.prereleases)):
|
||||||
found_prereleases.append(version)
|
found_prereleases.append(version)
|
||||||
# Either this is not a prerelease, or we should have been
|
# Either this is not a prerelease, or we should have been
|
||||||
# accepting prereleases from the begining.
|
# accepting prereleases from the begining.
|
||||||
|
@ -223,23 +213,23 @@ class _IndividualSpecifier(BaseSpecifier):
|
||||||
|
|
||||||
class LegacySpecifier(_IndividualSpecifier):
|
class LegacySpecifier(_IndividualSpecifier):
|
||||||
|
|
||||||
_regex = re.compile(
|
_regex_str = (
|
||||||
r"""
|
r"""
|
||||||
^
|
|
||||||
\s*
|
|
||||||
(?P<operator>(==|!=|<=|>=|<|>))
|
(?P<operator>(==|!=|<=|>=|<|>))
|
||||||
\s*
|
\s*
|
||||||
(?P<version>
|
(?P<version>
|
||||||
[^\s]* # We just match everything, except for whitespace since this
|
[^,;\s)]* # Since this is a "legacy" specifier, and the version
|
||||||
# is a "legacy" specifier and the version string can be just
|
# string can be just about anything, we match everything
|
||||||
# about anything.
|
# except for whitespace, a semi-colon for marker support,
|
||||||
|
# a closing paren since versions can be enclosed in
|
||||||
|
# them, and a comma since it's a version separator.
|
||||||
)
|
)
|
||||||
\s*
|
"""
|
||||||
$
|
|
||||||
""",
|
|
||||||
re.VERBOSE | re.IGNORECASE,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
_regex = re.compile(
|
||||||
|
r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE)
|
||||||
|
|
||||||
_operators = {
|
_operators = {
|
||||||
"==": "equal",
|
"==": "equal",
|
||||||
"!=": "not_equal",
|
"!=": "not_equal",
|
||||||
|
@ -284,10 +274,8 @@ def _require_version_compare(fn):
|
||||||
|
|
||||||
class Specifier(_IndividualSpecifier):
|
class Specifier(_IndividualSpecifier):
|
||||||
|
|
||||||
_regex = re.compile(
|
_regex_str = (
|
||||||
r"""
|
r"""
|
||||||
^
|
|
||||||
\s*
|
|
||||||
(?P<operator>(~=|==|!=|<=|>=|<|>|===))
|
(?P<operator>(~=|==|!=|<=|>=|<|>|===))
|
||||||
(?P<version>
|
(?P<version>
|
||||||
(?:
|
(?:
|
||||||
|
@ -378,12 +366,12 @@ class Specifier(_IndividualSpecifier):
|
||||||
(?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release
|
(?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
\s*
|
"""
|
||||||
$
|
|
||||||
""",
|
|
||||||
re.VERBOSE | re.IGNORECASE,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
_regex = re.compile(
|
||||||
|
r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE)
|
||||||
|
|
||||||
_operators = {
|
_operators = {
|
||||||
"~=": "compatible",
|
"~=": "compatible",
|
||||||
"==": "equal",
|
"==": "equal",
|
||||||
|
@ -409,8 +397,8 @@ class Specifier(_IndividualSpecifier):
|
||||||
prefix = ".".join(
|
prefix = ".".join(
|
||||||
list(
|
list(
|
||||||
itertools.takewhile(
|
itertools.takewhile(
|
||||||
lambda x: (not x.startswith("post")
|
lambda x: (not x.startswith("post") and not
|
||||||
and not x.startswith("dev")),
|
x.startswith("dev")),
|
||||||
_version_split(spec),
|
_version_split(spec),
|
||||||
)
|
)
|
||||||
)[:-1]
|
)[:-1]
|
||||||
|
@ -419,13 +407,15 @@ class Specifier(_IndividualSpecifier):
|
||||||
# Add the prefix notation to the end of our string
|
# Add the prefix notation to the end of our string
|
||||||
prefix += ".*"
|
prefix += ".*"
|
||||||
|
|
||||||
return (self._get_operator(">=")(prospective, spec)
|
return (self._get_operator(">=")(prospective, spec) and
|
||||||
and self._get_operator("==")(prospective, prefix))
|
self._get_operator("==")(prospective, prefix))
|
||||||
|
|
||||||
@_require_version_compare
|
@_require_version_compare
|
||||||
def _compare_equal(self, prospective, spec):
|
def _compare_equal(self, prospective, spec):
|
||||||
# We need special logic to handle prefix matching
|
# We need special logic to handle prefix matching
|
||||||
if spec.endswith(".*"):
|
if spec.endswith(".*"):
|
||||||
|
# In the case of prefix matching we want to ignore local segment.
|
||||||
|
prospective = Version(prospective.public)
|
||||||
# Split the spec out by dots, and pretend that there is an implicit
|
# Split the spec out by dots, and pretend that there is an implicit
|
||||||
# dot in between a release segment and a pre-release segment.
|
# dot in between a release segment and a pre-release segment.
|
||||||
spec = _version_split(spec[:-2]) # Remove the trailing .*
|
spec = _version_split(spec[:-2]) # Remove the trailing .*
|
||||||
|
@ -577,8 +567,8 @@ def _pad_version(left, right):
|
||||||
right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right)))
|
right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right)))
|
||||||
|
|
||||||
# Get the rest of our versions
|
# Get the rest of our versions
|
||||||
left_split.append(left[len(left_split):])
|
left_split.append(left[len(left_split[0]):])
|
||||||
right_split.append(left[len(right_split):])
|
right_split.append(right[len(right_split[0]):])
|
||||||
|
|
||||||
# Insert our padding
|
# Insert our padding
|
||||||
left_split.insert(
|
left_split.insert(
|
||||||
|
|
|
@ -1,16 +1,6 @@
|
||||||
# Copyright 2014 Donald Stufft
|
# This file is dual licensed under the terms of the Apache License, Version
|
||||||
#
|
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# for complete details.
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
from __future__ import absolute_import, division, print_function
|
from __future__ import absolute_import, division, print_function
|
||||||
|
|
||||||
import collections
|
import collections
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -6,6 +6,7 @@ class VendorImporter:
|
||||||
A PEP 302 meta path importer for finding optionally-vendored
|
A PEP 302 meta path importer for finding optionally-vendored
|
||||||
or otherwise naturally-installed packages from root_name.
|
or otherwise naturally-installed packages from root_name.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, root_name, vendored_names=(), vendor_pkg=None):
|
def __init__(self, root_name, vendored_names=(), vendor_pkg=None):
|
||||||
self.root_name = root_name
|
self.root_name = root_name
|
||||||
self.vendored_names = set(vendored_names)
|
self.vendored_names = set(vendored_names)
|
||||||
|
@ -67,5 +68,6 @@ class VendorImporter:
|
||||||
if self not in sys.meta_path:
|
if self not in sys.meta_path:
|
||||||
sys.meta_path.append(self)
|
sys.meta_path.append(self)
|
||||||
|
|
||||||
names = 'packaging', 'six'
|
|
||||||
|
names = 'packaging', 'pyparsing', 'six', 'appdirs'
|
||||||
VendorImporter(__name__, names).install()
|
VendorImporter(__name__, names).install()
|
||||||
|
|
22
lib/python3.4/site-packages/pkg_resources/py31compat.py
Normal file
22
lib/python3.4/site-packages/pkg_resources/py31compat.py
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
import os
|
||||||
|
import errno
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def _makedirs_31(path, exist_ok=False):
|
||||||
|
try:
|
||||||
|
os.makedirs(path)
|
||||||
|
except OSError as exc:
|
||||||
|
if not exist_ok or exc.errno != errno.EEXIST:
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
# rely on compatibility behavior until mode considerations
|
||||||
|
# and exists_ok considerations are disentangled.
|
||||||
|
# See https://github.com/pypa/setuptools/pull/1083#issuecomment-315168663
|
||||||
|
needs_makedirs = (
|
||||||
|
sys.version_info < (3, 2, 5) or
|
||||||
|
(3, 3) <= sys.version_info < (3, 3, 6) or
|
||||||
|
(3, 4) <= sys.version_info < (3, 4, 1)
|
||||||
|
)
|
||||||
|
makedirs = _makedirs_31 if needs_makedirs else os.makedirs
|
|
@ -1,238 +0,0 @@
|
||||||
===============================
|
|
||||||
Installing and Using Setuptools
|
|
||||||
===============================
|
|
||||||
|
|
||||||
.. contents:: **Table of Contents**
|
|
||||||
|
|
||||||
|
|
||||||
`Change History <https://pythonhosted.org/setuptools/history.html>`_.
|
|
||||||
|
|
||||||
-------------------------
|
|
||||||
Installation Instructions
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
The recommended way to bootstrap setuptools on any system is to download
|
|
||||||
`ez_setup.py`_ and run it using the target Python environment. Different
|
|
||||||
operating systems have different recommended techniques to accomplish this
|
|
||||||
basic routine, so below are some examples to get you started.
|
|
||||||
|
|
||||||
Setuptools requires Python 2.6 or later. To install setuptools
|
|
||||||
on Python 2.4 or Python 2.5, use the `bootstrap script for Setuptools 1.x
|
|
||||||
<https://bitbucket.org/pypa/setuptools/raw/bootstrap-py24/ez_setup.py>`_.
|
|
||||||
|
|
||||||
The link provided to ez_setup.py is a bookmark to bootstrap script for the
|
|
||||||
latest known stable release.
|
|
||||||
|
|
||||||
.. _ez_setup.py: https://bootstrap.pypa.io/ez_setup.py
|
|
||||||
|
|
||||||
Windows (Powershell 3 or later)
|
|
||||||
===============================
|
|
||||||
|
|
||||||
For best results, uninstall previous versions FIRST (see `Uninstalling`_).
|
|
||||||
|
|
||||||
Using Windows 8 (which includes PowerShell 3) or earlier versions of Windows
|
|
||||||
with PowerShell 3 installed, it's possible to install with one simple
|
|
||||||
Powershell command. Start up Powershell and paste this command::
|
|
||||||
|
|
||||||
> (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python -
|
|
||||||
|
|
||||||
You must start the Powershell with Administrative privileges or you may choose
|
|
||||||
to install a user-local installation::
|
|
||||||
|
|
||||||
> (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python - --user
|
|
||||||
|
|
||||||
If you have Python 3.3 or later, you can use the ``py`` command to install to
|
|
||||||
different Python versions. For example, to install to Python 3.3 if you have
|
|
||||||
Python 2.7 installed::
|
|
||||||
|
|
||||||
> (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | py -3 -
|
|
||||||
|
|
||||||
The recommended way to install setuptools on Windows is to download
|
|
||||||
`ez_setup.py`_ and run it. The script will download the appropriate
|
|
||||||
distribution file and install it for you.
|
|
||||||
|
|
||||||
Once installation is complete, you will find an ``easy_install`` program in
|
|
||||||
your Python ``Scripts`` subdirectory. For simple invocation and best results,
|
|
||||||
add this directory to your ``PATH`` environment variable, if it is not already
|
|
||||||
present. If you did a user-local install, the ``Scripts`` subdirectory is
|
|
||||||
``$env:APPDATA\Python\Scripts``.
|
|
||||||
|
|
||||||
|
|
||||||
Windows (simplified)
|
|
||||||
====================
|
|
||||||
|
|
||||||
For Windows without PowerShell 3 or for installation without a command-line,
|
|
||||||
download `ez_setup.py`_ using your preferred web browser or other technique
|
|
||||||
and "run" that file.
|
|
||||||
|
|
||||||
|
|
||||||
Unix (wget)
|
|
||||||
===========
|
|
||||||
|
|
||||||
Most Linux distributions come with wget.
|
|
||||||
|
|
||||||
Download `ez_setup.py`_ and run it using the target Python version. The script
|
|
||||||
will download the appropriate version and install it for you::
|
|
||||||
|
|
||||||
> wget https://bootstrap.pypa.io/ez_setup.py -O - | python
|
|
||||||
|
|
||||||
Note that you will may need to invoke the command with superuser privileges to
|
|
||||||
install to the system Python::
|
|
||||||
|
|
||||||
> wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python
|
|
||||||
|
|
||||||
Alternatively, Setuptools may be installed to a user-local path::
|
|
||||||
|
|
||||||
> wget https://bootstrap.pypa.io/ez_setup.py -O - | python - --user
|
|
||||||
|
|
||||||
Note that on some older systems (noted on Debian 6 and CentOS 5 installations),
|
|
||||||
`wget` may refuse to download `ez_setup.py`, complaining that the certificate common name `*.c.ssl.fastly.net`
|
|
||||||
does not match the host name `bootstrap.pypa.io`. In addition, the `ez_setup.py` script may then encounter similar problems using
|
|
||||||
`wget` internally to download `setuptools-x.y.zip`, complaining that the certificate common name of `www.python.org` does not match the
|
|
||||||
host name `pypi.python.org`. Those are known issues, related to a bug in the older versions of `wget`
|
|
||||||
(see `Issue 59 <https://bitbucket.org/pypa/pypi/issue/59#comment-5881915>`_). If you happen to encounter them,
|
|
||||||
install Setuptools as follows::
|
|
||||||
|
|
||||||
> wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py
|
|
||||||
> python ez_setup.py --insecure
|
|
||||||
|
|
||||||
|
|
||||||
Unix including Mac OS X (curl)
|
|
||||||
==============================
|
|
||||||
|
|
||||||
If your system has curl installed, follow the ``wget`` instructions but
|
|
||||||
replace ``wget`` with ``curl`` and ``-O`` with ``-o``. For example::
|
|
||||||
|
|
||||||
> curl https://bootstrap.pypa.io/ez_setup.py -o - | python
|
|
||||||
|
|
||||||
|
|
||||||
Advanced Installation
|
|
||||||
=====================
|
|
||||||
|
|
||||||
For more advanced installation options, such as installing to custom
|
|
||||||
locations or prefixes, download and extract the source
|
|
||||||
tarball from `Setuptools on PyPI <https://pypi.python.org/pypi/setuptools>`_
|
|
||||||
and run setup.py with any supported distutils and Setuptools options.
|
|
||||||
For example::
|
|
||||||
|
|
||||||
setuptools-x.x$ python setup.py install --prefix=/opt/setuptools
|
|
||||||
|
|
||||||
Use ``--help`` to get a full options list, but we recommend consulting
|
|
||||||
the `EasyInstall manual`_ for detailed instructions, especially `the section
|
|
||||||
on custom installation locations`_.
|
|
||||||
|
|
||||||
.. _EasyInstall manual: https://pythonhosted.org/setuptools/EasyInstall
|
|
||||||
.. _the section on custom installation locations: https://pythonhosted.org/setuptools/EasyInstall#custom-installation-locations
|
|
||||||
|
|
||||||
|
|
||||||
Downloads
|
|
||||||
=========
|
|
||||||
|
|
||||||
All setuptools downloads can be found at `the project's home page in the Python
|
|
||||||
Package Index`_. Scroll to the very bottom of the page to find the links.
|
|
||||||
|
|
||||||
.. _the project's home page in the Python Package Index: https://pypi.python.org/pypi/setuptools
|
|
||||||
|
|
||||||
In addition to the PyPI downloads, the development version of ``setuptools``
|
|
||||||
is available from the `Bitbucket repo`_, and in-development versions of the
|
|
||||||
`0.6 branch`_ are available as well.
|
|
||||||
|
|
||||||
.. _Bitbucket repo: https://bitbucket.org/pypa/setuptools/get/default.tar.gz#egg=setuptools-dev
|
|
||||||
.. _0.6 branch: http://svn.python.org/projects/sandbox/branches/setuptools-0.6/#egg=setuptools-dev06
|
|
||||||
|
|
||||||
Uninstalling
|
|
||||||
============
|
|
||||||
|
|
||||||
On Windows, if Setuptools was installed using an ``.exe`` or ``.msi``
|
|
||||||
installer, simply use the uninstall feature of "Add/Remove Programs" in the
|
|
||||||
Control Panel.
|
|
||||||
|
|
||||||
Otherwise, to uninstall Setuptools or Distribute, regardless of the Python
|
|
||||||
version, delete all ``setuptools*`` and ``distribute*`` files and
|
|
||||||
directories from your system's ``site-packages`` directory
|
|
||||||
(and any other ``sys.path`` directories) FIRST.
|
|
||||||
|
|
||||||
If you are upgrading or otherwise plan to re-install Setuptools or Distribute,
|
|
||||||
nothing further needs to be done. If you want to completely remove Setuptools,
|
|
||||||
you may also want to remove the 'easy_install' and 'easy_install-x.x' scripts
|
|
||||||
and associated executables installed to the Python scripts directory.
|
|
||||||
|
|
||||||
--------------------------------
|
|
||||||
Using Setuptools and EasyInstall
|
|
||||||
--------------------------------
|
|
||||||
|
|
||||||
Here are some of the available manuals, tutorials, and other resources for
|
|
||||||
learning about Setuptools, Python Eggs, and EasyInstall:
|
|
||||||
|
|
||||||
* `The EasyInstall user's guide and reference manual`_
|
|
||||||
* `The setuptools Developer's Guide`_
|
|
||||||
* `The pkg_resources API reference`_
|
|
||||||
* `The Internal Structure of Python Eggs`_
|
|
||||||
|
|
||||||
Questions, comments, and bug reports should be directed to the `distutils-sig
|
|
||||||
mailing list`_. If you have written (or know of) any tutorials, documentation,
|
|
||||||
plug-ins, or other resources for setuptools users, please let us know about
|
|
||||||
them there, so this reference list can be updated. If you have working,
|
|
||||||
*tested* patches to correct problems or add features, you may submit them to
|
|
||||||
the `setuptools bug tracker`_.
|
|
||||||
|
|
||||||
.. _setuptools bug tracker: https://bitbucket.org/pypa/setuptools/issues
|
|
||||||
.. _The Internal Structure of Python Eggs: https://pythonhosted.org/setuptools/formats.html
|
|
||||||
.. _The setuptools Developer's Guide: https://pythonhosted.org/setuptools/setuptools.html
|
|
||||||
.. _The pkg_resources API reference: https://pythonhosted.org/setuptools/pkg_resources.html
|
|
||||||
.. _The EasyInstall user's guide and reference manual: https://pythonhosted.org/setuptools/easy_install.html
|
|
||||||
.. _distutils-sig mailing list: http://mail.python.org/pipermail/distutils-sig/
|
|
||||||
|
|
||||||
|
|
||||||
-------
|
|
||||||
Credits
|
|
||||||
-------
|
|
||||||
|
|
||||||
* The original design for the ``.egg`` format and the ``pkg_resources`` API was
|
|
||||||
co-created by Phillip Eby and Bob Ippolito. Bob also implemented the first
|
|
||||||
version of ``pkg_resources``, and supplied the OS X operating system version
|
|
||||||
compatibility algorithm.
|
|
||||||
|
|
||||||
* Ian Bicking implemented many early "creature comfort" features of
|
|
||||||
easy_install, including support for downloading via Sourceforge and
|
|
||||||
Subversion repositories. Ian's comments on the Web-SIG about WSGI
|
|
||||||
application deployment also inspired the concept of "entry points" in eggs,
|
|
||||||
and he has given talks at PyCon and elsewhere to inform and educate the
|
|
||||||
community about eggs and setuptools.
|
|
||||||
|
|
||||||
* Jim Fulton contributed time and effort to build automated tests of various
|
|
||||||
aspects of ``easy_install``, and supplied the doctests for the command-line
|
|
||||||
``.exe`` wrappers on Windows.
|
|
||||||
|
|
||||||
* Phillip J. Eby is the seminal author of setuptools, and
|
|
||||||
first proposed the idea of an importable binary distribution format for
|
|
||||||
Python application plug-ins.
|
|
||||||
|
|
||||||
* Significant parts of the implementation of setuptools were funded by the Open
|
|
||||||
Source Applications Foundation, to provide a plug-in infrastructure for the
|
|
||||||
Chandler PIM application. In addition, many OSAF staffers (such as Mike
|
|
||||||
"Code Bear" Taylor) contributed their time and stress as guinea pigs for the
|
|
||||||
use of eggs and setuptools, even before eggs were "cool". (Thanks, guys!)
|
|
||||||
|
|
||||||
* Tarek Ziadé is the principal author of the Distribute fork, which
|
|
||||||
re-invigorated the community on the project, encouraged renewed innovation,
|
|
||||||
and addressed many defects.
|
|
||||||
|
|
||||||
* Since the merge with Distribute, Jason R. Coombs is the
|
|
||||||
maintainer of setuptools. The project is maintained in coordination with
|
|
||||||
the Python Packaging Authority (PyPA) and the larger Python community.
|
|
||||||
|
|
||||||
.. _files:
|
|
||||||
|
|
||||||
|
|
||||||
---------------
|
|
||||||
Code of Conduct
|
|
||||||
---------------
|
|
||||||
|
|
||||||
Everyone interacting in the setuptools project's codebases, issue trackers,
|
|
||||||
chat rooms, and mailing lists is expected to follow the
|
|
||||||
`PyPA Code of Conduct`_.
|
|
||||||
|
|
||||||
.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/
|
|
||||||
|
|
||||||
|
|
|
@ -1,267 +0,0 @@
|
||||||
Metadata-Version: 2.0
|
|
||||||
Name: setuptools
|
|
||||||
Version: 20.3.1
|
|
||||||
Summary: Easily download, build, install, upgrade, and uninstall Python packages
|
|
||||||
Home-page: https://bitbucket.org/pypa/setuptools
|
|
||||||
Author: Python Packaging Authority
|
|
||||||
Author-email: distutils-sig@python.org
|
|
||||||
License: UNKNOWN
|
|
||||||
Keywords: CPAN PyPI distutils eggs package management
|
|
||||||
Platform: UNKNOWN
|
|
||||||
Classifier: Development Status :: 5 - Production/Stable
|
|
||||||
Classifier: Intended Audience :: Developers
|
|
||||||
Classifier: License :: OSI Approved :: MIT License
|
|
||||||
Classifier: Operating System :: OS Independent
|
|
||||||
Classifier: Programming Language :: Python :: 2.6
|
|
||||||
Classifier: Programming Language :: Python :: 2.7
|
|
||||||
Classifier: Programming Language :: Python :: 3
|
|
||||||
Classifier: Programming Language :: Python :: 3.3
|
|
||||||
Classifier: Programming Language :: Python :: 3.4
|
|
||||||
Classifier: Programming Language :: Python :: 3.5
|
|
||||||
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
||||||
Classifier: Topic :: System :: Archiving :: Packaging
|
|
||||||
Classifier: Topic :: System :: Systems Administration
|
|
||||||
Classifier: Topic :: Utilities
|
|
||||||
Provides-Extra: certs
|
|
||||||
Requires-Dist: certifi (==2015.11.20); extra == 'certs'
|
|
||||||
Provides-Extra: ssl
|
|
||||||
Requires-Dist: wincertstore (==0.2); sys_platform=='win32' and extra == 'ssl'
|
|
||||||
|
|
||||||
===============================
|
|
||||||
Installing and Using Setuptools
|
|
||||||
===============================
|
|
||||||
|
|
||||||
.. contents:: **Table of Contents**
|
|
||||||
|
|
||||||
|
|
||||||
`Change History <https://pythonhosted.org/setuptools/history.html>`_.
|
|
||||||
|
|
||||||
-------------------------
|
|
||||||
Installation Instructions
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
The recommended way to bootstrap setuptools on any system is to download
|
|
||||||
`ez_setup.py`_ and run it using the target Python environment. Different
|
|
||||||
operating systems have different recommended techniques to accomplish this
|
|
||||||
basic routine, so below are some examples to get you started.
|
|
||||||
|
|
||||||
Setuptools requires Python 2.6 or later. To install setuptools
|
|
||||||
on Python 2.4 or Python 2.5, use the `bootstrap script for Setuptools 1.x
|
|
||||||
<https://bitbucket.org/pypa/setuptools/raw/bootstrap-py24/ez_setup.py>`_.
|
|
||||||
|
|
||||||
The link provided to ez_setup.py is a bookmark to bootstrap script for the
|
|
||||||
latest known stable release.
|
|
||||||
|
|
||||||
.. _ez_setup.py: https://bootstrap.pypa.io/ez_setup.py
|
|
||||||
|
|
||||||
Windows (Powershell 3 or later)
|
|
||||||
===============================
|
|
||||||
|
|
||||||
For best results, uninstall previous versions FIRST (see `Uninstalling`_).
|
|
||||||
|
|
||||||
Using Windows 8 (which includes PowerShell 3) or earlier versions of Windows
|
|
||||||
with PowerShell 3 installed, it's possible to install with one simple
|
|
||||||
Powershell command. Start up Powershell and paste this command::
|
|
||||||
|
|
||||||
> (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python -
|
|
||||||
|
|
||||||
You must start the Powershell with Administrative privileges or you may choose
|
|
||||||
to install a user-local installation::
|
|
||||||
|
|
||||||
> (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python - --user
|
|
||||||
|
|
||||||
If you have Python 3.3 or later, you can use the ``py`` command to install to
|
|
||||||
different Python versions. For example, to install to Python 3.3 if you have
|
|
||||||
Python 2.7 installed::
|
|
||||||
|
|
||||||
> (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | py -3 -
|
|
||||||
|
|
||||||
The recommended way to install setuptools on Windows is to download
|
|
||||||
`ez_setup.py`_ and run it. The script will download the appropriate
|
|
||||||
distribution file and install it for you.
|
|
||||||
|
|
||||||
Once installation is complete, you will find an ``easy_install`` program in
|
|
||||||
your Python ``Scripts`` subdirectory. For simple invocation and best results,
|
|
||||||
add this directory to your ``PATH`` environment variable, if it is not already
|
|
||||||
present. If you did a user-local install, the ``Scripts`` subdirectory is
|
|
||||||
``$env:APPDATA\Python\Scripts``.
|
|
||||||
|
|
||||||
|
|
||||||
Windows (simplified)
|
|
||||||
====================
|
|
||||||
|
|
||||||
For Windows without PowerShell 3 or for installation without a command-line,
|
|
||||||
download `ez_setup.py`_ using your preferred web browser or other technique
|
|
||||||
and "run" that file.
|
|
||||||
|
|
||||||
|
|
||||||
Unix (wget)
|
|
||||||
===========
|
|
||||||
|
|
||||||
Most Linux distributions come with wget.
|
|
||||||
|
|
||||||
Download `ez_setup.py`_ and run it using the target Python version. The script
|
|
||||||
will download the appropriate version and install it for you::
|
|
||||||
|
|
||||||
> wget https://bootstrap.pypa.io/ez_setup.py -O - | python
|
|
||||||
|
|
||||||
Note that you will may need to invoke the command with superuser privileges to
|
|
||||||
install to the system Python::
|
|
||||||
|
|
||||||
> wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python
|
|
||||||
|
|
||||||
Alternatively, Setuptools may be installed to a user-local path::
|
|
||||||
|
|
||||||
> wget https://bootstrap.pypa.io/ez_setup.py -O - | python - --user
|
|
||||||
|
|
||||||
Note that on some older systems (noted on Debian 6 and CentOS 5 installations),
|
|
||||||
`wget` may refuse to download `ez_setup.py`, complaining that the certificate common name `*.c.ssl.fastly.net`
|
|
||||||
does not match the host name `bootstrap.pypa.io`. In addition, the `ez_setup.py` script may then encounter similar problems using
|
|
||||||
`wget` internally to download `setuptools-x.y.zip`, complaining that the certificate common name of `www.python.org` does not match the
|
|
||||||
host name `pypi.python.org`. Those are known issues, related to a bug in the older versions of `wget`
|
|
||||||
(see `Issue 59 <https://bitbucket.org/pypa/pypi/issue/59#comment-5881915>`_). If you happen to encounter them,
|
|
||||||
install Setuptools as follows::
|
|
||||||
|
|
||||||
> wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py
|
|
||||||
> python ez_setup.py --insecure
|
|
||||||
|
|
||||||
|
|
||||||
Unix including Mac OS X (curl)
|
|
||||||
==============================
|
|
||||||
|
|
||||||
If your system has curl installed, follow the ``wget`` instructions but
|
|
||||||
replace ``wget`` with ``curl`` and ``-O`` with ``-o``. For example::
|
|
||||||
|
|
||||||
> curl https://bootstrap.pypa.io/ez_setup.py -o - | python
|
|
||||||
|
|
||||||
|
|
||||||
Advanced Installation
|
|
||||||
=====================
|
|
||||||
|
|
||||||
For more advanced installation options, such as installing to custom
|
|
||||||
locations or prefixes, download and extract the source
|
|
||||||
tarball from `Setuptools on PyPI <https://pypi.python.org/pypi/setuptools>`_
|
|
||||||
and run setup.py with any supported distutils and Setuptools options.
|
|
||||||
For example::
|
|
||||||
|
|
||||||
setuptools-x.x$ python setup.py install --prefix=/opt/setuptools
|
|
||||||
|
|
||||||
Use ``--help`` to get a full options list, but we recommend consulting
|
|
||||||
the `EasyInstall manual`_ for detailed instructions, especially `the section
|
|
||||||
on custom installation locations`_.
|
|
||||||
|
|
||||||
.. _EasyInstall manual: https://pythonhosted.org/setuptools/EasyInstall
|
|
||||||
.. _the section on custom installation locations: https://pythonhosted.org/setuptools/EasyInstall#custom-installation-locations
|
|
||||||
|
|
||||||
|
|
||||||
Downloads
|
|
||||||
=========
|
|
||||||
|
|
||||||
All setuptools downloads can be found at `the project's home page in the Python
|
|
||||||
Package Index`_. Scroll to the very bottom of the page to find the links.
|
|
||||||
|
|
||||||
.. _the project's home page in the Python Package Index: https://pypi.python.org/pypi/setuptools
|
|
||||||
|
|
||||||
In addition to the PyPI downloads, the development version of ``setuptools``
|
|
||||||
is available from the `Bitbucket repo`_, and in-development versions of the
|
|
||||||
`0.6 branch`_ are available as well.
|
|
||||||
|
|
||||||
.. _Bitbucket repo: https://bitbucket.org/pypa/setuptools/get/default.tar.gz#egg=setuptools-dev
|
|
||||||
.. _0.6 branch: http://svn.python.org/projects/sandbox/branches/setuptools-0.6/#egg=setuptools-dev06
|
|
||||||
|
|
||||||
Uninstalling
|
|
||||||
============
|
|
||||||
|
|
||||||
On Windows, if Setuptools was installed using an ``.exe`` or ``.msi``
|
|
||||||
installer, simply use the uninstall feature of "Add/Remove Programs" in the
|
|
||||||
Control Panel.
|
|
||||||
|
|
||||||
Otherwise, to uninstall Setuptools or Distribute, regardless of the Python
|
|
||||||
version, delete all ``setuptools*`` and ``distribute*`` files and
|
|
||||||
directories from your system's ``site-packages`` directory
|
|
||||||
(and any other ``sys.path`` directories) FIRST.
|
|
||||||
|
|
||||||
If you are upgrading or otherwise plan to re-install Setuptools or Distribute,
|
|
||||||
nothing further needs to be done. If you want to completely remove Setuptools,
|
|
||||||
you may also want to remove the 'easy_install' and 'easy_install-x.x' scripts
|
|
||||||
and associated executables installed to the Python scripts directory.
|
|
||||||
|
|
||||||
--------------------------------
|
|
||||||
Using Setuptools and EasyInstall
|
|
||||||
--------------------------------
|
|
||||||
|
|
||||||
Here are some of the available manuals, tutorials, and other resources for
|
|
||||||
learning about Setuptools, Python Eggs, and EasyInstall:
|
|
||||||
|
|
||||||
* `The EasyInstall user's guide and reference manual`_
|
|
||||||
* `The setuptools Developer's Guide`_
|
|
||||||
* `The pkg_resources API reference`_
|
|
||||||
* `The Internal Structure of Python Eggs`_
|
|
||||||
|
|
||||||
Questions, comments, and bug reports should be directed to the `distutils-sig
|
|
||||||
mailing list`_. If you have written (or know of) any tutorials, documentation,
|
|
||||||
plug-ins, or other resources for setuptools users, please let us know about
|
|
||||||
them there, so this reference list can be updated. If you have working,
|
|
||||||
*tested* patches to correct problems or add features, you may submit them to
|
|
||||||
the `setuptools bug tracker`_.
|
|
||||||
|
|
||||||
.. _setuptools bug tracker: https://bitbucket.org/pypa/setuptools/issues
|
|
||||||
.. _The Internal Structure of Python Eggs: https://pythonhosted.org/setuptools/formats.html
|
|
||||||
.. _The setuptools Developer's Guide: https://pythonhosted.org/setuptools/setuptools.html
|
|
||||||
.. _The pkg_resources API reference: https://pythonhosted.org/setuptools/pkg_resources.html
|
|
||||||
.. _The EasyInstall user's guide and reference manual: https://pythonhosted.org/setuptools/easy_install.html
|
|
||||||
.. _distutils-sig mailing list: http://mail.python.org/pipermail/distutils-sig/
|
|
||||||
|
|
||||||
|
|
||||||
-------
|
|
||||||
Credits
|
|
||||||
-------
|
|
||||||
|
|
||||||
* The original design for the ``.egg`` format and the ``pkg_resources`` API was
|
|
||||||
co-created by Phillip Eby and Bob Ippolito. Bob also implemented the first
|
|
||||||
version of ``pkg_resources``, and supplied the OS X operating system version
|
|
||||||
compatibility algorithm.
|
|
||||||
|
|
||||||
* Ian Bicking implemented many early "creature comfort" features of
|
|
||||||
easy_install, including support for downloading via Sourceforge and
|
|
||||||
Subversion repositories. Ian's comments on the Web-SIG about WSGI
|
|
||||||
application deployment also inspired the concept of "entry points" in eggs,
|
|
||||||
and he has given talks at PyCon and elsewhere to inform and educate the
|
|
||||||
community about eggs and setuptools.
|
|
||||||
|
|
||||||
* Jim Fulton contributed time and effort to build automated tests of various
|
|
||||||
aspects of ``easy_install``, and supplied the doctests for the command-line
|
|
||||||
``.exe`` wrappers on Windows.
|
|
||||||
|
|
||||||
* Phillip J. Eby is the seminal author of setuptools, and
|
|
||||||
first proposed the idea of an importable binary distribution format for
|
|
||||||
Python application plug-ins.
|
|
||||||
|
|
||||||
* Significant parts of the implementation of setuptools were funded by the Open
|
|
||||||
Source Applications Foundation, to provide a plug-in infrastructure for the
|
|
||||||
Chandler PIM application. In addition, many OSAF staffers (such as Mike
|
|
||||||
"Code Bear" Taylor) contributed their time and stress as guinea pigs for the
|
|
||||||
use of eggs and setuptools, even before eggs were "cool". (Thanks, guys!)
|
|
||||||
|
|
||||||
* Tarek Ziadé is the principal author of the Distribute fork, which
|
|
||||||
re-invigorated the community on the project, encouraged renewed innovation,
|
|
||||||
and addressed many defects.
|
|
||||||
|
|
||||||
* Since the merge with Distribute, Jason R. Coombs is the
|
|
||||||
maintainer of setuptools. The project is maintained in coordination with
|
|
||||||
the Python Packaging Authority (PyPA) and the larger Python community.
|
|
||||||
|
|
||||||
.. _files:
|
|
||||||
|
|
||||||
|
|
||||||
---------------
|
|
||||||
Code of Conduct
|
|
||||||
---------------
|
|
||||||
|
|
||||||
Everyone interacting in the setuptools project's codebases, issue trackers,
|
|
||||||
chat rooms, and mailing lists is expected to follow the
|
|
||||||
`PyPA Code of Conduct`_.
|
|
||||||
|
|
||||||
.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/
|
|
||||||
|
|
||||||
|
|
|
@ -1,137 +0,0 @@
|
||||||
easy_install.py,sha256=MDC9vt5AxDsXX5qcKlBz2TnW6Tpuv_AobnfhCJ9X3PM,126
|
|
||||||
pkg_resources/__init__.py,sha256=QyiRSbbmXDCq2O3AIG9V-AjGJinvd3ImWCKsaucVneA,100439
|
|
||||||
pkg_resources/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
||||||
pkg_resources/_vendor/pyparsing.py,sha256=ic8qmDPiq8Li-Y0PeZcI56rEyMqevKNBK6hr6FbyVBc,160425
|
|
||||||
pkg_resources/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098
|
|
||||||
pkg_resources/_vendor/packaging/__about__.py,sha256=AEwkfVSNgMMAAugtYao7b7wah9XryokeoXBuIw4h6d8,720
|
|
||||||
pkg_resources/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513
|
|
||||||
pkg_resources/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860
|
|
||||||
pkg_resources/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416
|
|
||||||
pkg_resources/_vendor/packaging/markers.py,sha256=0Z2in1kNfYn93n9uJj0hNEmu-sJpEQpa_qAbxpYXdS4,7359
|
|
||||||
pkg_resources/_vendor/packaging/requirements.py,sha256=SikL2UynbsT0qtY9ltqngndha_sfo0w6XGFhAhoSoaQ,4355
|
|
||||||
pkg_resources/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025
|
|
||||||
pkg_resources/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421
|
|
||||||
pkg_resources/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556
|
|
||||||
pkg_resources/extern/__init__.py,sha256=rMBTxKimjNg8plSH94cB-y52pKO0zmM-AkFL30lZGfY,2474
|
|
||||||
setuptools/__init__.py,sha256=WEGb6BRGN2dz3eJTbNRUfInUAhb6_OZJyYAndPGJm6w,5440
|
|
||||||
setuptools/archive_util.py,sha256=N30WE5ZQjkytzhAodAXw4FkK-9J5AP1ChrClHnZthOA,6609
|
|
||||||
setuptools/cli-32.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536
|
|
||||||
setuptools/cli-64.exe,sha256=KLABu5pyrnokJCv6skjXZ6GsXeyYHGcqOUT3oHI3Xpo,74752
|
|
||||||
setuptools/cli-arm-32.exe,sha256=0pFNIi2SmY2gdY91Y4LRhj1wuBsnv5cG1fus3iBJv40,69120
|
|
||||||
setuptools/cli.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536
|
|
||||||
setuptools/depends.py,sha256=WyJIhjIX7D5-JpGSnMAPHEoDcVPQxaO0405keTQT6jM,6418
|
|
||||||
setuptools/dist.py,sha256=txOleyyt2xCSTkUjCGW4MYZB8a1xsbC8MulDhSnoivQ,35701
|
|
||||||
setuptools/extension.py,sha256=YvsyGHWVWzhNOXMHU239FR14wxw2WwdMLLzWsRP6_IY,1694
|
|
||||||
setuptools/gui-32.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536
|
|
||||||
setuptools/gui-64.exe,sha256=aYKMhX1IJLn4ULHgWX0sE0yREUt6B3TEHf_jOw6yNyE,75264
|
|
||||||
setuptools/gui-arm-32.exe,sha256=R5gRWLkY7wvO_CVGxoi7LZVTv0h-DKsKScy6fkbp4XI,69120
|
|
||||||
setuptools/gui.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536
|
|
||||||
setuptools/launch.py,sha256=hP3qZxDNu5Hf9C-VAkEP4IC_YYfR1XfxMTj6EguxxCg,730
|
|
||||||
setuptools/lib2to3_ex.py,sha256=6jPF9sJuHiz0cyg4cwIBLl2VMAxcl3GYSZwWAOuJplU,1998
|
|
||||||
setuptools/msvc9_support.py,sha256=fo2vjb-dna1SEuHezQCTuelCo6XFBv5cqaI56ABJ1vw,2187
|
|
||||||
setuptools/package_index.py,sha256=T6tZGPHApup6Gl3kz1sCLtY7kmMUXLBKweSAORYS2Qc,39490
|
|
||||||
setuptools/py26compat.py,sha256=1Vvuf-hj5bTM3OAXv6vgJQImulne12ann053caOgikU,481
|
|
||||||
setuptools/py27compat.py,sha256=CGj-jZcFgHUkrEdLvArkxHj96tAaMbG2-yJtUVU7QVI,306
|
|
||||||
setuptools/py31compat.py,sha256=cqYSVBd2pxvKl75185z40htfEr6EKC29KvSBiSoqHOA,1636
|
|
||||||
setuptools/sandbox.py,sha256=tuMRu_8R0_w6Qer9VqDiOTqKy1qr_GjHi-2QAg7TMz0,14210
|
|
||||||
setuptools/script (dev).tmpl,sha256=f7MR17dTkzaqkCMSVseyOCMVrPVSMdmTQsaB8cZzfuI,201
|
|
||||||
setuptools/script.tmpl,sha256=WGTt5piezO27c-Dbx6l5Q4T3Ff20A5z7872hv3aAhYY,138
|
|
||||||
setuptools/site-patch.py,sha256=K-0-cAx36mX_PG-qPZwosG9ZLCliRjquKQ4nHiJvvzg,2389
|
|
||||||
setuptools/ssl_support.py,sha256=tAFeeyFPVle_GgarPkNrdfnCJgP9PyN_QYGXTgypoyc,8119
|
|
||||||
setuptools/unicode_utils.py,sha256=8zVyrL_MFc6P5AmErs21rr7z-3N1pZ_NkOcDC7BPElU,995
|
|
||||||
setuptools/utils.py,sha256=08Z7mt-9mvrx-XvmS5EyKoRn2lxNTlgFsUwBU3Eq9JQ,293
|
|
||||||
setuptools/version.py,sha256=xArPY4wg3eOL9kWjMciQnbhiJsQ73H8SieeRtCDrSsU,23
|
|
||||||
setuptools/windows_support.py,sha256=5GrfqSP2-dLGJoZTq2g6dCKkyQxxa2n5IQiXlJCoYEE,714
|
|
||||||
setuptools/command/__init__.py,sha256=1AM3hv_zCixE7kTXA-onWfK_2KF8GC8fUw3WSxzi5Fg,564
|
|
||||||
setuptools/command/alias.py,sha256=KjpE0sz_SDIHv3fpZcIQK-sCkJz-SrC6Gmug6b9Nkc8,2426
|
|
||||||
setuptools/command/bdist_egg.py,sha256=Km4CsGbevhvej6kKEfvTYxfkPoQijUyXmImNifrO4Tg,17184
|
|
||||||
setuptools/command/bdist_rpm.py,sha256=B7l0TnzCGb-0nLlm6rS00jWLkojASwVmdhW2w5Qz_Ak,1508
|
|
||||||
setuptools/command/bdist_wininst.py,sha256=_6dz3lpB1tY200LxKPLM7qgwTCceOMgaWFF-jW2-pm0,637
|
|
||||||
setuptools/command/build_ext.py,sha256=pkQ8xp3YPVGGLkGv-SvfxC_GqFpboph1AFEoMFOgQMo,11964
|
|
||||||
setuptools/command/build_py.py,sha256=HvJ88JuougDccaowYlfMV12kYtd0GLahg2DR2vQRqL4,7983
|
|
||||||
setuptools/command/develop.py,sha256=VxSYbpM2jQqtRBn5klIjPVBo3sWKNZMlSbHHiRLUlZo,7383
|
|
||||||
setuptools/command/easy_install.py,sha256=_rqkt0iWctAjMn7Z2wEYTICMntcUaV28iN6cfKrpQ28,85913
|
|
||||||
setuptools/command/egg_info.py,sha256=0_8eI8hgLAlGt8Xk5kiodY_d9lxG6_RSescJISKBJgA,16890
|
|
||||||
setuptools/command/install.py,sha256=QwaFiZRU3ytIHoPh8uJ9EqV3Fu9C4ca4B7UGAo95tws,4685
|
|
||||||
setuptools/command/install_egg_info.py,sha256=8J_cH4VbOJv-9Wey8Ijw5SnNI7YS_CA2IKYX569mP5Q,4035
|
|
||||||
setuptools/command/install_lib.py,sha256=rWcysInRJHVzgneY41EKW3kW3-dR2q2CvyPzul5ASAk,3839
|
|
||||||
setuptools/command/install_scripts.py,sha256=vX2JC6v7l090N7CrTfihWBklNbPvfNKAY2LRtukM9XE,2231
|
|
||||||
setuptools/command/launcher manifest.xml,sha256=xlLbjWrB01tKC0-hlVkOKkiSPbzMml2eOPtJ_ucCnbE,628
|
|
||||||
setuptools/command/register.py,sha256=bHlMm1qmBbSdahTOT8w6UhA-EgeQIz7p6cD-qOauaiI,270
|
|
||||||
setuptools/command/rotate.py,sha256=QGZS2t4CmBl7t79KQijNCjRMU50lu3nRhu4FXWB5LIE,2038
|
|
||||||
setuptools/command/saveopts.py,sha256=za7QCBcQimKKriWcoCcbhxPjUz30gSB74zuTL47xpP4,658
|
|
||||||
setuptools/command/sdist.py,sha256=kQetnPMw6ao3nurWGJZgS4HkOH4AknzMOSvqbVA6jGA,7050
|
|
||||||
setuptools/command/setopt.py,sha256=cygJaJWJmiVhR0e_Uh_0_fWyCxMJIqK-Bu6K0LyYUtU,5086
|
|
||||||
setuptools/command/test.py,sha256=N2f5RwxkjwU3YQzFYHtzHr636-pdX9XJDuPg5Y92kSo,6888
|
|
||||||
setuptools/command/upload.py,sha256=OjAryq4ZoARZiaTN_MpuG1X8Pu9CJNCKmmbMg-gab5I,649
|
|
||||||
setuptools/command/upload_docs.py,sha256=htXpASci5gKP0RIrGZRRmbll7RnTRuwvKWZkYsBlDMM,6815
|
|
||||||
setuptools/extern/__init__.py,sha256=mTrrj4yLMdFeEwwnqKnSuvZM5RM-HPZ1iXLgaYDlB9o,132
|
|
||||||
setuptools-20.3.1.dist-info/DESCRIPTION.rst,sha256=MDsJej8DPV2OKpAKpu74g-2xksRd-uGTeZn4W7D1dnI,9940
|
|
||||||
setuptools-20.3.1.dist-info/METADATA,sha256=c4yrbKrKA0BxICkR7iP79IHXigHPhWNy70y-Fq-ybKs,11173
|
|
||||||
setuptools-20.3.1.dist-info/RECORD,,
|
|
||||||
setuptools-20.3.1.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110
|
|
||||||
setuptools-20.3.1.dist-info/dependency_links.txt,sha256=oUNXJEArClXFiSSvfFwUKY8TYjeIXhuFfCpXn5K0DCE,226
|
|
||||||
setuptools-20.3.1.dist-info/entry_points.txt,sha256=revbaRBbkZ2b1B-hZlAXo_18J9GjdYHgA4DoW8wdTOU,2835
|
|
||||||
setuptools-20.3.1.dist-info/metadata.json,sha256=Kj9x1vkm8jQKLu3ywdXgeNTtyBmWFbp6KvF528_C5N4,4636
|
|
||||||
setuptools-20.3.1.dist-info/top_level.txt,sha256=2HUXVVwA4Pff1xgTFr3GsTXXKaPaO6vlG6oNJ_4u4Tg,38
|
|
||||||
setuptools-20.3.1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
||||||
../../../bin/easy_install,sha256=LopKneUXvnG_dqCSZe6amF-Bf4WEh1ny0uo28w2_nQ0,299
|
|
||||||
../../../bin/easy_install-3.4,sha256=LopKneUXvnG_dqCSZe6amF-Bf4WEh1ny0uo28w2_nQ0,299
|
|
||||||
setuptools-20.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
|
||||||
setuptools/command/__pycache__/bdist_wininst.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/dist.cpython-34.pyc,,
|
|
||||||
pkg_resources/_vendor/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/sdist.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/launch.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/version.cpython-34.pyc,,
|
|
||||||
setuptools/extern/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/saveopts.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/easy_install.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/rotate.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/develop.cpython-34.pyc,,
|
|
||||||
pkg_resources/_vendor/packaging/__pycache__/markers.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/build_ext.cpython-34.pyc,,
|
|
||||||
__pycache__/easy_install.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/egg_info.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/utils.cpython-34.pyc,,
|
|
||||||
pkg_resources/extern/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/windows_support.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/py26compat.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/bdist_rpm.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/extension.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/msvc9_support.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/py27compat.cpython-34.pyc,,
|
|
||||||
pkg_resources/_vendor/__pycache__/six.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/ssl_support.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/upload_docs.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/install_scripts.cpython-34.pyc,,
|
|
||||||
pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/build_py.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/sandbox.cpython-34.pyc,,
|
|
||||||
pkg_resources/__pycache__/__init__.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/install.cpython-34.pyc,,
|
|
||||||
pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/alias.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/install_egg_info.cpython-34.pyc,,
|
|
||||||
pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/unicode_utils.cpython-34.pyc,,
|
|
||||||
pkg_resources/_vendor/__pycache__/pyparsing.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/depends.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/site-patch.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/setopt.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/register.cpython-34.pyc,,
|
|
||||||
pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-34.pyc,,
|
|
||||||
pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/upload.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/lib2to3_ex.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/install_lib.cpython-34.pyc,,
|
|
||||||
pkg_resources/_vendor/packaging/__pycache__/version.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/py31compat.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/test.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/archive_util.cpython-34.pyc,,
|
|
||||||
setuptools/__pycache__/package_index.cpython-34.pyc,,
|
|
||||||
setuptools/command/__pycache__/bdist_egg.cpython-34.pyc,,
|
|
||||||
pkg_resources/_vendor/packaging/__pycache__/utils.cpython-34.pyc,,
|
|
|
@ -1,2 +0,0 @@
|
||||||
https://pypi.python.org/packages/source/c/certifi/certifi-2015.11.20.tar.gz#md5=25134646672c695c1ff1593c2dd75d08
|
|
||||||
https://pypi.python.org/packages/source/w/wincertstore/wincertstore-0.2.zip#md5=ae728f2f007185648d0c7a8679b361e2
|
|
|
@ -1,62 +0,0 @@
|
||||||
[console_scripts]
|
|
||||||
easy_install = setuptools.command.easy_install:main
|
|
||||||
easy_install-3.5 = setuptools.command.easy_install:main
|
|
||||||
|
|
||||||
[distutils.commands]
|
|
||||||
alias = setuptools.command.alias:alias
|
|
||||||
bdist_egg = setuptools.command.bdist_egg:bdist_egg
|
|
||||||
bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm
|
|
||||||
bdist_wininst = setuptools.command.bdist_wininst:bdist_wininst
|
|
||||||
build_ext = setuptools.command.build_ext:build_ext
|
|
||||||
build_py = setuptools.command.build_py:build_py
|
|
||||||
develop = setuptools.command.develop:develop
|
|
||||||
easy_install = setuptools.command.easy_install:easy_install
|
|
||||||
egg_info = setuptools.command.egg_info:egg_info
|
|
||||||
install = setuptools.command.install:install
|
|
||||||
install_egg_info = setuptools.command.install_egg_info:install_egg_info
|
|
||||||
install_lib = setuptools.command.install_lib:install_lib
|
|
||||||
install_scripts = setuptools.command.install_scripts:install_scripts
|
|
||||||
register = setuptools.command.register:register
|
|
||||||
rotate = setuptools.command.rotate:rotate
|
|
||||||
saveopts = setuptools.command.saveopts:saveopts
|
|
||||||
sdist = setuptools.command.sdist:sdist
|
|
||||||
setopt = setuptools.command.setopt:setopt
|
|
||||||
test = setuptools.command.test:test
|
|
||||||
upload = setuptools.command.upload:upload
|
|
||||||
upload_docs = setuptools.command.upload_docs:upload_docs
|
|
||||||
|
|
||||||
[distutils.setup_keywords]
|
|
||||||
convert_2to3_doctests = setuptools.dist:assert_string_list
|
|
||||||
dependency_links = setuptools.dist:assert_string_list
|
|
||||||
eager_resources = setuptools.dist:assert_string_list
|
|
||||||
entry_points = setuptools.dist:check_entry_points
|
|
||||||
exclude_package_data = setuptools.dist:check_package_data
|
|
||||||
extras_require = setuptools.dist:check_extras
|
|
||||||
include_package_data = setuptools.dist:assert_bool
|
|
||||||
install_requires = setuptools.dist:check_requirements
|
|
||||||
namespace_packages = setuptools.dist:check_nsp
|
|
||||||
package_data = setuptools.dist:check_package_data
|
|
||||||
packages = setuptools.dist:check_packages
|
|
||||||
setup_requires = setuptools.dist:check_requirements
|
|
||||||
test_loader = setuptools.dist:check_importable
|
|
||||||
test_runner = setuptools.dist:check_importable
|
|
||||||
test_suite = setuptools.dist:check_test_suite
|
|
||||||
tests_require = setuptools.dist:check_requirements
|
|
||||||
use_2to3 = setuptools.dist:assert_bool
|
|
||||||
use_2to3_exclude_fixers = setuptools.dist:assert_string_list
|
|
||||||
use_2to3_fixers = setuptools.dist:assert_string_list
|
|
||||||
zip_safe = setuptools.dist:assert_bool
|
|
||||||
|
|
||||||
[egg_info.writers]
|
|
||||||
PKG-INFO = setuptools.command.egg_info:write_pkg_info
|
|
||||||
dependency_links.txt = setuptools.command.egg_info:overwrite_arg
|
|
||||||
depends.txt = setuptools.command.egg_info:warn_depends_obsolete
|
|
||||||
eager_resources.txt = setuptools.command.egg_info:overwrite_arg
|
|
||||||
entry_points.txt = setuptools.command.egg_info:write_entries
|
|
||||||
namespace_packages.txt = setuptools.command.egg_info:overwrite_arg
|
|
||||||
requires.txt = setuptools.command.egg_info:write_requirements
|
|
||||||
top_level.txt = setuptools.command.egg_info:write_toplevel_names
|
|
||||||
|
|
||||||
[setuptools.installation]
|
|
||||||
eggsecutable = setuptools.command.easy_install:bootstrap
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Archiving :: Packaging", "Topic :: System :: Systems Administration", "Topic :: Utilities"], "extensions": {"python.commands": {"wrap_console": {"easy_install": "setuptools.command.easy_install:main", "easy_install-3.5": "setuptools.command.easy_install:main"}}, "python.details": {"contacts": [{"email": "distutils-sig@python.org", "name": "Python Packaging Authority", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://bitbucket.org/pypa/setuptools"}}, "python.exports": {"console_scripts": {"easy_install": "setuptools.command.easy_install:main", "easy_install-3.5": "setuptools.command.easy_install:main"}, "distutils.commands": {"alias": "setuptools.command.alias:alias", "bdist_egg": "setuptools.command.bdist_egg:bdist_egg", "bdist_rpm": "setuptools.command.bdist_rpm:bdist_rpm", "bdist_wininst": "setuptools.command.bdist_wininst:bdist_wininst", "build_ext": "setuptools.command.build_ext:build_ext", "build_py": "setuptools.command.build_py:build_py", "develop": "setuptools.command.develop:develop", "easy_install": "setuptools.command.easy_install:easy_install", "egg_info": "setuptools.command.egg_info:egg_info", "install": "setuptools.command.install:install", "install_egg_info": "setuptools.command.install_egg_info:install_egg_info", "install_lib": "setuptools.command.install_lib:install_lib", "install_scripts": "setuptools.command.install_scripts:install_scripts", "register": "setuptools.command.register:register", "rotate": "setuptools.command.rotate:rotate", "saveopts": "setuptools.command.saveopts:saveopts", "sdist": "setuptools.command.sdist:sdist", "setopt": "setuptools.command.setopt:setopt", "test": "setuptools.command.test:test", "upload": "setuptools.command.upload:upload", "upload_docs": "setuptools.command.upload_docs:upload_docs"}, "distutils.setup_keywords": {"convert_2to3_doctests": "setuptools.dist:assert_string_list", "dependency_links": "setuptools.dist:assert_string_list", "eager_resources": "setuptools.dist:assert_string_list", "entry_points": "setuptools.dist:check_entry_points", "exclude_package_data": "setuptools.dist:check_package_data", "extras_require": "setuptools.dist:check_extras", "include_package_data": "setuptools.dist:assert_bool", "install_requires": "setuptools.dist:check_requirements", "namespace_packages": "setuptools.dist:check_nsp", "package_data": "setuptools.dist:check_package_data", "packages": "setuptools.dist:check_packages", "setup_requires": "setuptools.dist:check_requirements", "test_loader": "setuptools.dist:check_importable", "test_runner": "setuptools.dist:check_importable", "test_suite": "setuptools.dist:check_test_suite", "tests_require": "setuptools.dist:check_requirements", "use_2to3": "setuptools.dist:assert_bool", "use_2to3_exclude_fixers": "setuptools.dist:assert_string_list", "use_2to3_fixers": "setuptools.dist:assert_string_list", "zip_safe": "setuptools.dist:assert_bool"}, "egg_info.writers": {"PKG-INFO": "setuptools.command.egg_info:write_pkg_info", "dependency_links.txt": "setuptools.command.egg_info:overwrite_arg", "depends.txt": "setuptools.command.egg_info:warn_depends_obsolete", "eager_resources.txt": "setuptools.command.egg_info:overwrite_arg", "entry_points.txt": "setuptools.command.egg_info:write_entries", "namespace_packages.txt": "setuptools.command.egg_info:overwrite_arg", "requires.txt": "setuptools.command.egg_info:write_requirements", "top_level.txt": "setuptools.command.egg_info:write_toplevel_names"}, "setuptools.installation": {"eggsecutable": "setuptools.command.easy_install:bootstrap"}}}, "extras": ["certs", "ssl"], "generator": "bdist_wheel (0.29.0)", "keywords": ["CPAN", "PyPI", "distutils", "eggs", "package", "management"], "metadata_version": "2.0", "name": "setuptools", "run_requires": [{"extra": "certs", "requires": ["certifi (==2015.11.20)"]}, {"environment": "sys_platform=='win32'", "extra": "ssl", "requires": ["wincertstore (==0.2)"]}], "summary": "Easily download, build, install, upgrade, and uninstall Python packages", "test_requires": [{"requires": ["pytest (>=2.8)", "setuptools[ssl]"]}], "version": "20.3.1"}
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
.. image:: https://img.shields.io/pypi/v/setuptools.svg
|
||||||
|
:target: https://pypi.org/project/setuptools
|
||||||
|
|
||||||
|
.. image:: https://readthedocs.org/projects/setuptools/badge/?version=latest
|
||||||
|
:target: https://setuptools.readthedocs.io
|
||||||
|
|
||||||
|
.. image:: https://img.shields.io/travis/pypa/setuptools/master.svg?label=Linux%20build%20%40%20Travis%20CI
|
||||||
|
:target: http://travis-ci.org/pypa/setuptools
|
||||||
|
|
||||||
|
.. image:: https://img.shields.io/appveyor/ci/jaraco/setuptools/master.svg?label=Windows%20build%20%40%20Appveyor
|
||||||
|
:target: https://ci.appveyor.com/project/jaraco/setuptools/branch/master
|
||||||
|
|
||||||
|
.. image:: https://img.shields.io/pypi/pyversions/setuptools.svg
|
||||||
|
|
||||||
|
See the `Installation Instructions
|
||||||
|
<https://packaging.python.org/installing/>`_ in the Python Packaging
|
||||||
|
User's Guide for instructions on installing, upgrading, and uninstalling
|
||||||
|
Setuptools.
|
||||||
|
|
||||||
|
The project is `maintained at GitHub <https://github.com/pypa/setuptools>`_.
|
||||||
|
|
||||||
|
Questions and comments should be directed to the `distutils-sig
|
||||||
|
mailing list <http://mail.python.org/pipermail/distutils-sig/>`_.
|
||||||
|
Bug reports and especially tested patches may be
|
||||||
|
submitted directly to the `bug tracker
|
||||||
|
<https://github.com/pypa/setuptools/issues>`_.
|
||||||
|
|
||||||
|
|
||||||
|
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 <https://www.pypa.io/en/latest/code-of-conduct/>`_.
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue